@sprinterai/supabase 0.3.0 → 0.5.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 (258) hide show
  1. package/LICENSE +21 -0
  2. package/dist/auth/adapter.js +3 -3
  3. package/dist/auth/guards.d.ts +27 -0
  4. package/dist/auth/guards.d.ts.map +1 -0
  5. package/dist/auth/guards.js +61 -0
  6. package/dist/auth/guards.js.map +1 -0
  7. package/dist/auth/index.d.ts +6 -4
  8. package/dist/auth/index.d.ts.map +1 -1
  9. package/dist/auth/index.js +5 -3
  10. package/dist/auth/index.js.map +1 -1
  11. package/dist/auth/permissions.d.ts +9 -1
  12. package/dist/auth/permissions.d.ts.map +1 -1
  13. package/dist/auth/permissions.js +13 -0
  14. package/dist/auth/permissions.js.map +1 -1
  15. package/dist/clients/admin.d.ts +3 -1
  16. package/dist/clients/admin.d.ts.map +1 -1
  17. package/dist/clients/admin.js +3 -3
  18. package/dist/clients/admin.js.map +1 -1
  19. package/dist/clients/browser.d.ts +3 -1
  20. package/dist/clients/browser.d.ts.map +1 -1
  21. package/dist/clients/browser.js +3 -3
  22. package/dist/clients/browser.js.map +1 -1
  23. package/dist/clients/index.d.ts +3 -3
  24. package/dist/clients/index.js +3 -3
  25. package/dist/clients/server.d.ts +2 -1
  26. package/dist/clients/server.d.ts.map +1 -1
  27. package/dist/clients/server.js +1 -1
  28. package/dist/clients/server.js.map +1 -1
  29. package/dist/generated/database-types.d.ts +4020 -0
  30. package/dist/generated/database-types.d.ts.map +1 -0
  31. package/dist/generated/database-types.js +97 -0
  32. package/dist/generated/database-types.js.map +1 -0
  33. package/dist/generated/index.d.ts +48 -0
  34. package/dist/generated/index.d.ts.map +1 -0
  35. package/dist/generated/index.js +2 -0
  36. package/dist/generated/index.js.map +1 -0
  37. package/dist/index.d.ts +12 -10
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +7 -5
  40. package/dist/index.js.map +1 -1
  41. package/dist/realtime/index.d.ts +2 -2
  42. package/dist/realtime/index.js +1 -1
  43. package/dist/resolvers.d.ts +23 -0
  44. package/dist/resolvers.d.ts.map +1 -0
  45. package/dist/resolvers.js +57 -0
  46. package/dist/resolvers.js.map +1 -0
  47. package/dist/stores/activity-store.d.ts +21 -0
  48. package/dist/stores/activity-store.d.ts.map +1 -0
  49. package/dist/stores/activity-store.js +122 -0
  50. package/dist/stores/activity-store.js.map +1 -0
  51. package/dist/stores/admin-store.d.ts +27 -0
  52. package/dist/stores/admin-store.d.ts.map +1 -0
  53. package/dist/stores/admin-store.js +171 -0
  54. package/dist/stores/admin-store.js.map +1 -0
  55. package/dist/stores/agent-store.d.ts +6 -2
  56. package/dist/stores/agent-store.d.ts.map +1 -1
  57. package/dist/stores/agent-store.js +83 -6
  58. package/dist/stores/agent-store.js.map +1 -1
  59. package/dist/stores/approval-store.d.ts +19 -0
  60. package/dist/stores/approval-store.d.ts.map +1 -0
  61. package/dist/stores/approval-store.js +108 -0
  62. package/dist/stores/approval-store.js.map +1 -0
  63. package/dist/stores/chat-store.d.ts +2 -1
  64. package/dist/stores/chat-store.d.ts.map +1 -1
  65. package/dist/stores/chat-store.js +46 -36
  66. package/dist/stores/chat-store.js.map +1 -1
  67. package/dist/stores/comment-store.d.ts +13 -0
  68. package/dist/stores/comment-store.d.ts.map +1 -0
  69. package/dist/stores/comment-store.js +67 -0
  70. package/dist/stores/comment-store.js.map +1 -0
  71. package/dist/stores/cost-store.d.ts +15 -0
  72. package/dist/stores/cost-store.d.ts.map +1 -0
  73. package/dist/stores/cost-store.js +69 -0
  74. package/dist/stores/cost-store.js.map +1 -0
  75. package/dist/stores/criteria-set-store.d.ts +16 -0
  76. package/dist/stores/criteria-set-store.d.ts.map +1 -0
  77. package/dist/stores/criteria-set-store.js +127 -0
  78. package/dist/stores/criteria-set-store.js.map +1 -0
  79. package/dist/stores/document-store.d.ts +21 -0
  80. package/dist/stores/document-store.d.ts.map +1 -0
  81. package/dist/stores/document-store.js +191 -0
  82. package/dist/stores/document-store.js.map +1 -0
  83. package/dist/stores/embed-store.d.ts +11 -0
  84. package/dist/stores/embed-store.d.ts.map +1 -0
  85. package/dist/stores/embed-store.js +71 -0
  86. package/dist/stores/embed-store.js.map +1 -0
  87. package/dist/stores/entity-store.d.ts +7 -2
  88. package/dist/stores/entity-store.d.ts.map +1 -1
  89. package/dist/stores/entity-store.js +163 -37
  90. package/dist/stores/entity-store.js.map +1 -1
  91. package/dist/stores/extraction-store.d.ts +18 -0
  92. package/dist/stores/extraction-store.d.ts.map +1 -0
  93. package/dist/stores/extraction-store.js +170 -0
  94. package/dist/stores/extraction-store.js.map +1 -0
  95. package/dist/stores/factory.d.ts +29 -2
  96. package/dist/stores/factory.d.ts.map +1 -1
  97. package/dist/stores/factory.js +60 -9
  98. package/dist/stores/factory.js.map +1 -1
  99. package/dist/stores/favorites-store.d.ts +13 -0
  100. package/dist/stores/favorites-store.d.ts.map +1 -0
  101. package/dist/stores/favorites-store.js +53 -0
  102. package/dist/stores/favorites-store.js.map +1 -0
  103. package/dist/stores/feedback-store.d.ts +12 -0
  104. package/dist/stores/feedback-store.d.ts.map +1 -0
  105. package/dist/stores/feedback-store.js +59 -0
  106. package/dist/stores/feedback-store.js.map +1 -0
  107. package/dist/stores/inbound-store.d.ts +16 -0
  108. package/dist/stores/inbound-store.d.ts.map +1 -0
  109. package/dist/stores/inbound-store.js +133 -0
  110. package/dist/stores/inbound-store.js.map +1 -0
  111. package/dist/stores/index.d.ts +36 -10
  112. package/dist/stores/index.d.ts.map +1 -1
  113. package/dist/stores/index.js +35 -9
  114. package/dist/stores/index.js.map +1 -1
  115. package/dist/stores/member-store.d.ts +23 -0
  116. package/dist/stores/member-store.d.ts.map +1 -0
  117. package/dist/stores/member-store.js +121 -0
  118. package/dist/stores/member-store.js.map +1 -0
  119. package/dist/stores/memory-store.d.ts +4 -1
  120. package/dist/stores/memory-store.d.ts.map +1 -1
  121. package/dist/stores/memory-store.js +31 -3
  122. package/dist/stores/memory-store.js.map +1 -1
  123. package/dist/stores/nav-config-store.d.ts +13 -0
  124. package/dist/stores/nav-config-store.d.ts.map +1 -0
  125. package/dist/stores/nav-config-store.js +104 -0
  126. package/dist/stores/nav-config-store.js.map +1 -0
  127. package/dist/stores/notification-store.d.ts +15 -0
  128. package/dist/stores/notification-store.d.ts.map +1 -0
  129. package/dist/stores/notification-store.js +88 -0
  130. package/dist/stores/notification-store.js.map +1 -0
  131. package/dist/stores/recent-view-store.d.ts +11 -0
  132. package/dist/stores/recent-view-store.d.ts.map +1 -0
  133. package/dist/stores/recent-view-store.js +39 -0
  134. package/dist/stores/recent-view-store.js.map +1 -0
  135. package/dist/stores/response-store.d.ts +15 -0
  136. package/dist/stores/response-store.d.ts.map +1 -0
  137. package/dist/stores/response-store.js +294 -0
  138. package/dist/stores/response-store.js.map +1 -0
  139. package/dist/stores/share-store.d.ts +14 -0
  140. package/dist/stores/share-store.d.ts.map +1 -0
  141. package/dist/stores/share-store.js +153 -0
  142. package/dist/stores/share-store.js.map +1 -0
  143. package/dist/stores/shared-context-store.d.ts +12 -0
  144. package/dist/stores/shared-context-store.d.ts.map +1 -0
  145. package/dist/stores/shared-context-store.js +55 -0
  146. package/dist/stores/shared-context-store.js.map +1 -0
  147. package/dist/stores/skill-store.d.ts +21 -0
  148. package/dist/stores/skill-store.d.ts.map +1 -0
  149. package/dist/stores/skill-store.js +163 -0
  150. package/dist/stores/skill-store.js.map +1 -0
  151. package/dist/stores/source-store.d.ts +23 -0
  152. package/dist/stores/source-store.d.ts.map +1 -0
  153. package/dist/stores/source-store.js +111 -0
  154. package/dist/stores/source-store.js.map +1 -0
  155. package/dist/stores/task-store.d.ts +2 -1
  156. package/dist/stores/task-store.d.ts.map +1 -1
  157. package/dist/stores/task-store.js +58 -6
  158. package/dist/stores/task-store.js.map +1 -1
  159. package/dist/stores/template-store.d.ts +16 -0
  160. package/dist/stores/template-store.d.ts.map +1 -0
  161. package/dist/stores/template-store.js +136 -0
  162. package/dist/stores/template-store.js.map +1 -0
  163. package/dist/stores/tenant-store.d.ts +2 -1
  164. package/dist/stores/tenant-store.d.ts.map +1 -1
  165. package/dist/stores/tenant-store.js +2 -2
  166. package/dist/stores/tenant-store.js.map +1 -1
  167. package/dist/stores/theme-store.d.ts +11 -0
  168. package/dist/stores/theme-store.d.ts.map +1 -0
  169. package/dist/stores/theme-store.js +41 -0
  170. package/dist/stores/theme-store.js.map +1 -0
  171. package/dist/stores/tool-definition-store.d.ts +18 -0
  172. package/dist/stores/tool-definition-store.d.ts.map +1 -0
  173. package/dist/stores/tool-definition-store.js +129 -0
  174. package/dist/stores/tool-definition-store.js.map +1 -0
  175. package/dist/stores/tool-store.d.ts +21 -2
  176. package/dist/stores/tool-store.d.ts.map +1 -1
  177. package/dist/stores/tool-store.js +112 -2
  178. package/dist/stores/tool-store.js.map +1 -1
  179. package/dist/stores/view-store.d.ts +8 -4
  180. package/dist/stores/view-store.d.ts.map +1 -1
  181. package/dist/stores/view-store.js +94 -14
  182. package/dist/stores/view-store.js.map +1 -1
  183. package/dist/stores/webhook-endpoint-store.d.ts +18 -0
  184. package/dist/stores/webhook-endpoint-store.d.ts.map +1 -0
  185. package/dist/stores/webhook-endpoint-store.js +56 -0
  186. package/dist/stores/webhook-endpoint-store.js.map +1 -0
  187. package/dist/stores/workflow-run-store.d.ts +23 -0
  188. package/dist/stores/workflow-run-store.d.ts.map +1 -0
  189. package/dist/stores/workflow-run-store.js +201 -0
  190. package/dist/stores/workflow-run-store.js.map +1 -0
  191. package/dist/tenant/actions.js +1 -1
  192. package/dist/tenant/context.js +1 -1
  193. package/dist/tenant/index.d.ts +5 -5
  194. package/dist/tenant/index.js +4 -4
  195. package/dist/types/index.d.ts +5 -4
  196. package/dist/types/index.d.ts.map +1 -1
  197. package/dist/types/index.js +1 -1
  198. package/package.json +19 -14
  199. package/dist/__test-utils__/mock-supabase.d.ts +0 -18
  200. package/dist/__test-utils__/mock-supabase.d.ts.map +0 -1
  201. package/dist/__test-utils__/mock-supabase.js +0 -89
  202. package/dist/__test-utils__/mock-supabase.js.map +0 -1
  203. package/dist/auth/claims.test.d.ts +0 -2
  204. package/dist/auth/claims.test.d.ts.map +0 -1
  205. package/dist/auth/claims.test.js +0 -32
  206. package/dist/auth/claims.test.js.map +0 -1
  207. package/dist/auth/permissions.test.d.ts +0 -2
  208. package/dist/auth/permissions.test.d.ts.map +0 -1
  209. package/dist/auth/permissions.test.js +0 -40
  210. package/dist/auth/permissions.test.js.map +0 -1
  211. package/dist/clients/admin.test.d.ts +0 -2
  212. package/dist/clients/admin.test.d.ts.map +0 -1
  213. package/dist/clients/admin.test.js +0 -31
  214. package/dist/clients/admin.test.js.map +0 -1
  215. package/dist/clients/browser.test.d.ts +0 -2
  216. package/dist/clients/browser.test.d.ts.map +0 -1
  217. package/dist/clients/browser.test.js +0 -29
  218. package/dist/clients/browser.test.js.map +0 -1
  219. package/dist/clients/server.test.d.ts +0 -2
  220. package/dist/clients/server.test.d.ts.map +0 -1
  221. package/dist/clients/server.test.js +0 -26
  222. package/dist/clients/server.test.js.map +0 -1
  223. package/dist/stores/agent-store.test.d.ts +0 -2
  224. package/dist/stores/agent-store.test.d.ts.map +0 -1
  225. package/dist/stores/agent-store.test.js +0 -64
  226. package/dist/stores/agent-store.test.js.map +0 -1
  227. package/dist/stores/chat-store.test.d.ts +0 -2
  228. package/dist/stores/chat-store.test.d.ts.map +0 -1
  229. package/dist/stores/chat-store.test.js +0 -83
  230. package/dist/stores/chat-store.test.js.map +0 -1
  231. package/dist/stores/entity-store.test.d.ts +0 -2
  232. package/dist/stores/entity-store.test.d.ts.map +0 -1
  233. package/dist/stores/entity-store.test.js +0 -125
  234. package/dist/stores/entity-store.test.js.map +0 -1
  235. package/dist/stores/factory.test.d.ts +0 -2
  236. package/dist/stores/factory.test.d.ts.map +0 -1
  237. package/dist/stores/factory.test.js +0 -41
  238. package/dist/stores/factory.test.js.map +0 -1
  239. package/dist/stores/memory-store.test.d.ts +0 -2
  240. package/dist/stores/memory-store.test.d.ts.map +0 -1
  241. package/dist/stores/memory-store.test.js +0 -70
  242. package/dist/stores/memory-store.test.js.map +0 -1
  243. package/dist/stores/task-store.test.d.ts +0 -2
  244. package/dist/stores/task-store.test.d.ts.map +0 -1
  245. package/dist/stores/task-store.test.js +0 -86
  246. package/dist/stores/task-store.test.js.map +0 -1
  247. package/dist/stores/tool-store.test.d.ts +0 -2
  248. package/dist/stores/tool-store.test.d.ts.map +0 -1
  249. package/dist/stores/tool-store.test.js +0 -56
  250. package/dist/stores/tool-store.test.js.map +0 -1
  251. package/dist/stores/view-store.test.d.ts +0 -2
  252. package/dist/stores/view-store.test.d.ts.map +0 -1
  253. package/dist/stores/view-store.test.js +0 -57
  254. package/dist/stores/view-store.test.js.map +0 -1
  255. package/dist/tenant/constants.test.d.ts +0 -2
  256. package/dist/tenant/constants.test.d.ts.map +0 -1
  257. package/dist/tenant/constants.test.js +0 -25
  258. package/dist/tenant/constants.test.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"criteria-set-store.js","sourceRoot":"","sources":["../../src/stores/criteria-set-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { DocumentStore, DocumentRecord, UploadDocumentInput } from '@sprinterai/core';
2
+ import type { SupabaseClient } from '@supabase/supabase-js';
3
+ import type { Database } from '../generated/database-types.js';
4
+ /** Supabase-backed implementation of DocumentStore. */
5
+ export declare class SupabaseDocumentStore implements DocumentStore {
6
+ private client;
7
+ constructor(client: SupabaseClient<Database>);
8
+ getDocument(id: string): Promise<DocumentRecord | null>;
9
+ listDocuments(tenantId: string, options?: {
10
+ entityId?: string;
11
+ status?: string;
12
+ limit?: number;
13
+ }): Promise<DocumentRecord[]>;
14
+ createDocument(doc: Omit<DocumentRecord, 'id' | 'created_at' | 'updated_at'>): Promise<DocumentRecord>;
15
+ updateDocument(id: string, updates: Partial<DocumentRecord>): Promise<DocumentRecord | null>;
16
+ deleteDocument(id: string): Promise<void>;
17
+ uploadDocument(input: UploadDocumentInput): Promise<DocumentRecord>;
18
+ getDownloadUrl(documentId: string, expiresIn?: number): Promise<string>;
19
+ deleteDocumentWithFile(documentId: string): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=document-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-store.d.ts","sourceRoot":"","sources":["../../src/stores/document-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EAEd,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,KAAK,EAAE,QAAQ,EAAQ,MAAM,6BAA6B,CAAC;AA+BlE,uDAAuD;AACvD,qBAAa,qBAAsB,YAAW,aAAa;IAC7C,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC;IAE9C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAWvD,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/D,OAAO,CAAC,cAAc,EAAE,CAAC;IAqBtB,cAAc,CAClB,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,YAAY,GAAG,YAAY,CAAC,GAC5D,OAAO,CAAC,cAAc,CAAC;IAwBpB,cAAc,CAClB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IA4B3B,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzC,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;IA0CnE,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAavE,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAiBhE"}
@@ -0,0 +1,191 @@
1
+ /** Default expiration for signed download URLs (1 hour in seconds). */
2
+ const DEFAULT_SIGNED_URL_EXPIRY = 3600;
3
+ /** Storage bucket name for documents. */
4
+ const STORAGE_BUCKET = 'documents';
5
+ /** Map DB documents row to DocumentRecord. */
6
+ function toDocumentRecord(row) {
7
+ return {
8
+ id: row.id,
9
+ tenant_id: row.tenant_id,
10
+ entity_id: row.entity_id,
11
+ title: row.title,
12
+ file_name: row.file_name,
13
+ file_type: row.file_type,
14
+ file_size: row.file_size,
15
+ storage_path: row.storage_path,
16
+ url: row.url,
17
+ status: row.status || 'pending',
18
+ page_count: row.page_count,
19
+ metadata: row.metadata ?? null,
20
+ uploaded_by: row.uploaded_by,
21
+ created_at: row.created_at,
22
+ updated_at: row.updated_at,
23
+ };
24
+ }
25
+ /** Supabase-backed implementation of DocumentStore. */
26
+ export class SupabaseDocumentStore {
27
+ client;
28
+ constructor(client) {
29
+ this.client = client;
30
+ }
31
+ async getDocument(id) {
32
+ const { data, error } = await this.client
33
+ .from('documents')
34
+ .select('*')
35
+ .eq('id', id)
36
+ .maybeSingle();
37
+ if (error)
38
+ throw error;
39
+ return data ? toDocumentRecord(data) : null;
40
+ }
41
+ async listDocuments(tenantId, options) {
42
+ let q = this.client
43
+ .from('documents')
44
+ .select('*')
45
+ .eq('tenant_id', tenantId)
46
+ .order('created_at', { ascending: false });
47
+ if (options?.entityId) {
48
+ q = q.eq('entity_id', options.entityId);
49
+ }
50
+ if (options?.status) {
51
+ q = q.eq('status', options.status);
52
+ }
53
+ q = q.limit(options?.limit ?? 50);
54
+ const { data, error } = await q;
55
+ if (error)
56
+ throw error;
57
+ return (data ?? []).map(toDocumentRecord);
58
+ }
59
+ async createDocument(doc) {
60
+ const { data, error } = await this.client
61
+ .from('documents')
62
+ .insert({
63
+ tenant_id: doc.tenant_id,
64
+ entity_id: doc.entity_id,
65
+ title: doc.title,
66
+ file_name: doc.file_name,
67
+ file_type: doc.file_type,
68
+ file_size: doc.file_size,
69
+ storage_path: doc.storage_path,
70
+ url: doc.url,
71
+ status: doc.status,
72
+ page_count: doc.page_count,
73
+ metadata: doc.metadata,
74
+ uploaded_by: doc.uploaded_by,
75
+ })
76
+ .select('*')
77
+ .single();
78
+ if (error)
79
+ throw error;
80
+ return toDocumentRecord(data);
81
+ }
82
+ async updateDocument(id, updates) {
83
+ const { id: _id, tenant_id: _tid, created_at: _ca, ...rest } = updates;
84
+ const payload = {
85
+ updated_at: new Date().toISOString(),
86
+ };
87
+ if (rest.entity_id !== undefined)
88
+ payload.entity_id = rest.entity_id;
89
+ if (rest.title !== undefined)
90
+ payload.title = rest.title;
91
+ if (rest.file_name !== undefined)
92
+ payload.file_name = rest.file_name;
93
+ if (rest.file_type !== undefined)
94
+ payload.file_type = rest.file_type;
95
+ if (rest.file_size !== undefined)
96
+ payload.file_size = rest.file_size;
97
+ if (rest.storage_path !== undefined)
98
+ payload.storage_path = rest.storage_path;
99
+ if (rest.url !== undefined)
100
+ payload.url = rest.url;
101
+ if (rest.status !== undefined)
102
+ payload.status = rest.status;
103
+ if (rest.page_count !== undefined)
104
+ payload.page_count = rest.page_count;
105
+ if (rest.metadata !== undefined)
106
+ payload.metadata = rest.metadata;
107
+ if (rest.uploaded_by !== undefined)
108
+ payload.uploaded_by = rest.uploaded_by;
109
+ const { data, error } = await this.client
110
+ .from('documents')
111
+ .update(payload)
112
+ .eq('id', id)
113
+ .select('*');
114
+ if (error)
115
+ throw error;
116
+ if (!data || data.length === 0)
117
+ return null;
118
+ return toDocumentRecord(data[0]);
119
+ }
120
+ async deleteDocument(id) {
121
+ const { error } = await this.client.from('documents').delete().eq('id', id);
122
+ if (error)
123
+ throw error;
124
+ }
125
+ async uploadDocument(input) {
126
+ const tempId = crypto.randomUUID();
127
+ const storagePath = `${input.tenantId}/${tempId}/${input.fileName}`;
128
+ const { error: uploadError } = await this.client.storage
129
+ .from(STORAGE_BUCKET)
130
+ .upload(storagePath, input.fileData, {
131
+ contentType: input.mimeType,
132
+ upsert: false,
133
+ });
134
+ if (uploadError) {
135
+ throw new Error(`Storage upload failed: ${uploadError.message}`);
136
+ }
137
+ const { data, error: insertError } = await this.client
138
+ .from('documents')
139
+ .insert({
140
+ tenant_id: input.tenantId,
141
+ entity_id: input.entityId ?? null,
142
+ title: input.fileName,
143
+ file_name: input.fileName,
144
+ file_type: input.mimeType,
145
+ file_size: input.fileSize,
146
+ storage_path: storagePath,
147
+ url: null,
148
+ status: 'pending',
149
+ page_count: null,
150
+ metadata: (input.metadata ?? null),
151
+ uploaded_by: input.createdBy ?? null,
152
+ })
153
+ .select('*')
154
+ .single();
155
+ if (insertError) {
156
+ await this.client.storage.from(STORAGE_BUCKET).remove([storagePath]);
157
+ throw new Error(`Document record creation failed: ${insertError.message}`);
158
+ }
159
+ return toDocumentRecord(data);
160
+ }
161
+ async getDownloadUrl(documentId, expiresIn) {
162
+ const doc = await this.getDocument(documentId);
163
+ if (!doc)
164
+ throw new Error('Document not found');
165
+ if (!doc.storage_path)
166
+ throw new Error('Document has no file in storage');
167
+ const { data, error } = await this.client.storage
168
+ .from(STORAGE_BUCKET)
169
+ .createSignedUrl(doc.storage_path, expiresIn ?? DEFAULT_SIGNED_URL_EXPIRY);
170
+ if (error)
171
+ throw new Error(`Failed to create signed URL: ${error.message}`);
172
+ return data.signedUrl;
173
+ }
174
+ async deleteDocumentWithFile(documentId) {
175
+ const doc = await this.getDocument(documentId);
176
+ if (!doc)
177
+ throw new Error('Document not found');
178
+ if (doc.storage_path) {
179
+ const { error: storageError } = await this.client.storage
180
+ .from(STORAGE_BUCKET)
181
+ .remove([doc.storage_path]);
182
+ if (storageError) {
183
+ throw new Error(`Failed to delete file from storage: ${storageError.message}`);
184
+ }
185
+ }
186
+ const { error: dbError } = await this.client.from('documents').delete().eq('id', documentId);
187
+ if (dbError)
188
+ throw new Error(`Failed to delete document record: ${dbError.message}`);
189
+ }
190
+ }
191
+ //# sourceMappingURL=document-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-store.js","sourceRoot":"","sources":["../../src/stores/document-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { CreateEmbedInput, EmbedStore, PublishedEmbed } from '@sprinterai/core';
2
+ import type { SupabaseClient } from '@supabase/supabase-js';
3
+ export declare class SupabaseEmbedStore implements EmbedStore {
4
+ private client;
5
+ constructor(client: SupabaseClient);
6
+ getByToken(token: string): Promise<PublishedEmbed | null>;
7
+ publish(input: CreateEmbedInput): Promise<PublishedEmbed>;
8
+ unpublish(embedId: string): Promise<void>;
9
+ listByTenant(tenantId: string): Promise<PublishedEmbed[]>;
10
+ }
11
+ //# sourceMappingURL=embed-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed-store.d.ts","sourceRoot":"","sources":["../../src/stores/embed-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAkB5D,qBAAa,kBAAmB,YAAW,UAAU;IACvC,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAEpC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAYzD,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;IAkBzD,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAUhE"}
@@ -0,0 +1,71 @@
1
+ function toPublishedEmbed(row) {
2
+ return {
3
+ id: row['id'],
4
+ tenant_id: row['tenant_id'],
5
+ token: row['token'],
6
+ type: row['type'],
7
+ resource_slug: row['resource_slug'],
8
+ title: row['title'] ?? null,
9
+ config: row['config'] ?? {}, // JSONB boundary
10
+ status: row['status'],
11
+ created_by: row['created_by'] ?? null,
12
+ created_at: row['created_at'],
13
+ unpublished_at: row['unpublished_at'] ?? null,
14
+ };
15
+ }
16
+ export class SupabaseEmbedStore {
17
+ client;
18
+ constructor(client) {
19
+ this.client = client;
20
+ }
21
+ async getByToken(token) {
22
+ const { data, error } = await this.client
23
+ .from('published_embeds')
24
+ .select('*')
25
+ .eq('token', token)
26
+ .eq('status', 'published')
27
+ .maybeSingle();
28
+ if (error)
29
+ throw new Error(`Failed to get embed: ${error.message}`);
30
+ return data ? toPublishedEmbed(data) : null;
31
+ }
32
+ async publish(input) {
33
+ const { data, error } = await this.client
34
+ .from('published_embeds')
35
+ .insert({
36
+ tenant_id: input.tenant_id,
37
+ type: input.type,
38
+ resource_slug: input.resource_slug,
39
+ title: input.title ?? null,
40
+ config: input.config ?? {},
41
+ created_by: input.created_by ?? null,
42
+ })
43
+ .select('*')
44
+ .single();
45
+ if (error)
46
+ throw new Error(`Failed to publish embed: ${error.message}`);
47
+ return toPublishedEmbed(data);
48
+ }
49
+ async unpublish(embedId) {
50
+ const { data, error } = await this.client
51
+ .from('published_embeds')
52
+ .update({ status: 'unpublished', unpublished_at: new Date().toISOString() })
53
+ .eq('id', embedId)
54
+ .select('*');
55
+ if (error)
56
+ throw new Error(`Failed to unpublish embed: ${error.message}`);
57
+ if (!data || data.length === 0)
58
+ throw new Error('Embed not found or no permission');
59
+ }
60
+ async listByTenant(tenantId) {
61
+ const { data, error } = await this.client
62
+ .from('published_embeds')
63
+ .select('*')
64
+ .eq('tenant_id', tenantId)
65
+ .order('created_at', { ascending: false });
66
+ if (error)
67
+ throw new Error(`Failed to list embeds: ${error.message}`);
68
+ return (data ?? []).map((row) => toPublishedEmbed(row));
69
+ }
70
+ }
71
+ //# sourceMappingURL=embed-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed-store.js","sourceRoot":"","sources":["../../src/stores/embed-store.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,15 @@
1
- import type { EntityStore, EntityRecord, EntityTypeRecord, CreateEntityInput, UpdateEntityInput } from '@sprinterai/core';
1
+ import type { EntityStore, EntityRecord, EntityTypeRecord, RelatedEntityWithRelation, CreateEntityInput, UpdateEntityInput, CreateEntityTypeInput } from '@sprinterai/core';
2
2
  import type { SupabaseClient } from '@supabase/supabase-js';
3
+ import type { Database } from '../generated/database-types.js';
3
4
  /** Supabase-backed implementation of EntityStore. */
4
5
  export declare class SupabaseEntityStore implements EntityStore {
5
6
  private client;
6
- constructor(client: SupabaseClient);
7
+ constructor(client: SupabaseClient<Database>);
7
8
  getEntityType(slugOrId: string): Promise<EntityTypeRecord | null>;
8
9
  listEntityTypes(): Promise<EntityTypeRecord[]>;
10
+ createEntityType(input: CreateEntityTypeInput): Promise<EntityTypeRecord>;
11
+ updateEntityType(slugOrId: string, input: Partial<Omit<EntityTypeRecord, 'id' | 'tenant_id' | 'created_at' | 'updated_at'>>): Promise<EntityTypeRecord | null>;
12
+ deleteEntityType(slugOrId: string): Promise<void>;
9
13
  getEntity(id: string): Promise<EntityRecord | null>;
10
14
  searchEntities(query: string, options?: {
11
15
  typeSlug?: string;
@@ -16,6 +20,7 @@ export declare class SupabaseEntityStore implements EntityStore {
16
20
  updateEntity(id: string, input: UpdateEntityInput): Promise<EntityRecord>;
17
21
  deleteEntity(id: string): Promise<void>;
18
22
  createRelation(fromId: string, toId: string, type: string): Promise<void>;
23
+ getRelatedEntities(entityId: string): Promise<RelatedEntityWithRelation[]>;
19
24
  getEntityCounts(tenantId: string): Promise<Record<string, number>>;
20
25
  }
21
26
  //# sourceMappingURL=entity-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"entity-store.d.ts","sourceRoot":"","sources":["../../src/stores/entity-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAS5D,qDAAqD;AACrD,qBAAa,mBAAoB,YAAW,WAAW;IACzC,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAEpC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAmBjE,eAAe,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO9C,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAWnD,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GACA,OAAO,CAAC,YAAY,EAAE,CAAC;IAsBpB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IAqC7D,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IAiCzE,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBvC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzE,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAezE"}
1
+ {"version":3,"file":"entity-store.d.ts","sourceRoot":"","sources":["../../src/stores/entity-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,QAAQ,EAAQ,MAAM,6BAA6B,CAAC;AA8DlE,qDAAqD;AACrD,qBAAa,mBAAoB,YAAW,WAAW;IACzC,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC;IAE9C,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAmBjE,eAAe,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO9C,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAqBzE,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,GAAG,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC,CAAC,GACvF,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAmB7B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjD,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAYnD,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GACA,OAAO,CAAC,YAAY,EAAE,CAAC;IAsBpB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IA6B7D,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IA8BzE,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,EAAE,CAAC;IAqD1E,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAiBzE"}
@@ -4,6 +4,54 @@ function slugify(text) {
4
4
  .replace(/[^a-z0-9]+/g, '-')
5
5
  .replace(/^-|-$/g, '');
6
6
  }
7
+ /**
8
+ * Map a DB entity_types row to the core EntityTypeRecord.
9
+ * DB columns behavior_json/ui_json/config are Json; cast to their specific shapes.
10
+ */
11
+ function toEntityTypeRecord(row) {
12
+ return {
13
+ id: row.id,
14
+ tenant_id: row.tenant_id,
15
+ slug: row.slug,
16
+ name: row.name,
17
+ description: row.description,
18
+ icon: row.icon,
19
+ color: row.color,
20
+ json_schema: row.json_schema, // Json -> Record<string, unknown>
21
+ visibility: row.visibility ?? 'tenant',
22
+ created_at: row.created_at,
23
+ updated_at: row.updated_at,
24
+ config: row.config, // Json -> EntityTypeConfig
25
+ schemaJson: row.json_schema, // Json -> Record<string, unknown>
26
+ behaviorJson: row.behavior_json, // Json -> EntityTypeBehaviorJson
27
+ uiJson: row.ui_json, // Json -> EntityTypeUiJson
28
+ };
29
+ }
30
+ /**
31
+ * Map a DB entities row to the core EntityRecord.
32
+ * DB columns content/metadata are Json; cast to Record<string, unknown>.
33
+ */
34
+ function toEntityRecord(row, entityType) {
35
+ return {
36
+ id: row.id,
37
+ tenant_id: row.tenant_id,
38
+ slug: row.slug,
39
+ entity_type_id: row.entity_type_id,
40
+ title: row.title,
41
+ description: row.description,
42
+ content: row.content, // Json -> Record<string, unknown>
43
+ metadata: row.metadata, // Json -> Record<string, unknown>
44
+ owner_id: row.owner_id,
45
+ parent_id: row.parent_id,
46
+ image_url: row.image_url,
47
+ tags: row.tags ?? [],
48
+ visibility: (row.visibility ?? 'tenant'),
49
+ share_token: row.share_token,
50
+ created_at: row.created_at,
51
+ updated_at: row.updated_at,
52
+ entity_type: entityType ? toEntityTypeRecord(entityType) : undefined,
53
+ };
54
+ }
7
55
  /** Supabase-backed implementation of EntityStore. */
8
56
  export class SupabaseEntityStore {
9
57
  client;
@@ -18,19 +66,67 @@ export class SupabaseEntityStore {
18
66
  .eq('slug', slugOrId)
19
67
  .maybeSingle();
20
68
  if (bySlug)
21
- return bySlug;
69
+ return toEntityTypeRecord(bySlug);
22
70
  const { data: byId } = await this.client
23
71
  .from('entity_types')
24
72
  .select('*')
25
73
  .eq('id', slugOrId)
26
74
  .maybeSingle();
27
- return byId ?? null;
75
+ return byId ? toEntityTypeRecord(byId) : null;
28
76
  }
29
77
  async listEntityTypes() {
30
78
  const { data, error } = await this.client.from('entity_types').select('*').order('name');
31
79
  if (error)
32
80
  throw error;
33
- return (data ?? []);
81
+ return (data ?? []).map(toEntityTypeRecord);
82
+ }
83
+ async createEntityType(input) {
84
+ const { data, error } = await this.client
85
+ .from('entity_types')
86
+ .insert({
87
+ id: crypto.randomUUID(),
88
+ slug: input.slug,
89
+ name: input.name,
90
+ description: input.description ?? null,
91
+ icon: input.icon ?? null,
92
+ color: input.color ?? null,
93
+ json_schema: (input.json_schema ?? {}),
94
+ visibility: (input.visibility ??
95
+ 'tenant'),
96
+ })
97
+ .select('*')
98
+ .single();
99
+ if (error)
100
+ throw error;
101
+ return toEntityTypeRecord(data);
102
+ }
103
+ async updateEntityType(slugOrId, input) {
104
+ // Resolve the entity type to get its id
105
+ const existing = await this.getEntityType(slugOrId);
106
+ if (!existing)
107
+ return null;
108
+ const { data, error } = await this.client
109
+ .from('entity_types')
110
+ .update({
111
+ ...input,
112
+ updated_at: new Date().toISOString(),
113
+ })
114
+ .eq('id', existing.id)
115
+ .select('*');
116
+ if (error)
117
+ throw error;
118
+ if (!data || data.length === 0)
119
+ return null;
120
+ return toEntityTypeRecord(data[0]);
121
+ }
122
+ async deleteEntityType(slugOrId) {
123
+ // Resolve the entity type to get its id
124
+ const existing = await this.getEntityType(slugOrId);
125
+ if (!existing)
126
+ return;
127
+ const { error } = await this.client.from('entity_types').delete().eq('id', existing.id);
128
+ if (error)
129
+ throw error;
34
130
  }
35
131
  async getEntity(id) {
36
132
  const { data, error } = await this.client
@@ -40,7 +136,9 @@ export class SupabaseEntityStore {
40
136
  .maybeSingle();
41
137
  if (error)
42
138
  throw error;
43
- return data ?? null;
139
+ if (!data)
140
+ return null;
141
+ return toEntityRecord(data, data.entity_type);
44
142
  }
45
143
  async searchEntities(query, options) {
46
144
  let q = this.client.from('entities').select('*');
@@ -57,7 +155,7 @@ export class SupabaseEntityStore {
57
155
  const { data, error } = await q;
58
156
  if (error)
59
157
  throw error;
60
- return (data ?? []);
158
+ return (data ?? []).map((row) => toEntityRecord(row));
61
159
  }
62
160
  async createEntity(input) {
63
161
  // Look up entity type
@@ -71,7 +169,7 @@ export class SupabaseEntityStore {
71
169
  .insert({
72
170
  entity_type_id: entityType.id,
73
171
  entity_type_slug: entityType.slug,
74
- tenant_id: entityType.tenant_id,
172
+ tenant_id: entityType.tenant_id ?? '00000000-0000-0000-0000-000000000000',
75
173
  title: input.title,
76
174
  slug,
77
175
  content: input.content,
@@ -82,32 +180,28 @@ export class SupabaseEntityStore {
82
180
  .single();
83
181
  if (error)
84
182
  throw error;
85
- // Log activity
86
- await this.client.from('activities').insert({
87
- tenant_id: data.tenant_id,
88
- entity_id: data.id,
89
- action: 'created',
90
- changes: { title: input.title },
91
- });
92
- return data;
183
+ return toEntityRecord(data);
93
184
  }
94
185
  async updateEntity(id, input) {
95
- const updates = {};
186
+ const updates = {
187
+ updated_at: new Date().toISOString(),
188
+ };
96
189
  if (input.title !== undefined)
97
190
  updates.title = input.title;
98
191
  if (input.description !== undefined)
99
192
  updates.description = input.description;
100
193
  if (input.content !== undefined)
101
- updates.content = input.content;
194
+ updates.content =
195
+ input.content;
102
196
  if (input.metadata !== undefined)
103
- updates.metadata = input.metadata;
197
+ updates.metadata =
198
+ input.metadata;
104
199
  if (input.tags !== undefined)
105
200
  updates.tags = input.tags;
106
201
  if (input.image_url !== undefined)
107
202
  updates.image_url = input.image_url;
108
203
  if (input.visibility !== undefined)
109
204
  updates.visibility = input.visibility;
110
- updates.updated_at = new Date().toISOString();
111
205
  const { data, error } = await this.client
112
206
  .from('entities')
113
207
  .update(updates)
@@ -118,39 +212,69 @@ export class SupabaseEntityStore {
118
212
  if (!data || data.length === 0) {
119
213
  throw new Error('Entity not found or no permission to update');
120
214
  }
121
- // Log activity
122
- await this.client.from('activities').insert({
123
- tenant_id: data[0].tenant_id,
124
- entity_id: id,
125
- action: 'updated',
126
- changes: updates,
127
- });
128
- return data[0];
215
+ return toEntityRecord(data[0]);
129
216
  }
130
217
  async deleteEntity(id) {
131
- // Fetch before delete for activity log
132
- const entity = await this.getEntity(id);
133
218
  const { error } = await this.client.from('entities').delete().eq('id', id);
134
219
  if (error)
135
220
  throw error;
136
- if (entity) {
137
- await this.client.from('activities').insert({
138
- tenant_id: entity.tenant_id,
139
- entity_id: id,
140
- action: 'deleted',
141
- changes: { title: entity.title },
142
- });
143
- }
144
221
  }
145
222
  async createRelation(fromId, toId, type) {
146
223
  const { error } = await this.client.from('entity_relations').insert({
147
224
  from_entity_id: fromId,
148
225
  to_entity_id: toId,
149
226
  relationship_type: type,
227
+ tenant_id: '00000000-0000-0000-0000-000000000000',
150
228
  });
151
229
  if (error)
152
230
  throw error;
153
231
  }
232
+ async getRelatedEntities(entityId) {
233
+ // Fetch relations where this entity is the source
234
+ const { data: outgoing, error: outErr } = await this.client
235
+ .from('entity_relations')
236
+ .select('id, relationship_type, to_entity_id')
237
+ .eq('from_entity_id', entityId);
238
+ if (outErr)
239
+ throw outErr;
240
+ // Fetch relations where this entity is the target
241
+ const { data: incoming, error: inErr } = await this.client
242
+ .from('entity_relations')
243
+ .select('id, relationship_type, from_entity_id')
244
+ .eq('to_entity_id', entityId);
245
+ if (inErr)
246
+ throw inErr;
247
+ // Collect all related entity IDs
248
+ const relatedMap = new Map();
249
+ for (const rel of outgoing ?? []) {
250
+ relatedMap.set(rel.to_entity_id, {
251
+ id: rel.id,
252
+ relationship_type: rel.relationship_type,
253
+ });
254
+ }
255
+ for (const rel of incoming ?? []) {
256
+ if (!relatedMap.has(rel.from_entity_id)) {
257
+ relatedMap.set(rel.from_entity_id, {
258
+ id: rel.id,
259
+ relationship_type: rel.relationship_type,
260
+ });
261
+ }
262
+ }
263
+ if (relatedMap.size === 0)
264
+ return [];
265
+ // Fetch the entities
266
+ const entityIds = [...relatedMap.keys()];
267
+ const { data: entities, error: entErr } = await this.client
268
+ .from('entities')
269
+ .select('*, entity_type:entity_types(*)')
270
+ .in('id', entityIds);
271
+ if (entErr)
272
+ throw entErr;
273
+ return (entities ?? []).map((e) => ({
274
+ relation: relatedMap.get(e.id),
275
+ entity: toEntityRecord(e, e.entity_type),
276
+ }));
277
+ }
154
278
  async getEntityCounts(tenantId) {
155
279
  const { data, error } = await this.client
156
280
  .from('entities')
@@ -161,7 +285,9 @@ export class SupabaseEntityStore {
161
285
  const counts = {};
162
286
  for (const row of data ?? []) {
163
287
  const slug = row.entity_type_slug;
164
- counts[slug] = (counts[slug] ?? 0) + 1;
288
+ if (slug) {
289
+ counts[slug] = (counts[slug] ?? 0) + 1;
290
+ }
165
291
  }
166
292
  return counts;
167
293
  }