@gsep/core 0.8.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -12
- package/dist/{PGA.d.ts → GSEP.d.ts} +120 -8
- package/dist/GSEP.d.ts.map +1 -0
- package/dist/{PGA.js → GSEP.js} +1248 -46
- package/dist/GSEP.js.map +1 -0
- package/dist/adapters/langchain.d.ts +52 -0
- package/dist/adapters/langchain.d.ts.map +1 -0
- package/dist/adapters/langchain.js +89 -0
- package/dist/adapters/langchain.js.map +1 -0
- package/dist/adapters/openclaw-plugin.d.ts +42 -0
- package/dist/adapters/openclaw-plugin.d.ts.map +1 -0
- package/dist/adapters/openclaw-plugin.js +149 -0
- package/dist/adapters/openclaw-plugin.js.map +1 -0
- package/dist/adapters/vercel-ai.d.ts +74 -0
- package/dist/adapters/vercel-ai.d.ts.map +1 -0
- package/dist/adapters/vercel-ai.js +151 -0
- package/dist/adapters/vercel-ai.js.map +1 -0
- package/dist/advanced-ai/EnhancedSelfModel.js +2 -2
- package/dist/advanced-ai/EnhancedSelfModel.js.map +1 -1
- package/dist/advanced-ai/ModelRouter.js.map +1 -1
- package/dist/auto.d.ts +6 -0
- package/dist/auto.d.ts.map +1 -0
- package/dist/auto.js +197 -0
- package/dist/auto.js.map +1 -0
- package/dist/core/CoherenceValidator.d.ts +25 -0
- package/dist/core/CoherenceValidator.d.ts.map +1 -0
- package/dist/core/CoherenceValidator.js +182 -0
- package/dist/core/CoherenceValidator.js.map +1 -0
- package/dist/core/ContextMemory.d.ts.map +1 -1
- package/dist/core/ContextMemory.js +1 -1
- package/dist/core/ContextMemory.js.map +1 -1
- package/dist/core/DNAProfile.d.ts +5 -1
- package/dist/core/DNAProfile.d.ts.map +1 -1
- package/dist/core/DNAProfile.js +14 -1
- package/dist/core/DNAProfile.js.map +1 -1
- package/dist/core/GSEPIdentitySection.d.ts.map +1 -1
- package/dist/core/GSEPIdentitySection.js +12 -3
- package/dist/core/GSEPIdentitySection.js.map +1 -1
- package/dist/core/GenomeKernel.d.ts.map +1 -1
- package/dist/core/GenomeKernel.js +3 -0
- package/dist/core/GenomeKernel.js.map +1 -1
- package/dist/core/GenomeManager.js +1 -1
- package/dist/core/GenomeManager.js.map +1 -1
- package/dist/core/ProactiveSuggestions.js +1 -1
- package/dist/core/ProactiveSuggestions.js.map +1 -1
- package/dist/dashboard/DashboardServer.d.ts +64 -0
- package/dist/dashboard/DashboardServer.d.ts.map +1 -0
- package/dist/dashboard/DashboardServer.js +409 -0
- package/dist/dashboard/DashboardServer.js.map +1 -0
- package/dist/dashboard/DashboardToken.d.ts +16 -0
- package/dist/dashboard/DashboardToken.d.ts.map +1 -0
- package/dist/dashboard/DashboardToken.js +54 -0
- package/dist/dashboard/DashboardToken.js.map +1 -0
- package/dist/dashboard/dashboard.html +2731 -0
- package/dist/dashboard/index.d.ts +3 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +3 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/evaluation/BenchmarkSuites.d.ts +2 -2
- package/dist/evaluation/BenchmarkSuites.d.ts.map +1 -1
- package/dist/evaluation/BenchmarkSuites.js +6 -6
- package/dist/evaluation/BenchmarkSuites.js.map +1 -1
- package/dist/evaluation/ConstitutionalGate.d.ts +18 -0
- package/dist/evaluation/ConstitutionalGate.d.ts.map +1 -0
- package/dist/evaluation/ConstitutionalGate.js +149 -0
- package/dist/evaluation/ConstitutionalGate.js.map +1 -0
- package/dist/evaluation/Evaluator.d.ts +4 -4
- package/dist/evaluation/Evaluator.d.ts.map +1 -1
- package/dist/evaluation/Evaluator.js +27 -27
- package/dist/evaluation/Evaluator.js.map +1 -1
- package/dist/evaluation/EvolutionGuardrails.d.ts +3 -1
- package/dist/evaluation/EvolutionGuardrails.d.ts.map +1 -1
- package/dist/evaluation/EvolutionGuardrails.js +29 -11
- package/dist/evaluation/EvolutionGuardrails.js.map +1 -1
- package/dist/evolution/MutationOperator.d.ts +19 -6
- package/dist/evolution/MutationOperator.d.ts.map +1 -1
- package/dist/evolution/MutationOperator.js +264 -9
- package/dist/evolution/MutationOperator.js.map +1 -1
- package/dist/evolution/boost/operators/BreakthroughOperator.d.ts +1 -1
- package/dist/evolution/boost/operators/BreakthroughOperator.d.ts.map +1 -1
- package/dist/evolution/boost/operators/BreakthroughOperator.js.map +1 -1
- package/dist/evolution/boost/operators/CrossoverMutationOperator.d.ts +1 -1
- package/dist/evolution/boost/operators/CrossoverMutationOperator.d.ts.map +1 -1
- package/dist/evolution/boost/operators/CrossoverMutationOperator.js.map +1 -1
- package/dist/evolution/boost/operators/PatternExtractionOperator.d.ts +1 -1
- package/dist/evolution/boost/operators/PatternExtractionOperator.d.ts.map +1 -1
- package/dist/evolution/boost/operators/PatternExtractionOperator.js.map +1 -1
- package/dist/evolution/boost/operators/SemanticRestructuringOperator.d.ts +1 -1
- package/dist/evolution/boost/operators/SemanticRestructuringOperator.d.ts.map +1 -1
- package/dist/evolution/boost/operators/SemanticRestructuringOperator.js.map +1 -1
- package/dist/firewall/AnomalyDetector.d.ts +42 -0
- package/dist/firewall/AnomalyDetector.d.ts.map +1 -0
- package/dist/firewall/AnomalyDetector.js +181 -0
- package/dist/firewall/AnomalyDetector.js.map +1 -0
- package/dist/firewall/ContentFirewall.d.ts +5 -0
- package/dist/firewall/ContentFirewall.d.ts.map +1 -1
- package/dist/firewall/ContentFirewall.js +5 -0
- package/dist/firewall/ContentFirewall.js.map +1 -1
- package/dist/firewall/PurposeLock.d.ts +41 -0
- package/dist/firewall/PurposeLock.d.ts.map +1 -0
- package/dist/firewall/PurposeLock.js +199 -0
- package/dist/firewall/PurposeLock.js.map +1 -0
- package/dist/gene-bank/CognitiveGene.d.ts +118 -118
- package/dist/gene-bank/{PGAIntegration.d.ts → GSEPIntegration.d.ts} +10 -10
- package/dist/gene-bank/GSEPIntegration.d.ts.map +1 -0
- package/dist/gene-bank/{PGAIntegration.js → GSEPIntegration.js} +6 -6
- package/dist/gene-bank/GSEPIntegration.js.map +1 -0
- package/dist/gene-bank/GeneAdopter.d.ts +6 -6
- package/dist/gene-bank/GeneAdopter.d.ts.map +1 -1
- package/dist/gene-bank/GeneAdopter.js +2 -2
- package/dist/gene-bank/GeneAdopter.js.map +1 -1
- package/dist/gene-bank/GeneBank.d.ts +13 -9
- package/dist/gene-bank/GeneBank.d.ts.map +1 -1
- package/dist/gene-bank/GeneBank.js +8 -1
- package/dist/gene-bank/GeneBank.js.map +1 -1
- package/dist/gene-bank/GeneExtractor.d.ts +7 -7
- package/dist/gene-bank/GeneExtractor.d.ts.map +1 -1
- package/dist/gene-bank/GeneExtractor.js +1 -1
- package/dist/gene-bank/GeneExtractor.js.map +1 -1
- package/dist/gene-bank/GeneMatcher.d.ts +1 -1
- package/dist/gene-bank/GeneMatcher.d.ts.map +1 -1
- package/dist/gene-bank/MarketplaceClient.d.ts +17 -1
- package/dist/gene-bank/MarketplaceClient.d.ts.map +1 -1
- package/dist/gene-bank/MarketplaceClient.js +106 -35
- package/dist/gene-bank/MarketplaceClient.js.map +1 -1
- package/dist/gene-bank/MarketplaceMapper.d.ts +7 -0
- package/dist/gene-bank/MarketplaceMapper.d.ts.map +1 -0
- package/dist/gene-bank/MarketplaceMapper.js +95 -0
- package/dist/gene-bank/MarketplaceMapper.js.map +1 -0
- package/dist/gene-bank/MarketplaceTypes.d.ts +121 -0
- package/dist/gene-bank/MarketplaceTypes.d.ts.map +1 -0
- package/dist/gene-bank/MarketplaceTypes.js +2 -0
- package/dist/gene-bank/MarketplaceTypes.js.map +1 -0
- package/dist/gene-bank/SandboxTester.d.ts +3 -3
- package/dist/gene-bank/SandboxTester.d.ts.map +1 -1
- package/dist/gene-bank/adapters/InMemoryGeneStorage.d.ts +3 -3
- package/dist/gene-bank/adapters/InMemoryGeneStorage.d.ts.map +1 -1
- package/dist/gene-bank/adapters/PostgresGeneStorage.d.ts +4 -4
- package/dist/gene-bank/adapters/PostgresGeneStorage.d.ts.map +1 -1
- package/dist/gene-bank/adapters/PostgresGeneStorage.js.map +1 -1
- package/dist/gene-bank/adapters/SQLiteGeneStorage.d.ts +28 -0
- package/dist/gene-bank/adapters/SQLiteGeneStorage.d.ts.map +1 -0
- package/dist/gene-bank/adapters/SQLiteGeneStorage.js +158 -0
- package/dist/gene-bank/adapters/SQLiteGeneStorage.js.map +1 -0
- package/dist/gene-bank/index.d.ts +10 -7
- package/dist/gene-bank/index.d.ts.map +1 -1
- package/dist/gene-bank/index.js +8 -7
- package/dist/gene-bank/index.js.map +1 -1
- package/dist/immune/BehavioralImmuneSystem.d.ts +6 -0
- package/dist/immune/BehavioralImmuneSystem.d.ts.map +1 -1
- package/dist/immune/BehavioralImmuneSystem.js +6 -0
- package/dist/immune/BehavioralImmuneSystem.js.map +1 -1
- package/dist/index.d.ts +44 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -4
- package/dist/index.js.map +1 -1
- package/dist/memory/LayeredMemory.d.ts +1 -1
- package/dist/memory/LayeredMemory.d.ts.map +1 -1
- package/dist/memory/LayeredMemory.js.map +1 -1
- package/dist/middleware/GSEPMiddleware.d.ts +57 -0
- package/dist/middleware/GSEPMiddleware.d.ts.map +1 -0
- package/dist/middleware/GSEPMiddleware.js +91 -0
- package/dist/middleware/GSEPMiddleware.js.map +1 -0
- package/dist/middleware/RuntimeDetector.d.ts +10 -0
- package/dist/middleware/RuntimeDetector.d.ts.map +1 -0
- package/dist/middleware/RuntimeDetector.js +70 -0
- package/dist/middleware/RuntimeDetector.js.map +1 -0
- package/dist/middleware/ServerlessAdapter.d.ts +23 -0
- package/dist/middleware/ServerlessAdapter.d.ts.map +1 -0
- package/dist/middleware/ServerlessAdapter.js +77 -0
- package/dist/middleware/ServerlessAdapter.js.map +1 -0
- package/dist/monitoring/AlertWebhooks.d.ts +17 -0
- package/dist/monitoring/AlertWebhooks.d.ts.map +1 -1
- package/dist/monitoring/AlertWebhooks.js.map +1 -1
- package/dist/monitoring/WeeklyReportGenerator.d.ts +73 -0
- package/dist/monitoring/WeeklyReportGenerator.d.ts.map +1 -0
- package/dist/monitoring/WeeklyReportGenerator.js +148 -0
- package/dist/monitoring/WeeklyReportGenerator.js.map +1 -0
- package/dist/rag/RAGEngine.d.ts +1 -1
- package/dist/rag/RAGEngine.d.ts.map +1 -1
- package/dist/rag/VectorStoreAdapter.d.ts +2 -2
- package/dist/rag/VectorStoreAdapter.d.ts.map +1 -1
- package/dist/rag/VectorStoreAdapter.js.map +1 -1
- package/dist/realtime/EventEmitter.d.ts +110 -17
- package/dist/realtime/EventEmitter.d.ts.map +1 -1
- package/dist/realtime/EventEmitter.js +3 -4
- package/dist/realtime/EventEmitter.js.map +1 -1
- package/dist/security/CapabilityBroker.d.ts +41 -0
- package/dist/security/CapabilityBroker.d.ts.map +1 -0
- package/dist/security/CapabilityBroker.js +125 -0
- package/dist/security/CapabilityBroker.js.map +1 -0
- package/dist/security/CommandExecutionGuard.d.ts +47 -0
- package/dist/security/CommandExecutionGuard.d.ts.map +1 -0
- package/dist/security/CommandExecutionGuard.js +175 -0
- package/dist/security/CommandExecutionGuard.js.map +1 -0
- package/dist/security/ComplianceExporter.d.ts +32 -0
- package/dist/security/ComplianceExporter.d.ts.map +1 -0
- package/dist/security/ComplianceExporter.js +129 -0
- package/dist/security/ComplianceExporter.js.map +1 -0
- package/dist/security/DataAccessTracker.d.ts +38 -0
- package/dist/security/DataAccessTracker.d.ts.map +1 -0
- package/dist/security/DataAccessTracker.js +71 -0
- package/dist/security/DataAccessTracker.js.map +1 -0
- package/dist/security/DataClassifier.d.ts +14 -0
- package/dist/security/DataClassifier.d.ts.map +1 -0
- package/dist/security/DataClassifier.js +146 -0
- package/dist/security/DataClassifier.js.map +1 -0
- package/dist/security/EncryptedConfigStore.d.ts +21 -0
- package/dist/security/EncryptedConfigStore.d.ts.map +1 -0
- package/dist/security/EncryptedConfigStore.js +119 -0
- package/dist/security/EncryptedConfigStore.js.map +1 -0
- package/dist/security/EnterprisePolicyEngine.d.ts +90 -0
- package/dist/security/EnterprisePolicyEngine.d.ts.map +1 -0
- package/dist/security/EnterprisePolicyEngine.js +240 -0
- package/dist/security/EnterprisePolicyEngine.js.map +1 -0
- package/dist/security/FileSystemBoundary.d.ts +33 -0
- package/dist/security/FileSystemBoundary.d.ts.map +1 -0
- package/dist/security/FileSystemBoundary.js +94 -0
- package/dist/security/FileSystemBoundary.js.map +1 -0
- package/dist/security/GDPREngine.d.ts +65 -0
- package/dist/security/GDPREngine.d.ts.map +1 -0
- package/dist/security/GDPREngine.js +180 -0
- package/dist/security/GDPREngine.js.map +1 -0
- package/dist/security/GenomeSecurityBridge.d.ts +47 -0
- package/dist/security/GenomeSecurityBridge.d.ts.map +1 -0
- package/dist/security/GenomeSecurityBridge.js +157 -0
- package/dist/security/GenomeSecurityBridge.js.map +1 -0
- package/dist/security/KeyHierarchy.d.ts +23 -0
- package/dist/security/KeyHierarchy.d.ts.map +1 -0
- package/dist/security/KeyHierarchy.js +78 -0
- package/dist/security/KeyHierarchy.js.map +1 -0
- package/dist/security/KeychainAdapter.d.ts +19 -0
- package/dist/security/KeychainAdapter.d.ts.map +1 -0
- package/dist/security/KeychainAdapter.js +104 -0
- package/dist/security/KeychainAdapter.js.map +1 -0
- package/dist/security/LLMProxyLayer.d.ts +63 -0
- package/dist/security/LLMProxyLayer.d.ts.map +1 -0
- package/dist/security/LLMProxyLayer.js +148 -0
- package/dist/security/LLMProxyLayer.js.map +1 -0
- package/dist/security/MFAProvider.d.ts +35 -0
- package/dist/security/MFAProvider.d.ts.map +1 -0
- package/dist/security/MFAProvider.js +174 -0
- package/dist/security/MFAProvider.js.map +1 -0
- package/dist/security/NetworkAuditLogger.d.ts +35 -0
- package/dist/security/NetworkAuditLogger.d.ts.map +1 -0
- package/dist/security/NetworkAuditLogger.js +99 -0
- package/dist/security/NetworkAuditLogger.js.map +1 -0
- package/dist/security/OutboundAllowlist.d.ts +33 -0
- package/dist/security/OutboundAllowlist.d.ts.map +1 -0
- package/dist/security/OutboundAllowlist.js +112 -0
- package/dist/security/OutboundAllowlist.js.map +1 -0
- package/dist/security/PIIRedactionEngine.d.ts +40 -0
- package/dist/security/PIIRedactionEngine.d.ts.map +1 -0
- package/dist/security/PIIRedactionEngine.js +232 -0
- package/dist/security/PIIRedactionEngine.js.map +1 -0
- package/dist/security/RBACEngine.d.ts +44 -0
- package/dist/security/RBACEngine.d.ts.map +1 -0
- package/dist/security/RBACEngine.js +209 -0
- package/dist/security/RBACEngine.js.map +1 -0
- package/dist/security/SOC2Controls.d.ts +37 -0
- package/dist/security/SOC2Controls.d.ts.map +1 -0
- package/dist/security/SOC2Controls.js +151 -0
- package/dist/security/SOC2Controls.js.map +1 -0
- package/dist/security/SecretRotationEngine.d.ts +46 -0
- package/dist/security/SecretRotationEngine.d.ts.map +1 -0
- package/dist/security/SecretRotationEngine.js +102 -0
- package/dist/security/SecretRotationEngine.js.map +1 -0
- package/dist/security/SecretsMigrator.d.ts +28 -0
- package/dist/security/SecretsMigrator.d.ts.map +1 -0
- package/dist/security/SecretsMigrator.js +170 -0
- package/dist/security/SecretsMigrator.js.map +1 -0
- package/dist/security/SecurityEventBus.d.ts +48 -0
- package/dist/security/SecurityEventBus.d.ts.map +1 -0
- package/dist/security/SecurityEventBus.js +105 -0
- package/dist/security/SecurityEventBus.js.map +1 -0
- package/dist/security/SecurityPresets.d.ts +42 -0
- package/dist/security/SecurityPresets.d.ts.map +1 -0
- package/dist/security/SecurityPresets.js +162 -0
- package/dist/security/SecurityPresets.js.map +1 -0
- package/dist/security/SkillManifest.d.ts +34 -0
- package/dist/security/SkillManifest.d.ts.map +1 -0
- package/dist/security/SkillManifest.js +91 -0
- package/dist/security/SkillManifest.js.map +1 -0
- package/dist/security/SkillSigner.d.ts +22 -0
- package/dist/security/SkillSigner.d.ts.map +1 -0
- package/dist/security/SkillSigner.js +80 -0
- package/dist/security/SkillSigner.js.map +1 -0
- package/dist/security/TamperProofAuditLog.d.ts +58 -0
- package/dist/security/TamperProofAuditLog.d.ts.map +1 -0
- package/dist/security/TamperProofAuditLog.js +214 -0
- package/dist/security/TamperProofAuditLog.js.map +1 -0
- package/dist/security/index.d.ts +27 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +27 -0
- package/dist/security/index.js.map +1 -0
- package/dist/skills/ProactiveEngine.d.ts +55 -0
- package/dist/skills/ProactiveEngine.d.ts.map +1 -0
- package/dist/skills/ProactiveEngine.js +201 -0
- package/dist/skills/ProactiveEngine.js.map +1 -0
- package/dist/skills/SkillExecutor.d.ts +21 -0
- package/dist/skills/SkillExecutor.d.ts.map +1 -0
- package/dist/skills/SkillExecutor.js +131 -0
- package/dist/skills/SkillExecutor.js.map +1 -0
- package/dist/skills/SkillRegistry.d.ts +47 -0
- package/dist/skills/SkillRegistry.d.ts.map +1 -0
- package/dist/skills/SkillRegistry.js +94 -0
- package/dist/skills/SkillRegistry.js.map +1 -0
- package/dist/skills/SkillRouter.d.ts +30 -0
- package/dist/skills/SkillRouter.d.ts.map +1 -0
- package/dist/skills/SkillRouter.js +113 -0
- package/dist/skills/SkillRouter.js.map +1 -0
- package/dist/skills/index.d.ts +9 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +5 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/types/GenomeV2.d.ts +12 -0
- package/dist/types/GenomeV2.d.ts.map +1 -1
- package/dist/types/index.d.ts +19 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/wrap/FileStorageAdapter.d.ts +113 -0
- package/dist/wrap/FileStorageAdapter.d.ts.map +1 -0
- package/dist/wrap/FileStorageAdapter.js +239 -0
- package/dist/wrap/FileStorageAdapter.js.map +1 -0
- package/dist/wrap/SQLiteStorageAdapter.d.ts +96 -0
- package/dist/wrap/SQLiteStorageAdapter.d.ts.map +1 -0
- package/dist/wrap/SQLiteStorageAdapter.js +251 -0
- package/dist/wrap/SQLiteStorageAdapter.js.map +1 -0
- package/dist/wrap/WrappedAgent.d.ts +2 -2
- package/dist/wrap/WrappedAgent.d.ts.map +1 -1
- package/dist/wrap/WrappedAgent.js +7 -7
- package/dist/wrap/WrappedAgent.js.map +1 -1
- package/dist/wrap.d.ts +39 -0
- package/dist/wrap.d.ts.map +1 -0
- package/dist/wrap.js +96 -0
- package/dist/wrap.js.map +1 -0
- package/package.json +34 -7
- package/dist/PGA.d.ts.map +0 -1
- package/dist/PGA.js.map +0 -1
- package/dist/evolution/PromotionGate.d.ts +0 -45
- package/dist/evolution/PromotionGate.d.ts.map +0 -1
- package/dist/evolution/PromotionGate.js +0 -248
- package/dist/evolution/PromotionGate.js.map +0 -1
- package/dist/gene-bank/PGAIntegration.d.ts.map +0 -1
- package/dist/gene-bank/PGAIntegration.js.map +0 -1
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
const PRIVATE_IP_PATTERNS = [
|
|
2
|
+
/^10\./,
|
|
3
|
+
/^172\.(1[6-9]|2\d|3[01])\./,
|
|
4
|
+
/^192\.168\./,
|
|
5
|
+
/^127\./,
|
|
6
|
+
/^169\.254\./,
|
|
7
|
+
/^0\./,
|
|
8
|
+
/^::1$/,
|
|
9
|
+
/^fc00:/i,
|
|
10
|
+
/^fe80:/i,
|
|
11
|
+
];
|
|
12
|
+
const PRIVATE_HOSTNAMES = [
|
|
13
|
+
'localhost',
|
|
14
|
+
'localhost.localdomain',
|
|
15
|
+
'metadata.google.internal',
|
|
16
|
+
'instance-data.ec2.internal',
|
|
17
|
+
];
|
|
18
|
+
export class OutboundAllowlist {
|
|
19
|
+
eventBus;
|
|
20
|
+
allowedDomains;
|
|
21
|
+
blockPrivateNetworks;
|
|
22
|
+
mode;
|
|
23
|
+
stats = { totalChecks: 0, allowed: 0, blocked: 0 };
|
|
24
|
+
constructor(eventBus, config) {
|
|
25
|
+
this.eventBus = eventBus;
|
|
26
|
+
this.allowedDomains = config.allowedDomains;
|
|
27
|
+
this.blockPrivateNetworks = config.blockPrivateNetworks;
|
|
28
|
+
this.mode = config.mode;
|
|
29
|
+
}
|
|
30
|
+
check(hostname, skillId) {
|
|
31
|
+
this.stats.totalChecks++;
|
|
32
|
+
if (this.mode === 'unrestricted') {
|
|
33
|
+
this.stats.allowed++;
|
|
34
|
+
return { allowed: true, hostname };
|
|
35
|
+
}
|
|
36
|
+
if (this.blockPrivateNetworks && this.isPrivateNetwork(hostname)) {
|
|
37
|
+
this.stats.blocked++;
|
|
38
|
+
this.eventBus.emitDeny('security:net-blocked', 6, { type: 'outbound', id: hostname, detail: 'Private network blocked (SSRF prevention)' }, 'high', { skillId });
|
|
39
|
+
return { allowed: false, reason: 'Private network access blocked', hostname };
|
|
40
|
+
}
|
|
41
|
+
if (this.mode === 'strict' && !this.isDomainAllowed(hostname)) {
|
|
42
|
+
this.stats.blocked++;
|
|
43
|
+
this.eventBus.emitDeny('security:net-blocked', 6, { type: 'outbound', id: hostname, detail: 'Domain not in allowlist' }, 'warning', { skillId });
|
|
44
|
+
return { allowed: false, reason: `Domain "${hostname}" not in allowlist`, hostname };
|
|
45
|
+
}
|
|
46
|
+
if (this.mode === 'broad' && this.isSuspiciousDomain(hostname)) {
|
|
47
|
+
this.stats.blocked++;
|
|
48
|
+
this.eventBus.emitDeny('security:net-blocked', 6, { type: 'outbound', id: hostname, detail: 'Suspicious domain blocked' }, 'warning', { skillId });
|
|
49
|
+
return { allowed: false, reason: `Suspicious domain blocked: ${hostname}`, hostname };
|
|
50
|
+
}
|
|
51
|
+
this.stats.allowed++;
|
|
52
|
+
this.eventBus.emitAllow('security:net-allowed', 6, {
|
|
53
|
+
type: 'outbound',
|
|
54
|
+
id: hostname,
|
|
55
|
+
}, { skillId });
|
|
56
|
+
return { allowed: true, hostname };
|
|
57
|
+
}
|
|
58
|
+
checkURL(url, skillId) {
|
|
59
|
+
try {
|
|
60
|
+
const parsed = new URL(url);
|
|
61
|
+
return this.check(parsed.hostname, skillId);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return { allowed: false, reason: 'Invalid URL', hostname: url };
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
addDomain(domain) {
|
|
68
|
+
if (!this.allowedDomains.includes(domain)) {
|
|
69
|
+
this.allowedDomains.push(domain);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
removeDomain(domain) {
|
|
73
|
+
const idx = this.allowedDomains.indexOf(domain);
|
|
74
|
+
if (idx === -1)
|
|
75
|
+
return false;
|
|
76
|
+
this.allowedDomains.splice(idx, 1);
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
getDomains() {
|
|
80
|
+
return [...this.allowedDomains];
|
|
81
|
+
}
|
|
82
|
+
getStats() {
|
|
83
|
+
return { ...this.stats };
|
|
84
|
+
}
|
|
85
|
+
isPrivateNetwork(hostname) {
|
|
86
|
+
if (PRIVATE_HOSTNAMES.includes(hostname.toLowerCase()))
|
|
87
|
+
return true;
|
|
88
|
+
return PRIVATE_IP_PATTERNS.some(p => p.test(hostname));
|
|
89
|
+
}
|
|
90
|
+
isDomainAllowed(hostname) {
|
|
91
|
+
const lower = hostname.toLowerCase();
|
|
92
|
+
return this.allowedDomains.some(pattern => {
|
|
93
|
+
const lowerPattern = pattern.toLowerCase();
|
|
94
|
+
if (lowerPattern.startsWith('*.')) {
|
|
95
|
+
const suffix = lowerPattern.slice(1);
|
|
96
|
+
return lower.endsWith(suffix) || lower === lowerPattern.slice(2);
|
|
97
|
+
}
|
|
98
|
+
return lower === lowerPattern;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
isSuspiciousDomain(hostname) {
|
|
102
|
+
const suspicious = [
|
|
103
|
+
/\.onion$/i,
|
|
104
|
+
/\.i2p$/i,
|
|
105
|
+
/\.bit$/i,
|
|
106
|
+
/^(\d{1,3}\.){3}\d{1,3}$/,
|
|
107
|
+
/webhook|hook|exfil|collect|log|beacon/i,
|
|
108
|
+
];
|
|
109
|
+
return suspicious.some(p => p.test(hostname));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=OutboundAllowlist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OutboundAllowlist.js","sourceRoot":"","sources":["../../src/security/OutboundAllowlist.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export type PIICategory = 'credit-card' | 'ssn' | 'email' | 'phone' | 'iban' | 'api-key' | 'ip-address' | 'passport' | 'national-id';
|
|
2
|
+
export interface PIIMatch {
|
|
3
|
+
category: PIICategory;
|
|
4
|
+
original: string;
|
|
5
|
+
token: string;
|
|
6
|
+
startIndex: number;
|
|
7
|
+
endIndex: number;
|
|
8
|
+
}
|
|
9
|
+
export interface RedactionResult {
|
|
10
|
+
redacted: string;
|
|
11
|
+
matches: PIIMatch[];
|
|
12
|
+
categories: PIICategory[];
|
|
13
|
+
}
|
|
14
|
+
export declare class PIIRedactionEngine {
|
|
15
|
+
private vault;
|
|
16
|
+
private enabledCategories;
|
|
17
|
+
private vaultMaxSize;
|
|
18
|
+
private vaultTTLMs;
|
|
19
|
+
private stats;
|
|
20
|
+
constructor(options?: {
|
|
21
|
+
categories?: PIICategory[];
|
|
22
|
+
vaultMaxSize?: number;
|
|
23
|
+
vaultTTLMs?: number;
|
|
24
|
+
});
|
|
25
|
+
redact(text: string): RedactionResult;
|
|
26
|
+
rehydrate(text: string): string;
|
|
27
|
+
scan(text: string): {
|
|
28
|
+
hasPII: boolean;
|
|
29
|
+
categories: PIICategory[];
|
|
30
|
+
count: number;
|
|
31
|
+
};
|
|
32
|
+
getStats(): typeof this.stats;
|
|
33
|
+
clearVault(): void;
|
|
34
|
+
getVaultSize(): number;
|
|
35
|
+
private generateToken;
|
|
36
|
+
private categoryShort;
|
|
37
|
+
private removeOverlaps;
|
|
38
|
+
private cleanupVault;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=PIIRedactionEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PIIRedactionEngine.d.ts","sourceRoot":"","sources":["../../src/security/PIIRedactionEngine.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,WAAW,GACjB,aAAa,GACb,KAAK,GACL,OAAO,GACP,OAAO,GACP,MAAM,GACN,SAAS,GACT,YAAY,GACZ,UAAU,GACV,aAAa,CAAC;AAEpB,MAAM,WAAW,QAAQ;IACrB,QAAQ,EAAE,WAAW,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,UAAU,EAAE,WAAW,EAAE,CAAC;CAC7B;AAsID,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,KAAK,CAA0F;IACvG,OAAO,CAAC,iBAAiB,CAAmB;IAC5C,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,UAAU,CAAa;IAG/B,OAAO,CAAC,KAAK,CAIX;gBAEU,OAAO,CAAC,EAAE;QAClB,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC;QAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;KACvB;IAYD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe;IA4ErC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAa/B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,WAAW,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAgBjF,QAAQ,IAAI,OAAO,IAAI,CAAC,KAAK;IAO7B,UAAU,IAAI,IAAI;IAOlB,YAAY,IAAI,MAAM;IAMtB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,YAAY;CAmBvB"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
function luhnCheck(num) {
|
|
3
|
+
const digits = num.replace(/\D/g, '');
|
|
4
|
+
if (digits.length < 13 || digits.length > 19)
|
|
5
|
+
return false;
|
|
6
|
+
let sum = 0;
|
|
7
|
+
let alternate = false;
|
|
8
|
+
for (let i = digits.length - 1; i >= 0; i--) {
|
|
9
|
+
let n = parseInt(digits[i], 10);
|
|
10
|
+
if (alternate) {
|
|
11
|
+
n *= 2;
|
|
12
|
+
if (n > 9)
|
|
13
|
+
n -= 9;
|
|
14
|
+
}
|
|
15
|
+
sum += n;
|
|
16
|
+
alternate = !alternate;
|
|
17
|
+
}
|
|
18
|
+
return sum % 10 === 0;
|
|
19
|
+
}
|
|
20
|
+
function isValidIBAN(iban) {
|
|
21
|
+
const cleaned = iban.replace(/\s/g, '').toUpperCase();
|
|
22
|
+
if (cleaned.length < 15 || cleaned.length > 34)
|
|
23
|
+
return false;
|
|
24
|
+
if (!/^[A-Z]{2}\d{2}[A-Z0-9]+$/.test(cleaned))
|
|
25
|
+
return false;
|
|
26
|
+
const rearranged = cleaned.slice(4) + cleaned.slice(0, 4);
|
|
27
|
+
const numeric = rearranged.replace(/[A-Z]/g, ch => String(ch.charCodeAt(0) - 55));
|
|
28
|
+
let remainder = '';
|
|
29
|
+
for (const digit of numeric) {
|
|
30
|
+
remainder += digit;
|
|
31
|
+
const num = parseInt(remainder, 10);
|
|
32
|
+
remainder = String(num % 97);
|
|
33
|
+
}
|
|
34
|
+
return parseInt(remainder, 10) === 1;
|
|
35
|
+
}
|
|
36
|
+
const PII_PATTERNS = [
|
|
37
|
+
{
|
|
38
|
+
category: 'api-key',
|
|
39
|
+
regex: /\b(?:sk-ant-[A-Za-z0-9\-]{20,}|sk-[A-Za-z0-9]{20,}|ghp_[A-Za-z0-9]{36,}|ghs_[A-Za-z0-9]{36,}|glpat-[A-Za-z0-9\-_]{20,}|xox[bpsr]-[A-Za-z0-9\-]{10,}|AKIA[A-Z0-9]{16}|ntn_[A-Za-z0-9]{40,}|whsec_[A-Za-z0-9]{20,})\b/g,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
category: 'iban',
|
|
43
|
+
regex: /\b[A-Z]{2}\d{2}[A-Z0-9]{11,30}\b|\b[A-Z]{2}\d{2}\s?[A-Z0-9]{4}(?:\s?[A-Z0-9]{4}){2,7}(?:\s?[A-Z0-9]{1,4})?\b/g,
|
|
44
|
+
validate: isValidIBAN,
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
category: 'credit-card',
|
|
48
|
+
regex: /\b(?:\d{4}[-\s]?){3}\d{1,4}\b/g,
|
|
49
|
+
validate: (match) => luhnCheck(match.replace(/[-\s]/g, '')),
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
category: 'ssn',
|
|
53
|
+
regex: /\b\d{3}-\d{2}-\d{4}\b/g,
|
|
54
|
+
validate: (match) => {
|
|
55
|
+
const parts = match.split('-');
|
|
56
|
+
const area = parseInt(parts[0], 10);
|
|
57
|
+
return area > 0 && area !== 666 && area < 900;
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
category: 'email',
|
|
62
|
+
regex: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
category: 'phone',
|
|
66
|
+
regex: /\+\d{1,3}[-.\s]?\(?\d{2,4}\)?[-.\s]?\d{3,4}[-.\s]?\d{3,4}\b|\b\(?\d{3}\)?[-.\s]\d{3}[-.\s]\d{4}\b/g,
|
|
67
|
+
validate: (match) => {
|
|
68
|
+
const digits = match.replace(/\D/g, '');
|
|
69
|
+
return digits.length >= 7 && digits.length <= 15;
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
category: 'ip-address',
|
|
74
|
+
regex: /\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b/g,
|
|
75
|
+
validate: (match) => {
|
|
76
|
+
return match !== '0.0.0.0' && match !== '127.0.0.1' && match !== '255.255.255.255';
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
category: 'national-id',
|
|
81
|
+
regex: /\b[CFGHJKLMNPRTVWXYZ0-9]{10}\b/g,
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
category: 'passport',
|
|
85
|
+
regex: /\b[A-Z]{1,2}\d{6,9}\b/g,
|
|
86
|
+
},
|
|
87
|
+
];
|
|
88
|
+
export class PIIRedactionEngine {
|
|
89
|
+
vault = new Map();
|
|
90
|
+
enabledCategories;
|
|
91
|
+
vaultMaxSize = 10_000;
|
|
92
|
+
vaultTTLMs = 3_600_000;
|
|
93
|
+
stats = {
|
|
94
|
+
totalScanned: 0,
|
|
95
|
+
totalRedacted: 0,
|
|
96
|
+
byCategory: {},
|
|
97
|
+
};
|
|
98
|
+
constructor(options) {
|
|
99
|
+
this.enabledCategories = options?.categories
|
|
100
|
+
? new Set(options.categories)
|
|
101
|
+
: new Set(PII_PATTERNS.map(p => p.category));
|
|
102
|
+
if (options?.vaultMaxSize)
|
|
103
|
+
this.vaultMaxSize = options.vaultMaxSize;
|
|
104
|
+
if (options?.vaultTTLMs)
|
|
105
|
+
this.vaultTTLMs = options.vaultTTLMs;
|
|
106
|
+
}
|
|
107
|
+
redact(text) {
|
|
108
|
+
this.stats.totalScanned++;
|
|
109
|
+
const matches = [];
|
|
110
|
+
let redacted = text;
|
|
111
|
+
const allMatches = [];
|
|
112
|
+
for (const pattern of PII_PATTERNS) {
|
|
113
|
+
if (!this.enabledCategories.has(pattern.category))
|
|
114
|
+
continue;
|
|
115
|
+
pattern.regex.lastIndex = 0;
|
|
116
|
+
let match;
|
|
117
|
+
while ((match = pattern.regex.exec(text)) !== null) {
|
|
118
|
+
const value = match[0];
|
|
119
|
+
if (pattern.validate && !pattern.validate(value))
|
|
120
|
+
continue;
|
|
121
|
+
const token = this.generateToken(pattern.category);
|
|
122
|
+
allMatches.push({
|
|
123
|
+
category: pattern.category,
|
|
124
|
+
original: value,
|
|
125
|
+
token,
|
|
126
|
+
startIndex: match.index,
|
|
127
|
+
endIndex: match.index + value.length,
|
|
128
|
+
pattern,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
allMatches.sort((a, b) => b.startIndex - a.startIndex);
|
|
133
|
+
const filtered = this.removeOverlaps(allMatches);
|
|
134
|
+
for (const m of filtered) {
|
|
135
|
+
redacted = redacted.slice(0, m.startIndex) + m.token + redacted.slice(m.endIndex);
|
|
136
|
+
this.vault.set(m.token, {
|
|
137
|
+
original: m.original,
|
|
138
|
+
category: m.category,
|
|
139
|
+
timestamp: Date.now(),
|
|
140
|
+
});
|
|
141
|
+
this.stats.totalRedacted++;
|
|
142
|
+
this.stats.byCategory[m.category] = (this.stats.byCategory[m.category] || 0) + 1;
|
|
143
|
+
matches.push({
|
|
144
|
+
category: m.category,
|
|
145
|
+
original: m.original,
|
|
146
|
+
token: m.token,
|
|
147
|
+
startIndex: m.startIndex,
|
|
148
|
+
endIndex: m.endIndex,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
this.cleanupVault();
|
|
152
|
+
const categories = [...new Set(matches.map(m => m.category))];
|
|
153
|
+
return { redacted, matches: matches.reverse(), categories };
|
|
154
|
+
}
|
|
155
|
+
rehydrate(text) {
|
|
156
|
+
let result = text;
|
|
157
|
+
for (const [token, entry] of this.vault) {
|
|
158
|
+
if (result.includes(token)) {
|
|
159
|
+
result = result.replaceAll(token, entry.original);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
scan(text) {
|
|
165
|
+
const result = this.redact(text);
|
|
166
|
+
for (const match of result.matches) {
|
|
167
|
+
this.vault.delete(match.token);
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
hasPII: result.matches.length > 0,
|
|
171
|
+
categories: result.categories,
|
|
172
|
+
count: result.matches.length,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
getStats() {
|
|
176
|
+
return { ...this.stats };
|
|
177
|
+
}
|
|
178
|
+
clearVault() {
|
|
179
|
+
this.vault.clear();
|
|
180
|
+
}
|
|
181
|
+
getVaultSize() {
|
|
182
|
+
return this.vault.size;
|
|
183
|
+
}
|
|
184
|
+
generateToken(category) {
|
|
185
|
+
const id = randomBytes(2).toString('hex');
|
|
186
|
+
const short = this.categoryShort(category);
|
|
187
|
+
return `[REDACTED:${short}:${id}]`;
|
|
188
|
+
}
|
|
189
|
+
categoryShort(category) {
|
|
190
|
+
const map = {
|
|
191
|
+
'credit-card': 'CC',
|
|
192
|
+
'ssn': 'SSN',
|
|
193
|
+
'email': 'EMAIL',
|
|
194
|
+
'phone': 'PHONE',
|
|
195
|
+
'iban': 'IBAN',
|
|
196
|
+
'api-key': 'KEY',
|
|
197
|
+
'ip-address': 'IP',
|
|
198
|
+
'passport': 'PASS',
|
|
199
|
+
'national-id': 'NID',
|
|
200
|
+
};
|
|
201
|
+
return map[category] || 'PII';
|
|
202
|
+
}
|
|
203
|
+
removeOverlaps(matches) {
|
|
204
|
+
const result = [];
|
|
205
|
+
let lastEnd = Infinity;
|
|
206
|
+
for (const m of matches) {
|
|
207
|
+
if (m.endIndex <= lastEnd) {
|
|
208
|
+
result.push(m);
|
|
209
|
+
lastEnd = m.startIndex;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return result;
|
|
213
|
+
}
|
|
214
|
+
cleanupVault() {
|
|
215
|
+
if (this.vault.size <= this.vaultMaxSize)
|
|
216
|
+
return;
|
|
217
|
+
const now = Date.now();
|
|
218
|
+
for (const [token, entry] of this.vault) {
|
|
219
|
+
if (now - entry.timestamp > this.vaultTTLMs) {
|
|
220
|
+
this.vault.delete(token);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (this.vault.size > this.vaultMaxSize) {
|
|
224
|
+
const entries = [...this.vault.entries()].sort((a, b) => a[1].timestamp - b[1].timestamp);
|
|
225
|
+
const toRemove = entries.slice(0, this.vault.size - this.vaultMaxSize);
|
|
226
|
+
for (const [token] of toRemove) {
|
|
227
|
+
this.vault.delete(token);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=PIIRedactionEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PIIRedactionEngine.js","sourceRoot":"","sources":["../../src/security/PIIRedactionEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { SecurityEventBus } from './SecurityEventBus.js';
|
|
2
|
+
export type RoleName = 'admin' | 'manager' | 'standard' | 'restricted' | 'auditor';
|
|
3
|
+
export type Permission = 'genome:read' | 'genome:write' | 'genome:evolve' | 'genome:delete' | 'skill:invoke:bundled' | 'skill:invoke:installed' | 'skill:invoke:custom' | 'skill:install' | 'skill:uninstall' | 'exec:safe-bin' | 'exec:allowlist' | 'exec:arbitrary' | 'fs:read:workspace' | 'fs:read:home' | 'fs:read:system' | 'fs:write:workspace' | 'fs:write:home' | 'fs:delete' | 'net:outbound:allowlist' | 'net:outbound:any' | 'net:localhost' | 'cred:read' | 'cred:write' | 'cred:rotate' | 'cred:delete' | 'data:public' | 'data:internal' | 'data:confidential' | 'data:restricted' | 'data:pii' | 'data:financial' | 'data:health' | 'admin:users' | 'admin:roles' | 'admin:policies' | 'admin:audit:read' | 'admin:audit:export' | 'admin:security:configure';
|
|
4
|
+
export interface Role {
|
|
5
|
+
name: RoleName | string;
|
|
6
|
+
description: string;
|
|
7
|
+
permissions: Permission[];
|
|
8
|
+
inherits?: RoleName | string;
|
|
9
|
+
rateLimit: number;
|
|
10
|
+
sessionTimeoutMinutes: number;
|
|
11
|
+
}
|
|
12
|
+
export interface UserAssignment {
|
|
13
|
+
userId: string;
|
|
14
|
+
role: RoleName | string;
|
|
15
|
+
assignedAt: Date;
|
|
16
|
+
assignedBy: string;
|
|
17
|
+
expiresAt?: Date;
|
|
18
|
+
}
|
|
19
|
+
export interface AccessCheckResult {
|
|
20
|
+
allowed: boolean;
|
|
21
|
+
role: string;
|
|
22
|
+
permission: Permission;
|
|
23
|
+
reason?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare class RBACEngine {
|
|
26
|
+
private eventBus;
|
|
27
|
+
private roles;
|
|
28
|
+
private assignments;
|
|
29
|
+
private operationCounts;
|
|
30
|
+
constructor(eventBus: SecurityEventBus);
|
|
31
|
+
assignRole(userId: string, roleName: RoleName | string, assignedBy: string, expiresAt?: Date): void;
|
|
32
|
+
revokeRole(userId: string): boolean;
|
|
33
|
+
checkAccess(userId: string, permission: Permission): AccessCheckResult;
|
|
34
|
+
getUserRole(userId: string): Role | null;
|
|
35
|
+
getUserPermissions(userId: string): Permission[];
|
|
36
|
+
registerRole(role: Role): void;
|
|
37
|
+
getRoles(): Role[];
|
|
38
|
+
getAssignments(): UserAssignment[];
|
|
39
|
+
hasRole(userId: string, roleName: string): boolean;
|
|
40
|
+
private resolvePermissions;
|
|
41
|
+
private checkRateLimit;
|
|
42
|
+
private incrementOps;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=RBACEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RBACEngine.d.ts","sourceRoot":"","sources":["../../src/security/RBACEngine.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAIzD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,CAAC;AAEnF,MAAM,MAAM,UAAU,GAEhB,aAAa,GACb,cAAc,GACd,eAAe,GACf,eAAe,GAEf,sBAAsB,GACtB,wBAAwB,GACxB,qBAAqB,GACrB,eAAe,GACf,iBAAiB,GAEjB,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAEhB,mBAAmB,GACnB,cAAc,GACd,gBAAgB,GAChB,oBAAoB,GACpB,eAAe,GACf,WAAW,GAEX,wBAAwB,GACxB,kBAAkB,GAClB,eAAe,GAEf,WAAW,GACX,YAAY,GACZ,aAAa,GACb,aAAa,GAEb,aAAa,GACb,eAAe,GACf,mBAAmB,GACnB,iBAAiB,GACjB,UAAU,GACV,gBAAgB,GAChB,aAAa,GAEb,aAAa,GACb,aAAa,GACb,gBAAgB,GAChB,kBAAkB,GAClB,oBAAoB,GACpB,0BAA0B,CAAC;AAEjC,MAAM,WAAW,IAAI;IACjB,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,EAAE,CAAC;IAE1B,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAE7B,SAAS,EAAE,MAAM,CAAC;IAElB,qBAAqB,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,UAAU,EAAE,IAAI,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAoGD,qBAAa,UAAU;IACnB,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,WAAW,CAA0C;IAC7D,OAAO,CAAC,eAAe,CAAkE;gBAE7E,QAAQ,EAAE,gBAAgB;IActC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI;IA2BnG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAOnC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,iBAAiB;IA6DtE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IASxC,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;IAShD,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAO9B,QAAQ,IAAI,IAAI,EAAE;IAOlB,cAAc,IAAI,cAAc,EAAE;IAOlC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAOlD,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,YAAY;CAMvB"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
const ROLE_ADMIN = {
|
|
2
|
+
name: 'admin',
|
|
3
|
+
description: 'Full system control — can manage users, roles, policies, and all operations',
|
|
4
|
+
permissions: [
|
|
5
|
+
'genome:read', 'genome:write', 'genome:evolve', 'genome:delete',
|
|
6
|
+
'skill:invoke:bundled', 'skill:invoke:installed', 'skill:invoke:custom', 'skill:install', 'skill:uninstall',
|
|
7
|
+
'exec:safe-bin', 'exec:allowlist', 'exec:arbitrary',
|
|
8
|
+
'fs:read:workspace', 'fs:read:home', 'fs:read:system', 'fs:write:workspace', 'fs:write:home', 'fs:delete',
|
|
9
|
+
'net:outbound:allowlist', 'net:outbound:any', 'net:localhost',
|
|
10
|
+
'cred:read', 'cred:write', 'cred:rotate', 'cred:delete',
|
|
11
|
+
'data:public', 'data:internal', 'data:confidential', 'data:restricted', 'data:pii', 'data:financial', 'data:health',
|
|
12
|
+
'admin:users', 'admin:roles', 'admin:policies', 'admin:audit:read', 'admin:audit:export', 'admin:security:configure',
|
|
13
|
+
],
|
|
14
|
+
rateLimit: 0,
|
|
15
|
+
sessionTimeoutMinutes: 480,
|
|
16
|
+
};
|
|
17
|
+
const ROLE_MANAGER = {
|
|
18
|
+
name: 'manager',
|
|
19
|
+
description: 'Team lead — can use all skills, access confidential data, view audit logs',
|
|
20
|
+
inherits: 'standard',
|
|
21
|
+
permissions: [
|
|
22
|
+
'genome:read', 'genome:write', 'genome:evolve',
|
|
23
|
+
'skill:invoke:bundled', 'skill:invoke:installed', 'skill:invoke:custom', 'skill:install',
|
|
24
|
+
'exec:safe-bin', 'exec:allowlist',
|
|
25
|
+
'fs:read:workspace', 'fs:read:home', 'fs:write:workspace', 'fs:write:home',
|
|
26
|
+
'net:outbound:allowlist', 'net:localhost',
|
|
27
|
+
'cred:read', 'cred:write',
|
|
28
|
+
'data:public', 'data:internal', 'data:confidential', 'data:pii',
|
|
29
|
+
'admin:audit:read',
|
|
30
|
+
],
|
|
31
|
+
rateLimit: 500,
|
|
32
|
+
sessionTimeoutMinutes: 480,
|
|
33
|
+
};
|
|
34
|
+
const ROLE_STANDARD = {
|
|
35
|
+
name: 'standard',
|
|
36
|
+
description: 'Regular user — bundled skills, workspace access, no admin',
|
|
37
|
+
permissions: [
|
|
38
|
+
'genome:read',
|
|
39
|
+
'skill:invoke:bundled', 'skill:invoke:installed',
|
|
40
|
+
'exec:safe-bin',
|
|
41
|
+
'fs:read:workspace', 'fs:write:workspace',
|
|
42
|
+
'net:outbound:allowlist', 'net:localhost',
|
|
43
|
+
'cred:read',
|
|
44
|
+
'data:public', 'data:internal',
|
|
45
|
+
],
|
|
46
|
+
rateLimit: 200,
|
|
47
|
+
sessionTimeoutMinutes: 480,
|
|
48
|
+
};
|
|
49
|
+
const ROLE_RESTRICTED = {
|
|
50
|
+
name: 'restricted',
|
|
51
|
+
description: 'Limited user — read-only access, basic skills only',
|
|
52
|
+
permissions: [
|
|
53
|
+
'genome:read',
|
|
54
|
+
'skill:invoke:bundled',
|
|
55
|
+
'fs:read:workspace',
|
|
56
|
+
'net:localhost',
|
|
57
|
+
'data:public',
|
|
58
|
+
],
|
|
59
|
+
rateLimit: 50,
|
|
60
|
+
sessionTimeoutMinutes: 120,
|
|
61
|
+
};
|
|
62
|
+
const ROLE_AUDITOR = {
|
|
63
|
+
name: 'auditor',
|
|
64
|
+
description: 'Compliance auditor — read-only access to everything + audit logs + export',
|
|
65
|
+
permissions: [
|
|
66
|
+
'genome:read',
|
|
67
|
+
'fs:read:workspace', 'fs:read:home',
|
|
68
|
+
'data:public', 'data:internal', 'data:confidential', 'data:restricted',
|
|
69
|
+
'admin:audit:read', 'admin:audit:export',
|
|
70
|
+
],
|
|
71
|
+
rateLimit: 100,
|
|
72
|
+
sessionTimeoutMinutes: 240,
|
|
73
|
+
};
|
|
74
|
+
export class RBACEngine {
|
|
75
|
+
eventBus;
|
|
76
|
+
roles = new Map();
|
|
77
|
+
assignments = new Map();
|
|
78
|
+
operationCounts = new Map();
|
|
79
|
+
constructor(eventBus) {
|
|
80
|
+
this.eventBus = eventBus;
|
|
81
|
+
this.roles.set('admin', ROLE_ADMIN);
|
|
82
|
+
this.roles.set('manager', ROLE_MANAGER);
|
|
83
|
+
this.roles.set('standard', ROLE_STANDARD);
|
|
84
|
+
this.roles.set('restricted', ROLE_RESTRICTED);
|
|
85
|
+
this.roles.set('auditor', ROLE_AUDITOR);
|
|
86
|
+
}
|
|
87
|
+
assignRole(userId, roleName, assignedBy, expiresAt) {
|
|
88
|
+
if (!this.roles.has(roleName)) {
|
|
89
|
+
throw new Error(`[RBAC] Unknown role: ${roleName}`);
|
|
90
|
+
}
|
|
91
|
+
this.assignments.set(userId, {
|
|
92
|
+
userId,
|
|
93
|
+
role: roleName,
|
|
94
|
+
assignedAt: new Date(),
|
|
95
|
+
assignedBy,
|
|
96
|
+
expiresAt,
|
|
97
|
+
});
|
|
98
|
+
this.eventBus.emit({
|
|
99
|
+
type: 'security:audit-entry',
|
|
100
|
+
timestamp: new Date(),
|
|
101
|
+
layer: 4,
|
|
102
|
+
decision: 'info',
|
|
103
|
+
actor: { userId: assignedBy },
|
|
104
|
+
resource: { type: 'role', id: roleName, detail: `Assigned to ${userId}` },
|
|
105
|
+
severity: 'info',
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
revokeRole(userId) {
|
|
109
|
+
return this.assignments.delete(userId);
|
|
110
|
+
}
|
|
111
|
+
checkAccess(userId, permission) {
|
|
112
|
+
const assignment = this.assignments.get(userId);
|
|
113
|
+
if (!assignment) {
|
|
114
|
+
return {
|
|
115
|
+
allowed: false,
|
|
116
|
+
role: 'none',
|
|
117
|
+
permission,
|
|
118
|
+
reason: 'No role assigned — defaulting to deny',
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
if (assignment.expiresAt && new Date() > assignment.expiresAt) {
|
|
122
|
+
this.assignments.delete(userId);
|
|
123
|
+
return {
|
|
124
|
+
allowed: false,
|
|
125
|
+
role: assignment.role,
|
|
126
|
+
permission,
|
|
127
|
+
reason: 'Role assignment expired',
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
const role = this.roles.get(assignment.role);
|
|
131
|
+
if (!role) {
|
|
132
|
+
return { allowed: false, role: assignment.role, permission, reason: 'Role not found' };
|
|
133
|
+
}
|
|
134
|
+
if (role.rateLimit > 0 && !this.checkRateLimit(userId, role.rateLimit)) {
|
|
135
|
+
this.eventBus.emitDeny('security:capability-denied', 4, {
|
|
136
|
+
type: 'rate-limit',
|
|
137
|
+
id: userId,
|
|
138
|
+
detail: `Exceeded ${role.rateLimit} ops/hour`,
|
|
139
|
+
}, 'warning', { userId });
|
|
140
|
+
return { allowed: false, role: role.name, permission, reason: `Rate limit exceeded (${role.rateLimit}/hour)` };
|
|
141
|
+
}
|
|
142
|
+
const allPermissions = this.resolvePermissions(role);
|
|
143
|
+
const allowed = allPermissions.includes(permission);
|
|
144
|
+
if (!allowed) {
|
|
145
|
+
this.eventBus.emitDeny('security:capability-denied', 4, {
|
|
146
|
+
type: 'rbac',
|
|
147
|
+
id: permission,
|
|
148
|
+
detail: `Role ${role.name} lacks ${permission}`,
|
|
149
|
+
}, 'warning', { userId });
|
|
150
|
+
}
|
|
151
|
+
this.incrementOps(userId);
|
|
152
|
+
return { allowed, role: role.name, permission, reason: allowed ? undefined : `Role "${role.name}" does not have permission "${permission}"` };
|
|
153
|
+
}
|
|
154
|
+
getUserRole(userId) {
|
|
155
|
+
const assignment = this.assignments.get(userId);
|
|
156
|
+
if (!assignment)
|
|
157
|
+
return null;
|
|
158
|
+
return this.roles.get(assignment.role) ?? null;
|
|
159
|
+
}
|
|
160
|
+
getUserPermissions(userId) {
|
|
161
|
+
const role = this.getUserRole(userId);
|
|
162
|
+
if (!role)
|
|
163
|
+
return [];
|
|
164
|
+
return this.resolvePermissions(role);
|
|
165
|
+
}
|
|
166
|
+
registerRole(role) {
|
|
167
|
+
this.roles.set(role.name, role);
|
|
168
|
+
}
|
|
169
|
+
getRoles() {
|
|
170
|
+
return [...this.roles.values()];
|
|
171
|
+
}
|
|
172
|
+
getAssignments() {
|
|
173
|
+
return [...this.assignments.values()];
|
|
174
|
+
}
|
|
175
|
+
hasRole(userId, roleName) {
|
|
176
|
+
const assignment = this.assignments.get(userId);
|
|
177
|
+
return assignment?.role === roleName;
|
|
178
|
+
}
|
|
179
|
+
resolvePermissions(role) {
|
|
180
|
+
const permissions = [...role.permissions];
|
|
181
|
+
if (role.inherits) {
|
|
182
|
+
const parent = this.roles.get(role.inherits);
|
|
183
|
+
if (parent) {
|
|
184
|
+
const parentPerms = this.resolvePermissions(parent);
|
|
185
|
+
for (const p of parentPerms) {
|
|
186
|
+
if (!permissions.includes(p))
|
|
187
|
+
permissions.push(p);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return permissions;
|
|
192
|
+
}
|
|
193
|
+
checkRateLimit(userId, limit) {
|
|
194
|
+
const now = Date.now();
|
|
195
|
+
const record = this.operationCounts.get(userId);
|
|
196
|
+
if (!record || now - record.windowStart > 3_600_000) {
|
|
197
|
+
this.operationCounts.set(userId, { count: 1, windowStart: now });
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
return record.count < limit;
|
|
201
|
+
}
|
|
202
|
+
incrementOps(userId) {
|
|
203
|
+
const record = this.operationCounts.get(userId);
|
|
204
|
+
if (record) {
|
|
205
|
+
record.count++;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=RBACEngine.js.map
|