--- phase: 36-voice-pipeline-foundation plan: "02" subsystem: shared-validators tags: - voice-mode - schema - types - nexus-settings dependency_graph: requires: [] provides: - voiceMode field on createMessageSchema - VoiceMode type and VOICE_MODES constant - voiceMode on ChatMessage interface - voiceMode and telegramToken in nexus-settings schema affects: - server/src/routes/chat.ts (createMessageSchema.parse preserves voiceMode) - nexus-settings.json (reads voiceMode with default "text") tech_stack: added: [] patterns: - Zod enum with optional() for optional validated enum fields - Zod schema exported for direct testing without mocking file system - nexusSettingsSchema.parse({}) for consistent defaults in catch blocks key_files: created: - server/src/__tests__/36-voice-schema.test.ts modified: - packages/shared/src/validators/chat.ts - packages/shared/src/types/chat.ts - server/src/services/nexus-settings.ts decisions: - Export nexusSettingsSchema named export to enable direct Zod schema testing without file system mocking - Use nexusSettingsSchema.parse({}) in catch/fallback blocks for consistent Zod defaults metrics: duration_minutes: 7 completed_date: "2026-04-04T01:24:07Z" tasks_completed: 2 tasks_total: 2 files_created: 1 files_modified: 3 requirements_completed: - VPIPE-05 --- # Phase 36 Plan 02: Voice Schema Foundation Summary **One-liner:** voiceMode enum field added to createMessageSchema and ChatMessage, plus nexus-settings extended with voiceMode (default "text"), telegramToken, piperBinaryPath, and whisperBinaryPath. ## Completed Tasks | Task | Name | Commit | Files | |------|------|--------|-------| | 1 | Extend shared validators and types with voiceMode field | 390034c7 | packages/shared/src/validators/chat.ts, packages/shared/src/types/chat.ts, server/src/__tests__/36-voice-schema.test.ts | | 2 | Extend nexus-settings schema with voiceMode and telegramToken | 044e3dad | server/src/services/nexus-settings.ts, server/src/__tests__/36-voice-schema.test.ts | ## What Was Built ### packages/shared/src/validators/chat.ts Added `VOICE_MODES` constant, `VoiceMode` type, and optional `voiceMode` field to `createMessageSchema`: ```typescript export const VOICE_MODES = ["text", "voice_input", "full_voice"] as const; export type VoiceMode = (typeof VOICE_MODES)[number]; // In createMessageSchema: voiceMode: z.enum(VOICE_MODES).optional(), ``` ### packages/shared/src/types/chat.ts Added optional `voiceMode` field to `ChatMessage` interface: ```typescript voiceMode?: "text" | "voice_input" | "full_voice" | null; ``` ### server/src/services/nexus-settings.ts Extended `nexusSettingsSchema` with four new fields, exported the schema for testing, updated fallback logic: ```typescript export const nexusSettingsSchema = z.object({ mode: z.enum(NEXUS_MODES).default("both"), voiceEnabled: z.boolean().default(false), voiceMode: z.enum(VOICE_MODES).default("text"), telegramToken: z.string().optional(), piperBinaryPath: z.string().optional(), whisperBinaryPath: z.string().optional(), }); ``` ### server/src/__tests__/36-voice-schema.test.ts 11 tests covering: - createMessageSchema voiceMode enum validation (6 tests) - nexusSettingsSchema voiceMode defaults and telegramToken (5 tests) ## Verification All verification checks pass: - `pnpm --filter @paperclipai/server test --run` exits 0 for 36-voice-schema.test.ts (11/11 tests) - `grep "voiceMode" packages/shared/src/validators/chat.ts` shows the field - `grep "voiceMode" packages/shared/src/types/chat.ts` shows the field - `grep "voiceMode" server/src/services/nexus-settings.ts` shows the field - `grep "telegramToken" server/src/services/nexus-settings.ts` shows the field ## Deviations from Plan None — plan executed exactly as written. ## Known Stubs None — this plan adds schema/type foundations only. No UI rendering or data flow is introduced. ## Self-Check: PASSED - packages/shared/src/validators/chat.ts — FOUND, contains voiceMode - packages/shared/src/types/chat.ts — FOUND, contains voiceMode - server/src/services/nexus-settings.ts — FOUND, contains voiceMode and telegramToken - server/src/__tests__/36-voice-schema.test.ts — FOUND, 11 passing tests - Commit 390034c7 — FOUND - Commit 044e3dad — FOUND