@fayz-ai/core 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -58,6 +58,129 @@ function createSafeDataProvider(makeSupabase, makeMock) {
58
58
  });
59
59
  }
60
60
 
61
+ // src/phone/index.ts
62
+ function flagOf(iso2) {
63
+ return iso2.toUpperCase().replace(/[^A-Z]/g, "").split("").map((c) => String.fromCodePoint(127462 + c.charCodeAt(0) - 65)).join("");
64
+ }
65
+ var RAW = [
66
+ { iso2: "BR", name: "Brasil", dial: "+55", mask: "(##) #####-####" },
67
+ { iso2: "US", name: "Estados Unidos", dial: "+1", mask: "(###) ###-####" },
68
+ { iso2: "PT", name: "Portugal", dial: "+351", mask: "### ### ###" },
69
+ { iso2: "AR", name: "Argentina", dial: "+54", mask: "(##) ####-####" },
70
+ { iso2: "ES", name: "Espanha", dial: "+34", mask: "### ### ###" },
71
+ { iso2: "MX", name: "M\xE9xico", dial: "+52", mask: "## #### ####" },
72
+ { iso2: "GB", name: "Reino Unido", dial: "+44", mask: "##### ######" },
73
+ { iso2: "FR", name: "Fran\xE7a", dial: "+33", mask: "# ## ## ## ##" },
74
+ { iso2: "DE", name: "Alemanha", dial: "+49", mask: "#### #######" },
75
+ { iso2: "IT", name: "It\xE1lia", dial: "+39", mask: "### #######" }
76
+ ];
77
+ var COUNTRIES = RAW.map((c) => ({ ...c, flag: flagOf(c.iso2) }));
78
+ var DEFAULT_COUNTRY = "BR";
79
+ var BY_ISO = new Map(COUNTRIES.map((c) => [c.iso2, c]));
80
+ function getCountry(iso2) {
81
+ return iso2 && BY_ISO.get(iso2.toUpperCase()) || BY_ISO.get(DEFAULT_COUNTRY);
82
+ }
83
+ function unmaskPhone(value) {
84
+ return (value || "").replace(/\D/g, "");
85
+ }
86
+ function maskPhone(value, mask) {
87
+ const digits = unmaskPhone(value);
88
+ let out = "";
89
+ let di = 0;
90
+ for (const ch of mask) {
91
+ if (di >= digits.length) break;
92
+ if (ch === "#") {
93
+ out += digits[di++];
94
+ } else {
95
+ out += ch;
96
+ }
97
+ }
98
+ return out;
99
+ }
100
+ function maskDigitCount(mask) {
101
+ let n = 0;
102
+ for (const ch of mask) if (ch === "#") n++;
103
+ return n;
104
+ }
105
+ var MANAGED = "data-fayz-seo";
106
+ function seoOrigin() {
107
+ return typeof window !== "undefined" ? window.location.origin : "";
108
+ }
109
+ function absoluteUrl(path) {
110
+ return `${seoOrigin()}${path.startsWith("/") ? path : `/${path}`}`;
111
+ }
112
+ function upsertMeta(attr, key, content) {
113
+ if (!content) return;
114
+ let el = document.head.querySelector(`meta[${attr}="${key}"]`);
115
+ if (!el) {
116
+ el = document.createElement("meta");
117
+ el.setAttribute(attr, key);
118
+ el.setAttribute(MANAGED, "");
119
+ document.head.appendChild(el);
120
+ }
121
+ el.setAttribute("content", content);
122
+ }
123
+ function upsertLink(rel, href) {
124
+ if (!href) return;
125
+ let el = document.head.querySelector(`link[rel="${rel}"]`);
126
+ if (!el) {
127
+ el = document.createElement("link");
128
+ el.setAttribute("rel", rel);
129
+ el.setAttribute(MANAGED, "");
130
+ document.head.appendChild(el);
131
+ }
132
+ el.setAttribute("href", href);
133
+ }
134
+ function clearManaged() {
135
+ document.head.querySelectorAll(`[${MANAGED}]`).forEach((el) => el.remove());
136
+ }
137
+ function applySeo(config) {
138
+ if (typeof document === "undefined") return;
139
+ clearManaged();
140
+ document.title = config.title;
141
+ upsertMeta("name", "description", config.description ?? "");
142
+ if (config.canonical) upsertLink("canonical", config.canonical);
143
+ upsertMeta("property", "og:title", config.title);
144
+ upsertMeta("property", "og:description", config.description ?? "");
145
+ upsertMeta("property", "og:type", config.type === "article" ? "article" : "website");
146
+ if (config.canonical) upsertMeta("property", "og:url", config.canonical);
147
+ if (config.image) upsertMeta("property", "og:image", config.image);
148
+ if (config.siteName) upsertMeta("property", "og:site_name", config.siteName);
149
+ upsertMeta("name", "twitter:card", config.image ? "summary_large_image" : "summary");
150
+ upsertMeta("name", "twitter:title", config.title);
151
+ upsertMeta("name", "twitter:description", config.description ?? "");
152
+ if (config.image) upsertMeta("name", "twitter:image", config.image);
153
+ for (const obj of config.jsonLd ?? []) {
154
+ const script = document.createElement("script");
155
+ script.type = "application/ld+json";
156
+ script.setAttribute(MANAGED, "");
157
+ script.text = JSON.stringify(obj);
158
+ document.head.appendChild(script);
159
+ }
160
+ }
161
+ function useSeo(config) {
162
+ const key = JSON.stringify(config);
163
+ React2.useEffect(() => {
164
+ applySeo(config);
165
+ return () => clearManaged();
166
+ }, [key]);
167
+ }
168
+ function breadcrumbJsonLd(items) {
169
+ return {
170
+ "@context": "https://schema.org",
171
+ "@type": "BreadcrumbList",
172
+ itemListElement: items.map((c, i) => ({
173
+ "@type": "ListItem",
174
+ position: i + 1,
175
+ name: c.name,
176
+ item: c.url
177
+ }))
178
+ };
179
+ }
180
+ function organizationJsonLd(name, extra) {
181
+ return { "@type": "Organization", name, ...extra };
182
+ }
183
+
61
184
  // src/lib/format.ts
62
185
  var CURRENCY_BY_LOCALE = {
63
186
  "pt-BR": "BRL",
@@ -946,9 +1069,14 @@ Object.defineProperty(exports, "createFayzRuntimeClient", {
946
1069
  });
947
1070
  exports.BlockChildren = BlockChildren;
948
1071
  exports.BlockRenderer = BlockRenderer;
1072
+ exports.COUNTRIES = COUNTRIES;
949
1073
  exports.CURRENT_MANIFEST_VERSION = CURRENT_MANIFEST_VERSION;
1074
+ exports.DEFAULT_COUNTRY = DEFAULT_COUNTRY;
950
1075
  exports.WidgetZone = WidgetZone;
1076
+ exports.absoluteUrl = absoluteUrl;
951
1077
  exports.appManifestSchema = app_manifest_schema_default;
1078
+ exports.applySeo = applySeo;
1079
+ exports.breadcrumbJsonLd = breadcrumbJsonLd;
952
1080
  exports.buildCSV = buildCSV;
953
1081
  exports.createEventBus = createEventBus;
954
1082
  exports.createSafeDataProvider = createSafeDataProvider;
@@ -960,19 +1088,26 @@ exports.formatCurrency = formatCurrency;
960
1088
  exports.formatDate = formatDate;
961
1089
  exports.formatDateTime = formatDateTime;
962
1090
  exports.getActiveLocale = getActiveLocale;
1091
+ exports.getCountry = getCountry;
963
1092
  exports.getDefaultCurrency = getDefaultCurrency;
1093
+ exports.maskDigitCount = maskDigitCount;
1094
+ exports.maskPhone = maskPhone;
964
1095
  exports.migrateManifest = migrateManifest;
965
1096
  exports.navHistoryBack = navHistoryBack;
1097
+ exports.organizationJsonLd = organizationJsonLd;
966
1098
  exports.recordNavigation = recordNavigation;
967
1099
  exports.registerManifestMigration = registerManifestMigration;
968
1100
  exports.renderApp = renderApp;
969
1101
  exports.renderBlocks = renderBlocks;
970
1102
  exports.routeModule = routeModule;
1103
+ exports.seoOrigin = seoOrigin;
971
1104
  exports.setDefaultCurrency = setDefaultCurrency;
1105
+ exports.unmaskPhone = unmaskPhone;
972
1106
  exports.useManifest = useManifest;
973
1107
  exports.useNavHistoryStore = useNavHistoryStore;
974
1108
  exports.useNavReferrer = useNavReferrer;
975
1109
  exports.useOnEvent = useOnEvent;
1110
+ exports.useSeo = useSeo;
976
1111
  exports.validateManifest = validateManifest;
977
1112
  //# sourceMappingURL=index.cjs.map
978
1113
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/plugins.ts","../src/plugin/createSafeDataProvider.ts","../src/lib/format.ts","../src/lib/csv.ts","../src/events/index.tsx","../src/blocks/index.tsx","../src/manifest/index.ts","../src/manifest/app-manifest.schema.json","../src/app/render.tsx","../src/router/history.ts"],"names":["getSupabaseClientOptional","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 { 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\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 interface PluginAITool {\n id: string\n name: string\n description: string\n icon?: string\n mode: AIToolMode\n parameters?: AIToolParameters\n permission?: PluginPermissionRequirement\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 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}\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","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 } from '../types/permissions'\nimport type { BillingConfig } from '../types/billing'\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 = 2\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\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}\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])\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/** 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 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 v2`)\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","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://fayz.ai/schemas/app-manifest/v2.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\": [\"manifestVersion\", \"id\", \"name\", \"surfaces\"],\n \"additionalProperties\": false,\n \"properties\": {\n \"manifestVersion\": {\n \"type\": \"integer\",\n \"const\": 2,\n \"description\": \"Current AppManifest schema version. Older or newer versions require an explicit SDK migration before validation.\"\n },\n \"id\": { \"type\": \"string\", \"minLength\": 1, \"pattern\": \"^[a-z0-9][a-z0-9-]*$\" },\n \"name\": { \"type\": \"string\", \"minLength\": 1 },\n \"backend\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"provider\"],\n \"properties\": {\n \"provider\": { \"enum\": [\"supabase\", \"fayz-api\", \"fayz-shop\", \"mock\", \"custom\"] },\n \"projectRef\": { \"type\": \"string\", \"minLength\": 1 },\n \"url\": { \"type\": \"string\", \"minLength\": 1 },\n \"adapterId\": { \"type\": \"string\", \"minLength\": 1 },\n \"options\": { \"type\": \"object\" }\n }\n },\n \"locale\": { \"type\": \"object\" },\n \"theme\": { \"type\": \"object\" },\n \"permissions\": { \"type\": \"object\" },\n \"billing\": { \"type\": \"object\" },\n \"entities\": { \"type\": \"array\", \"items\": { \"type\": \"object\" } },\n \"surfaces\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"additionalProperties\": { \"$ref\": \"#/$defs/surface\" }\n }\n },\n \"$defs\": {\n \"surface\": {\n \"type\": \"object\",\n \"required\": [\"scaffold\"],\n \"additionalProperties\": false,\n \"properties\": {\n \"scaffold\": { \"type\": \"string\", \"minLength\": 1 },\n \"options\": { \"type\": \"object\" },\n \"plugins\": { \"type\": \"array\", \"items\": { \"$ref\": \"#/$defs/pluginRef\" } },\n \"pages\": { \"type\": \"array\", \"items\": { \"$ref\": \"#/$defs/page\" } }\n }\n },\n \"pluginRef\": {\n \"type\": \"object\",\n \"required\": [\"id\"],\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": { \"type\": \"string\", \"minLength\": 1 },\n \"config\": { \"type\": \"object\" },\n \"enabled\": { \"type\": \"boolean\" }\n }\n },\n \"page\": {\n \"type\": \"object\",\n \"required\": [\"path\"],\n \"additionalProperties\": false,\n \"description\": \"Exactly one of blocks/entity/component must be set.\",\n \"properties\": {\n \"path\": { \"type\": \"string\", \"minLength\": 1 },\n \"label\": { \"type\": \"string\" },\n \"icon\": { \"type\": \"string\" },\n \"section\": { \"enum\": [\"main\", \"secondary\", \"settings\"] },\n \"blocks\": { \"type\": \"array\", \"items\": { \"$ref\": \"#/$defs/block\" } },\n \"entity\": { \"type\": \"string\", \"minLength\": 1 },\n \"component\": { \"type\": \"string\", \"minLength\": 1 },\n \"permission\": {\n \"type\": \"object\",\n \"required\": [\"feature\", \"action\"],\n \"additionalProperties\": false,\n \"properties\": {\n \"feature\": { \"type\": \"string\", \"minLength\": 1 },\n \"action\": { \"type\": \"string\", \"minLength\": 1 }\n }\n }\n },\n \"oneOf\": [\n { \"required\": [\"blocks\"] },\n { \"required\": [\"entity\"] },\n { \"required\": [\"component\"] }\n ]\n },\n \"block\": {\n \"type\": \"object\",\n \"required\": [\"type\"],\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"type\": \"string\", \"minLength\": 1 },\n \"id\": { \"type\": \"string\" },\n \"props\": { \"type\": \"object\" },\n \"children\": { \"type\": \"array\", \"items\": { \"$ref\": \"#/$defs/block\" } }\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/plugin/createSafeDataProvider.ts","../src/phone/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/app-manifest.schema.json","../src/app/render.tsx","../src/router/history.ts"],"names":["getSupabaseClientOptional","useEffect","getCurrentLocale","React","React2","getBlock","React3","getScaffold","create","next"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsEO,IAAM,UAAA,GAAa;AAAA,EACxB,kBAAA,EAAoB,0BAAA;AAAA,EACpB,cAAA,EAAgB,sBAAA;AAAA,EAChB,YAAA,EAAc,oBAAA;AAAA,EACd,UAAA,EAAY,kBAAA;AAAA,EACZ,WAAA,EAAa,aAAA;AAAA,EACb,UAAA,EAAY,YAAA;AAAA,EACZ,eAAA,EAAiB,iBAAA;AAAA,EACjB,cAAA,EAAgB,gBAAA;AAAA,EAChB,QAAA,EAAU;AACZ;;;ACjEO,SAAS,sBAAA,CACd,cACA,QAAA,EACG;AACH,EAAA,IAAI,QAAA,GAAqB,IAAA;AACzB,EAAA,MAAM,MAAM,MAAS;AACnB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,QAAA,GAAWA,2CAAA,EAA0B,GAAI,YAAA,EAAa,GAAI,QAAA,EAAS;AAAA,IACrE;AACA,IAAA,OAAO,QAAA;AAAA,EACT,CAAA;AACA,EAAA,OAAO,IAAI,KAAA,CAAM,EAAC,EAAQ;AAAA,IACxB,GAAA,EAAK,CAAC,OAAA,EAAS,IAAA,KAAS,CAAA,GAAI,IAAA,KAAiB,GAAA,EAAI,CAAU,IAAI,CAAA,CAAE,GAAG,IAAI;AAAA,GACzE,CAAA;AACH;;;ACTA,SAAS,OAAO,IAAA,EAAsB;AACpC,EAAA,OAAO,IAAA,CACJ,WAAA,EAAY,CACZ,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,CACrB,KAAA,CAAM,EAAE,CAAA,CACR,GAAA,CAAI,CAAC,MAAM,MAAA,CAAO,aAAA,CAAc,MAAA,GAAU,CAAA,CAAE,UAAA,CAAW,CAAC,IAAI,EAAE,CAAC,CAAA,CAC/D,IAAA,CAAK,EAAE,CAAA;AACZ;AAEA,IAAM,GAAA,GAAkC;AAAA,EACtC,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,UAAU,IAAA,EAAM,KAAA,EAAO,MAAM,iBAAA,EAAkB;AAAA,EACnE,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,kBAAkB,IAAA,EAAM,IAAA,EAAM,MAAM,gBAAA,EAAiB;AAAA,EACzE,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,YAAY,IAAA,EAAM,MAAA,EAAQ,MAAM,aAAA,EAAc;AAAA,EAClE,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,aAAa,IAAA,EAAM,KAAA,EAAO,MAAM,gBAAA,EAAiB;AAAA,EACrE,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,aAAA,EAAc;AAAA,EAChE,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,aAAU,IAAA,EAAM,KAAA,EAAO,MAAM,cAAA,EAAe;AAAA,EAChE,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,eAAe,IAAA,EAAM,KAAA,EAAO,MAAM,cAAA,EAAe;AAAA,EACrE,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,aAAU,IAAA,EAAM,KAAA,EAAO,MAAM,eAAA,EAAgB;AAAA,EACjE,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,YAAY,IAAA,EAAM,KAAA,EAAO,MAAM,cAAA,EAAe;AAAA,EAClE,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,aAAU,IAAA,EAAM,KAAA,EAAO,MAAM,aAAA;AACnD,CAAA;AAEO,IAAM,SAAA,GAA0B,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,IAAI,GAAE,CAAE;AAE/E,IAAM,eAAA,GAAkB;AAE/B,IAAM,MAAA,GAAS,IAAI,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA;AAGjD,SAAS,WAAW,IAAA,EAAsC;AAC/D,EAAA,OAAQ,IAAA,IAAQ,OAAO,GAAA,CAAI,IAAA,CAAK,aAAa,CAAA,IAAM,MAAA,CAAO,GAAA,CAAI,eAAe,CAAA;AAC/E;AAGO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,OAAA,CAAQ,KAAA,IAAS,EAAA,EAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACxC;AAQO,SAAS,SAAA,CAAU,OAAe,IAAA,EAAsB;AAC7D,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,KAAA,MAAW,MAAM,IAAA,EAAM;AACrB,IAAA,IAAI,EAAA,IAAM,OAAO,MAAA,EAAQ;AACzB,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,GAAA,IAAO,OAAO,EAAA,EAAI,CAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,GAAA,IAAO,EAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,eAAe,IAAA,EAAsB;AACnD,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,EAAA,IAAM,IAAA,EAAM,IAAI,EAAA,KAAO,GAAA,EAAK,CAAA,EAAA;AACvC,EAAA,OAAO,CAAA;AACT;ACvEA,IAAM,OAAA,GAAU,eAAA;AAcT,SAAS,SAAA,GAAoB;AAClC,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,MAAA,GAAS,EAAA;AAClE;AAGO,SAAS,YAAY,IAAA,EAAsB;AAChD,EAAA,OAAO,CAAA,EAAG,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA,GAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA,CAAA;AAClE;AAEA,SAAS,UAAA,CAAW,IAAA,EAA2B,GAAA,EAAa,OAAA,EAAiB;AAC3E,EAAA,IAAI,CAAC,OAAA,EAAS;AACd,EAAA,IAAI,EAAA,GAAK,SAAS,IAAA,CAAK,aAAA,CAA+B,QAAQ,IAAI,CAAA,EAAA,EAAK,GAAG,CAAA,EAAA,CAAI,CAAA;AAC9E,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,EAAA,GAAK,QAAA,CAAS,cAAc,MAAM,CAAA;AAClC,IAAA,EAAA,CAAG,YAAA,CAAa,MAAM,GAAG,CAAA;AACzB,IAAA,EAAA,CAAG,YAAA,CAAa,SAAS,EAAE,CAAA;AAC3B,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,EAAE,CAAA;AAAA,EAC9B;AACA,EAAA,EAAA,CAAG,YAAA,CAAa,WAAW,OAAO,CAAA;AACpC;AAEA,SAAS,UAAA,CAAW,KAAa,IAAA,EAAc;AAC7C,EAAA,IAAI,CAAC,IAAA,EAAM;AACX,EAAA,IAAI,KAAK,QAAA,CAAS,IAAA,CAAK,aAAA,CAA+B,CAAA,UAAA,EAAa,GAAG,CAAA,EAAA,CAAI,CAAA;AAC1E,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,EAAA,GAAK,QAAA,CAAS,cAAc,MAAM,CAAA;AAClC,IAAA,EAAA,CAAG,YAAA,CAAa,OAAO,GAAG,CAAA;AAC1B,IAAA,EAAA,CAAG,YAAA,CAAa,SAAS,EAAE,CAAA;AAC3B,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,EAAE,CAAA;AAAA,EAC9B;AACA,EAAA,EAAA,CAAG,YAAA,CAAa,QAAQ,IAAI,CAAA;AAC9B;AAEA,SAAS,YAAA,GAAe;AACtB,EAAA,QAAA,CAAS,IAAA,CAAK,gBAAA,CAAiB,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,EAAA,KAAO,EAAA,CAAG,MAAA,EAAQ,CAAA;AAC5E;AAGO,SAAS,SAAS,MAAA,EAAyB;AAChD,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,YAAA,EAAa;AACb,EAAA,QAAA,CAAS,QAAQ,MAAA,CAAO,KAAA;AACxB,EAAA,UAAA,CAAW,MAAA,EAAQ,aAAA,EAAe,MAAA,CAAO,WAAA,IAAe,EAAE,CAAA;AAC1D,EAAA,IAAI,MAAA,CAAO,SAAA,EAAW,UAAA,CAAW,WAAA,EAAa,OAAO,SAAS,CAAA;AAE9D,EAAA,UAAA,CAAW,UAAA,EAAY,UAAA,EAAY,MAAA,CAAO,KAAK,CAAA;AAC/C,EAAA,UAAA,CAAW,UAAA,EAAY,gBAAA,EAAkB,MAAA,CAAO,WAAA,IAAe,EAAE,CAAA;AACjE,EAAA,UAAA,CAAW,YAAY,SAAA,EAAW,MAAA,CAAO,IAAA,KAAS,SAAA,GAAY,YAAY,SAAS,CAAA;AACnF,EAAA,IAAI,OAAO,SAAA,EAAW,UAAA,CAAW,UAAA,EAAY,QAAA,EAAU,OAAO,SAAS,CAAA;AACvE,EAAA,IAAI,OAAO,KAAA,EAAO,UAAA,CAAW,UAAA,EAAY,UAAA,EAAY,OAAO,KAAK,CAAA;AACjE,EAAA,IAAI,OAAO,QAAA,EAAU,UAAA,CAAW,UAAA,EAAY,cAAA,EAAgB,OAAO,QAAQ,CAAA;AAE3E,EAAA,UAAA,CAAW,MAAA,EAAQ,cAAA,EAAgB,MAAA,CAAO,KAAA,GAAQ,wBAAwB,SAAS,CAAA;AACnF,EAAA,UAAA,CAAW,MAAA,EAAQ,eAAA,EAAiB,MAAA,CAAO,KAAK,CAAA;AAChD,EAAA,UAAA,CAAW,MAAA,EAAQ,qBAAA,EAAuB,MAAA,CAAO,WAAA,IAAe,EAAE,CAAA;AAClE,EAAA,IAAI,OAAO,KAAA,EAAO,UAAA,CAAW,MAAA,EAAQ,eAAA,EAAiB,OAAO,KAAK,CAAA;AAElE,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,MAAA,IAAU,EAAC,EAAG;AACrC,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,IAAA,GAAO,qBAAA;AACd,IAAA,MAAA,CAAO,YAAA,CAAa,SAAS,EAAE,CAAA;AAC/B,IAAA,MAAA,CAAO,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAChC,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,EAClC;AACF;AAGO,SAAS,OAAO,MAAA,EAAyB;AAC9C,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AACjC,EAAAC,gBAAA,CAAU,MAAM;AACd,IAAA,QAAA,CAAS,MAAM,CAAA;AACf,IAAA,OAAO,MAAM,YAAA,EAAa;AAAA,EAE5B,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AACV;AAUO,SAAS,iBAAiB,KAAA,EAAkD;AACjF,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,oBAAA;AAAA,IACZ,OAAA,EAAS,gBAAA;AAAA,IACT,eAAA,EAAiB,KAAA,CAAM,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,MACpC,OAAA,EAAS,UAAA;AAAA,MACT,UAAU,CAAA,GAAI,CAAA;AAAA,MACd,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,MAAM,CAAA,CAAE;AAAA,KACV,CAAE;AAAA,GACJ;AACF;AAGO,SAAS,kBAAA,CAAmB,MAAc,KAAA,EAA0D;AACzG,EAAA,OAAO,EAAE,OAAA,EAAS,cAAA,EAAgB,IAAA,EAAM,GAAG,KAAA,EAAM;AACnD;;;AC3HA,IAAM,kBAAA,GAA6C;AAAA,EACjD,OAAA,EAAS,KAAA;AAAA,EACT,OAAA,EAAS,KAAA;AAAA,EACT,EAAA,EAAI,KAAA;AAAA,EACJ,OAAA,EAAS,KAAA;AAAA,EACT,OAAA,EAAS,KAAA;AAAA,EACT,EAAA,EAAI;AACN,CAAA;AAEA,IAAI,gBAAA,GAAkC,IAAA;AAE/B,SAAS,mBAAmB,IAAA,EAAgC;AACjE,EAAA,gBAAA,GAAmB,IAAA,IAAQ,IAAA;AAC7B;AAEO,SAAS,eAAA,GAA0B;AACxC,EAAA,IAAI;AACF,IAAA,OAAOC,oCAAiB,IAAK,IAAA;AAAA,EAC/B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,kBAAA,GAA6B;AAC3C,EAAA,IAAI,kBAAkB,OAAO,gBAAA;AAC7B,EAAA,OAAO,kBAAA,CAAmB,eAAA,EAAiB,CAAA,IAAK,KAAA;AAClD;AAEO,SAAS,cAAA,CAAe,OAAgB,QAAA,EAA2B;AACxE,EAAA,MAAM,GAAA,GAAM,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,UAAA,CAAW,MAAA,CAAO,KAAK,CAAC,CAAA;AACxE,EAAA,IAAI,MAAM,GAAG,CAAA,EAAG,OAAO,MAAA,CAAO,SAAS,EAAE,CAAA;AACzC,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,eAAA,EAAgB,EAAG;AAAA,IAC9C,KAAA,EAAO,UAAA;AAAA,IACP,QAAA,EAAU,YAAY,kBAAA;AAAmB,GAC1C,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA;AACf;AAEO,SAAS,WAAW,KAAA,EAAwB;AACjD,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,eAAA,IAAmB,EAAE,SAAA,EAAW,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,IAAI,IAAA,CAAK,KAAe,CAAC,CAAA;AAAA,EAC7G,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AACF;AAEO,SAAS,eAAe,KAAA,EAAwB;AACrD,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,eAAA,EAAgB,EAAG,EAAE,SAAA,EAAW,QAAA,EAAU,SAAA,EAAW,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,IAAI,IAAA,CAAK,KAAe,CAAC,CAAA;AAAA,EACjI,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AACF;;;AClDO,SAAS,eAAe,KAAA,EAAwB;AACrD,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,EAAA;AAC1B,EAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,EAAA,IAAI,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AAChE,IAAA,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,QAAA,CACd,SACA,IAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,KAAK,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACnE,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA;AAAA,IAAI,CAAC,GAAA,KACrB,OAAA,CACG,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AACvB,MAAA,MAAM,YAAY,GAAA,CAAI,MAAA,GAAS,IAAI,MAAA,CAAO,GAAA,EAAK,GAAG,CAAA,GAAI,GAAA;AACtD,MAAA,OAAO,eAAe,SAAS,CAAA;AAAA,IACjC,CAAC,CAAA,CACA,IAAA,CAAK,GAAG;AAAA,GACb;AACA,EAAA,OAAO,CAAC,MAAA,EAAQ,GAAG,IAAI,CAAA,CAAE,KAAK,IAAI,CAAA;AACpC;AAGO,SAAS,WAAA,CAAY,KAAa,QAAA,EAAwB;AAC/D,EAAA,MAAM,GAAA,GAAM,QAAA;AACZ,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,GAAA,GAAM,GAAG,CAAA,EAAG,EAAE,IAAA,EAAM,yBAAA,EAA2B,CAAA;AACtE,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,EAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,EAAA,CAAA,CAAE,WAAW,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,GAAI,QAAA,GAAW,GAAG,QAAQ,CAAA,IAAA,CAAA;AAC/D,EAAA,CAAA,CAAE,KAAA,EAAM;AACR,EAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AACzB;AAGO,SAAS,SAAA,CACd,OAAA,EACA,IAAA,EACA,QAAA,EACM;AACN,EAAA,WAAA,CAAY,QAAA,CAAS,OAAA,EAAS,IAAI,CAAA,EAAG,QAAQ,CAAA;AAC/C;AChCO,SAAS,cAAA,GAA2B;AACzC,EAAA,MAAM,QAAA,uBAAe,GAAA,EAA+B;AACpD,EAAA,MAAM,GAAA,GAAgB;AAAA,IACpB,IAAA,CAAK,OAAO,OAAA,EAAS;AACnB,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AAC9B,MAAA,IAAI,CAAC,GAAA,EAAK;AAEV,MAAA,KAAA,MAAW,OAAA,IAAW,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,EAAG;AACrC,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,QACjB,SAAS,GAAA,EAAK;AAEZ,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,0BAAA,EAA6B,KAAK,CAAA,QAAA,CAAA,EAAY,GAAG,CAAA;AAAA,QACjE;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,EAAA,CAAG,OAAO,OAAA,EAAS;AACjB,MAAA,IAAI,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AAC5B,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,GAAA,uBAAU,GAAA,EAAI;AACd,QAAA,QAAA,CAAS,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,MACzB;AACA,MAAA,GAAA,CAAI,IAAI,OAAuB,CAAA;AAC/B,MAAA,OAAO,MAAM,GAAA,CAAI,GAAA,CAAI,KAAA,EAAO,OAAO,CAAA;AAAA,IACrC,CAAA;AAAA,IACA,IAAA,CAAK,OAAO,OAAA,EAAS;AACnB,MAAA,MAAM,OAAA,GAAwB,CAAC,OAAA,KAAY;AACzC,QAAA,GAAA,CAAI,GAAA,CAAI,OAAO,OAAO,CAAA;AACrB,QAAC,QAAyB,OAAO,CAAA;AAAA,MACpC,CAAA;AACA,MAAA,OAAO,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,OAAO,CAAA;AAAA,IAC9B,CAAA;AAAA,IACA,GAAA,CAAI,OAAO,OAAA,EAAS;AAClB,MAAA,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,EAAG,MAAA,CAAO,OAAuB,CAAA;AAAA,IACrD,CAAA;AAAA,IACA,MAAM,KAAA,EAAO;AACX,MAAA,IAAI,KAAA,EAAO,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAAA,oBAClB,KAAA,EAAM;AAAA,IACtB;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AAGO,IAAM,WAAqB,cAAA;AAI3B,SAAS,UAAA,CACd,KAAA,EACA,OAAA,EACA,IAAA,GAA6B,EAAC,EACxB;AACN,EAAA,MAAM,GAAA,GAAYC,yBAAO,OAAO,CAAA;AAChC,EAAA,GAAA,CAAI,OAAA,GAAU,OAAA;AACd,EAAMA,iBAAA,CAAA,SAAA;AAAA,IACJ,MAAM,SAAS,EAAA,CAAM,KAAA,EAAO,CAAC,OAAA,KAAY,GAAA,CAAI,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA;AAAA,IAE7D,CAAC,KAAA,EAAO,GAAG,IAAI;AAAA,GACjB;AACF;ACpDA,SAAS,YAAA,CAAa,EAAE,IAAA,EAAK,EAAgD;AAC3E,EAAA,OAAaC,iBAAA,CAAA,aAAA;AAAA,IACX,KAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,oBAAA;AAAA,QACR,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS,UAAA;AAAA,QACT,IAAA,EAAM,8BAAA;AAAA,QACN,YAAA,EAAc;AAAA;AAChB,KACF;AAAA,IACA,mBAAmB,IAAI,CAAA,CAAA;AAAA,GACzB;AACF;AAEO,SAAS,aAAA,CAAc,EAAE,IAAA,EAAK,EAAmD;AACtF,EAAA,MAAM,IAAA,GAAOC,0BAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,EAAU,MAAA,GAC5B,KAAK,QAAA,CAAS,GAAA;AAAA,IAAI,CAAC,KAAA,EAAO,CAAA,KAClBD,iBAAA,CAAA,aAAA,CAAc,aAAA,EAAe,EAAE,GAAA,EAAK,KAAA,CAAM,EAAA,IAAM,CAAA,EAAG,MAAM,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,IAAA,EAAM,OAAO;AAAA,GAC3F,GACA,IAAA;AACJ,EAAA,IAAI,CAAC,MAAM,OAAaA,iBAAA,CAAA,aAAA,CAAc,cAAc,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,CAAA;AACvE,EAAA,OAAaA,iBAAA,CAAA,aAAA,CAAc,IAAA,EAAM,EAAE,GAAI,IAAA,CAAK,SAAS,EAAC,EAAI,IAAA,EAAK,EAAG,QAAQ,CAAA;AAC5E;AAGO,SAAS,aAAa,KAAA,EAAqC;AAChE,EAAA,OAAO,KAAA,CAAM,GAAA;AAAA,IAAI,CAAC,IAAA,EAAM,CAAA,KAChBA,iBAAA,CAAA,aAAA,CAAc,aAAA,EAAe,EAAE,GAAA,EAAK,IAAA,CAAK,EAAA,IAAM,CAAA,EAAG,KAAK,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,MAAM;AAAA,GAClF;AACF;AAGO,SAAS,aAAA,CAAc,EAAE,IAAA,EAAK,EAA0C;AAC7E,EAAA,IAAI,CAAC,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,OAAO,IAAA;AACpC,EAAA,OAAO,YAAA,CAAa,KAAK,QAAQ,CAAA;AACnC;;;AC/CO,IAAM,wBAAA,GAA2B;AA4ExC,IAAM,UAAA,uBAAiB,GAAA,EAA+B;AACtD,IAAM,4BAA+C,CAAC,UAAA,EAAY,UAAA,EAAY,WAAA,EAAa,QAAQ,QAAQ,CAAA;AAC3G,IAAM,wCAAwB,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,WAAA,EAAa,UAAU,CAAC,CAAA;AACvE,IAAM,mBAAA,uBAA0B,GAAA,CAAI;AAAA,EAClC,iBAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAC,CAAA;AACD,IAAM,kBAAA,uBAAyB,GAAA,CAAI,CAAC,YAAY,YAAA,EAAc,KAAA,EAAO,WAAA,EAAa,SAAS,CAAC,CAAA;AAC5F,IAAM,kBAAA,uBAAyB,GAAA,CAAI,CAAC,YAAY,SAAA,EAAW,SAAA,EAAW,OAAO,CAAC,CAAA;AAC9E,IAAM,uCAAuB,IAAI,GAAA,CAAI,CAAC,IAAA,EAAM,QAAA,EAAU,SAAS,CAAC,CAAA;AAChE,IAAM,eAAA,mBAAkB,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,WAAA,EAAa,YAAY,CAAC,CAAA;AACnH,IAAM,wCAAwB,IAAI,GAAA,CAAI,CAAC,SAAA,EAAW,QAAQ,CAAC,CAAA;AAC3D,IAAM,gBAAA,uBAAuB,GAAA,CAAI,CAAC,QAAQ,IAAA,EAAM,OAAA,EAAS,UAAU,CAAC,CAAA;AACpE,IAAM,iBAAA,GAAoB,sBAAA;AAGnB,SAAS,yBAAA,CAA0B,aAAqB,EAAA,EAA6B;AAC1F,EAAA,UAAA,CAAW,GAAA,CAAI,aAAa,EAAE,CAAA;AAChC;AAIO,SAAS,gBAAgB,KAAA,EAAiC;AAC/D,EAAA,IAAI,CAAA,GAAI,EAAE,GAAG,KAAA,EAAM;AACnB,EAAA,IAAI,UAAU,OAAO,CAAA,CAAE,eAAA,KAAoB,QAAA,GAAW,EAAE,eAAA,GAAkB,CAAA;AAC1E,EAAA,IAAI,UAAU,wBAAA,EAA0B;AACtC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,iBAAA,EAAoB,OAAO,CAAA,kCAAA,EAAqC,wBAAwB,CAAA,yBAAA;AAAA,KAC1F;AAAA,EACF;AACA,EAAA,OAAO,UAAU,wBAAA,EAA0B;AACzC,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8CAAA,EAAiD,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC7E;AACA,IAAA,CAAA,GAAI,QAAQ,CAAC,CAAA;AACb,IAAA,OAAA,IAAW,CAAA;AACX,IAAA,CAAA,CAAE,eAAA,GAAkB,OAAA;AAAA,EACtB;AACA,EAAA,OAAO,CAAA;AACT;AAIO,SAAS,iBAAiB,CAAA,EAA0B;AACzD,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,QAAA,GAAW,CAAA;AAEjB,EAAA,kBAAA,CAAmB,QAAA,EAAU,mBAAA,EAAqB,UAAA,EAAY,QAAQ,CAAA;AAEtE,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,eAAe,CAAA,EAAG;AAC/C,IAAA,QAAA,CAAS,KAAK,6CAA6C,CAAA;AAAA,EAC7D,CAAA,MAAA,IAAW,QAAA,CAAS,eAAA,KAAoB,wBAAA,EAA0B;AAChE,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,iCAAA,EAAoC,wBAAwB,CAAA,CAAE,CAAA;AAAA,EAC9E;AACA,EAAA,IAAI,OAAO,QAAA,CAAS,EAAA,KAAO,QAAA,IAAY,CAAC,QAAA,CAAS,EAAA,CAAG,IAAA,EAAK,EAAG,QAAA,CAAS,IAAA,CAAK,yBAAyB,CAAA;AAAA,OAAA,IAC1F,CAAC,iBAAA,CAAkB,IAAA,CAAK,SAAS,EAAA,CAAG,IAAA,EAAM,CAAA,EAAG;AACpD,IAAA,QAAA,CAAS,KAAK,+CAA+C,CAAA;AAAA,EAC/D;AACA,EAAA,IAAI,OAAO,QAAA,CAAS,IAAA,KAAS,QAAA,IAAY,CAAC,QAAA,CAAS,IAAA,CAAK,IAAA,EAAK,EAAG,QAAA,CAAS,IAAA,CAAK,2BAA2B,CAAA;AAEzG,EAAA,mBAAA,CAAoB,QAAA,CAAS,MAAA,EAAQ,iBAAA,EAAmB,QAAQ,CAAA;AAChE,EAAA,mBAAA,CAAoB,QAAA,CAAS,KAAA,EAAO,gBAAA,EAAkB,QAAQ,CAAA;AAC9D,EAAA,mBAAA,CAAoB,QAAA,CAAS,WAAA,EAAa,sBAAA,EAAwB,QAAQ,CAAA;AAC1E,EAAA,mBAAA,CAAoB,QAAA,CAAS,OAAA,EAAS,kBAAA,EAAoB,QAAQ,CAAA;AAClE,EAAA,IAAI,QAAA,CAAS,aAAa,MAAA,EAAW;AACnC,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,EAAG;AACrC,MAAA,QAAA,CAAS,KAAK,oCAAoC,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,QAAA,CAAS,OAAA,CAAQ,CAAC,MAAA,EAAQ,KAAA,KAAU;AAC3C,QAAA,IAAI,CAAC,SAAS,MAAM,CAAA,WAAY,IAAA,CAAK,CAAA,kBAAA,EAAqB,KAAK,CAAA,mBAAA,CAAqB,CAAA;AAAA,MACtF,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,CAAS,YAAY,MAAA,EAAW;AAClC,IAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG;AAC/B,MAAA,QAAA,CAAS,KAAK,oCAAoC,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,kBAAA,CAAmB,QAAA,CAAS,OAAA,EAAS,kBAAA,EAAoB,kBAAA,EAAoB,QAAQ,CAAA;AACrF,MAAA,MAAM,QAAA,GAAW,SAAS,OAAA,CAAQ,QAAA;AAClC,MAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,CAAC,yBAAA,CAA0B,QAAA,CAAS,QAA2B,CAAA,EAAG;AACpG,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,2BAAA,EAA8B,MAAA,CAAO,QAAQ,CAAC,CAAA,kBAAA,CAAoB,CAAA;AAAA,MAClF;AACA,MAAA,8BAAA,CAA+B,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,6BAAA,EAA+B,QAAQ,CAAA;AACnG,MAAA,8BAAA,CAA+B,QAAA,CAAS,OAAA,CAAQ,GAAA,EAAK,sBAAA,EAAwB,QAAQ,CAAA;AACrF,MAAA,IAAI,aAAa,QAAA,IAAY,CAAC,iBAAiB,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC1E,QAAA,QAAA,CAAS,KAAK,kEAAkE,CAAA;AAAA,MAClF,CAAA,MAAA,IAAW,aAAa,QAAA,EAAU;AAChC,QAAA,8BAAA,CAA+B,QAAA,CAAS,OAAA,CAAQ,SAAA,EAAW,4BAAA,EAA8B,QAAQ,CAAA;AAAA,MACnG;AACA,MAAA,mBAAA,CAAoB,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,0BAAA,EAA4B,QAAQ,CAAA;AAAA,IACpF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AAC/E,IAAA,QAAA,CAAS,KAAK,qDAAqD,CAAA;AAAA,EACrE,CAAA,MAAO;AACL,IAAA,KAAA,MAAW,CAAC,MAAM,OAAO,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC/D,MAAA,uBAAA,CAAwB,IAAA,EAAM,SAAS,QAAQ,CAAA;AAAA,IACjD;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,uBAAA,CAAwB,IAAA,EAAc,OAAA,EAAkB,QAAA,EAA0B;AACzF,EAAA,IAAI,CAAC,QAAA,CAAS,OAAO,CAAA,EAAG;AACtB,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,SAAA,EAAY,IAAI,CAAA,mBAAA,CAAqB,CAAA;AACnD,IAAA;AAAA,EACF;AAEA,EAAA,kBAAA,CAAmB,OAAA,EAAS,kBAAA,EAAoB,CAAA,SAAA,EAAY,IAAI,KAAK,QAAQ,CAAA;AAC7E,EAAA,IAAI,CAAC,iBAAiB,OAAA,CAAQ,QAAQ,GAAG,QAAA,CAAS,IAAA,CAAK,CAAA,SAAA,EAAY,IAAI,CAAA,0BAAA,CAA4B,CAAA;AACnG,EAAA,mBAAA,CAAoB,OAAA,CAAQ,OAAA,EAAS,CAAA,SAAA,EAAY,IAAI,aAAa,QAAQ,CAAA;AAE1E,EAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAW;AAC/B,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,EAAG;AACjC,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,SAAA,EAAY,IAAI,CAAA,wBAAA,CAA0B,CAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,MAAA,KAAA,MAAW,CAAC,KAAA,EAAO,IAAI,KAAK,OAAA,CAAQ,KAAA,CAAM,SAAQ,EAAG;AACnD,QAAA,oBAAA,CAAqB,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,QAAQ,CAAA;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,YAAY,MAAA,EAAW;AACjC,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,EAAG;AACnC,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,SAAA,EAAY,IAAI,CAAA,0BAAA,CAA4B,CAAA;AAAA,IAC5D,CAAA,MAAO;AACL,MAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,MAAA,KAAA,MAAW,CAAC,KAAA,EAAO,MAAM,KAAK,OAAA,CAAQ,OAAA,CAAQ,SAAQ,EAAG;AACvD,QAAA,iBAAA,CAAkB,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAW,QAAQ,CAAA;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,oBAAA,CACP,WAAA,EACA,KAAA,EACA,IAAA,EACA,WACA,QAAA,EACM;AACN,EAAA,MAAM,SAAA,GAAY,CAAA,SAAA,EAAY,WAAW,CAAA,QAAA,EAAW,QAAQ,CAAC,CAAA,CAAA;AAC7D,EAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,EAAG;AACnB,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,SAAS,CAAA,kBAAA,CAAoB,CAAA;AAC9C,IAAA;AAAA,EACF;AAEA,EAAA,kBAAA,CAAmB,IAAA,EAAM,eAAA,EAAiB,SAAA,EAAW,QAAQ,CAAA;AAE7D,EAAA,IAAI,CAAC,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA,EAAG;AAChC,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,SAAS,CAAA,kBAAA,CAAoB,CAAA;AAAA,EAChD,CAAA,MAAO;AACL,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK;AACtC,IAAA,IAAI,SAAA,CAAU,GAAA,CAAI,cAAc,CAAA,EAAG;AACjC,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,SAAA,EAAY,WAAW,CAAA,gCAAA,EAAmC,cAAc,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3F,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,IAAI,cAAc,CAAA;AAAA,IAC9B;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,IAAa,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,SAAS,CAAA,uBAAA,CAAyB,CAAA;AACnH,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAa,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,SAAS,CAAA,sBAAA,CAAwB,CAAA;AAChH,EAAA,IAAI,IAAA,CAAK,OAAA,KAAY,MAAA,KAAc,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,IAAY,CAAC,qBAAA,CAAsB,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,CAAA,EAAI;AAChH,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,SAAS,CAAA,iDAAA,CAAmD,CAAA;AAAA,EAC/E;AACA,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,MAAA,IAAa,CAAC,gBAAA,CAAiB,IAAA,CAAK,MAAM,CAAA,EAAG,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,SAAS,CAAA,kCAAA,CAAoC,CAAA;AAC/H,EAAA,IAAI,KAAK,SAAA,KAAc,MAAA,IAAa,CAAC,gBAAA,CAAiB,IAAA,CAAK,SAAS,CAAA,EAAG;AACrE,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,SAAS,CAAA,qCAAA,CAAuC,CAAA;AAAA,EACnE;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,SAAS,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,KAAK,IAAI,CAAA;AAChF,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,SAAS,CAAA,gDAAA,CAAkD,CAAA;AAAA,EAC9E;AAEA,EAAA,IAAI,IAAA,CAAK,eAAe,MAAA,EAAW;AACjC,IAAA,kBAAA,CAAmB,IAAA,CAAK,UAAA,EAAY,CAAA,EAAG,SAAS,eAAe,QAAQ,CAAA;AAAA,EACzE;AAEA,EAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC7B,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG;AAC/B,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,SAAS,CAAA,wBAAA,CAA0B,CAAA;AAAA,IACtD,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,UAAA,KAAe;AACzC,QAAA,qBAAA,CAAsB,OAAO,CAAA,EAAG,SAAS,CAAA,QAAA,EAAW,UAAU,KAAK,QAAQ,CAAA;AAAA,MAC7E,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,iBAAA,CACP,WAAA,EACA,KAAA,EACA,MAAA,EACA,WACA,QAAA,EACM;AACN,EAAA,MAAM,WAAA,GAAc,CAAA,SAAA,EAAY,WAAW,CAAA,UAAA,EAAa,QAAQ,CAAC,CAAA,CAAA;AACjE,EAAA,IAAI,CAAC,QAAA,CAAS,MAAM,CAAA,EAAG;AACrB,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,WAAW,CAAA,kBAAA,CAAoB,CAAA;AAChD,IAAA;AAAA,EACF;AAEA,EAAA,kBAAA,CAAmB,MAAA,EAAQ,oBAAA,EAAsB,WAAA,EAAa,QAAQ,CAAA;AAEtE,EAAA,IAAI,CAAC,gBAAA,CAAiB,MAAA,CAAO,EAAE,CAAA,EAAG;AAChC,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,WAAW,CAAA,gBAAA,CAAkB,CAAA;AAAA,EAChD,CAAA,MAAO;AACL,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,EAAA,CAAG,IAAA,EAAK;AACpC,IAAA,IAAI,SAAA,CAAU,GAAA,CAAI,YAAY,CAAA,EAAG;AAC/B,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,SAAA,EAAY,WAAW,CAAA,gCAAA,EAAmC,YAAY,CAAA,CAAA,CAAG,CAAA;AAAA,IACzF,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,IAAI,YAAY,CAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,mBAAA,CAAoB,MAAA,CAAO,MAAA,EAAQ,CAAA,EAAG,WAAW,WAAW,QAAQ,CAAA;AACpE,EAAA,IAAI,OAAO,OAAA,KAAY,MAAA,IAAa,OAAO,MAAA,CAAO,YAAY,SAAA,EAAW;AACvE,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,WAAW,CAAA,0BAAA,CAA4B,CAAA;AAAA,EAC1D;AACF;AAEA,SAAS,kBAAA,CAAmB,UAAA,EAAqB,IAAA,EAAc,QAAA,EAA0B;AACvF,EAAA,IAAI,CAAC,QAAA,CAAS,UAAU,CAAA,EAAG;AACzB,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,kBAAA,CAAoB,CAAA;AACzC,IAAA;AAAA,EACF;AAEA,EAAA,kBAAA,CAAmB,UAAA,EAAY,qBAAA,EAAuB,IAAA,EAAM,QAAQ,CAAA;AACpE,EAAA,IAAI,CAAC,iBAAiB,UAAA,CAAW,OAAO,GAAG,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,oBAAA,CAAsB,CAAA;AACtF,EAAA,IAAI,CAAC,iBAAiB,UAAA,CAAW,MAAM,GAAG,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,mBAAA,CAAqB,CAAA;AACtF;AAEA,SAAS,qBAAA,CAAsB,KAAA,EAAgB,IAAA,EAAc,QAAA,EAA0B;AACrF,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG;AACpB,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,kBAAA,CAAoB,CAAA;AACzC,IAAA;AAAA,EACF;AAEA,EAAA,kBAAA,CAAmB,KAAA,EAAO,gBAAA,EAAkB,IAAA,EAAM,QAAQ,CAAA;AAC1D,EAAA,IAAI,CAAC,iBAAiB,KAAA,CAAM,IAAI,GAAG,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,iBAAA,CAAmB,CAAA;AAC3E,EAAA,mBAAA,CAAoB,KAAA,CAAM,KAAA,EAAO,CAAA,EAAG,IAAI,UAAU,QAAQ,CAAA;AAC1D,EAAA,IAAI,KAAA,CAAM,EAAA,KAAO,MAAA,IAAa,OAAO,KAAA,CAAM,EAAA,KAAO,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,oBAAA,CAAsB,CAAA;AAEvG,EAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAChC,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,QAAQ,CAAA,EAAG;AAClC,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,0BAAA,CAA4B,CAAA;AAAA,IACnD,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU,qBAAA,CAAsB,KAAA,EAAO,CAAA,EAAG,IAAI,CAAA,UAAA,EAAa,KAAK,CAAA,CAAA,CAAA,EAAK,QAAQ,CAAC,CAAA;AAAA,IAC/G;AAAA,EACF;AACF;AAEA,SAAS,kBAAA,CACP,KAAA,EACA,WAAA,EACA,IAAA,EACA,QAAA,EACM;AACN,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AACpC,IAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,8BAAA,CAAgC,CAAA;AAAA,IAC9D;AAAA,EACF;AACF;AAEA,SAAS,mBAAA,CAAoB,KAAA,EAAgB,IAAA,EAAc,QAAA,EAA0B;AACnF,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3C,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,kBAAA,CAAoB,CAAA;AAAA,EAC3C;AACF;AAEA,SAAS,8BAAA,CAA+B,KAAA,EAAgB,IAAA,EAAc,QAAA,EAA0B;AAC9F,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,CAAC,gBAAA,CAAiB,KAAK,CAAA,EAAG;AACnD,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,2BAAA,CAA6B,CAAA;AAAA,EACpD;AACF;AAEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,iBAAiB,KAAA,EAAiC;AACzD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,IAAA,GAAO,MAAA,GAAS,CAAA;AAC5D;;;ACzYA,IAAA,2BAAA,GAAA;AAAA,EACE,OAAA,EAAW,8CAAA;AAAA,EACX,GAAA,EAAO,8CAAA;AAAA,EACP,KAAA,EAAS,kBAAA;AAAA,EACT,WAAA,EAAe,8GAAA;AAAA,EACf,IAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAY,CAAC,iBAAA,EAAmB,IAAA,EAAM,QAAQ,UAAU,CAAA;AAAA,EACxD,oBAAA,EAAwB,KAAA;AAAA,EACxB,UAAA,EAAc;AAAA,IACZ,eAAA,EAAmB;AAAA,MACjB,IAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAS,CAAA;AAAA,MACT,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,IAAM,EAAE,IAAA,EAAQ,UAAU,SAAA,EAAa,CAAA,EAAG,SAAW,sBAAA,EAAuB;AAAA,IAC5E,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAU,WAAa,CAAA,EAAE;AAAA,IAC3C,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ,QAAA;AAAA,MACR,oBAAA,EAAwB,KAAA;AAAA,MACxB,QAAA,EAAY,CAAC,UAAU,CAAA;AAAA,MACvB,UAAA,EAAc;AAAA,QACZ,QAAA,EAAY,EAAE,IAAA,EAAQ,CAAC,YAAY,UAAA,EAAY,WAAA,EAAa,MAAA,EAAQ,QAAQ,CAAA,EAAE;AAAA,QAC9E,UAAA,EAAc,EAAE,IAAA,EAAQ,QAAA,EAAU,WAAa,CAAA,EAAE;AAAA,QACjD,GAAA,EAAO,EAAE,IAAA,EAAQ,QAAA,EAAU,WAAa,CAAA,EAAE;AAAA,QAC1C,SAAA,EAAa,EAAE,IAAA,EAAQ,QAAA,EAAU,WAAa,CAAA,EAAE;AAAA,QAChD,OAAA,EAAW,EAAE,IAAA,EAAQ,QAAA;AAAS;AAChC,KACF;AAAA,IACA,MAAA,EAAU,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,IAC7B,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,IAC5B,WAAA,EAAe,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,IAClC,OAAA,EAAW,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,IAC9B,QAAA,EAAY,EAAE,IAAA,EAAQ,OAAA,EAAS,OAAS,EAAE,IAAA,EAAQ,UAAS,EAAE;AAAA,IAC7D,QAAA,EAAY;AAAA,MACV,IAAA,EAAQ,QAAA;AAAA,MACR,aAAA,EAAiB,CAAA;AAAA,MACjB,oBAAA,EAAwB,EAAE,IAAA,EAAQ,iBAAA;AAAkB;AACtD,GACF;AAAA,EACA,KAAA,EAAS;AAAA,IACP,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,UAAU,CAAA;AAAA,MACvB,oBAAA,EAAwB,KAAA;AAAA,MACxB,UAAA,EAAc;AAAA,QACZ,QAAA,EAAY,EAAE,IAAA,EAAQ,QAAA,EAAU,WAAa,CAAA,EAAE;AAAA,QAC/C,OAAA,EAAW,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC9B,OAAA,EAAW,EAAE,IAAA,EAAQ,OAAA,EAAS,OAAS,EAAE,IAAA,EAAQ,qBAAoB,EAAE;AAAA,QACvE,KAAA,EAAS,EAAE,IAAA,EAAQ,OAAA,EAAS,OAAS,EAAE,IAAA,EAAQ,gBAAe;AAAE;AAClE,KACF;AAAA,IACA,SAAA,EAAa;AAAA,MACX,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,IAAI,CAAA;AAAA,MACjB,oBAAA,EAAwB,KAAA;AAAA,MACxB,UAAA,EAAc;AAAA,QACZ,EAAA,EAAM,EAAE,IAAA,EAAQ,QAAA,EAAU,WAAa,CAAA,EAAE;AAAA,QACzC,MAAA,EAAU,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC7B,OAAA,EAAW,EAAE,IAAA,EAAQ,SAAA;AAAU;AACjC,KACF;AAAA,IACA,IAAA,EAAQ;AAAA,MACN,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,MAAM,CAAA;AAAA,MACnB,oBAAA,EAAwB,KAAA;AAAA,MACxB,WAAA,EAAe,qDAAA;AAAA,MACf,UAAA,EAAc;AAAA,QACZ,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAU,WAAa,CAAA,EAAE;AAAA,QAC3C,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC5B,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC3B,SAAW,EAAE,IAAA,EAAQ,CAAC,MAAA,EAAQ,WAAA,EAAa,UAAU,CAAA,EAAE;AAAA,QACvD,MAAA,EAAU,EAAE,IAAA,EAAQ,OAAA,EAAS,OAAS,EAAE,IAAA,EAAQ,iBAAgB,EAAE;AAAA,QAClE,MAAA,EAAU,EAAE,IAAA,EAAQ,QAAA,EAAU,WAAa,CAAA,EAAE;AAAA,QAC7C,SAAA,EAAa,EAAE,IAAA,EAAQ,QAAA,EAAU,WAAa,CAAA,EAAE;AAAA,QAChD,UAAA,EAAc;AAAA,UACZ,IAAA,EAAQ,QAAA;AAAA,UACR,QAAA,EAAY,CAAC,SAAA,EAAW,QAAQ,CAAA;AAAA,UAChC,oBAAA,EAAwB,KAAA;AAAA,UACxB,UAAA,EAAc;AAAA,YACZ,OAAA,EAAW,EAAE,IAAA,EAAQ,QAAA,EAAU,WAAa,CAAA,EAAE;AAAA,YAC9C,MAAA,EAAU,EAAE,IAAA,EAAQ,QAAA,EAAU,WAAa,CAAA;AAAE;AAC/C;AACF,OACF;AAAA,MACA,KAAA,EAAS;AAAA,QACP,EAAE,QAAA,EAAY,CAAC,QAAQ,CAAA,EAAE;AAAA,QACzB,EAAE,QAAA,EAAY,CAAC,QAAQ,CAAA,EAAE;AAAA,QACzB,EAAE,QAAA,EAAY,CAAC,WAAW,CAAA;AAAE;AAC9B,KACF;AAAA,IACA,KAAA,EAAS;AAAA,MACP,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,MAAM,CAAA;AAAA,MACnB,oBAAA,EAAwB,KAAA;AAAA,MACxB,UAAA,EAAc;AAAA,QACZ,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAU,WAAa,CAAA,EAAE;AAAA,QAC3C,EAAA,EAAM,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QACzB,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC5B,QAAA,EAAY,EAAE,IAAA,EAAQ,OAAA,EAAS,OAAS,EAAE,IAAA,EAAQ,iBAAgB;AAAE;AACtE;AACF;AAEJ;ACxFA,IAAM,eAAA,GAAwBE,gCAAkC,IAAI,CAAA;AAG7D,SAAS,WAAA,GAAkC;AAChD,EAAA,OAAaA,6BAAW,eAAe,CAAA;AACzC;AAGO,SAAS,UACd,QAAA,EACa;AACb,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,GAAG,QAAA;AAAA,IACH,eAAA,EAAiB,SAAS,eAAA,IAAmB;AAAA,GAC/C;AACA,EAAA,MAAM,QAAA,GAAW,iBAAiB,IAAI,CAAA;AACtC,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA;AAAA,GAAA,EAA4B,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,EACtE;AACA,EAAA,OAAO,IAAA;AACT;AASO,SAAS,SAAA,CACd,KAAA,EACA,IAAA,GAAyB,EAAC,EACN;AACpB,EAAA,MAAM,QAAA,GAAW,gBAAgB,KAAgC,CAAA;AACjE,EAAA,MAAM,QAAA,GAAW,iBAAiB,QAAQ,CAAA;AAC1C,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA;AAAA,GAAA,EAA4B,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,EACtE;AACA,EAAA,MAAM,WAAA,GAAc,KAAK,OAAA,IAAW,MAAA,CAAO,KAAK,QAAA,CAAS,QAAQ,EAAE,CAAC,CAAA;AACpE,EAAA,MAAM,OAAA,GAAU,WAAA,GAAc,QAAA,CAAS,QAAA,CAAS,WAAW,CAAA,GAAI,MAAA;AAC/D,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,WAAW,CAAA,wBAAA,CAA0B,CAAA;AAAA,EACnE;AACA,EAAA,MAAM,QAAA,GAAWC,6BAAA,CAAY,OAAA,CAAQ,QAAQ,CAAA;AAC7C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,UAAA,EAAa,QAAQ,QAAQ,CAAA,wHAAA;AAAA,KAC/B;AAAA,EACF;AACA,EAAA,OAAaD,iBAAA,CAAA,aAAA;AAAA,IACX,eAAA,CAAgB,QAAA;AAAA,IAChB,EAAE,OAAO,QAAA,EAAS;AAAA,IACZA,gCAAc,QAAA,EAAU,EAAE,QAAA,EAAU,OAAA,EAAS,aAAa;AAAA,GAClE;AACF;AC1CA,IAAM,WAAA,GAAc,EAAA;AAEb,IAAM,kBAAA,GAAqBE,cAAA,CAAwB,CAAC,GAAA,MAAS;AAAA,EAClE,OAAO,EAAC;AAAA,EACR,MAAA,EAAQ,CAAC,KAAA,KACP,GAAA,CAAI,CAAC,CAAA,KAAM;AACT,IAAA,MAAM,MAAM,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,KAAA,CAAM,SAAS,CAAC,CAAA;AACtC,IAAA,IAAI,GAAA,IAAO,GAAA,CAAI,IAAA,KAAS,KAAA,CAAM,IAAA,EAAM;AAClC,MAAA,IAAI,GAAA,CAAI,KAAA,KAAU,KAAA,CAAM,KAAA,EAAO,OAAO,CAAA;AACtC,MAAA,MAAMC,KAAAA,GAAO,CAAA,CAAE,KAAA,CAAM,KAAA,EAAM;AAC3B,MAAAA,KAAAA,CAAKA,KAAAA,CAAK,MAAA,GAAS,CAAC,CAAA,GAAI,KAAA;AACxB,MAAA,OAAO,EAAE,OAAOA,KAAAA,EAAK;AAAA,IACvB;AACA,IAAA,MAAM,IAAA,GAAO,CAAC,GAAG,CAAA,CAAE,OAAO,KAAK,CAAA;AAC/B,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,MAAA,GAAS,WAAA,GAAc,KAAK,KAAA,CAAM,CAAC,WAAW,CAAA,GAAI,IAAA,EAAK;AAAA,EAC9E,CAAC;AACL,CAAA,CAAE;AAGK,SAAS,gBAAA,CAAiB,MAAc,KAAA,EAAqB;AAClE,EAAA,kBAAA,CAAmB,UAAS,CAAE,MAAA,CAAO,EAAE,IAAA,EAAM,OAAO,CAAA;AACtD;AAGA,IAAI,OAAO,WAAW,WAAA,EAAa;AAChC,EAAC,OAAmE,YAAA,GAAe,kBAAA;AACtF;AASO,SAAS,eAAe,WAAA,EAA6C;AAC1E,EAAA,OAAO,kBAAA,CAAmB,CAAC,CAAA,KAAM;AAC/B,IAAA,KAAA,IAAS,IAAI,CAAA,CAAE,KAAA,CAAM,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC5C,MAAA,IAAI,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,SAAS,WAAA,EAAa,OAAO,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AAAA,IACvD;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACH;AAMO,SAAS,eAAe,QAAA,EAA6B;AAC1D,EAAA,IAAI,kBAAA,CAAmB,QAAA,EAAS,CAAE,KAAA,CAAM,UAAU,CAAA,EAAG;AACnD,IAAA,MAAA,CAAO,QAAQ,IAAA,EAAK;AAAA,EACtB,CAAA,MAAO;AACL,IAAA,QAAA,IAAW;AAAA,EACb;AACF;AAGO,SAAS,YAAY,IAAA,EAAsB;AAChD,EAAA,OAAO,IAAA,CAAK,QAAQ,MAAA,EAAQ,EAAE,EAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACnD","file":"index.cjs","sourcesContent":["import type React from 'react'\nimport type { EntityDef } from './crud'\nimport type { FeatureDeclaration, PermissionAction } from './permissions'\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\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 interface PluginAITool {\n id: string\n name: string\n description: string\n icon?: string\n mode: AIToolMode\n parameters?: AIToolParameters\n permission?: PluginPermissionRequirement\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 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}\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","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 } from '../types/permissions'\nimport type { BillingConfig } from '../types/billing'\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 = 2\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\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}\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])\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/** 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 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 v2`)\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","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://fayz.ai/schemas/app-manifest/v2.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\": [\"manifestVersion\", \"id\", \"name\", \"surfaces\"],\n \"additionalProperties\": false,\n \"properties\": {\n \"manifestVersion\": {\n \"type\": \"integer\",\n \"const\": 2,\n \"description\": \"Current AppManifest schema version. Older or newer versions require an explicit SDK migration before validation.\"\n },\n \"id\": { \"type\": \"string\", \"minLength\": 1, \"pattern\": \"^[a-z0-9][a-z0-9-]*$\" },\n \"name\": { \"type\": \"string\", \"minLength\": 1 },\n \"backend\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"provider\"],\n \"properties\": {\n \"provider\": { \"enum\": [\"supabase\", \"fayz-api\", \"fayz-shop\", \"mock\", \"custom\"] },\n \"projectRef\": { \"type\": \"string\", \"minLength\": 1 },\n \"url\": { \"type\": \"string\", \"minLength\": 1 },\n \"adapterId\": { \"type\": \"string\", \"minLength\": 1 },\n \"options\": { \"type\": \"object\" }\n }\n },\n \"locale\": { \"type\": \"object\" },\n \"theme\": { \"type\": \"object\" },\n \"permissions\": { \"type\": \"object\" },\n \"billing\": { \"type\": \"object\" },\n \"entities\": { \"type\": \"array\", \"items\": { \"type\": \"object\" } },\n \"surfaces\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"additionalProperties\": { \"$ref\": \"#/$defs/surface\" }\n }\n },\n \"$defs\": {\n \"surface\": {\n \"type\": \"object\",\n \"required\": [\"scaffold\"],\n \"additionalProperties\": false,\n \"properties\": {\n \"scaffold\": { \"type\": \"string\", \"minLength\": 1 },\n \"options\": { \"type\": \"object\" },\n \"plugins\": { \"type\": \"array\", \"items\": { \"$ref\": \"#/$defs/pluginRef\" } },\n \"pages\": { \"type\": \"array\", \"items\": { \"$ref\": \"#/$defs/page\" } }\n }\n },\n \"pluginRef\": {\n \"type\": \"object\",\n \"required\": [\"id\"],\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": { \"type\": \"string\", \"minLength\": 1 },\n \"config\": { \"type\": \"object\" },\n \"enabled\": { \"type\": \"boolean\" }\n }\n },\n \"page\": {\n \"type\": \"object\",\n \"required\": [\"path\"],\n \"additionalProperties\": false,\n \"description\": \"Exactly one of blocks/entity/component must be set.\",\n \"properties\": {\n \"path\": { \"type\": \"string\", \"minLength\": 1 },\n \"label\": { \"type\": \"string\" },\n \"icon\": { \"type\": \"string\" },\n \"section\": { \"enum\": [\"main\", \"secondary\", \"settings\"] },\n \"blocks\": { \"type\": \"array\", \"items\": { \"$ref\": \"#/$defs/block\" } },\n \"entity\": { \"type\": \"string\", \"minLength\": 1 },\n \"component\": { \"type\": \"string\", \"minLength\": 1 },\n \"permission\": {\n \"type\": \"object\",\n \"required\": [\"feature\", \"action\"],\n \"additionalProperties\": false,\n \"properties\": {\n \"feature\": { \"type\": \"string\", \"minLength\": 1 },\n \"action\": { \"type\": \"string\", \"minLength\": 1 }\n }\n }\n },\n \"oneOf\": [\n { \"required\": [\"blocks\"] },\n { \"required\": [\"entity\"] },\n { \"required\": [\"component\"] }\n ]\n },\n \"block\": {\n \"type\": \"object\",\n \"required\": [\"type\"],\n \"additionalProperties\": false,\n \"properties\": {\n \"type\": { \"type\": \"string\", \"minLength\": 1 },\n \"id\": { \"type\": \"string\" },\n \"props\": { \"type\": \"object\" },\n \"children\": { \"type\": \"array\", \"items\": { \"$ref\": \"#/$defs/block\" } }\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"]}
package/dist/index.d.ts CHANGED
@@ -15,6 +15,11 @@ export { createArchetypeProvider } from './data/archetype';
15
15
  export { withCache } from './data/cached';
16
16
  export { resolveDataProvider } from './data/resolve';
17
17
  export { createSafeDataProvider } from './plugin/createSafeDataProvider';
18
+ export { COUNTRIES, DEFAULT_COUNTRY, getCountry, unmaskPhone, maskPhone, maskDigitCount, } from './phone';
19
+ export type { CountryDef } from './phone';
20
+ export type { PaymentProvider, PaymentMethod, ChargeStatus, CreateChargeInput, PixCharge, } from './types/payment';
21
+ export { useSeo, applySeo, absoluteUrl, seoOrigin, breadcrumbJsonLd, organizationJsonLd, } from './seo';
22
+ export type { SeoConfig, BreadcrumbItem } from './seo';
18
23
  export type { DataProvider, CrudQuery, CrudResult, SupabaseProviderConfig, FayzApiProviderConfig } from './data/index';
19
24
  export { setActiveTenantId, getActiveTenantId } from './tenant';
20
25
  export { createFayzRuntimeClient, FayzRuntimeError } from './runtime';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}