@fayz-ai/core 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/dist/app/render.d.ts +16 -0
  2. package/dist/app/render.d.ts.map +1 -0
  3. package/dist/blocks/index.d.ts +25 -0
  4. package/dist/blocks/index.d.ts.map +1 -0
  5. package/dist/chunk-2NTHNWEH.cjs +32 -0
  6. package/dist/chunk-2NTHNWEH.cjs.map +1 -0
  7. package/dist/chunk-5EAZOMVP.js +1609 -0
  8. package/dist/chunk-5EAZOMVP.js.map +1 -0
  9. package/dist/chunk-5TKIZVVJ.cjs +16 -0
  10. package/dist/chunk-5TKIZVVJ.cjs.map +1 -0
  11. package/dist/chunk-7RTUHSKY.js +3 -0
  12. package/dist/chunk-7RTUHSKY.js.map +1 -0
  13. package/dist/chunk-AXTWKF5X.cjs +38 -0
  14. package/dist/chunk-AXTWKF5X.cjs.map +1 -0
  15. package/dist/chunk-EGWWQ7AT.cjs +355 -0
  16. package/dist/chunk-EGWWQ7AT.cjs.map +1 -0
  17. package/dist/chunk-KAYQFSR6.js +298 -0
  18. package/dist/chunk-KAYQFSR6.js.map +1 -0
  19. package/dist/chunk-LSVBDYFQ.cjs +1639 -0
  20. package/dist/chunk-LSVBDYFQ.cjs.map +1 -0
  21. package/dist/chunk-SNQW6TRF.cjs +658 -0
  22. package/dist/chunk-SNQW6TRF.cjs.map +1 -0
  23. package/dist/chunk-WKZVSKEU.js +26 -0
  24. package/dist/chunk-WKZVSKEU.js.map +1 -0
  25. package/dist/chunk-Y2C2FBQP.js +35 -0
  26. package/dist/chunk-Y2C2FBQP.js.map +1 -0
  27. package/dist/chunk-YSBXGHAM.js +643 -0
  28. package/dist/chunk-YSBXGHAM.js.map +1 -0
  29. package/dist/data/archetype.d.ts +13 -0
  30. package/dist/data/archetype.d.ts.map +1 -0
  31. package/dist/data/cached.d.ts +19 -0
  32. package/dist/data/cached.d.ts.map +1 -0
  33. package/dist/data/fayz-api.d.ts +19 -0
  34. package/dist/data/fayz-api.d.ts.map +1 -0
  35. package/dist/data/index.cjs +32 -0
  36. package/dist/data/index.cjs.map +1 -0
  37. package/dist/data/index.d.ts +9 -0
  38. package/dist/data/index.d.ts.map +1 -0
  39. package/dist/data/index.js +3 -0
  40. package/dist/data/index.js.map +1 -0
  41. package/dist/data/mock.d.ts +7 -0
  42. package/dist/data/mock.d.ts.map +1 -0
  43. package/dist/data/resolve.d.ts +22 -0
  44. package/dist/data/resolve.d.ts.map +1 -0
  45. package/dist/data/supabase.d.ts +18 -0
  46. package/dist/data/supabase.d.ts.map +1 -0
  47. package/dist/data/types.d.ts +23 -0
  48. package/dist/data/types.d.ts.map +1 -0
  49. package/dist/entity/index.cjs +28 -0
  50. package/dist/entity/index.cjs.map +1 -0
  51. package/dist/entity/index.d.ts +3 -0
  52. package/dist/entity/index.d.ts.map +1 -0
  53. package/dist/entity/index.js +3 -0
  54. package/dist/entity/index.js.map +1 -0
  55. package/dist/entity/registry.d.ts +20 -0
  56. package/dist/entity/registry.d.ts.map +1 -0
  57. package/dist/events/index.d.ts +16 -0
  58. package/dist/events/index.d.ts.map +1 -0
  59. package/dist/i18n/index.cjs +44 -0
  60. package/dist/i18n/index.cjs.map +1 -0
  61. package/dist/i18n/index.d.ts +21 -0
  62. package/dist/i18n/index.d.ts.map +1 -0
  63. package/dist/i18n/index.js +3 -0
  64. package/dist/i18n/index.js.map +1 -0
  65. package/dist/i18n/shell-translations.d.ts +2 -0
  66. package/dist/i18n/shell-translations.d.ts.map +1 -0
  67. package/dist/index.cjs +911 -0
  68. package/dist/index.cjs.map +1 -0
  69. package/dist/index.d.ts +46 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +596 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/lib/cache.d.ts +21 -0
  74. package/dist/lib/cache.d.ts.map +1 -0
  75. package/dist/lib/csv.d.ts +14 -0
  76. package/dist/lib/csv.d.ts.map +1 -0
  77. package/dist/lib/format.d.ts +7 -0
  78. package/dist/lib/format.d.ts.map +1 -0
  79. package/dist/manifest/index.d.ts +80 -0
  80. package/dist/manifest/index.d.ts.map +1 -0
  81. package/dist/plugin/createSafeDataProvider.d.ts +14 -0
  82. package/dist/plugin/createSafeDataProvider.d.ts.map +1 -0
  83. package/dist/plugin/index.cjs +32 -0
  84. package/dist/plugin/index.cjs.map +1 -0
  85. package/dist/plugin/index.d.ts +2 -0
  86. package/dist/plugin/index.d.ts.map +1 -0
  87. package/dist/plugin/index.js +3 -0
  88. package/dist/plugin/index.js.map +1 -0
  89. package/dist/plugin/runtime.d.ts +31 -0
  90. package/dist/plugin/runtime.d.ts.map +1 -0
  91. package/dist/registry/index.d.ts +88 -0
  92. package/dist/registry/index.d.ts.map +1 -0
  93. package/dist/router/index.cjs +16 -0
  94. package/dist/router/index.cjs.map +1 -0
  95. package/dist/router/index.d.ts +8 -0
  96. package/dist/router/index.d.ts.map +1 -0
  97. package/dist/router/index.js +3 -0
  98. package/dist/router/index.js.map +1 -0
  99. package/dist/runtime/index.cjs +16 -0
  100. package/dist/runtime/index.cjs.map +1 -0
  101. package/dist/runtime/index.d.ts +3 -0
  102. package/dist/runtime/index.d.ts.map +1 -0
  103. package/dist/runtime/index.js +3 -0
  104. package/dist/runtime/index.js.map +1 -0
  105. package/dist/runtime/oauth.d.ts +96 -0
  106. package/dist/runtime/oauth.d.ts.map +1 -0
  107. package/dist/tenant/index.d.ts +3 -0
  108. package/dist/tenant/index.d.ts.map +1 -0
  109. package/dist/types/auth.d.ts +27 -0
  110. package/dist/types/auth.d.ts.map +1 -0
  111. package/dist/types/billing.d.ts +17 -0
  112. package/dist/types/billing.d.ts.map +1 -0
  113. package/dist/types/crud.d.ts +107 -0
  114. package/dist/types/crud.d.ts.map +1 -0
  115. package/dist/types/entities.d.ts +134 -0
  116. package/dist/types/entities.d.ts.map +1 -0
  117. package/dist/types/i18n.d.ts +8 -0
  118. package/dist/types/i18n.d.ts.map +1 -0
  119. package/dist/types/index.cjs +4 -0
  120. package/dist/types/index.cjs.map +1 -0
  121. package/dist/types/index.d.ts +10 -0
  122. package/dist/types/index.d.ts.map +1 -0
  123. package/dist/types/index.js +3 -0
  124. package/dist/types/index.js.map +1 -0
  125. package/dist/types/org.d.ts +96 -0
  126. package/dist/types/org.d.ts.map +1 -0
  127. package/dist/types/permissions.d.ts +25 -0
  128. package/dist/types/permissions.d.ts.map +1 -0
  129. package/dist/types/plugins.d.ts +314 -0
  130. package/dist/types/plugins.d.ts.map +1 -0
  131. package/dist/types/theme.d.ts +16 -0
  132. package/dist/types/theme.d.ts.map +1 -0
  133. package/package.json +98 -0
  134. package/src/app/render.tsx +69 -0
  135. package/src/blocks/index.tsx +68 -0
  136. package/src/data/archetype.ts +210 -0
  137. package/src/data/cached.ts +55 -0
  138. package/src/data/fayz-api.ts +200 -0
  139. package/src/data/index.ts +8 -0
  140. package/src/data/mock.ts +84 -0
  141. package/src/data/resolve.ts +108 -0
  142. package/src/data/supabase.ts +169 -0
  143. package/src/data/types.ts +20 -0
  144. package/src/entity/index.ts +2 -0
  145. package/src/entity/registry.ts +42 -0
  146. package/src/events/index.tsx +82 -0
  147. package/src/i18n/index.ts +250 -0
  148. package/src/i18n/shell-translations.ts +1391 -0
  149. package/src/index.ts +132 -0
  150. package/src/lib/cache.ts +118 -0
  151. package/src/lib/csv.ts +54 -0
  152. package/src/lib/format.ts +58 -0
  153. package/src/manifest/app-manifest.schema.json +103 -0
  154. package/src/manifest/index.ts +394 -0
  155. package/src/plugin/createSafeDataProvider.ts +30 -0
  156. package/src/plugin/index.ts +1 -0
  157. package/src/plugin/runtime.ts +313 -0
  158. package/src/registry/index.ts +163 -0
  159. package/src/router/index.ts +29 -0
  160. package/src/runtime/index.ts +15 -0
  161. package/src/runtime/oauth.ts +219 -0
  162. package/src/tenant/index.ts +18 -0
  163. package/src/types/auth.ts +26 -0
  164. package/src/types/billing.ts +17 -0
  165. package/src/types/crud.ts +108 -0
  166. package/src/types/entities.ts +142 -0
  167. package/src/types/i18n.ts +7 -0
  168. package/src/types/index.ts +10 -0
  169. package/src/types/org.ts +94 -0
  170. package/src/types/permissions.ts +32 -0
  171. package/src/types/plugins.ts +363 -0
  172. package/src/types/theme.ts +17 -0
@@ -0,0 +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"],"names":["getSupabaseClientOptional","getCurrentLocale","React","React2","getBlock","React3","getScaffold"],"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'\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; 'plugin-home' =\n * the owning plugin's own overview page. */\nexport type DashboardSurface = 'home' | 'plugin-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\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 migrations?: PluginMigration[]\n onboarding?: PluginOnboarding\n locales?: Record<string, Record<string, string>>\n /** Marketplace metadata for npm discovery */\n marketplace?: {\n category: string\n tags: string[]\n author: string\n license: string\n repository?: string\n }\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 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/app-runtime.`,\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"]}
@@ -0,0 +1,46 @@
1
+ export type { EntityArchetype, BaseEntity, PersonEntity, ProductEntity, ServiceEntity, OrderEntity, TransactionEntity, LocationEntity, ScheduleEntity, CategoryEntity } from './types/entities';
2
+ export type { EntityDef, FieldDef, FieldType, FieldGroup, DetailTab, FormLayout, ComputedFieldValue } from './types/crud';
3
+ export type { PluginManifest, PluginScope, PluginStatus, ResolvedPluginManifest, PluginRuntime, PluginRuntimeContext, PluginWidgetZone, PluginWidgetDefinition, PluginNavigationEntry, PluginSettingsTab, PluginRouteDefinition, PluginAITool, PluginRegistryDef, PluginMigration, VerticalId, ScaffoldType, TenantPluginBinding, DashboardWidgetDef, DashboardWidgetKind, DashboardSurface, DashboardLayoutConfig, ResolvedDashboardWidget } from './types/plugins';
4
+ export { WidgetZone } from './types/plugins';
5
+ export type { AuthAdapter, AuthUser, AuthSession, AuthProvider } from './types/auth';
6
+ export type { OrgAdapter, Organization, OrgMember, OrgMembership, Location, Invite, CreateOrgOptions } from './types/org';
7
+ export type { PermissionsConfig, FeatureDeclaration, PermissionAction, PermissionProfile } from './types/permissions';
8
+ export type { Plan, BillingConfig } from './types/billing';
9
+ export type { SaasTheme, ThemeConfig, ThemeBrand, ThemeRadius, ThemeMode } from './types/theme';
10
+ export type { LocaleConfig } from './types/i18n';
11
+ export { createSupabaseProvider, setGlobalSupabaseClient, getSupabaseClientOptional } from './data/supabase';
12
+ export { createFayzApiProvider } from './data/fayz-api';
13
+ export { createMockProvider } from './data/mock';
14
+ export { createArchetypeProvider } from './data/archetype';
15
+ export { withCache } from './data/cached';
16
+ export { resolveDataProvider } from './data/resolve';
17
+ export { createSafeDataProvider } from './plugin/createSafeDataProvider';
18
+ export type { DataProvider, CrudQuery, CrudResult, SupabaseProviderConfig, FayzApiProviderConfig } from './data/index';
19
+ export { setActiveTenantId, getActiveTenantId } from './tenant';
20
+ export { createFayzRuntimeClient, FayzRuntimeError } from './runtime';
21
+ export type { FayzRuntimeClientOptions, FayzRuntimeEnvironment, GoogleCalendarEvent, GoogleCalendarEventInput, GoogleCalendarEventTime, ListGoogleCalendarEventsInput, PluginOAuthExchangeInput, PluginOAuthExchangeResponse, RuntimePluginOAuthGrant, } from './runtime';
22
+ export { formatCurrency, formatDate, formatDateTime, getActiveLocale, getDefaultCurrency, setDefaultCurrency } from './lib/format';
23
+ export { exportCSV, buildCSV, downloadCSV } from './lib/csv';
24
+ export type { CSVColumn } from './lib/csv';
25
+ export { globalCache, createCacheStore, stableKey, clearGlobalCache } from './lib/cache';
26
+ export type { CacheStore } from './lib/cache';
27
+ export { definePlugin, resolvePluginRuntime, getWidgetsForZone, getDashboardWidgets, PluginRuntimeProvider, usePluginRuntime, usePluginRuntimeOptional, PLUGIN_API_VERSION, resolvePluginComponent } from './plugin/runtime';
28
+ export type { PluginEventDefinition, PluginQuickAction } from './types/plugins';
29
+ export { createEventBus, eventBus, useOnEvent } from './events';
30
+ export type { EventBus, EventHandler } from './events';
31
+ export { registerEntity, getEntityByKey, getAllEntities, clearEntityRegistry, deriveEntityKey } from './entity/registry';
32
+ export type { RegisteredEntity } from './entity/registry';
33
+ export { Registry, isCustomId, componentRegistry, blockRegistry, pageRegistry, scaffoldRegistry, metricRegistry, pluginRegistry, registerComponent, getComponent, registerBlock, getBlock, listBlocks, registerPage, getPage, registerScaffold, getScaffold, registerMetric, getMetric, listMetrics, registerPlugin, getPlugin, listPlugins, pluginFactoryRegistry, registerPluginFactory, getPluginFactory, listPluginFactories, } from './registry';
34
+ export type { PluginFactory } from './registry';
35
+ export type { JsonSchema, RegistrySource, RegistryMeta, RegistryEntry, MetricFormat, MetricContext, MetricValue, MetricDefinition, } from './registry';
36
+ export { BlockRenderer, renderBlocks, BlockChildren } from './blocks';
37
+ export type { BlockNode, BlockComponentProps } from './blocks';
38
+ export { CURRENT_MANIFEST_VERSION, registerManifestMigration, migrateManifest, validateManifest, } from './manifest';
39
+ export type { AppManifest, BackendProvider, BackendRef, SurfaceManifest, PageManifest, PluginRef, ManifestMigration, } from './manifest';
40
+ export { default as appManifestSchema } from './manifest/app-manifest.schema.json';
41
+ export { defineApp, renderApp, useManifest } from './app/render';
42
+ export type { RenderAppOptions } from './app/render';
43
+ export { I18nProvider, useI18nConfig, useTranslation, coreTranslations, mergeTranslations, registerTranslations, getCurrentLocale, setCurrentLocale, setLocaleStore } from './i18n/index';
44
+ export { hashRouterAdapter, windowRouterAdapter } from './router/index';
45
+ export type { RouterAdapter } from './router/index';
46
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}