import { initContract } from '@ts-rest/core'; import { z } from 'zod'; import { errorResponseSchema } from '../schemas/common.schemas'; const c = initContract(); const weeklyPlanItemSchema = z.object({ id: z.string().uuid(), category: z.enum(['restock', 'credit_followup', 'pricing_review', 'expiry']), title: z.string(), detail: z.string(), itemStatus: z.enum(['pending', 'approved', 'rejected', 'done']), payload: z.record(z.unknown()).optional(), }); export const shopkeeperIntelligenceContract = c.router({ getAgentAutonomy: { method: 'GET', path: '/shopkeeper/intelligence/agent-autonomy', responses: { 200: z.object({ settings: z.record(z.unknown()), defaults: z.record(z.unknown()), intentRouterCohort: z.enum(['control', 'experimental']), }), 401: errorResponseSchema, }, summary: 'Per-shop autonomous execution thresholds and fine-tune cohort', }, putAgentAutonomy: { method: 'PUT', path: '/shopkeeper/intelligence/agent-autonomy', body: z.record(z.string(), z.any()), responses: { 200: z.object({ settings: z.record(z.unknown()), defaults: z.record(z.unknown()), intentRouterCohort: z.enum(['control', 'experimental']), }), 401: errorResponseSchema, }, summary: 'Update autonomy settings (partial merge over defaults)', }, getWeeklyPlanLatest: { method: 'GET', path: '/shopkeeper/intelligence/weekly-plan/latest', responses: { 200: z.object({ plan: z .object({ id: z.string().uuid(), weekKey: z.string(), status: z.string(), items: z.array(weeklyPlanItemSchema), summaryText: z.string().nullable(), deliveredAt: z.coerce.date().nullable(), approvedAt: z.coerce.date().nullable(), createdAt: z.coerce.date(), }) .nullable(), }), 401: errorResponseSchema, }, summary: 'Most recent weekly operational plan', }, setWeeklyPlanStatus: { method: 'POST', path: '/shopkeeper/intelligence/weekly-plan/:planId/status', pathParams: z.object({ planId: z.string().uuid() }), body: z.object({ status: z.enum(['approved', 'rejected', 'partial']), }), responses: { 200: z.object({ updated: z.boolean() }), 401: errorResponseSchema, 404: errorResponseSchema, }, summary: 'Approve or reject a weekly plan', }, updateWeeklyPlanItem: { method: 'PATCH', path: '/shopkeeper/intelligence/weekly-plan/:planId/items/:itemId', pathParams: z.object({ planId: z.string().uuid(), itemId: z.string().uuid() }), body: z.object({ itemStatus: z.enum(['approved', 'rejected', 'done']), }), responses: { 200: z.object({ ok: z.boolean() }), 401: errorResponseSchema, 404: errorResponseSchema, }, summary: 'Update a single weekly plan line item', }, });