@fayz-ai/core 0.8.2 → 0.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-XJKW2JRW.js → chunk-GULZD7XW.js} +7 -14
- package/dist/chunk-GULZD7XW.js.map +1 -0
- package/dist/{chunk-SO3VUKGZ.cjs → chunk-HN66DF4E.cjs} +123 -4
- package/dist/chunk-HN66DF4E.cjs.map +1 -0
- package/dist/{chunk-CYAWDW44.cjs → chunk-KL2XT2TV.cjs} +6 -16
- package/dist/chunk-KL2XT2TV.cjs.map +1 -0
- package/dist/{chunk-JHGXROKV.js → chunk-MJ4ML56F.js} +123 -4
- package/dist/chunk-MJ4ML56F.js.map +1 -0
- package/dist/data/archetype.d.ts.map +1 -1
- package/dist/data/index.cjs +9 -21
- package/dist/data/index.d.ts +0 -1
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +1 -1
- package/dist/data/refresh.d.ts +36 -0
- package/dist/data/refresh.d.ts.map +1 -0
- package/dist/data/supabase.d.ts.map +1 -1
- package/dist/data/types.d.ts +6 -0
- package/dist/data/types.d.ts.map +1 -1
- package/dist/i18n/index.cjs +10 -10
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/i18n/shell-translations.d.ts.map +1 -1
- package/dist/index.cjs +694 -97
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +652 -59
- package/dist/index.js.map +1 -1
- package/dist/search/engine.d.ts +12 -0
- package/dist/search/engine.d.ts.map +1 -0
- package/dist/search/index.d.ts +5 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/text.d.ts +37 -0
- package/dist/search/text.d.ts.map +1 -0
- package/dist/search/types.d.ts +72 -0
- package/dist/search/types.d.ts.map +1 -0
- package/dist/types/org.d.ts +28 -0
- package/dist/types/org.d.ts.map +1 -1
- package/dist/types/plugins.d.ts +12 -0
- package/dist/types/plugins.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/data/archetype.ts +4 -2
- package/src/data/index.ts +0 -1
- package/src/data/refresh.ts +105 -0
- package/src/data/supabase.ts +3 -1
- package/src/data/types.ts +6 -0
- package/src/i18n/index.ts +2 -0
- package/src/i18n/shell-translations.ts +119 -2
- package/src/index.ts +19 -2
- package/src/search/engine.ts +551 -0
- package/src/search/index.ts +25 -0
- package/src/search/text.ts +206 -0
- package/src/search/types.ts +75 -0
- package/src/types/org.ts +29 -0
- package/src/types/plugins.ts +12 -0
- package/dist/chunk-CYAWDW44.cjs.map +0 -1
- package/dist/chunk-JHGXROKV.js.map +0 -1
- package/dist/chunk-SO3VUKGZ.cjs.map +0 -1
- package/dist/chunk-XJKW2JRW.js.map +0 -1
- package/dist/data/cloud.d.ts +0 -5
- package/dist/data/cloud.d.ts.map +0 -1
- package/src/data/cloud.ts +0 -28
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/plugins.ts","../src/plugin/createSafeDataProvider.ts","../src/phone/index.ts","../src/address/index.ts","../src/seo/index.ts","../src/lib/format.ts","../src/lib/csv.ts","../src/events/index.tsx","../src/blocks/index.tsx","../src/manifest/index.ts","../src/manifest/serialize.ts","../src/manifest/app-manifest.schema.json","../src/app/render.tsx","../src/router/history.ts"],"names":["getSupabaseClientOptional","useEffect","getCurrentLocale","React","React2","getBlock","React3","getScaffold","create","next"],"mappings":"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","file":"index.cjs","sourcesContent":["import type React from 'react'\nimport type { EntityDef } from './crud'\nimport type { FeatureDeclaration, PermissionAction } from './permissions'\nimport type { LimitDeclaration } from './entitlements'\nimport type { ConnectorDefinition } from '../integrations'\n\nexport type VerticalId = 'beauty' | 'food' | 'health' | 'services' | 'retail' | 'education' | (string & {})\nexport type PluginScope = 'core' | 'vertical' | 'universal' | 'addon' | 'tenant'\nexport type PluginStatus = 'pending_setup' | 'active' | 'disabled' | 'removed'\n\n/**\n * Scaffold type this plugin targets.\n * Plugins can declare which scaffolds they work with.\n * If omitted, the plugin works with all scaffold types.\n */\nexport type ScaffoldType = 'saas' | 'ecommerce' | 'landing_page' | 'website' | (string & {})\n\nexport interface PluginPermissionRequirement {\n feature: string\n action: PermissionAction\n}\n\nexport interface PluginNavigationEntry {\n id?: string\n section: 'main' | 'secondary' | 'settings'\n position: number\n label: string\n route: string\n icon?: string\n badge?: string | number\n permission?: PluginPermissionRequirement\n /**\n * When this entry gains sub-path children, the shell also synthesizes a child\n * pointing back at the parent's own route (so /courses stays reachable under\n * the \"Courses\" group). Set false when the parent route is a duplicate of its\n * first child — e.g. /shop and /shop/products render the same catalog, and\n * listing both reads as a bug. Defaults to true.\n */\n indexChild?: boolean\n}\n\nexport interface PluginSettingsTab {\n id: string\n label: string\n icon?: string\n /** Provide the component directly, or reference a registered component by id\n * (resolvePluginComponent resolves componentId → the component registry).\n * Exactly one is required. */\n component?: React.ComponentType<unknown>\n componentId?: string\n pluginId?: string\n order?: number\n permission?: PluginPermissionRequirement\n}\n\nexport interface PluginRouteDefinition {\n path: string\n /** Component or a registered component id — exactly one is required. */\n component?: React.ComponentType<unknown>\n componentId?: string\n guard?: 'authenticated' | 'role' | 'public' | 'share-token'\n roles?: string[]\n permission?: PluginPermissionRequirement\n /** Render edge-to-edge with no page padding/animation wrapper (chat, kanban, canvas). */\n fullBleed?: boolean\n}\n\nexport type PluginWidgetZone =\n | 'shell.sidebar.before-nav'\n | 'shell.sidebar.footer'\n | 'shell.topbar.start'\n | 'shell.topbar.end'\n | 'page.before'\n | 'page.after'\n | 'settings.before'\n | 'settings.after'\n | 'shell.floating'\n | (string & {})\n\nexport const WidgetZone = {\n SIDEBAR_BEFORE_NAV: 'shell.sidebar.before-nav',\n SIDEBAR_FOOTER: 'shell.sidebar.footer',\n TOPBAR_START: 'shell.topbar.start',\n TOPBAR_END: 'shell.topbar.end',\n PAGE_BEFORE: 'page.before',\n PAGE_AFTER: 'page.after',\n SETTINGS_BEFORE: 'settings.before',\n SETTINGS_AFTER: 'settings.after',\n FLOATING: 'shell.floating',\n} as const\n\nexport interface PluginRuntimeTenant {\n id?: string\n slug?: string\n verticalId?: string\n plan?: string\n}\n\nexport interface PluginRuntimeUser {\n id?: string\n role?: string\n}\n\nexport interface PluginWidgetVisibility {\n routes?: string[]\n excludeRoutes?: string[]\n layouts?: string[]\n roles?: string[]\n plans?: string[]\n permissions?: PluginPermissionRequirement[]\n when?: (context: PluginRuntimeContext) => boolean\n}\n\nexport interface PluginRuntimeContext {\n tenant: PluginRuntimeTenant | null\n user: PluginRuntimeUser | null\n currentPath: string\n matchedPath?: string\n layout: string\n hasPermission?: (req: PluginPermissionRequirement) => boolean\n}\n\nexport interface PluginWidgetDefinition<TConfig extends Record<string, unknown> = Record<string, unknown>> {\n id: string\n zone: PluginWidgetZone\n /** Component or a registered component id — exactly one is required. */\n component?: React.ComponentType<unknown>\n componentId?: string\n title?: string\n order?: number\n permission?: PluginPermissionRequirement\n visibility?: PluginWidgetVisibility\n props?: TConfig\n}\n\n// ---------------------------------------------------------------------------\n// Dashboard widgets — first-class units a plugin contributes to the dashboard\n// registry. Rendered both on the plugin's own home and on the global app home.\n// ---------------------------------------------------------------------------\n\nexport type DashboardWidgetKind = 'kpi' | 'chart' | 'table' | 'onboarding' | 'custom'\n\n/** Surfaces a widget can appear on. 'home' = global app home (the universal\n * business dashboard every app renders via createDashboardPlugin);\n * 'plugin-home' = the owning plugin's own overview page; 'finance-home' = a\n * dedicated B2C consumer-finance home (norman-ai's phone-first money screen),\n * kept separate so its full-bleed hero/cards never leak onto the B2B 'home'. */\nexport type DashboardSurface = 'home' | 'plugin-home' | 'finance-home'\n\nexport interface DashboardWidgetDef<TProps extends Record<string, unknown> = Record<string, unknown>> {\n /** Globally unique id, e.g. 'crm.kpi.total-leads'. */\n id: string\n /** i18n key or plain label. */\n title: string\n description?: string\n icon?: string\n /** Owning domain used to scope plugin-home vs global home. Defaults to plugin.id. */\n domain?: string\n kind: DashboardWidgetKind\n /** Column span on the 4-col grid. Defaults by kind (kpi→1, chart→2, table→4). */\n span?: 1 | 2 | 3 | 4\n /** Visible before any app/user customization. Default: true. */\n defaultVisible?: boolean\n /** Default order within the surface (lower = first). */\n defaultOrder?: number\n /** Surfaces this widget appears on. Default: both. */\n surfaces?: DashboardSurface[]\n verticalId?: VerticalId\n permission?: PluginPermissionRequirement\n /** Component or a registered component id — exactly one is required. */\n component?: React.ComponentType<unknown>\n componentId?: string\n props?: TProps\n}\n\n/** App- or user-level overrides applied on top of the registered defaults. */\nexport interface DashboardLayoutConfig {\n widgets?: Array<{ id: string; visible?: boolean; order?: number; span?: number }>\n}\n\nexport interface ResolvedDashboardWidget extends DashboardWidgetDef {\n /** Resolved owning domain (plugin.id when not explicitly set). */\n domain: string\n order: number\n plugin: ResolvedPluginManifest\n}\n\n/** An event a plugin emits onto the event bus — declared for platform\n * introspection and so the AppManifest can bind event→action as data. */\nexport interface PluginEventDefinition {\n /** Namespaced event name, e.g. 'agenda.booking.confirmed'. */\n name: string\n description?: string\n /** JSON Schema for the payload (editor / AI / validation). */\n payloadSchema?: Record<string, unknown>\n}\n\nexport interface PluginCapability {\n id: string\n label: string\n description?: string\n kind?: 'page' | 'widget' | 'data' | 'integration'\n}\n\nexport interface PluginQuickAction {\n id: string\n label: string\n icon?: string\n description?: string\n /** Action handler — typically navigates to a view. */\n action: () => void\n}\n\nexport type AIToolMode = 'read' | 'persist'\n\nexport interface AIToolParameterProperty {\n type: 'string' | 'number' | 'boolean' | 'array' | 'object'\n description?: string\n enum?: string[]\n items?: AIToolParameterProperty\n default?: unknown\n}\n\nexport interface AIToolParameters {\n type: 'object'\n properties: Record<string, AIToolParameterProperty>\n required?: string[]\n}\n\nexport interface AIToolSuggestion {\n label: string\n prompt?: string\n icon?: string\n verticalId?: VerticalId\n}\n\nexport type AIToolExecution =\n | { plane: 'server'; kind: 'rpc'; rpc: string }\n | { plane: 'server'; kind: 'entity_read'; entity: string }\n | { plane: 'client' }\n\n/**\n * A tenant-scoped pool RPC (`agent_<domain>_<verb>`) this plugin ships for the\n * server-plane agent executor. Surfaces in the manifest as\n * `agent.rpcs` (RpcContract) — the broker only ever calls declared functions.\n */\nexport interface AgentRpcDeclaration {\n /** Function name in the pool, e.g. 'agent_agenda_create_appointment'. */\n name: string\n kind: 'read' | 'write'\n description: string\n /** JSON Schema of the p_payload argument. */\n payloadSchema?: AIToolParameters\n /** Whether the function writes audit_logs itself. */\n audits?: boolean\n}\n\nexport interface PluginAITool {\n id: string\n name: string\n description: string\n icon?: string\n mode: AIToolMode\n parameters?: AIToolParameters\n permission?: PluginPermissionRequirement\n /**\n * Quantity-limit key this tool's writes consume (e.g. 'bookings_month' for a\n * booking-creating tool). Persist-mode tools that create countable rows MUST\n * declare it so the agent executor can run the SAME plan-limit guard the UI\n * runs (guard before execute, invalidate after) — an AI agent never clicks a\n * gated button, so the declarative contract is its only gate.\n */\n limitKey?: string\n /**\n * Where the tool runs. Server-plane is what makes browserless channels\n * (WhatsApp, MCP) able to run the tool at all:\n * - `{ plane:'server', kind:'rpc', rpc }` — the Fayz broker calls the named\n * `agent_*` RPC in the tenant pool (writes / guarded reads).\n * - `{ plane:'server', kind:'entity_read', entity }` — the broker runs the\n * generic tenant-scoped read against the entity's table (derived tools).\n * - `{ plane:'client' }` (or absent) — a locally registered executor runs it\n * in the surface (navigation, modals).\n */\n execution?: AIToolExecution\n /**\n * Require an explicit human confirmation before executing. Defaults to true\n * for `mode: 'persist'` tools — the channel renders it natively (FAB modal,\n * WhatsApp yes/no reply).\n */\n requiresConfirmation?: boolean\n suggestions?: AIToolSuggestion[]\n category?: string\n tags?: string[]\n}\n\nexport interface PluginRegistryDef {\n id: string\n entity: EntityDef\n icon?: string\n description?: string\n display?: 'table' | 'cards' | 'tree'\n seedData?: Record<string, unknown>[]\n mockData?: Record<string, unknown>[]\n readOnly?: boolean\n}\n\nexport interface PluginMigration {\n id: string\n version: string\n sql: string\n description?: string\n}\n\nexport interface PluginOnboarding {\n /** Component or a registered component id — exactly one is required. */\n component?: React.ComponentType<{ onComplete: () => void }>\n componentId?: string\n title?: string\n description?: string\n}\n\n/**\n * A health check a plugin contributes to the diagnostics / boot report surfaced by\n * `fayz doctor`. Declared as data so the platform can verify a plugin's backend\n * prerequisites are present without running it.\n */\nexport interface PluginDiagnostic {\n id: string\n description?: string\n /** What the runtime should verify exists for this plugin to work. */\n requires: {\n rpcs?: string[]\n views?: string[]\n tables?: string[]\n migrations?: string[]\n env?: string[]\n }\n /** Severity when the requirement is missing. Defaults to 'warn'. */\n level?: 'error' | 'warn' | 'info'\n}\n\nexport interface PluginManifest {\n id: string\n name: string\n icon: string\n version: string\n /** Plugin contract version. The runtime refuses plugins built for a newer\n * contract than it supports (see PLUGIN_API_VERSION). Omit = legacy/compatible. */\n apiVersion?: number\n description?: string\n scope?: PluginScope\n verticalId?: VerticalId\n /** Events this plugin emits onto the bus (declared for introspection/automation). */\n events?: PluginEventDefinition[]\n /** Which scaffold types this plugin targets. Omit for universal plugins. */\n scaffolds?: ScaffoldType[]\n tenantId?: string\n defaultEnabled?: boolean\n schema?: string\n dependencies?: string[]\n navigation: PluginNavigationEntry[]\n settings?: PluginSettingsTab[]\n routes: PluginRouteDefinition[]\n widgets?: PluginWidgetDefinition[]\n /** Dashboard widgets this plugin contributes to the dashboard registry. */\n dashboardWidgets?: DashboardWidgetDef[]\n capabilities?: PluginCapability[]\n aiTools?: PluginAITool[]\n entities?: string[]\n permissions?: string[]\n declaredFeatures?: FeatureDeclaration[]\n /**\n * Quantity limits this plugin knows how to count. Aggregated by the plugin\n * runtime into `PluginRuntime.pluginLimits` and consumed by the access engine\n * (useLimit / useLimitGuard) so a plugin \"is born compatible\" with freemium\n * caps without any per-app wiring. See {@link LimitDeclaration}.\n */\n declaredLimits?: LimitDeclaration[]\n /** Pool RPCs this plugin ships for the server-plane agent executor. */\n declaredRpcs?: AgentRpcDeclaration[]\n /**\n * Read-models this plugin exposes to the agent's generic data primitives\n * (searchRecords/queryData) BEYOND its CRUD registries — typically its\n * views/ledgers (v_appointments, plg_financial_movements). `key` is a stable\n * ASCII id (never derived from a translated label); the entity's own\n * `permission` gates each call.\n */\n queryEntities?: Array<{\n key: string\n entity: EntityDef\n /** Base tables may opt into createRecord; views/ledgers stay read-only. */\n writable?: boolean\n }>\n registries?: PluginRegistryDef[]\n /**\n * Connectors this plugin contributes. An ADDON plugin declares its connector(s)\n * here, each naming the `hostPluginId` it extends; the runtime groups them by\n * host and the host plugin's settings render them in a unified Integrations tab.\n */\n connectors?: ConnectorDefinition[]\n migrations?: PluginMigration[]\n /** Backend prerequisites the plugin needs; surfaced by `fayz doctor`. */\n diagnostics?: PluginDiagnostic[]\n onboarding?: PluginOnboarding\n locales?: Record<string, Record<string, string>>\n}\n\nexport interface TenantPluginBinding {\n pluginId: string\n status: PluginStatus\n tenantId?: string\n config?: Record<string, unknown>\n}\n\nexport interface PluginRuntimeIssue {\n type:\n | 'duplicate_plugin'\n | 'missing_dependency'\n | 'circular_dependency'\n | 'vertical_mismatch'\n | 'incompatible_api_version'\n pluginId: string\n dependencyId?: string\n message: string\n}\n\nexport interface ResolvedPluginManifest extends PluginManifest {\n status: PluginStatus\n isActive: boolean\n activationReason: 'default' | 'tenant' | 'dependency' | 'inactive'\n config: Record<string, unknown>\n missingDependencies: string[]\n settingsTabs: PluginSettingsTab[]\n widgets: PluginWidgetDefinition[]\n resolvedRegistries: PluginRegistryDef[]\n resolvedAITools: PluginAITool[]\n}\n\nexport interface ResolvedPluginWidget<TConfig extends Record<string, unknown> = Record<string, unknown>>\n extends PluginWidgetDefinition<TConfig> {\n order: number\n config: TConfig\n plugin: ResolvedPluginManifest\n}\n\nexport interface PluginRuntimeRoute extends PluginRouteDefinition {\n plugin: ResolvedPluginManifest\n}\n\nexport interface PluginRuntime {\n context: PluginRuntimeContext\n plugins: ResolvedPluginManifest[]\n activePlugins: ResolvedPluginManifest[]\n routes: PluginRuntimeRoute[]\n navigation: PluginNavigationEntry[]\n settingsTabs: PluginSettingsTab[]\n widgets: ResolvedPluginWidget[]\n dashboardWidgets: ResolvedDashboardWidget[]\n capabilities: PluginCapability[]\n aiTools: PluginAITool[]\n issues: PluginRuntimeIssue[]\n registries: Map<string, PluginRegistryDef[]>\n /** Connectors contributed by active plugins, grouped by the host plugin they extend. */\n connectorsByHost: Map<string, ConnectorDefinition[]>\n pluginFeatures: FeatureDeclaration[]\n /** Limit declarations aggregated from every active plugin's `declaredLimits`. */\n pluginLimits: LimitDeclaration[]\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { getSupabaseClientOptional } from '../data/supabase'\n\n/**\n * createSafeDataProvider — the standard lazy provider resolver every plugin\n * repeated by hand. Returns a Proxy that, on first method call, resolves to the\n * Supabase-backed provider when a Supabase client is configured, otherwise the\n * mock provider. Resolution is deferred so importing a plugin never forces a\n * Supabase connection, and memoized so it only happens once.\n *\n * const provider = options?.dataProvider ?? createSafeDataProvider(\n * () => createSupabaseCrmProvider(providerOptions),\n * () => createMockCrmProvider(),\n * )\n */\nexport function createSafeDataProvider<T extends object>(\n makeSupabase: () => T,\n makeMock: () => T,\n): T {\n let resolved: T | null = null\n const get = (): T => {\n if (!resolved) {\n resolved = getSupabaseClientOptional() ? makeSupabase() : makeMock()\n }\n return resolved\n }\n return new Proxy({} as T, {\n get: (_target, prop) => (...args: any[]) => (get() as any)[prop](...args),\n })\n}\n","// ---------------------------------------------------------------------------\n// Reusable phone / country helpers (SDK-level — shared by any plugin that\n// collects a phone number: booking, CRM, forms, auth…). Provides the country\n// list (flag + dial code + national mask) and mask/unmask utilities.\n// ---------------------------------------------------------------------------\n\nexport interface CountryDef {\n /** ISO 3166-1 alpha-2 code, e.g. 'BR'. */\n iso2: string\n /** Localized-ish display name. */\n name: string\n /** International dial code including '+', e.g. '+55'. */\n dial: string\n /** Flag emoji (derived from iso2). */\n flag: string\n /** National number mask; '#' = one digit. e.g. '(##) #####-####'. */\n mask: string\n}\n\n/** Derive a flag emoji from an ISO2 code via regional indicator symbols. */\nfunction flagOf(iso2: string): string {\n return iso2\n .toUpperCase()\n .replace(/[^A-Z]/g, '')\n .split('')\n .map((c) => String.fromCodePoint(0x1f1e6 + c.charCodeAt(0) - 65))\n .join('')\n}\n\nconst RAW: Omit<CountryDef, 'flag'>[] = [\n { iso2: 'BR', name: 'Brasil', dial: '+55', mask: '(##) #####-####' },\n { iso2: 'US', name: 'Estados Unidos', dial: '+1', mask: '(###) ###-####' },\n { iso2: 'PT', name: 'Portugal', dial: '+351', mask: '### ### ###' },\n { iso2: 'AR', name: 'Argentina', dial: '+54', mask: '(##) ####-####' },\n { iso2: 'ES', name: 'Espanha', dial: '+34', mask: '### ### ###' },\n { iso2: 'MX', name: 'México', dial: '+52', mask: '## #### ####' },\n { iso2: 'GB', name: 'Reino Unido', dial: '+44', mask: '##### ######' },\n { iso2: 'FR', name: 'França', dial: '+33', mask: '# ## ## ## ##' },\n { iso2: 'DE', name: 'Alemanha', dial: '+49', mask: '#### #######' },\n { iso2: 'IT', name: 'Itália', dial: '+39', mask: '### #######' },\n]\n\nexport const COUNTRIES: CountryDef[] = RAW.map((c) => ({ ...c, flag: flagOf(c.iso2) }))\n\nexport const DEFAULT_COUNTRY = 'BR'\n\nconst BY_ISO = new Map(COUNTRIES.map((c) => [c.iso2, c]))\n\n/** Look up a country by ISO2 (falls back to the default). */\nexport function getCountry(iso2: string | undefined): CountryDef {\n return (iso2 && BY_ISO.get(iso2.toUpperCase())) || BY_ISO.get(DEFAULT_COUNTRY)!\n}\n\n/** Keep only digit characters. */\nexport function unmaskPhone(value: string): string {\n return (value || '').replace(/\\D/g, '')\n}\n\n/**\n * Apply a '#'-placeholder mask to a raw string, consuming its digits. Extra\n * digits beyond the mask are dropped; partial input masks progressively.\n *\n * maskPhone('11987654321', '(##) #####-####') -> '(11) 98765-4321'\n */\nexport function maskPhone(value: string, mask: string): string {\n const digits = unmaskPhone(value)\n let out = ''\n let di = 0\n for (const ch of mask) {\n if (di >= digits.length) break\n if (ch === '#') {\n out += digits[di++]\n } else {\n out += ch\n }\n }\n return out\n}\n\n/** Count how many digits a mask expects. */\nexport function maskDigitCount(mask: string): number {\n let n = 0\n for (const ch of mask) if (ch === '#') n++\n return n\n}\n","// ---------------------------------------------------------------------------\n// Postal code → address lookup (SDK-level — shared by any surface that collects\n// an address: storefront checkout, the SaaS address book, CRM, booking).\n//\n// Sits beside ./phone for the same reason: knowing that a Brazilian CEP is\n// eight digits, and that '01310100' means Avenida Paulista, is not a\n// storefront concern. It belongs wherever an address is typed.\n//\n// The lookup itself is behind an interface. ViaCEP is the default because it is\n// free, keyless and CORS-enabled, but it is a third party the merchant does not\n// control — so swapping it for an edge-function proxy (shared cache, no\n// third-party call from the shopper's browser) must be one line, not a rewrite.\n// ---------------------------------------------------------------------------\n\n/**\n * An address as a postal service knows it: everything except the parts only the\n * resident can supply (number, complement).\n *\n * Field names mirror ShippingAddressInput in @fayz-ai/shop so the value crosses\n * from lookup to checkout to the order with no translation step in between.\n */\nexport interface PostalAddress {\n postalCode: string\n street: string\n district: string\n city: string\n state: string\n country: string\n /** IBGE municipality code when the source provides one — useful for tax later. */\n cityCode?: string\n}\n\n/** Where a postal code is resolved. Implementations must not throw for a\n * well-formed code that simply does not exist — that is `null`, not an error. */\nexport interface PostalLookupProvider {\n lookup(postalCode: string): Promise<PostalAddress | null>\n}\n\n/** Keep only digits. */\nexport function normalizePostalCode(value: string): string {\n return (value || '').replace(/\\D/g, '')\n}\n\n/** '01310100' | '01310-100' -> '01310-100'. Partial input formats progressively. */\nexport function formatPostalCode(value: string): string {\n const digits = normalizePostalCode(value).slice(0, 8)\n return digits.length > 5 ? `${digits.slice(0, 5)}-${digits.slice(5)}` : digits\n}\n\n/** A Brazilian CEP is exactly eight digits. */\nexport function isValidPostalCode(value: string): boolean {\n return normalizePostalCode(value).length === 8\n}\n\n// ---------------------------------------------------------------------------\n// Cache\n//\n// A CEP maps to the same street for years, so the second lookup of one should\n// never leave the browser. This also keeps a busy storefront well clear of\n// ViaCEP's per-IP rate limit. localStorage when there is a window, an in-memory\n// Map otherwise (SSR, tests, node) — never a hard failure over a cache miss.\n// ---------------------------------------------------------------------------\n\nconst CACHE_KEY = 'fayz.postal.cache.v1'\nconst memoryCache = new Map<string, PostalAddress>()\n\nfunction readCache(code: string): PostalAddress | undefined {\n const hit = memoryCache.get(code)\n if (hit) return hit\n try {\n const raw = globalThis.localStorage?.getItem(CACHE_KEY)\n if (!raw) return undefined\n const all = JSON.parse(raw) as Record<string, PostalAddress>\n const stored = all[code]\n if (stored) memoryCache.set(code, stored)\n return stored\n } catch {\n return undefined\n }\n}\n\nfunction writeCache(code: string, address: PostalAddress): void {\n memoryCache.set(code, address)\n try {\n const store = globalThis.localStorage\n if (!store) return\n const raw = store.getItem(CACHE_KEY)\n const all = raw ? (JSON.parse(raw) as Record<string, PostalAddress>) : {}\n all[code] = address\n store.setItem(CACHE_KEY, JSON.stringify(all))\n } catch {\n /* quota or private mode — the in-memory copy still stands for this session */\n }\n}\n\n/** Drop the cache. Exposed for tests and for a \"wrong address?\" escape hatch. */\nexport function clearPostalCache(): void {\n memoryCache.clear()\n try {\n globalThis.localStorage?.removeItem(CACHE_KEY)\n } catch {\n /* ignore */\n }\n}\n\n// ---------------------------------------------------------------------------\n// ViaCEP\n// ---------------------------------------------------------------------------\n\ninterface ViaCepResponse {\n cep?: string\n logradouro?: string\n bairro?: string\n localidade?: string\n uf?: string\n ibge?: string\n erro?: boolean | string\n}\n\n/**\n * ViaCEP (https://viacep.com.br). Free, no key, CORS-enabled.\n *\n * The trap: an unknown CEP does NOT come back as 404. ViaCEP answers HTTP 200\n * with `{\"erro\": true}` (and, on some deploys, the string \"true\"), so checking\n * response.ok alone yields an address of empty strings that silently overwrites\n * whatever the shopper had typed. Both shapes are treated as \"not found\".\n */\nexport function createViaCepProvider(options?: { fetcher?: typeof fetch }): PostalLookupProvider {\n const fetcher = options?.fetcher ?? globalThis.fetch\n return {\n async lookup(postalCode: string): Promise<PostalAddress | null> {\n const code = normalizePostalCode(postalCode)\n if (code.length !== 8) return null\n\n const response = await fetcher(`https://viacep.com.br/ws/${code}/json/`)\n if (!response.ok) throw new Error(`Consulta de CEP falhou (${response.status})`)\n\n const data = (await response.json()) as ViaCepResponse\n if (data.erro === true || data.erro === 'true' || !data.localidade) return null\n\n return {\n postalCode: code,\n street: data.logradouro ?? '',\n district: data.bairro ?? '',\n city: data.localidade,\n state: (data.uf ?? '').toUpperCase(),\n country: 'BR',\n cityCode: data.ibge || undefined,\n }\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-level resolver — same shape as setShopTenantResolver /\n// setShopAccessTokenResolver, so an app overrides the source once at boot\n// instead of threading a provider through every component that needs a CEP.\n// ---------------------------------------------------------------------------\n\nlet _provider: PostalLookupProvider | null = null\n\nexport function setPostalLookupProvider(provider: PostalLookupProvider | null): void {\n _provider = provider\n}\n\nexport function getPostalLookupProvider(): PostalLookupProvider {\n if (!_provider) _provider = createViaCepProvider()\n return _provider\n}\n\n/**\n * Resolve a postal code to an address, through the cache.\n *\n * Returns null for a code that is malformed or does not exist; throws only when\n * the lookup itself failed (offline, provider down), so a caller can tell\n * \"no such CEP\" from \"we could not check right now\" and say the right thing.\n */\nexport async function lookupPostalCode(postalCode: string): Promise<PostalAddress | null> {\n const code = normalizePostalCode(postalCode)\n if (code.length !== 8) return null\n\n const cached = readCache(code)\n if (cached) return cached\n\n const address = await getPostalLookupProvider().lookup(code)\n if (address) writeCache(code, address)\n return address\n}\n","import { useEffect } from 'react'\n\n// ---------------------------------------------------------------------------\n// Generic, domain-agnostic SEO / structured-data head manager (SDK-level).\n// ANY surface (blog, booking, reviews, product, landing) uses `useSeo` to set\n// <title>, meta description, canonical, OpenGraph/Twitter cards and JSON-LD per\n// route. Domain plugins build their own schema.org objects (BlogPosting,\n// Product, Event…) and pass them via `jsonLd` — the mechanics live here once.\n//\n// NOTE: a SPA still benefits from SSR/prerendering for the strongest SEO — that\n// is the real upgrade; this covers everything achievable client-side.\n// ---------------------------------------------------------------------------\n\nconst MANAGED = 'data-fayz-seo'\n\nexport interface SeoConfig {\n title: string\n description?: string\n canonical?: string\n image?: string\n type?: 'website' | 'article' | (string & {})\n siteName?: string\n /** One or more JSON-LD objects injected as <script type=\"application/ld+json\">. */\n jsonLd?: Array<Record<string, unknown>>\n}\n\n/** Current page origin (empty during SSR). */\nexport function seoOrigin(): string {\n return typeof window !== 'undefined' ? window.location.origin : ''\n}\n\n/** Build an absolute URL from a path, using the current origin. */\nexport function absoluteUrl(path: string): string {\n return `${seoOrigin()}${path.startsWith('/') ? path : `/${path}`}`\n}\n\nfunction upsertMeta(attr: 'name' | 'property', key: string, content: string) {\n if (!content) return\n let el = document.head.querySelector<HTMLMetaElement>(`meta[${attr}=\"${key}\"]`)\n if (!el) {\n el = document.createElement('meta')\n el.setAttribute(attr, key)\n el.setAttribute(MANAGED, '')\n document.head.appendChild(el)\n }\n el.setAttribute('content', content)\n}\n\nfunction upsertLink(rel: string, href: string) {\n if (!href) return\n let el = document.head.querySelector<HTMLLinkElement>(`link[rel=\"${rel}\"]`)\n if (!el) {\n el = document.createElement('link')\n el.setAttribute('rel', rel)\n el.setAttribute(MANAGED, '')\n document.head.appendChild(el)\n }\n el.setAttribute('href', href)\n}\n\nfunction clearManaged() {\n document.head.querySelectorAll(`[${MANAGED}]`).forEach((el) => el.remove())\n}\n\n/** Imperatively apply SEO tags (used by useSeo; exported for non-React callers). */\nexport function applySeo(config: SeoConfig): void {\n if (typeof document === 'undefined') return\n clearManaged()\n document.title = config.title\n upsertMeta('name', 'description', config.description ?? '')\n if (config.canonical) upsertLink('canonical', config.canonical)\n\n upsertMeta('property', 'og:title', config.title)\n upsertMeta('property', 'og:description', config.description ?? '')\n upsertMeta('property', 'og:type', config.type === 'article' ? 'article' : 'website')\n if (config.canonical) upsertMeta('property', 'og:url', config.canonical)\n if (config.image) upsertMeta('property', 'og:image', config.image)\n if (config.siteName) upsertMeta('property', 'og:site_name', config.siteName)\n\n upsertMeta('name', 'twitter:card', config.image ? 'summary_large_image' : 'summary')\n upsertMeta('name', 'twitter:title', config.title)\n upsertMeta('name', 'twitter:description', config.description ?? '')\n if (config.image) upsertMeta('name', 'twitter:image', config.image)\n\n for (const obj of config.jsonLd ?? []) {\n const script = document.createElement('script')\n script.type = 'application/ld+json'\n script.setAttribute(MANAGED, '')\n script.text = JSON.stringify(obj)\n document.head.appendChild(script)\n }\n}\n\n/** Apply SEO head tags for the current route; cleans up on unmount. */\nexport function useSeo(config: SeoConfig): void {\n const key = JSON.stringify(config)\n useEffect(() => {\n applySeo(config)\n return () => clearManaged()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key])\n}\n\n// --- Generic schema.org builders (reusable across plugins) -----------------\n\nexport interface BreadcrumbItem {\n name: string\n url: string\n}\n\n/** schema.org BreadcrumbList from an ordered list of crumbs. */\nexport function breadcrumbJsonLd(items: BreadcrumbItem[]): Record<string, unknown> {\n return {\n '@context': 'https://schema.org',\n '@type': 'BreadcrumbList',\n itemListElement: items.map((c, i) => ({\n '@type': 'ListItem',\n position: i + 1,\n name: c.name,\n item: c.url,\n })),\n }\n}\n\n/** schema.org Organization publisher block. */\nexport function organizationJsonLd(name: string, extra?: Record<string, unknown>): Record<string, unknown> {\n return { '@type': 'Organization', name, ...extra }\n}\n","import { getCurrentLocale } from '../i18n'\n\n// Currency inferred from the active locale unless the app sets one explicitly\n// via createSaasApp({ locale: { currency: 'BRL' } }).\nconst CURRENCY_BY_LOCALE: Record<string, string> = {\n 'pt-BR': 'BRL',\n 'pt-PT': 'EUR',\n en: 'USD',\n 'en-US': 'USD',\n 'en-GB': 'GBP',\n es: 'EUR',\n}\n\nlet _defaultCurrency: string | null = null\n\nexport function setDefaultCurrency(code: string | undefined): void {\n _defaultCurrency = code ?? null\n}\n\nexport function getActiveLocale(): string {\n try {\n return getCurrentLocale() || 'en'\n } catch {\n return 'en'\n }\n}\n\nexport function getDefaultCurrency(): string {\n if (_defaultCurrency) return _defaultCurrency\n return CURRENCY_BY_LOCALE[getActiveLocale()] ?? 'USD'\n}\n\nexport function formatCurrency(value: unknown, currency?: string): string {\n const num = typeof value === 'number' ? value : parseFloat(String(value))\n if (isNaN(num)) return String(value ?? '')\n return new Intl.NumberFormat(getActiveLocale(), {\n style: 'currency',\n currency: currency ?? getDefaultCurrency(),\n }).format(num)\n}\n\nexport function formatDate(value: unknown): string {\n if (!value) return ''\n try {\n return new Intl.DateTimeFormat(getActiveLocale(), { dateStyle: 'medium' }).format(new Date(value as string))\n } catch {\n return String(value)\n }\n}\n\nexport function formatDateTime(value: unknown): string {\n if (!value) return ''\n try {\n return new Intl.DateTimeFormat(getActiveLocale(), { dateStyle: 'medium', timeStyle: 'short' }).format(new Date(value as string))\n } catch {\n return String(value)\n }\n}\n","/** Column descriptor for generic CSV export */\nexport interface CSVColumn {\n key: string\n label: string\n format?: (value: any, row: Record<string, any>) => string\n}\n\nexport function escapeCSVField(value: unknown): string {\n if (value == null) return ''\n const str = String(value)\n if (str.includes(',') || str.includes('\"') || str.includes('\\n')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`\n }\n return str\n}\n\n/** Build a CSV string from columns + rows. Each cell runs through `column.format` if provided, then escaping. */\nexport function buildCSV(\n columns: CSVColumn[],\n rows: Record<string, any>[],\n): string {\n const header = columns.map((c) => escapeCSVField(c.label)).join(',')\n const body = rows.map((row) =>\n columns\n .map((col) => {\n const raw = row[col.key]\n const formatted = col.format ? col.format(raw, row) : raw\n return escapeCSVField(formatted)\n })\n .join(','),\n )\n return [header, ...body].join('\\n')\n}\n\n/** Trigger a CSV file download in the browser. */\nexport function downloadCSV(csv: string, filename: string): void {\n const bom = '\\uFEFF'\n const blob = new Blob([bom + csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename.endsWith('.csv') ? filename : `${filename}.csv`\n a.click()\n URL.revokeObjectURL(url)\n}\n\n/** Convenience: build + download in one call. */\nexport function exportCSV(\n columns: CSVColumn[],\n rows: Record<string, any>[],\n filename: string,\n): void {\n downloadCSV(buildCSV(columns, rows), filename)\n}\n","import * as React from 'react'\n\n// ---------------------------------------------------------------------------\n// Event bus — the substrate for cross-plugin behavior. Replaces the bespoke\n// `window.dispatchEvent('agenda:open-booking')` hack and the imperative\n// financial bridge: plugins emit named events, others subscribe, and the\n// AppManifest can declare event→action bindings as data. Plugins describe the\n// events they emit via PluginManifest.events (see types/plugins) so the\n// platform can introspect and wire automations.\n// ---------------------------------------------------------------------------\n\nexport type EventHandler<T = unknown> = (payload: T) => void\n\nexport interface EventBus {\n emit<T = unknown>(event: string, payload?: T): void\n on<T = unknown>(event: string, handler: EventHandler<T>): () => void\n once<T = unknown>(event: string, handler: EventHandler<T>): () => void\n off<T = unknown>(event: string, handler: EventHandler<T>): void\n clear(event?: string): void\n}\n\nexport function createEventBus(): EventBus {\n const handlers = new Map<string, Set<EventHandler>>()\n const bus: EventBus = {\n emit(event, payload) {\n const set = handlers.get(event)\n if (!set) return\n // Snapshot so handlers can subscribe/unsubscribe during dispatch.\n for (const handler of Array.from(set)) {\n try {\n handler(payload)\n } catch (err) {\n // A misbehaving subscriber must not break the emitter or its peers.\n console.error(`[fayz] event handler for \"${event}\" threw:`, err)\n }\n }\n },\n on(event, handler) {\n let set = handlers.get(event)\n if (!set) {\n set = new Set()\n handlers.set(event, set)\n }\n set.add(handler as EventHandler)\n return () => bus.off(event, handler)\n },\n once(event, handler) {\n const wrapped: EventHandler = (payload) => {\n bus.off(event, wrapped)\n ;(handler as EventHandler)(payload)\n }\n return bus.on(event, wrapped)\n },\n off(event, handler) {\n handlers.get(event)?.delete(handler as EventHandler)\n },\n clear(event) {\n if (event) handlers.delete(event)\n else handlers.clear()\n },\n }\n return bus\n}\n\n/** The app-wide default bus. One per app runtime (repo-per-app). */\nexport const eventBus: EventBus = createEventBus()\n\n/** Subscribe to an event for the lifetime of the component. The latest handler\n * is always invoked, so closures over fresh props/state work without resubscribing. */\nexport function useOnEvent<T = unknown>(\n event: string,\n handler: EventHandler<T>,\n deps: React.DependencyList = [],\n): void {\n const ref = React.useRef(handler)\n ref.current = handler\n React.useEffect(\n () => eventBus.on<T>(event, (payload) => ref.current(payload)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [event, ...deps],\n )\n}\n","import * as React from 'react'\nimport { getBlock } from '../registry'\n\n// ---------------------------------------------------------------------------\n// Block tree — the universal page primitive. A page (admin or storefront) is an\n// ordered tree of typed blocks. Block `type`s are resolved against the block\n// registry, so a page is pure data: `{ type, props, children }`. This\n// generalizes the storefront's HomeSection switch to every surface.\n// ---------------------------------------------------------------------------\n\nexport interface BlockNode {\n /** Registered block id, e.g. 'hero', 'products', 'kpi-grid', 'custom:foo'. */\n type: string\n /** Stable id for keys / editing; optional. */\n id?: string\n props?: Record<string, unknown>\n children?: BlockNode[]\n}\n\n/** A block component receives its declared props plus the raw node (so a block\n * can render its own children via <BlockChildren>). */\nexport type BlockComponentProps = Record<string, unknown> & {\n node?: BlockNode\n children?: React.ReactNode\n}\n\n// Rendered in place of an unresolved block type. Unknown blocks are caught\n// ahead of production by `fayz doctor` / the conformance kit, so this visible\n// marker is a development aid rather than a production concern.\nfunction UnknownBlock({ type }: { type: string }): React.ReactElement | null {\n return React.createElement(\n 'div',\n {\n style: {\n border: '1px dashed #c026d3',\n color: '#a21caf',\n padding: '8px 12px',\n font: '12px ui-monospace, monospace',\n borderRadius: 6,\n },\n },\n `Unknown block: \"${type}\"`,\n )\n}\n\nexport function BlockRenderer({ node }: { node: BlockNode }): React.ReactElement | null {\n const Comp = getBlock(node.type)\n const childEls = node.children?.length\n ? node.children.map((child, i) =>\n React.createElement(BlockRenderer, { key: child.id ?? `${child.type}-${i}`, node: child }),\n )\n : null\n if (!Comp) return React.createElement(UnknownBlock, { type: node.type })\n return React.createElement(Comp, { ...(node.props ?? {}), node }, childEls)\n}\n\n/** Render an ordered list of blocks (a page body). */\nexport function renderBlocks(nodes: BlockNode[]): React.ReactNode {\n return nodes.map((node, i) =>\n React.createElement(BlockRenderer, { key: node.id ?? `${node.type}-${i}`, node }),\n )\n}\n\n/** Convenience for block components that render their own children. */\nexport function BlockChildren({ node }: { node?: BlockNode }): React.ReactNode {\n if (!node?.children?.length) return null\n return renderBlocks(node.children)\n}\n","import type { EntityDef } from '../types/crud'\nimport type { LocaleConfig } from '../types/i18n'\nimport type { PermissionsConfig, FeatureDeclaration } from '../types/permissions'\nimport type { BillingConfig } from '../types/billing'\nimport type { LimitDeclaration } from '../types/entitlements'\nimport type { AIToolParameters, AIToolExecution, AgentRpcDeclaration } from '../types/plugins'\nimport type { BlockNode } from '../blocks'\n\n// ---------------------------------------------------------------------------\n// AppManifest — THE app, as data.\n//\n// This is the canonical artifact every generated repo commits as\n// `app.manifest.json` and that `fayz upgrade` migrates across the fleet. It is\n// strictly JSON-serializable: no functions, no components — only ids resolved\n// against the registries (see ../registry). `createSaasApp`/`createStorefrontApp`\n// become thin sugar that builds a manifest of this shape.\n//\n// Versioning: bump CURRENT_MANIFEST_VERSION and register a migration whenever\n// the shape changes. The single biggest fleet-maintenance lever — getting it\n// right is why W1 is the \"point of no return\".\n// ---------------------------------------------------------------------------\n\nexport const CURRENT_MANIFEST_VERSION = 3\n\nexport type BackendProvider = 'supabase' | 'fayz-api' | 'fayz-shop' | 'mock' | 'custom'\n\nexport interface BackendRef {\n provider: BackendProvider\n /** Provider project ref / URL. Secrets stay in env/platform storage. */\n projectRef?: string\n url?: string\n /** Registered adapter id when provider is 'custom'. */\n adapterId?: string\n /** Public, JSON-safe provider options. Never store secrets here. */\n options?: Record<string, unknown>\n}\n\n/** How a manifest page produces its body — exactly one of blocks/entity/component. */\nexport interface PageManifest {\n path: string\n label?: string\n icon?: string\n section?: 'main' | 'secondary' | 'settings'\n /** A block tree (pure data). */\n blocks?: BlockNode[]\n /** An entity key → rendered as a CRUD page by the scaffold. */\n entity?: string\n /** A registered page-component id, e.g. 'custom:HarvestBoard'. */\n component?: string\n /** Optional permission gate: feature + action. */\n permission?: { feature: string; action: string }\n}\n\nexport interface PluginRef {\n /** Plugin id, resolved to an installed @fayz-ai/plugin-* at build time. */\n id: string\n /** Pure-data config passed to the plugin (labels, kinds, module flags…). */\n config?: Record<string, unknown>\n enabled?: boolean\n}\n\nexport interface SurfaceManifest {\n /** Registered scaffold id: 'admin' | 'storefront' | 'portal' | custom. */\n scaffold: string\n plugins?: PluginRef[]\n pages?: PageManifest[]\n /** Surface-specific declarative options (announcement, footer, nav, shipping,\n * catalog seed, onboarding, …) — kept open so scaffolds evolve without a\n * manifest-version bump for additive fields. */\n options?: Record<string, unknown>\n}\n\n// ---------------------------------------------------------------------------\n// Agent Contract (manifest v3) — everything a SERVER-SIDE agent runtime needs\n// to operate the app without a browser: the full entity surface, the tool\n// catalog with its authorization requirements, the pool RPCs writes go\n// through, and the structured domain knowledge the app wants in the prompt.\n// Derived from app code at publish (never hand-written) and synced to the\n// Fayz platform, where it becomes the versioned AgentContract the broker\n// validates every turn against.\n// ---------------------------------------------------------------------------\n\n/** JSON-safe projection of an EntityDef — schema only, no components/closures.\n * `data` mirrors EntityDef.data: everything the server-plane read executor\n * needs (tenant scoping, search/select column allowlists, fixed filters). */\nexport interface EntityContract {\n key: string\n label: string\n labelPlural?: string\n /** Plan-limit key rows of this entity consume (EntityDef.limitKey). */\n limitKey?: string\n /** Permission to READ via the generic data primitives (EntityDef.permission). */\n permission?: { feature: string; action: string }\n data: {\n table: string\n schema?: string\n tenantScoped?: boolean\n tenantIdColumn?: string\n searchColumns?: string[]\n selectColumns?: string\n columnMap?: Record<string, string>\n archetype?: string\n archetypeKind?: string\n filters?: Record<string, string>\n }\n fields: Array<{\n key: string\n label: string\n type: string\n required?: boolean\n searchable?: boolean\n /** FieldDef.hint — the field's helper text. Carried into the contract\n * because it is what tells the agent what a non-obvious column expects:\n * an id to look up, a default it should not restate, a format. */\n hint?: string\n /** Allowed values for select-like fields. */\n options?: string[]\n /** Table the relation field points at (FieldRelation.table). */\n relationTable?: string\n }>\n}\n\n/** JSON-safe projection of a PluginAITool + its owning plugin. */\nexport interface AIToolContract {\n id: string\n name: string\n description: string\n mode: 'read' | 'persist'\n parameters?: AIToolParameters\n permission?: { feature: string; action: string }\n limitKey?: string\n execution?: AIToolExecution\n requiresConfirmation?: boolean\n pluginId?: string\n category?: string\n}\n\n/** A tenant-scoped pool RPC the server-plane executor may call. Canonical\n * definition lives with the plugin types (plugins declare these). */\nexport type { AgentRpcDeclaration as RpcContract } from '../types/plugins'\n\n/** Structured domain knowledge rendered into the agent's prompt as labelled\n * sections — statuses with transitions, scheduling defaults, free-form rules. */\nexport interface AgentDomainKnowledge {\n statuses?: Record<string, Array<{ id: string; label: string; availableWhen?: unknown }>>\n scheduleDefaults?: Record<string, unknown>\n businessRules?: Array<{ id: string; description: string }>\n}\n\nexport interface AgentContract {\n persona?: { name?: string; systemPrompt?: string; icon?: string }\n /** When 'server', surfaces stop shipping data-tool executors: the broker\n * executes reads/writes server-plane and the surface only handles\n * client-plane tools. Flipped per app — no lockstep release. */\n executionPlane?: 'client' | 'server'\n entities?: EntityContract[]\n tools?: AIToolContract[]\n registries?: Array<{ pluginId: string; id: string; entityKey?: string; readOnly?: boolean }>\n declaredFeatures?: FeatureDeclaration[]\n rpcs?: AgentRpcDeclaration[]\n domainKnowledge?: AgentDomainKnowledge\n}\n\nexport interface AppManifest {\n manifestVersion: number\n id: string\n name: string\n backend?: BackendRef\n locale?: LocaleConfig\n /** Theme tokens — SaasTheme or StorefrontTheme depending on surface; kept\n * loose at the core layer to avoid coupling core to surface packages. */\n theme?: Record<string, unknown>\n /** Keyed by surface name ('admin', 'storefront', …). At least one required. */\n surfaces: Record<string, SurfaceManifest>\n /** App-defined entity extensions (vertical-specific tables/fields). */\n entities?: EntityDef[]\n permissions?: PermissionsConfig\n billing?: BillingConfig\n /** The RESOLVED limit declarations (4-layer merge: core < entity-derived <\n * plugin < app), so a server runtime counts exactly what the client counts. */\n limitDeclarations?: LimitDeclaration[]\n /** v3: the agent contract — see the section comment above. */\n agent?: AgentContract\n /** sha256 of the canonical serialization (excluding this field). */\n contractHash?: string\n}\n\n// ---------------------------------------------------------------------------\n// Migration runner — applies sequential migrations from a manifest's version\n// up to CURRENT. Each migration is keyed by the version it upgrades FROM.\n// ---------------------------------------------------------------------------\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyManifest = Record<string, any>\nexport type ManifestMigration = (m: AnyManifest) => AnyManifest\n\nconst migrations = new Map<number, ManifestMigration>()\nconst supportedBackendProviders: BackendProvider[] = ['supabase', 'fayz-api', 'fayz-shop', 'mock', 'custom']\nconst supportedPageSections = new Set(['main', 'secondary', 'settings'])\nconst allowedManifestKeys = new Set([\n 'manifestVersion',\n 'id',\n 'name',\n 'backend',\n 'locale',\n 'theme',\n 'permissions',\n 'billing',\n 'entities',\n 'surfaces',\n 'limitDeclarations',\n 'agent',\n 'contractHash',\n])\nconst allowedBackendKeys = new Set(['provider', 'projectRef', 'url', 'adapterId', 'options'])\nconst allowedSurfaceKeys = new Set(['scaffold', 'options', 'plugins', 'pages'])\nconst allowedPluginRefKeys = new Set(['id', 'config', 'enabled'])\nconst allowedPageKeys = new Set(['path', 'label', 'icon', 'section', 'blocks', 'entity', 'component', 'permission'])\nconst allowedPermissionKeys = new Set(['feature', 'action'])\nconst allowedBlockKeys = new Set(['type', 'id', 'props', 'children'])\nconst manifestIdPattern = /^[a-z0-9][a-z0-9-]*$/\n\n/** Register a migration that upgrades a manifest FROM `fromVersion` to fromVersion+1. */\nexport function registerManifestMigration(fromVersion: number, fn: ManifestMigration): void {\n migrations.set(fromVersion, fn)\n}\n\n// v2 → v3 is purely additive (limitDeclarations/agent/contractHash are optional):\n// a v2 manifest is a valid v3 manifest with those sections absent. Registered\n// here so every consumer migrates for free; `fayz manifest emit` fills the new\n// sections on the next regeneration.\nregisterManifestMigration(2, (m) => m)\n\n/** Bring any manifest up to CURRENT_MANIFEST_VERSION, or throw if it was built\n * for a newer SDK than this runtime understands. */\nexport function migrateManifest(input: AnyManifest): AppManifest {\n let m = { ...input }\n let version = typeof m.manifestVersion === 'number' ? m.manifestVersion : 1\n if (version > CURRENT_MANIFEST_VERSION) {\n throw new Error(\n `Manifest version ${version} is newer than this SDK supports (${CURRENT_MANIFEST_VERSION}). Upgrade @fayz-ai/core.`,\n )\n }\n while (version < CURRENT_MANIFEST_VERSION) {\n const migrate = migrations.get(version)\n if (!migrate) {\n throw new Error(`No manifest migration registered from version ${version}.`)\n }\n m = migrate(m)\n version += 1\n m.manifestVersion = version\n }\n return m as AppManifest\n}\n\n/** Validate the structural invariants the JSON Schema can't fully express.\n * Returns a list of human-readable problems (empty = valid). */\nexport function validateManifest(m: AppManifest): string[] {\n const problems: string[] = []\n const manifest = m as unknown as Record<string, unknown>\n\n addUnsupportedKeys(manifest, allowedManifestKeys, 'manifest', problems)\n\n if (!Number.isInteger(manifest.manifestVersion)) {\n problems.push('manifest.manifestVersion must be an integer')\n } else if (manifest.manifestVersion !== CURRENT_MANIFEST_VERSION) {\n problems.push(`manifest.manifestVersion must be ${CURRENT_MANIFEST_VERSION}`)\n }\n if (typeof manifest.id !== 'string' || !manifest.id.trim()) problems.push('manifest.id is required')\n else if (!manifestIdPattern.test(manifest.id.trim())) {\n problems.push('manifest.id must match /^[a-z0-9][a-z0-9-]*$/')\n }\n if (typeof manifest.name !== 'string' || !manifest.name.trim()) problems.push('manifest.name is required')\n\n validateLooseObject(manifest.locale, 'manifest.locale', problems)\n validateLooseObject(manifest.theme, 'manifest.theme', problems)\n validateLooseObject(manifest.permissions, 'manifest.permissions', problems)\n validateLooseObject(manifest.billing, 'manifest.billing', problems)\n validateLooseObject(manifest.agent, 'manifest.agent', problems)\n if (manifest.contractHash !== undefined && !isNonEmptyString(manifest.contractHash)) {\n problems.push('manifest.contractHash must be a non-empty string')\n }\n if (manifest.limitDeclarations !== undefined) {\n if (!Array.isArray(manifest.limitDeclarations)) {\n problems.push('manifest.limitDeclarations must be an array')\n } else {\n manifest.limitDeclarations.forEach((decl, index) => {\n if (!isRecord(decl) || !isNonEmptyString(decl.key) || !isNonEmptyString(decl.table)) {\n problems.push(`manifest.limitDeclarations[${index}] must declare key and table`)\n }\n })\n }\n }\n if (manifest.entities !== undefined) {\n if (!Array.isArray(manifest.entities)) {\n problems.push('manifest.entities must be an array')\n } else {\n manifest.entities.forEach((entity, index) => {\n if (!isRecord(entity)) problems.push(`manifest.entities[${index}] must be an object`)\n })\n }\n }\n\n if (manifest.backend !== undefined) {\n if (!isRecord(manifest.backend)) {\n problems.push('manifest.backend must be an object')\n } else {\n addUnsupportedKeys(manifest.backend, allowedBackendKeys, 'manifest.backend', problems)\n const provider = manifest.backend.provider\n if (typeof provider !== 'string' || !supportedBackendProviders.includes(provider as BackendProvider)) {\n problems.push(`manifest.backend.provider \"${String(provider)}\" is not supported`)\n }\n validateOptionalNonEmptyString(manifest.backend.projectRef, 'manifest.backend.projectRef', problems)\n validateOptionalNonEmptyString(manifest.backend.url, 'manifest.backend.url', problems)\n if (provider === 'custom' && !isNonEmptyString(manifest.backend.adapterId)) {\n problems.push('manifest.backend.adapterId is required when provider is \"custom\"')\n } else if (provider !== 'custom') {\n validateOptionalNonEmptyString(manifest.backend.adapterId, 'manifest.backend.adapterId', problems)\n }\n validateLooseObject(manifest.backend.options, 'manifest.backend.options', problems)\n }\n }\n\n if (!isRecord(manifest.surfaces) || Object.keys(manifest.surfaces).length === 0) {\n problems.push('manifest.surfaces must declare at least one surface')\n } else {\n for (const [name, surface] of Object.entries(manifest.surfaces)) {\n validateSurfaceManifest(name, surface, problems)\n }\n }\n\n return problems\n}\n\nfunction validateSurfaceManifest(name: string, surface: unknown, problems: string[]): void {\n if (!isRecord(surface)) {\n problems.push(`surface \"${name}\" must be an object`)\n return\n }\n\n addUnsupportedKeys(surface, allowedSurfaceKeys, `surface \"${name}\"`, problems)\n if (!isNonEmptyString(surface.scaffold)) problems.push(`surface \"${name}\" is missing a scaffold id`)\n validateLooseObject(surface.options, `surface \"${name}\".options`, problems)\n\n if (surface.pages !== undefined) {\n if (!Array.isArray(surface.pages)) {\n problems.push(`surface \"${name}\".pages must be an array`)\n } else {\n const pagePaths = new Set<string>()\n for (const [index, page] of surface.pages.entries()) {\n validatePageManifest(name, index, page, pagePaths, problems)\n }\n }\n }\n\n if (surface.plugins !== undefined) {\n if (!Array.isArray(surface.plugins)) {\n problems.push(`surface \"${name}\".plugins must be an array`)\n } else {\n const pluginIds = new Set<string>()\n for (const [index, plugin] of surface.plugins.entries()) {\n validatePluginRef(name, index, plugin, pluginIds, problems)\n }\n }\n }\n}\n\nfunction validatePageManifest(\n surfaceName: string,\n index: number,\n page: unknown,\n pagePaths: Set<string>,\n problems: string[],\n): void {\n const pageLabel = `surface \"${surfaceName}\" page #${index + 1}`\n if (!isRecord(page)) {\n problems.push(`${pageLabel} must be an object`)\n return\n }\n\n addUnsupportedKeys(page, allowedPageKeys, pageLabel, problems)\n\n if (!isNonEmptyString(page.path)) {\n problems.push(`${pageLabel} has an empty path`)\n } else {\n const normalizedPath = page.path.trim()\n if (pagePaths.has(normalizedPath)) {\n problems.push(`surface \"${surfaceName}\" declares duplicate page path \"${normalizedPath}\"`)\n } else {\n pagePaths.add(normalizedPath)\n }\n }\n\n if (page.label !== undefined && typeof page.label !== 'string') problems.push(`${pageLabel}.label must be a string`)\n if (page.icon !== undefined && typeof page.icon !== 'string') problems.push(`${pageLabel}.icon must be a string`)\n if (page.section !== undefined && (typeof page.section !== 'string' || !supportedPageSections.has(page.section))) {\n problems.push(`${pageLabel}.section must be one of main, secondary, settings`)\n }\n if (page.entity !== undefined && !isNonEmptyString(page.entity)) problems.push(`${pageLabel}.entity must be a non-empty string`)\n if (page.component !== undefined && !isNonEmptyString(page.component)) {\n problems.push(`${pageLabel}.component must be a non-empty string`)\n }\n\n const kinds = [page.blocks, page.entity, page.component].filter((x) => x != null)\n if (kinds.length !== 1) {\n problems.push(`${pageLabel} must set exactly one of blocks/entity/component`)\n }\n\n if (page.permission !== undefined) {\n validatePermission(page.permission, `${pageLabel}.permission`, problems)\n }\n\n if (page.blocks !== undefined) {\n if (!Array.isArray(page.blocks)) {\n problems.push(`${pageLabel}.blocks must be an array`)\n } else {\n page.blocks.forEach((block, blockIndex) => {\n validateBlockManifest(block, `${pageLabel}.blocks[${blockIndex}]`, problems)\n })\n }\n }\n}\n\nfunction validatePluginRef(\n surfaceName: string,\n index: number,\n plugin: unknown,\n pluginIds: Set<string>,\n problems: string[],\n): void {\n const pluginLabel = `surface \"${surfaceName}\" plugin #${index + 1}`\n if (!isRecord(plugin)) {\n problems.push(`${pluginLabel} must be an object`)\n return\n }\n\n addUnsupportedKeys(plugin, allowedPluginRefKeys, pluginLabel, problems)\n\n if (!isNonEmptyString(plugin.id)) {\n problems.push(`${pluginLabel} has an empty id`)\n } else {\n const normalizedId = plugin.id.trim()\n if (pluginIds.has(normalizedId)) {\n problems.push(`surface \"${surfaceName}\" declares duplicate plugin id \"${normalizedId}\"`)\n } else {\n pluginIds.add(normalizedId)\n }\n }\n\n validateLooseObject(plugin.config, `${pluginLabel}.config`, problems)\n if (plugin.enabled !== undefined && typeof plugin.enabled !== 'boolean') {\n problems.push(`${pluginLabel}.enabled must be a boolean`)\n }\n}\n\nfunction validatePermission(permission: unknown, path: string, problems: string[]): void {\n if (!isRecord(permission)) {\n problems.push(`${path} must be an object`)\n return\n }\n\n addUnsupportedKeys(permission, allowedPermissionKeys, path, problems)\n if (!isNonEmptyString(permission.feature)) problems.push(`${path}.feature is required`)\n if (!isNonEmptyString(permission.action)) problems.push(`${path}.action is required`)\n}\n\nfunction validateBlockManifest(block: unknown, path: string, problems: string[]): void {\n if (!isRecord(block)) {\n problems.push(`${path} must be an object`)\n return\n }\n\n addUnsupportedKeys(block, allowedBlockKeys, path, problems)\n if (!isNonEmptyString(block.type)) problems.push(`${path}.type is required`)\n validateLooseObject(block.props, `${path}.props`, problems)\n if (block.id !== undefined && typeof block.id !== 'string') problems.push(`${path}.id must be a string`)\n\n if (block.children !== undefined) {\n if (!Array.isArray(block.children)) {\n problems.push(`${path}.children must be an array`)\n } else {\n block.children.forEach((child, index) => validateBlockManifest(child, `${path}.children[${index}]`, problems))\n }\n }\n}\n\nfunction addUnsupportedKeys(\n value: Record<string, unknown>,\n allowedKeys: Set<string>,\n path: string,\n problems: string[],\n): void {\n for (const key of Object.keys(value)) {\n if (!allowedKeys.has(key)) {\n problems.push(`${path}.${key} is not part of AppManifest v${CURRENT_MANIFEST_VERSION}`)\n }\n }\n}\n\nfunction validateLooseObject(value: unknown, path: string, problems: string[]): void {\n if (value !== undefined && !isRecord(value)) {\n problems.push(`${path} must be an object`)\n }\n}\n\nfunction validateOptionalNonEmptyString(value: unknown, path: string, problems: string[]): void {\n if (value !== undefined && !isNonEmptyString(value)) {\n problems.push(`${path} must be a non-empty string`)\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0\n}\n","import type { AppManifest } from './index'\n\n// ---------------------------------------------------------------------------\n// Deterministic serialization — the SAME manifest object must always produce\n// the SAME bytes, because the sha256 of those bytes (`contractHash`) is what\n// makes `fayz manifest sync` idempotent and lets `fayz doctor` prove the\n// committed app.manifest.json is not stale. Rules: object keys sorted, arrays\n// kept in declared order (order is meaning: nav position, migration order),\n// 2-space indent, trailing newline, `contractHash` itself excluded.\n// ---------------------------------------------------------------------------\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortValue)\n if (value !== null && typeof value === 'object') {\n const record = value as Record<string, unknown>\n const out: Record<string, unknown> = {}\n for (const key of Object.keys(record).sort()) {\n const v = record[key]\n if (v !== undefined) out[key] = sortValue(v)\n }\n return out\n }\n return value\n}\n\n/** Canonical JSON of a manifest (contractHash excluded, keys sorted). */\nexport function serializeManifest(manifest: AppManifest): string {\n const { contractHash: _omit, ...rest } = manifest\n return `${JSON.stringify(sortValue(rest), null, 2)}\\n`\n}\n\n/**\n * sha256 (hex) of the canonical serialization. Async because it runs on\n * WebCrypto (`globalThis.crypto.subtle`), which exists in every runtime we\n * target (browsers, Node ≥ 18, edge) — no node:crypto import, keeping this\n * module bundleable everywhere.\n */\nexport async function computeContractHash(manifest: AppManifest): Promise<string> {\n const bytes = new TextEncoder().encode(serializeManifest(manifest))\n const digest = await globalThis.crypto.subtle.digest('SHA-256', bytes)\n return Array.from(new Uint8Array(digest))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n}\n\n/** Serialize WITH the freshly computed contractHash embedded — what\n * `fayz manifest emit` writes to app.manifest.json. */\nexport async function serializeManifestWithHash(manifest: AppManifest): Promise<string> {\n const contractHash = await computeContractHash(manifest)\n const { contractHash: _omit, ...rest } = manifest\n return `${JSON.stringify(sortValue({ ...rest, contractHash }), null, 2)}\\n`\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://fayz.ai/schemas/app-manifest/v3.json\",\n \"title\": \"Fayz AppManifest\",\n \"description\": \"The canonical, JSON-serializable definition of a Fayz app. Code is referenced by registry id; never inlined.\",\n \"type\": \"object\",\n \"required\": [\n \"manifestVersion\",\n \"id\",\n \"name\",\n \"surfaces\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"manifestVersion\": {\n \"type\": \"integer\",\n \"const\": 3,\n \"description\": \"Current AppManifest schema version. Older or newer versions require an explicit SDK migration before validation.\"\n },\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"pattern\": \"^[a-z0-9][a-z0-9-]*$\"\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"backend\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"provider\"\n ],\n \"properties\": {\n \"provider\": {\n \"enum\": [\n \"supabase\",\n \"fayz-api\",\n \"fayz-shop\",\n \"mock\",\n \"custom\"\n ]\n },\n \"projectRef\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"url\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"adapterId\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"options\": {\n \"type\": \"object\"\n }\n }\n },\n \"locale\": {\n \"type\": \"object\"\n },\n \"theme\": {\n \"type\": \"object\"\n },\n \"permissions\": {\n \"type\": \"object\"\n },\n \"billing\": {\n \"type\": \"object\"\n },\n \"entities\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"surfaces\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"additionalProperties\": {\n \"$ref\": \"#/$defs/surface\"\n }\n },\n \"limitDeclarations\": {\n \"type\": \"array\",\n \"description\": \"Resolved 4-layer limit-declaration merge (core < entity-derived < plugin < app) so server runtimes count exactly what the client counts.\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"key\",\n \"table\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"key\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"table\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"kindFilter\": {\n \"type\": \"string\"\n },\n \"period\": {\n \"enum\": [\n \"month\",\n \"total\"\n ]\n }\n }\n }\n },\n \"agent\": {\n \"$ref\": \"#/$defs/agentContract\"\n },\n \"contractHash\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"sha256 of the canonical serialization (excluding this field).\"\n }\n },\n \"$defs\": {\n \"surface\": {\n \"type\": \"object\",\n \"required\": [\n \"scaffold\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"scaffold\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"options\": {\n \"type\": \"object\"\n },\n \"plugins\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/pluginRef\"\n }\n },\n \"pages\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/page\"\n }\n }\n }\n },\n \"pluginRef\": {\n \"type\": \"object\",\n \"required\": [\n \"id\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"config\": {\n \"type\": \"object\"\n },\n \"enabled\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"page\": {\n \"type\": \"object\",\n \"required\": [\n \"path\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Exactly one of blocks/entity/component must be set.\",\n \"properties\": {\n \"path\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"type\": \"string\"\n },\n \"section\": {\n \"enum\": [\n \"main\",\n \"secondary\",\n \"settings\"\n ]\n },\n \"blocks\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/block\"\n }\n },\n \"entity\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"component\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"permission\": {\n \"type\": \"object\",\n \"required\": [\n \"feature\",\n \"action\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"feature\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"action\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n }\n },\n \"oneOf\": [\n {\n \"required\": [\n \"blocks\"\n ]\n },\n {\n \"required\": [\n \"entity\"\n ]\n },\n {\n \"required\": [\n \"component\"\n ]\n }\n ]\n },\n \"block\": {\n \"type\": \"object\",\n \"required\": [\n \"type\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"props\": {\n \"type\": \"object\"\n },\n \"children\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/block\"\n }\n }\n }\n },\n \"agentContract\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"description\": \"Everything a server-side agent runtime needs to operate the app without a browser. Derived from code at publish; synced to Fayz as the versioned AgentContract.\",\n \"properties\": {\n \"persona\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"systemPrompt\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"type\": \"string\"\n }\n }\n },\n \"executionPlane\": {\n \"enum\": [\n \"client\",\n \"server\"\n ]\n },\n \"entities\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/entityContract\"\n }\n },\n \"tools\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/aiToolContract\"\n }\n },\n \"registries\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"pluginId\",\n \"id\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"pluginId\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"entityKey\": {\n \"type\": \"string\"\n },\n \"readOnly\": {\n \"type\": \"boolean\"\n }\n }\n }\n },\n \"declaredFeatures\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"rpcs\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/rpcContract\"\n }\n },\n \"domainKnowledge\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"statuses\": {\n \"type\": \"object\"\n },\n \"scheduleDefaults\": {\n \"type\": \"object\"\n },\n \"businessRules\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"description\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"description\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n }\n }\n }\n }\n }\n },\n \"entityContract\": {\n \"type\": \"object\",\n \"required\": [\n \"key\",\n \"label\",\n \"data\",\n \"fields\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"key\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"label\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"labelPlural\": {\n \"type\": \"string\"\n },\n \"limitKey\": {\n \"type\": \"string\"\n },\n \"data\": {\n \"type\": \"object\",\n \"required\": [\n \"table\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"table\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"schema\": {\n \"type\": \"string\"\n },\n \"tenantScoped\": {\n \"type\": \"boolean\"\n },\n \"tenantIdColumn\": {\n \"type\": \"string\"\n },\n \"searchColumns\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"selectColumns\": {\n \"type\": \"string\"\n },\n \"columnMap\": {\n \"type\": \"object\"\n },\n \"archetype\": {\n \"type\": \"string\"\n },\n \"archetypeKind\": {\n \"type\": \"string\"\n },\n \"filters\": {\n \"type\": \"object\"\n }\n }\n },\n \"fields\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"key\",\n \"label\",\n \"type\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"key\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"searchable\": {\n \"type\": \"boolean\"\n },\n \"hint\": {\n \"type\": \"string\"\n },\n \"options\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"relationTable\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"permission\": {\n \"type\": \"object\",\n \"required\": [\n \"feature\",\n \"action\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"feature\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"action\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n }\n }\n },\n \"aiToolContract\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"name\",\n \"description\",\n \"mode\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"pattern\": \"^[a-zA-Z0-9_-]{1,64}$\"\n },\n \"description\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"mode\": {\n \"enum\": [\n \"read\",\n \"persist\"\n ]\n },\n \"parameters\": {\n \"type\": \"object\"\n },\n \"permission\": {\n \"type\": \"object\",\n \"required\": [\n \"feature\",\n \"action\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"feature\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"action\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n },\n \"limitKey\": {\n \"type\": \"string\"\n },\n \"execution\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"required\": [\n \"plane\",\n \"kind\",\n \"rpc\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"plane\": {\n \"const\": \"server\"\n },\n \"kind\": {\n \"const\": \"rpc\"\n },\n \"rpc\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n },\n {\n \"type\": \"object\",\n \"required\": [\n \"plane\",\n \"kind\",\n \"entity\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"plane\": {\n \"const\": \"server\"\n },\n \"kind\": {\n \"const\": \"entity_read\"\n },\n \"entity\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n },\n {\n \"type\": \"object\",\n \"required\": [\n \"plane\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"plane\": {\n \"const\": \"client\"\n }\n }\n }\n ]\n },\n \"requiresConfirmation\": {\n \"type\": \"boolean\"\n },\n \"pluginId\": {\n \"type\": \"string\"\n },\n \"category\": {\n \"type\": \"string\"\n }\n }\n },\n \"rpcContract\": {\n \"type\": \"object\",\n \"required\": [\n \"name\",\n \"kind\",\n \"description\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"pattern\": \"^agent_[a-z0-9_]+$\"\n },\n \"kind\": {\n \"enum\": [\n \"read\",\n \"write\"\n ]\n },\n \"description\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"payloadSchema\": {\n \"type\": \"object\"\n },\n \"audits\": {\n \"type\": \"boolean\"\n }\n }\n }\n }\n}\n","import * as React from 'react'\nimport { getScaffold } from '../registry'\nimport { migrateManifest, validateManifest, CURRENT_MANIFEST_VERSION } from '../manifest'\nimport type { AppManifest } from '../manifest'\n\n// ---------------------------------------------------------------------------\n// defineApp / renderApp — the entry points that turn an AppManifest into a\n// running app. Scaffolds (admin, storefront, portal) self-register into the\n// scaffold registry when their package is imported, so core never depends on\n// them: a generated app imports the scaffold package(s) it needs, then calls\n// renderApp(manifest). createSaasApp / createStorefrontApp become sugar that\n// builds a manifest and hands it here.\n// ---------------------------------------------------------------------------\n\nconst ManifestContext = React.createContext<AppManifest | null>(null)\n\n/** Access the active app manifest from any component under renderApp. */\nexport function useManifest(): AppManifest | null {\n return React.useContext(ManifestContext)\n}\n\n/** Stamp + validate a manifest authored in code (the sugar path). */\nexport function defineApp(\n manifest: Omit<AppManifest, 'manifestVersion'> & { manifestVersion?: number },\n): AppManifest {\n const full = {\n ...manifest,\n manifestVersion: manifest.manifestVersion ?? CURRENT_MANIFEST_VERSION,\n } as AppManifest\n const problems = validateManifest(full)\n if (problems.length) {\n throw new Error(`Invalid AppManifest:\\n - ${problems.join('\\n - ')}`)\n }\n return full\n}\n\nexport interface RenderAppOptions {\n /** Which surface to mount; defaults to the first declared surface. */\n surface?: string\n}\n\n/** Resolve, migrate and validate a manifest, then mount the scaffold for the\n * chosen surface. Accepts a raw object (e.g. parsed app.manifest.json). */\nexport function renderApp(\n input: AppManifest | Record<string, unknown>,\n opts: RenderAppOptions = {},\n): React.ReactElement {\n const manifest = migrateManifest(input as Record<string, unknown>)\n const problems = validateManifest(manifest)\n if (problems.length) {\n throw new Error(`Invalid AppManifest:\\n - ${problems.join('\\n - ')}`)\n }\n const surfaceName = opts.surface ?? Object.keys(manifest.surfaces)[0]\n const surface = surfaceName ? manifest.surfaces[surfaceName] : undefined\n if (!surface) {\n throw new Error(`Surface \"${surfaceName}\" not found in manifest.`)\n }\n const Scaffold = getScaffold(surface.scaffold)\n if (!Scaffold) {\n throw new Error(\n `Scaffold \"${surface.scaffold}\" is not registered. Import the package that provides it (e.g. @fayz-ai/saas or @fayz-ai/shop) before calling renderApp.`,\n )\n }\n return React.createElement(\n ManifestContext.Provider,\n { value: manifest },\n React.createElement(Scaffold, { manifest, surface: surfaceName }),\n )\n}\n","import { create } from 'zustand'\n\n/**\n * Global, cross-module navigation history.\n *\n * Per-module nav hooks (useModuleNavigation) only remember views *within* one\n * module, so they can't tell you where you came from after crossing a module\n * boundary (e.g. Financial statements → a client/person page). This store sits\n * above all modules: the app shell records every route change here with a\n * human label, and the shared SubpageHeader reads it to render a context-aware\n * \"back to {where you came from}\" link that returns to the actual previous page.\n */\n\nexport interface NavHistoryEntry {\n /** Route path without the leading '#', e.g. '/financial/statements'. */\n path: string\n /** Human, module-level label for the page, e.g. 'Financeiro'. */\n label: string\n}\n\ninterface NavHistoryState {\n stack: NavHistoryEntry[]\n /** Record a visit. Consecutive visits to the same path collapse (label refreshes). */\n record: (entry: NavHistoryEntry) => void\n}\n\nconst MAX_ENTRIES = 20\n\nexport const useNavHistoryStore = create<NavHistoryState>((set) => ({\n stack: [],\n record: (entry) =>\n set((s) => {\n const top = s.stack[s.stack.length - 1]\n if (top && top.path === entry.path) {\n if (top.label === entry.label) return s\n const next = s.stack.slice()\n next[next.length - 1] = entry\n return { stack: next }\n }\n const next = [...s.stack, entry]\n return { stack: next.length > MAX_ENTRIES ? next.slice(-MAX_ENTRIES) : next }\n }),\n}))\n\n/** Record a route visit. Call from the app shell whenever the route changes. */\nexport function recordNavigation(path: string, label: string): void {\n useNavHistoryStore.getState().record({ path, label })\n}\n\n// Dev-only debug handle: inspect history in the console via `__navHistory.getState().stack`.\nif (typeof window !== 'undefined') {\n ;(window as unknown as { __navHistory?: typeof useNavHistoryStore }).__navHistory = useNavHistoryStore\n}\n\n/**\n * The page the user most recently came from, relative to `currentPath`.\n *\n * Returns the latest recorded entry whose path differs from `currentPath`. This\n * is intentionally robust to ordering: it gives the right referrer whether or\n * not the current page has been recorded yet, avoiding a stale first paint.\n */\nexport function useNavReferrer(currentPath: string): NavHistoryEntry | null {\n return useNavHistoryStore((s) => {\n for (let i = s.stack.length - 1; i >= 0; i--) {\n if (s.stack[i].path !== currentPath) return s.stack[i]\n }\n return null\n })\n}\n\n/**\n * Return to the actual previous page via the browser history. Falls back to the\n * provided callback when there's no in-app history to pop (e.g. a deep link).\n */\nexport function navHistoryBack(fallback?: () => void): void {\n if (useNavHistoryStore.getState().stack.length >= 2) {\n window.history.back()\n } else {\n fallback?.()\n }\n}\n\n/** Top-level module segment of a route path ('/financial/statements' → 'financial'). */\nexport function routeModule(path: string): string {\n return path.replace(/^\\/+/, '').split('/')[0] ?? ''\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/plugins.ts","../src/events/index.tsx","../src/data/refresh.ts","../src/plugin/createSafeDataProvider.ts","../src/phone/index.ts","../src/address/index.ts","../src/seo/index.ts","../src/lib/format.ts","../src/lib/csv.ts","../src/search/text.ts","../src/search/engine.ts","../src/blocks/index.tsx","../src/manifest/index.ts","../src/manifest/serialize.ts","../src/manifest/app-manifest.schema.json","../src/app/render.tsx","../src/router/history.ts"],"names":["React","globalCache","getActiveTenantId","React2","getSupabaseClientOptional","useEffect","getCurrentLocale","resolveDataProvider","via","React3","getBlock","React4","getScaffold","create","next"],"mappings":"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","file":"index.cjs","sourcesContent":["import type React from 'react'\nimport type { EntityDef } from './crud'\nimport type { FeatureDeclaration, PermissionAction } from './permissions'\nimport type { LimitDeclaration } from './entitlements'\nimport type { ConnectorDefinition } from '../integrations'\n\nexport type VerticalId = 'beauty' | 'food' | 'health' | 'services' | 'retail' | 'education' | (string & {})\nexport type PluginScope = 'core' | 'vertical' | 'universal' | 'addon' | 'tenant'\nexport type PluginStatus = 'pending_setup' | 'active' | 'disabled' | 'removed'\n\n/**\n * Scaffold type this plugin targets.\n * Plugins can declare which scaffolds they work with.\n * If omitted, the plugin works with all scaffold types.\n */\nexport type ScaffoldType = 'saas' | 'ecommerce' | 'landing_page' | 'website' | (string & {})\n\nexport interface PluginPermissionRequirement {\n feature: string\n action: PermissionAction\n}\n\nexport interface PluginNavigationEntry {\n id?: string\n section: 'main' | 'secondary' | 'settings'\n position: number\n label: string\n route: string\n icon?: string\n badge?: string | number\n permission?: PluginPermissionRequirement\n /**\n * Sales-channel / external link. When set, the entry opens this URL in a new\n * tab instead of routing internally — no page/route is registered for it. Used\n * by \"Canais de venda\"-style nav (Loja Online, WhatsApp, TikTok Shop…). The\n * `route` is still required (used as a stable identity/key), but is never\n * navigated when `href` is present.\n */\n href?: string\n /**\n * When this entry gains sub-path children, the shell also synthesizes a child\n * pointing back at the parent's own route (so /courses stays reachable under\n * the \"Courses\" group). Set false when the parent route is a duplicate of its\n * first child — e.g. /shop and /shop/products render the same catalog, and\n * listing both reads as a bug. Defaults to true.\n */\n indexChild?: boolean\n}\n\nexport interface PluginSettingsTab {\n id: string\n label: string\n icon?: string\n /** Provide the component directly, or reference a registered component by id\n * (resolvePluginComponent resolves componentId → the component registry).\n * Exactly one is required. */\n component?: React.ComponentType<unknown>\n componentId?: string\n pluginId?: string\n order?: number\n permission?: PluginPermissionRequirement\n}\n\nexport interface PluginRouteDefinition {\n path: string\n /** Component or a registered component id — exactly one is required. */\n component?: React.ComponentType<unknown>\n componentId?: string\n guard?: 'authenticated' | 'role' | 'public' | 'share-token'\n roles?: string[]\n permission?: PluginPermissionRequirement\n /** Render edge-to-edge with no page padding/animation wrapper (chat, kanban, canvas). */\n fullBleed?: boolean\n /** Archetypes this page displays (`archetype` or `archetype:kind`, e.g.\n * `'schedule:appointment'`). A CRUD page claims its own; a hand-built page\n * must declare it or records it owns resolve to no route. */\n entityRoutes?: string[]\n}\n\nexport type PluginWidgetZone =\n | 'shell.sidebar.before-nav'\n | 'shell.sidebar.footer'\n | 'shell.topbar.start'\n | 'shell.topbar.end'\n | 'page.before'\n | 'page.after'\n | 'settings.before'\n | 'settings.after'\n | 'shell.floating'\n | (string & {})\n\nexport const WidgetZone = {\n SIDEBAR_BEFORE_NAV: 'shell.sidebar.before-nav',\n SIDEBAR_FOOTER: 'shell.sidebar.footer',\n TOPBAR_START: 'shell.topbar.start',\n TOPBAR_END: 'shell.topbar.end',\n PAGE_BEFORE: 'page.before',\n PAGE_AFTER: 'page.after',\n SETTINGS_BEFORE: 'settings.before',\n SETTINGS_AFTER: 'settings.after',\n FLOATING: 'shell.floating',\n} as const\n\nexport interface PluginRuntimeTenant {\n id?: string\n slug?: string\n verticalId?: string\n plan?: string\n}\n\nexport interface PluginRuntimeUser {\n id?: string\n role?: string\n}\n\nexport interface PluginWidgetVisibility {\n routes?: string[]\n excludeRoutes?: string[]\n layouts?: string[]\n roles?: string[]\n plans?: string[]\n permissions?: PluginPermissionRequirement[]\n when?: (context: PluginRuntimeContext) => boolean\n}\n\nexport interface PluginRuntimeContext {\n tenant: PluginRuntimeTenant | null\n user: PluginRuntimeUser | null\n currentPath: string\n matchedPath?: string\n layout: string\n hasPermission?: (req: PluginPermissionRequirement) => boolean\n}\n\nexport interface PluginWidgetDefinition<TConfig extends Record<string, unknown> = Record<string, unknown>> {\n id: string\n zone: PluginWidgetZone\n /** Component or a registered component id — exactly one is required. */\n component?: React.ComponentType<unknown>\n componentId?: string\n title?: string\n order?: number\n permission?: PluginPermissionRequirement\n visibility?: PluginWidgetVisibility\n props?: TConfig\n}\n\n// ---------------------------------------------------------------------------\n// Dashboard widgets — first-class units a plugin contributes to the dashboard\n// registry. Rendered both on the plugin's own home and on the global app home.\n// ---------------------------------------------------------------------------\n\nexport type DashboardWidgetKind = 'kpi' | 'chart' | 'table' | 'onboarding' | 'custom'\n\n/** Surfaces a widget can appear on. 'home' = global app home (the universal\n * business dashboard every app renders via createDashboardPlugin);\n * 'plugin-home' = the owning plugin's own overview page; 'finance-home' = a\n * dedicated B2C consumer-finance home (norman-ai's phone-first money screen),\n * kept separate so its full-bleed hero/cards never leak onto the B2B 'home'. */\nexport type DashboardSurface = 'home' | 'plugin-home' | 'finance-home'\n\nexport interface DashboardWidgetDef<TProps extends Record<string, unknown> = Record<string, unknown>> {\n /** Globally unique id, e.g. 'crm.kpi.total-leads'. */\n id: string\n /** i18n key or plain label. */\n title: string\n description?: string\n icon?: string\n /** Owning domain used to scope plugin-home vs global home. Defaults to plugin.id. */\n domain?: string\n kind: DashboardWidgetKind\n /** Column span on the 4-col grid. Defaults by kind (kpi→1, chart→2, table→4). */\n span?: 1 | 2 | 3 | 4\n /** Visible before any app/user customization. Default: true. */\n defaultVisible?: boolean\n /** Default order within the surface (lower = first). */\n defaultOrder?: number\n /** Surfaces this widget appears on. Default: both. */\n surfaces?: DashboardSurface[]\n verticalId?: VerticalId\n permission?: PluginPermissionRequirement\n /** Component or a registered component id — exactly one is required. */\n component?: React.ComponentType<unknown>\n componentId?: string\n props?: TProps\n}\n\n/** App- or user-level overrides applied on top of the registered defaults. */\nexport interface DashboardLayoutConfig {\n widgets?: Array<{ id: string; visible?: boolean; order?: number; span?: number }>\n}\n\nexport interface ResolvedDashboardWidget extends DashboardWidgetDef {\n /** Resolved owning domain (plugin.id when not explicitly set). */\n domain: string\n order: number\n plugin: ResolvedPluginManifest\n}\n\n/** An event a plugin emits onto the event bus — declared for platform\n * introspection and so the AppManifest can bind event→action as data. */\nexport interface PluginEventDefinition {\n /** Namespaced event name, e.g. 'agenda.booking.confirmed'. */\n name: string\n description?: string\n /** JSON Schema for the payload (editor / AI / validation). */\n payloadSchema?: Record<string, unknown>\n}\n\nexport interface PluginCapability {\n id: string\n label: string\n description?: string\n kind?: 'page' | 'widget' | 'data' | 'integration'\n}\n\nexport interface PluginQuickAction {\n id: string\n label: string\n icon?: string\n description?: string\n /** Action handler — typically navigates to a view. */\n action: () => void\n}\n\nexport type AIToolMode = 'read' | 'persist'\n\nexport interface AIToolParameterProperty {\n type: 'string' | 'number' | 'boolean' | 'array' | 'object'\n description?: string\n enum?: string[]\n items?: AIToolParameterProperty\n default?: unknown\n}\n\nexport interface AIToolParameters {\n type: 'object'\n properties: Record<string, AIToolParameterProperty>\n required?: string[]\n}\n\nexport interface AIToolSuggestion {\n label: string\n prompt?: string\n icon?: string\n verticalId?: VerticalId\n}\n\nexport type AIToolExecution =\n | { plane: 'server'; kind: 'rpc'; rpc: string }\n | { plane: 'server'; kind: 'entity_read'; entity: string }\n | { plane: 'client' }\n\n/**\n * A tenant-scoped pool RPC (`agent_<domain>_<verb>`) this plugin ships for the\n * server-plane agent executor. Surfaces in the manifest as\n * `agent.rpcs` (RpcContract) — the broker only ever calls declared functions.\n */\nexport interface AgentRpcDeclaration {\n /** Function name in the pool, e.g. 'agent_agenda_create_appointment'. */\n name: string\n kind: 'read' | 'write'\n description: string\n /** JSON Schema of the p_payload argument. */\n payloadSchema?: AIToolParameters\n /** Whether the function writes audit_logs itself. */\n audits?: boolean\n}\n\nexport interface PluginAITool {\n id: string\n name: string\n description: string\n icon?: string\n mode: AIToolMode\n parameters?: AIToolParameters\n permission?: PluginPermissionRequirement\n /**\n * Quantity-limit key this tool's writes consume (e.g. 'bookings_month' for a\n * booking-creating tool). Persist-mode tools that create countable rows MUST\n * declare it so the agent executor can run the SAME plan-limit guard the UI\n * runs (guard before execute, invalidate after) — an AI agent never clicks a\n * gated button, so the declarative contract is its only gate.\n */\n limitKey?: string\n /**\n * Where the tool runs. Server-plane is what makes browserless channels\n * (WhatsApp, MCP) able to run the tool at all:\n * - `{ plane:'server', kind:'rpc', rpc }` — the Fayz broker calls the named\n * `agent_*` RPC in the tenant pool (writes / guarded reads).\n * - `{ plane:'server', kind:'entity_read', entity }` — the broker runs the\n * generic tenant-scoped read against the entity's table (derived tools).\n * - `{ plane:'client' }` (or absent) — a locally registered executor runs it\n * in the surface (navigation, modals).\n */\n execution?: AIToolExecution\n /**\n * Require an explicit human confirmation before executing. Defaults to true\n * for `mode: 'persist'` tools — the channel renders it natively (FAB modal,\n * WhatsApp yes/no reply).\n */\n requiresConfirmation?: boolean\n suggestions?: AIToolSuggestion[]\n category?: string\n tags?: string[]\n}\n\nexport interface PluginRegistryDef {\n id: string\n entity: EntityDef\n icon?: string\n description?: string\n display?: 'table' | 'cards' | 'tree'\n seedData?: Record<string, unknown>[]\n mockData?: Record<string, unknown>[]\n readOnly?: boolean\n}\n\nexport interface PluginMigration {\n id: string\n version: string\n sql: string\n description?: string\n}\n\nexport interface PluginOnboarding {\n /** Component or a registered component id — exactly one is required. */\n component?: React.ComponentType<{ onComplete: () => void }>\n componentId?: string\n title?: string\n description?: string\n}\n\n/**\n * A health check a plugin contributes to the diagnostics / boot report surfaced by\n * `fayz doctor`. Declared as data so the platform can verify a plugin's backend\n * prerequisites are present without running it.\n */\nexport interface PluginDiagnostic {\n id: string\n description?: string\n /** What the runtime should verify exists for this plugin to work. */\n requires: {\n rpcs?: string[]\n views?: string[]\n tables?: string[]\n migrations?: string[]\n env?: string[]\n }\n /** Severity when the requirement is missing. Defaults to 'warn'. */\n level?: 'error' | 'warn' | 'info'\n}\n\nexport interface PluginManifest {\n id: string\n name: string\n icon: string\n version: string\n /** Plugin contract version. The runtime refuses plugins built for a newer\n * contract than it supports (see PLUGIN_API_VERSION). Omit = legacy/compatible. */\n apiVersion?: number\n description?: string\n scope?: PluginScope\n verticalId?: VerticalId\n /** Events this plugin emits onto the bus (declared for introspection/automation). */\n events?: PluginEventDefinition[]\n /** Which scaffold types this plugin targets. Omit for universal plugins. */\n scaffolds?: ScaffoldType[]\n tenantId?: string\n defaultEnabled?: boolean\n schema?: string\n dependencies?: string[]\n navigation: PluginNavigationEntry[]\n settings?: PluginSettingsTab[]\n routes: PluginRouteDefinition[]\n widgets?: PluginWidgetDefinition[]\n /** Dashboard widgets this plugin contributes to the dashboard registry. */\n dashboardWidgets?: DashboardWidgetDef[]\n capabilities?: PluginCapability[]\n aiTools?: PluginAITool[]\n entities?: string[]\n permissions?: string[]\n declaredFeatures?: FeatureDeclaration[]\n /**\n * Quantity limits this plugin knows how to count. Aggregated by the plugin\n * runtime into `PluginRuntime.pluginLimits` and consumed by the access engine\n * (useLimit / useLimitGuard) so a plugin \"is born compatible\" with freemium\n * caps without any per-app wiring. See {@link LimitDeclaration}.\n */\n declaredLimits?: LimitDeclaration[]\n /** Pool RPCs this plugin ships for the server-plane agent executor. */\n declaredRpcs?: AgentRpcDeclaration[]\n /**\n * Read-models this plugin exposes to the agent's generic data primitives\n * (searchRecords/queryData) BEYOND its CRUD registries — typically its\n * views/ledgers (v_appointments, plg_financial_movements). `key` is a stable\n * ASCII id (never derived from a translated label); the entity's own\n * `permission` gates each call.\n */\n queryEntities?: Array<{\n key: string\n entity: EntityDef\n /** Base tables may opt into createRecord; views/ledgers stay read-only. */\n writable?: boolean\n }>\n registries?: PluginRegistryDef[]\n /**\n * Connectors this plugin contributes. An ADDON plugin declares its connector(s)\n * here, each naming the `hostPluginId` it extends; the runtime groups them by\n * host and the host plugin's settings render them in a unified Integrations tab.\n */\n connectors?: ConnectorDefinition[]\n migrations?: PluginMigration[]\n /** Backend prerequisites the plugin needs; surfaced by `fayz doctor`. */\n diagnostics?: PluginDiagnostic[]\n onboarding?: PluginOnboarding\n locales?: Record<string, Record<string, string>>\n}\n\nexport interface TenantPluginBinding {\n pluginId: string\n status: PluginStatus\n tenantId?: string\n config?: Record<string, unknown>\n}\n\nexport interface PluginRuntimeIssue {\n type:\n | 'duplicate_plugin'\n | 'missing_dependency'\n | 'circular_dependency'\n | 'vertical_mismatch'\n | 'incompatible_api_version'\n pluginId: string\n dependencyId?: string\n message: string\n}\n\nexport interface ResolvedPluginManifest extends PluginManifest {\n status: PluginStatus\n isActive: boolean\n activationReason: 'default' | 'tenant' | 'dependency' | 'inactive'\n config: Record<string, unknown>\n missingDependencies: string[]\n settingsTabs: PluginSettingsTab[]\n widgets: PluginWidgetDefinition[]\n resolvedRegistries: PluginRegistryDef[]\n resolvedAITools: PluginAITool[]\n}\n\nexport interface ResolvedPluginWidget<TConfig extends Record<string, unknown> = Record<string, unknown>>\n extends PluginWidgetDefinition<TConfig> {\n order: number\n config: TConfig\n plugin: ResolvedPluginManifest\n}\n\nexport interface PluginRuntimeRoute extends PluginRouteDefinition {\n plugin: ResolvedPluginManifest\n}\n\nexport interface PluginRuntime {\n context: PluginRuntimeContext\n plugins: ResolvedPluginManifest[]\n activePlugins: ResolvedPluginManifest[]\n routes: PluginRuntimeRoute[]\n navigation: PluginNavigationEntry[]\n settingsTabs: PluginSettingsTab[]\n widgets: ResolvedPluginWidget[]\n dashboardWidgets: ResolvedDashboardWidget[]\n capabilities: PluginCapability[]\n aiTools: PluginAITool[]\n issues: PluginRuntimeIssue[]\n registries: Map<string, PluginRegistryDef[]>\n /** Connectors contributed by active plugins, grouped by the host plugin they extend. */\n connectorsByHost: Map<string, ConnectorDefinition[]>\n pluginFeatures: FeatureDeclaration[]\n /** Limit declarations aggregated from every active plugin's `declaredLimits`. */\n pluginLimits: LimitDeclaration[]\n}\n","import * as React from 'react'\n\n// ---------------------------------------------------------------------------\n// Event bus — the substrate for cross-plugin behavior. Replaces the bespoke\n// `window.dispatchEvent('agenda:open-booking')` hack and the imperative\n// financial bridge: plugins emit named events, others subscribe, and the\n// AppManifest can declare event→action bindings as data. Plugins describe the\n// events they emit via PluginManifest.events (see types/plugins) so the\n// platform can introspect and wire automations.\n// ---------------------------------------------------------------------------\n\nexport type EventHandler<T = unknown> = (payload: T) => void\n\nexport interface EventBus {\n emit<T = unknown>(event: string, payload?: T): void\n on<T = unknown>(event: string, handler: EventHandler<T>): () => void\n once<T = unknown>(event: string, handler: EventHandler<T>): () => void\n off<T = unknown>(event: string, handler: EventHandler<T>): void\n clear(event?: string): void\n}\n\nexport function createEventBus(): EventBus {\n const handlers = new Map<string, Set<EventHandler>>()\n const bus: EventBus = {\n emit(event, payload) {\n const set = handlers.get(event)\n if (!set) return\n // Snapshot so handlers can subscribe/unsubscribe during dispatch.\n for (const handler of Array.from(set)) {\n try {\n handler(payload)\n } catch (err) {\n // A misbehaving subscriber must not break the emitter or its peers.\n console.error(`[fayz] event handler for \"${event}\" threw:`, err)\n }\n }\n },\n on(event, handler) {\n let set = handlers.get(event)\n if (!set) {\n set = new Set()\n handlers.set(event, set)\n }\n set.add(handler as EventHandler)\n return () => bus.off(event, handler)\n },\n once(event, handler) {\n const wrapped: EventHandler = (payload) => {\n bus.off(event, wrapped)\n ;(handler as EventHandler)(payload)\n }\n return bus.on(event, wrapped)\n },\n off(event, handler) {\n handlers.get(event)?.delete(handler as EventHandler)\n },\n clear(event) {\n if (event) handlers.delete(event)\n else handlers.clear()\n },\n }\n return bus\n}\n\n/** The app-wide default bus. One per app runtime (repo-per-app). */\nexport const eventBus: EventBus = createEventBus()\n\n/** Subscribe to an event for the lifetime of the component. The latest handler\n * is always invoked, so closures over fresh props/state work without resubscribing. */\nexport function useOnEvent<T = unknown>(\n event: string,\n handler: EventHandler<T>,\n deps: React.DependencyList = [],\n): void {\n const ref = React.useRef(handler)\n ref.current = handler\n React.useEffect(\n () => eventBus.on<T>(event, (payload) => ref.current(payload)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [event, ...deps],\n )\n}\n","import * as React from 'react'\nimport { eventBus } from '../events'\nimport { globalCache } from '../lib/cache'\nimport { getActiveTenantId } from '../tenant'\n\n// ---------------------------------------------------------------------------\n// Data refresh bus — \"something wrote; whoever is showing it should reload\".\n//\n// A write that happens OUTSIDE the list showing it (the assistant creating an\n// appointment, a webhook, another tab) used to leave the screen stale until the\n// user reloaded by hand. Providers already invalidate their own read cache on\n// create/update/remove, but a mounted list holds its rows in a store — nothing\n// told it to fetch again.\n//\n// This is the missing half: one broadcast, every surface that renders the\n// affected data listens. Deliberately coarse — a table name, not a row diff.\n// Refetching a page of rows is cheap; a stale screen after \"criei o\n// agendamento\" is not.\n// ---------------------------------------------------------------------------\n\nexport const DATA_CHANGED_EVENT = 'data:changed'\n\nexport interface DataChangedPayload {\n /** Physical table the write touched, when the writer knows it. */\n table?: string\n /** Registered entity key (deriveEntityKey), when the writer knows it. */\n entityKey?: string\n /** Archetype the record belongs to (`person:client`), when known. */\n archetype?: string\n op?: 'create' | 'update' | 'delete' | 'unknown'\n /** Affected record id, when known. */\n id?: string\n /** What caused the write — lets a surface ignore its own UI writes. */\n source?: 'agent' | 'ui' | 'remote'\n}\n\n/** What a subscriber renders. Any field left out matches everything. */\nexport interface DataChangedMatch {\n table?: string\n entityKey?: string\n archetype?: string\n}\n\n/**\n * A write with NO table/entityKey is a write we could not attribute (a plugin\n * tool, an RPC). Subscribers still refresh for it: a redundant refetch costs a\n * request, a missed one costs the user's trust in what the screen shows.\n */\nexport function matchesDataChange(match: DataChangedMatch, payload: DataChangedPayload): boolean {\n const attributed = payload.table ?? payload.entityKey ?? payload.archetype\n if (!attributed) return true\n if (match.table && payload.table && match.table === payload.table) return true\n if (match.entityKey && payload.entityKey && match.entityKey === payload.entityKey) return true\n if (match.archetype && payload.archetype && match.archetype === payload.archetype) return true\n // A subscriber that declared nothing listens to everything.\n return !match.table && !match.entityKey && !match.archetype\n}\n\n// One agent turn can write twice (create + link). Coalesce so the lists behind\n// it fetch once, after the turn settles, instead of once per call.\nlet pending: DataChangedPayload[] = []\nlet flushTimer: ReturnType<typeof setTimeout> | null = null\n\nfunction flush(): void {\n const batch = pending\n pending = []\n flushTimer = null\n for (const payload of batch) eventBus.emit(DATA_CHANGED_EVENT, payload)\n}\n\n/**\n * Announce a write. Invalidates the provider read cache for the affected table\n * (an unattributed write clears it wholesale — a stale hit would defeat the\n * refetch it just triggered) and broadcasts to mounted surfaces.\n */\nexport function emitDataChanged(payload: DataChangedPayload = {}): void {\n if (payload.table) {\n globalCache.invalidate(`${getActiveTenantId() ?? '_'}:${payload.table}`)\n } else {\n globalCache.clear()\n }\n pending.push({ op: 'unknown', source: 'agent', ...payload })\n if (flushTimer) return\n flushTimer = setTimeout(flush, 120)\n}\n\n/** Subscribe for the lifetime of the component. The latest handler always runs. */\nexport function useDataChanged(\n match: DataChangedMatch,\n handler: (payload: DataChangedPayload) => void,\n deps: React.DependencyList = [],\n): void {\n const handlerRef = React.useRef(handler)\n handlerRef.current = handler\n const { table, entityKey, archetype } = match\n\n React.useEffect(\n () =>\n eventBus.on<DataChangedPayload>(DATA_CHANGED_EVENT, (payload) => {\n if (matchesDataChange({ table, entityKey, archetype }, payload)) handlerRef.current(payload)\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [table, entityKey, archetype, ...deps],\n )\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { getSupabaseClientOptional } from '../data/supabase'\n\n/**\n * createSafeDataProvider — the standard lazy provider resolver every plugin\n * repeated by hand. Returns a Proxy that, on first method call, resolves to the\n * Supabase-backed provider when a Supabase client is configured, otherwise the\n * mock provider. Resolution is deferred so importing a plugin never forces a\n * Supabase connection, and memoized so it only happens once.\n *\n * const provider = options?.dataProvider ?? createSafeDataProvider(\n * () => createSupabaseCrmProvider(providerOptions),\n * () => createMockCrmProvider(),\n * )\n */\nexport function createSafeDataProvider<T extends object>(\n makeSupabase: () => T,\n makeMock: () => T,\n): T {\n let resolved: T | null = null\n const get = (): T => {\n if (!resolved) {\n resolved = getSupabaseClientOptional() ? makeSupabase() : makeMock()\n }\n return resolved\n }\n return new Proxy({} as T, {\n get: (_target, prop) => (...args: any[]) => (get() as any)[prop](...args),\n })\n}\n","// ---------------------------------------------------------------------------\n// Reusable phone / country helpers (SDK-level — shared by any plugin that\n// collects a phone number: booking, CRM, forms, auth…). Provides the country\n// list (flag + dial code + national mask) and mask/unmask utilities.\n// ---------------------------------------------------------------------------\n\nexport interface CountryDef {\n /** ISO 3166-1 alpha-2 code, e.g. 'BR'. */\n iso2: string\n /** Localized-ish display name. */\n name: string\n /** International dial code including '+', e.g. '+55'. */\n dial: string\n /** Flag emoji (derived from iso2). */\n flag: string\n /** National number mask; '#' = one digit. e.g. '(##) #####-####'. */\n mask: string\n}\n\n/** Derive a flag emoji from an ISO2 code via regional indicator symbols. */\nfunction flagOf(iso2: string): string {\n return iso2\n .toUpperCase()\n .replace(/[^A-Z]/g, '')\n .split('')\n .map((c) => String.fromCodePoint(0x1f1e6 + c.charCodeAt(0) - 65))\n .join('')\n}\n\nconst RAW: Omit<CountryDef, 'flag'>[] = [\n { iso2: 'BR', name: 'Brasil', dial: '+55', mask: '(##) #####-####' },\n { iso2: 'US', name: 'Estados Unidos', dial: '+1', mask: '(###) ###-####' },\n { iso2: 'PT', name: 'Portugal', dial: '+351', mask: '### ### ###' },\n { iso2: 'AR', name: 'Argentina', dial: '+54', mask: '(##) ####-####' },\n { iso2: 'ES', name: 'Espanha', dial: '+34', mask: '### ### ###' },\n { iso2: 'MX', name: 'México', dial: '+52', mask: '## #### ####' },\n { iso2: 'GB', name: 'Reino Unido', dial: '+44', mask: '##### ######' },\n { iso2: 'FR', name: 'França', dial: '+33', mask: '# ## ## ## ##' },\n { iso2: 'DE', name: 'Alemanha', dial: '+49', mask: '#### #######' },\n { iso2: 'IT', name: 'Itália', dial: '+39', mask: '### #######' },\n]\n\nexport const COUNTRIES: CountryDef[] = RAW.map((c) => ({ ...c, flag: flagOf(c.iso2) }))\n\nexport const DEFAULT_COUNTRY = 'BR'\n\nconst BY_ISO = new Map(COUNTRIES.map((c) => [c.iso2, c]))\n\n/** Look up a country by ISO2 (falls back to the default). */\nexport function getCountry(iso2: string | undefined): CountryDef {\n return (iso2 && BY_ISO.get(iso2.toUpperCase())) || BY_ISO.get(DEFAULT_COUNTRY)!\n}\n\n/** Keep only digit characters. */\nexport function unmaskPhone(value: string): string {\n return (value || '').replace(/\\D/g, '')\n}\n\n/**\n * Apply a '#'-placeholder mask to a raw string, consuming its digits. Extra\n * digits beyond the mask are dropped; partial input masks progressively.\n *\n * maskPhone('11987654321', '(##) #####-####') -> '(11) 98765-4321'\n */\nexport function maskPhone(value: string, mask: string): string {\n const digits = unmaskPhone(value)\n let out = ''\n let di = 0\n for (const ch of mask) {\n if (di >= digits.length) break\n if (ch === '#') {\n out += digits[di++]\n } else {\n out += ch\n }\n }\n return out\n}\n\n/** Count how many digits a mask expects. */\nexport function maskDigitCount(mask: string): number {\n let n = 0\n for (const ch of mask) if (ch === '#') n++\n return n\n}\n","// ---------------------------------------------------------------------------\n// Postal code → address lookup (SDK-level — shared by any surface that collects\n// an address: storefront checkout, the SaaS address book, CRM, booking).\n//\n// Sits beside ./phone for the same reason: knowing that a Brazilian CEP is\n// eight digits, and that '01310100' means Avenida Paulista, is not a\n// storefront concern. It belongs wherever an address is typed.\n//\n// The lookup itself is behind an interface. ViaCEP is the default because it is\n// free, keyless and CORS-enabled, but it is a third party the merchant does not\n// control — so swapping it for an edge-function proxy (shared cache, no\n// third-party call from the shopper's browser) must be one line, not a rewrite.\n// ---------------------------------------------------------------------------\n\n/**\n * An address as a postal service knows it: everything except the parts only the\n * resident can supply (number, complement).\n *\n * Field names mirror ShippingAddressInput in @fayz-ai/shop so the value crosses\n * from lookup to checkout to the order with no translation step in between.\n */\nexport interface PostalAddress {\n postalCode: string\n street: string\n district: string\n city: string\n state: string\n country: string\n /** IBGE municipality code when the source provides one — useful for tax later. */\n cityCode?: string\n}\n\n/** Where a postal code is resolved. Implementations must not throw for a\n * well-formed code that simply does not exist — that is `null`, not an error. */\nexport interface PostalLookupProvider {\n lookup(postalCode: string): Promise<PostalAddress | null>\n}\n\n/** Keep only digits. */\nexport function normalizePostalCode(value: string): string {\n return (value || '').replace(/\\D/g, '')\n}\n\n/** '01310100' | '01310-100' -> '01310-100'. Partial input formats progressively. */\nexport function formatPostalCode(value: string): string {\n const digits = normalizePostalCode(value).slice(0, 8)\n return digits.length > 5 ? `${digits.slice(0, 5)}-${digits.slice(5)}` : digits\n}\n\n/** A Brazilian CEP is exactly eight digits. */\nexport function isValidPostalCode(value: string): boolean {\n return normalizePostalCode(value).length === 8\n}\n\n// ---------------------------------------------------------------------------\n// Cache\n//\n// A CEP maps to the same street for years, so the second lookup of one should\n// never leave the browser. This also keeps a busy storefront well clear of\n// ViaCEP's per-IP rate limit. localStorage when there is a window, an in-memory\n// Map otherwise (SSR, tests, node) — never a hard failure over a cache miss.\n// ---------------------------------------------------------------------------\n\nconst CACHE_KEY = 'fayz.postal.cache.v1'\nconst memoryCache = new Map<string, PostalAddress>()\n\nfunction readCache(code: string): PostalAddress | undefined {\n const hit = memoryCache.get(code)\n if (hit) return hit\n try {\n const raw = globalThis.localStorage?.getItem(CACHE_KEY)\n if (!raw) return undefined\n const all = JSON.parse(raw) as Record<string, PostalAddress>\n const stored = all[code]\n if (stored) memoryCache.set(code, stored)\n return stored\n } catch {\n return undefined\n }\n}\n\nfunction writeCache(code: string, address: PostalAddress): void {\n memoryCache.set(code, address)\n try {\n const store = globalThis.localStorage\n if (!store) return\n const raw = store.getItem(CACHE_KEY)\n const all = raw ? (JSON.parse(raw) as Record<string, PostalAddress>) : {}\n all[code] = address\n store.setItem(CACHE_KEY, JSON.stringify(all))\n } catch {\n /* quota or private mode — the in-memory copy still stands for this session */\n }\n}\n\n/** Drop the cache. Exposed for tests and for a \"wrong address?\" escape hatch. */\nexport function clearPostalCache(): void {\n memoryCache.clear()\n try {\n globalThis.localStorage?.removeItem(CACHE_KEY)\n } catch {\n /* ignore */\n }\n}\n\n// ---------------------------------------------------------------------------\n// ViaCEP\n// ---------------------------------------------------------------------------\n\ninterface ViaCepResponse {\n cep?: string\n logradouro?: string\n bairro?: string\n localidade?: string\n uf?: string\n ibge?: string\n erro?: boolean | string\n}\n\n/**\n * ViaCEP (https://viacep.com.br). Free, no key, CORS-enabled.\n *\n * The trap: an unknown CEP does NOT come back as 404. ViaCEP answers HTTP 200\n * with `{\"erro\": true}` (and, on some deploys, the string \"true\"), so checking\n * response.ok alone yields an address of empty strings that silently overwrites\n * whatever the shopper had typed. Both shapes are treated as \"not found\".\n */\nexport function createViaCepProvider(options?: { fetcher?: typeof fetch }): PostalLookupProvider {\n const fetcher = options?.fetcher ?? globalThis.fetch\n return {\n async lookup(postalCode: string): Promise<PostalAddress | null> {\n const code = normalizePostalCode(postalCode)\n if (code.length !== 8) return null\n\n const response = await fetcher(`https://viacep.com.br/ws/${code}/json/`)\n if (!response.ok) throw new Error(`Consulta de CEP falhou (${response.status})`)\n\n const data = (await response.json()) as ViaCepResponse\n if (data.erro === true || data.erro === 'true' || !data.localidade) return null\n\n return {\n postalCode: code,\n street: data.logradouro ?? '',\n district: data.bairro ?? '',\n city: data.localidade,\n state: (data.uf ?? '').toUpperCase(),\n country: 'BR',\n cityCode: data.ibge || undefined,\n }\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-level resolver — same shape as setShopTenantResolver /\n// setShopAccessTokenResolver, so an app overrides the source once at boot\n// instead of threading a provider through every component that needs a CEP.\n// ---------------------------------------------------------------------------\n\nlet _provider: PostalLookupProvider | null = null\n\nexport function setPostalLookupProvider(provider: PostalLookupProvider | null): void {\n _provider = provider\n}\n\nexport function getPostalLookupProvider(): PostalLookupProvider {\n if (!_provider) _provider = createViaCepProvider()\n return _provider\n}\n\n/**\n * Resolve a postal code to an address, through the cache.\n *\n * Returns null for a code that is malformed or does not exist; throws only when\n * the lookup itself failed (offline, provider down), so a caller can tell\n * \"no such CEP\" from \"we could not check right now\" and say the right thing.\n */\nexport async function lookupPostalCode(postalCode: string): Promise<PostalAddress | null> {\n const code = normalizePostalCode(postalCode)\n if (code.length !== 8) return null\n\n const cached = readCache(code)\n if (cached) return cached\n\n const address = await getPostalLookupProvider().lookup(code)\n if (address) writeCache(code, address)\n return address\n}\n","import { useEffect } from 'react'\n\n// ---------------------------------------------------------------------------\n// Generic, domain-agnostic SEO / structured-data head manager (SDK-level).\n// ANY surface (blog, booking, reviews, product, landing) uses `useSeo` to set\n// <title>, meta description, canonical, OpenGraph/Twitter cards and JSON-LD per\n// route. Domain plugins build their own schema.org objects (BlogPosting,\n// Product, Event…) and pass them via `jsonLd` — the mechanics live here once.\n//\n// NOTE: a SPA still benefits from SSR/prerendering for the strongest SEO — that\n// is the real upgrade; this covers everything achievable client-side.\n// ---------------------------------------------------------------------------\n\nconst MANAGED = 'data-fayz-seo'\n\nexport interface SeoConfig {\n title: string\n description?: string\n canonical?: string\n image?: string\n type?: 'website' | 'article' | (string & {})\n siteName?: string\n /** One or more JSON-LD objects injected as <script type=\"application/ld+json\">. */\n jsonLd?: Array<Record<string, unknown>>\n}\n\n/** Current page origin (empty during SSR). */\nexport function seoOrigin(): string {\n return typeof window !== 'undefined' ? window.location.origin : ''\n}\n\n/** Build an absolute URL from a path, using the current origin. */\nexport function absoluteUrl(path: string): string {\n return `${seoOrigin()}${path.startsWith('/') ? path : `/${path}`}`\n}\n\nfunction upsertMeta(attr: 'name' | 'property', key: string, content: string) {\n if (!content) return\n let el = document.head.querySelector<HTMLMetaElement>(`meta[${attr}=\"${key}\"]`)\n if (!el) {\n el = document.createElement('meta')\n el.setAttribute(attr, key)\n el.setAttribute(MANAGED, '')\n document.head.appendChild(el)\n }\n el.setAttribute('content', content)\n}\n\nfunction upsertLink(rel: string, href: string) {\n if (!href) return\n let el = document.head.querySelector<HTMLLinkElement>(`link[rel=\"${rel}\"]`)\n if (!el) {\n el = document.createElement('link')\n el.setAttribute('rel', rel)\n el.setAttribute(MANAGED, '')\n document.head.appendChild(el)\n }\n el.setAttribute('href', href)\n}\n\nfunction clearManaged() {\n document.head.querySelectorAll(`[${MANAGED}]`).forEach((el) => el.remove())\n}\n\n/** Imperatively apply SEO tags (used by useSeo; exported for non-React callers). */\nexport function applySeo(config: SeoConfig): void {\n if (typeof document === 'undefined') return\n clearManaged()\n document.title = config.title\n upsertMeta('name', 'description', config.description ?? '')\n if (config.canonical) upsertLink('canonical', config.canonical)\n\n upsertMeta('property', 'og:title', config.title)\n upsertMeta('property', 'og:description', config.description ?? '')\n upsertMeta('property', 'og:type', config.type === 'article' ? 'article' : 'website')\n if (config.canonical) upsertMeta('property', 'og:url', config.canonical)\n if (config.image) upsertMeta('property', 'og:image', config.image)\n if (config.siteName) upsertMeta('property', 'og:site_name', config.siteName)\n\n upsertMeta('name', 'twitter:card', config.image ? 'summary_large_image' : 'summary')\n upsertMeta('name', 'twitter:title', config.title)\n upsertMeta('name', 'twitter:description', config.description ?? '')\n if (config.image) upsertMeta('name', 'twitter:image', config.image)\n\n for (const obj of config.jsonLd ?? []) {\n const script = document.createElement('script')\n script.type = 'application/ld+json'\n script.setAttribute(MANAGED, '')\n script.text = JSON.stringify(obj)\n document.head.appendChild(script)\n }\n}\n\n/** Apply SEO head tags for the current route; cleans up on unmount. */\nexport function useSeo(config: SeoConfig): void {\n const key = JSON.stringify(config)\n useEffect(() => {\n applySeo(config)\n return () => clearManaged()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key])\n}\n\n// --- Generic schema.org builders (reusable across plugins) -----------------\n\nexport interface BreadcrumbItem {\n name: string\n url: string\n}\n\n/** schema.org BreadcrumbList from an ordered list of crumbs. */\nexport function breadcrumbJsonLd(items: BreadcrumbItem[]): Record<string, unknown> {\n return {\n '@context': 'https://schema.org',\n '@type': 'BreadcrumbList',\n itemListElement: items.map((c, i) => ({\n '@type': 'ListItem',\n position: i + 1,\n name: c.name,\n item: c.url,\n })),\n }\n}\n\n/** schema.org Organization publisher block. */\nexport function organizationJsonLd(name: string, extra?: Record<string, unknown>): Record<string, unknown> {\n return { '@type': 'Organization', name, ...extra }\n}\n","import { getCurrentLocale } from '../i18n'\n\n// Currency inferred from the active locale unless the app sets one explicitly\n// via createSaasApp({ locale: { currency: 'BRL' } }).\nconst CURRENCY_BY_LOCALE: Record<string, string> = {\n 'pt-BR': 'BRL',\n 'pt-PT': 'EUR',\n en: 'USD',\n 'en-US': 'USD',\n 'en-GB': 'GBP',\n es: 'EUR',\n}\n\nlet _defaultCurrency: string | null = null\n\nexport function setDefaultCurrency(code: string | undefined): void {\n _defaultCurrency = code ?? null\n}\n\nexport function getActiveLocale(): string {\n try {\n return getCurrentLocale() || 'en'\n } catch {\n return 'en'\n }\n}\n\nexport function getDefaultCurrency(): string {\n if (_defaultCurrency) return _defaultCurrency\n return CURRENCY_BY_LOCALE[getActiveLocale()] ?? 'USD'\n}\n\nexport function formatCurrency(value: unknown, currency?: string): string {\n const num = typeof value === 'number' ? value : parseFloat(String(value))\n if (isNaN(num)) return String(value ?? '')\n return new Intl.NumberFormat(getActiveLocale(), {\n style: 'currency',\n currency: currency ?? getDefaultCurrency(),\n }).format(num)\n}\n\nexport function formatDate(value: unknown): string {\n if (!value) return ''\n try {\n return new Intl.DateTimeFormat(getActiveLocale(), { dateStyle: 'medium' }).format(new Date(value as string))\n } catch {\n return String(value)\n }\n}\n\nexport function formatDateTime(value: unknown): string {\n if (!value) return ''\n try {\n return new Intl.DateTimeFormat(getActiveLocale(), { dateStyle: 'medium', timeStyle: 'short' }).format(new Date(value as string))\n } catch {\n return String(value)\n }\n}\n","/** Column descriptor for generic CSV export */\nexport interface CSVColumn {\n key: string\n label: string\n format?: (value: any, row: Record<string, any>) => string\n}\n\nexport function escapeCSVField(value: unknown): string {\n if (value == null) return ''\n const str = String(value)\n if (str.includes(',') || str.includes('\"') || str.includes('\\n')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`\n }\n return str\n}\n\n/** Build a CSV string from columns + rows. Each cell runs through `column.format` if provided, then escaping. */\nexport function buildCSV(\n columns: CSVColumn[],\n rows: Record<string, any>[],\n): string {\n const header = columns.map((c) => escapeCSVField(c.label)).join(',')\n const body = rows.map((row) =>\n columns\n .map((col) => {\n const raw = row[col.key]\n const formatted = col.format ? col.format(raw, row) : raw\n return escapeCSVField(formatted)\n })\n .join(','),\n )\n return [header, ...body].join('\\n')\n}\n\n/** Trigger a CSV file download in the browser. */\nexport function downloadCSV(csv: string, filename: string): void {\n const bom = '\\uFEFF'\n const blob = new Blob([bom + csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename.endsWith('.csv') ? filename : `${filename}.csv`\n a.click()\n URL.revokeObjectURL(url)\n}\n\n/** Convenience: build + download in one call. */\nexport function exportCSV(\n columns: CSVColumn[],\n rows: Record<string, any>[],\n filename: string,\n): void {\n downloadCSV(buildCSV(columns, rows), filename)\n}\n","// Text folding + ranking for global search. The same folding must exist in SQL\n// as public.fayz_norm() (@fayz-ai/db 018_global_search.sql), or server and\n// client disagree on what matched.\n\nconst COMBINING_MARKS = /[\\u0300-\\u036f]/g\n\n/** Strip diacritics, lowercase, collapse non-alphanumerics to single spaces. */\nexport function foldText(value: unknown): string {\n if (typeof value !== 'string' || value === '') return ''\n return value\n .normalize('NFD')\n .replace(COMBINING_MARKS, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, ' ')\n .trim()\n}\n\n/** Fold, keeping each folded char's index in the source — used for highlighting. */\nexport function foldWithMap(value: string): { folded: string; map: number[] } {\n const out: string[] = []\n const map: number[] = []\n let pendingSpace = false\n for (let i = 0; i < value.length; i++) {\n const ch = value[i]!\n const folded = ch.normalize('NFD').replace(COMBINING_MARKS, '').toLowerCase()\n for (const f of folded) {\n const alnum = (f >= 'a' && f <= 'z') || (f >= '0' && f <= '9')\n if (!alnum) { pendingSpace = out.length > 0; continue }\n if (pendingSpace) { out.push(' '); map.push(i); pendingSpace = false }\n out.push(f)\n map.push(i)\n }\n }\n return { folded: out.join(''), map }\n}\n\n/** Digits only — phone numbers, CPF/CNPJ, SKUs typed with separators. */\nexport function digitsOf(value: unknown): string {\n return typeof value === 'string' ? value.replace(/\\D+/g, '') : ''\n}\n\nexport interface NormalizedQuery {\n /** What the user typed, untouched. */\n raw: string\n /** Folded form of the whole query — the \"phrase\". */\n folded: string\n /** Folded query split on whitespace. */\n tokens: string[]\n /** Digits the user typed, when they typed enough of them to mean a number. */\n digits: string\n /** The longest token — the most selective thing to send to a `%LIKE%` backend. */\n anchor: string\n}\n\n/** Below this a phone/document lookup is indistinguishable from noise. */\nconst MIN_DIGIT_QUERY = 4\n\nexport function normalizeQuery(raw: string): NormalizedQuery {\n const folded = foldText(raw)\n const tokens = folded ? folded.split(' ').filter(Boolean) : []\n const digits = raw.replace(/\\D+/g, '')\n let anchor = ''\n for (const token of tokens) if (token.length > anchor.length) anchor = token\n return {\n raw,\n folded,\n tokens,\n digits: digits.length >= MIN_DIGIT_QUERY ? digits : '',\n anchor,\n }\n}\n\n// Fuzzy similarity — Sørensen–Dice over bigrams. Same family as pg_trgm's\n// similarity(), so both sides rank near-misses the same way.\n\nfunction bigrams(value: string): string[] {\n if (value.length < 2) return value ? [value] : []\n const out: string[] = []\n for (let i = 0; i < value.length - 1; i++) out.push(value.slice(i, i + 2))\n return out\n}\n\n/** 0 (nothing in common) … 1 (identical). Both inputs must already be folded. */\nexport function similarity(a: string, b: string): number {\n if (!a || !b) return 0\n if (a === b) return 1\n const left = bigrams(a)\n const right = bigrams(b)\n if (left.length === 0 || right.length === 0) return 0\n const pool = new Map<string, number>()\n for (const g of left) pool.set(g, (pool.get(g) ?? 0) + 1)\n let shared = 0\n for (const g of right) {\n const count = pool.get(g)\n if (count) { shared++; pool.set(g, count - 1) }\n }\n return (2 * shared) / (left.length + right.length)\n}\n\n/** Best similarity between the query token and any single word of the text. */\nfunction wordSimilarity(text: string, token: string): number {\n let best = similarity(text, token)\n for (const word of text.split(' ')) {\n if (!word) continue\n const s = similarity(word, token)\n if (s > best) best = s\n }\n return best\n}\n\n// ---------------------------------------------------------------------------\n// Ranking\n// ---------------------------------------------------------------------------\n\nexport interface RankCandidate {\n /** Folded display name — what the user is most likely aiming at. */\n title: string\n /** Folded concatenation of every searchable value on the record. */\n haystack: string\n /** Digits of every phone/document-ish value on the record. */\n digits?: string\n}\n\n/** A fuzzy word has to be at least this close before it counts as a match. */\nconst FUZZY_FLOOR = 0.62\n\n/** Score a candidate 0…1. Zero means \"not a match\" — the score is also the filter. */\nexport function scoreCandidate(query: NormalizedQuery, candidate: RankCandidate): number {\n const { folded, tokens } = query\n if (!folded || tokens.length === 0) return 0\n const title = candidate.title\n const haystack = candidate.haystack || title\n\n // Phrase: the query as one string.\n let phrase = 0\n if (title === folded) phrase = 1\n else if (title.startsWith(folded)) phrase = 0.94\n else if (title.includes(' ' + folded)) phrase = 0.88\n else if (title.includes(folded)) phrase = 0.76\n else if (haystack.startsWith(folded) || haystack.includes(' ' + folded)) phrase = 0.7\n else if (haystack.includes(folded)) phrase = 0.62\n\n // Tokens: every word must land somewhere (\"maria silva\" → \"Maria da Silva\").\n let tokenTotal = 0\n let fuzzyUsed = false\n for (const token of tokens) {\n let best = 0\n if (title.startsWith(token)) best = 0.95\n else if (title.includes(' ' + token)) best = 0.85\n else if (title.includes(token)) best = 0.7\n else if (haystack.startsWith(token) || haystack.includes(' ' + token)) best = 0.6\n else if (haystack.includes(token)) best = 0.5\n else {\n const sim = wordSimilarity(title, token)\n if (sim >= FUZZY_FLOOR) { best = 0.45 * sim; fuzzyUsed = true }\n }\n if (best === 0) return phrase > 0 ? phrase : 0\n tokenTotal += best\n }\n let tokenScore = tokenTotal / tokens.length\n // A typo-only match must never outrank a literal one.\n if (fuzzyUsed) tokenScore *= 0.8\n\n let score = Math.max(phrase, tokenScore)\n\n // Digits: a phone number has no words to match.\n if (query.digits && candidate.digits && candidate.digits.includes(query.digits)) {\n score = Math.max(score, 0.72 + Math.min(0.2, query.digits.length / 50))\n }\n\n if (score === 0) return 0\n\n // Tie-break: shorter title wins (\"Ana\" over \"Ana Beatriz\" for \"ana\").\n const brevity = 1 / (1 + Math.max(0, title.length - folded.length) / 40)\n return score * 0.97 + brevity * 0.03\n}\n\n/** Ranges in the ORIGINAL text covered by the query, merged and sorted. */\nexport function highlightRanges(text: string, query: NormalizedQuery): Array<[number, number]> {\n if (!text || query.tokens.length === 0) return []\n const { folded, map } = foldWithMap(text)\n if (!folded) return []\n const spans: Array<[number, number]> = []\n const needles = query.tokens.length > 1 ? [query.folded, ...query.tokens] : [query.folded]\n for (const needle of needles) {\n if (!needle) continue\n let from = 0\n for (;;) {\n const at = folded.indexOf(needle, from)\n if (at === -1) break\n const start = map[at]\n const endChar = map[at + needle.length - 1]\n if (start !== undefined && endChar !== undefined) spans.push([start, endChar + 1])\n from = at + needle.length\n }\n }\n if (spans.length === 0) return []\n spans.sort((a, b) => a[0] - b[0])\n const merged: Array<[number, number]> = [spans[0]!]\n for (const span of spans.slice(1)) {\n const last = merged[merged.length - 1]!\n if (span[0] <= last[1]) last[1] = Math.max(last[1], span[1])\n else merged.push(span)\n }\n return merged\n}\n","import type { EntityDef } from '../types/crud'\nimport { resolveDataProvider } from '../data/resolve'\nimport { getSupabaseClientOptional } from '../data/supabase'\nimport { getActiveTenantId } from '../tenant'\nimport {\n digitsOf,\n foldText,\n normalizeQuery,\n scoreCandidate,\n type NormalizedQuery,\n} from './text'\nimport type {\n GlobalSearchResult,\n SearchGroup,\n SearchHit,\n SearchOptions,\n SearchPath,\n SearchTarget,\n} from './types'\n\n// Global search, two paths, one ranking:\n// ① INDEX — one `public.fayz_global_search` RPC (trigram-indexed, ~6ms).\n// ② SCAN — parallel ilike per entity. Fallback for pools without the\n// migration, for mock data, and whenever ① errors.\n// Both feed the same scorer, so the path changes latency, never the order.\n\n/** Nothing shorter is worth a round-trip. */\nexport const MIN_QUERY_LENGTH = 2\n\nconst DEFAULT_LIMIT = 30\nconst DEFAULT_PER_TARGET = 5\n/** Wide enough that a typical app fits in one wave — a second wave waits on\n * the slowest table of the first. */\nconst SCAN_CONCURRENCY = 16\n/** A single slow table must not hold the box hostage. */\nconst TARGET_TIMEOUT_MS = 3000\nconst CACHE_TTL_MS = 30_000\nconst CACHE_MAX_ENTRIES = 40\n\nconst RPC_NAME = 'fayz_global_search'\n\n/** null = never asked. Set false once Postgres says the RPC is missing. */\nlet indexAvailable: boolean | null = null\n\n/** Test seam / manual override. */\nexport function setSearchIndexAvailable(value: boolean | null): void {\n indexAvailable = value\n}\n\nexport function isSearchIndexAvailable(): boolean | null {\n return indexAvailable\n}\n\n// Rows come back camelCase, EntityDefs declare both spellings — look up either.\n\nfunction camelOf(key: string): string {\n return key.replace(/_([a-z0-9])/g, (_, c: string) => c.toUpperCase())\n}\n\nfunction snakeOf(key: string): string {\n return key.replace(/[A-Z]/g, (c) => '_' + c.toLowerCase())\n}\n\nfunction readField(row: Record<string, unknown>, key: string): unknown {\n if (key in row) return row[key]\n const camel = camelOf(key)\n if (camel in row) return row[camel]\n const snake = snakeOf(key)\n if (snake in row) return row[snake]\n return undefined\n}\n\nfunction asText(value: unknown): string {\n if (typeof value === 'string') return value\n if (typeof value === 'number') return String(value)\n if (Array.isArray(value)) return value.filter((v) => typeof v === 'string').join(' ')\n return ''\n}\n\n/** Field keys worth matching against, in declaration order. */\nfunction searchableKeys(entity: EntityDef): string[] {\n const declared = entity.data?.searchColumns ?? entity.fields.filter((f) => f.searchable).map((f) => f.key)\n const keys = [...declared]\n const display = entity.displayField ?? 'name'\n if (!keys.includes(display)) keys.unshift(display)\n const subtitle = entity.subtitleField\n if (subtitle && !keys.includes(subtitle)) keys.push(subtitle)\n return keys\n}\n\n/** Keys whose value is a number the user might type digits of. */\nconst DIGIT_FIELD_TYPES = new Set(['phone', 'number'])\n\nfunction digitKeys(entity: EntityDef): string[] {\n const keys = entity.fields\n .filter((f) => DIGIT_FIELD_TYPES.has(f.type) || /phone|document|cpf|cnpj|zip|postal|sku|code|reference/i.test(f.key))\n .map((f) => f.key)\n for (const extra of ['phone', 'document_number', 'sku', 'reference_number', 'postal_code']) {\n if (!keys.includes(extra)) keys.push(extra)\n }\n return keys\n}\n\nfunction titleOf(entity: EntityDef, row: Record<string, unknown>): string {\n const display = entity.displayField ?? 'name'\n const primary = asText(readField(row, display))\n if (primary) return primary\n for (const field of entity.fields) {\n if (field.type === 'text' || field.type === 'email') {\n const value = asText(readField(row, field.key))\n if (value) return value\n }\n }\n return asText(row.id) || '—'\n}\n\nfunction subtitleOf(entity: EntityDef, row: Record<string, unknown>, title: string): string | undefined {\n // A subtitle that repeats the title is noise.\n const distinct = (value: string): string | undefined => {\n if (!value || foldText(value) === foldText(title)) return undefined\n return value.length > 90 ? value.slice(0, 89) + '…' : value\n }\n const declared = entity.subtitleField\n if (declared) {\n const value = distinct(asText(readField(row, declared)))\n if (value) return value\n }\n for (const key of ['email', 'phone', 'sku', 'reference_number', 'document_number', 'description']) {\n const value = distinct(asText(readField(row, key)))\n if (value) return value\n }\n return undefined\n}\n\n// ---------------------------------------------------------------------------\n// Result assembly\n// ---------------------------------------------------------------------------\n\nfunction hitFromRow(\n target: SearchTarget,\n row: Record<string, unknown>,\n query: NormalizedQuery,\n): SearchHit | null {\n const id = asText(row.id)\n if (!id) return null\n const entity = target.entity\n const title = titleOf(entity, row)\n const parts: string[] = [title]\n for (const key of searchableKeys(entity)) {\n const value = asText(readField(row, key))\n if (value) parts.push(value)\n }\n let digits = ''\n for (const key of digitKeys(entity)) {\n const value = readField(row, key)\n if (typeof value === 'string' || typeof value === 'number') digits += digitsOf(String(value))\n }\n const score = scoreCandidate(query, {\n title: foldText(title),\n haystack: foldText(parts.join(' ')),\n digits,\n })\n if (score === 0) return null\n return {\n uid: `${target.key}:${id}`,\n id,\n key: target.key,\n group: target.label,\n icon: target.icon ?? entity.icon,\n title,\n subtitle: subtitleOf(entity, row, title),\n score: score * (target.boost ?? 1),\n archetype: entity.data?.archetype,\n archetypeKind: entity.data?.archetypeKind,\n table: entity.data?.table,\n record: row,\n }\n}\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\n/** Identity of the RECORD, not of the target that found it — several targets\n * cover the same rows (\"Fornecedores\" and \"Suppliers\" are both people). */\nfunction recordIdentity(hit: SearchHit): string {\n if (UUID.test(hit.id)) return hit.id\n return `${hit.table ?? hit.key}#${hit.id}`\n}\n\nfunction assemble(\n query: string,\n hits: SearchHit[],\n targets: SearchTarget[],\n opts: { via: SearchPath; failed: string[]; elapsedMs: number; perTarget: number; limit: number; partial?: boolean },\n): GlobalSearchResult {\n const seen = new Set<string>()\n const unique: SearchHit[] = []\n for (const hit of hits.slice().sort((a, b) => b.score - a.score || a.title.localeCompare(b.title))) {\n const identity = recordIdentity(hit)\n if (seen.has(identity)) continue\n seen.add(identity)\n unique.push(hit)\n }\n\n // Cap per target before the global cap, so one populous entity can't crowd out the rest.\n const byKey = new Map<string, SearchHit[]>()\n const kept: SearchHit[] = []\n const capped = new Set<string>()\n for (const hit of unique) {\n const bucket = byKey.get(hit.key) ?? []\n if (bucket.length >= opts.perTarget) { capped.add(hit.key); continue }\n bucket.push(hit)\n byKey.set(hit.key, bucket)\n kept.push(hit)\n }\n const limited = kept.slice(0, opts.limit)\n\n const order = new Map(targets.map((t, i) => [t.key, i]))\n const groups: SearchGroup[] = []\n for (const hit of limited) {\n let group = groups.find((g) => g.key === hit.key)\n if (!group) {\n group = { key: hit.key, label: hit.group, icon: hit.icon, hits: [], hasMore: capped.has(hit.key) }\n groups.push(group)\n }\n group.hits.push(hit)\n }\n // Groups follow their best hit; ties fall back to target order.\n groups.sort((a, b) => (b.hits[0]?.score ?? 0) - (a.hits[0]?.score ?? 0)\n || (order.get(a.key) ?? 99) - (order.get(b.key) ?? 99))\n\n return {\n query,\n hits: limited,\n groups,\n via: opts.via,\n failed: opts.failed,\n elapsedMs: opts.elapsedMs,\n partial: opts.partial ?? false,\n }\n}\n\n// Cache: exact hits plus prefix reuse. Substring matching is monotone, so an\n// untruncated result for \"bigod\" is a sound superset for \"bigodi\" and can be\n// re-scored locally while the real request flies.\n\ninterface CacheEntry {\n scope: string\n folded: string\n at: number\n complete: boolean\n hits: SearchHit[]\n}\n\nconst cache: CacheEntry[] = []\n\nfunction scopeKey(targets: SearchTarget[]): string {\n return `${getActiveTenantId() ?? '_'}|${targets.map((t) => t.key).sort().join(',')}`\n}\n\nfunction cacheGet(scope: string, folded: string): CacheEntry | undefined {\n const now = Date.now()\n return cache.find((e) => e.scope === scope && e.folded === folded && now - e.at < CACHE_TTL_MS)\n}\n\nfunction cachePrefix(scope: string, folded: string): CacheEntry | undefined {\n const now = Date.now()\n let best: CacheEntry | undefined\n for (const entry of cache) {\n if (entry.scope !== scope || !entry.complete) continue\n if (now - entry.at >= CACHE_TTL_MS) continue\n if (!folded.startsWith(entry.folded)) continue\n if (!best || entry.folded.length > best.folded.length) best = entry\n }\n return best\n}\n\nfunction cacheSet(entry: CacheEntry): void {\n const at = cache.findIndex((e) => e.scope === entry.scope && e.folded === entry.folded)\n if (at >= 0) cache.splice(at, 1)\n cache.unshift(entry)\n if (cache.length > CACHE_MAX_ENTRIES) cache.length = CACHE_MAX_ENTRIES\n}\n\n/** Drop every cached answer. Call on tenant switch and after writes. */\nexport function clearSearchCache(): void {\n cache.length = 0\n}\n\n// Path ① — the server index\n\ninterface IndexRow {\n entity_key: string\n record_id: string\n title: string | null\n subtitle: string | null\n score: number | null\n}\n\nfunction isMissingFunction(error: { code?: string; message?: string } | null): boolean {\n if (!error) return false\n // PGRST202: PostgREST could not find the function in its schema cache.\n if (error.code === 'PGRST202') return true\n const message = (error.message ?? '').toLowerCase()\n return message.includes(RPC_NAME) && (message.includes('does not exist') || message.includes('not find'))\n}\n\nasync function searchViaIndex(\n query: NormalizedQuery,\n targets: SearchTarget[],\n perTarget: number,\n limit: number,\n): Promise<{ hits: SearchHit[]; ok: boolean }> {\n const client = getSupabaseClientOptional() as {\n rpc: (fn: string, args: Record<string, unknown>) => Promise<{ data: unknown; error: { code?: string; message?: string } | null }>\n } | null\n const tenantId = getActiveTenantId()\n if (!client || !tenantId) return { hits: [], ok: false }\n\n const byKey = new Map(targets.map((t) => [t.key, t]))\n const { data, error } = await client.rpc(RPC_NAME, {\n p_query: query.raw,\n p_tenant_id: tenantId,\n p_entity_keys: targets.map((t) => t.key),\n p_per_source: perTarget * 3,\n p_limit: limit * 3,\n })\n\n if (error) {\n if (isMissingFunction(error)) {\n indexAvailable = false\n return { hits: [], ok: false }\n }\n throw error\n }\n indexAvailable = true\n\n const rows = Array.isArray(data) ? (data as IndexRow[]) : []\n const hits: SearchHit[] = []\n for (const row of rows) {\n const target = byKey.get(row.entity_key)\n if (!target || !row.record_id) continue\n const title = row.title ?? ''\n // Re-score locally so both paths obey one ordering law.\n const local = scoreCandidate(query, {\n title: foldText(title),\n haystack: foldText(`${title} ${row.subtitle ?? ''}`),\n digits: digitsOf(row.subtitle ?? '') + digitsOf(title),\n })\n // The server matched on columns the client never sees (notes, tags). Keep\n // those, ranked under everything the local scorer can explain.\n const score = local > 0 ? local : Math.min(0.55, (row.score ?? 0.4))\n hits.push({\n uid: `${target.key}:${row.record_id}`,\n id: row.record_id,\n key: target.key,\n group: target.label,\n icon: target.icon ?? target.entity.icon,\n title: title || '—',\n subtitle: row.subtitle ?? undefined,\n score: score * (target.boost ?? 1),\n archetype: target.entity.data?.archetype,\n archetypeKind: target.entity.data?.archetypeKind,\n table: target.entity.data?.table,\n })\n }\n return { hits, ok: true }\n}\n\n// Path ② — bounded per-entity scan\n\nasync function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error('search target timed out')), ms)\n }),\n ])\n } finally {\n if (timer) clearTimeout(timer)\n }\n}\n\nasync function mapLimited<T, R>(\n items: T[],\n limit: number,\n fn: (item: T) => Promise<R>,\n): Promise<Array<{ ok: true; value: R } | { ok: false; item: T }>> {\n const results: Array<{ ok: true; value: R } | { ok: false; item: T }> = new Array(items.length)\n let cursor = 0\n const workers = Array.from({ length: Math.min(limit, items.length) }, async () => {\n for (;;) {\n const index = cursor++\n if (index >= items.length) return\n const item = items[index]!\n try {\n results[index] = { ok: true, value: await fn(item) }\n } catch {\n results[index] = { ok: false, item }\n }\n }\n })\n await Promise.all(workers)\n return results\n}\n\nasync function searchViaScan(\n query: NormalizedQuery,\n targets: SearchTarget[],\n perTarget: number,\n onProgress?: (hits: SearchHit[]) => void,\n): Promise<{ hits: SearchHit[]; failed: string[] }> {\n // Two rounds, same shape as the SQL function. Round 1 sends the whole phrase\n // (selective, answers the common case). Round 2 sends the longest token —\n // the only form that finds \"Maria da Silva\" for \"maria silva\" — and runs\n // only if round 1 found nothing anywhere: an unindexed `%cli%` is expensive,\n // and firing it per miss made multi-word queries 9.8s instead of 0.8s.\n const multiWord = query.tokens.length > 1\n const phrase = query.folded\n const token = query.anchor.length >= MIN_QUERY_LENGTH ? query.anchor : phrase\n const pageSize = Math.min(perTarget * 3, 24)\n const widePageSize = Math.min(perTarget * 6, 40)\n\n const searchable = targets.filter((t) => searchableKeys(t.entity).length > 0)\n\n // Emit as each target lands, so the box fills instead of spinning until the\n // slowest entity reports.\n const running: SearchHit[] = []\n\n const round = (search: string, size: number) =>\n mapLimited(searchable, SCAN_CONCURRENCY, async (target) => {\n const provider = resolveDataProvider(target.entity as EntityDef<{ id: string }>, target.mockData)\n // No count: the aggregate costs more than the rows, times every entity.\n const result = await withTimeout(\n provider.list({ search, pageSize: size, countMode: 'none' }),\n TARGET_TIMEOUT_MS,\n )\n const rows = result.data as unknown as Array<Record<string, unknown>>\n // Post-scoring also guards providers that ignore `search` entirely.\n const hits = rows.map((row) => hitFromRow(target, row, query)).filter((h): h is SearchHit => h !== null)\n if (hits.length && onProgress) {\n running.push(...hits)\n onProgress(running.slice())\n }\n return { target, hits }\n })\n\n const collect = (settled: Awaited<ReturnType<typeof round>>) => {\n const hits: SearchHit[] = []\n const failed: string[] = []\n for (const outcome of settled) {\n if (outcome.ok) hits.push(...outcome.value.hits)\n else failed.push(outcome.item.key)\n }\n return { hits, failed }\n }\n\n const first = collect(await round(phrase, pageSize))\n if (first.hits.length > 0 || !multiWord || token === phrase) return first\n\n const second = collect(await round(token, widePageSize))\n return { hits: second.hits, failed: [...new Set([...first.failed, ...second.failed])] }\n}\n\n/** Search every target at once. Never throws for data reasons — a target that\n * errors lands in `failed` and the rest of the answer still ships. */\nexport async function searchEverything(\n rawQuery: string,\n options: SearchOptions,\n): Promise<GlobalSearchResult> {\n const started = Date.now()\n const query = normalizeQuery(rawQuery)\n const targets = options.targets\n const limit = options.limit ?? DEFAULT_LIMIT\n const perTarget = options.perTarget ?? DEFAULT_PER_TARGET\n const empty = (via: SearchPath): GlobalSearchResult =>\n assemble(rawQuery, [], targets, { via, failed: [], elapsedMs: Date.now() - started, perTarget, limit })\n\n if (query.folded.length < MIN_QUERY_LENGTH || targets.length === 0) return empty('cache')\n\n const scope = scopeKey(targets)\n const exact = cacheGet(scope, query.folded)\n if (exact) {\n return assemble(rawQuery, exact.hits, targets, {\n via: 'cache', failed: [], elapsedMs: Date.now() - started, perTarget, limit,\n })\n }\n\n // Paint from the widest complete prefix result while the real one flies.\n if (options.onPartial) {\n const prefix = cachePrefix(scope, query.folded)\n if (prefix) {\n const rescored = prefix.hits\n .map((hit) => {\n const score = scoreCandidate(query, {\n title: foldText(hit.title),\n haystack: foldText(`${hit.title} ${hit.subtitle ?? ''}`),\n digits: digitsOf(hit.subtitle ?? ''),\n })\n return score > 0 ? { ...hit, score } : null\n })\n .filter((h): h is SearchHit => h !== null)\n options.onPartial(assemble(rawQuery, rescored, targets, {\n via: 'cache', failed: [], elapsedMs: Date.now() - started, perTarget, limit, partial: true,\n }))\n }\n }\n\n let hits: SearchHit[] = []\n let failed: string[] = []\n let via: SearchPath = 'scan'\n\n if (!options.forceScan && indexAvailable !== false) {\n try {\n const indexed = await searchViaIndex(query, targets, perTarget, limit)\n if (indexed.ok) {\n hits = indexed.hits\n via = 'index'\n }\n } catch {\n // One bad query is no reason to abandon a live index — scan just this once.\n }\n }\n\n if (via !== 'index') {\n const emit = options.onPartial\n const scanned = await searchViaScan(query, targets, perTarget, emit\n ? (running) => emit(assemble(rawQuery, running, targets, {\n via: 'scan', failed: [], elapsedMs: Date.now() - started, perTarget, limit, partial: true,\n }))\n : undefined)\n hits = scanned.hits\n failed = scanned.failed\n }\n\n if (options.signal?.aborted) return empty(via)\n\n const result = assemble(rawQuery, hits, targets, {\n via, failed, elapsedMs: Date.now() - started, perTarget, limit,\n })\n cacheSet({\n scope,\n folded: query.folded,\n at: Date.now(),\n // Only an uncapped answer is a sound superset for longer queries.\n complete: failed.length === 0 && !result.groups.some((g) => g.hasMore),\n hits,\n })\n return result\n}\n","import * as React from 'react'\nimport { getBlock } from '../registry'\n\n// ---------------------------------------------------------------------------\n// Block tree — the universal page primitive. A page (admin or storefront) is an\n// ordered tree of typed blocks. Block `type`s are resolved against the block\n// registry, so a page is pure data: `{ type, props, children }`. This\n// generalizes the storefront's HomeSection switch to every surface.\n// ---------------------------------------------------------------------------\n\nexport interface BlockNode {\n /** Registered block id, e.g. 'hero', 'products', 'kpi-grid', 'custom:foo'. */\n type: string\n /** Stable id for keys / editing; optional. */\n id?: string\n props?: Record<string, unknown>\n children?: BlockNode[]\n}\n\n/** A block component receives its declared props plus the raw node (so a block\n * can render its own children via <BlockChildren>). */\nexport type BlockComponentProps = Record<string, unknown> & {\n node?: BlockNode\n children?: React.ReactNode\n}\n\n// Rendered in place of an unresolved block type. Unknown blocks are caught\n// ahead of production by `fayz doctor` / the conformance kit, so this visible\n// marker is a development aid rather than a production concern.\nfunction UnknownBlock({ type }: { type: string }): React.ReactElement | null {\n return React.createElement(\n 'div',\n {\n style: {\n border: '1px dashed #c026d3',\n color: '#a21caf',\n padding: '8px 12px',\n font: '12px ui-monospace, monospace',\n borderRadius: 6,\n },\n },\n `Unknown block: \"${type}\"`,\n )\n}\n\nexport function BlockRenderer({ node }: { node: BlockNode }): React.ReactElement | null {\n const Comp = getBlock(node.type)\n const childEls = node.children?.length\n ? node.children.map((child, i) =>\n React.createElement(BlockRenderer, { key: child.id ?? `${child.type}-${i}`, node: child }),\n )\n : null\n if (!Comp) return React.createElement(UnknownBlock, { type: node.type })\n return React.createElement(Comp, { ...(node.props ?? {}), node }, childEls)\n}\n\n/** Render an ordered list of blocks (a page body). */\nexport function renderBlocks(nodes: BlockNode[]): React.ReactNode {\n return nodes.map((node, i) =>\n React.createElement(BlockRenderer, { key: node.id ?? `${node.type}-${i}`, node }),\n )\n}\n\n/** Convenience for block components that render their own children. */\nexport function BlockChildren({ node }: { node?: BlockNode }): React.ReactNode {\n if (!node?.children?.length) return null\n return renderBlocks(node.children)\n}\n","import type { EntityDef } from '../types/crud'\nimport type { LocaleConfig } from '../types/i18n'\nimport type { PermissionsConfig, FeatureDeclaration } from '../types/permissions'\nimport type { BillingConfig } from '../types/billing'\nimport type { LimitDeclaration } from '../types/entitlements'\nimport type { AIToolParameters, AIToolExecution, AgentRpcDeclaration } from '../types/plugins'\nimport type { BlockNode } from '../blocks'\n\n// ---------------------------------------------------------------------------\n// AppManifest — THE app, as data.\n//\n// This is the canonical artifact every generated repo commits as\n// `app.manifest.json` and that `fayz upgrade` migrates across the fleet. It is\n// strictly JSON-serializable: no functions, no components — only ids resolved\n// against the registries (see ../registry). `createSaasApp`/`createStorefrontApp`\n// become thin sugar that builds a manifest of this shape.\n//\n// Versioning: bump CURRENT_MANIFEST_VERSION and register a migration whenever\n// the shape changes. The single biggest fleet-maintenance lever — getting it\n// right is why W1 is the \"point of no return\".\n// ---------------------------------------------------------------------------\n\nexport const CURRENT_MANIFEST_VERSION = 3\n\nexport type BackendProvider = 'supabase' | 'fayz-api' | 'fayz-shop' | 'mock' | 'custom'\n\nexport interface BackendRef {\n provider: BackendProvider\n /** Provider project ref / URL. Secrets stay in env/platform storage. */\n projectRef?: string\n url?: string\n /** Registered adapter id when provider is 'custom'. */\n adapterId?: string\n /** Public, JSON-safe provider options. Never store secrets here. */\n options?: Record<string, unknown>\n}\n\n/** How a manifest page produces its body — exactly one of blocks/entity/component. */\nexport interface PageManifest {\n path: string\n label?: string\n icon?: string\n section?: 'main' | 'secondary' | 'settings'\n /** A block tree (pure data). */\n blocks?: BlockNode[]\n /** An entity key → rendered as a CRUD page by the scaffold. */\n entity?: string\n /** A registered page-component id, e.g. 'custom:HarvestBoard'. */\n component?: string\n /** Optional permission gate: feature + action. */\n permission?: { feature: string; action: string }\n}\n\nexport interface PluginRef {\n /** Plugin id, resolved to an installed @fayz-ai/plugin-* at build time. */\n id: string\n /** Pure-data config passed to the plugin (labels, kinds, module flags…). */\n config?: Record<string, unknown>\n enabled?: boolean\n}\n\nexport interface SurfaceManifest {\n /** Registered scaffold id: 'admin' | 'storefront' | 'portal' | custom. */\n scaffold: string\n plugins?: PluginRef[]\n pages?: PageManifest[]\n /** Surface-specific declarative options (announcement, footer, nav, shipping,\n * catalog seed, onboarding, …) — kept open so scaffolds evolve without a\n * manifest-version bump for additive fields. */\n options?: Record<string, unknown>\n}\n\n// ---------------------------------------------------------------------------\n// Agent Contract (manifest v3) — everything a SERVER-SIDE agent runtime needs\n// to operate the app without a browser: the full entity surface, the tool\n// catalog with its authorization requirements, the pool RPCs writes go\n// through, and the structured domain knowledge the app wants in the prompt.\n// Derived from app code at publish (never hand-written) and synced to the\n// Fayz platform, where it becomes the versioned AgentContract the broker\n// validates every turn against.\n// ---------------------------------------------------------------------------\n\n/** JSON-safe projection of an EntityDef — schema only, no components/closures.\n * `data` mirrors EntityDef.data: everything the server-plane read executor\n * needs (tenant scoping, search/select column allowlists, fixed filters). */\nexport interface EntityContract {\n key: string\n label: string\n labelPlural?: string\n /** Plan-limit key rows of this entity consume (EntityDef.limitKey). */\n limitKey?: string\n /** Permission to READ via the generic data primitives (EntityDef.permission). */\n permission?: { feature: string; action: string }\n data: {\n table: string\n schema?: string\n tenantScoped?: boolean\n tenantIdColumn?: string\n searchColumns?: string[]\n selectColumns?: string\n columnMap?: Record<string, string>\n archetype?: string\n archetypeKind?: string\n filters?: Record<string, string>\n }\n fields: Array<{\n key: string\n label: string\n type: string\n required?: boolean\n searchable?: boolean\n /** FieldDef.hint — the field's helper text. Carried into the contract\n * because it is what tells the agent what a non-obvious column expects:\n * an id to look up, a default it should not restate, a format. */\n hint?: string\n /** Allowed values for select-like fields. */\n options?: string[]\n /** Table the relation field points at (FieldRelation.table). */\n relationTable?: string\n }>\n}\n\n/** JSON-safe projection of a PluginAITool + its owning plugin. */\nexport interface AIToolContract {\n id: string\n name: string\n description: string\n mode: 'read' | 'persist'\n parameters?: AIToolParameters\n permission?: { feature: string; action: string }\n limitKey?: string\n execution?: AIToolExecution\n requiresConfirmation?: boolean\n pluginId?: string\n category?: string\n}\n\n/** A tenant-scoped pool RPC the server-plane executor may call. Canonical\n * definition lives with the plugin types (plugins declare these). */\nexport type { AgentRpcDeclaration as RpcContract } from '../types/plugins'\n\n/** Structured domain knowledge rendered into the agent's prompt as labelled\n * sections — statuses with transitions, scheduling defaults, free-form rules. */\nexport interface AgentDomainKnowledge {\n statuses?: Record<string, Array<{ id: string; label: string; availableWhen?: unknown }>>\n scheduleDefaults?: Record<string, unknown>\n businessRules?: Array<{ id: string; description: string }>\n}\n\nexport interface AgentContract {\n persona?: { name?: string; systemPrompt?: string; icon?: string }\n /** When 'server', surfaces stop shipping data-tool executors: the broker\n * executes reads/writes server-plane and the surface only handles\n * client-plane tools. Flipped per app — no lockstep release. */\n executionPlane?: 'client' | 'server'\n entities?: EntityContract[]\n tools?: AIToolContract[]\n registries?: Array<{ pluginId: string; id: string; entityKey?: string; readOnly?: boolean }>\n declaredFeatures?: FeatureDeclaration[]\n rpcs?: AgentRpcDeclaration[]\n domainKnowledge?: AgentDomainKnowledge\n}\n\nexport interface AppManifest {\n manifestVersion: number\n id: string\n name: string\n backend?: BackendRef\n locale?: LocaleConfig\n /** Theme tokens — SaasTheme or StorefrontTheme depending on surface; kept\n * loose at the core layer to avoid coupling core to surface packages. */\n theme?: Record<string, unknown>\n /** Keyed by surface name ('admin', 'storefront', …). At least one required. */\n surfaces: Record<string, SurfaceManifest>\n /** App-defined entity extensions (vertical-specific tables/fields). */\n entities?: EntityDef[]\n permissions?: PermissionsConfig\n billing?: BillingConfig\n /** The RESOLVED limit declarations (4-layer merge: core < entity-derived <\n * plugin < app), so a server runtime counts exactly what the client counts. */\n limitDeclarations?: LimitDeclaration[]\n /** v3: the agent contract — see the section comment above. */\n agent?: AgentContract\n /** sha256 of the canonical serialization (excluding this field). */\n contractHash?: string\n}\n\n// ---------------------------------------------------------------------------\n// Migration runner — applies sequential migrations from a manifest's version\n// up to CURRENT. Each migration is keyed by the version it upgrades FROM.\n// ---------------------------------------------------------------------------\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyManifest = Record<string, any>\nexport type ManifestMigration = (m: AnyManifest) => AnyManifest\n\nconst migrations = new Map<number, ManifestMigration>()\nconst supportedBackendProviders: BackendProvider[] = ['supabase', 'fayz-api', 'fayz-shop', 'mock', 'custom']\nconst supportedPageSections = new Set(['main', 'secondary', 'settings'])\nconst allowedManifestKeys = new Set([\n 'manifestVersion',\n 'id',\n 'name',\n 'backend',\n 'locale',\n 'theme',\n 'permissions',\n 'billing',\n 'entities',\n 'surfaces',\n 'limitDeclarations',\n 'agent',\n 'contractHash',\n])\nconst allowedBackendKeys = new Set(['provider', 'projectRef', 'url', 'adapterId', 'options'])\nconst allowedSurfaceKeys = new Set(['scaffold', 'options', 'plugins', 'pages'])\nconst allowedPluginRefKeys = new Set(['id', 'config', 'enabled'])\nconst allowedPageKeys = new Set(['path', 'label', 'icon', 'section', 'blocks', 'entity', 'component', 'permission'])\nconst allowedPermissionKeys = new Set(['feature', 'action'])\nconst allowedBlockKeys = new Set(['type', 'id', 'props', 'children'])\nconst manifestIdPattern = /^[a-z0-9][a-z0-9-]*$/\n\n/** Register a migration that upgrades a manifest FROM `fromVersion` to fromVersion+1. */\nexport function registerManifestMigration(fromVersion: number, fn: ManifestMigration): void {\n migrations.set(fromVersion, fn)\n}\n\n// v2 → v3 is purely additive (limitDeclarations/agent/contractHash are optional):\n// a v2 manifest is a valid v3 manifest with those sections absent. Registered\n// here so every consumer migrates for free; `fayz manifest emit` fills the new\n// sections on the next regeneration.\nregisterManifestMigration(2, (m) => m)\n\n/** Bring any manifest up to CURRENT_MANIFEST_VERSION, or throw if it was built\n * for a newer SDK than this runtime understands. */\nexport function migrateManifest(input: AnyManifest): AppManifest {\n let m = { ...input }\n let version = typeof m.manifestVersion === 'number' ? m.manifestVersion : 1\n if (version > CURRENT_MANIFEST_VERSION) {\n throw new Error(\n `Manifest version ${version} is newer than this SDK supports (${CURRENT_MANIFEST_VERSION}). Upgrade @fayz-ai/core.`,\n )\n }\n while (version < CURRENT_MANIFEST_VERSION) {\n const migrate = migrations.get(version)\n if (!migrate) {\n throw new Error(`No manifest migration registered from version ${version}.`)\n }\n m = migrate(m)\n version += 1\n m.manifestVersion = version\n }\n return m as AppManifest\n}\n\n/** Validate the structural invariants the JSON Schema can't fully express.\n * Returns a list of human-readable problems (empty = valid). */\nexport function validateManifest(m: AppManifest): string[] {\n const problems: string[] = []\n const manifest = m as unknown as Record<string, unknown>\n\n addUnsupportedKeys(manifest, allowedManifestKeys, 'manifest', problems)\n\n if (!Number.isInteger(manifest.manifestVersion)) {\n problems.push('manifest.manifestVersion must be an integer')\n } else if (manifest.manifestVersion !== CURRENT_MANIFEST_VERSION) {\n problems.push(`manifest.manifestVersion must be ${CURRENT_MANIFEST_VERSION}`)\n }\n if (typeof manifest.id !== 'string' || !manifest.id.trim()) problems.push('manifest.id is required')\n else if (!manifestIdPattern.test(manifest.id.trim())) {\n problems.push('manifest.id must match /^[a-z0-9][a-z0-9-]*$/')\n }\n if (typeof manifest.name !== 'string' || !manifest.name.trim()) problems.push('manifest.name is required')\n\n validateLooseObject(manifest.locale, 'manifest.locale', problems)\n validateLooseObject(manifest.theme, 'manifest.theme', problems)\n validateLooseObject(manifest.permissions, 'manifest.permissions', problems)\n validateLooseObject(manifest.billing, 'manifest.billing', problems)\n validateLooseObject(manifest.agent, 'manifest.agent', problems)\n if (manifest.contractHash !== undefined && !isNonEmptyString(manifest.contractHash)) {\n problems.push('manifest.contractHash must be a non-empty string')\n }\n if (manifest.limitDeclarations !== undefined) {\n if (!Array.isArray(manifest.limitDeclarations)) {\n problems.push('manifest.limitDeclarations must be an array')\n } else {\n manifest.limitDeclarations.forEach((decl, index) => {\n if (!isRecord(decl) || !isNonEmptyString(decl.key) || !isNonEmptyString(decl.table)) {\n problems.push(`manifest.limitDeclarations[${index}] must declare key and table`)\n }\n })\n }\n }\n if (manifest.entities !== undefined) {\n if (!Array.isArray(manifest.entities)) {\n problems.push('manifest.entities must be an array')\n } else {\n manifest.entities.forEach((entity, index) => {\n if (!isRecord(entity)) problems.push(`manifest.entities[${index}] must be an object`)\n })\n }\n }\n\n if (manifest.backend !== undefined) {\n if (!isRecord(manifest.backend)) {\n problems.push('manifest.backend must be an object')\n } else {\n addUnsupportedKeys(manifest.backend, allowedBackendKeys, 'manifest.backend', problems)\n const provider = manifest.backend.provider\n if (typeof provider !== 'string' || !supportedBackendProviders.includes(provider as BackendProvider)) {\n problems.push(`manifest.backend.provider \"${String(provider)}\" is not supported`)\n }\n validateOptionalNonEmptyString(manifest.backend.projectRef, 'manifest.backend.projectRef', problems)\n validateOptionalNonEmptyString(manifest.backend.url, 'manifest.backend.url', problems)\n if (provider === 'custom' && !isNonEmptyString(manifest.backend.adapterId)) {\n problems.push('manifest.backend.adapterId is required when provider is \"custom\"')\n } else if (provider !== 'custom') {\n validateOptionalNonEmptyString(manifest.backend.adapterId, 'manifest.backend.adapterId', problems)\n }\n validateLooseObject(manifest.backend.options, 'manifest.backend.options', problems)\n }\n }\n\n if (!isRecord(manifest.surfaces) || Object.keys(manifest.surfaces).length === 0) {\n problems.push('manifest.surfaces must declare at least one surface')\n } else {\n for (const [name, surface] of Object.entries(manifest.surfaces)) {\n validateSurfaceManifest(name, surface, problems)\n }\n }\n\n return problems\n}\n\nfunction validateSurfaceManifest(name: string, surface: unknown, problems: string[]): void {\n if (!isRecord(surface)) {\n problems.push(`surface \"${name}\" must be an object`)\n return\n }\n\n addUnsupportedKeys(surface, allowedSurfaceKeys, `surface \"${name}\"`, problems)\n if (!isNonEmptyString(surface.scaffold)) problems.push(`surface \"${name}\" is missing a scaffold id`)\n validateLooseObject(surface.options, `surface \"${name}\".options`, problems)\n\n if (surface.pages !== undefined) {\n if (!Array.isArray(surface.pages)) {\n problems.push(`surface \"${name}\".pages must be an array`)\n } else {\n const pagePaths = new Set<string>()\n for (const [index, page] of surface.pages.entries()) {\n validatePageManifest(name, index, page, pagePaths, problems)\n }\n }\n }\n\n if (surface.plugins !== undefined) {\n if (!Array.isArray(surface.plugins)) {\n problems.push(`surface \"${name}\".plugins must be an array`)\n } else {\n const pluginIds = new Set<string>()\n for (const [index, plugin] of surface.plugins.entries()) {\n validatePluginRef(name, index, plugin, pluginIds, problems)\n }\n }\n }\n}\n\nfunction validatePageManifest(\n surfaceName: string,\n index: number,\n page: unknown,\n pagePaths: Set<string>,\n problems: string[],\n): void {\n const pageLabel = `surface \"${surfaceName}\" page #${index + 1}`\n if (!isRecord(page)) {\n problems.push(`${pageLabel} must be an object`)\n return\n }\n\n addUnsupportedKeys(page, allowedPageKeys, pageLabel, problems)\n\n if (!isNonEmptyString(page.path)) {\n problems.push(`${pageLabel} has an empty path`)\n } else {\n const normalizedPath = page.path.trim()\n if (pagePaths.has(normalizedPath)) {\n problems.push(`surface \"${surfaceName}\" declares duplicate page path \"${normalizedPath}\"`)\n } else {\n pagePaths.add(normalizedPath)\n }\n }\n\n if (page.label !== undefined && typeof page.label !== 'string') problems.push(`${pageLabel}.label must be a string`)\n if (page.icon !== undefined && typeof page.icon !== 'string') problems.push(`${pageLabel}.icon must be a string`)\n if (page.section !== undefined && (typeof page.section !== 'string' || !supportedPageSections.has(page.section))) {\n problems.push(`${pageLabel}.section must be one of main, secondary, settings`)\n }\n if (page.entity !== undefined && !isNonEmptyString(page.entity)) problems.push(`${pageLabel}.entity must be a non-empty string`)\n if (page.component !== undefined && !isNonEmptyString(page.component)) {\n problems.push(`${pageLabel}.component must be a non-empty string`)\n }\n\n const kinds = [page.blocks, page.entity, page.component].filter((x) => x != null)\n if (kinds.length !== 1) {\n problems.push(`${pageLabel} must set exactly one of blocks/entity/component`)\n }\n\n if (page.permission !== undefined) {\n validatePermission(page.permission, `${pageLabel}.permission`, problems)\n }\n\n if (page.blocks !== undefined) {\n if (!Array.isArray(page.blocks)) {\n problems.push(`${pageLabel}.blocks must be an array`)\n } else {\n page.blocks.forEach((block, blockIndex) => {\n validateBlockManifest(block, `${pageLabel}.blocks[${blockIndex}]`, problems)\n })\n }\n }\n}\n\nfunction validatePluginRef(\n surfaceName: string,\n index: number,\n plugin: unknown,\n pluginIds: Set<string>,\n problems: string[],\n): void {\n const pluginLabel = `surface \"${surfaceName}\" plugin #${index + 1}`\n if (!isRecord(plugin)) {\n problems.push(`${pluginLabel} must be an object`)\n return\n }\n\n addUnsupportedKeys(plugin, allowedPluginRefKeys, pluginLabel, problems)\n\n if (!isNonEmptyString(plugin.id)) {\n problems.push(`${pluginLabel} has an empty id`)\n } else {\n const normalizedId = plugin.id.trim()\n if (pluginIds.has(normalizedId)) {\n problems.push(`surface \"${surfaceName}\" declares duplicate plugin id \"${normalizedId}\"`)\n } else {\n pluginIds.add(normalizedId)\n }\n }\n\n validateLooseObject(plugin.config, `${pluginLabel}.config`, problems)\n if (plugin.enabled !== undefined && typeof plugin.enabled !== 'boolean') {\n problems.push(`${pluginLabel}.enabled must be a boolean`)\n }\n}\n\nfunction validatePermission(permission: unknown, path: string, problems: string[]): void {\n if (!isRecord(permission)) {\n problems.push(`${path} must be an object`)\n return\n }\n\n addUnsupportedKeys(permission, allowedPermissionKeys, path, problems)\n if (!isNonEmptyString(permission.feature)) problems.push(`${path}.feature is required`)\n if (!isNonEmptyString(permission.action)) problems.push(`${path}.action is required`)\n}\n\nfunction validateBlockManifest(block: unknown, path: string, problems: string[]): void {\n if (!isRecord(block)) {\n problems.push(`${path} must be an object`)\n return\n }\n\n addUnsupportedKeys(block, allowedBlockKeys, path, problems)\n if (!isNonEmptyString(block.type)) problems.push(`${path}.type is required`)\n validateLooseObject(block.props, `${path}.props`, problems)\n if (block.id !== undefined && typeof block.id !== 'string') problems.push(`${path}.id must be a string`)\n\n if (block.children !== undefined) {\n if (!Array.isArray(block.children)) {\n problems.push(`${path}.children must be an array`)\n } else {\n block.children.forEach((child, index) => validateBlockManifest(child, `${path}.children[${index}]`, problems))\n }\n }\n}\n\nfunction addUnsupportedKeys(\n value: Record<string, unknown>,\n allowedKeys: Set<string>,\n path: string,\n problems: string[],\n): void {\n for (const key of Object.keys(value)) {\n if (!allowedKeys.has(key)) {\n problems.push(`${path}.${key} is not part of AppManifest v${CURRENT_MANIFEST_VERSION}`)\n }\n }\n}\n\nfunction validateLooseObject(value: unknown, path: string, problems: string[]): void {\n if (value !== undefined && !isRecord(value)) {\n problems.push(`${path} must be an object`)\n }\n}\n\nfunction validateOptionalNonEmptyString(value: unknown, path: string, problems: string[]): void {\n if (value !== undefined && !isNonEmptyString(value)) {\n problems.push(`${path} must be a non-empty string`)\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0\n}\n","import type { AppManifest } from './index'\n\n// ---------------------------------------------------------------------------\n// Deterministic serialization — the SAME manifest object must always produce\n// the SAME bytes, because the sha256 of those bytes (`contractHash`) is what\n// makes `fayz manifest sync` idempotent and lets `fayz doctor` prove the\n// committed app.manifest.json is not stale. Rules: object keys sorted, arrays\n// kept in declared order (order is meaning: nav position, migration order),\n// 2-space indent, trailing newline, `contractHash` itself excluded.\n// ---------------------------------------------------------------------------\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortValue)\n if (value !== null && typeof value === 'object') {\n const record = value as Record<string, unknown>\n const out: Record<string, unknown> = {}\n for (const key of Object.keys(record).sort()) {\n const v = record[key]\n if (v !== undefined) out[key] = sortValue(v)\n }\n return out\n }\n return value\n}\n\n/** Canonical JSON of a manifest (contractHash excluded, keys sorted). */\nexport function serializeManifest(manifest: AppManifest): string {\n const { contractHash: _omit, ...rest } = manifest\n return `${JSON.stringify(sortValue(rest), null, 2)}\\n`\n}\n\n/**\n * sha256 (hex) of the canonical serialization. Async because it runs on\n * WebCrypto (`globalThis.crypto.subtle`), which exists in every runtime we\n * target (browsers, Node ≥ 18, edge) — no node:crypto import, keeping this\n * module bundleable everywhere.\n */\nexport async function computeContractHash(manifest: AppManifest): Promise<string> {\n const bytes = new TextEncoder().encode(serializeManifest(manifest))\n const digest = await globalThis.crypto.subtle.digest('SHA-256', bytes)\n return Array.from(new Uint8Array(digest))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n}\n\n/** Serialize WITH the freshly computed contractHash embedded — what\n * `fayz manifest emit` writes to app.manifest.json. */\nexport async function serializeManifestWithHash(manifest: AppManifest): Promise<string> {\n const contractHash = await computeContractHash(manifest)\n const { contractHash: _omit, ...rest } = manifest\n return `${JSON.stringify(sortValue({ ...rest, contractHash }), null, 2)}\\n`\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://fayz.ai/schemas/app-manifest/v3.json\",\n \"title\": \"Fayz AppManifest\",\n \"description\": \"The canonical, JSON-serializable definition of a Fayz app. Code is referenced by registry id; never inlined.\",\n \"type\": \"object\",\n \"required\": [\n \"manifestVersion\",\n \"id\",\n \"name\",\n \"surfaces\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"manifestVersion\": {\n \"type\": \"integer\",\n \"const\": 3,\n \"description\": \"Current AppManifest schema version. Older or newer versions require an explicit SDK migration before validation.\"\n },\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"pattern\": \"^[a-z0-9][a-z0-9-]*$\"\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"backend\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"provider\"\n ],\n \"properties\": {\n \"provider\": {\n \"enum\": [\n \"supabase\",\n \"fayz-api\",\n \"fayz-shop\",\n \"mock\",\n \"custom\"\n ]\n },\n \"projectRef\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"url\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"adapterId\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"options\": {\n \"type\": \"object\"\n }\n }\n },\n \"locale\": {\n \"type\": \"object\"\n },\n \"theme\": {\n \"type\": \"object\"\n },\n \"permissions\": {\n \"type\": \"object\"\n },\n \"billing\": {\n \"type\": \"object\"\n },\n \"entities\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"surfaces\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"additionalProperties\": {\n \"$ref\": \"#/$defs/surface\"\n }\n },\n \"limitDeclarations\": {\n \"type\": \"array\",\n \"description\": \"Resolved 4-layer limit-declaration merge (core < entity-derived < plugin < app) so server runtimes count exactly what the client counts.\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"key\",\n \"table\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"key\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"table\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"kindFilter\": {\n \"type\": \"string\"\n },\n \"period\": {\n \"enum\": [\n \"month\",\n \"total\"\n ]\n }\n }\n }\n },\n \"agent\": {\n \"$ref\": \"#/$defs/agentContract\"\n },\n \"contractHash\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"sha256 of the canonical serialization (excluding this field).\"\n }\n },\n \"$defs\": {\n \"surface\": {\n \"type\": \"object\",\n \"required\": [\n \"scaffold\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"scaffold\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"options\": {\n \"type\": \"object\"\n },\n \"plugins\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/pluginRef\"\n }\n },\n \"pages\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/page\"\n }\n }\n }\n },\n \"pluginRef\": {\n \"type\": \"object\",\n \"required\": [\n \"id\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"config\": {\n \"type\": \"object\"\n },\n \"enabled\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"page\": {\n \"type\": \"object\",\n \"required\": [\n \"path\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Exactly one of blocks/entity/component must be set.\",\n \"properties\": {\n \"path\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"type\": \"string\"\n },\n \"section\": {\n \"enum\": [\n \"main\",\n \"secondary\",\n \"settings\"\n ]\n },\n \"blocks\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/block\"\n }\n },\n \"entity\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"component\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"permission\": {\n \"type\": \"object\",\n \"required\": [\n \"feature\",\n \"action\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"feature\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"action\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n }\n },\n \"oneOf\": [\n {\n \"required\": [\n \"blocks\"\n ]\n },\n {\n \"required\": [\n \"entity\"\n ]\n },\n {\n \"required\": [\n \"component\"\n ]\n }\n ]\n },\n \"block\": {\n \"type\": \"object\",\n \"required\": [\n \"type\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"props\": {\n \"type\": \"object\"\n },\n \"children\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/block\"\n }\n }\n }\n },\n \"agentContract\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"description\": \"Everything a server-side agent runtime needs to operate the app without a browser. Derived from code at publish; synced to Fayz as the versioned AgentContract.\",\n \"properties\": {\n \"persona\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"systemPrompt\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"type\": \"string\"\n }\n }\n },\n \"executionPlane\": {\n \"enum\": [\n \"client\",\n \"server\"\n ]\n },\n \"entities\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/entityContract\"\n }\n },\n \"tools\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/aiToolContract\"\n }\n },\n \"registries\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"pluginId\",\n \"id\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"pluginId\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"entityKey\": {\n \"type\": \"string\"\n },\n \"readOnly\": {\n \"type\": \"boolean\"\n }\n }\n }\n },\n \"declaredFeatures\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"rpcs\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/rpcContract\"\n }\n },\n \"domainKnowledge\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"statuses\": {\n \"type\": \"object\"\n },\n \"scheduleDefaults\": {\n \"type\": \"object\"\n },\n \"businessRules\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"description\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"description\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n }\n }\n }\n }\n }\n },\n \"entityContract\": {\n \"type\": \"object\",\n \"required\": [\n \"key\",\n \"label\",\n \"data\",\n \"fields\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"key\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"label\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"labelPlural\": {\n \"type\": \"string\"\n },\n \"limitKey\": {\n \"type\": \"string\"\n },\n \"data\": {\n \"type\": \"object\",\n \"required\": [\n \"table\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"table\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"schema\": {\n \"type\": \"string\"\n },\n \"tenantScoped\": {\n \"type\": \"boolean\"\n },\n \"tenantIdColumn\": {\n \"type\": \"string\"\n },\n \"searchColumns\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"selectColumns\": {\n \"type\": \"string\"\n },\n \"columnMap\": {\n \"type\": \"object\"\n },\n \"archetype\": {\n \"type\": \"string\"\n },\n \"archetypeKind\": {\n \"type\": \"string\"\n },\n \"filters\": {\n \"type\": \"object\"\n }\n }\n },\n \"fields\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"key\",\n \"label\",\n \"type\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"key\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"searchable\": {\n \"type\": \"boolean\"\n },\n \"hint\": {\n \"type\": \"string\"\n },\n \"options\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"relationTable\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"permission\": {\n \"type\": \"object\",\n \"required\": [\n \"feature\",\n \"action\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"feature\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"action\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n }\n }\n },\n \"aiToolContract\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"name\",\n \"description\",\n \"mode\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"pattern\": \"^[a-zA-Z0-9_-]{1,64}$\"\n },\n \"description\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"mode\": {\n \"enum\": [\n \"read\",\n \"persist\"\n ]\n },\n \"parameters\": {\n \"type\": \"object\"\n },\n \"permission\": {\n \"type\": \"object\",\n \"required\": [\n \"feature\",\n \"action\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"feature\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"action\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n },\n \"limitKey\": {\n \"type\": \"string\"\n },\n \"execution\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"required\": [\n \"plane\",\n \"kind\",\n \"rpc\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"plane\": {\n \"const\": \"server\"\n },\n \"kind\": {\n \"const\": \"rpc\"\n },\n \"rpc\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n },\n {\n \"type\": \"object\",\n \"required\": [\n \"plane\",\n \"kind\",\n \"entity\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"plane\": {\n \"const\": \"server\"\n },\n \"kind\": {\n \"const\": \"entity_read\"\n },\n \"entity\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n },\n {\n \"type\": \"object\",\n \"required\": [\n \"plane\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"plane\": {\n \"const\": \"client\"\n }\n }\n }\n ]\n },\n \"requiresConfirmation\": {\n \"type\": \"boolean\"\n },\n \"pluginId\": {\n \"type\": \"string\"\n },\n \"category\": {\n \"type\": \"string\"\n }\n }\n },\n \"rpcContract\": {\n \"type\": \"object\",\n \"required\": [\n \"name\",\n \"kind\",\n \"description\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"pattern\": \"^agent_[a-z0-9_]+$\"\n },\n \"kind\": {\n \"enum\": [\n \"read\",\n \"write\"\n ]\n },\n \"description\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"payloadSchema\": {\n \"type\": \"object\"\n },\n \"audits\": {\n \"type\": \"boolean\"\n }\n }\n }\n }\n}\n","import * as React from 'react'\nimport { getScaffold } from '../registry'\nimport { migrateManifest, validateManifest, CURRENT_MANIFEST_VERSION } from '../manifest'\nimport type { AppManifest } from '../manifest'\n\n// ---------------------------------------------------------------------------\n// defineApp / renderApp — the entry points that turn an AppManifest into a\n// running app. Scaffolds (admin, storefront, portal) self-register into the\n// scaffold registry when their package is imported, so core never depends on\n// them: a generated app imports the scaffold package(s) it needs, then calls\n// renderApp(manifest). createSaasApp / createStorefrontApp become sugar that\n// builds a manifest and hands it here.\n// ---------------------------------------------------------------------------\n\nconst ManifestContext = React.createContext<AppManifest | null>(null)\n\n/** Access the active app manifest from any component under renderApp. */\nexport function useManifest(): AppManifest | null {\n return React.useContext(ManifestContext)\n}\n\n/** Stamp + validate a manifest authored in code (the sugar path). */\nexport function defineApp(\n manifest: Omit<AppManifest, 'manifestVersion'> & { manifestVersion?: number },\n): AppManifest {\n const full = {\n ...manifest,\n manifestVersion: manifest.manifestVersion ?? CURRENT_MANIFEST_VERSION,\n } as AppManifest\n const problems = validateManifest(full)\n if (problems.length) {\n throw new Error(`Invalid AppManifest:\\n - ${problems.join('\\n - ')}`)\n }\n return full\n}\n\nexport interface RenderAppOptions {\n /** Which surface to mount; defaults to the first declared surface. */\n surface?: string\n}\n\n/** Resolve, migrate and validate a manifest, then mount the scaffold for the\n * chosen surface. Accepts a raw object (e.g. parsed app.manifest.json). */\nexport function renderApp(\n input: AppManifest | Record<string, unknown>,\n opts: RenderAppOptions = {},\n): React.ReactElement {\n const manifest = migrateManifest(input as Record<string, unknown>)\n const problems = validateManifest(manifest)\n if (problems.length) {\n throw new Error(`Invalid AppManifest:\\n - ${problems.join('\\n - ')}`)\n }\n const surfaceName = opts.surface ?? Object.keys(manifest.surfaces)[0]\n const surface = surfaceName ? manifest.surfaces[surfaceName] : undefined\n if (!surface) {\n throw new Error(`Surface \"${surfaceName}\" not found in manifest.`)\n }\n const Scaffold = getScaffold(surface.scaffold)\n if (!Scaffold) {\n throw new Error(\n `Scaffold \"${surface.scaffold}\" is not registered. Import the package that provides it (e.g. @fayz-ai/saas or @fayz-ai/shop) before calling renderApp.`,\n )\n }\n return React.createElement(\n ManifestContext.Provider,\n { value: manifest },\n React.createElement(Scaffold, { manifest, surface: surfaceName }),\n )\n}\n","import { create } from 'zustand'\n\n/**\n * Global, cross-module navigation history.\n *\n * Per-module nav hooks (useModuleNavigation) only remember views *within* one\n * module, so they can't tell you where you came from after crossing a module\n * boundary (e.g. Financial statements → a client/person page). This store sits\n * above all modules: the app shell records every route change here with a\n * human label, and the shared SubpageHeader reads it to render a context-aware\n * \"back to {where you came from}\" link that returns to the actual previous page.\n */\n\nexport interface NavHistoryEntry {\n /** Route path without the leading '#', e.g. '/financial/statements'. */\n path: string\n /** Human, module-level label for the page, e.g. 'Financeiro'. */\n label: string\n}\n\ninterface NavHistoryState {\n stack: NavHistoryEntry[]\n /** Record a visit. Consecutive visits to the same path collapse (label refreshes). */\n record: (entry: NavHistoryEntry) => void\n}\n\nconst MAX_ENTRIES = 20\n\nexport const useNavHistoryStore = create<NavHistoryState>((set) => ({\n stack: [],\n record: (entry) =>\n set((s) => {\n const top = s.stack[s.stack.length - 1]\n if (top && top.path === entry.path) {\n if (top.label === entry.label) return s\n const next = s.stack.slice()\n next[next.length - 1] = entry\n return { stack: next }\n }\n const next = [...s.stack, entry]\n return { stack: next.length > MAX_ENTRIES ? next.slice(-MAX_ENTRIES) : next }\n }),\n}))\n\n/** Record a route visit. Call from the app shell whenever the route changes. */\nexport function recordNavigation(path: string, label: string): void {\n useNavHistoryStore.getState().record({ path, label })\n}\n\n// Dev-only debug handle: inspect history in the console via `__navHistory.getState().stack`.\nif (typeof window !== 'undefined') {\n ;(window as unknown as { __navHistory?: typeof useNavHistoryStore }).__navHistory = useNavHistoryStore\n}\n\n/**\n * The page the user most recently came from, relative to `currentPath`.\n *\n * Returns the latest recorded entry whose path differs from `currentPath`. This\n * is intentionally robust to ordering: it gives the right referrer whether or\n * not the current page has been recorded yet, avoiding a stale first paint.\n */\nexport function useNavReferrer(currentPath: string): NavHistoryEntry | null {\n return useNavHistoryStore((s) => {\n for (let i = s.stack.length - 1; i >= 0; i--) {\n if (s.stack[i].path !== currentPath) return s.stack[i]\n }\n return null\n })\n}\n\n/**\n * Return to the actual previous page via the browser history. Falls back to the\n * provided callback when there's no in-app history to pop (e.g. a deep link).\n */\nexport function navHistoryBack(fallback?: () => void): void {\n if (useNavHistoryStore.getState().stack.length >= 2) {\n window.history.back()\n } else {\n fallback?.()\n }\n}\n\n/** Top-level module segment of a route path ('/financial/statements' → 'financial'). */\nexport function routeModule(path: string): string {\n return path.replace(/^\\/+/, '').split('/')[0] ?? ''\n}\n"]}
|