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.
- package/dist/constants/collections.js +14 -0
- package/dist/constants/common-questions.js +57 -0
- package/dist/constants/index.js +18 -0
- package/dist/constants/job-filter-options.js +265 -0
- package/dist/constants/job-status.js +21 -0
- package/dist/constants/mappings/countryMapping.js +120 -0
- package/dist/constants/mappings/regionMapping.js +240 -0
- package/dist/constants/routes.js +116 -0
- package/dist/constants/upwork-accounts.js +18 -0
- package/dist/index.js +4 -0
- package/dist/schemas/account/account-status.js +8 -0
- package/dist/schemas/account/bidder-account.js +35 -0
- package/dist/schemas/account/index.js +3 -0
- package/dist/schemas/account/scraper-account.js +34 -0
- package/dist/schemas/ai/ai-config.d.ts +36 -0
- package/dist/schemas/ai/ai-config.js +9 -0
- package/dist/schemas/ai/index.d.ts +3 -0
- package/dist/schemas/ai/index.js +3 -0
- package/dist/schemas/ai/proposal.d.ts +82 -0
- package/dist/schemas/ai/proposal.js +13 -0
- package/dist/schemas/ai/suitability.d.ts +37 -0
- package/dist/schemas/ai/suitability.js +14 -0
- package/dist/schemas/bid/bid-result.js +11 -0
- package/dist/schemas/bid/bid.js +35 -0
- package/dist/schemas/bid/index.js +2 -0
- package/dist/schemas/campaign/campaign-ai-metrics.js +6 -0
- package/dist/schemas/campaign/campaign-analytics.js +42 -0
- package/dist/schemas/campaign/campaign-expenses.js +6 -0
- package/dist/schemas/campaign/campaign-insights.js +31 -0
- package/dist/schemas/campaign/campaign-integrations.js +13 -0
- package/dist/schemas/campaign/campaign-job-count.js +3 -0
- package/dist/schemas/campaign/campaign.js +41 -0
- package/dist/schemas/campaign/index.js +7 -0
- package/dist/schemas/chat-message/chat-message.js +10 -0
- package/dist/schemas/chat-message/index.js +1 -0
- package/dist/schemas/config/agency-config.js +7 -0
- package/dist/schemas/config/index.js +1 -0
- package/dist/schemas/event/index.d.ts +58 -0
- package/dist/schemas/index.js +17 -0
- package/dist/schemas/job/index.d.ts +95 -0
- package/dist/schemas/job-filters/index.js +1 -0
- package/dist/schemas/job-filters/job-filters.js +84 -0
- package/dist/schemas/lead/index.js +173 -0
- package/dist/schemas/lead/lead-note.js +27 -0
- package/dist/schemas/lead/lead-status.js +23 -0
- package/dist/schemas/lead/nuxt.js +287 -0
- package/dist/schemas/logger/index.js +1 -0
- package/dist/schemas/logger/log-event.js +117 -0
- package/dist/schemas/organization/index.js +70 -0
- package/dist/schemas/organization/member.js +7 -0
- package/dist/schemas/organization/organization.d.ts +118 -22
- package/dist/schemas/organization/organization.js +16 -0
- package/dist/schemas/organization/subscription.js +17 -0
- package/dist/schemas/proxy/index.js +3 -0
- package/dist/schemas/proxy/proxy-available-replacements.js +3 -0
- package/dist/schemas/proxy/proxy-country.js +249 -0
- package/dist/schemas/proxy/proxy.js +29 -0
- package/dist/schemas/saved-search/index.js +9 -0
- package/dist/schemas/scraper/index.js +2 -0
- package/dist/schemas/scraper/scrape-payload.js +21 -0
- package/dist/schemas/scraper/scrape-result.js +23 -0
- package/dist/schemas/shared.js +19 -0
- package/dist/schemas/time-filter/index.js +6 -0
- package/dist/schemas/transaction/index.js +17 -0
- package/dist/schemas/usage/index.js +18 -0
- package/dist/schemas/user/index.js +52 -0
- package/dist/types/account/account-status.js +1 -0
- package/dist/types/account/bidder-account.js +1 -0
- package/dist/types/account/index.js +3 -0
- package/dist/types/account/scraper-account.js +1 -0
- package/dist/types/ai/ai-config.d.ts +6 -0
- package/dist/types/ai/ai-config.js +1 -0
- package/dist/types/ai/index.d.ts +3 -0
- package/dist/types/ai/index.js +3 -0
- package/dist/types/ai/proposal.d.ts +10 -0
- package/dist/types/ai/proposal.js +1 -0
- package/dist/types/ai/suitability.d.ts +6 -0
- package/dist/types/ai/suitability.js +1 -0
- package/dist/types/bid/bid-result.js +1 -0
- package/dist/types/bid/bid.js +1 -0
- package/dist/types/bid/index.js +2 -0
- package/dist/types/campaign/campaign-analytics.js +1 -0
- package/dist/types/campaign/campaign-expenses.js +1 -0
- package/dist/types/campaign/campaign-insights.js +1 -0
- package/dist/types/campaign/campaign-integrations.js +1 -0
- package/dist/types/campaign/campaign-job-count.js +1 -0
- package/dist/types/campaign/campaign.js +1 -0
- package/dist/types/campaign/index.js +6 -0
- package/dist/types/chat-message/chat-message.js +1 -0
- package/dist/types/chat-message/index.js +1 -0
- package/dist/types/config/agency-config.js +1 -0
- package/dist/types/config/index.js +1 -0
- package/dist/types/index.js +15 -0
- package/dist/types/job/index.js +3 -0
- package/dist/types/job/job-note.js +1 -0
- package/dist/types/job/job-status.js +9 -0
- package/dist/types/job/nuxt.js +1 -0
- package/dist/types/job-filters/index.js +1 -0
- package/dist/types/job-filters/job-filters.js +1 -0
- package/dist/types/logger/index.js +1 -0
- package/dist/types/logger/log-event.js +1 -0
- package/dist/types/saved-search/index.js +1 -0
- package/dist/types/scraper/index.js +2 -0
- package/dist/types/scraper/scrape-payload.js +1 -0
- package/dist/types/scraper/scrape-result.js +1 -0
- package/dist/types/shared.js +1 -0
- package/dist/types/time-filter/index.js +1 -0
- package/dist/types/transaction/index.js +1 -0
- package/dist/types/usage/index.js +1 -0
- package/dist/types/user/index.js +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/try-catch.js +10 -0
- package/package.json +3 -3
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const bidPayloadProposalDataSchema = z.object({
|
|
3
|
+
coverLetter: z.string(),
|
|
4
|
+
questionAnswerPairs: z
|
|
5
|
+
.array(z.object({
|
|
6
|
+
question: z.string(),
|
|
7
|
+
answer: z.string(),
|
|
8
|
+
}))
|
|
9
|
+
.nullable(),
|
|
10
|
+
boostingEnabled: z.boolean(),
|
|
11
|
+
minimumBoost: z.number().nullable(),
|
|
12
|
+
maximumBoost: z.number().nullable(),
|
|
13
|
+
});
|
|
14
|
+
export const freelancerBidProposalDataSchema = bidPayloadProposalDataSchema;
|
|
15
|
+
export const agencyBidProposalDataSchema = bidPayloadProposalDataSchema.extend({
|
|
16
|
+
agencyName: z.string(),
|
|
17
|
+
contractorName: z.string(),
|
|
18
|
+
specializedProfile: z.string().nullable(),
|
|
19
|
+
});
|
|
20
|
+
export const bidPayloadSchema = z.object({
|
|
21
|
+
jobUrl: z.string(),
|
|
22
|
+
username: z.string(),
|
|
23
|
+
password: z.string(),
|
|
24
|
+
});
|
|
25
|
+
export const agencyBidPayloadSchema = bidPayloadSchema.extend({
|
|
26
|
+
proposalData: agencyBidProposalDataSchema,
|
|
27
|
+
});
|
|
28
|
+
export const freelancerBidPayloadSchema = bidPayloadSchema.extend({
|
|
29
|
+
proposalData: freelancerBidProposalDataSchema,
|
|
30
|
+
});
|
|
31
|
+
export const bidDtoSchema = z.object({
|
|
32
|
+
organizationId: z.string(),
|
|
33
|
+
campaignId: z.string(),
|
|
34
|
+
leadId: z.string(),
|
|
35
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { leadStatusSchema, upworkJobSchema } from "../lead";
|
|
3
|
+
export const campaignAnalyticsStatsSchema = z.object({
|
|
4
|
+
jobsAnalyzed: z.number(),
|
|
5
|
+
totalStats: z.object({
|
|
6
|
+
contacted: z.number(),
|
|
7
|
+
viewed: z.number(),
|
|
8
|
+
replied: z.number(),
|
|
9
|
+
negotiations: z.number(),
|
|
10
|
+
won: z.number(),
|
|
11
|
+
}),
|
|
12
|
+
statsByDate: z.array(z.object({
|
|
13
|
+
label: z.string(),
|
|
14
|
+
contacted: z.number(),
|
|
15
|
+
viewed: z.number(),
|
|
16
|
+
replied: z.number(),
|
|
17
|
+
negotiations: z.number(),
|
|
18
|
+
won: z.number(),
|
|
19
|
+
})),
|
|
20
|
+
});
|
|
21
|
+
export const campaignAnalyticsResponseSchema = z.object({
|
|
22
|
+
jobsAnalyzed: z.number(),
|
|
23
|
+
contacted: z.number(),
|
|
24
|
+
viewed: z.number(),
|
|
25
|
+
replied: z.number(),
|
|
26
|
+
negotiations: z.number(),
|
|
27
|
+
won: z.number(),
|
|
28
|
+
});
|
|
29
|
+
export const campaignActivitySchema = z.object({
|
|
30
|
+
createdAt: z.number(),
|
|
31
|
+
status: leadStatusSchema,
|
|
32
|
+
job: upworkJobSchema.pick({
|
|
33
|
+
id: true,
|
|
34
|
+
title: true,
|
|
35
|
+
datetime: true,
|
|
36
|
+
jobUrl: true,
|
|
37
|
+
}),
|
|
38
|
+
});
|
|
39
|
+
export const campaignActivityCreateSchema = campaignActivitySchema.pick({
|
|
40
|
+
status: true,
|
|
41
|
+
job: true,
|
|
42
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { agentStatusSchema } from "../lead";
|
|
3
|
+
export const campaignCountByStatusSchema = z.object({
|
|
4
|
+
// Using z.enum values to create a schema with all possible job statuses
|
|
5
|
+
...Object.fromEntries(Object.values(agentStatusSchema.enum).map((status) => [
|
|
6
|
+
status,
|
|
7
|
+
z.object({
|
|
8
|
+
boosted: z.number(),
|
|
9
|
+
organic: z.number(),
|
|
10
|
+
total: z.number(),
|
|
11
|
+
}),
|
|
12
|
+
])),
|
|
13
|
+
});
|
|
14
|
+
export const campaignInsightsSchema = z.object({
|
|
15
|
+
pipelineHealth: campaignCountByStatusSchema,
|
|
16
|
+
biddingAmount: z.number().default(0),
|
|
17
|
+
boostingAmount: z.number().default(0),
|
|
18
|
+
boostedProposalsCount: z.number().default(0),
|
|
19
|
+
totalProposalsCount: z.number().default(0),
|
|
20
|
+
totalExpenses: z.number().default(0),
|
|
21
|
+
suitabilityRange0to10: z.number(),
|
|
22
|
+
suitabilityRange10to20: z.number(),
|
|
23
|
+
suitabilityRange20to30: z.number(),
|
|
24
|
+
suitabilityRange30to40: z.number(),
|
|
25
|
+
suitabilityRange40to50: z.number(),
|
|
26
|
+
suitabilityRange50to60: z.number(),
|
|
27
|
+
suitabilityRange60to70: z.number(),
|
|
28
|
+
suitabilityRange70to80: z.number(),
|
|
29
|
+
suitabilityRange80to90: z.number(),
|
|
30
|
+
suitabilityRange90to100: z.number(),
|
|
31
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const campaignIntegrations = z.enum(["discord", "slack"]);
|
|
3
|
+
export const campaignIntegrationsSchema = z.object({
|
|
4
|
+
suitabilityHooks: z.object({
|
|
5
|
+
discord: z.string().url().nullable(),
|
|
6
|
+
slack: z.string().url().nullable(),
|
|
7
|
+
}),
|
|
8
|
+
proposalSentHooks: z.object({
|
|
9
|
+
discord: z.string().url().nullable(),
|
|
10
|
+
slack: z.string().url().nullable(),
|
|
11
|
+
}),
|
|
12
|
+
});
|
|
13
|
+
export const updateCampaignIntegrationsSchema = campaignIntegrationsSchema.partial();
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { number, z } from "zod";
|
|
2
|
+
import { jobFiltersSchema } from "../job-filters";
|
|
3
|
+
import { leadStatusSchema } from "../lead";
|
|
4
|
+
import { campaignExpensesSchema } from "./campaign-expenses";
|
|
5
|
+
import { campaignIntegrationsSchema } from "./campaign-integrations";
|
|
6
|
+
export const campaignStatusSchema = z.union([
|
|
7
|
+
z.literal("active"),
|
|
8
|
+
z.literal("draft"),
|
|
9
|
+
z.literal("paused"),
|
|
10
|
+
z.literal("error"),
|
|
11
|
+
]);
|
|
12
|
+
export const campaignSchema = z.object({
|
|
13
|
+
id: z.string(),
|
|
14
|
+
name: z.string(),
|
|
15
|
+
filters: jobFiltersSchema,
|
|
16
|
+
createdAt: number(),
|
|
17
|
+
updatedAt: number(),
|
|
18
|
+
confirmedBillingAt: number().nullable(),
|
|
19
|
+
automatedSuitability: z.boolean().nullable(),
|
|
20
|
+
automatedBidding: z.boolean().nullable(),
|
|
21
|
+
boostingEnabled: z.boolean().nullable().default(false),
|
|
22
|
+
maximumBoost: z.number().nullable().default(30),
|
|
23
|
+
minimumBoost: z.number().nullable().default(0),
|
|
24
|
+
webhookUrl: z.string().nullable(),
|
|
25
|
+
monthlyBudget: z.number().nullable(),
|
|
26
|
+
suitabilityThreshold: z.number().min(0).max(100).nullable().default(0),
|
|
27
|
+
boostingThreshold: z.number().min(0).max(100).nullable().default(0),
|
|
28
|
+
leadCounts: z.record(leadStatusSchema, z.number()).nullable(),
|
|
29
|
+
expenses: campaignExpensesSchema,
|
|
30
|
+
integrations: campaignIntegrationsSchema,
|
|
31
|
+
status: campaignStatusSchema.optional(),
|
|
32
|
+
});
|
|
33
|
+
export const createCampaignSchema = campaignSchema.omit({
|
|
34
|
+
id: true,
|
|
35
|
+
createdAt: true,
|
|
36
|
+
updatedAt: true,
|
|
37
|
+
});
|
|
38
|
+
export const updateCampaignSchema = campaignSchema.omit({
|
|
39
|
+
createdAt: true,
|
|
40
|
+
updatedAt: true,
|
|
41
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './campaign';
|
|
2
|
+
export * from './campaign-insights';
|
|
3
|
+
export * from './campaign-job-count';
|
|
4
|
+
export * from './campaign-expenses';
|
|
5
|
+
export * from './campaign-integrations';
|
|
6
|
+
export * from './campaign-analytics';
|
|
7
|
+
export * from './campaign-ai-metrics';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const chatMessageSchema = z.object({
|
|
3
|
+
id: z.string(),
|
|
4
|
+
content: z.string(),
|
|
5
|
+
role: z.enum(['user', 'assistant']),
|
|
6
|
+
timestamp: z.string(),
|
|
7
|
+
});
|
|
8
|
+
export const newChatMessageSchema = chatMessageSchema.omit({
|
|
9
|
+
id: true,
|
|
10
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './chat-message';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './agency-config';
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export declare const logEventSchemaWithMetadata: import("zod").ZodIntersection<import("zod").ZodIntersection<import("zod").ZodObject<{
|
|
2
|
+
type: import("zod").ZodEnum<["scraperStarted", "scraperCompleted", "jobScraped", "jobScrapeFailed", "jobsIndexed", "jobDuplicateSkipped", "scraperFailed", "jobActivityScraped", "jobActivityScrapeFailed", "feedScrapeStarted", "feedScrapeCompleted", "feedScrapeFailed", "jobListingScraped", "jobSyncPublished", "jobSyncReceived", "leadsCreatedAndSynced", "suitabilityPending", "suitabilityProcessing", "suitabilityComplete", "suitabilityFailed", "manualSuitabilityAnalyzed", "proposalProcessing", "proposalComplete", "proposalFailed", "manualProposalGenerated", "biddingProcessing", "biddingComplete", "biddingFailed", "biddingSkipped", "biddingPending", "errorLogged", "cloudTaskRetry", "manualLeadEdited", "leadArchived", "auditTrailLogged"]>;
|
|
3
|
+
source: import("zod").ZodString;
|
|
4
|
+
resourceType: import("zod").ZodDefault<import("zod").ZodString>;
|
|
5
|
+
resourceId: import("zod").ZodNullable<import("zod").ZodString>;
|
|
6
|
+
leadId: import("zod").ZodNullable<import("zod").ZodString>;
|
|
7
|
+
campaignId: import("zod").ZodNullable<import("zod").ZodString>;
|
|
8
|
+
userId: import("zod").ZodNullable<import("zod").ZodString>;
|
|
9
|
+
reason: import("zod").ZodNullable<import("zod").ZodString>;
|
|
10
|
+
timestamp: import("zod").ZodNumber;
|
|
11
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
12
|
+
type: "scraperStarted" | "scraperCompleted" | "jobScraped" | "jobScrapeFailed" | "jobsIndexed" | "jobDuplicateSkipped" | "scraperFailed" | "jobActivityScraped" | "jobActivityScrapeFailed" | "feedScrapeStarted" | "feedScrapeCompleted" | "feedScrapeFailed" | "jobListingScraped" | "jobSyncPublished" | "jobSyncReceived" | "leadsCreatedAndSynced" | "suitabilityPending" | "suitabilityProcessing" | "suitabilityComplete" | "suitabilityFailed" | "manualSuitabilityAnalyzed" | "proposalProcessing" | "proposalComplete" | "proposalFailed" | "manualProposalGenerated" | "biddingProcessing" | "biddingComplete" | "biddingFailed" | "biddingSkipped" | "biddingPending" | "errorLogged" | "cloudTaskRetry" | "manualLeadEdited" | "leadArchived" | "auditTrailLogged";
|
|
13
|
+
source: string;
|
|
14
|
+
resourceType: string;
|
|
15
|
+
resourceId: string | null;
|
|
16
|
+
leadId: string | null;
|
|
17
|
+
campaignId: string | null;
|
|
18
|
+
userId: string | null;
|
|
19
|
+
reason: string | null;
|
|
20
|
+
timestamp: number;
|
|
21
|
+
}, {
|
|
22
|
+
type: "scraperStarted" | "scraperCompleted" | "jobScraped" | "jobScrapeFailed" | "jobsIndexed" | "jobDuplicateSkipped" | "scraperFailed" | "jobActivityScraped" | "jobActivityScrapeFailed" | "feedScrapeStarted" | "feedScrapeCompleted" | "feedScrapeFailed" | "jobListingScraped" | "jobSyncPublished" | "jobSyncReceived" | "leadsCreatedAndSynced" | "suitabilityPending" | "suitabilityProcessing" | "suitabilityComplete" | "suitabilityFailed" | "manualSuitabilityAnalyzed" | "proposalProcessing" | "proposalComplete" | "proposalFailed" | "manualProposalGenerated" | "biddingProcessing" | "biddingComplete" | "biddingFailed" | "biddingSkipped" | "biddingPending" | "errorLogged" | "cloudTaskRetry" | "manualLeadEdited" | "leadArchived" | "auditTrailLogged";
|
|
23
|
+
source: string;
|
|
24
|
+
resourceId: string | null;
|
|
25
|
+
leadId: string | null;
|
|
26
|
+
campaignId: string | null;
|
|
27
|
+
userId: string | null;
|
|
28
|
+
reason: string | null;
|
|
29
|
+
timestamp: number;
|
|
30
|
+
resourceType?: string | undefined;
|
|
31
|
+
}>, import("zod").ZodDiscriminatedUnion<"type", [import("zod").ZodObject<{
|
|
32
|
+
type: import("zod").ZodEnum<["jobActivityScraped"]>;
|
|
33
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
34
|
+
type: "jobActivityScraped";
|
|
35
|
+
}, {
|
|
36
|
+
type: "jobActivityScraped";
|
|
37
|
+
}>, import("zod").ZodObject<{
|
|
38
|
+
type: import("zod").ZodEnum<["scraperStarted", "scraperCompleted", "jobScraped", "jobScrapeFailed", "jobsIndexed", "jobDuplicateSkipped", "scraperFailed", "jobActivityScrapeFailed", "feedScrapeStarted", "feedScrapeCompleted", "feedScrapeFailed", "jobListingScraped", "jobSyncPublished", "jobSyncReceived", "leadsCreatedAndSynced", "suitabilityPending", "suitabilityProcessing", "suitabilityComplete", "suitabilityFailed", "manualSuitabilityAnalyzed", "proposalProcessing", "proposalComplete", "proposalFailed", "manualProposalGenerated", "biddingProcessing", "biddingComplete", "biddingFailed", "biddingSkipped", "biddingPending", "errorLogged", "cloudTaskRetry", "manualLeadEdited", "leadArchived", "auditTrailLogged"]>;
|
|
39
|
+
metadata: import("zod").ZodNullable<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>;
|
|
40
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
41
|
+
type: "scraperStarted" | "scraperCompleted" | "jobScraped" | "jobScrapeFailed" | "jobsIndexed" | "jobDuplicateSkipped" | "scraperFailed" | "jobActivityScrapeFailed" | "feedScrapeStarted" | "feedScrapeCompleted" | "feedScrapeFailed" | "jobListingScraped" | "jobSyncPublished" | "jobSyncReceived" | "leadsCreatedAndSynced" | "suitabilityPending" | "suitabilityProcessing" | "suitabilityComplete" | "suitabilityFailed" | "manualSuitabilityAnalyzed" | "proposalProcessing" | "proposalComplete" | "proposalFailed" | "manualProposalGenerated" | "biddingProcessing" | "biddingComplete" | "biddingFailed" | "biddingSkipped" | "biddingPending" | "errorLogged" | "cloudTaskRetry" | "manualLeadEdited" | "leadArchived" | "auditTrailLogged";
|
|
42
|
+
metadata: Record<string, unknown> | null;
|
|
43
|
+
}, {
|
|
44
|
+
type: "scraperStarted" | "scraperCompleted" | "jobScraped" | "jobScrapeFailed" | "jobsIndexed" | "jobDuplicateSkipped" | "scraperFailed" | "jobActivityScrapeFailed" | "feedScrapeStarted" | "feedScrapeCompleted" | "feedScrapeFailed" | "jobListingScraped" | "jobSyncPublished" | "jobSyncReceived" | "leadsCreatedAndSynced" | "suitabilityPending" | "suitabilityProcessing" | "suitabilityComplete" | "suitabilityFailed" | "manualSuitabilityAnalyzed" | "proposalProcessing" | "proposalComplete" | "proposalFailed" | "manualProposalGenerated" | "biddingProcessing" | "biddingComplete" | "biddingFailed" | "biddingSkipped" | "biddingPending" | "errorLogged" | "cloudTaskRetry" | "manualLeadEdited" | "leadArchived" | "auditTrailLogged";
|
|
45
|
+
metadata: Record<string, unknown> | null;
|
|
46
|
+
}>]>>, import("zod").ZodDiscriminatedUnion<"type", [import("zod").ZodObject<{
|
|
47
|
+
type: import("zod").ZodEnum<["jobActivityScraped"]>;
|
|
48
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
49
|
+
type: "jobActivityScraped";
|
|
50
|
+
}, {
|
|
51
|
+
type: "jobActivityScraped";
|
|
52
|
+
}>, import("zod").ZodObject<{
|
|
53
|
+
type: import("zod").ZodEnum<["jobActivityScraped"]>;
|
|
54
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
55
|
+
type: "jobActivityScraped";
|
|
56
|
+
}, {
|
|
57
|
+
type: "jobActivityScraped";
|
|
58
|
+
}>]>>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export * from "./account";
|
|
2
|
+
export * from "./bid";
|
|
3
|
+
export * from "./campaign";
|
|
4
|
+
export * from "./chat-message";
|
|
5
|
+
export * from "./config";
|
|
6
|
+
export * from "./job-filters";
|
|
7
|
+
export * from "./lead";
|
|
8
|
+
export * from "./logger";
|
|
9
|
+
export * from "./organization";
|
|
10
|
+
export * from "./proxy";
|
|
11
|
+
export * from "./saved-search";
|
|
12
|
+
export * from "./scraper";
|
|
13
|
+
export * from "./shared";
|
|
14
|
+
export * from "./time-filter";
|
|
15
|
+
export * from "./user";
|
|
16
|
+
export * from "./usage";
|
|
17
|
+
export * from "./transaction";
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const jobActivityOffsetEnum: z.ZodEnum<["4h", "24h"]>;
|
|
3
|
+
export declare const jobListingSchema: z.ZodObject<{
|
|
4
|
+
uid: z.ZodNullable<z.ZodString>;
|
|
5
|
+
title: z.ZodNullable<z.ZodString>;
|
|
6
|
+
jobUrl: z.ZodNullable<z.ZodString>;
|
|
7
|
+
datetime: z.ZodNullable<z.ZodString>;
|
|
8
|
+
isFeatured: z.ZodNullable<z.ZodBoolean>;
|
|
9
|
+
region: z.ZodNullable<z.ZodUnion<[z.ZodLiteral<"USOnly">, z.ZodLiteral<"UKOnly">, z.ZodLiteral<"Worldwide">]>>;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
uid: string | null;
|
|
12
|
+
title: string | null;
|
|
13
|
+
jobUrl: string | null;
|
|
14
|
+
datetime: string | null;
|
|
15
|
+
isFeatured: boolean | null;
|
|
16
|
+
region: "USOnly" | "UKOnly" | "Worldwide" | null;
|
|
17
|
+
}, {
|
|
18
|
+
uid: string | null;
|
|
19
|
+
title: string | null;
|
|
20
|
+
jobUrl: string | null;
|
|
21
|
+
datetime: string | null;
|
|
22
|
+
isFeatured: boolean | null;
|
|
23
|
+
region: "USOnly" | "UKOnly" | "Worldwide" | null;
|
|
24
|
+
}>;
|
|
25
|
+
export declare const jobActivityUpdateSchema: z.ZodObject<{
|
|
26
|
+
data: z.ZodObject<{
|
|
27
|
+
proposals: z.ZodObject<{
|
|
28
|
+
min: z.ZodNullable<z.ZodNumber>;
|
|
29
|
+
max: z.ZodNullable<z.ZodNumber>;
|
|
30
|
+
}, "strip", z.ZodTypeAny, {
|
|
31
|
+
min: number | null;
|
|
32
|
+
max: number | null;
|
|
33
|
+
}, {
|
|
34
|
+
min: number | null;
|
|
35
|
+
max: number | null;
|
|
36
|
+
}>;
|
|
37
|
+
lastViewedByClient: z.ZodNullable<z.ZodString>;
|
|
38
|
+
hires: z.ZodNullable<z.ZodNumber>;
|
|
39
|
+
interviewing: z.ZodNullable<z.ZodNumber>;
|
|
40
|
+
invitesSent: z.ZodNullable<z.ZodNumber>;
|
|
41
|
+
unansweredInvites: z.ZodNullable<z.ZodNumber>;
|
|
42
|
+
updatedAt: z.ZodNullable<z.ZodNumber>;
|
|
43
|
+
}, "strip", z.ZodTypeAny, {
|
|
44
|
+
proposals: {
|
|
45
|
+
min: number | null;
|
|
46
|
+
max: number | null;
|
|
47
|
+
};
|
|
48
|
+
lastViewedByClient: string | null;
|
|
49
|
+
hires: number | null;
|
|
50
|
+
interviewing: number | null;
|
|
51
|
+
invitesSent: number | null;
|
|
52
|
+
unansweredInvites: number | null;
|
|
53
|
+
updatedAt: number | null;
|
|
54
|
+
}, {
|
|
55
|
+
proposals: {
|
|
56
|
+
min: number | null;
|
|
57
|
+
max: number | null;
|
|
58
|
+
};
|
|
59
|
+
lastViewedByClient: string | null;
|
|
60
|
+
hires: number | null;
|
|
61
|
+
interviewing: number | null;
|
|
62
|
+
invitesSent: number | null;
|
|
63
|
+
unansweredInvites: number | null;
|
|
64
|
+
updatedAt: number | null;
|
|
65
|
+
}>;
|
|
66
|
+
offset: z.ZodEnum<["4h", "24h"]>;
|
|
67
|
+
}, "strip", z.ZodTypeAny, {
|
|
68
|
+
data: {
|
|
69
|
+
proposals: {
|
|
70
|
+
min: number | null;
|
|
71
|
+
max: number | null;
|
|
72
|
+
};
|
|
73
|
+
lastViewedByClient: string | null;
|
|
74
|
+
hires: number | null;
|
|
75
|
+
interviewing: number | null;
|
|
76
|
+
invitesSent: number | null;
|
|
77
|
+
unansweredInvites: number | null;
|
|
78
|
+
updatedAt: number | null;
|
|
79
|
+
};
|
|
80
|
+
offset: "4h" | "24h";
|
|
81
|
+
}, {
|
|
82
|
+
data: {
|
|
83
|
+
proposals: {
|
|
84
|
+
min: number | null;
|
|
85
|
+
max: number | null;
|
|
86
|
+
};
|
|
87
|
+
lastViewedByClient: string | null;
|
|
88
|
+
hires: number | null;
|
|
89
|
+
interviewing: number | null;
|
|
90
|
+
invitesSent: number | null;
|
|
91
|
+
unansweredInvites: number | null;
|
|
92
|
+
updatedAt: number | null;
|
|
93
|
+
};
|
|
94
|
+
offset: "4h" | "24h";
|
|
95
|
+
}>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './job-filters';
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { JOB_FILTER_OPTIONS } from "../../constants/job-filter-options";
|
|
3
|
+
// Enum definitions for fixed options
|
|
4
|
+
export const projectDurationEnum = z.enum(JOB_FILTER_OPTIONS.PROJECT_DURATION);
|
|
5
|
+
export const engagementTypeEnum = z.enum(JOB_FILTER_OPTIONS.ENGAGEMENT_TYPE);
|
|
6
|
+
export const vendorTypeEnum = z.enum(JOB_FILTER_OPTIONS.VENDOR_TYPE);
|
|
7
|
+
export const paymentTypeEnum = z.enum(JOB_FILTER_OPTIONS.PAYMENT_TYPE);
|
|
8
|
+
export const categoryEnum = z.enum(JOB_FILTER_OPTIONS.CATEGORIES);
|
|
9
|
+
export const clientIndustryEnum = z.enum(JOB_FILTER_OPTIONS.CLIENT_INDUSTRY);
|
|
10
|
+
export const clientSizeEnum = z.enum(JOB_FILTER_OPTIONS.CLIENT_SIZE);
|
|
11
|
+
export const talentTypeEnum = z.enum(JOB_FILTER_OPTIONS.TALENT_TYPE);
|
|
12
|
+
export const englishLevelEnum = z.enum(JOB_FILTER_OPTIONS.ENGLISH_LEVELS);
|
|
13
|
+
export const experienceLevelEnum = z.enum(JOB_FILTER_OPTIONS.EXPERIENCE_LEVELS);
|
|
14
|
+
export const regionEnum = z.enum(["all", "Worldwide", "UKOnly", "USOnly"]);
|
|
15
|
+
export const requiredEarningsEnum = z.union([
|
|
16
|
+
z.literal(100),
|
|
17
|
+
z.literal(1000),
|
|
18
|
+
z.literal(10000),
|
|
19
|
+
]);
|
|
20
|
+
export const requiredJSSEnum = z.enum(JOB_FILTER_OPTIONS.REQUIRED_JSS);
|
|
21
|
+
// Main job filters schema
|
|
22
|
+
export const jobFiltersSchema = z.object({
|
|
23
|
+
keywords: z
|
|
24
|
+
.object({
|
|
25
|
+
includes: z.string().nullable(),
|
|
26
|
+
excludes: z.string().nullable(),
|
|
27
|
+
})
|
|
28
|
+
.nullable(),
|
|
29
|
+
isFeatured: z.enum(["all", "true", "false"]).nullable(),
|
|
30
|
+
regions: z.array(regionEnum).nullable(),
|
|
31
|
+
categories: z
|
|
32
|
+
.object({
|
|
33
|
+
includes: z.array(categoryEnum).nullable(),
|
|
34
|
+
excludes: z.array(categoryEnum).nullable(),
|
|
35
|
+
})
|
|
36
|
+
.nullable(),
|
|
37
|
+
payment: z
|
|
38
|
+
.object({
|
|
39
|
+
paymentType: z.array(paymentTypeEnum).nullable(),
|
|
40
|
+
minFixedPrice: z.number().nullable(),
|
|
41
|
+
maxFixedPrice: z.number().nullable(),
|
|
42
|
+
minHourlyRate: z.number().nullable(),
|
|
43
|
+
maxHourlyRate: z.number().nullable(),
|
|
44
|
+
})
|
|
45
|
+
.nullable(),
|
|
46
|
+
projectDuration: z.array(projectDurationEnum).nullable(),
|
|
47
|
+
experienceLevel: z.array(experienceLevelEnum).nullable(),
|
|
48
|
+
questions: z
|
|
49
|
+
.object({
|
|
50
|
+
hasQuestions: z.enum(["all", "yes", "no"]).default("all"),
|
|
51
|
+
})
|
|
52
|
+
.nullable(),
|
|
53
|
+
engagementType: z.array(engagementTypeEnum).nullable(),
|
|
54
|
+
clientInfo: z
|
|
55
|
+
.object({
|
|
56
|
+
isPaymentVerified: z.enum(["all", "true", "false"]).default("all"),
|
|
57
|
+
isPhoneVerified: z.enum(["all", "true", "false"]).default("all"),
|
|
58
|
+
enterpriseClient: z.enum(["all", "true", "false"]).default("all"),
|
|
59
|
+
clientLocationIncludes: z.array(z.string()).nullable(),
|
|
60
|
+
clientLocationExcludes: z.array(z.string()).nullable(),
|
|
61
|
+
minReviewScore: z.number().min(0).max(5).nullable(),
|
|
62
|
+
minTotalSpent: z.number().nullable(),
|
|
63
|
+
minHireRate: z.number().min(0).max(100).nullable(),
|
|
64
|
+
clientIndustry: z.array(clientIndustryEnum).nullable(),
|
|
65
|
+
companySize: z.array(clientSizeEnum).nullable(),
|
|
66
|
+
minJobsPosted: z.number().nullable(),
|
|
67
|
+
minAvgHourlyRate: z.number().nullable(),
|
|
68
|
+
minNumReviews: z.number().nullable(),
|
|
69
|
+
memberSinceFrom: z.string().date().nullable(),
|
|
70
|
+
memberSinceTo: z.string().date().nullable(),
|
|
71
|
+
})
|
|
72
|
+
.nullable(),
|
|
73
|
+
vendorQualifications: z
|
|
74
|
+
.object({
|
|
75
|
+
locationIncludes: z.array(z.string()).nullable(),
|
|
76
|
+
locationExcludes: z.array(z.string()).nullable(),
|
|
77
|
+
talentTypes: z.array(talentTypeEnum).nullable(),
|
|
78
|
+
englishLevels: z.array(englishLevelEnum).nullable(),
|
|
79
|
+
includeRisingTalent: z.string().nullable(),
|
|
80
|
+
requiredEarnings: requiredEarningsEnum.nullable(),
|
|
81
|
+
requiredJSS: z.array(requiredJSSEnum).nullable(),
|
|
82
|
+
})
|
|
83
|
+
.nullable(),
|
|
84
|
+
});
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { array, boolean, custom, number, object, record, string, z } from "zod";
|
|
2
|
+
import { regionSchema } from "../shared";
|
|
3
|
+
import { leadNoteSchema } from "./lead-note";
|
|
4
|
+
import { agentStatusSchema, leadStatusSchema } from "./lead-status";
|
|
5
|
+
export const jobSkillsSchema = object({
|
|
6
|
+
name: string(),
|
|
7
|
+
});
|
|
8
|
+
export const vendorQualificationSchema = object({
|
|
9
|
+
location: string().nullable(),
|
|
10
|
+
talentType: z.enum(["Agency", "Independent", "unspecified"]).nullable(),
|
|
11
|
+
englishLevel: string().nullable(),
|
|
12
|
+
minimumEarnings: number().nullable(),
|
|
13
|
+
jobSuccessScore: string().nullable(),
|
|
14
|
+
includeRisingTalent: string().nullable(),
|
|
15
|
+
});
|
|
16
|
+
export const clientInfoSchema = object({
|
|
17
|
+
isPaymentVerified: boolean().nullable(),
|
|
18
|
+
isPhoneVerified: boolean().nullable(),
|
|
19
|
+
numberOfReviews: number().nullable(),
|
|
20
|
+
rating: number().nullable(),
|
|
21
|
+
country: string().nullable(),
|
|
22
|
+
region: string().nullable(),
|
|
23
|
+
jobsPosted: number().nullable(),
|
|
24
|
+
totalSpent: number().nullable(),
|
|
25
|
+
numberOfHires: number().nullable(),
|
|
26
|
+
activeEngagements: number().nullable(),
|
|
27
|
+
openJobs: number().nullable(),
|
|
28
|
+
hireRate: number().nullable(),
|
|
29
|
+
memberSince: string().nullable(),
|
|
30
|
+
companyIndustry: string().nullable(),
|
|
31
|
+
companySize: string().nullable(),
|
|
32
|
+
enterpriseClient: boolean().nullable(),
|
|
33
|
+
avgHourlyRatePaid: number().nullable(),
|
|
34
|
+
});
|
|
35
|
+
export const clientReviewSchema = object({
|
|
36
|
+
jobTitle: string().nullable(),
|
|
37
|
+
freelancerName: string().nullable(),
|
|
38
|
+
freelancerRating: number().nullable(),
|
|
39
|
+
freelancerFeedback: string().nullable(),
|
|
40
|
+
clientFeedback: string().nullable(),
|
|
41
|
+
clientFeedbackRating: number().nullable(),
|
|
42
|
+
dateRange: string().nullable(),
|
|
43
|
+
paymentType: string().nullable(),
|
|
44
|
+
fixedPrice: number().nullable(),
|
|
45
|
+
hourlyRate: number().nullable(),
|
|
46
|
+
numHours: number().nullable(),
|
|
47
|
+
totalBilled: number().nullable(),
|
|
48
|
+
});
|
|
49
|
+
export const bidRangeSchema = object({
|
|
50
|
+
high: number().nullable(),
|
|
51
|
+
avg: number().nullable(),
|
|
52
|
+
low: number().nullable(),
|
|
53
|
+
});
|
|
54
|
+
export const jobActivitySchema = object({
|
|
55
|
+
proposals: object({
|
|
56
|
+
min: number().nullable(),
|
|
57
|
+
max: number().nullable(),
|
|
58
|
+
}),
|
|
59
|
+
lastViewedByClient: string().nullable(),
|
|
60
|
+
lastViewedByClientTimestamp: number().nullable(),
|
|
61
|
+
hires: number().nullable(),
|
|
62
|
+
interviewing: number().nullable(),
|
|
63
|
+
invitesSent: number().nullable(),
|
|
64
|
+
unansweredInvites: number().nullable(),
|
|
65
|
+
updatedAt: number().nullable(),
|
|
66
|
+
});
|
|
67
|
+
export const jobActivityDeltaSchema = object({
|
|
68
|
+
proposals: number(),
|
|
69
|
+
interviewing: number(),
|
|
70
|
+
hires: number(),
|
|
71
|
+
invitesSent: number(),
|
|
72
|
+
unansweredInvites: number(),
|
|
73
|
+
});
|
|
74
|
+
export const metadataSchema = object({
|
|
75
|
+
hours: string().nullable(),
|
|
76
|
+
duration: string().nullable(),
|
|
77
|
+
experienceLevel: string().nullable(),
|
|
78
|
+
hourlyRate: z
|
|
79
|
+
.object({
|
|
80
|
+
min: number().nullable(),
|
|
81
|
+
max: number().nullable(),
|
|
82
|
+
})
|
|
83
|
+
.nullable(),
|
|
84
|
+
paymentType: string().nullable(),
|
|
85
|
+
fixedPrice: number().nullable(),
|
|
86
|
+
});
|
|
87
|
+
export const jobActivityOffsetHours = [4, 24];
|
|
88
|
+
export const jobActivityOffsetEnum = z.enum(jobActivityOffsetHours.map((h) => `${h}h`));
|
|
89
|
+
export const upworkJobSchema = object({
|
|
90
|
+
id: string().nullable(),
|
|
91
|
+
uid: string().nullable(),
|
|
92
|
+
createdAt: number().nullable(),
|
|
93
|
+
title: string().nullable(),
|
|
94
|
+
category: string().nullable(),
|
|
95
|
+
skills: array(jobSkillsSchema).nullable(),
|
|
96
|
+
datetime: number().nullable(),
|
|
97
|
+
description: string().nullable(),
|
|
98
|
+
descriptionLength: number().nullable(),
|
|
99
|
+
connectsRequired: number().nullable(),
|
|
100
|
+
projectType: string().nullable(),
|
|
101
|
+
projectDuration: string().nullable(),
|
|
102
|
+
questions: array(string()).nullable(),
|
|
103
|
+
jobUrl: string().nullable(),
|
|
104
|
+
metadata: metadataSchema.nullable(),
|
|
105
|
+
clientInfo: clientInfoSchema.nullable(),
|
|
106
|
+
vendorQualifications: vendorQualificationSchema.nullable(),
|
|
107
|
+
processed: boolean().nullable(),
|
|
108
|
+
isFeatured: boolean().nullable(),
|
|
109
|
+
clientReviews: array(clientReviewSchema).nullable(),
|
|
110
|
+
region: regionSchema.nullable(),
|
|
111
|
+
bidRange: bidRangeSchema.nullable(),
|
|
112
|
+
jobActivity: jobActivitySchema.nullable(),
|
|
113
|
+
activityUpdates: z
|
|
114
|
+
.union([z.literal(1), z.literal(2), z.literal(3)])
|
|
115
|
+
.nullable(),
|
|
116
|
+
activity: record(jobActivityOffsetEnum, jobActivitySchema).nullish(),
|
|
117
|
+
activityDelta: jobActivityDeltaSchema.nullish(),
|
|
118
|
+
});
|
|
119
|
+
export const questionAnswerPairSchema = z.object({
|
|
120
|
+
question: z.string(),
|
|
121
|
+
answer: z.string(),
|
|
122
|
+
});
|
|
123
|
+
export const leadSchema = upworkJobSchema
|
|
124
|
+
.extend({
|
|
125
|
+
jobId: string(),
|
|
126
|
+
updatedAt: number().nullable(),
|
|
127
|
+
suitabilityRating: number().nullable(),
|
|
128
|
+
suitabilityReason: string().nullable(),
|
|
129
|
+
proposal: string().nullable(),
|
|
130
|
+
questionAnswerPairs: array(questionAnswerPairSchema).nullable(),
|
|
131
|
+
agentStatus: agentStatusSchema.nullable(),
|
|
132
|
+
leadStatus: leadStatusSchema.nullable(),
|
|
133
|
+
notes: array(leadNoteSchema).nullable(),
|
|
134
|
+
biddingAmount: number().nullable(),
|
|
135
|
+
boosted: boolean().nullable(),
|
|
136
|
+
boostingAmount: number().nullable(),
|
|
137
|
+
biddingTaskScheduled: boolean().nullable(),
|
|
138
|
+
scheduledBiddingTime: number().nullable(),
|
|
139
|
+
})
|
|
140
|
+
.omit({
|
|
141
|
+
processed: true,
|
|
142
|
+
});
|
|
143
|
+
export const leadResponseSchema = object({
|
|
144
|
+
leads: array(leadSchema),
|
|
145
|
+
nextCursor: string().nullable(),
|
|
146
|
+
hasMore: boolean(),
|
|
147
|
+
leadCounts: number().nullable(),
|
|
148
|
+
});
|
|
149
|
+
export const jobListingSchema = object({
|
|
150
|
+
uid: string().nullable(),
|
|
151
|
+
title: string().nullable(),
|
|
152
|
+
jobUrl: string().nullable(),
|
|
153
|
+
datetime: string().nullable(),
|
|
154
|
+
isFeatured: boolean().nullable(),
|
|
155
|
+
region: regionSchema.nullable(),
|
|
156
|
+
});
|
|
157
|
+
export const jobActivityOffsetHourSchema = custom((val) => jobActivityOffsetHours.includes(val));
|
|
158
|
+
export const jobActivityUpdateSchema = object({
|
|
159
|
+
jobUrl: string(),
|
|
160
|
+
data: jobActivitySchema,
|
|
161
|
+
offsetHour: jobActivityOffsetHourSchema,
|
|
162
|
+
scrapedAt: number(),
|
|
163
|
+
});
|
|
164
|
+
export const jobActivitySnapshotSchema = object({
|
|
165
|
+
jobUrl: string(),
|
|
166
|
+
activity: jobActivitySchema,
|
|
167
|
+
postedAt: number(),
|
|
168
|
+
scrapedAt: number(),
|
|
169
|
+
hoursSincePosted: number(),
|
|
170
|
+
});
|
|
171
|
+
export * from "./lead-note";
|
|
172
|
+
export * from "./lead-status";
|
|
173
|
+
export * from "./nuxt";
|