import { z } from 'zod'; export const tradeAgentSourceEnum = z.enum(['whatsapp', 'telephony', 'api', 'cron']); export const senderRoleEnum = z.enum(['owner', 'customer', 'unknown']); /** Preferred intent from client (e.g. mobile). Aligns with voice/parse; productId/productName both accepted. */ export const tradePreferredIntentSchema = z.object({ type: z.enum([ 'stock_query', 'report_request', 'price_check', 'availability', 'credit_summary', 'credit_payment', 'record_sale', 'restock', 'stock_update', 'add_customer', 'competitor_check', 'weekly_analysis', 'supplier_optimize', 'schedule_follow_up', 'create_order', 'reserve', 'list_reservations', 'collect_payment', 'payment_status', 'reconcile_payments', 'create_supplier_bill', 'pay_supplier', 'analytics_query', ]), productId: z.string().optional().nullable(), productName: z.string().optional().nullable(), customerId: z.string().optional().nullable(), customerName: z.string().optional().nullable(), quantity: z.number().optional(), unitPrice: z.number().optional(), price: z.number().optional(), amount: z.number().optional(), operation: z.enum(['add', 'set']).optional(), phoneNumber: z.string().optional().nullable(), paymentMethod: z.string().optional().nullable(), message: z.string().optional().nullable(), delayHours: z.number().optional(), channel: z.enum(['whatsapp', 'in_app']).optional().nullable(), }); export type TradePreferredIntent = z.infer; export const tradeAgentInputSchema = z.object({ input: z.string().min(1).max(2000), source: tradeAgentSourceEnum, senderRole: senderRoleEnum.optional(), sessionId: z.string().uuid().optional(), preferredIntent: tradePreferredIntentSchema.optional(), /** Batch from mobile pipeline; when set, first item seeds resolution (multi-intent execution is server-side). */ preferredIntents: z.array(tradePreferredIntentSchema).max(20).optional(), }); export const tradeAgentIntentOutputSchema = z.object({ type: z.string(), productName: z.string().optional(), customerName: z.string().optional(), quantity: z.number().optional(), price: z.number().optional(), operation: z.string().optional(), phoneNumber: z.string().optional(), amount: z.number().optional(), paymentMethod: z.string().optional(), }); export const policyTierEnum = z.enum(['auto_execute', 'ask_confirm', 'escalate_human']); export type PolicyTier = z.infer; export const tradeAgentResponseSchema = z.object({ reply: z.string(), intent: tradeAgentIntentOutputSchema.nullable(), /** All intents executed in this turn (chain). Omitted when only legacy [intent] is used. */ intents: z.array(tradeAgentIntentOutputSchema).optional(), /** Resolver + model confidence 0..1 when available. */ confidence: z.number().min(0).max(1).optional(), clarificationNeeded: z.boolean().optional(), clarificationPrompt: z.string().optional(), /** When true, client should confirm before re-submitting with preferredIntent (Phase 5B autonomy). */ requiresConfirmation: z.boolean().optional(), /** Confidence-based execution policy tier. */ policyTier: policyTierEnum.optional(), policyReason: z.string().optional(), result: z.record(z.unknown()).nullable(), sessionId: z.string().uuid().optional(), auditId: z.string().uuid().optional(), });