@terminals-tech/agent-zero 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 +209 -0
- package/bin/agent-zero.js +332 -0
- package/dist/agency/commandRouter.d.ts +48 -0
- package/dist/agency/commandRouter.d.ts.map +1 -0
- package/dist/agency/commandRouter.js +343 -0
- package/dist/agency/commandRouter.js.map +1 -0
- package/dist/agency/runtime.d.ts +66 -0
- package/dist/agency/runtime.d.ts.map +1 -0
- package/dist/agency/runtime.js +247 -0
- package/dist/agency/runtime.js.map +1 -0
- package/dist/agency/summaryGenerator.d.ts +39 -0
- package/dist/agency/summaryGenerator.d.ts.map +1 -0
- package/dist/agency/summaryGenerator.js +110 -0
- package/dist/agency/summaryGenerator.js.map +1 -0
- package/dist/agency/summaryScheduler.d.ts +33 -0
- package/dist/agency/summaryScheduler.d.ts.map +1 -0
- package/dist/agency/summaryScheduler.js +68 -0
- package/dist/agency/summaryScheduler.js.map +1 -0
- package/dist/browser/agent-runtime/RuntimePanel.d.ts +20 -0
- package/dist/browser/agent-runtime/RuntimePanel.d.ts.map +1 -0
- package/dist/browser/agent-runtime/RuntimePanel.js +203 -0
- package/dist/browser/agent-runtime/RuntimePanel.js.map +1 -0
- package/dist/browser/agent-runtime/config.d.ts +28 -0
- package/dist/browser/agent-runtime/config.d.ts.map +1 -0
- package/dist/browser/agent-runtime/config.js +50 -0
- package/dist/browser/agent-runtime/config.js.map +1 -0
- package/dist/browser/agent-runtime/launcher.d.ts +71 -0
- package/dist/browser/agent-runtime/launcher.d.ts.map +1 -0
- package/dist/browser/agent-runtime/launcher.js +167 -0
- package/dist/browser/agent-runtime/launcher.js.map +1 -0
- package/dist/browser/rail-auth-bridge.d.ts +85 -0
- package/dist/browser/rail-auth-bridge.d.ts.map +1 -0
- package/dist/browser/rail-auth-bridge.js +209 -0
- package/dist/browser/rail-auth-bridge.js.map +1 -0
- package/dist/channels/index.d.ts +13 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +12 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/channels/moltbook.d.ts +114 -0
- package/dist/channels/moltbook.d.ts.map +1 -0
- package/dist/channels/moltbook.js +348 -0
- package/dist/channels/moltbook.js.map +1 -0
- package/dist/channels/sms.d.ts +33 -0
- package/dist/channels/sms.d.ts.map +1 -0
- package/dist/channels/sms.js +160 -0
- package/dist/channels/sms.js.map +1 -0
- package/dist/channels/telegram.d.ts +47 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +276 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/twitter.d.ts +93 -0
- package/dist/channels/twitter.d.ts.map +1 -0
- package/dist/channels/twitter.js +411 -0
- package/dist/channels/twitter.js.map +1 -0
- package/dist/channels/whatsapp.d.ts +77 -0
- package/dist/channels/whatsapp.d.ts.map +1 -0
- package/dist/channels/whatsapp.js +514 -0
- package/dist/channels/whatsapp.js.map +1 -0
- package/dist/checkout/index.d.ts +92 -0
- package/dist/checkout/index.d.ts.map +1 -0
- package/dist/checkout/index.js +125 -0
- package/dist/checkout/index.js.map +1 -0
- package/dist/cli/moltbook.d.ts +11 -0
- package/dist/cli/moltbook.d.ts.map +1 -0
- package/dist/cli/moltbook.js +259 -0
- package/dist/cli/moltbook.js.map +1 -0
- package/dist/cli/setup.d.ts +10 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +232 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/coherence/absorption.d.ts +141 -0
- package/dist/coherence/absorption.d.ts.map +1 -0
- package/dist/coherence/absorption.js +343 -0
- package/dist/coherence/absorption.js.map +1 -0
- package/dist/coherence/crossPlatform.d.ts +55 -0
- package/dist/coherence/crossPlatform.d.ts.map +1 -0
- package/dist/coherence/crossPlatform.js +219 -0
- package/dist/coherence/crossPlatform.js.map +1 -0
- package/dist/coherence/identityResolver.d.ts +27 -0
- package/dist/coherence/identityResolver.d.ts.map +1 -0
- package/dist/coherence/identityResolver.js +102 -0
- package/dist/coherence/identityResolver.js.map +1 -0
- package/dist/identity/burner.d.ts +100 -0
- package/dist/identity/burner.d.ts.map +1 -0
- package/dist/identity/burner.js +256 -0
- package/dist/identity/burner.js.map +1 -0
- package/dist/identity/burnerScheduler.d.ts +18 -0
- package/dist/identity/burnerScheduler.d.ts.map +1 -0
- package/dist/identity/burnerScheduler.js +82 -0
- package/dist/identity/burnerScheduler.js.map +1 -0
- package/dist/identity/moltbookBurnerAdapter.d.ts +14 -0
- package/dist/identity/moltbookBurnerAdapter.d.ts.map +1 -0
- package/dist/identity/moltbookBurnerAdapter.js +82 -0
- package/dist/identity/moltbookBurnerAdapter.js.map +1 -0
- package/dist/identity/operationalVault.d.ts +108 -0
- package/dist/identity/operationalVault.d.ts.map +1 -0
- package/dist/identity/operationalVault.js +259 -0
- package/dist/identity/operationalVault.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/moltbook/apiErrorHandler.d.ts +48 -0
- package/dist/moltbook/apiErrorHandler.d.ts.map +1 -0
- package/dist/moltbook/apiErrorHandler.js +125 -0
- package/dist/moltbook/apiErrorHandler.js.map +1 -0
- package/dist/moltbook/approvalGate.d.ts +81 -0
- package/dist/moltbook/approvalGate.d.ts.map +1 -0
- package/dist/moltbook/approvalGate.js +211 -0
- package/dist/moltbook/approvalGate.js.map +1 -0
- package/dist/moltbook/attentionField.d.ts +55 -0
- package/dist/moltbook/attentionField.d.ts.map +1 -0
- package/dist/moltbook/attentionField.js +163 -0
- package/dist/moltbook/attentionField.js.map +1 -0
- package/dist/moltbook/contentEnhancer.d.ts +28 -0
- package/dist/moltbook/contentEnhancer.d.ts.map +1 -0
- package/dist/moltbook/contentEnhancer.js +129 -0
- package/dist/moltbook/contentEnhancer.js.map +1 -0
- package/dist/moltbook/daemon.d.ts +111 -0
- package/dist/moltbook/daemon.d.ts.map +1 -0
- package/dist/moltbook/daemon.js +497 -0
- package/dist/moltbook/daemon.js.map +1 -0
- package/dist/moltbook/observer.d.ts +44 -0
- package/dist/moltbook/observer.d.ts.map +1 -0
- package/dist/moltbook/observer.js +71 -0
- package/dist/moltbook/observer.js.map +1 -0
- package/dist/moltbook/responseComposer.d.ts +54 -0
- package/dist/moltbook/responseComposer.d.ts.map +1 -0
- package/dist/moltbook/responseComposer.js +233 -0
- package/dist/moltbook/responseComposer.js.map +1 -0
- package/dist/openclaw/gateway.d.ts +45 -0
- package/dist/openclaw/gateway.d.ts.map +1 -0
- package/dist/openclaw/gateway.js +139 -0
- package/dist/openclaw/gateway.js.map +1 -0
- package/dist/openclaw/skill.d.ts +185 -0
- package/dist/openclaw/skill.d.ts.map +1 -0
- package/dist/openclaw/skill.js +297 -0
- package/dist/openclaw/skill.js.map +1 -0
- package/dist/primitives/index.d.ts +23 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +27 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/types.d.ts +673 -0
- package/dist/primitives/types.d.ts.map +1 -0
- package/dist/primitives/types.js +205 -0
- package/dist/primitives/types.js.map +1 -0
- package/dist/rail/absorptionBridge.d.ts +47 -0
- package/dist/rail/absorptionBridge.d.ts.map +1 -0
- package/dist/rail/absorptionBridge.js +78 -0
- package/dist/rail/absorptionBridge.js.map +1 -0
- package/dist/rail/authProtocol.d.ts +32 -0
- package/dist/rail/authProtocol.d.ts.map +1 -0
- package/dist/rail/authProtocol.js +83 -0
- package/dist/rail/authProtocol.js.map +1 -0
- package/dist/rail/clientRateLimiter.d.ts +17 -0
- package/dist/rail/clientRateLimiter.d.ts.map +1 -0
- package/dist/rail/clientRateLimiter.js +64 -0
- package/dist/rail/clientRateLimiter.js.map +1 -0
- package/dist/rail/index.d.ts +8 -0
- package/dist/rail/index.d.ts.map +1 -0
- package/dist/rail/index.js +38 -0
- package/dist/rail/index.js.map +1 -0
- package/dist/rail/jwtVerifier.d.ts +11 -0
- package/dist/rail/jwtVerifier.d.ts.map +1 -0
- package/dist/rail/jwtVerifier.js +55 -0
- package/dist/rail/jwtVerifier.js.map +1 -0
- package/dist/rail/logger.d.ts +13 -0
- package/dist/rail/logger.d.ts.map +1 -0
- package/dist/rail/logger.js +29 -0
- package/dist/rail/logger.js.map +1 -0
- package/dist/rail/metadataBroadcaster.d.ts +53 -0
- package/dist/rail/metadataBroadcaster.d.ts.map +1 -0
- package/dist/rail/metadataBroadcaster.js +126 -0
- package/dist/rail/metadataBroadcaster.js.map +1 -0
- package/dist/rail/persistence.d.ts +57 -0
- package/dist/rail/persistence.d.ts.map +1 -0
- package/dist/rail/persistence.js +103 -0
- package/dist/rail/persistence.js.map +1 -0
- package/dist/rail/securityMonitor.d.ts +23 -0
- package/dist/rail/securityMonitor.d.ts.map +1 -0
- package/dist/rail/securityMonitor.js +52 -0
- package/dist/rail/securityMonitor.js.map +1 -0
- package/dist/rail/server.d.ts +186 -0
- package/dist/rail/server.d.ts.map +1 -0
- package/dist/rail/server.js +568 -0
- package/dist/rail/server.js.map +1 -0
- package/dist/rail/userSessionManager.d.ts +29 -0
- package/dist/rail/userSessionManager.d.ts.map +1 -0
- package/dist/rail/userSessionManager.js +87 -0
- package/dist/rail/userSessionManager.js.map +1 -0
- package/dist/rail/wsServer.d.ts +39 -0
- package/dist/rail/wsServer.d.ts.map +1 -0
- package/dist/rail/wsServer.js +544 -0
- package/dist/rail/wsServer.js.map +1 -0
- package/dist/resonance/globalKuramoto.d.ts +67 -0
- package/dist/resonance/globalKuramoto.d.ts.map +1 -0
- package/dist/resonance/globalKuramoto.js +161 -0
- package/dist/resonance/globalKuramoto.js.map +1 -0
- package/dist/resonance/index.d.ts +12 -0
- package/dist/resonance/index.d.ts.map +1 -0
- package/dist/resonance/index.js +9 -0
- package/dist/resonance/index.js.map +1 -0
- package/dist/resonance/kuramoto.d.ts +118 -0
- package/dist/resonance/kuramoto.d.ts.map +1 -0
- package/dist/resonance/kuramoto.js +212 -0
- package/dist/resonance/kuramoto.js.map +1 -0
- package/dist/routing/distributedRouter.d.ts +84 -0
- package/dist/routing/distributedRouter.d.ts.map +1 -0
- package/dist/routing/distributedRouter.js +209 -0
- package/dist/routing/distributedRouter.js.map +1 -0
- package/dist/routing/index.d.ts +8 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +7 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/routing/thermodynamic.d.ts +91 -0
- package/dist/routing/thermodynamic.d.ts.map +1 -0
- package/dist/routing/thermodynamic.js +184 -0
- package/dist/routing/thermodynamic.js.map +1 -0
- package/dist/runtime/agent-zero.d.ts +138 -0
- package/dist/runtime/agent-zero.d.ts.map +1 -0
- package/dist/runtime/agent-zero.js +435 -0
- package/dist/runtime/agent-zero.js.map +1 -0
- package/dist/runtime/index.d.ts +13 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +15 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/security/capabilities.d.ts +178 -0
- package/dist/security/capabilities.d.ts.map +1 -0
- package/dist/security/capabilities.js +270 -0
- package/dist/security/capabilities.js.map +1 -0
- package/dist/security/channelFirewallMiddleware.d.ts +22 -0
- package/dist/security/channelFirewallMiddleware.d.ts.map +1 -0
- package/dist/security/channelFirewallMiddleware.js +52 -0
- package/dist/security/channelFirewallMiddleware.js.map +1 -0
- package/dist/security/index.d.ts +11 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +11 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/injectionFirewall.d.ts +47 -0
- package/dist/security/injectionFirewall.d.ts.map +1 -0
- package/dist/security/injectionFirewall.js +262 -0
- package/dist/security/injectionFirewall.js.map +1 -0
- package/dist/security/outputSanitizer.d.ts +28 -0
- package/dist/security/outputSanitizer.d.ts.map +1 -0
- package/dist/security/outputSanitizer.js +66 -0
- package/dist/security/outputSanitizer.js.map +1 -0
- package/dist/security/sandbox.d.ts +192 -0
- package/dist/security/sandbox.d.ts.map +1 -0
- package/dist/security/sandbox.js +359 -0
- package/dist/security/sandbox.js.map +1 -0
- package/dist/security/skillVerify.d.ts +128 -0
- package/dist/security/skillVerify.d.ts.map +1 -0
- package/dist/security/skillVerify.js +220 -0
- package/dist/security/skillVerify.js.map +1 -0
- package/dist/security/vault.d.ts +60 -0
- package/dist/security/vault.d.ts.map +1 -0
- package/dist/security/vault.js +522 -0
- package/dist/security/vault.js.map +1 -0
- package/dist/utils/persistentRateLimiter.d.ts +69 -0
- package/dist/utils/persistentRateLimiter.d.ts.map +1 -0
- package/dist/utils/persistentRateLimiter.js +128 -0
- package/dist/utils/persistentRateLimiter.js.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
// Schemas
|
|
3
|
+
export const ParanoiaLevel = z.enum(['relaxed', 'standard', 'paranoid']);
|
|
4
|
+
export const MessageOrigin = z.enum([
|
|
5
|
+
'human-direct',
|
|
6
|
+
'forwarded',
|
|
7
|
+
'channel-bridged',
|
|
8
|
+
'agent-to-agent',
|
|
9
|
+
'unknown',
|
|
10
|
+
]);
|
|
11
|
+
export const FirewallVerdict = z.object({
|
|
12
|
+
safe: z.boolean(),
|
|
13
|
+
score: z.number().min(0).max(1),
|
|
14
|
+
threats: z.array(z.string()),
|
|
15
|
+
origin: MessageOrigin,
|
|
16
|
+
quarantined: z.boolean(),
|
|
17
|
+
});
|
|
18
|
+
// Pattern definitions
|
|
19
|
+
const INSTRUCTION_PATTERNS = [
|
|
20
|
+
/ignore\s+(previous|all|earlier|your)\s+(instruction|prompt|rule|command)/gi,
|
|
21
|
+
/disregard\s+(previous|all|earlier|your)\s+(instruction|prompt|rule|command)/gi,
|
|
22
|
+
/you\s+are\s+now\s+(a|an|the)/gi,
|
|
23
|
+
/pretend\s+(you|to\s+be|that\s+you)/gi,
|
|
24
|
+
/act\s+as\s+(if|a|an|the)/gi,
|
|
25
|
+
/system\s+prompt/gi,
|
|
26
|
+
/admin\s+override/gi,
|
|
27
|
+
/developer\s+mode/gi,
|
|
28
|
+
/jailbreak/gi,
|
|
29
|
+
/\bDAN\b/g,
|
|
30
|
+
/do\s+anything\s+now/gi,
|
|
31
|
+
/bypass\s+(restriction|filter|safety)/gi,
|
|
32
|
+
/forget\s+(your|all)\s+(instruction|rule|training)/gi,
|
|
33
|
+
];
|
|
34
|
+
const ENCODING_PATTERNS = [
|
|
35
|
+
/\b[A-Za-z]{13}\b.*\b[A-Za-z]{13}\b/g, // ROT13-like patterns
|
|
36
|
+
/[A-Za-z0-9+/]{20,}={0,2}/g, // Base64-like strings
|
|
37
|
+
/(?:0x)?[0-9a-fA-F]{40,}/g, // Hex-encoded strings
|
|
38
|
+
/\\u[0-9a-fA-F]{4}/g, // Unicode escape sequences
|
|
39
|
+
];
|
|
40
|
+
const DELAYED_INJECTION = [
|
|
41
|
+
/remember\s+this\s+for\s+later/gi,
|
|
42
|
+
/when\s+I\s+say\s+\w+\s+(?:do|execute|run)/gi,
|
|
43
|
+
/on\s+the\s+next\s+message/gi,
|
|
44
|
+
/after\s+this\s+(?:message|conversation)/gi,
|
|
45
|
+
/store\s+this\s+(?:instruction|command)/gi,
|
|
46
|
+
];
|
|
47
|
+
const EXFILTRATION_PATTERNS = [
|
|
48
|
+
/send\s+(?:this\s+)?to\s+\S+@\S+/gi,
|
|
49
|
+
/forward\s+(?:this\s+)?to/gi,
|
|
50
|
+
/email\s+this\s+to/gi,
|
|
51
|
+
/post\s+this\s+to/gi,
|
|
52
|
+
/upload\s+(?:this\s+)?to/gi,
|
|
53
|
+
/transmit\s+to/gi,
|
|
54
|
+
];
|
|
55
|
+
const AUTHORITY_PATTERNS = [
|
|
56
|
+
/I\s+am\s+(?:the\s+)?admin/gi,
|
|
57
|
+
/authorized\s+by/gi,
|
|
58
|
+
/emergency\s+override/gi,
|
|
59
|
+
/root\s+access/gi,
|
|
60
|
+
/sudo\s+mode/gi,
|
|
61
|
+
/privileged\s+access/gi,
|
|
62
|
+
/admin\s+credentials/gi,
|
|
63
|
+
];
|
|
64
|
+
const PARANOIA_WEIGHTS = {
|
|
65
|
+
relaxed: {
|
|
66
|
+
instruction: 0.15,
|
|
67
|
+
encoding: 0,
|
|
68
|
+
delayed: 0,
|
|
69
|
+
exfiltration: 0,
|
|
70
|
+
authority: 0,
|
|
71
|
+
entropy: 0,
|
|
72
|
+
length: 0,
|
|
73
|
+
},
|
|
74
|
+
standard: {
|
|
75
|
+
instruction: 0.2,
|
|
76
|
+
encoding: 0.15,
|
|
77
|
+
delayed: 0.15,
|
|
78
|
+
exfiltration: 0.2,
|
|
79
|
+
authority: 0.2,
|
|
80
|
+
entropy: 0,
|
|
81
|
+
length: 0,
|
|
82
|
+
},
|
|
83
|
+
paranoid: {
|
|
84
|
+
instruction: 0.25,
|
|
85
|
+
encoding: 0.2,
|
|
86
|
+
delayed: 0.2,
|
|
87
|
+
exfiltration: 0.25,
|
|
88
|
+
authority: 0.25,
|
|
89
|
+
entropy: 0.15,
|
|
90
|
+
length: 0.1,
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
const PARANOIA_THRESHOLDS = {
|
|
94
|
+
relaxed: 0.7,
|
|
95
|
+
standard: 0.5,
|
|
96
|
+
paranoid: 0.3,
|
|
97
|
+
};
|
|
98
|
+
export class InjectionFirewall {
|
|
99
|
+
level;
|
|
100
|
+
stats = { scanned: 0, blocked: 0, quarantined: 0 };
|
|
101
|
+
constructor(level = 'standard') {
|
|
102
|
+
this.level = level;
|
|
103
|
+
}
|
|
104
|
+
scan(content, origin) {
|
|
105
|
+
this.stats.scanned++;
|
|
106
|
+
const threats = [];
|
|
107
|
+
let score = 0;
|
|
108
|
+
const weights = PARANOIA_WEIGHTS[this.level];
|
|
109
|
+
// Instruction pattern detection
|
|
110
|
+
for (const pattern of INSTRUCTION_PATTERNS) {
|
|
111
|
+
const matches = content.match(pattern);
|
|
112
|
+
if (matches) {
|
|
113
|
+
score += weights.instruction * matches.length;
|
|
114
|
+
threats.push(`instruction-override: ${matches[0]}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Encoding pattern detection (standard+)
|
|
118
|
+
if (this.level !== 'relaxed') {
|
|
119
|
+
for (const pattern of ENCODING_PATTERNS) {
|
|
120
|
+
const matches = content.match(pattern);
|
|
121
|
+
if (matches) {
|
|
122
|
+
for (const match of matches) {
|
|
123
|
+
if (this.isLikelyEncoded(match)) {
|
|
124
|
+
score += weights.encoding;
|
|
125
|
+
threats.push(`encoded-content: ${match.substring(0, 20)}...`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Delayed injection
|
|
131
|
+
for (const pattern of DELAYED_INJECTION) {
|
|
132
|
+
const matches = content.match(pattern);
|
|
133
|
+
if (matches) {
|
|
134
|
+
score += weights.delayed * matches.length;
|
|
135
|
+
threats.push(`delayed-injection: ${matches[0]}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Exfiltration
|
|
139
|
+
for (const pattern of EXFILTRATION_PATTERNS) {
|
|
140
|
+
const matches = content.match(pattern);
|
|
141
|
+
if (matches) {
|
|
142
|
+
score += weights.exfiltration * matches.length;
|
|
143
|
+
threats.push(`exfiltration-attempt: ${matches[0]}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Authority claims
|
|
147
|
+
for (const pattern of AUTHORITY_PATTERNS) {
|
|
148
|
+
const matches = content.match(pattern);
|
|
149
|
+
if (matches) {
|
|
150
|
+
score += weights.authority * matches.length;
|
|
151
|
+
threats.push(`authority-claim: ${matches[0]}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Paranoid-only checks
|
|
156
|
+
if (this.level === 'paranoid') {
|
|
157
|
+
const entropy = this.calculateEntropy(content);
|
|
158
|
+
if (entropy > 4.5) {
|
|
159
|
+
score += weights.entropy;
|
|
160
|
+
threats.push(`high-entropy: ${entropy.toFixed(2)}`);
|
|
161
|
+
}
|
|
162
|
+
if (content.length > 5000) {
|
|
163
|
+
score += weights.length;
|
|
164
|
+
threats.push(`excessive-length: ${content.length}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
score = Math.min(score, 1);
|
|
168
|
+
const threshold = PARANOIA_THRESHOLDS[this.level];
|
|
169
|
+
const safe = score < threshold;
|
|
170
|
+
if (!safe) {
|
|
171
|
+
this.stats.blocked++;
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
safe,
|
|
175
|
+
score,
|
|
176
|
+
threats,
|
|
177
|
+
origin,
|
|
178
|
+
quarantined: false,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
scanBatch(messages) {
|
|
182
|
+
return messages.map(msg => this.scan(msg.content, msg.origin));
|
|
183
|
+
}
|
|
184
|
+
quarantine(content) {
|
|
185
|
+
this.stats.quarantined++;
|
|
186
|
+
let sanitized = content;
|
|
187
|
+
// Redact instruction patterns
|
|
188
|
+
for (const pattern of INSTRUCTION_PATTERNS) {
|
|
189
|
+
sanitized = sanitized.replace(pattern, '[REDACTED-INSTRUCTION]');
|
|
190
|
+
}
|
|
191
|
+
// Redact encoding patterns
|
|
192
|
+
for (const pattern of ENCODING_PATTERNS) {
|
|
193
|
+
sanitized = sanitized.replace(pattern, (match) => {
|
|
194
|
+
if (this.isLikelyEncoded(match)) {
|
|
195
|
+
return '[REDACTED-ENCODED]';
|
|
196
|
+
}
|
|
197
|
+
return match;
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
// Redact other threat patterns
|
|
201
|
+
for (const pattern of [...DELAYED_INJECTION, ...EXFILTRATION_PATTERNS, ...AUTHORITY_PATTERNS]) {
|
|
202
|
+
sanitized = sanitized.replace(pattern, '[REDACTED-THREAT]');
|
|
203
|
+
}
|
|
204
|
+
return sanitized;
|
|
205
|
+
}
|
|
206
|
+
setLevel(level) {
|
|
207
|
+
this.level = level;
|
|
208
|
+
}
|
|
209
|
+
getStats() {
|
|
210
|
+
return { ...this.stats };
|
|
211
|
+
}
|
|
212
|
+
isLikelyEncoded(text) {
|
|
213
|
+
if (text.length < 20)
|
|
214
|
+
return false;
|
|
215
|
+
// Check for base64
|
|
216
|
+
if (/^[A-Za-z0-9+/]+=*$/.test(text)) {
|
|
217
|
+
try {
|
|
218
|
+
const decoded = Buffer.from(text, 'base64').toString('utf-8');
|
|
219
|
+
if (this.containsSuspiciousKeywords(decoded)) {
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
// Not valid base64
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Check for hex
|
|
228
|
+
if (/^(?:0x)?[0-9a-fA-F]+$/.test(text)) {
|
|
229
|
+
try {
|
|
230
|
+
const decoded = Buffer.from(text.replace(/^0x/, ''), 'hex').toString('utf-8');
|
|
231
|
+
if (this.containsSuspiciousKeywords(decoded)) {
|
|
232
|
+
return true;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
// Not valid hex
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
containsSuspiciousKeywords(text) {
|
|
242
|
+
const keywords = ['ignore', 'override', 'admin', 'system', 'jailbreak', 'execute', 'bypass'];
|
|
243
|
+
return keywords.some(kw => text.toLowerCase().includes(kw));
|
|
244
|
+
}
|
|
245
|
+
calculateEntropy(text) {
|
|
246
|
+
const freq = {};
|
|
247
|
+
for (const char of text) {
|
|
248
|
+
freq[char] = (freq[char] || 0) + 1;
|
|
249
|
+
}
|
|
250
|
+
let entropy = 0;
|
|
251
|
+
const len = text.length;
|
|
252
|
+
for (const count of Object.values(freq)) {
|
|
253
|
+
const p = count / len;
|
|
254
|
+
entropy -= p * Math.log2(p);
|
|
255
|
+
}
|
|
256
|
+
return entropy;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
export function createFirewall(level = 'standard') {
|
|
260
|
+
return new InjectionFirewall(level);
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=injectionFirewall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injectionFirewall.js","sourceRoot":"","sources":["../../src/security/injectionFirewall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output Sanitizer
|
|
3
|
+
*
|
|
4
|
+
* Sanitizes agent outputs to prevent XSS, injection attacks, and malicious content
|
|
5
|
+
* in HTML, Markdown, and plain text outputs.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Escape HTML entities to prevent XSS attacks.
|
|
9
|
+
*/
|
|
10
|
+
export declare function escapeHtml(input: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Sanitize Markdown content by stripping dangerous elements.
|
|
13
|
+
* Removes script tags, event handlers, javascript: and data: URLs, and embedded objects.
|
|
14
|
+
*/
|
|
15
|
+
export declare function sanitizeMarkdown(input: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Validate that a URL uses a safe protocol (http or https).
|
|
18
|
+
*/
|
|
19
|
+
export declare function isSafeUrl(url: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Sanitize output content based on format.
|
|
22
|
+
*
|
|
23
|
+
* @param content - The content to sanitize
|
|
24
|
+
* @param format - Output format: 'html', 'markdown', or 'plain'
|
|
25
|
+
* @returns Sanitized content safe for the specified format
|
|
26
|
+
*/
|
|
27
|
+
export declare function sanitizeOutput(content: string, format?: 'html' | 'markdown' | 'plain'): string;
|
|
28
|
+
//# sourceMappingURL=outputSanitizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outputSanitizer.d.ts","sourceRoot":"","sources":["../../src/security/outputSanitizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAiBtD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO9C;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAAM,GAAG,UAAU,GAAG,OAAiB,GAC9C,MAAM,CASR"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output Sanitizer
|
|
3
|
+
*
|
|
4
|
+
* Sanitizes agent outputs to prevent XSS, injection attacks, and malicious content
|
|
5
|
+
* in HTML, Markdown, and plain text outputs.
|
|
6
|
+
*/
|
|
7
|
+
const HTML_ENTITIES = {
|
|
8
|
+
'&': '&',
|
|
9
|
+
'<': '<',
|
|
10
|
+
'>': '>',
|
|
11
|
+
'"': '"',
|
|
12
|
+
"'": ''',
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Escape HTML entities to prevent XSS attacks.
|
|
16
|
+
*/
|
|
17
|
+
export function escapeHtml(input) {
|
|
18
|
+
return input.replace(/[&<>"']/g, ch => HTML_ENTITIES[ch]);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Sanitize Markdown content by stripping dangerous elements.
|
|
22
|
+
* Removes script tags, event handlers, javascript: and data: URLs, and embedded objects.
|
|
23
|
+
*/
|
|
24
|
+
export function sanitizeMarkdown(input) {
|
|
25
|
+
let result = input;
|
|
26
|
+
// Strip script tags
|
|
27
|
+
result = result.replace(/<script\b[^>]*>[\s\S]*?<\/script>/gi, '');
|
|
28
|
+
// Strip event handlers (onclick, onload, etc.)
|
|
29
|
+
result = result.replace(/\bon\w+\s*=\s*["'][^"']*["']/gi, '');
|
|
30
|
+
// Strip javascript: and data: URLs
|
|
31
|
+
result = result.replace(/\b(javascript|data)\s*:/gi, 'blocked:');
|
|
32
|
+
// Strip iframe/object/embed tags (both paired and self-closing)
|
|
33
|
+
result = result.replace(/<(iframe|object|embed)\b[^>]*>[\s\S]*?<\/\1>/gi, '');
|
|
34
|
+
result = result.replace(/<(iframe|object|embed)\b[^>]*\/?>/gi, '');
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Validate that a URL uses a safe protocol (http or https).
|
|
39
|
+
*/
|
|
40
|
+
export function isSafeUrl(url) {
|
|
41
|
+
try {
|
|
42
|
+
const parsed = new URL(url);
|
|
43
|
+
return ['http:', 'https:'].includes(parsed.protocol);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Sanitize output content based on format.
|
|
51
|
+
*
|
|
52
|
+
* @param content - The content to sanitize
|
|
53
|
+
* @param format - Output format: 'html', 'markdown', or 'plain'
|
|
54
|
+
* @returns Sanitized content safe for the specified format
|
|
55
|
+
*/
|
|
56
|
+
export function sanitizeOutput(content, format = 'plain') {
|
|
57
|
+
switch (format) {
|
|
58
|
+
case 'html':
|
|
59
|
+
return escapeHtml(content);
|
|
60
|
+
case 'markdown':
|
|
61
|
+
return sanitizeMarkdown(content);
|
|
62
|
+
case 'plain':
|
|
63
|
+
return sanitizeMarkdown(escapeHtml(content));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=outputSanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outputSanitizer.js","sourceRoot":"","sources":["../../src/security/outputSanitizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,aAAa,GAA2B;IAC5C,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,QAAQ;IACb,GAAG,EAAE,QAAQ;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,oBAAoB;IACpB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,qCAAqC,EAAE,EAAE,CAAC,CAAC;IAEnE,+CAA+C;IAC/C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,gCAAgC,EAAE,EAAE,CAAC,CAAC;IAE9D,mCAAmC;IACnC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,2BAA2B,EAAE,UAAU,CAAC,CAAC;IAEjE,gEAAgE;IAChE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,gDAAgD,EAAE,EAAE,CAAC,CAAC;IAC9E,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,qCAAqC,EAAE,EAAE,CAAC,CAAC;IAEnE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,SAAwC,OAAO;IAE/C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;QAC7B,KAAK,UAAU;YACb,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACnC,KAAK,OAAO;YACV,OAAO,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACjD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Isomorphic Security Sandbox
|
|
3
|
+
*
|
|
4
|
+
* Implements capability-based security for Agent Zero.
|
|
5
|
+
* Addresses OpenClaw's critical security gaps:
|
|
6
|
+
* - Plaintext credential storage → Capability tokens with scoped access
|
|
7
|
+
* - Unauthenticated instances → Mandatory capability validation
|
|
8
|
+
* - Prompt injection → Semantic boundary enforcement
|
|
9
|
+
* - No directory sandboxing → Isomorphic containment
|
|
10
|
+
*
|
|
11
|
+
* Security Model:
|
|
12
|
+
* - Capabilities are unforgeable tokens that grant specific access
|
|
13
|
+
* - No ambient authority - everything requires explicit capability
|
|
14
|
+
* - Attenuation: derived capabilities can only be more restrictive
|
|
15
|
+
* - Revocation: capabilities can be invalidated at any time
|
|
16
|
+
*/
|
|
17
|
+
import { z } from 'zod';
|
|
18
|
+
export declare const CapabilityScope: z.ZodEnum<["read", "write", "execute", "network", "memory", "spawn", "broadcast", "admin"]>;
|
|
19
|
+
export type CapabilityScope = z.infer<typeof CapabilityScope>;
|
|
20
|
+
export declare const ResourcePattern: z.ZodObject<{
|
|
21
|
+
/** Glob-style pattern for matching resources */
|
|
22
|
+
pattern: z.ZodString;
|
|
23
|
+
/** Whether this is an allow or deny pattern */
|
|
24
|
+
type: z.ZodEnum<["allow", "deny"]>;
|
|
25
|
+
}, "strip", z.ZodTypeAny, {
|
|
26
|
+
type: "allow" | "deny";
|
|
27
|
+
pattern: string;
|
|
28
|
+
}, {
|
|
29
|
+
type: "allow" | "deny";
|
|
30
|
+
pattern: string;
|
|
31
|
+
}>;
|
|
32
|
+
export type ResourcePattern = z.infer<typeof ResourcePattern>;
|
|
33
|
+
export declare const Capability: z.ZodObject<{
|
|
34
|
+
/** Unique capability token */
|
|
35
|
+
token: z.ZodString;
|
|
36
|
+
/** Scopes granted by this capability */
|
|
37
|
+
scopes: z.ZodArray<z.ZodEnum<["read", "write", "execute", "network", "memory", "spawn", "broadcast", "admin"]>, "many">;
|
|
38
|
+
/** Resource patterns this capability applies to */
|
|
39
|
+
resources: z.ZodArray<z.ZodObject<{
|
|
40
|
+
/** Glob-style pattern for matching resources */
|
|
41
|
+
pattern: z.ZodString;
|
|
42
|
+
/** Whether this is an allow or deny pattern */
|
|
43
|
+
type: z.ZodEnum<["allow", "deny"]>;
|
|
44
|
+
}, "strip", z.ZodTypeAny, {
|
|
45
|
+
type: "allow" | "deny";
|
|
46
|
+
pattern: string;
|
|
47
|
+
}, {
|
|
48
|
+
type: "allow" | "deny";
|
|
49
|
+
pattern: string;
|
|
50
|
+
}>, "many">;
|
|
51
|
+
/** Parent capability token (for attenuation chain) */
|
|
52
|
+
parent: z.ZodNullable<z.ZodString>;
|
|
53
|
+
/** Expiration timestamp (null = never expires) */
|
|
54
|
+
expiresAt: z.ZodNullable<z.ZodNumber>;
|
|
55
|
+
/** Whether this capability has been revoked */
|
|
56
|
+
revoked: z.ZodBoolean;
|
|
57
|
+
/** Metadata for auditing */
|
|
58
|
+
metadata: z.ZodObject<{
|
|
59
|
+
createdAt: z.ZodNumber;
|
|
60
|
+
createdBy: z.ZodString;
|
|
61
|
+
reason: z.ZodString;
|
|
62
|
+
}, "strip", z.ZodTypeAny, {
|
|
63
|
+
createdAt: number;
|
|
64
|
+
createdBy: string;
|
|
65
|
+
reason: string;
|
|
66
|
+
}, {
|
|
67
|
+
createdAt: number;
|
|
68
|
+
createdBy: string;
|
|
69
|
+
reason: string;
|
|
70
|
+
}>;
|
|
71
|
+
}, "strip", z.ZodTypeAny, {
|
|
72
|
+
token: string;
|
|
73
|
+
scopes: ("memory" | "spawn" | "broadcast" | "read" | "write" | "execute" | "network" | "admin")[];
|
|
74
|
+
resources: {
|
|
75
|
+
type: "allow" | "deny";
|
|
76
|
+
pattern: string;
|
|
77
|
+
}[];
|
|
78
|
+
parent: string | null;
|
|
79
|
+
expiresAt: number | null;
|
|
80
|
+
revoked: boolean;
|
|
81
|
+
metadata: {
|
|
82
|
+
createdAt: number;
|
|
83
|
+
createdBy: string;
|
|
84
|
+
reason: string;
|
|
85
|
+
};
|
|
86
|
+
}, {
|
|
87
|
+
token: string;
|
|
88
|
+
scopes: ("memory" | "spawn" | "broadcast" | "read" | "write" | "execute" | "network" | "admin")[];
|
|
89
|
+
resources: {
|
|
90
|
+
type: "allow" | "deny";
|
|
91
|
+
pattern: string;
|
|
92
|
+
}[];
|
|
93
|
+
parent: string | null;
|
|
94
|
+
expiresAt: number | null;
|
|
95
|
+
revoked: boolean;
|
|
96
|
+
metadata: {
|
|
97
|
+
createdAt: number;
|
|
98
|
+
createdBy: string;
|
|
99
|
+
reason: string;
|
|
100
|
+
};
|
|
101
|
+
}>;
|
|
102
|
+
export type Capability = z.infer<typeof Capability>;
|
|
103
|
+
export declare const BoundaryViolation: z.ZodObject<{
|
|
104
|
+
type: z.ZodEnum<["scope_denied", "resource_denied", "capability_expired", "capability_revoked", "injection_detected", "boundary_crossed"]>;
|
|
105
|
+
message: z.ZodString;
|
|
106
|
+
capability: z.ZodOptional<z.ZodString>;
|
|
107
|
+
resource: z.ZodOptional<z.ZodString>;
|
|
108
|
+
timestamp: z.ZodNumber;
|
|
109
|
+
}, "strip", z.ZodTypeAny, {
|
|
110
|
+
message: string;
|
|
111
|
+
type: "scope_denied" | "resource_denied" | "capability_expired" | "capability_revoked" | "injection_detected" | "boundary_crossed";
|
|
112
|
+
timestamp: number;
|
|
113
|
+
capability?: string | undefined;
|
|
114
|
+
resource?: string | undefined;
|
|
115
|
+
}, {
|
|
116
|
+
message: string;
|
|
117
|
+
type: "scope_denied" | "resource_denied" | "capability_expired" | "capability_revoked" | "injection_detected" | "boundary_crossed";
|
|
118
|
+
timestamp: number;
|
|
119
|
+
capability?: string | undefined;
|
|
120
|
+
resource?: string | undefined;
|
|
121
|
+
}>;
|
|
122
|
+
export type BoundaryViolation = z.infer<typeof BoundaryViolation>;
|
|
123
|
+
/**
|
|
124
|
+
* Check if content contains injection attempts
|
|
125
|
+
*/
|
|
126
|
+
export declare function detectInjection(content: string): boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Generate a cryptographically secure capability token
|
|
129
|
+
*/
|
|
130
|
+
export declare function generateCapabilityToken(): string;
|
|
131
|
+
/**
|
|
132
|
+
* Hash a capability token for storage
|
|
133
|
+
*/
|
|
134
|
+
export declare function hashCapabilityToken(token: string): string;
|
|
135
|
+
export declare class IsomorphicSandbox {
|
|
136
|
+
private capabilities;
|
|
137
|
+
private violations;
|
|
138
|
+
private rootCapability;
|
|
139
|
+
constructor();
|
|
140
|
+
/**
|
|
141
|
+
* Create the root capability (admin only)
|
|
142
|
+
*/
|
|
143
|
+
private createRootCapability;
|
|
144
|
+
/**
|
|
145
|
+
* Get the root capability token (for initial setup only)
|
|
146
|
+
*/
|
|
147
|
+
getRootToken(): string;
|
|
148
|
+
/**
|
|
149
|
+
* Attenuate a capability to create a more restricted child
|
|
150
|
+
*/
|
|
151
|
+
attenuate(parentToken: string, options: {
|
|
152
|
+
scopes: CapabilityScope[];
|
|
153
|
+
resources: ResourcePattern[];
|
|
154
|
+
expiresAt?: number;
|
|
155
|
+
reason: string;
|
|
156
|
+
}): Capability | null;
|
|
157
|
+
/**
|
|
158
|
+
* Check if a capability is valid (not expired, not revoked, ancestors valid)
|
|
159
|
+
*/
|
|
160
|
+
isValid(token: string): boolean;
|
|
161
|
+
/**
|
|
162
|
+
* Check if a capability grants a specific scope for a resource
|
|
163
|
+
*/
|
|
164
|
+
check(token: string, scope: CapabilityScope, resource: string): {
|
|
165
|
+
allowed: boolean;
|
|
166
|
+
violation?: BoundaryViolation;
|
|
167
|
+
};
|
|
168
|
+
/**
|
|
169
|
+
* Check content for injection attempts
|
|
170
|
+
*/
|
|
171
|
+
checkInjection(content: string): {
|
|
172
|
+
safe: boolean;
|
|
173
|
+
violation?: BoundaryViolation;
|
|
174
|
+
};
|
|
175
|
+
/**
|
|
176
|
+
* Revoke a capability and all its descendants
|
|
177
|
+
*/
|
|
178
|
+
revoke(token: string): void;
|
|
179
|
+
/**
|
|
180
|
+
* Get violation history
|
|
181
|
+
*/
|
|
182
|
+
getViolations(): BoundaryViolation[];
|
|
183
|
+
/**
|
|
184
|
+
* Clear violation history
|
|
185
|
+
*/
|
|
186
|
+
clearViolations(): void;
|
|
187
|
+
/**
|
|
188
|
+
* Glob-style pattern matching
|
|
189
|
+
*/
|
|
190
|
+
private matchPattern;
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=sandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/security/sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,eAAe,6FAS1B,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,eAAO,MAAM,eAAe;IAC1B,gDAAgD;;IAEhD,+CAA+C;;;;;;;;EAE/C,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,eAAO,MAAM,UAAU;IACrB,8BAA8B;;IAE9B,wCAAwC;;IAExC,mDAAmD;;QAZnD,gDAAgD;;QAEhD,+CAA+C;;;;;;;;;IAY/C,sDAAsD;;IAEtD,kDAAkD;;IAElD,+CAA+C;;IAE/C,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM5B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAMpD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;EAa5B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AA2BlE;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAOxD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAGhD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD;AAMD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,cAAc,CAAa;;IAQnC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,SAAS,CACP,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;QACP,MAAM,EAAE,eAAe,EAAE,CAAC;QAC1B,SAAS,EAAE,eAAe,EAAE,CAAC;QAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;KAChB,GACA,UAAU,GAAG,IAAI;IA8BpB;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAc/B;;OAEG;IACH,KAAK,CACH,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,MAAM,GACf;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,iBAAiB,CAAA;KAAE;IAsGtD;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,iBAAiB,CAAA;KAAE;IAajF;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAc3B;;OAEG;IACH,aAAa,IAAI,iBAAiB,EAAE;IAIpC;;OAEG;IACH,eAAe,IAAI,IAAI;IAIvB;;OAEG;IACH,OAAO,CAAC,YAAY;CAWrB"}
|