import { z } from "zod"; export const SecretSchema = z.object({ value: z.string(), encryptionType: z.enum(["electron-safe-storage", "plaintext"]).optional(), }); export type Secret = z.infer; /** * Zod schema for chat summary objects returned by the get-chats IPC */ export const ChatSummarySchema = z.object({ id: z.number(), appId: z.number(), title: z.string().nullable(), createdAt: z.date(), }); /** * Type derived from the ChatSummarySchema */ export type ChatSummary = z.infer; /** * Zod schema for an array of chat summaries */ export const ChatSummariesSchema = z.array(ChatSummarySchema); const providers = [ "openai", "anthropic", "google", "auto", "openrouter", "ollama", "lmstudio", ] as const; export const cloudProviders = providers.filter( (provider) => provider !== "ollama" && provider !== "lmstudio", ); /** * Zod schema for large language model configuration */ export const LargeLanguageModelSchema = z.object({ name: z.string(), provider: z.string(), }); /** * Type derived from the LargeLanguageModelSchema */ export type LargeLanguageModel = z.infer; /** * Zod schema for provider settings */ export const ProviderSettingSchema = z.object({ apiKey: SecretSchema.optional(), }); /** * Type derived from the ProviderSettingSchema */ export type ProviderSetting = z.infer; export const RuntimeModeSchema = z.enum(["web-sandbox", "local-node", "unset"]); export type RuntimeMode = z.infer; export const GitHubSecretsSchema = z.object({ accessToken: SecretSchema.nullable(), }); export type GitHubSecrets = z.infer; export const GithubUserSchema = z.object({ email: z.string(), }); export type GithubUser = z.infer; export const SupabaseSchema = z.object({ accessToken: SecretSchema.optional(), refreshToken: SecretSchema.optional(), expiresIn: z.number().optional(), tokenTimestamp: z.number().optional(), }); export type Supabase = z.infer; export const ExperimentsSchema = z.object({ // Deprecated enableSupabaseIntegration: z.boolean().describe("DEPRECATED").optional(), enableFileEditing: z.boolean().optional(), }); export type Experiments = z.infer; export const DyadProBudgetSchema = z.object({ budgetResetAt: z.string(), maxBudget: z.number(), }); export type DyadProBudget = z.infer; /** * Zod schema for user settings */ export const UserSettingsSchema = z.object({ selectedModel: LargeLanguageModelSchema, providerSettings: z.record(z.string(), ProviderSettingSchema), githubUser: GithubUserSchema.optional(), githubAccessToken: SecretSchema.optional(), supabase: SupabaseSchema.optional(), autoApproveChanges: z.boolean().optional(), telemetryConsent: z.enum(["opted_in", "opted_out", "unset"]).optional(), telemetryUserId: z.string().optional(), hasRunBefore: z.boolean().optional(), enableDyadPro: z.boolean().optional(), dyadProBudget: DyadProBudgetSchema.optional(), experiments: ExperimentsSchema.optional(), lastShownReleaseNotesVersion: z.string().optional(), // DEPRECATED. runtimeMode: RuntimeModeSchema.optional(), }); /** * Type derived from the UserSettingsSchema */ export type UserSettings = z.infer; // Define interfaces for the props export interface SecurityRisk { type: "warning" | "danger"; title: string; description: string; } export interface FileChange { name: string; path: string; summary: string; type: "write" | "rename" | "delete"; isServerFunction: boolean; } export interface SqlQuery { content: string; description?: string; } export interface CodeProposal { type: "code-proposal"; title: string; securityRisks: SecurityRisk[]; filesChanged: FileChange[]; packagesAdded: string[]; sqlQueries: SqlQuery[]; } export type SuggestedAction = | RestartAppAction | SummarizeInNewChatAction | RefactorFileAction | WriteCodeProperlyAction | RebuildAction | RestartAction | RefreshAction; export interface RestartAppAction { id: "restart-app"; } export interface SummarizeInNewChatAction { id: "summarize-in-new-chat"; } export interface WriteCodeProperlyAction { id: "write-code-properly"; } export interface RefactorFileAction { id: "refactor-file"; path: string; } export interface RebuildAction { id: "rebuild"; } export interface RestartAction { id: "restart"; } export interface RefreshAction { id: "refresh"; } export interface ActionProposal { type: "action-proposal"; actions: SuggestedAction[]; } export interface TipProposal { type: "tip-proposal"; title: string; description: string; } export type Proposal = CodeProposal | ActionProposal | TipProposal; export interface ProposalResult { proposal: Proposal; chatId: number; messageId: number; }