beddel 0.2.1 → 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 +20 -0
- package/README.md +132 -21
- 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.d.ts +1 -1
- package/dist/server/api/graphql.d.ts.map +1 -1
- package/dist/server/api/graphql.js +104 -62
- 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 +48 -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 +109 -74
- 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
|
@@ -1,443 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Multi-Tenant Firebase Manager v2025
|
|
3
|
-
* Isolamento completo de tenants com LGPD/GDPR compliance automático
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import * as admin from "firebase-admin";
|
|
7
|
-
import { runtimeConfig } from "../config";
|
|
8
|
-
import { AuditTrail } from "../audit/auditTrail";
|
|
9
|
-
import { GDPRCompliance } from "../compliance/gdprEngine";
|
|
10
|
-
import { LGPDCompliance } from "../compliance/lgpdEngine";
|
|
11
|
-
|
|
12
|
-
export interface TenantConfig {
|
|
13
|
-
tenantId: string;
|
|
14
|
-
projectId: string;
|
|
15
|
-
databaseURL: string;
|
|
16
|
-
storageBucket: string;
|
|
17
|
-
securityProfile: "ultra-secure" | "tenant-isolated";
|
|
18
|
-
dataRetentionDays: number;
|
|
19
|
-
lgpdEnabled: boolean;
|
|
20
|
-
gdprEnabled: boolean;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export interface TenantIsolationResult {
|
|
24
|
-
success: boolean;
|
|
25
|
-
tenantId: string;
|
|
26
|
-
securityScore: number;
|
|
27
|
-
auditHash: string;
|
|
28
|
-
executionTime: number;
|
|
29
|
-
complianceStatus: {
|
|
30
|
-
lgpd: boolean;
|
|
31
|
-
gdpr: boolean;
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export class MultiTenantFirebaseManager {
|
|
36
|
-
private static instance: MultiTenantFirebaseManager;
|
|
37
|
-
private tenants: Map<string, admin.app.App>;
|
|
38
|
-
private auditTrail: AuditTrail;
|
|
39
|
-
private gdprCompliance: GDPRCompliance;
|
|
40
|
-
private lgpdCompliance: LGPDCompliance;
|
|
41
|
-
|
|
42
|
-
private constructor() {
|
|
43
|
-
this.tenants = new Map();
|
|
44
|
-
this.auditTrail = new AuditTrail();
|
|
45
|
-
this.gdprCompliance = new GDPRCompliance();
|
|
46
|
-
this.lgpdCompliance = new LGPDCompliance();
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
public static getInstance(): MultiTenantFirebaseManager {
|
|
50
|
-
if (!this.instance) {
|
|
51
|
-
this.instance = new MultiTenantFirebaseManager();
|
|
52
|
-
}
|
|
53
|
-
return this.instance;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Initialize tenant with complete isolation
|
|
58
|
-
*/
|
|
59
|
-
public async initializeTenant(
|
|
60
|
-
config: TenantConfig
|
|
61
|
-
): Promise<TenantIsolationResult> {
|
|
62
|
-
const startTime = Date.now();
|
|
63
|
-
|
|
64
|
-
try {
|
|
65
|
-
// Validate tenant configuration
|
|
66
|
-
this.validateTenantConfig(config);
|
|
67
|
-
|
|
68
|
-
// Check if tenant already exists
|
|
69
|
-
if (this.tenants.has(config.tenantId)) {
|
|
70
|
-
throw new Error(`Tenant ${config.tenantId} already initialized`);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Initialize Firebase app for this tenant
|
|
74
|
-
const app = admin.initializeApp(
|
|
75
|
-
{
|
|
76
|
-
credential: admin.credential.applicationDefault(),
|
|
77
|
-
projectId: config.projectId,
|
|
78
|
-
databaseURL: config.databaseURL,
|
|
79
|
-
storageBucket: config.storageBucket,
|
|
80
|
-
},
|
|
81
|
-
`tenant-${config.tenantId}`
|
|
82
|
-
);
|
|
83
|
-
|
|
84
|
-
// Configure security rules
|
|
85
|
-
await this.configureSecurityRules(app, config);
|
|
86
|
-
|
|
87
|
-
// Store tenant app
|
|
88
|
-
this.tenants.set(config.tenantId, app);
|
|
89
|
-
|
|
90
|
-
// Generate audit trail
|
|
91
|
-
const operationId = `init-${config.tenantId}-${Date.now()}`;
|
|
92
|
-
const auditHash = await this.auditTrail.logOperation({
|
|
93
|
-
operationId,
|
|
94
|
-
tenantId: config.tenantId,
|
|
95
|
-
operation: "tenant_init",
|
|
96
|
-
data: this.sanitizeForAudit(config),
|
|
97
|
-
timestamp: new Date(),
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
// Verify compliance
|
|
101
|
-
const complianceStatus = await this.verifyCompliance(config);
|
|
102
|
-
|
|
103
|
-
const executionTime = Date.now() - startTime;
|
|
104
|
-
|
|
105
|
-
// Calculate security score
|
|
106
|
-
const securityScore = this.calculateSecurityScore(config);
|
|
107
|
-
|
|
108
|
-
return {
|
|
109
|
-
success: true,
|
|
110
|
-
tenantId: config.tenantId,
|
|
111
|
-
securityScore,
|
|
112
|
-
auditHash,
|
|
113
|
-
executionTime,
|
|
114
|
-
complianceStatus,
|
|
115
|
-
};
|
|
116
|
-
} catch (error) {
|
|
117
|
-
const executionTime = Date.now() - startTime;
|
|
118
|
-
|
|
119
|
-
await this.auditTrail.logOperation({
|
|
120
|
-
operationId: `error-${config.tenantId}-${Date.now()}`,
|
|
121
|
-
tenantId: config.tenantId,
|
|
122
|
-
operation: "tenant_init_error",
|
|
123
|
-
data: {
|
|
124
|
-
error: error instanceof Error ? error.message : String(error),
|
|
125
|
-
config: this.sanitizeForAudit(config),
|
|
126
|
-
},
|
|
127
|
-
timestamp: new Date(),
|
|
128
|
-
success: false,
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
throw error;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Get isolated tenant app with security profile
|
|
137
|
-
*/
|
|
138
|
-
public getTenantApp(tenantId: string): admin.app.App {
|
|
139
|
-
if (!this.tenants.has(tenantId)) {
|
|
140
|
-
throw new Error(`Tenant ${tenantId} not found or not initialized`);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
return this.tenants.get(tenantId)!;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Execute operation in tenant context
|
|
148
|
-
*/
|
|
149
|
-
public async executeInTenant<T>(
|
|
150
|
-
tenantId: string,
|
|
151
|
-
operation: string,
|
|
152
|
-
data: any,
|
|
153
|
-
callback: () => Promise<T>
|
|
154
|
-
): Promise<T> {
|
|
155
|
-
const startTime = Date.now();
|
|
156
|
-
|
|
157
|
-
try {
|
|
158
|
-
const app = this.getTenantApp(tenantId);
|
|
159
|
-
|
|
160
|
-
// Generate audit trail
|
|
161
|
-
const operationId = `${operation}-${tenantId}-${Date.now()}`;
|
|
162
|
-
const auditHash = await this.auditTrail.logOperation({
|
|
163
|
-
operationId,
|
|
164
|
-
tenantId,
|
|
165
|
-
operation,
|
|
166
|
-
data: this.sanitizeForAudit(data),
|
|
167
|
-
timestamp: new Date(),
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
// Execute operation
|
|
171
|
-
const result = await callback();
|
|
172
|
-
|
|
173
|
-
// Record successful operation
|
|
174
|
-
const executionTime = Date.now() - startTime;
|
|
175
|
-
await this.auditTrail.logOperation({
|
|
176
|
-
operationId: `${operationId}-complete`,
|
|
177
|
-
tenantId,
|
|
178
|
-
operation: `${operation}_complete`,
|
|
179
|
-
data: { result: this.sanitizeForAudit(result), executionTime },
|
|
180
|
-
timestamp: new Date(),
|
|
181
|
-
success: true,
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
return result;
|
|
185
|
-
} catch (error) {
|
|
186
|
-
const executionTime = Date.now() - startTime;
|
|
187
|
-
|
|
188
|
-
await this.auditTrail.logOperation({
|
|
189
|
-
operationId: `${operation}-${tenantId}-${Date.now()}-error`,
|
|
190
|
-
tenantId,
|
|
191
|
-
operation: `${operation}_error`,
|
|
192
|
-
data: {
|
|
193
|
-
error: error instanceof Error ? error.message : String(error),
|
|
194
|
-
executionTime,
|
|
195
|
-
},
|
|
196
|
-
timestamp: new Date(),
|
|
197
|
-
success: false,
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
throw error;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* Configure security rules for tenant
|
|
206
|
-
*/
|
|
207
|
-
private async configureSecurityRules(
|
|
208
|
-
app: admin.app.App,
|
|
209
|
-
config: TenantConfig
|
|
210
|
-
): Promise<void> {
|
|
211
|
-
// Configure Firestore security rules based on profile
|
|
212
|
-
const db = app.firestore();
|
|
213
|
-
|
|
214
|
-
// Tenant-isolated rules
|
|
215
|
-
const rules = this.generateSecurityRules(config);
|
|
216
|
-
|
|
217
|
-
// Apply security configuration
|
|
218
|
-
// Note: In production, this would be set via Firebase console or API
|
|
219
|
-
await this.auditTrail.logOperation({
|
|
220
|
-
operationId: `security-${config.tenantId}-${Date.now()}`,
|
|
221
|
-
tenantId: config.tenantId,
|
|
222
|
-
operation: "security_config",
|
|
223
|
-
data: { securityLevel: config.securityProfile },
|
|
224
|
-
timestamp: new Date(),
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* Generate security rules based on profile
|
|
230
|
-
*/
|
|
231
|
-
private generateSecurityRules(config: TenantConfig): string {
|
|
232
|
-
switch (config.securityProfile) {
|
|
233
|
-
case "ultra-secure":
|
|
234
|
-
return `
|
|
235
|
-
rules_version = '2';
|
|
236
|
-
service cloud.firestore {
|
|
237
|
-
match /databases/{database}/documents {
|
|
238
|
-
match /{document=**} {
|
|
239
|
-
allow read, write: if false;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
`;
|
|
244
|
-
case "tenant-isolated":
|
|
245
|
-
return `
|
|
246
|
-
rules_version = '2';
|
|
247
|
-
service cloud.firestore {
|
|
248
|
-
match /databases/{database}/documents {
|
|
249
|
-
match /tenants/${config.tenantId}/{document=**} {
|
|
250
|
-
allow read, write: if request.auth.uid != null;
|
|
251
|
-
}
|
|
252
|
-
match /{document=**} {
|
|
253
|
-
allow read, write: if false;
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
`;
|
|
258
|
-
default:
|
|
259
|
-
throw new Error(`Unknown security profile: ${config.securityProfile}`);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* Verify LGPD/GDPR compliance for tenant
|
|
265
|
-
*/
|
|
266
|
-
private async verifyCompliance(config: TenantConfig): Promise<{
|
|
267
|
-
lgpd: boolean;
|
|
268
|
-
gdpr: boolean;
|
|
269
|
-
}> {
|
|
270
|
-
let lgpd = false;
|
|
271
|
-
let gdpr = false;
|
|
272
|
-
|
|
273
|
-
if (config.lgpdEnabled) {
|
|
274
|
-
lgpd = await this.lgpdCompliance.verifyCompliance({
|
|
275
|
-
tenantId: config.tenantId,
|
|
276
|
-
dataConsent: true,
|
|
277
|
-
dataAnonymization: true,
|
|
278
|
-
dataRetentionDays: config.dataRetentionDays,
|
|
279
|
-
brazilianDataResidency: true,
|
|
280
|
-
rightToDelete: true,
|
|
281
|
-
dataOwnerRights: true,
|
|
282
|
-
automaticDeletion: true,
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
if (config.gdprEnabled) {
|
|
287
|
-
gdpr = await this.gdprCompliance.verifyCompliance({
|
|
288
|
-
tenantId: config.tenantId,
|
|
289
|
-
dataAnonymization: true,
|
|
290
|
-
consentManagement: true,
|
|
291
|
-
rightToBeForgotten: true,
|
|
292
|
-
dataPortability: true,
|
|
293
|
-
dataRetentionDays: config.dataRetentionDays,
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
return { lgpd, gdpr };
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
/**
|
|
301
|
-
* Calculate security score based on configuration
|
|
302
|
-
*/
|
|
303
|
-
private calculateSecurityScore(config: TenantConfig): number {
|
|
304
|
-
let score = 5.0; // Base score
|
|
305
|
-
|
|
306
|
-
// Multi-tenant isolation
|
|
307
|
-
if (this.tenants.has(config.tenantId)) {
|
|
308
|
-
score += 1.0;
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
// Security profile
|
|
312
|
-
switch (config.securityProfile) {
|
|
313
|
-
case "ultra-secure":
|
|
314
|
-
score += 2.0;
|
|
315
|
-
break;
|
|
316
|
-
case "tenant-isolated":
|
|
317
|
-
score += 1.5;
|
|
318
|
-
break;
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
// Compliance features
|
|
322
|
-
if (config.lgpdEnabled) {
|
|
323
|
-
score += 0.5;
|
|
324
|
-
}
|
|
325
|
-
if (config.gdprEnabled) {
|
|
326
|
-
score += 0.5;
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
// Audit trail
|
|
330
|
-
if (runtimeConfig.auditEnabled) {
|
|
331
|
-
score += 1.0;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
// Memory limit enforcement (1MB para multi-tenant)
|
|
335
|
-
const memoryLimit = runtimeConfig.memoryLimit;
|
|
336
|
-
if (memoryLimit <= 1) {
|
|
337
|
-
score += 0.5;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
return Math.min(score, 10.0); // Máximo 10.0
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* Validate tenant configuration
|
|
345
|
-
*/
|
|
346
|
-
private validateTenantConfig(config: TenantConfig): void {
|
|
347
|
-
if (!config.tenantId || config.tenantId.length < 3) {
|
|
348
|
-
throw new Error("Invalid tenant ID - must be at least 3 characters");
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
if (!config.projectId) {
|
|
352
|
-
throw new Error("Project ID is required");
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
if (!config.securityProfile) {
|
|
356
|
-
config.securityProfile = "tenant-isolated";
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
if (!config.dataRetentionDays) {
|
|
360
|
-
config.dataRetentionDays = 365; // 1 ano padrão LGPD
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
if (config.dataRetentionDays < 90) {
|
|
364
|
-
throw new Error("Data retention minimum 90 days for LGPD compliance");
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
/**
|
|
369
|
-
* Sanitize data for audit trail
|
|
370
|
-
*/
|
|
371
|
-
private sanitizeForAudit(data: any): any {
|
|
372
|
-
return JSON.parse(
|
|
373
|
-
JSON.stringify(data, (key, value) => {
|
|
374
|
-
// Remove sensitive information
|
|
375
|
-
if (
|
|
376
|
-
key.includes("password") ||
|
|
377
|
-
key.includes("secret") ||
|
|
378
|
-
key.includes("key")
|
|
379
|
-
) {
|
|
380
|
-
return "[REDACTED]";
|
|
381
|
-
}
|
|
382
|
-
return value;
|
|
383
|
-
})
|
|
384
|
-
);
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
/**
|
|
388
|
-
* Get all active tenants
|
|
389
|
-
*/
|
|
390
|
-
public getActiveTenants(): string[] {
|
|
391
|
-
return Array.from(this.tenants.keys());
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
/**
|
|
395
|
-
* Get statistics for all tenants
|
|
396
|
-
*/
|
|
397
|
-
public async getTenantStats(): Promise<Map<string, TenantIsolationResult>> {
|
|
398
|
-
const stats = new Map<string, TenantIsolationResult>();
|
|
399
|
-
|
|
400
|
-
for (const tenantId of this.tenants.keys()) {
|
|
401
|
-
// Simulate getting stats (in real implementation, would query actual metrics)
|
|
402
|
-
const mockStats: TenantIsolationResult = {
|
|
403
|
-
success: true,
|
|
404
|
-
tenantId,
|
|
405
|
-
securityScore: 9.5, // Target 9.5/10
|
|
406
|
-
auditHash: "SHA256-" + Math.random().toString(36),
|
|
407
|
-
executionTime: 95, // Target <100ms
|
|
408
|
-
complianceStatus: {
|
|
409
|
-
lgpd: true,
|
|
410
|
-
gdpr: true,
|
|
411
|
-
},
|
|
412
|
-
};
|
|
413
|
-
|
|
414
|
-
stats.set(tenantId, mockStats);
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
return stats;
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
/**
|
|
421
|
-
* Safely remove tenant
|
|
422
|
-
*/
|
|
423
|
-
public async removeTenant(tenantId: string): Promise<void> {
|
|
424
|
-
if (!this.tenants.has(tenantId)) {
|
|
425
|
-
throw new Error(`Tenant ${tenantId} not found`);
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
const app = this.tenants.get(tenantId)!;
|
|
429
|
-
|
|
430
|
-
// Log removal
|
|
431
|
-
await this.auditTrail.logOperation({
|
|
432
|
-
operationId: `remove-${tenantId}-${Date.now()}`,
|
|
433
|
-
tenantId,
|
|
434
|
-
operation: "tenant_removal",
|
|
435
|
-
data: { reason: "admin_removal" },
|
|
436
|
-
timestamp: new Date(),
|
|
437
|
-
});
|
|
438
|
-
|
|
439
|
-
// Delete tenant app
|
|
440
|
-
await app.delete();
|
|
441
|
-
this.tenants.delete(tenantId);
|
|
442
|
-
}
|
|
443
|
-
}
|