import { z } from "zod"; import { COMPANY_STATUSES, ISSUE_THREAD_INTERACTION_RESOLVER_POLICIES, } from "../constants.js"; import { objectWithoutDefaults } from "./partial.js"; const logoAssetIdSchema = z.string().guid().nullable().optional(); const feedbackDataSharingTermsVersionSchema = z.string().min(1).nullable().optional(); const interactionResolverKindGovernanceSchema = z.object({ defaultPolicy: z.enum(ISSUE_THREAD_INTERACTION_RESOLVER_POLICIES).optional(), cap: z.enum(ISSUE_THREAD_INTERACTION_RESOLVER_POLICIES).optional(), }).strict(); export const interactionResolverGovernanceSchema = z.object({ suggest_tasks: interactionResolverKindGovernanceSchema.optional(), ask_user_questions: interactionResolverKindGovernanceSchema.optional(), request_confirmation: interactionResolverKindGovernanceSchema.optional(), request_checkbox_confirmation: interactionResolverKindGovernanceSchema.optional(), request_item_verdicts: interactionResolverKindGovernanceSchema.optional(), }).strict().default({}); export const createCompanySchema = z.object({ name: z.string().min(1), description: z.string().optional().nullable(), budgetMonthlyCents: z.number().int().nonnegative().optional().default(0), defaultResponsibleUserId: z.string().min(1).nullable().optional(), }); export type CreateCompany = z.infer; export const updateCompanySchema = objectWithoutDefaults( createCompanySchema .partial() .extend({ status: z.enum(COMPANY_STATUSES).optional(), spentMonthlyCents: z.number().int().nonnegative().optional(), requireBoardApprovalForNewAgents: z.boolean().optional(), interactionResolverGovernance: interactionResolverGovernanceSchema.optional(), feedbackDataSharingEnabled: z.boolean().optional(), feedbackDataSharingConsentAt: z.coerce.date().nullable().optional(), feedbackDataSharingConsentByUserId: z.string().min(1).nullable().optional(), feedbackDataSharingTermsVersion: feedbackDataSharingTermsVersionSchema, logoAssetId: logoAssetIdSchema, }), ); export type UpdateCompany = z.infer; export const updateCompanyBrandingSchema = z .object({ name: z.string().min(1).optional(), description: z.string().nullable().optional(), logoAssetId: logoAssetIdSchema, }) .strict() .refine( (value) => value.name !== undefined || value.description !== undefined || value.logoAssetId !== undefined, "At least one branding field must be provided", ); export type UpdateCompanyBranding = z.infer;