beddel 0.2.2 → 0.2.3

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 (330) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +117 -14
  3. package/dist/agents/chat/chat.handler.d.ts +12 -0
  4. package/dist/agents/chat/chat.handler.d.ts.map +1 -0
  5. package/dist/agents/chat/chat.handler.js +143 -0
  6. package/dist/agents/chat/chat.handler.js.map +1 -0
  7. package/dist/agents/chat/chat.schema.d.ts +38 -0
  8. package/dist/agents/chat/chat.schema.d.ts.map +1 -0
  9. package/dist/agents/chat/chat.schema.js +31 -0
  10. package/dist/agents/chat/chat.schema.js.map +1 -0
  11. package/dist/agents/chat/chat.types.d.ts +42 -0
  12. package/dist/agents/chat/chat.types.d.ts.map +1 -0
  13. package/dist/agents/chat/chat.types.js +6 -0
  14. package/dist/agents/chat/chat.types.js.map +1 -0
  15. package/dist/agents/chat/chat.yaml +150 -0
  16. package/dist/agents/chat/index.d.ts +16 -0
  17. package/dist/agents/chat/index.d.ts.map +1 -0
  18. package/dist/agents/chat/index.js +21 -0
  19. package/dist/agents/chat/index.js.map +1 -0
  20. package/dist/agents/chromadb/chromadb.handler.d.ts +12 -0
  21. package/dist/agents/chromadb/chromadb.handler.d.ts.map +1 -0
  22. package/dist/agents/chromadb/chromadb.handler.js +139 -0
  23. package/dist/agents/chromadb/chromadb.handler.js.map +1 -0
  24. package/dist/agents/chromadb/chromadb.schema.d.ts +36 -0
  25. package/dist/agents/chromadb/chromadb.schema.d.ts.map +1 -0
  26. package/dist/agents/chromadb/chromadb.schema.js +33 -0
  27. package/dist/agents/chromadb/chromadb.schema.js.map +1 -0
  28. package/dist/agents/chromadb/chromadb.types.d.ts +49 -0
  29. package/dist/agents/chromadb/chromadb.types.d.ts.map +1 -0
  30. package/dist/agents/chromadb/chromadb.types.js +6 -0
  31. package/dist/agents/chromadb/chromadb.types.js.map +1 -0
  32. package/dist/agents/chromadb/chromadb.yaml +128 -0
  33. package/dist/agents/chromadb/index.d.ts +15 -0
  34. package/dist/agents/chromadb/index.d.ts.map +1 -0
  35. package/dist/agents/chromadb/index.js +20 -0
  36. package/dist/agents/chromadb/index.js.map +1 -0
  37. package/dist/agents/gemini-vectorize/gemini-vectorize.handler.d.ts +8 -0
  38. package/dist/agents/gemini-vectorize/gemini-vectorize.handler.d.ts.map +1 -0
  39. package/dist/agents/gemini-vectorize/gemini-vectorize.handler.js +58 -0
  40. package/dist/agents/gemini-vectorize/gemini-vectorize.handler.js.map +1 -0
  41. package/dist/agents/gemini-vectorize/gemini-vectorize.schema.d.ts +22 -0
  42. package/dist/agents/gemini-vectorize/gemini-vectorize.schema.d.ts.map +1 -0
  43. package/dist/agents/gemini-vectorize/gemini-vectorize.schema.js +20 -0
  44. package/dist/agents/gemini-vectorize/gemini-vectorize.schema.js.map +1 -0
  45. package/dist/agents/gemini-vectorize/gemini-vectorize.types.d.ts +32 -0
  46. package/dist/agents/gemini-vectorize/gemini-vectorize.types.d.ts.map +1 -0
  47. package/dist/agents/gemini-vectorize/gemini-vectorize.types.js +6 -0
  48. package/dist/agents/gemini-vectorize/gemini-vectorize.types.js.map +1 -0
  49. package/dist/agents/gemini-vectorize/gemini-vectorize.yaml +84 -0
  50. package/dist/agents/gemini-vectorize/index.d.ts +15 -0
  51. package/dist/agents/gemini-vectorize/index.d.ts.map +1 -0
  52. package/dist/agents/gemini-vectorize/index.js +20 -0
  53. package/dist/agents/gemini-vectorize/index.js.map +1 -0
  54. package/dist/agents/gitmcp/gitmcp.handler.d.ts +12 -0
  55. package/dist/agents/gitmcp/gitmcp.handler.d.ts.map +1 -0
  56. package/dist/agents/gitmcp/gitmcp.handler.js +95 -0
  57. package/dist/agents/gitmcp/gitmcp.handler.js.map +1 -0
  58. package/dist/agents/gitmcp/gitmcp.schema.d.ts +17 -0
  59. package/dist/agents/gitmcp/gitmcp.schema.d.ts.map +1 -0
  60. package/dist/agents/gitmcp/gitmcp.schema.js +18 -0
  61. package/dist/agents/gitmcp/gitmcp.schema.js.map +1 -0
  62. package/dist/agents/gitmcp/gitmcp.types.d.ts +31 -0
  63. package/dist/agents/gitmcp/gitmcp.types.d.ts.map +1 -0
  64. package/dist/agents/gitmcp/gitmcp.types.js +6 -0
  65. package/dist/agents/gitmcp/gitmcp.types.js.map +1 -0
  66. package/dist/agents/gitmcp/gitmcp.yaml +71 -0
  67. package/dist/agents/gitmcp/index.d.ts +16 -0
  68. package/dist/agents/gitmcp/index.d.ts.map +1 -0
  69. package/dist/agents/gitmcp/index.js +21 -0
  70. package/dist/agents/gitmcp/index.js.map +1 -0
  71. package/dist/agents/image/image.handler.d.ts +8 -0
  72. package/dist/agents/image/image.handler.d.ts.map +1 -0
  73. package/dist/agents/image/image.handler.js +66 -0
  74. package/dist/agents/image/image.handler.js.map +1 -0
  75. package/dist/agents/image/image.schema.d.ts +29 -0
  76. package/dist/agents/image/image.schema.d.ts.map +1 -0
  77. package/dist/agents/image/image.schema.js +26 -0
  78. package/dist/agents/image/image.schema.js.map +1 -0
  79. package/dist/agents/image/image.types.d.ts +42 -0
  80. package/dist/agents/image/image.types.d.ts.map +1 -0
  81. package/dist/agents/image/image.types.js +6 -0
  82. package/dist/agents/image/image.types.js.map +1 -0
  83. package/{src/agents/image-agent.yaml → dist/agents/image/image.yaml} +21 -21
  84. package/dist/agents/image/index.d.ts +14 -0
  85. package/dist/agents/image/index.d.ts.map +1 -0
  86. package/dist/agents/image/index.js +19 -0
  87. package/dist/agents/image/index.js.map +1 -0
  88. package/dist/agents/index.d.ts +95 -0
  89. package/dist/agents/index.d.ts.map +1 -0
  90. package/dist/agents/index.js +76 -0
  91. package/dist/agents/index.js.map +1 -0
  92. package/dist/agents/joker/index.d.ts +14 -0
  93. package/dist/agents/joker/index.d.ts.map +1 -0
  94. package/dist/agents/joker/index.js +19 -0
  95. package/dist/agents/joker/index.js.map +1 -0
  96. package/dist/agents/joker/joker.handler.d.ts +8 -0
  97. package/dist/agents/joker/joker.handler.d.ts.map +1 -0
  98. package/dist/agents/joker/joker.handler.js +48 -0
  99. package/dist/agents/joker/joker.handler.js.map +1 -0
  100. package/dist/agents/joker/joker.schema.d.ts +12 -0
  101. package/dist/agents/joker/joker.schema.d.ts.map +1 -0
  102. package/dist/agents/joker/joker.schema.js +13 -0
  103. package/dist/agents/joker/joker.schema.js.map +1 -0
  104. package/dist/agents/joker/joker.types.d.ts +35 -0
  105. package/dist/agents/joker/joker.types.d.ts.map +1 -0
  106. package/dist/agents/joker/joker.types.js +6 -0
  107. package/dist/agents/joker/joker.types.js.map +1 -0
  108. package/{src/agents/joker-agent.yaml → dist/agents/joker/joker.yaml} +4 -4
  109. package/dist/agents/mcp-tool/index.d.ts +14 -0
  110. package/dist/agents/mcp-tool/index.d.ts.map +1 -0
  111. package/dist/agents/mcp-tool/index.js +19 -0
  112. package/dist/agents/mcp-tool/index.js.map +1 -0
  113. package/dist/agents/mcp-tool/mcp-tool.handler.d.ts +12 -0
  114. package/dist/agents/mcp-tool/mcp-tool.handler.d.ts.map +1 -0
  115. package/dist/agents/mcp-tool/mcp-tool.handler.js +116 -0
  116. package/dist/agents/mcp-tool/mcp-tool.handler.js.map +1 -0
  117. package/dist/agents/mcp-tool/mcp-tool.schema.d.ts +19 -0
  118. package/dist/agents/mcp-tool/mcp-tool.schema.d.ts.map +1 -0
  119. package/dist/agents/mcp-tool/mcp-tool.schema.js +20 -0
  120. package/dist/agents/mcp-tool/mcp-tool.schema.js.map +1 -0
  121. package/dist/agents/mcp-tool/mcp-tool.types.d.ts +31 -0
  122. package/dist/agents/mcp-tool/mcp-tool.types.d.ts.map +1 -0
  123. package/dist/agents/mcp-tool/mcp-tool.types.js +6 -0
  124. package/dist/agents/mcp-tool/mcp-tool.types.js.map +1 -0
  125. package/dist/agents/mcp-tool/mcp-tool.yaml +71 -0
  126. package/dist/agents/rag/index.d.ts +15 -0
  127. package/dist/agents/rag/index.d.ts.map +1 -0
  128. package/dist/agents/rag/index.js +20 -0
  129. package/dist/agents/rag/index.js.map +1 -0
  130. package/dist/agents/rag/rag.handler.d.ts +8 -0
  131. package/dist/agents/rag/rag.handler.d.ts.map +1 -0
  132. package/dist/agents/rag/rag.handler.js +101 -0
  133. package/dist/agents/rag/rag.handler.js.map +1 -0
  134. package/dist/agents/rag/rag.schema.d.ts +27 -0
  135. package/dist/agents/rag/rag.schema.d.ts.map +1 -0
  136. package/dist/agents/rag/rag.schema.js +24 -0
  137. package/dist/agents/rag/rag.schema.js.map +1 -0
  138. package/dist/agents/rag/rag.types.d.ts +47 -0
  139. package/dist/agents/rag/rag.types.d.ts.map +1 -0
  140. package/dist/agents/rag/rag.types.js +6 -0
  141. package/dist/agents/rag/rag.types.js.map +1 -0
  142. package/dist/agents/rag/rag.yaml +89 -0
  143. package/dist/agents/{agentRegistry.d.ts → registry/agentRegistry.d.ts} +25 -1
  144. package/dist/agents/registry/agentRegistry.d.ts.map +1 -0
  145. package/dist/agents/{agentRegistry.js → registry/agentRegistry.js} +154 -4
  146. package/dist/agents/registry/agentRegistry.js.map +1 -0
  147. package/dist/agents/registry/index.d.ts +6 -0
  148. package/dist/agents/registry/index.d.ts.map +1 -0
  149. package/dist/agents/registry/index.js +10 -0
  150. package/dist/agents/registry/index.js.map +1 -0
  151. package/dist/agents/translator/index.d.ts +14 -0
  152. package/dist/agents/translator/index.d.ts.map +1 -0
  153. package/dist/agents/translator/index.js +19 -0
  154. package/dist/agents/translator/index.js.map +1 -0
  155. package/dist/agents/translator/translator.handler.d.ts +8 -0
  156. package/dist/agents/translator/translator.handler.d.ts.map +1 -0
  157. package/dist/agents/translator/translator.handler.js +83 -0
  158. package/dist/agents/translator/translator.handler.js.map +1 -0
  159. package/dist/agents/translator/translator.schema.d.ts +27 -0
  160. package/dist/agents/translator/translator.schema.d.ts.map +1 -0
  161. package/dist/agents/translator/translator.schema.js +28 -0
  162. package/dist/agents/translator/translator.schema.js.map +1 -0
  163. package/dist/agents/translator/translator.types.d.ts +40 -0
  164. package/dist/agents/translator/translator.types.d.ts.map +1 -0
  165. package/dist/agents/translator/translator.types.js +6 -0
  166. package/dist/agents/translator/translator.types.js.map +1 -0
  167. package/{src/agents/translator-agent.yaml → dist/agents/translator/translator.yaml} +27 -27
  168. package/dist/client/index.d.ts +89 -0
  169. package/dist/client/index.d.ts.map +1 -0
  170. package/dist/client/index.js +93 -0
  171. package/dist/client/index.js.map +1 -0
  172. package/dist/client/types.d.ts +17 -0
  173. package/dist/client/types.d.ts.map +1 -0
  174. package/dist/client/types.js +7 -0
  175. package/dist/client/types.js.map +1 -0
  176. package/dist/firebase/tenantManager.d.ts +34 -2
  177. package/dist/firebase/tenantManager.d.ts.map +1 -1
  178. package/dist/firebase/tenantManager.js +67 -1
  179. package/dist/firebase/tenantManager.js.map +1 -1
  180. package/dist/index.d.ts +8 -4
  181. package/dist/index.d.ts.map +1 -1
  182. package/dist/index.js +22 -7
  183. package/dist/index.js.map +1 -1
  184. package/dist/runtime/declarativeAgentRuntime.d.ts +14 -49
  185. package/dist/runtime/declarativeAgentRuntime.d.ts.map +1 -1
  186. package/dist/runtime/declarativeAgentRuntime.js +248 -355
  187. package/dist/runtime/declarativeAgentRuntime.js.map +1 -1
  188. package/dist/runtime/index.d.ts +12 -0
  189. package/dist/runtime/index.d.ts.map +1 -0
  190. package/dist/runtime/index.js +33 -0
  191. package/dist/runtime/index.js.map +1 -0
  192. package/dist/runtime/workflowExecutor.d.ts +30 -0
  193. package/dist/runtime/workflowExecutor.d.ts.map +1 -0
  194. package/dist/runtime/workflowExecutor.js +70 -0
  195. package/dist/runtime/workflowExecutor.js.map +1 -0
  196. package/dist/server/api/graphql.js +3 -3
  197. package/dist/server/api/graphql.js.map +1 -1
  198. package/dist/server/index.d.ts +2 -2
  199. package/dist/server/index.d.ts.map +1 -1
  200. package/dist/server/index.js +2 -2
  201. package/dist/server/index.js.map +1 -1
  202. package/dist/shared/index.d.ts +7 -0
  203. package/dist/shared/index.d.ts.map +1 -0
  204. package/dist/shared/index.js +23 -0
  205. package/dist/shared/index.js.map +1 -0
  206. package/dist/shared/types/agent.types.d.ts +50 -0
  207. package/dist/shared/types/agent.types.d.ts.map +1 -0
  208. package/dist/shared/types/agent.types.js +7 -0
  209. package/dist/shared/types/agent.types.js.map +1 -0
  210. package/dist/shared/types/execution.types.d.ts +42 -0
  211. package/dist/shared/types/execution.types.d.ts.map +1 -0
  212. package/dist/shared/types/execution.types.js +7 -0
  213. package/dist/shared/types/execution.types.js.map +1 -0
  214. package/dist/shared/types/index.d.ts +7 -0
  215. package/dist/shared/types/index.d.ts.map +1 -0
  216. package/dist/shared/types/index.js +23 -0
  217. package/dist/shared/types/index.js.map +1 -0
  218. package/dist/shared/types/schema.types.d.ts +52 -0
  219. package/dist/shared/types/schema.types.d.ts.map +1 -0
  220. package/dist/shared/types/schema.types.js +7 -0
  221. package/dist/shared/types/schema.types.js.map +1 -0
  222. package/dist/shared/utils/index.d.ts +5 -0
  223. package/dist/shared/utils/index.d.ts.map +1 -0
  224. package/dist/shared/utils/index.js +21 -0
  225. package/dist/shared/utils/index.js.map +1 -0
  226. package/dist/shared/utils/validation.d.ts +42 -0
  227. package/dist/shared/utils/validation.d.ts.map +1 -0
  228. package/dist/shared/utils/validation.js +93 -0
  229. package/dist/shared/utils/validation.js.map +1 -0
  230. package/dist/tenant/TenantManager.d.ts +152 -0
  231. package/dist/tenant/TenantManager.d.ts.map +1 -0
  232. package/dist/tenant/TenantManager.js +392 -0
  233. package/dist/tenant/TenantManager.js.map +1 -0
  234. package/dist/tenant/index.d.ts +47 -0
  235. package/dist/tenant/index.d.ts.map +1 -0
  236. package/dist/tenant/index.js +74 -0
  237. package/dist/tenant/index.js.map +1 -0
  238. package/dist/tenant/interfaces.d.ts +170 -0
  239. package/dist/tenant/interfaces.d.ts.map +1 -0
  240. package/dist/tenant/interfaces.js +67 -0
  241. package/dist/tenant/interfaces.js.map +1 -0
  242. package/dist/tenant/providerFactory.d.ts +43 -0
  243. package/dist/tenant/providerFactory.d.ts.map +1 -0
  244. package/dist/tenant/providerFactory.js +70 -0
  245. package/dist/tenant/providerFactory.js.map +1 -0
  246. package/dist/tenant/providerRegistry.d.ts +47 -0
  247. package/dist/tenant/providerRegistry.d.ts.map +1 -0
  248. package/dist/tenant/providerRegistry.js +79 -0
  249. package/dist/tenant/providerRegistry.js.map +1 -0
  250. package/dist/tenant/providers/FirebaseTenantProvider.d.ts +41 -0
  251. package/dist/tenant/providers/FirebaseTenantProvider.d.ts.map +1 -0
  252. package/dist/tenant/providers/FirebaseTenantProvider.js +290 -0
  253. package/dist/tenant/providers/FirebaseTenantProvider.js.map +1 -0
  254. package/dist/tenant/providers/InMemoryTenantProvider.d.ts +18 -0
  255. package/dist/tenant/providers/InMemoryTenantProvider.d.ts.map +1 -0
  256. package/dist/tenant/providers/InMemoryTenantProvider.js +137 -0
  257. package/dist/tenant/providers/InMemoryTenantProvider.js.map +1 -0
  258. package/package.json +46 -12
  259. package/src/agents/chat/chat.handler.ts +209 -0
  260. package/src/agents/chat/chat.schema.ts +33 -0
  261. package/src/agents/chat/chat.types.ts +46 -0
  262. package/src/agents/chat/chat.yaml +150 -0
  263. package/src/agents/chat/index.ts +21 -0
  264. package/src/agents/chromadb/chromadb.handler.ts +130 -0
  265. package/src/agents/chromadb/chromadb.schema.ts +35 -0
  266. package/src/agents/chromadb/chromadb.types.ts +52 -0
  267. package/src/agents/chromadb/chromadb.yaml +128 -0
  268. package/src/agents/chromadb/index.ts +20 -0
  269. package/src/agents/gemini-vectorize/gemini-vectorize.handler.ts +72 -0
  270. package/src/agents/gemini-vectorize/gemini-vectorize.schema.ts +22 -0
  271. package/src/agents/gemini-vectorize/gemini-vectorize.types.ts +34 -0
  272. package/src/agents/gemini-vectorize/gemini-vectorize.yaml +84 -0
  273. package/src/agents/gemini-vectorize/index.ts +20 -0
  274. package/src/agents/gitmcp/gitmcp.handler.ts +122 -0
  275. package/src/agents/gitmcp/gitmcp.schema.ts +20 -0
  276. package/src/agents/gitmcp/gitmcp.types.ts +33 -0
  277. package/src/agents/gitmcp/gitmcp.yaml +71 -0
  278. package/src/agents/gitmcp/index.ts +21 -0
  279. package/src/agents/image/image.handler.ts +82 -0
  280. package/src/agents/image/image.schema.ts +28 -0
  281. package/src/agents/image/image.types.ts +45 -0
  282. package/src/agents/image/image.yaml +86 -0
  283. package/src/agents/image/index.ts +19 -0
  284. package/src/agents/index.ts +59 -0
  285. package/src/agents/joker/index.ts +19 -0
  286. package/src/agents/joker/joker.handler.ts +60 -0
  287. package/src/agents/joker/joker.schema.ts +15 -0
  288. package/src/agents/joker/joker.types.ts +37 -0
  289. package/src/agents/joker/joker.yaml +47 -0
  290. package/src/agents/mcp-tool/index.ts +19 -0
  291. package/src/agents/mcp-tool/mcp-tool.handler.ts +112 -0
  292. package/src/agents/mcp-tool/mcp-tool.schema.ts +22 -0
  293. package/src/agents/mcp-tool/mcp-tool.types.ts +33 -0
  294. package/src/agents/mcp-tool/mcp-tool.yaml +71 -0
  295. package/src/agents/rag/index.ts +20 -0
  296. package/src/agents/rag/rag.handler.ts +119 -0
  297. package/src/agents/rag/rag.schema.ts +26 -0
  298. package/src/agents/rag/rag.types.ts +51 -0
  299. package/src/agents/rag/rag.yaml +89 -0
  300. package/src/agents/{agentRegistry.ts → registry/agentRegistry.ts} +161 -5
  301. package/src/agents/registry/index.ts +6 -0
  302. package/src/agents/translator/index.ts +19 -0
  303. package/src/agents/translator/translator.handler.ts +99 -0
  304. package/src/agents/translator/translator.schema.ts +30 -0
  305. package/src/agents/translator/translator.types.ts +42 -0
  306. package/src/agents/translator/translator.yaml +80 -0
  307. package/src/client/index.ts +53 -0
  308. package/src/client/types.ts +38 -0
  309. package/src/index.ts +48 -5
  310. package/src/runtime/declarativeAgentRuntime.ts +367 -489
  311. package/src/runtime/index.ts +31 -0
  312. package/src/runtime/workflowExecutor.ts +94 -0
  313. package/src/server/api/graphql.ts +1 -1
  314. package/src/server/index.ts +2 -2
  315. package/src/shared/index.ts +7 -0
  316. package/src/shared/types/agent.types.ts +80 -0
  317. package/src/shared/types/execution.types.ts +45 -0
  318. package/src/shared/types/index.ts +7 -0
  319. package/src/shared/types/schema.types.ts +55 -0
  320. package/src/shared/utils/index.ts +5 -0
  321. package/src/shared/utils/validation.ts +100 -0
  322. package/src/tenant/TenantManager.ts +488 -0
  323. package/src/tenant/index.ts +101 -0
  324. package/src/tenant/interfaces.ts +231 -0
  325. package/src/tenant/providerFactory.ts +75 -0
  326. package/src/tenant/providerRegistry.ts +86 -0
  327. package/src/tenant/providers/InMemoryTenantProvider.ts +168 -0
  328. package/dist/agents/agentRegistry.d.ts.map +0 -1
  329. package/dist/agents/agentRegistry.js.map +0 -1
  330. package/src/firebase/tenantManager.ts +0 -443
@@ -0,0 +1,488 @@
1
+ /**
2
+ * Agnostic Tenant Manager
3
+ * Provider-independent tenant management with compliance integration
4
+ *
5
+ * This manager orchestrates tenant operations using abstract interfaces,
6
+ * allowing swappable backends (Firebase, Supabase, PostgreSQL, etc.)
7
+ */
8
+
9
+ import { runtimeConfig } from '../config';
10
+ import { AuditTrail } from '../audit/auditTrail';
11
+ import { GDPRCompliance } from '../compliance/gdprEngine';
12
+ import { LGPDCompliance } from '../compliance/lgpdEngine';
13
+ import {
14
+ ITenantProvider,
15
+ ITenantApp,
16
+ TenantConfig,
17
+ ValidationError,
18
+ TenantAlreadyExistsError,
19
+ } from './interfaces';
20
+ import { createProvider } from './providerFactory';
21
+
22
+ /**
23
+ * Result of tenant initialization with compliance and security metrics
24
+ */
25
+ export interface TenantIsolationResult {
26
+ success: boolean;
27
+ tenantId: string;
28
+ securityScore: number;
29
+ auditHash: string;
30
+ executionTime: number;
31
+ complianceStatus: {
32
+ lgpd: boolean;
33
+ gdpr: boolean;
34
+ };
35
+ }
36
+
37
+ /**
38
+ * Agnostic Tenant Manager
39
+ *
40
+ * Singleton manager that orchestrates tenant operations using abstract
41
+ * provider interfaces. Maintains integration with AuditTrail and
42
+ * LGPD/GDPR compliance engines independent of the underlying provider.
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * const manager = TenantManager.getInstance();
47
+ *
48
+ * // Initialize with in-memory provider for testing
49
+ * const result = await manager.initializeTenant({
50
+ * tenantId: 'tenant-123',
51
+ * securityProfile: 'tenant-isolated',
52
+ * dataRetentionDays: 365,
53
+ * lgpdEnabled: true,
54
+ * gdprEnabled: true,
55
+ * provider: 'memory',
56
+ * providerConfig: {}
57
+ * });
58
+ * ```
59
+ */
60
+ export class TenantManager {
61
+ private static instance: TenantManager;
62
+ private provider: ITenantProvider | null = null;
63
+ private auditTrail: AuditTrail;
64
+ private gdprCompliance: GDPRCompliance;
65
+ private lgpdCompliance: LGPDCompliance;
66
+ private tenantConfigs: Map<string, TenantConfig>;
67
+
68
+ private constructor() {
69
+ this.auditTrail = new AuditTrail();
70
+ this.gdprCompliance = new GDPRCompliance(this.auditTrail);
71
+ this.lgpdCompliance = new LGPDCompliance(this.auditTrail);
72
+ this.tenantConfigs = new Map();
73
+ }
74
+
75
+ /**
76
+ * Get the singleton instance of TenantManager
77
+ */
78
+ public static getInstance(): TenantManager {
79
+ if (!this.instance) {
80
+ this.instance = new TenantManager();
81
+ }
82
+ return this.instance;
83
+ }
84
+
85
+ /**
86
+ * Reset the singleton instance (useful for testing)
87
+ */
88
+ public static resetInstance(): void {
89
+ this.instance = undefined as unknown as TenantManager;
90
+ }
91
+
92
+
93
+ /**
94
+ * Set the provider to use for tenant operations
95
+ * This allows runtime provider switching
96
+ */
97
+ public setProvider(provider: ITenantProvider): void {
98
+ this.provider = provider;
99
+ }
100
+
101
+ /**
102
+ * Get the current provider
103
+ * @throws ValidationError if no provider is set
104
+ */
105
+ public getProvider(): ITenantProvider {
106
+ if (!this.provider) {
107
+ throw new ValidationError('No provider configured. Call setProvider() or initializeTenant() first.');
108
+ }
109
+ return this.provider;
110
+ }
111
+
112
+ /**
113
+ * Initialize tenant with complete isolation and compliance verification
114
+ *
115
+ * @param config - Tenant configuration including provider settings
116
+ * @returns TenantIsolationResult with security and compliance metrics
117
+ * @throws ValidationError if configuration is invalid
118
+ * @throws TenantAlreadyExistsError if tenant already exists
119
+ */
120
+ public async initializeTenant(config: TenantConfig): Promise<TenantIsolationResult> {
121
+ const startTime = Date.now();
122
+
123
+ try {
124
+ // Validate tenant configuration
125
+ this.validateTenantConfig(config);
126
+
127
+ // Create or reuse provider based on config
128
+ if (!this.provider || this.provider.type !== config.provider) {
129
+ this.provider = createProvider(config.provider);
130
+ }
131
+
132
+ // Check if tenant already exists
133
+ const existingTenants = this.provider.list();
134
+ if (existingTenants.includes(config.tenantId)) {
135
+ throw new TenantAlreadyExistsError(config.tenantId);
136
+ }
137
+
138
+ // Initialize tenant via provider
139
+ await this.provider.initialize(config);
140
+
141
+ // Store tenant config for later reference
142
+ this.tenantConfigs.set(config.tenantId, config);
143
+
144
+ // Generate audit trail
145
+ const operationId = `init-${config.tenantId}-${Date.now()}`;
146
+ const auditHash = await this.auditTrail.logOperation({
147
+ operationId,
148
+ tenantId: config.tenantId,
149
+ operation: 'tenant_init',
150
+ data: this.sanitizeForAudit(config),
151
+ timestamp: new Date(),
152
+ });
153
+
154
+ // Verify compliance
155
+ const complianceStatus = await this.verifyCompliance(config);
156
+
157
+ const executionTime = Date.now() - startTime;
158
+
159
+ // Calculate security score
160
+ const securityScore = this.calculateSecurityScore(config);
161
+
162
+ return {
163
+ success: true,
164
+ tenantId: config.tenantId,
165
+ securityScore,
166
+ auditHash,
167
+ executionTime,
168
+ complianceStatus,
169
+ };
170
+ } catch (error) {
171
+ const executionTime = Date.now() - startTime;
172
+
173
+ await this.auditTrail.logOperation({
174
+ operationId: `error-${config.tenantId}-${Date.now()}`,
175
+ tenantId: config.tenantId,
176
+ operation: 'tenant_init_error',
177
+ data: {
178
+ error: error instanceof Error ? error.message : String(error),
179
+ config: this.sanitizeForAudit(config),
180
+ },
181
+ timestamp: new Date(),
182
+ success: false,
183
+ });
184
+
185
+ throw error;
186
+ }
187
+ }
188
+
189
+
190
+ /**
191
+ * Get isolated tenant app
192
+ *
193
+ * @param tenantId - The tenant identifier
194
+ * @returns The tenant app instance
195
+ * @throws NotFoundError if tenant does not exist
196
+ * @throws ValidationError if no provider is configured
197
+ */
198
+ public getTenantApp(tenantId: string): ITenantApp {
199
+ const provider = this.getProvider();
200
+ return provider.get(tenantId);
201
+ }
202
+
203
+ /**
204
+ * Execute operation in tenant context with audit trail
205
+ *
206
+ * @param tenantId - The tenant identifier
207
+ * @param operation - Operation name for audit logging
208
+ * @param data - Operation data for audit logging
209
+ * @param callback - The operation to execute
210
+ * @returns The result of the callback
211
+ */
212
+ public async executeInTenant<T>(
213
+ tenantId: string,
214
+ operation: string,
215
+ data: unknown,
216
+ callback: () => Promise<T>
217
+ ): Promise<T> {
218
+ const startTime = Date.now();
219
+
220
+ try {
221
+ // Verify tenant exists
222
+ this.getTenantApp(tenantId);
223
+
224
+ // Generate audit trail
225
+ const operationId = `${operation}-${tenantId}-${Date.now()}`;
226
+ await this.auditTrail.logOperation({
227
+ operationId,
228
+ tenantId,
229
+ operation,
230
+ data: this.sanitizeForAudit(data),
231
+ timestamp: new Date(),
232
+ });
233
+
234
+ // Execute operation
235
+ const result = await callback();
236
+
237
+ // Record successful operation
238
+ const executionTime = Date.now() - startTime;
239
+ await this.auditTrail.logOperation({
240
+ operationId: `${operationId}-complete`,
241
+ tenantId,
242
+ operation: `${operation}_complete`,
243
+ data: { result: this.sanitizeForAudit(result), executionTime },
244
+ timestamp: new Date(),
245
+ success: true,
246
+ });
247
+
248
+ return result;
249
+ } catch (error) {
250
+ const executionTime = Date.now() - startTime;
251
+
252
+ await this.auditTrail.logOperation({
253
+ operationId: `${operation}-${tenantId}-${Date.now()}-error`,
254
+ tenantId,
255
+ operation: `${operation}_error`,
256
+ data: {
257
+ error: error instanceof Error ? error.message : String(error),
258
+ executionTime,
259
+ },
260
+ timestamp: new Date(),
261
+ success: false,
262
+ });
263
+
264
+ throw error;
265
+ }
266
+ }
267
+
268
+ /**
269
+ * Safely remove tenant and release all resources
270
+ *
271
+ * @param tenantId - The tenant identifier
272
+ * @throws NotFoundError if tenant does not exist
273
+ */
274
+ public async removeTenant(tenantId: string): Promise<void> {
275
+ const provider = this.getProvider();
276
+
277
+ // Log removal
278
+ await this.auditTrail.logOperation({
279
+ operationId: `remove-${tenantId}-${Date.now()}`,
280
+ tenantId,
281
+ operation: 'tenant_removal',
282
+ data: { reason: 'admin_removal' },
283
+ timestamp: new Date(),
284
+ });
285
+
286
+ // Remove via provider
287
+ await provider.remove(tenantId);
288
+
289
+ // Clean up stored config
290
+ this.tenantConfigs.delete(tenantId);
291
+ }
292
+
293
+
294
+ /**
295
+ * Get all active tenant IDs
296
+ */
297
+ public getActiveTenants(): string[] {
298
+ if (!this.provider) {
299
+ return [];
300
+ }
301
+ return this.provider.list();
302
+ }
303
+
304
+ /**
305
+ * Get statistics for all tenants
306
+ */
307
+ public async getTenantStats(): Promise<Map<string, TenantIsolationResult>> {
308
+ const stats = new Map<string, TenantIsolationResult>();
309
+ const tenants = this.getActiveTenants();
310
+
311
+ for (const tenantId of tenants) {
312
+ const config = this.tenantConfigs.get(tenantId);
313
+ const securityScore = config ? this.calculateSecurityScore(config) : 9.5;
314
+
315
+ const mockStats: TenantIsolationResult = {
316
+ success: true,
317
+ tenantId,
318
+ securityScore,
319
+ auditHash: 'SHA256-' + Math.random().toString(36),
320
+ executionTime: 95,
321
+ complianceStatus: {
322
+ lgpd: config?.lgpdEnabled ?? true,
323
+ gdpr: config?.gdprEnabled ?? true,
324
+ },
325
+ };
326
+
327
+ stats.set(tenantId, mockStats);
328
+ }
329
+
330
+ return stats;
331
+ }
332
+
333
+ /**
334
+ * Get the stored configuration for a tenant
335
+ */
336
+ public getTenantConfig(tenantId: string): TenantConfig | undefined {
337
+ return this.tenantConfigs.get(tenantId);
338
+ }
339
+
340
+ /**
341
+ * Verify LGPD/GDPR compliance for tenant configuration
342
+ */
343
+ private async verifyCompliance(config: TenantConfig): Promise<{
344
+ lgpd: boolean;
345
+ gdpr: boolean;
346
+ }> {
347
+ let lgpd = false;
348
+ let gdpr = false;
349
+
350
+ if (config.lgpdEnabled) {
351
+ lgpd = await this.lgpdCompliance.verifyCompliance({
352
+ tenantId: config.tenantId,
353
+ dataConsent: true,
354
+ dataAnonymization: true,
355
+ dataRetentionDays: config.dataRetentionDays,
356
+ brazilianDataResidency: true,
357
+ rightToDelete: true,
358
+ dataOwnerRights: true,
359
+ automaticDeletion: true,
360
+ });
361
+ }
362
+
363
+ if (config.gdprEnabled) {
364
+ gdpr = await this.gdprCompliance.verifyCompliance({
365
+ tenantId: config.tenantId,
366
+ dataAnonymization: true,
367
+ consentManagement: true,
368
+ rightToBeForgotten: true,
369
+ dataPortability: true,
370
+ dataRetentionDays: config.dataRetentionDays,
371
+ });
372
+ }
373
+
374
+ return { lgpd, gdpr };
375
+ }
376
+
377
+
378
+ /**
379
+ * Calculate security score based on configuration
380
+ */
381
+ private calculateSecurityScore(config: TenantConfig): number {
382
+ let score = 5.0; // Base score
383
+
384
+ // Multi-tenant isolation
385
+ const tenants = this.getActiveTenants();
386
+ if (tenants.includes(config.tenantId)) {
387
+ score += 1.0;
388
+ }
389
+
390
+ // Security profile
391
+ switch (config.securityProfile) {
392
+ case 'ultra-secure':
393
+ score += 2.0;
394
+ break;
395
+ case 'tenant-isolated':
396
+ score += 1.5;
397
+ break;
398
+ }
399
+
400
+ // Compliance features
401
+ if (config.lgpdEnabled) {
402
+ score += 0.5;
403
+ }
404
+ if (config.gdprEnabled) {
405
+ score += 0.5;
406
+ }
407
+
408
+ // Audit trail
409
+ if (runtimeConfig.auditEnabled) {
410
+ score += 1.0;
411
+ }
412
+
413
+ // Memory limit enforcement (1MB for multi-tenant)
414
+ const memoryLimit = runtimeConfig.memoryLimit;
415
+ if (memoryLimit <= 1) {
416
+ score += 0.5;
417
+ }
418
+
419
+ return Math.min(score, 10.0); // Maximum 10.0
420
+ }
421
+
422
+ /**
423
+ * Validate tenant configuration
424
+ * @throws ValidationError if configuration is invalid
425
+ */
426
+ private validateTenantConfig(config: TenantConfig): void {
427
+ if (!config.tenantId || config.tenantId.length < 3) {
428
+ throw new ValidationError('Invalid tenant ID - must be at least 3 characters');
429
+ }
430
+
431
+ if (!config.provider) {
432
+ throw new ValidationError('Provider type is required');
433
+ }
434
+
435
+ if (!config.securityProfile) {
436
+ config.securityProfile = 'tenant-isolated';
437
+ }
438
+
439
+ if (!config.dataRetentionDays) {
440
+ config.dataRetentionDays = 365; // 1 year default for LGPD
441
+ }
442
+
443
+ if (config.dataRetentionDays < 90) {
444
+ throw new ValidationError('Data retention minimum 90 days for LGPD compliance');
445
+ }
446
+ }
447
+
448
+ /**
449
+ * Sanitize data for audit trail (remove sensitive information)
450
+ */
451
+ private sanitizeForAudit(data: unknown): unknown {
452
+ return JSON.parse(
453
+ JSON.stringify(data, (key, value) => {
454
+ // Remove sensitive information
455
+ if (
456
+ key.includes('password') ||
457
+ key.includes('secret') ||
458
+ key.includes('key')
459
+ ) {
460
+ return '[REDACTED]';
461
+ }
462
+ return value;
463
+ })
464
+ );
465
+ }
466
+
467
+ /**
468
+ * Get the audit trail instance (for testing/debugging)
469
+ */
470
+ public getAuditTrail(): AuditTrail {
471
+ return this.auditTrail;
472
+ }
473
+
474
+ /**
475
+ * Get the LGPD compliance engine (for testing/debugging)
476
+ */
477
+ public getLGPDCompliance(): LGPDCompliance {
478
+ return this.lgpdCompliance;
479
+ }
480
+
481
+ /**
482
+ * Get the GDPR compliance engine (for testing/debugging)
483
+ */
484
+ public getGDPRCompliance(): GDPRCompliance {
485
+ return this.gdprCompliance;
486
+ }
487
+ }
488
+
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Agnostic Multi-Tenant Module
3
+ * Provider-independent tenant management for Beddel
4
+ *
5
+ * This module provides a complete abstraction layer for multi-tenant operations,
6
+ * allowing swappable backends (Firebase, Supabase, PostgreSQL, etc.) without
7
+ * modifying business logic.
8
+ *
9
+ * External providers (Firebase, Supabase, etc.) should be registered by the
10
+ * consuming application using ProviderRegistry before use.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * import {
15
+ * TenantManager,
16
+ * createProvider,
17
+ * ProviderRegistry,
18
+ * InMemoryTenantProvider,
19
+ * } from 'beddel/tenant';
20
+ *
21
+ * // Register external provider (in your application)
22
+ * import { FirebaseTenantProvider } from './providers/FirebaseTenantProvider';
23
+ * ProviderRegistry.register('firebase', () => new FirebaseTenantProvider());
24
+ *
25
+ * // Use in-memory provider for testing (built-in)
26
+ * const manager = TenantManager.getInstance();
27
+ * const result = await manager.initializeTenant({
28
+ * tenantId: 'tenant-123',
29
+ * securityProfile: 'tenant-isolated',
30
+ * dataRetentionDays: 365,
31
+ * lgpdEnabled: true,
32
+ * gdprEnabled: true,
33
+ * provider: 'memory',
34
+ * providerConfig: {}
35
+ * });
36
+ * ```
37
+ *
38
+ * @module tenant
39
+ */
40
+
41
+ // =============================================================================
42
+ // Core Manager
43
+ // =============================================================================
44
+
45
+ export { TenantManager } from './TenantManager';
46
+ export type { TenantIsolationResult } from './TenantManager';
47
+
48
+ // =============================================================================
49
+ // Interfaces and Types
50
+ // =============================================================================
51
+
52
+ export type {
53
+ // Provider types
54
+ ProviderType,
55
+ BuiltInProviderType,
56
+
57
+ // Configuration types
58
+ TenantConfig,
59
+ FirebaseProviderConfig,
60
+ MemoryProviderConfig,
61
+
62
+ // Core interfaces
63
+ ITenantProvider,
64
+ ITenantApp,
65
+ ITenantDatabase,
66
+ ITenantCollection,
67
+ ITenantDocument,
68
+ } from './interfaces';
69
+
70
+ // Error types (classes, not just types)
71
+ export {
72
+ TenantError,
73
+ ValidationError,
74
+ NotFoundError,
75
+ NotSupportedError,
76
+ TenantAlreadyExistsError,
77
+ } from './interfaces';
78
+
79
+ // =============================================================================
80
+ // Provider Registry
81
+ // =============================================================================
82
+
83
+ export { ProviderRegistry } from './providerRegistry';
84
+
85
+ // =============================================================================
86
+ // Provider Factory
87
+ // =============================================================================
88
+
89
+ export {
90
+ createProvider,
91
+ isValidProviderType,
92
+ isBuiltInProviderType,
93
+ getSupportedProviders,
94
+ getBuiltInProviders,
95
+ } from './providerFactory';
96
+
97
+ // =============================================================================
98
+ // Built-in Provider Implementations
99
+ // =============================================================================
100
+
101
+ export { InMemoryTenantProvider } from './providers/InMemoryTenantProvider';