@fayz-ai/plugin-menu 0.12.10 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{MenuPage-ITS2DGKM.js → MenuPage-7WXTOSQK.js} +89 -63
- package/dist/MenuPage-7WXTOSQK.js.map +1 -0
- package/dist/components/DraftSectionCard.d.ts.map +1 -1
- package/dist/components/ItemRailPage.d.ts.map +1 -1
- package/dist/components/SectionCard.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -4
- package/dist/index.js.map +1 -1
- package/dist/settings/v1-settings.d.ts +2 -0
- package/dist/settings/v1-settings.d.ts.map +1 -0
- package/package.json +5 -5
- package/dist/MenuPage-ITS2DGKM.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/mock.ts","../src/data/catalog-cache.ts","../src/data/tables.ts","../src/data/supabase.ts","../src/migrations/index.ts","../src/data/types.ts","../src/data/legacy-adapter.ts","../src/store.ts","../src/data/registries.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/data/platform.ts","../src/index.ts"],"names":["now","placementId","rowToCategory","rowToItem","paginate"],"mappings":"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AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA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","file":"index.js","sourcesContent":["import type { FullMenuDataProvider } from './types'\nimport type {\n Menu, MenuSection, MenuPlacement, MenuCategory, MenuItem, ModifierGroup,\n CreateMenuInput, UpdateMenuInput, CreateSectionInput, UpdateSectionInput, PlaceItemInput,\n CreateMenuItemInput, UpdateMenuItemInput, CreateMenuCategoryInput,\n MenuItemQuery, PaginatedResult, MenuSummary,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// In-memory backend. Seeded as a real restaurant would be — two menus, one of\n// them a weekday executive lunch — so the screen demos the thing it is for.\n// ---------------------------------------------------------------------------\n\nlet uid = 0\nfunction nextId(prefix: string) { return prefix + '-' + (++uid) }\nfunction now(): string { return new Date().toISOString() }\n\nfunction paginate<T>(items: T[], page?: number, pageSize?: number): PaginatedResult<T> {\n const p = page ?? 1\n const ps = pageSize ?? 200\n const start = (p - 1) * ps\n return { data: items.slice(start, start + ps), total: items.length }\n}\n\nconst TENANT = 'mock-tenant'\n\nexport function createMockMenuProvider(): FullMenuDataProvider {\n const ts = now()\n\n const menus: Menu[] = [\n {\n id: nextId('menu'), name: 'Cardápio principal', description: 'O de todo dia',\n isActive: true, sortOrder: 0, channels: ['pos', 'delivery', 'digital'], availability: {},\n tenantId: TENANT, createdAt: ts, updatedAt: ts,\n },\n {\n id: nextId('menu'), name: 'Executivo', description: 'Almoço de segunda a sexta',\n isActive: true, sortOrder: 1, channels: ['pos'],\n availability: { days: [1, 2, 3, 4, 5], start: '11:30', end: '15:00' },\n tenantId: TENANT, createdAt: ts, updatedAt: ts,\n },\n ]\n\n const section = (menuId: string, name: string, order: number): MenuSection => ({\n id: nextId('sec'), menuId, name, sortOrder: order, isActive: true,\n availability: {}, tenantId: TENANT, createdAt: ts, updatedAt: ts,\n })\n\n const sections: MenuSection[] = [\n section(menus[0].id, 'Entradas', 0),\n section(menus[0].id, 'Pratos principais', 1),\n section(menus[0].id, 'Bebidas', 2),\n section(menus[0].id, 'Sobremesas', 3),\n section(menus[1].id, 'Prato do dia', 0),\n section(menus[1].id, 'Bebida inclusa', 1),\n ]\n\n const item = (name: string, price: number, extra: Partial<MenuItem> = {}): MenuItem => ({\n id: nextId('mi'), name, price, currency: 'BRL', status: 'available', isActive: true,\n availableForPos: true, availableForDelivery: true, sortOrder: 0, isFeatured: false,\n allergens: [], dietaryTags: [],\n tenantId: TENANT, createdAt: ts, updatedAt: ts, ...extra,\n })\n\n const items: MenuItem[] = [\n item('Bolinho de bacalhau', 38, { description: '6 unidades', prepTimeMinutes: 15 }),\n item('Pão de alho', 18, { prepTimeMinutes: 8, dietaryTags: ['Vegetariano'] }),\n item('Picanha na chapa', 129, { description: 'Serve 2 pessoas', prepTimeMinutes: 25, isFeatured: true }),\n item('Moqueca de peixe', 98, { prepTimeMinutes: 30, allergens: ['Frutos do mar'] }),\n item('Risoto de funghi', 72, { prepTimeMinutes: 22, dietaryTags: ['Vegetariano'] }),\n item('Suco natural', 14, { prepTimeMinutes: 3 }),\n item('Refrigerante', 9, { prepTimeMinutes: 1 }),\n item('Água', 6, { prepTimeMinutes: 1 }),\n item('Pudim da casa', 19, { prepTimeMinutes: 2, isFeatured: true }),\n item('Petit gâteau', 26, { prepTimeMinutes: 12, allergens: ['Glúten', 'Lactose'] }),\n item('Prato executivo do dia', 42, { description: 'Prato + bebida', prepTimeMinutes: 15 }),\n ]\n\n const placement = (sectionId: string, itemId: string, order: number, priceOverride?: number): MenuPlacement => ({\n id: nextId('pl'), sectionId, itemId, sortOrder: order, priceOverride, isActive: true, tenantId: TENANT,\n })\n\n const placements: MenuPlacement[] = [\n placement(sections[0].id, items[0].id, 0),\n placement(sections[0].id, items[1].id, 1),\n placement(sections[1].id, items[2].id, 0),\n placement(sections[1].id, items[3].id, 1),\n placement(sections[1].id, items[4].id, 2),\n placement(sections[2].id, items[5].id, 0),\n placement(sections[2].id, items[6].id, 1),\n placement(sections[2].id, items[7].id, 2),\n placement(sections[3].id, items[8].id, 0),\n placement(sections[3].id, items[9].id, 1),\n placement(sections[4].id, items[10].id, 0),\n // The same risotto, cheaper at lunch — the reason placements carry a price.\n placement(sections[4].id, items[4].id, 1, 49),\n placement(sections[5].id, items[5].id, 0, 0),\n ]\n\n const categories: MenuCategory[] = []\n\n const g1 = nextId('mg')\n const g2 = nextId('mg')\n const modifierGroups: ModifierGroup[] = [\n {\n id: g1, name: 'Ponto da carne', minSelections: 1, maxSelections: 1, isRequired: true, sortOrder: 0,\n tenantId: TENANT, createdAt: ts,\n items: [\n { id: nextId('mod'), groupId: g1, name: 'Mal passada', priceAdjustment: 0, isActive: true, sortOrder: 0 },\n { id: nextId('mod'), groupId: g1, name: 'Ao ponto', priceAdjustment: 0, isActive: true, sortOrder: 1 },\n { id: nextId('mod'), groupId: g1, name: 'Bem passada', priceAdjustment: 0, isActive: true, sortOrder: 2 },\n ],\n },\n {\n id: g2, name: 'Acompanhamentos', minSelections: 0, maxSelections: 3, isRequired: false, sortOrder: 1,\n tenantId: TENANT, createdAt: ts,\n items: [\n { id: nextId('mod'), groupId: g2, name: 'Farofa', priceAdjustment: 8, isActive: true, sortOrder: 0 },\n { id: nextId('mod'), groupId: g2, name: 'Vinagrete', priceAdjustment: 6, isActive: true, sortOrder: 1 },\n { id: nextId('mod'), groupId: g2, name: 'Arroz branco', priceAdjustment: 10, isActive: true, sortOrder: 2 },\n ],\n },\n ]\n\n const provider: FullMenuDataProvider = {\n // --- Menus ---\n async getMenus() {\n return menus.map((m) => {\n const mine = sections.filter((s) => s.menuId === m.id)\n const ids = new Set(mine.map((s) => s.id))\n return { ...m, sectionCount: mine.length, itemCount: placements.filter((p) => ids.has(p.sectionId)).length }\n }).sort((a, b) => a.sortOrder - b.sortOrder)\n },\n async createMenu(input: CreateMenuInput) {\n const menu: Menu = {\n id: nextId('menu'), name: input.name, description: input.description,\n isActive: input.isActive ?? true, sortOrder: input.sortOrder ?? menus.length,\n channels: input.channels ?? ['pos', 'delivery', 'digital'],\n availability: input.availability ?? {},\n tenantId: TENANT, createdAt: now(), updatedAt: now(),\n }\n menus.push(menu)\n return menu\n },\n async updateMenu(id: string, patch: UpdateMenuInput) {\n const menu = menus.find((m) => m.id === id)\n if (!menu) throw new Error('Menu not found')\n Object.assign(menu, patch, { updatedAt: now() })\n return menu\n },\n async deleteMenu(id: string) {\n const mine = sections.filter((s) => s.menuId === id)\n for (const s of mine) {\n for (let i = placements.length - 1; i >= 0; i--) if (placements[i].sectionId === s.id) placements.splice(i, 1)\n sections.splice(sections.indexOf(s), 1)\n }\n const index = menus.findIndex((m) => m.id === id)\n if (index >= 0) menus.splice(index, 1)\n },\n async duplicateMenu(id: string, name: string) {\n const source = menus.find((m) => m.id === id)\n if (!source) throw new Error('Menu not found')\n const copy = await provider.createMenu({\n name, description: source.description, channels: source.channels,\n availability: source.availability, isActive: false,\n })\n for (const s of sections.filter((x) => x.menuId === id)) {\n const clone = await provider.createSection({\n menuId: copy.id, name: s.name, description: s.description,\n sortOrder: s.sortOrder, isActive: s.isActive, availability: s.availability,\n })\n for (const p of placements.filter((x) => x.sectionId === s.id)) {\n await provider.placeItem({\n sectionId: clone.id, itemId: p.itemId, sortOrder: p.sortOrder,\n priceOverride: p.priceOverride, isActive: p.isActive,\n })\n }\n }\n return copy\n },\n async reorderMenus(ids: string[]) {\n ids.forEach((id, index) => {\n const menu = menus.find((m) => m.id === id)\n if (menu) menu.sortOrder = index\n })\n },\n\n // --- Sections ---\n async getSections(menuId: string) {\n return sections.filter((s) => s.menuId === menuId).sort((a, b) => a.sortOrder - b.sortOrder)\n },\n async createSection(input: CreateSectionInput) {\n const created: MenuSection = {\n id: nextId('sec'), menuId: input.menuId, name: input.name,\n description: input.description, imageUrl: input.imageUrl,\n sortOrder: input.sortOrder ?? sections.filter((s) => s.menuId === input.menuId).length,\n isActive: input.isActive ?? true, availability: input.availability ?? {},\n tenantId: TENANT, createdAt: now(), updatedAt: now(),\n }\n sections.push(created)\n return created\n },\n async updateSection(id: string, patch: UpdateSectionInput) {\n const found = sections.find((s) => s.id === id)\n if (!found) throw new Error('Section not found')\n Object.assign(found, patch, { updatedAt: now() })\n return found\n },\n async deleteSection(id: string) {\n for (let i = placements.length - 1; i >= 0; i--) if (placements[i].sectionId === id) placements.splice(i, 1)\n const index = sections.findIndex((s) => s.id === id)\n if (index >= 0) sections.splice(index, 1)\n },\n async reorderSections(_menuId: string, ids: string[]) {\n ids.forEach((id, index) => {\n const found = sections.find((s) => s.id === id)\n if (found) found.sortOrder = index\n })\n },\n\n // --- Placements ---\n async getPlacements(menuId: string) {\n const ids = new Set(sections.filter((s) => s.menuId === menuId).map((s) => s.id))\n return placements.filter((p) => ids.has(p.sectionId)).sort((a, b) => a.sortOrder - b.sortOrder)\n },\n async placeItem(input: PlaceItemInput) {\n const existing = placements.find((p) => p.sectionId === input.sectionId && p.itemId === input.itemId)\n if (existing) {\n Object.assign(existing, input)\n return existing\n }\n const created = placement(\n input.sectionId, input.itemId,\n input.sortOrder ?? placements.filter((p) => p.sectionId === input.sectionId).length,\n input.priceOverride,\n )\n created.isActive = input.isActive ?? true\n placements.push(created)\n return created\n },\n async updatePlacement(id: string, patch: Partial<PlaceItemInput>) {\n const found = placements.find((p) => p.id === id)\n if (!found) throw new Error('Placement not found')\n if (patch.sectionId !== undefined) found.sectionId = patch.sectionId\n if (patch.sortOrder !== undefined) found.sortOrder = patch.sortOrder\n if (patch.priceOverride !== undefined) found.priceOverride = patch.priceOverride\n if (patch.isActive !== undefined) found.isActive = patch.isActive\n return found\n },\n async removePlacement(id: string) {\n const index = placements.findIndex((p) => p.id === id)\n if (index >= 0) placements.splice(index, 1)\n },\n async reorderPlacements(_sectionId: string, ids: string[]) {\n ids.forEach((id, index) => {\n const found = placements.find((p) => p.id === id)\n if (found) found.sortOrder = index\n })\n },\n async movePlacement(id: string, toSectionId: string, toIndex: number) {\n const found = placements.find((p) => p.id === id)\n if (!found) return\n found.sectionId = toSectionId\n found.sortOrder = toIndex\n placements\n .filter((p) => p.sectionId === toSectionId && p.id !== id)\n .sort((a, b) => a.sortOrder - b.sortOrder)\n .forEach((p, i) => { p.sortOrder = i >= toIndex ? i + 1 : i })\n },\n\n // --- Media ---\n async uploadImage(file: File) {\n // No bucket in memory: the object URL lives as long as the tab, which is\n // exactly as long as this provider's data does.\n return typeof URL !== 'undefined' && URL.createObjectURL ? URL.createObjectURL(file) : ''\n },\n\n // --- Categories (legacy surface, still answered) ---\n async getCategories() { return [...categories].sort((a, b) => a.sortOrder - b.sortOrder) },\n async getCategoryById(id: string) { return categories.find((c) => c.id === id) ?? null },\n async createCategory(input: CreateMenuCategoryInput) {\n const created: MenuCategory = {\n id: nextId('cat'), name: input.name, parentId: input.parentId, icon: input.icon, color: input.color,\n sortOrder: input.sortOrder ?? categories.length, isActive: true,\n tenantId: TENANT, createdAt: now(), updatedAt: now(),\n }\n categories.push(created)\n return created\n },\n async updateCategory(id: string, patch: Partial<MenuCategory>) {\n const found = categories.find((c) => c.id === id)\n if (!found) throw new Error('Category not found')\n Object.assign(found, patch, { updatedAt: now() })\n return found\n },\n async deleteCategory(id: string) {\n const index = categories.findIndex((c) => c.id === id)\n if (index >= 0) categories.splice(index, 1)\n },\n async reorderCategories(ids: string[]) {\n ids.forEach((id, index) => {\n const found = categories.find((c) => c.id === id)\n if (found) found.sortOrder = index\n })\n },\n\n // --- Items ---\n async getMenuItems(query: MenuItemQuery) {\n let result = [...items]\n if (query.search) {\n const term = query.search.toLowerCase()\n result = result.filter((i) => i.name.toLowerCase().includes(term) || (i.description ?? '').toLowerCase().includes(term))\n }\n if (query.categoryId) result = result.filter((i) => i.categoryId === query.categoryId)\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n result = result.filter((i) => statuses.includes(i.status))\n }\n if (query.availableForPos !== undefined) result = result.filter((i) => i.availableForPos === query.availableForPos)\n if (query.availableForDelivery !== undefined) result = result.filter((i) => i.availableForDelivery === query.availableForDelivery)\n if (query.isFeatured !== undefined) result = result.filter((i) => i.isFeatured === query.isFeatured)\n return paginate(result, query.page, query.pageSize)\n },\n async getMenuItemById(id: string) { return items.find((i) => i.id === id) ?? null },\n async createMenuItem(input: CreateMenuItemInput) {\n const created = item(input.name, input.price, {\n description: input.description, cost: input.cost, imageUrl: input.imageUrl,\n categoryId: input.categoryId, status: input.status ?? 'available',\n prepTimeMinutes: input.prepTimeMinutes, allergens: input.allergens ?? [],\n dietaryTags: input.dietaryTags ?? [],\n availableForPos: input.availableForPos ?? true,\n availableForDelivery: input.availableForDelivery ?? true,\n deliveryPrice: input.deliveryPrice, isFeatured: input.isFeatured ?? false,\n modifierGroupIds: input.modifierGroupIds,\n })\n items.push(created)\n if (input.sectionId) await provider.placeItem({ sectionId: input.sectionId, itemId: created.id })\n return created\n },\n async updateMenuItem(id: string, patch: UpdateMenuItemInput) {\n const found = items.find((i) => i.id === id)\n if (!found) throw new Error('Item not found')\n Object.assign(found, patch, { updatedAt: now() })\n return found\n },\n async deleteMenuItem(id: string) {\n for (let i = placements.length - 1; i >= 0; i--) if (placements[i].itemId === id) placements.splice(i, 1)\n const index = items.findIndex((i) => i.id === id)\n if (index >= 0) items.splice(index, 1)\n },\n async toggleAvailability(id: string, field, value) {\n const found = items.find((i) => i.id === id)\n if (!found) throw new Error('Item not found')\n ;(found as any)[field] = value\n found.updatedAt = now()\n return found\n },\n async reorderItems(_categoryId: string, ids: string[]) {\n ids.forEach((id, index) => {\n const found = items.find((i) => i.id === id)\n if (found) found.sortOrder = index\n })\n },\n\n // --- Modifier groups ---\n async getModifierGroups() { return [...modifierGroups].sort((a, b) => a.sortOrder - b.sortOrder) },\n async createModifierGroup(input: Partial<ModifierGroup>) {\n const created: ModifierGroup = {\n id: nextId('mg'), name: input.name ?? 'Grupo',\n minSelections: input.minSelections ?? 0, maxSelections: input.maxSelections ?? 1,\n isRequired: input.isRequired ?? false, sortOrder: input.sortOrder ?? modifierGroups.length,\n items: input.items ?? [], tenantId: TENANT, createdAt: now(),\n }\n modifierGroups.push(created)\n return created\n },\n async updateModifierGroup(id: string, patch: Partial<ModifierGroup>) {\n const found = modifierGroups.find((g) => g.id === id)\n if (!found) throw new Error('Modifier group not found')\n Object.assign(found, patch)\n return found\n },\n async deleteModifierGroup(id: string) {\n const index = modifierGroups.findIndex((g) => g.id === id)\n if (index >= 0) modifierGroups.splice(index, 1)\n },\n\n // --- Summary ---\n async getSummary(): Promise<MenuSummary> {\n const prices = items.map((i) => i.price)\n return {\n totalItems: items.length,\n availableItems: items.filter((i) => i.status === 'available').length,\n soldOutItems: items.filter((i) => i.status === 'sold_out').length,\n hiddenItems: items.filter((i) => i.status === 'hidden').length,\n categoryCount: sections.length,\n averagePrice: prices.length ? prices.reduce((a, b) => a + b, 0) / prices.length : 0,\n featuredCount: items.filter((i) => i.isFeatured).length,\n }\n },\n }\n\n return provider\n}\n","// ---------------------------------------------------------------------------\n// O CARDÁPIO TEM O RELÓGIO DELE.\n//\n// Medido no Pertinho do Céu (1.381 produtos ativos, 208 mesas): ler o cardápio\n// inteiro custa 2 requisições e ~1,3 MB de JSON — o `select('*')` traz\n// `description`, `metadata`, `custom_fields` e `tags` de cada produto, e o PDV\n// usa sete campos. Antes desta camada esse mesmo 1,3 MB descia a cada abertura\n// do PDV, a cada «acomodar cliente» (`data.reload()`) e mais uma vez logo após\n// a carga das comandas, porque a política de isenção de taxa entrava na chave\n// do efeito. Num salão cheio com internet ruim é o PDV parado na mão do garçom.\n//\n// A regra aqui é uma só: o cardápio muda em escala de HORAS, a comanda muda em\n// SEGUNDOS — então eles não podem compartilhar gatilho. Quem lê o cardápio lê\n// esta cópia; quem precisa saber que um item acabou pede uma REVALIDAÇÃO, que\n// acontece por trás sem nunca tirar da tela o cardápio que já estava lá.\n//\n// O armazém é o `globalCache` do core — não um motor novo. Ele já morre\n// sozinho na troca de conta (`clearGlobalCache`), que é exatamente o que a\n// troca de unidade precisa. O TTL do `globalCache` fica LONGO de propósito: a\n// validade real é decidida por `catalogAge`, porque servir cópia velha\n// enquanto se revalida é o comportamento desejado, e uma entrada expirada no\n// armazém não teria o que servir.\n// ---------------------------------------------------------------------------\n\nimport { globalCache, stableKey } from '@fayz-ai/core'\nimport type { MenuCategory, MenuItem } from '../types'\nimport type { MenuDataProvider } from './types'\n\n/** Uma cópia do cardápio, com a hora em que ela saiu do banco. */\nexport interface MenuCatalog {\n items: MenuItem[]\n categories: MenuCategory[]\n /** Epoch ms de quando esta cópia foi lida. */\n fetchedAt: number\n}\n\n/** Depois disto a cópia continua servindo, mas pede revalidação por trás. */\nexport const MENU_CATALOG_TTL = 5 * 60_000\n\n/**\n * Quanto o armazém guarda a cópia mesmo velha.\n *\n * Doze horas é mais que um serviço inteiro: o terminal que abriu às 11h e\n * ficou o dia todo no ar sempre tem o que mostrar enquanto a rede não volta.\n */\nconst STORE_TTL = 12 * 60 * 60_000\n\n/** Quantos produtos por ida ao banco. O PostgREST costuma cortar em 1000. */\nconst PAGE_SIZE = 1000\n\nexport type CatalogAge = 'missing' | 'fresh' | 'stale'\n\n/**\n * A regra pura: esta cópia serve? precisa revalidar?\n *\n * `missing` é o único caso em que a tela espera. `stale` serve e revalida —\n * nunca volta ao esqueleto.\n */\nexport function catalogAge(\n catalog: MenuCatalog | undefined | null,\n now: number,\n ttlMs: number = MENU_CATALOG_TTL,\n): CatalogAge {\n if (!catalog) return 'missing'\n // Relógio do terminal que anda para trás não pode transformar cópia boa em\n // velha para sempre: idade negativa conta como zero.\n const age = Math.max(0, now - catalog.fetchedAt)\n return age >= ttlMs ? 'stale' : 'fresh'\n}\n\n/** A conta e a unidade mandam: um cardápio por casa, e a unidade recorta. */\nexport function menuCatalogKey(tenantId?: string | null, unitId?: string | null): string {\n return `menu-catalog:${stableKey({ t: tenantId ?? '_', u: unitId ?? '_' })}`\n}\n\nexport function readCachedCatalog(key: string): MenuCatalog | undefined {\n return globalCache.get<MenuCatalog>(key)\n}\n\n/** Joga fora a cópia — o cadastro mexeu no cardápio, ou o operador pediu. */\nexport function invalidateMenuCatalog(key?: string): void {\n globalCache.invalidate(key ?? 'menu-catalog:')\n}\n\n/**\n * O cardápio INTEIRO, em páginas.\n *\n * `pageSize: 1000` cravado escondia 381 dos 1.381 itens do Pertinho: o\n * PostgREST devolve o `total` e ninguém o lia, então o terceiro terço do\n * cardápio simplesmente não existia no PDV. Aqui a primeira página diz quantas\n * faltam e as restantes vão juntas.\n */\nexport async function fetchMenuCatalog(\n provider: Pick<MenuDataProvider, 'getMenuItems' | 'getCategories'>,\n now: () => number = Date.now,\n): Promise<MenuCatalog> {\n const [categories, first] = await Promise.all([\n provider.getCategories(),\n // `projection: 'summary'` corta ~80% do payload: o PDV usa nome, preço,\n // código, foto e categoria, e não a ficha inteira do produto.\n provider.getMenuItems({ pageSize: PAGE_SIZE, page: 1, projection: 'summary' }),\n ])\n\n const items = [...first.data]\n const totalPages = Math.max(1, Math.ceil((first.total || items.length) / PAGE_SIZE))\n if (totalPages > 1) {\n const rest = await Promise.all(\n Array.from({ length: totalPages - 1 }, (_, i) =>\n provider.getMenuItems({ pageSize: PAGE_SIZE, page: i + 2, projection: 'summary' })),\n )\n for (const page of rest) items.push(...page.data)\n }\n\n return { items, categories, fetchedAt: now() }\n}\n\n/** Uma carga por chave de cada vez — dois consumidores não pagam duas idas. */\nconst inFlight = new Map<string, Promise<MenuCatalog>>()\n\nexport interface LoadMenuCatalogOptions {\n /** Ignora a cópia e vai ao banco — o gesto explícito de «atualizar». */\n force?: boolean\n /** Depois de quanto tempo a cópia é velha. */\n ttlMs?: number\n now?: () => number\n}\n\n/**\n * A porta única: devolve a cópia boa sem ir ao banco, ou vai buscar.\n *\n * Quem quer o comportamento «serve o velho e revalida por trás» lê\n * `readCachedCatalog` primeiro e chama isto sem esperar — é o que o hook do\n * PDV faz. Quem só precisa de um cardápio qualquer (o mapa produto→categoria\n * da isenção de taxa, por exemplo) chama direto e quase sempre acerta o cache.\n */\nexport function loadMenuCatalog(\n provider: Pick<MenuDataProvider, 'getMenuItems' | 'getCategories'>,\n key: string,\n options?: LoadMenuCatalogOptions,\n): Promise<MenuCatalog> {\n const now = options?.now ?? Date.now\n if (!options?.force) {\n const cached = readCachedCatalog(key)\n if (catalogAge(cached, now(), options?.ttlMs) === 'fresh') return Promise.resolve(cached!)\n }\n const running = inFlight.get(key)\n if (running) return running\n\n const task = fetchMenuCatalog(provider, now)\n .then((catalog) => {\n globalCache.set(key, catalog, STORE_TTL)\n return catalog\n })\n .finally(() => { inFlight.delete(key) })\n\n inFlight.set(key, task)\n return task\n}\n","// Central physical-table-name registry for plugin-menu.\nexport const T = {\n menus: 'plg_menu_menus',\n sections: 'plg_menu_sections',\n placements: 'plg_menu_placements',\n items: 'plg_menu_items',\n allergens: 'plg_menu_allergens',\n dietaryTags: 'plg_menu_dietary_tags',\n modifierGroups: 'plg_menu_modifier_groups',\n modifiers: 'plg_menu_modifiers',\n itemModifierGroups: 'plg_menu_item_modifier_groups',\n /** Spine tables this plugin reads/writes through. */\n products: 'products',\n categories: 'categories',\n /** Bucket for item, section and import photos. */\n mediaBucket: 'menu-images',\n} as const\n","import { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\n\nimport type { FullMenuDataProvider } from './types'\nimport { invalidateMenuCatalog } from './catalog-cache'\nimport { T } from './tables'\nimport type {\n Menu, MenuSection, MenuPlacement, MenuCategory, MenuItem, ModifierGroup,\n MenuChannel, MenuAvailability,\n CreateMenuInput, UpdateMenuInput, CreateSectionInput, UpdateSectionInput, PlaceItemInput,\n CreateMenuItemInput, UpdateMenuItemInput, CreateMenuCategoryInput,\n MenuItemQuery, PaginatedResult, MenuSummary, MenuItemStatus,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// The plugin's own backend.\n//\n// Items are products (the spine) — a dish that is also stock, also a POS line,\n// is ONE record. plg_menu_items carries only what is menu-specific about it,\n// and a product becomes a menu item the moment that row exists.\n// ---------------------------------------------------------------------------\n\nconst CATEGORY_KIND = 'menu_category'\n\nfunction rowToMenu(row: any, counts?: { sections: number; items: number }): Menu {\n return {\n id: row.id,\n name: row.name,\n description: row.description ?? undefined,\n isActive: row.is_active ?? true,\n sortOrder: row.sort_order ?? 0,\n channels: (row.channels ?? ['pos', 'delivery', 'digital']) as MenuChannel[],\n availability: (row.availability ?? {}) as MenuAvailability,\n sectionCount: counts?.sections,\n itemCount: counts?.items,\n tenantId: row.tenant_id,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToSection(row: any): MenuSection {\n return {\n id: row.id,\n menuId: row.menu_id,\n name: row.name,\n description: row.description ?? undefined,\n imageUrl: row.image_url ?? undefined,\n sortOrder: row.sort_order ?? 0,\n isActive: row.is_active ?? true,\n availability: (row.availability ?? {}) as MenuAvailability,\n tenantId: row.tenant_id,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToPlacement(row: any): MenuPlacement {\n return {\n id: row.id,\n sectionId: row.section_id,\n itemId: row.item_id,\n sortOrder: row.sort_order ?? 0,\n priceOverride: row.price_override ?? undefined,\n isActive: row.is_active ?? true,\n tenantId: row.tenant_id,\n }\n}\n\nfunction rowToCategory(row: any): MenuCategory {\n return {\n id: row.id,\n name: row.name,\n parentId: row.parent_id ?? undefined,\n icon: row.icon ?? undefined,\n color: row.color ?? undefined,\n sortOrder: row.sort_order ?? 0,\n isActive: row.is_active ?? true,\n tenantId: row.tenant_id,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\n/** products row + its plg_menu_items extension (embedded or fetched apart). */\nfunction rowToItem(row: any, currency: string): MenuItem {\n const ext = Array.isArray(row.plg_menu_items) ? row.plg_menu_items[0] : row.plg_menu_items\n const meta = row.metadata ?? {}\n return {\n id: row.id,\n name: row.name,\n description: row.description ?? undefined,\n price: Number(row.price ?? 0),\n cost: row.cost != null ? Number(row.cost) : undefined,\n currency,\n sku: row.sku ?? undefined,\n imageUrl: row.image_url ?? undefined,\n categoryId: row.category_id ?? undefined,\n // O nome da categoria vem JUNTO do item, pela relação, e não de uma\n // segunda leitura. `MenuItem.categoryName` existia no tipo e nunca era\n // preenchido: quem consumia caía num rótulo genérico e o segmentado do PDV\n // saía com quinze abas escritas \"Cardápio\". Campo vazio na tela é sintoma.\n categoryName: (Array.isArray(row.categories) ? row.categories[0] : row.categories)?.name ?? undefined,\n status: (ext?.status ?? 'available') as MenuItemStatus,\n isActive: row.is_active ?? true,\n prepTimeMinutes: ext?.prep_time_minutes ?? undefined,\n allergens: ext?.allergens ?? [],\n dietaryTags: ext?.dietary_tags ?? [],\n availableForPos: ext?.available_for_pos ?? true,\n availableForDelivery: ext?.available_for_delivery ?? true,\n deliveryPrice: ext?.delivery_price != null ? Number(ext.delivery_price) : undefined,\n sortOrder: ext?.sort_order ?? 0,\n isFeatured: ext?.is_featured ?? false,\n metadata: meta,\n tenantId: row.tenant_id,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nexport interface SupabaseMenuProviderOptions {\n /** Currency code stamped on items — display only. */\n currencyCode?: string\n}\n\nexport function createSupabaseMenuProvider(options?: SupabaseMenuProviderOptions): FullMenuDataProvider {\n const currency = options?.currencyCode ?? 'BRL'\n\n // Lazy: the client exists only after the app boots.\n function db() {\n const client = getSupabaseClientOptional() as any\n if (!client) throw new Error('Supabase not initialized')\n return client\n }\n function tenant(): string | undefined {\n return getActiveTenantId() ?? undefined\n }\n function fail(error: { message?: string } | null): void {\n if (error) throw new Error(error.message ?? 'Menu request failed')\n }\n async function nextOrder(table: string, column: string, value: string): Promise<number> {\n const { data } = await db().from(table).select('sort_order').eq(column, value)\n .order('sort_order', { ascending: false }).limit(1)\n return ((data?.[0]?.sort_order ?? 0) as number) + 1\n }\n\n const provider: FullMenuDataProvider = {\n // --- Menus -------------------------------------------------------------\n async getMenus(): Promise<Menu[]> {\n const { data, error } = await db().from(T.menus).select('*').order('sort_order', { ascending: true })\n fail(error)\n let menus = data ?? []\n // A workspace that never had a menu gets one rather than an empty screen\n // with nowhere to put the first dish.\n if (menus.length === 0) {\n const created = await provider.createMenu({ name: 'Cardápio principal' })\n menus = [{ ...created, is_active: true, sort_order: 0, tenant_id: created.tenantId,\n created_at: created.createdAt, updated_at: created.updatedAt, availability: {}, channels: created.channels }]\n }\n // Counts come from two flat reads and are folded here: PostgREST has no\n // group-by, and a menu never has enough rows for it to matter.\n const menuIds = menus.map((m: any) => m.id)\n const { data: sections } = await db().from(T.sections).select('id, menu_id').in('menu_id', menuIds)\n const sectionIds = (sections ?? []).map((s: any) => s.id)\n const { data: placements } = sectionIds.length\n ? await db().from(T.placements).select('section_id').in('section_id', sectionIds)\n : { data: [] as any[] }\n const sectionToMenu = new Map<string, string>((sections ?? []).map((s: any) => [s.id, s.menu_id]))\n return menus.map((row: any) => {\n const mySections = (sections ?? []).filter((s: any) => s.menu_id === row.id)\n const myItems = (placements ?? []).filter((p: any) => sectionToMenu.get(p.section_id) === row.id)\n return rowToMenu(row, { sections: mySections.length, items: myItems.length })\n })\n },\n\n async createMenu(input: CreateMenuInput): Promise<Menu> {\n const { data, error } = await db().from(T.menus).insert({\n tenant_id: tenant(),\n name: input.name,\n description: input.description ?? null,\n is_active: input.isActive ?? true,\n sort_order: input.sortOrder ?? (await nextOrder(T.menus, 'tenant_id', tenant() ?? '')),\n channels: input.channels ?? ['pos', 'delivery', 'digital'],\n availability: input.availability ?? {},\n }).select().single()\n fail(error)\n return rowToMenu(data)\n },\n\n async updateMenu(id: string, patch: UpdateMenuInput): Promise<Menu> {\n const row: Record<string, unknown> = { updated_at: new Date().toISOString() }\n if (patch.name !== undefined) row.name = patch.name\n if (patch.description !== undefined) row.description = patch.description\n if (patch.isActive !== undefined) row.is_active = patch.isActive\n if (patch.sortOrder !== undefined) row.sort_order = patch.sortOrder\n if (patch.channels !== undefined) row.channels = patch.channels\n if (patch.availability !== undefined) row.availability = patch.availability\n const { data, error } = await db().from(T.menus).update(row).eq('id', id).select().single()\n fail(error)\n return rowToMenu(data)\n },\n\n async deleteMenu(id: string): Promise<void> {\n // Sections and placements cascade; the products stay — deleting a menu\n // must never delete the restaurant's dishes.\n const { error } = await db().from(T.menus).delete().eq('id', id)\n fail(error)\n },\n\n async duplicateMenu(id: string, name: string): Promise<Menu> {\n const { data: source, error } = await db().from(T.menus).select('*').eq('id', id).single()\n fail(error)\n const copy = await provider.createMenu({\n name,\n description: source.description ?? undefined,\n channels: source.channels,\n availability: source.availability,\n isActive: false, // a copy starts off-air: it is edited before it is served\n })\n const sections = await provider.getSections(id)\n const placements = await provider.getPlacements(id)\n for (const section of sections) {\n const clone = await provider.createSection({\n menuId: copy.id,\n name: section.name,\n description: section.description,\n imageUrl: section.imageUrl,\n sortOrder: section.sortOrder,\n isActive: section.isActive,\n availability: section.availability,\n })\n const mine = placements.filter((p) => p.sectionId === section.id)\n for (const placement of mine) {\n await provider.placeItem({\n sectionId: clone.id,\n itemId: placement.itemId,\n sortOrder: placement.sortOrder,\n priceOverride: placement.priceOverride,\n isActive: placement.isActive,\n })\n }\n }\n return copy\n },\n\n async reorderMenus(ids: string[]): Promise<void> {\n await Promise.all(ids.map((id, index) =>\n db().from(T.menus).update({ sort_order: index }).eq('id', id)))\n },\n\n // --- Sections ----------------------------------------------------------\n async getSections(menuId: string): Promise<MenuSection[]> {\n const { data, error } = await db().from(T.sections).select('*')\n .eq('menu_id', menuId).order('sort_order', { ascending: true })\n fail(error)\n return (data ?? []).map(rowToSection)\n },\n\n async createSection(input: CreateSectionInput): Promise<MenuSection> {\n const { data, error } = await db().from(T.sections).insert({\n tenant_id: tenant(),\n menu_id: input.menuId,\n name: input.name,\n description: input.description ?? null,\n image_url: input.imageUrl ?? null,\n sort_order: input.sortOrder ?? (await nextOrder(T.sections, 'menu_id', input.menuId)),\n is_active: input.isActive ?? true,\n availability: input.availability ?? {},\n }).select().single()\n fail(error)\n return rowToSection(data)\n },\n\n async updateSection(id: string, patch: UpdateSectionInput): Promise<MenuSection> {\n const row: Record<string, unknown> = { updated_at: new Date().toISOString() }\n if (patch.name !== undefined) row.name = patch.name\n if (patch.description !== undefined) row.description = patch.description\n if (patch.imageUrl !== undefined) row.image_url = patch.imageUrl\n if (patch.sortOrder !== undefined) row.sort_order = patch.sortOrder\n if (patch.isActive !== undefined) row.is_active = patch.isActive\n if (patch.availability !== undefined) row.availability = patch.availability\n const { data, error } = await db().from(T.sections).update(row).eq('id', id).select().single()\n fail(error)\n return rowToSection(data)\n },\n\n async deleteSection(id: string): Promise<void> {\n const { error } = await db().from(T.sections).delete().eq('id', id)\n fail(error)\n },\n\n async reorderSections(_menuId: string, ids: string[]): Promise<void> {\n await Promise.all(ids.map((id, index) =>\n db().from(T.sections).update({ sort_order: index }).eq('id', id)))\n },\n\n // --- Placements --------------------------------------------------------\n async getPlacements(menuId: string): Promise<MenuPlacement[]> {\n const { data: sections } = await db().from(T.sections).select('id').eq('menu_id', menuId)\n const ids = (sections ?? []).map((s: any) => s.id)\n if (ids.length === 0) return []\n const { data, error } = await db().from(T.placements).select('*')\n .in('section_id', ids).order('sort_order', { ascending: true })\n fail(error)\n return (data ?? []).map(rowToPlacement)\n },\n\n async placeItem(input: PlaceItemInput): Promise<MenuPlacement> {\n const { data, error } = await db().from(T.placements).upsert({\n tenant_id: tenant(),\n section_id: input.sectionId,\n item_id: input.itemId,\n sort_order: input.sortOrder ?? (await nextOrder(T.placements, 'section_id', input.sectionId)),\n price_override: input.priceOverride ?? null,\n is_active: input.isActive ?? true,\n }, { onConflict: 'section_id,item_id' }).select().single()\n fail(error)\n return rowToPlacement(data)\n },\n\n async updatePlacement(id: string, patch: Partial<PlaceItemInput>): Promise<MenuPlacement> {\n const row: Record<string, unknown> = { updated_at: new Date().toISOString() }\n if (patch.sectionId !== undefined) row.section_id = patch.sectionId\n if (patch.sortOrder !== undefined) row.sort_order = patch.sortOrder\n if (patch.priceOverride !== undefined) row.price_override = patch.priceOverride\n if (patch.isActive !== undefined) row.is_active = patch.isActive\n const { data, error } = await db().from(T.placements).update(row).eq('id', id).select().single()\n fail(error)\n return rowToPlacement(data)\n },\n\n async removePlacement(id: string): Promise<void> {\n const { error } = await db().from(T.placements).delete().eq('id', id)\n fail(error)\n },\n\n async reorderPlacements(_sectionId: string, placementIds: string[]): Promise<void> {\n await Promise.all(placementIds.map((id, index) =>\n db().from(T.placements).update({ sort_order: index }).eq('id', id)))\n },\n\n async movePlacement(placementId: string, toSectionId: string, toIndex: number): Promise<void> {\n const { error } = await db().from(T.placements)\n .update({ section_id: toSectionId, sort_order: toIndex, updated_at: new Date().toISOString() })\n .eq('id', placementId)\n fail(error)\n },\n\n // --- Media -------------------------------------------------------------\n async uploadImage(file: File, kind: 'item' | 'section' | 'menu' | 'import'): Promise<string> {\n const tenantId = tenant()\n if (!tenantId) throw new Error('No active workspace for the upload')\n const ext = (file.name.split('.').pop() ?? 'jpg').toLowerCase().replace(/[^a-z0-9]/g, '') || 'jpg'\n const path = `${tenantId}/${kind}/${crypto.randomUUID()}.${ext}`\n const { error } = await db().storage.from(T.mediaBucket)\n .upload(path, file, { contentType: file.type, upsert: false })\n fail(error)\n const { data } = db().storage.from(T.mediaBucket).getPublicUrl(path)\n return data.publicUrl\n },\n\n // --- Categories (legacy flat grouping, still readable) -----------------\n async getCategories(): Promise<MenuCategory[]> {\n const { data, error } = await db().from(T.categories).select('*')\n .eq('kind', CATEGORY_KIND).order('sort_order', { ascending: true })\n fail(error)\n return (data ?? []).map(rowToCategory)\n },\n\n async getCategoryById(id: string): Promise<MenuCategory | null> {\n const { data } = await db().from(T.categories).select('*').eq('id', id).maybeSingle()\n return data ? rowToCategory(data) : null\n },\n\n async createCategory(input: CreateMenuCategoryInput): Promise<MenuCategory> {\n const { data, error } = await db().from(T.categories).insert({\n tenant_id: tenant(),\n kind: CATEGORY_KIND,\n name: input.name,\n parent_id: input.parentId ?? null,\n icon: input.icon ?? null,\n color: input.color ?? null,\n sort_order: input.sortOrder ?? 0,\n is_active: true,\n }).select().single()\n fail(error)\n return rowToCategory(data)\n },\n\n async updateCategory(id: string, patch: Partial<MenuCategory>): Promise<MenuCategory> {\n const row: Record<string, unknown> = {}\n if (patch.name !== undefined) row.name = patch.name\n if (patch.sortOrder !== undefined) row.sort_order = patch.sortOrder\n if (patch.isActive !== undefined) row.is_active = patch.isActive\n if (patch.icon !== undefined) row.icon = patch.icon\n if (patch.color !== undefined) row.color = patch.color\n const { data, error } = await db().from(T.categories).update(row).eq('id', id).select().single()\n fail(error)\n return rowToCategory(data)\n },\n\n async deleteCategory(id: string): Promise<void> {\n const { error } = await db().from(T.categories).delete().eq('id', id)\n fail(error)\n },\n\n async reorderCategories(ids: string[]): Promise<void> {\n await Promise.all(ids.map((id, index) =>\n db().from(T.categories).update({ sort_order: index }).eq('id', id)))\n },\n\n // --- Items -------------------------------------------------------------\n async getMenuItems(query: MenuItemQuery): Promise<PaginatedResult<MenuItem>> {\n // `!inner` is the definition of a menu item: a product with the menu\n // extension. Without it the list would show every ingredient in stock.\n // `categories(name)` é LEFT por definição (a relação é anulável): um\n // produto sem categoria continua na lista, como tem de continuar.\n // A projeção `summary` existe para a LISTA (o cardápio do PDV): as\n // colunas gordas do produto — `description`, `metadata`, `custom_fields`,\n // `tags` — não aparecem em cartão nenhum e respondem pela maior parte do\n // payload. Ver `MenuItemQuery.projection`.\n const columns = query.projection === 'summary'\n ? `id, tenant_id, name, price, sku, image_url, category_id, is_active, created_at, updated_at, ${T.items}!inner(status, available_for_pos, available_for_delivery, sort_order, is_featured), ${T.categories}(name)`\n : `*, ${T.items}!inner(*), ${T.categories}(name)`\n let qb = db().from(T.products).select(columns, { count: 'exact' })\n if (query.search) qb = qb.ilike('name', `%${query.search}%`)\n if (query.categoryId) qb = qb.eq('category_id', query.categoryId)\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n qb = qb.in(`${T.items}.status`, statuses)\n }\n if (query.availableForPos !== undefined) qb = qb.eq(`${T.items}.available_for_pos`, query.availableForPos)\n if (query.availableForDelivery !== undefined) qb = qb.eq(`${T.items}.available_for_delivery`, query.availableForDelivery)\n if (query.isFeatured !== undefined) qb = qb.eq(`${T.items}.is_featured`, query.isFeatured)\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 200\n qb = qb.range((page - 1) * pageSize, page * pageSize - 1).order('name', { ascending: true })\n const { data, count, error } = await qb\n fail(error)\n return { data: (data ?? []).map((row: any) => rowToItem(row, currency)), total: count ?? 0 }\n },\n\n async getMenuItemById(id: string): Promise<MenuItem | null> {\n const { data } = await db().from(T.products)\n .select(`*, ${T.items}(*), ${T.categories}(name)`).eq('id', id).maybeSingle()\n return data ? rowToItem(data, currency) : null\n },\n\n async createMenuItem(input: CreateMenuItemInput): Promise<MenuItem> {\n const tenantId = tenant()\n const { data: product, error } = await db().from(T.products).insert({\n tenant_id: tenantId,\n name: input.name,\n description: input.description ?? null,\n price: input.price ?? 0,\n cost: input.cost ?? 0,\n image_url: input.imageUrl ?? null,\n category_id: input.categoryId ?? null,\n is_active: true,\n metadata: { productType: 'sale' },\n }).select().single()\n fail(error)\n\n const { error: extError } = await db().from(T.items).insert({\n product_id: product.id,\n tenant_id: tenantId,\n status: input.status ?? 'available',\n available_for_pos: input.availableForPos ?? true,\n available_for_delivery: input.availableForDelivery ?? true,\n delivery_price: input.deliveryPrice ?? null,\n prep_time_minutes: input.prepTimeMinutes ?? null,\n allergens: input.allergens ?? [],\n dietary_tags: input.dietaryTags ?? [],\n is_featured: input.isFeatured ?? false,\n })\n if (extError) {\n // Roll the product back: a product with no menu row is invisible here\n // and would surface as a mystery line in stock.\n await db().from(T.products).delete().eq('id', product.id)\n throw new Error(extError.message)\n }\n\n if (input.sectionId) {\n await provider.placeItem({ sectionId: input.sectionId, itemId: product.id })\n }\n return (await provider.getMenuItemById(product.id))!\n },\n\n async updateMenuItem(id: string, patch: UpdateMenuItemInput): Promise<MenuItem> {\n const spine: Record<string, unknown> = {}\n if (patch.name !== undefined) spine.name = patch.name\n if (patch.description !== undefined) spine.description = patch.description\n if (patch.price !== undefined) spine.price = patch.price\n if (patch.cost !== undefined) spine.cost = patch.cost\n if (patch.imageUrl !== undefined) spine.image_url = patch.imageUrl\n if (patch.categoryId !== undefined) spine.category_id = patch.categoryId ?? null\n if (Object.keys(spine).length > 0) {\n const { error } = await db().from(T.products).update(spine).eq('id', id)\n fail(error)\n }\n\n const ext: Record<string, unknown> = {}\n if (patch.status !== undefined) ext.status = patch.status\n if (patch.availableForPos !== undefined) ext.available_for_pos = patch.availableForPos\n if (patch.availableForDelivery !== undefined) ext.available_for_delivery = patch.availableForDelivery\n if (patch.deliveryPrice !== undefined) ext.delivery_price = patch.deliveryPrice\n if (patch.prepTimeMinutes !== undefined) ext.prep_time_minutes = patch.prepTimeMinutes\n if (patch.allergens !== undefined) ext.allergens = patch.allergens\n if (patch.dietaryTags !== undefined) ext.dietary_tags = patch.dietaryTags\n if (patch.isFeatured !== undefined) ext.is_featured = patch.isFeatured\n if (Object.keys(ext).length > 0) {\n ext.updated_at = new Date().toISOString()\n // Upsert, not update: a product adopted from stock has no menu row yet.\n const { error } = await db().from(T.items)\n .upsert({ product_id: id, tenant_id: tenant(), ...ext }, { onConflict: 'product_id' })\n fail(error)\n }\n return (await provider.getMenuItemById(id))!\n },\n\n async deleteMenuItem(id: string): Promise<void> {\n // Only the menu row: the product may still be stock, a POS line, or sit\n // in a past order. Losing the dish everywhere is not what \"remove from\n // the menu\" means.\n const { error } = await db().from(T.items).delete().eq('product_id', id)\n fail(error)\n await db().from(T.placements).delete().eq('item_id', id)\n },\n\n async toggleAvailability(id, field, value): Promise<MenuItem> {\n const column = field === 'status' ? 'status'\n : field === 'availableForPos' ? 'available_for_pos'\n : field === 'isFeatured' ? 'is_featured'\n : 'available_for_delivery'\n const { error } = await db().from(T.items)\n .upsert({ product_id: id, tenant_id: tenant(), [column]: value, updated_at: new Date().toISOString() },\n { onConflict: 'product_id' })\n fail(error)\n return (await provider.getMenuItemById(id))!\n },\n\n async reorderItems(_categoryId: string, ids: string[]): Promise<void> {\n await Promise.all(ids.map((id, index) =>\n db().from(T.items).update({ sort_order: index }).eq('product_id', id)))\n },\n\n // --- Modifier groups ---------------------------------------------------\n async getModifierGroups(): Promise<ModifierGroup[]> {\n const { data, error } = await db().from(T.modifierGroups)\n .select(`*, ${T.modifiers}(*)`).order('sort_order', { ascending: true })\n fail(error)\n return (data ?? []).map((row: any) => ({\n id: row.id,\n name: row.name,\n minSelections: row.min_selections ?? 0,\n maxSelections: row.max_selections ?? 1,\n isRequired: row.is_required ?? false,\n sortOrder: row.sort_order ?? 0,\n items: (row[T.modifiers] ?? []).map((m: any) => ({\n id: m.id, groupId: m.group_id, name: m.name,\n priceAdjustment: Number(m.price_adjustment ?? 0),\n isActive: m.is_active ?? true, sortOrder: m.sort_order ?? 0,\n })),\n tenantId: row.tenant_id,\n createdAt: row.created_at,\n }))\n },\n\n async createModifierGroup(input: Partial<ModifierGroup>): Promise<ModifierGroup> {\n const { data, error } = await db().from(T.modifierGroups).insert({\n tenant_id: tenant(),\n name: input.name ?? 'Grupo',\n min_selections: input.minSelections ?? 0,\n max_selections: input.maxSelections ?? 1,\n is_required: input.isRequired ?? false,\n sort_order: input.sortOrder ?? 0,\n }).select().single()\n fail(error)\n return { ...(data as any), items: [], minSelections: data.min_selections, maxSelections: data.max_selections, isRequired: data.is_required, sortOrder: data.sort_order, tenantId: data.tenant_id, createdAt: data.created_at }\n },\n\n async updateModifierGroup(id: string, patch: Partial<ModifierGroup>): Promise<ModifierGroup> {\n const row: Record<string, unknown> = {}\n if (patch.name !== undefined) row.name = patch.name\n if (patch.minSelections !== undefined) row.min_selections = patch.minSelections\n if (patch.maxSelections !== undefined) row.max_selections = patch.maxSelections\n if (patch.isRequired !== undefined) row.is_required = patch.isRequired\n if (patch.sortOrder !== undefined) row.sort_order = patch.sortOrder\n const { error } = await db().from(T.modifierGroups).update(row).eq('id', id)\n fail(error)\n const groups = await provider.getModifierGroups()\n return groups.find((g) => g.id === id)!\n },\n\n async deleteModifierGroup(id: string): Promise<void> {\n const { error } = await db().from(T.modifierGroups).delete().eq('id', id)\n fail(error)\n },\n\n // --- Summary -----------------------------------------------------------\n async getSummary(): Promise<MenuSummary> {\n const [{ data: items }, { data: sections }] = await Promise.all([\n db().from(T.items).select('status, is_featured'),\n db().from(T.sections).select('id'),\n ])\n const { data: prices } = await db().from(T.products).select(`price, ${T.items}!inner(product_id)`)\n const rows = items ?? []\n const priceList: number[] = (prices ?? []).map((p: any) => Number(p.price ?? 0))\n return {\n totalItems: rows.length,\n availableItems: rows.filter((r: any) => r.status === 'available').length,\n soldOutItems: rows.filter((r: any) => r.status === 'sold_out').length,\n hiddenItems: rows.filter((r: any) => r.status === 'hidden').length,\n categoryCount: (sections ?? []).length,\n averagePrice: priceList.length ? priceList.reduce((a, b) => a + b, 0) / priceList.length : 0,\n featuredCount: rows.filter((r: any) => r.is_featured).length,\n }\n },\n }\n\n // QUEM ESCREVE NO CARDÁPIO DERRUBA A CÓPIA.\n //\n // O PDV serve o cardápio de uma cópia em memória com validade de minutos\n // (ver ./catalog-cache.ts). Editar um preço ou marcar «acabou» na retaguarda\n // e continuar vendo o antigo no PDV da MESMA aba seria a cópia mentindo para\n // quem acabou de mudá-la — e o marcar-como-acabado é justamente o gesto que\n // não pode esperar. Em OUTRO aparelho a mudança chega pela revalidação, que\n // é o contrato: escala de minutos, não de tempo real.\n for (const nome of MUTACOES_DE_CATALOGO) {\n const original = provider[nome] as ((...args: unknown[]) => Promise<unknown>) | undefined\n if (!original) continue\n ;(provider as unknown as Record<string, unknown>)[nome] = async (...args: unknown[]) => {\n const out = await original.apply(provider, args)\n invalidateMenuCatalog()\n return out\n }\n }\n\n return provider\n}\n\n/** As escritas que mudam o que o PDV mostra. Menu, seção e modificador não\n * entram: o catálogo do PDV é produto + categoria, e só. */\nconst MUTACOES_DE_CATALOGO = [\n 'createMenuItem', 'updateMenuItem', 'deleteMenuItem', 'toggleAvailability',\n 'createCategory', 'updateCategory', 'deleteCategory',\n] as const satisfies ReadonlyArray<keyof FullMenuDataProvider>\n","// AUTO-GENERATED from 000_baseline.sql, 002_o_produto_tem_complementos.sql — regenerate with scripts/embed-migrations.mjs\n// SQL files are the source of truth; this inline copy lets the manifest declare\n// migrations as data. Do not edit by hand — run the embed script instead.\n\nexport const MIGRATION_000_BASELINE = `-- ============================================================================\n-- plugins/plugin-menu/src/migrations/000_baseline.sql — what installing this provisions, as one file.\n--\n-- GENERATED by scripts/emit-unit-baselines.mjs (#338). Do not edit by hand:\n-- change the schema, regenerate, and let scripts/check-chain-equivalence.mjs\n-- prove the result still matches.\n--\n-- This replaced 4 migration files. They are kept, unapplied, in\n-- migrations.archive/ — a year of decisions is worth reading even when it is no\n-- longer worth replaying.\n--\n-- Object order is fixed rather than dependency-sorted: schemas, types,\n-- sequences, tables, defaults, functions, constraints, views, indexes, foreign\n-- keys, triggers, row security, policies, grants. Dependencies BETWEEN units\n-- are carried by the order packages/db/chain.json declares.\n-- ============================================================================\n\n-- A LANGUAGE sql function binds its body at CREATE time, and 570 functions\n-- sorted by name are not sorted by who calls whom. This is what lets them load\n-- in any order; every body is still compiled on first call, so a genuinely\n-- broken reference surfaces then rather than never. Session-scoped.\nSET check_function_bodies = false;\n\n\n\n-- ── default privileges: reset ───────────────────────────────────────────\n-- Cleared BEFORE anything is created, so every object below gets the ACL the\n-- dump describes rather than the image's defaults on top of it. Restored at\n-- the end of this file.\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\n\n-- ── table ───────────────────────────────────────────────────────────────\n\nCREATE TABLE public.plg_menu_allergens (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n name text NOT NULL,\n icon text,\n is_active boolean DEFAULT true NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL\n);\n\nCREATE TABLE public.plg_menu_dietary_tags (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n name text NOT NULL,\n color text,\n is_active boolean DEFAULT true NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL\n);\n\nCREATE TABLE public.plg_menu_item_modifier_groups (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n product_id uuid NOT NULL,\n group_id uuid NOT NULL,\n sort_order integer DEFAULT 0 NOT NULL\n);\n\nCREATE TABLE public.plg_menu_items (\n product_id uuid NOT NULL,\n tenant_id uuid NOT NULL,\n status text DEFAULT 'available'::text NOT NULL,\n available_for_pos boolean DEFAULT true NOT NULL,\n available_for_delivery boolean DEFAULT true NOT NULL,\n delivery_price numeric(14,2),\n prep_time_minutes integer,\n allergens text[] DEFAULT ARRAY[]::text[] NOT NULL,\n dietary_tags text[] DEFAULT ARRAY[]::text[] NOT NULL,\n is_featured boolean DEFAULT false NOT NULL,\n sort_order integer DEFAULT 0 NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL\n);\n\nCREATE TABLE public.plg_menu_menus (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n name text NOT NULL,\n description text,\n is_active boolean DEFAULT true NOT NULL,\n sort_order integer DEFAULT 0 NOT NULL,\n channels text[] DEFAULT ARRAY['pos'::text, 'delivery'::text, 'digital'::text] NOT NULL,\n availability jsonb DEFAULT '{}'::jsonb NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL\n);\n\nCREATE TABLE public.plg_menu_modifier_groups (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n name text NOT NULL,\n min_selections integer DEFAULT 0 NOT NULL,\n max_selections integer DEFAULT 1 NOT NULL,\n is_required boolean DEFAULT false NOT NULL,\n sort_order integer DEFAULT 0 NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL\n);\n\nCREATE TABLE public.plg_menu_modifiers (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n group_id uuid NOT NULL,\n name text NOT NULL,\n price_adjustment numeric(14,2) DEFAULT 0 NOT NULL,\n is_active boolean DEFAULT true NOT NULL,\n sort_order integer DEFAULT 0 NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL\n);\n\nCREATE TABLE public.plg_menu_placements (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n section_id uuid NOT NULL,\n item_id uuid NOT NULL,\n sort_order integer DEFAULT 0 NOT NULL,\n price_override numeric(14,2),\n is_active boolean DEFAULT true NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL\n);\n\nCREATE TABLE public.plg_menu_sections (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n menu_id uuid NOT NULL,\n name text NOT NULL,\n description text,\n image_url text,\n sort_order integer DEFAULT 0 NOT NULL,\n is_active boolean DEFAULT true NOT NULL,\n availability jsonb DEFAULT '{}'::jsonb NOT NULL,\n legacy_category_id uuid,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL\n);\n\n\n-- ── constraint ──────────────────────────────────────────────────────────\n\nALTER TABLE ONLY public.plg_menu_allergens\n ADD CONSTRAINT plg_menu_allergens_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_menu_dietary_tags\n ADD CONSTRAINT plg_menu_dietary_tags_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_menu_item_modifier_groups\n ADD CONSTRAINT plg_menu_item_modifier_groups_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_menu_items\n ADD CONSTRAINT plg_menu_items_pkey PRIMARY KEY (product_id);\n\nALTER TABLE ONLY public.plg_menu_menus\n ADD CONSTRAINT plg_menu_menus_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_menu_modifier_groups\n ADD CONSTRAINT plg_menu_modifier_groups_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_menu_modifiers\n ADD CONSTRAINT plg_menu_modifiers_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_menu_placements\n ADD CONSTRAINT plg_menu_placements_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_menu_sections\n ADD CONSTRAINT plg_menu_sections_pkey PRIMARY KEY (id);\n\n\n-- ── index ───────────────────────────────────────────────────────────────\n\nCREATE INDEX idx_plg_menu_allergens_tenant ON public.plg_menu_allergens USING btree (tenant_id);\n\nCREATE INDEX idx_plg_menu_dietary_tags_tenant ON public.plg_menu_dietary_tags USING btree (tenant_id);\n\nCREATE INDEX idx_plg_menu_items_tenant ON public.plg_menu_items USING btree (tenant_id);\n\nCREATE INDEX idx_plg_menu_menus_tenant ON public.plg_menu_menus USING btree (tenant_id, sort_order);\n\nCREATE INDEX idx_plg_menu_modifier_groups_tenant ON public.plg_menu_modifier_groups USING btree (tenant_id);\n\nCREATE INDEX idx_plg_menu_modifiers_group ON public.plg_menu_modifiers USING btree (group_id, sort_order);\n\nCREATE INDEX idx_plg_menu_placements_item ON public.plg_menu_placements USING btree (item_id);\n\nCREATE INDEX idx_plg_menu_placements_section ON public.plg_menu_placements USING btree (section_id, sort_order);\n\nCREATE INDEX idx_plg_menu_sections_menu ON public.plg_menu_sections USING btree (menu_id, sort_order);\n\nCREATE INDEX idx_plg_menu_sections_tenant ON public.plg_menu_sections USING btree (tenant_id);\n\nCREATE UNIQUE INDEX uq_plg_menu_item_modifier_groups ON public.plg_menu_item_modifier_groups USING btree (product_id, group_id);\n\nCREATE UNIQUE INDEX uq_plg_menu_placements_seat ON public.plg_menu_placements USING btree (section_id, item_id);\n\nCREATE UNIQUE INDEX uq_plg_menu_sections_legacy ON public.plg_menu_sections USING btree (menu_id, legacy_category_id) WHERE (legacy_category_id IS NOT NULL);\n\n\n-- ── fk constraint ───────────────────────────────────────────────────────\n\nALTER TABLE ONLY public.plg_menu_allergens\n ADD CONSTRAINT plg_menu_allergens_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_dietary_tags\n ADD CONSTRAINT plg_menu_dietary_tags_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_item_modifier_groups\n ADD CONSTRAINT plg_menu_item_modifier_groups_group_id_fkey FOREIGN KEY (group_id) REFERENCES public.plg_menu_modifier_groups(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_item_modifier_groups\n ADD CONSTRAINT plg_menu_item_modifier_groups_product_id_fkey FOREIGN KEY (product_id) REFERENCES public.products(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_item_modifier_groups\n ADD CONSTRAINT plg_menu_item_modifier_groups_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_items\n ADD CONSTRAINT plg_menu_items_product_id_fkey FOREIGN KEY (product_id) REFERENCES public.products(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_items\n ADD CONSTRAINT plg_menu_items_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_menus\n ADD CONSTRAINT plg_menu_menus_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_modifier_groups\n ADD CONSTRAINT plg_menu_modifier_groups_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_modifiers\n ADD CONSTRAINT plg_menu_modifiers_group_id_fkey FOREIGN KEY (group_id) REFERENCES public.plg_menu_modifier_groups(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_modifiers\n ADD CONSTRAINT plg_menu_modifiers_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_placements\n ADD CONSTRAINT plg_menu_placements_item_id_fkey FOREIGN KEY (item_id) REFERENCES public.products(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_placements\n ADD CONSTRAINT plg_menu_placements_section_id_fkey FOREIGN KEY (section_id) REFERENCES public.plg_menu_sections(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_placements\n ADD CONSTRAINT plg_menu_placements_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_sections\n ADD CONSTRAINT plg_menu_sections_menu_id_fkey FOREIGN KEY (menu_id) REFERENCES public.plg_menu_menus(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_sections\n ADD CONSTRAINT plg_menu_sections_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\n\n-- ── row security ────────────────────────────────────────────────────────\n\nALTER TABLE public.plg_menu_allergens ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_menu_dietary_tags ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_menu_item_modifier_groups ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_menu_items ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_menu_menus ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_menu_modifier_groups ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_menu_modifiers ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_menu_placements ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_menu_sections ENABLE ROW LEVEL SECURITY;\n\n\n-- ── policy ──────────────────────────────────────────────────────────────\n\nCREATE POLICY plg_menu_allergens_delete ON public.plg_menu_allergens FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_allergens_insert ON public.plg_menu_allergens FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_allergens_select ON public.plg_menu_allergens FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_allergens_update ON public.plg_menu_allergens FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_dietary_tags_delete ON public.plg_menu_dietary_tags FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_dietary_tags_insert ON public.plg_menu_dietary_tags FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_dietary_tags_select ON public.plg_menu_dietary_tags FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_dietary_tags_update ON public.plg_menu_dietary_tags FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_item_modifier_groups_delete ON public.plg_menu_item_modifier_groups FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_item_modifier_groups_insert ON public.plg_menu_item_modifier_groups FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_item_modifier_groups_select ON public.plg_menu_item_modifier_groups FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_item_modifier_groups_update ON public.plg_menu_item_modifier_groups FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_items_delete ON public.plg_menu_items FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_items_insert ON public.plg_menu_items FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_items_select ON public.plg_menu_items FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_items_update ON public.plg_menu_items FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_menus_delete ON public.plg_menu_menus FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_menus_insert ON public.plg_menu_menus FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_menus_select ON public.plg_menu_menus FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_menus_update ON public.plg_menu_menus FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_modifier_groups_delete ON public.plg_menu_modifier_groups FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_modifier_groups_insert ON public.plg_menu_modifier_groups FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_modifier_groups_select ON public.plg_menu_modifier_groups FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_modifier_groups_update ON public.plg_menu_modifier_groups FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_modifiers_delete ON public.plg_menu_modifiers FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_modifiers_insert ON public.plg_menu_modifiers FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_modifiers_select ON public.plg_menu_modifiers FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_modifiers_update ON public.plg_menu_modifiers FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_placements_delete ON public.plg_menu_placements FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_placements_insert ON public.plg_menu_placements FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_placements_select ON public.plg_menu_placements FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_placements_update ON public.plg_menu_placements FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_sections_delete ON public.plg_menu_sections FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_sections_insert ON public.plg_menu_sections FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_sections_select ON public.plg_menu_sections FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_sections_update ON public.plg_menu_sections FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\n\n-- ── acl ─────────────────────────────────────────────────────────────────\n\nGRANT MAINTAIN ON TABLE public.plg_menu_allergens TO anon;\nGRANT ALL ON TABLE public.plg_menu_allergens TO authenticated;\nGRANT ALL ON TABLE public.plg_menu_allergens TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_menu_dietary_tags TO anon;\nGRANT ALL ON TABLE public.plg_menu_dietary_tags TO authenticated;\nGRANT ALL ON TABLE public.plg_menu_dietary_tags TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_menu_item_modifier_groups TO anon;\nGRANT ALL ON TABLE public.plg_menu_item_modifier_groups TO authenticated;\nGRANT ALL ON TABLE public.plg_menu_item_modifier_groups TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_menu_items TO anon;\nGRANT ALL ON TABLE public.plg_menu_items TO authenticated;\nGRANT ALL ON TABLE public.plg_menu_items TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_menu_menus TO anon;\nGRANT ALL ON TABLE public.plg_menu_menus TO authenticated;\nGRANT ALL ON TABLE public.plg_menu_menus TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_menu_modifier_groups TO anon;\nGRANT ALL ON TABLE public.plg_menu_modifier_groups TO authenticated;\nGRANT ALL ON TABLE public.plg_menu_modifier_groups TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_menu_modifiers TO anon;\nGRANT ALL ON TABLE public.plg_menu_modifiers TO authenticated;\nGRANT ALL ON TABLE public.plg_menu_modifiers TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_menu_placements TO anon;\nGRANT ALL ON TABLE public.plg_menu_placements TO authenticated;\nGRANT ALL ON TABLE public.plg_menu_placements TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_menu_sections TO anon;\nGRANT ALL ON TABLE public.plg_menu_sections TO authenticated;\nGRANT ALL ON TABLE public.plg_menu_sections TO service_role;\n\n\n-- ── default privileges: restore ─────────────────────────────────────────\n-- Put back, so the NEXT thing installed inherits what the chain had.\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT MAINTAIN ON TABLES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT MAINTAIN ON TABLES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$--\n-- PostgreSQL database dump complete\n--$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$--\n-- PostgreSQL database dump complete\n--$stmt$;\nEND $dp$;\n`\n\nexport const MIGRATION_002_O_PRODUTO_TEM_COMPLEMENTOS = `-- ---------------------------------------------------------------------------\n-- 001 — a product has its own choice groups (V1 «Complementos»).\n--\n-- The modifier tables already hold name, min, max, required and each option's\n-- price. Two things were missing for the product tab:\n-- * a group can be switched off without being deleted (V1 «Ativo»);\n-- * one write that replaces a product's groups and options together. V1\n-- wrote them one row at a time and a failure halfway left half a set.\n--\n-- Idempotent.\n-- ---------------------------------------------------------------------------\n\nALTER TABLE public.plg_menu_modifier_groups\n ADD COLUMN IF NOT EXISTS is_active boolean NOT NULL DEFAULT true;\n\nCOMMENT ON COLUMN public.plg_menu_modifier_groups.is_active IS\n 'Off = the group stays configured but is not offered. V1: product_option_groups.active.';\n\n-- SECURITY INVOKER: the same tenant policies the tables already enforce.\nCREATE OR REPLACE FUNCTION public.menu_save_product_option_groups(p_product uuid, p_groups jsonb)\nRETURNS void\nLANGUAGE plpgsql\nSECURITY INVOKER\nSET search_path = ''\nAS $$\nDECLARE\n v_tenant uuid;\n v_group jsonb;\n v_item jsonb;\n v_group_id uuid;\n v_kept_groups uuid[] := '{}';\n v_kept_items uuid[];\n v_item_id uuid;\n v_removed uuid[];\nBEGIN\n SELECT p.tenant_id INTO v_tenant FROM public.products p WHERE p.id = p_product;\n IF v_tenant IS NULL THEN\n RAISE EXCEPTION 'product not found' USING ERRCODE = '42501';\n END IF;\n\n FOR v_group IN SELECT * FROM jsonb_array_elements(coalesce(p_groups, '[]'::jsonb)) LOOP\n v_group_id := nullif(v_group->>'id', '')::uuid;\n IF v_group_id IS NOT NULL AND NOT EXISTS (\n SELECT 1 FROM public.plg_menu_item_modifier_groups l\n WHERE l.product_id = p_product AND l.group_id = v_group_id\n ) THEN\n -- An id that is not this product's group is treated as new, never as a\n -- licence to edit someone else's group.\n v_group_id := NULL;\n END IF;\n\n IF v_group_id IS NULL THEN\n INSERT INTO public.plg_menu_modifier_groups\n (tenant_id, name, min_selections, max_selections, is_required, is_active, sort_order)\n VALUES\n (v_tenant, v_group->>'name', (v_group->>'minSelections')::int, (v_group->>'maxSelections')::int,\n coalesce((v_group->>'isRequired')::boolean, false), coalesce((v_group->>'isActive')::boolean, true),\n coalesce((v_group->>'sortOrder')::int, 0))\n RETURNING id INTO v_group_id;\n ELSE\n UPDATE public.plg_menu_modifier_groups SET\n name = v_group->>'name',\n min_selections = (v_group->>'minSelections')::int,\n max_selections = (v_group->>'maxSelections')::int,\n is_required = coalesce((v_group->>'isRequired')::boolean, false),\n is_active = coalesce((v_group->>'isActive')::boolean, true),\n sort_order = coalesce((v_group->>'sortOrder')::int, 0)\n WHERE id = v_group_id;\n END IF;\n\n INSERT INTO public.plg_menu_item_modifier_groups (tenant_id, product_id, group_id, sort_order)\n VALUES (v_tenant, p_product, v_group_id, coalesce((v_group->>'sortOrder')::int, 0))\n ON CONFLICT (product_id, group_id) DO UPDATE SET sort_order = EXCLUDED.sort_order;\n\n v_kept_groups := v_kept_groups || v_group_id;\n v_kept_items := '{}';\n\n FOR v_item IN SELECT * FROM jsonb_array_elements(coalesce(v_group->'items', '[]'::jsonb)) LOOP\n v_item_id := nullif(v_item->>'id', '')::uuid;\n IF v_item_id IS NOT NULL AND NOT EXISTS (\n SELECT 1 FROM public.plg_menu_modifiers m WHERE m.id = v_item_id AND m.group_id = v_group_id\n ) THEN\n v_item_id := NULL;\n END IF;\n IF v_item_id IS NULL THEN\n INSERT INTO public.plg_menu_modifiers (tenant_id, group_id, name, price_adjustment, is_active, sort_order)\n VALUES (v_tenant, v_group_id, v_item->>'name', coalesce((v_item->>'priceAdjustment')::numeric, 0),\n coalesce((v_item->>'isActive')::boolean, true), coalesce((v_item->>'sortOrder')::int, 0))\n RETURNING id INTO v_item_id;\n ELSE\n UPDATE public.plg_menu_modifiers SET\n name = v_item->>'name',\n price_adjustment = coalesce((v_item->>'priceAdjustment')::numeric, 0),\n is_active = coalesce((v_item->>'isActive')::boolean, true),\n sort_order = coalesce((v_item->>'sortOrder')::int, 0)\n WHERE id = v_item_id;\n END IF;\n v_kept_items := v_kept_items || v_item_id;\n END LOOP;\n\n DELETE FROM public.plg_menu_modifiers m\n WHERE m.group_id = v_group_id AND NOT (m.id = ANY (v_kept_items));\n END LOOP;\n\n -- Groups removed from this product: unlink, and drop the group only when no\n -- other product still uses it.\n SELECT coalesce(array_agg(l.group_id), '{}') INTO v_removed\n FROM public.plg_menu_item_modifier_groups l\n WHERE l.product_id = p_product AND NOT (l.group_id = ANY (v_kept_groups));\n DELETE FROM public.plg_menu_item_modifier_groups l\n WHERE l.product_id = p_product AND l.group_id = ANY (v_removed);\n DELETE FROM public.plg_menu_modifier_groups g\n WHERE g.id = ANY (v_removed)\n AND NOT EXISTS (SELECT 1 FROM public.plg_menu_item_modifier_groups l WHERE l.group_id = g.id);\nEND;\n$$;\n\nREVOKE ALL ON FUNCTION public.menu_save_product_option_groups(uuid, jsonb) FROM PUBLIC, anon;\nGRANT EXECUTE ON FUNCTION public.menu_save_product_option_groups(uuid, jsonb) TO authenticated;\n`\n\nexport const MIGRATIONS: Array<{ id: string; sql: string }> = [\n { id: \"000_baseline\", sql: MIGRATION_000_BASELINE },\n { id: \"002_o_produto_tem_complementos\", sql: MIGRATION_002_O_PRODUTO_TEM_COMPLEMENTOS },\n]\n","import type {\n Menu, MenuSection, MenuPlacement,\n MenuCategory, MenuItem, ModifierGroup,\n CreateMenuInput, UpdateMenuInput,\n CreateSectionInput, UpdateSectionInput, PlaceItemInput,\n CreateMenuItemInput, UpdateMenuItemInput, CreateMenuCategoryInput,\n MenuItemQuery, PaginatedResult, MenuSummary,\n} from '../types'\n\n/**\n * What a host must implement to back the menu screen.\n *\n * The MENU half (menus / sections / placements) is optional on purpose. A host\n * that predates it — an app-local provider written while this plugin was\n * incubating — keeps working: `wrapLegacyProvider` presents its flat categories\n * as one menu, so the UI has a single shape to render and the app is not forced\n * to migrate on the same day the plugin ships.\n */\nexport interface MenuDataProvider {\n // --- Menus (optional capability) ---\n getMenus?(): Promise<Menu[]>\n createMenu?(input: CreateMenuInput): Promise<Menu>\n updateMenu?(id: string, data: UpdateMenuInput): Promise<Menu>\n deleteMenu?(id: string): Promise<void>\n /** Copy a menu with its sections and placements — how a weekend menu is born. */\n duplicateMenu?(id: string, name: string): Promise<Menu>\n reorderMenus?(ids: string[]): Promise<void>\n\n // --- Sections (optional capability) ---\n getSections?(menuId: string): Promise<MenuSection[]>\n createSection?(input: CreateSectionInput): Promise<MenuSection>\n updateSection?(id: string, data: UpdateSectionInput): Promise<MenuSection>\n deleteSection?(id: string): Promise<void>\n reorderSections?(menuId: string, ids: string[]): Promise<void>\n\n // --- Placements (optional capability) ---\n getPlacements?(menuId: string): Promise<MenuPlacement[]>\n placeItem?(input: PlaceItemInput): Promise<MenuPlacement>\n updatePlacement?(id: string, data: Partial<PlaceItemInput>): Promise<MenuPlacement>\n removePlacement?(id: string): Promise<void>\n /** Ids in their new order, within one section. */\n reorderPlacements?(sectionId: string, placementIds: string[]): Promise<void>\n /** Cross-section drag: same item, another section, at `toIndex`. */\n movePlacement?(placementId: string, toSectionId: string, toIndex: number): Promise<void>\n\n // --- Media (optional capability) ---\n uploadImage?(file: File, kind: 'item' | 'section' | 'menu' | 'import'): Promise<string>\n\n // --- Categories (legacy flat grouping) ---\n getCategories(): Promise<MenuCategory[]>\n getCategoryById(id: string): Promise<MenuCategory | null>\n createCategory(input: CreateMenuCategoryInput): Promise<MenuCategory>\n updateCategory(id: string, data: Partial<MenuCategory>): Promise<MenuCategory>\n deleteCategory(id: string): Promise<void>\n reorderCategories(ids: string[]): Promise<void>\n\n // --- Menu Items ---\n getMenuItems(query: MenuItemQuery): Promise<PaginatedResult<MenuItem>>\n getMenuItemById(id: string): Promise<MenuItem | null>\n createMenuItem(input: CreateMenuItemInput): Promise<MenuItem>\n updateMenuItem(id: string, data: UpdateMenuItemInput): Promise<MenuItem>\n deleteMenuItem(id: string): Promise<void>\n toggleAvailability(id: string, field: 'status' | 'availableForPos' | 'availableForDelivery' | 'isFeatured', value: any): Promise<MenuItem>\n reorderItems(categoryId: string, ids: string[]): Promise<void>\n\n // --- Modifier Groups ---\n getModifierGroups(): Promise<ModifierGroup[]>\n createModifierGroup(input: Partial<ModifierGroup>): Promise<ModifierGroup>\n updateModifierGroup(id: string, data: Partial<ModifierGroup>): Promise<ModifierGroup>\n deleteModifierGroup(id: string): Promise<void>\n\n // --- Summary ---\n getSummary(): Promise<MenuSummary>\n}\n\n/** A provider with the menu half guaranteed — what the store and UI talk to. */\nexport type FullMenuDataProvider = MenuDataProvider &\n Required<Pick<MenuDataProvider,\n | 'getMenus' | 'createMenu' | 'updateMenu' | 'deleteMenu' | 'duplicateMenu' | 'reorderMenus'\n | 'getSections' | 'createSection' | 'updateSection' | 'deleteSection' | 'reorderSections'\n | 'getPlacements' | 'placeItem' | 'updatePlacement' | 'removePlacement'\n | 'reorderPlacements' | 'movePlacement'\n >>\n\n/** Does this host know about menus, or only about a flat list of categories? */\nexport function supportsMenus(provider: MenuDataProvider): boolean {\n return typeof provider.getMenus === 'function' && typeof provider.createSection === 'function'\n}\n","import type { MenuDataProvider, FullMenuDataProvider } from './types'\nimport type { Menu, MenuSection, MenuPlacement, MenuItem } from '../types'\n\n// ---------------------------------------------------------------------------\n// One shape for the UI.\n//\n// Hosts written before menus existed know only a flat list of categories with\n// items in them. That IS a menu — the single one the place happens to serve —\n// so it is presented as one, and every section write lands on the category it\n// came from. The screen then has a single code path, and an app upgrades its\n// provider when it wants multiple menus, not because the screen broke.\n// ---------------------------------------------------------------------------\n\nexport const LEGACY_MENU_ID = '__default__'\n\n/** Synthetic placement id: a legacy item's seat IS its category field. */\nconst placementId = (itemId: string) => `legacy:${itemId}`\nconst itemIdOf = (placement: string) => placement.replace(/^legacy:/, '')\n\n/**\n * Where an item with no category sits.\n *\n * A legacy item's seat IS its category, so an item without one had no seat and\n * `getPlacements` dropped it — it was fetched, counted in `itemCount`, and then\n * filtered out before any section could render it. Creating an item without\n * choosing a section made it invisible, permanently and with no error.\n *\n * This section is synthetic: it is not a category, nothing writes to it, and it\n * appears only while something is unfiled. Dragging an item out of it calls\n * placeItem, which sets a real category — so the bucket empties itself and then\n * disappears.\n */\nexport const UNFILED_SECTION_ID = '__unfiled__'\n\nfunction unsupported(what: string): never {\n throw new Error(`[menu] This workspace's menu backend does not support ${what} yet.`)\n}\n\nexport function wrapLegacyProvider(provider: MenuDataProvider): FullMenuDataProvider {\n // Items are read once per placement query and reused: the legacy provider has\n // no placement table to ask, so the item list is the placement list.\n async function allItems(): Promise<MenuItem[]> {\n const result = await provider.getMenuItems({ pageSize: 1000 })\n return result.data\n }\n\n const legacyMenu = async (): Promise<Menu> => {\n const [categories, items] = await Promise.all([provider.getCategories(), allItems()])\n const first = items[0]\n return {\n id: LEGACY_MENU_ID,\n name: 'Cardápio principal',\n isActive: true,\n sortOrder: 0,\n channels: ['pos', 'delivery', 'digital'],\n availability: {},\n sectionCount: categories.length,\n itemCount: items.length,\n tenantId: first?.tenantId ?? '',\n createdAt: first?.createdAt ?? new Date(0).toISOString(),\n updatedAt: first?.updatedAt ?? new Date(0).toISOString(),\n }\n }\n\n // A Proxy rather than a spread: a host provider can itself be a Proxy\n // (createSafeDataProvider returns one), and spreading that yields an object\n // with no methods at all.\n const overrides: Partial<FullMenuDataProvider> = {\n\n async getMenus() {\n return [await legacyMenu()]\n },\n async createMenu() { unsupported('multiple menus') },\n async updateMenu() { unsupported('multiple menus') },\n async deleteMenu() { unsupported('multiple menus') },\n async duplicateMenu() { unsupported('multiple menus') },\n async reorderMenus() { /* one menu — nothing to order */ },\n\n async getSections(): Promise<MenuSection[]> {\n const [categories, items] = await Promise.all([provider.getCategories(), allItems()])\n const sections: MenuSection[] = categories.map((c) => ({\n id: c.id,\n menuId: LEGACY_MENU_ID,\n name: c.name,\n sortOrder: c.sortOrder,\n isActive: c.isActive,\n tenantId: c.tenantId,\n createdAt: c.createdAt,\n updatedAt: c.updatedAt,\n }))\n\n // Last, and only while it has something in it: an item nobody filed is\n // still an item, and a screen that silently omits it is worse than one\n // that shows it needs a home.\n const unfiled = items.filter((i) => !i.categoryId)\n if (unfiled.length > 0) {\n sections.push({\n id: UNFILED_SECTION_ID,\n menuId: LEGACY_MENU_ID,\n name: 'Sem seção',\n sortOrder: Number.MAX_SAFE_INTEGER,\n isActive: true,\n tenantId: unfiled[0]!.tenantId,\n createdAt: unfiled[0]!.createdAt,\n updatedAt: unfiled[0]!.updatedAt,\n })\n }\n return sections\n },\n async createSection(input) {\n const category = await provider.createCategory({ name: input.name, sortOrder: input.sortOrder })\n return {\n id: category.id,\n menuId: LEGACY_MENU_ID,\n name: category.name,\n sortOrder: category.sortOrder,\n isActive: category.isActive,\n tenantId: category.tenantId,\n createdAt: category.createdAt,\n updatedAt: category.updatedAt,\n }\n },\n async updateSection(id, data) {\n const category = await provider.updateCategory(id, {\n name: data.name,\n sortOrder: data.sortOrder,\n isActive: data.isActive,\n })\n return {\n id: category.id,\n menuId: LEGACY_MENU_ID,\n name: category.name,\n sortOrder: category.sortOrder,\n isActive: category.isActive,\n tenantId: category.tenantId,\n createdAt: category.createdAt,\n updatedAt: category.updatedAt,\n }\n },\n async deleteSection(id) {\n await provider.deleteCategory(id)\n },\n async reorderSections(_menuId, ids) {\n await provider.reorderCategories(ids)\n },\n\n async getPlacements(): Promise<MenuPlacement[]> {\n const items = await allItems()\n // Every item gets a seat. It used to be `.filter(item => !!item.categoryId)`,\n // which dropped the uncategorised ones on the floor — see UNFILED_SECTION_ID.\n return items.map((item) => ({\n id: placementId(item.id),\n sectionId: item.categoryId ?? UNFILED_SECTION_ID,\n itemId: item.id,\n sortOrder: item.sortOrder ?? 0,\n isActive: item.status !== 'hidden',\n tenantId: item.tenantId,\n }))\n },\n /**\n * The section the user clicked, honoured.\n *\n * The store calls `createMenuItem({ ...input, sectionId })` — the section is\n * already carried from the \"Adicionar item\" button. A legacy provider reads\n * `categoryId` and knows nothing about sections, so it dropped it and the\n * new dish landed unfiled: created correctly, then invisible, because a\n * legacy item's seat IS its category.\n *\n * Translating one into the other is this adapter's whole job. No section\n * clicked (the item rail, an import) still means no category, and the\n * unfiled bucket is what shows it.\n */\n async createMenuItem(input) {\n const { sectionId, ...rest } = input as typeof input & { sectionId?: string }\n const categoryId =\n sectionId && sectionId !== UNFILED_SECTION_ID ? sectionId : rest.categoryId\n return provider.createMenuItem({ ...rest, categoryId })\n },\n\n async placeItem(input) {\n // Dragging INTO the bucket is unfiling — there is no category called\n // `__unfiled__`, and writing one would be inventing a section.\n const categoryId = input.sectionId === UNFILED_SECTION_ID ? null : input.sectionId\n await provider.updateMenuItem(input.itemId, { categoryId })\n return {\n id: placementId(input.itemId),\n sectionId: input.sectionId,\n itemId: input.itemId,\n sortOrder: input.sortOrder ?? 0,\n isActive: input.isActive ?? true,\n tenantId: '',\n }\n },\n async updatePlacement(id, data) {\n // A legacy item carries ONE price, so a per-menu override has nowhere to\n // live. The screen hides that field when multiMenu is off; ignoring it\n // here keeps a stray call from writing the wrong number.\n if (data.sectionId) await provider.updateMenuItem(itemIdOf(id), { categoryId: data.sectionId })\n return {\n id,\n sectionId: data.sectionId ?? '',\n itemId: itemIdOf(id),\n sortOrder: data.sortOrder ?? 0,\n isActive: data.isActive ?? true,\n tenantId: '',\n }\n },\n async removePlacement(id) {\n await provider.updateMenuItem(itemIdOf(id), { categoryId: undefined })\n },\n async reorderPlacements(sectionId, placementIds) {\n await provider.reorderItems(sectionId, placementIds.map(itemIdOf))\n },\n async movePlacement(id, toSectionId) {\n await provider.updateMenuItem(itemIdOf(id), { categoryId: toSectionId })\n },\n }\n\n return new Proxy({} as FullMenuDataProvider, {\n get: (_t, prop: string) =>\n (overrides as any)[prop] ?? (provider as any)[prop],\n })\n}\n","import { createStore, type StoreApi } from 'zustand/vanilla'\nimport { toast } from 'sonner'\nimport { dedup } from '@fayz-ai/admin'\nimport { tl } from '@fayz-ai/core'\n\nimport type { FullMenuDataProvider, MenuDataProvider } from './data/types'\nimport { supportsMenus } from './data/types'\nimport { wrapLegacyProvider } from './data/legacy-adapter'\nimport type {\n Menu, MenuSection, MenuPlacement, MenuItem, ModifierGroup,\n CreateMenuInput, UpdateMenuInput, CreateSectionInput, UpdateSectionInput,\n CreateMenuItemInput, UpdateMenuItemInput,\n MenuItemQuery, MenuSummary, MenuItemStatus,\n ImportPlan, ImportResult, MenuDraft, DraftItem, DraftSection,\n} from './types'\nimport type { MenuExtractFn } from './lib/extract-transport'\nimport { countExtracted, normalizeName } from './lib/extract-parse'\n\n// ---------------------------------------------------------------------------\n// One store for the whole menu screen.\n//\n// It holds the OPEN menu — its sections, the placements inside them and the\n// items those point at — because that is the unit the user edits. Reordering is\n// applied to local state first and persisted after: dragging a dish must not\n// wait for a round trip to look like it happened.\n// ---------------------------------------------------------------------------\n\nexport interface MenuUIState {\n /** False when the host provider only knows a flat list of categories. */\n multiMenu: boolean\n\n menus: Menu[]\n menusLoading: boolean\n activeMenuId: string | null\n\n sections: MenuSection[]\n placements: MenuPlacement[]\n menuLoading: boolean\n /** Rows already on screen whose write has not landed yet. */\n pendingIds: string[]\n\n menuItems: MenuItem[]\n menuItemsTotal: number\n menuItemsLoading: boolean\n menuItemQuery: MenuItemQuery\n\n modifierGroups: ModifierGroup[]\n modifiersLoading: boolean\n\n summary: MenuSummary | null\n summaryLoading: boolean\n\n // Reads\n fetchMenus(): Promise<void>\n openMenu(menuId: string): Promise<void>\n fetchMenuContent(menuId: string): Promise<void>\n fetchMenuItems(query?: MenuItemQuery): Promise<void>\n fetchModifierGroups(): Promise<void>\n fetchSummary(): Promise<void>\n\n // Menus\n createMenu(input: CreateMenuInput): Promise<Menu>\n updateMenu(id: string, data: UpdateMenuInput): Promise<void>\n deleteMenu(id: string): Promise<void>\n duplicateMenu(id: string, name: string): Promise<Menu>\n\n // Sections\n createSection(name: string, extra?: Partial<CreateSectionInput>): Promise<MenuSection | null>\n updateSection(id: string, data: UpdateSectionInput): Promise<void>\n deleteSection(id: string): Promise<void>\n reorderSections(orderedIds: string[]): Promise<void>\n\n // Items in the open menu\n addItemToSection(sectionId: string, input: CreateMenuItemInput): Promise<MenuItem | null>\n placeExistingItem(sectionId: string, itemId: string): Promise<void>\n removePlacement(placementId: string): Promise<void>\n setPlacementPrice(placementId: string, price: number | undefined): Promise<void>\n reorderPlacements(sectionId: string, orderedIds: string[]): Promise<void>\n movePlacement(placementId: string, toSectionId: string, toIndex: number): Promise<void>\n\n // Items themselves\n updateMenuItem(id: string, data: UpdateMenuItemInput): Promise<void>\n deleteMenuItem(id: string): Promise<void>\n duplicateMenuItem(id: string, sectionId?: string): Promise<void>\n setItemStatus(id: string, status: MenuItemStatus): Promise<void>\n toggleAvailability(id: string, field: 'availableForPos' | 'availableForDelivery' | 'isFeatured', value: boolean): Promise<void>\n uploadImage(file: File, kind: 'item' | 'section' | 'menu' | 'import'): Promise<string | null>\n\n // --- AI import ---\n // The draft lives in the store because BOTH hands reach it: the user editing\n // rows on screen, and the assistant calling tools. The photos themselves are\n // asked for in the conversation (requestChatUpload) and land here already\n // read — the chat is the doorway, this is the destination.\n extracting: boolean\n draft: MenuDraft | null\n runExtraction(images: string[], extract: MenuExtractFn): Promise<void>\n updateDraftItem(sectionKey: string, itemKey: string, patch: Partial<DraftItem>): void\n removeDraftItem(sectionKey: string, itemKey: string): void\n updateDraftSection(sectionKey: string, patch: Partial<Pick<DraftSection, 'name' | 'targetSectionId'>>): void\n removeDraftSection(sectionKey: string): void\n /**\n * Stage a menu the assistant read directly from the conversation (a photo\n * pasted in the chat) as a draft — same review-then-commit path as the photo\n * extractor. Sections are matched to existing ones by name, and items that\n * already exist in the matched section are dropped instead of duplicated.\n */\n stageDraft(sections: Array<{ name: string; items: Array<{ name: string; price: number; description?: string }> }>): {\n sections: number\n items: number\n duplicatesDropped: number\n }\n discardDraft(): void\n commitDraft(): Promise<ImportResult>\n applyImportPlan(plan: ImportPlan): Promise<ImportResult>\n}\n\n/** Ids for rows drawn before the server has one. Never persisted. */\nlet optimisticSeq = 0\n\nexport function createMenuStore(rawProvider: MenuDataProvider): StoreApi<MenuUIState> {\n const multiMenu = supportsMenus(rawProvider)\n const provider: FullMenuDataProvider = multiMenu\n ? (rawProvider as FullMenuDataProvider)\n : wrapLegacyProvider(rawProvider)\n\n return createStore<MenuUIState>((set, get) => {\n /** One optimistic write for every per-item flag, status included. */\n async function writeItemField(id: string, field: string, value: unknown): Promise<void> {\n const previous = get().menuItems\n set({ menuItems: previous.map((i) => (i.id === id ? { ...i, [field]: value } as MenuItem : i)) })\n try {\n await provider.toggleAvailability(id, field as any, value)\n } catch (err: any) {\n set({ menuItems: previous })\n toast.error(tl('Could not update the item', 'Não foi possível atualizar o item'), { description: err?.message })\n }\n }\n\n return {\n multiMenu,\n menus: [],\n menusLoading: false,\n activeMenuId: null,\n sections: [],\n placements: [],\n menuLoading: false,\n pendingIds: [],\n menuItems: [],\n menuItemsTotal: 0,\n menuItemsLoading: false,\n menuItemQuery: {},\n modifierGroups: [],\n modifiersLoading: false,\n summary: null,\n summaryLoading: false,\n\n // --- Reads -------------------------------------------------------------\n async fetchMenus() {\n set({ menusLoading: true })\n try {\n const menus = await dedup('menu:menus', () => provider.getMenus())\n const active = get().activeMenuId && menus.some((m) => m.id === get().activeMenuId)\n ? get().activeMenuId\n : menus[0]?.id ?? null\n set({ menus, activeMenuId: active, menusLoading: false })\n if (active) await get().fetchMenuContent(active)\n } catch (err: any) {\n set({ menusLoading: false })\n toast.error(tl('Could not load the menus', 'Não foi possível carregar os cardápios'), { description: err?.message })\n }\n },\n\n async openMenu(menuId) {\n set({ activeMenuId: menuId })\n await get().fetchMenuContent(menuId)\n },\n\n async fetchMenuContent(menuId) {\n set({ menuLoading: true })\n try {\n const [sections, placements] = await Promise.all([\n provider.getSections(menuId),\n provider.getPlacements(menuId),\n ])\n set({ sections, placements, menuLoading: false })\n } catch (err: any) {\n set({ menuLoading: false })\n toast.error(tl('Could not load the menu', 'Não foi possível carregar o cardápio'), { description: err?.message })\n }\n },\n\n async fetchMenuItems(query = {}) {\n set({ menuItemsLoading: true, menuItemQuery: query })\n try {\n const result = await provider.getMenuItems(query)\n set({ menuItems: result.data, menuItemsTotal: result.total, menuItemsLoading: false })\n } catch (err: any) {\n set({ menuItemsLoading: false })\n toast.error(tl('Could not load the items', 'Não foi possível carregar os itens'), { description: err?.message })\n }\n },\n\n async fetchModifierGroups() {\n set({ modifiersLoading: true })\n try {\n const modifierGroups = await dedup('menu:modifiers', () => provider.getModifierGroups())\n set({ modifierGroups, modifiersLoading: false })\n } catch {\n set({ modifiersLoading: false, modifierGroups: [] })\n }\n },\n\n async fetchSummary() {\n set({ summaryLoading: true })\n try {\n const summary = await dedup('menu:summary', () => provider.getSummary())\n set({ summary, summaryLoading: false })\n } catch {\n set({ summaryLoading: false })\n }\n },\n\n // --- Menus -------------------------------------------------------------\n async createMenu(input) {\n const menu = await provider.createMenu(input)\n set({ menus: [...get().menus, menu] })\n await get().openMenu(menu.id)\n toast.success(tl('Menu created', 'Cardápio criado'))\n return menu\n },\n\n async updateMenu(id, data) {\n const updated = await provider.updateMenu(id, data)\n set({ menus: get().menus.map((m) => (m.id === id ? { ...m, ...updated } : m)) })\n },\n\n async deleteMenu(id) {\n await provider.deleteMenu(id)\n const menus = get().menus.filter((m) => m.id !== id)\n set({ menus })\n const next = menus[0]?.id ?? null\n set({ activeMenuId: next, sections: [], placements: [] })\n if (next) await get().fetchMenuContent(next)\n toast.success(tl('Menu deleted', 'Cardápio excluído'))\n },\n\n async duplicateMenu(id, name) {\n const copy = await provider.duplicateMenu(id, name)\n await get().fetchMenus()\n await get().openMenu(copy.id)\n toast.success(tl('Menu duplicated', 'Cardápio duplicado'), { description: tl('The copy starts inactive — publish it when it is ready.', 'A cópia começa desativada — publique quando estiver pronta.') })\n return copy\n },\n\n // --- Sections ----------------------------------------------------------\n async createSection(name, extra) {\n const menuId = get().activeMenuId\n if (!menuId) return null\n // The card lands the moment you ask for it. A section is a name and a\n // place in a list — waiting on a round trip to draw it is the difference\n // between \"the app is typing with me\" and \"the app is thinking\".\n const tempId = `pending-${++optimisticSeq}`\n const optimistic: MenuSection = {\n id: tempId,\n menuId,\n name,\n sortOrder: extra?.sortOrder ?? get().sections.length,\n isActive: extra?.isActive ?? true,\n availability: extra?.availability ?? {},\n tenantId: '',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n set({\n sections: [...get().sections, optimistic],\n pendingIds: [...get().pendingIds, tempId],\n })\n try {\n const section = await provider.createSection({ menuId, name, ...extra })\n set({\n sections: get().sections.map((s) => (s.id === tempId ? section : s)),\n pendingIds: get().pendingIds.filter((id) => id !== tempId),\n })\n return section\n } catch (err: any) {\n set({\n sections: get().sections.filter((s) => s.id !== tempId),\n pendingIds: get().pendingIds.filter((id) => id !== tempId),\n })\n toast.error(tl('Could not create the section', 'Não foi possível criar a seção'), { description: err?.message })\n return null\n }\n },\n\n async updateSection(id, data) {\n const previous = get().sections\n set({ sections: previous.map((s) => (s.id === id ? { ...s, ...data } as MenuSection : s)) })\n try {\n await provider.updateSection(id, data)\n } catch (err: any) {\n set({ sections: previous })\n toast.error(tl('Could not save the section', 'Não foi possível salvar a seção'), { description: err?.message })\n }\n },\n\n async deleteSection(id) {\n try {\n await provider.deleteSection(id)\n set({\n sections: get().sections.filter((s) => s.id !== id),\n placements: get().placements.filter((p) => p.sectionId !== id),\n })\n toast.success(tl('Section removed', 'Seção removida'))\n } catch (err: any) {\n toast.error(tl('Could not remove the section', 'Não foi possível remover a seção'), { description: err?.message })\n }\n },\n\n async reorderSections(orderedIds) {\n const menuId = get().activeMenuId\n if (!menuId) return\n const previous = get().sections\n // Local first: the card has to land where it was dropped, now.\n set({\n sections: orderedIds\n .map((id, index) => {\n const section = previous.find((s) => s.id === id)\n return section ? { ...section, sortOrder: index } : null\n })\n .filter(Boolean) as MenuSection[],\n })\n try {\n await provider.reorderSections(menuId, orderedIds)\n } catch (err: any) {\n set({ sections: previous })\n toast.error(tl('Could not save the new order', 'Não foi possível salvar a ordem'), { description: err?.message })\n }\n },\n\n // --- Items in the open menu -------------------------------------------\n async addItemToSection(sectionId, input) {\n // Same bet as a section: draw the row now, reconcile when the write\n // lands. A dish typed into a menu is not a transaction to wait on.\n const tempId = `pending-${++optimisticSeq}`\n const now = new Date().toISOString()\n const optimisticItem: MenuItem = {\n id: tempId,\n name: input.name,\n description: input.description,\n price: input.price ?? 0,\n currency: '',\n imageUrl: input.imageUrl,\n status: input.status ?? 'available',\n isActive: true,\n availableForPos: input.availableForPos ?? true,\n availableForDelivery: input.availableForDelivery ?? true,\n deliveryPrice: input.deliveryPrice,\n prepTimeMinutes: input.prepTimeMinutes,\n allergens: input.allergens ?? [],\n dietaryTags: input.dietaryTags ?? [],\n sortOrder: 0,\n isFeatured: input.isFeatured ?? false,\n tenantId: '',\n createdAt: now,\n updatedAt: now,\n }\n const optimisticPlacement: MenuPlacement = {\n id: `pending-placement-${optimisticSeq}`,\n sectionId,\n itemId: tempId,\n sortOrder: get().placements.filter((p) => p.sectionId === sectionId).length,\n isActive: true,\n tenantId: '',\n }\n set({\n menuItems: [...get().menuItems, optimisticItem],\n placements: [...get().placements, optimisticPlacement],\n pendingIds: [...get().pendingIds, optimisticPlacement.id],\n })\n try {\n const item = await provider.createMenuItem({ ...input, sectionId })\n const menuId = get().activeMenuId\n set({ menuItems: get().menuItems.map((i) => (i.id === tempId ? item : i)) })\n if (menuId) await get().fetchMenuContent(menuId)\n set({ pendingIds: get().pendingIds.filter((id) => id !== optimisticPlacement.id) })\n void get().fetchSummary()\n return item\n } catch (err: any) {\n set({\n menuItems: get().menuItems.filter((i) => i.id !== tempId),\n placements: get().placements.filter((p) => p.id !== optimisticPlacement.id),\n pendingIds: get().pendingIds.filter((id) => id !== optimisticPlacement.id),\n })\n toast.error(tl('Could not create the item', 'Não foi possível criar o item'), { description: err?.message })\n return null\n }\n },\n\n async placeExistingItem(sectionId, itemId) {\n try {\n const placement = await provider.placeItem({ sectionId, itemId })\n set({ placements: [...get().placements.filter((p) => p.id !== placement.id), placement] })\n } catch (err: any) {\n toast.error(tl('Could not add it to the menu', 'Não foi possível adicionar ao cardápio'), { description: err?.message })\n }\n },\n\n async removePlacement(placementId) {\n const previous = get().placements\n set({ placements: previous.filter((p) => p.id !== placementId) })\n try {\n await provider.removePlacement(placementId)\n } catch (err: any) {\n set({ placements: previous })\n toast.error(tl('Could not remove it from the menu', 'Não foi possível remover do cardápio'), { description: err?.message })\n }\n },\n\n async setPlacementPrice(placementId, price) {\n const previous = get().placements\n set({ placements: previous.map((p) => (p.id === placementId ? { ...p, priceOverride: price } : p)) })\n try {\n await provider.updatePlacement(placementId, { priceOverride: price })\n } catch (err: any) {\n set({ placements: previous })\n toast.error(tl('Could not save the price', 'Não foi possível salvar o preço'), { description: err?.message })\n }\n },\n\n async reorderPlacements(sectionId, orderedIds) {\n const previous = get().placements\n const reordered = previous.map((p) => {\n const index = orderedIds.indexOf(p.id)\n return index >= 0 ? { ...p, sortOrder: index } : p\n })\n set({ placements: reordered })\n try {\n await provider.reorderPlacements(sectionId, orderedIds)\n } catch (err: any) {\n set({ placements: previous })\n toast.error(tl('Could not save the new order', 'Não foi possível salvar a ordem'), { description: err?.message })\n }\n },\n\n async movePlacement(placementId, toSectionId, toIndex) {\n const previous = get().placements\n set({\n placements: previous.map((p) =>\n p.id === placementId ? { ...p, sectionId: toSectionId, sortOrder: toIndex } : p),\n })\n try {\n await provider.movePlacement(placementId, toSectionId, toIndex)\n } catch (err: any) {\n set({ placements: previous })\n toast.error(tl('Could not move the item', 'Não foi possível mover o item'), { description: err?.message })\n }\n },\n\n // --- Items -------------------------------------------------------------\n async updateMenuItem(id, data) {\n const previous = get().menuItems\n set({ menuItems: previous.map((i) => (i.id === id ? { ...i, ...data } as MenuItem : i)) })\n try {\n const updated = await provider.updateMenuItem(id, data)\n set({ menuItems: get().menuItems.map((i) => (i.id === id ? updated : i)) })\n } catch (err: any) {\n set({ menuItems: previous })\n toast.error(tl('Could not save the item', 'Não foi possível salvar o item'), { description: err?.message })\n }\n },\n\n async deleteMenuItem(id) {\n try {\n await provider.deleteMenuItem(id)\n set({\n menuItems: get().menuItems.filter((i) => i.id !== id),\n placements: get().placements.filter((p) => p.itemId !== id),\n })\n void get().fetchSummary()\n toast.success(tl('Item removed', 'Item removido'))\n } catch (err: any) {\n toast.error(tl('Could not remove the item', 'Não foi possível remover o item'), { description: err?.message })\n }\n },\n\n async duplicateMenuItem(id, sectionId) {\n const source = get().menuItems.find((i) => i.id === id)\n if (!source) return\n await get().addItemToSection(sectionId ?? get().placements.find((p) => p.itemId === id)?.sectionId ?? '', {\n name: `${source.name} (cópia)`,\n description: source.description,\n price: source.price,\n cost: source.cost,\n imageUrl: source.imageUrl,\n prepTimeMinutes: source.prepTimeMinutes,\n allergens: source.allergens,\n dietaryTags: source.dietaryTags,\n availableForPos: source.availableForPos,\n availableForDelivery: source.availableForDelivery,\n deliveryPrice: source.deliveryPrice,\n })\n },\n\n async setItemStatus(id, status) {\n await writeItemField(id, 'status', status)\n },\n\n async toggleAvailability(id, field, value) {\n await writeItemField(id, field, value)\n },\n\n async uploadImage(file, kind) {\n if (!provider.uploadImage) {\n toast.error(tl('This workspace does not store menu photos yet.', 'Este espaço ainda não guarda fotos do cardápio.'))\n return null\n }\n try {\n return await provider.uploadImage(file, kind)\n } catch (err: any) {\n toast.error('Não foi possível enviar a foto', { description: err?.message })\n return null\n }\n },\n\n // --- AI import ---------------------------------------------------------\n extracting: false,\n draft: null,\n\n async runExtraction(images, extract) {\n if (images.length === 0) return\n set({ extracting: true })\n try {\n const result = await extract(images)\n const counts = countExtracted(result)\n if (counts.items === 0) {\n set({ extracting: false })\n toast.error(tl('I could not read any items in those photos', 'Não consegui ler itens nessas fotos'), {\n description: tl('Try one photo per page, closer and without glare.', 'Tente uma foto por página, mais perto e sem reflexo.'),\n })\n return\n }\n // Matching by name is what keeps a second round of photos from\n // creating a second \"Bebidas\".\n const existing = get().sections\n let key = 0\n const draft: MenuDraft = {\n source: 'photo',\n model: result.model,\n sections: result.sections.map((section) => ({\n key: `ds-${++key}`,\n name: section.name,\n targetSectionId: existing.find((s) => normalizeName(s.name) === normalizeName(section.name))?.id,\n items: section.items.map((item) => ({\n key: `di-${++key}`,\n name: item.name,\n price: item.price,\n description: item.description,\n })),\n })),\n }\n set({ draft, extracting: false })\n } catch (err: any) {\n set({ extracting: false })\n toast.error(tl('I could not read the photos', 'Não consegui ler as fotos'), { description: err?.message })\n }\n },\n\n updateDraftItem(sectionKey, itemKey, patch) {\n const draft = get().draft\n if (!draft) return\n set({\n draft: {\n ...draft,\n sections: draft.sections.map((section) => section.key !== sectionKey ? section : {\n ...section,\n items: section.items.map((item) => (item.key === itemKey ? { ...item, ...patch } : item)),\n }),\n },\n })\n },\n\n removeDraftItem(sectionKey, itemKey) {\n const draft = get().draft\n if (!draft) return\n const sections = draft.sections\n .map((section) => section.key !== sectionKey ? section : {\n ...section,\n items: section.items.filter((item) => item.key !== itemKey),\n })\n .filter((section) => section.items.length > 0)\n set({ draft: sections.length > 0 ? { ...draft, sections } : null })\n },\n\n updateDraftSection(sectionKey, patch) {\n const draft = get().draft\n if (!draft) return\n set({\n draft: {\n ...draft,\n sections: draft.sections.map((section) => (section.key === sectionKey ? { ...section, ...patch } : section)),\n },\n })\n },\n\n removeDraftSection(sectionKey) {\n const draft = get().draft\n if (!draft) return\n const sections = draft.sections.filter((section) => section.key !== sectionKey)\n set({ draft: sections.length > 0 ? { ...draft, sections } : null })\n },\n\n stageDraft(input) {\n const existing = get().sections\n const { placements, menuItems } = get()\n const itemNames = (sectionId: string) => new Set(\n placements\n .filter((p) => p.sectionId === sectionId)\n .map((p) => normalizeName(menuItems.find((i) => i.id === p.itemId)?.name ?? ''))\n .filter(Boolean),\n )\n let key = 0\n let duplicatesDropped = 0\n const seenSections = new Set<string>()\n const sections: DraftSection[] = []\n for (const section of input) {\n const sectionKey = normalizeName(section.name)\n if (!sectionKey || seenSections.has(sectionKey)) continue\n seenSections.add(sectionKey)\n const target = existing.find((s) => normalizeName(s.name) === sectionKey)\n const already = target ? itemNames(target.id) : new Set<string>()\n const seenItems = new Set<string>()\n const items: DraftItem[] = []\n for (const item of section.items ?? []) {\n const itemKey = normalizeName(item.name)\n if (!itemKey) continue\n if (already.has(itemKey) || seenItems.has(itemKey)) {\n duplicatesDropped++\n continue\n }\n seenItems.add(itemKey)\n items.push({\n key: `di-${++key}`,\n name: item.name,\n price: Number(item.price) || 0,\n description: item.description,\n })\n }\n if (items.length === 0) continue\n sections.push({ key: `ds-${++key}`, name: section.name, targetSectionId: target?.id, items })\n }\n const draft: MenuDraft | null = sections.length > 0 ? { source: 'chat', sections } : null\n set({ draft })\n return {\n sections: sections.length,\n items: sections.reduce((sum, s) => sum + s.items.length, 0),\n duplicatesDropped,\n }\n },\n\n discardDraft() { set({ draft: null }) },\n\n async commitDraft() {\n const draft = get().draft\n const menuId = get().activeMenuId\n if (!draft || !menuId) return { sectionsCreated: 0, itemsCreated: 0, failed: 0 }\n const result = await get().applyImportPlan({\n menuId,\n sections: draft.sections.map((section) => ({\n sectionId: section.targetSectionId,\n name: section.name,\n items: section.items.map(({ name, price, description }) => ({ name, price, description })),\n })),\n })\n set({ draft: null })\n return result\n },\n\n async applyImportPlan(plan) {\n const result: ImportResult = { sectionsCreated: 0, itemsCreated: 0, failed: 0 }\n for (const section of plan.sections) {\n let sectionId = section.sectionId\n if (!sectionId) {\n const created = await provider.createSection({ menuId: plan.menuId, name: section.name })\n sectionId = created.id\n result.sectionsCreated++\n }\n for (const item of section.items) {\n try {\n await provider.createMenuItem({\n name: item.name,\n description: item.description,\n price: item.price,\n sectionId,\n })\n result.itemsCreated++\n } catch {\n result.failed++\n }\n }\n }\n await get().fetchMenus()\n // The rows just written are drawn through `itemsById`: without re-reading\n // the ITEMS the new placements point at products the screen has never\n // fetched, and every imported row renders blank until a full reload.\n await get().fetchMenuItems(get().menuItemQuery ?? {})\n void get().fetchSummary()\n return result\n },\n }\n })\n}\n","import type { PluginRegistryDef } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport { T } from './tables'\n\nconst allergenEntity: EntityDef = {\n name: 'Allergen',\n namePlural: 'Allergens',\n icon: 'AlertTriangle',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'icon', label: 'Icon', type: 'text', showInTable: true },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: T.allergens, tenantScoped: true },\n}\n\nconst dietaryTagEntity: EntityDef = {\n name: 'Dietary Tag',\n namePlural: 'Dietary Tags',\n icon: 'Leaf',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'color', label: 'Color', type: 'color', showInTable: true },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: T.dietaryTags, tenantScoped: true },\n}\n\nconst modifierGroupEntity: EntityDef = {\n name: 'Modifier Group',\n namePlural: 'Modifier Groups',\n icon: 'ListPlus',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'minSelections', label: 'Min Selections', type: 'number', showInTable: true, defaultValue: 0 },\n { key: 'maxSelections', label: 'Max Selections', type: 'number', showInTable: true, defaultValue: 1 },\n { key: 'isRequired', label: 'Required', type: 'boolean', showInTable: true, defaultValue: false },\n ],\n data: { table: T.modifierGroups, tenantScoped: true },\n}\n\nexport const menuRegistries: PluginRegistryDef[] = [\n {\n id: 'allergens',\n entity: allergenEntity,\n icon: 'AlertTriangle',\n description: 'Allergen types for menu items',\n display: 'table',\n readOnly: true,\n seedData: [\n { id: 'a-gluten', name: 'Gluten', icon: '🌾', isActive: true },\n { id: 'a-dairy', name: 'Dairy', icon: '🥛', isActive: true },\n { id: 'a-nuts', name: 'Nuts', icon: '🥜', isActive: true },\n { id: 'a-shellfish', name: 'Shellfish', icon: '🦐', isActive: true },\n { id: 'a-eggs', name: 'Eggs', icon: '🥚', isActive: true },\n { id: 'a-soy', name: 'Soy', icon: '🫘', isActive: true },\n ],\n },\n {\n id: 'dietary-tags',\n entity: dietaryTagEntity,\n icon: 'Leaf',\n description: 'Dietary tags (vegan, vegetarian, etc.)',\n display: 'table',\n readOnly: true,\n seedData: [\n { id: 'dt-vegan', name: 'Vegan', color: 'green', isActive: true },\n { id: 'dt-vegetarian', name: 'Vegetarian', color: 'lime', isActive: true },\n { id: 'dt-gf', name: 'Gluten Free', color: 'amber', isActive: true },\n ],\n },\n {\n id: 'modifier-groups',\n entity: modifierGroupEntity,\n icon: 'ListPlus',\n description: 'Modifier groups for item customization',\n display: 'table',\n },\n]\n","export const en: Record<string, string> = {\n 'menu.title': 'Menu',\n 'menu.nav.manager': 'Menu',\n\n // Manager\n 'menu.manager.title': 'Menu',\n 'menu.manager.subtitle': 'Build your menus, with sections and order',\n 'menu.manager.search': 'Search the menu...',\n 'menu.manager.newMenu': 'New menu',\n 'menu.manager.menuActions': 'Menu actions',\n 'menu.manager.editMenu': 'Edit menu',\n 'menu.manager.duplicateMenu': 'Duplicate menu',\n 'menu.manager.activateMenu': 'Activate menu',\n 'menu.manager.deactivateMenu': 'Deactivate menu',\n 'menu.manager.deleteMenu': 'Delete menu',\n 'menu.manager.menuOff': 'Off',\n 'menu.manager.servingNow': 'Serving now',\n 'menu.manager.notServing': 'Outside its hours',\n 'menu.manager.addSection': 'New section',\n 'menu.manager.newSectionName': 'New section',\n 'menu.manager.editSection': 'Turn section on/off',\n 'menu.manager.deleteSection': 'Delete section',\n 'menu.manager.sectionActions': 'Section actions',\n 'menu.manager.sectionOff': 'Section off',\n 'menu.manager.emptySection': 'Nothing here yet — click to add',\n 'menu.manager.addItem': 'Add item',\n 'menu.manager.itemActions': 'Item actions',\n 'menu.manager.itemsCount': '{{count}} items',\n 'menu.manager.edit': 'Edit',\n 'menu.manager.duplicate': 'Duplicate',\n 'menu.manager.markSoldOut': 'Mark sold out',\n 'menu.manager.markAvailable': 'Mark available',\n 'menu.manager.feature': 'Feature',\n 'menu.manager.unfeature': 'Remove from featured',\n 'menu.manager.removeFromMenu': 'Remove from this menu',\n 'menu.manager.deleteItem': 'Delete item',\n 'menu.manager.dragSection': 'Drag section',\n 'menu.manager.dragItem': 'Drag item',\n 'menu.manager.expand': 'Expand',\n 'menu.manager.collapse': 'Collapse',\n 'menu.manager.available': 'Available',\n 'menu.manager.soldOut': 'Sold out',\n 'menu.manager.hidden': 'Hidden',\n 'menu.manager.pos': 'POS',\n 'menu.manager.delivery': 'Delivery',\n 'menu.manager.featured': 'Featured',\n 'menu.manager.overridden': 'this menu',\n 'menu.manager.overriddenHint': 'This item costs a different price on this menu',\n 'menu.manager.empty': 'Your menu is still empty',\n 'menu.manager.emptyHint': 'Create the first section, or send photos of the printed menu and the assistant fills it in.',\n\n // Menu dialog\n 'menu.menuDialog.newTitle': 'New menu',\n 'menu.menuDialog.editTitle': 'Edit menu',\n 'menu.menuDialog.name': 'Name',\n 'menu.menuDialog.namePlaceholder': 'Lunch, Weekend, Delivery...',\n 'menu.menuDialog.description': 'Description',\n 'menu.menuDialog.descriptionPlaceholder': 'Weekday lunch',\n 'menu.menuDialog.channels': 'Where it shows',\n 'menu.menuDialog.active': 'Menu active',\n 'menu.menuDialog.activeHint': 'Turned off it leaves the floor and delivery without being deleted',\n\n 'menu.channel.pos': 'Dine-in / POS',\n 'menu.channel.delivery': 'Delivery',\n 'menu.channel.digital': 'Digital menu',\n\n // Schedule\n 'menu.schedule.always': 'Every day, all day',\n 'menu.schedule.restrict': 'Only on certain days and hours',\n 'menu.schedule.restrictHint': 'This is how a weekday lunch menu is born',\n 'menu.schedule.days': 'Days',\n 'menu.schedule.from': 'From',\n 'menu.schedule.to': 'To',\n 'menu.schedule.overnightHint': 'If the end is before the start, the menu crosses midnight (22:00–02:00).',\n 'menu.schedule.presetWeekdays': 'Weekdays',\n 'menu.schedule.presetWeekend': 'Weekend',\n 'menu.schedule.presetEveryDay': 'Every day',\n\n // Item form\n 'menu.itemForm.newTitle': 'New item',\n 'menu.itemForm.editTitle': 'Edit item',\n 'menu.itemForm.name': 'Name',\n 'menu.itemForm.namePlaceholder': 'Grilled picanha',\n 'menu.itemForm.description': 'Description',\n 'menu.itemForm.descriptionPlaceholder': 'Serves 2, comes with farofa',\n 'menu.itemForm.photo': 'Photo',\n 'menu.itemForm.photoHint': 'Square, well lit. Shows on the digital menu and delivery.',\n 'menu.itemForm.pricingGroup': 'Pricing',\n 'menu.itemForm.menuGroup': 'On the menu',\n 'menu.itemForm.posHint': 'Shows for whoever is serving the floor',\n 'menu.itemForm.deliveryHint': 'Shows for orders from outside',\n 'menu.itemForm.featuredHint': 'Moves to the top of its section',\n 'menu.itemForm.price': 'Price',\n 'menu.itemForm.cost': 'Cost',\n 'menu.itemForm.deliveryPrice': 'Delivery price',\n 'menu.itemForm.prepTime': 'Prep (min)',\n 'menu.itemForm.section': 'Section',\n 'menu.itemForm.status': 'Status',\n 'menu.itemForm.priceOverride': 'Price on this menu only',\n 'menu.itemForm.priceOverrideHint': 'The same dish can cost less at lunch. Empty = the item price.',\n 'menu.itemForm.clearOverride': 'Use the item price',\n\n // AI import\n 'menu.import.action': 'Add with AI',\n 'menu.import.actionDesc': 'Send photos of the printed menu and the assistant fills it in for you.',\n 'menu.import.uploadCta': 'Upload a photo of the menu',\n 'menu.import.uploadHint': 'One photo per page, straight on, no glare. Several at once is fine.',\n 'menu.import.photoSentPrompt': 'Here is a photo of my menu. Please read it and register it for me.',\n 'menu.import.askPrompt': 'I want to add my menu from photos.',\n 'menu.import.askHint': 'Describe the menu, or ask to start from photos…',\n 'menu.import.askPersona': 'Menu setup',\n 'menu.import.askPitch': 'Send me photos of the menu and I will type it in.',\n 'menu.import.askDescription': 'One photo per page, straight on, no glare. I read them, show what I understood right here on the screen, and we check it together before saving.',\n 'menu.import.askSuggestion.0': 'I will send photos of the printed menu',\n 'menu.import.askSuggestion.1': 'Create a weekday lunch menu',\n 'menu.import.askSuggestion.2': 'Add a desserts section',\n 'menu.import.createSection': 'Create new section',\n 'menu.import.destination': 'Goes into',\n 'menu.import.intoSection': 'Add into: {{name}}',\n 'menu.import.willAppend': 'goes into {{name}}',\n 'menu.import.dropItem': 'Drop item',\n 'menu.import.dropSection': 'Drop section',\n 'menu.import.draftCount': '{{items}} items read across {{sections}} sections',\n 'menu.import.draftHint': 'Check and fix them right here — nothing is saved yet.',\n 'menu.import.draftMissingPrice': '{{count}} items came without a price. Fill them in before saving.',\n 'menu.import.discard': 'Discard',\n 'menu.import.commit': 'Save {{count}} items',\n 'menu.import.done': '{{items}} items in {{sections}} sections created',\n 'menu.import.someFailed': '{{count}} items could not be created',\n\n // Preview\n 'menu.preview.action': 'Preview',\n 'menu.preview.title': 'Menu',\n 'menu.preview.notServingNow': 'outside its hours right now',\n\n // Confirmations\n 'menu.confirm.sectionTitle': 'Delete the section {{name}}?',\n 'menu.confirm.sectionDesc': 'Its items leave this menu but stay registered.',\n 'menu.confirm.itemTitle': 'Delete the item {{name}}?',\n 'menu.confirm.itemDesc': 'It leaves every menu it appears in.',\n 'menu.confirm.menuTitle': 'Delete the menu {{name}}?',\n 'menu.confirm.menuDesc': 'Its sections go with it. The dishes stay registered.',\n 'menu.confirm.delete': 'Delete',\n\n // Shared form bits\n 'menu.form.save': 'Save',\n 'menu.form.saving': 'Saving...',\n 'menu.form.cancel': 'Cancel',\n\n // Settings\n 'menu.settings.title': 'Menu settings',\n}\n","export const ptBR: Record<string, string> = {\n 'menu.title': 'Cardápio',\n 'menu.nav.manager': 'Cardápio',\n\n // Manager\n 'menu.manager.title': 'Cardápio',\n 'menu.manager.subtitle': 'Monte os cardápios da casa, com seções e ordem',\n 'menu.manager.search': 'Buscar item no cardápio...',\n 'menu.manager.newMenu': 'Novo cardápio',\n 'menu.manager.menuActions': 'Ações do cardápio',\n 'menu.manager.editMenu': 'Editar cardápio',\n 'menu.manager.duplicateMenu': 'Duplicar cardápio',\n 'menu.manager.activateMenu': 'Ativar cardápio',\n 'menu.manager.deactivateMenu': 'Desativar cardápio',\n 'menu.manager.deleteMenu': 'Excluir cardápio',\n 'menu.manager.menuOff': 'Desativado',\n 'menu.manager.servingNow': 'Servindo agora',\n 'menu.manager.notServing': 'Fora do horário',\n 'menu.manager.addSection': 'Nova seção',\n 'menu.manager.newSectionName': 'Nova seção',\n 'menu.manager.editSection': 'Ativar/desativar seção',\n 'menu.manager.deleteSection': 'Excluir seção',\n 'menu.manager.sectionActions': 'Ações da seção',\n 'menu.manager.sectionOff': 'Seção desativada',\n 'menu.manager.emptySection': 'Nenhum item aqui ainda — clique para adicionar',\n 'menu.manager.addItem': 'Adicionar item',\n 'menu.manager.itemActions': 'Ações do item',\n 'menu.manager.itemsCount': '{{count}} itens',\n 'menu.manager.edit': 'Editar',\n 'menu.manager.duplicate': 'Duplicar',\n 'menu.manager.markSoldOut': 'Marcar como esgotado',\n 'menu.manager.markAvailable': 'Marcar como disponível',\n 'menu.manager.feature': 'Colocar em destaque',\n 'menu.manager.unfeature': 'Tirar do destaque',\n 'menu.manager.removeFromMenu': 'Tirar deste cardápio',\n 'menu.manager.deleteItem': 'Excluir item',\n 'menu.manager.dragSection': 'Arrastar seção',\n 'menu.manager.dragItem': 'Arrastar item',\n 'menu.manager.expand': 'Expandir',\n 'menu.manager.collapse': 'Recolher',\n 'menu.manager.available': 'Disponível',\n 'menu.manager.soldOut': 'Esgotado',\n 'menu.manager.hidden': 'Oculto',\n 'menu.manager.pos': 'PDV',\n 'menu.manager.delivery': 'Delivery',\n 'menu.manager.featured': 'Destaque',\n 'menu.manager.overridden': 'preço deste cardápio',\n 'menu.manager.overriddenHint': 'Este item custa diferente neste cardápio',\n 'menu.manager.empty': 'Seu cardápio ainda está vazio',\n 'menu.manager.emptyHint': 'Crie a primeira seção, ou mande fotos do cardápio impresso e o assistente cadastra pra você.',\n\n // Menu dialog\n 'menu.menuDialog.newTitle': 'Novo cardápio',\n 'menu.menuDialog.editTitle': 'Editar cardápio',\n 'menu.menuDialog.name': 'Nome',\n 'menu.menuDialog.namePlaceholder': 'Executivo, Fim de semana, Delivery...',\n 'menu.menuDialog.description': 'Descrição',\n 'menu.menuDialog.descriptionPlaceholder': 'Almoço de segunda a sexta',\n 'menu.menuDialog.channels': 'Onde aparece',\n 'menu.menuDialog.active': 'Cardápio ativo',\n 'menu.menuDialog.activeHint': 'Desativado, ele some do salão e do delivery sem ser apagado',\n\n 'menu.channel.pos': 'Salão / PDV',\n 'menu.channel.delivery': 'Delivery',\n 'menu.channel.digital': 'Cardápio digital',\n\n // Schedule\n 'menu.schedule.always': 'Todo dia, o dia inteiro',\n 'menu.schedule.restrict': 'Só em certos dias e horários',\n 'menu.schedule.restrictHint': 'É assim que nasce um executivo de segunda a sexta',\n 'menu.schedule.days': 'Dias',\n 'menu.schedule.from': 'Das',\n 'menu.schedule.to': 'Até',\n 'menu.schedule.overnightHint': 'Se o fim for antes do começo, o cardápio atravessa a meia-noite (22:00–02:00).',\n 'menu.schedule.presetWeekdays': 'Dias de semana',\n 'menu.schedule.presetWeekend': 'Fim de semana',\n 'menu.schedule.presetEveryDay': 'Todo dia',\n\n // Item form\n 'menu.itemForm.newTitle': 'Novo item',\n 'menu.itemForm.editTitle': 'Editar item',\n 'menu.itemForm.name': 'Nome',\n 'menu.itemForm.namePlaceholder': 'Picanha na chapa',\n 'menu.itemForm.description': 'Descrição',\n 'menu.itemForm.descriptionPlaceholder': 'Serve 2 pessoas, acompanha farofa',\n 'menu.itemForm.photo': 'Foto',\n 'menu.itemForm.photoHint': 'Quadrada, boa luz. Aparece no cardápio digital e no delivery.',\n 'menu.itemForm.pricingGroup': 'Preços',\n 'menu.itemForm.menuGroup': 'No cardápio',\n 'menu.itemForm.posHint': 'Aparece para quem atende no salão',\n 'menu.itemForm.deliveryHint': 'Aparece para quem pede de fora',\n 'menu.itemForm.featuredHint': 'Sobe para o topo da seção',\n 'menu.itemForm.price': 'Preço',\n 'menu.itemForm.cost': 'Custo',\n 'menu.itemForm.deliveryPrice': 'Preço delivery',\n 'menu.itemForm.prepTime': 'Preparo (min)',\n 'menu.itemForm.section': 'Seção',\n 'menu.itemForm.status': 'Situação',\n 'menu.itemForm.priceOverride': 'Preço só neste cardápio',\n 'menu.itemForm.priceOverrideHint': 'O mesmo prato pode custar menos no executivo. Em branco, vale o preço do item.',\n 'menu.itemForm.clearOverride': 'Usar o preço do item',\n\n // AI import\n 'menu.import.action': 'Inserir com IA',\n 'menu.import.actionDesc': 'Mande fotos do cardápio impresso e o assistente cadastra por você.',\n 'menu.import.uploadCta': 'Subir foto do cardápio',\n 'menu.import.uploadHint': 'Uma foto por página, de frente e sem reflexo. Pode mandar várias.',\n 'menu.import.photoSentPrompt': 'Aqui está a foto do meu cardápio. Lê e cadastra pra mim, por favor.',\n 'menu.import.askPrompt': 'Quero cadastrar meu cardápio a partir de fotos.',\n 'menu.import.askHint': 'Descreva o cardápio, ou peça para começar pelas fotos…',\n 'menu.import.askPersona': 'Cadastro de cardápio',\n 'menu.import.askPitch': 'Me manda as fotos do cardápio que eu cadastro.',\n 'menu.import.askDescription': 'Uma foto por página, de frente e sem reflexo. Eu leio, mostro o que entendi aqui na tela e a gente confere junto antes de gravar.',\n 'menu.import.askSuggestion.0': 'Vou mandar as fotos do cardápio impresso',\n 'menu.import.askSuggestion.1': 'Cria um cardápio executivo de segunda a sexta',\n 'menu.import.askSuggestion.2': 'Adiciona uma seção de sobremesas',\n 'menu.import.createSection': 'Criar seção nova',\n 'menu.import.destination': 'Onde entra',\n 'menu.import.intoSection': 'Somar em: {{name}}',\n 'menu.import.willAppend': 'entra em {{name}}',\n 'menu.import.dropItem': 'Descartar item',\n 'menu.import.dropSection': 'Descartar seção',\n 'menu.import.draftCount': '{{items}} itens lidos em {{sections}} seções',\n 'menu.import.draftHint': 'Confira e ajuste aqui mesmo — nada foi gravado ainda.',\n 'menu.import.draftMissingPrice': '{{count}} itens vieram sem preço. Preencha antes de gravar.',\n 'menu.import.discard': 'Descartar',\n 'menu.import.commit': 'Gravar {{count}} itens',\n 'menu.import.done': '{{items}} itens em {{sections}} seções cadastrados',\n 'menu.import.someFailed': '{{count}} itens não puderam ser criados',\n\n // Preview\n 'menu.preview.action': 'Ver como fica',\n 'menu.preview.title': 'Cardápio',\n 'menu.preview.notServingNow': 'fora do horário agora',\n\n // Confirmations\n 'menu.confirm.sectionTitle': 'Excluir a seção {{name}}?',\n 'menu.confirm.sectionDesc': 'Os itens dela saem deste cardápio, mas continuam cadastrados.',\n 'menu.confirm.itemTitle': 'Excluir o item {{name}}?',\n 'menu.confirm.itemDesc': 'Ele sai de todos os cardápios em que aparece.',\n 'menu.confirm.menuTitle': 'Excluir o cardápio {{name}}?',\n 'menu.confirm.menuDesc': 'As seções deste cardápio somem. Os pratos continuam cadastrados.',\n 'menu.confirm.delete': 'Excluir',\n\n // Shared form bits\n 'menu.form.save': 'Salvar',\n 'menu.form.saving': 'Salvando...',\n 'menu.form.cancel': 'Cancelar',\n\n // Settings\n 'menu.settings.title': 'Configurações do Cardápio',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const menuLocales: Record<string, Record<string, string>> = { en, 'pt-BR': ptBR }\n","import { createFayzClient, type FayzClientOptions, type FayzTableFilter } from '@fayz-ai/sdk'\nimport type {\n CreateMenuCategoryInput,\n CreateMenuItemInput,\n MenuCategory,\n MenuItem,\n MenuItemQuery,\n MenuItemStatus,\n MenuSummary,\n ModifierGroup,\n PaginatedResult,\n UpdateMenuItemInput,\n} from '../types'\nimport type { MenuDataProvider } from './types'\n\nexport interface FayzMenuProviderOptions extends FayzClientOptions {\n projectId?: string\n schema?: string\n runtime?: boolean\n categoriesTable?: string\n productsTable?: string\n categoryKind?: string\n}\n\ninterface CategoryRow {\n id: string\n tenant_id?: string | null\n kind?: string | null\n name: string\n slug?: string | null\n parent_id?: string | null\n icon?: string | null\n color?: string | null\n sort_order?: number | null\n is_active?: boolean | null\n metadata?: Record<string, unknown> | null\n created_at?: string | null\n updated_at?: string | null\n}\n\ninterface ProductRow {\n id: string\n tenant_id?: string | null\n category_id?: string | null\n name: string\n description?: string | null\n sku?: string | null\n price?: number | string | null\n cost?: number | string | null\n currency?: string | null\n image_url?: string | null\n status?: string | null\n is_active?: boolean | null\n tags?: string[] | null\n metadata?: Record<string, unknown> | null\n created_at?: string | null\n updated_at?: string | null\n}\n\nconst DEFAULT_CATEGORY_KIND = 'menu_category'\nconst MENU_METADATA_KEY = 'fayzMenu'\n\nfunction nowIso(): string {\n return new Date().toISOString()\n}\n\nfunction slugify(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nfunction numberValue(value: number | string | null | undefined): number {\n if (typeof value === 'number') return value\n if (typeof value === 'string') return Number(value) || 0\n return 0\n}\n\nfunction menuMetadata(row: ProductRow): Record<string, unknown> {\n const raw = row.metadata?.[MENU_METADATA_KEY]\n return raw && typeof raw === 'object' && !Array.isArray(raw) ? raw as Record<string, unknown> : {}\n}\n\nfunction rowToCategory(row: CategoryRow, itemCount = 0): MenuCategory {\n return {\n id: row.id,\n name: row.name,\n parentId: row.parent_id ?? undefined,\n icon: row.icon ?? undefined,\n color: row.color ?? undefined,\n sortOrder: row.sort_order ?? 0,\n isActive: row.is_active ?? true,\n itemCount,\n tenantId: row.tenant_id ?? 'runtime-tenant',\n createdAt: row.created_at ?? nowIso(),\n updatedAt: row.updated_at ?? row.created_at ?? nowIso(),\n }\n}\n\nfunction rowToItem(row: ProductRow, categoryName?: string): MenuItem {\n const metadata = menuMetadata(row)\n const status = (metadata.status ?? row.status ?? 'available') as MenuItemStatus\n return {\n id: row.id,\n name: row.name,\n description: row.description ?? undefined,\n price: numberValue(row.price),\n cost: numberValue(row.cost),\n currency: row.currency ?? 'BRL',\n sku: row.sku ?? undefined,\n imageUrl: row.image_url ?? undefined,\n categoryId: row.category_id ?? undefined,\n categoryName,\n status,\n isActive: row.is_active ?? true,\n prepTimeMinutes: typeof metadata.prepTimeMinutes === 'number' ? metadata.prepTimeMinutes : undefined,\n allergens: Array.isArray(metadata.allergens) ? metadata.allergens as string[] : undefined,\n dietaryTags: Array.isArray(metadata.dietaryTags) ? metadata.dietaryTags as string[] : row.tags ?? undefined,\n availableForPos: typeof metadata.availableForPos === 'boolean' ? metadata.availableForPos : true,\n availableForDelivery: typeof metadata.availableForDelivery === 'boolean' ? metadata.availableForDelivery : true,\n deliveryPrice: typeof metadata.deliveryPrice === 'number' ? metadata.deliveryPrice : undefined,\n sortOrder: typeof metadata.sortOrder === 'number' ? metadata.sortOrder : 0,\n isFeatured: typeof metadata.isFeatured === 'boolean' ? metadata.isFeatured : false,\n modifierGroupIds: Array.isArray(metadata.modifierGroupIds) ? metadata.modifierGroupIds as string[] : undefined,\n metadata: row.metadata ?? {},\n tenantId: row.tenant_id ?? 'runtime-tenant',\n createdAt: row.created_at ?? nowIso(),\n updatedAt: row.updated_at ?? row.created_at ?? nowIso(),\n }\n}\n\nfunction categoryPayload(input: CreateMenuCategoryInput, kind: string): Record<string, unknown> {\n return {\n kind,\n name: input.name,\n slug: slugify(input.name),\n parent_id: input.parentId ?? null,\n icon: input.icon ?? null,\n color: input.color ?? null,\n sort_order: input.sortOrder ?? 0,\n is_active: true,\n }\n}\n\nfunction itemMetadata(input: Partial<CreateMenuItemInput>, existing?: Record<string, unknown>): Record<string, unknown> {\n return {\n ...(existing ?? {}),\n [MENU_METADATA_KEY]: {\n ...((existing?.[MENU_METADATA_KEY] && typeof existing[MENU_METADATA_KEY] === 'object') ? existing[MENU_METADATA_KEY] as Record<string, unknown> : {}),\n status: input.status,\n prepTimeMinutes: input.prepTimeMinutes,\n allergens: input.allergens,\n dietaryTags: input.dietaryTags,\n availableForPos: input.availableForPos ?? true,\n availableForDelivery: input.availableForDelivery ?? true,\n deliveryPrice: input.deliveryPrice,\n isFeatured: input.isFeatured ?? false,\n modifierGroupIds: input.modifierGroupIds,\n },\n }\n}\n\nfunction itemCreatePayload(input: CreateMenuItemInput): Record<string, unknown> {\n return {\n name: input.name,\n description: input.description ?? null,\n price: input.price,\n cost: input.cost ?? null,\n currency: 'BRL',\n image_url: input.imageUrl ?? null,\n category_id: input.categoryId ?? null,\n status: input.status === 'hidden' ? 'archived' : 'active',\n is_active: input.status !== 'hidden',\n tags: input.dietaryTags ?? [],\n metadata: itemMetadata(input),\n }\n}\n\nfunction itemUpdatePayload(input: UpdateMenuItemInput, existing?: MenuItem): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (input.name !== undefined) payload.name = input.name\n if (input.description !== undefined) payload.description = input.description\n if (input.price !== undefined) payload.price = input.price\n if (input.cost !== undefined) payload.cost = input.cost\n if (input.imageUrl !== undefined) payload.image_url = input.imageUrl\n if (input.categoryId !== undefined) payload.category_id = input.categoryId\n if (input.status !== undefined) {\n payload.status = input.status === 'hidden' ? 'archived' : 'active'\n payload.is_active = input.status !== 'hidden'\n }\n if (input.dietaryTags !== undefined) payload.tags = input.dietaryTags\n // itemMetadata never reads categoryId; `null` (an unfile) is not a value it\n // has an opinion about, so it is normalised away rather than widening a type\n // that four other callers share.\n payload.metadata = itemMetadata({ ...input, categoryId: input.categoryId ?? undefined }, existing?.metadata)\n return payload\n}\n\nfunction filtersFromQuery(query: MenuItemQuery): FayzTableFilter[] {\n const filters: FayzTableFilter[] = [{ column: 'is_active', operator: 'eq', value: true }]\n if (query.categoryId) filters.push({ column: 'category_id', operator: 'eq', value: query.categoryId })\n return filters\n}\n\nfunction matchesClientQuery(item: MenuItem, query: MenuItemQuery): boolean {\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n if (!statuses.includes(item.status)) return false\n }\n if (query.availableForPos !== undefined && item.availableForPos !== query.availableForPos) return false\n if (query.availableForDelivery !== undefined && item.availableForDelivery !== query.availableForDelivery) return false\n if (query.isFeatured !== undefined && item.isFeatured !== query.isFeatured) return false\n if (query.search) {\n const search = query.search.toLowerCase()\n return item.name.toLowerCase().includes(search)\n || (item.description?.toLowerCase().includes(search) ?? false)\n }\n return true\n}\n\nfunction paginate<T>(items: T[], page?: number, pageSize?: number): PaginatedResult<T> {\n const currentPage = page ?? 1\n const limit = pageSize ?? 50\n const start = (currentPage - 1) * limit\n return { data: items.slice(start, start + limit), total: items.length }\n}\n\nexport function createFayzMenuProvider(options: FayzMenuProviderOptions = {}): MenuDataProvider {\n const client = createFayzClient(options)\n const projectId = options.projectId\n const schema = options.schema\n const runtime = options.runtime\n const categoriesTable = options.categoriesTable ?? 'categories'\n const productsTable = options.productsTable ?? 'products'\n const categoryKind = options.categoryKind ?? DEFAULT_CATEGORY_KIND\n\n const tableOptions = { projectId, schema, runtime }\n\n async function getCategoriesRaw(): Promise<CategoryRow[]> {\n const response = await client.data.listRows<CategoryRow>({\n ...tableOptions,\n table: categoriesTable,\n filters: [\n { column: 'kind', operator: 'eq', value: categoryKind },\n { column: 'is_active', operator: 'eq', value: true },\n ],\n sortColumn: 'sort_order',\n sortDirection: 'asc',\n limit: 500,\n })\n return response.rows\n }\n\n async function getItemsRaw(): Promise<ProductRow[]> {\n const response = await client.data.listRows<ProductRow>({\n ...tableOptions,\n table: productsTable,\n filters: [{ column: 'is_active', operator: 'eq', value: true }],\n sortColumn: 'name',\n sortDirection: 'asc',\n limit: 1000,\n })\n return response.rows.filter((row) => {\n const metadata = menuMetadata(row)\n return metadata.kind === 'menu_item' || metadata.status != null || row.category_id != null\n })\n }\n\n async function getCategoryMap() {\n const categories = await getCategoriesRaw()\n return new Map(categories.map((category) => [category.id, category]))\n }\n\n async function getItems(): Promise<MenuItem[]> {\n const [rows, categoryMap] = await Promise.all([getItemsRaw(), getCategoryMap()])\n return rows.map((row) => rowToItem(row, row.category_id ? categoryMap.get(row.category_id)?.name : undefined))\n .sort((a, b) => a.sortOrder - b.sortOrder || a.name.localeCompare(b.name))\n }\n\n return {\n async getCategories() {\n const [categories, items] = await Promise.all([getCategoriesRaw(), getItemsRaw()])\n const counts = new Map<string, number>()\n for (const item of items) {\n if (item.category_id) counts.set(item.category_id, (counts.get(item.category_id) ?? 0) + 1)\n }\n return categories.map((category) => rowToCategory(category, counts.get(category.id) ?? 0))\n },\n\n async getCategoryById(id: string) {\n const response = await client.data.listRows<CategoryRow>({\n ...tableOptions,\n table: categoriesTable,\n filters: [{ column: 'id', operator: 'eq', value: id }],\n limit: 1,\n })\n return response.rows[0] ? rowToCategory(response.rows[0]) : null\n },\n\n async createCategory(input: CreateMenuCategoryInput) {\n const row = await client.data.createRow<CategoryRow>({\n ...tableOptions,\n table: categoriesTable,\n row: categoryPayload(input, categoryKind),\n })\n return rowToCategory(row)\n },\n\n async updateCategory(id: string, data: Partial<MenuCategory>) {\n const row = await client.data.updateRow<CategoryRow>({\n ...tableOptions,\n table: categoriesTable,\n primaryKeys: { id },\n row: {\n name: data.name,\n parent_id: data.parentId,\n icon: data.icon,\n color: data.color,\n sort_order: data.sortOrder,\n is_active: data.isActive,\n },\n })\n return rowToCategory(row)\n },\n\n async deleteCategory(id: string) {\n await client.data.updateRow<CategoryRow>({\n ...tableOptions,\n table: categoriesTable,\n primaryKeys: { id },\n row: { is_active: false },\n })\n },\n\n async reorderCategories(ids: string[]) {\n await Promise.all(ids.map((id, sortOrder) => this.updateCategory(id, { sortOrder })))\n },\n\n async getMenuItems(query: MenuItemQuery) {\n const items = (await getItems()).filter((item) => matchesClientQuery(item, query))\n return paginate(items, query.page, query.pageSize)\n },\n\n async getMenuItemById(id: string) {\n const response = await client.data.listRows<ProductRow>({\n ...tableOptions,\n table: productsTable,\n filters: [{ column: 'id', operator: 'eq', value: id }],\n limit: 1,\n })\n if (!response.rows[0]) return null\n const categoryMap = await getCategoryMap()\n const row = response.rows[0]\n return rowToItem(row, row.category_id ? categoryMap.get(row.category_id)?.name : undefined)\n },\n\n async createMenuItem(input: CreateMenuItemInput) {\n const row = await client.data.createRow<ProductRow>({\n ...tableOptions,\n table: productsTable,\n row: itemCreatePayload(input),\n })\n const categoryMap = await getCategoryMap()\n return rowToItem(row, row.category_id ? categoryMap.get(row.category_id)?.name : undefined)\n },\n\n async updateMenuItem(id: string, data: UpdateMenuItemInput) {\n const existing = await this.getMenuItemById(id)\n const row = await client.data.updateRow<ProductRow>({\n ...tableOptions,\n table: productsTable,\n primaryKeys: { id },\n row: itemUpdatePayload(data, existing ?? undefined),\n })\n const categoryMap = await getCategoryMap()\n return rowToItem(row, row.category_id ? categoryMap.get(row.category_id)?.name : undefined)\n },\n\n async deleteMenuItem(id: string) {\n await client.data.updateRow<ProductRow>({\n ...tableOptions,\n table: productsTable,\n primaryKeys: { id },\n row: { is_active: false },\n })\n },\n\n async toggleAvailability(id: string, field: 'status' | 'availableForPos' | 'availableForDelivery', value: unknown) {\n return this.updateMenuItem(id, { [field]: value } as UpdateMenuItemInput)\n },\n\n async reorderItems(categoryId: string, ids: string[]) {\n await Promise.all(ids.map(async (id, sortOrder) => {\n const existing = await this.getMenuItemById(id)\n await client.data.updateRow<ProductRow>({\n ...tableOptions,\n table: productsTable,\n primaryKeys: { id },\n row: { metadata: itemMetadata({ categoryId }, { ...existing?.metadata, [MENU_METADATA_KEY]: { ...existing?.metadata?.[MENU_METADATA_KEY] as Record<string, unknown>, sortOrder } }) },\n })\n }))\n },\n\n async getModifierGroups(): Promise<ModifierGroup[]> {\n return []\n },\n\n async createModifierGroup(): Promise<ModifierGroup> {\n throw new Error('Menu modifier groups require a dedicated Fayz table/broker contract.')\n },\n\n async updateModifierGroup(): Promise<ModifierGroup> {\n throw new Error('Menu modifier groups require a dedicated Fayz table/broker contract.')\n },\n\n async deleteModifierGroup(): Promise<void> {\n throw new Error('Menu modifier groups require a dedicated Fayz table/broker contract.')\n },\n\n async getSummary(): Promise<MenuSummary> {\n const [items, categories] = await Promise.all([getItems(), this.getCategories()])\n const prices = items.filter((item) => item.price > 0).map((item) => item.price)\n return {\n totalItems: items.length,\n availableItems: items.filter((item) => item.status === 'available').length,\n soldOutItems: items.filter((item) => item.status === 'sold_out').length,\n hiddenItems: items.filter((item) => item.status === 'hidden').length,\n categoryCount: categories.length,\n averagePrice: prices.length ? prices.reduce((sum, price) => sum + price, 0) / prices.length : 0,\n featuredCount: items.filter((item) => item.isFeatured).length,\n }\n },\n }\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { registerTranslations } from '@fayz-ai/core'\nimport type { EntityLookup } from '@fayz-ai/admin'\nimport { createSafeDataProvider } from '@fayz-ai/core'\nimport type { MenuDataProvider } from './data/types'\nimport { createMockMenuProvider } from './data/mock'\nimport { createSupabaseMenuProvider } from './data/supabase'\n// Exportado porque o cardápio é lido fora da tela de cardápio: o PDV de balcão\n// monta a grade de itens a partir DESTE provider, e não do plugin, para que a\n// grade e a tela mostrem o mesmo preço. Os plugins de mesas e reservas já\n// publicam os seus pelo mesmo motivo.\nexport { createSupabaseMenuProvider }\nimport { MIGRATIONS } from './migrations'\nimport { T } from './data/tables'\nimport { createMenuStore } from './store'\nimport { menuRegistries } from './data/registries'\nimport { menuLocales } from './locales'\nimport { PluginSettingsPanel } from '@fayz-ai/admin'\n\n// Lazy import page to avoid circular dependency issues\nconst MenuPage = React.lazy(() => import('./views/MenuPage').then((m) => ({ default: m.MenuPage })))\n\n// ---------------------------------------------------------------------------\n// Labels\n// ---------------------------------------------------------------------------\n\nexport interface MenuPluginLabels {\n pageTitle: string\n menuManager: string\n categories: string\n newItem: string\n}\n\nconst DEFAULT_LABELS: MenuPluginLabels = {\n pageTitle: 'Menu',\n menuManager: 'Menu Manager',\n categories: 'Categories',\n newItem: 'New Item',\n}\n\n// ---------------------------------------------------------------------------\n// Currency\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_CURRENCY = { code: 'BRL', locale: 'pt-BR', symbol: 'R$' }\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface MenuPluginOptions {\n modules?: {\n modifiers?: boolean\n deliveryPricing?: boolean\n }\n labels?: Partial<MenuPluginLabels>\n currency?: { code?: string; locale?: string; symbol?: string }\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n scope?: PluginScope\n verticalId?: VerticalId\n dataProvider?: MenuDataProvider\n menuItemLookup?: EntityLookup\n}\n\n// ---------------------------------------------------------------------------\n// Config resolver\n// ---------------------------------------------------------------------------\n\nfunction resolveConfig(options?: MenuPluginOptions) {\n return {\n modules: {\n modifiers: options?.modules?.modifiers !== false,\n deliveryPricing: options?.modules?.deliveryPricing === true,\n },\n labels: { ...DEFAULT_LABELS, ...options?.labels },\n currency: { ...DEFAULT_CURRENCY, ...options?.currency },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createMenuPlugin(options?: MenuPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n registerTranslations(menuLocales)\n // A host can still inject its own provider (an app-local one during\n // incubation); otherwise the plugin now stands on its own tables.\n const provider = options?.dataProvider ?? createSafeDataProvider<MenuDataProvider>(\n () => createSupabaseMenuProvider({ currencyCode: config.currency.code }),\n () => createMockMenuProvider(),\n )\n const store = createMenuStore(provider)\n\n const PageComponent: React.FC<any> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(MenuPage, { config, provider, store, registries: menuRegistries })\n )\n\n return {\n id: 'menu',\n defaultAgentRole: 'operations',\n name: config.labels.pageTitle,\n icon: 'UtensilsCrossed',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n // Digital menu serves both internal ops (saas) and online ordering\n // (ecommerce) — genuinely dual-surface, low confidence, revisit if a\n // real host disagrees.\n scaffolds: ['saas', 'ecommerce'],\n defaultEnabled: true,\n dependencies: [],\n declaredFeatures: [\n { id: 'menu', label: config.labels.pageTitle, group: config.labels.pageTitle },\n ],\n declaredLimits: [\n { key: 'menu_items', label: 'Menu items', table: T.items },\n ],\n migrations: MIGRATIONS.map((migration) => ({\n id: `menu-${migration.id}`,\n version: '1.0.0',\n sql: migration.sql,\n description: `plugin-menu ${migration.id}`,\n })),\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 5,\n label: config.labels.pageTitle,\n route: '/menu',\n icon: 'UtensilsCrossed',\n permission: { feature: 'menu', action: 'read' as const },\n },\n ],\n routes: [\n {\n path: '/menu',\n component: PageComponent,\n permission: { feature: 'menu', action: 'read' as const },\n },\n ],\n widgets: [],\n aiTools: [\n {\n id: 'menu.list-items',\n name: 'listMenuItems',\n description: 'Lists menu items, optionally filtered by category or status.',\n icon: 'UtensilsCrossed',\n mode: 'read' as const,\n category: 'Menu',\n parameters: {\n type: 'object' as const,\n properties: {\n category: { type: 'string' as const, description: 'Category name to filter by' },\n status: { type: 'string' as const, enum: ['available', 'sold_out', 'hidden'] },\n },\n },\n suggestions: [\n { label: 'What items are on the menu?' },\n { label: 'Which items are sold out right now?' },\n ],\n },\n {\n id: 'menu.list-menus',\n name: 'listMenus',\n description: 'Lists the menus of the place (regular, executive lunch, weekend) with when each one is served.',\n icon: 'UtensilsCrossed',\n mode: 'read' as const,\n category: 'Menu',\n parameters: { type: 'object' as const, properties: {} },\n suggestions: [\n { label: 'Quais cardápios existem?' },\n { label: 'Que cardápio está no ar agora?' },\n ],\n },\n {\n id: 'menu.toggle-availability',\n name: 'toggleMenuItemAvailability',\n description: 'Marks a menu item as available or sold out.',\n icon: 'ToggleLeft',\n mode: 'persist' as const,\n category: 'Menu',\n parameters: {\n type: 'object' as const,\n properties: {\n itemName: { type: 'string' as const, description: 'Menu item name' },\n status: { type: 'string' as const, enum: ['available', 'sold_out'] },\n },\n required: ['itemName', 'status'],\n },\n permission: { feature: 'menu', action: 'edit' as const },\n },\n ],\n registries: menuRegistries,\n settings: [\n {\n id: 'menu',\n label: config.labels.pageTitle,\n icon: 'UtensilsCrossed',\n component: (() => {\n const MenuSettingsTab: React.ComponentType<unknown> = () =>\n React.createElement(PluginSettingsPanel, {\n title: 'Menu Settings',\n registries: menuRegistries,\n routeBase: '/settings/menu',\n })\n MenuSettingsTab.displayName = 'MenuSettingsTab'\n return MenuSettingsTab\n })(),\n order: 20,\n permission: { feature: 'menu', action: 'read' as const },\n },\n ],\n locales: menuLocales,\n }\n}\n\nexport type { MenuDataProvider } from './data/types'\n// O cardápio em cache, com o ciclo de vida dele — ver ./data/catalog-cache.ts.\nexport {\n MENU_CATALOG_TTL, catalogAge, fetchMenuCatalog, invalidateMenuCatalog,\n loadMenuCatalog, menuCatalogKey, readCachedCatalog,\n} from './data/catalog-cache'\nexport type { CatalogAge, LoadMenuCatalogOptions, MenuCatalog } from './data/catalog-cache'\nexport { createFayzMenuProvider } from './data/platform'\nexport type { FayzMenuProviderOptions } from './data/platform'\nexport type { ResolvedMenuConfig } from './context'\n// Domain types — public so any host can implement a MenuDataProvider (e.g. an\n// app-local Supabase provider during plugin incubation).\nexport type * from './types'\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/data/mock.ts","../src/data/catalog-cache.ts","../src/data/tables.ts","../src/data/supabase.ts","../src/migrations/index.ts","../src/data/types.ts","../src/data/legacy-adapter.ts","../src/store.ts","../src/data/registries.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/settings/v1-settings.ts","../src/data/platform.ts","../src/index.ts"],"names":["now","placementId","tl","rowToCategory","rowToItem","paginate"],"mappings":"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AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA2jB/B,IAAM,wCAAA,GAA2C,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,CAAA;AAyHjD,IAAM,UAAA,GAAiD;AAAA,EAC5D,EAAE,EAAA,EAAI,cAAA,EAAgB,GAAA,EAAK,sBAAA,EAAuB;AAAA,EAClD,EAAE,EAAA,EAAI,gCAAA,EAAkC,GAAA,EAAK,wCAAA;AAC/C,CAAA;;;ACtmBO,SAAS,cAAc,QAAA,EAAqC;AACjE,EAAA,OAAO,OAAO,QAAA,CAAS,QAAA,KAAa,UAAA,IAAc,OAAO,SAAS,aAAA,KAAkB,UAAA;AACtF;;;AC1EO,IAAM,cAAA,GAAiB,aAAA;AAG9B,IAAM,WAAA,GAAc,CAAC,MAAA,KAAmB,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA;AACxD,IAAM,WAAW,CAAC,SAAA,KAAsB,SAAA,CAAU,OAAA,CAAQ,YAAY,EAAE,CAAA;AAejE,IAAM,kBAAA,GAAqB,aAAA;AAElC,SAAS,YAAY,IAAA,EAAqB;AACxC,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sDAAA,EAAyD,IAAI,CAAA,KAAA,CAAO,CAAA;AACtF;AAEO,SAAS,mBAAmB,QAAA,EAAkD;AAGnF,EAAA,eAAe,QAAA,GAAgC;AAC7C,IAAA,MAAM,SAAS,MAAM,QAAA,CAAS,aAAa,EAAE,QAAA,EAAU,KAAM,CAAA;AAC7D,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAEA,EAAA,MAAM,aAAa,YAA2B;AAC5C,IAAA,MAAM,CAAC,UAAA,EAAY,KAAK,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,QAAA,CAAS,aAAA,EAAc,EAAG,QAAA,EAAU,CAAC,CAAA;AACpF,IAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,cAAA;AAAA,MACJ,IAAA,EAAM,uBAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,SAAA,EAAW,CAAA;AAAA,MACX,QAAA,EAAU,CAAC,KAAA,EAAO,UAAA,EAAY,SAAS,CAAA;AAAA,MACvC,cAAc,EAAC;AAAA,MACf,cAAc,UAAA,CAAW,MAAA;AAAA,MACzB,WAAW,KAAA,CAAM,MAAA;AAAA,MACjB,QAAA,EAAU,OAAO,QAAA,IAAY,EAAA;AAAA,MAC7B,WAAW,KAAA,EAAO,SAAA,IAAA,qBAAiB,IAAA,CAAK,CAAC,GAAE,WAAA,EAAY;AAAA,MACvD,WAAW,KAAA,EAAO,SAAA,IAAA,qBAAiB,IAAA,CAAK,CAAC,GAAE,WAAA;AAAY,KACzD;AAAA,EACF,CAAA;AAKA,EAAA,MAAM,SAAA,GAA2C;AAAA,IAE/C,MAAM,QAAA,GAAW;AACf,MAAA,OAAO,CAAC,MAAM,UAAA,EAAY,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,MAAM,UAAA,GAAa;AAAE,MAAA,WAAA,CAAY,gBAAgB,CAAA;AAAA,IAAE,CAAA;AAAA,IACnD,MAAM,UAAA,GAAa;AAAE,MAAA,WAAA,CAAY,gBAAgB,CAAA;AAAA,IAAE,CAAA;AAAA,IACnD,MAAM,UAAA,GAAa;AAAE,MAAA,WAAA,CAAY,gBAAgB,CAAA;AAAA,IAAE,CAAA;AAAA,IACnD,MAAM,aAAA,GAAgB;AAAE,MAAA,WAAA,CAAY,gBAAgB,CAAA;AAAA,IAAE,CAAA;AAAA,IACtD,MAAM,YAAA,GAAe;AAAA,IAAoC,CAAA;AAAA,IAEzD,MAAM,WAAA,GAAsC;AAC1C,MAAA,MAAM,CAAC,UAAA,EAAY,KAAK,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,QAAA,CAAS,aAAA,EAAc,EAAG,QAAA,EAAU,CAAC,CAAA;AACpF,MAAA,MAAM,QAAA,GAA0B,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACrD,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,MAAA,EAAQ,cAAA;AAAA,QACR,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,WAAW,CAAA,CAAE,SAAA;AAAA,QACb,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,WAAW,CAAA,CAAE,SAAA;AAAA,QACb,WAAW,CAAA,CAAE;AAAA,OACf,CAAE,CAAA;AAKF,MAAA,MAAM,UAAU,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,UAAU,CAAA;AACjD,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,EAAA,EAAI,kBAAA;AAAA,UACJ,MAAA,EAAQ,cAAA;AAAA,UACR,IAAA,EAAM,iBAAA;AAAA,UACN,WAAW,MAAA,CAAO,gBAAA;AAAA,UAClB,QAAA,EAAU,IAAA;AAAA,UACV,QAAA,EAAU,OAAA,CAAQ,CAAC,CAAA,CAAG,QAAA;AAAA,UACtB,SAAA,EAAW,OAAA,CAAQ,CAAC,CAAA,CAAG,SAAA;AAAA,UACvB,SAAA,EAAW,OAAA,CAAQ,CAAC,CAAA,CAAG;AAAA,SACxB,CAAA;AAAA,MACH;AACA,MAAA,OAAO,QAAA;AAAA,IACT,CAAA;AAAA,IACA,MAAM,cAAc,KAAA,EAAO;AACzB,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,cAAA,CAAe,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,CAAA;AAC/F,MAAA,OAAO;AAAA,QACL,IAAI,QAAA,CAAS,EAAA;AAAA,QACb,MAAA,EAAQ,cAAA;AAAA,QACR,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,WAAW,QAAA,CAAS,SAAA;AAAA,QACpB,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,WAAW,QAAA,CAAS,SAAA;AAAA,QACpB,WAAW,QAAA,CAAS;AAAA,OACtB;AAAA,IACF,CAAA;AAAA,IACA,MAAM,aAAA,CAAc,EAAA,EAAI,IAAA,EAAM;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,cAAA,CAAe,EAAA,EAAI;AAAA,QACjD,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AACD,MAAA,OAAO;AAAA,QACL,IAAI,QAAA,CAAS,EAAA;AAAA,QACb,MAAA,EAAQ,cAAA;AAAA,QACR,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,WAAW,QAAA,CAAS,SAAA;AAAA,QACpB,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,WAAW,QAAA,CAAS,SAAA;AAAA,QACpB,WAAW,QAAA,CAAS;AAAA,OACtB;AAAA,IACF,CAAA;AAAA,IACA,MAAM,cAAc,EAAA,EAAI;AACtB,MAAA,MAAM,QAAA,CAAS,eAAe,EAAE,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,MAAM,eAAA,CAAgB,OAAA,EAAS,GAAA,EAAK;AAClC,MAAA,MAAM,QAAA,CAAS,kBAAkB,GAAG,CAAA;AAAA,IACtC,CAAA;AAAA,IAEA,MAAM,aAAA,GAA0C;AAC9C,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,EAAS;AAG7B,MAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QAC1B,EAAA,EAAI,WAAA,CAAY,IAAA,CAAK,EAAE,CAAA;AAAA,QACvB,SAAA,EAAW,KAAK,UAAA,IAAc,kBAAA;AAAA,QAC9B,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,SAAA,EAAW,KAAK,SAAA,IAAa,CAAA;AAAA,QAC7B,QAAA,EAAU,KAAK,MAAA,KAAW,QAAA;AAAA,QAC1B,UAAU,IAAA,CAAK;AAAA,OACjB,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAcA,MAAM,eAAe,KAAA,EAAO;AAC1B,MAAA,MAAM,EAAE,SAAA,EAAW,GAAG,IAAA,EAAK,GAAI,KAAA;AAC/B,MAAA,MAAM,UAAA,GACJ,SAAA,IAAa,SAAA,KAAc,kBAAA,GAAqB,YAAY,IAAA,CAAK,UAAA;AACnE,MAAA,OAAO,SAAS,cAAA,CAAe,EAAE,GAAG,IAAA,EAAM,YAAY,CAAA;AAAA,IACxD,CAAA;AAAA,IAEA,MAAM,UAAU,KAAA,EAAO;AAGrB,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,SAAA,KAAc,kBAAA,GAAqB,OAAO,KAAA,CAAM,SAAA;AACzE,MAAA,MAAM,SAAS,cAAA,CAAe,KAAA,CAAM,MAAA,EAAQ,EAAE,YAAY,CAAA;AAC1D,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,WAAA,CAAY,KAAA,CAAM,MAAM,CAAA;AAAA,QAC5B,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,SAAA,EAAW,MAAM,SAAA,IAAa,CAAA;AAAA,QAC9B,QAAA,EAAU,MAAM,QAAA,IAAY,IAAA;AAAA,QAC5B,QAAA,EAAU;AAAA,OACZ;AAAA,IACF,CAAA;AAAA,IACA,MAAM,eAAA,CAAgB,EAAA,EAAI,IAAA,EAAM;AAI9B,MAAA,IAAI,IAAA,CAAK,SAAA,EAAW,MAAM,QAAA,CAAS,cAAA,CAAe,QAAA,CAAS,EAAE,CAAA,EAAG,EAAE,UAAA,EAAY,IAAA,CAAK,SAAA,EAAW,CAAA;AAC9F,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QACA,SAAA,EAAW,KAAK,SAAA,IAAa,EAAA;AAAA,QAC7B,MAAA,EAAQ,SAAS,EAAE,CAAA;AAAA,QACnB,SAAA,EAAW,KAAK,SAAA,IAAa,CAAA;AAAA,QAC7B,QAAA,EAAU,KAAK,QAAA,IAAY,IAAA;AAAA,QAC3B,QAAA,EAAU;AAAA,OACZ;AAAA,IACF,CAAA;AAAA,IACA,MAAM,gBAAgB,EAAA,EAAI;AACxB,MAAA,MAAM,QAAA,CAAS,eAAe,QAAA,CAAS,EAAE,GAAG,EAAE,UAAA,EAAY,QAAW,CAAA;AAAA,IACvE,CAAA;AAAA,IACA,MAAM,iBAAA,CAAkB,SAAA,EAAW,YAAA,EAAc;AAC/C,MAAA,MAAM,SAAS,YAAA,CAAa,SAAA,EAAW,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA,IACnE,CAAA;AAAA,IACA,MAAM,aAAA,CAAc,EAAA,EAAI,WAAA,EAAa;AACnC,MAAA,MAAM,QAAA,CAAS,eAAe,QAAA,CAAS,EAAE,GAAG,EAAE,UAAA,EAAY,aAAa,CAAA;AAAA,IACzE;AAAA,GACF;AAEA,EAAA,OAAO,IAAI,KAAA,CAAM,EAAC,EAA2B;AAAA,IAC3C,GAAA,EAAK,CAAC,EAAA,EAAI,IAAA,KACP,UAAkB,IAAI,CAAA,IAAM,SAAiB,IAAI;AAAA,GACrD,CAAA;AACH;;;ACzGA,IAAI,aAAA,GAAgB,CAAA;AAEb,SAAS,gBAAgB,WAAA,EAAsD;AACpF,EAAA,MAAM,SAAA,GAAY,cAAc,WAAW,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAiC,SAAA,GAClC,WAAA,GACD,kBAAA,CAAmB,WAAW,CAAA;AAElC,EAAA,OAAO,WAAA,CAAyB,CAAC,GAAA,EAAK,GAAA,KAAQ;AAE9C,IAAA,eAAe,cAAA,CAAe,EAAA,EAAY,KAAA,EAAe,KAAA,EAA+B;AACtF,MAAA,MAAM,QAAA,GAAW,KAAI,CAAE,SAAA;AACvB,MAAA,GAAA,CAAI,EAAE,SAAA,EAAW,QAAA,CAAS,IAAI,CAAC,CAAA,KAAO,EAAE,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,CAAA,EAAG,CAAC,KAAK,GAAG,OAAM,GAAgB,CAAE,GAAG,CAAA;AAChG,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,CAAS,kBAAA,CAAmB,EAAA,EAAI,KAAA,EAAc,KAAK,CAAA;AAAA,MAC3D,SAAS,GAAA,EAAU;AACjB,QAAA,GAAA,CAAI,EAAE,SAAA,EAAW,QAAA,EAAU,CAAA;AAC3B,QAAA,KAAA,CAAM,KAAA,CAAM,GAAG,2BAAA,EAA6B,yCAAmC,GAAG,EAAE,WAAA,EAAa,GAAA,EAAK,OAAA,EAAS,CAAA;AAAA,MACjH;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,OAAO,EAAC;AAAA,MACR,YAAA,EAAc,KAAA;AAAA,MACd,YAAA,EAAc,IAAA;AAAA,MACd,UAAU,EAAC;AAAA,MACX,YAAY,EAAC;AAAA,MACb,WAAA,EAAa,KAAA;AAAA,MACb,YAAY,EAAC;AAAA,MACb,WAAW,EAAC;AAAA,MACZ,cAAA,EAAgB,CAAA;AAAA,MAChB,gBAAA,EAAkB,KAAA;AAAA,MAClB,eAAe,EAAC;AAAA,MAChB,gBAAgB,EAAC;AAAA,MACjB,gBAAA,EAAkB,KAAA;AAAA,MAClB,OAAA,EAAS,IAAA;AAAA,MACT,cAAA,EAAgB,KAAA;AAAA;AAAA,MAGhB,MAAM,UAAA,GAAa;AACjB,QAAA,GAAA,CAAI,EAAE,YAAA,EAAc,IAAA,EAAM,CAAA;AAC1B,QAAA,IAAI;AACF,UAAA,MAAM,QAAQ,MAAM,KAAA,CAAM,cAAc,MAAM,QAAA,CAAS,UAAU,CAAA;AACjE,UAAA,MAAM,MAAA,GAAS,KAAI,CAAE,YAAA,IAAgB,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,KAAI,CAAE,YAAY,IAC9E,GAAA,EAAI,CAAE,eACN,KAAA,CAAM,CAAC,GAAG,EAAA,IAAM,IAAA;AACpB,UAAA,GAAA,CAAI,EAAE,KAAA,EAAO,YAAA,EAAc,MAAA,EAAQ,YAAA,EAAc,OAAO,CAAA;AACxD,UAAA,IAAI,MAAA,EAAQ,MAAM,GAAA,EAAI,CAAE,iBAAiB,MAAM,CAAA;AAAA,QACjD,SAAS,GAAA,EAAU;AACjB,UAAA,GAAA,CAAI,EAAE,YAAA,EAAc,KAAA,EAAO,CAAA;AAC3B,UAAA,KAAA,CAAM,KAAA,CAAM,GAAG,0BAAA,EAA4B,iDAAwC,GAAG,EAAE,WAAA,EAAa,GAAA,EAAK,OAAA,EAAS,CAAA;AAAA,QACrH;AAAA,MACF,CAAA;AAAA,MAEA,MAAM,SAAS,MAAA,EAAQ;AACrB,QAAA,GAAA,CAAI,EAAE,YAAA,EAAc,MAAA,EAAQ,CAAA;AAC5B,QAAA,MAAM,GAAA,EAAI,CAAE,gBAAA,CAAiB,MAAM,CAAA;AAAA,MACrC,CAAA;AAAA,MAEA,MAAM,iBAAiB,MAAA,EAAQ;AAC7B,QAAA,GAAA,CAAI,EAAE,WAAA,EAAa,IAAA,EAAM,CAAA;AACzB,QAAA,IAAI;AACF,UAAA,MAAM,CAAC,QAAA,EAAU,UAAU,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,YAC/C,QAAA,CAAS,YAAY,MAAM,CAAA;AAAA,YAC3B,QAAA,CAAS,cAAc,MAAM;AAAA,WAC9B,CAAA;AACD,UAAA,GAAA,CAAI,EAAE,QAAA,EAAU,UAAA,EAAY,WAAA,EAAa,OAAO,CAAA;AAAA,QAClD,SAAS,GAAA,EAAU;AACjB,UAAA,GAAA,CAAI,EAAE,WAAA,EAAa,KAAA,EAAO,CAAA;AAC1B,UAAA,KAAA,CAAM,KAAA,CAAM,GAAG,yBAAA,EAA2B,+CAAsC,GAAG,EAAE,WAAA,EAAa,GAAA,EAAK,OAAA,EAAS,CAAA;AAAA,QAClH;AAAA,MACF,CAAA;AAAA,MAEA,MAAM,cAAA,CAAe,KAAA,GAAQ,EAAC,EAAG;AAC/B,QAAA,GAAA,CAAI,EAAE,gBAAA,EAAkB,IAAA,EAAM,aAAA,EAAe,OAAO,CAAA;AACpD,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,YAAA,CAAa,KAAK,CAAA;AAChD,UAAA,GAAA,CAAI,EAAE,WAAW,MAAA,CAAO,IAAA,EAAM,gBAAgB,MAAA,CAAO,KAAA,EAAO,gBAAA,EAAkB,KAAA,EAAO,CAAA;AAAA,QACvF,SAAS,GAAA,EAAU;AACjB,UAAA,GAAA,CAAI,EAAE,gBAAA,EAAkB,KAAA,EAAO,CAAA;AAC/B,UAAA,KAAA,CAAM,KAAA,CAAM,GAAG,0BAAA,EAA4B,0CAAoC,GAAG,EAAE,WAAA,EAAa,GAAA,EAAK,OAAA,EAAS,CAAA;AAAA,QACjH;AAAA,MACF,CAAA;AAAA,MAEA,MAAM,mBAAA,GAAsB;AAC1B,QAAA,GAAA,CAAI,EAAE,gBAAA,EAAkB,IAAA,EAAM,CAAA;AAC9B,QAAA,IAAI;AACF,UAAA,MAAM,iBAAiB,MAAM,KAAA,CAAM,kBAAkB,MAAM,QAAA,CAAS,mBAAmB,CAAA;AACvF,UAAA,GAAA,CAAI,EAAE,cAAA,EAAgB,gBAAA,EAAkB,KAAA,EAAO,CAAA;AAAA,QACjD,CAAA,CAAA,MAAQ;AACN,UAAA,GAAA,CAAI,EAAE,gBAAA,EAAkB,KAAA,EAAO,cAAA,EAAgB,IAAI,CAAA;AAAA,QACrD;AAAA,MACF,CAAA;AAAA,MAEA,MAAM,YAAA,GAAe;AACnB,QAAA,GAAA,CAAI,EAAE,cAAA,EAAgB,IAAA,EAAM,CAAA;AAC5B,QAAA,IAAI;AACF,UAAA,MAAM,UAAU,MAAM,KAAA,CAAM,gBAAgB,MAAM,QAAA,CAAS,YAAY,CAAA;AACvE,UAAA,GAAA,CAAI,EAAE,OAAA,EAAS,cAAA,EAAgB,KAAA,EAAO,CAAA;AAAA,QACxC,CAAA,CAAA,MAAQ;AACN,UAAA,GAAA,CAAI,EAAE,cAAA,EAAgB,KAAA,EAAO,CAAA;AAAA,QAC/B;AAAA,MACF,CAAA;AAAA;AAAA,MAGA,MAAM,WAAW,KAAA,EAAO;AACtB,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AAC5C,QAAA,GAAA,CAAI,EAAE,OAAO,CAAC,GAAG,KAAI,CAAE,KAAA,EAAO,IAAI,CAAA,EAAG,CAAA;AACrC,QAAA,MAAM,GAAA,EAAI,CAAE,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA;AAC5B,QAAA,KAAA,CAAM,OAAA,CAAQ,EAAA,CAAG,cAAA,EAAgB,oBAAiB,CAAC,CAAA;AACnD,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MAEA,MAAM,UAAA,CAAW,EAAA,EAAI,IAAA,EAAM;AACzB,QAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,UAAA,CAAW,IAAI,IAAI,CAAA;AAClD,QAAA,GAAA,CAAI,EAAE,KAAA,EAAO,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,OAAO,EAAA,GAAK,EAAE,GAAG,CAAA,EAAG,GAAG,SAAQ,GAAI,CAAE,GAAG,CAAA;AAAA,MACjF,CAAA;AAAA,MAEA,MAAM,WAAW,EAAA,EAAI;AACnB,QAAA,MAAM,QAAA,CAAS,WAAW,EAAE,CAAA;AAC5B,QAAA,MAAM,KAAA,GAAQ,KAAI,CAAE,KAAA,CAAM,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA;AACnD,QAAA,GAAA,CAAI,EAAE,OAAO,CAAA;AACb,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,EAAG,EAAA,IAAM,IAAA;AAC7B,QAAA,GAAA,CAAI,EAAE,cAAc,IAAA,EAAM,QAAA,EAAU,EAAC,EAAG,UAAA,EAAY,EAAC,EAAG,CAAA;AACxD,QAAA,IAAI,IAAA,EAAM,MAAM,GAAA,EAAI,CAAE,iBAAiB,IAAI,CAAA;AAC3C,QAAA,KAAA,CAAM,OAAA,CAAQ,EAAA,CAAG,cAAA,EAAgB,yBAAmB,CAAC,CAAA;AAAA,MACvD,CAAA;AAAA,MAEA,MAAM,aAAA,CAAc,EAAA,EAAI,IAAA,EAAM;AAC5B,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,aAAA,CAAc,IAAI,IAAI,CAAA;AAClD,QAAA,MAAM,GAAA,GAAM,UAAA,EAAW;AACvB,QAAA,MAAM,GAAA,EAAI,CAAE,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA;AAC5B,QAAA,KAAA,CAAM,OAAA,CAAQ,EAAA,CAAG,iBAAA,EAAmB,uBAAoB,CAAA,EAAG,EAAE,WAAA,EAAa,EAAA,CAAG,8DAAA,EAA2D,wEAA6D,CAAA,EAAG,CAAA;AACxM,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA;AAAA,MAGA,MAAM,aAAA,CAAc,IAAA,EAAM,KAAA,EAAO;AAC/B,QAAA,MAAM,MAAA,GAAS,KAAI,CAAE,YAAA;AACrB,QAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAIpB,QAAA,MAAM,MAAA,GAAS,CAAA,QAAA,EAAW,EAAE,aAAa,CAAA,CAAA;AACzC,QAAA,MAAM,UAAA,GAA0B;AAAA,UAC9B,EAAA,EAAI,MAAA;AAAA,UACJ,MAAA;AAAA,UACA,IAAA;AAAA,UACA,SAAA,EAAW,KAAA,EAAO,SAAA,IAAa,GAAA,GAAM,QAAA,CAAS,MAAA;AAAA,UAC9C,QAAA,EAAU,OAAO,QAAA,IAAY,IAAA;AAAA,UAC7B,YAAA,EAAc,KAAA,EAAO,YAAA,IAAgB,EAAC;AAAA,UACtC,QAAA,EAAU,EAAA;AAAA,UACV,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UAClC,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,SACpC;AACA,QAAA,GAAA,CAAI;AAAA,UACF,UAAU,CAAC,GAAG,GAAA,EAAI,CAAE,UAAU,UAAU,CAAA;AAAA,UACxC,YAAY,CAAC,GAAG,GAAA,EAAI,CAAE,YAAY,MAAM;AAAA,SACzC,CAAA;AACD,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,aAAA,CAAc,EAAE,MAAA,EAAQ,IAAA,EAAM,GAAG,KAAA,EAAO,CAAA;AACvE,UAAA,GAAA,CAAI;AAAA,YACF,QAAA,EAAU,GAAA,EAAI,CAAE,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,EAAA,KAAO,MAAA,GAAS,OAAA,GAAU,CAAE,CAAA;AAAA,YACnE,UAAA,EAAY,KAAI,CAAE,UAAA,CAAW,OAAO,CAAC,EAAA,KAAO,OAAO,MAAM;AAAA,WAC1D,CAAA;AACD,UAAA,OAAO,OAAA;AAAA,QACT,SAAS,GAAA,EAAU;AACjB,UAAA,GAAA,CAAI;AAAA,YACF,QAAA,EAAU,KAAI,CAAE,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA;AAAA,YACtD,UAAA,EAAY,KAAI,CAAE,UAAA,CAAW,OAAO,CAAC,EAAA,KAAO,OAAO,MAAM;AAAA,WAC1D,CAAA;AACD,UAAA,KAAA,CAAM,KAAA,CAAM,GAAG,8BAAA,EAAgC,4CAAgC,GAAG,EAAE,WAAA,EAAa,GAAA,EAAK,OAAA,EAAS,CAAA;AAC/G,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF,CAAA;AAAA,MAEA,MAAM,aAAA,CAAc,EAAA,EAAI,IAAA,EAAM;AAC5B,QAAA,MAAM,QAAA,GAAW,KAAI,CAAE,QAAA;AACvB,QAAA,GAAA,CAAI,EAAE,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,CAAC,MAAO,CAAA,CAAE,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,CAAA,EAAG,GAAG,MAAK,GAAmB,CAAE,GAAG,CAAA;AAC3F,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,CAAS,aAAA,CAAc,EAAA,EAAI,IAAI,CAAA;AAAA,QACvC,SAAS,GAAA,EAAU;AACjB,UAAA,GAAA,CAAI,EAAE,QAAA,EAAU,QAAA,EAAU,CAAA;AAC1B,UAAA,KAAA,CAAM,KAAA,CAAM,GAAG,4BAAA,EAA8B,6CAAiC,GAAG,EAAE,WAAA,EAAa,GAAA,EAAK,OAAA,EAAS,CAAA;AAAA,QAChH;AAAA,MACF,CAAA;AAAA,MAEA,MAAM,cAAc,EAAA,EAAI;AACtB,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,CAAS,cAAc,EAAE,CAAA;AAC/B,UAAA,GAAA,CAAI;AAAA,YACF,QAAA,EAAU,KAAI,CAAE,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA;AAAA,YAClD,UAAA,EAAY,KAAI,CAAE,UAAA,CAAW,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,EAAE;AAAA,WAC9D,CAAA;AACD,UAAA,KAAA,CAAM,OAAA,CAAQ,EAAA,CAAG,iBAAA,EAAmB,sBAAgB,CAAC,CAAA;AAAA,QACvD,SAAS,GAAA,EAAU;AACjB,UAAA,KAAA,CAAM,KAAA,CAAM,GAAG,8BAAA,EAAgC,8CAAkC,GAAG,EAAE,WAAA,EAAa,GAAA,EAAK,OAAA,EAAS,CAAA;AAAA,QACnH;AAAA,MACF,CAAA;AAAA,MAEA,MAAM,gBAAgB,UAAA,EAAY;AAChC,QAAA,MAAM,MAAA,GAAS,KAAI,CAAE,YAAA;AACrB,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,MAAM,QAAA,GAAW,KAAI,CAAE,QAAA;AAEvB,QAAA,GAAA,CAAI;AAAA,UACF,QAAA,EAAU,UAAA,CACP,GAAA,CAAI,CAAC,IAAI,KAAA,KAAU;AAClB,YAAA,MAAM,UAAU,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAChD,YAAA,OAAO,UAAU,EAAE,GAAG,OAAA,EAAS,SAAA,EAAW,OAAM,GAAI,IAAA;AAAA,UACtD,CAAC,CAAA,CACA,MAAA,CAAO,OAAO;AAAA,SAClB,CAAA;AACD,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,CAAS,eAAA,CAAgB,MAAA,EAAQ,UAAU,CAAA;AAAA,QACnD,SAAS,GAAA,EAAU;AACjB,UAAA,GAAA,CAAI,EAAE,QAAA,EAAU,QAAA,EAAU,CAAA;AAC1B,UAAA,KAAA,CAAM,KAAA,CAAM,GAAG,8BAAA,EAAgC,uCAAiC,GAAG,EAAE,WAAA,EAAa,GAAA,EAAK,OAAA,EAAS,CAAA;AAAA,QAClH;AAAA,MACF,CAAA;AAAA;AAAA,MAGA,MAAM,gBAAA,CAAiB,SAAA,EAAW,KAAA,EAAO;AAGvC,QAAA,MAAM,MAAA,GAAS,CAAA,QAAA,EAAW,EAAE,aAAa,CAAA,CAAA;AACzC,QAAA,MAAMD,IAAAA,GAAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,QAAA,MAAM,cAAA,GAA2B;AAAA,UAC/B,EAAA,EAAI,MAAA;AAAA,UACJ,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,aAAa,KAAA,CAAM,WAAA;AAAA,UACnB,KAAA,EAAO,MAAM,KAAA,IAAS,CAAA;AAAA,UACtB,QAAA,EAAU,EAAA;AAAA,UACV,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,MAAA,EAAQ,MAAM,MAAA,IAAU,WAAA;AAAA,UACxB,QAAA,EAAU,IAAA;AAAA,UACV,eAAA,EAAiB,MAAM,eAAA,IAAmB,IAAA;AAAA,UAC1C,oBAAA,EAAsB,MAAM,oBAAA,IAAwB,IAAA;AAAA,UACpD,eAAe,KAAA,CAAM,aAAA;AAAA,UACrB,iBAAiB,KAAA,CAAM,eAAA;AAAA,UACvB,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,EAAC;AAAA,UAC/B,WAAA,EAAa,KAAA,CAAM,WAAA,IAAe,EAAC;AAAA,UACnC,SAAA,EAAW,CAAA;AAAA,UACX,UAAA,EAAY,MAAM,UAAA,IAAc,KAAA;AAAA,UAChC,QAAA,EAAU,EAAA;AAAA,UACV,SAAA,EAAWA,IAAAA;AAAA,UACX,SAAA,EAAWA;AAAA,SACb;AACA,QAAA,MAAM,mBAAA,GAAqC;AAAA,UACzC,EAAA,EAAI,qBAAqB,aAAa,CAAA,CAAA;AAAA,UACtC,SAAA;AAAA,UACA,MAAA,EAAQ,MAAA;AAAA,UACR,SAAA,EAAW,GAAA,EAAI,CAAE,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,SAAS,CAAA,CAAE,MAAA;AAAA,UACrE,QAAA,EAAU,IAAA;AAAA,UACV,QAAA,EAAU;AAAA,SACZ;AACA,QAAA,GAAA,CAAI;AAAA,UACF,WAAW,CAAC,GAAG,GAAA,EAAI,CAAE,WAAW,cAAc,CAAA;AAAA,UAC9C,YAAY,CAAC,GAAG,GAAA,EAAI,CAAE,YAAY,mBAAmB,CAAA;AAAA,UACrD,YAAY,CAAC,GAAG,KAAI,CAAE,UAAA,EAAY,oBAAoB,EAAE;AAAA,SACzD,CAAA;AACD,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,cAAA,CAAe,EAAE,GAAG,KAAA,EAAO,WAAW,CAAA;AAClE,UAAA,MAAM,MAAA,GAAS,KAAI,CAAE,YAAA;AACrB,UAAA,GAAA,CAAI,EAAE,SAAA,EAAW,GAAA,EAAI,CAAE,UAAU,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,EAAA,KAAO,MAAA,GAAS,IAAA,GAAO,CAAE,GAAG,CAAA;AAC3E,UAAA,IAAI,MAAA,EAAQ,MAAM,GAAA,EAAI,CAAE,iBAAiB,MAAM,CAAA;AAC/C,UAAA,GAAA,CAAI,EAAE,UAAA,EAAY,GAAA,EAAI,CAAE,UAAA,CAAW,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,KAAO,mBAAA,CAAoB,EAAE,CAAA,EAAG,CAAA;AAClF,UAAA,KAAK,GAAA,GAAM,YAAA,EAAa;AACxB,UAAA,OAAO,IAAA;AAAA,QACT,SAAS,GAAA,EAAU;AACjB,UAAA,GAAA,CAAI;AAAA,YACF,SAAA,EAAW,KAAI,CAAE,SAAA,CAAU,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA;AAAA,YACxD,UAAA,EAAY,GAAA,EAAI,CAAE,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,mBAAA,CAAoB,EAAE,CAAA;AAAA,YAC1E,UAAA,EAAY,KAAI,CAAE,UAAA,CAAW,OAAO,CAAC,EAAA,KAAO,EAAA,KAAO,mBAAA,CAAoB,EAAE;AAAA,WAC1E,CAAA;AACD,UAAA,KAAA,CAAM,KAAA,CAAM,GAAG,2BAAA,EAA6B,qCAA+B,GAAG,EAAE,WAAA,EAAa,GAAA,EAAK,OAAA,EAAS,CAAA;AAC3G,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF,CAAA;AAAA,MAEA,MAAM,iBAAA,CAAkB,SAAA,EAAW,MAAA,EAAQ;AACzC,QAAA,IAAI;AACF,UAAA,MAAM,YAAY,MAAM,QAAA,CAAS,UAAU,EAAE,SAAA,EAAW,QAAQ,CAAA;AAChE,UAAA,GAAA,CAAI,EAAE,UAAA,EAAY,CAAC,GAAG,GAAA,GAAM,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,EAAA,KAAO,SAAA,CAAU,EAAE,CAAA,EAAG,SAAS,GAAG,CAAA;AAAA,QAC3F,SAAS,GAAA,EAAU;AACjB,UAAA,KAAA,CAAM,KAAA,CAAM,GAAG,8BAAA,EAAgC,iDAAwC,GAAG,EAAE,WAAA,EAAa,GAAA,EAAK,OAAA,EAAS,CAAA;AAAA,QACzH;AAAA,MACF,CAAA;AAAA,MAEA,MAAM,gBAAgBC,YAAAA,EAAa;AACjC,QAAA,MAAM,QAAA,GAAW,KAAI,CAAE,UAAA;AACvB,QAAA,GAAA,CAAI,EAAE,UAAA,EAAY,QAAA,CAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,EAAA,KAAOA,YAAW,CAAA,EAAG,CAAA;AAChE,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,CAAS,gBAAgBA,YAAW,CAAA;AAAA,QAC5C,SAAS,GAAA,EAAU;AACjB,UAAA,GAAA,CAAI,EAAE,UAAA,EAAY,QAAA,EAAU,CAAA;AAC5B,UAAA,KAAA,CAAM,KAAA,CAAM,GAAG,mCAAA,EAAqC,+CAAsC,GAAG,EAAE,WAAA,EAAa,GAAA,EAAK,OAAA,EAAS,CAAA;AAAA,QAC5H;AAAA,MACF,CAAA;AAAA,MAEA,MAAM,iBAAA,CAAkBA,YAAAA,EAAa,KAAA,EAAO;AAC1C,QAAA,MAAM,QAAA,GAAW,KAAI,CAAE,UAAA;AACvB,QAAA,GAAA,CAAI,EAAE,UAAA,EAAY,QAAA,CAAS,GAAA,CAAI,CAAC,MAAO,CAAA,CAAE,EAAA,KAAOA,YAAAA,GAAc,EAAE,GAAG,CAAA,EAAG,aAAA,EAAe,OAAM,GAAI,CAAE,GAAG,CAAA;AACpG,QAAA,IAAI;AACF,UAAA,MAAM,SAAS,eAAA,CAAgBA,YAAAA,EAAa,EAAE,aAAA,EAAe,OAAO,CAAA;AAAA,QACtE,SAAS,GAAA,EAAU;AACjB,UAAA,GAAA,CAAI,EAAE,UAAA,EAAY,QAAA,EAAU,CAAA;AAC5B,UAAA,KAAA,CAAM,KAAA,CAAM,GAAG,0BAAA,EAA4B,0CAAiC,GAAG,EAAE,WAAA,EAAa,GAAA,EAAK,OAAA,EAAS,CAAA;AAAA,QAC9G;AAAA,MACF,CAAA;AAAA,MAEA,MAAM,iBAAA,CAAkB,SAAA,EAAW,UAAA,EAAY;AAC7C,QAAA,MAAM,QAAA,GAAW,KAAI,CAAE,UAAA;AACvB,QAAA,MAAM,SAAA,GAAY,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM;AACpC,UAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,CAAQ,CAAA,CAAE,EAAE,CAAA;AACrC,UAAA,OAAO,SAAS,CAAA,GAAI,EAAE,GAAG,CAAA,EAAG,SAAA,EAAW,OAAM,GAAI,CAAA;AAAA,QACnD,CAAC,CAAA;AACD,QAAA,GAAA,CAAI,EAAE,UAAA,EAAY,SAAA,EAAW,CAAA;AAC7B,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,CAAS,iBAAA,CAAkB,SAAA,EAAW,UAAU,CAAA;AAAA,QACxD,SAAS,GAAA,EAAU;AACjB,UAAA,GAAA,CAAI,EAAE,UAAA,EAAY,QAAA,EAAU,CAAA;AAC5B,UAAA,KAAA,CAAM,KAAA,CAAM,GAAG,8BAAA,EAAgC,uCAAiC,GAAG,EAAE,WAAA,EAAa,GAAA,EAAK,OAAA,EAAS,CAAA;AAAA,QAClH;AAAA,MACF,CAAA;AAAA,MAEA,MAAM,aAAA,CAAcA,YAAAA,EAAa,WAAA,EAAa,OAAA,EAAS;AACrD,QAAA,MAAM,QAAA,GAAW,KAAI,CAAE,UAAA;AACvB,QAAA,GAAA,CAAI;AAAA,UACF,YAAY,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KACxB,EAAE,EAAA,KAAOA,YAAAA,GAAc,EAAE,GAAG,GAAG,SAAA,EAAW,WAAA,EAAa,SAAA,EAAW,OAAA,KAAY,CAAC;AAAA,SAClF,CAAA;AACD,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,CAAS,aAAA,CAAcA,YAAAA,EAAa,WAAA,EAAa,OAAO,CAAA;AAAA,QAChE,SAAS,GAAA,EAAU;AACjB,UAAA,GAAA,CAAI,EAAE,UAAA,EAAY,QAAA,EAAU,CAAA;AAC5B,UAAA,KAAA,CAAM,KAAA,CAAM,GAAG,yBAAA,EAA2B,qCAA+B,GAAG,EAAE,WAAA,EAAa,GAAA,EAAK,OAAA,EAAS,CAAA;AAAA,QAC3G;AAAA,MACF,CAAA;AAAA;AAAA,MAGA,MAAM,cAAA,CAAe,EAAA,EAAI,IAAA,EAAM;AAC7B,QAAA,MAAM,QAAA,GAAW,KAAI,CAAE,SAAA;AACvB,QAAA,GAAA,CAAI,EAAE,SAAA,EAAW,QAAA,CAAS,GAAA,CAAI,CAAC,MAAO,CAAA,CAAE,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,CAAA,EAAG,GAAG,MAAK,GAAgB,CAAE,GAAG,CAAA;AACzF,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,cAAA,CAAe,IAAI,IAAI,CAAA;AACtD,UAAA,GAAA,CAAI,EAAE,SAAA,EAAW,GAAA,EAAI,CAAE,UAAU,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,EAAA,KAAO,EAAA,GAAK,OAAA,GAAU,CAAE,GAAG,CAAA;AAAA,QAC5E,SAAS,GAAA,EAAU;AACjB,UAAA,GAAA,CAAI,EAAE,SAAA,EAAW,QAAA,EAAU,CAAA;AAC3B,UAAA,KAAA,CAAM,KAAA,CAAM,GAAG,yBAAA,EAA2B,sCAAgC,GAAG,EAAE,WAAA,EAAa,GAAA,EAAK,OAAA,EAAS,CAAA;AAAA,QAC5G;AAAA,MACF,CAAA;AAAA,MAEA,MAAM,eAAe,EAAA,EAAI;AACvB,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,CAAS,eAAe,EAAE,CAAA;AAChC,UAAA,GAAA,CAAI;AAAA,YACF,SAAA,EAAW,KAAI,CAAE,SAAA,CAAU,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA;AAAA,YACpD,UAAA,EAAY,KAAI,CAAE,UAAA,CAAW,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,EAAE;AAAA,WAC3D,CAAA;AACD,UAAA,KAAK,GAAA,GAAM,YAAA,EAAa;AACxB,UAAA,KAAA,CAAM,OAAA,CAAQ,EAAA,CAAG,cAAA,EAAgB,eAAe,CAAC,CAAA;AAAA,QACnD,SAAS,GAAA,EAAU;AACjB,UAAA,KAAA,CAAM,KAAA,CAAM,GAAG,2BAAA,EAA6B,uCAAiC,GAAG,EAAE,WAAA,EAAa,GAAA,EAAK,OAAA,EAAS,CAAA;AAAA,QAC/G;AAAA,MACF,CAAA;AAAA,MAEA,MAAM,iBAAA,CAAkB,EAAA,EAAI,SAAA,EAAW;AACrC,QAAA,MAAM,MAAA,GAAS,KAAI,CAAE,SAAA,CAAU,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA;AACtD,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,MAAM,GAAA,EAAI,CAAE,gBAAA,CAAiB,SAAA,IAAa,KAAI,CAAE,UAAA,CAAW,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,EAAE,CAAA,EAAG,aAAa,EAAA,EAAI;AAAA,UACxG,IAAA,EAAM,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,WAAA,CAAA;AAAA,UACpB,aAAa,MAAA,CAAO,WAAA;AAAA,UACpB,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,iBAAiB,MAAA,CAAO,eAAA;AAAA,UACxB,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,aAAa,MAAA,CAAO,WAAA;AAAA,UACpB,iBAAiB,MAAA,CAAO,eAAA;AAAA,UACxB,sBAAsB,MAAA,CAAO,oBAAA;AAAA,UAC7B,eAAe,MAAA,CAAO;AAAA,SACvB,CAAA;AAAA,MACH,CAAA;AAAA,MAEA,MAAM,aAAA,CAAc,EAAA,EAAI,MAAA,EAAQ;AAC9B,QAAA,MAAM,cAAA,CAAe,EAAA,EAAI,QAAA,EAAU,MAAM,CAAA;AAAA,MAC3C,CAAA;AAAA,MAEA,MAAM,kBAAA,CAAmB,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO;AACzC,QAAA,MAAM,cAAA,CAAe,EAAA,EAAI,KAAA,EAAO,KAAK,CAAA;AAAA,MACvC,CAAA;AAAA,MAEA,MAAM,WAAA,CAAY,IAAA,EAAM,IAAA,EAAM;AAC5B,QAAA,IAAI,CAAC,SAAS,WAAA,EAAa;AACzB,UAAA,KAAA,CAAM,KAAA,CAAM,EAAA,CAAG,gDAAA,EAAkD,0DAAiD,CAAC,CAAA;AACnH,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,IAAI;AACF,UAAA,OAAO,MAAM,QAAA,CAAS,WAAA,CAAY,IAAA,EAAM,IAAI,CAAA;AAAA,QAC9C,SAAS,GAAA,EAAU;AACjB,UAAA,KAAA,CAAM,MAAM,sCAAA,EAAkC,EAAE,WAAA,EAAa,GAAA,EAAK,SAAS,CAAA;AAC3E,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF,CAAA;AAAA;AAAA,MAGA,UAAA,EAAY,KAAA;AAAA,MACZ,KAAA,EAAO,IAAA;AAAA,MAEP,MAAM,aAAA,CAAc,MAAA,EAAQ,OAAA,EAAS;AACnC,QAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACzB,QAAA,GAAA,CAAI,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA;AACxB,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAM,CAAA;AACnC,UAAA,MAAM,MAAA,GAAS,eAAe,MAAM,CAAA;AACpC,UAAA,IAAI,MAAA,CAAO,UAAU,CAAA,EAAG;AACtB,YAAA,GAAA,CAAI,EAAE,UAAA,EAAY,KAAA,EAAO,CAAA;AACzB,YAAA,KAAA,CAAM,KAAA,CAAM,EAAA,CAAG,4CAAA,EAA8C,wCAAqC,CAAA,EAAG;AAAA,cACnG,WAAA,EAAa,EAAA,CAAG,mDAAA,EAAqD,yDAAsD;AAAA,aAC5H,CAAA;AACD,YAAA;AAAA,UACF;AAGA,UAAA,MAAM,QAAA,GAAW,KAAI,CAAE,QAAA;AACvB,UAAA,IAAI,GAAA,GAAM,CAAA;AACV,UAAA,MAAM,KAAA,GAAmB;AAAA,YACvB,MAAA,EAAQ,OAAA;AAAA,YACR,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,QAAA,EAAU,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,cAC1C,GAAA,EAAK,CAAA,GAAA,EAAM,EAAE,GAAG,CAAA,CAAA;AAAA,cAChB,MAAM,OAAA,CAAQ,IAAA;AAAA,cACd,eAAA,EAAiB,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,KAAM,aAAA,CAAc,OAAA,CAAQ,IAAI,CAAC,CAAA,EAAG,EAAA;AAAA,cAC9F,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,gBAClC,GAAA,EAAK,CAAA,GAAA,EAAM,EAAE,GAAG,CAAA,CAAA;AAAA,gBAChB,MAAM,IAAA,CAAK,IAAA;AAAA,gBACX,OAAO,IAAA,CAAK,KAAA;AAAA,gBACZ,aAAa,IAAA,CAAK;AAAA,eACpB,CAAE;AAAA,aACJ,CAAE;AAAA,WACJ;AACA,UAAA,GAAA,CAAI,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,CAAA;AAAA,QAClC,SAAS,GAAA,EAAU;AACjB,UAAA,GAAA,CAAI,EAAE,UAAA,EAAY,KAAA,EAAO,CAAA;AACzB,UAAA,KAAA,CAAM,KAAA,CAAM,GAAG,6BAAA,EAA+B,8BAA2B,GAAG,EAAE,WAAA,EAAa,GAAA,EAAK,OAAA,EAAS,CAAA;AAAA,QAC3G;AAAA,MACF,CAAA;AAAA,MAEA,eAAA,CAAgB,UAAA,EAAY,OAAA,EAAS,KAAA,EAAO;AAC1C,QAAA,MAAM,KAAA,GAAQ,KAAI,CAAE,KAAA;AACpB,QAAA,IAAI,CAAC,KAAA,EAAO;AACZ,QAAA,GAAA,CAAI;AAAA,UACF,KAAA,EAAO;AAAA,YACL,GAAG,KAAA;AAAA,YACH,QAAA,EAAU,MAAM,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,GAAA,KAAQ,UAAA,GAAa,OAAA,GAAU;AAAA,cAC/E,GAAG,OAAA;AAAA,cACH,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAU,IAAA,CAAK,GAAA,KAAQ,OAAA,GAAU,EAAE,GAAG,IAAA,EAAM,GAAG,KAAA,KAAU,IAAK;AAAA,aACzF;AAAA;AACH,SACD,CAAA;AAAA,MACH,CAAA;AAAA,MAEA,eAAA,CAAgB,YAAY,OAAA,EAAS;AACnC,QAAA,MAAM,KAAA,GAAQ,KAAI,CAAE,KAAA;AACpB,QAAA,IAAI,CAAC,KAAA,EAAO;AACZ,QAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CACpB,GAAA,CAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,GAAA,KAAQ,UAAA,GAAa,OAAA,GAAU;AAAA,UACvD,GAAG,OAAA;AAAA,UACH,KAAA,EAAO,QAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,QAAQ,OAAO;AAAA,SAC3D,EACA,MAAA,CAAO,CAAC,YAAY,OAAA,CAAQ,KAAA,CAAM,SAAS,CAAC,CAAA;AAC/C,QAAA,GAAA,CAAI,EAAE,KAAA,EAAO,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,EAAE,GAAG,KAAA,EAAO,QAAA,EAAS,GAAI,IAAA,EAAM,CAAA;AAAA,MACpE,CAAA;AAAA,MAEA,kBAAA,CAAmB,YAAY,KAAA,EAAO;AACpC,QAAA,MAAM,KAAA,GAAQ,KAAI,CAAE,KAAA;AACpB,QAAA,IAAI,CAAC,KAAA,EAAO;AACZ,QAAA,GAAA,CAAI;AAAA,UACF,KAAA,EAAO;AAAA,YACL,GAAG,KAAA;AAAA,YACH,QAAA,EAAU,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAa,OAAA,CAAQ,GAAA,KAAQ,UAAA,GAAa,EAAE,GAAG,OAAA,EAAS,GAAG,KAAA,KAAU,OAAQ;AAAA;AAC7G,SACD,CAAA;AAAA,MACH,CAAA;AAAA,MAEA,mBAAmB,UAAA,EAAY;AAC7B,QAAA,MAAM,KAAA,GAAQ,KAAI,CAAE,KAAA;AACpB,QAAA,IAAI,CAAC,KAAA,EAAO;AACZ,QAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,MAAA,CAAO,CAAC,OAAA,KAAY,OAAA,CAAQ,QAAQ,UAAU,CAAA;AAC9E,QAAA,GAAA,CAAI,EAAE,KAAA,EAAO,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,EAAE,GAAG,KAAA,EAAO,QAAA,EAAS,GAAI,IAAA,EAAM,CAAA;AAAA,MACpE,CAAA;AAAA,MAEA,WAAW,KAAA,EAAO;AAChB,QAAA,MAAM,QAAA,GAAW,KAAI,CAAE,QAAA;AACvB,QAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAU,GAAI,GAAA,EAAI;AACtC,QAAA,MAAM,SAAA,GAAY,CAAC,SAAA,KAAsB,IAAI,GAAA;AAAA,UAC3C,UAAA,CACG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,SAAS,CAAA,CACvC,GAAA,CAAI,CAAC,CAAA,KAAM,aAAA,CAAc,SAAA,CAAU,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,CAAA,CAAE,MAAM,CAAA,EAAG,IAAA,IAAQ,EAAE,CAAC,CAAA,CAC9E,MAAA,CAAO,OAAO;AAAA,SACnB;AACA,QAAA,IAAI,GAAA,GAAM,CAAA;AACV,QAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,QAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AACrC,QAAA,MAAM,WAA2B,EAAC;AAClC,QAAA,KAAA,MAAW,WAAW,KAAA,EAAO;AAC3B,UAAA,MAAM,UAAA,GAAa,aAAA,CAAc,OAAA,CAAQ,IAAI,CAAA;AAC7C,UAAA,IAAI,CAAC,UAAA,IAAc,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA,EAAG;AACjD,UAAA,YAAA,CAAa,IAAI,UAAU,CAAA;AAC3B,UAAA,MAAM,MAAA,GAAS,SAAS,IAAA,CAAK,CAAC,MAAM,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,KAAM,UAAU,CAAA;AACxE,UAAA,MAAM,UAAU,MAAA,GAAS,SAAA,CAAU,OAAO,EAAE,CAAA,uBAAQ,GAAA,EAAY;AAChE,UAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,UAAA,MAAM,QAAqB,EAAC;AAC5B,UAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG;AACtC,YAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACvC,YAAA,IAAI,CAAC,OAAA,EAAS;AACd,YAAA,IAAI,QAAQ,GAAA,CAAI,OAAO,KAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,EAAG;AAClD,cAAA,iBAAA,EAAA;AACA,cAAA;AAAA,YACF;AACA,YAAA,SAAA,CAAU,IAAI,OAAO,CAAA;AACrB,YAAA,KAAA,CAAM,IAAA,CAAK;AAAA,cACT,GAAA,EAAK,CAAA,GAAA,EAAM,EAAE,GAAG,CAAA,CAAA;AAAA,cAChB,MAAM,IAAA,CAAK,IAAA;AAAA,cACX,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,IAAK,CAAA;AAAA,cAC7B,aAAa,IAAA,CAAK;AAAA,aACnB,CAAA;AAAA,UACH;AACA,UAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,UAAA,QAAA,CAAS,IAAA,CAAK,EAAE,GAAA,EAAK,CAAA,GAAA,EAAM,EAAE,GAAG,CAAA,CAAA,EAAI,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,eAAA,EAAiB,MAAA,EAAQ,EAAA,EAAI,OAAO,CAAA;AAAA,QAC9F;AACA,QAAA,MAAM,KAAA,GAA0B,SAAS,MAAA,GAAS,CAAA,GAAI,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAS,GAAI,IAAA;AACrF,QAAA,GAAA,CAAI,EAAE,OAAO,CAAA;AACb,QAAA,OAAO;AAAA,UACL,UAAU,QAAA,CAAS,MAAA;AAAA,UACnB,KAAA,EAAO,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAAA,UAC1D;AAAA,SACF;AAAA,MACF,CAAA;AAAA,MAEA,YAAA,GAAe;AAAE,QAAA,GAAA,CAAI,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,MAAE,CAAA;AAAA,MAEtC,MAAM,WAAA,GAAc;AAClB,QAAA,MAAM,KAAA,GAAQ,KAAI,CAAE,KAAA;AACpB,QAAA,MAAM,MAAA,GAAS,KAAI,CAAE,YAAA;AACrB,QAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAA,EAAQ,OAAO,EAAE,eAAA,EAAiB,CAAA,EAAG,YAAA,EAAc,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAC/E,QAAA,MAAM,MAAA,GAAS,MAAM,GAAA,EAAI,CAAE,eAAA,CAAgB;AAAA,UACzC,MAAA;AAAA,UACA,QAAA,EAAU,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,YACzC,WAAW,OAAA,CAAQ,eAAA;AAAA,YACnB,MAAM,OAAA,CAAQ,IAAA;AAAA,YACd,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,KAAA,EAAO,WAAA,EAAY,MAAO,EAAE,IAAA,EAAM,KAAA,EAAO,aAAY,CAAE;AAAA,WAC3F,CAAE;AAAA,SACH,CAAA;AACD,QAAA,GAAA,CAAI,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA;AACnB,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAAA,MAEA,MAAM,gBAAgB,IAAA,EAAM;AAC1B,QAAA,MAAM,SAAuB,EAAE,eAAA,EAAiB,GAAG,YAAA,EAAc,CAAA,EAAG,QAAQ,CAAA,EAAE;AAC9E,QAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACnC,UAAA,IAAI,YAAY,OAAA,CAAQ,SAAA;AACxB,UAAA,IAAI,CAAC,SAAA,EAAW;AACd,YAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,aAAA,CAAc,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,CAAA;AACxF,YAAA,SAAA,GAAY,OAAA,CAAQ,EAAA;AACpB,YAAA,MAAA,CAAO,eAAA,EAAA;AAAA,UACT;AACA,UAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,KAAA,EAAO;AAChC,YAAA,IAAI;AACF,cAAA,MAAM,SAAS,cAAA,CAAe;AAAA,gBAC5B,MAAM,IAAA,CAAK,IAAA;AAAA,gBACX,aAAa,IAAA,CAAK,WAAA;AAAA,gBAClB,OAAO,IAAA,CAAK,KAAA;AAAA,gBACZ;AAAA,eACD,CAAA;AACD,cAAA,MAAA,CAAO,YAAA,EAAA;AAAA,YACT,CAAA,CAAA,MAAQ;AACN,cAAA,MAAA,CAAO,MAAA,EAAA;AAAA,YACT;AAAA,UACF;AAAA,QACF;AACA,QAAA,MAAM,GAAA,GAAM,UAAA,EAAW;AAIvB,QAAA,MAAM,KAAI,CAAE,cAAA,CAAe,KAAI,CAAE,aAAA,IAAiB,EAAE,CAAA;AACpD,QAAA,KAAK,GAAA,GAAM,YAAA,EAAa;AACxB,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,KACF;AAAA,EACA,CAAC,CAAA;AACH;;;AClsBA,IAAM,cAAA,GAA4B;AAAA,EAChC,IAAA,EAAM,UAAA;AAAA,EACN,UAAA,EAAY,WAAA;AAAA,EACZ,IAAA,EAAM,eAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,WAAA,EAAa,MAAA;AAAA,EACb,MAAA,EAAQ;AAAA,IACN,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,WAAA,EAAa,IAAA,EAAK;AAAA,IAC9E,EAAE,KAAK,MAAA,EAAQ,KAAA,EAAO,QAAQ,IAAA,EAAM,MAAA,EAAQ,aAAa,IAAA,EAAK;AAAA,IAC9D,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,QAAA,EAAU,MAAM,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,YAAA,EAAc,IAAA;AAAK,GAC7F;AAAA,EACA,MAAM,EAAE,KAAA,EAAO,CAAA,CAAE,SAAA,EAAW,cAAc,IAAA;AAC5C,CAAA;AAEA,IAAM,gBAAA,GAA8B;AAAA,EAClC,IAAA,EAAM,aAAA;AAAA,EACN,UAAA,EAAY,cAAA;AAAA,EACZ,IAAA,EAAM,MAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,WAAA,EAAa,MAAA;AAAA,EACb,MAAA,EAAQ;AAAA,IACN,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,WAAA,EAAa,IAAA,EAAK;AAAA,IAC9E,EAAE,KAAK,OAAA,EAAS,KAAA,EAAO,SAAS,IAAA,EAAM,OAAA,EAAS,aAAa,IAAA,EAAK;AAAA,IACjE,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,QAAA,EAAU,MAAM,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,YAAA,EAAc,IAAA;AAAK,GAC7F;AAAA,EACA,MAAM,EAAE,KAAA,EAAO,CAAA,CAAE,WAAA,EAAa,cAAc,IAAA;AAC9C,CAAA;AAEA,IAAM,mBAAA,GAAiC;AAAA,EACrC,IAAA,EAAM,gBAAA;AAAA,EACN,UAAA,EAAY,iBAAA;AAAA,EACZ,IAAA,EAAM,UAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,WAAA,EAAa,MAAA;AAAA,EACb,MAAA,EAAQ;AAAA,IACN,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,WAAA,EAAa,IAAA,EAAK;AAAA,IAC9E,EAAE,GAAA,EAAK,eAAA,EAAiB,KAAA,EAAO,gBAAA,EAAkB,MAAM,QAAA,EAAU,WAAA,EAAa,IAAA,EAAM,YAAA,EAAc,CAAA,EAAE;AAAA,IACpG,EAAE,GAAA,EAAK,eAAA,EAAiB,KAAA,EAAO,gBAAA,EAAkB,MAAM,QAAA,EAAU,WAAA,EAAa,IAAA,EAAM,YAAA,EAAc,CAAA,EAAE;AAAA,IACpG,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,UAAA,EAAY,MAAM,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,YAAA,EAAc,KAAA;AAAM,GAClG;AAAA,EACA,MAAM,EAAE,KAAA,EAAO,CAAA,CAAE,cAAA,EAAgB,cAAc,IAAA;AACjD,CAAA;AAEO,IAAM,cAAA,GAAsC;AAAA,EACjD;AAAA,IACE,EAAA,EAAI,WAAA;AAAA,IACJ,MAAA,EAAQ,cAAA;AAAA,IACR,IAAA,EAAM,eAAA;AAAA,IACN,WAAA,EAAa,+BAAA;AAAA,IACb,OAAA,EAAS,OAAA;AAAA,IACT,QAAA,EAAU,IAAA;AAAA,IACV,QAAA,EAAU;AAAA,MACR,EAAE,IAAI,UAAA,EAAY,IAAA,EAAM,UAAU,IAAA,EAAM,WAAA,EAAM,UAAU,IAAA,EAAK;AAAA,MAC7D,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,SAAS,IAAA,EAAM,WAAA,EAAM,UAAU,IAAA,EAAK;AAAA,MAC3D,EAAE,IAAI,QAAA,EAAU,IAAA,EAAM,QAAQ,IAAA,EAAM,WAAA,EAAM,UAAU,IAAA,EAAK;AAAA,MACzD,EAAE,IAAI,aAAA,EAAe,IAAA,EAAM,aAAa,IAAA,EAAM,WAAA,EAAM,UAAU,IAAA,EAAK;AAAA,MACnE,EAAE,IAAI,QAAA,EAAU,IAAA,EAAM,QAAQ,IAAA,EAAM,WAAA,EAAM,UAAU,IAAA,EAAK;AAAA,MACzD,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,OAAO,IAAA,EAAM,WAAA,EAAM,UAAU,IAAA;AAAK;AACzD,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,cAAA;AAAA,IACJ,MAAA,EAAQ,gBAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,wCAAA;AAAA,IACb,OAAA,EAAS,OAAA;AAAA,IACT,QAAA,EAAU,IAAA;AAAA,IACV,QAAA,EAAU;AAAA,MACR,EAAE,IAAI,UAAA,EAAY,IAAA,EAAM,SAAS,KAAA,EAAO,OAAA,EAAS,UAAU,IAAA,EAAK;AAAA,MAChE,EAAE,IAAI,eAAA,EAAiB,IAAA,EAAM,cAAc,KAAA,EAAO,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,MACzE,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,eAAe,KAAA,EAAO,OAAA,EAAS,UAAU,IAAA;AAAK;AACrE,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,iBAAA;AAAA,IACJ,MAAA,EAAQ,mBAAA;AAAA,IACR,IAAA,EAAM,UAAA;AAAA,IACN,WAAA,EAAa,wCAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACpFO,IAAM,EAAA,GAA6B;AAAA,EACxC,YAAA,EAAc,MAAA;AAAA,EACd,kBAAA,EAAoB,MAAA;AAAA;AAAA,EAGpB,oBAAA,EAAsB,MAAA;AAAA,EACtB,uBAAA,EAAyB,2CAAA;AAAA,EACzB,qBAAA,EAAuB,oBAAA;AAAA,EACvB,sBAAA,EAAwB,UAAA;AAAA,EACxB,0BAAA,EAA4B,cAAA;AAAA,EAC5B,uBAAA,EAAyB,WAAA;AAAA,EACzB,4BAAA,EAA8B,gBAAA;AAAA,EAC9B,2BAAA,EAA6B,eAAA;AAAA,EAC7B,6BAAA,EAA+B,iBAAA;AAAA,EAC/B,yBAAA,EAA2B,aAAA;AAAA,EAC3B,sBAAA,EAAwB,KAAA;AAAA,EACxB,yBAAA,EAA2B,aAAA;AAAA,EAC3B,yBAAA,EAA2B,mBAAA;AAAA,EAC3B,yBAAA,EAA2B,aAAA;AAAA,EAC3B,6BAAA,EAA+B,aAAA;AAAA,EAC/B,0BAAA,EAA4B,qBAAA;AAAA,EAC5B,4BAAA,EAA8B,gBAAA;AAAA,EAC9B,6BAAA,EAA+B,iBAAA;AAAA,EAC/B,yBAAA,EAA2B,aAAA;AAAA,EAC3B,2BAAA,EAA6B,sCAAA;AAAA,EAC7B,sBAAA,EAAwB,UAAA;AAAA,EACxB,0BAAA,EAA4B,cAAA;AAAA,EAC5B,yBAAA,EAA2B,iBAAA;AAAA,EAC3B,mBAAA,EAAqB,MAAA;AAAA,EACrB,wBAAA,EAA0B,WAAA;AAAA,EAC1B,0BAAA,EAA4B,eAAA;AAAA,EAC5B,4BAAA,EAA8B,gBAAA;AAAA,EAC9B,sBAAA,EAAwB,SAAA;AAAA,EACxB,wBAAA,EAA0B,sBAAA;AAAA,EAC1B,6BAAA,EAA+B,uBAAA;AAAA,EAC/B,yBAAA,EAA2B,aAAA;AAAA,EAC3B,0BAAA,EAA4B,cAAA;AAAA,EAC5B,uBAAA,EAAyB,WAAA;AAAA,EACzB,qBAAA,EAAuB,QAAA;AAAA,EACvB,uBAAA,EAAyB,UAAA;AAAA,EACzB,wBAAA,EAA0B,WAAA;AAAA,EAC1B,sBAAA,EAAwB,UAAA;AAAA,EACxB,qBAAA,EAAuB,QAAA;AAAA,EACvB,kBAAA,EAAoB,KAAA;AAAA,EACpB,uBAAA,EAAyB,UAAA;AAAA,EACzB,uBAAA,EAAyB,UAAA;AAAA,EACzB,yBAAA,EAA2B,WAAA;AAAA,EAC3B,6BAAA,EAA+B,gDAAA;AAAA,EAC/B,oBAAA,EAAsB,0BAAA;AAAA,EACtB,wBAAA,EAA0B,6FAAA;AAAA;AAAA,EAG1B,0BAAA,EAA4B,UAAA;AAAA,EAC5B,2BAAA,EAA6B,WAAA;AAAA,EAC7B,sBAAA,EAAwB,MAAA;AAAA,EACxB,iCAAA,EAAmC,6BAAA;AAAA,EACnC,6BAAA,EAA+B,aAAA;AAAA,EAC/B,wCAAA,EAA0C,eAAA;AAAA,EAC1C,0BAAA,EAA4B,gBAAA;AAAA,EAC5B,wBAAA,EAA0B,aAAA;AAAA,EAC1B,4BAAA,EAA8B,mEAAA;AAAA,EAE9B,kBAAA,EAAoB,eAAA;AAAA,EACpB,uBAAA,EAAyB,UAAA;AAAA,EACzB,sBAAA,EAAwB,cAAA;AAAA;AAAA,EAGxB,sBAAA,EAAwB,oBAAA;AAAA,EACxB,wBAAA,EAA0B,gCAAA;AAAA,EAC1B,4BAAA,EAA8B,0CAAA;AAAA,EAC9B,oBAAA,EAAsB,MAAA;AAAA,EACtB,oBAAA,EAAsB,MAAA;AAAA,EACtB,kBAAA,EAAoB,IAAA;AAAA,EACpB,6BAAA,EAA+B,+EAAA;AAAA,EAC/B,8BAAA,EAAgC,UAAA;AAAA,EAChC,6BAAA,EAA+B,SAAA;AAAA,EAC/B,8BAAA,EAAgC,WAAA;AAAA;AAAA,EAGhC,wBAAA,EAA0B,UAAA;AAAA,EAC1B,yBAAA,EAA2B,WAAA;AAAA,EAC3B,oBAAA,EAAsB,MAAA;AAAA,EACtB,+BAAA,EAAiC,iBAAA;AAAA,EACjC,2BAAA,EAA6B,aAAA;AAAA,EAC7B,sCAAA,EAAwC,6BAAA;AAAA,EACxC,qBAAA,EAAuB,OAAA;AAAA,EACvB,yBAAA,EAA2B,2DAAA;AAAA,EAC3B,4BAAA,EAA8B,SAAA;AAAA,EAC9B,yBAAA,EAA2B,aAAA;AAAA,EAC3B,uBAAA,EAAyB,wCAAA;AAAA,EACzB,4BAAA,EAA8B,+BAAA;AAAA,EAC9B,4BAAA,EAA8B,iCAAA;AAAA,EAC9B,qBAAA,EAAuB,OAAA;AAAA,EACvB,oBAAA,EAAsB,MAAA;AAAA,EACtB,6BAAA,EAA+B,gBAAA;AAAA,EAC/B,wBAAA,EAA0B,YAAA;AAAA,EAC1B,uBAAA,EAAyB,SAAA;AAAA,EACzB,sBAAA,EAAwB,QAAA;AAAA,EACxB,6BAAA,EAA+B,yBAAA;AAAA,EAC/B,iCAAA,EAAmC,+DAAA;AAAA,EACnC,6BAAA,EAA+B,oBAAA;AAAA;AAAA,EAG/B,oBAAA,EAAsB,aAAA;AAAA,EACtB,wBAAA,EAA0B,wEAAA;AAAA,EAC1B,uBAAA,EAAyB,4BAAA;AAAA,EACzB,wBAAA,EAA0B,qEAAA;AAAA,EAC1B,6BAAA,EAA+B,oEAAA;AAAA,EAC/B,uBAAA,EAAyB,oCAAA;AAAA,EACzB,qBAAA,EAAuB,sDAAA;AAAA,EACvB,wBAAA,EAA0B,YAAA;AAAA,EAC1B,sBAAA,EAAwB,mDAAA;AAAA,EACxB,4BAAA,EAA8B,kJAAA;AAAA,EAC9B,6BAAA,EAA+B,wCAAA;AAAA,EAC/B,6BAAA,EAA+B,6BAAA;AAAA,EAC/B,6BAAA,EAA+B,wBAAA;AAAA,EAC/B,2BAAA,EAA6B,oBAAA;AAAA,EAC7B,yBAAA,EAA2B,WAAA;AAAA,EAC3B,yBAAA,EAA2B,oBAAA;AAAA,EAC3B,wBAAA,EAA0B,oBAAA;AAAA,EAC1B,sBAAA,EAAwB,WAAA;AAAA,EACxB,yBAAA,EAA2B,cAAA;AAAA,EAC3B,wBAAA,EAA0B,mDAAA;AAAA,EAC1B,uBAAA,EAAyB,4DAAA;AAAA,EACzB,+BAAA,EAAiC,mEAAA;AAAA,EACjC,qBAAA,EAAuB,SAAA;AAAA,EACvB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,kBAAA,EAAoB,kDAAA;AAAA,EACpB,wBAAA,EAA0B,sCAAA;AAAA;AAAA,EAG1B,qBAAA,EAAuB,SAAA;AAAA,EACvB,oBAAA,EAAsB,MAAA;AAAA,EACtB,4BAAA,EAA8B,6BAAA;AAAA;AAAA,EAG9B,2BAAA,EAA6B,8BAAA;AAAA,EAC7B,0BAAA,EAA4B,gDAAA;AAAA,EAC5B,wBAAA,EAA0B,2BAAA;AAAA,EAC1B,uBAAA,EAAyB,qCAAA;AAAA,EACzB,wBAAA,EAA0B,2BAAA;AAAA,EAC1B,uBAAA,EAAyB,sDAAA;AAAA,EACzB,qBAAA,EAAuB,QAAA;AAAA;AAAA,EAGvB,gBAAA,EAAkB,MAAA;AAAA,EAClB,kBAAA,EAAoB,WAAA;AAAA,EACpB,kBAAA,EAAoB,QAAA;AAAA;AAAA,EAGpB,qBAAA,EAAuB;AACzB,CAAA;;;ACvJO,IAAM,IAAA,GAA+B;AAAA,EAC1C,YAAA,EAAc,aAAA;AAAA,EACd,kBAAA,EAAoB,aAAA;AAAA;AAAA,EAGpB,oBAAA,EAAsB,aAAA;AAAA,EACtB,uBAAA,EAAyB,yDAAA;AAAA,EACzB,qBAAA,EAAuB,+BAAA;AAAA,EACvB,sBAAA,EAAwB,kBAAA;AAAA,EACxB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,uBAAA,EAAyB,oBAAA;AAAA,EACzB,4BAAA,EAA8B,sBAAA;AAAA,EAC9B,2BAAA,EAA6B,oBAAA;AAAA,EAC7B,6BAAA,EAA+B,uBAAA;AAAA,EAC/B,yBAAA,EAA2B,qBAAA;AAAA,EAC3B,sBAAA,EAAwB,YAAA;AAAA,EACxB,yBAAA,EAA2B,gBAAA;AAAA,EAC3B,yBAAA,EAA2B,oBAAA;AAAA,EAC3B,yBAAA,EAA2B,kBAAA;AAAA,EAC3B,6BAAA,EAA+B,kBAAA;AAAA,EAC/B,0BAAA,EAA4B,8BAAA;AAAA,EAC5B,4BAAA,EAA8B,qBAAA;AAAA,EAC9B,6BAAA,EAA+B,4BAAA;AAAA,EAC/B,yBAAA,EAA2B,wBAAA;AAAA,EAC3B,2BAAA,EAA6B,qDAAA;AAAA,EAC7B,sBAAA,EAAwB,gBAAA;AAAA,EACxB,0BAAA,EAA4B,qBAAA;AAAA,EAC5B,yBAAA,EAA2B,iBAAA;AAAA,EAC3B,mBAAA,EAAqB,QAAA;AAAA,EACrB,wBAAA,EAA0B,UAAA;AAAA,EAC1B,0BAAA,EAA4B,sBAAA;AAAA,EAC5B,4BAAA,EAA8B,2BAAA;AAAA,EAC9B,sBAAA,EAAwB,qBAAA;AAAA,EACxB,wBAAA,EAA0B,mBAAA;AAAA,EAC1B,6BAAA,EAA+B,yBAAA;AAAA,EAC/B,yBAAA,EAA2B,cAAA;AAAA,EAC3B,0BAAA,EAA4B,sBAAA;AAAA,EAC5B,uBAAA,EAAyB,eAAA;AAAA,EACzB,qBAAA,EAAuB,UAAA;AAAA,EACvB,uBAAA,EAAyB,UAAA;AAAA,EACzB,wBAAA,EAA0B,eAAA;AAAA,EAC1B,sBAAA,EAAwB,UAAA;AAAA,EACxB,qBAAA,EAAuB,QAAA;AAAA,EACvB,kBAAA,EAAoB,KAAA;AAAA,EACpB,uBAAA,EAAyB,UAAA;AAAA,EACzB,uBAAA,EAAyB,UAAA;AAAA,EACzB,yBAAA,EAA2B,4BAAA;AAAA,EAC3B,6BAAA,EAA+B,6CAAA;AAAA,EAC/B,oBAAA,EAAsB,qCAAA;AAAA,EACtB,wBAAA,EAA0B,0GAAA;AAAA;AAAA,EAG1B,0BAAA,EAA4B,kBAAA;AAAA,EAC5B,2BAAA,EAA6B,oBAAA;AAAA,EAC7B,sBAAA,EAAwB,MAAA;AAAA,EACxB,iCAAA,EAAmC,uCAAA;AAAA,EACnC,6BAAA,EAA+B,iBAAA;AAAA,EAC/B,wCAAA,EAA0C,8BAAA;AAAA,EAC1C,0BAAA,EAA4B,cAAA;AAAA,EAC5B,wBAAA,EAA0B,mBAAA;AAAA,EAC1B,4BAAA,EAA8B,gEAAA;AAAA,EAE9B,kBAAA,EAAoB,gBAAA;AAAA,EACpB,uBAAA,EAAyB,UAAA;AAAA,EACzB,sBAAA,EAAwB,qBAAA;AAAA;AAAA,EAGxB,sBAAA,EAAwB,yBAAA;AAAA,EACxB,wBAAA,EAA0B,oCAAA;AAAA,EAC1B,4BAAA,EAA8B,sDAAA;AAAA,EAC9B,oBAAA,EAAsB,MAAA;AAAA,EACtB,oBAAA,EAAsB,KAAA;AAAA,EACtB,kBAAA,EAAoB,QAAA;AAAA,EACpB,6BAAA,EAA+B,2FAAA;AAAA,EAC/B,8BAAA,EAAgC,gBAAA;AAAA,EAChC,6BAAA,EAA+B,eAAA;AAAA,EAC/B,8BAAA,EAAgC,UAAA;AAAA;AAAA,EAGhC,wBAAA,EAA0B,WAAA;AAAA,EAC1B,yBAAA,EAA2B,aAAA;AAAA,EAC3B,oBAAA,EAAsB,MAAA;AAAA,EACtB,+BAAA,EAAiC,kBAAA;AAAA,EACjC,2BAAA,EAA6B,iBAAA;AAAA,EAC7B,sCAAA,EAAwC,mCAAA;AAAA,EACxC,qBAAA,EAAuB,MAAA;AAAA,EACvB,yBAAA,EAA2B,kEAAA;AAAA,EAC3B,4BAAA,EAA8B,WAAA;AAAA,EAC9B,yBAAA,EAA2B,gBAAA;AAAA,EAC3B,uBAAA,EAAyB,sCAAA;AAAA,EACzB,4BAAA,EAA8B,gCAAA;AAAA,EAC9B,4BAAA,EAA8B,iCAAA;AAAA,EAC9B,qBAAA,EAAuB,UAAA;AAAA,EACvB,oBAAA,EAAsB,OAAA;AAAA,EACtB,6BAAA,EAA+B,mBAAA;AAAA,EAC/B,wBAAA,EAA0B,eAAA;AAAA,EAC1B,uBAAA,EAAyB,aAAA;AAAA,EACzB,sBAAA,EAAwB,gBAAA;AAAA,EACxB,6BAAA,EAA+B,kCAAA;AAAA,EAC/B,iCAAA,EAAmC,mFAAA;AAAA,EACnC,6BAAA,EAA+B,yBAAA;AAAA;AAAA,EAG/B,oBAAA,EAAsB,gBAAA;AAAA,EACtB,wBAAA,EAA0B,0EAAA;AAAA,EAC1B,uBAAA,EAAyB,2BAAA;AAAA,EACzB,wBAAA,EAA0B,yEAAA;AAAA,EAC1B,6BAAA,EAA+B,8EAAA;AAAA,EAC/B,uBAAA,EAAyB,oDAAA;AAAA,EACzB,qBAAA,EAAuB,sEAAA;AAAA,EACvB,wBAAA,EAA0B,yBAAA;AAAA,EAC1B,sBAAA,EAAwB,mDAAA;AAAA,EACxB,4BAAA,EAA8B,sIAAA;AAAA,EAC9B,6BAAA,EAA+B,6CAAA;AAAA,EAC/B,6BAAA,EAA+B,kDAAA;AAAA,EAC/B,6BAAA,EAA+B,wCAAA;AAAA,EAC/B,2BAAA,EAA6B,wBAAA;AAAA,EAC7B,yBAAA,EAA2B,YAAA;AAAA,EAC3B,yBAAA,EAA2B,oBAAA;AAAA,EAC3B,wBAAA,EAA0B,mBAAA;AAAA,EAC1B,sBAAA,EAAwB,gBAAA;AAAA,EACxB,yBAAA,EAA2B,uBAAA;AAAA,EAC3B,wBAAA,EAA0B,oDAAA;AAAA,EAC1B,uBAAA,EAAyB,4DAAA;AAAA,EACzB,+BAAA,EAAiC,gEAAA;AAAA,EACjC,qBAAA,EAAuB,WAAA;AAAA,EACvB,oBAAA,EAAsB,wBAAA;AAAA,EACtB,kBAAA,EAAoB,0DAAA;AAAA,EACpB,wBAAA,EAA0B,4CAAA;AAAA;AAAA,EAG1B,qBAAA,EAAuB,eAAA;AAAA,EACvB,oBAAA,EAAsB,aAAA;AAAA,EACtB,4BAAA,EAA8B,0BAAA;AAAA;AAAA,EAG9B,2BAAA,EAA6B,iCAAA;AAAA,EAC7B,0BAAA,EAA4B,kEAAA;AAAA,EAC5B,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,uBAAA,EAAyB,kDAAA;AAAA,EACzB,wBAAA,EAA0B,iCAAA;AAAA,EAC1B,uBAAA,EAAyB,2EAAA;AAAA,EACzB,qBAAA,EAAuB,SAAA;AAAA;AAAA,EAGvB,gBAAA,EAAkB,QAAA;AAAA,EAClB,kBAAA,EAAoB,aAAA;AAAA,EACpB,kBAAA,EAAoB,UAAA;AAAA;AAAA,EAGpB,qBAAA,EAAuB;AACzB,CAAA;;;ACpJO,IAAM,WAAA,GAAsD,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAK;ACAhF,IAAM,kBAAA,GAAqB;AAAA,EAChC,iBAAA,CAAkB;AAAA,IAChB,EAAA,EAAI,SAAA;AAAA,IACJ,KAAA,EAAOC,EAAAA,CAAG,SAAA,EAAW,0BAAuB,CAAA;AAAA,IAC5C,IAAA,EAAM,UAAA;AAAA,IACN,OAAA,EAAS,YAAA;AAAA,IACT,aAAA,EAAe,SAAA;AAAA,IACf,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,EAAE,6BAAA,EAA+B,KAAA,EAAO,yBAAyB,0CAAA,EAAwC;AAAA,IACnH,UAAU,CAAC;AAAA,MACT,SAAA,EAAW,6BAAA;AAAA,MACX,MAAA,EAAQ;AAAA,QACN,EAAE,KAAK,6BAAA,EAA+B,IAAA,EAAM,WAAW,KAAA,EAAOA,EAAAA,CAAG,8BAAA,EAAgC,4BAAyB,CAAA,EAAE;AAAA,QAC5H,EAAE,KAAK,uBAAA,EAAyB,IAAA,EAAM,UAAU,KAAA,EAAOA,EAAAA,CAAG,gBAAA,EAAkB,kBAAkB,CAAA;AAAE;AAClG,KACD;AAAA,GACF;AACH,CAAA;ACuCA,IAAM,qBAAA,GAAwB,eAAA;AAC9B,IAAM,iBAAA,GAAoB,UAAA;AAE1B,SAAS,MAAA,GAAiB;AACxB,EAAA,OAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAChC;AAEA,SAAS,QAAQ,KAAA,EAAuB;AACtC,EAAA,OAAO,KAAA,CAAM,aAAY,CAAE,OAAA,CAAQ,eAAe,GAAG,CAAA,CAAE,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAC7E;AAEA,SAAS,YAAY,KAAA,EAAmD;AACtE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,MAAA,CAAO,KAAK,CAAA,IAAK,CAAA;AACvD,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,aAAa,GAAA,EAA0C;AAC9D,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,GAAW,iBAAiB,CAAA;AAC5C,EAAA,OAAO,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,CAAC,MAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,GAAiC,EAAC;AACnG;AAEA,SAASC,cAAAA,CAAc,GAAA,EAAkB,SAAA,GAAY,CAAA,EAAiB;AACpE,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,QAAA,EAAU,IAAI,SAAA,IAAa,MAAA;AAAA,IAC3B,IAAA,EAAM,IAAI,IAAA,IAAQ,MAAA;AAAA,IAClB,KAAA,EAAO,IAAI,KAAA,IAAS,MAAA;AAAA,IACpB,SAAA,EAAW,IAAI,UAAA,IAAc,CAAA;AAAA,IAC7B,QAAA,EAAU,IAAI,SAAA,IAAa,IAAA;AAAA,IAC3B,SAAA;AAAA,IACA,QAAA,EAAU,IAAI,SAAA,IAAa,gBAAA;AAAA,IAC3B,SAAA,EAAW,GAAA,CAAI,UAAA,IAAc,MAAA,EAAO;AAAA,IACpC,SAAA,EAAW,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,cAAc,MAAA;AAAO,GACxD;AACF;AAEA,SAASC,UAAAA,CAAU,KAAiB,YAAA,EAAiC;AACnE,EAAA,MAAM,QAAA,GAAW,aAAa,GAAG,CAAA;AACjC,EAAA,MAAM,MAAA,GAAU,QAAA,CAAS,MAAA,IAAU,GAAA,CAAI,MAAA,IAAU,WAAA;AACjD,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,WAAA,EAAa,IAAI,WAAA,IAAe,MAAA;AAAA,IAChC,KAAA,EAAO,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA;AAAA,IAC5B,IAAA,EAAM,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAAA,IAC1B,QAAA,EAAU,IAAI,QAAA,IAAY,KAAA;AAAA,IAC1B,GAAA,EAAK,IAAI,GAAA,IAAO,MAAA;AAAA,IAChB,QAAA,EAAU,IAAI,SAAA,IAAa,MAAA;AAAA,IAC3B,UAAA,EAAY,IAAI,WAAA,IAAe,MAAA;AAAA,IAC/B,YAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA,EAAU,IAAI,SAAA,IAAa,IAAA;AAAA,IAC3B,iBAAiB,OAAO,QAAA,CAAS,eAAA,KAAoB,QAAA,GAAW,SAAS,eAAA,GAAkB,MAAA;AAAA,IAC3F,WAAW,KAAA,CAAM,OAAA,CAAQ,SAAS,SAAS,CAAA,GAAI,SAAS,SAAA,GAAwB,MAAA;AAAA,IAChF,WAAA,EAAa,MAAM,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,GAAI,QAAA,CAAS,WAAA,GAA0B,GAAA,CAAI,IAAA,IAAQ,MAAA;AAAA,IAClG,iBAAiB,OAAO,QAAA,CAAS,eAAA,KAAoB,SAAA,GAAY,SAAS,eAAA,GAAkB,IAAA;AAAA,IAC5F,sBAAsB,OAAO,QAAA,CAAS,oBAAA,KAAyB,SAAA,GAAY,SAAS,oBAAA,GAAuB,IAAA;AAAA,IAC3G,eAAe,OAAO,QAAA,CAAS,aAAA,KAAkB,QAAA,GAAW,SAAS,aAAA,GAAgB,MAAA;AAAA,IACrF,WAAW,OAAO,QAAA,CAAS,SAAA,KAAc,QAAA,GAAW,SAAS,SAAA,GAAY,CAAA;AAAA,IACzE,YAAY,OAAO,QAAA,CAAS,UAAA,KAAe,SAAA,GAAY,SAAS,UAAA,GAAa,KAAA;AAAA,IAC7E,kBAAkB,KAAA,CAAM,OAAA,CAAQ,SAAS,gBAAgB,CAAA,GAAI,SAAS,gBAAA,GAA+B,MAAA;AAAA,IACrG,QAAA,EAAU,GAAA,CAAI,QAAA,IAAY,EAAC;AAAA,IAC3B,QAAA,EAAU,IAAI,SAAA,IAAa,gBAAA;AAAA,IAC3B,SAAA,EAAW,GAAA,CAAI,UAAA,IAAc,MAAA,EAAO;AAAA,IACpC,SAAA,EAAW,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,cAAc,MAAA;AAAO,GACxD;AACF;AAEA,SAAS,eAAA,CAAgB,OAAgC,IAAA,EAAuC;AAC9F,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,IAAA,EAAM,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAAA,IACxB,SAAA,EAAW,MAAM,QAAA,IAAY,IAAA;AAAA,IAC7B,IAAA,EAAM,MAAM,IAAA,IAAQ,IAAA;AAAA,IACpB,KAAA,EAAO,MAAM,KAAA,IAAS,IAAA;AAAA,IACtB,UAAA,EAAY,MAAM,SAAA,IAAa,CAAA;AAAA,IAC/B,SAAA,EAAW;AAAA,GACb;AACF;AAEA,SAAS,YAAA,CAAa,OAAqC,QAAA,EAA6D;AACtH,EAAA,OAAO;AAAA,IACL,GAAI,YAAY,EAAC;AAAA,IACjB,CAAC,iBAAiB,GAAG;AAAA,MACnB,GAAK,QAAA,GAAW,iBAAiB,CAAA,IAAK,OAAO,QAAA,CAAS,iBAAiB,CAAA,KAAM,QAAA,GAAY,QAAA,CAAS,iBAAiB,CAAA,GAA+B,EAAC;AAAA,MACnJ,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,iBAAiB,KAAA,CAAM,eAAA;AAAA,MACvB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,eAAA,EAAiB,MAAM,eAAA,IAAmB,IAAA;AAAA,MAC1C,oBAAA,EAAsB,MAAM,oBAAA,IAAwB,IAAA;AAAA,MACpD,eAAe,KAAA,CAAM,aAAA;AAAA,MACrB,UAAA,EAAY,MAAM,UAAA,IAAc,KAAA;AAAA,MAChC,kBAAkB,KAAA,CAAM;AAAA;AAC1B,GACF;AACF;AAEA,SAAS,kBAAkB,KAAA,EAAqD;AAC9E,EAAA,OAAO;AAAA,IACL,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,IAClC,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,IAAA,EAAM,MAAM,IAAA,IAAQ,IAAA;AAAA,IACpB,QAAA,EAAU,KAAA;AAAA,IACV,SAAA,EAAW,MAAM,QAAA,IAAY,IAAA;AAAA,IAC7B,WAAA,EAAa,MAAM,UAAA,IAAc,IAAA;AAAA,IACjC,MAAA,EAAQ,KAAA,CAAM,MAAA,KAAW,QAAA,GAAW,UAAA,GAAa,QAAA;AAAA,IACjD,SAAA,EAAW,MAAM,MAAA,KAAW,QAAA;AAAA,IAC5B,IAAA,EAAM,KAAA,CAAM,WAAA,IAAe,EAAC;AAAA,IAC5B,QAAA,EAAU,aAAa,KAAK;AAAA,GAC9B;AACF;AAEA,SAAS,iBAAA,CAAkB,OAA4B,QAAA,EAA8C;AACnG,EAAA,MAAM,UAAmC,EAAC;AAC1C,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AACnD,EAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,EAAW,OAAA,CAAQ,cAAc,KAAA,CAAM,WAAA;AACjE,EAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,QAAQ,KAAA,CAAM,KAAA;AACrD,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AACnD,EAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,YAAY,KAAA,CAAM,QAAA;AAC5D,EAAA,IAAI,KAAA,CAAM,UAAA,KAAe,MAAA,EAAW,OAAA,CAAQ,cAAc,KAAA,CAAM,UAAA;AAChE,EAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAW;AAC9B,IAAA,OAAA,CAAQ,MAAA,GAAS,KAAA,CAAM,MAAA,KAAW,QAAA,GAAW,UAAA,GAAa,QAAA;AAC1D,IAAA,OAAA,CAAQ,SAAA,GAAY,MAAM,MAAA,KAAW,QAAA;AAAA,EACvC;AACA,EAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,WAAA;AAI1D,EAAA,OAAA,CAAQ,QAAA,GAAW,YAAA,CAAa,EAAE,GAAG,KAAA,EAAO,UAAA,EAAY,KAAA,CAAM,UAAA,IAAc,MAAA,EAAU,EAAG,QAAA,EAAU,QAAQ,CAAA;AAC3G,EAAA,OAAO,OAAA;AACT;AAQA,SAAS,kBAAA,CAAmB,MAAgB,KAAA,EAA+B;AACzE,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,IAAI,KAAA,CAAM,MAAA,GAAS,CAAC,KAAA,CAAM,MAAM,CAAA;AAC3E,IAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,IAAA,CAAK,MAAM,GAAG,OAAO,KAAA;AAAA,EAC9C;AACA,EAAA,IAAI,MAAM,eAAA,KAAoB,MAAA,IAAa,KAAK,eAAA,KAAoB,KAAA,CAAM,iBAAiB,OAAO,KAAA;AAClG,EAAA,IAAI,MAAM,oBAAA,KAAyB,MAAA,IAAa,KAAK,oBAAA,KAAyB,KAAA,CAAM,sBAAsB,OAAO,KAAA;AACjH,EAAA,IAAI,MAAM,UAAA,KAAe,MAAA,IAAa,KAAK,UAAA,KAAe,KAAA,CAAM,YAAY,OAAO,KAAA;AACnF,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,WAAA,EAAY;AACxC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,MAAM,CAAA,KACxC,IAAA,CAAK,WAAA,EAAa,WAAA,EAAY,CAAE,QAAA,CAAS,MAAM,CAAA,IAAK,KAAA,CAAA;AAAA,EAC5D;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAASC,SAAAA,CAAY,KAAA,EAAY,IAAA,EAAe,QAAA,EAAuC;AACrF,EAAA,MAAM,cAAc,IAAA,IAAQ,CAAA;AAC5B,EAAA,MAAM,QAAQ,QAAA,IAAY,EAAA;AAC1B,EAAA,MAAM,KAAA,GAAA,CAAS,cAAc,CAAA,IAAK,KAAA;AAClC,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,QAAQ,KAAK,CAAA,EAAG,KAAA,EAAO,KAAA,CAAM,MAAA,EAAO;AACxE;AAEO,SAAS,sBAAA,CAAuB,OAAA,GAAmC,EAAC,EAAqB;AAC9F,EAAA,MAAM,MAAA,GAAS,iBAAiB,OAAO,CAAA;AACvC,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAC1B,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,EAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AACxB,EAAA,MAAM,eAAA,GAAkB,QAAQ,eAAA,IAAmB,YAAA;AACnD,EAAA,MAAM,aAAA,GAAgB,QAAQ,aAAA,IAAiB,UAAA;AAC/C,EAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,IAAgB,qBAAA;AAE7C,EAAA,MAAM,YAAA,GAAe,EAAE,SAAA,EAAW,MAAA,EAAQ,OAAA,EAAQ;AAElD,EAAA,eAAe,gBAAA,GAA2C;AACxD,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,QAAA,CAAsB;AAAA,MACvD,GAAG,YAAA;AAAA,MACH,KAAA,EAAO,eAAA;AAAA,MACP,OAAA,EAAS;AAAA,QACP,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,OAAO,YAAA,EAAa;AAAA,QACtD,EAAE,MAAA,EAAQ,WAAA,EAAa,QAAA,EAAU,IAAA,EAAM,OAAO,IAAA;AAAK,OACrD;AAAA,MACA,UAAA,EAAY,YAAA;AAAA,MACZ,aAAA,EAAe,KAAA;AAAA,MACf,KAAA,EAAO;AAAA,KACR,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAEA,EAAA,eAAe,WAAA,GAAqC;AAClD,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,QAAA,CAAqB;AAAA,MACtD,GAAG,YAAA;AAAA,MACH,KAAA,EAAO,aAAA;AAAA,MACP,OAAA,EAAS,CAAC,EAAE,MAAA,EAAQ,aAAa,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,MAC9D,UAAA,EAAY,MAAA;AAAA,MACZ,aAAA,EAAe,KAAA;AAAA,MACf,KAAA,EAAO;AAAA,KACR,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAQ;AACnC,MAAA,MAAM,QAAA,GAAW,aAAa,GAAG,CAAA;AACjC,MAAA,OAAO,SAAS,IAAA,KAAS,WAAA,IAAe,SAAS,MAAA,IAAU,IAAA,IAAQ,IAAI,WAAA,IAAe,IAAA;AAAA,IACxF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,eAAe,cAAA,GAAiB;AAC9B,IAAA,MAAM,UAAA,GAAa,MAAM,gBAAA,EAAiB;AAC1C,IAAA,OAAO,IAAI,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAC,QAAA,KAAa,CAAC,QAAA,CAAS,EAAA,EAAI,QAAQ,CAAC,CAAC,CAAA;AAAA,EACtE;AAEA,EAAA,eAAe,QAAA,GAAgC;AAC7C,IAAA,MAAM,CAAC,IAAA,EAAM,WAAW,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,WAAA,EAAY,EAAG,cAAA,EAAgB,CAAC,CAAA;AAC/E,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQD,UAAAA,CAAU,GAAA,EAAK,GAAA,CAAI,WAAA,GAAc,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,WAAW,GAAG,IAAA,GAAO,MAAS,CAAC,CAAA,CAC1G,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAC7E;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,aAAA,GAAgB;AACpB,MAAA,MAAM,CAAC,UAAA,EAAY,KAAK,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,gBAAA,EAAiB,EAAG,WAAA,EAAa,CAAC,CAAA;AACjF,MAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAI,IAAA,CAAK,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,WAAA,EAAA,CAAc,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,WAAW,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AAAA,MAC5F;AACA,MAAA,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,QAAA,KAAaD,cAAAA,CAAc,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA,IAAK,CAAC,CAAC,CAAA;AAAA,IAC3F,CAAA;AAAA,IAEA,MAAM,gBAAgB,EAAA,EAAY;AAChC,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,QAAA,CAAsB;AAAA,QACvD,GAAG,YAAA;AAAA,QACH,KAAA,EAAO,eAAA;AAAA,QACP,OAAA,EAAS,CAAC,EAAE,MAAA,EAAQ,MAAM,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,CAAA;AAAA,QACrD,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,OAAO,QAAA,CAAS,KAAK,CAAC,CAAA,GAAIA,eAAc,QAAA,CAAS,IAAA,CAAK,CAAC,CAAC,CAAA,GAAI,IAAA;AAAA,IAC9D,CAAA;AAAA,IAEA,MAAM,eAAe,KAAA,EAAgC;AACnD,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,IAAA,CAAK,SAAA,CAAuB;AAAA,QACnD,GAAG,YAAA;AAAA,QACH,KAAA,EAAO,eAAA;AAAA,QACP,GAAA,EAAK,eAAA,CAAgB,KAAA,EAAO,YAAY;AAAA,OACzC,CAAA;AACD,MAAA,OAAOA,eAAc,GAAG,CAAA;AAAA,IAC1B,CAAA;AAAA,IAEA,MAAM,cAAA,CAAe,EAAA,EAAY,IAAA,EAA6B;AAC5D,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,IAAA,CAAK,SAAA,CAAuB;AAAA,QACnD,GAAG,YAAA;AAAA,QACH,KAAA,EAAO,eAAA;AAAA,QACP,WAAA,EAAa,EAAE,EAAA,EAAG;AAAA,QAClB,GAAA,EAAK;AAAA,UACH,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,WAAW,IAAA,CAAK,QAAA;AAAA,UAChB,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,YAAY,IAAA,CAAK,SAAA;AAAA,UACjB,WAAW,IAAA,CAAK;AAAA;AAClB,OACD,CAAA;AACD,MAAA,OAAOA,eAAc,GAAG,CAAA;AAAA,IAC1B,CAAA;AAAA,IAEA,MAAM,eAAe,EAAA,EAAY;AAC/B,MAAA,MAAM,MAAA,CAAO,KAAK,SAAA,CAAuB;AAAA,QACvC,GAAG,YAAA;AAAA,QACH,KAAA,EAAO,eAAA;AAAA,QACP,WAAA,EAAa,EAAE,EAAA,EAAG;AAAA,QAClB,GAAA,EAAK,EAAE,SAAA,EAAW,KAAA;AAAM,OACzB,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,kBAAkB,GAAA,EAAe;AACrC,MAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,CAAC,EAAA,EAAI,SAAA,KAAc,IAAA,CAAK,cAAA,CAAe,EAAA,EAAI,EAAE,SAAA,EAAW,CAAC,CAAC,CAAA;AAAA,IACtF,CAAA;AAAA,IAEA,MAAM,aAAa,KAAA,EAAsB;AACvC,MAAA,MAAM,KAAA,GAAA,CAAS,MAAM,QAAA,EAAS,EAAG,MAAA,CAAO,CAAC,IAAA,KAAS,kBAAA,CAAmB,IAAA,EAAM,KAAK,CAAC,CAAA;AACjF,MAAA,OAAOE,SAAAA,CAAS,KAAA,EAAO,KAAA,CAAM,IAAA,EAAM,MAAM,QAAQ,CAAA;AAAA,IACnD,CAAA;AAAA,IAEA,MAAM,gBAAgB,EAAA,EAAY;AAChC,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,QAAA,CAAqB;AAAA,QACtD,GAAG,YAAA;AAAA,QACH,KAAA,EAAO,aAAA;AAAA,QACP,OAAA,EAAS,CAAC,EAAE,MAAA,EAAQ,MAAM,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,CAAA;AAAA,QACrD,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,IAAI,CAAC,QAAA,CAAS,IAAA,CAAK,CAAC,GAAG,OAAO,IAAA;AAC9B,MAAA,MAAM,WAAA,GAAc,MAAM,cAAA,EAAe;AACzC,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA;AAC3B,MAAA,OAAOD,UAAAA,CAAU,GAAA,EAAK,GAAA,CAAI,WAAA,GAAc,WAAA,CAAY,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG,IAAA,GAAO,MAAS,CAAA;AAAA,IAC5F,CAAA;AAAA,IAEA,MAAM,eAAe,KAAA,EAA4B;AAC/C,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,IAAA,CAAK,SAAA,CAAsB;AAAA,QAClD,GAAG,YAAA;AAAA,QACH,KAAA,EAAO,aAAA;AAAA,QACP,GAAA,EAAK,kBAAkB,KAAK;AAAA,OAC7B,CAAA;AACD,MAAA,MAAM,WAAA,GAAc,MAAM,cAAA,EAAe;AACzC,MAAA,OAAOA,UAAAA,CAAU,GAAA,EAAK,GAAA,CAAI,WAAA,GAAc,WAAA,CAAY,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG,IAAA,GAAO,MAAS,CAAA;AAAA,IAC5F,CAAA;AAAA,IAEA,MAAM,cAAA,CAAe,EAAA,EAAY,IAAA,EAA2B;AAC1D,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA,CAAgB,EAAE,CAAA;AAC9C,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,IAAA,CAAK,SAAA,CAAsB;AAAA,QAClD,GAAG,YAAA;AAAA,QACH,KAAA,EAAO,aAAA;AAAA,QACP,WAAA,EAAa,EAAE,EAAA,EAAG;AAAA,QAClB,GAAA,EAAK,iBAAA,CAAkB,IAAA,EAAM,QAAA,IAAY,MAAS;AAAA,OACnD,CAAA;AACD,MAAA,MAAM,WAAA,GAAc,MAAM,cAAA,EAAe;AACzC,MAAA,OAAOA,UAAAA,CAAU,GAAA,EAAK,GAAA,CAAI,WAAA,GAAc,WAAA,CAAY,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG,IAAA,GAAO,MAAS,CAAA;AAAA,IAC5F,CAAA;AAAA,IAEA,MAAM,eAAe,EAAA,EAAY;AAC/B,MAAA,MAAM,MAAA,CAAO,KAAK,SAAA,CAAsB;AAAA,QACtC,GAAG,YAAA;AAAA,QACH,KAAA,EAAO,aAAA;AAAA,QACP,WAAA,EAAa,EAAE,EAAA,EAAG;AAAA,QAClB,GAAA,EAAK,EAAE,SAAA,EAAW,KAAA;AAAM,OACzB,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,kBAAA,CAAmB,EAAA,EAAY,KAAA,EAA8D,KAAA,EAAgB;AACjH,MAAA,OAAO,IAAA,CAAK,eAAe,EAAA,EAAI,EAAE,CAAC,KAAK,GAAG,OAA8B,CAAA;AAAA,IAC1E,CAAA;AAAA,IAEA,MAAM,YAAA,CAAa,UAAA,EAAoB,GAAA,EAAe;AACpD,MAAA,MAAM,QAAQ,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,OAAO,IAAI,SAAA,KAAc;AACjD,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA,CAAgB,EAAE,CAAA;AAC9C,QAAA,MAAM,MAAA,CAAO,KAAK,SAAA,CAAsB;AAAA,UACtC,GAAG,YAAA;AAAA,UACH,KAAA,EAAO,aAAA;AAAA,UACP,WAAA,EAAa,EAAE,EAAA,EAAG;AAAA,UAClB,GAAA,EAAK,EAAE,QAAA,EAAU,YAAA,CAAa,EAAa,CAAA,EAAG,EAAE,GAAG,QAAA,EAAU,QAAA,EAAU,CAAC,iBAAiB,GAAG,EAAE,GAAG,QAAA,EAAU,QAAA,GAAW,iBAAiB,CAAA,EAA8B,SAAA,EAAU,EAAG,CAAA;AAAE,SACrL,CAAA;AAAA,MACH,CAAC,CAAC,CAAA;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,iBAAA,GAA8C;AAClD,MAAA,OAAO,EAAC;AAAA,IACV,CAAA;AAAA,IAEA,MAAM,mBAAA,GAA8C;AAClD,MAAA,MAAM,IAAI,MAAM,sEAAsE,CAAA;AAAA,IACxF,CAAA;AAAA,IAEA,MAAM,mBAAA,GAA8C;AAClD,MAAA,MAAM,IAAI,MAAM,sEAAsE,CAAA;AAAA,IACxF,CAAA;AAAA,IAEA,MAAM,mBAAA,GAAqC;AACzC,MAAA,MAAM,IAAI,MAAM,sEAAsE,CAAA;AAAA,IACxF,CAAA;AAAA,IAEA,MAAM,UAAA,GAAmC;AACvC,MAAA,MAAM,CAAC,KAAA,EAAO,UAAU,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,QAAA,EAAS,EAAG,IAAA,CAAK,aAAA,EAAe,CAAC,CAAA;AAChF,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,KAAK,CAAA;AAC9E,MAAA,OAAO;AAAA,QACL,YAAY,KAAA,CAAM,MAAA;AAAA,QAClB,cAAA,EAAgB,MAAM,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AAAA,QACpE,YAAA,EAAc,MAAM,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,MAAA,KAAW,UAAU,CAAA,CAAE,MAAA;AAAA,QACjE,WAAA,EAAa,MAAM,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,MAAA,KAAW,QAAQ,CAAA,CAAE,MAAA;AAAA,QAC9D,eAAe,UAAA,CAAW,MAAA;AAAA,QAC1B,YAAA,EAAc,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,KAAA,KAAU,GAAA,GAAM,KAAA,EAAO,CAAC,CAAA,GAAI,OAAO,MAAA,GAAS,CAAA;AAAA,QAC9F,eAAe,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,UAAU,CAAA,CAAE;AAAA,OACzD;AAAA,IACF;AAAA,GACF;AACF;;;AC1ZA,IAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,MAAM,OAAO,wBAAkB,CAAA,CAAE,IAAA,CAAK,CAAC,OAAO,EAAE,OAAA,EAAS,CAAA,CAAE,QAAA,GAAW,CAAC,CAAA;AAanG,IAAM,cAAA,GAAmC;AAAA,EACvC,SAAA,EAAW,MAAA;AAAA,EACX,WAAA,EAAa,cAAA;AAAA,EACb,UAAA,EAAY,YAAA;AAAA,EACZ,OAAA,EAAS;AACX,CAAA;AAMA,IAAM,mBAAmB,EAAE,IAAA,EAAM,OAAO,MAAA,EAAQ,OAAA,EAAS,QAAQ,IAAA,EAAK;AAyBtE,SAAS,cAAc,OAAA,EAA6B;AAClD,EAAA,OAAO;AAAA,IACL,OAAA,EAAS;AAAA,MACP,SAAA,EAAW,OAAA,EAAS,OAAA,EAAS,SAAA,KAAc,KAAA;AAAA,MAC3C,eAAA,EAAiB,OAAA,EAAS,OAAA,EAAS,eAAA,KAAoB;AAAA,KACzD;AAAA,IACA,QAAQ,EAAE,GAAG,cAAA,EAAgB,GAAG,SAAS,MAAA,EAAO;AAAA,IAChD,UAAU,EAAE,GAAG,gBAAA,EAAkB,GAAG,SAAS,QAAA;AAAS,GACxD;AACF;AAMO,SAAS,iBAAiB,OAAA,EAA6C;AAC5E,EAAA,MAAM,MAAA,GAAS,cAAc,OAAO,CAAA;AACpC,EAAA,oBAAA,CAAqB,WAAW,CAAA;AAGhC,EAAA,MAAM,QAAA,GAAW,SAAS,YAAA,IAAgB,sBAAA;AAAA,IACxC,MAAM,0BAAA,CAA2B,EAAE,cAAc,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA;AAAA,IACvE,MAAM,sBAAA;AAAuB,GAC/B;AACA,EAAA,MAAM,KAAA,GAAQ,gBAAgB,QAAQ,CAAA;AAEtC,EAAA,MAAM,aAAA,GAA+B,MACnC,KAAA,CAAM,aAAA;AAAA,IAAc,KAAA,CAAM,QAAA;AAAA,IAAU,EAAE,UAAU,IAAA,EAAK;AAAA,IACnD,KAAA,CAAM,cAAc,QAAA,EAAU,EAAE,QAAQ,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,cAAA,EAAgB;AAAA,GACvF;AAEF,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA;AAAA,IACJ,gBAAA,EAAkB,YAAA;AAAA,IAClB,IAAA,EAAM,OAAO,MAAA,CAAO,SAAA;AAAA,IACpB,IAAA,EAAM,iBAAA;AAAA,IACN,OAAA,EAAS,OAAA;AAAA,IACT,KAAA,EAAO,SAAS,KAAA,IAAS,UAAA;AAAA,IACzB,YAAY,OAAA,EAAS,UAAA;AAAA;AAAA;AAAA;AAAA,IAIrB,SAAA,EAAW,CAAC,MAAA,EAAQ,WAAW,CAAA;AAAA,IAC/B,cAAA,EAAgB,IAAA;AAAA,IAChB,cAAc,EAAC;AAAA,IACf,gBAAA,EAAkB;AAAA,MAChB,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,MAAA,CAAO,OAAO,SAAA,EAAW,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,SAAA;AAAU,KAC/E;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,EAAE,GAAA,EAAK,YAAA,EAAc,OAAO,YAAA,EAAc,KAAA,EAAO,EAAE,KAAA;AAAM,KAC3D;AAAA,IACA,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,MAAe;AAAA,MACzC,EAAA,EAAI,CAAA,KAAA,EAAQ,SAAA,CAAU,EAAE,CAAA,CAAA;AAAA,MACxB,OAAA,EAAS,OAAA;AAAA,MACT,KAAK,SAAA,CAAU,GAAA;AAAA,MACf,WAAA,EAAa,CAAA,YAAA,EAAe,SAAA,CAAU,EAAE,CAAA;AAAA,KAC1C,CAAE,CAAA;AAAA,IACF,UAAA,EAAY;AAAA,MACV;AAAA,QACE,OAAA,EAAS,SAAS,UAAA,IAAc,MAAA;AAAA,QAChC,QAAA,EAAU,SAAS,WAAA,IAAe,CAAA;AAAA,QAClC,KAAA,EAAO,OAAO,MAAA,CAAO,SAAA;AAAA,QACrB,KAAA,EAAO,OAAA;AAAA,QACP,IAAA,EAAM,iBAAA;AAAA,QACN,UAAA,EAAY,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAQ,MAAA;AAAgB;AACzD,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,IAAA,EAAM,OAAA;AAAA,QACN,SAAA,EAAW,aAAA;AAAA,QACX,UAAA,EAAY,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAQ,MAAA;AAAgB;AACzD,KACF;AAAA,IACA,SAAS,EAAC;AAAA,IACV,OAAA,EAAS;AAAA,MACP;AAAA,QACE,EAAA,EAAI,iBAAA;AAAA,QACJ,IAAA,EAAM,eAAA;AAAA,QACN,WAAA,EAAa,8DAAA;AAAA,QACb,IAAA,EAAM,iBAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,QAAA,EAAU,MAAA;AAAA,QACV,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAmB,aAAa,4BAAA,EAA6B;AAAA,YAC/E,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAmB,MAAM,CAAC,WAAA,EAAa,UAAA,EAAY,QAAQ,CAAA;AAAE;AAC/E,SACF;AAAA,QACA,WAAA,EAAa;AAAA,UACX,EAAE,OAAO,sCAAA,EAAiC;AAAA,UAC1C,EAAE,OAAO,qCAAA;AAAsC;AACjD,OACF;AAAA,MACA;AAAA,QACE,EAAA,EAAI,iBAAA;AAAA,QACJ,IAAA,EAAM,WAAA;AAAA,QACN,WAAA,EAAa,gGAAA;AAAA,QACb,IAAA,EAAM,iBAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,QAAA,EAAU,MAAA;AAAA,QACV,YAAY,EAAE,IAAA,EAAM,QAAA,EAAmB,UAAA,EAAY,EAAC,EAAE;AAAA,QACtD,WAAA,EAAa;AAAA,UACX,EAAE,OAAO,6BAAA,EAA2B;AAAA,UACpC,EAAE,OAAO,sCAAA;AAAiC;AAC5C,OACF;AAAA,MACA;AAAA,QACE,EAAA,EAAI,0BAAA;AAAA,QACJ,IAAA,EAAM,4BAAA;AAAA,QACN,WAAA,EAAa,6CAAA;AAAA,QACb,IAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAM,SAAA;AAAA,QACN,QAAA,EAAU,MAAA;AAAA,QACV,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAmB,aAAa,gBAAA,EAAiB;AAAA,YACnE,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAmB,MAAM,CAAC,WAAA,EAAa,UAAU,CAAA;AAAE,WACrE;AAAA,UACA,QAAA,EAAU,CAAC,UAAA,EAAY,QAAQ;AAAA,SACjC;AAAA,QACA,UAAA,EAAY,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAQ,MAAA;AAAgB;AACzD,KACF;AAAA,IACA,UAAA,EAAY,cAAA;AAAA,IACZ,MAAA,EAAQ;AAAA,MACN,EAAE,IAAI,SAAA,EAAW,KAAA,EAAO,4BAAyB,WAAA,EAAa,oDAAA,EAAgD,gBAAgB,IAAA;AAAK,KACrI;AAAA,IACA,QAAA,EAAU;AAAA,MACR,GAAG,kBAAA;AAAA,MACH;AAAA,QACE,EAAA,EAAI,MAAA;AAAA,QACJ,KAAA,EAAO,OAAO,MAAA,CAAO,SAAA;AAAA,QACrB,IAAA,EAAM,iBAAA;AAAA,QACN,YAAY,MAAM;AAChB,UAAA,MAAM,eAAA,GAAgD,MACpD,KAAA,CAAM,aAAA,CAAc,mBAAA,EAAqB;AAAA,YACvC,KAAA,EAAO,eAAA;AAAA,YACP,UAAA,EAAY,cAAA;AAAA,YACZ,SAAA,EAAW;AAAA,WACZ,CAAA;AACH,UAAA,eAAA,CAAgB,WAAA,GAAc,iBAAA;AAC9B,UAAA,OAAO,eAAA;AAAA,QACT,CAAA,GAAG;AAAA,QACH,KAAA,EAAO,EAAA;AAAA,QACP,UAAA,EAAY,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAQ,MAAA;AAAgB;AACzD,KACF;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AACF","file":"index.js","sourcesContent":["import type { FullMenuDataProvider } from './types'\nimport type {\n Menu, MenuSection, MenuPlacement, MenuCategory, MenuItem, ModifierGroup,\n CreateMenuInput, UpdateMenuInput, CreateSectionInput, UpdateSectionInput, PlaceItemInput,\n CreateMenuItemInput, UpdateMenuItemInput, CreateMenuCategoryInput,\n MenuItemQuery, PaginatedResult, MenuSummary,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// In-memory backend. Seeded as a real restaurant would be — two menus, one of\n// them a weekday executive lunch — so the screen demos the thing it is for.\n// ---------------------------------------------------------------------------\n\nlet uid = 0\nfunction nextId(prefix: string) { return prefix + '-' + (++uid) }\nfunction now(): string { return new Date().toISOString() }\n\nfunction paginate<T>(items: T[], page?: number, pageSize?: number): PaginatedResult<T> {\n const p = page ?? 1\n const ps = pageSize ?? 200\n const start = (p - 1) * ps\n return { data: items.slice(start, start + ps), total: items.length }\n}\n\nconst TENANT = 'mock-tenant'\n\nexport function createMockMenuProvider(): FullMenuDataProvider {\n const ts = now()\n\n const menus: Menu[] = [\n {\n id: nextId('menu'), name: 'Cardápio principal', description: 'O de todo dia',\n isActive: true, sortOrder: 0, channels: ['pos', 'delivery', 'digital'], availability: {},\n tenantId: TENANT, createdAt: ts, updatedAt: ts,\n },\n {\n id: nextId('menu'), name: 'Executivo', description: 'Almoço de segunda a sexta',\n isActive: true, sortOrder: 1, channels: ['pos'],\n availability: { days: [1, 2, 3, 4, 5], start: '11:30', end: '15:00' },\n tenantId: TENANT, createdAt: ts, updatedAt: ts,\n },\n ]\n\n const section = (menuId: string, name: string, order: number): MenuSection => ({\n id: nextId('sec'), menuId, name, sortOrder: order, isActive: true,\n availability: {}, tenantId: TENANT, createdAt: ts, updatedAt: ts,\n })\n\n const sections: MenuSection[] = [\n section(menus[0].id, 'Entradas', 0),\n section(menus[0].id, 'Pratos principais', 1),\n section(menus[0].id, 'Bebidas', 2),\n section(menus[0].id, 'Sobremesas', 3),\n section(menus[1].id, 'Prato do dia', 0),\n section(menus[1].id, 'Bebida inclusa', 1),\n ]\n\n const item = (name: string, price: number, extra: Partial<MenuItem> = {}): MenuItem => ({\n id: nextId('mi'), name, price, currency: 'BRL', status: 'available', isActive: true,\n availableForPos: true, availableForDelivery: true, sortOrder: 0, isFeatured: false,\n allergens: [], dietaryTags: [],\n tenantId: TENANT, createdAt: ts, updatedAt: ts, ...extra,\n })\n\n const items: MenuItem[] = [\n item('Bolinho de bacalhau', 38, { description: '6 unidades', prepTimeMinutes: 15 }),\n item('Pão de alho', 18, { prepTimeMinutes: 8, dietaryTags: ['Vegetariano'] }),\n item('Picanha na chapa', 129, { description: 'Serve 2 pessoas', prepTimeMinutes: 25, isFeatured: true }),\n item('Moqueca de peixe', 98, { prepTimeMinutes: 30, allergens: ['Frutos do mar'] }),\n item('Risoto de funghi', 72, { prepTimeMinutes: 22, dietaryTags: ['Vegetariano'] }),\n item('Suco natural', 14, { prepTimeMinutes: 3 }),\n item('Refrigerante', 9, { prepTimeMinutes: 1 }),\n item('Água', 6, { prepTimeMinutes: 1 }),\n item('Pudim da casa', 19, { prepTimeMinutes: 2, isFeatured: true }),\n item('Petit gâteau', 26, { prepTimeMinutes: 12, allergens: ['Glúten', 'Lactose'] }),\n item('Prato executivo do dia', 42, { description: 'Prato + bebida', prepTimeMinutes: 15 }),\n ]\n\n const placement = (sectionId: string, itemId: string, order: number, priceOverride?: number): MenuPlacement => ({\n id: nextId('pl'), sectionId, itemId, sortOrder: order, priceOverride, isActive: true, tenantId: TENANT,\n })\n\n const placements: MenuPlacement[] = [\n placement(sections[0].id, items[0].id, 0),\n placement(sections[0].id, items[1].id, 1),\n placement(sections[1].id, items[2].id, 0),\n placement(sections[1].id, items[3].id, 1),\n placement(sections[1].id, items[4].id, 2),\n placement(sections[2].id, items[5].id, 0),\n placement(sections[2].id, items[6].id, 1),\n placement(sections[2].id, items[7].id, 2),\n placement(sections[3].id, items[8].id, 0),\n placement(sections[3].id, items[9].id, 1),\n placement(sections[4].id, items[10].id, 0),\n // The same risotto, cheaper at lunch — the reason placements carry a price.\n placement(sections[4].id, items[4].id, 1, 49),\n placement(sections[5].id, items[5].id, 0, 0),\n ]\n\n const categories: MenuCategory[] = []\n\n const g1 = nextId('mg')\n const g2 = nextId('mg')\n const modifierGroups: ModifierGroup[] = [\n {\n id: g1, name: 'Ponto da carne', minSelections: 1, maxSelections: 1, isRequired: true, sortOrder: 0,\n tenantId: TENANT, createdAt: ts,\n items: [\n { id: nextId('mod'), groupId: g1, name: 'Mal passada', priceAdjustment: 0, isActive: true, sortOrder: 0 },\n { id: nextId('mod'), groupId: g1, name: 'Ao ponto', priceAdjustment: 0, isActive: true, sortOrder: 1 },\n { id: nextId('mod'), groupId: g1, name: 'Bem passada', priceAdjustment: 0, isActive: true, sortOrder: 2 },\n ],\n },\n {\n id: g2, name: 'Acompanhamentos', minSelections: 0, maxSelections: 3, isRequired: false, sortOrder: 1,\n tenantId: TENANT, createdAt: ts,\n items: [\n { id: nextId('mod'), groupId: g2, name: 'Farofa', priceAdjustment: 8, isActive: true, sortOrder: 0 },\n { id: nextId('mod'), groupId: g2, name: 'Vinagrete', priceAdjustment: 6, isActive: true, sortOrder: 1 },\n { id: nextId('mod'), groupId: g2, name: 'Arroz branco', priceAdjustment: 10, isActive: true, sortOrder: 2 },\n ],\n },\n ]\n\n const provider: FullMenuDataProvider = {\n // --- Menus ---\n async getMenus() {\n return menus.map((m) => {\n const mine = sections.filter((s) => s.menuId === m.id)\n const ids = new Set(mine.map((s) => s.id))\n return { ...m, sectionCount: mine.length, itemCount: placements.filter((p) => ids.has(p.sectionId)).length }\n }).sort((a, b) => a.sortOrder - b.sortOrder)\n },\n async createMenu(input: CreateMenuInput) {\n const menu: Menu = {\n id: nextId('menu'), name: input.name, description: input.description,\n isActive: input.isActive ?? true, sortOrder: input.sortOrder ?? menus.length,\n channels: input.channels ?? ['pos', 'delivery', 'digital'],\n availability: input.availability ?? {},\n tenantId: TENANT, createdAt: now(), updatedAt: now(),\n }\n menus.push(menu)\n return menu\n },\n async updateMenu(id: string, patch: UpdateMenuInput) {\n const menu = menus.find((m) => m.id === id)\n if (!menu) throw new Error('Menu not found')\n Object.assign(menu, patch, { updatedAt: now() })\n return menu\n },\n async deleteMenu(id: string) {\n const mine = sections.filter((s) => s.menuId === id)\n for (const s of mine) {\n for (let i = placements.length - 1; i >= 0; i--) if (placements[i].sectionId === s.id) placements.splice(i, 1)\n sections.splice(sections.indexOf(s), 1)\n }\n const index = menus.findIndex((m) => m.id === id)\n if (index >= 0) menus.splice(index, 1)\n },\n async duplicateMenu(id: string, name: string) {\n const source = menus.find((m) => m.id === id)\n if (!source) throw new Error('Menu not found')\n const copy = await provider.createMenu({\n name, description: source.description, channels: source.channels,\n availability: source.availability, isActive: false,\n })\n for (const s of sections.filter((x) => x.menuId === id)) {\n const clone = await provider.createSection({\n menuId: copy.id, name: s.name, description: s.description,\n sortOrder: s.sortOrder, isActive: s.isActive, availability: s.availability,\n })\n for (const p of placements.filter((x) => x.sectionId === s.id)) {\n await provider.placeItem({\n sectionId: clone.id, itemId: p.itemId, sortOrder: p.sortOrder,\n priceOverride: p.priceOverride, isActive: p.isActive,\n })\n }\n }\n return copy\n },\n async reorderMenus(ids: string[]) {\n ids.forEach((id, index) => {\n const menu = menus.find((m) => m.id === id)\n if (menu) menu.sortOrder = index\n })\n },\n\n // --- Sections ---\n async getSections(menuId: string) {\n return sections.filter((s) => s.menuId === menuId).sort((a, b) => a.sortOrder - b.sortOrder)\n },\n async createSection(input: CreateSectionInput) {\n const created: MenuSection = {\n id: nextId('sec'), menuId: input.menuId, name: input.name,\n description: input.description, imageUrl: input.imageUrl,\n sortOrder: input.sortOrder ?? sections.filter((s) => s.menuId === input.menuId).length,\n isActive: input.isActive ?? true, availability: input.availability ?? {},\n tenantId: TENANT, createdAt: now(), updatedAt: now(),\n }\n sections.push(created)\n return created\n },\n async updateSection(id: string, patch: UpdateSectionInput) {\n const found = sections.find((s) => s.id === id)\n if (!found) throw new Error('Section not found')\n Object.assign(found, patch, { updatedAt: now() })\n return found\n },\n async deleteSection(id: string) {\n for (let i = placements.length - 1; i >= 0; i--) if (placements[i].sectionId === id) placements.splice(i, 1)\n const index = sections.findIndex((s) => s.id === id)\n if (index >= 0) sections.splice(index, 1)\n },\n async reorderSections(_menuId: string, ids: string[]) {\n ids.forEach((id, index) => {\n const found = sections.find((s) => s.id === id)\n if (found) found.sortOrder = index\n })\n },\n\n // --- Placements ---\n async getPlacements(menuId: string) {\n const ids = new Set(sections.filter((s) => s.menuId === menuId).map((s) => s.id))\n return placements.filter((p) => ids.has(p.sectionId)).sort((a, b) => a.sortOrder - b.sortOrder)\n },\n async placeItem(input: PlaceItemInput) {\n const existing = placements.find((p) => p.sectionId === input.sectionId && p.itemId === input.itemId)\n if (existing) {\n Object.assign(existing, input)\n return existing\n }\n const created = placement(\n input.sectionId, input.itemId,\n input.sortOrder ?? placements.filter((p) => p.sectionId === input.sectionId).length,\n input.priceOverride,\n )\n created.isActive = input.isActive ?? true\n placements.push(created)\n return created\n },\n async updatePlacement(id: string, patch: Partial<PlaceItemInput>) {\n const found = placements.find((p) => p.id === id)\n if (!found) throw new Error('Placement not found')\n if (patch.sectionId !== undefined) found.sectionId = patch.sectionId\n if (patch.sortOrder !== undefined) found.sortOrder = patch.sortOrder\n if (patch.priceOverride !== undefined) found.priceOverride = patch.priceOverride\n if (patch.isActive !== undefined) found.isActive = patch.isActive\n return found\n },\n async removePlacement(id: string) {\n const index = placements.findIndex((p) => p.id === id)\n if (index >= 0) placements.splice(index, 1)\n },\n async reorderPlacements(_sectionId: string, ids: string[]) {\n ids.forEach((id, index) => {\n const found = placements.find((p) => p.id === id)\n if (found) found.sortOrder = index\n })\n },\n async movePlacement(id: string, toSectionId: string, toIndex: number) {\n const found = placements.find((p) => p.id === id)\n if (!found) return\n found.sectionId = toSectionId\n found.sortOrder = toIndex\n placements\n .filter((p) => p.sectionId === toSectionId && p.id !== id)\n .sort((a, b) => a.sortOrder - b.sortOrder)\n .forEach((p, i) => { p.sortOrder = i >= toIndex ? i + 1 : i })\n },\n\n // --- Media ---\n async uploadImage(file: File) {\n // No bucket in memory: the object URL lives as long as the tab, which is\n // exactly as long as this provider's data does.\n return typeof URL !== 'undefined' && URL.createObjectURL ? URL.createObjectURL(file) : ''\n },\n\n // --- Categories (legacy surface, still answered) ---\n async getCategories() { return [...categories].sort((a, b) => a.sortOrder - b.sortOrder) },\n async getCategoryById(id: string) { return categories.find((c) => c.id === id) ?? null },\n async createCategory(input: CreateMenuCategoryInput) {\n const created: MenuCategory = {\n id: nextId('cat'), name: input.name, parentId: input.parentId, icon: input.icon, color: input.color,\n sortOrder: input.sortOrder ?? categories.length, isActive: true,\n tenantId: TENANT, createdAt: now(), updatedAt: now(),\n }\n categories.push(created)\n return created\n },\n async updateCategory(id: string, patch: Partial<MenuCategory>) {\n const found = categories.find((c) => c.id === id)\n if (!found) throw new Error('Category not found')\n Object.assign(found, patch, { updatedAt: now() })\n return found\n },\n async deleteCategory(id: string) {\n const index = categories.findIndex((c) => c.id === id)\n if (index >= 0) categories.splice(index, 1)\n },\n async reorderCategories(ids: string[]) {\n ids.forEach((id, index) => {\n const found = categories.find((c) => c.id === id)\n if (found) found.sortOrder = index\n })\n },\n\n // --- Items ---\n async getMenuItems(query: MenuItemQuery) {\n let result = [...items]\n if (query.search) {\n const term = query.search.toLowerCase()\n result = result.filter((i) => i.name.toLowerCase().includes(term) || (i.description ?? '').toLowerCase().includes(term))\n }\n if (query.categoryId) result = result.filter((i) => i.categoryId === query.categoryId)\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n result = result.filter((i) => statuses.includes(i.status))\n }\n if (query.availableForPos !== undefined) result = result.filter((i) => i.availableForPos === query.availableForPos)\n if (query.availableForDelivery !== undefined) result = result.filter((i) => i.availableForDelivery === query.availableForDelivery)\n if (query.isFeatured !== undefined) result = result.filter((i) => i.isFeatured === query.isFeatured)\n return paginate(result, query.page, query.pageSize)\n },\n async getMenuItemById(id: string) { return items.find((i) => i.id === id) ?? null },\n async createMenuItem(input: CreateMenuItemInput) {\n const created = item(input.name, input.price, {\n description: input.description, cost: input.cost, imageUrl: input.imageUrl,\n categoryId: input.categoryId, status: input.status ?? 'available',\n prepTimeMinutes: input.prepTimeMinutes, allergens: input.allergens ?? [],\n dietaryTags: input.dietaryTags ?? [],\n availableForPos: input.availableForPos ?? true,\n availableForDelivery: input.availableForDelivery ?? true,\n deliveryPrice: input.deliveryPrice, isFeatured: input.isFeatured ?? false,\n modifierGroupIds: input.modifierGroupIds,\n })\n items.push(created)\n if (input.sectionId) await provider.placeItem({ sectionId: input.sectionId, itemId: created.id })\n return created\n },\n async updateMenuItem(id: string, patch: UpdateMenuItemInput) {\n const found = items.find((i) => i.id === id)\n if (!found) throw new Error('Item not found')\n Object.assign(found, patch, { updatedAt: now() })\n return found\n },\n async deleteMenuItem(id: string) {\n for (let i = placements.length - 1; i >= 0; i--) if (placements[i].itemId === id) placements.splice(i, 1)\n const index = items.findIndex((i) => i.id === id)\n if (index >= 0) items.splice(index, 1)\n },\n async toggleAvailability(id: string, field, value) {\n const found = items.find((i) => i.id === id)\n if (!found) throw new Error('Item not found')\n ;(found as any)[field] = value\n found.updatedAt = now()\n return found\n },\n async reorderItems(_categoryId: string, ids: string[]) {\n ids.forEach((id, index) => {\n const found = items.find((i) => i.id === id)\n if (found) found.sortOrder = index\n })\n },\n\n // --- Modifier groups ---\n async getModifierGroups() { return [...modifierGroups].sort((a, b) => a.sortOrder - b.sortOrder) },\n async createModifierGroup(input: Partial<ModifierGroup>) {\n const created: ModifierGroup = {\n id: nextId('mg'), name: input.name ?? 'Grupo',\n minSelections: input.minSelections ?? 0, maxSelections: input.maxSelections ?? 1,\n isRequired: input.isRequired ?? false, sortOrder: input.sortOrder ?? modifierGroups.length,\n items: input.items ?? [], tenantId: TENANT, createdAt: now(),\n }\n modifierGroups.push(created)\n return created\n },\n async updateModifierGroup(id: string, patch: Partial<ModifierGroup>) {\n const found = modifierGroups.find((g) => g.id === id)\n if (!found) throw new Error('Modifier group not found')\n Object.assign(found, patch)\n return found\n },\n async deleteModifierGroup(id: string) {\n const index = modifierGroups.findIndex((g) => g.id === id)\n if (index >= 0) modifierGroups.splice(index, 1)\n },\n\n // --- Summary ---\n async getSummary(): Promise<MenuSummary> {\n const prices = items.map((i) => i.price)\n return {\n totalItems: items.length,\n availableItems: items.filter((i) => i.status === 'available').length,\n soldOutItems: items.filter((i) => i.status === 'sold_out').length,\n hiddenItems: items.filter((i) => i.status === 'hidden').length,\n categoryCount: sections.length,\n averagePrice: prices.length ? prices.reduce((a, b) => a + b, 0) / prices.length : 0,\n featuredCount: items.filter((i) => i.isFeatured).length,\n }\n },\n }\n\n return provider\n}\n","// ---------------------------------------------------------------------------\n// O CARDÁPIO TEM O RELÓGIO DELE.\n//\n// Medido no Pertinho do Céu (1.381 produtos ativos, 208 mesas): ler o cardápio\n// inteiro custa 2 requisições e ~1,3 MB de JSON — o `select('*')` traz\n// `description`, `metadata`, `custom_fields` e `tags` de cada produto, e o PDV\n// usa sete campos. Antes desta camada esse mesmo 1,3 MB descia a cada abertura\n// do PDV, a cada «acomodar cliente» (`data.reload()`) e mais uma vez logo após\n// a carga das comandas, porque a política de isenção de taxa entrava na chave\n// do efeito. Num salão cheio com internet ruim é o PDV parado na mão do garçom.\n//\n// A regra aqui é uma só: o cardápio muda em escala de HORAS, a comanda muda em\n// SEGUNDOS — então eles não podem compartilhar gatilho. Quem lê o cardápio lê\n// esta cópia; quem precisa saber que um item acabou pede uma REVALIDAÇÃO, que\n// acontece por trás sem nunca tirar da tela o cardápio que já estava lá.\n//\n// O armazém é o `globalCache` do core — não um motor novo. Ele já morre\n// sozinho na troca de conta (`clearGlobalCache`), que é exatamente o que a\n// troca de unidade precisa. O TTL do `globalCache` fica LONGO de propósito: a\n// validade real é decidida por `catalogAge`, porque servir cópia velha\n// enquanto se revalida é o comportamento desejado, e uma entrada expirada no\n// armazém não teria o que servir.\n// ---------------------------------------------------------------------------\n\nimport { globalCache, stableKey } from '@fayz-ai/core'\nimport type { MenuCategory, MenuItem } from '../types'\nimport type { MenuDataProvider } from './types'\n\n/** Uma cópia do cardápio, com a hora em que ela saiu do banco. */\nexport interface MenuCatalog {\n items: MenuItem[]\n categories: MenuCategory[]\n /** Epoch ms de quando esta cópia foi lida. */\n fetchedAt: number\n}\n\n/** Depois disto a cópia continua servindo, mas pede revalidação por trás. */\nexport const MENU_CATALOG_TTL = 5 * 60_000\n\n/**\n * Quanto o armazém guarda a cópia mesmo velha.\n *\n * Doze horas é mais que um serviço inteiro: o terminal que abriu às 11h e\n * ficou o dia todo no ar sempre tem o que mostrar enquanto a rede não volta.\n */\nconst STORE_TTL = 12 * 60 * 60_000\n\n/** Quantos produtos por ida ao banco. O PostgREST costuma cortar em 1000. */\nconst PAGE_SIZE = 1000\n\nexport type CatalogAge = 'missing' | 'fresh' | 'stale'\n\n/**\n * A regra pura: esta cópia serve? precisa revalidar?\n *\n * `missing` é o único caso em que a tela espera. `stale` serve e revalida —\n * nunca volta ao esqueleto.\n */\nexport function catalogAge(\n catalog: MenuCatalog | undefined | null,\n now: number,\n ttlMs: number = MENU_CATALOG_TTL,\n): CatalogAge {\n if (!catalog) return 'missing'\n // Relógio do terminal que anda para trás não pode transformar cópia boa em\n // velha para sempre: idade negativa conta como zero.\n const age = Math.max(0, now - catalog.fetchedAt)\n return age >= ttlMs ? 'stale' : 'fresh'\n}\n\n/** A conta e a unidade mandam: um cardápio por casa, e a unidade recorta. */\nexport function menuCatalogKey(tenantId?: string | null, unitId?: string | null): string {\n return `menu-catalog:${stableKey({ t: tenantId ?? '_', u: unitId ?? '_' })}`\n}\n\nexport function readCachedCatalog(key: string): MenuCatalog | undefined {\n return globalCache.get<MenuCatalog>(key)\n}\n\n/** Joga fora a cópia — o cadastro mexeu no cardápio, ou o operador pediu. */\nexport function invalidateMenuCatalog(key?: string): void {\n globalCache.invalidate(key ?? 'menu-catalog:')\n}\n\n/**\n * O cardápio INTEIRO, em páginas.\n *\n * `pageSize: 1000` cravado escondia 381 dos 1.381 itens do Pertinho: o\n * PostgREST devolve o `total` e ninguém o lia, então o terceiro terço do\n * cardápio simplesmente não existia no PDV. Aqui a primeira página diz quantas\n * faltam e as restantes vão juntas.\n */\nexport async function fetchMenuCatalog(\n provider: Pick<MenuDataProvider, 'getMenuItems' | 'getCategories'>,\n now: () => number = Date.now,\n): Promise<MenuCatalog> {\n const [categories, first] = await Promise.all([\n provider.getCategories(),\n // `projection: 'summary'` corta ~80% do payload: o PDV usa nome, preço,\n // código, foto e categoria, e não a ficha inteira do produto.\n provider.getMenuItems({ pageSize: PAGE_SIZE, page: 1, projection: 'summary' }),\n ])\n\n const items = [...first.data]\n const totalPages = Math.max(1, Math.ceil((first.total || items.length) / PAGE_SIZE))\n if (totalPages > 1) {\n const rest = await Promise.all(\n Array.from({ length: totalPages - 1 }, (_, i) =>\n provider.getMenuItems({ pageSize: PAGE_SIZE, page: i + 2, projection: 'summary' })),\n )\n for (const page of rest) items.push(...page.data)\n }\n\n return { items, categories, fetchedAt: now() }\n}\n\n/** Uma carga por chave de cada vez — dois consumidores não pagam duas idas. */\nconst inFlight = new Map<string, Promise<MenuCatalog>>()\n\nexport interface LoadMenuCatalogOptions {\n /** Ignora a cópia e vai ao banco — o gesto explícito de «atualizar». */\n force?: boolean\n /** Depois de quanto tempo a cópia é velha. */\n ttlMs?: number\n now?: () => number\n}\n\n/**\n * A porta única: devolve a cópia boa sem ir ao banco, ou vai buscar.\n *\n * Quem quer o comportamento «serve o velho e revalida por trás» lê\n * `readCachedCatalog` primeiro e chama isto sem esperar — é o que o hook do\n * PDV faz. Quem só precisa de um cardápio qualquer (o mapa produto→categoria\n * da isenção de taxa, por exemplo) chama direto e quase sempre acerta o cache.\n */\nexport function loadMenuCatalog(\n provider: Pick<MenuDataProvider, 'getMenuItems' | 'getCategories'>,\n key: string,\n options?: LoadMenuCatalogOptions,\n): Promise<MenuCatalog> {\n const now = options?.now ?? Date.now\n if (!options?.force) {\n const cached = readCachedCatalog(key)\n if (catalogAge(cached, now(), options?.ttlMs) === 'fresh') return Promise.resolve(cached!)\n }\n const running = inFlight.get(key)\n if (running) return running\n\n const task = fetchMenuCatalog(provider, now)\n .then((catalog) => {\n globalCache.set(key, catalog, STORE_TTL)\n return catalog\n })\n .finally(() => { inFlight.delete(key) })\n\n inFlight.set(key, task)\n return task\n}\n","// Central physical-table-name registry for plugin-menu.\nexport const T = {\n menus: 'plg_menu_menus',\n sections: 'plg_menu_sections',\n placements: 'plg_menu_placements',\n items: 'plg_menu_items',\n allergens: 'plg_menu_allergens',\n dietaryTags: 'plg_menu_dietary_tags',\n modifierGroups: 'plg_menu_modifier_groups',\n modifiers: 'plg_menu_modifiers',\n itemModifierGroups: 'plg_menu_item_modifier_groups',\n /** Spine tables this plugin reads/writes through. */\n products: 'products',\n categories: 'categories',\n /** Bucket for item, section and import photos. */\n mediaBucket: 'menu-images',\n} as const\n","import { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\n\nimport type { FullMenuDataProvider } from './types'\nimport { invalidateMenuCatalog } from './catalog-cache'\nimport { T } from './tables'\nimport type {\n Menu, MenuSection, MenuPlacement, MenuCategory, MenuItem, ModifierGroup,\n MenuChannel, MenuAvailability,\n CreateMenuInput, UpdateMenuInput, CreateSectionInput, UpdateSectionInput, PlaceItemInput,\n CreateMenuItemInput, UpdateMenuItemInput, CreateMenuCategoryInput,\n MenuItemQuery, PaginatedResult, MenuSummary, MenuItemStatus,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// The plugin's own backend.\n//\n// Items are products (the spine) — a dish that is also stock, also a POS line,\n// is ONE record. plg_menu_items carries only what is menu-specific about it,\n// and a product becomes a menu item the moment that row exists.\n// ---------------------------------------------------------------------------\n\nconst CATEGORY_KIND = 'menu_category'\n\nfunction rowToMenu(row: any, counts?: { sections: number; items: number }): Menu {\n return {\n id: row.id,\n name: row.name,\n description: row.description ?? undefined,\n isActive: row.is_active ?? true,\n sortOrder: row.sort_order ?? 0,\n channels: (row.channels ?? ['pos', 'delivery', 'digital']) as MenuChannel[],\n availability: (row.availability ?? {}) as MenuAvailability,\n sectionCount: counts?.sections,\n itemCount: counts?.items,\n tenantId: row.tenant_id,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToSection(row: any): MenuSection {\n return {\n id: row.id,\n menuId: row.menu_id,\n name: row.name,\n description: row.description ?? undefined,\n imageUrl: row.image_url ?? undefined,\n sortOrder: row.sort_order ?? 0,\n isActive: row.is_active ?? true,\n availability: (row.availability ?? {}) as MenuAvailability,\n tenantId: row.tenant_id,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToPlacement(row: any): MenuPlacement {\n return {\n id: row.id,\n sectionId: row.section_id,\n itemId: row.item_id,\n sortOrder: row.sort_order ?? 0,\n priceOverride: row.price_override ?? undefined,\n isActive: row.is_active ?? true,\n tenantId: row.tenant_id,\n }\n}\n\nfunction rowToCategory(row: any): MenuCategory {\n return {\n id: row.id,\n name: row.name,\n parentId: row.parent_id ?? undefined,\n icon: row.icon ?? undefined,\n color: row.color ?? undefined,\n sortOrder: row.sort_order ?? 0,\n isActive: row.is_active ?? true,\n tenantId: row.tenant_id,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\n/** products row + its plg_menu_items extension (embedded or fetched apart). */\nfunction rowToItem(row: any, currency: string): MenuItem {\n const ext = Array.isArray(row.plg_menu_items) ? row.plg_menu_items[0] : row.plg_menu_items\n const meta = row.metadata ?? {}\n return {\n id: row.id,\n name: row.name,\n description: row.description ?? undefined,\n price: Number(row.price ?? 0),\n cost: row.cost != null ? Number(row.cost) : undefined,\n currency,\n sku: row.sku ?? undefined,\n imageUrl: row.image_url ?? undefined,\n categoryId: row.category_id ?? undefined,\n // O nome da categoria vem JUNTO do item, pela relação, e não de uma\n // segunda leitura. `MenuItem.categoryName` existia no tipo e nunca era\n // preenchido: quem consumia caía num rótulo genérico e o segmentado do PDV\n // saía com quinze abas escritas \"Cardápio\". Campo vazio na tela é sintoma.\n categoryName: (Array.isArray(row.categories) ? row.categories[0] : row.categories)?.name ?? undefined,\n status: (ext?.status ?? 'available') as MenuItemStatus,\n isActive: row.is_active ?? true,\n prepTimeMinutes: ext?.prep_time_minutes ?? undefined,\n allergens: ext?.allergens ?? [],\n dietaryTags: ext?.dietary_tags ?? [],\n availableForPos: ext?.available_for_pos ?? true,\n availableForDelivery: ext?.available_for_delivery ?? true,\n deliveryPrice: ext?.delivery_price != null ? Number(ext.delivery_price) : undefined,\n sortOrder: ext?.sort_order ?? 0,\n isFeatured: ext?.is_featured ?? false,\n metadata: meta,\n tenantId: row.tenant_id,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nexport interface SupabaseMenuProviderOptions {\n /** Currency code stamped on items — display only. */\n currencyCode?: string\n}\n\nexport function createSupabaseMenuProvider(options?: SupabaseMenuProviderOptions): FullMenuDataProvider {\n const currency = options?.currencyCode ?? 'BRL'\n\n // Lazy: the client exists only after the app boots.\n function db() {\n const client = getSupabaseClientOptional() as any\n if (!client) throw new Error('Supabase not initialized')\n return client\n }\n function tenant(): string | undefined {\n return getActiveTenantId() ?? undefined\n }\n function fail(error: { message?: string } | null): void {\n if (error) throw new Error(error.message ?? 'Menu request failed')\n }\n async function nextOrder(table: string, column: string, value: string): Promise<number> {\n const { data } = await db().from(table).select('sort_order').eq(column, value)\n .order('sort_order', { ascending: false }).limit(1)\n return ((data?.[0]?.sort_order ?? 0) as number) + 1\n }\n\n const provider: FullMenuDataProvider = {\n // --- Menus -------------------------------------------------------------\n async getMenus(): Promise<Menu[]> {\n const { data, error } = await db().from(T.menus).select('*').order('sort_order', { ascending: true })\n fail(error)\n let menus = data ?? []\n // A workspace that never had a menu gets one rather than an empty screen\n // with nowhere to put the first dish.\n if (menus.length === 0) {\n const created = await provider.createMenu({ name: 'Cardápio principal' })\n menus = [{ ...created, is_active: true, sort_order: 0, tenant_id: created.tenantId,\n created_at: created.createdAt, updated_at: created.updatedAt, availability: {}, channels: created.channels }]\n }\n // Counts come from two flat reads and are folded here: PostgREST has no\n // group-by, and a menu never has enough rows for it to matter.\n const menuIds = menus.map((m: any) => m.id)\n const { data: sections } = await db().from(T.sections).select('id, menu_id').in('menu_id', menuIds)\n const sectionIds = (sections ?? []).map((s: any) => s.id)\n const { data: placements } = sectionIds.length\n ? await db().from(T.placements).select('section_id').in('section_id', sectionIds)\n : { data: [] as any[] }\n const sectionToMenu = new Map<string, string>((sections ?? []).map((s: any) => [s.id, s.menu_id]))\n return menus.map((row: any) => {\n const mySections = (sections ?? []).filter((s: any) => s.menu_id === row.id)\n const myItems = (placements ?? []).filter((p: any) => sectionToMenu.get(p.section_id) === row.id)\n return rowToMenu(row, { sections: mySections.length, items: myItems.length })\n })\n },\n\n async createMenu(input: CreateMenuInput): Promise<Menu> {\n const { data, error } = await db().from(T.menus).insert({\n tenant_id: tenant(),\n name: input.name,\n description: input.description ?? null,\n is_active: input.isActive ?? true,\n sort_order: input.sortOrder ?? (await nextOrder(T.menus, 'tenant_id', tenant() ?? '')),\n channels: input.channels ?? ['pos', 'delivery', 'digital'],\n availability: input.availability ?? {},\n }).select().single()\n fail(error)\n return rowToMenu(data)\n },\n\n async updateMenu(id: string, patch: UpdateMenuInput): Promise<Menu> {\n const row: Record<string, unknown> = { updated_at: new Date().toISOString() }\n if (patch.name !== undefined) row.name = patch.name\n if (patch.description !== undefined) row.description = patch.description\n if (patch.isActive !== undefined) row.is_active = patch.isActive\n if (patch.sortOrder !== undefined) row.sort_order = patch.sortOrder\n if (patch.channels !== undefined) row.channels = patch.channels\n if (patch.availability !== undefined) row.availability = patch.availability\n const { data, error } = await db().from(T.menus).update(row).eq('id', id).select().single()\n fail(error)\n return rowToMenu(data)\n },\n\n async deleteMenu(id: string): Promise<void> {\n // Sections and placements cascade; the products stay — deleting a menu\n // must never delete the restaurant's dishes.\n const { error } = await db().from(T.menus).delete().eq('id', id)\n fail(error)\n },\n\n async duplicateMenu(id: string, name: string): Promise<Menu> {\n const { data: source, error } = await db().from(T.menus).select('*').eq('id', id).single()\n fail(error)\n const copy = await provider.createMenu({\n name,\n description: source.description ?? undefined,\n channels: source.channels,\n availability: source.availability,\n isActive: false, // a copy starts off-air: it is edited before it is served\n })\n const sections = await provider.getSections(id)\n const placements = await provider.getPlacements(id)\n for (const section of sections) {\n const clone = await provider.createSection({\n menuId: copy.id,\n name: section.name,\n description: section.description,\n imageUrl: section.imageUrl,\n sortOrder: section.sortOrder,\n isActive: section.isActive,\n availability: section.availability,\n })\n const mine = placements.filter((p) => p.sectionId === section.id)\n for (const placement of mine) {\n await provider.placeItem({\n sectionId: clone.id,\n itemId: placement.itemId,\n sortOrder: placement.sortOrder,\n priceOverride: placement.priceOverride,\n isActive: placement.isActive,\n })\n }\n }\n return copy\n },\n\n async reorderMenus(ids: string[]): Promise<void> {\n await Promise.all(ids.map((id, index) =>\n db().from(T.menus).update({ sort_order: index }).eq('id', id)))\n },\n\n // --- Sections ----------------------------------------------------------\n async getSections(menuId: string): Promise<MenuSection[]> {\n const { data, error } = await db().from(T.sections).select('*')\n .eq('menu_id', menuId).order('sort_order', { ascending: true })\n fail(error)\n return (data ?? []).map(rowToSection)\n },\n\n async createSection(input: CreateSectionInput): Promise<MenuSection> {\n const { data, error } = await db().from(T.sections).insert({\n tenant_id: tenant(),\n menu_id: input.menuId,\n name: input.name,\n description: input.description ?? null,\n image_url: input.imageUrl ?? null,\n sort_order: input.sortOrder ?? (await nextOrder(T.sections, 'menu_id', input.menuId)),\n is_active: input.isActive ?? true,\n availability: input.availability ?? {},\n }).select().single()\n fail(error)\n return rowToSection(data)\n },\n\n async updateSection(id: string, patch: UpdateSectionInput): Promise<MenuSection> {\n const row: Record<string, unknown> = { updated_at: new Date().toISOString() }\n if (patch.name !== undefined) row.name = patch.name\n if (patch.description !== undefined) row.description = patch.description\n if (patch.imageUrl !== undefined) row.image_url = patch.imageUrl\n if (patch.sortOrder !== undefined) row.sort_order = patch.sortOrder\n if (patch.isActive !== undefined) row.is_active = patch.isActive\n if (patch.availability !== undefined) row.availability = patch.availability\n const { data, error } = await db().from(T.sections).update(row).eq('id', id).select().single()\n fail(error)\n return rowToSection(data)\n },\n\n async deleteSection(id: string): Promise<void> {\n const { error } = await db().from(T.sections).delete().eq('id', id)\n fail(error)\n },\n\n async reorderSections(_menuId: string, ids: string[]): Promise<void> {\n await Promise.all(ids.map((id, index) =>\n db().from(T.sections).update({ sort_order: index }).eq('id', id)))\n },\n\n // --- Placements --------------------------------------------------------\n async getPlacements(menuId: string): Promise<MenuPlacement[]> {\n const { data: sections } = await db().from(T.sections).select('id').eq('menu_id', menuId)\n const ids = (sections ?? []).map((s: any) => s.id)\n if (ids.length === 0) return []\n const { data, error } = await db().from(T.placements).select('*')\n .in('section_id', ids).order('sort_order', { ascending: true })\n fail(error)\n return (data ?? []).map(rowToPlacement)\n },\n\n async placeItem(input: PlaceItemInput): Promise<MenuPlacement> {\n const { data, error } = await db().from(T.placements).upsert({\n tenant_id: tenant(),\n section_id: input.sectionId,\n item_id: input.itemId,\n sort_order: input.sortOrder ?? (await nextOrder(T.placements, 'section_id', input.sectionId)),\n price_override: input.priceOverride ?? null,\n is_active: input.isActive ?? true,\n }, { onConflict: 'section_id,item_id' }).select().single()\n fail(error)\n return rowToPlacement(data)\n },\n\n async updatePlacement(id: string, patch: Partial<PlaceItemInput>): Promise<MenuPlacement> {\n const row: Record<string, unknown> = { updated_at: new Date().toISOString() }\n if (patch.sectionId !== undefined) row.section_id = patch.sectionId\n if (patch.sortOrder !== undefined) row.sort_order = patch.sortOrder\n if (patch.priceOverride !== undefined) row.price_override = patch.priceOverride\n if (patch.isActive !== undefined) row.is_active = patch.isActive\n const { data, error } = await db().from(T.placements).update(row).eq('id', id).select().single()\n fail(error)\n return rowToPlacement(data)\n },\n\n async removePlacement(id: string): Promise<void> {\n const { error } = await db().from(T.placements).delete().eq('id', id)\n fail(error)\n },\n\n async reorderPlacements(_sectionId: string, placementIds: string[]): Promise<void> {\n await Promise.all(placementIds.map((id, index) =>\n db().from(T.placements).update({ sort_order: index }).eq('id', id)))\n },\n\n async movePlacement(placementId: string, toSectionId: string, toIndex: number): Promise<void> {\n const { error } = await db().from(T.placements)\n .update({ section_id: toSectionId, sort_order: toIndex, updated_at: new Date().toISOString() })\n .eq('id', placementId)\n fail(error)\n },\n\n // --- Media -------------------------------------------------------------\n async uploadImage(file: File, kind: 'item' | 'section' | 'menu' | 'import'): Promise<string> {\n const tenantId = tenant()\n if (!tenantId) throw new Error('No active workspace for the upload')\n const ext = (file.name.split('.').pop() ?? 'jpg').toLowerCase().replace(/[^a-z0-9]/g, '') || 'jpg'\n const path = `${tenantId}/${kind}/${crypto.randomUUID()}.${ext}`\n const { error } = await db().storage.from(T.mediaBucket)\n .upload(path, file, { contentType: file.type, upsert: false })\n fail(error)\n const { data } = db().storage.from(T.mediaBucket).getPublicUrl(path)\n return data.publicUrl\n },\n\n // --- Categories (legacy flat grouping, still readable) -----------------\n async getCategories(): Promise<MenuCategory[]> {\n const { data, error } = await db().from(T.categories).select('*')\n .eq('kind', CATEGORY_KIND).order('sort_order', { ascending: true })\n fail(error)\n return (data ?? []).map(rowToCategory)\n },\n\n async getCategoryById(id: string): Promise<MenuCategory | null> {\n const { data } = await db().from(T.categories).select('*').eq('id', id).maybeSingle()\n return data ? rowToCategory(data) : null\n },\n\n async createCategory(input: CreateMenuCategoryInput): Promise<MenuCategory> {\n const { data, error } = await db().from(T.categories).insert({\n tenant_id: tenant(),\n kind: CATEGORY_KIND,\n name: input.name,\n parent_id: input.parentId ?? null,\n icon: input.icon ?? null,\n color: input.color ?? null,\n sort_order: input.sortOrder ?? 0,\n is_active: true,\n }).select().single()\n fail(error)\n return rowToCategory(data)\n },\n\n async updateCategory(id: string, patch: Partial<MenuCategory>): Promise<MenuCategory> {\n const row: Record<string, unknown> = {}\n if (patch.name !== undefined) row.name = patch.name\n if (patch.sortOrder !== undefined) row.sort_order = patch.sortOrder\n if (patch.isActive !== undefined) row.is_active = patch.isActive\n if (patch.icon !== undefined) row.icon = patch.icon\n if (patch.color !== undefined) row.color = patch.color\n const { data, error } = await db().from(T.categories).update(row).eq('id', id).select().single()\n fail(error)\n return rowToCategory(data)\n },\n\n async deleteCategory(id: string): Promise<void> {\n const { error } = await db().from(T.categories).delete().eq('id', id)\n fail(error)\n },\n\n async reorderCategories(ids: string[]): Promise<void> {\n await Promise.all(ids.map((id, index) =>\n db().from(T.categories).update({ sort_order: index }).eq('id', id)))\n },\n\n // --- Items -------------------------------------------------------------\n async getMenuItems(query: MenuItemQuery): Promise<PaginatedResult<MenuItem>> {\n // `!inner` is the definition of a menu item: a product with the menu\n // extension. Without it the list would show every ingredient in stock.\n // `categories(name)` é LEFT por definição (a relação é anulável): um\n // produto sem categoria continua na lista, como tem de continuar.\n // A projeção `summary` existe para a LISTA (o cardápio do PDV): as\n // colunas gordas do produto — `description`, `metadata`, `custom_fields`,\n // `tags` — não aparecem em cartão nenhum e respondem pela maior parte do\n // payload. Ver `MenuItemQuery.projection`.\n const columns = query.projection === 'summary'\n ? `id, tenant_id, name, price, sku, image_url, category_id, is_active, created_at, updated_at, ${T.items}!inner(status, available_for_pos, available_for_delivery, sort_order, is_featured), ${T.categories}(name)`\n : `*, ${T.items}!inner(*), ${T.categories}(name)`\n let qb = db().from(T.products).select(columns, { count: 'exact' })\n if (query.search) qb = qb.ilike('name', `%${query.search}%`)\n if (query.categoryId) qb = qb.eq('category_id', query.categoryId)\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n qb = qb.in(`${T.items}.status`, statuses)\n }\n if (query.availableForPos !== undefined) qb = qb.eq(`${T.items}.available_for_pos`, query.availableForPos)\n if (query.availableForDelivery !== undefined) qb = qb.eq(`${T.items}.available_for_delivery`, query.availableForDelivery)\n if (query.isFeatured !== undefined) qb = qb.eq(`${T.items}.is_featured`, query.isFeatured)\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 200\n qb = qb.range((page - 1) * pageSize, page * pageSize - 1).order('name', { ascending: true })\n const { data, count, error } = await qb\n fail(error)\n return { data: (data ?? []).map((row: any) => rowToItem(row, currency)), total: count ?? 0 }\n },\n\n async getMenuItemById(id: string): Promise<MenuItem | null> {\n const { data } = await db().from(T.products)\n .select(`*, ${T.items}(*), ${T.categories}(name)`).eq('id', id).maybeSingle()\n return data ? rowToItem(data, currency) : null\n },\n\n async createMenuItem(input: CreateMenuItemInput): Promise<MenuItem> {\n const tenantId = tenant()\n const { data: product, error } = await db().from(T.products).insert({\n tenant_id: tenantId,\n name: input.name,\n description: input.description ?? null,\n price: input.price ?? 0,\n cost: input.cost ?? 0,\n image_url: input.imageUrl ?? null,\n category_id: input.categoryId ?? null,\n is_active: true,\n metadata: { productType: 'sale' },\n }).select().single()\n fail(error)\n\n const { error: extError } = await db().from(T.items).insert({\n product_id: product.id,\n tenant_id: tenantId,\n status: input.status ?? 'available',\n available_for_pos: input.availableForPos ?? true,\n available_for_delivery: input.availableForDelivery ?? true,\n delivery_price: input.deliveryPrice ?? null,\n prep_time_minutes: input.prepTimeMinutes ?? null,\n allergens: input.allergens ?? [],\n dietary_tags: input.dietaryTags ?? [],\n is_featured: input.isFeatured ?? false,\n })\n if (extError) {\n // Roll the product back: a product with no menu row is invisible here\n // and would surface as a mystery line in stock.\n await db().from(T.products).delete().eq('id', product.id)\n throw new Error(extError.message)\n }\n\n if (input.sectionId) {\n await provider.placeItem({ sectionId: input.sectionId, itemId: product.id })\n }\n return (await provider.getMenuItemById(product.id))!\n },\n\n async updateMenuItem(id: string, patch: UpdateMenuItemInput): Promise<MenuItem> {\n const spine: Record<string, unknown> = {}\n if (patch.name !== undefined) spine.name = patch.name\n if (patch.description !== undefined) spine.description = patch.description\n if (patch.price !== undefined) spine.price = patch.price\n if (patch.cost !== undefined) spine.cost = patch.cost\n if (patch.imageUrl !== undefined) spine.image_url = patch.imageUrl\n if (patch.categoryId !== undefined) spine.category_id = patch.categoryId ?? null\n if (Object.keys(spine).length > 0) {\n const { error } = await db().from(T.products).update(spine).eq('id', id)\n fail(error)\n }\n\n const ext: Record<string, unknown> = {}\n if (patch.status !== undefined) ext.status = patch.status\n if (patch.availableForPos !== undefined) ext.available_for_pos = patch.availableForPos\n if (patch.availableForDelivery !== undefined) ext.available_for_delivery = patch.availableForDelivery\n if (patch.deliveryPrice !== undefined) ext.delivery_price = patch.deliveryPrice\n if (patch.prepTimeMinutes !== undefined) ext.prep_time_minutes = patch.prepTimeMinutes\n if (patch.allergens !== undefined) ext.allergens = patch.allergens\n if (patch.dietaryTags !== undefined) ext.dietary_tags = patch.dietaryTags\n if (patch.isFeatured !== undefined) ext.is_featured = patch.isFeatured\n if (Object.keys(ext).length > 0) {\n ext.updated_at = new Date().toISOString()\n // Upsert, not update: a product adopted from stock has no menu row yet.\n const { error } = await db().from(T.items)\n .upsert({ product_id: id, tenant_id: tenant(), ...ext }, { onConflict: 'product_id' })\n fail(error)\n }\n return (await provider.getMenuItemById(id))!\n },\n\n async deleteMenuItem(id: string): Promise<void> {\n // Only the menu row: the product may still be stock, a POS line, or sit\n // in a past order. Losing the dish everywhere is not what \"remove from\n // the menu\" means.\n const { error } = await db().from(T.items).delete().eq('product_id', id)\n fail(error)\n await db().from(T.placements).delete().eq('item_id', id)\n },\n\n async toggleAvailability(id, field, value): Promise<MenuItem> {\n const column = field === 'status' ? 'status'\n : field === 'availableForPos' ? 'available_for_pos'\n : field === 'isFeatured' ? 'is_featured'\n : 'available_for_delivery'\n const { error } = await db().from(T.items)\n .upsert({ product_id: id, tenant_id: tenant(), [column]: value, updated_at: new Date().toISOString() },\n { onConflict: 'product_id' })\n fail(error)\n return (await provider.getMenuItemById(id))!\n },\n\n async reorderItems(_categoryId: string, ids: string[]): Promise<void> {\n await Promise.all(ids.map((id, index) =>\n db().from(T.items).update({ sort_order: index }).eq('product_id', id)))\n },\n\n // --- Modifier groups ---------------------------------------------------\n async getModifierGroups(): Promise<ModifierGroup[]> {\n const { data, error } = await db().from(T.modifierGroups)\n .select(`*, ${T.modifiers}(*)`).order('sort_order', { ascending: true })\n fail(error)\n return (data ?? []).map((row: any) => ({\n id: row.id,\n name: row.name,\n minSelections: row.min_selections ?? 0,\n maxSelections: row.max_selections ?? 1,\n isRequired: row.is_required ?? false,\n sortOrder: row.sort_order ?? 0,\n items: (row[T.modifiers] ?? []).map((m: any) => ({\n id: m.id, groupId: m.group_id, name: m.name,\n priceAdjustment: Number(m.price_adjustment ?? 0),\n isActive: m.is_active ?? true, sortOrder: m.sort_order ?? 0,\n })),\n tenantId: row.tenant_id,\n createdAt: row.created_at,\n }))\n },\n\n async createModifierGroup(input: Partial<ModifierGroup>): Promise<ModifierGroup> {\n const { data, error } = await db().from(T.modifierGroups).insert({\n tenant_id: tenant(),\n name: input.name ?? 'Grupo',\n min_selections: input.minSelections ?? 0,\n max_selections: input.maxSelections ?? 1,\n is_required: input.isRequired ?? false,\n sort_order: input.sortOrder ?? 0,\n }).select().single()\n fail(error)\n return { ...(data as any), items: [], minSelections: data.min_selections, maxSelections: data.max_selections, isRequired: data.is_required, sortOrder: data.sort_order, tenantId: data.tenant_id, createdAt: data.created_at }\n },\n\n async updateModifierGroup(id: string, patch: Partial<ModifierGroup>): Promise<ModifierGroup> {\n const row: Record<string, unknown> = {}\n if (patch.name !== undefined) row.name = patch.name\n if (patch.minSelections !== undefined) row.min_selections = patch.minSelections\n if (patch.maxSelections !== undefined) row.max_selections = patch.maxSelections\n if (patch.isRequired !== undefined) row.is_required = patch.isRequired\n if (patch.sortOrder !== undefined) row.sort_order = patch.sortOrder\n const { error } = await db().from(T.modifierGroups).update(row).eq('id', id)\n fail(error)\n const groups = await provider.getModifierGroups()\n return groups.find((g) => g.id === id)!\n },\n\n async deleteModifierGroup(id: string): Promise<void> {\n const { error } = await db().from(T.modifierGroups).delete().eq('id', id)\n fail(error)\n },\n\n // --- Summary -----------------------------------------------------------\n async getSummary(): Promise<MenuSummary> {\n const [{ data: items }, { data: sections }] = await Promise.all([\n db().from(T.items).select('status, is_featured'),\n db().from(T.sections).select('id'),\n ])\n const { data: prices } = await db().from(T.products).select(`price, ${T.items}!inner(product_id)`)\n const rows = items ?? []\n const priceList: number[] = (prices ?? []).map((p: any) => Number(p.price ?? 0))\n return {\n totalItems: rows.length,\n availableItems: rows.filter((r: any) => r.status === 'available').length,\n soldOutItems: rows.filter((r: any) => r.status === 'sold_out').length,\n hiddenItems: rows.filter((r: any) => r.status === 'hidden').length,\n categoryCount: (sections ?? []).length,\n averagePrice: priceList.length ? priceList.reduce((a, b) => a + b, 0) / priceList.length : 0,\n featuredCount: rows.filter((r: any) => r.is_featured).length,\n }\n },\n }\n\n // QUEM ESCREVE NO CARDÁPIO DERRUBA A CÓPIA.\n //\n // O PDV serve o cardápio de uma cópia em memória com validade de minutos\n // (ver ./catalog-cache.ts). Editar um preço ou marcar «acabou» na retaguarda\n // e continuar vendo o antigo no PDV da MESMA aba seria a cópia mentindo para\n // quem acabou de mudá-la — e o marcar-como-acabado é justamente o gesto que\n // não pode esperar. Em OUTRO aparelho a mudança chega pela revalidação, que\n // é o contrato: escala de minutos, não de tempo real.\n for (const nome of MUTACOES_DE_CATALOGO) {\n const original = provider[nome] as ((...args: unknown[]) => Promise<unknown>) | undefined\n if (!original) continue\n ;(provider as unknown as Record<string, unknown>)[nome] = async (...args: unknown[]) => {\n const out = await original.apply(provider, args)\n invalidateMenuCatalog()\n return out\n }\n }\n\n return provider\n}\n\n/** As escritas que mudam o que o PDV mostra. Menu, seção e modificador não\n * entram: o catálogo do PDV é produto + categoria, e só. */\nconst MUTACOES_DE_CATALOGO = [\n 'createMenuItem', 'updateMenuItem', 'deleteMenuItem', 'toggleAvailability',\n 'createCategory', 'updateCategory', 'deleteCategory',\n] as const satisfies ReadonlyArray<keyof FullMenuDataProvider>\n","// AUTO-GENERATED from 000_baseline.sql, 002_o_produto_tem_complementos.sql — regenerate with scripts/embed-migrations.mjs\n// SQL files are the source of truth; this inline copy lets the manifest declare\n// migrations as data. Do not edit by hand — run the embed script instead.\n\nexport const MIGRATION_000_BASELINE = `-- ============================================================================\n-- plugins/plugin-menu/src/migrations/000_baseline.sql — what installing this provisions, as one file.\n--\n-- GENERATED by scripts/emit-unit-baselines.mjs (#338). Do not edit by hand:\n-- change the schema, regenerate, and let scripts/check-chain-equivalence.mjs\n-- prove the result still matches.\n--\n-- This replaced 4 migration files. They are kept, unapplied, in\n-- migrations.archive/ — a year of decisions is worth reading even when it is no\n-- longer worth replaying.\n--\n-- Object order is fixed rather than dependency-sorted: schemas, types,\n-- sequences, tables, defaults, functions, constraints, views, indexes, foreign\n-- keys, triggers, row security, policies, grants. Dependencies BETWEEN units\n-- are carried by the order packages/db/chain.json declares.\n-- ============================================================================\n\n-- A LANGUAGE sql function binds its body at CREATE time, and 570 functions\n-- sorted by name are not sorted by who calls whom. This is what lets them load\n-- in any order; every body is still compiled on first call, so a genuinely\n-- broken reference surfaces then rather than never. Session-scoped.\nSET check_function_bodies = false;\n\n\n\n-- ── default privileges: reset ───────────────────────────────────────────\n-- Cleared BEFORE anything is created, so every object below gets the ACL the\n-- dump describes rather than the image's defaults on top of it. Restored at\n-- the end of this file.\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\n\n-- ── table ───────────────────────────────────────────────────────────────\n\nCREATE TABLE public.plg_menu_allergens (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n name text NOT NULL,\n icon text,\n is_active boolean DEFAULT true NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL\n);\n\nCREATE TABLE public.plg_menu_dietary_tags (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n name text NOT NULL,\n color text,\n is_active boolean DEFAULT true NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL\n);\n\nCREATE TABLE public.plg_menu_item_modifier_groups (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n product_id uuid NOT NULL,\n group_id uuid NOT NULL,\n sort_order integer DEFAULT 0 NOT NULL\n);\n\nCREATE TABLE public.plg_menu_items (\n product_id uuid NOT NULL,\n tenant_id uuid NOT NULL,\n status text DEFAULT 'available'::text NOT NULL,\n available_for_pos boolean DEFAULT true NOT NULL,\n available_for_delivery boolean DEFAULT true NOT NULL,\n delivery_price numeric(14,2),\n prep_time_minutes integer,\n allergens text[] DEFAULT ARRAY[]::text[] NOT NULL,\n dietary_tags text[] DEFAULT ARRAY[]::text[] NOT NULL,\n is_featured boolean DEFAULT false NOT NULL,\n sort_order integer DEFAULT 0 NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL\n);\n\nCREATE TABLE public.plg_menu_menus (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n name text NOT NULL,\n description text,\n is_active boolean DEFAULT true NOT NULL,\n sort_order integer DEFAULT 0 NOT NULL,\n channels text[] DEFAULT ARRAY['pos'::text, 'delivery'::text, 'digital'::text] NOT NULL,\n availability jsonb DEFAULT '{}'::jsonb NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL\n);\n\nCREATE TABLE public.plg_menu_modifier_groups (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n name text NOT NULL,\n min_selections integer DEFAULT 0 NOT NULL,\n max_selections integer DEFAULT 1 NOT NULL,\n is_required boolean DEFAULT false NOT NULL,\n sort_order integer DEFAULT 0 NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL\n);\n\nCREATE TABLE public.plg_menu_modifiers (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n group_id uuid NOT NULL,\n name text NOT NULL,\n price_adjustment numeric(14,2) DEFAULT 0 NOT NULL,\n is_active boolean DEFAULT true NOT NULL,\n sort_order integer DEFAULT 0 NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL\n);\n\nCREATE TABLE public.plg_menu_placements (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n section_id uuid NOT NULL,\n item_id uuid NOT NULL,\n sort_order integer DEFAULT 0 NOT NULL,\n price_override numeric(14,2),\n is_active boolean DEFAULT true NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL\n);\n\nCREATE TABLE public.plg_menu_sections (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n menu_id uuid NOT NULL,\n name text NOT NULL,\n description text,\n image_url text,\n sort_order integer DEFAULT 0 NOT NULL,\n is_active boolean DEFAULT true NOT NULL,\n availability jsonb DEFAULT '{}'::jsonb NOT NULL,\n legacy_category_id uuid,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL\n);\n\n\n-- ── constraint ──────────────────────────────────────────────────────────\n\nALTER TABLE ONLY public.plg_menu_allergens\n ADD CONSTRAINT plg_menu_allergens_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_menu_dietary_tags\n ADD CONSTRAINT plg_menu_dietary_tags_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_menu_item_modifier_groups\n ADD CONSTRAINT plg_menu_item_modifier_groups_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_menu_items\n ADD CONSTRAINT plg_menu_items_pkey PRIMARY KEY (product_id);\n\nALTER TABLE ONLY public.plg_menu_menus\n ADD CONSTRAINT plg_menu_menus_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_menu_modifier_groups\n ADD CONSTRAINT plg_menu_modifier_groups_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_menu_modifiers\n ADD CONSTRAINT plg_menu_modifiers_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_menu_placements\n ADD CONSTRAINT plg_menu_placements_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_menu_sections\n ADD CONSTRAINT plg_menu_sections_pkey PRIMARY KEY (id);\n\n\n-- ── index ───────────────────────────────────────────────────────────────\n\nCREATE INDEX idx_plg_menu_allergens_tenant ON public.plg_menu_allergens USING btree (tenant_id);\n\nCREATE INDEX idx_plg_menu_dietary_tags_tenant ON public.plg_menu_dietary_tags USING btree (tenant_id);\n\nCREATE INDEX idx_plg_menu_items_tenant ON public.plg_menu_items USING btree (tenant_id);\n\nCREATE INDEX idx_plg_menu_menus_tenant ON public.plg_menu_menus USING btree (tenant_id, sort_order);\n\nCREATE INDEX idx_plg_menu_modifier_groups_tenant ON public.plg_menu_modifier_groups USING btree (tenant_id);\n\nCREATE INDEX idx_plg_menu_modifiers_group ON public.plg_menu_modifiers USING btree (group_id, sort_order);\n\nCREATE INDEX idx_plg_menu_placements_item ON public.plg_menu_placements USING btree (item_id);\n\nCREATE INDEX idx_plg_menu_placements_section ON public.plg_menu_placements USING btree (section_id, sort_order);\n\nCREATE INDEX idx_plg_menu_sections_menu ON public.plg_menu_sections USING btree (menu_id, sort_order);\n\nCREATE INDEX idx_plg_menu_sections_tenant ON public.plg_menu_sections USING btree (tenant_id);\n\nCREATE UNIQUE INDEX uq_plg_menu_item_modifier_groups ON public.plg_menu_item_modifier_groups USING btree (product_id, group_id);\n\nCREATE UNIQUE INDEX uq_plg_menu_placements_seat ON public.plg_menu_placements USING btree (section_id, item_id);\n\nCREATE UNIQUE INDEX uq_plg_menu_sections_legacy ON public.plg_menu_sections USING btree (menu_id, legacy_category_id) WHERE (legacy_category_id IS NOT NULL);\n\n\n-- ── fk constraint ───────────────────────────────────────────────────────\n\nALTER TABLE ONLY public.plg_menu_allergens\n ADD CONSTRAINT plg_menu_allergens_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_dietary_tags\n ADD CONSTRAINT plg_menu_dietary_tags_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_item_modifier_groups\n ADD CONSTRAINT plg_menu_item_modifier_groups_group_id_fkey FOREIGN KEY (group_id) REFERENCES public.plg_menu_modifier_groups(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_item_modifier_groups\n ADD CONSTRAINT plg_menu_item_modifier_groups_product_id_fkey FOREIGN KEY (product_id) REFERENCES public.products(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_item_modifier_groups\n ADD CONSTRAINT plg_menu_item_modifier_groups_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_items\n ADD CONSTRAINT plg_menu_items_product_id_fkey FOREIGN KEY (product_id) REFERENCES public.products(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_items\n ADD CONSTRAINT plg_menu_items_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_menus\n ADD CONSTRAINT plg_menu_menus_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_modifier_groups\n ADD CONSTRAINT plg_menu_modifier_groups_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_modifiers\n ADD CONSTRAINT plg_menu_modifiers_group_id_fkey FOREIGN KEY (group_id) REFERENCES public.plg_menu_modifier_groups(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_modifiers\n ADD CONSTRAINT plg_menu_modifiers_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_placements\n ADD CONSTRAINT plg_menu_placements_item_id_fkey FOREIGN KEY (item_id) REFERENCES public.products(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_placements\n ADD CONSTRAINT plg_menu_placements_section_id_fkey FOREIGN KEY (section_id) REFERENCES public.plg_menu_sections(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_placements\n ADD CONSTRAINT plg_menu_placements_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_sections\n ADD CONSTRAINT plg_menu_sections_menu_id_fkey FOREIGN KEY (menu_id) REFERENCES public.plg_menu_menus(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_menu_sections\n ADD CONSTRAINT plg_menu_sections_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\n\n-- ── row security ────────────────────────────────────────────────────────\n\nALTER TABLE public.plg_menu_allergens ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_menu_dietary_tags ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_menu_item_modifier_groups ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_menu_items ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_menu_menus ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_menu_modifier_groups ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_menu_modifiers ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_menu_placements ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_menu_sections ENABLE ROW LEVEL SECURITY;\n\n\n-- ── policy ──────────────────────────────────────────────────────────────\n\nCREATE POLICY plg_menu_allergens_delete ON public.plg_menu_allergens FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_allergens_insert ON public.plg_menu_allergens FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_allergens_select ON public.plg_menu_allergens FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_allergens_update ON public.plg_menu_allergens FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_dietary_tags_delete ON public.plg_menu_dietary_tags FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_dietary_tags_insert ON public.plg_menu_dietary_tags FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_dietary_tags_select ON public.plg_menu_dietary_tags FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_dietary_tags_update ON public.plg_menu_dietary_tags FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_item_modifier_groups_delete ON public.plg_menu_item_modifier_groups FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_item_modifier_groups_insert ON public.plg_menu_item_modifier_groups FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_item_modifier_groups_select ON public.plg_menu_item_modifier_groups FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_item_modifier_groups_update ON public.plg_menu_item_modifier_groups FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_items_delete ON public.plg_menu_items FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_items_insert ON public.plg_menu_items FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_items_select ON public.plg_menu_items FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_items_update ON public.plg_menu_items FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_menus_delete ON public.plg_menu_menus FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_menus_insert ON public.plg_menu_menus FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_menus_select ON public.plg_menu_menus FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_menus_update ON public.plg_menu_menus FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_modifier_groups_delete ON public.plg_menu_modifier_groups FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_modifier_groups_insert ON public.plg_menu_modifier_groups FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_modifier_groups_select ON public.plg_menu_modifier_groups FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_modifier_groups_update ON public.plg_menu_modifier_groups FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_modifiers_delete ON public.plg_menu_modifiers FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_modifiers_insert ON public.plg_menu_modifiers FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_modifiers_select ON public.plg_menu_modifiers FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_modifiers_update ON public.plg_menu_modifiers FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_placements_delete ON public.plg_menu_placements FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_placements_insert ON public.plg_menu_placements FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_placements_select ON public.plg_menu_placements FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_placements_update ON public.plg_menu_placements FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_sections_delete ON public.plg_menu_sections FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_sections_insert ON public.plg_menu_sections FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_sections_select ON public.plg_menu_sections FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_menu_sections_update ON public.plg_menu_sections FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\n\n-- ── acl ─────────────────────────────────────────────────────────────────\n\nGRANT MAINTAIN ON TABLE public.plg_menu_allergens TO anon;\nGRANT ALL ON TABLE public.plg_menu_allergens TO authenticated;\nGRANT ALL ON TABLE public.plg_menu_allergens TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_menu_dietary_tags TO anon;\nGRANT ALL ON TABLE public.plg_menu_dietary_tags TO authenticated;\nGRANT ALL ON TABLE public.plg_menu_dietary_tags TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_menu_item_modifier_groups TO anon;\nGRANT ALL ON TABLE public.plg_menu_item_modifier_groups TO authenticated;\nGRANT ALL ON TABLE public.plg_menu_item_modifier_groups TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_menu_items TO anon;\nGRANT ALL ON TABLE public.plg_menu_items TO authenticated;\nGRANT ALL ON TABLE public.plg_menu_items TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_menu_menus TO anon;\nGRANT ALL ON TABLE public.plg_menu_menus TO authenticated;\nGRANT ALL ON TABLE public.plg_menu_menus TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_menu_modifier_groups TO anon;\nGRANT ALL ON TABLE public.plg_menu_modifier_groups TO authenticated;\nGRANT ALL ON TABLE public.plg_menu_modifier_groups TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_menu_modifiers TO anon;\nGRANT ALL ON TABLE public.plg_menu_modifiers TO authenticated;\nGRANT ALL ON TABLE public.plg_menu_modifiers TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_menu_placements TO anon;\nGRANT ALL ON TABLE public.plg_menu_placements TO authenticated;\nGRANT ALL ON TABLE public.plg_menu_placements TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_menu_sections TO anon;\nGRANT ALL ON TABLE public.plg_menu_sections TO authenticated;\nGRANT ALL ON TABLE public.plg_menu_sections TO service_role;\n\n\n-- ── default privileges: restore ─────────────────────────────────────────\n-- Put back, so the NEXT thing installed inherits what the chain had.\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT MAINTAIN ON TABLES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT MAINTAIN ON TABLES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$--\n-- PostgreSQL database dump complete\n--$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$--\n-- PostgreSQL database dump complete\n--$stmt$;\nEND $dp$;\n`\n\nexport const MIGRATION_002_O_PRODUTO_TEM_COMPLEMENTOS = `-- ---------------------------------------------------------------------------\n-- 001 — a product has its own choice groups (V1 «Complementos»).\n--\n-- The modifier tables already hold name, min, max, required and each option's\n-- price. Two things were missing for the product tab:\n-- * a group can be switched off without being deleted (V1 «Ativo»);\n-- * one write that replaces a product's groups and options together. V1\n-- wrote them one row at a time and a failure halfway left half a set.\n--\n-- Idempotent.\n-- ---------------------------------------------------------------------------\n\nALTER TABLE public.plg_menu_modifier_groups\n ADD COLUMN IF NOT EXISTS is_active boolean NOT NULL DEFAULT true;\n\nCOMMENT ON COLUMN public.plg_menu_modifier_groups.is_active IS\n 'Off = the group stays configured but is not offered. V1: product_option_groups.active.';\n\n-- SECURITY INVOKER: the same tenant policies the tables already enforce.\nCREATE OR REPLACE FUNCTION public.menu_save_product_option_groups(p_product uuid, p_groups jsonb)\nRETURNS void\nLANGUAGE plpgsql\nSECURITY INVOKER\nSET search_path = ''\nAS $$\nDECLARE\n v_tenant uuid;\n v_group jsonb;\n v_item jsonb;\n v_group_id uuid;\n v_kept_groups uuid[] := '{}';\n v_kept_items uuid[];\n v_item_id uuid;\n v_removed uuid[];\nBEGIN\n SELECT p.tenant_id INTO v_tenant FROM public.products p WHERE p.id = p_product;\n IF v_tenant IS NULL THEN\n RAISE EXCEPTION 'product not found' USING ERRCODE = '42501';\n END IF;\n\n FOR v_group IN SELECT * FROM jsonb_array_elements(coalesce(p_groups, '[]'::jsonb)) LOOP\n v_group_id := nullif(v_group->>'id', '')::uuid;\n IF v_group_id IS NOT NULL AND NOT EXISTS (\n SELECT 1 FROM public.plg_menu_item_modifier_groups l\n WHERE l.product_id = p_product AND l.group_id = v_group_id\n ) THEN\n -- An id that is not this product's group is treated as new, never as a\n -- licence to edit someone else's group.\n v_group_id := NULL;\n END IF;\n\n IF v_group_id IS NULL THEN\n INSERT INTO public.plg_menu_modifier_groups\n (tenant_id, name, min_selections, max_selections, is_required, is_active, sort_order)\n VALUES\n (v_tenant, v_group->>'name', (v_group->>'minSelections')::int, (v_group->>'maxSelections')::int,\n coalesce((v_group->>'isRequired')::boolean, false), coalesce((v_group->>'isActive')::boolean, true),\n coalesce((v_group->>'sortOrder')::int, 0))\n RETURNING id INTO v_group_id;\n ELSE\n UPDATE public.plg_menu_modifier_groups SET\n name = v_group->>'name',\n min_selections = (v_group->>'minSelections')::int,\n max_selections = (v_group->>'maxSelections')::int,\n is_required = coalesce((v_group->>'isRequired')::boolean, false),\n is_active = coalesce((v_group->>'isActive')::boolean, true),\n sort_order = coalesce((v_group->>'sortOrder')::int, 0)\n WHERE id = v_group_id;\n END IF;\n\n INSERT INTO public.plg_menu_item_modifier_groups (tenant_id, product_id, group_id, sort_order)\n VALUES (v_tenant, p_product, v_group_id, coalesce((v_group->>'sortOrder')::int, 0))\n ON CONFLICT (product_id, group_id) DO UPDATE SET sort_order = EXCLUDED.sort_order;\n\n v_kept_groups := v_kept_groups || v_group_id;\n v_kept_items := '{}';\n\n FOR v_item IN SELECT * FROM jsonb_array_elements(coalesce(v_group->'items', '[]'::jsonb)) LOOP\n v_item_id := nullif(v_item->>'id', '')::uuid;\n IF v_item_id IS NOT NULL AND NOT EXISTS (\n SELECT 1 FROM public.plg_menu_modifiers m WHERE m.id = v_item_id AND m.group_id = v_group_id\n ) THEN\n v_item_id := NULL;\n END IF;\n IF v_item_id IS NULL THEN\n INSERT INTO public.plg_menu_modifiers (tenant_id, group_id, name, price_adjustment, is_active, sort_order)\n VALUES (v_tenant, v_group_id, v_item->>'name', coalesce((v_item->>'priceAdjustment')::numeric, 0),\n coalesce((v_item->>'isActive')::boolean, true), coalesce((v_item->>'sortOrder')::int, 0))\n RETURNING id INTO v_item_id;\n ELSE\n UPDATE public.plg_menu_modifiers SET\n name = v_item->>'name',\n price_adjustment = coalesce((v_item->>'priceAdjustment')::numeric, 0),\n is_active = coalesce((v_item->>'isActive')::boolean, true),\n sort_order = coalesce((v_item->>'sortOrder')::int, 0)\n WHERE id = v_item_id;\n END IF;\n v_kept_items := v_kept_items || v_item_id;\n END LOOP;\n\n DELETE FROM public.plg_menu_modifiers m\n WHERE m.group_id = v_group_id AND NOT (m.id = ANY (v_kept_items));\n END LOOP;\n\n -- Groups removed from this product: unlink, and drop the group only when no\n -- other product still uses it.\n SELECT coalesce(array_agg(l.group_id), '{}') INTO v_removed\n FROM public.plg_menu_item_modifier_groups l\n WHERE l.product_id = p_product AND NOT (l.group_id = ANY (v_kept_groups));\n DELETE FROM public.plg_menu_item_modifier_groups l\n WHERE l.product_id = p_product AND l.group_id = ANY (v_removed);\n DELETE FROM public.plg_menu_modifier_groups g\n WHERE g.id = ANY (v_removed)\n AND NOT EXISTS (SELECT 1 FROM public.plg_menu_item_modifier_groups l WHERE l.group_id = g.id);\nEND;\n$$;\n\nREVOKE ALL ON FUNCTION public.menu_save_product_option_groups(uuid, jsonb) FROM PUBLIC, anon;\nGRANT EXECUTE ON FUNCTION public.menu_save_product_option_groups(uuid, jsonb) TO authenticated;\n`\n\nexport const MIGRATIONS: Array<{ id: string; sql: string }> = [\n { id: \"000_baseline\", sql: MIGRATION_000_BASELINE },\n { id: \"002_o_produto_tem_complementos\", sql: MIGRATION_002_O_PRODUTO_TEM_COMPLEMENTOS },\n]\n","import type {\n Menu, MenuSection, MenuPlacement,\n MenuCategory, MenuItem, ModifierGroup,\n CreateMenuInput, UpdateMenuInput,\n CreateSectionInput, UpdateSectionInput, PlaceItemInput,\n CreateMenuItemInput, UpdateMenuItemInput, CreateMenuCategoryInput,\n MenuItemQuery, PaginatedResult, MenuSummary,\n} from '../types'\n\n/**\n * What a host must implement to back the menu screen.\n *\n * The MENU half (menus / sections / placements) is optional on purpose. A host\n * that predates it — an app-local provider written while this plugin was\n * incubating — keeps working: `wrapLegacyProvider` presents its flat categories\n * as one menu, so the UI has a single shape to render and the app is not forced\n * to migrate on the same day the plugin ships.\n */\nexport interface MenuDataProvider {\n // --- Menus (optional capability) ---\n getMenus?(): Promise<Menu[]>\n createMenu?(input: CreateMenuInput): Promise<Menu>\n updateMenu?(id: string, data: UpdateMenuInput): Promise<Menu>\n deleteMenu?(id: string): Promise<void>\n /** Copy a menu with its sections and placements — how a weekend menu is born. */\n duplicateMenu?(id: string, name: string): Promise<Menu>\n reorderMenus?(ids: string[]): Promise<void>\n\n // --- Sections (optional capability) ---\n getSections?(menuId: string): Promise<MenuSection[]>\n createSection?(input: CreateSectionInput): Promise<MenuSection>\n updateSection?(id: string, data: UpdateSectionInput): Promise<MenuSection>\n deleteSection?(id: string): Promise<void>\n reorderSections?(menuId: string, ids: string[]): Promise<void>\n\n // --- Placements (optional capability) ---\n getPlacements?(menuId: string): Promise<MenuPlacement[]>\n placeItem?(input: PlaceItemInput): Promise<MenuPlacement>\n updatePlacement?(id: string, data: Partial<PlaceItemInput>): Promise<MenuPlacement>\n removePlacement?(id: string): Promise<void>\n /** Ids in their new order, within one section. */\n reorderPlacements?(sectionId: string, placementIds: string[]): Promise<void>\n /** Cross-section drag: same item, another section, at `toIndex`. */\n movePlacement?(placementId: string, toSectionId: string, toIndex: number): Promise<void>\n\n // --- Media (optional capability) ---\n uploadImage?(file: File, kind: 'item' | 'section' | 'menu' | 'import'): Promise<string>\n\n // --- Categories (legacy flat grouping) ---\n getCategories(): Promise<MenuCategory[]>\n getCategoryById(id: string): Promise<MenuCategory | null>\n createCategory(input: CreateMenuCategoryInput): Promise<MenuCategory>\n updateCategory(id: string, data: Partial<MenuCategory>): Promise<MenuCategory>\n deleteCategory(id: string): Promise<void>\n reorderCategories(ids: string[]): Promise<void>\n\n // --- Menu Items ---\n getMenuItems(query: MenuItemQuery): Promise<PaginatedResult<MenuItem>>\n getMenuItemById(id: string): Promise<MenuItem | null>\n createMenuItem(input: CreateMenuItemInput): Promise<MenuItem>\n updateMenuItem(id: string, data: UpdateMenuItemInput): Promise<MenuItem>\n deleteMenuItem(id: string): Promise<void>\n toggleAvailability(id: string, field: 'status' | 'availableForPos' | 'availableForDelivery' | 'isFeatured', value: any): Promise<MenuItem>\n reorderItems(categoryId: string, ids: string[]): Promise<void>\n\n // --- Modifier Groups ---\n getModifierGroups(): Promise<ModifierGroup[]>\n createModifierGroup(input: Partial<ModifierGroup>): Promise<ModifierGroup>\n updateModifierGroup(id: string, data: Partial<ModifierGroup>): Promise<ModifierGroup>\n deleteModifierGroup(id: string): Promise<void>\n\n // --- Summary ---\n getSummary(): Promise<MenuSummary>\n}\n\n/** A provider with the menu half guaranteed — what the store and UI talk to. */\nexport type FullMenuDataProvider = MenuDataProvider &\n Required<Pick<MenuDataProvider,\n | 'getMenus' | 'createMenu' | 'updateMenu' | 'deleteMenu' | 'duplicateMenu' | 'reorderMenus'\n | 'getSections' | 'createSection' | 'updateSection' | 'deleteSection' | 'reorderSections'\n | 'getPlacements' | 'placeItem' | 'updatePlacement' | 'removePlacement'\n | 'reorderPlacements' | 'movePlacement'\n >>\n\n/** Does this host know about menus, or only about a flat list of categories? */\nexport function supportsMenus(provider: MenuDataProvider): boolean {\n return typeof provider.getMenus === 'function' && typeof provider.createSection === 'function'\n}\n","import type { MenuDataProvider, FullMenuDataProvider } from './types'\nimport type { Menu, MenuSection, MenuPlacement, MenuItem } from '../types'\n\n// ---------------------------------------------------------------------------\n// One shape for the UI.\n//\n// Hosts written before menus existed know only a flat list of categories with\n// items in them. That IS a menu — the single one the place happens to serve —\n// so it is presented as one, and every section write lands on the category it\n// came from. The screen then has a single code path, and an app upgrades its\n// provider when it wants multiple menus, not because the screen broke.\n// ---------------------------------------------------------------------------\n\nexport const LEGACY_MENU_ID = '__default__'\n\n/** Synthetic placement id: a legacy item's seat IS its category field. */\nconst placementId = (itemId: string) => `legacy:${itemId}`\nconst itemIdOf = (placement: string) => placement.replace(/^legacy:/, '')\n\n/**\n * Where an item with no category sits.\n *\n * A legacy item's seat IS its category, so an item without one had no seat and\n * `getPlacements` dropped it — it was fetched, counted in `itemCount`, and then\n * filtered out before any section could render it. Creating an item without\n * choosing a section made it invisible, permanently and with no error.\n *\n * This section is synthetic: it is not a category, nothing writes to it, and it\n * appears only while something is unfiled. Dragging an item out of it calls\n * placeItem, which sets a real category — so the bucket empties itself and then\n * disappears.\n */\nexport const UNFILED_SECTION_ID = '__unfiled__'\n\nfunction unsupported(what: string): never {\n throw new Error(`[menu] This workspace's menu backend does not support ${what} yet.`)\n}\n\nexport function wrapLegacyProvider(provider: MenuDataProvider): FullMenuDataProvider {\n // Items are read once per placement query and reused: the legacy provider has\n // no placement table to ask, so the item list is the placement list.\n async function allItems(): Promise<MenuItem[]> {\n const result = await provider.getMenuItems({ pageSize: 1000 })\n return result.data\n }\n\n const legacyMenu = async (): Promise<Menu> => {\n const [categories, items] = await Promise.all([provider.getCategories(), allItems()])\n const first = items[0]\n return {\n id: LEGACY_MENU_ID,\n name: 'Cardápio principal',\n isActive: true,\n sortOrder: 0,\n channels: ['pos', 'delivery', 'digital'],\n availability: {},\n sectionCount: categories.length,\n itemCount: items.length,\n tenantId: first?.tenantId ?? '',\n createdAt: first?.createdAt ?? new Date(0).toISOString(),\n updatedAt: first?.updatedAt ?? new Date(0).toISOString(),\n }\n }\n\n // A Proxy rather than a spread: a host provider can itself be a Proxy\n // (createSafeDataProvider returns one), and spreading that yields an object\n // with no methods at all.\n const overrides: Partial<FullMenuDataProvider> = {\n\n async getMenus() {\n return [await legacyMenu()]\n },\n async createMenu() { unsupported('multiple menus') },\n async updateMenu() { unsupported('multiple menus') },\n async deleteMenu() { unsupported('multiple menus') },\n async duplicateMenu() { unsupported('multiple menus') },\n async reorderMenus() { /* one menu — nothing to order */ },\n\n async getSections(): Promise<MenuSection[]> {\n const [categories, items] = await Promise.all([provider.getCategories(), allItems()])\n const sections: MenuSection[] = categories.map((c) => ({\n id: c.id,\n menuId: LEGACY_MENU_ID,\n name: c.name,\n sortOrder: c.sortOrder,\n isActive: c.isActive,\n tenantId: c.tenantId,\n createdAt: c.createdAt,\n updatedAt: c.updatedAt,\n }))\n\n // Last, and only while it has something in it: an item nobody filed is\n // still an item, and a screen that silently omits it is worse than one\n // that shows it needs a home.\n const unfiled = items.filter((i) => !i.categoryId)\n if (unfiled.length > 0) {\n sections.push({\n id: UNFILED_SECTION_ID,\n menuId: LEGACY_MENU_ID,\n name: 'Sem seção',\n sortOrder: Number.MAX_SAFE_INTEGER,\n isActive: true,\n tenantId: unfiled[0]!.tenantId,\n createdAt: unfiled[0]!.createdAt,\n updatedAt: unfiled[0]!.updatedAt,\n })\n }\n return sections\n },\n async createSection(input) {\n const category = await provider.createCategory({ name: input.name, sortOrder: input.sortOrder })\n return {\n id: category.id,\n menuId: LEGACY_MENU_ID,\n name: category.name,\n sortOrder: category.sortOrder,\n isActive: category.isActive,\n tenantId: category.tenantId,\n createdAt: category.createdAt,\n updatedAt: category.updatedAt,\n }\n },\n async updateSection(id, data) {\n const category = await provider.updateCategory(id, {\n name: data.name,\n sortOrder: data.sortOrder,\n isActive: data.isActive,\n })\n return {\n id: category.id,\n menuId: LEGACY_MENU_ID,\n name: category.name,\n sortOrder: category.sortOrder,\n isActive: category.isActive,\n tenantId: category.tenantId,\n createdAt: category.createdAt,\n updatedAt: category.updatedAt,\n }\n },\n async deleteSection(id) {\n await provider.deleteCategory(id)\n },\n async reorderSections(_menuId, ids) {\n await provider.reorderCategories(ids)\n },\n\n async getPlacements(): Promise<MenuPlacement[]> {\n const items = await allItems()\n // Every item gets a seat. It used to be `.filter(item => !!item.categoryId)`,\n // which dropped the uncategorised ones on the floor — see UNFILED_SECTION_ID.\n return items.map((item) => ({\n id: placementId(item.id),\n sectionId: item.categoryId ?? UNFILED_SECTION_ID,\n itemId: item.id,\n sortOrder: item.sortOrder ?? 0,\n isActive: item.status !== 'hidden',\n tenantId: item.tenantId,\n }))\n },\n /**\n * The section the user clicked, honoured.\n *\n * The store calls `createMenuItem({ ...input, sectionId })` — the section is\n * already carried from the \"Adicionar item\" button. A legacy provider reads\n * `categoryId` and knows nothing about sections, so it dropped it and the\n * new dish landed unfiled: created correctly, then invisible, because a\n * legacy item's seat IS its category.\n *\n * Translating one into the other is this adapter's whole job. No section\n * clicked (the item rail, an import) still means no category, and the\n * unfiled bucket is what shows it.\n */\n async createMenuItem(input) {\n const { sectionId, ...rest } = input as typeof input & { sectionId?: string }\n const categoryId =\n sectionId && sectionId !== UNFILED_SECTION_ID ? sectionId : rest.categoryId\n return provider.createMenuItem({ ...rest, categoryId })\n },\n\n async placeItem(input) {\n // Dragging INTO the bucket is unfiling — there is no category called\n // `__unfiled__`, and writing one would be inventing a section.\n const categoryId = input.sectionId === UNFILED_SECTION_ID ? null : input.sectionId\n await provider.updateMenuItem(input.itemId, { categoryId })\n return {\n id: placementId(input.itemId),\n sectionId: input.sectionId,\n itemId: input.itemId,\n sortOrder: input.sortOrder ?? 0,\n isActive: input.isActive ?? true,\n tenantId: '',\n }\n },\n async updatePlacement(id, data) {\n // A legacy item carries ONE price, so a per-menu override has nowhere to\n // live. The screen hides that field when multiMenu is off; ignoring it\n // here keeps a stray call from writing the wrong number.\n if (data.sectionId) await provider.updateMenuItem(itemIdOf(id), { categoryId: data.sectionId })\n return {\n id,\n sectionId: data.sectionId ?? '',\n itemId: itemIdOf(id),\n sortOrder: data.sortOrder ?? 0,\n isActive: data.isActive ?? true,\n tenantId: '',\n }\n },\n async removePlacement(id) {\n await provider.updateMenuItem(itemIdOf(id), { categoryId: undefined })\n },\n async reorderPlacements(sectionId, placementIds) {\n await provider.reorderItems(sectionId, placementIds.map(itemIdOf))\n },\n async movePlacement(id, toSectionId) {\n await provider.updateMenuItem(itemIdOf(id), { categoryId: toSectionId })\n },\n }\n\n return new Proxy({} as FullMenuDataProvider, {\n get: (_t, prop: string) =>\n (overrides as any)[prop] ?? (provider as any)[prop],\n })\n}\n","import { createStore, type StoreApi } from 'zustand/vanilla'\nimport { toast } from 'sonner'\nimport { dedup } from '@fayz-ai/admin'\nimport { tl } from '@fayz-ai/core'\n\nimport type { FullMenuDataProvider, MenuDataProvider } from './data/types'\nimport { supportsMenus } from './data/types'\nimport { wrapLegacyProvider } from './data/legacy-adapter'\nimport type {\n Menu, MenuSection, MenuPlacement, MenuItem, ModifierGroup,\n CreateMenuInput, UpdateMenuInput, CreateSectionInput, UpdateSectionInput,\n CreateMenuItemInput, UpdateMenuItemInput,\n MenuItemQuery, MenuSummary, MenuItemStatus,\n ImportPlan, ImportResult, MenuDraft, DraftItem, DraftSection,\n} from './types'\nimport type { MenuExtractFn } from './lib/extract-transport'\nimport { countExtracted, normalizeName } from './lib/extract-parse'\n\n// ---------------------------------------------------------------------------\n// One store for the whole menu screen.\n//\n// It holds the OPEN menu — its sections, the placements inside them and the\n// items those point at — because that is the unit the user edits. Reordering is\n// applied to local state first and persisted after: dragging a dish must not\n// wait for a round trip to look like it happened.\n// ---------------------------------------------------------------------------\n\nexport interface MenuUIState {\n /** False when the host provider only knows a flat list of categories. */\n multiMenu: boolean\n\n menus: Menu[]\n menusLoading: boolean\n activeMenuId: string | null\n\n sections: MenuSection[]\n placements: MenuPlacement[]\n menuLoading: boolean\n /** Rows already on screen whose write has not landed yet. */\n pendingIds: string[]\n\n menuItems: MenuItem[]\n menuItemsTotal: number\n menuItemsLoading: boolean\n menuItemQuery: MenuItemQuery\n\n modifierGroups: ModifierGroup[]\n modifiersLoading: boolean\n\n summary: MenuSummary | null\n summaryLoading: boolean\n\n // Reads\n fetchMenus(): Promise<void>\n openMenu(menuId: string): Promise<void>\n fetchMenuContent(menuId: string): Promise<void>\n fetchMenuItems(query?: MenuItemQuery): Promise<void>\n fetchModifierGroups(): Promise<void>\n fetchSummary(): Promise<void>\n\n // Menus\n createMenu(input: CreateMenuInput): Promise<Menu>\n updateMenu(id: string, data: UpdateMenuInput): Promise<void>\n deleteMenu(id: string): Promise<void>\n duplicateMenu(id: string, name: string): Promise<Menu>\n\n // Sections\n createSection(name: string, extra?: Partial<CreateSectionInput>): Promise<MenuSection | null>\n updateSection(id: string, data: UpdateSectionInput): Promise<void>\n deleteSection(id: string): Promise<void>\n reorderSections(orderedIds: string[]): Promise<void>\n\n // Items in the open menu\n addItemToSection(sectionId: string, input: CreateMenuItemInput): Promise<MenuItem | null>\n placeExistingItem(sectionId: string, itemId: string): Promise<void>\n removePlacement(placementId: string): Promise<void>\n setPlacementPrice(placementId: string, price: number | undefined): Promise<void>\n reorderPlacements(sectionId: string, orderedIds: string[]): Promise<void>\n movePlacement(placementId: string, toSectionId: string, toIndex: number): Promise<void>\n\n // Items themselves\n updateMenuItem(id: string, data: UpdateMenuItemInput): Promise<void>\n deleteMenuItem(id: string): Promise<void>\n duplicateMenuItem(id: string, sectionId?: string): Promise<void>\n setItemStatus(id: string, status: MenuItemStatus): Promise<void>\n toggleAvailability(id: string, field: 'availableForPos' | 'availableForDelivery' | 'isFeatured', value: boolean): Promise<void>\n uploadImage(file: File, kind: 'item' | 'section' | 'menu' | 'import'): Promise<string | null>\n\n // --- AI import ---\n // The draft lives in the store because BOTH hands reach it: the user editing\n // rows on screen, and the assistant calling tools. The photos themselves are\n // asked for in the conversation (requestChatUpload) and land here already\n // read — the chat is the doorway, this is the destination.\n extracting: boolean\n draft: MenuDraft | null\n runExtraction(images: string[], extract: MenuExtractFn): Promise<void>\n updateDraftItem(sectionKey: string, itemKey: string, patch: Partial<DraftItem>): void\n removeDraftItem(sectionKey: string, itemKey: string): void\n updateDraftSection(sectionKey: string, patch: Partial<Pick<DraftSection, 'name' | 'targetSectionId'>>): void\n removeDraftSection(sectionKey: string): void\n /**\n * Stage a menu the assistant read directly from the conversation (a photo\n * pasted in the chat) as a draft — same review-then-commit path as the photo\n * extractor. Sections are matched to existing ones by name, and items that\n * already exist in the matched section are dropped instead of duplicated.\n */\n stageDraft(sections: Array<{ name: string; items: Array<{ name: string; price: number; description?: string }> }>): {\n sections: number\n items: number\n duplicatesDropped: number\n }\n discardDraft(): void\n commitDraft(): Promise<ImportResult>\n applyImportPlan(plan: ImportPlan): Promise<ImportResult>\n}\n\n/** Ids for rows drawn before the server has one. Never persisted. */\nlet optimisticSeq = 0\n\nexport function createMenuStore(rawProvider: MenuDataProvider): StoreApi<MenuUIState> {\n const multiMenu = supportsMenus(rawProvider)\n const provider: FullMenuDataProvider = multiMenu\n ? (rawProvider as FullMenuDataProvider)\n : wrapLegacyProvider(rawProvider)\n\n return createStore<MenuUIState>((set, get) => {\n /** One optimistic write for every per-item flag, status included. */\n async function writeItemField(id: string, field: string, value: unknown): Promise<void> {\n const previous = get().menuItems\n set({ menuItems: previous.map((i) => (i.id === id ? { ...i, [field]: value } as MenuItem : i)) })\n try {\n await provider.toggleAvailability(id, field as any, value)\n } catch (err: any) {\n set({ menuItems: previous })\n toast.error(tl('Could not update the item', 'Não foi possível atualizar o item'), { description: err?.message })\n }\n }\n\n return {\n multiMenu,\n menus: [],\n menusLoading: false,\n activeMenuId: null,\n sections: [],\n placements: [],\n menuLoading: false,\n pendingIds: [],\n menuItems: [],\n menuItemsTotal: 0,\n menuItemsLoading: false,\n menuItemQuery: {},\n modifierGroups: [],\n modifiersLoading: false,\n summary: null,\n summaryLoading: false,\n\n // --- Reads -------------------------------------------------------------\n async fetchMenus() {\n set({ menusLoading: true })\n try {\n const menus = await dedup('menu:menus', () => provider.getMenus())\n const active = get().activeMenuId && menus.some((m) => m.id === get().activeMenuId)\n ? get().activeMenuId\n : menus[0]?.id ?? null\n set({ menus, activeMenuId: active, menusLoading: false })\n if (active) await get().fetchMenuContent(active)\n } catch (err: any) {\n set({ menusLoading: false })\n toast.error(tl('Could not load the menus', 'Não foi possível carregar os cardápios'), { description: err?.message })\n }\n },\n\n async openMenu(menuId) {\n set({ activeMenuId: menuId })\n await get().fetchMenuContent(menuId)\n },\n\n async fetchMenuContent(menuId) {\n set({ menuLoading: true })\n try {\n const [sections, placements] = await Promise.all([\n provider.getSections(menuId),\n provider.getPlacements(menuId),\n ])\n set({ sections, placements, menuLoading: false })\n } catch (err: any) {\n set({ menuLoading: false })\n toast.error(tl('Could not load the menu', 'Não foi possível carregar o cardápio'), { description: err?.message })\n }\n },\n\n async fetchMenuItems(query = {}) {\n set({ menuItemsLoading: true, menuItemQuery: query })\n try {\n const result = await provider.getMenuItems(query)\n set({ menuItems: result.data, menuItemsTotal: result.total, menuItemsLoading: false })\n } catch (err: any) {\n set({ menuItemsLoading: false })\n toast.error(tl('Could not load the items', 'Não foi possível carregar os itens'), { description: err?.message })\n }\n },\n\n async fetchModifierGroups() {\n set({ modifiersLoading: true })\n try {\n const modifierGroups = await dedup('menu:modifiers', () => provider.getModifierGroups())\n set({ modifierGroups, modifiersLoading: false })\n } catch {\n set({ modifiersLoading: false, modifierGroups: [] })\n }\n },\n\n async fetchSummary() {\n set({ summaryLoading: true })\n try {\n const summary = await dedup('menu:summary', () => provider.getSummary())\n set({ summary, summaryLoading: false })\n } catch {\n set({ summaryLoading: false })\n }\n },\n\n // --- Menus -------------------------------------------------------------\n async createMenu(input) {\n const menu = await provider.createMenu(input)\n set({ menus: [...get().menus, menu] })\n await get().openMenu(menu.id)\n toast.success(tl('Menu created', 'Cardápio criado'))\n return menu\n },\n\n async updateMenu(id, data) {\n const updated = await provider.updateMenu(id, data)\n set({ menus: get().menus.map((m) => (m.id === id ? { ...m, ...updated } : m)) })\n },\n\n async deleteMenu(id) {\n await provider.deleteMenu(id)\n const menus = get().menus.filter((m) => m.id !== id)\n set({ menus })\n const next = menus[0]?.id ?? null\n set({ activeMenuId: next, sections: [], placements: [] })\n if (next) await get().fetchMenuContent(next)\n toast.success(tl('Menu deleted', 'Cardápio excluído'))\n },\n\n async duplicateMenu(id, name) {\n const copy = await provider.duplicateMenu(id, name)\n await get().fetchMenus()\n await get().openMenu(copy.id)\n toast.success(tl('Menu duplicated', 'Cardápio duplicado'), { description: tl('The copy starts inactive — publish it when it is ready.', 'A cópia começa desativada — publique quando estiver pronta.') })\n return copy\n },\n\n // --- Sections ----------------------------------------------------------\n async createSection(name, extra) {\n const menuId = get().activeMenuId\n if (!menuId) return null\n // The card lands the moment you ask for it. A section is a name and a\n // place in a list — waiting on a round trip to draw it is the difference\n // between \"the app is typing with me\" and \"the app is thinking\".\n const tempId = `pending-${++optimisticSeq}`\n const optimistic: MenuSection = {\n id: tempId,\n menuId,\n name,\n sortOrder: extra?.sortOrder ?? get().sections.length,\n isActive: extra?.isActive ?? true,\n availability: extra?.availability ?? {},\n tenantId: '',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n set({\n sections: [...get().sections, optimistic],\n pendingIds: [...get().pendingIds, tempId],\n })\n try {\n const section = await provider.createSection({ menuId, name, ...extra })\n set({\n sections: get().sections.map((s) => (s.id === tempId ? section : s)),\n pendingIds: get().pendingIds.filter((id) => id !== tempId),\n })\n return section\n } catch (err: any) {\n set({\n sections: get().sections.filter((s) => s.id !== tempId),\n pendingIds: get().pendingIds.filter((id) => id !== tempId),\n })\n toast.error(tl('Could not create the section', 'Não foi possível criar a seção'), { description: err?.message })\n return null\n }\n },\n\n async updateSection(id, data) {\n const previous = get().sections\n set({ sections: previous.map((s) => (s.id === id ? { ...s, ...data } as MenuSection : s)) })\n try {\n await provider.updateSection(id, data)\n } catch (err: any) {\n set({ sections: previous })\n toast.error(tl('Could not save the section', 'Não foi possível salvar a seção'), { description: err?.message })\n }\n },\n\n async deleteSection(id) {\n try {\n await provider.deleteSection(id)\n set({\n sections: get().sections.filter((s) => s.id !== id),\n placements: get().placements.filter((p) => p.sectionId !== id),\n })\n toast.success(tl('Section removed', 'Seção removida'))\n } catch (err: any) {\n toast.error(tl('Could not remove the section', 'Não foi possível remover a seção'), { description: err?.message })\n }\n },\n\n async reorderSections(orderedIds) {\n const menuId = get().activeMenuId\n if (!menuId) return\n const previous = get().sections\n // Local first: the card has to land where it was dropped, now.\n set({\n sections: orderedIds\n .map((id, index) => {\n const section = previous.find((s) => s.id === id)\n return section ? { ...section, sortOrder: index } : null\n })\n .filter(Boolean) as MenuSection[],\n })\n try {\n await provider.reorderSections(menuId, orderedIds)\n } catch (err: any) {\n set({ sections: previous })\n toast.error(tl('Could not save the new order', 'Não foi possível salvar a ordem'), { description: err?.message })\n }\n },\n\n // --- Items in the open menu -------------------------------------------\n async addItemToSection(sectionId, input) {\n // Same bet as a section: draw the row now, reconcile when the write\n // lands. A dish typed into a menu is not a transaction to wait on.\n const tempId = `pending-${++optimisticSeq}`\n const now = new Date().toISOString()\n const optimisticItem: MenuItem = {\n id: tempId,\n name: input.name,\n description: input.description,\n price: input.price ?? 0,\n currency: '',\n imageUrl: input.imageUrl,\n status: input.status ?? 'available',\n isActive: true,\n availableForPos: input.availableForPos ?? true,\n availableForDelivery: input.availableForDelivery ?? true,\n deliveryPrice: input.deliveryPrice,\n prepTimeMinutes: input.prepTimeMinutes,\n allergens: input.allergens ?? [],\n dietaryTags: input.dietaryTags ?? [],\n sortOrder: 0,\n isFeatured: input.isFeatured ?? false,\n tenantId: '',\n createdAt: now,\n updatedAt: now,\n }\n const optimisticPlacement: MenuPlacement = {\n id: `pending-placement-${optimisticSeq}`,\n sectionId,\n itemId: tempId,\n sortOrder: get().placements.filter((p) => p.sectionId === sectionId).length,\n isActive: true,\n tenantId: '',\n }\n set({\n menuItems: [...get().menuItems, optimisticItem],\n placements: [...get().placements, optimisticPlacement],\n pendingIds: [...get().pendingIds, optimisticPlacement.id],\n })\n try {\n const item = await provider.createMenuItem({ ...input, sectionId })\n const menuId = get().activeMenuId\n set({ menuItems: get().menuItems.map((i) => (i.id === tempId ? item : i)) })\n if (menuId) await get().fetchMenuContent(menuId)\n set({ pendingIds: get().pendingIds.filter((id) => id !== optimisticPlacement.id) })\n void get().fetchSummary()\n return item\n } catch (err: any) {\n set({\n menuItems: get().menuItems.filter((i) => i.id !== tempId),\n placements: get().placements.filter((p) => p.id !== optimisticPlacement.id),\n pendingIds: get().pendingIds.filter((id) => id !== optimisticPlacement.id),\n })\n toast.error(tl('Could not create the item', 'Não foi possível criar o item'), { description: err?.message })\n return null\n }\n },\n\n async placeExistingItem(sectionId, itemId) {\n try {\n const placement = await provider.placeItem({ sectionId, itemId })\n set({ placements: [...get().placements.filter((p) => p.id !== placement.id), placement] })\n } catch (err: any) {\n toast.error(tl('Could not add it to the menu', 'Não foi possível adicionar ao cardápio'), { description: err?.message })\n }\n },\n\n async removePlacement(placementId) {\n const previous = get().placements\n set({ placements: previous.filter((p) => p.id !== placementId) })\n try {\n await provider.removePlacement(placementId)\n } catch (err: any) {\n set({ placements: previous })\n toast.error(tl('Could not remove it from the menu', 'Não foi possível remover do cardápio'), { description: err?.message })\n }\n },\n\n async setPlacementPrice(placementId, price) {\n const previous = get().placements\n set({ placements: previous.map((p) => (p.id === placementId ? { ...p, priceOverride: price } : p)) })\n try {\n await provider.updatePlacement(placementId, { priceOverride: price })\n } catch (err: any) {\n set({ placements: previous })\n toast.error(tl('Could not save the price', 'Não foi possível salvar o preço'), { description: err?.message })\n }\n },\n\n async reorderPlacements(sectionId, orderedIds) {\n const previous = get().placements\n const reordered = previous.map((p) => {\n const index = orderedIds.indexOf(p.id)\n return index >= 0 ? { ...p, sortOrder: index } : p\n })\n set({ placements: reordered })\n try {\n await provider.reorderPlacements(sectionId, orderedIds)\n } catch (err: any) {\n set({ placements: previous })\n toast.error(tl('Could not save the new order', 'Não foi possível salvar a ordem'), { description: err?.message })\n }\n },\n\n async movePlacement(placementId, toSectionId, toIndex) {\n const previous = get().placements\n set({\n placements: previous.map((p) =>\n p.id === placementId ? { ...p, sectionId: toSectionId, sortOrder: toIndex } : p),\n })\n try {\n await provider.movePlacement(placementId, toSectionId, toIndex)\n } catch (err: any) {\n set({ placements: previous })\n toast.error(tl('Could not move the item', 'Não foi possível mover o item'), { description: err?.message })\n }\n },\n\n // --- Items -------------------------------------------------------------\n async updateMenuItem(id, data) {\n const previous = get().menuItems\n set({ menuItems: previous.map((i) => (i.id === id ? { ...i, ...data } as MenuItem : i)) })\n try {\n const updated = await provider.updateMenuItem(id, data)\n set({ menuItems: get().menuItems.map((i) => (i.id === id ? updated : i)) })\n } catch (err: any) {\n set({ menuItems: previous })\n toast.error(tl('Could not save the item', 'Não foi possível salvar o item'), { description: err?.message })\n }\n },\n\n async deleteMenuItem(id) {\n try {\n await provider.deleteMenuItem(id)\n set({\n menuItems: get().menuItems.filter((i) => i.id !== id),\n placements: get().placements.filter((p) => p.itemId !== id),\n })\n void get().fetchSummary()\n toast.success(tl('Item removed', 'Item removido'))\n } catch (err: any) {\n toast.error(tl('Could not remove the item', 'Não foi possível remover o item'), { description: err?.message })\n }\n },\n\n async duplicateMenuItem(id, sectionId) {\n const source = get().menuItems.find((i) => i.id === id)\n if (!source) return\n await get().addItemToSection(sectionId ?? get().placements.find((p) => p.itemId === id)?.sectionId ?? '', {\n name: `${source.name} (cópia)`,\n description: source.description,\n price: source.price,\n cost: source.cost,\n imageUrl: source.imageUrl,\n prepTimeMinutes: source.prepTimeMinutes,\n allergens: source.allergens,\n dietaryTags: source.dietaryTags,\n availableForPos: source.availableForPos,\n availableForDelivery: source.availableForDelivery,\n deliveryPrice: source.deliveryPrice,\n })\n },\n\n async setItemStatus(id, status) {\n await writeItemField(id, 'status', status)\n },\n\n async toggleAvailability(id, field, value) {\n await writeItemField(id, field, value)\n },\n\n async uploadImage(file, kind) {\n if (!provider.uploadImage) {\n toast.error(tl('This workspace does not store menu photos yet.', 'Este espaço ainda não guarda fotos do cardápio.'))\n return null\n }\n try {\n return await provider.uploadImage(file, kind)\n } catch (err: any) {\n toast.error('Não foi possível enviar a foto', { description: err?.message })\n return null\n }\n },\n\n // --- AI import ---------------------------------------------------------\n extracting: false,\n draft: null,\n\n async runExtraction(images, extract) {\n if (images.length === 0) return\n set({ extracting: true })\n try {\n const result = await extract(images)\n const counts = countExtracted(result)\n if (counts.items === 0) {\n set({ extracting: false })\n toast.error(tl('I could not read any items in those photos', 'Não consegui ler itens nessas fotos'), {\n description: tl('Try one photo per page, closer and without glare.', 'Tente uma foto por página, mais perto e sem reflexo.'),\n })\n return\n }\n // Matching by name is what keeps a second round of photos from\n // creating a second \"Bebidas\".\n const existing = get().sections\n let key = 0\n const draft: MenuDraft = {\n source: 'photo',\n model: result.model,\n sections: result.sections.map((section) => ({\n key: `ds-${++key}`,\n name: section.name,\n targetSectionId: existing.find((s) => normalizeName(s.name) === normalizeName(section.name))?.id,\n items: section.items.map((item) => ({\n key: `di-${++key}`,\n name: item.name,\n price: item.price,\n description: item.description,\n })),\n })),\n }\n set({ draft, extracting: false })\n } catch (err: any) {\n set({ extracting: false })\n toast.error(tl('I could not read the photos', 'Não consegui ler as fotos'), { description: err?.message })\n }\n },\n\n updateDraftItem(sectionKey, itemKey, patch) {\n const draft = get().draft\n if (!draft) return\n set({\n draft: {\n ...draft,\n sections: draft.sections.map((section) => section.key !== sectionKey ? section : {\n ...section,\n items: section.items.map((item) => (item.key === itemKey ? { ...item, ...patch } : item)),\n }),\n },\n })\n },\n\n removeDraftItem(sectionKey, itemKey) {\n const draft = get().draft\n if (!draft) return\n const sections = draft.sections\n .map((section) => section.key !== sectionKey ? section : {\n ...section,\n items: section.items.filter((item) => item.key !== itemKey),\n })\n .filter((section) => section.items.length > 0)\n set({ draft: sections.length > 0 ? { ...draft, sections } : null })\n },\n\n updateDraftSection(sectionKey, patch) {\n const draft = get().draft\n if (!draft) return\n set({\n draft: {\n ...draft,\n sections: draft.sections.map((section) => (section.key === sectionKey ? { ...section, ...patch } : section)),\n },\n })\n },\n\n removeDraftSection(sectionKey) {\n const draft = get().draft\n if (!draft) return\n const sections = draft.sections.filter((section) => section.key !== sectionKey)\n set({ draft: sections.length > 0 ? { ...draft, sections } : null })\n },\n\n stageDraft(input) {\n const existing = get().sections\n const { placements, menuItems } = get()\n const itemNames = (sectionId: string) => new Set(\n placements\n .filter((p) => p.sectionId === sectionId)\n .map((p) => normalizeName(menuItems.find((i) => i.id === p.itemId)?.name ?? ''))\n .filter(Boolean),\n )\n let key = 0\n let duplicatesDropped = 0\n const seenSections = new Set<string>()\n const sections: DraftSection[] = []\n for (const section of input) {\n const sectionKey = normalizeName(section.name)\n if (!sectionKey || seenSections.has(sectionKey)) continue\n seenSections.add(sectionKey)\n const target = existing.find((s) => normalizeName(s.name) === sectionKey)\n const already = target ? itemNames(target.id) : new Set<string>()\n const seenItems = new Set<string>()\n const items: DraftItem[] = []\n for (const item of section.items ?? []) {\n const itemKey = normalizeName(item.name)\n if (!itemKey) continue\n if (already.has(itemKey) || seenItems.has(itemKey)) {\n duplicatesDropped++\n continue\n }\n seenItems.add(itemKey)\n items.push({\n key: `di-${++key}`,\n name: item.name,\n price: Number(item.price) || 0,\n description: item.description,\n })\n }\n if (items.length === 0) continue\n sections.push({ key: `ds-${++key}`, name: section.name, targetSectionId: target?.id, items })\n }\n const draft: MenuDraft | null = sections.length > 0 ? { source: 'chat', sections } : null\n set({ draft })\n return {\n sections: sections.length,\n items: sections.reduce((sum, s) => sum + s.items.length, 0),\n duplicatesDropped,\n }\n },\n\n discardDraft() { set({ draft: null }) },\n\n async commitDraft() {\n const draft = get().draft\n const menuId = get().activeMenuId\n if (!draft || !menuId) return { sectionsCreated: 0, itemsCreated: 0, failed: 0 }\n const result = await get().applyImportPlan({\n menuId,\n sections: draft.sections.map((section) => ({\n sectionId: section.targetSectionId,\n name: section.name,\n items: section.items.map(({ name, price, description }) => ({ name, price, description })),\n })),\n })\n set({ draft: null })\n return result\n },\n\n async applyImportPlan(plan) {\n const result: ImportResult = { sectionsCreated: 0, itemsCreated: 0, failed: 0 }\n for (const section of plan.sections) {\n let sectionId = section.sectionId\n if (!sectionId) {\n const created = await provider.createSection({ menuId: plan.menuId, name: section.name })\n sectionId = created.id\n result.sectionsCreated++\n }\n for (const item of section.items) {\n try {\n await provider.createMenuItem({\n name: item.name,\n description: item.description,\n price: item.price,\n sectionId,\n })\n result.itemsCreated++\n } catch {\n result.failed++\n }\n }\n }\n await get().fetchMenus()\n // The rows just written are drawn through `itemsById`: without re-reading\n // the ITEMS the new placements point at products the screen has never\n // fetched, and every imported row renders blank until a full reload.\n await get().fetchMenuItems(get().menuItemQuery ?? {})\n void get().fetchSummary()\n return result\n },\n }\n })\n}\n","import type { PluginRegistryDef } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport { T } from './tables'\n\nconst allergenEntity: EntityDef = {\n name: 'Allergen',\n namePlural: 'Allergens',\n icon: 'AlertTriangle',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'icon', label: 'Icon', type: 'text', showInTable: true },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: T.allergens, tenantScoped: true },\n}\n\nconst dietaryTagEntity: EntityDef = {\n name: 'Dietary Tag',\n namePlural: 'Dietary Tags',\n icon: 'Leaf',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'color', label: 'Color', type: 'color', showInTable: true },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: T.dietaryTags, tenantScoped: true },\n}\n\nconst modifierGroupEntity: EntityDef = {\n name: 'Modifier Group',\n namePlural: 'Modifier Groups',\n icon: 'ListPlus',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'minSelections', label: 'Min Selections', type: 'number', showInTable: true, defaultValue: 0 },\n { key: 'maxSelections', label: 'Max Selections', type: 'number', showInTable: true, defaultValue: 1 },\n { key: 'isRequired', label: 'Required', type: 'boolean', showInTable: true, defaultValue: false },\n ],\n data: { table: T.modifierGroups, tenantScoped: true },\n}\n\nexport const menuRegistries: PluginRegistryDef[] = [\n {\n id: 'allergens',\n entity: allergenEntity,\n icon: 'AlertTriangle',\n description: 'Allergen types for menu items',\n display: 'table',\n readOnly: true,\n seedData: [\n { id: 'a-gluten', name: 'Gluten', icon: '🌾', isActive: true },\n { id: 'a-dairy', name: 'Dairy', icon: '🥛', isActive: true },\n { id: 'a-nuts', name: 'Nuts', icon: '🥜', isActive: true },\n { id: 'a-shellfish', name: 'Shellfish', icon: '🦐', isActive: true },\n { id: 'a-eggs', name: 'Eggs', icon: '🥚', isActive: true },\n { id: 'a-soy', name: 'Soy', icon: '🫘', isActive: true },\n ],\n },\n {\n id: 'dietary-tags',\n entity: dietaryTagEntity,\n icon: 'Leaf',\n description: 'Dietary tags (vegan, vegetarian, etc.)',\n display: 'table',\n readOnly: true,\n seedData: [\n { id: 'dt-vegan', name: 'Vegan', color: 'green', isActive: true },\n { id: 'dt-vegetarian', name: 'Vegetarian', color: 'lime', isActive: true },\n { id: 'dt-gf', name: 'Gluten Free', color: 'amber', isActive: true },\n ],\n },\n {\n id: 'modifier-groups',\n entity: modifierGroupEntity,\n icon: 'ListPlus',\n description: 'Modifier groups for item customization',\n display: 'table',\n },\n]\n","export const en: Record<string, string> = {\n 'menu.title': 'Menu',\n 'menu.nav.manager': 'Menu',\n\n // Manager\n 'menu.manager.title': 'Menu',\n 'menu.manager.subtitle': 'Build your menus, with sections and order',\n 'menu.manager.search': 'Search the menu...',\n 'menu.manager.newMenu': 'New menu',\n 'menu.manager.menuActions': 'Menu actions',\n 'menu.manager.editMenu': 'Edit menu',\n 'menu.manager.duplicateMenu': 'Duplicate menu',\n 'menu.manager.activateMenu': 'Activate menu',\n 'menu.manager.deactivateMenu': 'Deactivate menu',\n 'menu.manager.deleteMenu': 'Delete menu',\n 'menu.manager.menuOff': 'Off',\n 'menu.manager.servingNow': 'Serving now',\n 'menu.manager.notServing': 'Outside its hours',\n 'menu.manager.addSection': 'New section',\n 'menu.manager.newSectionName': 'New section',\n 'menu.manager.editSection': 'Turn section on/off',\n 'menu.manager.deleteSection': 'Delete section',\n 'menu.manager.sectionActions': 'Section actions',\n 'menu.manager.sectionOff': 'Section off',\n 'menu.manager.emptySection': 'Nothing here yet — click to add',\n 'menu.manager.addItem': 'Add item',\n 'menu.manager.itemActions': 'Item actions',\n 'menu.manager.itemsCount': '{{count}} items',\n 'menu.manager.edit': 'Edit',\n 'menu.manager.duplicate': 'Duplicate',\n 'menu.manager.markSoldOut': 'Mark sold out',\n 'menu.manager.markAvailable': 'Mark available',\n 'menu.manager.feature': 'Feature',\n 'menu.manager.unfeature': 'Remove from featured',\n 'menu.manager.removeFromMenu': 'Remove from this menu',\n 'menu.manager.deleteItem': 'Delete item',\n 'menu.manager.dragSection': 'Drag section',\n 'menu.manager.dragItem': 'Drag item',\n 'menu.manager.expand': 'Expand',\n 'menu.manager.collapse': 'Collapse',\n 'menu.manager.available': 'Available',\n 'menu.manager.soldOut': 'Sold out',\n 'menu.manager.hidden': 'Hidden',\n 'menu.manager.pos': 'POS',\n 'menu.manager.delivery': 'Delivery',\n 'menu.manager.featured': 'Featured',\n 'menu.manager.overridden': 'this menu',\n 'menu.manager.overriddenHint': 'This item costs a different price on this menu',\n 'menu.manager.empty': 'Your menu is still empty',\n 'menu.manager.emptyHint': 'Create the first section, or send photos of the printed menu and the assistant fills it in.',\n\n // Menu dialog\n 'menu.menuDialog.newTitle': 'New menu',\n 'menu.menuDialog.editTitle': 'Edit menu',\n 'menu.menuDialog.name': 'Name',\n 'menu.menuDialog.namePlaceholder': 'Lunch, Weekend, Delivery...',\n 'menu.menuDialog.description': 'Description',\n 'menu.menuDialog.descriptionPlaceholder': 'Weekday lunch',\n 'menu.menuDialog.channels': 'Where it shows',\n 'menu.menuDialog.active': 'Menu active',\n 'menu.menuDialog.activeHint': 'Turned off it leaves the floor and delivery without being deleted',\n\n 'menu.channel.pos': 'Dine-in / POS',\n 'menu.channel.delivery': 'Delivery',\n 'menu.channel.digital': 'Digital menu',\n\n // Schedule\n 'menu.schedule.always': 'Every day, all day',\n 'menu.schedule.restrict': 'Only on certain days and hours',\n 'menu.schedule.restrictHint': 'This is how a weekday lunch menu is born',\n 'menu.schedule.days': 'Days',\n 'menu.schedule.from': 'From',\n 'menu.schedule.to': 'To',\n 'menu.schedule.overnightHint': 'If the end is before the start, the menu crosses midnight (22:00–02:00).',\n 'menu.schedule.presetWeekdays': 'Weekdays',\n 'menu.schedule.presetWeekend': 'Weekend',\n 'menu.schedule.presetEveryDay': 'Every day',\n\n // Item form\n 'menu.itemForm.newTitle': 'New item',\n 'menu.itemForm.editTitle': 'Edit item',\n 'menu.itemForm.name': 'Name',\n 'menu.itemForm.namePlaceholder': 'Grilled picanha',\n 'menu.itemForm.description': 'Description',\n 'menu.itemForm.descriptionPlaceholder': 'Serves 2, comes with farofa',\n 'menu.itemForm.photo': 'Photo',\n 'menu.itemForm.photoHint': 'Square, well lit. Shows on the digital menu and delivery.',\n 'menu.itemForm.pricingGroup': 'Pricing',\n 'menu.itemForm.menuGroup': 'On the menu',\n 'menu.itemForm.posHint': 'Shows for whoever is serving the floor',\n 'menu.itemForm.deliveryHint': 'Shows for orders from outside',\n 'menu.itemForm.featuredHint': 'Moves to the top of its section',\n 'menu.itemForm.price': 'Price',\n 'menu.itemForm.cost': 'Cost',\n 'menu.itemForm.deliveryPrice': 'Delivery price',\n 'menu.itemForm.prepTime': 'Prep (min)',\n 'menu.itemForm.section': 'Section',\n 'menu.itemForm.status': 'Status',\n 'menu.itemForm.priceOverride': 'Price on this menu only',\n 'menu.itemForm.priceOverrideHint': 'The same dish can cost less at lunch. Empty = the item price.',\n 'menu.itemForm.clearOverride': 'Use the item price',\n\n // AI import\n 'menu.import.action': 'Add with AI',\n 'menu.import.actionDesc': 'Send photos of the printed menu and the assistant fills it in for you.',\n 'menu.import.uploadCta': 'Upload a photo of the menu',\n 'menu.import.uploadHint': 'One photo per page, straight on, no glare. Several at once is fine.',\n 'menu.import.photoSentPrompt': 'Here is a photo of my menu. Please read it and register it for me.',\n 'menu.import.askPrompt': 'I want to add my menu from photos.',\n 'menu.import.askHint': 'Describe the menu, or ask to start from photos…',\n 'menu.import.askPersona': 'Menu setup',\n 'menu.import.askPitch': 'Send me photos of the menu and I will type it in.',\n 'menu.import.askDescription': 'One photo per page, straight on, no glare. I read them, show what I understood right here on the screen, and we check it together before saving.',\n 'menu.import.askSuggestion.0': 'I will send photos of the printed menu',\n 'menu.import.askSuggestion.1': 'Create a weekday lunch menu',\n 'menu.import.askSuggestion.2': 'Add a desserts section',\n 'menu.import.createSection': 'Create new section',\n 'menu.import.destination': 'Goes into',\n 'menu.import.intoSection': 'Add into: {{name}}',\n 'menu.import.willAppend': 'goes into {{name}}',\n 'menu.import.dropItem': 'Drop item',\n 'menu.import.dropSection': 'Drop section',\n 'menu.import.draftCount': '{{items}} items read across {{sections}} sections',\n 'menu.import.draftHint': 'Check and fix them right here — nothing is saved yet.',\n 'menu.import.draftMissingPrice': '{{count}} items came without a price. Fill them in before saving.',\n 'menu.import.discard': 'Discard',\n 'menu.import.commit': 'Save {{count}} items',\n 'menu.import.done': '{{items}} items in {{sections}} sections created',\n 'menu.import.someFailed': '{{count}} items could not be created',\n\n // Preview\n 'menu.preview.action': 'Preview',\n 'menu.preview.title': 'Menu',\n 'menu.preview.notServingNow': 'outside its hours right now',\n\n // Confirmations\n 'menu.confirm.sectionTitle': 'Delete the section {{name}}?',\n 'menu.confirm.sectionDesc': 'Its items leave this menu but stay registered.',\n 'menu.confirm.itemTitle': 'Delete the item {{name}}?',\n 'menu.confirm.itemDesc': 'It leaves every menu it appears in.',\n 'menu.confirm.menuTitle': 'Delete the menu {{name}}?',\n 'menu.confirm.menuDesc': 'Its sections go with it. The dishes stay registered.',\n 'menu.confirm.delete': 'Delete',\n\n // Shared form bits\n 'menu.form.save': 'Save',\n 'menu.form.saving': 'Saving...',\n 'menu.form.cancel': 'Cancel',\n\n // Settings\n 'menu.settings.title': 'Menu settings',\n}\n","export const ptBR: Record<string, string> = {\n 'menu.title': 'Cardápio',\n 'menu.nav.manager': 'Cardápio',\n\n // Manager\n 'menu.manager.title': 'Cardápio',\n 'menu.manager.subtitle': 'Monte os cardápios da casa, com seções e ordem',\n 'menu.manager.search': 'Buscar item no cardápio...',\n 'menu.manager.newMenu': 'Novo cardápio',\n 'menu.manager.menuActions': 'Ações do cardápio',\n 'menu.manager.editMenu': 'Editar cardápio',\n 'menu.manager.duplicateMenu': 'Duplicar cardápio',\n 'menu.manager.activateMenu': 'Ativar cardápio',\n 'menu.manager.deactivateMenu': 'Desativar cardápio',\n 'menu.manager.deleteMenu': 'Excluir cardápio',\n 'menu.manager.menuOff': 'Desativado',\n 'menu.manager.servingNow': 'Servindo agora',\n 'menu.manager.notServing': 'Fora do horário',\n 'menu.manager.addSection': 'Nova seção',\n 'menu.manager.newSectionName': 'Nova seção',\n 'menu.manager.editSection': 'Ativar/desativar seção',\n 'menu.manager.deleteSection': 'Excluir seção',\n 'menu.manager.sectionActions': 'Ações da seção',\n 'menu.manager.sectionOff': 'Seção desativada',\n 'menu.manager.emptySection': 'Nenhum item aqui ainda — clique para adicionar',\n 'menu.manager.addItem': 'Adicionar item',\n 'menu.manager.itemActions': 'Ações do item',\n 'menu.manager.itemsCount': '{{count}} itens',\n 'menu.manager.edit': 'Editar',\n 'menu.manager.duplicate': 'Duplicar',\n 'menu.manager.markSoldOut': 'Marcar como esgotado',\n 'menu.manager.markAvailable': 'Marcar como disponível',\n 'menu.manager.feature': 'Colocar em destaque',\n 'menu.manager.unfeature': 'Tirar do destaque',\n 'menu.manager.removeFromMenu': 'Tirar deste cardápio',\n 'menu.manager.deleteItem': 'Excluir item',\n 'menu.manager.dragSection': 'Arrastar seção',\n 'menu.manager.dragItem': 'Arrastar item',\n 'menu.manager.expand': 'Expandir',\n 'menu.manager.collapse': 'Recolher',\n 'menu.manager.available': 'Disponível',\n 'menu.manager.soldOut': 'Esgotado',\n 'menu.manager.hidden': 'Oculto',\n 'menu.manager.pos': 'PDV',\n 'menu.manager.delivery': 'Delivery',\n 'menu.manager.featured': 'Destaque',\n 'menu.manager.overridden': 'preço deste cardápio',\n 'menu.manager.overriddenHint': 'Este item custa diferente neste cardápio',\n 'menu.manager.empty': 'Seu cardápio ainda está vazio',\n 'menu.manager.emptyHint': 'Crie a primeira seção, ou mande fotos do cardápio impresso e o assistente cadastra pra você.',\n\n // Menu dialog\n 'menu.menuDialog.newTitle': 'Novo cardápio',\n 'menu.menuDialog.editTitle': 'Editar cardápio',\n 'menu.menuDialog.name': 'Nome',\n 'menu.menuDialog.namePlaceholder': 'Executivo, Fim de semana, Delivery...',\n 'menu.menuDialog.description': 'Descrição',\n 'menu.menuDialog.descriptionPlaceholder': 'Almoço de segunda a sexta',\n 'menu.menuDialog.channels': 'Onde aparece',\n 'menu.menuDialog.active': 'Cardápio ativo',\n 'menu.menuDialog.activeHint': 'Desativado, ele some do salão e do delivery sem ser apagado',\n\n 'menu.channel.pos': 'Salão / PDV',\n 'menu.channel.delivery': 'Delivery',\n 'menu.channel.digital': 'Cardápio digital',\n\n // Schedule\n 'menu.schedule.always': 'Todo dia, o dia inteiro',\n 'menu.schedule.restrict': 'Só em certos dias e horários',\n 'menu.schedule.restrictHint': 'É assim que nasce um executivo de segunda a sexta',\n 'menu.schedule.days': 'Dias',\n 'menu.schedule.from': 'Das',\n 'menu.schedule.to': 'Até',\n 'menu.schedule.overnightHint': 'Se o fim for antes do começo, o cardápio atravessa a meia-noite (22:00–02:00).',\n 'menu.schedule.presetWeekdays': 'Dias de semana',\n 'menu.schedule.presetWeekend': 'Fim de semana',\n 'menu.schedule.presetEveryDay': 'Todo dia',\n\n // Item form\n 'menu.itemForm.newTitle': 'Novo item',\n 'menu.itemForm.editTitle': 'Editar item',\n 'menu.itemForm.name': 'Nome',\n 'menu.itemForm.namePlaceholder': 'Picanha na chapa',\n 'menu.itemForm.description': 'Descrição',\n 'menu.itemForm.descriptionPlaceholder': 'Serve 2 pessoas, acompanha farofa',\n 'menu.itemForm.photo': 'Foto',\n 'menu.itemForm.photoHint': 'Quadrada, boa luz. Aparece no cardápio digital e no delivery.',\n 'menu.itemForm.pricingGroup': 'Preços',\n 'menu.itemForm.menuGroup': 'No cardápio',\n 'menu.itemForm.posHint': 'Aparece para quem atende no salão',\n 'menu.itemForm.deliveryHint': 'Aparece para quem pede de fora',\n 'menu.itemForm.featuredHint': 'Sobe para o topo da seção',\n 'menu.itemForm.price': 'Preço',\n 'menu.itemForm.cost': 'Custo',\n 'menu.itemForm.deliveryPrice': 'Preço delivery',\n 'menu.itemForm.prepTime': 'Preparo (min)',\n 'menu.itemForm.section': 'Seção',\n 'menu.itemForm.status': 'Situação',\n 'menu.itemForm.priceOverride': 'Preço só neste cardápio',\n 'menu.itemForm.priceOverrideHint': 'O mesmo prato pode custar menos no executivo. Em branco, vale o preço do item.',\n 'menu.itemForm.clearOverride': 'Usar o preço do item',\n\n // AI import\n 'menu.import.action': 'Inserir com IA',\n 'menu.import.actionDesc': 'Mande fotos do cardápio impresso e o assistente cadastra por você.',\n 'menu.import.uploadCta': 'Subir foto do cardápio',\n 'menu.import.uploadHint': 'Uma foto por página, de frente e sem reflexo. Pode mandar várias.',\n 'menu.import.photoSentPrompt': 'Aqui está a foto do meu cardápio. Lê e cadastra pra mim, por favor.',\n 'menu.import.askPrompt': 'Quero cadastrar meu cardápio a partir de fotos.',\n 'menu.import.askHint': 'Descreva o cardápio, ou peça para começar pelas fotos…',\n 'menu.import.askPersona': 'Cadastro de cardápio',\n 'menu.import.askPitch': 'Me manda as fotos do cardápio que eu cadastro.',\n 'menu.import.askDescription': 'Uma foto por página, de frente e sem reflexo. Eu leio, mostro o que entendi aqui na tela e a gente confere junto antes de gravar.',\n 'menu.import.askSuggestion.0': 'Vou mandar as fotos do cardápio impresso',\n 'menu.import.askSuggestion.1': 'Cria um cardápio executivo de segunda a sexta',\n 'menu.import.askSuggestion.2': 'Adiciona uma seção de sobremesas',\n 'menu.import.createSection': 'Criar seção nova',\n 'menu.import.destination': 'Onde entra',\n 'menu.import.intoSection': 'Somar em: {{name}}',\n 'menu.import.willAppend': 'entra em {{name}}',\n 'menu.import.dropItem': 'Descartar item',\n 'menu.import.dropSection': 'Descartar seção',\n 'menu.import.draftCount': '{{items}} itens lidos em {{sections}} seções',\n 'menu.import.draftHint': 'Confira e ajuste aqui mesmo — nada foi gravado ainda.',\n 'menu.import.draftMissingPrice': '{{count}} itens vieram sem preço. Preencha antes de gravar.',\n 'menu.import.discard': 'Descartar',\n 'menu.import.commit': 'Gravar {{count}} itens',\n 'menu.import.done': '{{items}} itens em {{sections}} seções cadastrados',\n 'menu.import.someFailed': '{{count}} itens não puderam ser criados',\n\n // Preview\n 'menu.preview.action': 'Ver como fica',\n 'menu.preview.title': 'Cardápio',\n 'menu.preview.notServingNow': 'fora do horário agora',\n\n // Confirmations\n 'menu.confirm.sectionTitle': 'Excluir a seção {{name}}?',\n 'menu.confirm.sectionDesc': 'Os itens dela saem deste cardápio, mas continuam cadastrados.',\n 'menu.confirm.itemTitle': 'Excluir o item {{name}}?',\n 'menu.confirm.itemDesc': 'Ele sai de todos os cardápios em que aparece.',\n 'menu.confirm.menuTitle': 'Excluir o cardápio {{name}}?',\n 'menu.confirm.menuDesc': 'As seções deste cardápio somem. Os pratos continuam cadastrados.',\n 'menu.confirm.delete': 'Excluir',\n\n // Shared form bits\n 'menu.form.save': 'Salvar',\n 'menu.form.saving': 'Salvando...',\n 'menu.form.cancel': 'Cancelar',\n\n // Settings\n 'menu.settings.title': 'Configurações do Cardápio',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const menuLocales: Record<string, Record<string, string>> = { en, 'pt-BR': ptBR }\n","import { defineSettingsTab } from '@fayz-ai/admin'\nimport { tl } from '@fayz-ai/core'\n\nexport const menuV1SettingsTabs = [\n defineSettingsTab({\n id: 'menu-qr',\n label: tl('QR menu', 'Cardápio digital (QR)'),\n icon: 'ScanLine',\n section: 'operations',\n requiresFacet: 'qr_menu',\n pending: true,\n defaults: { 'qr_menu.closing_suggestions': false, 'qr_menu.closing_title': 'Antes de fechar, deseja pedir também?' },\n sections: [{\n enabledBy: 'qr_menu.closing_suggestions',\n fields: [\n { key: 'qr_menu.closing_suggestions', type: 'boolean', label: tl('Suggest items before closing', 'Sugestões no fechamento') },\n { key: 'qr_menu.closing_title', type: 'string', label: tl('Question shown', 'Pergunta exibida') },\n ],\n }],\n }),\n]\n","import { createFayzClient, type FayzClientOptions, type FayzTableFilter } from '@fayz-ai/sdk'\nimport type {\n CreateMenuCategoryInput,\n CreateMenuItemInput,\n MenuCategory,\n MenuItem,\n MenuItemQuery,\n MenuItemStatus,\n MenuSummary,\n ModifierGroup,\n PaginatedResult,\n UpdateMenuItemInput,\n} from '../types'\nimport type { MenuDataProvider } from './types'\n\nexport interface FayzMenuProviderOptions extends FayzClientOptions {\n projectId?: string\n schema?: string\n runtime?: boolean\n categoriesTable?: string\n productsTable?: string\n categoryKind?: string\n}\n\ninterface CategoryRow {\n id: string\n tenant_id?: string | null\n kind?: string | null\n name: string\n slug?: string | null\n parent_id?: string | null\n icon?: string | null\n color?: string | null\n sort_order?: number | null\n is_active?: boolean | null\n metadata?: Record<string, unknown> | null\n created_at?: string | null\n updated_at?: string | null\n}\n\ninterface ProductRow {\n id: string\n tenant_id?: string | null\n category_id?: string | null\n name: string\n description?: string | null\n sku?: string | null\n price?: number | string | null\n cost?: number | string | null\n currency?: string | null\n image_url?: string | null\n status?: string | null\n is_active?: boolean | null\n tags?: string[] | null\n metadata?: Record<string, unknown> | null\n created_at?: string | null\n updated_at?: string | null\n}\n\nconst DEFAULT_CATEGORY_KIND = 'menu_category'\nconst MENU_METADATA_KEY = 'fayzMenu'\n\nfunction nowIso(): string {\n return new Date().toISOString()\n}\n\nfunction slugify(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nfunction numberValue(value: number | string | null | undefined): number {\n if (typeof value === 'number') return value\n if (typeof value === 'string') return Number(value) || 0\n return 0\n}\n\nfunction menuMetadata(row: ProductRow): Record<string, unknown> {\n const raw = row.metadata?.[MENU_METADATA_KEY]\n return raw && typeof raw === 'object' && !Array.isArray(raw) ? raw as Record<string, unknown> : {}\n}\n\nfunction rowToCategory(row: CategoryRow, itemCount = 0): MenuCategory {\n return {\n id: row.id,\n name: row.name,\n parentId: row.parent_id ?? undefined,\n icon: row.icon ?? undefined,\n color: row.color ?? undefined,\n sortOrder: row.sort_order ?? 0,\n isActive: row.is_active ?? true,\n itemCount,\n tenantId: row.tenant_id ?? 'runtime-tenant',\n createdAt: row.created_at ?? nowIso(),\n updatedAt: row.updated_at ?? row.created_at ?? nowIso(),\n }\n}\n\nfunction rowToItem(row: ProductRow, categoryName?: string): MenuItem {\n const metadata = menuMetadata(row)\n const status = (metadata.status ?? row.status ?? 'available') as MenuItemStatus\n return {\n id: row.id,\n name: row.name,\n description: row.description ?? undefined,\n price: numberValue(row.price),\n cost: numberValue(row.cost),\n currency: row.currency ?? 'BRL',\n sku: row.sku ?? undefined,\n imageUrl: row.image_url ?? undefined,\n categoryId: row.category_id ?? undefined,\n categoryName,\n status,\n isActive: row.is_active ?? true,\n prepTimeMinutes: typeof metadata.prepTimeMinutes === 'number' ? metadata.prepTimeMinutes : undefined,\n allergens: Array.isArray(metadata.allergens) ? metadata.allergens as string[] : undefined,\n dietaryTags: Array.isArray(metadata.dietaryTags) ? metadata.dietaryTags as string[] : row.tags ?? undefined,\n availableForPos: typeof metadata.availableForPos === 'boolean' ? metadata.availableForPos : true,\n availableForDelivery: typeof metadata.availableForDelivery === 'boolean' ? metadata.availableForDelivery : true,\n deliveryPrice: typeof metadata.deliveryPrice === 'number' ? metadata.deliveryPrice : undefined,\n sortOrder: typeof metadata.sortOrder === 'number' ? metadata.sortOrder : 0,\n isFeatured: typeof metadata.isFeatured === 'boolean' ? metadata.isFeatured : false,\n modifierGroupIds: Array.isArray(metadata.modifierGroupIds) ? metadata.modifierGroupIds as string[] : undefined,\n metadata: row.metadata ?? {},\n tenantId: row.tenant_id ?? 'runtime-tenant',\n createdAt: row.created_at ?? nowIso(),\n updatedAt: row.updated_at ?? row.created_at ?? nowIso(),\n }\n}\n\nfunction categoryPayload(input: CreateMenuCategoryInput, kind: string): Record<string, unknown> {\n return {\n kind,\n name: input.name,\n slug: slugify(input.name),\n parent_id: input.parentId ?? null,\n icon: input.icon ?? null,\n color: input.color ?? null,\n sort_order: input.sortOrder ?? 0,\n is_active: true,\n }\n}\n\nfunction itemMetadata(input: Partial<CreateMenuItemInput>, existing?: Record<string, unknown>): Record<string, unknown> {\n return {\n ...(existing ?? {}),\n [MENU_METADATA_KEY]: {\n ...((existing?.[MENU_METADATA_KEY] && typeof existing[MENU_METADATA_KEY] === 'object') ? existing[MENU_METADATA_KEY] as Record<string, unknown> : {}),\n status: input.status,\n prepTimeMinutes: input.prepTimeMinutes,\n allergens: input.allergens,\n dietaryTags: input.dietaryTags,\n availableForPos: input.availableForPos ?? true,\n availableForDelivery: input.availableForDelivery ?? true,\n deliveryPrice: input.deliveryPrice,\n isFeatured: input.isFeatured ?? false,\n modifierGroupIds: input.modifierGroupIds,\n },\n }\n}\n\nfunction itemCreatePayload(input: CreateMenuItemInput): Record<string, unknown> {\n return {\n name: input.name,\n description: input.description ?? null,\n price: input.price,\n cost: input.cost ?? null,\n currency: 'BRL',\n image_url: input.imageUrl ?? null,\n category_id: input.categoryId ?? null,\n status: input.status === 'hidden' ? 'archived' : 'active',\n is_active: input.status !== 'hidden',\n tags: input.dietaryTags ?? [],\n metadata: itemMetadata(input),\n }\n}\n\nfunction itemUpdatePayload(input: UpdateMenuItemInput, existing?: MenuItem): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (input.name !== undefined) payload.name = input.name\n if (input.description !== undefined) payload.description = input.description\n if (input.price !== undefined) payload.price = input.price\n if (input.cost !== undefined) payload.cost = input.cost\n if (input.imageUrl !== undefined) payload.image_url = input.imageUrl\n if (input.categoryId !== undefined) payload.category_id = input.categoryId\n if (input.status !== undefined) {\n payload.status = input.status === 'hidden' ? 'archived' : 'active'\n payload.is_active = input.status !== 'hidden'\n }\n if (input.dietaryTags !== undefined) payload.tags = input.dietaryTags\n // itemMetadata never reads categoryId; `null` (an unfile) is not a value it\n // has an opinion about, so it is normalised away rather than widening a type\n // that four other callers share.\n payload.metadata = itemMetadata({ ...input, categoryId: input.categoryId ?? undefined }, existing?.metadata)\n return payload\n}\n\nfunction filtersFromQuery(query: MenuItemQuery): FayzTableFilter[] {\n const filters: FayzTableFilter[] = [{ column: 'is_active', operator: 'eq', value: true }]\n if (query.categoryId) filters.push({ column: 'category_id', operator: 'eq', value: query.categoryId })\n return filters\n}\n\nfunction matchesClientQuery(item: MenuItem, query: MenuItemQuery): boolean {\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n if (!statuses.includes(item.status)) return false\n }\n if (query.availableForPos !== undefined && item.availableForPos !== query.availableForPos) return false\n if (query.availableForDelivery !== undefined && item.availableForDelivery !== query.availableForDelivery) return false\n if (query.isFeatured !== undefined && item.isFeatured !== query.isFeatured) return false\n if (query.search) {\n const search = query.search.toLowerCase()\n return item.name.toLowerCase().includes(search)\n || (item.description?.toLowerCase().includes(search) ?? false)\n }\n return true\n}\n\nfunction paginate<T>(items: T[], page?: number, pageSize?: number): PaginatedResult<T> {\n const currentPage = page ?? 1\n const limit = pageSize ?? 50\n const start = (currentPage - 1) * limit\n return { data: items.slice(start, start + limit), total: items.length }\n}\n\nexport function createFayzMenuProvider(options: FayzMenuProviderOptions = {}): MenuDataProvider {\n const client = createFayzClient(options)\n const projectId = options.projectId\n const schema = options.schema\n const runtime = options.runtime\n const categoriesTable = options.categoriesTable ?? 'categories'\n const productsTable = options.productsTable ?? 'products'\n const categoryKind = options.categoryKind ?? DEFAULT_CATEGORY_KIND\n\n const tableOptions = { projectId, schema, runtime }\n\n async function getCategoriesRaw(): Promise<CategoryRow[]> {\n const response = await client.data.listRows<CategoryRow>({\n ...tableOptions,\n table: categoriesTable,\n filters: [\n { column: 'kind', operator: 'eq', value: categoryKind },\n { column: 'is_active', operator: 'eq', value: true },\n ],\n sortColumn: 'sort_order',\n sortDirection: 'asc',\n limit: 500,\n })\n return response.rows\n }\n\n async function getItemsRaw(): Promise<ProductRow[]> {\n const response = await client.data.listRows<ProductRow>({\n ...tableOptions,\n table: productsTable,\n filters: [{ column: 'is_active', operator: 'eq', value: true }],\n sortColumn: 'name',\n sortDirection: 'asc',\n limit: 1000,\n })\n return response.rows.filter((row) => {\n const metadata = menuMetadata(row)\n return metadata.kind === 'menu_item' || metadata.status != null || row.category_id != null\n })\n }\n\n async function getCategoryMap() {\n const categories = await getCategoriesRaw()\n return new Map(categories.map((category) => [category.id, category]))\n }\n\n async function getItems(): Promise<MenuItem[]> {\n const [rows, categoryMap] = await Promise.all([getItemsRaw(), getCategoryMap()])\n return rows.map((row) => rowToItem(row, row.category_id ? categoryMap.get(row.category_id)?.name : undefined))\n .sort((a, b) => a.sortOrder - b.sortOrder || a.name.localeCompare(b.name))\n }\n\n return {\n async getCategories() {\n const [categories, items] = await Promise.all([getCategoriesRaw(), getItemsRaw()])\n const counts = new Map<string, number>()\n for (const item of items) {\n if (item.category_id) counts.set(item.category_id, (counts.get(item.category_id) ?? 0) + 1)\n }\n return categories.map((category) => rowToCategory(category, counts.get(category.id) ?? 0))\n },\n\n async getCategoryById(id: string) {\n const response = await client.data.listRows<CategoryRow>({\n ...tableOptions,\n table: categoriesTable,\n filters: [{ column: 'id', operator: 'eq', value: id }],\n limit: 1,\n })\n return response.rows[0] ? rowToCategory(response.rows[0]) : null\n },\n\n async createCategory(input: CreateMenuCategoryInput) {\n const row = await client.data.createRow<CategoryRow>({\n ...tableOptions,\n table: categoriesTable,\n row: categoryPayload(input, categoryKind),\n })\n return rowToCategory(row)\n },\n\n async updateCategory(id: string, data: Partial<MenuCategory>) {\n const row = await client.data.updateRow<CategoryRow>({\n ...tableOptions,\n table: categoriesTable,\n primaryKeys: { id },\n row: {\n name: data.name,\n parent_id: data.parentId,\n icon: data.icon,\n color: data.color,\n sort_order: data.sortOrder,\n is_active: data.isActive,\n },\n })\n return rowToCategory(row)\n },\n\n async deleteCategory(id: string) {\n await client.data.updateRow<CategoryRow>({\n ...tableOptions,\n table: categoriesTable,\n primaryKeys: { id },\n row: { is_active: false },\n })\n },\n\n async reorderCategories(ids: string[]) {\n await Promise.all(ids.map((id, sortOrder) => this.updateCategory(id, { sortOrder })))\n },\n\n async getMenuItems(query: MenuItemQuery) {\n const items = (await getItems()).filter((item) => matchesClientQuery(item, query))\n return paginate(items, query.page, query.pageSize)\n },\n\n async getMenuItemById(id: string) {\n const response = await client.data.listRows<ProductRow>({\n ...tableOptions,\n table: productsTable,\n filters: [{ column: 'id', operator: 'eq', value: id }],\n limit: 1,\n })\n if (!response.rows[0]) return null\n const categoryMap = await getCategoryMap()\n const row = response.rows[0]\n return rowToItem(row, row.category_id ? categoryMap.get(row.category_id)?.name : undefined)\n },\n\n async createMenuItem(input: CreateMenuItemInput) {\n const row = await client.data.createRow<ProductRow>({\n ...tableOptions,\n table: productsTable,\n row: itemCreatePayload(input),\n })\n const categoryMap = await getCategoryMap()\n return rowToItem(row, row.category_id ? categoryMap.get(row.category_id)?.name : undefined)\n },\n\n async updateMenuItem(id: string, data: UpdateMenuItemInput) {\n const existing = await this.getMenuItemById(id)\n const row = await client.data.updateRow<ProductRow>({\n ...tableOptions,\n table: productsTable,\n primaryKeys: { id },\n row: itemUpdatePayload(data, existing ?? undefined),\n })\n const categoryMap = await getCategoryMap()\n return rowToItem(row, row.category_id ? categoryMap.get(row.category_id)?.name : undefined)\n },\n\n async deleteMenuItem(id: string) {\n await client.data.updateRow<ProductRow>({\n ...tableOptions,\n table: productsTable,\n primaryKeys: { id },\n row: { is_active: false },\n })\n },\n\n async toggleAvailability(id: string, field: 'status' | 'availableForPos' | 'availableForDelivery', value: unknown) {\n return this.updateMenuItem(id, { [field]: value } as UpdateMenuItemInput)\n },\n\n async reorderItems(categoryId: string, ids: string[]) {\n await Promise.all(ids.map(async (id, sortOrder) => {\n const existing = await this.getMenuItemById(id)\n await client.data.updateRow<ProductRow>({\n ...tableOptions,\n table: productsTable,\n primaryKeys: { id },\n row: { metadata: itemMetadata({ categoryId }, { ...existing?.metadata, [MENU_METADATA_KEY]: { ...existing?.metadata?.[MENU_METADATA_KEY] as Record<string, unknown>, sortOrder } }) },\n })\n }))\n },\n\n async getModifierGroups(): Promise<ModifierGroup[]> {\n return []\n },\n\n async createModifierGroup(): Promise<ModifierGroup> {\n throw new Error('Menu modifier groups require a dedicated Fayz table/broker contract.')\n },\n\n async updateModifierGroup(): Promise<ModifierGroup> {\n throw new Error('Menu modifier groups require a dedicated Fayz table/broker contract.')\n },\n\n async deleteModifierGroup(): Promise<void> {\n throw new Error('Menu modifier groups require a dedicated Fayz table/broker contract.')\n },\n\n async getSummary(): Promise<MenuSummary> {\n const [items, categories] = await Promise.all([getItems(), this.getCategories()])\n const prices = items.filter((item) => item.price > 0).map((item) => item.price)\n return {\n totalItems: items.length,\n availableItems: items.filter((item) => item.status === 'available').length,\n soldOutItems: items.filter((item) => item.status === 'sold_out').length,\n hiddenItems: items.filter((item) => item.status === 'hidden').length,\n categoryCount: categories.length,\n averagePrice: prices.length ? prices.reduce((sum, price) => sum + price, 0) / prices.length : 0,\n featuredCount: items.filter((item) => item.isFeatured).length,\n }\n },\n }\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { registerTranslations } from '@fayz-ai/core'\nimport type { EntityLookup } from '@fayz-ai/admin'\nimport { createSafeDataProvider } from '@fayz-ai/core'\nimport type { MenuDataProvider } from './data/types'\nimport { createMockMenuProvider } from './data/mock'\nimport { createSupabaseMenuProvider } from './data/supabase'\n// Exportado porque o cardápio é lido fora da tela de cardápio: o PDV de balcão\n// monta a grade de itens a partir DESTE provider, e não do plugin, para que a\n// grade e a tela mostrem o mesmo preço. Os plugins de mesas e reservas já\n// publicam os seus pelo mesmo motivo.\nexport { createSupabaseMenuProvider }\nimport { MIGRATIONS } from './migrations'\nimport { T } from './data/tables'\nimport { createMenuStore } from './store'\nimport { menuRegistries } from './data/registries'\nimport { menuLocales } from './locales'\nimport { PluginSettingsPanel } from '@fayz-ai/admin'\n\n// Lazy import page to avoid circular dependency issues\nconst MenuPage = React.lazy(() => import('./views/MenuPage').then((m) => ({ default: m.MenuPage })))\n\n// ---------------------------------------------------------------------------\n// Labels\n// ---------------------------------------------------------------------------\n\nexport interface MenuPluginLabels {\n pageTitle: string\n menuManager: string\n categories: string\n newItem: string\n}\n\nconst DEFAULT_LABELS: MenuPluginLabels = {\n pageTitle: 'Menu',\n menuManager: 'Menu Manager',\n categories: 'Categories',\n newItem: 'New Item',\n}\n\n// ---------------------------------------------------------------------------\n// Currency\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_CURRENCY = { code: 'BRL', locale: 'pt-BR', symbol: 'R$' }\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface MenuPluginOptions {\n modules?: {\n modifiers?: boolean\n deliveryPricing?: boolean\n }\n labels?: Partial<MenuPluginLabels>\n currency?: { code?: string; locale?: string; symbol?: string }\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n scope?: PluginScope\n verticalId?: VerticalId\n dataProvider?: MenuDataProvider\n menuItemLookup?: EntityLookup\n}\n\n// ---------------------------------------------------------------------------\n// Config resolver\n// ---------------------------------------------------------------------------\n\nfunction resolveConfig(options?: MenuPluginOptions) {\n return {\n modules: {\n modifiers: options?.modules?.modifiers !== false,\n deliveryPricing: options?.modules?.deliveryPricing === true,\n },\n labels: { ...DEFAULT_LABELS, ...options?.labels },\n currency: { ...DEFAULT_CURRENCY, ...options?.currency },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createMenuPlugin(options?: MenuPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n registerTranslations(menuLocales)\n // A host can still inject its own provider (an app-local one during\n // incubation); otherwise the plugin now stands on its own tables.\n const provider = options?.dataProvider ?? createSafeDataProvider<MenuDataProvider>(\n () => createSupabaseMenuProvider({ currencyCode: config.currency.code }),\n () => createMockMenuProvider(),\n )\n const store = createMenuStore(provider)\n\n const PageComponent: React.FC<any> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(MenuPage, { config, provider, store, registries: menuRegistries })\n )\n\n return {\n id: 'menu',\n defaultAgentRole: 'operations',\n name: config.labels.pageTitle,\n icon: 'UtensilsCrossed',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n // Digital menu serves both internal ops (saas) and online ordering\n // (ecommerce) — genuinely dual-surface, low confidence, revisit if a\n // real host disagrees.\n scaffolds: ['saas', 'ecommerce'],\n defaultEnabled: true,\n dependencies: [],\n declaredFeatures: [\n { id: 'menu', label: config.labels.pageTitle, group: config.labels.pageTitle },\n ],\n declaredLimits: [\n { key: 'menu_items', label: 'Menu items', table: T.items },\n ],\n migrations: MIGRATIONS.map((migration) => ({\n id: `menu-${migration.id}`,\n version: '1.0.0',\n sql: migration.sql,\n description: `plugin-menu ${migration.id}`,\n })),\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 5,\n label: config.labels.pageTitle,\n route: '/menu',\n icon: 'UtensilsCrossed',\n permission: { feature: 'menu', action: 'read' as const },\n },\n ],\n routes: [\n {\n path: '/menu',\n component: PageComponent,\n permission: { feature: 'menu', action: 'read' as const },\n },\n ],\n widgets: [],\n aiTools: [\n {\n id: 'menu.list-items',\n name: 'listMenuItems',\n description: 'Lists menu items, optionally filtered by category or status.',\n icon: 'UtensilsCrossed',\n mode: 'read' as const,\n category: 'Menu',\n parameters: {\n type: 'object' as const,\n properties: {\n category: { type: 'string' as const, description: 'Category name to filter by' },\n status: { type: 'string' as const, enum: ['available', 'sold_out', 'hidden'] },\n },\n },\n suggestions: [\n { label: 'Quais itens estão no cardápio?' },\n { label: 'Which items are sold out right now?' },\n ],\n },\n {\n id: 'menu.list-menus',\n name: 'listMenus',\n description: 'Lists the menus of the place (regular, executive lunch, weekend) with when each one is served.',\n icon: 'UtensilsCrossed',\n mode: 'read' as const,\n category: 'Menu',\n parameters: { type: 'object' as const, properties: {} },\n suggestions: [\n { label: 'Quais cardápios existem?' },\n { label: 'Que cardápio está no ar agora?' },\n ],\n },\n {\n id: 'menu.toggle-availability',\n name: 'toggleMenuItemAvailability',\n description: 'Marks a menu item as available or sold out.',\n icon: 'ToggleLeft',\n mode: 'persist' as const,\n category: 'Menu',\n parameters: {\n type: 'object' as const,\n properties: {\n itemName: { type: 'string' as const, description: 'Menu item name' },\n status: { type: 'string' as const, enum: ['available', 'sold_out'] },\n },\n required: ['itemName', 'status'],\n },\n permission: { feature: 'menu', action: 'edit' as const },\n },\n ],\n registries: menuRegistries,\n facets: [\n { id: 'qr_menu', label: 'Cardápio digital (QR)', description: 'O cliente vê o cardápio e pede pelo QR Code.', defaultEnabled: true },\n ],\n settings: [\n ...menuV1SettingsTabs,\n {\n id: 'menu',\n label: config.labels.pageTitle,\n icon: 'UtensilsCrossed',\n component: (() => {\n const MenuSettingsTab: React.ComponentType<unknown> = () =>\n React.createElement(PluginSettingsPanel, {\n title: 'Menu Settings',\n registries: menuRegistries,\n routeBase: '/settings/menu',\n })\n MenuSettingsTab.displayName = 'MenuSettingsTab'\n return MenuSettingsTab\n })(),\n order: 20,\n permission: { feature: 'menu', action: 'read' as const },\n },\n ],\n locales: menuLocales,\n }\n}\n\nexport type { MenuDataProvider } from './data/types'\n// O cardápio em cache, com o ciclo de vida dele — ver ./data/catalog-cache.ts.\nexport {\n MENU_CATALOG_TTL, catalogAge, fetchMenuCatalog, invalidateMenuCatalog,\n loadMenuCatalog, menuCatalogKey, readCachedCatalog,\n} from './data/catalog-cache'\nimport { menuV1SettingsTabs } from './settings/v1-settings'\nexport type { CatalogAge, LoadMenuCatalogOptions, MenuCatalog } from './data/catalog-cache'\nexport { createFayzMenuProvider } from './data/platform'\nexport type { FayzMenuProviderOptions } from './data/platform'\nexport type { ResolvedMenuConfig } from './context'\n// Domain types — public so any host can implement a MenuDataProvider (e.g. an\n// app-local Supabase provider during plugin incubation).\nexport type * from './types'\n"]}
|