@fayz-ai/core 0.18.0 → 0.19.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 (98) hide show
  1. package/dist/access/engine.d.ts +15 -1
  2. package/dist/access/engine.d.ts.map +1 -1
  3. package/dist/access/index.js +2 -2
  4. package/dist/access/index.js.map +1 -1
  5. package/dist/app/app-config.d.ts +25 -0
  6. package/dist/app/app-config.d.ts.map +1 -1
  7. package/dist/{chunk-ED6NBH6U.js → chunk-3TRR2YLM.js} +2 -2
  8. package/dist/{chunk-ED6NBH6U.js.map → chunk-3TRR2YLM.js.map} +1 -1
  9. package/dist/{chunk-AOIYRUTF.js → chunk-4SPEISNL.js} +19 -5
  10. package/dist/chunk-4SPEISNL.js.map +1 -0
  11. package/dist/chunk-6TVRNKWW.js +17 -0
  12. package/dist/chunk-6TVRNKWW.js.map +1 -0
  13. package/dist/{chunk-OHH26S4N.js → chunk-7M4NWLIT.js} +9 -8
  14. package/dist/chunk-7M4NWLIT.js.map +1 -0
  15. package/dist/{chunk-2VY5IJW7.js → chunk-H6XDQXN5.js} +42 -14
  16. package/dist/chunk-H6XDQXN5.js.map +1 -0
  17. package/dist/{chunk-BCI743RH.js → chunk-HVWFFFKN.js} +4 -3
  18. package/dist/chunk-HVWFFFKN.js.map +1 -0
  19. package/dist/chunk-RBPDK2WB.js +104 -0
  20. package/dist/chunk-RBPDK2WB.js.map +1 -0
  21. package/dist/{chunk-2ZAUJVYP.js → chunk-S3EEGDEK.js} +122 -48
  22. package/dist/chunk-S3EEGDEK.js.map +1 -0
  23. package/dist/{chunk-KJUD6JA5.js → chunk-ZGAGCTQM.js} +6 -5
  24. package/dist/chunk-ZGAGCTQM.js.map +1 -0
  25. package/dist/connector-runtime/index.js +1 -1
  26. package/dist/data/archetype.d.ts +16 -0
  27. package/dist/data/archetype.d.ts.map +1 -1
  28. package/dist/data/bulk.d.ts.map +1 -1
  29. package/dist/data/index.js +3 -2
  30. package/dist/data/resolve.d.ts.map +1 -1
  31. package/dist/data/supabase.d.ts.map +1 -1
  32. package/dist/data/types.d.ts +13 -0
  33. package/dist/data/types.d.ts.map +1 -1
  34. package/dist/events/log.d.ts +1 -1
  35. package/dist/events/log.d.ts.map +1 -1
  36. package/dist/fields/store.d.ts +1 -1
  37. package/dist/fields/store.d.ts.map +1 -1
  38. package/dist/i18n/index.d.ts +11 -0
  39. package/dist/i18n/index.d.ts.map +1 -1
  40. package/dist/i18n/index.js +1 -1
  41. package/dist/i18n/shell-translations.en.d.ts.map +1 -1
  42. package/dist/i18n/shell-translations.pt-br.d.ts.map +1 -1
  43. package/dist/index.d.ts +9 -4
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +19 -12
  46. package/dist/index.js.map +1 -1
  47. package/dist/integrations/index.d.ts +8 -8
  48. package/dist/integrations/index.d.ts.map +1 -1
  49. package/dist/integrations/index.js +4 -3
  50. package/dist/integrations/request.d.ts +2 -2
  51. package/dist/integrations/request.d.ts.map +1 -1
  52. package/dist/integrations/runtime.d.ts +1 -1
  53. package/dist/integrations/runtime.d.ts.map +1 -1
  54. package/dist/integrations/settings.d.ts +1 -1
  55. package/dist/integrations/settings.d.ts.map +1 -1
  56. package/dist/integrations/store.d.ts +7 -7
  57. package/dist/integrations/store.d.ts.map +1 -1
  58. package/dist/interaction/haptics.d.ts +5 -0
  59. package/dist/interaction/haptics.d.ts.map +1 -0
  60. package/dist/interaction/index.d.ts +7 -0
  61. package/dist/interaction/index.d.ts.map +1 -0
  62. package/dist/interaction/index.js +3 -0
  63. package/dist/interaction/index.js.map +1 -0
  64. package/dist/interaction/keymap.d.ts +17 -0
  65. package/dist/interaction/keymap.d.ts.map +1 -0
  66. package/dist/interaction/roving.d.ts +9 -0
  67. package/dist/interaction/roving.d.ts.map +1 -0
  68. package/dist/lib/error-message.d.ts +21 -0
  69. package/dist/lib/error-message.d.ts.map +1 -0
  70. package/dist/orders/index.d.ts +114 -0
  71. package/dist/orders/index.d.ts.map +1 -0
  72. package/dist/orders/index.js +168 -0
  73. package/dist/orders/index.js.map +1 -0
  74. package/dist/plugin/index.js +2 -1
  75. package/dist/plugin/runtime.d.ts.map +1 -1
  76. package/dist/registry/extension-points.d.ts.map +1 -1
  77. package/dist/{shell-translations.pt-br-ZSSVWG6H.js → shell-translations.pt-br-GFBWBZZJ.js} +28 -12
  78. package/dist/shell-translations.pt-br-GFBWBZZJ.js.map +1 -0
  79. package/dist/testing/index.js +5 -4
  80. package/dist/testing.d.ts.map +1 -1
  81. package/dist/types/auth.d.ts +12 -0
  82. package/dist/types/auth.d.ts.map +1 -1
  83. package/dist/types/crud.d.ts +42 -0
  84. package/dist/types/crud.d.ts.map +1 -1
  85. package/dist/types/onboarding.d.ts +25 -0
  86. package/dist/types/onboarding.d.ts.map +1 -1
  87. package/dist/types/plugins.d.ts +43 -0
  88. package/dist/types/plugins.d.ts.map +1 -1
  89. package/dist/types/setup-guide.d.ts +120 -0
  90. package/dist/types/setup-guide.d.ts.map +1 -0
  91. package/package.json +12 -3
  92. package/dist/chunk-2VY5IJW7.js.map +0 -1
  93. package/dist/chunk-2ZAUJVYP.js.map +0 -1
  94. package/dist/chunk-AOIYRUTF.js.map +0 -1
  95. package/dist/chunk-BCI743RH.js.map +0 -1
  96. package/dist/chunk-KJUD6JA5.js.map +0 -1
  97. package/dist/chunk-OHH26S4N.js.map +0 -1
  98. package/dist/shell-translations.pt-br-ZSSVWG6H.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/debug.ts","../src/types/plugins.ts","../src/data/backend-env.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/events/envelope.ts","../src/events/useDataVersion.ts","../src/events/log.ts","../src/events/index.tsx","../src/search/text.ts","../src/search/engine.ts","../src/registry/blocks.tsx","../src/manifest/index.ts","../src/manifest/integration-surface.ts","../src/manifest/serialize.ts","../src/manifest/app-manifest.schema.json","../src/app/render.tsx","../src/app/app-config.ts","../src/app/service-client.ts","../src/router/history.ts","../src/messaging/registry.ts","../src/messaging/provider-template.ts","../src/messaging/phone.ts","../src/telemetry/errors.ts"],"names":["str","React","React2","client","started","via","record","React4","cache","isRpcCapable","withTimeout","next"],"mappings":"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","file":"index.js","sourcesContent":["// createDebug — the SDK's one dev-console voice.\n//\n// Everything that happens off-screen (an event emitted, a bridge flush, a\n// validation refusal, a background sync) logs through here instead of a bare\n// console.log, and one switch rules them all:\n//\n// dev build ON for every scope, automatically\n// any build localStorage.debug = '*' | 'events,bridge' | 'shop.*'\n// silence in dev localStorage.debug = 'off'\n//\n// The npm `debug` convention on purpose — people already know\n// `localStorage.debug = '*'` from a decade of libraries. Scopes are short\n// nouns ('events', 'bridge', 'shop'); a scope matches its own name, a\n// `prefix.*` pattern, or '*'.\n//\n// This is a DEV lens, not telemetry: nothing here is collected, sampled or\n// shipped anywhere. Production users with the flag unset pay one boolean check\n// per call and no string work.\n\ntype LogFn = (message: string, ...data: unknown[]) => void\n\nexport interface DebugLogger extends LogFn {\n /** Amber, for the recoverable: a fallback taken, a retry scheduled. */\n warn: LogFn\n /** Red, for the broken: a refused write, a dead letter, a bad contract. */\n error: LogFn\n /** True when this scope currently prints — guard expensive payload builds. */\n readonly enabled: boolean\n}\n\nfunction isDevBuild(): boolean {\n try {\n // Vite consumers get import.meta.env; node (tests, scripts) does not.\n return (import.meta as unknown as { env?: { DEV?: boolean } }).env?.DEV === true\n } catch {\n return false\n }\n}\n\nfunction flagValue(): string | null {\n try {\n return typeof localStorage !== 'undefined' ? localStorage.getItem('debug') : null\n } catch {\n // Storage can throw (privacy mode, sandboxed frames) — then dev-mode rules.\n return null\n }\n}\n\nfunction scopeEnabled(scope: string): boolean {\n const flag = flagValue()\n if (flag === 'off') return false\n if (flag) {\n return flag.split(',').some((raw) => {\n const pattern = raw.trim()\n if (!pattern) return false\n if (pattern === '*' || pattern === scope) return true\n if (pattern.endsWith('.*')) return scope.startsWith(pattern.slice(0, -1))\n return false\n })\n }\n return isDevBuild()\n}\n\n/** Stable pastel per scope, so 'events' is always the same color in a session. */\nfunction scopeColor(scope: string): string {\n let hash = 0\n for (let i = 0; i < scope.length; i++) hash = (hash * 31 + scope.charCodeAt(i)) | 0\n return `hsl(${Math.abs(hash) % 360} 60% 45%)`\n}\n\nconst LEVEL_STYLE = { log: '', warn: 'color:#b45309', error: 'color:#dc2626' } as const\n\nexport function createDebug(scope: string): DebugLogger {\n const badge = `%c${scope}%c`\n const badgeStyle = `color:${scopeColor(scope)};font-weight:600`\n\n const emit = (level: 'log' | 'warn' | 'error'): LogFn => (message, ...data) => {\n if (!scopeEnabled(scope)) return\n // eslint-disable-next-line no-console\n console[level](`${badge} ${message}`, badgeStyle, LEVEL_STYLE[level], ...data)\n }\n\n const logger = emit('log') as DebugLogger\n logger.warn = emit('warn')\n logger.error = emit('error')\n Object.defineProperty(logger, 'enabled', { get: () => scopeEnabled(scope) })\n return logger\n}\n","import type { EventField } from '../events/types'\nimport type React from 'react'\nimport type { AgentRole } from './agents'\nimport type { EntityDef } from './crud'\nimport type { AnalyticsCardDef, ResolvedAnalyticsCard } from './analytics'\nimport type { FeatureDeclaration, PermissionAction } from './permissions'\nimport type { LimitDeclaration } from './entitlements'\nimport type { OnboardingProgramDef, ResolvedOnboardingProgram } from './onboarding'\nimport type { ConnectorDefinition } from '../integrations'\nimport type { DataProvider } from '../data/types'\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 * Heading this entry sits under, WITHIN its section — the app rail's half of\n * the `group` the settings rail already draws (see `PluginSettingsTab.group`).\n * Consecutive entries sharing a group render under one heading, so `position`\n * has to keep a group's entries contiguous.\n *\n * Plugin factories are not expected to invent one: a heading is a statement\n * about how THIS app's rail is divided (\"Serviço\" / \"Retaguarda\"), which the\n * plugin cannot know. The app stamps it on the manifests it assembles.\n */\n group?: string\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 /**\n * Heading these tabs are filed under in the settings rail — \"Commerce\",\n * \"Estoque\". A plugin that contributes several related screens says so once\n * per tab and they group; one that contributes a single tab leaves it unset\n * and lands under the generic \"Plugins\" run, exactly as before.\n */\n group?: 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. */\n/**\n * A fact this plugin REACTS to, delivered by the event log (#277, migration 149).\n *\n * The counterpart of {@link PluginEventDefinition}, which declares what a plugin\n * emits. A subscription is the other half of the contract the round-3 decision\n * settled: business effect crosses plugins through the log, never through the\n * in-memory bus — the bus only reaches listeners inside one app process, so a\n * sale closed on the storefront at 2am, an import in bulk, or a plugin in\n * another cluster all emit into silence.\n *\n * `handler` names a Postgres function the plugin's own migration created. It\n * takes the event row as jsonb, returns jsonb, and raising is how it reports\n * failure. Delivery is keyed (event, plugin, handler), so a handler is called\n * once per fact no matter how often the consumer runs.\n */\n/**\n * A named PART of a plugin, priced or permitted on its own (#281, ADR 0025).\n *\n * The decision this exists for: a plugin is not always all-or-nothing. The\n * financial plugin's ledger is what every customer needs; its bank\n * reconciliation is what some of them pay for. Without facets the only choices\n * are to give away the paid half or to split one coherent module into two\n * plugins with a seam down the middle of a domain.\n *\n * A facet is not a feature flag. It is an entitlement grain: `app.plan_grants`\n * and `app.tenant_plugins` are both keyed on `(plugin, facet)`, so a plan\n * permits it, a tenant has it, and one predicate answers both.\n *\n * The plugin itself is the facet with an empty name. Declaring facets does not\n * change what the plugin CAN do — only what a given tenant is entitled to.\n */\nexport interface PluginFacet {\n /** Stable id, unique within the plugin. Written into plan grants and activations. */\n id: string\n /** What a customer is buying, in their words — this reaches an upgrade prompt. */\n label: string\n description?: string\n /**\n * True when the facet comes with the plugin at no extra entitlement — the\n * \"free half\". A plugin whose facets are ALL included is one a plan either\n * permits or does not, and the split is only about what a screen may show.\n */\n includedWithPlugin?: boolean\n}\n\nexport interface PluginEventSubscription {\n /** The event this plugin reacts to, e.g. 'order.completed'. */\n event: string\n /** A public Postgres function taking (jsonb) and returning jsonb. */\n handler: string\n /** Why this plugin cares — shown in the subscription census. */\n description?: string\n /**\n * How many times a failing delivery is retried before it is abandoned —\n * visibly, not silently. Defaults to 5; the backoff is 2^n seconds, capped\n * at an hour.\n */\n maxAttempts?: number\n}\n\nexport interface ResolvedDomainEvent extends PluginEventDefinition {\n pluginId: string\n pluginName: string\n pluginIcon?: string\n}\n\n/**\n * A table whose row changes become domain events, via a trigger calling\n * `plg_emit_event`.\n *\n * The browser store already emits on its own writes. This covers the writes it\n * never sees — an edge function's upsert, an import, a hand-run SQL fix — which\n * are exactly the writes an integration makes. Declaring the table instead of\n * hand-writing a trigger per plugin keeps one shape of fact in the ledger.\n */\nexport interface PluginEventSource {\n /** Table in the plugin's schema, e.g. 'plg_blog_posts'. */\n table: string\n /** Entity key the event is named after; the trigger appends the action. */\n entityKey: string\n /** Actions to emit. Default: all three. */\n actions?: Array<'created' | 'updated' | 'deleted'>\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 /**\n * Promote this entry in the menu — tinted tile, brand label.\n *\n * A menu lists options as equals, and one of them usually is not: \"describe\n * it and the assistant builds it\" next to \"fill in the form\" are not two\n * spellings of the same effort. Use it for at most ONE entry, or the tint\n * stops meaning anything.\n */\n highlight?: boolean\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 /**\n * Shape of an `object` property — the same recursion JSON Schema has, which\n * this type was missing. Without it an order's `items` could only be declared\n * as \"an array of objects\" with the real shape written in prose, and the model\n * had to infer the key names from a sentence.\n */\n properties?: Record<string, AIToolParameterProperty>\n required?: string[]\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\n/**\n * An edge function this plugin ships under `functions/<slug>/`.\n *\n * A function that nobody copies into the app is a dead feature — that is the\n * documented fate of the google-calendar function, which existed in the SDK for\n * months without ever being deployed. Declaring it lets the app's sync step and\n * `fayz doctor` name what is missing instead of failing silently.\n */\nexport interface PluginFunctionDeclaration {\n /** Directory under `functions/`, and the deployed function name. */\n slug: string\n /**\n * Whether Supabase requires a caller JWT. A function reached through the Fayz\n * ingress sets `false` and authenticates the signature instead.\n */\n verifyJwt: boolean\n /** Secret NAMES the function reads. Names only — a value here is a leak. */\n secrets?: string[]\n /** How the outside world reaches it: through the Fayz ingress, or not at all. */\n ingress: 'fayz' | 'none'\n /**\n * Pool RPCs the function's credential is allowed to call. The privilege comes\n * from this list, not from who wrote the function — see the 2026-08-11 ADR.\n */\n grants?: string[]\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 /**\n * Which member of the app's staff carries this capability. Falls back to the\n * plugin's {@link PluginManifest.defaultAgentRole}, and a tool with neither\n * is shared by everyone (navigation, search — the primitives no single job\n * owns). See {@link AgentRole}.\n */\n role?: AgentRole\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 * Read/write this registry through a provider the plugin already owns, instead\n * of the table `entity.data.table` names. For a registry whose writes are not\n * a plain column mapping: delivery zones normalise the CEP the merchant typed\n * ('22.041-001' → '22041001') before it reaches a column that\n * shop_quote_shipping compares as bare digits, and a generic write would store\n * the punctuation and silently stop matching a whole city.\n */\n dataProvider?: DataProvider<never>\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 * What \"up and running\" means for this module: the steps a new tenant has to\n * finish before it is live, plus the instructions the agent follows while\n * guiding them. Seeded as tasks, shown in the getting-started checklist, and\n * ticked from either side. See {@link OnboardingProgramDef}.\n */\n program?: OnboardingProgramDef\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 /** Tables whose row changes emit those events server-side. See {@link PluginEventSource}. */\n emitsFrom?: PluginEventSource[]\n /** Facts this plugin REACTS to, delivered by the event log. See {@link PluginEventSubscription}. */\n subscribesTo?: PluginEventSubscription[]\n /**\n * The parts of this plugin that can be entitled separately (#281, ADR 0025).\n * Omit for a plugin that is all-or-nothing — most of them. See {@link PluginFacet}.\n */\n facets?: PluginFacet[]\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 /**\n * The staff role this plugin's capabilities belong to, inherited by every\n * `aiTool` that does not name its own. One line per plugin instead of a tag\n * on eighty tools — and it is what lets an app cast \"growth\" with a name\n * without re-mapping a single feature. See {@link AgentRole}.\n */\n defaultAgentRole?: AgentRole\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 /**\n * Platform connector slugs this module integrates with — the shelf a tenant is\n * shown under \"Adicionar conector\", and the \"Integra com\" row on the plugin's\n * page in the Fayz builder.\n *\n * The module is what decides: CRM brings Kommo and RD Station, Financeiro\n * brings AbacatePay and Pagar.me, Agenda brings Google Calendar and Calendly.\n * Neither a vertical nor a tag can answer that, and the platform catalogue\n * answers it for the wrong audience — it is a builder directory, and reading\n * it tenant-side is how the owner of a salon was once offered Supabase.\n *\n * Declaring a slug is NOT implementing it. A slug that also has a\n * {@link ConnectorDefinition} behind it (matched on `catalogSlug ?? id`) reads\n * \"Disponível\" and can be connected; the rest read \"Em breve\" and are\n * informational. Every slug must exist in the platform catalogue — the\n * generator refuses one that does not, which is what keeps this a relationship\n * rather than a wishlist.\n */\n integrations?: string[]\n /** Edge functions shipped under `functions/`. See {@link PluginFunctionDeclaration}. */\n functions?: PluginFunctionDeclaration[]\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 /** Activation programs declared by ACTIVE plugins, ordered. A disabled module\n * asks nothing of a new tenant, so its steps drop off the checklist too. */\n onboardingPrograms: ResolvedOnboardingProgram[]\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","/* 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// The edge proxy\n//\n// Same answer, resolved by the SERVER and kept there (public.postal_areas).\n// Two reasons to prefer it once a delivery rule can name a neighbourhood:\n//\n// · the rule is matched against what the server resolved, not against what\n// the browser sent — a field that decides whether a store delivers is a\n// field somebody has a reason to lie in;\n// · the cache stops being one localStorage per shopper and becomes one row\n// per postcode for the whole pool, which is what keeps a busy storefront\n// clear of ViaCEP's per-IP limit.\n//\n// It degrades to ViaCEP rather than failing: the address is a convenience for\n// the person typing, and losing it must cost typing, never the sale.\n// ---------------------------------------------------------------------------\n\nexport interface EdgePostalOptions {\n /** Supabase project URL, e.g. https://abc.supabase.co */\n supabaseUrl: string\n /** The publishable (anon) key — the function itself runs with verify_jwt off. */\n anonKey?: string\n fetcher?: typeof fetch\n /** Used when the function is unreachable. Defaults to ViaCEP. */\n fallback?: PostalLookupProvider\n}\n\nexport function createEdgePostalProvider(options: EdgePostalOptions): PostalLookupProvider {\n const fetcher = options.fetcher ?? globalThis.fetch\n const fallback = options.fallback ?? createViaCepProvider({ fetcher })\n const endpoint = `${options.supabaseUrl.replace(/\\/+$/, '')}/functions/v1/postal-lookup`\n\n return {\n async lookup(postalCode: string): Promise<PostalAddress | null> {\n const code = normalizePostalCode(postalCode)\n if (code.length !== 8) return null\n\n try {\n const response = await fetcher(endpoint, {\n method: 'POST',\n // EXACTLY these headers. Adding one to this call adds it to the\n // browser's preflight for every function in the pool, and the ~20 of\n // them that pin an allow-list start failing with a silent log.\n headers: {\n 'Content-Type': 'application/json',\n ...(options.anonKey\n ? { apikey: options.anonKey, Authorization: `Bearer ${options.anonKey}` }\n : {}),\n },\n body: JSON.stringify({ postalCode: code }),\n })\n if (!response.ok) throw new Error(`postal-lookup ${response.status}`)\n const data = await response.json()\n if (!data || data.found === false || !data.city) return null\n return {\n postalCode: code,\n street: data.street ?? '',\n district: data.district ?? '',\n city: data.city,\n state: (data.state ?? '').toUpperCase(),\n country: 'BR',\n cityCode: data.cityCode || undefined,\n }\n } catch {\n return fallback.lookup(code)\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","import { eventBus } from './bus'\nimport { createDebug } from '../lib/debug'\nimport type { DomainEvent, DomainEventHandler } from './types'\n\nconst debug = createDebug('events')\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 one line that answers \"did the event even fire?\" — sinks is what\n // carries it to history, audit and the platform bridge; zero sinks in a\n // connected app means an automation upstream will never run.\n debug(`emit ${key}`, { tenantId: event.tenantId, subject: event.subject, sinks: sinks.size, payload })\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 * as React from 'react'\nimport { registerEventSink } from './envelope'\nimport type { DomainEvent } from './types'\n\n// ---------------------------------------------------------------------------\n// \"Isto mudou — releia.\"\n//\n// Toda tela que mostra uma lista tem o mesmo problema e o resolvia sozinha: ela\n// lê uma vez e fica mostrando o mundo daquele instante. Quando a mudança vem de\n// OUTRO lugar — o painel da direita, o assistente criando um cadastro, o agente\n// montando um formulário — a lista continua igual, e duas telas discordando\n// sobre o mesmo fato é pior do que uma estar velha: não dá para saber em qual\n// acreditar.\n//\n// A tentação é um contador por assunto: um para vínculo de unidade, outro para\n// formulário, outro para pedido. São três mecanismos para uma ideia, e o\n// terceiro é sempre o que alguém esquece de disparar.\n//\n// Isto não é um mecanismo novo: os fatos JÁ passam pelo barramento de eventos\n// de domínio — `createCrudStore` emite `registry.<entidade>.created` a cada\n// cadastro, venha ele de um formulário, de uma importação ou do assistente.\n// Faltava só o outro lado: um jeito de uma tela dizer \"me acorde quando isso\n// acontecer\" sem virar assinante nomeado de trinta chaves.\n//\n// Devolve um NÚMERO, e não os dados. Guardar os dados aqui seria um segundo\n// cache para divergir do primeiro; quem se importa refaz a própria leitura, que\n// é a única que sabe o que ela precisa.\n// ---------------------------------------------------------------------------\n\n/** Prefixo (`'registry.'`), chave exata, lista de qualquer um dos dois, ou um\n * teste próprio. `'*'` é tudo — útil num painel de depuração, caro numa lista. */\nexport type DomainEventMatch = string | string[] | ((event: DomainEvent) => boolean)\n\n/** Exportado para poder ser testado sem montar React: é aqui que mora a única\n * decisão do arquivo, e o resto é assinar e desassinar. */\nexport function matchesDomainEvent(event: DomainEvent, match: DomainEventMatch): boolean {\n if (typeof match === 'function') return match(event)\n const patterns = Array.isArray(match) ? match : [match]\n return patterns.some((p) =>\n p === '*' ||\n (p.endsWith('*') ? event.key.startsWith(p.slice(0, -1)) : p === event.key))\n}\n\n/**\n * Um contador que sobe quando um fato que interessa acontece.\n *\n * const version = useDataVersion('registry.person:staff.*')\n * React.useEffect(() => { void reload() }, [reload, version])\n *\n * Pelo sink, e não por assinatura nomeada, de propósito: o sink vê TODO evento,\n * inclusive os de um módulo que ainda não existia quando a tela foi escrita.\n * Assinar por nome exigiria a lista de chaves conhecidas, e o módulo que alguém\n * esquecesse de listar sumiria da atualização sem avisar — o mesmo defeito que\n * a história e a auditoria já resolveram assim.\n */\nexport function useDataVersion(match: DomainEventMatch): number {\n const [version, setVersion] = React.useState(0)\n // Numa ref para o sink não ser recriado a cada render quando quem chama passa\n // um array ou uma função inline — que é o caso normal.\n const matchRef = React.useRef(match)\n matchRef.current = match\n\n React.useEffect(() => registerEventSink((event) => {\n if (matchesDomainEvent(event, matchRef.current)) setVersion((v) => v + 1)\n }), [])\n\n return version\n}\n\n/**\n * O mesmo, quando a tela quer o evento e não só a notícia de que houve um.\n *\n * Para quem consegue aplicar a mudança sem reler tudo — inserir a linha nova no\n * topo em vez de buscar a lista inteira de novo.\n */\nexport function useOnDataChange(\n match: DomainEventMatch,\n handler: (event: DomainEvent) => void,\n): void {\n const matchRef = React.useRef(match)\n matchRef.current = match\n const handlerRef = React.useRef(handler)\n handlerRef.current = handler\n\n React.useEffect(() => registerEventSink((event) => {\n if (matchesDomainEvent(event, matchRef.current)) handlerRef.current(event)\n }), [])\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// Rows waiting for the end of the current tick. Bulk acts emit one fact PER\n// record — deleting 40 products is 40 facts, and automations are right to see\n// 40 — but 40 facts must not be 40 inserts. Everything emitted in the same tick\n// leaves as one statement; a lone event still goes out immediately after it,\n// just via a microtask.\nlet pending: Record<string, unknown>[] = []\nlet flushing = false\n\n// Um pool sem a tabela (migração 027 não aplicada) falharia em TODO evento, para\n// sempre: um 404 no console a cada gravação, encostado no erro de verdade que a\n// pessoa está tentando ler. Descoberto uma vez, desligamos a história — ela é\n// opcional por definição, e o silêncio é a promessa de recordEventRun.\nlet sinkDisabled = false\n\nfunction flushSoon(): void {\n if (flushing) return\n flushing = true\n queueMicrotask(() => {\n const rows = pending\n pending = []\n flushing = false\n if (!rows.length || sinkDisabled) return\n const db = client()\n if (!db) return\n void (async () => {\n try {\n // postgrest-js devolve o erro, não o lança — sem ler `error` aqui o\n // catch nunca via nada e a falha só aparecia na aba de rede.\n const { error } = await db.from(EVENT_LOG_TABLE).insert(rows)\n if (!error) return\n if (error.code === 'PGRST205' || String(error.message ?? '').includes('Could not find the table')) {\n sinkDisabled = true\n console.warn(`[events] ${EVENT_LOG_TABLE} não existe neste pool — histórico desligado (migração 027).`)\n return\n }\n console.warn('[events] could not record run', error)\n } catch (err) {\n console.warn('[events] could not record run', err)\n }\n })()\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 pending.push({\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 flushSoon()\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'\nimport { eventBus } from './bus'\nimport type { EventHandler } from './bus'\n\nexport { createEventBus, eventBus } from './bus'\nexport type { EventBus, EventHandler } from './bus'\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 { useDataVersion, useOnDataChange } from './useDataVersion'\nexport type { DomainEventMatch } from './useDataVersion'\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","// 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.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\n// 137 renamed this RPC; 141 leaves a wrapper under the old name for pools that\n// have taken it. A pool that has taken NEITHER — dentist, agency, pulse and the\n// other projects outside the four aligned clusters — still answers only to the\n// old name, and asking for the new one there would drop global search to the\n// per-table scan without anyone noticing it got slower.\n//\n// So both names, new one first, and the answer is remembered: a pool is on one\n// side of the rename or the other and does not move mid-session.\nconst RPC_NAMES = ['global_search', 'fayz_global_search'] as const\nlet rpcName: string = RPC_NAMES[0]\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; cached?: 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 cached: opts.cached ?? opts.via === 'cache',\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 RPC_NAMES.some((n) => message.includes(n))\n && (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 args = {\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 // Try the name we settled on; if THIS pool is on the other side of the\n // rename, try the other one once and settle there instead.\n let { data, error } = await client.rpc(rpcName, args)\n if (error && isMissingFunction(error)) {\n const other = RPC_NAMES.find((n) => n !== rpcName)\n if (other) {\n const retry = await client.rpc(other, args)\n if (!retry.error) { rpcName = other; data = retry.data; error = null }\n else if (isMissingFunction(retry.error)) { error = retry.error }\n else throw retry.error\n }\n }\n\n if (error) {\n if (isMissingFunction(error)) {\n // Neither name answers: this pool never took the search migration at all.\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 fresh?: boolean,\n): Promise<{ hits: SearchHit[]; failed: string[]; cached: boolean }> {\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 let anyCached = false\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 cache: fresh ? false : undefined,\n })\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 if (result.cached || result.stale) anyCached = true\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, cached: anyCached }\n\n const second = collect(await round(token, widePageSize))\n return { hits: second.hits, failed: [...new Set([...first.failed, ...second.failed])], cached: anyCached }\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 = options.fresh ? undefined : 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 && !options.fresh) {\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 let anyCached = false\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, options.fresh)\n hits = scanned.hits\n failed = scanned.failed\n anyCached = scanned.cached\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, cached: anyCached,\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 { AgentRole } from '../types/agents'\nimport 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 /** Staff role that carries it — resolved (tool's own, else its plugin's).\n * Absent means shared by every agent. */\n role?: AgentRole\n}\n\n/** JSON-safe projection of an {@link AgentStaffDef}. Behaviour-free: prose and\n * the hiring key, no components. */\nexport interface AgentStaffContract {\n role: AgentRole\n name: string\n title: string\n avatar?: string\n goal?: string\n backstory?: string\n instructions?: string\n host?: boolean\n included?: boolean\n /** Entitlement feature that hires this agent (`assistant.<role>` by default). */\n feature?: 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 /** The app's single face, kept for every consumer that predates `staff`.\n * With a cast, this mirrors its host — an old reader still gets a name. */\n persona?: { name?: string; systemPrompt?: string; icon?: string }\n /** The named agents this app employs, two to four. See {@link AgentStaffDef}. */\n staff?: AgentStaffContract[]\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\n// ---------------------------------------------------------------------------\n// Integration Surface — what this app hands to ANOTHER app that connects to it.\n//\n// Separate from the agent contract on purpose: the agent contract describes\n// everything the app can do for its own user, and this names the far smaller\n// set a stranger may reach across an organization boundary. A connected app\n// gets these entities and nothing else — `permissions.entities` on the platform\n// starts every operation at false, so an entity left out of this list is not\n// merely undocumented, it is unreachable.\n// ---------------------------------------------------------------------------\n\n/** What the app's code declares: an entity key and what may be done with it. */\nexport interface SharedEntityDeclaration {\n /** Key of an entity in `agent.entities`. The table is read from there. */\n entity: string\n /** `read` is the floor. Deleting another product's records is not expressible. */\n operations: Array<'read' | 'create' | 'update'>\n /** Written for the person on the consent screen, not for the integrator. */\n reason: string\n}\n\n/** The emitted form: the declaration with its table resolved at emit, so the\n * platform reads one structure instead of joining two. */\nexport interface SharedEntity extends SharedEntityDeclaration {\n label: string\n table: string\n schema?: string\n tenantIdColumn?: string\n}\n\nexport interface IntegrationSurface {\n entities: SharedEntity[]\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 /** What another app may reach when a member of this org consents. */\n integrationSurface?: IntegrationSurface\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 // Declared on AppManifest and in app-manifest.schema.json since the connector\n // surface landed, but never added here — so every app that publishes one\n // failed validation at boot.\n 'integrationSurface',\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 { EntityContract, IntegrationSurface, SharedEntity, SharedEntityDeclaration } from './index'\n\n/**\n * Declarations → the emitted surface, with each entity's table resolved from\n * the agent contract.\n *\n * Every refusal here is a mistake that would otherwise be SILENT. A misspelled\n * entity key shares nothing and reads as a working integration; a shared entity\n * that is not tenant-scoped hands a stranger every organization in the pool,\n * because the tenant predicate the platform AND-s in has no column to bind to.\n * Both are cheap to catch at emit and expensive to notice in production.\n */\nexport function resolveIntegrationSurface(\n declarations: SharedEntityDeclaration[],\n entities: EntityContract[],\n): IntegrationSurface {\n const byKey = new Map(entities.map((e) => [e.key, e]))\n const seen = new Set<string>()\n\n const resolved = declarations.map((declaration): SharedEntity => {\n const entity = byKey.get(declaration.entity)\n if (!entity) {\n throw new Error(\n `integrationSurface: no entity \"${declaration.entity}\" in this app. ` +\n `Known: ${[...byKey.keys()].sort().join(', ') || '(none)'}`,\n )\n }\n if (seen.has(declaration.entity)) {\n throw new Error(`integrationSurface: \"${declaration.entity}\" is declared twice`)\n }\n seen.add(declaration.entity)\n\n if (entity.data.tenantScoped === false) {\n throw new Error(\n `integrationSurface: \"${declaration.entity}\" is not tenant-scoped, so sharing it would ` +\n `reach every organization in the pool, not the one that consented`,\n )\n }\n if (declaration.operations.length === 0) {\n throw new Error(`integrationSurface: \"${declaration.entity}\" declares no operations`)\n }\n if (!declaration.reason.trim()) {\n throw new Error(\n `integrationSurface: \"${declaration.entity}\" has no reason — it is what the consent screen shows`,\n )\n }\n\n return {\n ...declaration,\n label: entity.label,\n table: entity.data.table,\n ...(entity.data.schema ? { schema: entity.data.schema } : {}),\n ...(entity.data.tenantIdColumn ? { tenantIdColumn: entity.data.tenantIdColumn } : {}),\n }\n })\n\n // One token carries ONE tenant column for every table it opens, so a surface\n // that mixes them would bind the tenant predicate to the wrong column on all\n // but one entity. Loud here; unnoticeable in production.\n const columns = new Set(resolved.map((entity) => entity.tenantIdColumn ?? 'tenant_id'))\n if (columns.size > 1) {\n throw new Error(\n `integrationSurface: shared entities disagree on the tenant column (${[...columns].sort().join(', ')}). ` +\n `A connection carries one, so they cannot be shared together.`,\n )\n }\n\n return { entities: resolved }\n}\n\n/** True when anything here can be written, which is what decides whether the\n * consent screen may offer `write` at all. */\nexport function surfaceAllowsWrites(surface: IntegrationSurface): boolean {\n return surface.entities.some((entity) => entity.operations.some((operation) => operation !== 'read'))\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 \"integrationSurface\": {\n \"$ref\": \"#/$defs/integrationSurface\"\n },\n \"contractHash\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"sha256 of the canonical serialization (excluding this field).\"\n }\n },\n \"$defs\": {\n \"integrationSurface\": {\n \"type\": \"object\",\n \"description\": \"What another app may reach when a member of this organization consents. An entity absent from this list is unreachable, not merely undocumented.\",\n \"required\": [\n \"entities\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"entities\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"entity\",\n \"operations\",\n \"reason\",\n \"label\",\n \"table\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"entity\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Key of an entity in agent.entities.\"\n },\n \"operations\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\n \"read\",\n \"create\",\n \"update\"\n ]\n },\n \"description\": \"Deleting another product's records is deliberately not expressible.\"\n },\n \"reason\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Shown on the consent screen, so it is written for the person approving.\"\n },\n \"label\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"table\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"schema\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"tenantIdColumn\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n }\n }\n }\n },\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","// ---------------------------------------------------------------------------\n// app-config.ts — the shell renders from the database, not from a bundle\n// (#280, ADR 0023, migration 150).\n//\n// The split: the MANIFEST is what a plugin CAN do; the DATABASE is what THIS\n// tenant HAS. Until this existed they were the same thing — activation lived in\n// `app.manifest.json` next to the code, which is why turning a feature on for\n// one customer meant a deploy, and why eleven applications needed eleven\n// repositories.\n//\n// One call returns everything the shell needs before it can render anything:\n// branding, settings, the active plugins and facets, the tenant's own menu\n// composition and the caller's permissions. It is cached per (tenant, user)\n// because it is read on every boot and changes only when someone writes through\n// the RPCs — which is where the cache is dropped.\n// ---------------------------------------------------------------------------\nimport type { TenantPluginBinding } from '../types/plugins'\n\n/** One activation row: a plugin, or one facet of it. */\nexport interface AppConfigPlugin {\n plugin: string\n /** null for the plugin itself; a name for one of its parts. */\n facet: string | null\n status: 'active' | 'disabled'\n /** Who turned it on — manual, plan, trial, agent, default. */\n source: string\n config: Record<string, unknown>\n /** When a trial or courtesy ends; null is forever. */\n expires_at: string | null\n}\n\n/** The tenant's difference over the menu the plugins offer. */\nexport interface AppConfigNavEntry {\n key: string\n hidden: boolean\n label: string | null\n section: 'main' | 'secondary' | 'settings' | null\n position: number | null\n}\n\nexport interface AppConfig {\n tenant_id: string | null\n branding?: Record<string, unknown>\n settings?: Record<string, unknown>\n plugins: AppConfigPlugin[]\n nav: AppConfigNavEntry[]\n permissions?: string[]\n generated_at?: string\n}\n\n/** What a caller with no resolvable tenant gets: nothing, legibly. */\nexport const EMPTY_APP_CONFIG: AppConfig = Object.freeze({\n tenant_id: null,\n plugins: [],\n nav: [],\n permissions: [],\n}) as AppConfig\n\ninterface RpcCapableClient {\n rpc(fn: string, args?: Record<string, unknown>): Promise<{ data: unknown; error: unknown }>\n}\n\nfunction isRpcCapable(client: unknown): client is RpcCapableClient {\n return typeof (client as RpcCapableClient | null)?.rpc === 'function'\n}\n\n// The cache is keyed by tenant because a user who switches accounts must not\n// see the previous one's menu for even one frame.\nconst cache = new Map<string, AppConfig>()\n\n/**\n * Reads the whole configuration in one round trip.\n *\n * Never throws: a shell that cannot render because the configuration call\n * failed is worse than a shell that renders the defaults. The failure is\n * returned as an empty configuration, which is the same thing the RPC returns\n * for a caller with no tenant — and both are visible in one place rather than\n * as a blank screen.\n */\nexport async function fetchAppConfig(\n client: unknown,\n options: { tenantId?: string; force?: boolean } = {},\n): Promise<AppConfig> {\n const key = options.tenantId ?? 'current'\n if (!options.force) {\n const hit = cache.get(key)\n if (hit) return hit\n }\n if (!isRpcCapable(client)) return EMPTY_APP_CONFIG\n\n const { data, error } = await client.rpc('app_config')\n if (error || !data || typeof data !== 'object') return EMPTY_APP_CONFIG\n\n const config = normalizeAppConfig(data as Partial<AppConfig>)\n cache.set(key, config)\n return config\n}\n\n/** Drops what is cached — called after any write through the config RPCs. */\nexport function invalidateAppConfig(tenantId?: string): void {\n if (tenantId) cache.delete(tenantId)\n else cache.clear()\n}\n\nexport function normalizeAppConfig(raw: Partial<AppConfig>): AppConfig {\n return {\n tenant_id: raw.tenant_id ?? null,\n branding: raw.branding ?? {},\n settings: raw.settings ?? {},\n plugins: Array.isArray(raw.plugins) ? raw.plugins : [],\n nav: Array.isArray(raw.nav) ? raw.nav : [],\n permissions: Array.isArray(raw.permissions) ? raw.permissions : [],\n generated_at: raw.generated_at,\n }\n}\n\n/**\n * The activation rows as the plugin runtime already understands them.\n *\n * `resolvePluginRuntime` has accepted `tenantPlugins: TenantPluginBinding[]`\n * since it was written and nothing ever supplied them from anywhere but a file.\n * This is that supply — facet rows are folded into their plugin's config under\n * `facets`, because a facet is a part of a plugin and not a plugin.\n */\nexport function toTenantPluginBindings(config: AppConfig): TenantPluginBinding[] {\n const byPlugin = new Map<string, TenantPluginBinding>()\n\n for (const row of config.plugins) {\n if (row.facet) continue\n byPlugin.set(row.plugin, {\n pluginId: row.plugin,\n status: row.status,\n tenantId: config.tenant_id ?? undefined,\n config: { ...row.config },\n })\n }\n\n for (const row of config.plugins) {\n if (!row.facet) continue\n const parent = byPlugin.get(row.plugin)\n // A facet whose plugin is not active is not a plugin: it is a row that says\n // nothing, and inventing a binding for it would turn the plugin on.\n if (!parent) continue\n const facets = (parent.config?.facets as Record<string, unknown> | undefined) ?? {}\n parent.config = {\n ...parent.config,\n facets: { ...facets, [row.facet]: row.status === 'active' },\n }\n }\n\n return [...byPlugin.values()]\n}\n\n/**\n * Applies the tenant's menu composition to what the plugins offer.\n *\n * Only the difference is stored, so an entry with no row here keeps exactly the\n * position and label its plugin gave it — which is what lets a plugin ship a new\n * entry and have it reach every tenant.\n */\nexport function applyNavComposition<T extends { key: string; label?: string; section?: string; position?: number }>(\n entries: T[],\n nav: AppConfigNavEntry[],\n): T[] {\n const overrides = new Map(nav.map((n) => [n.key, n]))\n return entries\n .filter((entry) => !overrides.get(entry.key)?.hidden)\n .map((entry) => {\n const override = overrides.get(entry.key)\n if (!override) return entry\n return {\n ...entry,\n label: override.label ?? entry.label,\n section: override.section ?? entry.section,\n position: override.position ?? entry.position,\n }\n })\n .sort((a, b) => (a.position ?? 999) - (b.position ?? 999))\n}\n\n// ---------------------------------------------------------------------------\n// The manifest says what a plugin CAN do. The database says what this tenant\n// HAS. Where both speak — branding, locale, a plugin's settings — the database\n// wins, because it is the one that can change without a deploy (#280, ADR 0023).\n// ---------------------------------------------------------------------------\n\n/** The keys a generated app must NOT ship in a file: they are per-tenant. */\nexport const TENANT_OWNED_MANIFEST_KEYS = ['theme', 'branding', 'locale'] as const\n\nexport interface ManifestLike {\n [key: string]: unknown\n theme?: Record<string, unknown>\n branding?: Record<string, unknown>\n locale?: Record<string, unknown>\n surfaces?: Record<string, { plugins?: Array<{ id: string; config?: Record<string, unknown> }> } & Record<string, unknown>>\n}\n\n/**\n * Folds the tenant's configuration over the bundle's manifest.\n *\n * What stays the manifest's: the surfaces, their scaffolds, and which plugin\n * ids the bundle can load at all — an import-graph fact that no database row can\n * change, because the code either shipped or it did not.\n *\n * What the database decides: branding, locale, and whether each of those\n * plugins is on for this tenant, with its settings. That is the whole point of\n * ADR 0023 — eleven customers stop needing eleven repositories, and turning a\n * feature on stops being a deploy.\n *\n * An empty config changes nothing, so a pool that has not run migration 150 yet\n * renders exactly what it rendered before.\n */\nexport function applyAppConfigToManifest<T extends ManifestLike>(manifest: T, config: AppConfig): T {\n const branding = (config.branding ?? {}) as Record<string, unknown>\n const settings = (config.settings ?? {}) as Record<string, unknown>\n const next: ManifestLike = { ...manifest }\n\n if (Object.keys(branding).length > 0) {\n next.theme = { ...(manifest.theme ?? {}), ...(branding.theme as Record<string, unknown> ?? {}) }\n next.branding = { ...(manifest.branding ?? {}), ...branding }\n }\n if (settings.locale && typeof settings.locale === 'object') {\n next.locale = { ...(manifest.locale ?? {}), ...(settings.locale as Record<string, unknown>) }\n }\n\n if (manifest.surfaces && config.plugins.length > 0) {\n const active = new Map(\n config.plugins.filter((p) => p.status === 'active' && !p.facet).map((p) => [p.plugin, p]),\n )\n const surfaces: ManifestLike['surfaces'] = {}\n for (const [name, surface] of Object.entries(manifest.surfaces)) {\n const plugins = surface.plugins\n surfaces[name] = plugins\n ? {\n ...surface,\n // A plugin the bundle carries but this tenant has not turned on is\n // dropped here rather than rendered and hidden — a screen that\n // exists and refuses is worse than one that was never offered.\n plugins: plugins\n .filter((p) => active.has(p.id))\n .map((p) => ({ ...p, config: { ...(p.config ?? {}), ...(active.get(p.id)?.config ?? {}) } })),\n }\n : surface\n }\n next.surfaces = surfaces\n }\n\n return next as T\n}\n","// ---------------------------------------------------------------------------\n// service-client.ts — one door to every service a plugin calls (#278, ADR 0018).\n//\n// The round-3 decision put the valuable half of an open plugin in a service we\n// host: the agenda ships open with the \"suggest a slot\" button, and the\n// intelligence behind it does not ship at all. This is how a plugin makes that\n// call — by NAME, never with a credential, because the credential is the\n// cluster's and the plugin is open source.\n//\n// THE PART THAT IS NOT OPTIONAL. A plugin must work when the service does not\n// answer. `callService` never throws for that reason: it returns a result that\n// says what happened and what the user can still do, taken from the service's\n// own declared fallback. A call site that has to try/catch to keep a screen\n// alive will eventually forget to, and then a network blip is a broken button.\n// ---------------------------------------------------------------------------\n\n/** Why a call did not produce a value. Each one has a different right answer. */\nexport type ServiceRefusal =\n /** The service is not registered, or was turned off. */\n | 'unknown_service'\n /** No tenant in scope — a caller that cannot be placed. */\n | 'no_tenant'\n /** The caller lacks the permission the service requires. */\n | 'forbidden'\n /** The tenant has not contracted it: an upsell, not an error. */\n | 'not_contracted'\n /** It did not answer in time. */\n | 'timeout'\n /** It answered with a failure. */\n | 'failed'\n /** There is nothing to call through (no client, no session). */\n | 'unavailable'\n\nexport interface ServiceSuccess<T> {\n ok: true\n data: T\n durationMs: number\n}\n\nexport interface ServiceFailure {\n ok: false\n reason: ServiceRefusal\n /** What the user can still do, as the service itself declared it. */\n manualFallback?: string\n /** For `not_contracted`: what to offer. */\n entitlement?: string\n plugin?: string\n /** For `forbidden`: what would be needed. */\n permission?: string\n message?: string\n}\n\nexport type ServiceResult<T> = ServiceSuccess<T> | ServiceFailure\n\ninterface RpcCapableClient {\n rpc(fn: string, args?: Record<string, unknown>): Promise<{ data: unknown; error: unknown }>\n functions?: {\n invoke(name: string, options?: { body?: unknown }): Promise<{ data: unknown; error: unknown }>\n }\n}\n\nfunction isRpcCapable(client: unknown): client is RpcCapableClient {\n return typeof (client as RpcCapableClient | null)?.rpc === 'function'\n}\n\nexport interface CallServiceOptions {\n /** Overrides the timeout the registry declares for this service. */\n timeoutMs?: number\n /** The edge function that performs the HTTP leg. Defaults to 'service-router'. */\n router?: string\n /**\n * Calls on behalf of a tenant with no session — the event consumer's 2am\n * reaction (#278). Requires a service-role client; a browser client passing\n * this is refused by the router, not by trust.\n */\n tenantId?: string\n}\n\n/**\n * Calls a service by name.\n *\n * Two round trips by design. The first asks the database whether the call is\n * allowed — which costs nothing and answers the same way everywhere, so a\n * refusal never leaves the cluster and an unentitled tenant never reaches the\n * service at all. Only an allowed call makes the second.\n */\nexport async function callService<T = unknown>(\n client: unknown,\n name: string,\n payload: Record<string, unknown> = {},\n options: CallServiceOptions = {},\n): Promise<ServiceResult<T>> {\n if (!isRpcCapable(client)) {\n return { ok: false, reason: 'unavailable', message: 'no client to call through' }\n }\n\n const started = Date.now()\n\n const forTenant = options.tenantId\n const { data: authData, error: authError } = forTenant\n ? await client.rpc('service_authorize_for', { p_name: name, p_tenant: forTenant })\n : await client.rpc('service_authorize', { p_name: name })\n if (authError || !authData || typeof authData !== 'object') {\n return { ok: false, reason: 'unavailable', message: 'the authorization call itself failed' }\n }\n\n const auth = authData as Record<string, unknown>\n if (auth.allowed !== true) {\n return {\n ok: false,\n reason: (auth.reason as ServiceRefusal) ?? 'failed',\n manualFallback: auth.manual_fallback as string | undefined,\n entitlement: auth.entitlement as string | undefined,\n plugin: auth.plugin as string | undefined,\n permission: auth.permission as string | undefined,\n }\n }\n\n const manualFallback = auth.manual_fallback as string | undefined\n const timeoutMs = options.timeoutMs ?? (auth.timeout_ms as number | undefined) ?? 8000\n\n if (!client.functions) {\n return { ok: false, reason: 'unavailable', manualFallback, message: 'no function transport' }\n }\n\n try {\n const result = await withTimeout(\n client.functions.invoke(options.router ?? 'service-router', {\n body: forTenant ? { service: name, payload, tenant_id: forTenant } : { service: name, payload },\n }),\n timeoutMs,\n )\n const durationMs = Date.now() - started\n\n if (result === TIMED_OUT) {\n void record(client, name, 'timeout', 'client timeout', durationMs, forTenant)\n return { ok: false, reason: 'timeout', manualFallback }\n }\n if (result.error) {\n void record(client, name, 'failed', String(result.error), durationMs, forTenant)\n return { ok: false, reason: 'failed', manualFallback, message: String(result.error) }\n }\n\n void record(client, name, 'ok', null, durationMs, forTenant)\n return { ok: true, data: result.data as T, durationMs }\n } catch (err) {\n const durationMs = Date.now() - started\n void record(client, name, 'failed', String(err), durationMs, forTenant)\n // Deliberately not rethrown: a plugin that has to catch to stay alive will\n // one day forget to, and a network blip becomes a broken screen.\n return { ok: false, reason: 'failed', manualFallback, message: String(err) }\n }\n}\n\nconst TIMED_OUT = Symbol('timed-out') as unknown as { data: unknown; error: unknown }\n\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T | typeof TIMED_OUT> {\n return Promise.race([\n promise,\n new Promise<typeof TIMED_OUT>((resolve) => setTimeout(() => resolve(TIMED_OUT), ms)),\n ])\n}\n\n/** Recording is best-effort: a failure to write history must not fail the call. */\nasync function record(\n client: RpcCapableClient,\n service: string,\n status: string,\n reason: string | null,\n durationMs: number,\n tenantId?: string,\n): Promise<void> {\n try {\n // A system call has no session, so `service_call_record` would have no\n // tenant to attribute to — it names the tenant instead, and leaves the\n // caller NULL, which is true: the system did it, not a sleeping user.\n await (tenantId\n ? client.rpc('service_call_record_for', {\n p_service: service,\n p_tenant: tenantId,\n p_status: status,\n p_reason: reason,\n p_duration_ms: durationMs,\n })\n : client.rpc('service_call_record', {\n p_service: service,\n p_status: status,\n p_reason: reason,\n p_duration_ms: durationMs,\n }))\n } catch {\n /* history is not the call */\n }\n}\n\n/**\n * Calls a service for a tenant with no user present — the worker draining the\n * event log (#277) reacting to a fact at 2am (#278).\n *\n * Same door, same refusals, same never-throws contract. What differs is who is\n * asking: there is no person, so there is no permission to check, and the\n * entitlement rule carries the whole decision because a tenant's contract is a\n * property of the tenant rather than of who is looking.\n *\n * The client must hold the service role. A browser client that passes a tenant\n * is refused by the router, which checks rather than trusts.\n */\nexport function callServiceForTenant<T = unknown>(\n client: unknown,\n tenantId: string,\n name: string,\n payload: Record<string, unknown> = {},\n options: Omit<CallServiceOptions, 'tenantId'> = {},\n): Promise<ServiceResult<T>> {\n return callService<T>(client, name, payload, { ...options, tenantId })\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 MessageAction, MessageActionId, MessageActionKind,\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\nconst ACTION_IDS: MessageActionId[] = ['confirm', 'cancel', 'pay']\nconst ACTION_KINDS: MessageActionKind[] = ['reply', 'payment']\n\n/**\n * Actions out of whatever a jsonb column holds.\n *\n * `null` and a malformed value are two different answers: null means \"no row\n * said anything, use the catalog\", while a row holding junk means somebody\n * customised it into a shape nothing can render — and rendering a button whose\n * id is not in the closed set would send a payload the reply handler cannot\n * match to any action, which reads to the customer as a button that does\n * nothing. So junk collapses to an empty list, not to the default.\n */\nexport function normalizeMessageActions(value: unknown): MessageAction[] | null {\n if (value == null) return null\n if (!Array.isArray(value)) return []\n const out: MessageAction[] = []\n for (const raw of value) {\n const item = raw as Partial<MessageAction> | null\n const id = item?.id\n const kind = item?.kind\n const label = String(item?.label ?? '').trim()\n if (!id || !ACTION_IDS.includes(id) || !kind || !ACTION_KINDS.includes(kind) || !label) continue\n if (out.some((a) => a.id === id)) continue\n out.push({ id, label, kind })\n }\n return out\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 actions: override?.actions ?? fallback.actions ?? [],\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 actions: normalizeMessageActions(row.actions),\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","import { sampleEventPayload } from '../events/envelope'\nimport type { EventField } from '../events/types'\nimport type { MessageAction, MessageChannel } from './types'\n\n// ---------------------------------------------------------------------------\n// Our message → a WhatsApp template Meta will approve.\n//\n// The catalog writes `Oi {{customer_name}}!` because a person has to read and\n// edit it. Meta accepts no such thing: variables are POSITIONAL ({{1}}, {{2}},\n// numbered in reading order), each one needs an example, and the body may not\n// open or close on a variable. Those are three different rejections, all of\n// them hours after submission, and all of them fixable before we ask.\n//\n// So this module is the translation, and it is pure on purpose: it runs in the\n// browser (the editor previews what will be submitted), in a test, and in an\n// edge function, and all three must produce the SAME template — a preview that\n// disagrees with the submission approves one text and sends another.\n//\n// Every rule below is quoted from Tyxter's own OpenAPI description of\n// POST /v1/templates (snapshot in ~/.config/fayz/tyxter-surfaces), which refuses\n// each of them at create time rather than passing them to Meta.\n// ---------------------------------------------------------------------------\n\n/** Meta's three, and the only three Tyxter accepts. */\nexport type ProviderTemplateCategory = 'marketing' | 'utility' | 'authentication'\n\n/** The one language this product writes in. A second one is a second template. */\nexport const PROVIDER_TEMPLATE_LANGUAGE = 'pt_BR'\n\n/** Meta renders at most three reply buttons; the fourth is silently dropped. */\nexport const MAX_QUICK_REPLY_BUTTONS = 3\n\n/**\n * What goes in front of a body that opens on a variable, and behind one that\n * closes on it.\n *\n * Padding rather than refusing, because the text is the tenant's and the rule\n * is Meta's: a body ending `— {{business_name}}` is good copy that Meta will\n * not take. A period is the smallest edit that keeps the sentence intact; a\n * greeting is the smallest one that can open a message without changing tone.\n */\nexport const DEFAULT_LEAD_PADDING = 'Olá! '\n// WORDS, not punctuation: learned from a live production rejection (2026-08-24).\n// Meta refused a body ending in `{{6}}.` with \"Variables can't be at the start\n// or end\" — a bare period does not count as content after a variable, even\n// though the sandbox accepts it. The padding must carry a word.\nexport const DEFAULT_TRAIL_PADDING = ' Até breve!'\n\nexport interface CompileProviderTemplateInput {\n /** Domain event this text reacts to, e.g. `agenda.booking_created`. */\n eventKey: string\n channel: MessageChannel\n /** The catalog body, with NAMED merge fields. */\n body: string\n /** The event's own field descriptors — where each variable's example comes from. */\n fields?: EventField[]\n /** Channel-neutral actions; reply actions become QUICK_REPLY buttons. */\n actions?: MessageAction[]\n /**\n * `marketing` templates are a different Meta category with different pacing\n * and consent rules. Filing one as `utility` is what gets a WABA's quality\n * rating cut, so the kind decides the category rather than a constant.\n */\n kind?: 'transactional' | 'marketing'\n /** Set for a tenant's own version of a product template; absent = the product default. */\n tenantId?: string\n leadPadding?: string\n trailPadding?: string\n}\n\nexport interface ProviderTemplateComponent {\n type: 'BODY' | 'BUTTONS'\n text?: string\n example?: { body_text: string[][] }\n buttons?: { type: 'QUICK_REPLY'; text: string }[]\n}\n\nexport interface CompiledProviderTemplate {\n /** `^[a-z0-9_]+$`, unique per (name, language) inside the Tyxter environment. */\n name: string\n language: typeof PROVIDER_TEMPLATE_LANGUAGE\n category: ProviderTemplateCategory\n components: ProviderTemplateComponent[]\n /**\n * Ordered field names: index 0 is `{{1}}`. This is what a send needs to turn\n * `{customer_name: 'Maria'}` into `{'1': 'Maria'}`, and it is stored beside\n * the approved template because an approved template is immutable — the map\n * that produced it can never be recomputed from a body that has since moved.\n */\n variableMap: string[]\n /** Which button index carries which action. Index is Meta's, zero-based. */\n actionsMap: { index: number; id: MessageAction['id']; kind: MessageAction['kind'] }[]\n /** The positional body exactly as submitted — what a diff compares against. */\n bodySnapshot: string\n /** True when Meta's placement rule forced copy in that was not written by hand. */\n padded: { lead: boolean; trail: boolean }\n}\n\nexport type CompileProviderTemplateResult =\n | { ok: true; template: CompiledProviderTemplate }\n | { ok: false; code: ProviderTemplateErrorCode; message: string; detail?: string }\n\nexport type ProviderTemplateErrorCode =\n | 'empty_body'\n | 'unknown_variable'\n | 'named_placeholder_left'\n | 'too_many_variables'\n\n/** Meta's ceiling on body variables. Past it the template is rejected on review. */\nexport const MAX_TEMPLATE_VARIABLES = 10\n\nconst PLACEHOLDER = /\\{\\{\\s*([\\w]+)\\s*\\}\\}/g\n\n/**\n * A Tyxter-legal template name for this (event × channel × owner).\n *\n * `^[a-z0-9_]+$` is the pattern the API enforces, so the dot in\n * `agenda.booking_created` cannot survive. The tenant suffix is a hash and not\n * the uuid because the uuid does not fit the 512-char name next to anything\n * else and, more to the point, a template name is visible in Meta's Business\n * Manager — a tenant id there is an internal identifier on someone else's\n * screen.\n */\nexport function providerTemplateName(eventKey: string, tenantId?: string): string {\n const slug = String(eventKey ?? '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n const base = `t_${slug || 'message'}`\n const owner = String(tenantId ?? '').trim()\n return owner ? `${base}_${shortHash(owner)}` : base\n}\n\n/**\n * FNV-1a, 32-bit, base36. Not a cryptographic hash and not asked to be: it only\n * has to keep two tenants' names apart inside one project, and it has to be the\n * same in a browser, in Deno and in a test without importing anything.\n */\nexport function shortHash(value: string): string {\n let hash = 0x811c9dc5\n for (let i = 0; i < value.length; i += 1) {\n hash ^= value.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193) >>> 0\n }\n return hash.toString(36).padStart(7, '0')\n}\n\n/** Whether Meta's \"no variable at either edge\" rule applies to this category. */\nexport function placementRuleApplies(category: ProviderTemplateCategory): boolean {\n // Authentication templates are exempt: a one-time-code body legitimately\n // opens on the code. Verbatim from Tyxter's create description.\n return category !== 'authentication'\n}\n\nexport function compileProviderTemplate(\n input: CompileProviderTemplateInput,\n): CompileProviderTemplateResult {\n const source = String(input.body ?? '')\n if (!source.trim()) {\n return { ok: false, code: 'empty_body', message: 'A mensagem está vazia' }\n }\n\n const fields = input.fields ?? []\n const known = new Set(fields.map((f) => f.name))\n // The SAME sample the editor's preview and the webhook test body are built\n // from, so the example Meta reviews is the example the tenant saw. Its\n // fallback for a field with no `example` is the literal `{{name}}`, which\n // would be a template whose example is a placeholder — the label stands in.\n const sample = sampleEventPayload(fields)\n const examples = new Map(\n fields.map((f) => {\n const value = String(sample[f.name] ?? '')\n return [f.name, value && !value.startsWith('{{') ? value : (f.label || f.name)]\n }),\n )\n\n // Reading order, first occurrence wins. A field used twice reuses its own\n // number rather than claiming a second one: the send passes ONE value per\n // field, and two indexes for one field would need two copies of the same\n // value with nothing keeping them equal.\n const variableMap: string[] = []\n let unknown: string | null = null\n\n const positional = source.replace(PLACEHOLDER, (whole, name: string) => {\n if (!known.has(name)) {\n unknown ??= name\n return whole\n }\n let index = variableMap.indexOf(name)\n if (index < 0) {\n variableMap.push(name)\n index = variableMap.length - 1\n }\n return `{{${index + 1}}}`\n })\n\n if (unknown) {\n return {\n ok: false,\n code: 'unknown_variable',\n // Loud, because the alternative is a template Meta approves and a customer\n // reads with `{{cupom}}` printed in it.\n message: `A mensagem usa {{${unknown}}}, que este evento não envia`,\n detail: unknown,\n }\n }\n if (variableMap.length > MAX_TEMPLATE_VARIABLES) {\n return {\n ok: false,\n code: 'too_many_variables',\n message: `A mensagem tem ${variableMap.length} campos e o WhatsApp aceita ${MAX_TEMPLATE_VARIABLES}`,\n }\n }\n\n const category: ProviderTemplateCategory = input.kind === 'marketing' ? 'marketing' : 'utility'\n\n let text = positional\n const padded = { lead: false, trail: false }\n if (placementRuleApplies(category)) {\n // The rule is judged on the TRIMMED text, and the trim removes invisible\n // characters too — so a body that merely starts with a newline is still an\n // edge variable, and padding has to go inside that trim, not around it.\n // Punctuation does not shield an edge variable: real Meta rejected\n // `… — {{6}}.` as ending on a variable (the sandbox accepts it — do not\n // trust the sandbox on this rule). So the edge test skips over anything\n // that is not a letter or digit before deciding.\n if (/^[^\\p{L}\\p{N}]*\\{\\{\\d+\\}\\}/u.test(text.trim())) {\n text = `${input.leadPadding ?? DEFAULT_LEAD_PADDING}${text.trimStart()}`\n padded.lead = true\n }\n if (/\\{\\{\\d+\\}\\}[^\\p{L}\\p{N}]*$/u.test(text.trim())) {\n text = `${text.trimEnd()}${input.trailPadding ?? DEFAULT_TRAIL_PADDING}`\n padded.trail = true\n }\n }\n\n // Belt and braces on the one failure the API names first: a leftover named\n // placeholder is refused for EVERY category, so a bug in the loop above must\n // fail here rather than at Tyxter with the tenant's booking already made.\n const leftover = /\\{\\{\\s*(?!\\d+\\s*\\}\\})[^}]*\\}\\}/.exec(text)\n if (leftover) {\n return {\n ok: false,\n code: 'named_placeholder_left',\n message: 'A mensagem ainda tem um campo com nome, e o WhatsApp só aceita numerados',\n detail: leftover[0],\n }\n }\n\n const components: ProviderTemplateComponent[] = [{\n type: 'BODY',\n text,\n // One row of examples, one cell per variable, in the same order as the map.\n // Meta requires an example for each; Tyxter refuses the create without them.\n ...(variableMap.length > 0\n ? { example: { body_text: [variableMap.map((name) => examples.get(name) ?? name)] } }\n : {}),\n }]\n\n // Only `reply` actions become buttons. `pay` is a payment rail, and until\n // that rail is ready (WP5) a QUICK_REPLY saying \"Pagar\" would be a button\n // that takes the money nowhere.\n const replies = (input.actions ?? [])\n .filter((action) => action.kind === 'reply')\n .slice(0, MAX_QUICK_REPLY_BUTTONS)\n\n const actionsMap = replies.map((action, index) => ({\n index,\n id: action.id,\n kind: action.kind,\n }))\n\n if (replies.length > 0) {\n components.push({\n type: 'BUTTONS',\n buttons: replies.map((action) => ({\n type: 'QUICK_REPLY' as const,\n // 20 is Meta's button-text ceiling. Truncating beats a rejection that\n // arrives a day later naming a component index.\n text: action.label.slice(0, 20),\n })),\n })\n }\n\n return {\n ok: true,\n template: {\n name: providerTemplateName(input.eventKey, input.tenantId),\n language: PROVIDER_TEMPLATE_LANGUAGE,\n category,\n components,\n variableMap,\n actionsMap,\n bodySnapshot: text,\n padded,\n },\n }\n}\n\n/**\n * Values for a send, keyed the way `POST /v1/messages` wants them.\n *\n * The map is read from the APPROVED template's stored `variable_map`, never\n * recomputed from today's body: the template Meta approved is immutable, and a\n * body edited since would silently renumber the variables of a message already\n * in flight. A field the caller did not send becomes an empty string rather\n * than a missing key — Meta refuses a send whose parameter count does not match\n * the template, so a hole has to be a value.\n */\nexport function positionalVariables(\n variableMap: string[],\n values: Record<string, string | number | null | undefined>,\n): Record<string, string> {\n const out: Record<string, string> = {}\n variableMap.forEach((name, index) => {\n const value = values[name]\n out[String(index + 1)] = value == null ? '' : String(value)\n })\n return out\n}\n","// ---------------------------------------------------------------------------\n// One Brazilian phone number, written the one way a messaging provider accepts.\n//\n// The problem is not formatting, it is that FOUR spellings of the same number\n// are all in the database at once and none of them match each other:\n//\n// (21) 99889-9889 what the receptionist typed into the client's card\n// 21998899889 what an import wrote\n// +5521998899889 what WhatsApp sends on an inbound message\n// +552198899889 the SAME line before 2016, when mobiles gained a 9th\n// digit — and still how some old records hold it\n//\n// Plain string equality never matches any two of those, which is exactly the\n// bug legacy solved four separate times, four slightly different ways. This is\n// the one implementation, and it is channel-neutral on purpose: a phone number\n// is not a WhatsApp fact.\n//\n// The edge functions cannot import this module — a Supabase function may import\n// exactly one bare specifier (@fayz-ai/core/connector-runtime, and this is not\n// it). `plugins/plugin-conversations/functions/_shared/tyxter-runtime.js` holds\n// a mirror of these two functions, and the two are held to the SAME case table\n// (packages/core/test/messaging/phone-cases.json) by both test suites, so they\n// cannot drift in silence.\n// ---------------------------------------------------------------------------\n\n/** Brazil. The only country code this module knows how to repair. */\nexport const BR_COUNTRY_CALLING_CODE = '55'\n\n/**\n * How many trailing digits identify a line no matter how it was written.\n *\n * Eight, because that is what survives every variation above: the area code can\n * be missing, the country code can be missing, and the mobile 9 can be missing,\n * but the last eight digits of a Brazilian line are the same in all four\n * spellings. Nine would break on exactly the ambiguity this exists to bridge.\n */\nexport const BR_MATCH_SUFFIX_LENGTH = 8\n\n/** Every DDD in the Brazilian plan is 11–99 and none of them ends in 0. */\nfunction isPlausibleDdd(ddd: string): boolean {\n const n = Number(ddd)\n return n >= 11 && n <= 99 && !ddd.endsWith('0')\n}\n\n/**\n * A 10-digit national number is a mobile that predates the 9th digit when its\n * subscriber part starts 6–9; 2–5 is a landline and must be left alone.\n *\n * Adding the 9 is the right repair for a SEND: a mobile written without it is a\n * pre-2016 record, and Meta will not deliver to the eight-digit form. Adding it\n * to a landline would invent a number that does not exist.\n */\nfunction isLegacyMobile(national: string): boolean {\n return national.length === 10 && /^[6-9]/.test(national.slice(2))\n}\n\n/**\n * The number as `+55DDDNNNNNNNNN`, or `null` when the input cannot be one.\n *\n * `null` and not a throw, and not a best-effort string: the caller's next move\n * is to refuse the send with the number named, and a function that returns\n * something plausible for `'a combinar'` would send a booking confirmation into\n * the void and report success.\n *\n * A number that already carries a DIFFERENT country code passes through\n * untouched when it is a valid E.164 — a foreign customer's line is not a\n * malformed Brazilian one, and \"repairing\" it would be the worst kind of wrong.\n */\nexport function normalizeBrPhoneToE164(input: string | null | undefined): string | null {\n const raw = String(input ?? '').trim()\n if (!raw) return null\n\n const hadPlus = raw.startsWith('+')\n const digits = raw.replace(/\\D/g, '')\n if (!digits) return null\n\n // An explicit + with a country code that is not 55: not ours to touch.\n if (hadPlus && !digits.startsWith(BR_COUNTRY_CALLING_CODE)) {\n return digits.length >= 8 && digits.length <= 15 ? `+${digits}` : null\n }\n\n let national = digits\n if (national.startsWith(BR_COUNTRY_CALLING_CODE) && national.length > 11) {\n // 55 + 10 or 11 national digits. Longer than that is a typo, not a number,\n // and shorter means the leading 55 was an area code that happens to read\n // like the country code (DDD 55 is Santa Maria/RS — a real one).\n national = national.slice(2)\n }\n\n if (national.length === 10 || national.length === 11) {\n if (!isPlausibleDdd(national.slice(0, 2))) return null\n if (national.length === 11 && !/^9/.test(national.slice(2))) {\n // 11 digits whose subscriber part does not start with 9 is not a shape the\n // plan issues — an extra digit somewhere, and guessing where is how a\n // message reaches a stranger.\n return null\n }\n const repaired = isLegacyMobile(national)\n ? `${national.slice(0, 2)}9${national.slice(2)}`\n : national\n return `+${BR_COUNTRY_CALLING_CODE}${repaired}`\n }\n\n // No area code, or too many digits to place one: unusable either way.\n return null\n}\n\n/** The national part of a normalized number — what the structured recipient wants. */\nexport function brNationalNumber(e164: string | null | undefined): string | null {\n const value = String(e164 ?? '').trim()\n if (!value.startsWith(`+${BR_COUNTRY_CALLING_CODE}`)) return null\n const national = value.slice(3)\n return /^\\d{10,11}$/.test(national) ? national : null\n}\n\n/**\n * The key two spellings of one line agree on. For matching a stored contact\n * against the number an inbound message arrived from — never for sending.\n */\nexport function brPhoneSuffixKey(input: string | null | undefined): string | null {\n const digits = String(input ?? '').replace(/\\D/g, '')\n return digits.length >= BR_MATCH_SUFFIX_LENGTH ? digits.slice(-BR_MATCH_SUFFIX_LENGTH) : null\n}\n","import { emitDomainEvent } from '../events/envelope'\nimport { getActiveTenantId } from '../lib/tenant'\n\n// ---------------------------------------------------------------------------\n// Frontend error telemetry.\n//\n// One funnel for every way the UI can break — a render that throws, a promise\n// nobody caught, a script error, a `reportAppError` call from a catch block —\n// so that \"what did the user see\" is answerable from one place instead of three\n// half-instrumented ones.\n//\n// The SDK deliberately depends on NO vendor. Reporters are registered by the\n// host app, which is also where the DSN/key lives: every project has its own,\n// and a key compiled into the SDK would be the same key for all of them. See\n// createVendorReporter below for the Sentry/PostHog shape.\n//\n// Everything here is fire-and-forget and swallows its own failures. Telemetry\n// that throws while reporting an error turns one broken page into a loop.\n// ---------------------------------------------------------------------------\n\n/** Where the error came from — the dimension worth splitting dashboards on. */\nexport type AppErrorSource =\n /** A React subtree threw during render (caught by an error boundary). */\n | 'render'\n /** window.onerror — script errors outside React. */\n | 'window'\n /** unhandledrejection — a promise nobody caught. */\n | 'promise'\n /** An explicit reportAppError() from a catch block. */\n | 'manual'\n\nexport interface AppErrorContext {\n source?: AppErrorSource\n /** Route pattern when known ('/settings/custom_forms/templates/:id'), so the\n * grouping does not explode into one bucket per record id. */\n route?: string | null\n /** The concrete URL/hash the user was on. */\n location?: string | null\n componentStack?: string | null\n tenantId?: string | null\n userId?: string | null\n /** Anything the caller knows and the funnel cannot guess. */\n extra?: Record<string, unknown>\n}\n\nexport interface AppErrorReport {\n /** Short correlation id. It is shown on the error screen and travels with the\n * event, so a user reading \"ERR-7F3A21\" out loud lands on the exact record. */\n id: string\n name: string\n message: string\n stack?: string\n source: AppErrorSource\n route?: string | null\n location?: string | null\n componentStack?: string | null\n tenantId?: string | null\n userId?: string | null\n occurredAt: string\n userAgent?: string\n extra?: Record<string, unknown>\n /** The original throw, for reporters that want the real object (Sentry needs\n * it to symbolicate). Never serialize this field. */\n error: unknown\n}\n\nexport type ErrorReporter = (report: AppErrorReport) => void\n\n/** The event key every reporter and the event log can subscribe to. */\nexport const APP_ERROR_EVENT = 'app.error'\n\nconst reporters = new Set<ErrorReporter>()\n\n/**\n * Registers a sink for frontend errors. Returns the unsubscribe.\n *\n * The host app wires its vendor here, once, at boot:\n *\n * import * as Sentry from '@sentry/react'\n * Sentry.init({ dsn: import.meta.env.VITE_SENTRY_DSN })\n * registerErrorReporter(createVendorReporter(Sentry))\n */\nexport function registerErrorReporter(reporter: ErrorReporter): () => void {\n reporters.add(reporter)\n return () => { reporters.delete(reporter) }\n}\n\nexport function clearErrorReporters(): void {\n reporters.clear()\n}\n\nfunction makeErrorId(): string {\n const bytes = globalThis.crypto?.getRandomValues?.(new Uint8Array(3))\n const hex = bytes\n ? Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('')\n : Math.floor(Math.random() * 0xffffff).toString(16).padStart(6, '0')\n return `ERR-${hex.toUpperCase()}`\n}\n\nfunction toError(value: unknown): { name: string; message: string; stack?: string } {\n if (value instanceof Error) {\n return { name: value.name, message: value.message, stack: value.stack }\n }\n // A thrown string/object still has to produce a usable message — `[object\n // Object]` in the dashboard is the same as no report at all.\n if (typeof value === 'string') return { name: 'Error', message: value }\n try {\n return { name: 'Error', message: JSON.stringify(value) ?? String(value) }\n } catch {\n return { name: 'Error', message: String(value) }\n }\n}\n\n// A crashing render can re-throw on every retry, and a broken interval can throw\n// forever. Collapse identical errors inside a short window so one bug costs one\n// event instead of a thousand — and so the quota is still there for the next bug.\nconst DEDUPE_WINDOW_MS = 5_000\nconst recent = new Map<string, number>()\n\nfunction isDuplicate(signature: string): boolean {\n const now = Date.now()\n for (const [key, at] of recent) {\n if (now - at > DEDUPE_WINDOW_MS) recent.delete(key)\n }\n const seen = recent.get(signature)\n recent.set(signature, now)\n return seen !== undefined && now - seen < DEDUPE_WINDOW_MS\n}\n\n/** Test seam — the dedupe window is global state that would leak across specs. */\nexport function resetErrorDedupe(): void {\n recent.clear()\n}\n\n/**\n * The single entry point. Builds the report, fans it out to every registered\n * reporter, and emits it as a domain event so the existing bus/event-log\n * consumers see it without a second wiring.\n *\n * Returns the report so a caller (the error screen) can show the id.\n */\nexport function reportAppError(error: unknown, context: AppErrorContext = {}): AppErrorReport {\n const { name, message, stack } = toError(error)\n const report: AppErrorReport = {\n id: makeErrorId(),\n name,\n message,\n stack,\n source: context.source ?? 'manual',\n route: context.route ?? null,\n location: context.location ?? (typeof window !== 'undefined' ? window.location.href : null),\n componentStack: context.componentStack ?? null,\n tenantId: context.tenantId ?? getActiveTenantId() ?? null,\n userId: context.userId ?? null,\n occurredAt: new Date().toISOString(),\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n extra: context.extra,\n error,\n }\n\n // Signature ignores the id (unique by construction) and the timestamp.\n if (isDuplicate(`${report.source}|${report.name}|${report.message}|${report.route ?? ''}`)) {\n return report\n }\n\n // eslint-disable-next-line no-console\n console.error(`[error:${report.source}] ${report.id}`, error)\n\n for (const reporter of reporters) {\n try {\n reporter(report)\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[error] reporter failed', err)\n }\n }\n\n try {\n // `error` is dropped from the payload on purpose: the bus payload gets\n // serialized by log/webhook consumers, and an Error does not survive that.\n const { error: _raw, ...payload } = report\n emitDomainEvent(APP_ERROR_EVENT, payload as unknown as Record<string, unknown>, {\n actorId: report.userId,\n tenantId: report.tenantId,\n })\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[error] event emit failed', err)\n }\n\n return report\n}\n\n// ---------------------------------------------------------------------------\n// Global handlers — everything React's error boundaries structurally cannot see:\n// event handlers, timers, async callbacks, and rejected promises.\n// ---------------------------------------------------------------------------\n\nlet uninstall: (() => void) | null = null\n\n/** Idempotent: calling it twice does not double-report. Returns the uninstall. */\nexport function installGlobalErrorHandlers(): () => void {\n if (uninstall) return uninstall\n if (typeof window === 'undefined') return () => {}\n\n const onError = (event: ErrorEvent) => {\n reportAppError(event.error ?? event.message, {\n source: 'window',\n extra: { filename: event.filename, lineno: event.lineno, colno: event.colno },\n })\n }\n const onRejection = (event: PromiseRejectionEvent) => {\n reportAppError(event.reason, { source: 'promise' })\n }\n\n window.addEventListener('error', onError)\n window.addEventListener('unhandledrejection', onRejection)\n\n uninstall = () => {\n window.removeEventListener('error', onError)\n window.removeEventListener('unhandledrejection', onRejection)\n uninstall = null\n }\n return uninstall\n}\n\n// ---------------------------------------------------------------------------\n// Vendor adapter.\n// ---------------------------------------------------------------------------\n\n/** The slice of Sentry/PostHog/Bugsnag this SDK needs. Structural on purpose —\n * it keeps the vendor package out of the SDK's dependency tree. */\nexport interface ErrorVendorClient {\n captureException: (error: unknown, hint?: Record<string, unknown>) => unknown\n /** Optional: Sentry's setTag/setContext live on the scope, not the client, so\n * everything we know travels in the hint's `extra`/`tags` instead. */\n captureMessage?: (message: string, hint?: Record<string, unknown>) => unknown\n}\n\n/**\n * Wraps a vendor client as an ErrorReporter, mapping the report onto the\n * tags/extra shape Sentry (and anything Sentry-shaped) expects.\n *\n * Tags are the low-cardinality dimensions you filter dashboards by; the rest\n * goes to extra. `errorId` is a tag on purpose — it is what a user reads to\n * support, and it has to be searchable.\n */\nexport function createVendorReporter(client: ErrorVendorClient): ErrorReporter {\n return (report) => {\n const hint = {\n tags: {\n errorId: report.id,\n source: report.source,\n route: report.route ?? 'unknown',\n tenantId: report.tenantId ?? 'unknown',\n },\n extra: {\n errorId: report.id,\n location: report.location,\n componentStack: report.componentStack,\n userId: report.userId,\n occurredAt: report.occurredAt,\n ...report.extra,\n },\n }\n // A non-Error throw has no stack to symbolicate; captureMessage keeps it\n // from being grouped as one giant \"Non-Error exception\" bucket.\n if (!(report.error instanceof Error) && client.captureMessage) {\n client.captureMessage(`${report.name}: ${report.message}`, hint)\n return\n }\n client.captureException(report.error, hint)\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/debug.ts","../src/types/plugins.ts","../src/data/backend-env.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/events/envelope.ts","../src/events/useDataVersion.ts","../src/events/log.ts","../src/events/index.tsx","../src/search/text.ts","../src/search/engine.ts","../src/registry/blocks.tsx","../src/manifest/index.ts","../src/manifest/integration-surface.ts","../src/manifest/serialize.ts","../src/manifest/app-manifest.schema.json","../src/app/render.tsx","../src/app/app-config.ts","../src/app/service-client.ts","../src/router/history.ts","../src/messaging/registry.ts","../src/messaging/provider-template.ts","../src/messaging/phone.ts","../src/telemetry/errors.ts"],"names":["str","React","React2","client","started","via","record","React4","cache","isRpcCapable","withTimeout","next"],"mappings":"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","file":"index.js","sourcesContent":["// createDebug — the SDK's one dev-console voice.\n//\n// Everything that happens off-screen (an event emitted, a bridge flush, a\n// validation refusal, a background sync) logs through here instead of a bare\n// console.log, and one switch rules them all:\n//\n// dev build ON for every scope, automatically\n// any build localStorage.debug = '*' | 'events,bridge' | 'shop.*'\n// silence in dev localStorage.debug = 'off'\n//\n// The npm `debug` convention on purpose — people already know\n// `localStorage.debug = '*'` from a decade of libraries. Scopes are short\n// nouns ('events', 'bridge', 'shop'); a scope matches its own name, a\n// `prefix.*` pattern, or '*'.\n//\n// This is a DEV lens, not telemetry: nothing here is collected, sampled or\n// shipped anywhere. Production users with the flag unset pay one boolean check\n// per call and no string work.\n\ntype LogFn = (message: string, ...data: unknown[]) => void\n\nexport interface DebugLogger extends LogFn {\n /** Amber, for the recoverable: a fallback taken, a retry scheduled. */\n warn: LogFn\n /** Red, for the broken: a refused write, a dead letter, a bad contract. */\n error: LogFn\n /** True when this scope currently prints — guard expensive payload builds. */\n readonly enabled: boolean\n}\n\nfunction isDevBuild(): boolean {\n try {\n // Vite consumers get import.meta.env; node (tests, scripts) does not.\n return (import.meta as unknown as { env?: { DEV?: boolean } }).env?.DEV === true\n } catch {\n return false\n }\n}\n\nfunction flagValue(): string | null {\n try {\n return typeof localStorage !== 'undefined' ? localStorage.getItem('debug') : null\n } catch {\n // Storage can throw (privacy mode, sandboxed frames) — then dev-mode rules.\n return null\n }\n}\n\nfunction scopeEnabled(scope: string): boolean {\n const flag = flagValue()\n if (flag === 'off') return false\n if (flag) {\n return flag.split(',').some((raw) => {\n const pattern = raw.trim()\n if (!pattern) return false\n if (pattern === '*' || pattern === scope) return true\n if (pattern.endsWith('.*')) return scope.startsWith(pattern.slice(0, -1))\n return false\n })\n }\n return isDevBuild()\n}\n\n/** Stable pastel per scope, so 'events' is always the same color in a session. */\nfunction scopeColor(scope: string): string {\n let hash = 0\n for (let i = 0; i < scope.length; i++) hash = (hash * 31 + scope.charCodeAt(i)) | 0\n return `hsl(${Math.abs(hash) % 360} 60% 45%)`\n}\n\nconst LEVEL_STYLE = { log: '', warn: 'color:#b45309', error: 'color:#dc2626' } as const\n\nexport function createDebug(scope: string): DebugLogger {\n const badge = `%c${scope}%c`\n const badgeStyle = `color:${scopeColor(scope)};font-weight:600`\n\n const emit = (level: 'log' | 'warn' | 'error'): LogFn => (message, ...data) => {\n if (!scopeEnabled(scope)) return\n // eslint-disable-next-line no-console\n console[level](`${badge} ${message}`, badgeStyle, LEVEL_STYLE[level], ...data)\n }\n\n const logger = emit('log') as DebugLogger\n logger.warn = emit('warn')\n logger.error = emit('error')\n Object.defineProperty(logger, 'enabled', { get: () => scopeEnabled(scope) })\n return logger\n}\n","import type { EventField } from '../events/types'\nimport type React from 'react'\nimport type { AgentRole } from './agents'\nimport type { EntityDef } from './crud'\nimport type { AnalyticsCardDef, ResolvedAnalyticsCard } from './analytics'\nimport type { FeatureDeclaration, PermissionAction } from './permissions'\nimport type { LimitDeclaration } from './entitlements'\nimport type { OnboardingProgramDef, ResolvedOnboardingProgram } from './onboarding'\nimport type { SetupGuideDef, ResolvedSetupGuide } from './setup-guide'\nimport type { ConnectorDefinition } from '../integrations'\nimport type { DataProvider } from '../data/types'\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 * Heading this entry sits under, WITHIN its section — the app rail's half of\n * the `group` the settings rail already draws (see `PluginSettingsTab.group`).\n * Consecutive entries sharing a group render under one heading, so `position`\n * has to keep a group's entries contiguous.\n *\n * Plugin factories are not expected to invent one: a heading is a statement\n * about how THIS app's rail is divided (\"Serviço\" / \"Retaguarda\"), which the\n * plugin cannot know. The app stamps it on the manifests it assembles.\n */\n group?: string\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 /**\n * Heading these tabs are filed under in the settings rail — \"Commerce\",\n * \"Estoque\". A plugin that contributes several related screens says so once\n * per tab and they group; one that contributes a single tab leaves it unset\n * and lands under the generic \"Plugins\" run, exactly as before.\n */\n group?: 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\n/** A control a plugin mounts in the shell header (see `headerControls`). */\nexport interface PluginHeaderControlDef {\n id: string\n component: React.ComponentType<unknown>\n /** Lower sorts first; notifications sit at 100. */\n order?: number\n permission?: PluginPermissionRequirement\n}\n\nexport interface ResolvedHeaderControl extends PluginHeaderControlDef {\n pluginId: string\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 /**\n * The page draws its own top bar, so the shell contributes none on desktop.\n * For a canvas (a site preview, a map) that comes with its own window chrome.\n * Implies fullBleed.\n */\n immersive?: 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. */\n/**\n * A fact this plugin REACTS to, delivered by the event log (#277, migration 149).\n *\n * The counterpart of {@link PluginEventDefinition}, which declares what a plugin\n * emits. A subscription is the other half of the contract the round-3 decision\n * settled: business effect crosses plugins through the log, never through the\n * in-memory bus — the bus only reaches listeners inside one app process, so a\n * sale closed on the storefront at 2am, an import in bulk, or a plugin in\n * another cluster all emit into silence.\n *\n * `handler` names a Postgres function the plugin's own migration created. It\n * takes the event row as jsonb, returns jsonb, and raising is how it reports\n * failure. Delivery is keyed (event, plugin, handler), so a handler is called\n * once per fact no matter how often the consumer runs.\n */\n/**\n * A named PART of a plugin, priced or permitted on its own (#281, ADR 0025).\n *\n * The decision this exists for: a plugin is not always all-or-nothing. The\n * financial plugin's ledger is what every customer needs; its bank\n * reconciliation is what some of them pay for. Without facets the only choices\n * are to give away the paid half or to split one coherent module into two\n * plugins with a seam down the middle of a domain.\n *\n * A facet is not a feature flag. It is an entitlement grain: `app.plan_grants`\n * and `app.tenant_plugins` are both keyed on `(plugin, facet)`, so a plan\n * permits it, a tenant has it, and one predicate answers both.\n *\n * The plugin itself is the facet with an empty name. Declaring facets does not\n * change what the plugin CAN do — only what a given tenant is entitled to.\n */\nexport interface PluginFacet {\n /** Stable id, unique within the plugin. Written into plan grants and activations. */\n id: string\n /** What a customer is buying, in their words — this reaches an upgrade prompt. */\n label: string\n description?: string\n /**\n * True when the facet comes with the plugin at no extra entitlement — the\n * \"free half\". A plugin whose facets are ALL included is one a plan either\n * permits or does not, and the split is only about what a screen may show.\n */\n includedWithPlugin?: boolean\n}\n\nexport interface PluginEventSubscription {\n /** The event this plugin reacts to, e.g. 'order.completed'. */\n event: string\n /** A public Postgres function taking (jsonb) and returning jsonb. */\n handler: string\n /** Why this plugin cares — shown in the subscription census. */\n description?: string\n /**\n * How many times a failing delivery is retried before it is abandoned —\n * visibly, not silently. Defaults to 5; the backoff is 2^n seconds, capped\n * at an hour.\n */\n maxAttempts?: number\n}\n\nexport interface ResolvedDomainEvent extends PluginEventDefinition {\n pluginId: string\n pluginName: string\n pluginIcon?: string\n}\n\n/**\n * A table whose row changes become domain events, via a trigger calling\n * `plg_emit_event`.\n *\n * The browser store already emits on its own writes. This covers the writes it\n * never sees — an edge function's upsert, an import, a hand-run SQL fix — which\n * are exactly the writes an integration makes. Declaring the table instead of\n * hand-writing a trigger per plugin keeps one shape of fact in the ledger.\n */\nexport interface PluginEventSource {\n /** Table in the plugin's schema, e.g. 'plg_blog_posts'. */\n table: string\n /** Entity key the event is named after; the trigger appends the action. */\n entityKey: string\n /** Actions to emit. Default: all three. */\n actions?: Array<'created' | 'updated' | 'deleted'>\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 /**\n * Promote this entry in the menu — tinted tile, brand label.\n *\n * A menu lists options as equals, and one of them usually is not: \"describe\n * it and the assistant builds it\" next to \"fill in the form\" are not two\n * spellings of the same effort. Use it for at most ONE entry, or the tint\n * stops meaning anything.\n */\n highlight?: boolean\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 /**\n * Shape of an `object` property — the same recursion JSON Schema has, which\n * this type was missing. Without it an order's `items` could only be declared\n * as \"an array of objects\" with the real shape written in prose, and the model\n * had to infer the key names from a sentence.\n */\n properties?: Record<string, AIToolParameterProperty>\n required?: string[]\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\n/**\n * An edge function this plugin ships under `functions/<slug>/`.\n *\n * A function that nobody copies into the app is a dead feature — that is the\n * documented fate of the google-calendar function, which existed in the SDK for\n * months without ever being deployed. Declaring it lets the app's sync step and\n * `fayz doctor` name what is missing instead of failing silently.\n */\nexport interface PluginFunctionDeclaration {\n /** Directory under `functions/`, and the deployed function name. */\n slug: string\n /**\n * Whether Supabase requires a caller JWT. A function reached through the Fayz\n * ingress sets `false` and authenticates the signature instead.\n */\n verifyJwt: boolean\n /** Secret NAMES the function reads. Names only — a value here is a leak. */\n secrets?: string[]\n /** How the outside world reaches it: through the Fayz ingress, or not at all. */\n ingress: 'fayz' | 'none'\n /**\n * Pool RPCs the function's credential is allowed to call. The privilege comes\n * from this list, not from who wrote the function — see the 2026-08-11 ADR.\n */\n grants?: string[]\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 /**\n * Which member of the app's staff carries this capability. Falls back to the\n * plugin's {@link PluginManifest.defaultAgentRole}, and a tool with neither\n * is shared by everyone (navigation, search — the primitives no single job\n * owns). See {@link AgentRole}.\n */\n role?: AgentRole\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 * Read/write this registry through a provider the plugin already owns, instead\n * of the table `entity.data.table` names. For a registry whose writes are not\n * a plain column mapping: delivery zones normalise the CEP the merchant typed\n * ('22.041-001' → '22041001') before it reaches a column that\n * shop_quote_shipping compares as bare digits, and a generic write would store\n * the punctuation and silently stop matching a whole city.\n */\n dataProvider?: DataProvider<never>\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 * What \"up and running\" means for this module: the steps a new tenant has to\n * finish before it is live, plus the instructions the agent follows while\n * guiding them. Seeded as tasks, shown in the getting-started checklist, and\n * ticked from either side. See {@link OnboardingProgramDef}.\n */\n program?: OnboardingProgramDef\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 /** Tables whose row changes emit those events server-side. See {@link PluginEventSource}. */\n emitsFrom?: PluginEventSource[]\n /** Facts this plugin REACTS to, delivered by the event log. See {@link PluginEventSubscription}. */\n subscribesTo?: PluginEventSubscription[]\n /**\n * The parts of this plugin that can be entitled separately (#281, ADR 0025).\n * Omit for a plugin that is all-or-nothing — most of them. See {@link PluginFacet}.\n */\n facets?: PluginFacet[]\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 * Controls this plugin puts in the SHELL header, beside notifications.\n *\n * For the thing an operator reaches for from any screen, not from the module\n * that owns it. The caixa is the case that forced it: a receptionist opens her\n * drawer once, at the counter, and then charges people from the agenda, the\n * check-in queue and the invoice — three screens that are not the Financeiro.\n * Nesting the control inside the module meant leaving the counter to reach it.\n *\n * A control is a mounted COMPONENT, not an action: it carries live state (an\n * open session shows a dot) and opens its own dialog in place.\n */\n headerControls?: PluginHeaderControlDef[]\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 /**\n * The staff role this plugin's capabilities belong to, inherited by every\n * `aiTool` that does not name its own. One line per plugin instead of a tag\n * on eighty tools — and it is what lets an app cast \"growth\" with a name\n * without re-mapping a single feature. See {@link AgentRole}.\n */\n defaultAgentRole?: AgentRole\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 /**\n * Platform connector slugs this module integrates with — the shelf a tenant is\n * shown under \"Adicionar conector\", and the \"Integra com\" row on the plugin's\n * page in the Fayz builder.\n *\n * The module is what decides: CRM brings Kommo and RD Station, Financeiro\n * brings AbacatePay and Pagar.me, Agenda brings Google Calendar and Calendly.\n * Neither a vertical nor a tag can answer that, and the platform catalogue\n * answers it for the wrong audience — it is a builder directory, and reading\n * it tenant-side is how the owner of a salon was once offered Supabase.\n *\n * Declaring a slug is NOT implementing it. A slug that also has a\n * {@link ConnectorDefinition} behind it (matched on `catalogSlug ?? id`) reads\n * \"Disponível\" and can be connected; the rest read \"Em breve\" and are\n * informational. Every slug must exist in the platform catalogue — the\n * generator refuses one that does not, which is what keeps this a relationship\n * rather than a wishlist.\n */\n integrations?: string[]\n /** Edge functions shipped under `functions/`. See {@link PluginFunctionDeclaration}. */\n functions?: PluginFunctionDeclaration[]\n migrations?: PluginMigration[]\n /** Backend prerequisites the plugin needs; surfaced by `fayz doctor`. */\n diagnostics?: PluginDiagnostic[]\n onboarding?: PluginOnboarding\n /**\n * How each of this plugin's features gets STARTED — see {@link SetupGuideDef}.\n *\n * Separate from `onboarding`, and the line between them is what a new tenant\n * is asked to do on day one (the program) versus what anybody can ask about\n * on any day (\"como eu começo a emitir nota?\"). A guide outlives the\n * checklist; the checklist is a handful of guides with a deadline.\n */\n setupGuides?: SetupGuideDef[]\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 headerControls: ResolvedHeaderControl[]\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 /** Activation programs declared by ACTIVE plugins, ordered. A disabled module\n * asks nothing of a new tenant, so its steps drop off the checklist too. */\n onboardingPrograms: ResolvedOnboardingProgram[]\n /** Setup guides from ACTIVE plugins. What the assistant may offer to set up. */\n setupGuides: ResolvedSetupGuide[]\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","/* 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// The edge proxy\n//\n// Same answer, resolved by the SERVER and kept there (public.postal_areas).\n// Two reasons to prefer it once a delivery rule can name a neighbourhood:\n//\n// · the rule is matched against what the server resolved, not against what\n// the browser sent — a field that decides whether a store delivers is a\n// field somebody has a reason to lie in;\n// · the cache stops being one localStorage per shopper and becomes one row\n// per postcode for the whole pool, which is what keeps a busy storefront\n// clear of ViaCEP's per-IP limit.\n//\n// It degrades to ViaCEP rather than failing: the address is a convenience for\n// the person typing, and losing it must cost typing, never the sale.\n// ---------------------------------------------------------------------------\n\nexport interface EdgePostalOptions {\n /** Supabase project URL, e.g. https://abc.supabase.co */\n supabaseUrl: string\n /** The publishable (anon) key — the function itself runs with verify_jwt off. */\n anonKey?: string\n fetcher?: typeof fetch\n /** Used when the function is unreachable. Defaults to ViaCEP. */\n fallback?: PostalLookupProvider\n}\n\nexport function createEdgePostalProvider(options: EdgePostalOptions): PostalLookupProvider {\n const fetcher = options.fetcher ?? globalThis.fetch\n const fallback = options.fallback ?? createViaCepProvider({ fetcher })\n const endpoint = `${options.supabaseUrl.replace(/\\/+$/, '')}/functions/v1/postal-lookup`\n\n return {\n async lookup(postalCode: string): Promise<PostalAddress | null> {\n const code = normalizePostalCode(postalCode)\n if (code.length !== 8) return null\n\n try {\n const response = await fetcher(endpoint, {\n method: 'POST',\n // EXACTLY these headers. Adding one to this call adds it to the\n // browser's preflight for every function in the pool, and the ~20 of\n // them that pin an allow-list start failing with a silent log.\n headers: {\n 'Content-Type': 'application/json',\n ...(options.anonKey\n ? { apikey: options.anonKey, Authorization: `Bearer ${options.anonKey}` }\n : {}),\n },\n body: JSON.stringify({ postalCode: code }),\n })\n if (!response.ok) throw new Error(`postal-lookup ${response.status}`)\n const data = await response.json()\n if (!data || data.found === false || !data.city) return null\n return {\n postalCode: code,\n street: data.street ?? '',\n district: data.district ?? '',\n city: data.city,\n state: (data.state ?? '').toUpperCase(),\n country: 'BR',\n cityCode: data.cityCode || undefined,\n }\n } catch {\n return fallback.lookup(code)\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","import { eventBus } from './bus'\nimport { createDebug } from '../lib/debug'\nimport type { DomainEvent, DomainEventHandler } from './types'\n\nconst debug = createDebug('events')\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 one line that answers \"did the event even fire?\" — sinks is what\n // carries it to history, audit and the platform bridge; zero sinks in a\n // connected app means an automation upstream will never run.\n debug(`emit ${key}`, { tenantId: event.tenantId, subject: event.subject, sinks: sinks.size, payload })\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 * as React from 'react'\nimport { registerEventSink } from './envelope'\nimport type { DomainEvent } from './types'\n\n// ---------------------------------------------------------------------------\n// \"Isto mudou — releia.\"\n//\n// Toda tela que mostra uma lista tem o mesmo problema e o resolvia sozinha: ela\n// lê uma vez e fica mostrando o mundo daquele instante. Quando a mudança vem de\n// OUTRO lugar — o painel da direita, o assistente criando um cadastro, o agente\n// montando um formulário — a lista continua igual, e duas telas discordando\n// sobre o mesmo fato é pior do que uma estar velha: não dá para saber em qual\n// acreditar.\n//\n// A tentação é um contador por assunto: um para vínculo de unidade, outro para\n// formulário, outro para pedido. São três mecanismos para uma ideia, e o\n// terceiro é sempre o que alguém esquece de disparar.\n//\n// Isto não é um mecanismo novo: os fatos JÁ passam pelo barramento de eventos\n// de domínio — `createCrudStore` emite `registry.<entidade>.created` a cada\n// cadastro, venha ele de um formulário, de uma importação ou do assistente.\n// Faltava só o outro lado: um jeito de uma tela dizer \"me acorde quando isso\n// acontecer\" sem virar assinante nomeado de trinta chaves.\n//\n// Devolve um NÚMERO, e não os dados. Guardar os dados aqui seria um segundo\n// cache para divergir do primeiro; quem se importa refaz a própria leitura, que\n// é a única que sabe o que ela precisa.\n// ---------------------------------------------------------------------------\n\n/** Prefixo (`'registry.'`), chave exata, lista de qualquer um dos dois, ou um\n * teste próprio. `'*'` é tudo — útil num painel de depuração, caro numa lista. */\nexport type DomainEventMatch = string | string[] | ((event: DomainEvent) => boolean)\n\n/** Exportado para poder ser testado sem montar React: é aqui que mora a única\n * decisão do arquivo, e o resto é assinar e desassinar. */\nexport function matchesDomainEvent(event: DomainEvent, match: DomainEventMatch): boolean {\n if (typeof match === 'function') return match(event)\n const patterns = Array.isArray(match) ? match : [match]\n return patterns.some((p) =>\n p === '*' ||\n (p.endsWith('*') ? event.key.startsWith(p.slice(0, -1)) : p === event.key))\n}\n\n/**\n * Um contador que sobe quando um fato que interessa acontece.\n *\n * const version = useDataVersion('registry.person:staff.*')\n * React.useEffect(() => { void reload() }, [reload, version])\n *\n * Pelo sink, e não por assinatura nomeada, de propósito: o sink vê TODO evento,\n * inclusive os de um módulo que ainda não existia quando a tela foi escrita.\n * Assinar por nome exigiria a lista de chaves conhecidas, e o módulo que alguém\n * esquecesse de listar sumiria da atualização sem avisar — o mesmo defeito que\n * a história e a auditoria já resolveram assim.\n */\nexport function useDataVersion(match: DomainEventMatch): number {\n const [version, setVersion] = React.useState(0)\n // Numa ref para o sink não ser recriado a cada render quando quem chama passa\n // um array ou uma função inline — que é o caso normal.\n const matchRef = React.useRef(match)\n matchRef.current = match\n\n React.useEffect(() => registerEventSink((event) => {\n if (matchesDomainEvent(event, matchRef.current)) setVersion((v) => v + 1)\n }), [])\n\n return version\n}\n\n/**\n * O mesmo, quando a tela quer o evento e não só a notícia de que houve um.\n *\n * Para quem consegue aplicar a mudança sem reler tudo — inserir a linha nova no\n * topo em vez de buscar a lista inteira de novo.\n */\nexport function useOnDataChange(\n match: DomainEventMatch,\n handler: (event: DomainEvent) => void,\n): void {\n const matchRef = React.useRef(match)\n matchRef.current = match\n const handlerRef = React.useRef(handler)\n handlerRef.current = handler\n\n React.useEffect(() => registerEventSink((event) => {\n if (matchesDomainEvent(event, matchRef.current)) handlerRef.current(event)\n }), [])\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 = '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// Rows waiting for the end of the current tick. Bulk acts emit one fact PER\n// record — deleting 40 products is 40 facts, and automations are right to see\n// 40 — but 40 facts must not be 40 inserts. Everything emitted in the same tick\n// leaves as one statement; a lone event still goes out immediately after it,\n// just via a microtask.\nlet pending: Record<string, unknown>[] = []\nlet flushing = false\n\n// Um pool sem a tabela (migração 027 não aplicada) falharia em TODO evento, para\n// sempre: um 404 no console a cada gravação, encostado no erro de verdade que a\n// pessoa está tentando ler. Descoberto uma vez, desligamos a história — ela é\n// opcional por definição, e o silêncio é a promessa de recordEventRun.\nlet sinkDisabled = false\n\nfunction flushSoon(): void {\n if (flushing) return\n flushing = true\n queueMicrotask(() => {\n const rows = pending\n pending = []\n flushing = false\n if (!rows.length || sinkDisabled) return\n const db = client()\n if (!db) return\n void (async () => {\n try {\n // postgrest-js devolve o erro, não o lança — sem ler `error` aqui o\n // catch nunca via nada e a falha só aparecia na aba de rede.\n const { error } = await db.from(EVENT_LOG_TABLE).insert(rows)\n if (!error) return\n if (error.code === 'PGRST205' || String(error.message ?? '').includes('Could not find the table')) {\n sinkDisabled = true\n console.warn(`[events] ${EVENT_LOG_TABLE} não existe neste pool — histórico desligado (migração 027).`)\n return\n }\n console.warn('[events] could not record run', error)\n } catch (err) {\n console.warn('[events] could not record run', err)\n }\n })()\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 pending.push({\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 flushSoon()\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'\nimport { eventBus } from './bus'\nimport type { EventHandler } from './bus'\n\nexport { createEventBus, eventBus } from './bus'\nexport type { EventBus, EventHandler } from './bus'\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 { useDataVersion, useOnDataChange } from './useDataVersion'\nexport type { DomainEventMatch } from './useDataVersion'\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","// 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.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\n// 137 renamed this RPC; 141 leaves a wrapper under the old name for pools that\n// have taken it. A pool that has taken NEITHER — dentist, agency, pulse and the\n// other projects outside the four aligned clusters — still answers only to the\n// old name, and asking for the new one there would drop global search to the\n// per-table scan without anyone noticing it got slower.\n//\n// So both names, new one first, and the answer is remembered: a pool is on one\n// side of the rename or the other and does not move mid-session.\nconst RPC_NAMES = ['global_search', 'fayz_global_search'] as const\nlet rpcName: string = RPC_NAMES[0]\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; cached?: 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 cached: opts.cached ?? opts.via === 'cache',\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 RPC_NAMES.some((n) => message.includes(n))\n && (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 args = {\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 // Try the name we settled on; if THIS pool is on the other side of the\n // rename, try the other one once and settle there instead.\n let { data, error } = await client.rpc(rpcName, args)\n if (error && isMissingFunction(error)) {\n const other = RPC_NAMES.find((n) => n !== rpcName)\n if (other) {\n const retry = await client.rpc(other, args)\n if (!retry.error) { rpcName = other; data = retry.data; error = null }\n else if (isMissingFunction(retry.error)) { error = retry.error }\n else throw retry.error\n }\n }\n\n if (error) {\n if (isMissingFunction(error)) {\n // Neither name answers: this pool never took the search migration at all.\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 fresh?: boolean,\n): Promise<{ hits: SearchHit[]; failed: string[]; cached: boolean }> {\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 let anyCached = false\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 cache: fresh ? false : undefined,\n })\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 if (result.cached || result.stale) anyCached = true\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, cached: anyCached }\n\n const second = collect(await round(token, widePageSize))\n return { hits: second.hits, failed: [...new Set([...first.failed, ...second.failed])], cached: anyCached }\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 = options.fresh ? undefined : 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 && !options.fresh) {\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 let anyCached = false\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, options.fresh)\n hits = scanned.hits\n failed = scanned.failed\n anyCached = scanned.cached\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, cached: anyCached,\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 { AgentRole } from '../types/agents'\nimport 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 /** Staff role that carries it — resolved (tool's own, else its plugin's).\n * Absent means shared by every agent. */\n role?: AgentRole\n}\n\n/** JSON-safe projection of an {@link AgentStaffDef}. Behaviour-free: prose and\n * the hiring key, no components. */\nexport interface AgentStaffContract {\n role: AgentRole\n name: string\n title: string\n avatar?: string\n goal?: string\n backstory?: string\n instructions?: string\n host?: boolean\n included?: boolean\n /** Entitlement feature that hires this agent (`assistant.<role>` by default). */\n feature?: 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 /** The app's single face, kept for every consumer that predates `staff`.\n * With a cast, this mirrors its host — an old reader still gets a name. */\n persona?: { name?: string; systemPrompt?: string; icon?: string }\n /** The named agents this app employs, two to four. See {@link AgentStaffDef}. */\n staff?: AgentStaffContract[]\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\n// ---------------------------------------------------------------------------\n// Integration Surface — what this app hands to ANOTHER app that connects to it.\n//\n// Separate from the agent contract on purpose: the agent contract describes\n// everything the app can do for its own user, and this names the far smaller\n// set a stranger may reach across an organization boundary. A connected app\n// gets these entities and nothing else — `permissions.entities` on the platform\n// starts every operation at false, so an entity left out of this list is not\n// merely undocumented, it is unreachable.\n// ---------------------------------------------------------------------------\n\n/** What the app's code declares: an entity key and what may be done with it. */\nexport interface SharedEntityDeclaration {\n /** Key of an entity in `agent.entities`. The table is read from there. */\n entity: string\n /** `read` is the floor. Deleting another product's records is not expressible. */\n operations: Array<'read' | 'create' | 'update'>\n /** Written for the person on the consent screen, not for the integrator. */\n reason: string\n}\n\n/** The emitted form: the declaration with its table resolved at emit, so the\n * platform reads one structure instead of joining two. */\nexport interface SharedEntity extends SharedEntityDeclaration {\n label: string\n table: string\n schema?: string\n tenantIdColumn?: string\n}\n\nexport interface IntegrationSurface {\n entities: SharedEntity[]\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 /** What another app may reach when a member of this org consents. */\n integrationSurface?: IntegrationSurface\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 // Declared on AppManifest and in app-manifest.schema.json since the connector\n // surface landed, but never added here — so every app that publishes one\n // failed validation at boot.\n 'integrationSurface',\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 { EntityContract, IntegrationSurface, SharedEntity, SharedEntityDeclaration } from './index'\n\n/**\n * Declarations → the emitted surface, with each entity's table resolved from\n * the agent contract.\n *\n * Every refusal here is a mistake that would otherwise be SILENT. A misspelled\n * entity key shares nothing and reads as a working integration; a shared entity\n * that is not tenant-scoped hands a stranger every organization in the pool,\n * because the tenant predicate the platform AND-s in has no column to bind to.\n * Both are cheap to catch at emit and expensive to notice in production.\n */\nexport function resolveIntegrationSurface(\n declarations: SharedEntityDeclaration[],\n entities: EntityContract[],\n): IntegrationSurface {\n const byKey = new Map(entities.map((e) => [e.key, e]))\n const seen = new Set<string>()\n\n const resolved = declarations.map((declaration): SharedEntity => {\n const entity = byKey.get(declaration.entity)\n if (!entity) {\n throw new Error(\n `integrationSurface: no entity \"${declaration.entity}\" in this app. ` +\n `Known: ${[...byKey.keys()].sort().join(', ') || '(none)'}`,\n )\n }\n if (seen.has(declaration.entity)) {\n throw new Error(`integrationSurface: \"${declaration.entity}\" is declared twice`)\n }\n seen.add(declaration.entity)\n\n if (entity.data.tenantScoped === false) {\n throw new Error(\n `integrationSurface: \"${declaration.entity}\" is not tenant-scoped, so sharing it would ` +\n `reach every organization in the pool, not the one that consented`,\n )\n }\n if (declaration.operations.length === 0) {\n throw new Error(`integrationSurface: \"${declaration.entity}\" declares no operations`)\n }\n if (!declaration.reason.trim()) {\n throw new Error(\n `integrationSurface: \"${declaration.entity}\" has no reason — it is what the consent screen shows`,\n )\n }\n\n return {\n ...declaration,\n label: entity.label,\n table: entity.data.table,\n ...(entity.data.schema ? { schema: entity.data.schema } : {}),\n ...(entity.data.tenantIdColumn ? { tenantIdColumn: entity.data.tenantIdColumn } : {}),\n }\n })\n\n // One token carries ONE tenant column for every table it opens, so a surface\n // that mixes them would bind the tenant predicate to the wrong column on all\n // but one entity. Loud here; unnoticeable in production.\n const columns = new Set(resolved.map((entity) => entity.tenantIdColumn ?? 'tenant_id'))\n if (columns.size > 1) {\n throw new Error(\n `integrationSurface: shared entities disagree on the tenant column (${[...columns].sort().join(', ')}). ` +\n `A connection carries one, so they cannot be shared together.`,\n )\n }\n\n return { entities: resolved }\n}\n\n/** True when anything here can be written, which is what decides whether the\n * consent screen may offer `write` at all. */\nexport function surfaceAllowsWrites(surface: IntegrationSurface): boolean {\n return surface.entities.some((entity) => entity.operations.some((operation) => operation !== 'read'))\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 \"integrationSurface\": {\n \"$ref\": \"#/$defs/integrationSurface\"\n },\n \"contractHash\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"sha256 of the canonical serialization (excluding this field).\"\n }\n },\n \"$defs\": {\n \"integrationSurface\": {\n \"type\": \"object\",\n \"description\": \"What another app may reach when a member of this organization consents. An entity absent from this list is unreachable, not merely undocumented.\",\n \"required\": [\n \"entities\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"entities\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"entity\",\n \"operations\",\n \"reason\",\n \"label\",\n \"table\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"entity\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Key of an entity in agent.entities.\"\n },\n \"operations\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\n \"read\",\n \"create\",\n \"update\"\n ]\n },\n \"description\": \"Deleting another product's records is deliberately not expressible.\"\n },\n \"reason\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Shown on the consent screen, so it is written for the person approving.\"\n },\n \"label\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"table\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"schema\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"tenantIdColumn\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n }\n }\n }\n },\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","// ---------------------------------------------------------------------------\n// app-config.ts — the shell renders from the database, not from a bundle\n// (#280, ADR 0023, migration 150).\n//\n// The split: the MANIFEST is what a plugin CAN do; the DATABASE is what THIS\n// tenant HAS. Until this existed they were the same thing — activation lived in\n// `app.manifest.json` next to the code, which is why turning a feature on for\n// one customer meant a deploy, and why eleven applications needed eleven\n// repositories.\n//\n// One call returns everything the shell needs before it can render anything:\n// branding, settings, the active plugins and facets, the tenant's own menu\n// composition and the caller's permissions. It is cached per (tenant, user)\n// because it is read on every boot and changes only when someone writes through\n// the RPCs — which is where the cache is dropped.\n// ---------------------------------------------------------------------------\nimport type { TenantPluginBinding } from '../types/plugins'\n\n/** One activation row: a plugin, or one facet of it. */\nexport interface AppConfigPlugin {\n plugin: string\n /** null for the plugin itself; a name for one of its parts. */\n facet: string | null\n status: 'active' | 'disabled'\n /** Who turned it on — manual, plan, trial, agent, default. */\n source: string\n config: Record<string, unknown>\n /** When a trial or courtesy ends; null is forever. */\n expires_at: string | null\n}\n\n/**\n * One application this tenant runs (migration 001).\n *\n * An app is a LENS, not a boundary: two apps on one tenant read the same\n * `public.products`. `url` is both where the switcher sends you and the\n * allow-list the session handoff checks against.\n */\nexport interface AppConfigApp {\n id: string\n name: string\n /** Lucide icon NAME, resolved through the UI's curated registry. */\n icon: string | null\n accent_color: string | null\n url: string | null\n /**\n * Which account to land in when this app is opened (008).\n *\n * The active tenant when it runs the app — staying put is the common case —\n * otherwise the first of the caller's accounts that does. Absent on a pool\n * that has not run 008, where every listed app belongs to the active tenant\n * by construction.\n */\n tenant_id?: string | null\n}\n\n/** The tenant's difference over the menu the plugins offer. */\nexport interface AppConfigNavEntry {\n key: string\n hidden: boolean\n label: string | null\n section: 'main' | 'secondary' | 'settings' | null\n position: number | null\n}\n\nexport interface AppConfig {\n tenant_id: string | null\n branding?: Record<string, unknown>\n settings?: Record<string, unknown>\n plugins: AppConfigPlugin[]\n apps: AppConfigApp[]\n nav: AppConfigNavEntry[]\n permissions?: string[]\n generated_at?: string\n}\n\n/** What a caller with no resolvable tenant gets: nothing, legibly. */\nexport const EMPTY_APP_CONFIG: AppConfig = Object.freeze({\n tenant_id: null,\n plugins: [],\n apps: [],\n nav: [],\n permissions: [],\n}) as AppConfig\n\ninterface RpcCapableClient {\n rpc(fn: string, args?: Record<string, unknown>): Promise<{ data: unknown; error: unknown }>\n}\n\nfunction isRpcCapable(client: unknown): client is RpcCapableClient {\n return typeof (client as RpcCapableClient | null)?.rpc === 'function'\n}\n\n// The cache is keyed by tenant because a user who switches accounts must not\n// see the previous one's menu for even one frame.\nconst cache = new Map<string, AppConfig>()\n\n/**\n * Reads the whole configuration in one round trip.\n *\n * Never throws: a shell that cannot render because the configuration call\n * failed is worse than a shell that renders the defaults. The failure is\n * returned as an empty configuration, which is the same thing the RPC returns\n * for a caller with no tenant — and both are visible in one place rather than\n * as a blank screen.\n */\nexport async function fetchAppConfig(\n client: unknown,\n options: { tenantId?: string; force?: boolean } = {},\n): Promise<AppConfig> {\n const key = options.tenantId ?? 'current'\n if (!options.force) {\n const hit = cache.get(key)\n if (hit) return hit\n }\n if (!isRpcCapable(client)) return EMPTY_APP_CONFIG\n\n const { data, error } = await client.rpc('app_config')\n if (error || !data || typeof data !== 'object') return EMPTY_APP_CONFIG\n\n const config = normalizeAppConfig(data as Partial<AppConfig>)\n cache.set(key, config)\n return config\n}\n\n/** Drops what is cached — called after any write through the config RPCs. */\nexport function invalidateAppConfig(tenantId?: string): void {\n if (tenantId) cache.delete(tenantId)\n else cache.clear()\n}\n\nexport function normalizeAppConfig(raw: Partial<AppConfig>): AppConfig {\n return {\n tenant_id: raw.tenant_id ?? null,\n branding: raw.branding ?? {},\n settings: raw.settings ?? {},\n plugins: Array.isArray(raw.plugins) ? raw.plugins : [],\n // A pool that has not run 001 yet returns no `apps` key at all, and gets an\n // empty list — which is exactly what the switcher reads as \"one app\", so it\n // renders the static logo it always did.\n apps: Array.isArray(raw.apps) ? raw.apps : [],\n nav: Array.isArray(raw.nav) ? raw.nav : [],\n permissions: Array.isArray(raw.permissions) ? raw.permissions : [],\n generated_at: raw.generated_at,\n }\n}\n\n/**\n * The activation rows as the plugin runtime already understands them.\n *\n * `resolvePluginRuntime` has accepted `tenantPlugins: TenantPluginBinding[]`\n * since it was written and nothing ever supplied them from anywhere but a file.\n * This is that supply — facet rows are folded into their plugin's config under\n * `facets`, because a facet is a part of a plugin and not a plugin.\n */\nexport function toTenantPluginBindings(config: AppConfig): TenantPluginBinding[] {\n const byPlugin = new Map<string, TenantPluginBinding>()\n\n for (const row of config.plugins) {\n if (row.facet) continue\n byPlugin.set(row.plugin, {\n pluginId: row.plugin,\n status: row.status,\n tenantId: config.tenant_id ?? undefined,\n config: { ...row.config },\n })\n }\n\n for (const row of config.plugins) {\n if (!row.facet) continue\n const parent = byPlugin.get(row.plugin)\n // A facet whose plugin is not active is not a plugin: it is a row that says\n // nothing, and inventing a binding for it would turn the plugin on.\n if (!parent) continue\n const facets = (parent.config?.facets as Record<string, unknown> | undefined) ?? {}\n parent.config = {\n ...parent.config,\n facets: { ...facets, [row.facet]: row.status === 'active' },\n }\n }\n\n return [...byPlugin.values()]\n}\n\n/**\n * Applies the tenant's menu composition to what the plugins offer.\n *\n * Only the difference is stored, so an entry with no row here keeps exactly the\n * position and label its plugin gave it — which is what lets a plugin ship a new\n * entry and have it reach every tenant.\n */\nexport function applyNavComposition<T extends { key: string; label?: string; section?: string; position?: number }>(\n entries: T[],\n nav: AppConfigNavEntry[],\n): T[] {\n const overrides = new Map(nav.map((n) => [n.key, n]))\n return entries\n .filter((entry) => !overrides.get(entry.key)?.hidden)\n .map((entry) => {\n const override = overrides.get(entry.key)\n if (!override) return entry\n return {\n ...entry,\n label: override.label ?? entry.label,\n section: override.section ?? entry.section,\n position: override.position ?? entry.position,\n }\n })\n .sort((a, b) => (a.position ?? 999) - (b.position ?? 999))\n}\n\n// ---------------------------------------------------------------------------\n// The manifest says what a plugin CAN do. The database says what this tenant\n// HAS. Where both speak — branding, locale, a plugin's settings — the database\n// wins, because it is the one that can change without a deploy (#280, ADR 0023).\n// ---------------------------------------------------------------------------\n\n/** The keys a generated app must NOT ship in a file: they are per-tenant. */\nexport const TENANT_OWNED_MANIFEST_KEYS = ['theme', 'branding', 'locale'] as const\n\nexport interface ManifestLike {\n [key: string]: unknown\n theme?: Record<string, unknown>\n branding?: Record<string, unknown>\n locale?: Record<string, unknown>\n surfaces?: Record<string, { plugins?: Array<{ id: string; config?: Record<string, unknown> }> } & Record<string, unknown>>\n}\n\n/**\n * Folds the tenant's configuration over the bundle's manifest.\n *\n * What stays the manifest's: the surfaces, their scaffolds, and which plugin\n * ids the bundle can load at all — an import-graph fact that no database row can\n * change, because the code either shipped or it did not.\n *\n * What the database decides: branding, locale, and whether each of those\n * plugins is on for this tenant, with its settings. That is the whole point of\n * ADR 0023 — eleven customers stop needing eleven repositories, and turning a\n * feature on stops being a deploy.\n *\n * An empty config changes nothing, so a pool that has not run migration 150 yet\n * renders exactly what it rendered before.\n */\nexport function applyAppConfigToManifest<T extends ManifestLike>(manifest: T, config: AppConfig): T {\n const branding = (config.branding ?? {}) as Record<string, unknown>\n const settings = (config.settings ?? {}) as Record<string, unknown>\n const next: ManifestLike = { ...manifest }\n\n if (Object.keys(branding).length > 0) {\n next.theme = { ...(manifest.theme ?? {}), ...(branding.theme as Record<string, unknown> ?? {}) }\n next.branding = { ...(manifest.branding ?? {}), ...branding }\n }\n if (settings.locale && typeof settings.locale === 'object') {\n next.locale = { ...(manifest.locale ?? {}), ...(settings.locale as Record<string, unknown>) }\n }\n\n if (manifest.surfaces && config.plugins.length > 0) {\n const active = new Map(\n config.plugins.filter((p) => p.status === 'active' && !p.facet).map((p) => [p.plugin, p]),\n )\n const surfaces: ManifestLike['surfaces'] = {}\n for (const [name, surface] of Object.entries(manifest.surfaces)) {\n const plugins = surface.plugins\n surfaces[name] = plugins\n ? {\n ...surface,\n // A plugin the bundle carries but this tenant has not turned on is\n // dropped here rather than rendered and hidden — a screen that\n // exists and refuses is worse than one that was never offered.\n plugins: plugins\n .filter((p) => active.has(p.id))\n .map((p) => ({ ...p, config: { ...(p.config ?? {}), ...(active.get(p.id)?.config ?? {}) } })),\n }\n : surface\n }\n next.surfaces = surfaces\n }\n\n return next as T\n}\n","// ---------------------------------------------------------------------------\n// service-client.ts — one door to every service a plugin calls (#278, ADR 0018).\n//\n// The round-3 decision put the valuable half of an open plugin in a service we\n// host: the agenda ships open with the \"suggest a slot\" button, and the\n// intelligence behind it does not ship at all. This is how a plugin makes that\n// call — by NAME, never with a credential, because the credential is the\n// cluster's and the plugin is open source.\n//\n// THE PART THAT IS NOT OPTIONAL. A plugin must work when the service does not\n// answer. `callService` never throws for that reason: it returns a result that\n// says what happened and what the user can still do, taken from the service's\n// own declared fallback. A call site that has to try/catch to keep a screen\n// alive will eventually forget to, and then a network blip is a broken button.\n// ---------------------------------------------------------------------------\n\n/** Why a call did not produce a value. Each one has a different right answer. */\nexport type ServiceRefusal =\n /** The service is not registered, or was turned off. */\n | 'unknown_service'\n /** No tenant in scope — a caller that cannot be placed. */\n | 'no_tenant'\n /** The caller lacks the permission the service requires. */\n | 'forbidden'\n /** The tenant has not contracted it: an upsell, not an error. */\n | 'not_contracted'\n /** It did not answer in time. */\n | 'timeout'\n /** It answered with a failure. */\n | 'failed'\n /** There is nothing to call through (no client, no session). */\n | 'unavailable'\n\nexport interface ServiceSuccess<T> {\n ok: true\n data: T\n durationMs: number\n}\n\nexport interface ServiceFailure {\n ok: false\n reason: ServiceRefusal\n /** What the user can still do, as the service itself declared it. */\n manualFallback?: string\n /** For `not_contracted`: what to offer. */\n entitlement?: string\n plugin?: string\n /** For `forbidden`: what would be needed. */\n permission?: string\n message?: string\n}\n\nexport type ServiceResult<T> = ServiceSuccess<T> | ServiceFailure\n\ninterface RpcCapableClient {\n rpc(fn: string, args?: Record<string, unknown>): Promise<{ data: unknown; error: unknown }>\n functions?: {\n invoke(name: string, options?: { body?: unknown }): Promise<{ data: unknown; error: unknown }>\n }\n}\n\nfunction isRpcCapable(client: unknown): client is RpcCapableClient {\n return typeof (client as RpcCapableClient | null)?.rpc === 'function'\n}\n\nexport interface CallServiceOptions {\n /** Overrides the timeout the registry declares for this service. */\n timeoutMs?: number\n /** The edge function that performs the HTTP leg. Defaults to 'service-router'. */\n router?: string\n /**\n * Calls on behalf of a tenant with no session — the event consumer's 2am\n * reaction (#278). Requires a service-role client; a browser client passing\n * this is refused by the router, not by trust.\n */\n tenantId?: string\n}\n\n/**\n * Calls a service by name.\n *\n * Two round trips by design. The first asks the database whether the call is\n * allowed — which costs nothing and answers the same way everywhere, so a\n * refusal never leaves the cluster and an unentitled tenant never reaches the\n * service at all. Only an allowed call makes the second.\n */\nexport async function callService<T = unknown>(\n client: unknown,\n name: string,\n payload: Record<string, unknown> = {},\n options: CallServiceOptions = {},\n): Promise<ServiceResult<T>> {\n if (!isRpcCapable(client)) {\n return { ok: false, reason: 'unavailable', message: 'no client to call through' }\n }\n\n const started = Date.now()\n\n const forTenant = options.tenantId\n const { data: authData, error: authError } = forTenant\n ? await client.rpc('service_authorize_for', { p_name: name, p_tenant: forTenant })\n : await client.rpc('service_authorize', { p_name: name })\n if (authError || !authData || typeof authData !== 'object') {\n return { ok: false, reason: 'unavailable', message: 'the authorization call itself failed' }\n }\n\n const auth = authData as Record<string, unknown>\n if (auth.allowed !== true) {\n return {\n ok: false,\n reason: (auth.reason as ServiceRefusal) ?? 'failed',\n manualFallback: auth.manual_fallback as string | undefined,\n entitlement: auth.entitlement as string | undefined,\n plugin: auth.plugin as string | undefined,\n permission: auth.permission as string | undefined,\n }\n }\n\n const manualFallback = auth.manual_fallback as string | undefined\n const timeoutMs = options.timeoutMs ?? (auth.timeout_ms as number | undefined) ?? 8000\n\n if (!client.functions) {\n return { ok: false, reason: 'unavailable', manualFallback, message: 'no function transport' }\n }\n\n try {\n const result = await withTimeout(\n client.functions.invoke(options.router ?? 'service-router', {\n body: forTenant ? { service: name, payload, tenant_id: forTenant } : { service: name, payload },\n }),\n timeoutMs,\n )\n const durationMs = Date.now() - started\n\n if (result === TIMED_OUT) {\n void record(client, name, 'timeout', 'client timeout', durationMs, forTenant)\n return { ok: false, reason: 'timeout', manualFallback }\n }\n if (result.error) {\n void record(client, name, 'failed', String(result.error), durationMs, forTenant)\n return { ok: false, reason: 'failed', manualFallback, message: String(result.error) }\n }\n\n void record(client, name, 'ok', null, durationMs, forTenant)\n return { ok: true, data: result.data as T, durationMs }\n } catch (err) {\n const durationMs = Date.now() - started\n void record(client, name, 'failed', String(err), durationMs, forTenant)\n // Deliberately not rethrown: a plugin that has to catch to stay alive will\n // one day forget to, and a network blip becomes a broken screen.\n return { ok: false, reason: 'failed', manualFallback, message: String(err) }\n }\n}\n\nconst TIMED_OUT = Symbol('timed-out') as unknown as { data: unknown; error: unknown }\n\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T | typeof TIMED_OUT> {\n return Promise.race([\n promise,\n new Promise<typeof TIMED_OUT>((resolve) => setTimeout(() => resolve(TIMED_OUT), ms)),\n ])\n}\n\n/** Recording is best-effort: a failure to write history must not fail the call. */\nasync function record(\n client: RpcCapableClient,\n service: string,\n status: string,\n reason: string | null,\n durationMs: number,\n tenantId?: string,\n): Promise<void> {\n try {\n // A system call has no session, so `service_call_record` would have no\n // tenant to attribute to — it names the tenant instead, and leaves the\n // caller NULL, which is true: the system did it, not a sleeping user.\n await (tenantId\n ? client.rpc('service_call_record_for', {\n p_service: service,\n p_tenant: tenantId,\n p_status: status,\n p_reason: reason,\n p_duration_ms: durationMs,\n })\n : client.rpc('service_call_record', {\n p_service: service,\n p_status: status,\n p_reason: reason,\n p_duration_ms: durationMs,\n }))\n } catch {\n /* history is not the call */\n }\n}\n\n/**\n * Calls a service for a tenant with no user present — the worker draining the\n * event log (#277) reacting to a fact at 2am (#278).\n *\n * Same door, same refusals, same never-throws contract. What differs is who is\n * asking: there is no person, so there is no permission to check, and the\n * entitlement rule carries the whole decision because a tenant's contract is a\n * property of the tenant rather than of who is looking.\n *\n * The client must hold the service role. A browser client that passes a tenant\n * is refused by the router, which checks rather than trusts.\n */\nexport function callServiceForTenant<T = unknown>(\n client: unknown,\n tenantId: string,\n name: string,\n payload: Record<string, unknown> = {},\n options: Omit<CallServiceOptions, 'tenantId'> = {},\n): Promise<ServiceResult<T>> {\n return callService<T>(client, name, payload, { ...options, tenantId })\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 MessageAction, MessageActionId, MessageActionKind,\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\nconst ACTION_IDS: MessageActionId[] = ['confirm', 'cancel', 'pay']\nconst ACTION_KINDS: MessageActionKind[] = ['reply', 'payment']\n\n/**\n * Actions out of whatever a jsonb column holds.\n *\n * `null` and a malformed value are two different answers: null means \"no row\n * said anything, use the catalog\", while a row holding junk means somebody\n * customised it into a shape nothing can render — and rendering a button whose\n * id is not in the closed set would send a payload the reply handler cannot\n * match to any action, which reads to the customer as a button that does\n * nothing. So junk collapses to an empty list, not to the default.\n */\nexport function normalizeMessageActions(value: unknown): MessageAction[] | null {\n if (value == null) return null\n if (!Array.isArray(value)) return []\n const out: MessageAction[] = []\n for (const raw of value) {\n const item = raw as Partial<MessageAction> | null\n const id = item?.id\n const kind = item?.kind\n const label = String(item?.label ?? '').trim()\n if (!id || !ACTION_IDS.includes(id) || !kind || !ACTION_KINDS.includes(kind) || !label) continue\n if (out.some((a) => a.id === id)) continue\n out.push({ id, label, kind })\n }\n return out\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 actions: override?.actions ?? fallback.actions ?? [],\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 actions: normalizeMessageActions(row.actions),\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","import { sampleEventPayload } from '../events/envelope'\nimport type { EventField } from '../events/types'\nimport type { MessageAction, MessageChannel } from './types'\n\n// ---------------------------------------------------------------------------\n// Our message → a WhatsApp template Meta will approve.\n//\n// The catalog writes `Oi {{customer_name}}!` because a person has to read and\n// edit it. Meta accepts no such thing: variables are POSITIONAL ({{1}}, {{2}},\n// numbered in reading order), each one needs an example, and the body may not\n// open or close on a variable. Those are three different rejections, all of\n// them hours after submission, and all of them fixable before we ask.\n//\n// So this module is the translation, and it is pure on purpose: it runs in the\n// browser (the editor previews what will be submitted), in a test, and in an\n// edge function, and all three must produce the SAME template — a preview that\n// disagrees with the submission approves one text and sends another.\n//\n// Every rule below is quoted from Tyxter's own OpenAPI description of\n// POST /v1/templates (snapshot in ~/.config/fayz/tyxter-surfaces), which refuses\n// each of them at create time rather than passing them to Meta.\n// ---------------------------------------------------------------------------\n\n/** Meta's three, and the only three Tyxter accepts. */\nexport type ProviderTemplateCategory = 'marketing' | 'utility' | 'authentication'\n\n/** The one language this product writes in. A second one is a second template. */\nexport const PROVIDER_TEMPLATE_LANGUAGE = 'pt_BR'\n\n/** Meta renders at most three reply buttons; the fourth is silently dropped. */\nexport const MAX_QUICK_REPLY_BUTTONS = 3\n\n/**\n * What goes in front of a body that opens on a variable, and behind one that\n * closes on it.\n *\n * Padding rather than refusing, because the text is the tenant's and the rule\n * is Meta's: a body ending `— {{business_name}}` is good copy that Meta will\n * not take. A period is the smallest edit that keeps the sentence intact; a\n * greeting is the smallest one that can open a message without changing tone.\n */\nexport const DEFAULT_LEAD_PADDING = 'Olá! '\n// WORDS, not punctuation: learned from a live production rejection (2026-08-24).\n// Meta refused a body ending in `{{6}}.` with \"Variables can't be at the start\n// or end\" — a bare period does not count as content after a variable, even\n// though the sandbox accepts it. The padding must carry a word.\nexport const DEFAULT_TRAIL_PADDING = ' Até breve!'\n\nexport interface CompileProviderTemplateInput {\n /** Domain event this text reacts to, e.g. `agenda.booking_created`. */\n eventKey: string\n channel: MessageChannel\n /** The catalog body, with NAMED merge fields. */\n body: string\n /** The event's own field descriptors — where each variable's example comes from. */\n fields?: EventField[]\n /** Channel-neutral actions; reply actions become QUICK_REPLY buttons. */\n actions?: MessageAction[]\n /**\n * `marketing` templates are a different Meta category with different pacing\n * and consent rules. Filing one as `utility` is what gets a WABA's quality\n * rating cut, so the kind decides the category rather than a constant.\n */\n kind?: 'transactional' | 'marketing'\n /** Set for a tenant's own version of a product template; absent = the product default. */\n tenantId?: string\n leadPadding?: string\n trailPadding?: string\n}\n\nexport interface ProviderTemplateComponent {\n type: 'BODY' | 'BUTTONS'\n text?: string\n example?: { body_text: string[][] }\n buttons?: { type: 'QUICK_REPLY'; text: string }[]\n}\n\nexport interface CompiledProviderTemplate {\n /** `^[a-z0-9_]+$`, unique per (name, language) inside the Tyxter environment. */\n name: string\n language: typeof PROVIDER_TEMPLATE_LANGUAGE\n category: ProviderTemplateCategory\n components: ProviderTemplateComponent[]\n /**\n * Ordered field names: index 0 is `{{1}}`. This is what a send needs to turn\n * `{customer_name: 'Maria'}` into `{'1': 'Maria'}`, and it is stored beside\n * the approved template because an approved template is immutable — the map\n * that produced it can never be recomputed from a body that has since moved.\n */\n variableMap: string[]\n /** Which button index carries which action. Index is Meta's, zero-based. */\n actionsMap: { index: number; id: MessageAction['id']; kind: MessageAction['kind'] }[]\n /** The positional body exactly as submitted — what a diff compares against. */\n bodySnapshot: string\n /** True when Meta's placement rule forced copy in that was not written by hand. */\n padded: { lead: boolean; trail: boolean }\n}\n\nexport type CompileProviderTemplateResult =\n | { ok: true; template: CompiledProviderTemplate }\n | { ok: false; code: ProviderTemplateErrorCode; message: string; detail?: string }\n\nexport type ProviderTemplateErrorCode =\n | 'empty_body'\n | 'unknown_variable'\n | 'named_placeholder_left'\n | 'too_many_variables'\n\n/** Meta's ceiling on body variables. Past it the template is rejected on review. */\nexport const MAX_TEMPLATE_VARIABLES = 10\n\nconst PLACEHOLDER = /\\{\\{\\s*([\\w]+)\\s*\\}\\}/g\n\n/**\n * A Tyxter-legal template name for this (event × channel × owner).\n *\n * `^[a-z0-9_]+$` is the pattern the API enforces, so the dot in\n * `agenda.booking_created` cannot survive. The tenant suffix is a hash and not\n * the uuid because the uuid does not fit the 512-char name next to anything\n * else and, more to the point, a template name is visible in Meta's Business\n * Manager — a tenant id there is an internal identifier on someone else's\n * screen.\n */\nexport function providerTemplateName(eventKey: string, tenantId?: string): string {\n const slug = String(eventKey ?? '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n const base = `t_${slug || 'message'}`\n const owner = String(tenantId ?? '').trim()\n return owner ? `${base}_${shortHash(owner)}` : base\n}\n\n/**\n * FNV-1a, 32-bit, base36. Not a cryptographic hash and not asked to be: it only\n * has to keep two tenants' names apart inside one project, and it has to be the\n * same in a browser, in Deno and in a test without importing anything.\n */\nexport function shortHash(value: string): string {\n let hash = 0x811c9dc5\n for (let i = 0; i < value.length; i += 1) {\n hash ^= value.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193) >>> 0\n }\n return hash.toString(36).padStart(7, '0')\n}\n\n/** Whether Meta's \"no variable at either edge\" rule applies to this category. */\nexport function placementRuleApplies(category: ProviderTemplateCategory): boolean {\n // Authentication templates are exempt: a one-time-code body legitimately\n // opens on the code. Verbatim from Tyxter's create description.\n return category !== 'authentication'\n}\n\nexport function compileProviderTemplate(\n input: CompileProviderTemplateInput,\n): CompileProviderTemplateResult {\n const source = String(input.body ?? '')\n if (!source.trim()) {\n return { ok: false, code: 'empty_body', message: 'A mensagem está vazia' }\n }\n\n const fields = input.fields ?? []\n const known = new Set(fields.map((f) => f.name))\n // The SAME sample the editor's preview and the webhook test body are built\n // from, so the example Meta reviews is the example the tenant saw. Its\n // fallback for a field with no `example` is the literal `{{name}}`, which\n // would be a template whose example is a placeholder — the label stands in.\n const sample = sampleEventPayload(fields)\n const examples = new Map(\n fields.map((f) => {\n const value = String(sample[f.name] ?? '')\n return [f.name, value && !value.startsWith('{{') ? value : (f.label || f.name)]\n }),\n )\n\n // Reading order, first occurrence wins. A field used twice reuses its own\n // number rather than claiming a second one: the send passes ONE value per\n // field, and two indexes for one field would need two copies of the same\n // value with nothing keeping them equal.\n const variableMap: string[] = []\n let unknown: string | null = null\n\n const positional = source.replace(PLACEHOLDER, (whole, name: string) => {\n if (!known.has(name)) {\n unknown ??= name\n return whole\n }\n let index = variableMap.indexOf(name)\n if (index < 0) {\n variableMap.push(name)\n index = variableMap.length - 1\n }\n return `{{${index + 1}}}`\n })\n\n if (unknown) {\n return {\n ok: false,\n code: 'unknown_variable',\n // Loud, because the alternative is a template Meta approves and a customer\n // reads with `{{cupom}}` printed in it.\n message: `A mensagem usa {{${unknown}}}, que este evento não envia`,\n detail: unknown,\n }\n }\n if (variableMap.length > MAX_TEMPLATE_VARIABLES) {\n return {\n ok: false,\n code: 'too_many_variables',\n message: `A mensagem tem ${variableMap.length} campos e o WhatsApp aceita ${MAX_TEMPLATE_VARIABLES}`,\n }\n }\n\n const category: ProviderTemplateCategory = input.kind === 'marketing' ? 'marketing' : 'utility'\n\n let text = positional\n const padded = { lead: false, trail: false }\n if (placementRuleApplies(category)) {\n // The rule is judged on the TRIMMED text, and the trim removes invisible\n // characters too — so a body that merely starts with a newline is still an\n // edge variable, and padding has to go inside that trim, not around it.\n // Punctuation does not shield an edge variable: real Meta rejected\n // `… — {{6}}.` as ending on a variable (the sandbox accepts it — do not\n // trust the sandbox on this rule). So the edge test skips over anything\n // that is not a letter or digit before deciding.\n if (/^[^\\p{L}\\p{N}]*\\{\\{\\d+\\}\\}/u.test(text.trim())) {\n text = `${input.leadPadding ?? DEFAULT_LEAD_PADDING}${text.trimStart()}`\n padded.lead = true\n }\n if (/\\{\\{\\d+\\}\\}[^\\p{L}\\p{N}]*$/u.test(text.trim())) {\n text = `${text.trimEnd()}${input.trailPadding ?? DEFAULT_TRAIL_PADDING}`\n padded.trail = true\n }\n }\n\n // Belt and braces on the one failure the API names first: a leftover named\n // placeholder is refused for EVERY category, so a bug in the loop above must\n // fail here rather than at Tyxter with the tenant's booking already made.\n const leftover = /\\{\\{\\s*(?!\\d+\\s*\\}\\})[^}]*\\}\\}/.exec(text)\n if (leftover) {\n return {\n ok: false,\n code: 'named_placeholder_left',\n message: 'A mensagem ainda tem um campo com nome, e o WhatsApp só aceita numerados',\n detail: leftover[0],\n }\n }\n\n const components: ProviderTemplateComponent[] = [{\n type: 'BODY',\n text,\n // One row of examples, one cell per variable, in the same order as the map.\n // Meta requires an example for each; Tyxter refuses the create without them.\n ...(variableMap.length > 0\n ? { example: { body_text: [variableMap.map((name) => examples.get(name) ?? name)] } }\n : {}),\n }]\n\n // Only `reply` actions become buttons. `pay` is a payment rail, and until\n // that rail is ready (WP5) a QUICK_REPLY saying \"Pagar\" would be a button\n // that takes the money nowhere.\n const replies = (input.actions ?? [])\n .filter((action) => action.kind === 'reply')\n .slice(0, MAX_QUICK_REPLY_BUTTONS)\n\n const actionsMap = replies.map((action, index) => ({\n index,\n id: action.id,\n kind: action.kind,\n }))\n\n if (replies.length > 0) {\n components.push({\n type: 'BUTTONS',\n buttons: replies.map((action) => ({\n type: 'QUICK_REPLY' as const,\n // 20 is Meta's button-text ceiling. Truncating beats a rejection that\n // arrives a day later naming a component index.\n text: action.label.slice(0, 20),\n })),\n })\n }\n\n return {\n ok: true,\n template: {\n name: providerTemplateName(input.eventKey, input.tenantId),\n language: PROVIDER_TEMPLATE_LANGUAGE,\n category,\n components,\n variableMap,\n actionsMap,\n bodySnapshot: text,\n padded,\n },\n }\n}\n\n/**\n * Values for a send, keyed the way `POST /v1/messages` wants them.\n *\n * The map is read from the APPROVED template's stored `variable_map`, never\n * recomputed from today's body: the template Meta approved is immutable, and a\n * body edited since would silently renumber the variables of a message already\n * in flight. A field the caller did not send becomes an empty string rather\n * than a missing key — Meta refuses a send whose parameter count does not match\n * the template, so a hole has to be a value.\n */\nexport function positionalVariables(\n variableMap: string[],\n values: Record<string, string | number | null | undefined>,\n): Record<string, string> {\n const out: Record<string, string> = {}\n variableMap.forEach((name, index) => {\n const value = values[name]\n out[String(index + 1)] = value == null ? '' : String(value)\n })\n return out\n}\n","// ---------------------------------------------------------------------------\n// One Brazilian phone number, written the one way a messaging provider accepts.\n//\n// The problem is not formatting, it is that FOUR spellings of the same number\n// are all in the database at once and none of them match each other:\n//\n// (21) 99889-9889 what the receptionist typed into the client's card\n// 21998899889 what an import wrote\n// +5521998899889 what WhatsApp sends on an inbound message\n// +552198899889 the SAME line before 2016, when mobiles gained a 9th\n// digit — and still how some old records hold it\n//\n// Plain string equality never matches any two of those, which is exactly the\n// bug legacy solved four separate times, four slightly different ways. This is\n// the one implementation, and it is channel-neutral on purpose: a phone number\n// is not a WhatsApp fact.\n//\n// The edge functions cannot import this module — a Supabase function may import\n// exactly one bare specifier (@fayz-ai/core/connector-runtime, and this is not\n// it). `plugins/plugin-conversations/functions/_shared/tyxter-runtime.js` holds\n// a mirror of these two functions, and the two are held to the SAME case table\n// (packages/core/test/messaging/phone-cases.json) by both test suites, so they\n// cannot drift in silence.\n// ---------------------------------------------------------------------------\n\n/** Brazil. The only country code this module knows how to repair. */\nexport const BR_COUNTRY_CALLING_CODE = '55'\n\n/**\n * How many trailing digits identify a line no matter how it was written.\n *\n * Eight, because that is what survives every variation above: the area code can\n * be missing, the country code can be missing, and the mobile 9 can be missing,\n * but the last eight digits of a Brazilian line are the same in all four\n * spellings. Nine would break on exactly the ambiguity this exists to bridge.\n */\nexport const BR_MATCH_SUFFIX_LENGTH = 8\n\n/** Every DDD in the Brazilian plan is 11–99 and none of them ends in 0. */\nfunction isPlausibleDdd(ddd: string): boolean {\n const n = Number(ddd)\n return n >= 11 && n <= 99 && !ddd.endsWith('0')\n}\n\n/**\n * A 10-digit national number is a mobile that predates the 9th digit when its\n * subscriber part starts 6–9; 2–5 is a landline and must be left alone.\n *\n * Adding the 9 is the right repair for a SEND: a mobile written without it is a\n * pre-2016 record, and Meta will not deliver to the eight-digit form. Adding it\n * to a landline would invent a number that does not exist.\n */\nfunction isLegacyMobile(national: string): boolean {\n return national.length === 10 && /^[6-9]/.test(national.slice(2))\n}\n\n/**\n * The number as `+55DDDNNNNNNNNN`, or `null` when the input cannot be one.\n *\n * `null` and not a throw, and not a best-effort string: the caller's next move\n * is to refuse the send with the number named, and a function that returns\n * something plausible for `'a combinar'` would send a booking confirmation into\n * the void and report success.\n *\n * A number that already carries a DIFFERENT country code passes through\n * untouched when it is a valid E.164 — a foreign customer's line is not a\n * malformed Brazilian one, and \"repairing\" it would be the worst kind of wrong.\n */\nexport function normalizeBrPhoneToE164(input: string | null | undefined): string | null {\n const raw = String(input ?? '').trim()\n if (!raw) return null\n\n const hadPlus = raw.startsWith('+')\n const digits = raw.replace(/\\D/g, '')\n if (!digits) return null\n\n // An explicit + with a country code that is not 55: not ours to touch.\n if (hadPlus && !digits.startsWith(BR_COUNTRY_CALLING_CODE)) {\n return digits.length >= 8 && digits.length <= 15 ? `+${digits}` : null\n }\n\n let national = digits\n if (national.startsWith(BR_COUNTRY_CALLING_CODE) && national.length > 11) {\n // 55 + 10 or 11 national digits. Longer than that is a typo, not a number,\n // and shorter means the leading 55 was an area code that happens to read\n // like the country code (DDD 55 is Santa Maria/RS — a real one).\n national = national.slice(2)\n }\n\n if (national.length === 10 || national.length === 11) {\n if (!isPlausibleDdd(national.slice(0, 2))) return null\n if (national.length === 11 && !/^9/.test(national.slice(2))) {\n // 11 digits whose subscriber part does not start with 9 is not a shape the\n // plan issues — an extra digit somewhere, and guessing where is how a\n // message reaches a stranger.\n return null\n }\n const repaired = isLegacyMobile(national)\n ? `${national.slice(0, 2)}9${national.slice(2)}`\n : national\n return `+${BR_COUNTRY_CALLING_CODE}${repaired}`\n }\n\n // No area code, or too many digits to place one: unusable either way.\n return null\n}\n\n/** The national part of a normalized number — what the structured recipient wants. */\nexport function brNationalNumber(e164: string | null | undefined): string | null {\n const value = String(e164 ?? '').trim()\n if (!value.startsWith(`+${BR_COUNTRY_CALLING_CODE}`)) return null\n const national = value.slice(3)\n return /^\\d{10,11}$/.test(national) ? national : null\n}\n\n/**\n * The key two spellings of one line agree on. For matching a stored contact\n * against the number an inbound message arrived from — never for sending.\n */\nexport function brPhoneSuffixKey(input: string | null | undefined): string | null {\n const digits = String(input ?? '').replace(/\\D/g, '')\n return digits.length >= BR_MATCH_SUFFIX_LENGTH ? digits.slice(-BR_MATCH_SUFFIX_LENGTH) : null\n}\n","import { emitDomainEvent } from '../events/envelope'\nimport { getActiveTenantId } from '../lib/tenant'\n\n// ---------------------------------------------------------------------------\n// Frontend error telemetry.\n//\n// One funnel for every way the UI can break — a render that throws, a promise\n// nobody caught, a script error, a `reportAppError` call from a catch block —\n// so that \"what did the user see\" is answerable from one place instead of three\n// half-instrumented ones.\n//\n// The SDK deliberately depends on NO vendor. Reporters are registered by the\n// host app, which is also where the DSN/key lives: every project has its own,\n// and a key compiled into the SDK would be the same key for all of them. See\n// createVendorReporter below for the Sentry/PostHog shape.\n//\n// Everything here is fire-and-forget and swallows its own failures. Telemetry\n// that throws while reporting an error turns one broken page into a loop.\n// ---------------------------------------------------------------------------\n\n/** Where the error came from — the dimension worth splitting dashboards on. */\nexport type AppErrorSource =\n /** A React subtree threw during render (caught by an error boundary). */\n | 'render'\n /** window.onerror — script errors outside React. */\n | 'window'\n /** unhandledrejection — a promise nobody caught. */\n | 'promise'\n /** An explicit reportAppError() from a catch block. */\n | 'manual'\n\nexport interface AppErrorContext {\n source?: AppErrorSource\n /** Route pattern when known ('/settings/custom_forms/templates/:id'), so the\n * grouping does not explode into one bucket per record id. */\n route?: string | null\n /** The concrete URL/hash the user was on. */\n location?: string | null\n componentStack?: string | null\n tenantId?: string | null\n userId?: string | null\n /** Anything the caller knows and the funnel cannot guess. */\n extra?: Record<string, unknown>\n}\n\nexport interface AppErrorReport {\n /** Short correlation id. It is shown on the error screen and travels with the\n * event, so a user reading \"ERR-7F3A21\" out loud lands on the exact record. */\n id: string\n name: string\n message: string\n stack?: string\n source: AppErrorSource\n route?: string | null\n location?: string | null\n componentStack?: string | null\n tenantId?: string | null\n userId?: string | null\n occurredAt: string\n userAgent?: string\n extra?: Record<string, unknown>\n /** The original throw, for reporters that want the real object (Sentry needs\n * it to symbolicate). Never serialize this field. */\n error: unknown\n}\n\nexport type ErrorReporter = (report: AppErrorReport) => void\n\n/** The event key every reporter and the event log can subscribe to. */\nexport const APP_ERROR_EVENT = 'app.error'\n\nconst reporters = new Set<ErrorReporter>()\n\n/**\n * Registers a sink for frontend errors. Returns the unsubscribe.\n *\n * The host app wires its vendor here, once, at boot:\n *\n * import * as Sentry from '@sentry/react'\n * Sentry.init({ dsn: import.meta.env.VITE_SENTRY_DSN })\n * registerErrorReporter(createVendorReporter(Sentry))\n */\nexport function registerErrorReporter(reporter: ErrorReporter): () => void {\n reporters.add(reporter)\n return () => { reporters.delete(reporter) }\n}\n\nexport function clearErrorReporters(): void {\n reporters.clear()\n}\n\nfunction makeErrorId(): string {\n const bytes = globalThis.crypto?.getRandomValues?.(new Uint8Array(3))\n const hex = bytes\n ? Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('')\n : Math.floor(Math.random() * 0xffffff).toString(16).padStart(6, '0')\n return `ERR-${hex.toUpperCase()}`\n}\n\nfunction toError(value: unknown): { name: string; message: string; stack?: string } {\n if (value instanceof Error) {\n return { name: value.name, message: value.message, stack: value.stack }\n }\n // A thrown string/object still has to produce a usable message — `[object\n // Object]` in the dashboard is the same as no report at all.\n if (typeof value === 'string') return { name: 'Error', message: value }\n try {\n return { name: 'Error', message: JSON.stringify(value) ?? String(value) }\n } catch {\n return { name: 'Error', message: String(value) }\n }\n}\n\n// A crashing render can re-throw on every retry, and a broken interval can throw\n// forever. Collapse identical errors inside a short window so one bug costs one\n// event instead of a thousand — and so the quota is still there for the next bug.\nconst DEDUPE_WINDOW_MS = 5_000\nconst recent = new Map<string, number>()\n\nfunction isDuplicate(signature: string): boolean {\n const now = Date.now()\n for (const [key, at] of recent) {\n if (now - at > DEDUPE_WINDOW_MS) recent.delete(key)\n }\n const seen = recent.get(signature)\n recent.set(signature, now)\n return seen !== undefined && now - seen < DEDUPE_WINDOW_MS\n}\n\n/** Test seam — the dedupe window is global state that would leak across specs. */\nexport function resetErrorDedupe(): void {\n recent.clear()\n}\n\n/**\n * The single entry point. Builds the report, fans it out to every registered\n * reporter, and emits it as a domain event so the existing bus/event-log\n * consumers see it without a second wiring.\n *\n * Returns the report so a caller (the error screen) can show the id.\n */\nexport function reportAppError(error: unknown, context: AppErrorContext = {}): AppErrorReport {\n const { name, message, stack } = toError(error)\n const report: AppErrorReport = {\n id: makeErrorId(),\n name,\n message,\n stack,\n source: context.source ?? 'manual',\n route: context.route ?? null,\n location: context.location ?? (typeof window !== 'undefined' ? window.location.href : null),\n componentStack: context.componentStack ?? null,\n tenantId: context.tenantId ?? getActiveTenantId() ?? null,\n userId: context.userId ?? null,\n occurredAt: new Date().toISOString(),\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n extra: context.extra,\n error,\n }\n\n // Signature ignores the id (unique by construction) and the timestamp.\n if (isDuplicate(`${report.source}|${report.name}|${report.message}|${report.route ?? ''}`)) {\n return report\n }\n\n // eslint-disable-next-line no-console\n console.error(`[error:${report.source}] ${report.id}`, error)\n\n for (const reporter of reporters) {\n try {\n reporter(report)\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[error] reporter failed', err)\n }\n }\n\n try {\n // `error` is dropped from the payload on purpose: the bus payload gets\n // serialized by log/webhook consumers, and an Error does not survive that.\n const { error: _raw, ...payload } = report\n emitDomainEvent(APP_ERROR_EVENT, payload as unknown as Record<string, unknown>, {\n actorId: report.userId,\n tenantId: report.tenantId,\n })\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[error] event emit failed', err)\n }\n\n return report\n}\n\n// ---------------------------------------------------------------------------\n// Global handlers — everything React's error boundaries structurally cannot see:\n// event handlers, timers, async callbacks, and rejected promises.\n// ---------------------------------------------------------------------------\n\nlet uninstall: (() => void) | null = null\n\n/** Idempotent: calling it twice does not double-report. Returns the uninstall. */\nexport function installGlobalErrorHandlers(): () => void {\n if (uninstall) return uninstall\n if (typeof window === 'undefined') return () => {}\n\n const onError = (event: ErrorEvent) => {\n reportAppError(event.error ?? event.message, {\n source: 'window',\n extra: { filename: event.filename, lineno: event.lineno, colno: event.colno },\n })\n }\n const onRejection = (event: PromiseRejectionEvent) => {\n reportAppError(event.reason, { source: 'promise' })\n }\n\n window.addEventListener('error', onError)\n window.addEventListener('unhandledrejection', onRejection)\n\n uninstall = () => {\n window.removeEventListener('error', onError)\n window.removeEventListener('unhandledrejection', onRejection)\n uninstall = null\n }\n return uninstall\n}\n\n// ---------------------------------------------------------------------------\n// Vendor adapter.\n// ---------------------------------------------------------------------------\n\n/** The slice of Sentry/PostHog/Bugsnag this SDK needs. Structural on purpose —\n * it keeps the vendor package out of the SDK's dependency tree. */\nexport interface ErrorVendorClient {\n captureException: (error: unknown, hint?: Record<string, unknown>) => unknown\n /** Optional: Sentry's setTag/setContext live on the scope, not the client, so\n * everything we know travels in the hint's `extra`/`tags` instead. */\n captureMessage?: (message: string, hint?: Record<string, unknown>) => unknown\n}\n\n/**\n * Wraps a vendor client as an ErrorReporter, mapping the report onto the\n * tags/extra shape Sentry (and anything Sentry-shaped) expects.\n *\n * Tags are the low-cardinality dimensions you filter dashboards by; the rest\n * goes to extra. `errorId` is a tag on purpose — it is what a user reads to\n * support, and it has to be searchable.\n */\nexport function createVendorReporter(client: ErrorVendorClient): ErrorReporter {\n return (report) => {\n const hint = {\n tags: {\n errorId: report.id,\n source: report.source,\n route: report.route ?? 'unknown',\n tenantId: report.tenantId ?? 'unknown',\n },\n extra: {\n errorId: report.id,\n location: report.location,\n componentStack: report.componentStack,\n userId: report.userId,\n occurredAt: report.occurredAt,\n ...report.extra,\n },\n }\n // A non-Error throw has no stack to symbolicate; captureMessage keeps it\n // from being grouped as one giant \"Non-Error exception\" bucket.\n if (!(report.error instanceof Error) && client.captureMessage) {\n client.captureMessage(`${report.name}: ${report.message}`, hint)\n return\n }\n client.captureException(report.error, hint)\n }\n}\n"]}