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.
- package/CHANGELOG.md +15 -0
- package/README.md +117 -14
- package/dist/agents/chat/chat.handler.d.ts +12 -0
- package/dist/agents/chat/chat.handler.d.ts.map +1 -0
- package/dist/agents/chat/chat.handler.js +143 -0
- package/dist/agents/chat/chat.handler.js.map +1 -0
- package/dist/agents/chat/chat.schema.d.ts +38 -0
- package/dist/agents/chat/chat.schema.d.ts.map +1 -0
- package/dist/agents/chat/chat.schema.js +31 -0
- package/dist/agents/chat/chat.schema.js.map +1 -0
- package/dist/agents/chat/chat.types.d.ts +42 -0
- package/dist/agents/chat/chat.types.d.ts.map +1 -0
- package/dist/agents/chat/chat.types.js +6 -0
- package/dist/agents/chat/chat.types.js.map +1 -0
- package/dist/agents/chat/chat.yaml +150 -0
- package/dist/agents/chat/index.d.ts +16 -0
- package/dist/agents/chat/index.d.ts.map +1 -0
- package/dist/agents/chat/index.js +21 -0
- package/dist/agents/chat/index.js.map +1 -0
- package/dist/agents/chromadb/chromadb.handler.d.ts +12 -0
- package/dist/agents/chromadb/chromadb.handler.d.ts.map +1 -0
- package/dist/agents/chromadb/chromadb.handler.js +139 -0
- package/dist/agents/chromadb/chromadb.handler.js.map +1 -0
- package/dist/agents/chromadb/chromadb.schema.d.ts +36 -0
- package/dist/agents/chromadb/chromadb.schema.d.ts.map +1 -0
- package/dist/agents/chromadb/chromadb.schema.js +33 -0
- package/dist/agents/chromadb/chromadb.schema.js.map +1 -0
- package/dist/agents/chromadb/chromadb.types.d.ts +49 -0
- package/dist/agents/chromadb/chromadb.types.d.ts.map +1 -0
- package/dist/agents/chromadb/chromadb.types.js +6 -0
- package/dist/agents/chromadb/chromadb.types.js.map +1 -0
- package/dist/agents/chromadb/chromadb.yaml +128 -0
- package/dist/agents/chromadb/index.d.ts +15 -0
- package/dist/agents/chromadb/index.d.ts.map +1 -0
- package/dist/agents/chromadb/index.js +20 -0
- package/dist/agents/chromadb/index.js.map +1 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.handler.d.ts +8 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.handler.d.ts.map +1 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.handler.js +58 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.handler.js.map +1 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.schema.d.ts +22 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.schema.d.ts.map +1 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.schema.js +20 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.schema.js.map +1 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.types.d.ts +32 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.types.d.ts.map +1 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.types.js +6 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.types.js.map +1 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.yaml +84 -0
- package/dist/agents/gemini-vectorize/index.d.ts +15 -0
- package/dist/agents/gemini-vectorize/index.d.ts.map +1 -0
- package/dist/agents/gemini-vectorize/index.js +20 -0
- package/dist/agents/gemini-vectorize/index.js.map +1 -0
- package/dist/agents/gitmcp/gitmcp.handler.d.ts +12 -0
- package/dist/agents/gitmcp/gitmcp.handler.d.ts.map +1 -0
- package/dist/agents/gitmcp/gitmcp.handler.js +95 -0
- package/dist/agents/gitmcp/gitmcp.handler.js.map +1 -0
- package/dist/agents/gitmcp/gitmcp.schema.d.ts +17 -0
- package/dist/agents/gitmcp/gitmcp.schema.d.ts.map +1 -0
- package/dist/agents/gitmcp/gitmcp.schema.js +18 -0
- package/dist/agents/gitmcp/gitmcp.schema.js.map +1 -0
- package/dist/agents/gitmcp/gitmcp.types.d.ts +31 -0
- package/dist/agents/gitmcp/gitmcp.types.d.ts.map +1 -0
- package/dist/agents/gitmcp/gitmcp.types.js +6 -0
- package/dist/agents/gitmcp/gitmcp.types.js.map +1 -0
- package/dist/agents/gitmcp/gitmcp.yaml +71 -0
- package/dist/agents/gitmcp/index.d.ts +16 -0
- package/dist/agents/gitmcp/index.d.ts.map +1 -0
- package/dist/agents/gitmcp/index.js +21 -0
- package/dist/agents/gitmcp/index.js.map +1 -0
- package/dist/agents/image/image.handler.d.ts +8 -0
- package/dist/agents/image/image.handler.d.ts.map +1 -0
- package/dist/agents/image/image.handler.js +66 -0
- package/dist/agents/image/image.handler.js.map +1 -0
- package/dist/agents/image/image.schema.d.ts +29 -0
- package/dist/agents/image/image.schema.d.ts.map +1 -0
- package/dist/agents/image/image.schema.js +26 -0
- package/dist/agents/image/image.schema.js.map +1 -0
- package/dist/agents/image/image.types.d.ts +42 -0
- package/dist/agents/image/image.types.d.ts.map +1 -0
- package/dist/agents/image/image.types.js +6 -0
- package/dist/agents/image/image.types.js.map +1 -0
- package/{src/agents/image-agent.yaml → dist/agents/image/image.yaml} +21 -21
- package/dist/agents/image/index.d.ts +14 -0
- package/dist/agents/image/index.d.ts.map +1 -0
- package/dist/agents/image/index.js +19 -0
- package/dist/agents/image/index.js.map +1 -0
- package/dist/agents/index.d.ts +95 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +76 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/joker/index.d.ts +14 -0
- package/dist/agents/joker/index.d.ts.map +1 -0
- package/dist/agents/joker/index.js +19 -0
- package/dist/agents/joker/index.js.map +1 -0
- package/dist/agents/joker/joker.handler.d.ts +8 -0
- package/dist/agents/joker/joker.handler.d.ts.map +1 -0
- package/dist/agents/joker/joker.handler.js +48 -0
- package/dist/agents/joker/joker.handler.js.map +1 -0
- package/dist/agents/joker/joker.schema.d.ts +12 -0
- package/dist/agents/joker/joker.schema.d.ts.map +1 -0
- package/dist/agents/joker/joker.schema.js +13 -0
- package/dist/agents/joker/joker.schema.js.map +1 -0
- package/dist/agents/joker/joker.types.d.ts +35 -0
- package/dist/agents/joker/joker.types.d.ts.map +1 -0
- package/dist/agents/joker/joker.types.js +6 -0
- package/dist/agents/joker/joker.types.js.map +1 -0
- package/{src/agents/joker-agent.yaml → dist/agents/joker/joker.yaml} +4 -4
- package/dist/agents/mcp-tool/index.d.ts +14 -0
- package/dist/agents/mcp-tool/index.d.ts.map +1 -0
- package/dist/agents/mcp-tool/index.js +19 -0
- package/dist/agents/mcp-tool/index.js.map +1 -0
- package/dist/agents/mcp-tool/mcp-tool.handler.d.ts +12 -0
- package/dist/agents/mcp-tool/mcp-tool.handler.d.ts.map +1 -0
- package/dist/agents/mcp-tool/mcp-tool.handler.js +116 -0
- package/dist/agents/mcp-tool/mcp-tool.handler.js.map +1 -0
- package/dist/agents/mcp-tool/mcp-tool.schema.d.ts +19 -0
- package/dist/agents/mcp-tool/mcp-tool.schema.d.ts.map +1 -0
- package/dist/agents/mcp-tool/mcp-tool.schema.js +20 -0
- package/dist/agents/mcp-tool/mcp-tool.schema.js.map +1 -0
- package/dist/agents/mcp-tool/mcp-tool.types.d.ts +31 -0
- package/dist/agents/mcp-tool/mcp-tool.types.d.ts.map +1 -0
- package/dist/agents/mcp-tool/mcp-tool.types.js +6 -0
- package/dist/agents/mcp-tool/mcp-tool.types.js.map +1 -0
- package/dist/agents/mcp-tool/mcp-tool.yaml +71 -0
- package/dist/agents/rag/index.d.ts +15 -0
- package/dist/agents/rag/index.d.ts.map +1 -0
- package/dist/agents/rag/index.js +20 -0
- package/dist/agents/rag/index.js.map +1 -0
- package/dist/agents/rag/rag.handler.d.ts +8 -0
- package/dist/agents/rag/rag.handler.d.ts.map +1 -0
- package/dist/agents/rag/rag.handler.js +101 -0
- package/dist/agents/rag/rag.handler.js.map +1 -0
- package/dist/agents/rag/rag.schema.d.ts +27 -0
- package/dist/agents/rag/rag.schema.d.ts.map +1 -0
- package/dist/agents/rag/rag.schema.js +24 -0
- package/dist/agents/rag/rag.schema.js.map +1 -0
- package/dist/agents/rag/rag.types.d.ts +47 -0
- package/dist/agents/rag/rag.types.d.ts.map +1 -0
- package/dist/agents/rag/rag.types.js +6 -0
- package/dist/agents/rag/rag.types.js.map +1 -0
- package/dist/agents/rag/rag.yaml +89 -0
- package/dist/agents/{agentRegistry.d.ts → registry/agentRegistry.d.ts} +25 -1
- package/dist/agents/registry/agentRegistry.d.ts.map +1 -0
- package/dist/agents/{agentRegistry.js → registry/agentRegistry.js} +154 -4
- package/dist/agents/registry/agentRegistry.js.map +1 -0
- package/dist/agents/registry/index.d.ts +6 -0
- package/dist/agents/registry/index.d.ts.map +1 -0
- package/dist/agents/registry/index.js +10 -0
- package/dist/agents/registry/index.js.map +1 -0
- package/dist/agents/translator/index.d.ts +14 -0
- package/dist/agents/translator/index.d.ts.map +1 -0
- package/dist/agents/translator/index.js +19 -0
- package/dist/agents/translator/index.js.map +1 -0
- package/dist/agents/translator/translator.handler.d.ts +8 -0
- package/dist/agents/translator/translator.handler.d.ts.map +1 -0
- package/dist/agents/translator/translator.handler.js +83 -0
- package/dist/agents/translator/translator.handler.js.map +1 -0
- package/dist/agents/translator/translator.schema.d.ts +27 -0
- package/dist/agents/translator/translator.schema.d.ts.map +1 -0
- package/dist/agents/translator/translator.schema.js +28 -0
- package/dist/agents/translator/translator.schema.js.map +1 -0
- package/dist/agents/translator/translator.types.d.ts +40 -0
- package/dist/agents/translator/translator.types.d.ts.map +1 -0
- package/dist/agents/translator/translator.types.js +6 -0
- package/dist/agents/translator/translator.types.js.map +1 -0
- package/{src/agents/translator-agent.yaml → dist/agents/translator/translator.yaml} +27 -27
- package/dist/client/index.d.ts +89 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +93 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/types.d.ts +17 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +7 -0
- package/dist/client/types.js.map +1 -0
- package/dist/firebase/tenantManager.d.ts +34 -2
- package/dist/firebase/tenantManager.d.ts.map +1 -1
- package/dist/firebase/tenantManager.js +67 -1
- package/dist/firebase/tenantManager.js.map +1 -1
- package/dist/index.d.ts +8 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -7
- package/dist/index.js.map +1 -1
- package/dist/runtime/declarativeAgentRuntime.d.ts +14 -49
- package/dist/runtime/declarativeAgentRuntime.d.ts.map +1 -1
- package/dist/runtime/declarativeAgentRuntime.js +248 -355
- package/dist/runtime/declarativeAgentRuntime.js.map +1 -1
- package/dist/runtime/index.d.ts +12 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +33 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/workflowExecutor.d.ts +30 -0
- package/dist/runtime/workflowExecutor.d.ts.map +1 -0
- package/dist/runtime/workflowExecutor.js +70 -0
- package/dist/runtime/workflowExecutor.js.map +1 -0
- package/dist/server/api/graphql.js +3 -3
- package/dist/server/api/graphql.js.map +1 -1
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/shared/index.d.ts +7 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +23 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/types/agent.types.d.ts +50 -0
- package/dist/shared/types/agent.types.d.ts.map +1 -0
- package/dist/shared/types/agent.types.js +7 -0
- package/dist/shared/types/agent.types.js.map +1 -0
- package/dist/shared/types/execution.types.d.ts +42 -0
- package/dist/shared/types/execution.types.d.ts.map +1 -0
- package/dist/shared/types/execution.types.js +7 -0
- package/dist/shared/types/execution.types.js.map +1 -0
- package/dist/shared/types/index.d.ts +7 -0
- package/dist/shared/types/index.d.ts.map +1 -0
- package/dist/shared/types/index.js +23 -0
- package/dist/shared/types/index.js.map +1 -0
- package/dist/shared/types/schema.types.d.ts +52 -0
- package/dist/shared/types/schema.types.d.ts.map +1 -0
- package/dist/shared/types/schema.types.js +7 -0
- package/dist/shared/types/schema.types.js.map +1 -0
- package/dist/shared/utils/index.d.ts +5 -0
- package/dist/shared/utils/index.d.ts.map +1 -0
- package/dist/shared/utils/index.js +21 -0
- package/dist/shared/utils/index.js.map +1 -0
- package/dist/shared/utils/validation.d.ts +42 -0
- package/dist/shared/utils/validation.d.ts.map +1 -0
- package/dist/shared/utils/validation.js +93 -0
- package/dist/shared/utils/validation.js.map +1 -0
- package/dist/tenant/TenantManager.d.ts +152 -0
- package/dist/tenant/TenantManager.d.ts.map +1 -0
- package/dist/tenant/TenantManager.js +392 -0
- package/dist/tenant/TenantManager.js.map +1 -0
- package/dist/tenant/index.d.ts +47 -0
- package/dist/tenant/index.d.ts.map +1 -0
- package/dist/tenant/index.js +74 -0
- package/dist/tenant/index.js.map +1 -0
- package/dist/tenant/interfaces.d.ts +170 -0
- package/dist/tenant/interfaces.d.ts.map +1 -0
- package/dist/tenant/interfaces.js +67 -0
- package/dist/tenant/interfaces.js.map +1 -0
- package/dist/tenant/providerFactory.d.ts +43 -0
- package/dist/tenant/providerFactory.d.ts.map +1 -0
- package/dist/tenant/providerFactory.js +70 -0
- package/dist/tenant/providerFactory.js.map +1 -0
- package/dist/tenant/providerRegistry.d.ts +47 -0
- package/dist/tenant/providerRegistry.d.ts.map +1 -0
- package/dist/tenant/providerRegistry.js +79 -0
- package/dist/tenant/providerRegistry.js.map +1 -0
- package/dist/tenant/providers/FirebaseTenantProvider.d.ts +41 -0
- package/dist/tenant/providers/FirebaseTenantProvider.d.ts.map +1 -0
- package/dist/tenant/providers/FirebaseTenantProvider.js +290 -0
- package/dist/tenant/providers/FirebaseTenantProvider.js.map +1 -0
- package/dist/tenant/providers/InMemoryTenantProvider.d.ts +18 -0
- package/dist/tenant/providers/InMemoryTenantProvider.d.ts.map +1 -0
- package/dist/tenant/providers/InMemoryTenantProvider.js +137 -0
- package/dist/tenant/providers/InMemoryTenantProvider.js.map +1 -0
- package/package.json +46 -12
- package/src/agents/chat/chat.handler.ts +209 -0
- package/src/agents/chat/chat.schema.ts +33 -0
- package/src/agents/chat/chat.types.ts +46 -0
- package/src/agents/chat/chat.yaml +150 -0
- package/src/agents/chat/index.ts +21 -0
- package/src/agents/chromadb/chromadb.handler.ts +130 -0
- package/src/agents/chromadb/chromadb.schema.ts +35 -0
- package/src/agents/chromadb/chromadb.types.ts +52 -0
- package/src/agents/chromadb/chromadb.yaml +128 -0
- package/src/agents/chromadb/index.ts +20 -0
- package/src/agents/gemini-vectorize/gemini-vectorize.handler.ts +72 -0
- package/src/agents/gemini-vectorize/gemini-vectorize.schema.ts +22 -0
- package/src/agents/gemini-vectorize/gemini-vectorize.types.ts +34 -0
- package/src/agents/gemini-vectorize/gemini-vectorize.yaml +84 -0
- package/src/agents/gemini-vectorize/index.ts +20 -0
- package/src/agents/gitmcp/gitmcp.handler.ts +122 -0
- package/src/agents/gitmcp/gitmcp.schema.ts +20 -0
- package/src/agents/gitmcp/gitmcp.types.ts +33 -0
- package/src/agents/gitmcp/gitmcp.yaml +71 -0
- package/src/agents/gitmcp/index.ts +21 -0
- package/src/agents/image/image.handler.ts +82 -0
- package/src/agents/image/image.schema.ts +28 -0
- package/src/agents/image/image.types.ts +45 -0
- package/src/agents/image/image.yaml +86 -0
- package/src/agents/image/index.ts +19 -0
- package/src/agents/index.ts +59 -0
- package/src/agents/joker/index.ts +19 -0
- package/src/agents/joker/joker.handler.ts +60 -0
- package/src/agents/joker/joker.schema.ts +15 -0
- package/src/agents/joker/joker.types.ts +37 -0
- package/src/agents/joker/joker.yaml +47 -0
- package/src/agents/mcp-tool/index.ts +19 -0
- package/src/agents/mcp-tool/mcp-tool.handler.ts +112 -0
- package/src/agents/mcp-tool/mcp-tool.schema.ts +22 -0
- package/src/agents/mcp-tool/mcp-tool.types.ts +33 -0
- package/src/agents/mcp-tool/mcp-tool.yaml +71 -0
- package/src/agents/rag/index.ts +20 -0
- package/src/agents/rag/rag.handler.ts +119 -0
- package/src/agents/rag/rag.schema.ts +26 -0
- package/src/agents/rag/rag.types.ts +51 -0
- package/src/agents/rag/rag.yaml +89 -0
- package/src/agents/{agentRegistry.ts → registry/agentRegistry.ts} +161 -5
- package/src/agents/registry/index.ts +6 -0
- package/src/agents/translator/index.ts +19 -0
- package/src/agents/translator/translator.handler.ts +99 -0
- package/src/agents/translator/translator.schema.ts +30 -0
- package/src/agents/translator/translator.types.ts +42 -0
- package/src/agents/translator/translator.yaml +80 -0
- package/src/client/index.ts +53 -0
- package/src/client/types.ts +38 -0
- package/src/index.ts +48 -5
- package/src/runtime/declarativeAgentRuntime.ts +367 -489
- package/src/runtime/index.ts +31 -0
- package/src/runtime/workflowExecutor.ts +94 -0
- package/src/server/api/graphql.ts +1 -1
- package/src/server/index.ts +2 -2
- package/src/shared/index.ts +7 -0
- package/src/shared/types/agent.types.ts +80 -0
- package/src/shared/types/execution.types.ts +45 -0
- package/src/shared/types/index.ts +7 -0
- package/src/shared/types/schema.types.ts +55 -0
- package/src/shared/utils/index.ts +5 -0
- package/src/shared/utils/validation.ts +100 -0
- package/src/tenant/TenantManager.ts +488 -0
- package/src/tenant/index.ts +101 -0
- package/src/tenant/interfaces.ts +231 -0
- package/src/tenant/providerFactory.ts +75 -0
- package/src/tenant/providerRegistry.ts +86 -0
- package/src/tenant/providers/InMemoryTenantProvider.ts +168 -0
- package/dist/agents/agentRegistry.d.ts.map +0 -1
- package/dist/agents/agentRegistry.js.map +0 -1
- 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';
|