@fayz-ai/core 0.9.0 → 0.10.0

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.
Files changed (170) hide show
  1. package/README.md +2 -2
  2. package/dist/access/index.js.map +1 -1
  3. package/dist/{chunk-L4TLMYGC.js → chunk-6RBW2Y5K.js} +3 -3
  4. package/dist/chunk-6RBW2Y5K.js.map +1 -0
  5. package/dist/chunk-732GZEUI.js +1592 -0
  6. package/dist/chunk-732GZEUI.js.map +1 -0
  7. package/dist/{chunk-X5THHG6T.js → chunk-CPMHCTX3.js} +3 -3
  8. package/dist/chunk-CPMHCTX3.js.map +1 -0
  9. package/dist/{chunk-V2MSAUHO.js → chunk-JO7Z2AOE.js} +2 -2
  10. package/dist/chunk-JO7Z2AOE.js.map +1 -0
  11. package/dist/{chunk-5RJVUC6J.js → chunk-M27JPX3K.js} +12 -3
  12. package/dist/chunk-M27JPX3K.js.map +1 -0
  13. package/dist/chunk-OXQGRJZT.js +125 -0
  14. package/dist/chunk-OXQGRJZT.js.map +1 -0
  15. package/dist/data/backend-env.d.ts +38 -0
  16. package/dist/data/backend-env.d.ts.map +1 -0
  17. package/dist/data/index.js +1 -1
  18. package/dist/entity/events.d.ts +14 -0
  19. package/dist/entity/events.d.ts.map +1 -0
  20. package/dist/events/envelope.d.ts +31 -0
  21. package/dist/events/envelope.d.ts.map +1 -0
  22. package/dist/events/index.d.ts +4 -0
  23. package/dist/events/index.d.ts.map +1 -1
  24. package/dist/events/log.d.ts +44 -0
  25. package/dist/events/log.d.ts.map +1 -0
  26. package/dist/events/types.d.ts +40 -0
  27. package/dist/events/types.d.ts.map +1 -0
  28. package/dist/i18n/index.d.ts +10 -0
  29. package/dist/i18n/index.d.ts.map +1 -1
  30. package/dist/i18n/index.js +1 -1
  31. package/dist/index.d.ts +27 -17
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +388 -52
  34. package/dist/index.js.map +1 -1
  35. package/dist/integrations/index.js +1 -1
  36. package/dist/{integrations/index.d.ts → integrations.d.ts} +2 -2
  37. package/dist/integrations.d.ts.map +1 -0
  38. package/dist/{address/index.d.ts → lib/address.d.ts} +1 -1
  39. package/dist/{address/index.d.ts.map → lib/address.d.ts.map} +1 -1
  40. package/dist/{phone/index.d.ts → lib/phone.d.ts} +1 -1
  41. package/dist/lib/phone.d.ts.map +1 -0
  42. package/dist/{seo/index.d.ts → lib/seo.d.ts} +18 -1
  43. package/dist/lib/seo.d.ts.map +1 -0
  44. package/dist/{tenant/index.d.ts → lib/tenant.d.ts} +1 -1
  45. package/dist/lib/tenant.d.ts.map +1 -0
  46. package/dist/manifest/index.d.ts +1 -1
  47. package/dist/manifest/index.d.ts.map +1 -1
  48. package/dist/messaging/index.d.ts +3 -0
  49. package/dist/messaging/index.d.ts.map +1 -0
  50. package/dist/messaging/registry.d.ts +35 -0
  51. package/dist/messaging/registry.d.ts.map +1 -0
  52. package/dist/messaging/types.d.ts +67 -0
  53. package/dist/messaging/types.d.ts.map +1 -0
  54. package/dist/plugin/index.js +2 -1
  55. package/dist/plugin/runtime.d.ts +17 -0
  56. package/dist/plugin/runtime.d.ts.map +1 -1
  57. package/dist/registry/block-catalog.d.ts +78 -0
  58. package/dist/registry/block-catalog.d.ts.map +1 -0
  59. package/dist/registry/block-constraints.d.ts +64 -0
  60. package/dist/registry/block-constraints.d.ts.map +1 -0
  61. package/dist/registry/block-schema.d.ts +69 -0
  62. package/dist/registry/block-schema.d.ts.map +1 -0
  63. package/dist/registry/blocks.d.ts +84 -0
  64. package/dist/registry/blocks.d.ts.map +1 -0
  65. package/dist/registry/entities.d.ts +153 -0
  66. package/dist/registry/entities.d.ts.map +1 -0
  67. package/dist/registry/extension-points.d.ts +117 -0
  68. package/dist/registry/extension-points.d.ts.map +1 -0
  69. package/dist/registry/handles.d.ts +41 -0
  70. package/dist/registry/handles.d.ts.map +1 -0
  71. package/dist/registry/index.d.ts +41 -41
  72. package/dist/registry/index.d.ts.map +1 -1
  73. package/dist/registry/loaders.d.ts +55 -0
  74. package/dist/registry/loaders.d.ts.map +1 -0
  75. package/dist/registry/registry-class.d.ts +157 -0
  76. package/dist/registry/registry-class.d.ts.map +1 -0
  77. package/dist/registry/schema-check.d.ts +14 -0
  78. package/dist/registry/schema-check.d.ts.map +1 -0
  79. package/dist/router/index.d.ts +78 -1
  80. package/dist/router/index.d.ts.map +1 -1
  81. package/dist/router/index.js +1 -1
  82. package/dist/testing/index.js +1 -1
  83. package/dist/{testing/index.d.ts → testing.d.ts} +3 -3
  84. package/dist/testing.d.ts.map +1 -0
  85. package/dist/types/analytics.d.ts +196 -0
  86. package/dist/types/analytics.d.ts.map +1 -0
  87. package/dist/types/crud.d.ts +22 -2
  88. package/dist/types/crud.d.ts.map +1 -1
  89. package/dist/types/plugins.d.ts +55 -1
  90. package/dist/types/plugins.d.ts.map +1 -1
  91. package/package.json +6 -18
  92. package/dist/blocks/index.d.ts +0 -25
  93. package/dist/blocks/index.d.ts.map +0 -1
  94. package/dist/chunk-5RJVUC6J.js.map +0 -1
  95. package/dist/chunk-L4TLMYGC.js.map +0 -1
  96. package/dist/chunk-V2MSAUHO.js.map +0 -1
  97. package/dist/chunk-X5THHG6T.js.map +0 -1
  98. package/dist/chunk-Y2C2FBQP.js +0 -35
  99. package/dist/chunk-Y2C2FBQP.js.map +0 -1
  100. package/dist/chunk-YH25Y4FW.js +0 -311
  101. package/dist/chunk-YH25Y4FW.js.map +0 -1
  102. package/dist/integrations/index.d.ts.map +0 -1
  103. package/dist/phone/index.d.ts.map +0 -1
  104. package/dist/seo/index.d.ts.map +0 -1
  105. package/dist/tenant/index.d.ts.map +0 -1
  106. package/dist/testing/index.d.ts.map +0 -1
  107. package/src/access/denial.ts +0 -33
  108. package/src/access/engine.test.ts +0 -48
  109. package/src/access/engine.ts +0 -136
  110. package/src/access/index.ts +0 -14
  111. package/src/access/limits.ts +0 -18
  112. package/src/address/index.ts +0 -188
  113. package/src/app/render.tsx +0 -69
  114. package/src/blocks/index.tsx +0 -68
  115. package/src/data/archetype.ts +0 -255
  116. package/src/data/bulk.ts +0 -35
  117. package/src/data/cached.ts +0 -55
  118. package/src/data/count.test.ts +0 -152
  119. package/src/data/count.ts +0 -131
  120. package/src/data/filters.test.ts +0 -70
  121. package/src/data/filters.ts +0 -90
  122. package/src/data/index.ts +0 -11
  123. package/src/data/mock.ts +0 -90
  124. package/src/data/platform-api.ts +0 -209
  125. package/src/data/refresh.ts +0 -115
  126. package/src/data/resolve.ts +0 -126
  127. package/src/data/supabase.ts +0 -230
  128. package/src/data/types.ts +0 -50
  129. package/src/entity/index.ts +0 -2
  130. package/src/entity/registry.ts +0 -49
  131. package/src/events/index.tsx +0 -82
  132. package/src/i18n/index.ts +0 -476
  133. package/src/i18n/shell-translations.en.ts +0 -875
  134. package/src/i18n/shell-translations.pt-br.ts +0 -873
  135. package/src/index.ts +0 -217
  136. package/src/integrations/index.ts +0 -237
  137. package/src/lib/cache.ts +0 -118
  138. package/src/lib/csv.ts +0 -54
  139. package/src/lib/format.ts +0 -58
  140. package/src/manifest/app-manifest.schema.json +0 -676
  141. package/src/manifest/index.ts +0 -518
  142. package/src/manifest/serialize.ts +0 -52
  143. package/src/phone/index.ts +0 -85
  144. package/src/plugin/createSafeDataProvider.ts +0 -30
  145. package/src/plugin/index.ts +0 -1
  146. package/src/plugin/runtime.ts +0 -331
  147. package/src/registry/index.ts +0 -163
  148. package/src/router/history.ts +0 -86
  149. package/src/router/index.ts +0 -29
  150. package/src/runtime/index.ts +0 -15
  151. package/src/runtime/oauth.ts +0 -219
  152. package/src/search/engine.ts +0 -559
  153. package/src/search/index.ts +0 -25
  154. package/src/search/text.ts +0 -206
  155. package/src/search/types.ts +0 -75
  156. package/src/seo/index.ts +0 -128
  157. package/src/tenant/index.ts +0 -38
  158. package/src/testing/index.ts +0 -116
  159. package/src/types/auth.ts +0 -41
  160. package/src/types/billing.ts +0 -39
  161. package/src/types/crud.ts +0 -184
  162. package/src/types/entities.ts +0 -142
  163. package/src/types/entitlements.ts +0 -45
  164. package/src/types/i18n.ts +0 -7
  165. package/src/types/index.ts +0 -11
  166. package/src/types/org.ts +0 -137
  167. package/src/types/payment.ts +0 -44
  168. package/src/types/permissions.ts +0 -32
  169. package/src/types/plugins.ts +0 -480
  170. package/src/types/theme.ts +0 -8
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/plugins.ts","../src/events/index.tsx","../src/data/refresh.ts","../src/plugin/createSafeDataProvider.ts","../src/phone/index.ts","../src/address/index.ts","../src/seo/index.ts","../src/lib/format.ts","../src/lib/csv.ts","../src/search/text.ts","../src/search/engine.ts","../src/blocks/index.tsx","../src/manifest/index.ts","../src/manifest/serialize.ts","../src/manifest/app-manifest.schema.json","../src/app/render.tsx","../src/router/history.ts"],"names":["React","React2","useEffect","via","React4","next"],"mappings":"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","file":"index.js","sourcesContent":["import type React from 'react'\nimport type { EntityDef } from './crud'\nimport type { FeatureDeclaration, PermissionAction } from './permissions'\nimport type { LimitDeclaration } from './entitlements'\nimport type { ConnectorDefinition } from '../integrations'\n\nexport type VerticalId = 'beauty' | 'food' | 'health' | 'services' | 'retail' | 'education' | (string & {})\nexport type PluginScope = 'core' | 'vertical' | 'universal' | 'addon' | 'tenant'\nexport type PluginStatus = 'pending_setup' | 'active' | 'disabled' | 'removed'\n\n/**\n * Scaffold type this plugin targets.\n * Plugins can declare which scaffolds they work with.\n * If omitted, the plugin works with all scaffold types.\n */\nexport type ScaffoldType = 'saas' | 'ecommerce' | 'landing_page' | 'website' | (string & {})\n\nexport interface PluginPermissionRequirement {\n feature: string\n action: PermissionAction\n}\n\nexport interface PluginNavigationEntry {\n id?: string\n section: 'main' | 'secondary' | 'settings'\n position: number\n label: string\n route: string\n icon?: string\n badge?: string | number\n permission?: PluginPermissionRequirement\n /**\n * Sales-channel / external link. When set, the entry opens this URL in a new\n * tab instead of routing internally — no page/route is registered for it. Used\n * by \"Canais de venda\"-style nav (Loja Online, WhatsApp, TikTok Shop…). The\n * `route` is still required (used as a stable identity/key), but is never\n * navigated when `href` is present.\n */\n href?: string\n /**\n * When this entry gains sub-path children, the shell also synthesizes a child\n * pointing back at the parent's own route (so /courses stays reachable under\n * the \"Courses\" group). Set false when the parent route is a duplicate of its\n * first child — e.g. /shop and /shop/products render the same catalog, and\n * listing both reads as a bug. Defaults to true.\n */\n indexChild?: boolean\n}\n\nexport interface PluginSettingsTab {\n id: string\n label: string\n icon?: string\n /** Provide the component directly, or reference a registered component by id\n * (resolvePluginComponent resolves componentId → the component registry).\n * Exactly one is required. */\n component?: React.ComponentType<unknown>\n componentId?: string\n pluginId?: string\n order?: number\n permission?: PluginPermissionRequirement\n}\n\nexport interface PluginRouteDefinition {\n path: string\n /** Component or a registered component id — exactly one is required. */\n component?: React.ComponentType<unknown>\n componentId?: string\n guard?: 'authenticated' | 'role' | 'public' | 'share-token'\n roles?: string[]\n permission?: PluginPermissionRequirement\n /** Render edge-to-edge with no page padding/animation wrapper (chat, kanban, canvas). */\n fullBleed?: boolean\n /** Archetypes this page displays (`archetype` or `archetype:kind`, e.g.\n * `'schedule:appointment'`). A CRUD page claims its own; a hand-built page\n * must declare it or records it owns resolve to no route. */\n entityRoutes?: string[]\n}\n\nexport type PluginWidgetZone =\n | 'shell.sidebar.before-nav'\n | 'shell.sidebar.footer'\n | 'shell.topbar.start'\n | 'shell.topbar.end'\n | 'page.before'\n | 'page.after'\n | 'settings.before'\n | 'settings.after'\n | 'shell.floating'\n | (string & {})\n\nexport const WidgetZone = {\n SIDEBAR_BEFORE_NAV: 'shell.sidebar.before-nav',\n SIDEBAR_FOOTER: 'shell.sidebar.footer',\n TOPBAR_START: 'shell.topbar.start',\n TOPBAR_END: 'shell.topbar.end',\n PAGE_BEFORE: 'page.before',\n PAGE_AFTER: 'page.after',\n SETTINGS_BEFORE: 'settings.before',\n SETTINGS_AFTER: 'settings.after',\n FLOATING: 'shell.floating',\n} as const\n\nexport interface PluginRuntimeTenant {\n id?: string\n slug?: string\n verticalId?: string\n plan?: string\n}\n\nexport interface PluginRuntimeUser {\n id?: string\n role?: string\n}\n\nexport interface PluginWidgetVisibility {\n routes?: string[]\n excludeRoutes?: string[]\n layouts?: string[]\n roles?: string[]\n plans?: string[]\n permissions?: PluginPermissionRequirement[]\n when?: (context: PluginRuntimeContext) => boolean\n}\n\nexport interface PluginRuntimeContext {\n tenant: PluginRuntimeTenant | null\n user: PluginRuntimeUser | null\n currentPath: string\n matchedPath?: string\n layout: string\n hasPermission?: (req: PluginPermissionRequirement) => boolean\n}\n\nexport interface PluginWidgetDefinition<TConfig extends Record<string, unknown> = Record<string, unknown>> {\n id: string\n zone: PluginWidgetZone\n /** Component or a registered component id — exactly one is required. */\n component?: React.ComponentType<unknown>\n componentId?: string\n title?: string\n order?: number\n permission?: PluginPermissionRequirement\n visibility?: PluginWidgetVisibility\n props?: TConfig\n}\n\n// ---------------------------------------------------------------------------\n// Dashboard widgets — first-class units a plugin contributes to the dashboard\n// registry. Rendered both on the plugin's own home and on the global app home.\n// ---------------------------------------------------------------------------\n\nexport type DashboardWidgetKind = 'kpi' | 'chart' | 'table' | 'onboarding' | 'custom'\n\n/** Surfaces a widget can appear on. 'home' = global app home (the universal\n * business dashboard every app renders via createDashboardPlugin);\n * 'plugin-home' = the owning plugin's own overview page; 'finance-home' = a\n * dedicated B2C consumer-finance home (norman-ai's phone-first money screen),\n * kept separate so its full-bleed hero/cards never leak onto the B2B 'home'. */\nexport type DashboardSurface = 'home' | 'plugin-home' | 'finance-home'\n\nexport interface DashboardWidgetDef<TProps extends Record<string, unknown> = Record<string, unknown>> {\n /** Globally unique id, e.g. 'crm.kpi.total-leads'. */\n id: string\n /** i18n key or plain label. */\n title: string\n description?: string\n icon?: string\n /** Owning domain used to scope plugin-home vs global home. Defaults to plugin.id. */\n domain?: string\n kind: DashboardWidgetKind\n /** Column span on the 4-col grid. Defaults by kind (kpi→1, chart→2, table→4). */\n span?: 1 | 2 | 3 | 4\n /** Visible before any app/user customization. Default: true. */\n defaultVisible?: boolean\n /** Default order within the surface (lower = first). */\n defaultOrder?: number\n /** Surfaces this widget appears on. Default: both. */\n surfaces?: DashboardSurface[]\n verticalId?: VerticalId\n permission?: PluginPermissionRequirement\n /** Component or a registered component id — exactly one is required. */\n component?: React.ComponentType<unknown>\n componentId?: string\n props?: TProps\n}\n\n/** App- or user-level overrides applied on top of the registered defaults. */\nexport interface DashboardLayoutConfig {\n widgets?: Array<{ id: string; visible?: boolean; order?: number; span?: number }>\n}\n\nexport interface ResolvedDashboardWidget extends DashboardWidgetDef {\n /** Resolved owning domain (plugin.id when not explicitly set). */\n domain: string\n order: number\n plugin: ResolvedPluginManifest\n}\n\n/** An event a plugin emits onto the event bus — declared for platform\n * introspection and so the AppManifest can bind event→action as data. */\nexport interface PluginEventDefinition {\n /** Namespaced event name, e.g. 'agenda.booking.confirmed'. */\n name: string\n description?: string\n /** JSON Schema for the payload (editor / AI / validation). */\n payloadSchema?: Record<string, unknown>\n}\n\nexport interface PluginCapability {\n id: string\n label: string\n description?: string\n kind?: 'page' | 'widget' | 'data' | 'integration'\n}\n\nexport interface PluginQuickAction {\n id: string\n label: string\n icon?: string\n description?: string\n /** Action handler — typically navigates to a view. */\n action: () => void\n}\n\nexport type AIToolMode = 'read' | 'persist'\n\nexport interface AIToolParameterProperty {\n type: 'string' | 'number' | 'boolean' | 'array' | 'object'\n description?: string\n enum?: string[]\n items?: AIToolParameterProperty\n default?: unknown\n}\n\nexport interface AIToolParameters {\n type: 'object'\n properties: Record<string, AIToolParameterProperty>\n required?: string[]\n}\n\nexport interface AIToolSuggestion {\n label: string\n prompt?: string\n icon?: string\n verticalId?: VerticalId\n}\n\nexport type AIToolExecution =\n | { plane: 'server'; kind: 'rpc'; rpc: string }\n | { plane: 'server'; kind: 'entity_read'; entity: string }\n | { plane: 'client' }\n\n/**\n * A tenant-scoped pool RPC (`agent_<domain>_<verb>`) this plugin ships for the\n * server-plane agent executor. Surfaces in the manifest as\n * `agent.rpcs` (RpcContract) — the broker only ever calls declared functions.\n */\nexport interface AgentRpcDeclaration {\n /** Function name in the pool, e.g. 'agent_agenda_create_appointment'. */\n name: string\n kind: 'read' | 'write'\n description: string\n /** JSON Schema of the p_payload argument. */\n payloadSchema?: AIToolParameters\n /** Whether the function writes audit_logs itself. */\n audits?: boolean\n}\n\nexport interface PluginAITool {\n id: string\n name: string\n description: string\n icon?: string\n mode: AIToolMode\n parameters?: AIToolParameters\n permission?: PluginPermissionRequirement\n /**\n * Quantity-limit key this tool's writes consume (e.g. 'bookings_month' for a\n * booking-creating tool). Persist-mode tools that create countable rows MUST\n * declare it so the agent executor can run the SAME plan-limit guard the UI\n * runs (guard before execute, invalidate after) — an AI agent never clicks a\n * gated button, so the declarative contract is its only gate.\n */\n limitKey?: string\n /**\n * Where the tool runs. Server-plane is what makes browserless channels\n * (WhatsApp, MCP) able to run the tool at all:\n * - `{ plane:'server', kind:'rpc', rpc }` — the Fayz broker calls the named\n * `agent_*` RPC in the tenant pool (writes / guarded reads).\n * - `{ plane:'server', kind:'entity_read', entity }` — the broker runs the\n * generic tenant-scoped read against the entity's table (derived tools).\n * - `{ plane:'client' }` (or absent) — a locally registered executor runs it\n * in the surface (navigation, modals).\n */\n execution?: AIToolExecution\n /**\n * Require an explicit human confirmation before executing. Defaults to true\n * for `mode: 'persist'` tools — the channel renders it natively (FAB modal,\n * WhatsApp yes/no reply).\n */\n requiresConfirmation?: boolean\n suggestions?: AIToolSuggestion[]\n category?: string\n tags?: string[]\n}\n\nexport interface PluginRegistryDef {\n id: string\n entity: EntityDef\n icon?: string\n description?: string\n display?: 'table' | 'cards' | 'tree'\n seedData?: Record<string, unknown>[]\n mockData?: Record<string, unknown>[]\n readOnly?: boolean\n}\n\nexport interface PluginMigration {\n id: string\n version: string\n sql: string\n description?: string\n}\n\nexport interface PluginOnboarding {\n /** Component or a registered component id — exactly one is required. */\n component?: React.ComponentType<{ onComplete: () => void }>\n componentId?: string\n title?: string\n description?: string\n}\n\n/**\n * A health check a plugin contributes to the diagnostics / boot report surfaced by\n * `fayz doctor`. Declared as data so the platform can verify a plugin's backend\n * prerequisites are present without running it.\n */\nexport interface PluginDiagnostic {\n id: string\n description?: string\n /** What the runtime should verify exists for this plugin to work. */\n requires: {\n rpcs?: string[]\n views?: string[]\n tables?: string[]\n migrations?: string[]\n env?: string[]\n }\n /** Severity when the requirement is missing. Defaults to 'warn'. */\n level?: 'error' | 'warn' | 'info'\n}\n\nexport interface PluginManifest {\n id: string\n name: string\n icon: string\n version: string\n /** Plugin contract version. The runtime refuses plugins built for a newer\n * contract than it supports (see PLUGIN_API_VERSION). Omit = legacy/compatible. */\n apiVersion?: number\n description?: string\n scope?: PluginScope\n verticalId?: VerticalId\n /** Events this plugin emits onto the bus (declared for introspection/automation). */\n events?: PluginEventDefinition[]\n /** Which scaffold types this plugin targets. Omit for universal plugins. */\n scaffolds?: ScaffoldType[]\n tenantId?: string\n defaultEnabled?: boolean\n schema?: string\n dependencies?: string[]\n navigation: PluginNavigationEntry[]\n settings?: PluginSettingsTab[]\n routes: PluginRouteDefinition[]\n widgets?: PluginWidgetDefinition[]\n /** Dashboard widgets this plugin contributes to the dashboard registry. */\n dashboardWidgets?: DashboardWidgetDef[]\n capabilities?: PluginCapability[]\n aiTools?: PluginAITool[]\n entities?: string[]\n permissions?: string[]\n declaredFeatures?: FeatureDeclaration[]\n /**\n * Quantity limits this plugin knows how to count. Aggregated by the plugin\n * runtime into `PluginRuntime.pluginLimits` and consumed by the access engine\n * (useLimit / useLimitGuard) so a plugin \"is born compatible\" with freemium\n * caps without any per-app wiring. See {@link LimitDeclaration}.\n */\n declaredLimits?: LimitDeclaration[]\n /** Pool RPCs this plugin ships for the server-plane agent executor. */\n declaredRpcs?: AgentRpcDeclaration[]\n /**\n * Read-models this plugin exposes to the agent's generic data primitives\n * (searchRecords/queryData) BEYOND its CRUD registries — typically its\n * views/ledgers (v_appointments, plg_financial_movements). `key` is a stable\n * ASCII id (never derived from a translated label); the entity's own\n * `permission` gates each call.\n */\n queryEntities?: Array<{\n key: string\n entity: EntityDef\n /** Base tables may opt into createRecord; views/ledgers stay read-only. */\n writable?: boolean\n }>\n registries?: PluginRegistryDef[]\n /**\n * Connectors this plugin contributes. An ADDON plugin declares its connector(s)\n * here, each naming the `hostPluginId` it extends; the runtime groups them by\n * host and the host plugin's settings render them in a unified Integrations tab.\n */\n connectors?: ConnectorDefinition[]\n migrations?: PluginMigration[]\n /** Backend prerequisites the plugin needs; surfaced by `fayz doctor`. */\n diagnostics?: PluginDiagnostic[]\n onboarding?: PluginOnboarding\n locales?: Record<string, Record<string, string>>\n}\n\nexport interface TenantPluginBinding {\n pluginId: string\n status: PluginStatus\n tenantId?: string\n config?: Record<string, unknown>\n}\n\nexport interface PluginRuntimeIssue {\n type:\n | 'duplicate_plugin'\n | 'missing_dependency'\n | 'circular_dependency'\n | 'vertical_mismatch'\n | 'incompatible_api_version'\n pluginId: string\n dependencyId?: string\n message: string\n}\n\nexport interface ResolvedPluginManifest extends PluginManifest {\n status: PluginStatus\n isActive: boolean\n activationReason: 'default' | 'tenant' | 'dependency' | 'inactive'\n config: Record<string, unknown>\n missingDependencies: string[]\n settingsTabs: PluginSettingsTab[]\n widgets: PluginWidgetDefinition[]\n resolvedRegistries: PluginRegistryDef[]\n resolvedAITools: PluginAITool[]\n}\n\nexport interface ResolvedPluginWidget<TConfig extends Record<string, unknown> = Record<string, unknown>>\n extends PluginWidgetDefinition<TConfig> {\n order: number\n config: TConfig\n plugin: ResolvedPluginManifest\n}\n\nexport interface PluginRuntimeRoute extends PluginRouteDefinition {\n plugin: ResolvedPluginManifest\n}\n\nexport interface PluginRuntime {\n context: PluginRuntimeContext\n plugins: ResolvedPluginManifest[]\n activePlugins: ResolvedPluginManifest[]\n routes: PluginRuntimeRoute[]\n navigation: PluginNavigationEntry[]\n settingsTabs: PluginSettingsTab[]\n widgets: ResolvedPluginWidget[]\n dashboardWidgets: ResolvedDashboardWidget[]\n capabilities: PluginCapability[]\n aiTools: PluginAITool[]\n issues: PluginRuntimeIssue[]\n registries: Map<string, PluginRegistryDef[]>\n /** Connectors contributed by active plugins, grouped by the host plugin they extend. */\n connectorsByHost: Map<string, ConnectorDefinition[]>\n pluginFeatures: FeatureDeclaration[]\n /** Limit declarations aggregated from every active plugin's `declaredLimits`. */\n pluginLimits: LimitDeclaration[]\n}\n","import * as React from 'react'\n\n// ---------------------------------------------------------------------------\n// Event bus — the substrate for cross-plugin behavior. Replaces the bespoke\n// `window.dispatchEvent('agenda:open-booking')` hack and the imperative\n// financial bridge: plugins emit named events, others subscribe, and the\n// AppManifest can declare event→action bindings as data. Plugins describe the\n// events they emit via PluginManifest.events (see types/plugins) so the\n// platform can introspect and wire automations.\n// ---------------------------------------------------------------------------\n\nexport type EventHandler<T = unknown> = (payload: T) => void\n\nexport interface EventBus {\n emit<T = unknown>(event: string, payload?: T): void\n on<T = unknown>(event: string, handler: EventHandler<T>): () => void\n once<T = unknown>(event: string, handler: EventHandler<T>): () => void\n off<T = unknown>(event: string, handler: EventHandler<T>): void\n clear(event?: string): void\n}\n\nexport function createEventBus(): EventBus {\n const handlers = new Map<string, Set<EventHandler>>()\n const bus: EventBus = {\n emit(event, payload) {\n const set = handlers.get(event)\n if (!set) return\n // Snapshot so handlers can subscribe/unsubscribe during dispatch.\n for (const handler of Array.from(set)) {\n try {\n handler(payload)\n } catch (err) {\n // A misbehaving subscriber must not break the emitter or its peers.\n console.error(`[fayz] event handler for \"${event}\" threw:`, err)\n }\n }\n },\n on(event, handler) {\n let set = handlers.get(event)\n if (!set) {\n set = new Set()\n handlers.set(event, set)\n }\n set.add(handler as EventHandler)\n return () => bus.off(event, handler)\n },\n once(event, handler) {\n const wrapped: EventHandler = (payload) => {\n bus.off(event, wrapped)\n ;(handler as EventHandler)(payload)\n }\n return bus.on(event, wrapped)\n },\n off(event, handler) {\n handlers.get(event)?.delete(handler as EventHandler)\n },\n clear(event) {\n if (event) handlers.delete(event)\n else handlers.clear()\n },\n }\n return bus\n}\n\n/** The app-wide default bus. One per app runtime (repo-per-app). */\nexport const eventBus: EventBus = createEventBus()\n\n/** Subscribe to an event for the lifetime of the component. The latest handler\n * is always invoked, so closures over fresh props/state work without resubscribing. */\nexport function useOnEvent<T = unknown>(\n event: string,\n handler: EventHandler<T>,\n deps: React.DependencyList = [],\n): void {\n const ref = React.useRef(handler)\n ref.current = handler\n React.useEffect(\n () => eventBus.on<T>(event, (payload) => ref.current(payload)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [event, ...deps],\n )\n}\n","import * as React from 'react'\nimport { eventBus } from '../events'\nimport { globalCache } from '../lib/cache'\nimport { getActiveTenantId } from '../tenant'\n\n// ---------------------------------------------------------------------------\n// Data refresh bus — \"something wrote; whoever is showing it should reload\".\n//\n// A write that happens OUTSIDE the list showing it (the assistant creating an\n// appointment, a webhook, another tab) used to leave the screen stale until the\n// user reloaded by hand. Providers already invalidate their own read cache on\n// create/update/remove, but a mounted list holds its rows in a store — nothing\n// told it to fetch again.\n//\n// This is the missing half: one broadcast, every surface that renders the\n// affected data listens. Deliberately coarse — a table name, not a row diff.\n// Refetching a page of rows is cheap; a stale screen after \"criei o\n// agendamento\" is not.\n// ---------------------------------------------------------------------------\n\nexport const DATA_CHANGED_EVENT = 'data:changed'\n\nexport interface DataChangedPayload {\n /** Physical table the write touched, when the writer knows it. */\n table?: string\n /** Registered entity key (deriveEntityKey), when the writer knows it. */\n entityKey?: string\n /** Archetype the record belongs to (`person:client`), when known. */\n archetype?: string\n op?: 'create' | 'update' | 'delete' | 'unknown'\n /** Affected record id, when known. */\n id?: string\n /** What caused the write — lets a surface ignore its own UI writes. */\n source?: 'agent' | 'ui' | 'remote'\n}\n\n/** What a subscriber renders. Any field left out matches everything. */\nexport interface DataChangedMatch {\n table?: string\n entityKey?: string\n archetype?: string\n}\n\n/**\n * A write with NO table/entityKey is a write we could not attribute (a plugin\n * tool, an RPC). Subscribers still refresh for it: a redundant refetch costs a\n * request, a missed one costs the user's trust in what the screen shows.\n */\nexport function matchesDataChange(match: DataChangedMatch, payload: DataChangedPayload): boolean {\n const attributed = payload.table ?? payload.entityKey ?? payload.archetype\n if (!attributed) return true\n if (match.table && payload.table && match.table === payload.table) return true\n if (match.entityKey && payload.entityKey && match.entityKey === payload.entityKey) return true\n if (match.archetype && payload.archetype && match.archetype === payload.archetype) return true\n // A subscriber that declared nothing listens to everything.\n return !match.table && !match.entityKey && !match.archetype\n}\n\n// One agent turn can write twice (create + link). Coalesce so the lists behind\n// it fetch once, after the turn settles, instead of once per call.\nlet pending: DataChangedPayload[] = []\nlet flushTimer: ReturnType<typeof setTimeout> | null = null\n\nfunction flush(): void {\n const batch = pending\n pending = []\n flushTimer = null\n for (const payload of batch) eventBus.emit(DATA_CHANGED_EVENT, payload)\n}\n\n/**\n * Announce a write. Invalidates the provider read cache for the affected table\n * (an unattributed write clears it wholesale — a stale hit would defeat the\n * refetch it just triggered) and broadcasts to mounted surfaces.\n */\nexport function emitDataChanged(payload: DataChangedPayload = {}): void {\n if (payload.table) {\n const tenant = getActiveTenantId() ?? '_'\n // The base table and its read-model view are the SAME data under two cache\n // namespaces (appointments / v_appointments). Invalidating only the one the\n // writer names leaves the other serving a snapshot that predates the write\n // — which is how the assistant kept reporting an empty agenda after a\n // booking was created on the agenda screen.\n const sibling = payload.table.startsWith('v_')\n ? payload.table.slice(2)\n : `v_${payload.table}`\n globalCache.invalidate(`${tenant}:${payload.table}`)\n globalCache.invalidate(`${tenant}:${sibling}`)\n } else {\n globalCache.clear()\n }\n pending.push({ op: 'unknown', source: 'agent', ...payload })\n if (flushTimer) return\n flushTimer = setTimeout(flush, 120)\n}\n\n/** Subscribe for the lifetime of the component. The latest handler always runs. */\nexport function useDataChanged(\n match: DataChangedMatch,\n handler: (payload: DataChangedPayload) => void,\n deps: React.DependencyList = [],\n): void {\n const handlerRef = React.useRef(handler)\n handlerRef.current = handler\n const { table, entityKey, archetype } = match\n\n React.useEffect(\n () =>\n eventBus.on<DataChangedPayload>(DATA_CHANGED_EVENT, (payload) => {\n if (matchesDataChange({ table, entityKey, archetype }, payload)) handlerRef.current(payload)\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [table, entityKey, archetype, ...deps],\n )\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { getSupabaseClientOptional } from '../data/supabase'\n\n/**\n * createSafeDataProvider — the standard lazy provider resolver every plugin\n * repeated by hand. Returns a Proxy that, on first method call, resolves to the\n * Supabase-backed provider when a Supabase client is configured, otherwise the\n * mock provider. Resolution is deferred so importing a plugin never forces a\n * Supabase connection, and memoized so it only happens once.\n *\n * const provider = options?.dataProvider ?? createSafeDataProvider(\n * () => createSupabaseCrmProvider(providerOptions),\n * () => createMockCrmProvider(),\n * )\n */\nexport function createSafeDataProvider<T extends object>(\n makeSupabase: () => T,\n makeMock: () => T,\n): T {\n let resolved: T | null = null\n const get = (): T => {\n if (!resolved) {\n resolved = getSupabaseClientOptional() ? makeSupabase() : makeMock()\n }\n return resolved\n }\n return new Proxy({} as T, {\n get: (_target, prop) => (...args: any[]) => (get() as any)[prop](...args),\n })\n}\n","// ---------------------------------------------------------------------------\n// Reusable phone / country helpers (SDK-level — shared by any plugin that\n// collects a phone number: booking, CRM, forms, auth…). Provides the country\n// list (flag + dial code + national mask) and mask/unmask utilities.\n// ---------------------------------------------------------------------------\n\nexport interface CountryDef {\n /** ISO 3166-1 alpha-2 code, e.g. 'BR'. */\n iso2: string\n /** Localized-ish display name. */\n name: string\n /** International dial code including '+', e.g. '+55'. */\n dial: string\n /** Flag emoji (derived from iso2). */\n flag: string\n /** National number mask; '#' = one digit. e.g. '(##) #####-####'. */\n mask: string\n}\n\n/** Derive a flag emoji from an ISO2 code via regional indicator symbols. */\nfunction flagOf(iso2: string): string {\n return iso2\n .toUpperCase()\n .replace(/[^A-Z]/g, '')\n .split('')\n .map((c) => String.fromCodePoint(0x1f1e6 + c.charCodeAt(0) - 65))\n .join('')\n}\n\nconst RAW: Omit<CountryDef, 'flag'>[] = [\n { iso2: 'BR', name: 'Brasil', dial: '+55', mask: '(##) #####-####' },\n { iso2: 'US', name: 'Estados Unidos', dial: '+1', mask: '(###) ###-####' },\n { iso2: 'PT', name: 'Portugal', dial: '+351', mask: '### ### ###' },\n { iso2: 'AR', name: 'Argentina', dial: '+54', mask: '(##) ####-####' },\n { iso2: 'ES', name: 'Espanha', dial: '+34', mask: '### ### ###' },\n { iso2: 'MX', name: 'México', dial: '+52', mask: '## #### ####' },\n { iso2: 'GB', name: 'Reino Unido', dial: '+44', mask: '##### ######' },\n { iso2: 'FR', name: 'França', dial: '+33', mask: '# ## ## ## ##' },\n { iso2: 'DE', name: 'Alemanha', dial: '+49', mask: '#### #######' },\n { iso2: 'IT', name: 'Itália', dial: '+39', mask: '### #######' },\n]\n\nexport const COUNTRIES: CountryDef[] = RAW.map((c) => ({ ...c, flag: flagOf(c.iso2) }))\n\nexport const DEFAULT_COUNTRY = 'BR'\n\nconst BY_ISO = new Map(COUNTRIES.map((c) => [c.iso2, c]))\n\n/** Look up a country by ISO2 (falls back to the default). */\nexport function getCountry(iso2: string | undefined): CountryDef {\n return (iso2 && BY_ISO.get(iso2.toUpperCase())) || BY_ISO.get(DEFAULT_COUNTRY)!\n}\n\n/** Keep only digit characters. */\nexport function unmaskPhone(value: string): string {\n return (value || '').replace(/\\D/g, '')\n}\n\n/**\n * Apply a '#'-placeholder mask to a raw string, consuming its digits. Extra\n * digits beyond the mask are dropped; partial input masks progressively.\n *\n * maskPhone('11987654321', '(##) #####-####') -> '(11) 98765-4321'\n */\nexport function maskPhone(value: string, mask: string): string {\n const digits = unmaskPhone(value)\n let out = ''\n let di = 0\n for (const ch of mask) {\n if (di >= digits.length) break\n if (ch === '#') {\n out += digits[di++]\n } else {\n out += ch\n }\n }\n return out\n}\n\n/** Count how many digits a mask expects. */\nexport function maskDigitCount(mask: string): number {\n let n = 0\n for (const ch of mask) if (ch === '#') n++\n return n\n}\n","// ---------------------------------------------------------------------------\n// Postal code → address lookup (SDK-level — shared by any surface that collects\n// an address: storefront checkout, the SaaS address book, CRM, booking).\n//\n// Sits beside ./phone for the same reason: knowing that a Brazilian CEP is\n// eight digits, and that '01310100' means Avenida Paulista, is not a\n// storefront concern. It belongs wherever an address is typed.\n//\n// The lookup itself is behind an interface. ViaCEP is the default because it is\n// free, keyless and CORS-enabled, but it is a third party the merchant does not\n// control — so swapping it for an edge-function proxy (shared cache, no\n// third-party call from the shopper's browser) must be one line, not a rewrite.\n// ---------------------------------------------------------------------------\n\n/**\n * An address as a postal service knows it: everything except the parts only the\n * resident can supply (number, complement).\n *\n * Field names mirror ShippingAddressInput in @fayz-ai/shop so the value crosses\n * from lookup to checkout to the order with no translation step in between.\n */\nexport interface PostalAddress {\n postalCode: string\n street: string\n district: string\n city: string\n state: string\n country: string\n /** IBGE municipality code when the source provides one — useful for tax later. */\n cityCode?: string\n}\n\n/** Where a postal code is resolved. Implementations must not throw for a\n * well-formed code that simply does not exist — that is `null`, not an error. */\nexport interface PostalLookupProvider {\n lookup(postalCode: string): Promise<PostalAddress | null>\n}\n\n/** Keep only digits. */\nexport function normalizePostalCode(value: string): string {\n return (value || '').replace(/\\D/g, '')\n}\n\n/** '01310100' | '01310-100' -> '01310-100'. Partial input formats progressively. */\nexport function formatPostalCode(value: string): string {\n const digits = normalizePostalCode(value).slice(0, 8)\n return digits.length > 5 ? `${digits.slice(0, 5)}-${digits.slice(5)}` : digits\n}\n\n/** A Brazilian CEP is exactly eight digits. */\nexport function isValidPostalCode(value: string): boolean {\n return normalizePostalCode(value).length === 8\n}\n\n// ---------------------------------------------------------------------------\n// Cache\n//\n// A CEP maps to the same street for years, so the second lookup of one should\n// never leave the browser. This also keeps a busy storefront well clear of\n// ViaCEP's per-IP rate limit. localStorage when there is a window, an in-memory\n// Map otherwise (SSR, tests, node) — never a hard failure over a cache miss.\n// ---------------------------------------------------------------------------\n\nconst CACHE_KEY = 'fayz.postal.cache.v1'\nconst memoryCache = new Map<string, PostalAddress>()\n\nfunction readCache(code: string): PostalAddress | undefined {\n const hit = memoryCache.get(code)\n if (hit) return hit\n try {\n const raw = globalThis.localStorage?.getItem(CACHE_KEY)\n if (!raw) return undefined\n const all = JSON.parse(raw) as Record<string, PostalAddress>\n const stored = all[code]\n if (stored) memoryCache.set(code, stored)\n return stored\n } catch {\n return undefined\n }\n}\n\nfunction writeCache(code: string, address: PostalAddress): void {\n memoryCache.set(code, address)\n try {\n const store = globalThis.localStorage\n if (!store) return\n const raw = store.getItem(CACHE_KEY)\n const all = raw ? (JSON.parse(raw) as Record<string, PostalAddress>) : {}\n all[code] = address\n store.setItem(CACHE_KEY, JSON.stringify(all))\n } catch {\n /* quota or private mode — the in-memory copy still stands for this session */\n }\n}\n\n/** Drop the cache. Exposed for tests and for a \"wrong address?\" escape hatch. */\nexport function clearPostalCache(): void {\n memoryCache.clear()\n try {\n globalThis.localStorage?.removeItem(CACHE_KEY)\n } catch {\n /* ignore */\n }\n}\n\n// ---------------------------------------------------------------------------\n// ViaCEP\n// ---------------------------------------------------------------------------\n\ninterface ViaCepResponse {\n cep?: string\n logradouro?: string\n bairro?: string\n localidade?: string\n uf?: string\n ibge?: string\n erro?: boolean | string\n}\n\n/**\n * ViaCEP (https://viacep.com.br). Free, no key, CORS-enabled.\n *\n * The trap: an unknown CEP does NOT come back as 404. ViaCEP answers HTTP 200\n * with `{\"erro\": true}` (and, on some deploys, the string \"true\"), so checking\n * response.ok alone yields an address of empty strings that silently overwrites\n * whatever the shopper had typed. Both shapes are treated as \"not found\".\n */\nexport function createViaCepProvider(options?: { fetcher?: typeof fetch }): PostalLookupProvider {\n const fetcher = options?.fetcher ?? globalThis.fetch\n return {\n async lookup(postalCode: string): Promise<PostalAddress | null> {\n const code = normalizePostalCode(postalCode)\n if (code.length !== 8) return null\n\n const response = await fetcher(`https://viacep.com.br/ws/${code}/json/`)\n if (!response.ok) throw new Error(`Consulta de CEP falhou (${response.status})`)\n\n const data = (await response.json()) as ViaCepResponse\n if (data.erro === true || data.erro === 'true' || !data.localidade) return null\n\n return {\n postalCode: code,\n street: data.logradouro ?? '',\n district: data.bairro ?? '',\n city: data.localidade,\n state: (data.uf ?? '').toUpperCase(),\n country: 'BR',\n cityCode: data.ibge || undefined,\n }\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-level resolver — same shape as setShopTenantResolver /\n// setShopAccessTokenResolver, so an app overrides the source once at boot\n// instead of threading a provider through every component that needs a CEP.\n// ---------------------------------------------------------------------------\n\nlet _provider: PostalLookupProvider | null = null\n\nexport function setPostalLookupProvider(provider: PostalLookupProvider | null): void {\n _provider = provider\n}\n\nexport function getPostalLookupProvider(): PostalLookupProvider {\n if (!_provider) _provider = createViaCepProvider()\n return _provider\n}\n\n/**\n * Resolve a postal code to an address, through the cache.\n *\n * Returns null for a code that is malformed or does not exist; throws only when\n * the lookup itself failed (offline, provider down), so a caller can tell\n * \"no such CEP\" from \"we could not check right now\" and say the right thing.\n */\nexport async function lookupPostalCode(postalCode: string): Promise<PostalAddress | null> {\n const code = normalizePostalCode(postalCode)\n if (code.length !== 8) return null\n\n const cached = readCache(code)\n if (cached) return cached\n\n const address = await getPostalLookupProvider().lookup(code)\n if (address) writeCache(code, address)\n return address\n}\n","import { useEffect } from 'react'\n\n// ---------------------------------------------------------------------------\n// Generic, domain-agnostic SEO / structured-data head manager (SDK-level).\n// ANY surface (blog, booking, reviews, product, landing) uses `useSeo` to set\n// <title>, meta description, canonical, OpenGraph/Twitter cards and JSON-LD per\n// route. Domain plugins build their own schema.org objects (BlogPosting,\n// Product, Event…) and pass them via `jsonLd` — the mechanics live here once.\n//\n// NOTE: a SPA still benefits from SSR/prerendering for the strongest SEO — that\n// is the real upgrade; this covers everything achievable client-side.\n// ---------------------------------------------------------------------------\n\nconst MANAGED = 'data-fayz-seo'\n\nexport interface SeoConfig {\n title: string\n description?: string\n canonical?: string\n image?: string\n type?: 'website' | 'article' | (string & {})\n siteName?: string\n /** One or more JSON-LD objects injected as <script type=\"application/ld+json\">. */\n jsonLd?: Array<Record<string, unknown>>\n}\n\n/** Current page origin (empty during SSR). */\nexport function seoOrigin(): string {\n return typeof window !== 'undefined' ? window.location.origin : ''\n}\n\n/** Build an absolute URL from a path, using the current origin. */\nexport function absoluteUrl(path: string): string {\n return `${seoOrigin()}${path.startsWith('/') ? path : `/${path}`}`\n}\n\nfunction upsertMeta(attr: 'name' | 'property', key: string, content: string) {\n if (!content) return\n let el = document.head.querySelector<HTMLMetaElement>(`meta[${attr}=\"${key}\"]`)\n if (!el) {\n el = document.createElement('meta')\n el.setAttribute(attr, key)\n el.setAttribute(MANAGED, '')\n document.head.appendChild(el)\n }\n el.setAttribute('content', content)\n}\n\nfunction upsertLink(rel: string, href: string) {\n if (!href) return\n let el = document.head.querySelector<HTMLLinkElement>(`link[rel=\"${rel}\"]`)\n if (!el) {\n el = document.createElement('link')\n el.setAttribute('rel', rel)\n el.setAttribute(MANAGED, '')\n document.head.appendChild(el)\n }\n el.setAttribute('href', href)\n}\n\nfunction clearManaged() {\n document.head.querySelectorAll(`[${MANAGED}]`).forEach((el) => el.remove())\n}\n\n/** Imperatively apply SEO tags (used by useSeo; exported for non-React callers). */\nexport function applySeo(config: SeoConfig): void {\n if (typeof document === 'undefined') return\n clearManaged()\n document.title = config.title\n upsertMeta('name', 'description', config.description ?? '')\n if (config.canonical) upsertLink('canonical', config.canonical)\n\n upsertMeta('property', 'og:title', config.title)\n upsertMeta('property', 'og:description', config.description ?? '')\n upsertMeta('property', 'og:type', config.type === 'article' ? 'article' : 'website')\n if (config.canonical) upsertMeta('property', 'og:url', config.canonical)\n if (config.image) upsertMeta('property', 'og:image', config.image)\n if (config.siteName) upsertMeta('property', 'og:site_name', config.siteName)\n\n upsertMeta('name', 'twitter:card', config.image ? 'summary_large_image' : 'summary')\n upsertMeta('name', 'twitter:title', config.title)\n upsertMeta('name', 'twitter:description', config.description ?? '')\n if (config.image) upsertMeta('name', 'twitter:image', config.image)\n\n for (const obj of config.jsonLd ?? []) {\n const script = document.createElement('script')\n script.type = 'application/ld+json'\n script.setAttribute(MANAGED, '')\n script.text = JSON.stringify(obj)\n document.head.appendChild(script)\n }\n}\n\n/** Apply SEO head tags for the current route; cleans up on unmount. */\nexport function useSeo(config: SeoConfig): void {\n const key = JSON.stringify(config)\n useEffect(() => {\n applySeo(config)\n return () => clearManaged()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key])\n}\n\n// --- Generic schema.org builders (reusable across plugins) -----------------\n\nexport interface BreadcrumbItem {\n name: string\n url: string\n}\n\n/** schema.org BreadcrumbList from an ordered list of crumbs. */\nexport function breadcrumbJsonLd(items: BreadcrumbItem[]): Record<string, unknown> {\n return {\n '@context': 'https://schema.org',\n '@type': 'BreadcrumbList',\n itemListElement: items.map((c, i) => ({\n '@type': 'ListItem',\n position: i + 1,\n name: c.name,\n item: c.url,\n })),\n }\n}\n\n/** schema.org Organization publisher block. */\nexport function organizationJsonLd(name: string, extra?: Record<string, unknown>): Record<string, unknown> {\n return { '@type': 'Organization', name, ...extra }\n}\n","import { getCurrentLocale } from '../i18n'\n\n// Currency inferred from the active locale unless the app sets one explicitly\n// via createSaasApp({ locale: { currency: 'BRL' } }).\nconst CURRENCY_BY_LOCALE: Record<string, string> = {\n 'pt-BR': 'BRL',\n 'pt-PT': 'EUR',\n en: 'USD',\n 'en-US': 'USD',\n 'en-GB': 'GBP',\n es: 'EUR',\n}\n\nlet _defaultCurrency: string | null = null\n\nexport function setDefaultCurrency(code: string | undefined): void {\n _defaultCurrency = code ?? null\n}\n\nexport function getActiveLocale(): string {\n try {\n return getCurrentLocale() || 'en'\n } catch {\n return 'en'\n }\n}\n\nexport function getDefaultCurrency(): string {\n if (_defaultCurrency) return _defaultCurrency\n return CURRENCY_BY_LOCALE[getActiveLocale()] ?? 'USD'\n}\n\nexport function formatCurrency(value: unknown, currency?: string): string {\n const num = typeof value === 'number' ? value : parseFloat(String(value))\n if (isNaN(num)) return String(value ?? '')\n return new Intl.NumberFormat(getActiveLocale(), {\n style: 'currency',\n currency: currency ?? getDefaultCurrency(),\n }).format(num)\n}\n\nexport function formatDate(value: unknown): string {\n if (!value) return ''\n try {\n return new Intl.DateTimeFormat(getActiveLocale(), { dateStyle: 'medium' }).format(new Date(value as string))\n } catch {\n return String(value)\n }\n}\n\nexport function formatDateTime(value: unknown): string {\n if (!value) return ''\n try {\n return new Intl.DateTimeFormat(getActiveLocale(), { dateStyle: 'medium', timeStyle: 'short' }).format(new Date(value as string))\n } catch {\n return String(value)\n }\n}\n","/** Column descriptor for generic CSV export */\nexport interface CSVColumn {\n key: string\n label: string\n format?: (value: any, row: Record<string, any>) => string\n}\n\nexport function escapeCSVField(value: unknown): string {\n if (value == null) return ''\n const str = String(value)\n if (str.includes(',') || str.includes('\"') || str.includes('\\n')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`\n }\n return str\n}\n\n/** Build a CSV string from columns + rows. Each cell runs through `column.format` if provided, then escaping. */\nexport function buildCSV(\n columns: CSVColumn[],\n rows: Record<string, any>[],\n): string {\n const header = columns.map((c) => escapeCSVField(c.label)).join(',')\n const body = rows.map((row) =>\n columns\n .map((col) => {\n const raw = row[col.key]\n const formatted = col.format ? col.format(raw, row) : raw\n return escapeCSVField(formatted)\n })\n .join(','),\n )\n return [header, ...body].join('\\n')\n}\n\n/** Trigger a CSV file download in the browser. */\nexport function downloadCSV(csv: string, filename: string): void {\n const bom = '\\uFEFF'\n const blob = new Blob([bom + csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename.endsWith('.csv') ? filename : `${filename}.csv`\n a.click()\n URL.revokeObjectURL(url)\n}\n\n/** Convenience: build + download in one call. */\nexport function exportCSV(\n columns: CSVColumn[],\n rows: Record<string, any>[],\n filename: string,\n): void {\n downloadCSV(buildCSV(columns, rows), filename)\n}\n","// Text folding + ranking for global search. The same folding must exist in SQL\n// as public.fayz_norm() (@fayz-ai/db 018_global_search.sql), or server and\n// client disagree on what matched.\n\nconst COMBINING_MARKS = /[\\u0300-\\u036f]/g\n\n/** Strip diacritics, lowercase, collapse non-alphanumerics to single spaces. */\nexport function foldText(value: unknown): string {\n if (typeof value !== 'string' || value === '') return ''\n return value\n .normalize('NFD')\n .replace(COMBINING_MARKS, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, ' ')\n .trim()\n}\n\n/** Fold, keeping each folded char's index in the source — used for highlighting. */\nexport function foldWithMap(value: string): { folded: string; map: number[] } {\n const out: string[] = []\n const map: number[] = []\n let pendingSpace = false\n for (let i = 0; i < value.length; i++) {\n const ch = value[i]!\n const folded = ch.normalize('NFD').replace(COMBINING_MARKS, '').toLowerCase()\n for (const f of folded) {\n const alnum = (f >= 'a' && f <= 'z') || (f >= '0' && f <= '9')\n if (!alnum) { pendingSpace = out.length > 0; continue }\n if (pendingSpace) { out.push(' '); map.push(i); pendingSpace = false }\n out.push(f)\n map.push(i)\n }\n }\n return { folded: out.join(''), map }\n}\n\n/** Digits only — phone numbers, CPF/CNPJ, SKUs typed with separators. */\nexport function digitsOf(value: unknown): string {\n return typeof value === 'string' ? value.replace(/\\D+/g, '') : ''\n}\n\nexport interface NormalizedQuery {\n /** What the user typed, untouched. */\n raw: string\n /** Folded form of the whole query — the \"phrase\". */\n folded: string\n /** Folded query split on whitespace. */\n tokens: string[]\n /** Digits the user typed, when they typed enough of them to mean a number. */\n digits: string\n /** The longest token — the most selective thing to send to a `%LIKE%` backend. */\n anchor: string\n}\n\n/** Below this a phone/document lookup is indistinguishable from noise. */\nconst MIN_DIGIT_QUERY = 4\n\nexport function normalizeQuery(raw: string): NormalizedQuery {\n const folded = foldText(raw)\n const tokens = folded ? folded.split(' ').filter(Boolean) : []\n const digits = raw.replace(/\\D+/g, '')\n let anchor = ''\n for (const token of tokens) if (token.length > anchor.length) anchor = token\n return {\n raw,\n folded,\n tokens,\n digits: digits.length >= MIN_DIGIT_QUERY ? digits : '',\n anchor,\n }\n}\n\n// Fuzzy similarity — Sørensen–Dice over bigrams. Same family as pg_trgm's\n// similarity(), so both sides rank near-misses the same way.\n\nfunction bigrams(value: string): string[] {\n if (value.length < 2) return value ? [value] : []\n const out: string[] = []\n for (let i = 0; i < value.length - 1; i++) out.push(value.slice(i, i + 2))\n return out\n}\n\n/** 0 (nothing in common) … 1 (identical). Both inputs must already be folded. */\nexport function similarity(a: string, b: string): number {\n if (!a || !b) return 0\n if (a === b) return 1\n const left = bigrams(a)\n const right = bigrams(b)\n if (left.length === 0 || right.length === 0) return 0\n const pool = new Map<string, number>()\n for (const g of left) pool.set(g, (pool.get(g) ?? 0) + 1)\n let shared = 0\n for (const g of right) {\n const count = pool.get(g)\n if (count) { shared++; pool.set(g, count - 1) }\n }\n return (2 * shared) / (left.length + right.length)\n}\n\n/** Best similarity between the query token and any single word of the text. */\nfunction wordSimilarity(text: string, token: string): number {\n let best = similarity(text, token)\n for (const word of text.split(' ')) {\n if (!word) continue\n const s = similarity(word, token)\n if (s > best) best = s\n }\n return best\n}\n\n// ---------------------------------------------------------------------------\n// Ranking\n// ---------------------------------------------------------------------------\n\nexport interface RankCandidate {\n /** Folded display name — what the user is most likely aiming at. */\n title: string\n /** Folded concatenation of every searchable value on the record. */\n haystack: string\n /** Digits of every phone/document-ish value on the record. */\n digits?: string\n}\n\n/** A fuzzy word has to be at least this close before it counts as a match. */\nconst FUZZY_FLOOR = 0.62\n\n/** Score a candidate 0…1. Zero means \"not a match\" — the score is also the filter. */\nexport function scoreCandidate(query: NormalizedQuery, candidate: RankCandidate): number {\n const { folded, tokens } = query\n if (!folded || tokens.length === 0) return 0\n const title = candidate.title\n const haystack = candidate.haystack || title\n\n // Phrase: the query as one string.\n let phrase = 0\n if (title === folded) phrase = 1\n else if (title.startsWith(folded)) phrase = 0.94\n else if (title.includes(' ' + folded)) phrase = 0.88\n else if (title.includes(folded)) phrase = 0.76\n else if (haystack.startsWith(folded) || haystack.includes(' ' + folded)) phrase = 0.7\n else if (haystack.includes(folded)) phrase = 0.62\n\n // Tokens: every word must land somewhere (\"maria silva\" → \"Maria da Silva\").\n let tokenTotal = 0\n let fuzzyUsed = false\n for (const token of tokens) {\n let best = 0\n if (title.startsWith(token)) best = 0.95\n else if (title.includes(' ' + token)) best = 0.85\n else if (title.includes(token)) best = 0.7\n else if (haystack.startsWith(token) || haystack.includes(' ' + token)) best = 0.6\n else if (haystack.includes(token)) best = 0.5\n else {\n const sim = wordSimilarity(title, token)\n if (sim >= FUZZY_FLOOR) { best = 0.45 * sim; fuzzyUsed = true }\n }\n if (best === 0) return phrase > 0 ? phrase : 0\n tokenTotal += best\n }\n let tokenScore = tokenTotal / tokens.length\n // A typo-only match must never outrank a literal one.\n if (fuzzyUsed) tokenScore *= 0.8\n\n let score = Math.max(phrase, tokenScore)\n\n // Digits: a phone number has no words to match.\n if (query.digits && candidate.digits && candidate.digits.includes(query.digits)) {\n score = Math.max(score, 0.72 + Math.min(0.2, query.digits.length / 50))\n }\n\n if (score === 0) return 0\n\n // Tie-break: shorter title wins (\"Ana\" over \"Ana Beatriz\" for \"ana\").\n const brevity = 1 / (1 + Math.max(0, title.length - folded.length) / 40)\n return score * 0.97 + brevity * 0.03\n}\n\n/** Ranges in the ORIGINAL text covered by the query, merged and sorted. */\nexport function highlightRanges(text: string, query: NormalizedQuery): Array<[number, number]> {\n if (!text || query.tokens.length === 0) return []\n const { folded, map } = foldWithMap(text)\n if (!folded) return []\n const spans: Array<[number, number]> = []\n const needles = query.tokens.length > 1 ? [query.folded, ...query.tokens] : [query.folded]\n for (const needle of needles) {\n if (!needle) continue\n let from = 0\n for (;;) {\n const at = folded.indexOf(needle, from)\n if (at === -1) break\n const start = map[at]\n const endChar = map[at + needle.length - 1]\n if (start !== undefined && endChar !== undefined) spans.push([start, endChar + 1])\n from = at + needle.length\n }\n }\n if (spans.length === 0) return []\n spans.sort((a, b) => a[0] - b[0])\n const merged: Array<[number, number]> = [spans[0]!]\n for (const span of spans.slice(1)) {\n const last = merged[merged.length - 1]!\n if (span[0] <= last[1]) last[1] = Math.max(last[1], span[1])\n else merged.push(span)\n }\n return merged\n}\n","import type { EntityDef } from '../types/crud'\nimport { resolveDataProvider } from '../data/resolve'\nimport { getSupabaseClientOptional } from '../data/supabase'\nimport { DATA_CHANGED_EVENT } from '../data/refresh'\nimport { eventBus } from '../events'\nimport { getActiveTenantId } from '../tenant'\nimport {\n digitsOf,\n foldText,\n normalizeQuery,\n scoreCandidate,\n type NormalizedQuery,\n} from './text'\nimport type {\n GlobalSearchResult,\n SearchGroup,\n SearchHit,\n SearchOptions,\n SearchPath,\n SearchTarget,\n} from './types'\n\n// Global search, two paths, one ranking:\n// ① INDEX — one `public.fayz_global_search` RPC (trigram-indexed, ~6ms).\n// ② SCAN — parallel ilike per entity. Fallback for pools without the\n// migration, for mock data, and whenever ① errors.\n// Both feed the same scorer, so the path changes latency, never the order.\n\n/** Nothing shorter is worth a round-trip. */\nexport const MIN_QUERY_LENGTH = 2\n\nconst DEFAULT_LIMIT = 30\nconst DEFAULT_PER_TARGET = 5\n/** Wide enough that a typical app fits in one wave — a second wave waits on\n * the slowest table of the first. */\nconst SCAN_CONCURRENCY = 16\n/** A single slow table must not hold the box hostage. */\nconst TARGET_TIMEOUT_MS = 3000\nconst CACHE_TTL_MS = 30_000\nconst CACHE_MAX_ENTRIES = 40\n\nconst RPC_NAME = 'fayz_global_search'\n\n/** null = never asked. Set false once Postgres says the RPC is missing. */\nlet indexAvailable: boolean | null = null\n\n/** Test seam / manual override. */\nexport function setSearchIndexAvailable(value: boolean | null): void {\n indexAvailable = value\n}\n\nexport function isSearchIndexAvailable(): boolean | null {\n return indexAvailable\n}\n\n// Rows come back camelCase, EntityDefs declare both spellings — look up either.\n\nfunction camelOf(key: string): string {\n return key.replace(/_([a-z0-9])/g, (_, c: string) => c.toUpperCase())\n}\n\nfunction snakeOf(key: string): string {\n return key.replace(/[A-Z]/g, (c) => '_' + c.toLowerCase())\n}\n\nfunction readField(row: Record<string, unknown>, key: string): unknown {\n if (key in row) return row[key]\n const camel = camelOf(key)\n if (camel in row) return row[camel]\n const snake = snakeOf(key)\n if (snake in row) return row[snake]\n return undefined\n}\n\nfunction asText(value: unknown): string {\n if (typeof value === 'string') return value\n if (typeof value === 'number') return String(value)\n if (Array.isArray(value)) return value.filter((v) => typeof v === 'string').join(' ')\n return ''\n}\n\n/** Field keys worth matching against, in declaration order. */\nfunction searchableKeys(entity: EntityDef): string[] {\n const declared = entity.data?.searchColumns ?? entity.fields.filter((f) => f.searchable).map((f) => f.key)\n const keys = [...declared]\n const display = entity.displayField ?? 'name'\n if (!keys.includes(display)) keys.unshift(display)\n const subtitle = entity.subtitleField\n if (subtitle && !keys.includes(subtitle)) keys.push(subtitle)\n return keys\n}\n\n/** Keys whose value is a number the user might type digits of. */\nconst DIGIT_FIELD_TYPES = new Set(['phone', 'number'])\n\nfunction digitKeys(entity: EntityDef): string[] {\n const keys = entity.fields\n .filter((f) => DIGIT_FIELD_TYPES.has(f.type) || /phone|document|cpf|cnpj|zip|postal|sku|code|reference/i.test(f.key))\n .map((f) => f.key)\n for (const extra of ['phone', 'document_number', 'sku', 'reference_number', 'postal_code']) {\n if (!keys.includes(extra)) keys.push(extra)\n }\n return keys\n}\n\nfunction titleOf(entity: EntityDef, row: Record<string, unknown>): string {\n const display = entity.displayField ?? 'name'\n const primary = asText(readField(row, display))\n if (primary) return primary\n for (const field of entity.fields) {\n if (field.type === 'text' || field.type === 'email') {\n const value = asText(readField(row, field.key))\n if (value) return value\n }\n }\n return asText(row.id) || '—'\n}\n\nfunction subtitleOf(entity: EntityDef, row: Record<string, unknown>, title: string): string | undefined {\n // A subtitle that repeats the title is noise.\n const distinct = (value: string): string | undefined => {\n if (!value || foldText(value) === foldText(title)) return undefined\n return value.length > 90 ? value.slice(0, 89) + '…' : value\n }\n const declared = entity.subtitleField\n if (declared) {\n const value = distinct(asText(readField(row, declared)))\n if (value) return value\n }\n for (const key of ['email', 'phone', 'sku', 'reference_number', 'document_number', 'description']) {\n const value = distinct(asText(readField(row, key)))\n if (value) return value\n }\n return undefined\n}\n\n// ---------------------------------------------------------------------------\n// Result assembly\n// ---------------------------------------------------------------------------\n\nfunction hitFromRow(\n target: SearchTarget,\n row: Record<string, unknown>,\n query: NormalizedQuery,\n): SearchHit | null {\n const id = asText(row.id)\n if (!id) return null\n const entity = target.entity\n const title = titleOf(entity, row)\n const parts: string[] = [title]\n for (const key of searchableKeys(entity)) {\n const value = asText(readField(row, key))\n if (value) parts.push(value)\n }\n let digits = ''\n for (const key of digitKeys(entity)) {\n const value = readField(row, key)\n if (typeof value === 'string' || typeof value === 'number') digits += digitsOf(String(value))\n }\n const score = scoreCandidate(query, {\n title: foldText(title),\n haystack: foldText(parts.join(' ')),\n digits,\n })\n if (score === 0) return null\n return {\n uid: `${target.key}:${id}`,\n id,\n key: target.key,\n group: target.label,\n icon: target.icon ?? entity.icon,\n title,\n subtitle: subtitleOf(entity, row, title),\n score: score * (target.boost ?? 1),\n archetype: entity.data?.archetype,\n archetypeKind: entity.data?.archetypeKind,\n table: entity.data?.table,\n record: row,\n }\n}\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\n/** Identity of the RECORD, not of the target that found it — several targets\n * cover the same rows (\"Fornecedores\" and \"Suppliers\" are both people). */\nfunction recordIdentity(hit: SearchHit): string {\n if (UUID.test(hit.id)) return hit.id\n return `${hit.table ?? hit.key}#${hit.id}`\n}\n\nfunction assemble(\n query: string,\n hits: SearchHit[],\n targets: SearchTarget[],\n opts: { via: SearchPath; failed: string[]; elapsedMs: number; perTarget: number; limit: number; partial?: boolean },\n): GlobalSearchResult {\n const seen = new Set<string>()\n const unique: SearchHit[] = []\n for (const hit of hits.slice().sort((a, b) => b.score - a.score || a.title.localeCompare(b.title))) {\n const identity = recordIdentity(hit)\n if (seen.has(identity)) continue\n seen.add(identity)\n unique.push(hit)\n }\n\n // Cap per target before the global cap, so one populous entity can't crowd out the rest.\n const byKey = new Map<string, SearchHit[]>()\n const kept: SearchHit[] = []\n const capped = new Set<string>()\n for (const hit of unique) {\n const bucket = byKey.get(hit.key) ?? []\n if (bucket.length >= opts.perTarget) { capped.add(hit.key); continue }\n bucket.push(hit)\n byKey.set(hit.key, bucket)\n kept.push(hit)\n }\n const limited = kept.slice(0, opts.limit)\n\n const order = new Map(targets.map((t, i) => [t.key, i]))\n const groups: SearchGroup[] = []\n for (const hit of limited) {\n let group = groups.find((g) => g.key === hit.key)\n if (!group) {\n group = { key: hit.key, label: hit.group, icon: hit.icon, hits: [], hasMore: capped.has(hit.key) }\n groups.push(group)\n }\n group.hits.push(hit)\n }\n // Groups follow their best hit; ties fall back to target order.\n groups.sort((a, b) => (b.hits[0]?.score ?? 0) - (a.hits[0]?.score ?? 0)\n || (order.get(a.key) ?? 99) - (order.get(b.key) ?? 99))\n\n return {\n query,\n hits: limited,\n groups,\n via: opts.via,\n failed: opts.failed,\n elapsedMs: opts.elapsedMs,\n partial: opts.partial ?? false,\n }\n}\n\n// Cache: exact hits plus prefix reuse. Substring matching is monotone, so an\n// untruncated result for \"bigod\" is a sound superset for \"bigodi\" and can be\n// re-scored locally while the real request flies.\n\ninterface CacheEntry {\n scope: string\n folded: string\n at: number\n complete: boolean\n hits: SearchHit[]\n}\n\nconst cache: CacheEntry[] = []\n\nfunction scopeKey(targets: SearchTarget[]): string {\n return `${getActiveTenantId() ?? '_'}|${targets.map((t) => t.key).sort().join(',')}`\n}\n\nfunction cacheGet(scope: string, folded: string): CacheEntry | undefined {\n const now = Date.now()\n return cache.find((e) => e.scope === scope && e.folded === folded && now - e.at < CACHE_TTL_MS)\n}\n\nfunction cachePrefix(scope: string, folded: string): CacheEntry | undefined {\n const now = Date.now()\n let best: CacheEntry | undefined\n for (const entry of cache) {\n if (entry.scope !== scope || !entry.complete) continue\n if (now - entry.at >= CACHE_TTL_MS) continue\n if (!folded.startsWith(entry.folded)) continue\n if (!best || entry.folded.length > best.folded.length) best = entry\n }\n return best\n}\n\nfunction cacheSet(entry: CacheEntry): void {\n const at = cache.findIndex((e) => e.scope === entry.scope && e.folded === entry.folded)\n if (at >= 0) cache.splice(at, 1)\n cache.unshift(entry)\n if (cache.length > CACHE_MAX_ENTRIES) cache.length = CACHE_MAX_ENTRIES\n}\n\n/** Drop every cached answer. Call on tenant switch and after writes. */\nexport function clearSearchCache(): void {\n cache.length = 0\n}\n\n// The engine owns this cache, so the engine subscribes — asking every writer to\n// remember `clearSearchCache()` is how it ended up called from nowhere at all,\n// leaving global search (and the assistant's findAnything, which rides on it)\n// answering \"não encontrei\" about a record written seconds earlier.\neventBus.on(DATA_CHANGED_EVENT, clearSearchCache)\n\n// Path ① — the server index\n\ninterface IndexRow {\n entity_key: string\n record_id: string\n title: string | null\n subtitle: string | null\n score: number | null\n}\n\nfunction isMissingFunction(error: { code?: string; message?: string } | null): boolean {\n if (!error) return false\n // PGRST202: PostgREST could not find the function in its schema cache.\n if (error.code === 'PGRST202') return true\n const message = (error.message ?? '').toLowerCase()\n return message.includes(RPC_NAME) && (message.includes('does not exist') || message.includes('not find'))\n}\n\nasync function searchViaIndex(\n query: NormalizedQuery,\n targets: SearchTarget[],\n perTarget: number,\n limit: number,\n): Promise<{ hits: SearchHit[]; ok: boolean }> {\n const client = getSupabaseClientOptional() as {\n rpc: (fn: string, args: Record<string, unknown>) => Promise<{ data: unknown; error: { code?: string; message?: string } | null }>\n } | null\n const tenantId = getActiveTenantId()\n if (!client || !tenantId) return { hits: [], ok: false }\n\n const byKey = new Map(targets.map((t) => [t.key, t]))\n const { data, error } = await client.rpc(RPC_NAME, {\n p_query: query.raw,\n p_tenant_id: tenantId,\n p_entity_keys: targets.map((t) => t.key),\n p_per_source: perTarget * 3,\n p_limit: limit * 3,\n })\n\n if (error) {\n if (isMissingFunction(error)) {\n indexAvailable = false\n return { hits: [], ok: false }\n }\n throw error\n }\n indexAvailable = true\n\n const rows = Array.isArray(data) ? (data as IndexRow[]) : []\n const hits: SearchHit[] = []\n for (const row of rows) {\n const target = byKey.get(row.entity_key)\n if (!target || !row.record_id) continue\n const title = row.title ?? ''\n // Re-score locally so both paths obey one ordering law.\n const local = scoreCandidate(query, {\n title: foldText(title),\n haystack: foldText(`${title} ${row.subtitle ?? ''}`),\n digits: digitsOf(row.subtitle ?? '') + digitsOf(title),\n })\n // The server matched on columns the client never sees (notes, tags). Keep\n // those, ranked under everything the local scorer can explain.\n const score = local > 0 ? local : Math.min(0.55, (row.score ?? 0.4))\n hits.push({\n uid: `${target.key}:${row.record_id}`,\n id: row.record_id,\n key: target.key,\n group: target.label,\n icon: target.icon ?? target.entity.icon,\n title: title || '—',\n subtitle: row.subtitle ?? undefined,\n score: score * (target.boost ?? 1),\n archetype: target.entity.data?.archetype,\n archetypeKind: target.entity.data?.archetypeKind,\n table: target.entity.data?.table,\n })\n }\n return { hits, ok: true }\n}\n\n// Path ② — bounded per-entity scan\n\nasync function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error('search target timed out')), ms)\n }),\n ])\n } finally {\n if (timer) clearTimeout(timer)\n }\n}\n\nasync function mapLimited<T, R>(\n items: T[],\n limit: number,\n fn: (item: T) => Promise<R>,\n): Promise<Array<{ ok: true; value: R } | { ok: false; item: T }>> {\n const results: Array<{ ok: true; value: R } | { ok: false; item: T }> = new Array(items.length)\n let cursor = 0\n const workers = Array.from({ length: Math.min(limit, items.length) }, async () => {\n for (;;) {\n const index = cursor++\n if (index >= items.length) return\n const item = items[index]!\n try {\n results[index] = { ok: true, value: await fn(item) }\n } catch {\n results[index] = { ok: false, item }\n }\n }\n })\n await Promise.all(workers)\n return results\n}\n\nasync function searchViaScan(\n query: NormalizedQuery,\n targets: SearchTarget[],\n perTarget: number,\n onProgress?: (hits: SearchHit[]) => void,\n): Promise<{ hits: SearchHit[]; failed: string[] }> {\n // Two rounds, same shape as the SQL function. Round 1 sends the whole phrase\n // (selective, answers the common case). Round 2 sends the longest token —\n // the only form that finds \"Maria da Silva\" for \"maria silva\" — and runs\n // only if round 1 found nothing anywhere: an unindexed `%cli%` is expensive,\n // and firing it per miss made multi-word queries 9.8s instead of 0.8s.\n const multiWord = query.tokens.length > 1\n const phrase = query.folded\n const token = query.anchor.length >= MIN_QUERY_LENGTH ? query.anchor : phrase\n const pageSize = Math.min(perTarget * 3, 24)\n const widePageSize = Math.min(perTarget * 6, 40)\n\n const searchable = targets.filter((t) => searchableKeys(t.entity).length > 0)\n\n // Emit as each target lands, so the box fills instead of spinning until the\n // slowest entity reports.\n const running: SearchHit[] = []\n\n const round = (search: string, size: number) =>\n mapLimited(searchable, SCAN_CONCURRENCY, async (target) => {\n const provider = resolveDataProvider(target.entity as EntityDef<{ id: string }>, target.mockData)\n // No count: the aggregate costs more than the rows, times every entity.\n const result = await withTimeout(\n provider.list({ search, pageSize: size, countMode: 'none' }),\n TARGET_TIMEOUT_MS,\n )\n const rows = result.data as unknown as Array<Record<string, unknown>>\n // Post-scoring also guards providers that ignore `search` entirely.\n const hits = rows.map((row) => hitFromRow(target, row, query)).filter((h): h is SearchHit => h !== null)\n if (hits.length && onProgress) {\n running.push(...hits)\n onProgress(running.slice())\n }\n return { target, hits }\n })\n\n const collect = (settled: Awaited<ReturnType<typeof round>>) => {\n const hits: SearchHit[] = []\n const failed: string[] = []\n for (const outcome of settled) {\n if (outcome.ok) hits.push(...outcome.value.hits)\n else failed.push(outcome.item.key)\n }\n return { hits, failed }\n }\n\n const first = collect(await round(phrase, pageSize))\n if (first.hits.length > 0 || !multiWord || token === phrase) return first\n\n const second = collect(await round(token, widePageSize))\n return { hits: second.hits, failed: [...new Set([...first.failed, ...second.failed])] }\n}\n\n/** Search every target at once. Never throws for data reasons — a target that\n * errors lands in `failed` and the rest of the answer still ships. */\nexport async function searchEverything(\n rawQuery: string,\n options: SearchOptions,\n): Promise<GlobalSearchResult> {\n const started = Date.now()\n const query = normalizeQuery(rawQuery)\n const targets = options.targets\n const limit = options.limit ?? DEFAULT_LIMIT\n const perTarget = options.perTarget ?? DEFAULT_PER_TARGET\n const empty = (via: SearchPath): GlobalSearchResult =>\n assemble(rawQuery, [], targets, { via, failed: [], elapsedMs: Date.now() - started, perTarget, limit })\n\n if (query.folded.length < MIN_QUERY_LENGTH || targets.length === 0) return empty('cache')\n\n const scope = scopeKey(targets)\n const exact = cacheGet(scope, query.folded)\n if (exact) {\n return assemble(rawQuery, exact.hits, targets, {\n via: 'cache', failed: [], elapsedMs: Date.now() - started, perTarget, limit,\n })\n }\n\n // Paint from the widest complete prefix result while the real one flies.\n if (options.onPartial) {\n const prefix = cachePrefix(scope, query.folded)\n if (prefix) {\n const rescored = prefix.hits\n .map((hit) => {\n const score = scoreCandidate(query, {\n title: foldText(hit.title),\n haystack: foldText(`${hit.title} ${hit.subtitle ?? ''}`),\n digits: digitsOf(hit.subtitle ?? ''),\n })\n return score > 0 ? { ...hit, score } : null\n })\n .filter((h): h is SearchHit => h !== null)\n options.onPartial(assemble(rawQuery, rescored, targets, {\n via: 'cache', failed: [], elapsedMs: Date.now() - started, perTarget, limit, partial: true,\n }))\n }\n }\n\n let hits: SearchHit[] = []\n let failed: string[] = []\n let via: SearchPath = 'scan'\n\n if (!options.forceScan && indexAvailable !== false) {\n try {\n const indexed = await searchViaIndex(query, targets, perTarget, limit)\n if (indexed.ok) {\n hits = indexed.hits\n via = 'index'\n }\n } catch {\n // One bad query is no reason to abandon a live index — scan just this once.\n }\n }\n\n if (via !== 'index') {\n const emit = options.onPartial\n const scanned = await searchViaScan(query, targets, perTarget, emit\n ? (running) => emit(assemble(rawQuery, running, targets, {\n via: 'scan', failed: [], elapsedMs: Date.now() - started, perTarget, limit, partial: true,\n }))\n : undefined)\n hits = scanned.hits\n failed = scanned.failed\n }\n\n if (options.signal?.aborted) return empty(via)\n\n const result = assemble(rawQuery, hits, targets, {\n via, failed, elapsedMs: Date.now() - started, perTarget, limit,\n })\n cacheSet({\n scope,\n folded: query.folded,\n at: Date.now(),\n // Only an uncapped answer is a sound superset for longer queries.\n complete: failed.length === 0 && !result.groups.some((g) => g.hasMore),\n hits,\n })\n return result\n}\n","import * as React from 'react'\nimport { getBlock } from '../registry'\n\n// ---------------------------------------------------------------------------\n// Block tree — the universal page primitive. A page (admin or storefront) is an\n// ordered tree of typed blocks. Block `type`s are resolved against the block\n// registry, so a page is pure data: `{ type, props, children }`. This\n// generalizes the storefront's HomeSection switch to every surface.\n// ---------------------------------------------------------------------------\n\nexport interface BlockNode {\n /** Registered block id, e.g. 'hero', 'products', 'kpi-grid', 'custom:foo'. */\n type: string\n /** Stable id for keys / editing; optional. */\n id?: string\n props?: Record<string, unknown>\n children?: BlockNode[]\n}\n\n/** A block component receives its declared props plus the raw node (so a block\n * can render its own children via <BlockChildren>). */\nexport type BlockComponentProps = Record<string, unknown> & {\n node?: BlockNode\n children?: React.ReactNode\n}\n\n// Rendered in place of an unresolved block type. Unknown blocks are caught\n// ahead of production by `fayz doctor` / the conformance kit, so this visible\n// marker is a development aid rather than a production concern.\nfunction UnknownBlock({ type }: { type: string }): React.ReactElement | null {\n return React.createElement(\n 'div',\n {\n style: {\n border: '1px dashed #c026d3',\n color: '#a21caf',\n padding: '8px 12px',\n font: '12px ui-monospace, monospace',\n borderRadius: 6,\n },\n },\n `Unknown block: \"${type}\"`,\n )\n}\n\nexport function BlockRenderer({ node }: { node: BlockNode }): React.ReactElement | null {\n const Comp = getBlock(node.type)\n const childEls = node.children?.length\n ? node.children.map((child, i) =>\n React.createElement(BlockRenderer, { key: child.id ?? `${child.type}-${i}`, node: child }),\n )\n : null\n if (!Comp) return React.createElement(UnknownBlock, { type: node.type })\n return React.createElement(Comp, { ...(node.props ?? {}), node }, childEls)\n}\n\n/** Render an ordered list of blocks (a page body). */\nexport function renderBlocks(nodes: BlockNode[]): React.ReactNode {\n return nodes.map((node, i) =>\n React.createElement(BlockRenderer, { key: node.id ?? `${node.type}-${i}`, node }),\n )\n}\n\n/** Convenience for block components that render their own children. */\nexport function BlockChildren({ node }: { node?: BlockNode }): React.ReactNode {\n if (!node?.children?.length) return null\n return renderBlocks(node.children)\n}\n","import type { EntityDef } from '../types/crud'\nimport type { LocaleConfig } from '../types/i18n'\nimport type { PermissionsConfig, FeatureDeclaration } from '../types/permissions'\nimport type { BillingConfig } from '../types/billing'\nimport type { LimitDeclaration } from '../types/entitlements'\nimport type { AIToolParameters, AIToolExecution, AgentRpcDeclaration } from '../types/plugins'\nimport type { BlockNode } from '../blocks'\n\n// ---------------------------------------------------------------------------\n// AppManifest — THE app, as data.\n//\n// This is the canonical artifact every generated repo commits as\n// `app.manifest.json` and that `fayz upgrade` migrates across the fleet. It is\n// strictly JSON-serializable: no functions, no components — only ids resolved\n// against the registries (see ../registry). `createSaasApp`/`createStorefrontApp`\n// become thin sugar that builds a manifest of this shape.\n//\n// Versioning: bump CURRENT_MANIFEST_VERSION and register a migration whenever\n// the shape changes. The single biggest fleet-maintenance lever — getting it\n// right is why W1 is the \"point of no return\".\n// ---------------------------------------------------------------------------\n\nexport const CURRENT_MANIFEST_VERSION = 3\n\nexport type BackendProvider = 'supabase' | 'fayz-api' | 'fayz-shop' | 'mock' | 'custom'\n\nexport interface BackendRef {\n provider: BackendProvider\n /** Provider project ref / URL. Secrets stay in env/platform storage. */\n projectRef?: string\n url?: string\n /** Registered adapter id when provider is 'custom'. */\n adapterId?: string\n /** Public, JSON-safe provider options. Never store secrets here. */\n options?: Record<string, unknown>\n}\n\n/** How a manifest page produces its body — exactly one of blocks/entity/component. */\nexport interface PageManifest {\n path: string\n label?: string\n icon?: string\n section?: 'main' | 'secondary' | 'settings'\n /** A block tree (pure data). */\n blocks?: BlockNode[]\n /** An entity key → rendered as a CRUD page by the scaffold. */\n entity?: string\n /** A registered page-component id, e.g. 'custom:HarvestBoard'. */\n component?: string\n /** Optional permission gate: feature + action. */\n permission?: { feature: string; action: string }\n}\n\nexport interface PluginRef {\n /** Plugin id, resolved to an installed @fayz-ai/plugin-* at build time. */\n id: string\n /** Pure-data config passed to the plugin (labels, kinds, module flags…). */\n config?: Record<string, unknown>\n enabled?: boolean\n}\n\nexport interface SurfaceManifest {\n /** Registered scaffold id: 'admin' | 'storefront' | 'portal' | custom. */\n scaffold: string\n plugins?: PluginRef[]\n pages?: PageManifest[]\n /** Surface-specific declarative options (announcement, footer, nav, shipping,\n * catalog seed, onboarding, …) — kept open so scaffolds evolve without a\n * manifest-version bump for additive fields. */\n options?: Record<string, unknown>\n}\n\n// ---------------------------------------------------------------------------\n// Agent Contract (manifest v3) — everything a SERVER-SIDE agent runtime needs\n// to operate the app without a browser: the full entity surface, the tool\n// catalog with its authorization requirements, the pool RPCs writes go\n// through, and the structured domain knowledge the app wants in the prompt.\n// Derived from app code at publish (never hand-written) and synced to the\n// Fayz platform, where it becomes the versioned AgentContract the broker\n// validates every turn against.\n// ---------------------------------------------------------------------------\n\n/** JSON-safe projection of an EntityDef — schema only, no components/closures.\n * `data` mirrors EntityDef.data: everything the server-plane read executor\n * needs (tenant scoping, search/select column allowlists, fixed filters). */\nexport interface EntityContract {\n key: string\n label: string\n labelPlural?: string\n /** Plan-limit key rows of this entity consume (EntityDef.limitKey). */\n limitKey?: string\n /** Permission to READ via the generic data primitives (EntityDef.permission). */\n permission?: { feature: string; action: string }\n data: {\n table: string\n schema?: string\n tenantScoped?: boolean\n tenantIdColumn?: string\n searchColumns?: string[]\n selectColumns?: string\n columnMap?: Record<string, string>\n archetype?: string\n archetypeKind?: string\n filters?: Record<string, string>\n }\n fields: Array<{\n key: string\n label: string\n type: string\n required?: boolean\n searchable?: boolean\n /** FieldDef.hint — the field's helper text. Carried into the contract\n * because it is what tells the agent what a non-obvious column expects:\n * an id to look up, a default it should not restate, a format. */\n hint?: string\n /** Allowed values for select-like fields. */\n options?: string[]\n /** Table the relation field points at (FieldRelation.table). */\n relationTable?: string\n }>\n}\n\n/** JSON-safe projection of a PluginAITool + its owning plugin. */\nexport interface AIToolContract {\n id: string\n name: string\n description: string\n mode: 'read' | 'persist'\n parameters?: AIToolParameters\n permission?: { feature: string; action: string }\n limitKey?: string\n execution?: AIToolExecution\n requiresConfirmation?: boolean\n pluginId?: string\n category?: string\n}\n\n/** A tenant-scoped pool RPC the server-plane executor may call. Canonical\n * definition lives with the plugin types (plugins declare these). */\nexport type { AgentRpcDeclaration as RpcContract } from '../types/plugins'\n\n/** Structured domain knowledge rendered into the agent's prompt as labelled\n * sections — statuses with transitions, scheduling defaults, free-form rules. */\nexport interface AgentDomainKnowledge {\n statuses?: Record<string, Array<{ id: string; label: string; availableWhen?: unknown }>>\n scheduleDefaults?: Record<string, unknown>\n businessRules?: Array<{ id: string; description: string }>\n}\n\nexport interface AgentContract {\n persona?: { name?: string; systemPrompt?: string; icon?: string }\n /** When 'server', surfaces stop shipping data-tool executors: the broker\n * executes reads/writes server-plane and the surface only handles\n * client-plane tools. Flipped per app — no lockstep release. */\n executionPlane?: 'client' | 'server'\n entities?: EntityContract[]\n tools?: AIToolContract[]\n registries?: Array<{ pluginId: string; id: string; entityKey?: string; readOnly?: boolean }>\n declaredFeatures?: FeatureDeclaration[]\n rpcs?: AgentRpcDeclaration[]\n domainKnowledge?: AgentDomainKnowledge\n}\n\nexport interface AppManifest {\n manifestVersion: number\n id: string\n name: string\n backend?: BackendRef\n locale?: LocaleConfig\n /** Theme tokens — SaasTheme or StorefrontTheme depending on surface; kept\n * loose at the core layer to avoid coupling core to surface packages. */\n theme?: Record<string, unknown>\n /** Keyed by surface name ('admin', 'storefront', …). At least one required. */\n surfaces: Record<string, SurfaceManifest>\n /** App-defined entity extensions (vertical-specific tables/fields). */\n entities?: EntityDef[]\n permissions?: PermissionsConfig\n billing?: BillingConfig\n /** The RESOLVED limit declarations (4-layer merge: core < entity-derived <\n * plugin < app), so a server runtime counts exactly what the client counts. */\n limitDeclarations?: LimitDeclaration[]\n /** v3: the agent contract — see the section comment above. */\n agent?: AgentContract\n /** sha256 of the canonical serialization (excluding this field). */\n contractHash?: string\n}\n\n// ---------------------------------------------------------------------------\n// Migration runner — applies sequential migrations from a manifest's version\n// up to CURRENT. Each migration is keyed by the version it upgrades FROM.\n// ---------------------------------------------------------------------------\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyManifest = Record<string, any>\nexport type ManifestMigration = (m: AnyManifest) => AnyManifest\n\nconst migrations = new Map<number, ManifestMigration>()\nconst supportedBackendProviders: BackendProvider[] = ['supabase', 'fayz-api', 'fayz-shop', 'mock', 'custom']\nconst supportedPageSections = new Set(['main', 'secondary', 'settings'])\nconst allowedManifestKeys = new Set([\n 'manifestVersion',\n 'id',\n 'name',\n 'backend',\n 'locale',\n 'theme',\n 'permissions',\n 'billing',\n 'entities',\n 'surfaces',\n 'limitDeclarations',\n 'agent',\n 'contractHash',\n])\nconst allowedBackendKeys = new Set(['provider', 'projectRef', 'url', 'adapterId', 'options'])\nconst allowedSurfaceKeys = new Set(['scaffold', 'options', 'plugins', 'pages'])\nconst allowedPluginRefKeys = new Set(['id', 'config', 'enabled'])\nconst allowedPageKeys = new Set(['path', 'label', 'icon', 'section', 'blocks', 'entity', 'component', 'permission'])\nconst allowedPermissionKeys = new Set(['feature', 'action'])\nconst allowedBlockKeys = new Set(['type', 'id', 'props', 'children'])\nconst manifestIdPattern = /^[a-z0-9][a-z0-9-]*$/\n\n/** Register a migration that upgrades a manifest FROM `fromVersion` to fromVersion+1. */\nexport function registerManifestMigration(fromVersion: number, fn: ManifestMigration): void {\n migrations.set(fromVersion, fn)\n}\n\n// v2 → v3 is purely additive (limitDeclarations/agent/contractHash are optional):\n// a v2 manifest is a valid v3 manifest with those sections absent. Registered\n// here so every consumer migrates for free; `fayz manifest emit` fills the new\n// sections on the next regeneration.\nregisterManifestMigration(2, (m) => m)\n\n/** Bring any manifest up to CURRENT_MANIFEST_VERSION, or throw if it was built\n * for a newer SDK than this runtime understands. */\nexport function migrateManifest(input: AnyManifest): AppManifest {\n let m = { ...input }\n let version = typeof m.manifestVersion === 'number' ? m.manifestVersion : 1\n if (version > CURRENT_MANIFEST_VERSION) {\n throw new Error(\n `Manifest version ${version} is newer than this SDK supports (${CURRENT_MANIFEST_VERSION}). Upgrade @fayz-ai/core.`,\n )\n }\n while (version < CURRENT_MANIFEST_VERSION) {\n const migrate = migrations.get(version)\n if (!migrate) {\n throw new Error(`No manifest migration registered from version ${version}.`)\n }\n m = migrate(m)\n version += 1\n m.manifestVersion = version\n }\n return m as AppManifest\n}\n\n/** Validate the structural invariants the JSON Schema can't fully express.\n * Returns a list of human-readable problems (empty = valid). */\nexport function validateManifest(m: AppManifest): string[] {\n const problems: string[] = []\n const manifest = m as unknown as Record<string, unknown>\n\n addUnsupportedKeys(manifest, allowedManifestKeys, 'manifest', problems)\n\n if (!Number.isInteger(manifest.manifestVersion)) {\n problems.push('manifest.manifestVersion must be an integer')\n } else if (manifest.manifestVersion !== CURRENT_MANIFEST_VERSION) {\n problems.push(`manifest.manifestVersion must be ${CURRENT_MANIFEST_VERSION}`)\n }\n if (typeof manifest.id !== 'string' || !manifest.id.trim()) problems.push('manifest.id is required')\n else if (!manifestIdPattern.test(manifest.id.trim())) {\n problems.push('manifest.id must match /^[a-z0-9][a-z0-9-]*$/')\n }\n if (typeof manifest.name !== 'string' || !manifest.name.trim()) problems.push('manifest.name is required')\n\n validateLooseObject(manifest.locale, 'manifest.locale', problems)\n validateLooseObject(manifest.theme, 'manifest.theme', problems)\n validateLooseObject(manifest.permissions, 'manifest.permissions', problems)\n validateLooseObject(manifest.billing, 'manifest.billing', problems)\n validateLooseObject(manifest.agent, 'manifest.agent', problems)\n if (manifest.contractHash !== undefined && !isNonEmptyString(manifest.contractHash)) {\n problems.push('manifest.contractHash must be a non-empty string')\n }\n if (manifest.limitDeclarations !== undefined) {\n if (!Array.isArray(manifest.limitDeclarations)) {\n problems.push('manifest.limitDeclarations must be an array')\n } else {\n manifest.limitDeclarations.forEach((decl, index) => {\n if (!isRecord(decl) || !isNonEmptyString(decl.key) || !isNonEmptyString(decl.table)) {\n problems.push(`manifest.limitDeclarations[${index}] must declare key and table`)\n }\n })\n }\n }\n if (manifest.entities !== undefined) {\n if (!Array.isArray(manifest.entities)) {\n problems.push('manifest.entities must be an array')\n } else {\n manifest.entities.forEach((entity, index) => {\n if (!isRecord(entity)) problems.push(`manifest.entities[${index}] must be an object`)\n })\n }\n }\n\n if (manifest.backend !== undefined) {\n if (!isRecord(manifest.backend)) {\n problems.push('manifest.backend must be an object')\n } else {\n addUnsupportedKeys(manifest.backend, allowedBackendKeys, 'manifest.backend', problems)\n const provider = manifest.backend.provider\n if (typeof provider !== 'string' || !supportedBackendProviders.includes(provider as BackendProvider)) {\n problems.push(`manifest.backend.provider \"${String(provider)}\" is not supported`)\n }\n validateOptionalNonEmptyString(manifest.backend.projectRef, 'manifest.backend.projectRef', problems)\n validateOptionalNonEmptyString(manifest.backend.url, 'manifest.backend.url', problems)\n if (provider === 'custom' && !isNonEmptyString(manifest.backend.adapterId)) {\n problems.push('manifest.backend.adapterId is required when provider is \"custom\"')\n } else if (provider !== 'custom') {\n validateOptionalNonEmptyString(manifest.backend.adapterId, 'manifest.backend.adapterId', problems)\n }\n validateLooseObject(manifest.backend.options, 'manifest.backend.options', problems)\n }\n }\n\n if (!isRecord(manifest.surfaces) || Object.keys(manifest.surfaces).length === 0) {\n problems.push('manifest.surfaces must declare at least one surface')\n } else {\n for (const [name, surface] of Object.entries(manifest.surfaces)) {\n validateSurfaceManifest(name, surface, problems)\n }\n }\n\n return problems\n}\n\nfunction validateSurfaceManifest(name: string, surface: unknown, problems: string[]): void {\n if (!isRecord(surface)) {\n problems.push(`surface \"${name}\" must be an object`)\n return\n }\n\n addUnsupportedKeys(surface, allowedSurfaceKeys, `surface \"${name}\"`, problems)\n if (!isNonEmptyString(surface.scaffold)) problems.push(`surface \"${name}\" is missing a scaffold id`)\n validateLooseObject(surface.options, `surface \"${name}\".options`, problems)\n\n if (surface.pages !== undefined) {\n if (!Array.isArray(surface.pages)) {\n problems.push(`surface \"${name}\".pages must be an array`)\n } else {\n const pagePaths = new Set<string>()\n for (const [index, page] of surface.pages.entries()) {\n validatePageManifest(name, index, page, pagePaths, problems)\n }\n }\n }\n\n if (surface.plugins !== undefined) {\n if (!Array.isArray(surface.plugins)) {\n problems.push(`surface \"${name}\".plugins must be an array`)\n } else {\n const pluginIds = new Set<string>()\n for (const [index, plugin] of surface.plugins.entries()) {\n validatePluginRef(name, index, plugin, pluginIds, problems)\n }\n }\n }\n}\n\nfunction validatePageManifest(\n surfaceName: string,\n index: number,\n page: unknown,\n pagePaths: Set<string>,\n problems: string[],\n): void {\n const pageLabel = `surface \"${surfaceName}\" page #${index + 1}`\n if (!isRecord(page)) {\n problems.push(`${pageLabel} must be an object`)\n return\n }\n\n addUnsupportedKeys(page, allowedPageKeys, pageLabel, problems)\n\n if (!isNonEmptyString(page.path)) {\n problems.push(`${pageLabel} has an empty path`)\n } else {\n const normalizedPath = page.path.trim()\n if (pagePaths.has(normalizedPath)) {\n problems.push(`surface \"${surfaceName}\" declares duplicate page path \"${normalizedPath}\"`)\n } else {\n pagePaths.add(normalizedPath)\n }\n }\n\n if (page.label !== undefined && typeof page.label !== 'string') problems.push(`${pageLabel}.label must be a string`)\n if (page.icon !== undefined && typeof page.icon !== 'string') problems.push(`${pageLabel}.icon must be a string`)\n if (page.section !== undefined && (typeof page.section !== 'string' || !supportedPageSections.has(page.section))) {\n problems.push(`${pageLabel}.section must be one of main, secondary, settings`)\n }\n if (page.entity !== undefined && !isNonEmptyString(page.entity)) problems.push(`${pageLabel}.entity must be a non-empty string`)\n if (page.component !== undefined && !isNonEmptyString(page.component)) {\n problems.push(`${pageLabel}.component must be a non-empty string`)\n }\n\n const kinds = [page.blocks, page.entity, page.component].filter((x) => x != null)\n if (kinds.length !== 1) {\n problems.push(`${pageLabel} must set exactly one of blocks/entity/component`)\n }\n\n if (page.permission !== undefined) {\n validatePermission(page.permission, `${pageLabel}.permission`, problems)\n }\n\n if (page.blocks !== undefined) {\n if (!Array.isArray(page.blocks)) {\n problems.push(`${pageLabel}.blocks must be an array`)\n } else {\n page.blocks.forEach((block, blockIndex) => {\n validateBlockManifest(block, `${pageLabel}.blocks[${blockIndex}]`, problems)\n })\n }\n }\n}\n\nfunction validatePluginRef(\n surfaceName: string,\n index: number,\n plugin: unknown,\n pluginIds: Set<string>,\n problems: string[],\n): void {\n const pluginLabel = `surface \"${surfaceName}\" plugin #${index + 1}`\n if (!isRecord(plugin)) {\n problems.push(`${pluginLabel} must be an object`)\n return\n }\n\n addUnsupportedKeys(plugin, allowedPluginRefKeys, pluginLabel, problems)\n\n if (!isNonEmptyString(plugin.id)) {\n problems.push(`${pluginLabel} has an empty id`)\n } else {\n const normalizedId = plugin.id.trim()\n if (pluginIds.has(normalizedId)) {\n problems.push(`surface \"${surfaceName}\" declares duplicate plugin id \"${normalizedId}\"`)\n } else {\n pluginIds.add(normalizedId)\n }\n }\n\n validateLooseObject(plugin.config, `${pluginLabel}.config`, problems)\n if (plugin.enabled !== undefined && typeof plugin.enabled !== 'boolean') {\n problems.push(`${pluginLabel}.enabled must be a boolean`)\n }\n}\n\nfunction validatePermission(permission: unknown, path: string, problems: string[]): void {\n if (!isRecord(permission)) {\n problems.push(`${path} must be an object`)\n return\n }\n\n addUnsupportedKeys(permission, allowedPermissionKeys, path, problems)\n if (!isNonEmptyString(permission.feature)) problems.push(`${path}.feature is required`)\n if (!isNonEmptyString(permission.action)) problems.push(`${path}.action is required`)\n}\n\nfunction validateBlockManifest(block: unknown, path: string, problems: string[]): void {\n if (!isRecord(block)) {\n problems.push(`${path} must be an object`)\n return\n }\n\n addUnsupportedKeys(block, allowedBlockKeys, path, problems)\n if (!isNonEmptyString(block.type)) problems.push(`${path}.type is required`)\n validateLooseObject(block.props, `${path}.props`, problems)\n if (block.id !== undefined && typeof block.id !== 'string') problems.push(`${path}.id must be a string`)\n\n if (block.children !== undefined) {\n if (!Array.isArray(block.children)) {\n problems.push(`${path}.children must be an array`)\n } else {\n block.children.forEach((child, index) => validateBlockManifest(child, `${path}.children[${index}]`, problems))\n }\n }\n}\n\nfunction addUnsupportedKeys(\n value: Record<string, unknown>,\n allowedKeys: Set<string>,\n path: string,\n problems: string[],\n): void {\n for (const key of Object.keys(value)) {\n if (!allowedKeys.has(key)) {\n problems.push(`${path}.${key} is not part of AppManifest v${CURRENT_MANIFEST_VERSION}`)\n }\n }\n}\n\nfunction validateLooseObject(value: unknown, path: string, problems: string[]): void {\n if (value !== undefined && !isRecord(value)) {\n problems.push(`${path} must be an object`)\n }\n}\n\nfunction validateOptionalNonEmptyString(value: unknown, path: string, problems: string[]): void {\n if (value !== undefined && !isNonEmptyString(value)) {\n problems.push(`${path} must be a non-empty string`)\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0\n}\n","import type { AppManifest } from './index'\n\n// ---------------------------------------------------------------------------\n// Deterministic serialization — the SAME manifest object must always produce\n// the SAME bytes, because the sha256 of those bytes (`contractHash`) is what\n// makes `fayz manifest sync` idempotent and lets `fayz doctor` prove the\n// committed app.manifest.json is not stale. Rules: object keys sorted, arrays\n// kept in declared order (order is meaning: nav position, migration order),\n// 2-space indent, trailing newline, `contractHash` itself excluded.\n// ---------------------------------------------------------------------------\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortValue)\n if (value !== null && typeof value === 'object') {\n const record = value as Record<string, unknown>\n const out: Record<string, unknown> = {}\n for (const key of Object.keys(record).sort()) {\n const v = record[key]\n if (v !== undefined) out[key] = sortValue(v)\n }\n return out\n }\n return value\n}\n\n/** Canonical JSON of a manifest (contractHash excluded, keys sorted). */\nexport function serializeManifest(manifest: AppManifest): string {\n const { contractHash: _omit, ...rest } = manifest\n return `${JSON.stringify(sortValue(rest), null, 2)}\\n`\n}\n\n/**\n * sha256 (hex) of the canonical serialization. Async because it runs on\n * WebCrypto (`globalThis.crypto.subtle`), which exists in every runtime we\n * target (browsers, Node ≥ 18, edge) — no node:crypto import, keeping this\n * module bundleable everywhere.\n */\nexport async function computeContractHash(manifest: AppManifest): Promise<string> {\n const bytes = new TextEncoder().encode(serializeManifest(manifest))\n const digest = await globalThis.crypto.subtle.digest('SHA-256', bytes)\n return Array.from(new Uint8Array(digest))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n}\n\n/** Serialize WITH the freshly computed contractHash embedded — what\n * `fayz manifest emit` writes to app.manifest.json. */\nexport async function serializeManifestWithHash(manifest: AppManifest): Promise<string> {\n const contractHash = await computeContractHash(manifest)\n const { contractHash: _omit, ...rest } = manifest\n return `${JSON.stringify(sortValue({ ...rest, contractHash }), null, 2)}\\n`\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://fayz.ai/schemas/app-manifest/v3.json\",\n \"title\": \"Fayz AppManifest\",\n \"description\": \"The canonical, JSON-serializable definition of a Fayz app. Code is referenced by registry id; never inlined.\",\n \"type\": \"object\",\n \"required\": [\n \"manifestVersion\",\n \"id\",\n \"name\",\n \"surfaces\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"manifestVersion\": {\n \"type\": \"integer\",\n \"const\": 3,\n \"description\": \"Current AppManifest schema version. Older or newer versions require an explicit SDK migration before validation.\"\n },\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"pattern\": \"^[a-z0-9][a-z0-9-]*$\"\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"backend\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"provider\"\n ],\n \"properties\": {\n \"provider\": {\n \"enum\": [\n \"supabase\",\n \"fayz-api\",\n \"fayz-shop\",\n \"mock\",\n \"custom\"\n ]\n },\n \"projectRef\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"url\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"adapterId\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"options\": {\n \"type\": \"object\"\n }\n }\n },\n \"locale\": {\n \"type\": \"object\"\n },\n \"theme\": {\n \"type\": \"object\"\n },\n \"permissions\": {\n \"type\": \"object\"\n },\n \"billing\": {\n \"type\": \"object\"\n },\n \"entities\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"surfaces\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"additionalProperties\": {\n \"$ref\": \"#/$defs/surface\"\n }\n },\n \"limitDeclarations\": {\n \"type\": \"array\",\n \"description\": \"Resolved 4-layer limit-declaration merge (core < entity-derived < plugin < app) so server runtimes count exactly what the client counts.\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"key\",\n \"table\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"key\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"table\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"kindFilter\": {\n \"type\": \"string\"\n },\n \"period\": {\n \"enum\": [\n \"month\",\n \"total\"\n ]\n }\n }\n }\n },\n \"agent\": {\n \"$ref\": \"#/$defs/agentContract\"\n },\n \"contractHash\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"sha256 of the canonical serialization (excluding this field).\"\n }\n },\n \"$defs\": {\n \"surface\": {\n \"type\": \"object\",\n \"required\": [\n \"scaffold\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"scaffold\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"options\": {\n \"type\": \"object\"\n },\n \"plugins\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/pluginRef\"\n }\n },\n \"pages\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/page\"\n }\n }\n }\n },\n \"pluginRef\": {\n \"type\": \"object\",\n \"required\": [\n \"id\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"config\": {\n \"type\": \"object\"\n },\n \"enabled\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"page\": {\n \"type\": \"object\",\n \"required\": [\n \"path\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Exactly one of blocks/entity/component must be set.\",\n \"properties\": {\n \"path\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"type\": \"string\"\n },\n \"section\": {\n \"enum\": [\n \"main\",\n \"secondary\",\n \"settings\"\n ]\n },\n \"blocks\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/block\"\n }\n },\n \"entity\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"component\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"permission\": {\n \"type\": \"object\",\n \"required\": [\n \"feature\",\n \"action\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"feature\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"action\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n }\n },\n \"oneOf\": [\n {\n \"required\": [\n \"blocks\"\n ]\n },\n {\n \"required\": [\n \"entity\"\n ]\n },\n {\n \"required\": [\n \"component\"\n ]\n }\n ]\n },\n \"block\": {\n \"type\": \"object\",\n \"required\": [\n \"type\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"props\": {\n \"type\": \"object\"\n },\n \"children\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/block\"\n }\n }\n }\n },\n \"agentContract\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"description\": \"Everything a server-side agent runtime needs to operate the app without a browser. Derived from code at publish; synced to Fayz as the versioned AgentContract.\",\n \"properties\": {\n \"persona\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"systemPrompt\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"type\": \"string\"\n }\n }\n },\n \"executionPlane\": {\n \"enum\": [\n \"client\",\n \"server\"\n ]\n },\n \"entities\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/entityContract\"\n }\n },\n \"tools\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/aiToolContract\"\n }\n },\n \"registries\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"pluginId\",\n \"id\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"pluginId\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"entityKey\": {\n \"type\": \"string\"\n },\n \"readOnly\": {\n \"type\": \"boolean\"\n }\n }\n }\n },\n \"declaredFeatures\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"rpcs\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/rpcContract\"\n }\n },\n \"domainKnowledge\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"statuses\": {\n \"type\": \"object\"\n },\n \"scheduleDefaults\": {\n \"type\": \"object\"\n },\n \"businessRules\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"description\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"description\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n }\n }\n }\n }\n }\n },\n \"entityContract\": {\n \"type\": \"object\",\n \"required\": [\n \"key\",\n \"label\",\n \"data\",\n \"fields\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"key\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"label\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"labelPlural\": {\n \"type\": \"string\"\n },\n \"limitKey\": {\n \"type\": \"string\"\n },\n \"data\": {\n \"type\": \"object\",\n \"required\": [\n \"table\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"table\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"schema\": {\n \"type\": \"string\"\n },\n \"tenantScoped\": {\n \"type\": \"boolean\"\n },\n \"tenantIdColumn\": {\n \"type\": \"string\"\n },\n \"searchColumns\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"selectColumns\": {\n \"type\": \"string\"\n },\n \"columnMap\": {\n \"type\": \"object\"\n },\n \"archetype\": {\n \"type\": \"string\"\n },\n \"archetypeKind\": {\n \"type\": \"string\"\n },\n \"filters\": {\n \"type\": \"object\"\n }\n }\n },\n \"fields\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"key\",\n \"label\",\n \"type\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"key\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"searchable\": {\n \"type\": \"boolean\"\n },\n \"hint\": {\n \"type\": \"string\"\n },\n \"options\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"relationTable\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"permission\": {\n \"type\": \"object\",\n \"required\": [\n \"feature\",\n \"action\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"feature\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"action\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n }\n }\n },\n \"aiToolContract\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"name\",\n \"description\",\n \"mode\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"pattern\": \"^[a-zA-Z0-9_-]{1,64}$\"\n },\n \"description\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"mode\": {\n \"enum\": [\n \"read\",\n \"persist\"\n ]\n },\n \"parameters\": {\n \"type\": \"object\"\n },\n \"permission\": {\n \"type\": \"object\",\n \"required\": [\n \"feature\",\n \"action\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"feature\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"action\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n },\n \"limitKey\": {\n \"type\": \"string\"\n },\n \"execution\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"required\": [\n \"plane\",\n \"kind\",\n \"rpc\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"plane\": {\n \"const\": \"server\"\n },\n \"kind\": {\n \"const\": \"rpc\"\n },\n \"rpc\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n },\n {\n \"type\": \"object\",\n \"required\": [\n \"plane\",\n \"kind\",\n \"entity\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"plane\": {\n \"const\": \"server\"\n },\n \"kind\": {\n \"const\": \"entity_read\"\n },\n \"entity\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n },\n {\n \"type\": \"object\",\n \"required\": [\n \"plane\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"plane\": {\n \"const\": \"client\"\n }\n }\n }\n ]\n },\n \"requiresConfirmation\": {\n \"type\": \"boolean\"\n },\n \"pluginId\": {\n \"type\": \"string\"\n },\n \"category\": {\n \"type\": \"string\"\n }\n }\n },\n \"rpcContract\": {\n \"type\": \"object\",\n \"required\": [\n \"name\",\n \"kind\",\n \"description\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"pattern\": \"^agent_[a-z0-9_]+$\"\n },\n \"kind\": {\n \"enum\": [\n \"read\",\n \"write\"\n ]\n },\n \"description\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"payloadSchema\": {\n \"type\": \"object\"\n },\n \"audits\": {\n \"type\": \"boolean\"\n }\n }\n }\n }\n}\n","import * as React from 'react'\nimport { getScaffold } from '../registry'\nimport { migrateManifest, validateManifest, CURRENT_MANIFEST_VERSION } from '../manifest'\nimport type { AppManifest } from '../manifest'\n\n// ---------------------------------------------------------------------------\n// defineApp / renderApp — the entry points that turn an AppManifest into a\n// running app. Scaffolds (admin, storefront, portal) self-register into the\n// scaffold registry when their package is imported, so core never depends on\n// them: a generated app imports the scaffold package(s) it needs, then calls\n// renderApp(manifest). createSaasApp / createStorefrontApp become sugar that\n// builds a manifest and hands it here.\n// ---------------------------------------------------------------------------\n\nconst ManifestContext = React.createContext<AppManifest | null>(null)\n\n/** Access the active app manifest from any component under renderApp. */\nexport function useManifest(): AppManifest | null {\n return React.useContext(ManifestContext)\n}\n\n/** Stamp + validate a manifest authored in code (the sugar path). */\nexport function defineApp(\n manifest: Omit<AppManifest, 'manifestVersion'> & { manifestVersion?: number },\n): AppManifest {\n const full = {\n ...manifest,\n manifestVersion: manifest.manifestVersion ?? CURRENT_MANIFEST_VERSION,\n } as AppManifest\n const problems = validateManifest(full)\n if (problems.length) {\n throw new Error(`Invalid AppManifest:\\n - ${problems.join('\\n - ')}`)\n }\n return full\n}\n\nexport interface RenderAppOptions {\n /** Which surface to mount; defaults to the first declared surface. */\n surface?: string\n}\n\n/** Resolve, migrate and validate a manifest, then mount the scaffold for the\n * chosen surface. Accepts a raw object (e.g. parsed app.manifest.json). */\nexport function renderApp(\n input: AppManifest | Record<string, unknown>,\n opts: RenderAppOptions = {},\n): React.ReactElement {\n const manifest = migrateManifest(input as Record<string, unknown>)\n const problems = validateManifest(manifest)\n if (problems.length) {\n throw new Error(`Invalid AppManifest:\\n - ${problems.join('\\n - ')}`)\n }\n const surfaceName = opts.surface ?? Object.keys(manifest.surfaces)[0]\n const surface = surfaceName ? manifest.surfaces[surfaceName] : undefined\n if (!surface) {\n throw new Error(`Surface \"${surfaceName}\" not found in manifest.`)\n }\n const Scaffold = getScaffold(surface.scaffold)\n if (!Scaffold) {\n throw new Error(\n `Scaffold \"${surface.scaffold}\" is not registered. Call renderApp from the package that provides it (e.g. @fayz-ai/saas, @fayz-ai/portal, @fayz-ai/storefront) or call its register*Scaffold() first.`,\n )\n }\n return React.createElement(\n ManifestContext.Provider,\n { value: manifest },\n React.createElement(Scaffold, { manifest, surface: surfaceName }),\n )\n}\n","import { create } from 'zustand'\n\n/**\n * Global, cross-module navigation history.\n *\n * Per-module nav hooks (useModuleNavigation) only remember views *within* one\n * module, so they can't tell you where you came from after crossing a module\n * boundary (e.g. Financial statements → a client/person page). This store sits\n * above all modules: the app shell records every route change here with a\n * human label, and the shared SubpageHeader reads it to render a context-aware\n * \"back to {where you came from}\" link that returns to the actual previous page.\n */\n\nexport interface NavHistoryEntry {\n /** Route path without the leading '#', e.g. '/financial/statements'. */\n path: string\n /** Human, module-level label for the page, e.g. 'Financeiro'. */\n label: string\n}\n\ninterface NavHistoryState {\n stack: NavHistoryEntry[]\n /** Record a visit. Consecutive visits to the same path collapse (label refreshes). */\n record: (entry: NavHistoryEntry) => void\n}\n\nconst MAX_ENTRIES = 20\n\nexport const useNavHistoryStore = create<NavHistoryState>((set) => ({\n stack: [],\n record: (entry) =>\n set((s) => {\n const top = s.stack[s.stack.length - 1]\n if (top && top.path === entry.path) {\n if (top.label === entry.label) return s\n const next = s.stack.slice()\n next[next.length - 1] = entry\n return { stack: next }\n }\n const next = [...s.stack, entry]\n return { stack: next.length > MAX_ENTRIES ? next.slice(-MAX_ENTRIES) : next }\n }),\n}))\n\n/** Record a route visit. Call from the app shell whenever the route changes. */\nexport function recordNavigation(path: string, label: string): void {\n useNavHistoryStore.getState().record({ path, label })\n}\n\n// Dev-only debug handle: inspect history in the console via `__navHistory.getState().stack`.\nif (typeof window !== 'undefined') {\n ;(window as unknown as { __navHistory?: typeof useNavHistoryStore }).__navHistory = useNavHistoryStore\n}\n\n/**\n * The page the user most recently came from, relative to `currentPath`.\n *\n * Returns the latest recorded entry whose path differs from `currentPath`. This\n * is intentionally robust to ordering: it gives the right referrer whether or\n * not the current page has been recorded yet, avoiding a stale first paint.\n */\nexport function useNavReferrer(currentPath: string): NavHistoryEntry | null {\n return useNavHistoryStore((s) => {\n for (let i = s.stack.length - 1; i >= 0; i--) {\n if (s.stack[i].path !== currentPath) return s.stack[i]\n }\n return null\n })\n}\n\n/**\n * Return to the actual previous page via the browser history. Falls back to the\n * provided callback when there's no in-app history to pop (e.g. a deep link).\n */\nexport function navHistoryBack(fallback?: () => void): void {\n if (useNavHistoryStore.getState().stack.length >= 2) {\n window.history.back()\n } else {\n fallback?.()\n }\n}\n\n/** Top-level module segment of a route path ('/financial/statements' → 'financial'). */\nexport function routeModule(path: string): string {\n return path.replace(/^\\/+/, '').split('/')[0] ?? ''\n}\n"]}
1
+ {"version":3,"sources":["../src/types/plugins.ts","../src/data/backend-env.ts","../src/events/envelope.ts","../src/events/log.ts","../src/events/index.tsx","../src/data/refresh.ts","../src/plugin/createSafeDataProvider.ts","../src/lib/phone.ts","../src/lib/address.ts","../src/lib/seo.ts","../src/lib/format.ts","../src/lib/csv.ts","../src/search/text.ts","../src/search/engine.ts","../src/registry/blocks.tsx","../src/manifest/index.ts","../src/manifest/serialize.ts","../src/manifest/app-manifest.schema.json","../src/app/render.tsx","../src/router/history.ts","../src/messaging/registry.ts"],"names":["React","React2","useEffect","str","client","started","via","React4","next"],"mappings":"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","file":"index.js","sourcesContent":["import type { EventField } from '../events/types'\nimport type React from 'react'\nimport type { EntityDef } from './crud'\nimport type { AnalyticsCardDef, ResolvedAnalyticsCard } from './analytics'\nimport type { FeatureDeclaration, PermissionAction } from './permissions'\nimport type { LimitDeclaration } from './entitlements'\nimport type { ConnectorDefinition } from '../integrations'\n\nexport type VerticalId = 'beauty' | 'food' | 'health' | 'services' | 'retail' | 'education' | (string & {})\nexport type PluginScope = 'core' | 'vertical' | 'universal' | 'addon' | 'tenant'\nexport type PluginStatus = 'pending_setup' | 'active' | 'disabled' | 'removed'\n\n/**\n * Scaffold type this plugin targets.\n * Plugins can declare which scaffolds they work with.\n * If omitted, the plugin works with all scaffold types.\n */\nexport type ScaffoldType = 'saas' | 'ecommerce' | 'landing_page' | 'website' | (string & {})\n\nexport interface PluginPermissionRequirement {\n feature: string\n action: PermissionAction\n}\n\nexport interface PluginNavigationEntry {\n id?: string\n section: 'main' | 'secondary' | 'settings'\n position: number\n label: string\n route: string\n icon?: string\n badge?: string | number\n permission?: PluginPermissionRequirement\n /**\n * Sales-channel / external link. When set, the entry opens this URL in a new\n * tab instead of routing internally — no page/route is registered for it. Used\n * by \"Canais de venda\"-style nav (Loja Online, WhatsApp, TikTok Shop…). The\n * `route` is still required (used as a stable identity/key), but is never\n * navigated when `href` is present.\n */\n href?: string\n /**\n * When this entry gains sub-path children, the shell also synthesizes a child\n * pointing back at the parent's own route (so /courses stays reachable under\n * the \"Courses\" group). Set false when the parent route is a duplicate of its\n * first child — e.g. /shop and /shop/products render the same catalog, and\n * listing both reads as a bug. Defaults to true.\n */\n indexChild?: boolean\n}\n\nexport interface PluginSettingsTab {\n id: string\n label: string\n icon?: string\n /** Provide the component directly, or reference a registered component by id\n * (resolvePluginComponent resolves componentId → the component registry).\n * Exactly one is required. */\n component?: React.ComponentType<unknown>\n componentId?: string\n pluginId?: string\n order?: number\n permission?: PluginPermissionRequirement\n}\n\nexport interface PluginRouteDefinition {\n path: string\n /** Component or a registered component id — exactly one is required. */\n component?: React.ComponentType<unknown>\n componentId?: string\n guard?: 'authenticated' | 'role' | 'public' | 'share-token'\n roles?: string[]\n permission?: PluginPermissionRequirement\n /** Render edge-to-edge with no page padding/animation wrapper (chat, kanban, canvas). */\n fullBleed?: boolean\n /** Archetypes this page displays (`archetype` or `archetype:kind`, e.g.\n * `'schedule:appointment'`). A CRUD page claims its own; a hand-built page\n * must declare it or records it owns resolve to no route. */\n entityRoutes?: string[]\n /**\n * What the shell bar writes on this page.\n *\n * Without it the title came ONLY from the menu item matching the route, so\n * every off-menu page (`/orders/new`, `/emails/:event`) was labelled with its\n * parent's name — \"Orders\" on a screen that is not the order list.\n *\n * A title that depends on DATA (the record's name) does not belong here; that\n * is `PageHeader`, which claims the bar once it loads.\n */\n title?: string\n /**\n * Where the \"←\" goes back to. Declaring the parent gives the back button for\n * free, instead of each page drawing its own — which is how the same arrow\n * ended up with three different designs.\n */\n parentRoute?: string\n}\n\nexport type PluginWidgetZone =\n | 'shell.sidebar.before-nav'\n | 'shell.sidebar.footer'\n | 'shell.topbar.start'\n | 'shell.topbar.end'\n | 'page.before'\n | 'page.after'\n | 'settings.before'\n | 'settings.after'\n | 'shell.floating'\n | (string & {})\n\nexport const WidgetZone = {\n SIDEBAR_BEFORE_NAV: 'shell.sidebar.before-nav',\n SIDEBAR_FOOTER: 'shell.sidebar.footer',\n TOPBAR_START: 'shell.topbar.start',\n TOPBAR_END: 'shell.topbar.end',\n PAGE_BEFORE: 'page.before',\n PAGE_AFTER: 'page.after',\n SETTINGS_BEFORE: 'settings.before',\n SETTINGS_AFTER: 'settings.after',\n FLOATING: 'shell.floating',\n} as const\n\nexport interface PluginRuntimeTenant {\n id?: string\n slug?: string\n verticalId?: string\n plan?: string\n}\n\nexport interface PluginRuntimeUser {\n id?: string\n role?: string\n}\n\nexport interface PluginWidgetVisibility {\n routes?: string[]\n excludeRoutes?: string[]\n layouts?: string[]\n roles?: string[]\n plans?: string[]\n permissions?: PluginPermissionRequirement[]\n when?: (context: PluginRuntimeContext) => boolean\n}\n\nexport interface PluginRuntimeContext {\n tenant: PluginRuntimeTenant | null\n user: PluginRuntimeUser | null\n currentPath: string\n matchedPath?: string\n layout: string\n hasPermission?: (req: PluginPermissionRequirement) => boolean\n}\n\nexport interface PluginWidgetDefinition<TConfig extends Record<string, unknown> = Record<string, unknown>> {\n id: string\n zone: PluginWidgetZone\n /** Component or a registered component id — exactly one is required. */\n component?: React.ComponentType<unknown>\n componentId?: string\n title?: string\n order?: number\n permission?: PluginPermissionRequirement\n visibility?: PluginWidgetVisibility\n props?: TConfig\n}\n\n// ---------------------------------------------------------------------------\n// Dashboard widgets — first-class units a plugin contributes to the dashboard\n// registry. Rendered both on the plugin's own home and on the global app home.\n// ---------------------------------------------------------------------------\n\nexport type DashboardWidgetKind = 'kpi' | 'chart' | 'table' | 'onboarding' | 'custom'\n\n/** Surfaces a widget can appear on. 'home' = global app home (the universal\n * business dashboard every app renders via createDashboardPlugin);\n * 'plugin-home' = the owning plugin's own overview page; 'finance-home' = a\n * dedicated B2C consumer-finance home (norman-ai's phone-first money screen),\n * kept separate so its full-bleed hero/cards never leak onto the B2B 'home'. */\nexport type DashboardSurface = 'home' | 'plugin-home' | 'finance-home' | 'analytics'\n\nexport interface DashboardWidgetDef<TProps extends Record<string, unknown> = Record<string, unknown>> {\n /** Globally unique id, e.g. 'crm.kpi.total-leads'. */\n id: string\n /** i18n key or plain label. */\n title: string\n description?: string\n icon?: string\n /** Owning domain used to scope plugin-home vs global home. Defaults to plugin.id. */\n domain?: string\n kind: DashboardWidgetKind\n /** Column span on the 4-col grid. Defaults by kind (kpi→1, chart→2, table→4). */\n span?: 1 | 2 | 3 | 4\n /** Visible before any app/user customization. Default: true. */\n defaultVisible?: boolean\n /** Default order within the surface (lower = first). */\n defaultOrder?: number\n /** Surfaces this widget appears on. Default: both. */\n surfaces?: DashboardSurface[]\n verticalId?: VerticalId\n permission?: PluginPermissionRequirement\n /** Component or a registered component id — exactly one is required. */\n component?: React.ComponentType<unknown>\n componentId?: string\n props?: TProps\n}\n\n/** App- or user-level overrides applied on top of the registered defaults. */\nexport interface DashboardLayoutConfig {\n widgets?: Array<{ id: string; visible?: boolean; order?: number; span?: number }>\n}\n\nexport interface ResolvedDashboardWidget extends DashboardWidgetDef {\n /** Resolved owning domain (plugin.id when not explicitly set). */\n domain: string\n order: number\n plugin: ResolvedPluginManifest\n}\n\n/** An event a plugin emits onto the event bus — declared for platform\n * introspection and so the AppManifest can bind event→action as data. */\nexport interface PluginEventDefinition {\n /** Namespaced event name, e.g. 'agenda.booking.confirmed'. */\n name: string\n description?: string\n /** JSON Schema for the payload (editor / AI / validation). */\n payloadSchema?: Record<string, unknown>\n // -------------------------------------------------------------------------\n // The FACT's contract, read by three different consumers: automations (build\n // the message), integrations (webhook body) and audit (the history line).\n // Hence it lives in the manifest rather than inside the automations plugin —\n // a message is ONE reaction to the fact, not its definition.\n // -------------------------------------------------------------------------\n /** Short name for lists (\"Order shipped\"). Defaults to `name`. */\n title?: string\n /** When it fires, in words. */\n trigger?: string\n /** lucide icon. */\n icon?: string\n /**\n * Payload fields. Contract, not documentation: the same descriptors become the\n * editor's merge fields, the webhook's example body and the audit row's data.\n * Three hand-written lists drift from what the emitter sends, and the drift\n * only shows up as a raw `{{order_total}}` reaching the customer.\n */\n fields?: EventField[]\n /**\n * Goes into the audit trail. Not every event does: \"abandoned cart\" is a\n * marketing signal, nobody's act, and an audit full of noise is one nobody\n * reads.\n */\n audit?: boolean\n}\n\n/** A declared event, with its owning plugin resolved. */\nexport interface ResolvedDomainEvent extends PluginEventDefinition {\n pluginId: string\n pluginName: string\n pluginIcon?: string\n}\n\nexport interface PluginCapability {\n id: string\n label: string\n description?: string\n kind?: 'page' | 'widget' | 'data' | 'integration'\n}\n\nexport interface PluginQuickAction {\n id: string\n label: string\n icon?: string\n description?: string\n /** Action handler — typically navigates to a view. */\n action: () => void\n}\n\nexport type AIToolMode = 'read' | 'persist'\n\nexport interface AIToolParameterProperty {\n type: 'string' | 'number' | 'boolean' | 'array' | 'object'\n description?: string\n enum?: string[]\n items?: AIToolParameterProperty\n default?: unknown\n}\n\nexport interface AIToolParameters {\n type: 'object'\n properties: Record<string, AIToolParameterProperty>\n required?: string[]\n}\n\nexport interface AIToolSuggestion {\n label: string\n prompt?: string\n icon?: string\n verticalId?: VerticalId\n}\n\nexport type AIToolExecution =\n | { plane: 'server'; kind: 'rpc'; rpc: string }\n | { plane: 'server'; kind: 'entity_read'; entity: string }\n | { plane: 'client' }\n\n/**\n * A tenant-scoped pool RPC (`agent_<domain>_<verb>`) this plugin ships for the\n * server-plane agent executor. Surfaces in the manifest as\n * `agent.rpcs` (RpcContract) — the broker only ever calls declared functions.\n */\nexport interface AgentRpcDeclaration {\n /** Function name in the pool, e.g. 'agent_agenda_create_appointment'. */\n name: string\n kind: 'read' | 'write'\n description: string\n /** JSON Schema of the p_payload argument. */\n payloadSchema?: AIToolParameters\n /** Whether the function writes audit_logs itself. */\n audits?: boolean\n}\n\nexport interface PluginAITool {\n id: string\n name: string\n description: string\n icon?: string\n mode: AIToolMode\n parameters?: AIToolParameters\n permission?: PluginPermissionRequirement\n /**\n * Quantity-limit key this tool's writes consume (e.g. 'bookings_month' for a\n * booking-creating tool). Persist-mode tools that create countable rows MUST\n * declare it so the agent executor can run the SAME plan-limit guard the UI\n * runs (guard before execute, invalidate after) — an AI agent never clicks a\n * gated button, so the declarative contract is its only gate.\n */\n limitKey?: string\n /**\n * Where the tool runs. Server-plane is what makes browserless channels\n * (WhatsApp, MCP) able to run the tool at all:\n * - `{ plane:'server', kind:'rpc', rpc }` — the Fayz broker calls the named\n * `agent_*` RPC in the tenant pool (writes / guarded reads).\n * - `{ plane:'server', kind:'entity_read', entity }` — the broker runs the\n * generic tenant-scoped read against the entity's table (derived tools).\n * - `{ plane:'client' }` (or absent) — a locally registered executor runs it\n * in the surface (navigation, modals).\n */\n execution?: AIToolExecution\n /**\n * Require an explicit human confirmation before executing. Defaults to true\n * for `mode: 'persist'` tools — the channel renders it natively (FAB modal,\n * WhatsApp yes/no reply).\n */\n requiresConfirmation?: boolean\n suggestions?: AIToolSuggestion[]\n category?: string\n tags?: string[]\n}\n\nexport interface PluginRegistryDef {\n id: string\n entity: EntityDef\n icon?: string\n description?: string\n display?: 'table' | 'cards' | 'tree'\n seedData?: Record<string, unknown>[]\n mockData?: Record<string, unknown>[]\n readOnly?: boolean\n}\n\nexport interface PluginMigration {\n id: string\n version: string\n sql: string\n description?: string\n}\n\nexport interface PluginOnboarding {\n /** Component or a registered component id — exactly one is required. */\n component?: React.ComponentType<{ onComplete: () => void }>\n componentId?: string\n title?: string\n description?: string\n}\n\n/**\n * A health check a plugin contributes to the diagnostics / boot report surfaced by\n * `fayz doctor`. Declared as data so the platform can verify a plugin's backend\n * prerequisites are present without running it.\n */\nexport interface PluginDiagnostic {\n id: string\n description?: string\n /** What the runtime should verify exists for this plugin to work. */\n requires: {\n rpcs?: string[]\n views?: string[]\n tables?: string[]\n migrations?: string[]\n env?: string[]\n }\n /** Severity when the requirement is missing. Defaults to 'warn'. */\n level?: 'error' | 'warn' | 'info'\n}\n\nexport interface PluginManifest {\n id: string\n name: string\n icon: string\n version: string\n /** Plugin contract version. The runtime refuses plugins built for a newer\n * contract than it supports (see PLUGIN_API_VERSION). Omit = legacy/compatible. */\n apiVersion?: number\n description?: string\n scope?: PluginScope\n verticalId?: VerticalId\n /** Events this plugin emits onto the bus (declared for introspection/automation). */\n events?: PluginEventDefinition[]\n /** Which scaffold types this plugin targets. Omit for universal plugins. */\n scaffolds?: ScaffoldType[]\n tenantId?: string\n defaultEnabled?: boolean\n schema?: string\n dependencies?: string[]\n navigation: PluginNavigationEntry[]\n settings?: PluginSettingsTab[]\n routes: PluginRouteDefinition[]\n widgets?: PluginWidgetDefinition[]\n /** Dashboard widgets this plugin contributes to the dashboard registry. */\n dashboardWidgets?: DashboardWidgetDef[]\n /**\n * Analytics cards this plugin contributes. Each one is simultaneously an\n * overview tile, a row in the report list and a full-page report — see\n * ./analytics.ts. Owned by the plugin that owns the data.\n */\n analyticsCards?: AnalyticsCardDef[]\n capabilities?: PluginCapability[]\n aiTools?: PluginAITool[]\n entities?: string[]\n permissions?: string[]\n declaredFeatures?: FeatureDeclaration[]\n /**\n * Quantity limits this plugin knows how to count. Aggregated by the plugin\n * runtime into `PluginRuntime.pluginLimits` and consumed by the access engine\n * (useLimit / useLimitGuard) so a plugin \"is born compatible\" with freemium\n * caps without any per-app wiring. See {@link LimitDeclaration}.\n */\n declaredLimits?: LimitDeclaration[]\n /** Pool RPCs this plugin ships for the server-plane agent executor. */\n declaredRpcs?: AgentRpcDeclaration[]\n /**\n * Read-models this plugin exposes to the agent's generic data primitives\n * (searchRecords/queryData) BEYOND its CRUD registries — typically its\n * views/ledgers (v_appointments, plg_financial_movements). `key` is a stable\n * ASCII id (never derived from a translated label); the entity's own\n * `permission` gates each call.\n */\n queryEntities?: Array<{\n key: string\n entity: EntityDef\n /** Base tables may opt into createRecord; views/ledgers stay read-only. */\n writable?: boolean\n }>\n registries?: PluginRegistryDef[]\n /**\n * Connectors this plugin contributes. An ADDON plugin declares its connector(s)\n * here, each naming the `hostPluginId` it extends; the runtime groups them by\n * host and the host plugin's settings render them in a unified Integrations tab.\n */\n connectors?: ConnectorDefinition[]\n migrations?: PluginMigration[]\n /** Backend prerequisites the plugin needs; surfaced by `fayz doctor`. */\n diagnostics?: PluginDiagnostic[]\n onboarding?: PluginOnboarding\n locales?: Record<string, Record<string, string>>\n}\n\nexport interface TenantPluginBinding {\n pluginId: string\n status: PluginStatus\n tenantId?: string\n config?: Record<string, unknown>\n}\n\nexport interface PluginRuntimeIssue {\n type:\n | 'duplicate_plugin'\n | 'missing_dependency'\n | 'circular_dependency'\n | 'vertical_mismatch'\n | 'incompatible_api_version'\n pluginId: string\n dependencyId?: string\n message: string\n}\n\nexport interface ResolvedPluginManifest extends PluginManifest {\n status: PluginStatus\n isActive: boolean\n activationReason: 'default' | 'tenant' | 'dependency' | 'inactive'\n config: Record<string, unknown>\n missingDependencies: string[]\n settingsTabs: PluginSettingsTab[]\n widgets: PluginWidgetDefinition[]\n resolvedRegistries: PluginRegistryDef[]\n resolvedAITools: PluginAITool[]\n}\n\nexport interface ResolvedPluginWidget<TConfig extends Record<string, unknown> = Record<string, unknown>>\n extends PluginWidgetDefinition<TConfig> {\n order: number\n config: TConfig\n plugin: ResolvedPluginManifest\n}\n\nexport interface PluginRuntimeRoute extends PluginRouteDefinition {\n plugin: ResolvedPluginManifest\n}\n\nexport interface PluginRuntime {\n context: PluginRuntimeContext\n plugins: ResolvedPluginManifest[]\n activePlugins: ResolvedPluginManifest[]\n routes: PluginRuntimeRoute[]\n navigation: PluginNavigationEntry[]\n settingsTabs: PluginSettingsTab[]\n widgets: ResolvedPluginWidget[]\n dashboardWidgets: ResolvedDashboardWidget[]\n analyticsCards: ResolvedAnalyticsCard[]\n /** Events declared by ACTIVE plugins. A disabled module emits nothing, so its\n * facts drop off the list too. */\n events: ResolvedDomainEvent[]\n capabilities: PluginCapability[]\n aiTools: PluginAITool[]\n issues: PluginRuntimeIssue[]\n registries: Map<string, PluginRegistryDef[]>\n /** Connectors contributed by active plugins, grouped by the host plugin they extend. */\n connectorsByHost: Map<string, ConnectorDefinition[]>\n pluginFeatures: FeatureDeclaration[]\n /** Limit declarations aggregated from every active plugin's `declaredLimits`. */\n pluginLimits: LimitDeclaration[]\n}\n","/**\n * One answer to \"is this app live or on mocks?\".\n *\n * Every dogfood app had rewritten this by hand and no two agreed: some keyed off\n * the mere presence of VITE_SUPABASE_URL, some off an explicit\n * VITE_SUPABASE_ENABLED flag, some off `url && key` — and the key itself was\n * read as `_ANON_KEY`, `_PUBLISHABLE_KEY ?? _ANON_KEY` or `_PUBLISHABLE_KEY ||\n * _ANON_KEY` depending on the app. The divergence is why a pool conversion could\n * leave one app live and its neighbour silently on mocks.\n *\n * Precedence:\n * 1. `VITE_SUPABASE_ENABLED` — when set, it decides ('true' = live). The\n * explicit kill switch wins even with credentials present, which is what\n * lets an app sit on mocks while its pool is converted.\n * 2. Otherwise credentials decide: live when BOTH url and a key are present.\n *\n * The publishable key is preferred over the anon key (browser-safe, and the one\n * the industry pools issue); NEVER pass a service_role key through a VITE_ var.\n */\nexport interface BackendEnv {\n /** True when the app should talk to a real Supabase project. */\n live: boolean\n /** Undefined unless `live` — so passing these straight into config can't half-connect. */\n supabaseUrl?: string\n supabaseAnonKey?: string\n /** 'supabase' | 'mock' — ready for `auth.adapter` / `org.adapter`. */\n adapter: 'supabase' | 'mock'\n}\n\ntype EnvRecord = Record<string, string | boolean | undefined>\n\nexport interface ResolveBackendEnvOptions {\n /** Defaults to `import.meta.env` (Vite). Pass a record in Node/tests. */\n env?: EnvRecord\n /** Force the outcome regardless of env — escape hatch for previews/tests. */\n force?: 'live' | 'mock'\n}\n\nfunction str(value: string | boolean | undefined): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nexport function resolveBackendEnv(options: ResolveBackendEnvOptions = {}): BackendEnv {\n const env: EnvRecord =\n options.env ??\n ((import.meta as unknown as { env?: EnvRecord }).env ?? {})\n\n const url = str(env.VITE_SUPABASE_URL)\n const key = str(env.VITE_SUPABASE_PUBLISHABLE_KEY) ?? str(env.VITE_SUPABASE_ANON_KEY)\n\n const flag = env.VITE_SUPABASE_ENABLED\n const flagSet = flag !== undefined && flag !== ''\n const enabledByFlag = flag === true || flag === 'true'\n\n let live: boolean\n if (options.force) live = options.force === 'live'\n else if (flagSet) live = enabledByFlag && Boolean(url && key)\n else live = Boolean(url && key)\n\n return {\n live,\n supabaseUrl: live ? url : undefined,\n supabaseAnonKey: live ? key : undefined,\n adapter: live ? 'supabase' : 'mock',\n }\n}\n","import { eventBus } from './index'\nimport type { DomainEvent, DomainEventHandler } from './types'\n\n// ---------------------------------------------------------------------------\n// Domain-event envelope, over the `eventBus` that already existed.\n//\n// The raw bus delivers a bare payload. This adds what all THREE consumers need\n// and none should reassemble on its own: who caused it (audit), which tenant,\n// when (reprocessing), and which record (the \"open\" link).\n//\n// Once there is a server, this `emitDomainEvent` starts enqueueing instead of\n// calling directly — the signature does not change. That is why it exists before\n// there is a queue: emitters already write the right line.\n// ---------------------------------------------------------------------------\n\nexport function emitDomainEvent(\n key: string,\n payload: Record<string, unknown>,\n meta?: {\n actorId?: string | null\n tenantId?: string | null\n subject?: { type: string; id: string } | null\n occurredAt?: string\n },\n): DomainEvent {\n const event: DomainEvent = {\n key,\n payload,\n actorId: meta?.actorId ?? null,\n tenantId: meta?.tenantId ?? null,\n subject: meta?.subject ?? null,\n occurredAt: meta?.occurredAt ?? new Date().toISOString(),\n }\n // The bus already isolates throwing handlers: a webhook that is down does not\n // take out the action that produced the fact. A paid order stays paid when the\n // email fails.\n eventBus.emit(key, event)\n // Sinks see EVERY event without knowing the key list, which is what makes the\n // history and the audit trail hold for hooks that do not exist yet.\n for (const sink of sinks) {\n try {\n sink(event)\n } catch (err) {\n // A broken sink must not take down the emitter: the customer record was\n // saved even if the history does not record it.\n console.warn('[events] sink failed', err)\n }\n }\n return event\n}\n\n/**\n * Global sinks — they receive every emitted event, whatever its key.\n *\n * Unlike `onDomainEvent`, which needs the name up front. The run history and the\n * audit trail are like this by nature: they subscribe to \"whatever happens\".\n * Subscribing by name would need rewiring per new module, and the module someone\n * forgot would vanish from the history without warning.\n */\nconst sinks = new Set<(event: DomainEvent) => void>()\n\nexport function registerEventSink(sink: (event: DomainEvent) => void): () => void {\n sinks.add(sink)\n return () => { sinks.delete(sink) }\n}\n\nexport function clearEventSinks(): void {\n sinks.clear()\n}\n\n/** Subscribes to ONE event. Returns the unsubscribe. */\nexport function onDomainEvent(key: string, handler: DomainEventHandler): () => void {\n return eventBus.on<DomainEvent>(key, (e) => { void handler(e) })\n}\n\n/**\n * Subscribes to MANY by prefix — 'shop.*', or '*' for everything.\n *\n * The bus matches exact names, so the wildcard is resolved here: known events\n * come from the runtime (active plugins), and subscribing one by one keeps the\n * bus simple. Call again when the plugin list changes.\n */\nexport function onDomainEvents(\n keys: string[],\n known: string[],\n handler: DomainEventHandler,\n): () => void {\n const matched = known.filter((k) =>\n keys.some((p) => p === '*' || (p.endsWith('.*') ? k.startsWith(p.slice(0, -1)) : p === k)))\n const offs = matched.map((k) => onDomainEvent(k, handler))\n return () => { for (const off of offs) off() }\n}\n\n/**\n * Fills the payload's example fields. The message preview and the webhook test\n * body both come from here, so the two show the SAME shape.\n */\nexport function sampleEventPayload(fields?: { name: string; example?: string }[]): Record<string, string> {\n const out: Record<string, string> = {}\n for (const f of fields ?? []) out[f.name] = f.example ?? `{{${f.name}}}`\n return out\n}\n","import { getSupabaseClientOptional } from '../data/supabase'\nimport { getActiveTenantId } from '../lib/tenant'\nimport { registerEventSink } from './envelope'\nimport type { DomainEvent } from './types'\n\n// ---------------------------------------------------------------------------\n// Run history — what actually happened, not what is configured to happen.\n//\n// Without it, the only way to know a trigger worked was waiting for a customer\n// to complain they got nothing — too late, and it still cannot tell \"never\n// fired\" from \"fired and the send failed\". Different problems, different places.\n//\n// One row per FIRING, not per automation: the fact is one, and a message, a\n// webhook and the audit trail may all hang off it. Tying the row to the fact\n// rather than to the send is what makes this history serve all three.\n// ---------------------------------------------------------------------------\n\nexport const EVENT_LOG_TABLE = 'plg_event_log'\n\n/**\n * 'recorded' the trigger fired and nobody acted yet (today's state: the catalog\n * exists, message dispatch does not).\n * 'sent' someone acted and it worked — `result` says what.\n * 'skipped' acted and chose to do nothing (automation off, no channel).\n * 'failed' tried and broke — `error` says why.\n */\nexport type EventRunStatus = 'recorded' | 'sent' | 'skipped' | 'failed'\n\nexport interface EventRun {\n id: string\n eventKey: string\n status: EventRunStatus\n /** The firing's exact payload — what answers \"why did the message go out with\n * the wrong name?\" without reproducing the case. */\n payload: Record<string, unknown>\n result: Record<string, unknown> | null\n error: string | null\n actorId: string | null\n subjectType: string | null\n subjectId: string | null\n occurredAt: string\n}\n\nfunction client(): { from: (t: string) => any } | null {\n return getSupabaseClientOptional() as unknown as { from: (t: string) => any } | null\n}\n\nfunction toRun(row: any): EventRun {\n return {\n id: row.id,\n eventKey: row.event_key,\n status: (row.status ?? 'recorded') as EventRunStatus,\n payload: row.payload ?? {},\n result: row.result ?? null,\n error: row.error ?? null,\n actorId: row.actor_id ?? null,\n subjectType: row.subject_type ?? null,\n subjectId: row.subject_id ?? null,\n occurredAt: row.occurred_at ?? row.created_at,\n }\n}\n\n/**\n * Records a firing. Never throws and never awaits: the emitter must not get\n * slower — or fail — because the history is unavailable. A saved customer stays\n * saved when the log does not write.\n */\nexport function recordEventRun(event: DomainEvent, status: EventRunStatus = 'recorded'): void {\n const db = client()\n if (!db) return\n const tenantId = event.tenantId ?? getActiveTenantId()\n if (!tenantId) return\n void (async () => {\n try {\n await db.from(EVENT_LOG_TABLE).insert({\n tenant_id: tenantId,\n event_key: event.key,\n status,\n payload: event.payload ?? {},\n actor_id: event.actorId ?? null,\n subject_type: event.subject?.type ?? null,\n subject_id: event.subject?.id ?? null,\n occurred_at: event.occurredAt,\n })\n } catch (err) {\n console.warn('[events] could not record run', err)\n }\n })()\n}\n\nlet started = false\n\n/**\n * Turns the history on. Idempotent: calling twice does not write two rows, and\n * the call comes from a plugin factory that re-runs on every hot reload.\n */\nexport function startEventLog(): () => void {\n if (started) return () => {}\n started = true\n const off = registerEventSink((event) => recordEventRun(event))\n return () => { off(); started = false }\n}\n\n/**\n * An event's most recent firings. With no client or no table it returns empty:\n * \"nothing has happened yet\" is a complete state, and the screen can say it.\n */\nexport async function loadEventRuns(\n eventKey: string,\n options?: { tenantId?: string; limit?: number },\n): Promise<EventRun[]> {\n const db = client()\n if (!db) return []\n try {\n let q = db.from(EVENT_LOG_TABLE).select('*')\n .eq('event_key', eventKey)\n .order('occurred_at', { ascending: false })\n .limit(options?.limit ?? 20)\n if (options?.tenantId) q = q.eq('tenant_id', options.tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(toRun)\n } catch (err) {\n console.warn('[events] could not load runs', err)\n return []\n }\n}\n","import * as React from 'react'\n\n// ---------------------------------------------------------------------------\n// Event bus — the substrate for cross-plugin behavior. Replaces the bespoke\n// `window.dispatchEvent('agenda:open-booking')` hack and the imperative\n// financial bridge: plugins emit named events, others subscribe, and the\n// AppManifest can declare event→action bindings as data. Plugins describe the\n// events they emit via PluginManifest.events (see types/plugins) so the\n// platform can introspect and wire automations.\n// ---------------------------------------------------------------------------\n\nexport type EventHandler<T = unknown> = (payload: T) => void\n\nexport interface EventBus {\n emit<T = unknown>(event: string, payload?: T): void\n on<T = unknown>(event: string, handler: EventHandler<T>): () => void\n once<T = unknown>(event: string, handler: EventHandler<T>): () => void\n off<T = unknown>(event: string, handler: EventHandler<T>): void\n clear(event?: string): void\n}\n\nexport function createEventBus(): EventBus {\n const handlers = new Map<string, Set<EventHandler>>()\n const bus: EventBus = {\n emit(event, payload) {\n const set = handlers.get(event)\n if (!set) return\n // Snapshot so handlers can subscribe/unsubscribe during dispatch.\n for (const handler of Array.from(set)) {\n try {\n handler(payload)\n } catch (err) {\n // A misbehaving subscriber must not break the emitter or its peers.\n console.error(`[fayz] event handler for \"${event}\" threw:`, err)\n }\n }\n },\n on(event, handler) {\n let set = handlers.get(event)\n if (!set) {\n set = new Set()\n handlers.set(event, set)\n }\n set.add(handler as EventHandler)\n return () => bus.off(event, handler)\n },\n once(event, handler) {\n const wrapped: EventHandler = (payload) => {\n bus.off(event, wrapped)\n ;(handler as EventHandler)(payload)\n }\n return bus.on(event, wrapped)\n },\n off(event, handler) {\n handlers.get(event)?.delete(handler as EventHandler)\n },\n clear(event) {\n if (event) handlers.delete(event)\n else handlers.clear()\n },\n }\n return bus\n}\n\n/** The app-wide default bus. One per app runtime (repo-per-app). */\nexport const eventBus: EventBus = createEventBus()\n\n/** Subscribe to an event for the lifetime of the component. The latest handler\n * is always invoked, so closures over fresh props/state work without resubscribing. */\nexport function useOnEvent<T = unknown>(\n event: string,\n handler: EventHandler<T>,\n deps: React.DependencyList = [],\n): void {\n const ref = React.useRef(handler)\n ref.current = handler\n React.useEffect(\n () => eventBus.on<T>(event, (payload) => ref.current(payload)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [event, ...deps],\n )\n}\n\n// Envelope de domínio (ator, conta, hora, registro) sobre este barramento —\n// o formato que automações, integrações e auditoria leem.\nexport { emitDomainEvent, onDomainEvent, onDomainEvents, sampleEventPayload, registerEventSink, clearEventSinks } from './envelope'\nexport type { EventField, DomainEvent, DomainEventHandler, DomainEventSubscription } from './types'\n// Histórico de disparos — o que aconteceu, ao lado do que está configurado.\nexport { startEventLog, recordEventRun, loadEventRuns, EVENT_LOG_TABLE } from './log'\nexport type { EventRun, EventRunStatus } from './log'\n","import * as React from 'react'\nimport { eventBus } from '../events'\nimport { globalCache } from '../lib/cache'\nimport { getActiveTenantId } from '../lib/tenant'\n\n// ---------------------------------------------------------------------------\n// Data refresh bus — \"something wrote; whoever is showing it should reload\".\n//\n// A write that happens OUTSIDE the list showing it (the assistant creating an\n// appointment, a webhook, another tab) used to leave the screen stale until the\n// user reloaded by hand. Providers already invalidate their own read cache on\n// create/update/remove, but a mounted list holds its rows in a store — nothing\n// told it to fetch again.\n//\n// This is the missing half: one broadcast, every surface that renders the\n// affected data listens. Deliberately coarse — a table name, not a row diff.\n// Refetching a page of rows is cheap; a stale screen after \"criei o\n// agendamento\" is not.\n// ---------------------------------------------------------------------------\n\nexport const DATA_CHANGED_EVENT = 'data:changed'\n\nexport interface DataChangedPayload {\n /** Physical table the write touched, when the writer knows it. */\n table?: string\n /** Registered entity key (deriveEntityKey), when the writer knows it. */\n entityKey?: string\n /** Archetype the record belongs to (`person:client`), when known. */\n archetype?: string\n op?: 'create' | 'update' | 'delete' | 'unknown'\n /** Affected record id, when known. */\n id?: string\n /** What caused the write — lets a surface ignore its own UI writes. */\n source?: 'agent' | 'ui' | 'remote'\n}\n\n/** What a subscriber renders. Any field left out matches everything. */\nexport interface DataChangedMatch {\n table?: string\n entityKey?: string\n archetype?: string\n}\n\n/**\n * A write with NO table/entityKey is a write we could not attribute (a plugin\n * tool, an RPC). Subscribers still refresh for it: a redundant refetch costs a\n * request, a missed one costs the user's trust in what the screen shows.\n */\nexport function matchesDataChange(match: DataChangedMatch, payload: DataChangedPayload): boolean {\n const attributed = payload.table ?? payload.entityKey ?? payload.archetype\n if (!attributed) return true\n if (match.table && payload.table && match.table === payload.table) return true\n if (match.entityKey && payload.entityKey && match.entityKey === payload.entityKey) return true\n if (match.archetype && payload.archetype && match.archetype === payload.archetype) return true\n // A subscriber that declared nothing listens to everything.\n return !match.table && !match.entityKey && !match.archetype\n}\n\n// One agent turn can write twice (create + link). Coalesce so the lists behind\n// it fetch once, after the turn settles, instead of once per call.\nlet pending: DataChangedPayload[] = []\nlet flushTimer: ReturnType<typeof setTimeout> | null = null\n\nfunction flush(): void {\n const batch = pending\n pending = []\n flushTimer = null\n for (const payload of batch) eventBus.emit(DATA_CHANGED_EVENT, payload)\n}\n\n/**\n * Announce a write. Invalidates the provider read cache for the affected table\n * (an unattributed write clears it wholesale — a stale hit would defeat the\n * refetch it just triggered) and broadcasts to mounted surfaces.\n */\nexport function emitDataChanged(payload: DataChangedPayload = {}): void {\n if (payload.table) {\n const tenant = getActiveTenantId() ?? '_'\n // The base table and its read-model view are the SAME data under two cache\n // namespaces (appointments / v_appointments). Invalidating only the one the\n // writer names leaves the other serving a snapshot that predates the write\n // — which is how the assistant kept reporting an empty agenda after a\n // booking was created on the agenda screen.\n const sibling = payload.table.startsWith('v_')\n ? payload.table.slice(2)\n : `v_${payload.table}`\n globalCache.invalidate(`${tenant}:${payload.table}`)\n globalCache.invalidate(`${tenant}:${sibling}`)\n } else {\n globalCache.clear()\n }\n pending.push({ op: 'unknown', source: 'agent', ...payload })\n if (flushTimer) return\n flushTimer = setTimeout(flush, 120)\n}\n\n/** Subscribe for the lifetime of the component. The latest handler always runs. */\nexport function useDataChanged(\n match: DataChangedMatch,\n handler: (payload: DataChangedPayload) => void,\n deps: React.DependencyList = [],\n): void {\n const handlerRef = React.useRef(handler)\n handlerRef.current = handler\n const { table, entityKey, archetype } = match\n\n React.useEffect(\n () =>\n eventBus.on<DataChangedPayload>(DATA_CHANGED_EVENT, (payload) => {\n if (matchesDataChange({ table, entityKey, archetype }, payload)) handlerRef.current(payload)\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [table, entityKey, archetype, ...deps],\n )\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { getSupabaseClientOptional } from '../data/supabase'\n\n/**\n * createSafeDataProvider — the standard lazy provider resolver every plugin\n * repeated by hand. Returns a Proxy that, on first method call, resolves to the\n * Supabase-backed provider when a Supabase client is configured, otherwise the\n * mock provider. Resolution is deferred so importing a plugin never forces a\n * Supabase connection, and memoized so it only happens once.\n *\n * const provider = options?.dataProvider ?? createSafeDataProvider(\n * () => createSupabaseCrmProvider(providerOptions),\n * () => createMockCrmProvider(),\n * )\n */\nexport function createSafeDataProvider<T extends object>(\n makeSupabase: () => T,\n makeMock: () => T,\n): T {\n let resolved: T | null = null\n const get = (): T => {\n if (!resolved) {\n resolved = getSupabaseClientOptional() ? makeSupabase() : makeMock()\n }\n return resolved\n }\n return new Proxy({} as T, {\n get: (_target, prop) => (...args: any[]) => (get() as any)[prop](...args),\n })\n}\n","// ---------------------------------------------------------------------------\n// Reusable phone / country helpers (SDK-level — shared by any plugin that\n// collects a phone number: booking, CRM, forms, auth…). Provides the country\n// list (flag + dial code + national mask) and mask/unmask utilities.\n// ---------------------------------------------------------------------------\n\nexport interface CountryDef {\n /** ISO 3166-1 alpha-2 code, e.g. 'BR'. */\n iso2: string\n /** Localized-ish display name. */\n name: string\n /** International dial code including '+', e.g. '+55'. */\n dial: string\n /** Flag emoji (derived from iso2). */\n flag: string\n /** National number mask; '#' = one digit. e.g. '(##) #####-####'. */\n mask: string\n}\n\n/** Derive a flag emoji from an ISO2 code via regional indicator symbols. */\nfunction flagOf(iso2: string): string {\n return iso2\n .toUpperCase()\n .replace(/[^A-Z]/g, '')\n .split('')\n .map((c) => String.fromCodePoint(0x1f1e6 + c.charCodeAt(0) - 65))\n .join('')\n}\n\nconst RAW: Omit<CountryDef, 'flag'>[] = [\n { iso2: 'BR', name: 'Brasil', dial: '+55', mask: '(##) #####-####' },\n { iso2: 'US', name: 'Estados Unidos', dial: '+1', mask: '(###) ###-####' },\n { iso2: 'PT', name: 'Portugal', dial: '+351', mask: '### ### ###' },\n { iso2: 'AR', name: 'Argentina', dial: '+54', mask: '(##) ####-####' },\n { iso2: 'ES', name: 'Espanha', dial: '+34', mask: '### ### ###' },\n { iso2: 'MX', name: 'México', dial: '+52', mask: '## #### ####' },\n { iso2: 'GB', name: 'Reino Unido', dial: '+44', mask: '##### ######' },\n { iso2: 'FR', name: 'França', dial: '+33', mask: '# ## ## ## ##' },\n { iso2: 'DE', name: 'Alemanha', dial: '+49', mask: '#### #######' },\n { iso2: 'IT', name: 'Itália', dial: '+39', mask: '### #######' },\n]\n\nexport const COUNTRIES: CountryDef[] = RAW.map((c) => ({ ...c, flag: flagOf(c.iso2) }))\n\nexport const DEFAULT_COUNTRY = 'BR'\n\nconst BY_ISO = new Map(COUNTRIES.map((c) => [c.iso2, c]))\n\n/** Look up a country by ISO2 (falls back to the default). */\nexport function getCountry(iso2: string | undefined): CountryDef {\n return (iso2 && BY_ISO.get(iso2.toUpperCase())) || BY_ISO.get(DEFAULT_COUNTRY)!\n}\n\n/** Keep only digit characters. */\nexport function unmaskPhone(value: string): string {\n return (value || '').replace(/\\D/g, '')\n}\n\n/**\n * Apply a '#'-placeholder mask to a raw string, consuming its digits. Extra\n * digits beyond the mask are dropped; partial input masks progressively.\n *\n * maskPhone('11987654321', '(##) #####-####') -> '(11) 98765-4321'\n */\nexport function maskPhone(value: string, mask: string): string {\n const digits = unmaskPhone(value)\n let out = ''\n let di = 0\n for (const ch of mask) {\n if (di >= digits.length) break\n if (ch === '#') {\n out += digits[di++]\n } else {\n out += ch\n }\n }\n return out\n}\n\n/** Count how many digits a mask expects. */\nexport function maskDigitCount(mask: string): number {\n let n = 0\n for (const ch of mask) if (ch === '#') n++\n return n\n}\n","// ---------------------------------------------------------------------------\n// Postal code → address lookup (SDK-level — shared by any surface that collects\n// an address: storefront checkout, the SaaS address book, CRM, booking).\n//\n// Sits beside ./phone for the same reason: knowing that a Brazilian CEP is\n// eight digits, and that '01310100' means Avenida Paulista, is not a\n// storefront concern. It belongs wherever an address is typed.\n//\n// The lookup itself is behind an interface. ViaCEP is the default because it is\n// free, keyless and CORS-enabled, but it is a third party the merchant does not\n// control — so swapping it for an edge-function proxy (shared cache, no\n// third-party call from the shopper's browser) must be one line, not a rewrite.\n// ---------------------------------------------------------------------------\n\n/**\n * An address as a postal service knows it: everything except the parts only the\n * resident can supply (number, complement).\n *\n * Field names mirror ShippingAddressInput in @fayz-ai/shop so the value crosses\n * from lookup to checkout to the order with no translation step in between.\n */\nexport interface PostalAddress {\n postalCode: string\n street: string\n district: string\n city: string\n state: string\n country: string\n /** IBGE municipality code when the source provides one — useful for tax later. */\n cityCode?: string\n}\n\n/** Where a postal code is resolved. Implementations must not throw for a\n * well-formed code that simply does not exist — that is `null`, not an error. */\nexport interface PostalLookupProvider {\n lookup(postalCode: string): Promise<PostalAddress | null>\n}\n\n/** Keep only digits. */\nexport function normalizePostalCode(value: string): string {\n return (value || '').replace(/\\D/g, '')\n}\n\n/** '01310100' | '01310-100' -> '01310-100'. Partial input formats progressively. */\nexport function formatPostalCode(value: string): string {\n const digits = normalizePostalCode(value).slice(0, 8)\n return digits.length > 5 ? `${digits.slice(0, 5)}-${digits.slice(5)}` : digits\n}\n\n/** A Brazilian CEP is exactly eight digits. */\nexport function isValidPostalCode(value: string): boolean {\n return normalizePostalCode(value).length === 8\n}\n\n// ---------------------------------------------------------------------------\n// Cache\n//\n// A CEP maps to the same street for years, so the second lookup of one should\n// never leave the browser. This also keeps a busy storefront well clear of\n// ViaCEP's per-IP rate limit. localStorage when there is a window, an in-memory\n// Map otherwise (SSR, tests, node) — never a hard failure over a cache miss.\n// ---------------------------------------------------------------------------\n\nconst CACHE_KEY = 'fayz.postal.cache.v1'\nconst memoryCache = new Map<string, PostalAddress>()\n\nfunction readCache(code: string): PostalAddress | undefined {\n const hit = memoryCache.get(code)\n if (hit) return hit\n try {\n const raw = globalThis.localStorage?.getItem(CACHE_KEY)\n if (!raw) return undefined\n const all = JSON.parse(raw) as Record<string, PostalAddress>\n const stored = all[code]\n if (stored) memoryCache.set(code, stored)\n return stored\n } catch {\n return undefined\n }\n}\n\nfunction writeCache(code: string, address: PostalAddress): void {\n memoryCache.set(code, address)\n try {\n const store = globalThis.localStorage\n if (!store) return\n const raw = store.getItem(CACHE_KEY)\n const all = raw ? (JSON.parse(raw) as Record<string, PostalAddress>) : {}\n all[code] = address\n store.setItem(CACHE_KEY, JSON.stringify(all))\n } catch {\n /* quota or private mode — the in-memory copy still stands for this session */\n }\n}\n\n/** Drop the cache. Exposed for tests and for a \"wrong address?\" escape hatch. */\nexport function clearPostalCache(): void {\n memoryCache.clear()\n try {\n globalThis.localStorage?.removeItem(CACHE_KEY)\n } catch {\n /* ignore */\n }\n}\n\n// ---------------------------------------------------------------------------\n// ViaCEP\n// ---------------------------------------------------------------------------\n\ninterface ViaCepResponse {\n cep?: string\n logradouro?: string\n bairro?: string\n localidade?: string\n uf?: string\n ibge?: string\n erro?: boolean | string\n}\n\n/**\n * ViaCEP (https://viacep.com.br). Free, no key, CORS-enabled.\n *\n * The trap: an unknown CEP does NOT come back as 404. ViaCEP answers HTTP 200\n * with `{\"erro\": true}` (and, on some deploys, the string \"true\"), so checking\n * response.ok alone yields an address of empty strings that silently overwrites\n * whatever the shopper had typed. Both shapes are treated as \"not found\".\n */\nexport function createViaCepProvider(options?: { fetcher?: typeof fetch }): PostalLookupProvider {\n const fetcher = options?.fetcher ?? globalThis.fetch\n return {\n async lookup(postalCode: string): Promise<PostalAddress | null> {\n const code = normalizePostalCode(postalCode)\n if (code.length !== 8) return null\n\n const response = await fetcher(`https://viacep.com.br/ws/${code}/json/`)\n if (!response.ok) throw new Error(`Consulta de CEP falhou (${response.status})`)\n\n const data = (await response.json()) as ViaCepResponse\n if (data.erro === true || data.erro === 'true' || !data.localidade) return null\n\n return {\n postalCode: code,\n street: data.logradouro ?? '',\n district: data.bairro ?? '',\n city: data.localidade,\n state: (data.uf ?? '').toUpperCase(),\n country: 'BR',\n cityCode: data.ibge || undefined,\n }\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-level resolver — same shape as setShopTenantResolver /\n// setShopAccessTokenResolver, so an app overrides the source once at boot\n// instead of threading a provider through every component that needs a CEP.\n// ---------------------------------------------------------------------------\n\nlet _provider: PostalLookupProvider | null = null\n\nexport function setPostalLookupProvider(provider: PostalLookupProvider | null): void {\n _provider = provider\n}\n\nexport function getPostalLookupProvider(): PostalLookupProvider {\n if (!_provider) _provider = createViaCepProvider()\n return _provider\n}\n\n/**\n * Resolve a postal code to an address, through the cache.\n *\n * Returns null for a code that is malformed or does not exist; throws only when\n * the lookup itself failed (offline, provider down), so a caller can tell\n * \"no such CEP\" from \"we could not check right now\" and say the right thing.\n */\nexport async function lookupPostalCode(postalCode: string): Promise<PostalAddress | null> {\n const code = normalizePostalCode(postalCode)\n if (code.length !== 8) return null\n\n const cached = readCache(code)\n if (cached) return cached\n\n const address = await getPostalLookupProvider().lookup(code)\n if (address) writeCache(code, address)\n return address\n}\n","import { useEffect } from 'react'\n\n// ---------------------------------------------------------------------------\n// Generic, domain-agnostic SEO / structured-data head manager (SDK-level).\n// ANY surface (blog, booking, reviews, product, landing) uses `useSeo` to set\n// <title>, meta description, canonical, OpenGraph/Twitter cards and JSON-LD per\n// route. Domain plugins build their own schema.org objects (BlogPosting,\n// Product, Event…) and pass them via `jsonLd` — the mechanics live here once.\n//\n// NOTE: a SPA still benefits from SSR/prerendering for the strongest SEO — that\n// is the real upgrade; this covers everything achievable client-side.\n// ---------------------------------------------------------------------------\n\nconst MANAGED = 'data-fayz-seo'\n\nexport interface SeoConfig {\n title: string\n description?: string\n canonical?: string\n image?: string\n type?: 'website' | 'article' | (string & {})\n siteName?: string\n /** One or more JSON-LD objects injected as <script type=\"application/ld+json\">. */\n jsonLd?: Array<Record<string, unknown>>\n}\n\n/** Current page origin (empty during SSR). */\nexport function seoOrigin(): string {\n return typeof window !== 'undefined' ? window.location.origin : ''\n}\n\n/** Build an absolute URL from a path, using the current origin. */\nexport function absoluteUrl(path: string): string {\n return `${seoOrigin()}${path.startsWith('/') ? path : `/${path}`}`\n}\n\nfunction upsertMeta(attr: 'name' | 'property', key: string, content: string) {\n if (!content) return\n let el = document.head.querySelector<HTMLMetaElement>(`meta[${attr}=\"${key}\"]`)\n if (!el) {\n el = document.createElement('meta')\n el.setAttribute(attr, key)\n el.setAttribute(MANAGED, '')\n document.head.appendChild(el)\n }\n el.setAttribute('content', content)\n}\n\nfunction upsertLink(rel: string, href: string) {\n if (!href) return\n let el = document.head.querySelector<HTMLLinkElement>(`link[rel=\"${rel}\"]`)\n if (!el) {\n el = document.createElement('link')\n el.setAttribute('rel', rel)\n el.setAttribute(MANAGED, '')\n document.head.appendChild(el)\n }\n el.setAttribute('href', href)\n}\n\nfunction clearManaged() {\n document.head.querySelectorAll(`[${MANAGED}]`).forEach((el) => el.remove())\n}\n\n// --- The descriptor: one definition of \"what tags does this page need\" ------\n//\n// Computed purely, with no DOM. `applySeo` writes it into a live document;\n// a server renderer hands the same descriptor to its framework's head API.\n// Keeping the computation here is what stops client and server SEO drifting.\n\nexport interface SeoMetaTag {\n name?: string\n property?: string\n content: string\n}\n\nexport interface SeoLinkTag {\n rel: string\n href: string\n}\n\nexport interface SeoTags {\n title: string\n meta: SeoMetaTag[]\n links: SeoLinkTag[]\n jsonLd: Array<Record<string, unknown>>\n}\n\n/** Pure: turn an SeoConfig into the exact tag set a page should carry. */\nexport function buildSeoTags(config: SeoConfig): SeoTags {\n const description = config.description ?? ''\n const meta: SeoMetaTag[] = [\n { name: 'description', content: description },\n { property: 'og:title', content: config.title },\n { property: 'og:description', content: description },\n { property: 'og:type', content: config.type ?? 'website' },\n { name: 'twitter:card', content: config.image ? 'summary_large_image' : 'summary' },\n { name: 'twitter:title', content: config.title },\n { name: 'twitter:description', content: description },\n ]\n if (config.canonical) meta.push({ property: 'og:url', content: config.canonical })\n if (config.image) {\n meta.push({ property: 'og:image', content: config.image })\n meta.push({ name: 'twitter:image', content: config.image })\n }\n if (config.siteName) meta.push({ property: 'og:site_name', content: config.siteName })\n\n return {\n title: config.title,\n meta: meta.filter((m) => m.content !== ''),\n links: config.canonical ? [{ rel: 'canonical', href: config.canonical }] : [],\n jsonLd: config.jsonLd ?? [],\n }\n}\n\n/** Imperatively apply SEO tags (used by useSeo; exported for non-React callers). */\nexport function applySeo(config: SeoConfig): void {\n if (typeof document === 'undefined') return\n const tags = buildSeoTags(config)\n clearManaged()\n document.title = tags.title\n for (const tag of tags.meta) {\n if (tag.name) upsertMeta('name', tag.name, tag.content)\n else if (tag.property) upsertMeta('property', tag.property, tag.content)\n }\n for (const link of tags.links) upsertLink(link.rel, link.href)\n\n for (const obj of tags.jsonLd) {\n const script = document.createElement('script')\n script.type = 'application/ld+json'\n script.setAttribute(MANAGED, '')\n script.text = JSON.stringify(obj)\n document.head.appendChild(script)\n }\n}\n\n/** Apply SEO head tags for the current route; cleans up on unmount. */\nexport function useSeo(config: SeoConfig): void {\n const key = JSON.stringify(config)\n useEffect(() => {\n applySeo(config)\n return () => clearManaged()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key])\n}\n\n// --- Generic schema.org builders (reusable across plugins) -----------------\n\nexport interface BreadcrumbItem {\n name: string\n url: string\n}\n\n/** schema.org BreadcrumbList from an ordered list of crumbs. */\nexport function breadcrumbJsonLd(items: BreadcrumbItem[]): Record<string, unknown> {\n return {\n '@context': 'https://schema.org',\n '@type': 'BreadcrumbList',\n itemListElement: items.map((c, i) => ({\n '@type': 'ListItem',\n position: i + 1,\n name: c.name,\n item: c.url,\n })),\n }\n}\n\n/** schema.org Organization publisher block. */\nexport function organizationJsonLd(name: string, extra?: Record<string, unknown>): Record<string, unknown> {\n return { '@type': 'Organization', name, ...extra }\n}\n","import { getCurrentLocale } from '../i18n'\n\n// Currency inferred from the active locale unless the app sets one explicitly\n// via createSaasApp({ locale: { currency: 'BRL' } }).\nconst CURRENCY_BY_LOCALE: Record<string, string> = {\n 'pt-BR': 'BRL',\n 'pt-PT': 'EUR',\n en: 'USD',\n 'en-US': 'USD',\n 'en-GB': 'GBP',\n es: 'EUR',\n}\n\nlet _defaultCurrency: string | null = null\n\nexport function setDefaultCurrency(code: string | undefined): void {\n _defaultCurrency = code ?? null\n}\n\nexport function getActiveLocale(): string {\n try {\n return getCurrentLocale() || 'en'\n } catch {\n return 'en'\n }\n}\n\nexport function getDefaultCurrency(): string {\n if (_defaultCurrency) return _defaultCurrency\n return CURRENCY_BY_LOCALE[getActiveLocale()] ?? 'USD'\n}\n\nexport function formatCurrency(value: unknown, currency?: string): string {\n const num = typeof value === 'number' ? value : parseFloat(String(value))\n if (isNaN(num)) return String(value ?? '')\n return new Intl.NumberFormat(getActiveLocale(), {\n style: 'currency',\n currency: currency ?? getDefaultCurrency(),\n }).format(num)\n}\n\nexport function formatDate(value: unknown): string {\n if (!value) return ''\n try {\n return new Intl.DateTimeFormat(getActiveLocale(), { dateStyle: 'medium' }).format(new Date(value as string))\n } catch {\n return String(value)\n }\n}\n\nexport function formatDateTime(value: unknown): string {\n if (!value) return ''\n try {\n return new Intl.DateTimeFormat(getActiveLocale(), { dateStyle: 'medium', timeStyle: 'short' }).format(new Date(value as string))\n } catch {\n return String(value)\n }\n}\n","/** Column descriptor for generic CSV export */\nexport interface CSVColumn {\n key: string\n label: string\n format?: (value: any, row: Record<string, any>) => string\n}\n\nexport function escapeCSVField(value: unknown): string {\n if (value == null) return ''\n const str = String(value)\n if (str.includes(',') || str.includes('\"') || str.includes('\\n')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`\n }\n return str\n}\n\n/** Build a CSV string from columns + rows. Each cell runs through `column.format` if provided, then escaping. */\nexport function buildCSV(\n columns: CSVColumn[],\n rows: Record<string, any>[],\n): string {\n const header = columns.map((c) => escapeCSVField(c.label)).join(',')\n const body = rows.map((row) =>\n columns\n .map((col) => {\n const raw = row[col.key]\n const formatted = col.format ? col.format(raw, row) : raw\n return escapeCSVField(formatted)\n })\n .join(','),\n )\n return [header, ...body].join('\\n')\n}\n\n/** Trigger a CSV file download in the browser. */\nexport function downloadCSV(csv: string, filename: string): void {\n const bom = '\\uFEFF'\n const blob = new Blob([bom + csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename.endsWith('.csv') ? filename : `${filename}.csv`\n a.click()\n URL.revokeObjectURL(url)\n}\n\n/** Convenience: build + download in one call. */\nexport function exportCSV(\n columns: CSVColumn[],\n rows: Record<string, any>[],\n filename: string,\n): void {\n downloadCSV(buildCSV(columns, rows), filename)\n}\n","// Text folding + ranking for global search. The same folding must exist in SQL\n// as public.fayz_norm() (@fayz-ai/db 018_global_search.sql), or server and\n// client disagree on what matched.\n\nconst COMBINING_MARKS = /[\\u0300-\\u036f]/g\n\n/** Strip diacritics, lowercase, collapse non-alphanumerics to single spaces. */\nexport function foldText(value: unknown): string {\n if (typeof value !== 'string' || value === '') return ''\n return value\n .normalize('NFD')\n .replace(COMBINING_MARKS, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, ' ')\n .trim()\n}\n\n/** Fold, keeping each folded char's index in the source — used for highlighting. */\nexport function foldWithMap(value: string): { folded: string; map: number[] } {\n const out: string[] = []\n const map: number[] = []\n let pendingSpace = false\n for (let i = 0; i < value.length; i++) {\n const ch = value[i]!\n const folded = ch.normalize('NFD').replace(COMBINING_MARKS, '').toLowerCase()\n for (const f of folded) {\n const alnum = (f >= 'a' && f <= 'z') || (f >= '0' && f <= '9')\n if (!alnum) { pendingSpace = out.length > 0; continue }\n if (pendingSpace) { out.push(' '); map.push(i); pendingSpace = false }\n out.push(f)\n map.push(i)\n }\n }\n return { folded: out.join(''), map }\n}\n\n/** Digits only — phone numbers, CPF/CNPJ, SKUs typed with separators. */\nexport function digitsOf(value: unknown): string {\n return typeof value === 'string' ? value.replace(/\\D+/g, '') : ''\n}\n\nexport interface NormalizedQuery {\n /** What the user typed, untouched. */\n raw: string\n /** Folded form of the whole query — the \"phrase\". */\n folded: string\n /** Folded query split on whitespace. */\n tokens: string[]\n /** Digits the user typed, when they typed enough of them to mean a number. */\n digits: string\n /** The longest token — the most selective thing to send to a `%LIKE%` backend. */\n anchor: string\n}\n\n/** Below this a phone/document lookup is indistinguishable from noise. */\nconst MIN_DIGIT_QUERY = 4\n\nexport function normalizeQuery(raw: string): NormalizedQuery {\n const folded = foldText(raw)\n const tokens = folded ? folded.split(' ').filter(Boolean) : []\n const digits = raw.replace(/\\D+/g, '')\n let anchor = ''\n for (const token of tokens) if (token.length > anchor.length) anchor = token\n return {\n raw,\n folded,\n tokens,\n digits: digits.length >= MIN_DIGIT_QUERY ? digits : '',\n anchor,\n }\n}\n\n// Fuzzy similarity — Sørensen–Dice over bigrams. Same family as pg_trgm's\n// similarity(), so both sides rank near-misses the same way.\n\nfunction bigrams(value: string): string[] {\n if (value.length < 2) return value ? [value] : []\n const out: string[] = []\n for (let i = 0; i < value.length - 1; i++) out.push(value.slice(i, i + 2))\n return out\n}\n\n/** 0 (nothing in common) … 1 (identical). Both inputs must already be folded. */\nexport function similarity(a: string, b: string): number {\n if (!a || !b) return 0\n if (a === b) return 1\n const left = bigrams(a)\n const right = bigrams(b)\n if (left.length === 0 || right.length === 0) return 0\n const pool = new Map<string, number>()\n for (const g of left) pool.set(g, (pool.get(g) ?? 0) + 1)\n let shared = 0\n for (const g of right) {\n const count = pool.get(g)\n if (count) { shared++; pool.set(g, count - 1) }\n }\n return (2 * shared) / (left.length + right.length)\n}\n\n/** Best similarity between the query token and any single word of the text. */\nfunction wordSimilarity(text: string, token: string): number {\n let best = similarity(text, token)\n for (const word of text.split(' ')) {\n if (!word) continue\n const s = similarity(word, token)\n if (s > best) best = s\n }\n return best\n}\n\n// ---------------------------------------------------------------------------\n// Ranking\n// ---------------------------------------------------------------------------\n\nexport interface RankCandidate {\n /** Folded display name — what the user is most likely aiming at. */\n title: string\n /** Folded concatenation of every searchable value on the record. */\n haystack: string\n /** Digits of every phone/document-ish value on the record. */\n digits?: string\n}\n\n/** A fuzzy word has to be at least this close before it counts as a match. */\nconst FUZZY_FLOOR = 0.62\n\n/** Score a candidate 0…1. Zero means \"not a match\" — the score is also the filter. */\nexport function scoreCandidate(query: NormalizedQuery, candidate: RankCandidate): number {\n const { folded, tokens } = query\n if (!folded || tokens.length === 0) return 0\n const title = candidate.title\n const haystack = candidate.haystack || title\n\n // Phrase: the query as one string.\n let phrase = 0\n if (title === folded) phrase = 1\n else if (title.startsWith(folded)) phrase = 0.94\n else if (title.includes(' ' + folded)) phrase = 0.88\n else if (title.includes(folded)) phrase = 0.76\n else if (haystack.startsWith(folded) || haystack.includes(' ' + folded)) phrase = 0.7\n else if (haystack.includes(folded)) phrase = 0.62\n\n // Tokens: every word must land somewhere (\"maria silva\" → \"Maria da Silva\").\n let tokenTotal = 0\n let fuzzyUsed = false\n for (const token of tokens) {\n let best = 0\n if (title.startsWith(token)) best = 0.95\n else if (title.includes(' ' + token)) best = 0.85\n else if (title.includes(token)) best = 0.7\n else if (haystack.startsWith(token) || haystack.includes(' ' + token)) best = 0.6\n else if (haystack.includes(token)) best = 0.5\n else {\n const sim = wordSimilarity(title, token)\n if (sim >= FUZZY_FLOOR) { best = 0.45 * sim; fuzzyUsed = true }\n }\n if (best === 0) return phrase > 0 ? phrase : 0\n tokenTotal += best\n }\n let tokenScore = tokenTotal / tokens.length\n // A typo-only match must never outrank a literal one.\n if (fuzzyUsed) tokenScore *= 0.8\n\n let score = Math.max(phrase, tokenScore)\n\n // Digits: a phone number has no words to match.\n if (query.digits && candidate.digits && candidate.digits.includes(query.digits)) {\n score = Math.max(score, 0.72 + Math.min(0.2, query.digits.length / 50))\n }\n\n if (score === 0) return 0\n\n // Tie-break: shorter title wins (\"Ana\" over \"Ana Beatriz\" for \"ana\").\n const brevity = 1 / (1 + Math.max(0, title.length - folded.length) / 40)\n return score * 0.97 + brevity * 0.03\n}\n\n/** Ranges in the ORIGINAL text covered by the query, merged and sorted. */\nexport function highlightRanges(text: string, query: NormalizedQuery): Array<[number, number]> {\n if (!text || query.tokens.length === 0) return []\n const { folded, map } = foldWithMap(text)\n if (!folded) return []\n const spans: Array<[number, number]> = []\n const needles = query.tokens.length > 1 ? [query.folded, ...query.tokens] : [query.folded]\n for (const needle of needles) {\n if (!needle) continue\n let from = 0\n for (;;) {\n const at = folded.indexOf(needle, from)\n if (at === -1) break\n const start = map[at]\n const endChar = map[at + needle.length - 1]\n if (start !== undefined && endChar !== undefined) spans.push([start, endChar + 1])\n from = at + needle.length\n }\n }\n if (spans.length === 0) return []\n spans.sort((a, b) => a[0] - b[0])\n const merged: Array<[number, number]> = [spans[0]!]\n for (const span of spans.slice(1)) {\n const last = merged[merged.length - 1]!\n if (span[0] <= last[1]) last[1] = Math.max(last[1], span[1])\n else merged.push(span)\n }\n return merged\n}\n","import type { EntityDef } from '../types/crud'\nimport { resolveDataProvider } from '../data/resolve'\nimport { getSupabaseClientOptional } from '../data/supabase'\nimport { DATA_CHANGED_EVENT } from '../data/refresh'\nimport { eventBus } from '../events'\nimport { getActiveTenantId } from '../lib/tenant'\nimport {\n digitsOf,\n foldText,\n normalizeQuery,\n scoreCandidate,\n type NormalizedQuery,\n} from './text'\nimport type {\n GlobalSearchResult,\n SearchGroup,\n SearchHit,\n SearchOptions,\n SearchPath,\n SearchTarget,\n} from './types'\n\n// Global search, two paths, one ranking:\n// ① INDEX — one `public.fayz_global_search` RPC (trigram-indexed, ~6ms).\n// ② SCAN — parallel ilike per entity. Fallback for pools without the\n// migration, for mock data, and whenever ① errors.\n// Both feed the same scorer, so the path changes latency, never the order.\n\n/** Nothing shorter is worth a round-trip. */\nexport const MIN_QUERY_LENGTH = 2\n\nconst DEFAULT_LIMIT = 30\nconst DEFAULT_PER_TARGET = 5\n/** Wide enough that a typical app fits in one wave — a second wave waits on\n * the slowest table of the first. */\nconst SCAN_CONCURRENCY = 16\n/** A single slow table must not hold the box hostage. */\nconst TARGET_TIMEOUT_MS = 3000\nconst CACHE_TTL_MS = 30_000\nconst CACHE_MAX_ENTRIES = 40\n\nconst RPC_NAME = 'fayz_global_search'\n\n/** null = never asked. Set false once Postgres says the RPC is missing. */\nlet indexAvailable: boolean | null = null\n\n/** Test seam / manual override. */\nexport function setSearchIndexAvailable(value: boolean | null): void {\n indexAvailable = value\n}\n\nexport function isSearchIndexAvailable(): boolean | null {\n return indexAvailable\n}\n\n// Rows come back camelCase, EntityDefs declare both spellings — look up either.\n\nfunction camelOf(key: string): string {\n return key.replace(/_([a-z0-9])/g, (_, c: string) => c.toUpperCase())\n}\n\nfunction snakeOf(key: string): string {\n return key.replace(/[A-Z]/g, (c) => '_' + c.toLowerCase())\n}\n\nfunction readField(row: Record<string, unknown>, key: string): unknown {\n if (key in row) return row[key]\n const camel = camelOf(key)\n if (camel in row) return row[camel]\n const snake = snakeOf(key)\n if (snake in row) return row[snake]\n return undefined\n}\n\nfunction asText(value: unknown): string {\n if (typeof value === 'string') return value\n if (typeof value === 'number') return String(value)\n if (Array.isArray(value)) return value.filter((v) => typeof v === 'string').join(' ')\n return ''\n}\n\n/** Field keys worth matching against, in declaration order. */\nfunction searchableKeys(entity: EntityDef): string[] {\n const declared = entity.data?.searchColumns ?? entity.fields.filter((f) => f.searchable).map((f) => f.key)\n const keys = [...declared]\n const display = entity.displayField ?? 'name'\n if (!keys.includes(display)) keys.unshift(display)\n const subtitle = entity.subtitleField\n if (subtitle && !keys.includes(subtitle)) keys.push(subtitle)\n return keys\n}\n\n/** Keys whose value is a number the user might type digits of. */\nconst DIGIT_FIELD_TYPES = new Set(['phone', 'number'])\n\nfunction digitKeys(entity: EntityDef): string[] {\n const keys = entity.fields\n .filter((f) => DIGIT_FIELD_TYPES.has(f.type) || /phone|document|cpf|cnpj|zip|postal|sku|code|reference/i.test(f.key))\n .map((f) => f.key)\n for (const extra of ['phone', 'document_number', 'sku', 'reference_number', 'postal_code']) {\n if (!keys.includes(extra)) keys.push(extra)\n }\n return keys\n}\n\nfunction titleOf(entity: EntityDef, row: Record<string, unknown>): string {\n const display = entity.displayField ?? 'name'\n const primary = asText(readField(row, display))\n if (primary) return primary\n for (const field of entity.fields) {\n if (field.type === 'text' || field.type === 'email') {\n const value = asText(readField(row, field.key))\n if (value) return value\n }\n }\n return asText(row.id) || '—'\n}\n\nfunction subtitleOf(entity: EntityDef, row: Record<string, unknown>, title: string): string | undefined {\n // A subtitle that repeats the title is noise.\n const distinct = (value: string): string | undefined => {\n if (!value || foldText(value) === foldText(title)) return undefined\n return value.length > 90 ? value.slice(0, 89) + '…' : value\n }\n const declared = entity.subtitleField\n if (declared) {\n const value = distinct(asText(readField(row, declared)))\n if (value) return value\n }\n for (const key of ['email', 'phone', 'sku', 'reference_number', 'document_number', 'description']) {\n const value = distinct(asText(readField(row, key)))\n if (value) return value\n }\n return undefined\n}\n\n// ---------------------------------------------------------------------------\n// Result assembly\n// ---------------------------------------------------------------------------\n\nfunction hitFromRow(\n target: SearchTarget,\n row: Record<string, unknown>,\n query: NormalizedQuery,\n): SearchHit | null {\n const id = asText(row.id)\n if (!id) return null\n const entity = target.entity\n const title = titleOf(entity, row)\n const parts: string[] = [title]\n for (const key of searchableKeys(entity)) {\n const value = asText(readField(row, key))\n if (value) parts.push(value)\n }\n let digits = ''\n for (const key of digitKeys(entity)) {\n const value = readField(row, key)\n if (typeof value === 'string' || typeof value === 'number') digits += digitsOf(String(value))\n }\n const score = scoreCandidate(query, {\n title: foldText(title),\n haystack: foldText(parts.join(' ')),\n digits,\n })\n if (score === 0) return null\n return {\n uid: `${target.key}:${id}`,\n id,\n key: target.key,\n group: target.label,\n icon: target.icon ?? entity.icon,\n title,\n subtitle: subtitleOf(entity, row, title),\n score: score * (target.boost ?? 1),\n archetype: entity.data?.archetype,\n archetypeKind: entity.data?.archetypeKind,\n table: entity.data?.table,\n record: row,\n }\n}\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\n/** Identity of the RECORD, not of the target that found it — several targets\n * cover the same rows (\"Fornecedores\" and \"Suppliers\" are both people). */\nfunction recordIdentity(hit: SearchHit): string {\n if (UUID.test(hit.id)) return hit.id\n return `${hit.table ?? hit.key}#${hit.id}`\n}\n\nfunction assemble(\n query: string,\n hits: SearchHit[],\n targets: SearchTarget[],\n opts: { via: SearchPath; failed: string[]; elapsedMs: number; perTarget: number; limit: number; partial?: boolean },\n): GlobalSearchResult {\n const seen = new Set<string>()\n const unique: SearchHit[] = []\n for (const hit of hits.slice().sort((a, b) => b.score - a.score || a.title.localeCompare(b.title))) {\n const identity = recordIdentity(hit)\n if (seen.has(identity)) continue\n seen.add(identity)\n unique.push(hit)\n }\n\n // Cap per target before the global cap, so one populous entity can't crowd out the rest.\n const byKey = new Map<string, SearchHit[]>()\n const kept: SearchHit[] = []\n const capped = new Set<string>()\n for (const hit of unique) {\n const bucket = byKey.get(hit.key) ?? []\n if (bucket.length >= opts.perTarget) { capped.add(hit.key); continue }\n bucket.push(hit)\n byKey.set(hit.key, bucket)\n kept.push(hit)\n }\n const limited = kept.slice(0, opts.limit)\n\n const order = new Map(targets.map((t, i) => [t.key, i]))\n const groups: SearchGroup[] = []\n for (const hit of limited) {\n let group = groups.find((g) => g.key === hit.key)\n if (!group) {\n group = { key: hit.key, label: hit.group, icon: hit.icon, hits: [], hasMore: capped.has(hit.key) }\n groups.push(group)\n }\n group.hits.push(hit)\n }\n // Groups follow their best hit; ties fall back to target order.\n groups.sort((a, b) => (b.hits[0]?.score ?? 0) - (a.hits[0]?.score ?? 0)\n || (order.get(a.key) ?? 99) - (order.get(b.key) ?? 99))\n\n return {\n query,\n hits: limited,\n groups,\n via: opts.via,\n failed: opts.failed,\n elapsedMs: opts.elapsedMs,\n partial: opts.partial ?? false,\n }\n}\n\n// Cache: exact hits plus prefix reuse. Substring matching is monotone, so an\n// untruncated result for \"bigod\" is a sound superset for \"bigodi\" and can be\n// re-scored locally while the real request flies.\n\ninterface CacheEntry {\n scope: string\n folded: string\n at: number\n complete: boolean\n hits: SearchHit[]\n}\n\nconst cache: CacheEntry[] = []\n\nfunction scopeKey(targets: SearchTarget[]): string {\n return `${getActiveTenantId() ?? '_'}|${targets.map((t) => t.key).sort().join(',')}`\n}\n\nfunction cacheGet(scope: string, folded: string): CacheEntry | undefined {\n const now = Date.now()\n return cache.find((e) => e.scope === scope && e.folded === folded && now - e.at < CACHE_TTL_MS)\n}\n\nfunction cachePrefix(scope: string, folded: string): CacheEntry | undefined {\n const now = Date.now()\n let best: CacheEntry | undefined\n for (const entry of cache) {\n if (entry.scope !== scope || !entry.complete) continue\n if (now - entry.at >= CACHE_TTL_MS) continue\n if (!folded.startsWith(entry.folded)) continue\n if (!best || entry.folded.length > best.folded.length) best = entry\n }\n return best\n}\n\nfunction cacheSet(entry: CacheEntry): void {\n const at = cache.findIndex((e) => e.scope === entry.scope && e.folded === entry.folded)\n if (at >= 0) cache.splice(at, 1)\n cache.unshift(entry)\n if (cache.length > CACHE_MAX_ENTRIES) cache.length = CACHE_MAX_ENTRIES\n}\n\n/** Drop every cached answer. Call on tenant switch and after writes. */\nexport function clearSearchCache(): void {\n cache.length = 0\n}\n\n// The engine owns this cache, so the engine subscribes — asking every writer to\n// remember `clearSearchCache()` is how it ended up called from nowhere at all,\n// leaving global search (and the assistant's findAnything, which rides on it)\n// answering \"não encontrei\" about a record written seconds earlier.\neventBus.on(DATA_CHANGED_EVENT, clearSearchCache)\n\n// Path ① — the server index\n\ninterface IndexRow {\n entity_key: string\n record_id: string\n title: string | null\n subtitle: string | null\n score: number | null\n}\n\nfunction isMissingFunction(error: { code?: string; message?: string } | null): boolean {\n if (!error) return false\n // PGRST202: PostgREST could not find the function in its schema cache.\n if (error.code === 'PGRST202') return true\n const message = (error.message ?? '').toLowerCase()\n return message.includes(RPC_NAME) && (message.includes('does not exist') || message.includes('not find'))\n}\n\nasync function searchViaIndex(\n query: NormalizedQuery,\n targets: SearchTarget[],\n perTarget: number,\n limit: number,\n): Promise<{ hits: SearchHit[]; ok: boolean }> {\n const client = getSupabaseClientOptional() as {\n rpc: (fn: string, args: Record<string, unknown>) => Promise<{ data: unknown; error: { code?: string; message?: string } | null }>\n } | null\n const tenantId = getActiveTenantId()\n if (!client || !tenantId) return { hits: [], ok: false }\n\n const byKey = new Map(targets.map((t) => [t.key, t]))\n const { data, error } = await client.rpc(RPC_NAME, {\n p_query: query.raw,\n p_tenant_id: tenantId,\n p_entity_keys: targets.map((t) => t.key),\n p_per_source: perTarget * 3,\n p_limit: limit * 3,\n })\n\n if (error) {\n if (isMissingFunction(error)) {\n indexAvailable = false\n return { hits: [], ok: false }\n }\n throw error\n }\n indexAvailable = true\n\n const rows = Array.isArray(data) ? (data as IndexRow[]) : []\n const hits: SearchHit[] = []\n for (const row of rows) {\n const target = byKey.get(row.entity_key)\n if (!target || !row.record_id) continue\n const title = row.title ?? ''\n // Re-score locally so both paths obey one ordering law.\n const local = scoreCandidate(query, {\n title: foldText(title),\n haystack: foldText(`${title} ${row.subtitle ?? ''}`),\n digits: digitsOf(row.subtitle ?? '') + digitsOf(title),\n })\n // The server matched on columns the client never sees (notes, tags). Keep\n // those, ranked under everything the local scorer can explain.\n const score = local > 0 ? local : Math.min(0.55, (row.score ?? 0.4))\n hits.push({\n uid: `${target.key}:${row.record_id}`,\n id: row.record_id,\n key: target.key,\n group: target.label,\n icon: target.icon ?? target.entity.icon,\n title: title || '—',\n subtitle: row.subtitle ?? undefined,\n score: score * (target.boost ?? 1),\n archetype: target.entity.data?.archetype,\n archetypeKind: target.entity.data?.archetypeKind,\n table: target.entity.data?.table,\n })\n }\n return { hits, ok: true }\n}\n\n// Path ② — bounded per-entity scan\n\nasync function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error('search target timed out')), ms)\n }),\n ])\n } finally {\n if (timer) clearTimeout(timer)\n }\n}\n\nasync function mapLimited<T, R>(\n items: T[],\n limit: number,\n fn: (item: T) => Promise<R>,\n): Promise<Array<{ ok: true; value: R } | { ok: false; item: T }>> {\n const results: Array<{ ok: true; value: R } | { ok: false; item: T }> = new Array(items.length)\n let cursor = 0\n const workers = Array.from({ length: Math.min(limit, items.length) }, async () => {\n for (;;) {\n const index = cursor++\n if (index >= items.length) return\n const item = items[index]!\n try {\n results[index] = { ok: true, value: await fn(item) }\n } catch {\n results[index] = { ok: false, item }\n }\n }\n })\n await Promise.all(workers)\n return results\n}\n\nasync function searchViaScan(\n query: NormalizedQuery,\n targets: SearchTarget[],\n perTarget: number,\n onProgress?: (hits: SearchHit[]) => void,\n): Promise<{ hits: SearchHit[]; failed: string[] }> {\n // Two rounds, same shape as the SQL function. Round 1 sends the whole phrase\n // (selective, answers the common case). Round 2 sends the longest token —\n // the only form that finds \"Maria da Silva\" for \"maria silva\" — and runs\n // only if round 1 found nothing anywhere: an unindexed `%cli%` is expensive,\n // and firing it per miss made multi-word queries 9.8s instead of 0.8s.\n const multiWord = query.tokens.length > 1\n const phrase = query.folded\n const token = query.anchor.length >= MIN_QUERY_LENGTH ? query.anchor : phrase\n const pageSize = Math.min(perTarget * 3, 24)\n const widePageSize = Math.min(perTarget * 6, 40)\n\n const searchable = targets.filter((t) => searchableKeys(t.entity).length > 0)\n\n // Emit as each target lands, so the box fills instead of spinning until the\n // slowest entity reports.\n const running: SearchHit[] = []\n\n const round = (search: string, size: number) =>\n mapLimited(searchable, SCAN_CONCURRENCY, async (target) => {\n const provider = resolveDataProvider(target.entity as EntityDef<{ id: string }>, target.mockData)\n // No count: the aggregate costs more than the rows, times every entity.\n const result = await withTimeout(\n provider.list({ search, pageSize: size, countMode: 'none' }),\n TARGET_TIMEOUT_MS,\n )\n const rows = result.data as unknown as Array<Record<string, unknown>>\n // Post-scoring also guards providers that ignore `search` entirely.\n const hits = rows.map((row) => hitFromRow(target, row, query)).filter((h): h is SearchHit => h !== null)\n if (hits.length && onProgress) {\n running.push(...hits)\n onProgress(running.slice())\n }\n return { target, hits }\n })\n\n const collect = (settled: Awaited<ReturnType<typeof round>>) => {\n const hits: SearchHit[] = []\n const failed: string[] = []\n for (const outcome of settled) {\n if (outcome.ok) hits.push(...outcome.value.hits)\n else failed.push(outcome.item.key)\n }\n return { hits, failed }\n }\n\n const first = collect(await round(phrase, pageSize))\n if (first.hits.length > 0 || !multiWord || token === phrase) return first\n\n const second = collect(await round(token, widePageSize))\n return { hits: second.hits, failed: [...new Set([...first.failed, ...second.failed])] }\n}\n\n/** Search every target at once. Never throws for data reasons — a target that\n * errors lands in `failed` and the rest of the answer still ships. */\nexport async function searchEverything(\n rawQuery: string,\n options: SearchOptions,\n): Promise<GlobalSearchResult> {\n const started = Date.now()\n const query = normalizeQuery(rawQuery)\n const targets = options.targets\n const limit = options.limit ?? DEFAULT_LIMIT\n const perTarget = options.perTarget ?? DEFAULT_PER_TARGET\n const empty = (via: SearchPath): GlobalSearchResult =>\n assemble(rawQuery, [], targets, { via, failed: [], elapsedMs: Date.now() - started, perTarget, limit })\n\n if (query.folded.length < MIN_QUERY_LENGTH || targets.length === 0) return empty('cache')\n\n const scope = scopeKey(targets)\n const exact = cacheGet(scope, query.folded)\n if (exact) {\n return assemble(rawQuery, exact.hits, targets, {\n via: 'cache', failed: [], elapsedMs: Date.now() - started, perTarget, limit,\n })\n }\n\n // Paint from the widest complete prefix result while the real one flies.\n if (options.onPartial) {\n const prefix = cachePrefix(scope, query.folded)\n if (prefix) {\n const rescored = prefix.hits\n .map((hit) => {\n const score = scoreCandidate(query, {\n title: foldText(hit.title),\n haystack: foldText(`${hit.title} ${hit.subtitle ?? ''}`),\n digits: digitsOf(hit.subtitle ?? ''),\n })\n return score > 0 ? { ...hit, score } : null\n })\n .filter((h): h is SearchHit => h !== null)\n options.onPartial(assemble(rawQuery, rescored, targets, {\n via: 'cache', failed: [], elapsedMs: Date.now() - started, perTarget, limit, partial: true,\n }))\n }\n }\n\n let hits: SearchHit[] = []\n let failed: string[] = []\n let via: SearchPath = 'scan'\n\n if (!options.forceScan && indexAvailable !== false) {\n try {\n const indexed = await searchViaIndex(query, targets, perTarget, limit)\n if (indexed.ok) {\n hits = indexed.hits\n via = 'index'\n }\n } catch {\n // One bad query is no reason to abandon a live index — scan just this once.\n }\n }\n\n if (via !== 'index') {\n const emit = options.onPartial\n const scanned = await searchViaScan(query, targets, perTarget, emit\n ? (running) => emit(assemble(rawQuery, running, targets, {\n via: 'scan', failed: [], elapsedMs: Date.now() - started, perTarget, limit, partial: true,\n }))\n : undefined)\n hits = scanned.hits\n failed = scanned.failed\n }\n\n if (options.signal?.aborted) return empty(via)\n\n const result = assemble(rawQuery, hits, targets, {\n via, failed, elapsedMs: Date.now() - started, perTarget, limit,\n })\n cacheSet({\n scope,\n folded: query.folded,\n at: Date.now(),\n // Only an uncapped answer is a sound superset for longer queries.\n complete: failed.length === 0 && !result.groups.some((g) => g.hasMore),\n hits,\n })\n return result\n}\n","import * as React from 'react'\nimport { getBlock } from './index'\nimport type { BlockDataNeeds } from './index'\nimport { checkNodePlacement } from './block-constraints'\n\n// Block tree — the universal page primitive. A page is an ordered tree of typed\n// blocks resolved against the block registry, so it is pure data.\n//\n// I7 at runtime: a block that throws or is illegally placed renders NOTHING for\n// shoppers and an error card in dev/admin — WooCommerce's checkout-slot pattern,\n// whose renderError is literally `CURRENT_USER_IS_ADMIN ? onError : () => null`.\n// A third-party block must never white-screen the page it was dropped into.\n\nexport interface BlockNode {\n /** Registered block id, e.g. 'hero', 'products', 'kpi-grid', 'custom:foo'. */\n type: string\n /** Stable id for keys / editing; optional. */\n id?: string\n props?: Record<string, unknown>\n children?: BlockNode[]\n /**\n * Instance-level data needs, same shape as the block meta's `data`\n * declaration. Merged over the meta declaration by need name — how a\n * document rebinds a loader param (e.g. to a route param) without a new\n * block type. Resolved by the page-level resolver, never by the block.\n */\n data?: BlockDataNeeds\n}\n\n/** A block component receives its declared props plus the raw node (so a block\n * can render its own children via <BlockChildren>). */\nexport type BlockComponentProps = Record<string, unknown> & {\n node?: BlockNode\n children?: React.ReactNode\n}\n\n// --- Error visibility ---------------------------------------------------------\n\nexport type BlockErrorVisibility = 'visible' | 'silent'\n\n// Core ships no node types; this is only here so the NODE_ENV probe below\n// typechecks. Bundlers (Vite included, for deps too) statically replace the\n// `process.env.NODE_ENV` expression, so the identifier never survives to a\n// browser; the try/catch covers any runtime where it does and is undefined.\ndeclare const process: { env: Record<string, string | undefined> }\n\nlet errorVisibility: BlockErrorVisibility | null = null\n\nfunction defaultVisibility(): BlockErrorVisibility {\n // Vite statically replaces process.env.NODE_ENV in app builds; in node it is\n // just read. The guard covers exotic runtimes where `process` is absent.\n try {\n return process.env.NODE_ENV !== 'production' ? 'visible' : 'silent'\n } catch {\n return 'silent'\n }\n}\n\n/**\n * Who sees block failures. 'visible' renders an error card in place of a\n * broken/misplaced block (dev, admin, the visual editor); 'silent' renders\n * nothing there (shoppers). Defaults to 'visible' outside production builds.\n * Pass null to restore the default.\n */\nexport function setBlockErrorVisibility(visibility: BlockErrorVisibility | null): void {\n errorVisibility = visibility\n}\n\n// --- Block identity in the DOM ------------------------------------------------\n//\n// Clicking the page must say which part of the document made it, so the DOM\n// carries the document path back. (A CSS selector built from classList is the\n// alternative; under Tailwind it is dozens of utilities, non-unique and\n// unstable across any restyle.)\n//\n// The stamp is a WRAPPER rather than an attribute each block spreads: blocks\n// receive settings destructured and do not take `node`, so spreading would mean\n// 19 signature changes plus every block written later, including ones in a\n// store's own repo. `display: contents` makes the wrapper safe — it generates\n// no box, so a block inside a grid still lays out as a direct child. The cost is\n// that the wrapper has no rect; a picker highlights its first element child.\n//\n// Off by default: a shopper's page gets no wrapper and no extra node.\n\nlet editorMode = false\n\n/** Whether renders stamp each block with its document path. Editor only. */\nexport function setBlockEditorMode(enabled: boolean): void {\n editorMode = enabled\n}\n\nexport function blockEditorMode(): boolean {\n return editorMode\n}\n\n/** The attribute a picker walks the DOM looking for. */\nexport const BLOCK_PATH_ATTRIBUTE = 'data-fayz-block'\nexport const BLOCK_TYPE_ATTRIBUTE = 'data-fayz-block-type'\n\n/**\n * The document path of the block being rendered — the same dotted shape\n * `validateStore` reports and `applyChange` accepts, e.g.\n * `presentation.pages.home.blocks[2]`. Empty outside a rendered page.\n */\nconst BlockPathContext = React.createContext<string>('')\n\nexport function useBlockPath(): string {\n return React.useContext(BlockPathContext)\n}\n\nexport function getBlockErrorVisibility(): BlockErrorVisibility {\n return errorVisibility ?? defaultVisibility()\n}\n\n// --- Error card ---------------------------------------------------------------\n\nfunction BlockErrorCard({ title, detail }: { title: string; detail?: string }): React.ReactElement {\n return React.createElement(\n 'div',\n {\n 'data-block-error': title,\n style: {\n border: '1px dashed #dc2626',\n color: '#b91c1c',\n padding: '8px 12px',\n font: '12px ui-monospace, monospace',\n borderRadius: 6,\n },\n },\n title,\n detail ? React.createElement('div', { style: { opacity: 0.8, marginTop: 4 } }, detail) : null,\n )\n}\n\n// Rendered in place of an unresolved block type — for builders, not shoppers.\n// Unknown blocks are also caught ahead of production by `fayz doctor` /\n// validateStore; at render time they follow the same visibility rule as every\n// other block failure (card in dev/admin, nothing for shoppers).\nfunction UnknownBlock({ type }: { type: string }): React.ReactElement | null {\n if (getBlockErrorVisibility() === 'silent') return null\n return React.createElement(BlockErrorCard, { title: `Unknown block: \"${type}\"` })\n}\n\n// --- Per-block error boundary -------------------------------------------------\n\ninterface BlockErrorBoundaryProps {\n blockType: string\n children?: React.ReactNode\n}\n\ninterface BlockErrorBoundaryState {\n error: Error | null\n}\n\n/**\n * Isolates one block: a throw during its render removes THAT block, never the\n * page. Always logs (a store hitting this in production is better off with the\n * reason in the console); shows the card only per {@link getBlockErrorVisibility}.\n */\nexport class BlockErrorBoundary extends React.Component<BlockErrorBoundaryProps, BlockErrorBoundaryState> {\n state: BlockErrorBoundaryState = { error: null }\n\n static getDerivedStateFromError(error: Error): BlockErrorBoundaryState {\n return { error }\n }\n\n componentDidCatch(error: Error, info: React.ErrorInfo): void {\n console.error(`[blocks] block \"${this.props.blockType}\" crashed while rendering:`, error, info.componentStack)\n }\n\n render(): React.ReactNode {\n if (!this.state.error) return this.props.children\n if (getBlockErrorVisibility() === 'silent') return null\n return React.createElement(BlockErrorCard, {\n title: `Block \"${this.props.blockType}\" crashed`,\n detail: this.state.error.message,\n })\n }\n}\n\n// --- Constraint gating --------------------------------------------------------\n\n// Ancestor block types, outermost first — how a node knows where it is without\n// the tree threading positions through props.\nconst BlockAncestryContext = React.createContext<readonly string[]>([])\n\nfunction ConstraintViolation({ detail }: { detail: string }): React.ReactElement | null {\n if (getBlockErrorVisibility() === 'silent') return null\n return React.createElement(BlockErrorCard, { title: 'Misplaced block', detail })\n}\n\n// Warn once per distinct violation, not once per render — the message is for a\n// human reading the console, and repetition buries it.\nconst warnedViolations = new Set<string>()\n\nexport function BlockRenderer({ node, path }: { node: BlockNode; path?: string }): React.ReactElement | null {\n const ancestry = React.useContext(BlockAncestryContext)\n\n const Comp = getBlock(node.type)\n if (!Comp) return React.createElement(UnknownBlock, { type: node.type })\n\n // Same declarations validateStore enforces, applied at the last line of\n // defense: a block outside its declared context is missing the data it needs\n // and renders wrong at best — keep it off the shopper's page.\n const violations = checkNodePlacement(node.type, ancestry)\n if (violations.length > 0) {\n const message = violations.map((v) => v.detail).join('; ')\n if (!warnedViolations.has(message)) {\n warnedViolations.add(message)\n console.warn(`[blocks] ${message}`)\n }\n return React.createElement(ConstraintViolation, { detail: violations[0]!.detail })\n }\n\n const childEls = node.children?.length\n ? renderBlocks(node.children, path ? `${path}.children` : undefined)\n : null\n\n const rendered = React.createElement(\n BlockAncestryContext.Provider,\n { value: ancestry.length ? [...ancestry, node.type] : [node.type] },\n React.createElement(\n BlockErrorBoundary,\n { blockType: node.type },\n React.createElement(Comp, { ...(node.props ?? {}), node }, childEls),\n ),\n )\n\n if (!editorMode || !path) return rendered\n\n // display:contents so a block inside a grid or flex parent still lays out as\n // a direct child — the wrapper carries identity, never geometry.\n return React.createElement(\n BlockPathContext.Provider,\n { value: path },\n React.createElement(\n 'div',\n {\n [BLOCK_PATH_ATTRIBUTE]: path,\n [BLOCK_TYPE_ATTRIBUTE]: node.type,\n style: { display: 'contents' },\n },\n rendered,\n ),\n )\n}\n\n/**\n * Render an ordered list of blocks (a page body).\n *\n * `basePath` is the document path of the ARRAY these nodes came from, e.g.\n * `presentation.pages.home.blocks`. Pages pass it so each block can carry the\n * path back to the document node that produced it; callers that have no\n * document (a preview, a test) pass nothing and get today's behaviour exactly.\n */\nexport function renderBlocks(nodes: BlockNode[], basePath?: string): React.ReactNode {\n return nodes.map((node, i) =>\n React.createElement(BlockRenderer, {\n key: node.id ?? `${node.type}-${i}`,\n node,\n // POSITIONAL, deliberately. `[#id]` is the reorder-stable form\n // store-change supports, and using it here looked obviously better — but\n // by the time a node reaches this function its `id` has been synthesized\n // (`${type}-${index}`) for every block the document did not name, and the\n // renderer cannot tell an authored id from a generated one. Emitting\n // `[#hero-0]` produced paths that resolve against nothing.\n //\n // The cost of positional is that a reorder invalidates an outstanding\n // path. That is bounded: a path is captured on click and spent on save,\n // and a document that names its blocks can be addressed by id by whoever\n // holds the document — which is the editor, not the renderer.\n path: basePath ? `${basePath}[${i}]` : undefined,\n }),\n )\n}\n\n/**\n * Convenience for block components that render their own children.\n *\n * Reads its own path from context rather than taking one: a block that renders\n * <BlockChildren> does not know where in the document it sits, and threading a\n * path through every such block would be the signature change the wrapper\n * design exists to avoid. Without this, nested blocks rendered this way carry\n * no identity and are invisible to the editor.\n */\nexport function BlockChildren({ node }: { node?: BlockNode }): React.ReactNode {\n const path = useBlockPath()\n if (!node?.children?.length) return null\n return renderBlocks(node.children, path ? `${path}.children` : undefined)\n}\n","import type { EntityDef } from '../types/crud'\nimport type { LocaleConfig } from '../types/i18n'\nimport type { PermissionsConfig, FeatureDeclaration } from '../types/permissions'\nimport type { BillingConfig } from '../types/billing'\nimport type { LimitDeclaration } from '../types/entitlements'\nimport type { AIToolParameters, AIToolExecution, AgentRpcDeclaration } from '../types/plugins'\nimport type { BlockNode } from '../registry/blocks'\n\n// ---------------------------------------------------------------------------\n// AppManifest — THE app, as data.\n//\n// This is the canonical artifact every generated repo commits as\n// `app.manifest.json` and that `fayz upgrade` migrates across the fleet. It is\n// strictly JSON-serializable: no functions, no components — only ids resolved\n// against the registries (see ../registry). `createSaasApp`/`createStorefrontApp`\n// become thin sugar that builds a manifest of this shape.\n//\n// Versioning: bump CURRENT_MANIFEST_VERSION and register a migration whenever\n// the shape changes. The single biggest fleet-maintenance lever — getting it\n// right is why W1 is the \"point of no return\".\n// ---------------------------------------------------------------------------\n\nexport const CURRENT_MANIFEST_VERSION = 3\n\nexport type BackendProvider = 'supabase' | 'fayz-api' | 'fayz-shop' | 'mock' | 'custom'\n\nexport interface BackendRef {\n provider: BackendProvider\n /** Provider project ref / URL. Secrets stay in env/platform storage. */\n projectRef?: string\n url?: string\n /** Registered adapter id when provider is 'custom'. */\n adapterId?: string\n /** Public, JSON-safe provider options. Never store secrets here. */\n options?: Record<string, unknown>\n}\n\n/** How a manifest page produces its body — exactly one of blocks/entity/component. */\nexport interface PageManifest {\n path: string\n label?: string\n icon?: string\n section?: 'main' | 'secondary' | 'settings'\n /** A block tree (pure data). */\n blocks?: BlockNode[]\n /** An entity key → rendered as a CRUD page by the scaffold. */\n entity?: string\n /** A registered page-component id, e.g. 'custom:HarvestBoard'. */\n component?: string\n /** Optional permission gate: feature + action. */\n permission?: { feature: string; action: string }\n}\n\nexport interface PluginRef {\n /** Plugin id, resolved to an installed @fayz-ai/plugin-* at build time. */\n id: string\n /** Pure-data config passed to the plugin (labels, kinds, module flags…). */\n config?: Record<string, unknown>\n enabled?: boolean\n}\n\nexport interface SurfaceManifest {\n /** Registered scaffold id: 'admin' | 'storefront' | 'portal' | custom. */\n scaffold: string\n plugins?: PluginRef[]\n pages?: PageManifest[]\n /** Surface-specific declarative options (announcement, footer, nav, shipping,\n * catalog seed, onboarding, …) — kept open so scaffolds evolve without a\n * manifest-version bump for additive fields. */\n options?: Record<string, unknown>\n}\n\n// ---------------------------------------------------------------------------\n// Agent Contract (manifest v3) — everything a SERVER-SIDE agent runtime needs\n// to operate the app without a browser: the full entity surface, the tool\n// catalog with its authorization requirements, the pool RPCs writes go\n// through, and the structured domain knowledge the app wants in the prompt.\n// Derived from app code at publish (never hand-written) and synced to the\n// Fayz platform, where it becomes the versioned AgentContract the broker\n// validates every turn against.\n// ---------------------------------------------------------------------------\n\n/** JSON-safe projection of an EntityDef — schema only, no components/closures.\n * `data` mirrors EntityDef.data: everything the server-plane read executor\n * needs (tenant scoping, search/select column allowlists, fixed filters). */\nexport interface EntityContract {\n key: string\n label: string\n labelPlural?: string\n /** Plan-limit key rows of this entity consume (EntityDef.limitKey). */\n limitKey?: string\n /** Permission to READ via the generic data primitives (EntityDef.permission). */\n permission?: { feature: string; action: string }\n data: {\n table: string\n schema?: string\n tenantScoped?: boolean\n tenantIdColumn?: string\n searchColumns?: string[]\n selectColumns?: string\n columnMap?: Record<string, string>\n archetype?: string\n archetypeKind?: string\n filters?: Record<string, string>\n }\n fields: Array<{\n key: string\n label: string\n type: string\n required?: boolean\n searchable?: boolean\n /** FieldDef.hint — the field's helper text. Carried into the contract\n * because it is what tells the agent what a non-obvious column expects:\n * an id to look up, a default it should not restate, a format. */\n hint?: string\n /** Allowed values for select-like fields. */\n options?: string[]\n /** Table the relation field points at (FieldRelation.table). */\n relationTable?: string\n }>\n}\n\n/** JSON-safe projection of a PluginAITool + its owning plugin. */\nexport interface AIToolContract {\n id: string\n name: string\n description: string\n mode: 'read' | 'persist'\n parameters?: AIToolParameters\n permission?: { feature: string; action: string }\n limitKey?: string\n execution?: AIToolExecution\n requiresConfirmation?: boolean\n pluginId?: string\n category?: string\n}\n\n/** A tenant-scoped pool RPC the server-plane executor may call. Canonical\n * definition lives with the plugin types (plugins declare these). */\nexport type { AgentRpcDeclaration as RpcContract } from '../types/plugins'\n\n/** Structured domain knowledge rendered into the agent's prompt as labelled\n * sections — statuses with transitions, scheduling defaults, free-form rules. */\nexport interface AgentDomainKnowledge {\n statuses?: Record<string, Array<{ id: string; label: string; availableWhen?: unknown }>>\n scheduleDefaults?: Record<string, unknown>\n businessRules?: Array<{ id: string; description: string }>\n}\n\nexport interface AgentContract {\n persona?: { name?: string; systemPrompt?: string; icon?: string }\n /** When 'server', surfaces stop shipping data-tool executors: the broker\n * executes reads/writes server-plane and the surface only handles\n * client-plane tools. Flipped per app — no lockstep release. */\n executionPlane?: 'client' | 'server'\n entities?: EntityContract[]\n tools?: AIToolContract[]\n registries?: Array<{ pluginId: string; id: string; entityKey?: string; readOnly?: boolean }>\n declaredFeatures?: FeatureDeclaration[]\n rpcs?: AgentRpcDeclaration[]\n domainKnowledge?: AgentDomainKnowledge\n}\n\nexport interface AppManifest {\n manifestVersion: number\n id: string\n name: string\n backend?: BackendRef\n locale?: LocaleConfig\n /** Theme tokens — SaasTheme or StorefrontTheme depending on surface; kept\n * loose at the core layer to avoid coupling core to surface packages. */\n theme?: Record<string, unknown>\n /** Keyed by surface name ('admin', 'storefront', …). At least one required. */\n surfaces: Record<string, SurfaceManifest>\n /** App-defined entity extensions (vertical-specific tables/fields). */\n entities?: EntityDef[]\n permissions?: PermissionsConfig\n billing?: BillingConfig\n /** The RESOLVED limit declarations (4-layer merge: core < entity-derived <\n * plugin < app), so a server runtime counts exactly what the client counts. */\n limitDeclarations?: LimitDeclaration[]\n /** v3: the agent contract — see the section comment above. */\n agent?: AgentContract\n /** sha256 of the canonical serialization (excluding this field). */\n contractHash?: string\n}\n\n// ---------------------------------------------------------------------------\n// Migration runner — applies sequential migrations from a manifest's version\n// up to CURRENT. Each migration is keyed by the version it upgrades FROM.\n// ---------------------------------------------------------------------------\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyManifest = Record<string, any>\nexport type ManifestMigration = (m: AnyManifest) => AnyManifest\n\nconst migrations = new Map<number, ManifestMigration>()\nconst supportedBackendProviders: BackendProvider[] = ['supabase', 'fayz-api', 'fayz-shop', 'mock', 'custom']\nconst supportedPageSections = new Set(['main', 'secondary', 'settings'])\nconst allowedManifestKeys = new Set([\n 'manifestVersion',\n 'id',\n 'name',\n 'backend',\n 'locale',\n 'theme',\n 'permissions',\n 'billing',\n 'entities',\n 'surfaces',\n 'limitDeclarations',\n 'agent',\n 'contractHash',\n])\nconst allowedBackendKeys = new Set(['provider', 'projectRef', 'url', 'adapterId', 'options'])\nconst allowedSurfaceKeys = new Set(['scaffold', 'options', 'plugins', 'pages'])\nconst allowedPluginRefKeys = new Set(['id', 'config', 'enabled'])\nconst allowedPageKeys = new Set(['path', 'label', 'icon', 'section', 'blocks', 'entity', 'component', 'permission'])\nconst allowedPermissionKeys = new Set(['feature', 'action'])\nconst allowedBlockKeys = new Set(['type', 'id', 'props', 'children'])\nconst manifestIdPattern = /^[a-z0-9][a-z0-9-]*$/\n\n/** Register a migration that upgrades a manifest FROM `fromVersion` to fromVersion+1. */\nexport function registerManifestMigration(fromVersion: number, fn: ManifestMigration): void {\n migrations.set(fromVersion, fn)\n}\n\n// v2 → v3 is purely additive (limitDeclarations/agent/contractHash are optional):\n// a v2 manifest is a valid v3 manifest with those sections absent. Registered\n// here so every consumer migrates for free; `fayz manifest emit` fills the new\n// sections on the next regeneration.\nregisterManifestMigration(2, (m) => m)\n\n/** Bring any manifest up to CURRENT_MANIFEST_VERSION, or throw if it was built\n * for a newer SDK than this runtime understands. */\nexport function migrateManifest(input: AnyManifest): AppManifest {\n let m = { ...input }\n let version = typeof m.manifestVersion === 'number' ? m.manifestVersion : 1\n if (version > CURRENT_MANIFEST_VERSION) {\n throw new Error(\n `Manifest version ${version} is newer than this SDK supports (${CURRENT_MANIFEST_VERSION}). Upgrade @fayz-ai/core.`,\n )\n }\n while (version < CURRENT_MANIFEST_VERSION) {\n const migrate = migrations.get(version)\n if (!migrate) {\n throw new Error(`No manifest migration registered from version ${version}.`)\n }\n m = migrate(m)\n version += 1\n m.manifestVersion = version\n }\n return m as AppManifest\n}\n\n/** Validate the structural invariants the JSON Schema can't fully express.\n * Returns a list of human-readable problems (empty = valid). */\nexport function validateManifest(m: AppManifest): string[] {\n const problems: string[] = []\n const manifest = m as unknown as Record<string, unknown>\n\n addUnsupportedKeys(manifest, allowedManifestKeys, 'manifest', problems)\n\n if (!Number.isInteger(manifest.manifestVersion)) {\n problems.push('manifest.manifestVersion must be an integer')\n } else if (manifest.manifestVersion !== CURRENT_MANIFEST_VERSION) {\n problems.push(`manifest.manifestVersion must be ${CURRENT_MANIFEST_VERSION}`)\n }\n if (typeof manifest.id !== 'string' || !manifest.id.trim()) problems.push('manifest.id is required')\n else if (!manifestIdPattern.test(manifest.id.trim())) {\n problems.push('manifest.id must match /^[a-z0-9][a-z0-9-]*$/')\n }\n if (typeof manifest.name !== 'string' || !manifest.name.trim()) problems.push('manifest.name is required')\n\n validateLooseObject(manifest.locale, 'manifest.locale', problems)\n validateLooseObject(manifest.theme, 'manifest.theme', problems)\n validateLooseObject(manifest.permissions, 'manifest.permissions', problems)\n validateLooseObject(manifest.billing, 'manifest.billing', problems)\n validateLooseObject(manifest.agent, 'manifest.agent', problems)\n if (manifest.contractHash !== undefined && !isNonEmptyString(manifest.contractHash)) {\n problems.push('manifest.contractHash must be a non-empty string')\n }\n if (manifest.limitDeclarations !== undefined) {\n if (!Array.isArray(manifest.limitDeclarations)) {\n problems.push('manifest.limitDeclarations must be an array')\n } else {\n manifest.limitDeclarations.forEach((decl, index) => {\n if (!isRecord(decl) || !isNonEmptyString(decl.key) || !isNonEmptyString(decl.table)) {\n problems.push(`manifest.limitDeclarations[${index}] must declare key and table`)\n }\n })\n }\n }\n if (manifest.entities !== undefined) {\n if (!Array.isArray(manifest.entities)) {\n problems.push('manifest.entities must be an array')\n } else {\n manifest.entities.forEach((entity, index) => {\n if (!isRecord(entity)) problems.push(`manifest.entities[${index}] must be an object`)\n })\n }\n }\n\n if (manifest.backend !== undefined) {\n if (!isRecord(manifest.backend)) {\n problems.push('manifest.backend must be an object')\n } else {\n addUnsupportedKeys(manifest.backend, allowedBackendKeys, 'manifest.backend', problems)\n const provider = manifest.backend.provider\n if (typeof provider !== 'string' || !supportedBackendProviders.includes(provider as BackendProvider)) {\n problems.push(`manifest.backend.provider \"${String(provider)}\" is not supported`)\n }\n validateOptionalNonEmptyString(manifest.backend.projectRef, 'manifest.backend.projectRef', problems)\n validateOptionalNonEmptyString(manifest.backend.url, 'manifest.backend.url', problems)\n if (provider === 'custom' && !isNonEmptyString(manifest.backend.adapterId)) {\n problems.push('manifest.backend.adapterId is required when provider is \"custom\"')\n } else if (provider !== 'custom') {\n validateOptionalNonEmptyString(manifest.backend.adapterId, 'manifest.backend.adapterId', problems)\n }\n validateLooseObject(manifest.backend.options, 'manifest.backend.options', problems)\n }\n }\n\n if (!isRecord(manifest.surfaces) || Object.keys(manifest.surfaces).length === 0) {\n problems.push('manifest.surfaces must declare at least one surface')\n } else {\n for (const [name, surface] of Object.entries(manifest.surfaces)) {\n validateSurfaceManifest(name, surface, problems)\n }\n }\n\n return problems\n}\n\nfunction validateSurfaceManifest(name: string, surface: unknown, problems: string[]): void {\n if (!isRecord(surface)) {\n problems.push(`surface \"${name}\" must be an object`)\n return\n }\n\n addUnsupportedKeys(surface, allowedSurfaceKeys, `surface \"${name}\"`, problems)\n if (!isNonEmptyString(surface.scaffold)) problems.push(`surface \"${name}\" is missing a scaffold id`)\n validateLooseObject(surface.options, `surface \"${name}\".options`, problems)\n\n if (surface.pages !== undefined) {\n if (!Array.isArray(surface.pages)) {\n problems.push(`surface \"${name}\".pages must be an array`)\n } else {\n const pagePaths = new Set<string>()\n for (const [index, page] of surface.pages.entries()) {\n validatePageManifest(name, index, page, pagePaths, problems)\n }\n }\n }\n\n if (surface.plugins !== undefined) {\n if (!Array.isArray(surface.plugins)) {\n problems.push(`surface \"${name}\".plugins must be an array`)\n } else {\n const pluginIds = new Set<string>()\n for (const [index, plugin] of surface.plugins.entries()) {\n validatePluginRef(name, index, plugin, pluginIds, problems)\n }\n }\n }\n}\n\nfunction validatePageManifest(\n surfaceName: string,\n index: number,\n page: unknown,\n pagePaths: Set<string>,\n problems: string[],\n): void {\n const pageLabel = `surface \"${surfaceName}\" page #${index + 1}`\n if (!isRecord(page)) {\n problems.push(`${pageLabel} must be an object`)\n return\n }\n\n addUnsupportedKeys(page, allowedPageKeys, pageLabel, problems)\n\n if (!isNonEmptyString(page.path)) {\n problems.push(`${pageLabel} has an empty path`)\n } else {\n const normalizedPath = page.path.trim()\n if (pagePaths.has(normalizedPath)) {\n problems.push(`surface \"${surfaceName}\" declares duplicate page path \"${normalizedPath}\"`)\n } else {\n pagePaths.add(normalizedPath)\n }\n }\n\n if (page.label !== undefined && typeof page.label !== 'string') problems.push(`${pageLabel}.label must be a string`)\n if (page.icon !== undefined && typeof page.icon !== 'string') problems.push(`${pageLabel}.icon must be a string`)\n if (page.section !== undefined && (typeof page.section !== 'string' || !supportedPageSections.has(page.section))) {\n problems.push(`${pageLabel}.section must be one of main, secondary, settings`)\n }\n if (page.entity !== undefined && !isNonEmptyString(page.entity)) problems.push(`${pageLabel}.entity must be a non-empty string`)\n if (page.component !== undefined && !isNonEmptyString(page.component)) {\n problems.push(`${pageLabel}.component must be a non-empty string`)\n }\n\n const kinds = [page.blocks, page.entity, page.component].filter((x) => x != null)\n if (kinds.length !== 1) {\n problems.push(`${pageLabel} must set exactly one of blocks/entity/component`)\n }\n\n if (page.permission !== undefined) {\n validatePermission(page.permission, `${pageLabel}.permission`, problems)\n }\n\n if (page.blocks !== undefined) {\n if (!Array.isArray(page.blocks)) {\n problems.push(`${pageLabel}.blocks must be an array`)\n } else {\n page.blocks.forEach((block, blockIndex) => {\n validateBlockManifest(block, `${pageLabel}.blocks[${blockIndex}]`, problems)\n })\n }\n }\n}\n\nfunction validatePluginRef(\n surfaceName: string,\n index: number,\n plugin: unknown,\n pluginIds: Set<string>,\n problems: string[],\n): void {\n const pluginLabel = `surface \"${surfaceName}\" plugin #${index + 1}`\n if (!isRecord(plugin)) {\n problems.push(`${pluginLabel} must be an object`)\n return\n }\n\n addUnsupportedKeys(plugin, allowedPluginRefKeys, pluginLabel, problems)\n\n if (!isNonEmptyString(plugin.id)) {\n problems.push(`${pluginLabel} has an empty id`)\n } else {\n const normalizedId = plugin.id.trim()\n if (pluginIds.has(normalizedId)) {\n problems.push(`surface \"${surfaceName}\" declares duplicate plugin id \"${normalizedId}\"`)\n } else {\n pluginIds.add(normalizedId)\n }\n }\n\n validateLooseObject(plugin.config, `${pluginLabel}.config`, problems)\n if (plugin.enabled !== undefined && typeof plugin.enabled !== 'boolean') {\n problems.push(`${pluginLabel}.enabled must be a boolean`)\n }\n}\n\nfunction validatePermission(permission: unknown, path: string, problems: string[]): void {\n if (!isRecord(permission)) {\n problems.push(`${path} must be an object`)\n return\n }\n\n addUnsupportedKeys(permission, allowedPermissionKeys, path, problems)\n if (!isNonEmptyString(permission.feature)) problems.push(`${path}.feature is required`)\n if (!isNonEmptyString(permission.action)) problems.push(`${path}.action is required`)\n}\n\nfunction validateBlockManifest(block: unknown, path: string, problems: string[]): void {\n if (!isRecord(block)) {\n problems.push(`${path} must be an object`)\n return\n }\n\n addUnsupportedKeys(block, allowedBlockKeys, path, problems)\n if (!isNonEmptyString(block.type)) problems.push(`${path}.type is required`)\n validateLooseObject(block.props, `${path}.props`, problems)\n if (block.id !== undefined && typeof block.id !== 'string') problems.push(`${path}.id must be a string`)\n\n if (block.children !== undefined) {\n if (!Array.isArray(block.children)) {\n problems.push(`${path}.children must be an array`)\n } else {\n block.children.forEach((child, index) => validateBlockManifest(child, `${path}.children[${index}]`, problems))\n }\n }\n}\n\nfunction addUnsupportedKeys(\n value: Record<string, unknown>,\n allowedKeys: Set<string>,\n path: string,\n problems: string[],\n): void {\n for (const key of Object.keys(value)) {\n if (!allowedKeys.has(key)) {\n problems.push(`${path}.${key} is not part of AppManifest v${CURRENT_MANIFEST_VERSION}`)\n }\n }\n}\n\nfunction validateLooseObject(value: unknown, path: string, problems: string[]): void {\n if (value !== undefined && !isRecord(value)) {\n problems.push(`${path} must be an object`)\n }\n}\n\nfunction validateOptionalNonEmptyString(value: unknown, path: string, problems: string[]): void {\n if (value !== undefined && !isNonEmptyString(value)) {\n problems.push(`${path} must be a non-empty string`)\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0\n}\n","import type { AppManifest } from './index'\n\n// ---------------------------------------------------------------------------\n// Deterministic serialization — the SAME manifest object must always produce\n// the SAME bytes, because the sha256 of those bytes (`contractHash`) is what\n// makes `fayz manifest sync` idempotent and lets `fayz doctor` prove the\n// committed app.manifest.json is not stale. Rules: object keys sorted, arrays\n// kept in declared order (order is meaning: nav position, migration order),\n// 2-space indent, trailing newline, `contractHash` itself excluded.\n// ---------------------------------------------------------------------------\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortValue)\n if (value !== null && typeof value === 'object') {\n const record = value as Record<string, unknown>\n const out: Record<string, unknown> = {}\n for (const key of Object.keys(record).sort()) {\n const v = record[key]\n if (v !== undefined) out[key] = sortValue(v)\n }\n return out\n }\n return value\n}\n\n/** Canonical JSON of a manifest (contractHash excluded, keys sorted). */\nexport function serializeManifest(manifest: AppManifest): string {\n const { contractHash: _omit, ...rest } = manifest\n return `${JSON.stringify(sortValue(rest), null, 2)}\\n`\n}\n\n/**\n * sha256 (hex) of the canonical serialization. Async because it runs on\n * WebCrypto (`globalThis.crypto.subtle`), which exists in every runtime we\n * target (browsers, Node ≥ 18, edge) — no node:crypto import, keeping this\n * module bundleable everywhere.\n */\nexport async function computeContractHash(manifest: AppManifest): Promise<string> {\n const bytes = new TextEncoder().encode(serializeManifest(manifest))\n const digest = await globalThis.crypto.subtle.digest('SHA-256', bytes)\n return Array.from(new Uint8Array(digest))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n}\n\n/** Serialize WITH the freshly computed contractHash embedded — what\n * `fayz manifest emit` writes to app.manifest.json. */\nexport async function serializeManifestWithHash(manifest: AppManifest): Promise<string> {\n const contractHash = await computeContractHash(manifest)\n const { contractHash: _omit, ...rest } = manifest\n return `${JSON.stringify(sortValue({ ...rest, contractHash }), null, 2)}\\n`\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://fayz.ai/schemas/app-manifest/v3.json\",\n \"title\": \"Fayz AppManifest\",\n \"description\": \"The canonical, JSON-serializable definition of a Fayz app. Code is referenced by registry id; never inlined.\",\n \"type\": \"object\",\n \"required\": [\n \"manifestVersion\",\n \"id\",\n \"name\",\n \"surfaces\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"manifestVersion\": {\n \"type\": \"integer\",\n \"const\": 3,\n \"description\": \"Current AppManifest schema version. Older or newer versions require an explicit SDK migration before validation.\"\n },\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"pattern\": \"^[a-z0-9][a-z0-9-]*$\"\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"backend\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"provider\"\n ],\n \"properties\": {\n \"provider\": {\n \"enum\": [\n \"supabase\",\n \"fayz-api\",\n \"fayz-shop\",\n \"mock\",\n \"custom\"\n ]\n },\n \"projectRef\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"url\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"adapterId\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"options\": {\n \"type\": \"object\"\n }\n }\n },\n \"locale\": {\n \"type\": \"object\"\n },\n \"theme\": {\n \"type\": \"object\"\n },\n \"permissions\": {\n \"type\": \"object\"\n },\n \"billing\": {\n \"type\": \"object\"\n },\n \"entities\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"surfaces\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"additionalProperties\": {\n \"$ref\": \"#/$defs/surface\"\n }\n },\n \"limitDeclarations\": {\n \"type\": \"array\",\n \"description\": \"Resolved 4-layer limit-declaration merge (core < entity-derived < plugin < app) so server runtimes count exactly what the client counts.\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"key\",\n \"table\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"key\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"table\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"kindFilter\": {\n \"type\": \"string\"\n },\n \"period\": {\n \"enum\": [\n \"month\",\n \"total\"\n ]\n }\n }\n }\n },\n \"agent\": {\n \"$ref\": \"#/$defs/agentContract\"\n },\n \"contractHash\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"sha256 of the canonical serialization (excluding this field).\"\n }\n },\n \"$defs\": {\n \"surface\": {\n \"type\": \"object\",\n \"required\": [\n \"scaffold\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"scaffold\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"options\": {\n \"type\": \"object\"\n },\n \"plugins\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/pluginRef\"\n }\n },\n \"pages\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/page\"\n }\n }\n }\n },\n \"pluginRef\": {\n \"type\": \"object\",\n \"required\": [\n \"id\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"config\": {\n \"type\": \"object\"\n },\n \"enabled\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"page\": {\n \"type\": \"object\",\n \"required\": [\n \"path\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Exactly one of blocks/entity/component must be set.\",\n \"properties\": {\n \"path\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"type\": \"string\"\n },\n \"section\": {\n \"enum\": [\n \"main\",\n \"secondary\",\n \"settings\"\n ]\n },\n \"blocks\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/block\"\n }\n },\n \"entity\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"component\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"permission\": {\n \"type\": \"object\",\n \"required\": [\n \"feature\",\n \"action\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"feature\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"action\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n }\n },\n \"oneOf\": [\n {\n \"required\": [\n \"blocks\"\n ]\n },\n {\n \"required\": [\n \"entity\"\n ]\n },\n {\n \"required\": [\n \"component\"\n ]\n }\n ]\n },\n \"block\": {\n \"type\": \"object\",\n \"required\": [\n \"type\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"props\": {\n \"type\": \"object\"\n },\n \"children\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/block\"\n }\n }\n }\n },\n \"agentContract\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"description\": \"Everything a server-side agent runtime needs to operate the app without a browser. Derived from code at publish; synced to Fayz as the versioned AgentContract.\",\n \"properties\": {\n \"persona\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"systemPrompt\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"type\": \"string\"\n }\n }\n },\n \"executionPlane\": {\n \"enum\": [\n \"client\",\n \"server\"\n ]\n },\n \"entities\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/entityContract\"\n }\n },\n \"tools\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/aiToolContract\"\n }\n },\n \"registries\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"pluginId\",\n \"id\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"pluginId\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"entityKey\": {\n \"type\": \"string\"\n },\n \"readOnly\": {\n \"type\": \"boolean\"\n }\n }\n }\n },\n \"declaredFeatures\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"rpcs\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/rpcContract\"\n }\n },\n \"domainKnowledge\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"statuses\": {\n \"type\": \"object\"\n },\n \"scheduleDefaults\": {\n \"type\": \"object\"\n },\n \"businessRules\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"description\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"description\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n }\n }\n }\n }\n }\n },\n \"entityContract\": {\n \"type\": \"object\",\n \"required\": [\n \"key\",\n \"label\",\n \"data\",\n \"fields\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"key\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"label\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"labelPlural\": {\n \"type\": \"string\"\n },\n \"limitKey\": {\n \"type\": \"string\"\n },\n \"data\": {\n \"type\": \"object\",\n \"required\": [\n \"table\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"table\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"schema\": {\n \"type\": \"string\"\n },\n \"tenantScoped\": {\n \"type\": \"boolean\"\n },\n \"tenantIdColumn\": {\n \"type\": \"string\"\n },\n \"searchColumns\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"selectColumns\": {\n \"type\": \"string\"\n },\n \"columnMap\": {\n \"type\": \"object\"\n },\n \"archetype\": {\n \"type\": \"string\"\n },\n \"archetypeKind\": {\n \"type\": \"string\"\n },\n \"filters\": {\n \"type\": \"object\"\n }\n }\n },\n \"fields\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"key\",\n \"label\",\n \"type\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"key\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"searchable\": {\n \"type\": \"boolean\"\n },\n \"hint\": {\n \"type\": \"string\"\n },\n \"options\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"relationTable\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"permission\": {\n \"type\": \"object\",\n \"required\": [\n \"feature\",\n \"action\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"feature\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"action\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n }\n }\n },\n \"aiToolContract\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"name\",\n \"description\",\n \"mode\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"pattern\": \"^[a-zA-Z0-9_-]{1,64}$\"\n },\n \"description\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"mode\": {\n \"enum\": [\n \"read\",\n \"persist\"\n ]\n },\n \"parameters\": {\n \"type\": \"object\"\n },\n \"permission\": {\n \"type\": \"object\",\n \"required\": [\n \"feature\",\n \"action\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"feature\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"action\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n },\n \"limitKey\": {\n \"type\": \"string\"\n },\n \"execution\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"required\": [\n \"plane\",\n \"kind\",\n \"rpc\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"plane\": {\n \"const\": \"server\"\n },\n \"kind\": {\n \"const\": \"rpc\"\n },\n \"rpc\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n },\n {\n \"type\": \"object\",\n \"required\": [\n \"plane\",\n \"kind\",\n \"entity\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"plane\": {\n \"const\": \"server\"\n },\n \"kind\": {\n \"const\": \"entity_read\"\n },\n \"entity\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n },\n {\n \"type\": \"object\",\n \"required\": [\n \"plane\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"plane\": {\n \"const\": \"client\"\n }\n }\n }\n ]\n },\n \"requiresConfirmation\": {\n \"type\": \"boolean\"\n },\n \"pluginId\": {\n \"type\": \"string\"\n },\n \"category\": {\n \"type\": \"string\"\n }\n }\n },\n \"rpcContract\": {\n \"type\": \"object\",\n \"required\": [\n \"name\",\n \"kind\",\n \"description\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"pattern\": \"^agent_[a-z0-9_]+$\"\n },\n \"kind\": {\n \"enum\": [\n \"read\",\n \"write\"\n ]\n },\n \"description\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"payloadSchema\": {\n \"type\": \"object\"\n },\n \"audits\": {\n \"type\": \"boolean\"\n }\n }\n }\n }\n}\n","import * as React from 'react'\nimport { getScaffold } from '../registry'\nimport { migrateManifest, validateManifest, CURRENT_MANIFEST_VERSION } from '../manifest'\nimport type { AppManifest } from '../manifest'\n\n// ---------------------------------------------------------------------------\n// defineApp / renderApp — the entry points that turn an AppManifest into a\n// running app. Scaffolds (admin, storefront, portal) self-register into the\n// scaffold registry when their package is imported, so core never depends on\n// them: a generated app imports the scaffold package(s) it needs, then calls\n// renderApp(manifest). createSaasApp / createStorefrontApp become sugar that\n// builds a manifest and hands it here.\n// ---------------------------------------------------------------------------\n\nconst ManifestContext = React.createContext<AppManifest | null>(null)\n\n/** Access the active app manifest from any component under renderApp. */\nexport function useManifest(): AppManifest | null {\n return React.useContext(ManifestContext)\n}\n\n/** Stamp + validate a manifest authored in code (the sugar path). */\nexport function defineApp(\n manifest: Omit<AppManifest, 'manifestVersion'> & { manifestVersion?: number },\n): AppManifest {\n const full = {\n ...manifest,\n manifestVersion: manifest.manifestVersion ?? CURRENT_MANIFEST_VERSION,\n } as AppManifest\n const problems = validateManifest(full)\n if (problems.length) {\n throw new Error(`Invalid AppManifest:\\n - ${problems.join('\\n - ')}`)\n }\n return full\n}\n\nexport interface RenderAppOptions {\n /** Which surface to mount; defaults to the first declared surface. */\n surface?: string\n}\n\n/** Resolve, migrate and validate a manifest, then mount the scaffold for the\n * chosen surface. Accepts a raw object (e.g. parsed app.manifest.json). */\nexport function renderApp(\n input: AppManifest | Record<string, unknown>,\n opts: RenderAppOptions = {},\n): React.ReactElement {\n const manifest = migrateManifest(input as Record<string, unknown>)\n const problems = validateManifest(manifest)\n if (problems.length) {\n throw new Error(`Invalid AppManifest:\\n - ${problems.join('\\n - ')}`)\n }\n const surfaceName = opts.surface ?? Object.keys(manifest.surfaces)[0]\n const surface = surfaceName ? manifest.surfaces[surfaceName] : undefined\n if (!surface) {\n throw new Error(`Surface \"${surfaceName}\" not found in manifest.`)\n }\n const Scaffold = getScaffold(surface.scaffold)\n if (!Scaffold) {\n throw new Error(\n `Scaffold \"${surface.scaffold}\" is not registered. Call renderApp from the package that provides it (e.g. @fayz-ai/admin, @fayz-ai/portal, @fayz-ai/storefront) or call its register*Scaffold() first.`,\n )\n }\n return React.createElement(\n ManifestContext.Provider,\n { value: manifest },\n React.createElement(Scaffold, { manifest, surface: surfaceName }),\n )\n}\n","import { create } from 'zustand'\n\n/**\n * Global, cross-module navigation history.\n *\n * Per-module nav hooks (useModuleNavigation) only remember views *within* one\n * module, so they can't tell you where you came from after crossing a module\n * boundary (e.g. Financial statements → a client/person page). This store sits\n * above all modules: the app shell records every route change here with a\n * human label, and the shared SubpageHeader reads it to render a context-aware\n * \"back to {where you came from}\" link that returns to the actual previous page.\n */\n\nexport interface NavHistoryEntry {\n /** Route path without the leading '#', e.g. '/financial/statements'. */\n path: string\n /** Human, module-level label for the page, e.g. 'Financeiro'. */\n label: string\n}\n\ninterface NavHistoryState {\n stack: NavHistoryEntry[]\n /** Record a visit. Consecutive visits to the same path collapse (label refreshes). */\n record: (entry: NavHistoryEntry) => void\n}\n\nconst MAX_ENTRIES = 20\n\nexport const useNavHistoryStore = create<NavHistoryState>((set) => ({\n stack: [],\n record: (entry) =>\n set((s) => {\n const top = s.stack[s.stack.length - 1]\n if (top && top.path === entry.path) {\n if (top.label === entry.label) return s\n const next = s.stack.slice()\n next[next.length - 1] = entry\n return { stack: next }\n }\n const next = [...s.stack, entry]\n return { stack: next.length > MAX_ENTRIES ? next.slice(-MAX_ENTRIES) : next }\n }),\n}))\n\n/** Record a route visit. Call from the app shell whenever the route changes. */\nexport function recordNavigation(path: string, label: string): void {\n useNavHistoryStore.getState().record({ path, label })\n}\n\n// Dev-only debug handle: inspect history in the console via `__navHistory.getState().stack`.\nif (typeof window !== 'undefined') {\n ;(window as unknown as { __navHistory?: typeof useNavHistoryStore }).__navHistory = useNavHistoryStore\n}\n\n/**\n * The page the user most recently came from, relative to `currentPath`.\n *\n * Returns the latest recorded entry whose path differs from `currentPath`. This\n * is intentionally robust to ordering: it gives the right referrer whether or\n * not the current page has been recorded yet, avoiding a stale first paint.\n */\nexport function useNavReferrer(currentPath: string): NavHistoryEntry | null {\n return useNavHistoryStore((s) => {\n for (let i = s.stack.length - 1; i >= 0; i--) {\n if (s.stack[i].path !== currentPath) return s.stack[i]\n }\n return null\n })\n}\n\n/**\n * Return to the actual previous page via the browser history. Falls back to the\n * provided callback when there's no in-app history to pop (e.g. a deep link).\n */\nexport function navHistoryBack(fallback?: () => void): void {\n if (useNavHistoryStore.getState().stack.length >= 2) {\n window.history.back()\n } else {\n fallback?.()\n }\n}\n\n/** Top-level module segment of a route path ('/financial/statements' → 'financial'). */\nexport function routeModule(path: string): string {\n return path.replace(/^\\/+/, '').split('/')[0] ?? ''\n}\n","import { getSupabaseClientOptional } from '../data/supabase'\nimport type {\n MessageChannel, MessageDefaultsDef, MessageTemplate, ResolvedMessage,\n} from './types'\nimport type { ResolvedDomainEvent } from '../types/plugins'\n\n// ---------------------------------------------------------------------------\n// Default text per event — the \"message\" side of the event catalog.\n//\n// A separate registry from `registerDomainEvents` because they are two things:\n// the event is the FACT (webhooks and audit read it too), this is a suggested\n// reaction to it. A module can emit facts with nothing to say about them.\n// ---------------------------------------------------------------------------\n\nconst defaultsRegistry = new Map<string, MessageDefaultsDef>()\n\nexport function registerMessageDefaults(defs: MessageDefaultsDef[]): void {\n for (const def of defs) defaultsRegistry.set(def.eventKey, def)\n}\n\nexport function getMessageDefaults(): MessageDefaultsDef[] {\n return Array.from(defaultsRegistry.values())\n}\n\nexport function clearMessageDefaults(): void {\n defaultsRegistry.clear()\n}\n\n/**\n * Substitutes the merge fields. Lives beside the catalog because PREVIEW and\n * SEND must agree: a screen doing its own `replace` approves one text and\n * delivers another.\n *\n * An unknown field stays visible as `{{foo}}` on purpose — in the preview that\n * exposes the typo; hiding it would hide the gap until the message had gone out.\n */\nexport function renderMessageTemplate(text: string, values: Record<string, string>): string {\n return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (whole, key: string) => values[key] ?? whole)\n}\n\n/**\n * Joins event (code) + default text (code) + customisation (database).\n *\n * A function and not a query: the merge must give the same answer in the list,\n * the editor and the send, and three places doing the same `??` is how they\n * start to disagree.\n *\n * One row per (event × offered channel). A channel with no default text is left\n * out — there is nothing to switch on.\n */\nexport function resolveMessages(\n overrides: MessageTemplate[],\n events: ResolvedDomainEvent[],\n): ResolvedMessage[] {\n const byKey = new Map(overrides.map((o) => [`${o.eventKey}:${o.channel}`, o]))\n const byEvent = new Map(events.map((e) => [e.name, e]))\n const out: ResolvedMessage[] = []\n\n for (const def of getMessageDefaults()) {\n const event = byEvent.get(def.eventKey)\n // Text without an event is orphaned: the module that emitted the fact is not\n // installed, and showing it would promise a trigger that never comes.\n if (!event) continue\n // Merge fields derived from the event PAYLOAD, not a hand-written list: a\n // list drifts from what the emitter actually sends, and the drift only shows\n // up as a raw `{{order_total}}` reaching the customer.\n const placeholders = (event.fields ?? []).map((f) => `{{${f.name}}}`)\n\n for (const channel of def.channels) {\n const fallback = def.defaults[channel]\n if (!fallback) continue\n const override = byKey.get(`${def.eventKey}:${channel}`) ?? null\n out.push({\n event,\n kind: def.kind,\n channel,\n override,\n enabled: override?.enabled ?? def.defaultEnabled?.[channel] ?? false,\n subject: override?.subject ?? fallback.subject ?? '',\n body: override?.body ?? fallback.body,\n customized: Boolean(override?.subject || override?.body),\n placeholders,\n })\n }\n }\n return out\n}\n\n/** A single resolved event×channel pair — what the detail screen opens. */\nexport function resolveMessage(\n eventKey: string,\n channel: MessageChannel,\n overrides: MessageTemplate[],\n events: ResolvedDomainEvent[],\n): ResolvedMessage | null {\n return resolveMessages(overrides, events)\n .find((m) => m.event.name === eventKey && m.channel === channel) ?? null\n}\n\n/** Events that exist with no text written for them — what webhooks and audit\n * can see and the message list cannot. */\nexport function getEventsWithoutMessages(events: ResolvedDomainEvent[]): ResolvedDomainEvent[] {\n return events.filter((e) => !defaultsRegistry.has(e.name))\n}\n\n// ---------------------------------------------------------------------------\n// Reading the customisations.\n//\n// In core rather than inside the automations plugin because the TABLE is part\n// of the shared contract, not a screen detail: whoever registers an event (the\n// CRM) may ask \"is this on?\" without importing the plugin that draws the list.\n// ---------------------------------------------------------------------------\n\nexport const MESSAGE_TEMPLATES_TABLE = 'plg_automations_templates'\n\n/** Never throws: with no client, no table or no permission the whole catalog\n * still holds on its defaults — a complete state, not an error. */\nexport async function loadMessageOverrides(tenantId?: string): Promise<MessageTemplate[]> {\n const client = getSupabaseClientOptional() as unknown as\n { from: (t: string) => any } | null\n if (!client) return []\n try {\n let q = client.from(MESSAGE_TEMPLATES_TABLE).select('*')\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map((row: any) => ({\n id: row.id,\n tenantId: row.tenant_id,\n eventKey: row.event_key,\n channel: row.channel ?? 'email',\n enabled: row.enabled ?? null,\n subject: row.subject || null,\n body: row.body || null,\n name: row.name || null,\n updatedAt: row.updated_at ?? row.created_at,\n }))\n } catch (err) {\n console.warn('[messaging] could not load overrides; using defaults', err)\n return []\n }\n}\n"]}