@fayz-ai/core 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/dist/access/engine.d.ts +31 -1
  2. package/dist/access/engine.d.ts.map +1 -1
  3. package/dist/access/index.d.ts +1 -1
  4. package/dist/access/index.d.ts.map +1 -1
  5. package/dist/access/index.js +24 -3
  6. package/dist/access/index.js.map +1 -1
  7. package/dist/app/app-config.d.ts +101 -0
  8. package/dist/app/app-config.d.ts.map +1 -0
  9. package/dist/app/service-client.d.ts +69 -0
  10. package/dist/app/service-client.d.ts.map +1 -0
  11. package/dist/{chunk-S5FOFKR4.js → chunk-2ZAUJVYP.js} +103 -24
  12. package/dist/chunk-2ZAUJVYP.js.map +1 -0
  13. package/dist/{chunk-KFBEKFII.js → chunk-BCI743RH.js} +37 -4
  14. package/dist/chunk-BCI743RH.js.map +1 -0
  15. package/dist/{chunk-IKZR3WSK.js → chunk-KJUD6JA5.js} +3 -3
  16. package/dist/{chunk-IKZR3WSK.js.map → chunk-KJUD6JA5.js.map} +1 -1
  17. package/dist/{chunk-7GJTLBG3.js → chunk-OHH26S4N.js} +3 -3
  18. package/dist/{chunk-7GJTLBG3.js.map → chunk-OHH26S4N.js.map} +1 -1
  19. package/dist/chunk-RCMFU3RZ.js +13 -0
  20. package/dist/chunk-RCMFU3RZ.js.map +1 -0
  21. package/dist/{chunk-RRYFXUQX.js → chunk-UMIZDILP.js} +7 -3
  22. package/dist/chunk-UMIZDILP.js.map +1 -0
  23. package/dist/{chunk-X4FRQR2R.js → chunk-ZIB6Y7TE.js} +153 -8
  24. package/dist/chunk-ZIB6Y7TE.js.map +1 -0
  25. package/dist/data/archetype.d.ts +5 -0
  26. package/dist/data/archetype.d.ts.map +1 -1
  27. package/dist/data/cached.d.ts +17 -2
  28. package/dist/data/cached.d.ts.map +1 -1
  29. package/dist/data/index.d.ts +1 -0
  30. package/dist/data/index.d.ts.map +1 -1
  31. package/dist/data/index.js +2 -2
  32. package/dist/data/missing-objects.d.ts +14 -0
  33. package/dist/data/missing-objects.d.ts.map +1 -0
  34. package/dist/data/offline.d.ts +10 -1
  35. package/dist/data/offline.d.ts.map +1 -1
  36. package/dist/data/resolve.d.ts.map +1 -1
  37. package/dist/data/supabase.d.ts +5 -0
  38. package/dist/data/supabase.d.ts.map +1 -1
  39. package/dist/data/unit-scope.d.ts +48 -0
  40. package/dist/data/unit-scope.d.ts.map +1 -0
  41. package/dist/events/envelope.d.ts.map +1 -1
  42. package/dist/events/index.d.ts +2 -0
  43. package/dist/events/index.d.ts.map +1 -1
  44. package/dist/events/log.d.ts.map +1 -1
  45. package/dist/events/useDataVersion.d.ts +28 -0
  46. package/dist/events/useDataVersion.d.ts.map +1 -0
  47. package/dist/i18n/index.d.ts.map +1 -1
  48. package/dist/i18n/index.js +1 -1
  49. package/dist/i18n/shell-translations.en.d.ts.map +1 -1
  50. package/dist/i18n/shell-translations.pt-br.d.ts.map +1 -1
  51. package/dist/index.d.ts +15 -2
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +653 -45
  54. package/dist/index.js.map +1 -1
  55. package/dist/integrations/index.js +2 -2
  56. package/dist/lib/debug.d.ts +12 -0
  57. package/dist/lib/debug.d.ts.map +1 -0
  58. package/dist/lib/unit.d.ts +20 -0
  59. package/dist/lib/unit.d.ts.map +1 -0
  60. package/dist/manifest/index.d.ts +45 -0
  61. package/dist/manifest/index.d.ts.map +1 -1
  62. package/dist/manifest/integration-surface.d.ts +16 -0
  63. package/dist/manifest/integration-surface.d.ts.map +1 -0
  64. package/dist/messaging/index.d.ts +5 -2
  65. package/dist/messaging/index.d.ts.map +1 -1
  66. package/dist/messaging/phone.d.ts +32 -0
  67. package/dist/messaging/phone.d.ts.map +1 -0
  68. package/dist/messaging/provider-template.d.ts +122 -0
  69. package/dist/messaging/provider-template.d.ts.map +1 -0
  70. package/dist/messaging/registry.d.ts +12 -1
  71. package/dist/messaging/registry.d.ts.map +1 -1
  72. package/dist/messaging/types.d.ts +32 -0
  73. package/dist/messaging/types.d.ts.map +1 -1
  74. package/dist/plugin/index.js +1 -1
  75. package/dist/plugin/runtime.d.ts.map +1 -1
  76. package/dist/search/engine.d.ts.map +1 -1
  77. package/dist/{shell-translations.pt-br-PTOWYXNA.js → shell-translations.pt-br-HD4F3QKU.js} +118 -7
  78. package/dist/shell-translations.pt-br-HD4F3QKU.js.map +1 -0
  79. package/dist/testing/index.js +3 -3
  80. package/dist/types/agents.d.ts +97 -0
  81. package/dist/types/agents.d.ts.map +1 -0
  82. package/dist/types/analytics.d.ts +15 -0
  83. package/dist/types/analytics.d.ts.map +1 -1
  84. package/dist/types/auth.d.ts +9 -0
  85. package/dist/types/auth.d.ts.map +1 -1
  86. package/dist/types/crud.d.ts +38 -0
  87. package/dist/types/crud.d.ts.map +1 -1
  88. package/dist/types/index.d.ts +2 -0
  89. package/dist/types/index.d.ts.map +1 -1
  90. package/dist/types/index.js +1 -1
  91. package/dist/types/org.d.ts +10 -0
  92. package/dist/types/org.d.ts.map +1 -1
  93. package/dist/types/plugins.d.ts +97 -0
  94. package/dist/types/plugins.d.ts.map +1 -1
  95. package/package.json +2 -2
  96. package/dist/chunk-KFBEKFII.js.map +0 -1
  97. package/dist/chunk-RRYFXUQX.js.map +0 -1
  98. package/dist/chunk-S5FOFKR4.js.map +0 -1
  99. package/dist/chunk-X4FRQR2R.js.map +0 -1
  100. package/dist/shell-translations.pt-br-PTOWYXNA.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data/count.ts","../src/data/platform-api.ts","../src/data/mock.ts","../src/data/archetype.ts","../src/data/cached.ts","../src/data/errors.ts","../src/events/bus.ts","../src/data/refresh.ts","../src/lib/cache-idb.ts","../src/data/offline.ts","../src/fields/store.ts","../src/lib/unit.ts","../src/data/custom-fields.ts","../src/data/resolve.ts","../src/data/missing-objects.ts","../src/data/query.ts","../src/data/bulk.ts"],"names":["getClient","options","flush","cache","cacheKey","pending","React2","removed"],"mappings":"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","file":"chunk-2ZAUJVYP.js","sourcesContent":["import { getSupabaseClientOptional } from './supabase'\nimport { getActiveTenantId } from '../lib/tenant'\n\n/**\n * Tenant-scoped row counter — the single cheap `count(*)` helper the access\n * engine uses to resolve quantity limits. Uses Supabase's `head:true` count so\n * no rows are transferred. Results are cached briefly per tenant+table+filter to\n * survive the burst of reads a page does (nav badge + gate + list), and can be\n * force-invalidated by creates via {@link invalidateCount}.\n *\n * MOCK MODE NEVER BLOCKS: with no global Supabase client the count is `0`, so\n * limits always read as \"well under cap\" — offline/demo apps stay fully usable.\n */\n\nexport interface CountByTenantOptions {\n /** Optional `kind` column filter for multi-kind tables. */\n kind?: string\n /** `'month'` counts rows created since the 1st of the current month; `'total'` (default) counts all. */\n period?: 'month' | 'total'\n /** Tenant override; defaults to the active tenant (getActiveTenantId). */\n tenantId?: string\n /** Skip the short-lived cache and hit the DB (used by fresh guard checks). */\n fresh?: boolean\n}\n\nconst TTL_MS = 15_000\n\ninterface CacheEntry {\n value: number\n expires: number\n}\n\nconst cache = new Map<string, CacheEntry>()\n\nfunction cacheKey(table: string, tenantId: string, kind: string | undefined, period: string): string {\n return `${tenantId}::${table}::${kind ?? ''}::${period}`\n}\n\nfunction startOfMonthISO(): string {\n const now = new Date()\n return new Date(now.getFullYear(), now.getMonth(), 1).toISOString()\n}\n\n/**\n * How long a usage count may take before we give up on it. Failing OPEN on an\n * error was always the policy (see below); a request that never settles is the\n * same failure with worse symptoms — a caller awaiting this (the create guards)\n * hangs forever, which reads to the user as a dead button. Observed on a cold\n * boot, where the query can be issued before the auth session is ready.\n */\nconst COUNT_TIMEOUT_MS = 5_000\n\n/**\n * Count rows in `table` for the given (or active) tenant.\n * Returns 0 when no Supabase client is registered (mock mode).\n */\nexport async function countByTenant(table: string, options: CountByTenantOptions = {}): Promise<number> {\n const tenantId = options.tenantId ?? getActiveTenantId()\n if (!tenantId) return 0\n\n const period = options.period ?? 'total'\n const key = cacheKey(table, tenantId, options.kind, period)\n\n if (!options.fresh) {\n const hit = cache.get(key)\n if (hit && hit.expires > Date.now()) return hit.value\n }\n\n const client = getSupabaseClientOptional() as {\n from: (t: string) => {\n select: (columns: string, opts: { count: 'exact'; head: true }) => {\n eq: (col: string, val: unknown) => unknown\n }\n }\n } | null\n\n // No client → mock/offline mode: never block.\n if (!client) return 0\n\n let query = client.from(table).select('*', { count: 'exact', head: true }).eq('tenant_id', tenantId) as {\n eq: (col: string, val: unknown) => unknown\n gte: (col: string, val: unknown) => unknown\n }\n\n if (options.kind) {\n query = query.eq('kind', options.kind) as typeof query\n }\n if (period === 'month') {\n query = query.gte('created_at', startOfMonthISO()) as typeof query\n }\n\n // On error OR timeout, fail OPEN (return 0) — a counting failure must never\n // wall a tenant out of their own product, and must never hang the UI awaiting\n // it. Enforcement's source of truth is the DB anyway.\n let timer: ReturnType<typeof setTimeout> | undefined\n const timeout = new Promise<{ count: null; error: unknown; timedOut: true }>((resolve) => {\n timer = setTimeout(() => resolve({ count: null, error: 'timeout', timedOut: true }), COUNT_TIMEOUT_MS)\n })\n const settled = await Promise.race([\n query as unknown as Promise<{ count: number | null; error: unknown }>,\n timeout,\n ])\n if (timer) clearTimeout(timer)\n\n const { count, error } = settled\n const value = error ? 0 : count ?? 0\n\n // A timed-out count is not a fact about the tenant — caching it would make one\n // slow request suppress the guard for the whole TTL.\n if (!(settled as { timedOut?: true }).timedOut) {\n cache.set(key, { value, expires: Date.now() + TTL_MS })\n }\n return value\n}\n\n/**\n * Drop cached counts. Called by create handlers (via invalidateLimit) so the\n * next read reflects the row they just added.\n *\n * @param tenantOrKey Substring matched against cache keys (a tenant id, a table\n * name, or any fragment). Omit to clear the entire cache.\n */\nexport function invalidateCount(tenantOrKey?: string): void {\n if (!tenantOrKey) {\n cache.clear()\n return\n }\n for (const key of cache.keys()) {\n if (key.includes(tenantOrKey)) cache.delete(key)\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from './types'\nimport { parseRangeFilter } from './filters'\n\ntype FayzApiFilterOperator = 'eq' | 'neq' | 'gt' | 'lt' | 'gte' | 'lte' | 'like' | 'ilike' | 'is_null' | 'is_not_null'\n\ninterface FayzApiTableFilter {\n column: string\n operator: FayzApiFilterOperator\n value?: unknown\n}\n\nexport interface FayzApiProviderConfig {\n baseUrl?: string\n projectId?: string\n tenantId?: string | (() => string | undefined)\n tenantIdColumn?: string | false\n entityKey?: string\n table?: string\n schema?: string\n idColumn?: string\n searchColumns?: string[]\n runtimeToken?: string | (() => string | undefined | Promise<string | undefined>)\n headers?: () => HeadersInit | Promise<HeadersInit>\n fetcher?: typeof fetch\n}\n\nfunction resolveTenantId(config?: FayzApiProviderConfig): string | undefined {\n const tenantId = config?.tenantId\n return typeof tenantId === 'function' ? tenantId() : tenantId\n}\n\nasync function resolveRuntimeToken(config?: FayzApiProviderConfig): Promise<string | undefined> {\n const runtimeToken = config?.runtimeToken\n return typeof runtimeToken === 'function' ? runtimeToken() : runtimeToken\n}\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/+$/, '')\n}\n\nfunction appendQuery(\n url: URL,\n query: CrudQuery,\n tenantId?: string,\n tenantIdColumn = 'tenant_id',\n searchColumns: string[] = [],\n): void {\n const filters = normalizeFilters(query.filters)\n if (query.search && searchColumns[0]) {\n filters.push({ column: searchColumns[0], operator: 'ilike', value: `%${query.search}%` })\n }\n if (query.sortBy) url.searchParams.set('sortColumn', query.sortBy)\n if (query.sortDir) url.searchParams.set('sortDirection', query.sortDir)\n if (query.page != null) url.searchParams.set('page', String(query.page))\n if (query.pageSize != null) url.searchParams.set('limit', String(query.pageSize))\n if (tenantId) filters.push({ column: tenantIdColumn, operator: 'eq', value: tenantId })\n if (filters.length > 0) url.searchParams.set('filters', JSON.stringify(filters))\n}\n\nasync function parseResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n const text = await response.text().catch(() => '')\n throw new Error(`[@fayz-ai/core] Fayz API request failed (${response.status}): ${text || response.statusText}`)\n }\n return response.json() as Promise<T>\n}\n\nfunction isFilterOperator(value: unknown): value is FayzApiFilterOperator {\n return typeof value === 'string' && [\n 'eq',\n 'neq',\n 'gt',\n 'lt',\n 'gte',\n 'lte',\n 'like',\n 'ilike',\n 'is_null',\n 'is_not_null',\n ].includes(value)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction normalizeFilters(filters?: Record<string, unknown>): FayzApiTableFilter[] {\n if (!filters) return []\n return Object.entries(filters).flatMap(([column, raw]): FayzApiTableFilter[] => {\n if (isRecord(raw) && isFilterOperator(raw.operator)) {\n return [{ column, operator: raw.operator, value: raw.value }]\n }\n // A range is TWO bounds on one column — sending it as a single `eq` filter\n // compared the column against an object and matched nothing.\n const range = parseRangeFilter(raw)\n if (range) {\n return (['gte', 'gt', 'lte', 'lt'] as const)\n .filter((op) => range[op] !== undefined)\n .map((op) => ({ column, operator: op, value: range[op] }))\n }\n return [{ column, operator: 'eq', value: raw }]\n })\n}\n\nexport function createFayzApiProvider<T extends { id: string }>(\n entityOrTable: string,\n config: FayzApiProviderConfig = {},\n): DataProvider<T> {\n const fetcher = config.fetcher ?? fetch\n const baseUrl = trimTrailingSlash(config.baseUrl ?? '')\n const projectId = config.projectId\n const table = config.table ?? entityOrTable\n const idColumn = config.idColumn ?? 'id'\n\n async function headers(runtimeToken?: string): Promise<HeadersInit> {\n return {\n 'Content-Type': 'application/json',\n ...(config.headers ? await config.headers() : {}),\n ...(runtimeToken ? { Authorization: `Bearer ${runtimeToken}` } : {}),\n }\n }\n\n function tableRowsUrl(runtime = false): URL {\n const prefix = baseUrl || (typeof window !== 'undefined' ? window.location.origin : 'http://localhost')\n const encodedProjectId = encodeURIComponent(projectId ?? 'current')\n const encodedTable = encodeURIComponent(table)\n const route = runtime\n ? `/api/v1/runtime/projects/${encodedProjectId}/database/tables/${encodedTable}/rows`\n : `/api/projects/${encodedProjectId}/database/tables/${encodedTable}/rows`\n const url = new URL(route, prefix)\n if (config.schema) url.searchParams.set('schema', config.schema)\n return url\n }\n\n function withTenant(data: Record<string, unknown>, runtime = false): Record<string, unknown> {\n if (runtime) return data\n const tenantId = resolveTenantId(config)\n if (!tenantId || config.tenantIdColumn === false) return data\n return { ...data, [config.tenantIdColumn ?? 'tenant_id']: tenantId }\n }\n\n function primaryKeys(id: string): Record<string, unknown> {\n return { [idColumn]: id }\n }\n\n async function listRows(query: CrudQuery): Promise<CrudResult<T>> {\n const runtimeToken = await resolveRuntimeToken(config)\n const runtime = Boolean(runtimeToken)\n const url = tableRowsUrl(runtime)\n appendQuery(\n url,\n query,\n runtime || config.tenantIdColumn === false ? undefined : resolveTenantId(config),\n config.tenantIdColumn || undefined,\n config.searchColumns,\n )\n const result = await parseResponse<{ rows: T[]; total: number }>(await fetcher(url, { headers: await headers(runtimeToken) }))\n return { data: result.rows, total: result.total }\n }\n\n async function assertTenantScopedRowExists(id: string, runtime = false): Promise<void> {\n if (runtime) return\n const tenantId = config.tenantIdColumn === false ? undefined : resolveTenantId(config)\n if (!tenantId) return\n\n const result = await listRows({ filters: { [idColumn]: id }, page: 1, pageSize: 1 })\n if (result.data.length === 0) {\n throw new Error(`[@fayz-ai/core] Row \"${id}\" was not found for the active tenant.`)\n }\n }\n\n return {\n async list(query: CrudQuery): Promise<CrudResult<T>> {\n return listRows(query)\n },\n\n async create(data) {\n const runtimeToken = await resolveRuntimeToken(config)\n const runtime = Boolean(runtimeToken)\n return parseResponse<T>(await fetcher(tableRowsUrl(runtime), {\n method: 'POST',\n headers: await headers(runtimeToken),\n body: JSON.stringify(withTenant(data as Record<string, unknown>, runtime)),\n }))\n },\n\n async update(id, data) {\n const runtimeToken = await resolveRuntimeToken(config)\n const runtime = Boolean(runtimeToken)\n await assertTenantScopedRowExists(id, runtime)\n return parseResponse<T>(await fetcher(tableRowsUrl(runtime), {\n method: 'PATCH',\n headers: await headers(runtimeToken),\n body: JSON.stringify({ primaryKeys: primaryKeys(id), data }),\n }))\n },\n\n async remove(id) {\n const runtimeToken = await resolveRuntimeToken(config)\n const runtime = Boolean(runtimeToken)\n await assertTenantScopedRowExists(id, runtime)\n await parseResponse<{ deletedCount: number }>(await fetcher(tableRowsUrl(runtime), {\n method: 'DELETE',\n headers: await headers(runtimeToken),\n body: JSON.stringify({ rows: [primaryKeys(id)] }),\n }))\n },\n\n async removeMany(ids) {\n if (!ids.length) return\n const runtimeToken = await resolveRuntimeToken(config)\n const runtime = Boolean(runtimeToken)\n // The tenant guard stays per id — it is the only thing stopping a delete\n // reaching another tenant's row when there is no runtime token. It costs a\n // read each; the DELETE itself is still one request for the whole batch.\n for (const id of ids) await assertTenantScopedRowExists(id, runtime)\n await parseResponse<{ deletedCount: number }>(await fetcher(tableRowsUrl(runtime), {\n method: 'DELETE',\n headers: await headers(runtimeToken),\n body: JSON.stringify({ rows: ids.map((id) => primaryKeys(id)) }),\n }))\n },\n }\n}\n","import type { DataProvider, CrudQuery, CrudResult } from './types'\nimport type { EntityDef } from '../types/crud'\nimport { matchesRange, parseRangeFilter } from './filters'\n\nexport function createMockProvider<T extends { id: string; [key: string]: unknown }>(\n entityDefOrSearchKeys: EntityDef<T> | string[],\n initialData: T[] = [],\n): DataProvider<T> {\n let items = [...initialData]\n\n const searchableKeys = Array.isArray(entityDefOrSearchKeys)\n ? entityDefOrSearchKeys\n : entityDefOrSearchKeys.fields.filter((f) => f.searchable).map((f) => f.key)\n\n const defaultSort = Array.isArray(entityDefOrSearchKeys) ? undefined : entityDefOrSearchKeys.defaultSort\n const defaultSortDir = Array.isArray(entityDefOrSearchKeys) ? 'asc' : (entityDefOrSearchKeys.defaultSortDir ?? 'asc')\n\n return {\n async list(query: CrudQuery): Promise<CrudResult<T>> {\n let filtered = [...items]\n\n if (query.search && searchableKeys.length > 0) {\n const term = query.search.toLowerCase()\n filtered = filtered.filter((item) =>\n searchableKeys.some((key) => {\n const val = item[key]\n return typeof val === 'string' && val.toLowerCase().includes(term)\n }),\n )\n }\n\n // Faceted / dynamic filters — same grammar the SQL providers speak, so a\n // date window behaves identically on mock data instead of silently\n // matching nothing (a range object is never `===` anything).\n if (query.filters) {\n for (const [key, val] of Object.entries(query.filters)) {\n if (val == null || val === '') continue\n const range = parseRangeFilter(val)\n filtered = range\n ? filtered.filter((item) => matchesRange(item[key], range))\n : filtered.filter((item) => item[key] === val)\n }\n }\n\n const sortBy = query.sortBy ?? defaultSort\n const sortDir = query.sortDir ?? defaultSortDir\n if (sortBy) {\n filtered.sort((a, b) => {\n const av = a[sortBy] ?? ''\n const bv = b[sortBy] ?? ''\n const cmp = typeof av === 'number' && typeof bv === 'number'\n ? av - bv\n : String(av).localeCompare(String(bv))\n return sortDir === 'desc' ? -cmp : cmp\n })\n }\n\n const total = filtered.length\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 50\n const start = (page - 1) * pageSize\n const data = filtered.slice(start, start + pageSize)\n return { data, total }\n },\n\n async create(data) {\n const now = new Date().toISOString()\n const item = {\n ...data,\n id: crypto.randomUUID(),\n tenantId: 'mock-tenant',\n createdAt: now,\n updatedAt: now,\n } as unknown as T\n items.unshift(item)\n return item\n },\n\n async update(id, data) {\n const idx = items.findIndex((i) => i.id === id)\n if (idx === -1) throw new Error(`[@fayz-ai/core] Mock provider: item not found: ${id}`)\n items[idx] = { ...items[idx], ...data, updatedAt: new Date().toISOString() }\n return items[idx]!\n },\n\n async remove(id) {\n items = items.filter((i) => i.id !== id)\n },\n\n async removeMany(ids) {\n const drop = new Set(ids)\n items = items.filter((i) => !drop.has(i.id))\n },\n }\n}\n","import type { DataProvider, CrudQuery, CrudResult } from './types'\nimport { getSupabaseClientOptional } from './supabase'\nimport { applyRangeToQuery, isFilterObject, parseRangeFilter } from './filters'\nimport { applyUnitScope, resolveUnitScope } from './unit-scope'\nimport type { EntityArchetype } from '../types/entities'\n\n// Archetypes that have a `kind` discriminator column\nconst HAS_KIND = new Set<EntityArchetype>(['person', 'category', 'order', 'transaction', 'schedule', 'location'])\n\nconst ARCHETYPE_CONFIG: Record<EntityArchetype, { table: string; fkColumn: string }> = {\n person: { table: 'people', fkColumn: 'person_id' },\n category: { table: 'categories', fkColumn: 'category_id' },\n product: { table: 'products', fkColumn: 'product_id' },\n service: { table: 'services', fkColumn: 'service_id' },\n location: { table: 'locations', fkColumn: 'location_id' },\n order: { table: 'orders', fkColumn: 'order_id' },\n transaction: { table: 'transactions', fkColumn: 'transaction_id' },\n\n schedule: { table: 'schedules', fkColumn: 'schedule_id' },\n}\n\n// `custom_fields` is on EVERY archetype (migration 034) and must be listed on\n// every one of them here. splitFields does not drop an unknown key — it routes\n// it to the extension table, so a missing entry does not degrade, it inserts\n// into a column `clients` does not have and fails the write at runtime.\nconst CUSTOM_FIELDS_COLUMN = 'custom_fields'\n\n/** `filters: { 'custom.tipoDePele': 'oleosa' }` — see the filter loop below. */\nconst CUSTOM_FIELD_FILTER_PREFIX = 'custom.'\n\n// The unit stamp (migration 041), listed for the same reason custom_fields is:\n// splitFields routes an unknown key to the EXTENSION table, so leaving it out\n// does not degrade — it inserts into a column `clients` does not have and fails\n// the write. `order` and `schedule` are absent on purpose: their unit column is\n// the `location_id` they have carried since 004 and which is already listed.\nconst UNIT_COLUMN = 'unit_id'\n\nconst ARCHETYPE_COLUMNS: Record<EntityArchetype, Set<string>> = {\n person: new Set(['name', 'email', 'phone', 'document_number', 'avatar_url', 'date_of_birth', 'address', 'city', 'state', 'country', 'postal_code', 'tags', 'is_active', 'is_bookable', 'notes', 'metadata', CUSTOM_FIELDS_COLUMN, UNIT_COLUMN]),\n category: new Set(['name', 'slug', 'parent_id', 'icon', 'color', 'sort_order', 'is_active', 'metadata', CUSTOM_FIELDS_COLUMN, UNIT_COLUMN]),\n product: new Set(['name', 'description', 'sku', 'price', 'cost', 'currency', 'unit', 'image_url', 'stock', 'min_stock', 'status', 'is_active', 'tags', 'metadata', 'category_id', CUSTOM_FIELDS_COLUMN, UNIT_COLUMN]),\n service: new Set(['name', 'description', 'price', 'cost', 'currency', 'duration_minutes', 'image_url', 'status', 'is_active', 'tags', 'metadata', 'category_id', CUSTOM_FIELDS_COLUMN, UNIT_COLUMN]),\n location: new Set(['name', 'email', 'phone', 'address', 'city', 'state', 'country', 'postal_code', 'is_headquarters', 'is_active', 'tags', 'notes', 'metadata', CUSTOM_FIELDS_COLUMN]),\n order: new Set(['reference_number', 'status', 'party_id', 'assignee_id', 'location_id', 'subtotal', 'discount', 'tax', 'total', 'currency', 'due_at', 'completed_at', 'notes', 'tags', 'metadata', CUSTOM_FIELDS_COLUMN]),\n transaction: new Set(['order_id', 'party_id', 'amount', 'currency', 'payment_method', 'reference', 'status', 'transacted_at', 'notes', 'metadata', CUSTOM_FIELDS_COLUMN, UNIT_COLUMN]),\n\n schedule: new Set(['assignee_id', 'location_id', 'day_of_week', 'specific_date', 'starts_at', 'ends_at', 'is_active', 'metadata', CUSTOM_FIELDS_COLUMN]),\n}\n\nfunction camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (c) => '_' + c.toLowerCase())\n}\n\nfunction snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, c) => c.toUpperCase())\n}\n\nfunction mapRow<T>(row: Record<string, unknown>): T {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(row)) {\n result[snakeToCamel(key)] = value\n }\n return result as T\n}\n\nexport interface ArchetypeProviderConfig {\n archetype: EntityArchetype\n archetypeKind: string\n projectTable: string\n tenantId: () => string | undefined\n searchColumns?: string[]\n /** Franchise scoping. Absent (every entity today) ⇒ nothing below changes. */\n unitScoped?: boolean\n unitColumn?: string\n includeSharedRows?: boolean\n unitId?: () => string | undefined\n}\n\nexport function createArchetypeProvider<T extends { id: string }>(\n config: ArchetypeProviderConfig,\n): DataProvider<T> {\n const ac = ARCHETYPE_CONFIG[config.archetype]\n const archetypeColumns = ARCHETYPE_COLUMNS[config.archetype]\n const { fkColumn } = ac\n\n function getClient() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase client not available')\n return supabase\n }\n\n // Core v1 lives in PUBLIC — the archetype base tables and the public extension\n // tables share one client/schema. `coreClient()` is kept as a thin alias so the\n // core/extension split below still reads clearly at each call site.\n function coreClient() {\n return getClient()\n }\n\n function unitScope() {\n return resolveUnitScope(config)\n }\n\n function splitFields(data: Record<string, unknown>): { archetypeData: Record<string, unknown>; projectData: Record<string, unknown> } {\n const archetypeData: Record<string, unknown> = {}\n const projectData: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(data)) {\n // `createdBy` entra na lista por dois motivos: quem o escreve é o gatilho\n // do banco (auth.uid()), e 'created_by' não está em ARCHETYPE_COLUMNS —\n // então, solto, ele cairia em `projectData` e o insert quebraria numa\n // coluna que a tabela de extensão não tem.\n // `ownerId` joins the list for the reason `createdBy` is on it: the value\n // is the database's to decide (041's stamping trigger), and a form that\n // could choose it would be choosing who a record belongs to.\n if (['id', 'createdAt', 'updatedAt', 'createdBy', 'ownerId', 'tenantId', fkColumn].includes(key)) continue\n const snakeKey = camelToSnake(key)\n if (archetypeColumns.has(snakeKey)) {\n archetypeData[snakeKey] = value\n } else {\n projectData[snakeKey] = value\n }\n }\n return { archetypeData, projectData }\n }\n\n // View name convention: v_{shortName} — maps project table to its view\n const VIEW_MAP: Record<string, string> = {\n clients: 'v_clients',\n staff_members: 'v_staff',\n }\n const viewName = VIEW_MAP[config.projectTable] ?? `v_${config.projectTable}`\n\n // Pure-archetype entity: the project table IS the archetype base (e.g. a\n // customers list configured with `table: 'people'`, no separate public\n // extension table). Read/write public.<base> directly — there is no public\n // extension row and no v_ view to join. Extension-table entities (clients,\n // staff_members, …) are unaffected.\n const isPure = config.projectTable === ac.table\n\n return {\n async list(query: CrudQuery): Promise<CrudResult<T>> {\n const tenantId = config.tenantId()\n if (!tenantId) return { data: [], total: 0 }\n\n // Pure archetype → read public.<base> directly (filtered by kind);\n // otherwise the v_ view (JOINs public extension with the public archetype).\n // 'none' skips PostgREST's count aggregate entirely — see CrudQuery.countMode.\n const countOpts = query.countMode === 'none' ? undefined : { count: 'exact' as const }\n let q = isPure\n ? coreClient().from(ac.table).select('*', countOpts).eq('tenant_id', tenantId)\n : getClient().from(viewName).select('*', countOpts).eq('tenant_id', tenantId)\n\n // The active unit narrows what is already permitted; it never widens it.\n // Applied to both branches because the v_ view is the same rows under\n // another name — and the view has to select the unit column through, or\n // this silently returns nothing.\n q = applyUnitScope(q, unitScope())\n\n if (isPure && HAS_KIND.has(config.archetype)) {\n q = q.eq('kind', config.archetypeKind)\n }\n\n // Faceted filters — equality, or real SQL bounds for a range object.\n // Silently dropping them made every caller post-filter one page of rows,\n // which reads as \"no records match\" whenever the match sits past it.\n if (query.filters) {\n for (const [key, val] of Object.entries(query.filters)) {\n if (val == null || val === '') continue\n // `custom.tipoDePele` is a key inside the jsonb column, not a column.\n // It has to bypass camelToSnake entirely: the merchant chose that key\n // and Postgres stores it verbatim, so snake-casing it looks up a key\n // that was never written. PostgREST spells the operator this way.\n const col = key.startsWith(CUSTOM_FIELD_FILTER_PREFIX)\n ? `${CUSTOM_FIELDS_COLUMN}->>${key.slice(CUSTOM_FIELD_FILTER_PREFIX.length)}`\n : camelToSnake(key)\n const range = parseRangeFilter(val)\n if (range) {\n q = applyRangeToQuery(q, col, range)\n continue\n }\n if (isFilterObject(val)) {\n throw new Error(\n `[@fayz-ai/core] Filter \"${key}\" is an object with no recognised bound. ` +\n 'Use {from,to} / {gte,lte,gt,lt} for ranges, or a plain value for equality.',\n )\n }\n q = q.eq(col, val)\n }\n }\n\n // Search\n if (query.search && config.searchColumns && config.searchColumns.length > 0) {\n const term = `%${query.search}%`\n const orClauses = config.searchColumns\n .map((col) => camelToSnake(col))\n .map((col) => `${col}.ilike.${term}`)\n if (orClauses.length > 0) {\n q = q.or(orClauses.join(','))\n }\n }\n\n // Sort\n if (query.sortBy) {\n q = q.order(camelToSnake(query.sortBy), { ascending: query.sortDir !== 'desc' })\n } else {\n q = q.order('created_at', { ascending: false })\n }\n\n // Pagination\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 50\n const from = (page - 1) * pageSize\n q = q.range(from, from + pageSize - 1)\n\n const { data, error, count } = await q\n if (error) throw error\n\n const rows = (data ?? []).map((row: Record<string, unknown>) => mapRow<T>(row))\n return { data: rows, total: count ?? 0 }\n },\n\n async create(data) {\n const tenantId = config.tenantId()\n if (!tenantId) throw new Error('No tenant selected')\n\n const { archetypeData, projectData } = splitFields(data as Record<string, unknown>)\n\n // 1. Insert into archetype table\n archetypeData.tenant_id = tenantId\n if (HAS_KIND.has(config.archetype)) {\n archetypeData.kind = config.archetypeKind\n }\n // Where it happened. The database stamps this too (041's trigger reads the\n // request header), so this is belt — but it is the belt that makes the row\n // the UI just wrote show up under the unit the UI was showing, without\n // waiting for a refetch.\n const scope = unitScope()\n if (scope && archetypeData[scope.column] === undefined) {\n archetypeData[scope.column] = scope.id\n }\n\n const { data: archetypeRow, error: archetypeError } = await coreClient()\n .from(ac.table)\n .insert(archetypeData)\n .select()\n .single()\n\n if (archetypeError) throw archetypeError\n const archetypeId = (archetypeRow as any).id\n\n // 2. Insert into project table with archetype FK as PK.\n // Pure-archetype entities have no extension table — skip this step.\n if (!isPure) {\n projectData[fkColumn] = archetypeId\n projectData.tenant_id = tenantId\n\n const { error: projectError } = await getClient()\n .from(config.projectTable)\n .insert(projectData)\n\n if (projectError) {\n await coreClient().from(ac.table).delete().eq('id', archetypeId)\n throw projectError\n }\n }\n\n return { id: archetypeId, ...archetypeRow, ...(isPure ? {} : projectData) } as unknown as T\n },\n\n async update(id, data) {\n const { archetypeData, projectData } = splitFields(data as Record<string, unknown>)\n\n if (Object.keys(archetypeData).length > 0) {\n const { error } = await coreClient()\n .from(ac.table)\n .update(archetypeData)\n .eq('id', id)\n if (error) throw error\n }\n\n if (!isPure && Object.keys(projectData).length > 0) {\n const { error } = await getClient()\n .from(config.projectTable)\n .update(projectData)\n .eq(fkColumn, id)\n if (error) throw error\n }\n\n // Re-fetch (archetype only for pure entities; otherwise join the extension)\n const { data: archetypeRow } = await coreClient().from(ac.table).select('*').eq('id', id).single()\n if (isPure) {\n return mapRow<T>({ ...archetypeRow, id } as Record<string, unknown>)\n }\n const { data: projectRow } = await getClient().from(config.projectTable).select('*').eq(fkColumn, id).single()\n\n // The extension wins the spread, which is right for every column it owns\n // — except this one. custom_fields lives on the archetype and only there;\n // an extension table that grew a column of the same name would otherwise\n // shadow the real values with its own, silently.\n const flat = { ...archetypeRow, ...projectRow, id }\n if (archetypeRow && CUSTOM_FIELDS_COLUMN in archetypeRow) {\n ;(flat as Record<string, unknown>)[CUSTOM_FIELDS_COLUMN] =\n (archetypeRow as Record<string, unknown>)[CUSTOM_FIELDS_COLUMN]\n }\n delete (flat as any)[fkColumn]\n return mapRow<T>(flat as Record<string, unknown>)\n },\n\n async remove(id) {\n const { error } = await coreClient()\n .from(ac.table)\n .delete()\n .eq('id', id)\n if (error) throw error\n },\n\n async removeMany(ids) {\n if (!ids.length) return\n const { error } = await coreClient()\n .from(ac.table)\n .delete()\n .in('id', ids)\n if (error) throw error\n },\n }\n}\n","import type { DataProvider, CrudQuery, CrudResult } from './types'\nimport { globalCache, stableKey } from '../lib/cache'\n\nexport interface ProviderCacheOptions {\n /** Table/entity name — used as cache key namespace */\n table: string\n /** Dynamic tenant ID resolver */\n tenantId: () => string | undefined\n /** Override default TTL for this entity (ms) */\n ttl?: number\n /**\n * Active unit resolver, passed ONLY for unit-scoped entities. Absent (the\n * default, and every entity today) means the key below is byte-identical to\n * what it has always been.\n */\n unitId?: () => string | undefined\n}\n\n/** The cache namespace one table owns. Everything under it dies with one invalidate. */\nexport function cachePrefixFor(tenantId: string | undefined, table: string): string {\n return `${tenantId ?? '_'}:${table}`\n}\n\n/**\n * The one read-key shape, shared with `withOffline` so both find the same entry.\n *\n * The unit goes INSIDE the query hash, never into the prefix. In the prefix it\n * would break every existing invalidation: writes and `emitDataChanged` clear\n * by `${tenant}:${table}`, so a record created while looking at one unit would\n * stay cached under \"todas\". Folded into `stableKey` the prefix keeps working,\n * and because `unitId` is undefined for non-scoped entities the key comes out\n * exactly as before — which is the whole claim that this phase changes nothing.\n */\nexport function cacheKeyFor(\n tenantId: string | undefined,\n table: string,\n query: CrudQuery,\n unitId?: string,\n): string {\n const keyed = unitId ? { ...query, __unit: unitId } : query\n return `${cachePrefixFor(tenantId, table)}:${stableKey(keyed)}`\n}\n\n/**\n * Wraps a DataProvider with transparent read caching + mutation invalidation.\n *\n * - `list()` results are cached by query params\n * - `create()`, `update()`, `remove()` invalidate all cached entries for the table\n */\nexport function withCache<T extends { id: string }>(\n provider: DataProvider<T>,\n options: ProviderCacheOptions,\n): DataProvider<T> {\n function prefix(): string {\n return cachePrefixFor(options.tenantId(), options.table)\n }\n\n return {\n async list(query: CrudQuery): Promise<CrudResult<T>> {\n const key = cacheKeyFor(options.tenantId(), options.table, query, options.unitId?.())\n const cached = globalCache.get<CrudResult<T>>(key)\n // Flagged on the way out, not in the stored entry — the first (network)\n // caller of a key must not see `cached: true` on its own live result.\n if (cached) return { ...cached, cached: true }\n\n const result = await provider.list(query)\n globalCache.set(key, result, options.ttl)\n return result\n },\n\n async create(data) {\n const result = await provider.create(data)\n globalCache.invalidate(prefix())\n return result\n },\n\n // Forwarded, not dropped: an optional method that disappears behind the\n // wrapper silently downgrades every bulk write to a loop of single writes,\n // and nothing upstream can tell — `createMany` was doing exactly that.\n ...(provider.createMany && {\n async createMany(rows: Parameters<NonNullable<typeof provider.createMany>>[0], options: Parameters<NonNullable<typeof provider.createMany>>[1]) {\n const result = await provider.createMany!(rows, options)\n globalCache.invalidate(prefix())\n return result\n },\n }),\n\n async update(id, data) {\n const result = await provider.update(id, data)\n globalCache.invalidate(prefix())\n return result\n },\n\n async remove(id) {\n await provider.remove(id)\n globalCache.invalidate(prefix())\n },\n\n ...(provider.removeMany && {\n async removeMany(ids: string[]) {\n await provider.removeMany!(ids)\n globalCache.invalidate(prefix())\n },\n }),\n }\n}\n","// ---------------------------------------------------------------------------\n// Data error taxonomy — one normalized shape for everything the data door can\n// fail with, so callers branch on a `kind` instead of grepping a message.\n//\n// The split that matters most is 'forbidden' vs 'missing-object': a PostgREST\n// \"permission denied for table x\" (42501) once surfaced to a user as \"analytics\n// engine missing\", sending everyone to look for a migration that was already\n// applied. They are different failures with different fixes — a grant versus a\n// deploy — and the taxonomy has to keep them apart.\n// ---------------------------------------------------------------------------\n\nexport type DataErrorKind =\n /** No usable network: fetch failed, request aborted, timed out. */\n | 'offline'\n /** No identity: missing/expired JWT. Re-authenticate. */\n | 'unauthorized'\n /** Identity known, access refused: RLS or a missing GRANT. */\n | 'forbidden'\n /** The object exists, the row does not. */\n | 'not-found'\n /** The table/view/function itself is not there — a deploy gap, not a data gap. */\n | 'missing-object'\n /** The write lost a race or duplicates a unique key. */\n | 'conflict'\n /** The request itself is wrong: bad syntax, constraint violated, no tenant. */\n | 'invalid'\n /** Anything the backend blames on itself. */\n | 'server'\n\n/** Only these are worth trying again with the same input. */\nconst RETRYABLE_KINDS: readonly DataErrorKind[] = ['offline', 'server']\n\nexport interface DataErrorOptions {\n /** The original throw, preserved for reporters that want the real object. */\n cause?: unknown\n /** HTTP status when the failure came over the wire. */\n status?: number\n /** PostgREST (`PGRST116`) or Postgres (`42501`) code. */\n code?: string\n details?: string\n /** Postgres often puts the actionable fix here — surface it, do not drop it. */\n hint?: string\n}\n\nexport class DataError extends Error {\n readonly kind: DataErrorKind\n readonly retryable: boolean\n readonly cause?: unknown\n readonly status?: number\n readonly code?: string\n readonly details?: string\n readonly hint?: string\n\n constructor(kind: DataErrorKind, message: string, options: DataErrorOptions = {}) {\n super(message)\n this.name = 'DataError'\n this.kind = kind\n this.retryable = RETRYABLE_KINDS.includes(kind)\n this.cause = options.cause\n this.status = options.status\n this.code = options.code\n this.details = options.details\n this.hint = options.hint\n }\n}\n\n// ---------------------------------------------------------------------------\n// Classification\n// ---------------------------------------------------------------------------\n\n/** Postgres + PostgREST codes are stable; branch on them before any text. */\nconst CODE_KINDS: Record<string, DataErrorKind> = {\n // PostgREST\n PGRST100: 'invalid', // parse error in the query string\n PGRST106: 'missing-object', // schema not exposed\n PGRST116: 'not-found', // zero rows where exactly one was requested\n PGRST202: 'missing-object', // function not found in schema cache\n PGRST204: 'missing-object', // column not found in schema cache\n PGRST205: 'missing-object', // table not found in schema cache\n PGRST301: 'unauthorized', // JWT invalid or expired\n PGRST302: 'unauthorized', // anonymous access disabled\n // Postgres\n '22007': 'invalid', // invalid datetime format\n '22P02': 'invalid', // invalid input syntax\n '23502': 'invalid', // not-null violation\n '23505': 'conflict', // unique violation\n '23514': 'invalid', // check violation\n '42501': 'forbidden', // insufficient privilege / permission denied\n '42883': 'missing-object', // undefined function\n '42P01': 'missing-object', // undefined table\n '53300': 'server', // too many connections\n '57014': 'server', // statement timeout, server side\n}\n\n/** Transport-level codes — the request never reached PostgREST. */\nconst OFFLINE_CODES = new Set(['ECONNREFUSED', 'ECONNRESET', 'ENOTFOUND', 'ETIMEDOUT', 'EAI_AGAIN'])\n\nconst OFFLINE_TEXT = /failed to fetch|fetch failed|network ?error|networkrequestfailed|load failed|connection (refused|reset|closed)|err_internet_disconnected|aborted|signal is aborted|the operation was aborted|timed out|timeout/i\n\nfunction statusKind(status: number): DataErrorKind {\n if (status === 401) return 'unauthorized'\n if (status === 403) return 'forbidden'\n if (status === 404 || status === 406) return 'not-found'\n if (status === 408) return 'offline'\n if (status === 409) return 'conflict'\n if (status === 400 || status === 422) return 'invalid'\n if (status >= 500) return 'server'\n return 'server'\n}\n\nfunction textKind(message: string): DataErrorKind | undefined {\n const m = message.toLowerCase()\n if (/permission denied|row-level security|row level security|insufficient privilege/.test(m)) return 'forbidden'\n if (/does not exist|undefined table|undefined function|schema cache|could not find the (table|function)/.test(m)) return 'missing-object'\n if (/jwt|not authenticated|invalid token|unauthorized|no api key/.test(m)) return 'unauthorized'\n if (/duplicate key|already exists|conflict/.test(m)) return 'conflict'\n if (/invalid input (syntax|value)|violates (not-null|check) constraint|invalid request/.test(m)) return 'invalid'\n if (/no rows|not found/.test(m)) return 'not-found'\n return undefined\n}\n\nfunction pick(source: Record<string, unknown>, key: string): unknown {\n const value = source[key]\n return value === null ? undefined : value\n}\n\nfunction readStatus(source: Record<string, unknown>): number | undefined {\n for (const key of ['status', 'statusCode', 'httpStatus']) {\n const value = pick(source, key)\n if (typeof value === 'number') return value\n if (typeof value === 'string' && /^\\d{3}$/.test(value)) return Number(value)\n }\n const response = pick(source, 'response')\n if (response && typeof response === 'object') {\n const status = (response as Record<string, unknown>).status\n if (typeof status === 'number') return status\n }\n return undefined\n}\n\nfunction isOffline(name: string, message: string, code: string | undefined, status: number | undefined): boolean {\n if (name === 'AbortError' || name === 'TimeoutError') return true\n if (code && OFFLINE_CODES.has(code)) return true\n if (status !== undefined) return false\n // navigator.onLine is a hint, not a verdict — it only decides errors we could\n // not classify from a code or a status.\n const nav = (globalThis as { navigator?: { onLine?: boolean } }).navigator\n if (nav && nav.onLine === false) return true\n return OFFLINE_TEXT.test(message)\n}\n\n/**\n * Normalizes anything thrown by the data layer into a {@link DataError}.\n * Idempotent — a DataError passes through untouched.\n */\nexport function toDataError(err: unknown): DataError {\n if (err instanceof DataError) return err\n\n const source: Record<string, unknown> =\n err && typeof err === 'object' ? (err as Record<string, unknown>) : {}\n const name = typeof source.name === 'string' ? source.name : ''\n const rawMessage = typeof source.message === 'string' ? source.message : ''\n const message = rawMessage || (typeof err === 'string' ? err : '') || 'data request failed'\n const codeValue = pick(source, 'code')\n const code = typeof codeValue === 'string' ? codeValue : typeof codeValue === 'number' ? String(codeValue) : undefined\n const status = readStatus(source)\n const details = typeof source.details === 'string' ? source.details : undefined\n const hint = typeof source.hint === 'string' ? source.hint : undefined\n\n let kind: DataErrorKind | undefined = code ? CODE_KINDS[code] : undefined\n if (!kind && isOffline(name, message, code, status)) kind = 'offline'\n if (!kind && status !== undefined) kind = statusKind(status)\n if (!kind) kind = textKind(message)\n\n return new DataError(kind ?? 'server', message, { cause: err, status, code, details, hint })\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// Kept apart from `index.tsx` because the bus itself is React-free, and the\n// headless surfaces that use it (the data providers, the agent runtime) must\n// not have to pull React in to emit an event.\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","import * as React from 'react'\nimport { eventBus } from '../events/bus'\nimport { globalCache } from '../lib/cache'\nimport { getActiveTenantId } from '../lib/tenant'\n\n// ---------------------------------------------------------------------------\n// Data refresh bus — \"something wrote; whoever is showing it should reload\".\n//\n// A write that happens OUTSIDE the list showing it (the assistant creating an\n// appointment, a webhook, another tab) used to leave the screen stale until the\n// user reloaded by hand. Providers already invalidate their own read cache on\n// create/update/remove, but a mounted list holds its rows in a store — nothing\n// told it to fetch again.\n//\n// This is the missing half: one broadcast, every surface that renders the\n// affected data listens. Deliberately coarse — a table name, not a row diff.\n// Refetching a page of rows is cheap; a stale screen after \"criei o\n// agendamento\" is not.\n// ---------------------------------------------------------------------------\n\nexport const DATA_CHANGED_EVENT = 'data:changed'\n\nexport interface DataChangedPayload {\n /** Physical table the write touched, when the writer knows it. */\n table?: string\n /** Registered entity key (deriveEntityKey), when the writer knows it. */\n entityKey?: string\n /** Archetype the record belongs to (`person:client`), when known. */\n archetype?: string\n op?: 'create' | 'update' | 'delete' | 'unknown'\n /** Affected record id, when known. */\n id?: string\n /** What caused the write — lets a surface ignore its own UI writes. */\n source?: 'agent' | 'ui' | 'remote'\n}\n\n/** What a subscriber renders. Any field left out matches everything. */\nexport interface DataChangedMatch {\n table?: string\n entityKey?: string\n archetype?: string\n}\n\n/**\n * A write with NO table/entityKey is a write we could not attribute (a plugin\n * tool, an RPC). Subscribers still refresh for it: a redundant refetch costs a\n * request, a missed one costs the user's trust in what the screen shows.\n */\nexport function matchesDataChange(match: DataChangedMatch, payload: DataChangedPayload): boolean {\n const attributed = payload.table ?? payload.entityKey ?? payload.archetype\n if (!attributed) return true\n if (match.table && payload.table && match.table === payload.table) return true\n if (match.entityKey && payload.entityKey && match.entityKey === payload.entityKey) return true\n if (match.archetype && payload.archetype && match.archetype === payload.archetype) return true\n // A subscriber that declared nothing listens to everything.\n return !match.table && !match.entityKey && !match.archetype\n}\n\n// One agent turn can write twice (create + link). Coalesce so the lists behind\n// it fetch once, after the turn settles, instead of once per call.\nlet pending: DataChangedPayload[] = []\nlet flushTimer: ReturnType<typeof setTimeout> | null = null\n\nfunction flush(): void {\n const batch = pending\n pending = []\n flushTimer = null\n for (const payload of batch) eventBus.emit(DATA_CHANGED_EVENT, payload)\n}\n\n/**\n * Announce a write. Invalidates the provider read cache for the affected table\n * (an unattributed write clears it wholesale — a stale hit would defeat the\n * refetch it just triggered) and broadcasts to mounted surfaces.\n */\nexport function emitDataChanged(payload: DataChangedPayload = {}): void {\n if (payload.table) {\n const tenant = getActiveTenantId() ?? '_'\n // The base table and its read-model view are the SAME data under two cache\n // namespaces (appointments / v_appointments). Invalidating only the one the\n // writer names leaves the other serving a snapshot that predates the write\n // — which is how the assistant kept reporting an empty agenda after a\n // booking was created on the agenda screen.\n const sibling = payload.table.startsWith('v_')\n ? payload.table.slice(2)\n : `v_${payload.table}`\n globalCache.invalidate(`${tenant}:${payload.table}`)\n globalCache.invalidate(`${tenant}:${sibling}`)\n } else {\n globalCache.clear()\n }\n pending.push({ op: 'unknown', source: 'agent', ...payload })\n if (flushTimer) return\n flushTimer = setTimeout(flush, 120)\n}\n\n/** Subscribe for the lifetime of the component. The latest handler always runs. */\nexport function useDataChanged(\n match: DataChangedMatch,\n handler: (payload: DataChangedPayload) => void,\n deps: React.DependencyList = [],\n): void {\n const handlerRef = React.useRef(handler)\n handlerRef.current = handler\n const { table, entityKey, archetype } = match\n\n React.useEffect(\n () =>\n eventBus.on<DataChangedPayload>(DATA_CHANGED_EVENT, (payload) => {\n if (matchesDataChange({ table, entityKey, archetype }, payload)) handlerRef.current(payload)\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [table, entityKey, archetype, ...deps],\n )\n}\n","// ---------------------------------------------------------------------------\n// L2 — the cache that survives the tab.\n//\n// `globalCache` lives in RAM: a reload, a crash, a tab the OS killed to reclaim\n// memory, and every read the user already paid for is gone. On a phone with one\n// bar that is the difference between an app that shows yesterday's agenda and\n// an app that shows a spinner. This mirrors the same cache into IndexedDB\n// BEHIND the synchronous `CacheStore` surface — no caller learns a new API, and\n// the IDB work never blocks a read.\n//\n// Two clocks, not one, and the gap between them is the whole point:\n// - `expiresAt` is FRESHNESS. Past it, L1 drops the entry and the next read\n// must go to the network.\n// - `maxAgeMs` is DURABILITY. It says how long the bytes are still worth\n// showing when the network is not an option.\n// An entry leaves L1 the moment it goes stale and leaves L2 only when it goes\n// old. `getStale` serves exactly that window to the offline read path.\n//\n// Which is also why `invalidate`/`clear` EXPIRE the persisted entries instead\n// of deleting them. The L1 meaning (\"never serve this as fresh again\") is\n// mirrored faithfully; the bytes stay for the offline fallback. Deleting would\n// mean one unattributed write — `emitDataChanged()` with no table clears the\n// whole cache — wipes the user's entire offline corpus. Use `purge()` for the\n// cases that really mean forget (sign-out).\n//\n// Zero dependencies on purpose: the repo rule is not to add a package for what\n// fits in one file.\n// ---------------------------------------------------------------------------\n\nimport { DEFAULT_CACHE_TTL, globalCache, type CacheStore } from './cache'\n\nconst DB_VERSION = 1\nconst STORE_ENTRIES = 'entries'\nconst STORE_REPLICAS = 'replicas'\n\nexport interface PersistedEntry<T = unknown> {\n data: T\n /** Freshness deadline copied from L1. Past it the entry is stale, not gone. */\n expiresAt: number\n /** When it was written. Durability is measured from here, never from expiresAt. */\n storedAt: number\n}\n\n/** A full local row-set for one table — what the `replica` offline policy reads. */\nexport interface ReplicaSnapshot<T = unknown> {\n rows: T[]\n syncedAt: number\n}\n\nexport interface PersistentCacheOptions {\n /** Database name. Default `core-cache`. */\n dbName?: string\n /** How long a persisted entry stays readable as stale. Default 24 h. */\n maxAgeMs?: number\n /** Write-coalescing window in ms. Default 50. */\n flushDelayMs?: number\n /** TTL assumed when a `set` omits one — must match the wrapped store's. */\n defaultTTL?: number\n /** Best-effort `navigator.storage.persist()` on attach. Default true. */\n requestPersistence?: boolean\n}\n\nexport interface PersistentCache {\n /** False when there is no IndexedDB (agent-runtime, SSR): every method no-ops. */\n readonly available: boolean\n /** Load still-fresh persisted entries back into L1 and prune the old ones. Returns how many were loaded. */\n hydrate(): Promise<number>\n /** The stale-read seam: an entry that L1 no longer serves but L2 still holds. */\n getStale<T>(key: string): Promise<PersistedEntry<T> | undefined>\n put<T>(key: string, data: T, expiresAt: number): void\n /** Mark every entry under `prefix` as no longer fresh, keeping it readable as stale. */\n expire(prefix: string): void\n /** Really delete every entry under `prefix`. Sign-out, not invalidation. */\n purge(prefix?: string): void\n putReplica<T>(key: string, rows: T[]): void\n getReplica<T>(key: string): Promise<ReplicaSnapshot<T> | undefined>\n dropReplica(key: string): void\n /** Resolves once every queued write has landed. For tests and page-hide handlers. */\n flush(): Promise<void>\n /** Restore the wrapped store's original methods and stop mirroring. */\n detach(): void\n}\n\n// ---------------------------------------------------------------------------\n// Availability\n// ---------------------------------------------------------------------------\n\nfunction idbAvailable(): boolean {\n return typeof indexedDB !== 'undefined' && typeof IDBKeyRange !== 'undefined'\n}\n\nconst NOOP_CACHE: PersistentCache = {\n available: false,\n hydrate: async () => 0,\n getStale: async () => undefined,\n put: () => {},\n expire: () => {},\n purge: () => {},\n putReplica: () => {},\n getReplica: async () => undefined,\n dropReplica: () => {},\n flush: async () => {},\n detach: () => {},\n}\n\n// ---------------------------------------------------------------------------\n// Attachment\n// ---------------------------------------------------------------------------\n\nlet attached: PersistentCache | null = null\n\n/** The L2 currently mirroring the global cache, or null when none is attached. */\nexport function getPersistentCache(): PersistentCache | null {\n return attached\n}\n\ntype PendingOp =\n | { op: 'put'; store: string; key: string; value: unknown }\n | { op: 'delete'; store: string; key: string }\n | { op: 'purge'; store: string; prefix: string }\n | { op: 'expire'; prefix: string }\n\n/**\n * Give a {@link CacheStore} a persistent second level. The store is decorated\n * IN PLACE — `globalCache` is imported as a value by every read path in the\n * SDK, so replacing the reference would leave those paths on the old object.\n */\nexport function attachPersistentCache(\n store: CacheStore = globalCache,\n options: PersistentCacheOptions = {},\n): PersistentCache {\n attached?.detach()\n\n if (!idbAvailable()) {\n attached = NOOP_CACHE\n return NOOP_CACHE\n }\n\n const dbName = options.dbName ?? 'core-cache'\n const maxAgeMs = options.maxAgeMs ?? 24 * 60 * 60 * 1000\n const flushDelayMs = options.flushDelayMs ?? 50\n const defaultTTL = options.defaultTTL ?? DEFAULT_CACHE_TTL\n\n // ---- database ----------------------------------------------------------\n\n let dbPromise: Promise<IDBDatabase> | null = null\n\n function openDb(): Promise<IDBDatabase> {\n if (dbPromise) return dbPromise\n dbPromise = new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(dbName, DB_VERSION)\n request.onupgradeneeded = () => {\n const db = request.result\n // Out-of-line keys: the cache key IS the key, no wrapper object needed.\n if (!db.objectStoreNames.contains(STORE_ENTRIES)) db.createObjectStore(STORE_ENTRIES)\n if (!db.objectStoreNames.contains(STORE_REPLICAS)) db.createObjectStore(STORE_REPLICAS)\n }\n request.onsuccess = () => resolve(request.result)\n request.onerror = () => reject(request.error ?? new Error('cache database failed to open'))\n request.onblocked = () => reject(new Error('cache database blocked by another tab'))\n })\n return dbPromise\n }\n\n function promisify<R>(request: IDBRequest<R>): Promise<R> {\n return new Promise<R>((resolve, reject) => {\n request.onsuccess = () => resolve(request.result)\n request.onerror = () => reject(request.error ?? new Error('cache request failed'))\n })\n }\n\n async function transact<R>(\n names: string[],\n mode: IDBTransactionMode,\n run: (tx: IDBTransaction) => Promise<R>,\n ): Promise<R> {\n const db = await openDb()\n const tx = db.transaction(names, mode)\n // Registered before any request is issued: a transaction can complete in\n // the same turn, and a handler attached afterwards would never fire.\n const done = new Promise<void>((resolve, reject) => {\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error ?? new Error('cache transaction failed'))\n tx.onabort = () => reject(tx.error ?? new Error('cache transaction aborted'))\n })\n const value = await run(tx)\n await done\n return value\n }\n\n // ---- write queue -------------------------------------------------------\n\n let queue: PendingOp[] = []\n let timer: ReturnType<typeof setTimeout> | null = null\n let running: Promise<void> = Promise.resolve()\n let detached = false\n\n function enqueue(op: PendingOp): void {\n if (detached) return\n if (op.op === 'put') {\n // Same key twice in one window is one write, last value wins — but only\n // ahead of the newest expire/purge, or the dedupe would move a fresh\n // value back to before the invalidation that must not touch it.\n let barrier = -1\n for (let i = queue.length - 1; i >= 0; i--) {\n if (queue[i]!.op !== 'put') {\n barrier = i\n break\n }\n }\n const at = queue.findIndex(\n (q, i) => i > barrier && q.op === 'put' && q.store === op.store && q.key === op.key,\n )\n if (at >= 0) queue[at] = op\n else queue.push(op)\n } else if (op.op === 'purge') {\n queue = queue.filter((q) => !(q.op !== 'expire' && q.store === op.store && 'key' in q && q.key.startsWith(op.prefix)))\n queue.push(op)\n } else {\n queue.push(op)\n }\n schedule()\n }\n\n function schedule(): void {\n if (timer || detached) return\n timer = setTimeout(() => {\n timer = null\n running = running.then(drain)\n }, flushDelayMs)\n }\n\n async function drain(): Promise<void> {\n const batch = queue\n queue = []\n if (batch.length === 0) return\n try {\n // Order matters: an invalidate followed by a fresh read in the same window\n // must not expire the value that read just produced. Expiries therefore\n // cut the batch instead of being hoisted out of it.\n let segment: PendingOp[] = []\n for (const op of batch) {\n if (op.op === 'expire') {\n if (segment.length) await commit(segment)\n segment = []\n await applyExpiry(op.prefix)\n } else {\n segment.push(op)\n }\n }\n if (segment.length) await commit(segment)\n } catch {\n // Losing a cache write is acceptable; propagating it is not.\n }\n }\n\n async function commit(batch: PendingOp[]): Promise<void> {\n await transact([STORE_ENTRIES, STORE_REPLICAS], 'readwrite', async (tx) => {\n for (const op of batch) {\n if (op.op === 'expire') continue\n const objectStore = tx.objectStore(op.store)\n try {\n if (op.op === 'put') objectStore.put(op.value, op.key)\n else if (op.op === 'delete') objectStore.delete(op.key)\n else objectStore.delete(rangeFor(op.prefix))\n } catch {\n // A value the structured clone algorithm refuses is a cache miss,\n // never a thrown error in the caller's read path.\n }\n }\n })\n }\n\n /** Rewrites `expiresAt` in place — see the header for why this is not a delete. */\n async function applyExpiry(prefix: string): Promise<void> {\n await transact([STORE_ENTRIES], 'readwrite', async (tx) => {\n const objectStore = tx.objectStore(STORE_ENTRIES)\n // Both requests issued AND subscribed in this turn: a handler attached\n // after the event fired never runs, and the read would hang.\n const keysPromise = promisify(objectStore.getAllKeys())\n const valuesPromise = promisify(objectStore.getAll())\n const keys = (await keysPromise) as IDBValidKey[]\n const values = (await valuesPromise) as PersistedEntry[]\n for (let i = 0; i < keys.length; i++) {\n const key = String(keys[i])\n const value = values[i]\n if (!value || (prefix && !key.startsWith(prefix))) continue\n if (value.expiresAt === 0) continue\n objectStore.put({ ...value, expiresAt: 0 }, key)\n }\n })\n }\n\n async function flush(): Promise<void> {\n // Loop: draining can take long enough for new ops to queue behind it.\n for (let round = 0; round < 8; round++) {\n if (timer) {\n clearTimeout(timer)\n timer = null\n }\n running = running.then(drain)\n await running\n if (queue.length === 0 && !timer) return\n }\n }\n\n function rangeFor(prefix: string): IDBKeyRange {\n // '￿' is above every character a cache key can hold, so the bound\n // covers exactly the keys starting with `prefix`.\n return IDBKeyRange.bound(prefix, `${prefix}￿`)\n }\n\n function queuedPut<T>(storeName: string, key: string): T | undefined {\n for (let i = queue.length - 1; i >= 0; i--) {\n const op = queue[i]!\n if (op.op === 'put' && op.store === storeName && op.key === key) return op.value as T\n }\n return undefined\n }\n\n // ---- store decoration --------------------------------------------------\n\n const originalSet = store.set.bind(store)\n const originalInvalidate = store.invalidate.bind(store)\n const originalClear = store.clear.bind(store)\n\n store.set = <T,>(key: string, data: T, ttl?: number): void => {\n originalSet(key, data, ttl)\n enqueue({\n op: 'put',\n store: STORE_ENTRIES,\n key,\n value: { data, expiresAt: Date.now() + (ttl ?? defaultTTL), storedAt: Date.now() } satisfies PersistedEntry<T>,\n })\n }\n\n store.invalidate = (prefix: string): void => {\n originalInvalidate(prefix)\n enqueue({ op: 'expire', prefix })\n }\n\n store.clear = (): void => {\n originalClear()\n enqueue({ op: 'expire', prefix: '' })\n }\n\n // ---- handle ------------------------------------------------------------\n\n const handle: PersistentCache = {\n available: true,\n\n async hydrate(): Promise<number> {\n if (detached) return 0\n const now = Date.now()\n try {\n const { keys, values } = await transact([STORE_ENTRIES], 'readonly', async (tx) => {\n const objectStore = tx.objectStore(STORE_ENTRIES)\n const keysPromise = promisify(objectStore.getAllKeys())\n const valuesPromise = promisify(objectStore.getAll())\n return {\n keys: (await keysPromise) as IDBValidKey[],\n values: (await valuesPromise) as PersistedEntry[],\n }\n })\n let loaded = 0\n for (let i = 0; i < keys.length; i++) {\n const key = String(keys[i])\n const entry = values[i]\n if (!entry) continue\n if (now - entry.storedAt > maxAgeMs) {\n enqueue({ op: 'delete', store: STORE_ENTRIES, key })\n continue\n }\n // Only the still-fresh come back to L1, with the REMAINING ttl — a\n // full TTL here would silently extend every entry across reloads.\n if (entry.expiresAt > now) {\n originalSet(key, entry.data, entry.expiresAt - now)\n loaded++\n }\n }\n return loaded\n } catch {\n return 0\n }\n },\n\n async getStale<T>(key: string): Promise<PersistedEntry<T> | undefined> {\n if (detached) return undefined\n // Read-your-writes: a list that succeeded a moment ago may still be in the\n // queue, and that is precisely the entry the next failed read wants.\n const queued = queuedPut<PersistedEntry<T>>(STORE_ENTRIES, key)\n if (queued) return queued\n try {\n const entry = await transact([STORE_ENTRIES], 'readonly', (tx) =>\n promisify(tx.objectStore(STORE_ENTRIES).get(key) as IDBRequest<PersistedEntry<T> | undefined>),\n )\n if (!entry) return undefined\n if (Date.now() - entry.storedAt > maxAgeMs) return undefined\n return entry\n } catch {\n return undefined\n }\n },\n\n put<T>(key: string, data: T, expiresAt: number): void {\n enqueue({ op: 'put', store: STORE_ENTRIES, key, value: { data, expiresAt, storedAt: Date.now() } })\n },\n\n expire(prefix: string): void {\n enqueue({ op: 'expire', prefix })\n },\n\n purge(prefix = ''): void {\n enqueue({ op: 'purge', store: STORE_ENTRIES, prefix })\n enqueue({ op: 'purge', store: STORE_REPLICAS, prefix })\n },\n\n putReplica<T>(key: string, rows: T[]): void {\n enqueue({ op: 'put', store: STORE_REPLICAS, key, value: { rows, syncedAt: Date.now() } })\n },\n\n async getReplica<T>(key: string): Promise<ReplicaSnapshot<T> | undefined> {\n if (detached) return undefined\n const queued = queuedPut<ReplicaSnapshot<T>>(STORE_REPLICAS, key)\n if (queued) return queued\n try {\n return await transact([STORE_REPLICAS], 'readonly', (tx) =>\n promisify(tx.objectStore(STORE_REPLICAS).get(key) as IDBRequest<ReplicaSnapshot<T> | undefined>),\n )\n } catch {\n return undefined\n }\n },\n\n dropReplica(key: string): void {\n enqueue({ op: 'delete', store: STORE_REPLICAS, key })\n },\n\n flush,\n\n detach(): void {\n if (detached) return\n detached = true\n if (timer) {\n clearTimeout(timer)\n timer = null\n }\n store.set = originalSet\n store.invalidate = originalInvalidate\n store.clear = originalClear\n if (attached === handle) attached = null\n // Only close what was actually opened — detaching must not open a database.\n void dbPromise?.then((db) => db.close()).catch(() => {})\n dbPromise = null\n },\n }\n\n if (options.requestPersistence !== false) void requestPersistence()\n\n attached = handle\n return handle\n}\n\n/**\n * Ask the browser not to evict this origin under disk pressure. Best-effort by\n * design: without it the cache still works, it just becomes evictable — and a\n * prompt the user declines is not an error worth surfacing.\n */\nasync function requestPersistence(): Promise<void> {\n try {\n const storage = (globalThis as { navigator?: { storage?: { persist?: () => Promise<boolean> } } }).navigator?.storage\n await storage?.persist?.()\n } catch {\n /* ignore */\n }\n}\n","// ---------------------------------------------------------------------------\n// The offline read path.\n//\n// `withCache` already answers from RAM, but only for the seconds inside a TTL\n// and only while the tab lives. The moment the network dies, every read throws\n// — including reads whose answer is sitting in IndexedDB from a minute ago.\n// This decorator is the fallback: when, and ONLY when, the failure classifies\n// as `offline`, it answers from L2 instead of rethrowing.\n//\n// It sits OUTSIDE `withCache` on purpose. Outside, it only ever sees reads L1\n// could not answer, and its own stale answers never enter L1 — inside, a\n// replica answer would be written to the fresh cache under the live query's\n// key and then served as if the network had returned it, long after the\n// network came back.\n//\n// Two policies, two costs. `'cache'` replays queries the user already ran, for\n// free (the entries are written anyway). `'replica'` keeps the whole table on\n// the device so a query never run before still answers, and pays for it with a\n// background sync. Writes are untouched — they fail offline, and the outbox\n// that fixes that is a later phase.\n// ---------------------------------------------------------------------------\n\nimport type { EntityDef, OfflinePolicy } from '../types/crud'\nimport type { CrudQuery, CrudResult, DataProvider } from './types'\nimport { cacheKeyFor, cachePrefixFor } from './cached'\nimport { toDataError } from './errors'\nimport { createMockProvider } from './mock'\nimport { DATA_CHANGED_EVENT, type DataChangedPayload } from './refresh'\nimport { eventBus } from '../events/bus'\nimport { DEFAULT_CACHE_TTL } from '../lib/cache'\nimport { getPersistentCache } from '../lib/cache-idb'\n\nexport type { OfflinePolicy }\n\n/** Rows per round-trip while building a replica. */\nconst REPLICA_PAGE_SIZE = 500\n/** Ceiling on one replica, so a 200k-row table cannot fill the user's disk. */\nconst REPLICA_MAX_ROWS = 5_000\n/** First sync waits for the screen the user actually asked for to settle. */\nconst REPLICA_FIRST_DELAY_MS = 1_500\n/** A write announces itself; give the burst around it time to finish. */\nconst REPLICA_REFRESH_DELAY_MS = 3_000\n/** Floor between two syncs of the same table, whatever asks for them. */\nconst REPLICA_MIN_INTERVAL_MS = 60_000\n\nexport interface OfflineProviderOptions<T> {\n policy: OfflinePolicy\n /** Cache namespace — must be the one `withCache` uses, archetype kind included. */\n table: string\n tenantId: () => string | undefined\n /** Shapes local search/sort when a replica answers a list. */\n entityDef?: EntityDef<T>\n /** Freshness of entries this decorator persists itself. Defaults to the cache default. */\n ttl?: number\n replicaPageSize?: number\n replicaMaxRows?: number\n /**\n * Active unit resolver, passed ONLY for unit-scoped entities. A replica is a\n * snapshot of what the provider returns, so a narrowed provider produces a\n * narrowed snapshot — which is correct exactly as long as the key says which\n * unit it is a snapshot OF.\n */\n unitId?: () => string | undefined\n}\n\n/** Replicas live in their own key space so a table invalidation cannot evict them. */\nexport function replicaKeyFor(tenantId: string | undefined, table: string, unitId?: string): string {\n return `replica:${cachePrefixFor(tenantId, table)}${unitId ? `@${unitId}` : ''}`\n}\n\n// ---------------------------------------------------------------------------\n// withOffline\n// ---------------------------------------------------------------------------\n\nexport function withOffline<T extends { id: string }>(\n provider: DataProvider<T>,\n options: OfflineProviderOptions<T>,\n): DataProvider<T> {\n if (options.policy === 'online') return provider\n\n const ttl = options.ttl ?? DEFAULT_CACHE_TTL\n // Opportunistic: registered when the provider is built, not when a read\n // succeeds, so the snapshot exists before the user ever goes offline.\n if (options.policy === 'replica') ensureReplicaSync(provider, options)\n\n async function fromPersisted(query: CrudQuery): Promise<CrudResult<T> | undefined> {\n const l2 = getPersistentCache()\n if (!l2?.available) return undefined\n const entry = await l2.getStale<CrudResult<T>>(cacheKeyFor(options.tenantId(), options.table, query, options.unitId?.()))\n if (!entry) return undefined\n return { ...entry.data, stale: true, staleAt: entry.storedAt }\n }\n\n async function fromReplica(query: CrudQuery): Promise<CrudResult<T> | undefined> {\n const l2 = getPersistentCache()\n if (!l2?.available) return undefined\n const snapshot = await l2.getReplica<T>(replicaKeyFor(options.tenantId(), options.table, options.unitId?.()))\n if (!snapshot) return undefined\n const result = await localList(snapshot.rows, query, options.entityDef)\n return { ...result, stale: true, staleAt: snapshot.syncedAt }\n }\n\n return {\n async list(query: CrudQuery): Promise<CrudResult<T>> {\n try {\n const result = await provider.list(query)\n const l2 = getPersistentCache()\n if (options.policy === 'cache' && l2?.available) {\n // Persisted here and not only through `withCache`, so the policy holds\n // even for callers that resolved with `cache: false`. Same key, same\n // value — the write queue collapses the two into one.\n l2.put(cacheKeyFor(options.tenantId(), options.table, query, options.unitId?.()), result, Date.now() + ttl)\n }\n return result\n } catch (err) {\n const error = toDataError(err)\n // Anything else — forbidden, missing-object, invalid — must keep\n // reaching the user. Serving cached rows for a permission failure hides\n // a broken grant behind data that looks fine.\n if (error.kind !== 'offline') throw error\n const fallback =\n (options.policy === 'replica' ? await fromReplica(query) : undefined) ?? (await fromPersisted(query))\n if (!fallback) throw error\n return fallback\n }\n },\n\n async create(data) {\n const result = await provider.create(data)\n if (options.policy === 'replica') scheduleReplicaSync(options, REPLICA_REFRESH_DELAY_MS)\n return result\n },\n\n ...(provider.createMany && {\n async createMany(\n rows: Parameters<NonNullable<typeof provider.createMany>>[0],\n bulkOptions: Parameters<NonNullable<typeof provider.createMany>>[1],\n ) {\n const result = await provider.createMany!(rows, bulkOptions)\n if (options.policy === 'replica') scheduleReplicaSync(options, REPLICA_REFRESH_DELAY_MS)\n return result\n },\n }),\n\n async update(id, data) {\n const result = await provider.update(id, data)\n if (options.policy === 'replica') scheduleReplicaSync(options, REPLICA_REFRESH_DELAY_MS)\n return result\n },\n\n async remove(id) {\n await provider.remove(id)\n if (options.policy === 'replica') scheduleReplicaSync(options, REPLICA_REFRESH_DELAY_MS)\n },\n\n ...(provider.removeMany && {\n async removeMany(ids: string[]) {\n await provider.removeMany!(ids)\n if (options.policy === 'replica') scheduleReplicaSync(options, REPLICA_REFRESH_DELAY_MS)\n },\n }),\n }\n}\n\n// ---------------------------------------------------------------------------\n// Local query — the replica reuses the mock provider's semantics\n// ---------------------------------------------------------------------------\n\n/**\n * Search, filter, sort and paginate rows in memory. Deliberately the mock\n * provider's implementation rather than a second one: it already speaks the\n * same range-filter grammar as the SQL providers, and a divergence here would\n * mean the same query returns different rows online and offline.\n */\nexport async function localList<T extends { id: string }>(\n rows: T[],\n query: CrudQuery,\n entityDef?: EntityDef<T>,\n): Promise<CrudResult<T>> {\n type Loose = T & { [key: string]: unknown }\n const shape = (entityDef ?? []) as EntityDef<Loose> | string[]\n return createMockProvider<Loose>(shape, rows as Loose[]).list(query)\n}\n\n// ---------------------------------------------------------------------------\n// Replica sync\n// ---------------------------------------------------------------------------\n\nexport interface SyncReplicaOptions {\n table: string\n tenantId?: string\n /** Resolved active unit, so the snapshot is keyed by the unit it snapshots. */\n unitId?: string\n pageSize?: number\n maxRows?: number\n}\n\n/**\n * Walk the whole table page by page and store it as one local snapshot.\n * Returns the number of rows persisted (0 when there is no L2 to hold them).\n */\nexport async function syncReplica<T extends { id: string }>(\n provider: DataProvider<T>,\n options: SyncReplicaOptions,\n): Promise<number> {\n const l2 = getPersistentCache()\n if (!l2?.available) return 0\n\n const pageSize = options.pageSize ?? REPLICA_PAGE_SIZE\n const maxRows = options.maxRows ?? REPLICA_MAX_ROWS\n const rows: T[] = []\n\n for (let page = 1; rows.length < maxRows; page++) {\n // countMode 'none' — the total is a second aggregate we would only throw away.\n const result = await provider.list({ page, pageSize, countMode: 'none' })\n rows.push(...result.data)\n if (result.data.length < pageSize) break\n }\n\n const snapshot = rows.slice(0, maxRows)\n l2.putReplica(replicaKeyFor(options.tenantId, options.table, options.unitId), snapshot)\n await l2.flush()\n return snapshot.length\n}\n\ninterface ReplicaSyncState {\n run: () => Promise<unknown>\n timer: ReturnType<typeof setTimeout> | null\n lastSyncAt: number\n running: boolean\n}\n\n// Keyed by (tenant, table), never torn down: a provider is rebuilt on every\n// render, so the sync state cannot live inside one. The map is bounded by the\n// tables the app declares.\nconst replicaSyncs = new Map<string, ReplicaSyncState>()\n\nfunction ensureReplicaSync<T extends { id: string }>(\n provider: DataProvider<T>,\n options: OfflineProviderOptions<T>,\n): void {\n const key = replicaKeyFor(options.tenantId(), options.table, options.unitId?.())\n if (replicaSyncs.has(key)) return\n\n const state: ReplicaSyncState = {\n // Tenant read at sync time, not at registration: the first provider is often\n // built before the session settles on one.\n run: () =>\n syncReplica(provider, {\n table: options.table,\n tenantId: options.tenantId(),\n unitId: options.unitId?.(),\n pageSize: options.replicaPageSize,\n maxRows: options.replicaMaxRows,\n }),\n timer: null,\n lastSyncAt: 0,\n running: false,\n }\n replicaSyncs.set(key, state)\n\n // The base table and its read-model view are the same rows under two names —\n // `emitDataChanged` already treats them as a pair, and so must this.\n const table = options.table.split('#')[0]!\n const sibling = table.startsWith('v_') ? table.slice(2) : `v_${table}`\n eventBus.on<DataChangedPayload>(DATA_CHANGED_EVENT, (payload) => {\n if (payload.table && payload.table !== table && payload.table !== sibling) return\n scheduleReplicaSync(options, REPLICA_REFRESH_DELAY_MS)\n })\n\n scheduleReplicaSync(options, REPLICA_FIRST_DELAY_MS)\n}\n\nfunction scheduleReplicaSync<T>(options: OfflineProviderOptions<T>, delayMs: number): void {\n const state = replicaSyncs.get(replicaKeyFor(options.tenantId(), options.table, options.unitId?.()))\n if (!state || state.timer) return\n state.timer = setTimeout(() => {\n state.timer = null\n if (state.running || Date.now() - state.lastSyncAt < REPLICA_MIN_INTERVAL_MS) return\n state.running = true\n void state\n .run()\n .then(() => {\n state.lastSyncAt = Date.now()\n })\n // Offline is the expected failure here; the snapshot we already have stays.\n .catch(() => {})\n .finally(() => {\n state.running = false\n })\n }, delayMs)\n // A background refresh must never hold a Node process open.\n ;(state.timer as { unref?: () => void }).unref?.()\n}\n\n/** Test seam — forgets every scheduled sync. */\nexport function __resetReplicaSyncs(): void {\n for (const state of replicaSyncs.values()) if (state.timer) clearTimeout(state.timer)\n replicaSyncs.clear()\n}\n","import { getSupabaseClientOptional } from '../data/supabase'\nimport { getActiveTenantId } from '../lib/tenant'\nimport {\n declaredCustomFields,\n validateEntityRecordData,\n type EntityField,\n type EntityFieldOption,\n type EntityFieldType,\n type EntityRecordIssue,\n} from '../registry/entities'\n\n/**\n * The field registry, resolved. Two halves merge here and nowhere else:\n *\n * declared — plugin/app code, via defineCustomFields. Re-asserted on deploy.\n * merchant — plg_entity_fields rows (035), written from the admin, no deploy.\n *\n * Reads of the merchant half also pick up the vertical's own vocabulary, the\n * rows with `tenant_id IS NULL` that a pool ships with: RLS publishes them to\n * every member and lets none of them write.\n *\n * Declared wins a collision, so a deploy adopts a key a merchant invented\n * instead of either side losing work — the rule 035's `origin` column records.\n */\n\nexport const FIELDS_TABLE = 'plg_entity_fields'\n\n/** Just enough of a Supabase client, structurally — the same shape (and the\n * same reason) as the one in ../integrations/store.ts. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Client = { from: (table: string) => any }\n\n/** A write naming a key the registry does not know, or a value it refuses. */\nexport class CustomFieldsError extends Error {\n readonly issues: EntityRecordIssue[]\n constructor(reference: string, issues: EntityRecordIssue[]) {\n super(`${reference} custom fields: ${issues.map((i) => i.message).join('; ')}`)\n this.name = 'CustomFieldsError'\n this.issues = issues\n }\n}\n\ninterface FieldRow {\n reference: string\n key: string\n type: string\n label: string | null\n help: string | null\n required: boolean\n default_value: unknown\n validation: Record<string, unknown> | null\n options: unknown\n position: number\n origin: string\n}\n\nfunction readOptions(raw: unknown): EntityFieldOption[] | undefined {\n if (!Array.isArray(raw)) return undefined\n const options = raw\n .map((entry) => {\n if (typeof entry === 'string') return { value: entry }\n const record = entry as Record<string, unknown>\n return typeof record?.value === 'string'\n ? { value: record.value, label: typeof record.label === 'string' ? record.label : undefined }\n : null\n })\n .filter((option): option is EntityFieldOption => option !== null)\n return options.length ? options : undefined\n}\n\nfunction rowToField(row: FieldRow): EntityField {\n const field: EntityField = { type: row.type as EntityFieldType }\n if (row.label) field.label = row.label\n if (row.help) field.help = row.help\n if (row.required) field.required = true\n if (row.default_value !== null && row.default_value !== undefined) field.default = row.default_value\n const options = readOptions(row.options)\n if (options) field.options = options\n // `{}` is the column default, and an empty validation object means \"no\n // bounds\" — carrying it through would make every field look constrained.\n if (row.validation && Object.keys(row.validation).length) {\n field.validation = row.validation as EntityField['validation']\n }\n return field\n}\n\nexport interface ResolvedCustomFields {\n reference: string\n fields: Record<string, EntityField>\n /** Declaration order for the merchant half: what the form renders by. */\n order: string[]\n}\n\nconst EMPTY: ResolvedCustomFields = { reference: '', fields: {}, order: [] }\n\n/**\n * In-flight and resolved sets, keyed by tenant+reference. A form, a table and a\n * validator all ask for the same set on one screen; without this they are three\n * round trips. Cleared by {@link clearCustomFieldsCache} on tenant switch.\n */\nconst cache = new Map<string, Promise<ResolvedCustomFields>>()\n\nexport function clearCustomFieldsCache(): void {\n cache.clear()\n}\n\nasync function load(reference: string, tenantId: string): Promise<ResolvedCustomFields> {\n const declared = declaredCustomFields(reference)\n const supabase = getSupabaseClientOptional() as Client | null\n if (!supabase) return { reference, fields: { ...declared }, order: Object.keys(declared) }\n\n const { data, error } = await supabase\n .from(FIELDS_TABLE)\n .select('reference,key,type,label,help,required,default_value,validation,options,position,origin')\n .eq('reference', reference)\n .is('archived_at', null)\n .order('position', { ascending: true })\n\n // A pool that has not applied 035 yet has no registry, which is not the same\n // as a tenant with no fields — but for a reader they behave alike, and\n // failing the screen over it would make the column unusable during rollout.\n if (error) return { reference, fields: { ...declared }, order: Object.keys(declared) }\n\n const fields: Record<string, EntityField> = {}\n const order: string[] = []\n for (const row of (data ?? []) as FieldRow[]) {\n if (fields[row.key]) continue // a tenant row already shadowed the vocabulary\n fields[row.key] = rowToField(row)\n order.push(row.key)\n }\n // Declared last so it wins, and so a key only in code still renders.\n for (const [key, field] of Object.entries(declared)) {\n if (!fields[key]) order.push(key)\n fields[key] = field\n }\n void tenantId // RLS scopes the read; the id is here for the cache key alone.\n return { reference, fields, order }\n}\n\n/** The full field set for a record kind, declared ∪ merchant, memoised. */\nexport function resolveCustomFields(reference: string, tenantId?: string): Promise<ResolvedCustomFields> {\n const tenant = tenantId ?? getActiveTenantId()\n if (!tenant) return Promise.resolve({ ...EMPTY, reference, fields: { ...declaredCustomFields(reference) } })\n const cacheKey = `${tenant}:${reference}`\n let pending = cache.get(cacheKey)\n if (!pending) {\n pending = load(reference, tenant).catch((err) => {\n cache.delete(cacheKey)\n throw err\n })\n cache.set(cacheKey, pending)\n }\n return pending\n}\n\n/**\n * The write gate. Throws on an undeclared key or a refused value, the same\n * shape validateEntityRecordData produces — so the admin can point at the\n * offending field instead of showing a wall of text.\n */\nexport async function validateCustomFields(\n reference: string,\n values: Record<string, unknown>,\n tenantId?: string,\n): Promise<void> {\n const { fields } = await resolveCustomFields(reference, tenantId)\n const issues = validateEntityRecordData({ fields }, values)\n if (issues.length) throw new CustomFieldsError(reference, issues)\n}\n\n/**\n * Merge a partial write onto what the record already holds.\n *\n * jsonb through PostgREST is a whole-value write, so sending only the keys a\n * form touched replaces the column and drops its siblings. That is not\n * hypothetical: it is the live CRM defect on people.metadata, where dragging a\n * card wiped formId/fields/utm. An explicit null removes a key.\n */\nexport function mergeCustomFields(\n current: Record<string, unknown> | null | undefined,\n patch: Record<string, unknown>,\n): Record<string, unknown> {\n const merged: Record<string, unknown> = { ...(current ?? {}) }\n for (const [key, value] of Object.entries(patch)) {\n if (value === null) delete merged[key]\n else merged[key] = value\n }\n return merged\n}\n","// Active unit context — the franchise counterpart to lib/tenant.ts. The host\n// (saas shell / app) sets it from its unit store; the data layer reads it for\n// scoping and cache keying and stays decoupled from any specific store.\n//\n// THE UNIT NARROWS, IT NEVER GRANTS. Which units a person may reach is decided\n// in Postgres (`public.user_unit_ids()`), and every scoped table carries a\n// restrictive policy that resolves through it. What lives here is only \"which\n// of those am I looking at right now\" — so a bug in this file can hide rows,\n// which is annoying, and cannot reveal one, which is the point.\nimport * as React from 'react'\nimport { clearGlobalCache } from './cache'\n\n// `undefined` means \"todas as unidades\" — no narrowing — and never \"not loaded\n// yet\". A third state would be worse than useless here: a list painted before\n// the unit resolved would show MORE rows than the switcher claims, which reads\n// as a leak even when it isn't. The host resolves the persisted unit\n// synchronously from its cached org snapshot, before the first child renders.\nlet _activeUnitId: string | undefined\n// The tenant-level switch. While false the whole feature is inert and every\n// call site below degrades to today's behaviour without knowing about the flag.\nlet _unitMode = false\nconst listeners = new Set<() => void>()\n\nfunction notify(): void {\n // Same contract as setActiveTenantId: the cache is namespaced by tenant+table\n // and keyed by query, so a unit change invalidates by clearing rather than by\n // walking keys. Cheap, and it cannot miss one.\n clearGlobalCache()\n for (const l of listeners) l()\n}\n\nexport function setActiveUnitId(id: string | undefined): void {\n if (id === _activeUnitId) return\n _activeUnitId = id\n notify()\n}\n\n/**\n * The unit the UI is currently narrowed to, or `undefined` for all of them.\n *\n * Returns `undefined` whenever unit mode is off, which is what makes every\n * downstream seam a no-op on a tenant that does not use units — none of them\n * has to know the flag exists.\n */\nexport function getActiveUnitId(): string | undefined {\n return _unitMode ? _activeUnitId : undefined\n}\n\n/** Whether this tenant works with units at all. Mirrors `tenants.unit_scoping_enabled`. */\nexport function setUnitMode(on: boolean): void {\n if (on === _unitMode) return\n _unitMode = on\n notify()\n}\n\nexport function isUnitMode(): boolean {\n return _unitMode\n}\n\nexport function subscribeActiveUnit(listener: () => void): () => void {\n listeners.add(listener)\n return () => { listeners.delete(listener) }\n}\n\n/** The active unit, re-rendering when it resolves or changes. */\nexport function useActiveUnitId(): string | undefined {\n return React.useSyncExternalStore(subscribeActiveUnit, getActiveUnitId, getActiveUnitId)\n}\n\n/** Whether the tenant works with units, re-rendering on change. */\nexport function useUnitMode(): boolean {\n return React.useSyncExternalStore(subscribeActiveUnit, isUnitMode, isUnitMode)\n}\n\n/** Drop everything on sign-out / tenant switch, so no unit survives into another org. */\nexport function resetActiveUnit(): void {\n if (_activeUnitId === undefined && !_unitMode) return\n _activeUnitId = undefined\n _unitMode = false\n notify()\n}\n","import type { DataProvider } from './types'\nimport { mergeCustomFields, validateCustomFields } from '../fields/store'\n\n/**\n * The write gate for `custom_fields`, wrapped around any provider.\n *\n * It goes here, on resolveDataProvider's decorator seam beside withCache,\n * because that is the only place in the SDK that sees the EntityDef and the\n * provider together — every entity declared with an archetype passes through\n * it, whichever backend wins. Providers that hand-roll their own writes\n * (plugin-agenda on appointments, plugin-crm on people) do not, and have to\n * call validateCustomFields themselves.\n *\n * Two jobs, and the second is the one that bites:\n *\n * 1. Refuse a key the registry does not declare, or a value it does not accept.\n * 2. MERGE an update instead of replacing it. jsonb through PostgREST is a\n * whole-value write, so a screen that sends only the field it edited drops\n * every sibling. That is not hypothetical — it is the live defect on\n * people.metadata in the CRM, where dragging a card wiped formId/fields/utm.\n */\n\n/** The camelCase key a caller writes; the column is `custom_fields`. */\nconst KEY = 'customFields'\n\nfunction patchOf(data: unknown): Record<string, unknown> | null {\n const value = (data as Record<string, unknown> | null)?.[KEY]\n return value && typeof value === 'object' && !Array.isArray(value) ? (value as Record<string, unknown>) : null\n}\n\nexport function withCustomFields<T extends { id: string }>(\n provider: DataProvider<T>,\n reference: string,\n): DataProvider<T> {\n return {\n ...provider,\n\n async create(data) {\n const patch = patchOf(data)\n if (!patch) return provider.create(data)\n await validateCustomFields(reference, patch)\n return provider.create(data)\n },\n\n async update(id, data) {\n const patch = patchOf(data)\n if (!patch) return provider.update(id, data)\n await validateCustomFields(reference, patch)\n\n // Read before write. One extra round trip, and it is what stops a partial\n // update from deleting the keys it did not mention. `list` by id rather\n // than getById because DataProvider has no getById to call.\n const { data: rows } = await provider.list({\n filters: { id },\n pageSize: 1,\n countMode: 'none',\n })\n const current = (rows[0] as Record<string, unknown> | undefined)?.[KEY]\n const merged = mergeCustomFields(current as Record<string, unknown> | undefined, patch)\n return provider.update(id, { ...data, [KEY]: merged } as Partial<T>)\n },\n }\n}\n","import type { EntityDef } from '../types/crud'\nimport type { BackendRef } from '../manifest'\nimport type { DataProvider } from './types'\nimport { getSupabaseClientOptional } from './supabase'\nimport { createSupabaseProvider } from './supabase'\nimport { createArchetypeProvider } from './archetype'\nimport { createMockProvider } from './mock'\nimport { createFayzApiProvider, type FayzApiProviderConfig } from './platform-api'\nimport { withCache } from './cached'\nimport { withOffline } from './offline'\nimport { withCustomFields } from './custom-fields'\nimport { getActiveTenantId } from '../lib/tenant'\nimport { getActiveUnitId } from '../lib/unit'\nimport { getScopedResource } from './unit-scope'\n\n/**\n * Resolve the best data provider for an EntityDef.\n * Supabase → Archetype → Mock (in order of preference).\n *\n * Reusable by createCrudPage, PluginRegistryManager, or any component\n * that needs a DataProvider from an EntityDef.\n */\nexport interface ResolveDataProviderOptions {\n backend?: BackendRef\n fayzApi?: Omit<FayzApiProviderConfig, 'entityKey' | 'table'>\n /**\n * Read through the shared TTL cache (default true).\n *\n * Callers that must observe writes made by ANOTHER surface pass false: the\n * cache is only invalidated by writes that go through it, so a record created\n * on the agenda screen stays invisible to the assistant for the rest of the\n * TTL — which is how \"o que tem na agenda hoje?\" answered \"nada\" over a\n * booking made seconds earlier.\n */\n cache?: boolean\n customProviders?: Record<string, <T extends { id: string }>(entityDef: EntityDef<T>, mockData?: T[]) => DataProvider<T>>\n}\n\nexport function resolveDataProvider<T extends { id: string }>(\n entityDef: EntityDef<T>,\n mockData?: T[],\n options: ResolveDataProviderOptions = {},\n): DataProvider<T> {\n const backend = options.backend\n\n if (backend?.provider === 'mock') {\n return createMockProvider(entityDef, mockData)\n }\n\n if (backend?.provider === 'fayz-api') {\n const table = entityDef.data?.table ?? entityDef.name\n return createFayzApiProvider<T>(table, {\n ...options.fayzApi,\n baseUrl: options.fayzApi?.baseUrl ?? backend.url,\n projectId: options.fayzApi?.projectId ?? backend.projectRef,\n entityKey: entityDef.name ?? table,\n table,\n schema: options.fayzApi?.schema ?? entityDef.data?.schema,\n idColumn: options.fayzApi?.idColumn ?? entityDef.data?.columnMap?.id,\n searchColumns: options.fayzApi?.searchColumns ?? entityDef.data?.searchColumns ?? entityDef.fields\n .filter((field) => field.searchable)\n .map((field) => field.key),\n tenantIdColumn: entityDef.data?.tenantScoped === false\n ? false\n : options.fayzApi?.tenantIdColumn ?? entityDef.data?.tenantIdColumn,\n tenantId: options.fayzApi?.tenantId ?? (() => getActiveTenantId()),\n })\n }\n\n if (backend?.provider === 'custom') {\n const adapterId = backend.adapterId\n const factory = adapterId ? options.customProviders?.[adapterId] : undefined\n if (!adapterId || !factory) {\n throw new Error(`[@fayz-ai/core] Custom data provider \"${adapterId ?? 'unknown'}\" is not registered.`)\n }\n return factory<T>(entityDef, mockData)\n }\n\n const client = getSupabaseClientOptional()\n\n if (client && entityDef.data?.table) {\n const tenantId = () => getActiveTenantId()\n // Archetype entities share a physical table (e.g. people) across kinds\n // (student/teacher/staff…). The cache key must carry the kind or the first\n // kind's resultset is served to every sibling entity (teachers page\n // listing students).\n // Which tables are unit-scoped is the DATABASE's answer, published into the\n // registry at boot — so an entity does not have to remember to opt in, and\n // the client can never disagree with the policy that actually decides.\n // An entity may still say `unitScoped: false` to stand outside it: the unit\n // tree itself does, because the switcher has to be able to name a unit whose\n // data you cannot see.\n const registered = getScopedResource(entityDef.data.table)\n const unitScoped = entityDef.data.unitScoped ?? Boolean(registered)\n const unitId = unitScoped ? () => getActiveUnitId() : undefined\n const unitConfig = {\n unitScoped,\n unitColumn: entityDef.data.unitIdColumn ?? registered?.unitColumn,\n includeSharedRows: entityDef.data.includeSharedRows,\n unitId,\n }\n const cacheOptions = {\n table: entityDef.data.archetypeKind\n ? `${entityDef.data.table}#${entityDef.data.archetypeKind}`\n : entityDef.data.table,\n tenantId,\n ttl: entityDef.data.cacheTTL,\n unitId,\n }\n const offlinePolicy = entityDef.data.offline ?? 'online'\n // Order: offline OUTSIDE cache. Outside, it only sees reads L1 could not\n // answer, and the stale rows it serves never enter L1 — inside, they would\n // be cached under the live query's key and replayed as fresh once the\n // network was back.\n const cached = <P extends DataProvider<T>>(p: P): DataProvider<T> => {\n const withL1 = options.cache === false ? (p as DataProvider<T>) : withCache(p, cacheOptions)\n return withOffline(withL1, { ...cacheOptions, policy: offlinePolicy, entityDef })\n }\n\n if (entityDef.data.archetype && entityDef.data.archetypeKind && !entityDef.data.schema) {\n // The custom-fields gate wraps INSIDE the cache: it reads the current row\n // to merge a partial write, and reading that through the cache would\n // merge onto a stale set and silently resurrect a key the merchant just\n // cleared.\n return cached(withCustomFields<T>(createArchetypeProvider<T>({\n archetype: entityDef.data.archetype,\n archetypeKind: entityDef.data.archetypeKind,\n projectTable: entityDef.data.table,\n tenantId,\n searchColumns: entityDef.data.searchColumns ?? entityDef.fields\n .filter((field) => field.searchable)\n .map((field) => field.key),\n ...unitConfig,\n }), entityDef.data.archetype))\n }\n\n return cached(createSupabaseProvider<T>(entityDef.data.table, {\n schema: entityDef.data.schema,\n tenantId: entityDef.data.tenantScoped === false ? undefined : tenantId,\n tenantIdColumn: entityDef.data.tenantIdColumn,\n searchColumns: entityDef.data.searchColumns ?? entityDef.fields\n .filter((field) => field.searchable)\n .map((field) => field.key),\n selectColumns: entityDef.data.selectColumns,\n columnMap: entityDef.data.columnMap,\n filters: entityDef.data.filters,\n defaults: entityDef.data.defaults,\n ...unitConfig,\n }))\n }\n\n if (entityDef.data?.table) {\n console.warn(\n `[fayz/core] resolveDataProvider: falling back to mock for \"${entityDef.name}\" (table: ${entityDef.data.table}). ` +\n `Supabase client ${client ? 'available' : 'NOT initialized'}.`,\n )\n }\n return createMockProvider(entityDef, mockData)\n}\n","// ---------------------------------------------------------------------------\n// \"This pool does not have that table\" — asked once, not once per screen.\n//\n// Pools drift. A tenant on an older pool is missing `tasks`, `scoped_resources`\n// or `unit_bootstrap`, and every feature that reads one degrades correctly and\n// then asks again on the next mount. The result is a network tab where the\n// real failures are buried under 404s that are already understood, and a\n// backend answering questions whose answer cannot change while the tab is open.\n//\n// Deliberately NOT persisted. A missing object becomes present through a\n// deploy, and a reload is the honest place to notice — a localStorage memo\n// would strand a pool that just took the migration.\n// ---------------------------------------------------------------------------\n\nimport { toDataError } from './errors'\n\nconst missing = new Set<string>()\n\n/** Whether this object was already found missing. Callers skip the request. */\nexport function isKnownMissing(key: string): boolean {\n return missing.has(key)\n}\n\n/**\n * Classifies `error` and, when the object itself is absent, remembers it.\n *\n * Returns true for \"the object is not in this pool\" so the caller can tell that\n * apart from a real failure it may still want to report. Only 'missing-object'\n * is remembered: a 403 is a grant to fix, not an absence, and forgetting to ask\n * again would hide it.\n */\nexport function rememberIfMissing(key: string, error: unknown): boolean {\n if (!error) return false\n if (toDataError(error).kind !== 'missing-object') return false\n missing.add(key)\n return true\n}\n\n/** Test seam, and the right thing to call when the backend itself changes. */\nexport function resetMissingObjects(): void {\n missing.clear()\n}\n","// ---------------------------------------------------------------------------\n// The ad-hoc data door.\n//\n// Everything that is not a registered entity — a dashboard aggregate, a report\n// view, an RPC the assistant calls — used to reach for the raw Supabase client\n// and reinvent the same four things badly: tenant scoping, timeouts, retries,\n// and error text. That is also why there was no single seam to put a cache or\n// an offline queue behind.\n//\n// `dataQuery` (reads) and `dataCall` (writes/RPCs) are that seam. Every failure\n// leaves here as a DataError, every read can be answered from `globalCache`,\n// and every write announces itself on the refresh bus.\n// ---------------------------------------------------------------------------\n\nimport { DataError, toDataError } from './errors'\nimport { emitDataChanged } from './refresh'\nimport { getSupabaseClientOptional } from './supabase'\nimport { globalCache, stableKey } from '../lib/cache'\nimport { getActiveTenantId } from '../lib/tenant'\n\nconst DEFAULT_TIMEOUT_MS = 15_000\nconst DEFAULT_RETRY_DELAY_MS = 150\n\n// ---------------------------------------------------------------------------\n// Structural view of the PostgREST client — the SDK never imports supabase-js.\n// ---------------------------------------------------------------------------\n\n/** The PostgREST builder, loose on purpose so `apply` can chain any operator. */\nexport interface DataQueryBuilder {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [method: string]: any\n}\n\ninterface PostgrestResponse {\n data: unknown\n error: unknown\n count?: number | null\n}\n\ninterface SupabaseLike {\n from: (table: string) => DataQueryBuilder\n rpc: (name: string, args?: Record<string, unknown>) => DataQueryBuilder\n schema?: (name: string) => SupabaseLike\n}\n\n// ---------------------------------------------------------------------------\n// Telemetry seam\n// ---------------------------------------------------------------------------\n\nexport interface DataTelemetryEvent {\n op: 'query' | 'call'\n /** Table/view name, or `rpc:<name>`. */\n target: string\n durationMs: number\n /** Present only when the operation failed. */\n error?: DataError\n /** True when the answer came from the cache instead of the network. */\n cached?: boolean\n}\n\nexport type DataTelemetryHook = (event: DataTelemetryEvent) => void\n\nlet telemetryHook: DataTelemetryHook | null = null\n\n/** Registers the single telemetry sink. Returns a disposer restoring the previous one. */\nexport function registerDataTelemetry(fn: DataTelemetryHook | null): () => void {\n const previous = telemetryHook\n telemetryHook = fn\n return () => {\n telemetryHook = previous\n }\n}\n\nfunction report(event: DataTelemetryEvent): void {\n if (!telemetryHook) return\n // A broken telemetry sink must never become the caller's error.\n try {\n telemetryHook(event)\n } catch {\n /* ignore */\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shared options\n// ---------------------------------------------------------------------------\n\nexport interface DataRpcRef {\n name: string\n args?: Record<string, unknown>\n}\n\ninterface DataOperationOptions {\n /** Non-public schema to reach through (`saas_core`). Defaults to `public`. */\n schema?: string\n /**\n * `'auto'` (default) scopes the operation to the active tenant and refuses to\n * run without one — a tenant-less \"auto\" read is a cross-tenant read.\n */\n tenant?: 'auto' | 'none'\n /** Column carrying the tenant. Default `tenant_id`. */\n tenantColumn?: string\n /** RPC argument to receive the tenant id (`p_tenant_id`). Nothing is injected without it. */\n tenantArg?: string\n /** Abort deadline in ms. Default 15 000. */\n timeoutMs?: number\n}\n\nexport interface DataQueryOptions extends DataOperationOptions {\n /** Table or view to read. Mutually exclusive with `rpc`. */\n from?: string\n /** Read-only RPC. Mutually exclusive with `from`. */\n rpc?: DataRpcRef\n select?: string\n /** Equality filters, column → value. `null` matches NULL; `undefined` is skipped. */\n filters?: Record<string, unknown>\n /** Escape hatch for operators the equality map cannot express (`in`, `gte`, `or`). */\n apply?: (builder: DataQueryBuilder) => DataQueryBuilder\n order?: { column: string; ascending?: boolean }\n limit?: number\n /** 1-based page; combined with `limit` it becomes a PostgREST range. */\n page?: number\n /** Return the single row instead of the array (PGRST116 becomes `not-found`). */\n single?: boolean\n /** `'cache'` serves and fills `globalCache`; `'online'` (default) always hits the network. */\n policy?: 'online' | 'cache'\n /** TTL for the cached entry, ms. Defaults to the cache store default. */\n ttl?: number\n /** Cache key override. Only meaningful with `policy: 'cache'`. */\n key?: string\n /** Backoff between the two attempts made for a retryable failure. */\n retryDelayMs?: number\n}\n\nexport interface DataCallOptions extends DataOperationOptions {\n from?: string\n action?: 'insert' | 'update' | 'upsert' | 'delete'\n values?: Record<string, unknown> | Record<string, unknown>[]\n /** Equality match selecting the affected rows for `update`/`delete`. */\n match?: Record<string, unknown>\n rpc?: DataRpcRef\n select?: string\n /** Read the affected rows back. Default: true for writes, false for `delete`. */\n returning?: boolean\n /** Unwrap to a single row. Default: true when `values` is a single object. */\n single?: boolean\n /** Extra tables an RPC touches, so their cached reads are dropped too. */\n invalidates?: string[]\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getClient(schema?: string): SupabaseLike {\n const client = getSupabaseClientOptional() as SupabaseLike | null\n if (!client) throw new DataError('invalid', 'supabase client not initialized')\n if (!schema || schema === 'public') return client\n if (typeof client.schema !== 'function') {\n throw new DataError('invalid', `supabase client cannot reach schema \"${schema}\"`)\n }\n return client.schema(schema)\n}\n\ninterface TenantScope {\n column: string\n arg?: string\n id: string\n}\n\nfunction resolveTenant(options: DataOperationOptions, target: string): TenantScope | null {\n if (options.tenant === 'none') return null\n const id = getActiveTenantId()\n if (!id) {\n throw new DataError(\n 'invalid',\n `no active tenant for \"${target}\" — set one with setActiveTenantId, or pass tenant: 'none'`,\n )\n }\n return { column: options.tenantColumn ?? 'tenant_id', arg: options.tenantArg, id }\n}\n\nfunction targetOf(from: string | undefined, rpc: DataRpcRef | undefined): string {\n return from ?? `rpc:${rpc?.name ?? '?'}`\n}\n\n/** Cache namespace shared with withCache/emitDataChanged, so one write clears both. */\nfunction cachePrefix(tenantId: string | undefined, table: string): string {\n return `${tenantId ?? '_'}:${table}`\n}\n\nfunction applyFilters(builder: DataQueryBuilder, filters: Record<string, unknown> | undefined): DataQueryBuilder {\n if (!filters) return builder\n let q = builder\n for (const [column, value] of Object.entries(filters)) {\n if (value === undefined) continue\n q = value === null ? q.is(column, null) : q.eq(column, value)\n }\n return q\n}\n\nfunction withAbort(builder: DataQueryBuilder, signal: AbortSignal): DataQueryBuilder {\n return typeof builder.abortSignal === 'function' ? builder.abortSignal(signal) : builder\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\n/**\n * Runs the thenable builder under a deadline. The abort signal is what the real\n * client honours; the race is what protects us from a builder that never\n * settles at all (a cold boot before the auth session exists).\n */\nasync function runWithTimeout(\n build: (signal: AbortSignal) => DataQueryBuilder,\n timeoutMs: number,\n): Promise<PostgrestResponse> {\n const controller = new AbortController()\n let timer: ReturnType<typeof setTimeout> | undefined\n const deadline = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n controller.abort()\n reject(new DataError('offline', `request timed out after ${timeoutMs}ms`))\n }, timeoutMs)\n })\n try {\n const pending = Promise.resolve(build(controller.signal) as unknown as PromiseLike<PostgrestResponse>)\n return await Promise.race([pending, deadline])\n } finally {\n if (timer) clearTimeout(timer)\n }\n}\n\nfunction unwrap(response: PostgrestResponse): unknown {\n if (response?.error) throw toDataError(response.error)\n return response?.data\n}\n\n// ---------------------------------------------------------------------------\n// dataQuery — reads\n// ---------------------------------------------------------------------------\n\nexport async function dataQuery<T>(options: DataQueryOptions & { single: true }): Promise<T>\nexport async function dataQuery<T>(options: DataQueryOptions): Promise<T[]>\nexport async function dataQuery<T>(options: DataQueryOptions): Promise<T | T[]> {\n const started = Date.now()\n const target = targetOf(options.from, options.rpc)\n\n try {\n if (!options.from === !options.rpc) {\n throw new DataError('invalid', 'dataQuery needs exactly one of `from` or `rpc`')\n }\n\n const tenant = resolveTenant(options, target)\n const cacheKey =\n options.key ??\n `${cachePrefix(tenant?.id, target)}:${stableKey('q', {\n select: options.select,\n filters: options.filters,\n rpc: options.rpc?.args,\n order: options.order,\n limit: options.limit,\n page: options.page,\n single: options.single,\n schema: options.schema,\n })}`\n\n if (options.policy === 'cache') {\n const hit = globalCache.get<T | T[]>(cacheKey)\n if (hit !== undefined) {\n report({ op: 'query', target, durationMs: Date.now() - started, cached: true })\n return hit\n }\n }\n\n const attempts = 2\n let lastError: DataError | undefined\n for (let attempt = 1; attempt <= attempts; attempt++) {\n try {\n const rows = await executeQuery<T>(options, tenant)\n if (options.policy === 'cache') globalCache.set(cacheKey, rows, options.ttl)\n report({ op: 'query', target, durationMs: Date.now() - started })\n return rows\n } catch (err) {\n lastError = toDataError(err)\n if (!lastError.retryable || attempt === attempts) throw lastError\n await delay(options.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS)\n }\n }\n throw lastError ?? new DataError('server', `query on \"${target}\" produced no result`)\n } catch (err) {\n const error = toDataError(err)\n report({ op: 'query', target, durationMs: Date.now() - started, error })\n throw error\n }\n}\n\nasync function executeQuery<T>(options: DataQueryOptions, tenant: TenantScope | null): Promise<T | T[]> {\n const client = getClient(options.schema)\n\n const response = await runWithTimeout((signal) => {\n let q: DataQueryBuilder\n if (options.rpc) {\n const args = { ...options.rpc.args }\n if (tenant?.arg && args[tenant.arg] === undefined) args[tenant.arg] = tenant.id\n q = client.rpc(options.rpc.name, args)\n if (options.select) q = q.select(options.select)\n } else {\n q = client.from(options.from!).select(options.select ?? '*')\n if (tenant) q = q.eq(tenant.column, tenant.id)\n }\n\n q = applyFilters(q, options.filters)\n if (options.apply) q = options.apply(q)\n if (options.order) q = q.order(options.order.column, { ascending: options.order.ascending !== false })\n\n if (options.limit !== undefined) {\n const page = Math.max(1, options.page ?? 1)\n const from = (page - 1) * options.limit\n q = page > 1 ? q.range(from, from + options.limit - 1) : q.limit(options.limit)\n }\n if (options.single) q = q.single()\n\n return withAbort(q, signal)\n }, options.timeoutMs ?? DEFAULT_TIMEOUT_MS)\n\n const data = unwrap(response)\n if (options.single) return data as T\n return (data ?? []) as T[]\n}\n\n// ---------------------------------------------------------------------------\n// dataCall — mutations and RPCs\n// ---------------------------------------------------------------------------\n\n/**\n * Writes never retry: `insert` is not idempotent, and a retry after a response\n * we simply failed to read would duplicate the row.\n */\nexport async function dataCall<T = unknown>(options: DataCallOptions): Promise<T> {\n const started = Date.now()\n const target = targetOf(options.from, options.rpc)\n\n try {\n if (!options.from === !options.rpc) {\n throw new DataError('invalid', 'dataCall needs exactly one of `from` or `rpc`')\n }\n if (options.from && !options.action) {\n throw new DataError('invalid', `dataCall on \"${options.from}\" needs an action`)\n }\n\n const tenant = resolveTenant(options, target)\n const client = getClient(options.schema)\n const isDelete = options.action === 'delete'\n const returning = options.returning ?? !isDelete\n const single = options.single ?? (returning && !Array.isArray(options.values))\n\n const response = await runWithTimeout((signal) => {\n let q: DataQueryBuilder\n if (options.rpc) {\n const args = { ...options.rpc.args }\n if (tenant?.arg && args[tenant.arg] === undefined) args[tenant.arg] = tenant.id\n q = client.rpc(options.rpc.name, args)\n } else {\n const table = client.from(options.from!)\n const values = withTenantValues(options.values, tenant, options.action!)\n const match = { ...options.match }\n if (tenant && (options.action === 'update' || options.action === 'delete')) {\n match[tenant.column] = tenant.id\n }\n q =\n options.action === 'insert'\n ? table.insert(values)\n : options.action === 'upsert'\n ? table.upsert(values)\n : options.action === 'update'\n ? table.update(values)\n : table.delete()\n q = applyFilters(q, match)\n if (returning) q = q.select(options.select ?? '*')\n if (single) q = q.single()\n }\n return withAbort(q, signal)\n }, options.timeoutMs ?? DEFAULT_TIMEOUT_MS)\n\n const data = unwrap(response)\n\n if (options.from) {\n globalCache.invalidate(cachePrefix(tenant?.id ?? getActiveTenantId(), options.from))\n emitDataChanged({ table: options.from, op: changeOp(options.action!), source: 'ui' })\n }\n for (const table of options.invalidates ?? []) {\n globalCache.invalidate(cachePrefix(tenant?.id ?? getActiveTenantId(), table))\n emitDataChanged({ table, op: 'unknown', source: 'ui' })\n }\n\n report({ op: 'call', target, durationMs: Date.now() - started })\n return data as T\n } catch (err) {\n const error = toDataError(err)\n report({ op: 'call', target, durationMs: Date.now() - started, error })\n throw error\n }\n}\n\nfunction changeOp(action: NonNullable<DataCallOptions['action']>): 'create' | 'update' | 'delete' {\n if (action === 'insert') return 'create'\n if (action === 'delete') return 'delete'\n return 'update'\n}\n\nfunction withTenantValues(\n values: DataCallOptions['values'],\n tenant: TenantScope | null,\n action: NonNullable<DataCallOptions['action']>,\n): unknown {\n if (values === undefined) return undefined\n if (!tenant || action === 'update') return values\n const stamp = (row: Record<string, unknown>) =>\n row[tenant.column] === undefined ? { ...row, [tenant.column]: tenant.id } : row\n return Array.isArray(values) ? values.map(stamp) : stamp(values)\n}\n","import type { BulkWriteOptions, BulkWriteResult, DataProvider } from './types'\n\n/**\n * Write many rows through whatever the provider supports.\n *\n * `createMany` when it exists (one round-trip per chunk), otherwise a sequential\n * `create` loop. Callers never branch: a mock provider and a Supabase table\n * import the same way, only slower.\n *\n * Never all-or-nothing. A 900-row client list will contain a malformed phone\n * and a duplicate e-mail, and a single transaction would throw away the other\n * 898 — plus a statement that large risks the timeout. Failures are collected\n * with their row index so the caller can hand them back for correction.\n */\nexport async function bulkCreate<T extends { id: string }>(\n provider: DataProvider<T>,\n rows: Array<Omit<T, 'id' | 'createdAt' | 'updatedAt' | 'tenantId'>>,\n options?: BulkWriteOptions,\n): Promise<BulkWriteResult> {\n if (!rows.length) return { created: 0, failed: [] }\n if (provider.createMany) return provider.createMany(rows, options)\n\n let created = 0\n const failed: Array<{ index: number; message: string }> = []\n for (let i = 0; i < rows.length; i++) {\n try {\n await provider.create(rows[i])\n created += 1\n } catch (error) {\n failed.push({ index: i, message: error instanceof Error ? error.message : String(error) })\n }\n options?.onProgress?.(i + 1, rows.length)\n }\n return { created, failed }\n}\n\n/** Outcome of a bulk delete: how many rows went, and which ids did not and why. */\nexport interface BulkRemoveResult {\n removed: number\n failed: Array<{ id: string; message: string }>\n}\n\n/**\n * Delete many rows through whatever the provider supports.\n *\n * `removeMany` when it exists — chunked, because PostgREST puts `in.(…)` in the\n * query STRING and a few hundred uuids there is a URL no proxy promises to\n * carry. Otherwise a sequential `remove` loop.\n *\n * A chunk is all-or-nothing on the wire, so a chunk that throws is reported as\n * every id in it having failed: the caller must not tell the user rows are gone\n * when the statement rolled back.\n */\nexport async function bulkRemove<T extends { id: string }>(\n provider: DataProvider<T>,\n ids: string[],\n options?: { chunkSize?: number },\n): Promise<BulkRemoveResult> {\n if (!ids.length) return { removed: 0, failed: [] }\n\n const failed: Array<{ id: string; message: string }> = []\n const message = (error: unknown) => (error instanceof Error ? error.message : String(error))\n\n if (provider.removeMany) {\n const chunkSize = options?.chunkSize ?? 100\n let removed = 0\n for (let i = 0; i < ids.length; i += chunkSize) {\n const chunk = ids.slice(i, i + chunkSize)\n try {\n await provider.removeMany(chunk)\n removed += chunk.length\n } catch (error) {\n for (const id of chunk) failed.push({ id, message: message(error) })\n }\n }\n return { removed, failed }\n }\n\n let removed = 0\n for (const id of ids) {\n try {\n await provider.remove(id)\n removed += 1\n } catch (error) {\n failed.push({ id, message: message(error) })\n }\n }\n return { removed, failed }\n}\n"]}
@@ -56,6 +56,31 @@ function applyRangeToQuery(query, column, range) {
56
56
  return q;
57
57
  }
58
58
 
59
+ // src/data/unit-scope.ts
60
+ var _scoped = {};
61
+ function setScopedResources(map) {
62
+ _scoped = map;
63
+ }
64
+ function getScopedResource(table) {
65
+ if (!table) return void 0;
66
+ return _scoped[table];
67
+ }
68
+ function resolveUnitScope(config) {
69
+ if (!config.unitScoped) return null;
70
+ const id = config.unitId?.();
71
+ if (!id) return null;
72
+ return {
73
+ column: config.unitColumn ?? "unit_id",
74
+ id,
75
+ includeShared: config.includeSharedRows !== false
76
+ };
77
+ }
78
+ function applyUnitScope(builder, scope) {
79
+ if (!scope) return builder;
80
+ const q = builder;
81
+ return scope.includeShared ? q.or(`${scope.column}.eq.${scope.id},${scope.column}.is.null`) : q.eq(scope.column, scope.id);
82
+ }
83
+
59
84
  // src/data/supabase.ts
60
85
  function camelToSnake(str) {
61
86
  return str.replace(/[A-Z]/g, (c) => "_" + c.toLowerCase());
@@ -80,7 +105,7 @@ function mapEntity(entity, columnMap) {
80
105
  }
81
106
  const result = {};
82
107
  for (const [key, value] of Object.entries(entity)) {
83
- if (key === "id" || key === "createdAt" || key === "updatedAt" || key === "tenantId" || key === "createdBy") continue;
108
+ if (key === "id" || key === "createdAt" || key === "updatedAt" || key === "tenantId" || key === "createdBy" || key === "ownerId") continue;
84
109
  const snakeKey = reverseMap[key] ?? camelToSnake(key);
85
110
  result[snakeKey] = value;
86
111
  }
@@ -103,6 +128,9 @@ function createSupabaseProvider(table, config) {
103
128
  if (!config?.tenantId) return void 0;
104
129
  return typeof config.tenantId === "function" ? config.tenantId() : config.tenantId;
105
130
  }
131
+ function unitScope() {
132
+ return resolveUnitScope(config ?? {});
133
+ }
106
134
  function getClient() {
107
135
  const supabase = config?.supabaseClient ?? _globalSupabaseClient;
108
136
  if (!supabase) throw new Error(`[@fayz-ai/core] Supabase client not available. Call createFayzApp with a provider first.`);
@@ -114,6 +142,7 @@ function createSupabaseProvider(table, config) {
114
142
  let q = getClient().from(table).select(selectCols, wantCount ? { count: "exact" } : void 0);
115
143
  const tenantId = resolveTenantId();
116
144
  if (tenantId) q = q.eq(tenantIdCol, tenantId);
145
+ q = applyUnitScope(q, unitScope());
117
146
  if (config?.filters) {
118
147
  for (const [col, val] of Object.entries(config.filters)) {
119
148
  q = q.eq(col, val);
@@ -161,6 +190,8 @@ function createSupabaseProvider(table, config) {
161
190
  const row = mapEntity(data, columnMap);
162
191
  const tenantId = resolveTenantId();
163
192
  if (tenantId) row[tenantIdCol] = tenantId;
193
+ const scope = unitScope();
194
+ if (scope && row[scope.column] === void 0) row[scope.column] = scope.id;
164
195
  if (config?.defaults) {
165
196
  for (const [col, val] of Object.entries(config.defaults)) {
166
197
  if (row[col] === void 0) row[col] = val;
@@ -173,9 +204,11 @@ function createSupabaseProvider(table, config) {
173
204
  async createMany(rows, options) {
174
205
  const tenantId = resolveTenantId();
175
206
  const size = Math.max(1, options?.chunkSize ?? 200);
207
+ const scope = unitScope();
176
208
  const prepared = rows.map((r) => {
177
209
  const row = mapEntity(r, columnMap);
178
210
  if (tenantId) row[tenantIdCol] = tenantId;
211
+ if (scope && row[scope.column] === void 0) row[scope.column] = scope.id;
179
212
  if (config?.defaults) {
180
213
  for (const [col, val] of Object.entries(config.defaults)) {
181
214
  if (row[col] === void 0) row[col] = val;
@@ -315,6 +348,6 @@ function useActiveTenantId() {
315
348
  return React.useSyncExternalStore(subscribeActiveTenant, getActiveTenantId, getActiveTenantId);
316
349
  }
317
350
 
318
- export { DEFAULT_CACHE_TTL, applyRangeToQuery, clearGlobalCache, createCacheStore, createSupabaseProvider, getActiveTenantId, getSupabaseClientOptional, globalCache, isFilterObject, matchesRange, parseRangeFilter, setActiveTenantId, setGlobalSupabaseClient, stableKey, subscribeActiveTenant, useActiveTenantId };
319
- //# sourceMappingURL=chunk-KFBEKFII.js.map
320
- //# sourceMappingURL=chunk-KFBEKFII.js.map
351
+ export { DEFAULT_CACHE_TTL, applyRangeToQuery, applyUnitScope, clearGlobalCache, createCacheStore, createSupabaseProvider, getActiveTenantId, getScopedResource, getSupabaseClientOptional, globalCache, isFilterObject, matchesRange, parseRangeFilter, resolveUnitScope, setActiveTenantId, setGlobalSupabaseClient, setScopedResources, stableKey, subscribeActiveTenant, useActiveTenantId };
352
+ //# sourceMappingURL=chunk-BCI743RH.js.map
353
+ //# sourceMappingURL=chunk-BCI743RH.js.map