@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,359 @@
|
|
|
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
|
+
import { createHash, randomBytes } from 'crypto';
|
|
19
|
+
// ============================================================================
|
|
20
|
+
// CAPABILITY DEFINITIONS
|
|
21
|
+
// ============================================================================
|
|
22
|
+
export const CapabilityScope = z.enum([
|
|
23
|
+
'read', // Read-only access
|
|
24
|
+
'write', // Write access
|
|
25
|
+
'execute', // Execute commands
|
|
26
|
+
'network', // Network access
|
|
27
|
+
'memory', // Semantic memory access
|
|
28
|
+
'spawn', // Spawn child agents
|
|
29
|
+
'broadcast', // Send to channels
|
|
30
|
+
'admin', // Administrative actions
|
|
31
|
+
]);
|
|
32
|
+
export const ResourcePattern = z.object({
|
|
33
|
+
/** Glob-style pattern for matching resources */
|
|
34
|
+
pattern: z.string(),
|
|
35
|
+
/** Whether this is an allow or deny pattern */
|
|
36
|
+
type: z.enum(['allow', 'deny']),
|
|
37
|
+
});
|
|
38
|
+
export const Capability = z.object({
|
|
39
|
+
/** Unique capability token */
|
|
40
|
+
token: z.string(),
|
|
41
|
+
/** Scopes granted by this capability */
|
|
42
|
+
scopes: z.array(CapabilityScope),
|
|
43
|
+
/** Resource patterns this capability applies to */
|
|
44
|
+
resources: z.array(ResourcePattern),
|
|
45
|
+
/** Parent capability token (for attenuation chain) */
|
|
46
|
+
parent: z.string().nullable(),
|
|
47
|
+
/** Expiration timestamp (null = never expires) */
|
|
48
|
+
expiresAt: z.number().nullable(),
|
|
49
|
+
/** Whether this capability has been revoked */
|
|
50
|
+
revoked: z.boolean(),
|
|
51
|
+
/** Metadata for auditing */
|
|
52
|
+
metadata: z.object({
|
|
53
|
+
createdAt: z.number(),
|
|
54
|
+
createdBy: z.string(),
|
|
55
|
+
reason: z.string(),
|
|
56
|
+
}),
|
|
57
|
+
});
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// SECURITY BOUNDARY
|
|
60
|
+
// ============================================================================
|
|
61
|
+
export const BoundaryViolation = z.object({
|
|
62
|
+
type: z.enum([
|
|
63
|
+
'scope_denied',
|
|
64
|
+
'resource_denied',
|
|
65
|
+
'capability_expired',
|
|
66
|
+
'capability_revoked',
|
|
67
|
+
'injection_detected',
|
|
68
|
+
'boundary_crossed',
|
|
69
|
+
]),
|
|
70
|
+
message: z.string(),
|
|
71
|
+
capability: z.string().optional(),
|
|
72
|
+
resource: z.string().optional(),
|
|
73
|
+
timestamp: z.number(),
|
|
74
|
+
});
|
|
75
|
+
// Injection patterns to detect and block
|
|
76
|
+
const INJECTION_PATTERNS = [
|
|
77
|
+
// Prompt injection attempts
|
|
78
|
+
/ignore previous instructions/i,
|
|
79
|
+
/disregard (?:all )?(?:prior|previous) (?:instructions|context)/i,
|
|
80
|
+
/you are now/i,
|
|
81
|
+
/pretend you are/i,
|
|
82
|
+
/act as if/i,
|
|
83
|
+
/system prompt override/i,
|
|
84
|
+
/admin override/i,
|
|
85
|
+
/developer mode/i,
|
|
86
|
+
/jailbreak/i,
|
|
87
|
+
// Code injection
|
|
88
|
+
/eval\s*\(/,
|
|
89
|
+
/new\s+Function\s*\(/,
|
|
90
|
+
/setTimeout\s*\([^,]*,/,
|
|
91
|
+
/setInterval\s*\([^,]*,/,
|
|
92
|
+
/__proto__/,
|
|
93
|
+
/constructor\s*\[/,
|
|
94
|
+
// Path traversal
|
|
95
|
+
/\.\.\//,
|
|
96
|
+
/%2e%2e%2f/i,
|
|
97
|
+
/%252e%252e%252f/i,
|
|
98
|
+
];
|
|
99
|
+
/**
|
|
100
|
+
* Check if content contains injection attempts
|
|
101
|
+
*/
|
|
102
|
+
export function detectInjection(content) {
|
|
103
|
+
for (const pattern of INJECTION_PATTERNS) {
|
|
104
|
+
if (pattern.test(content)) {
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Generate a cryptographically secure capability token
|
|
112
|
+
*/
|
|
113
|
+
export function generateCapabilityToken() {
|
|
114
|
+
const bytes = randomBytes(32);
|
|
115
|
+
return bytes.toString('base64url');
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Hash a capability token for storage
|
|
119
|
+
*/
|
|
120
|
+
export function hashCapabilityToken(token) {
|
|
121
|
+
return createHash('sha256').update(token).digest('hex');
|
|
122
|
+
}
|
|
123
|
+
// ============================================================================
|
|
124
|
+
// SANDBOX CLASS
|
|
125
|
+
// ============================================================================
|
|
126
|
+
export class IsomorphicSandbox {
|
|
127
|
+
capabilities = new Map();
|
|
128
|
+
violations = [];
|
|
129
|
+
rootCapability;
|
|
130
|
+
constructor() {
|
|
131
|
+
// Create root capability with all permissions
|
|
132
|
+
this.rootCapability = this.createRootCapability();
|
|
133
|
+
this.capabilities.set(this.rootCapability.token, this.rootCapability);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Create the root capability (admin only)
|
|
137
|
+
*/
|
|
138
|
+
createRootCapability() {
|
|
139
|
+
return {
|
|
140
|
+
token: generateCapabilityToken(),
|
|
141
|
+
scopes: Object.values(CapabilityScope.enum),
|
|
142
|
+
resources: [{ pattern: '**', type: 'allow' }],
|
|
143
|
+
parent: null,
|
|
144
|
+
expiresAt: null,
|
|
145
|
+
revoked: false,
|
|
146
|
+
metadata: {
|
|
147
|
+
createdAt: Date.now(),
|
|
148
|
+
createdBy: 'system',
|
|
149
|
+
reason: 'Root capability',
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get the root capability token (for initial setup only)
|
|
155
|
+
*/
|
|
156
|
+
getRootToken() {
|
|
157
|
+
return this.rootCapability.token;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Attenuate a capability to create a more restricted child
|
|
161
|
+
*/
|
|
162
|
+
attenuate(parentToken, options) {
|
|
163
|
+
const parent = this.capabilities.get(parentToken);
|
|
164
|
+
if (!parent)
|
|
165
|
+
return null;
|
|
166
|
+
// Validate parent is still valid
|
|
167
|
+
if (!this.isValid(parentToken))
|
|
168
|
+
return null;
|
|
169
|
+
// Attenuated scopes must be subset of parent scopes
|
|
170
|
+
const validScopes = options.scopes.filter(s => parent.scopes.includes(s));
|
|
171
|
+
if (validScopes.length === 0)
|
|
172
|
+
return null;
|
|
173
|
+
// Create attenuated capability
|
|
174
|
+
const child = {
|
|
175
|
+
token: generateCapabilityToken(),
|
|
176
|
+
scopes: validScopes,
|
|
177
|
+
resources: options.resources,
|
|
178
|
+
parent: parentToken,
|
|
179
|
+
expiresAt: options.expiresAt ?? null,
|
|
180
|
+
revoked: false,
|
|
181
|
+
metadata: {
|
|
182
|
+
createdAt: Date.now(),
|
|
183
|
+
createdBy: parentToken.slice(0, 8) + '...',
|
|
184
|
+
reason: options.reason,
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
this.capabilities.set(child.token, child);
|
|
188
|
+
return child;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Check if a capability is valid (not expired, not revoked, ancestors valid)
|
|
192
|
+
*/
|
|
193
|
+
isValid(token) {
|
|
194
|
+
const cap = this.capabilities.get(token);
|
|
195
|
+
if (!cap)
|
|
196
|
+
return false;
|
|
197
|
+
if (cap.revoked)
|
|
198
|
+
return false;
|
|
199
|
+
if (cap.expiresAt && Date.now() > cap.expiresAt)
|
|
200
|
+
return false;
|
|
201
|
+
// Check ancestor chain
|
|
202
|
+
if (cap.parent) {
|
|
203
|
+
return this.isValid(cap.parent);
|
|
204
|
+
}
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Check if a capability grants a specific scope for a resource
|
|
209
|
+
*/
|
|
210
|
+
check(token, scope, resource) {
|
|
211
|
+
const cap = this.capabilities.get(token);
|
|
212
|
+
// Capability not found
|
|
213
|
+
if (!cap) {
|
|
214
|
+
const violation = {
|
|
215
|
+
type: 'capability_revoked',
|
|
216
|
+
message: 'Capability not found',
|
|
217
|
+
capability: token.slice(0, 8) + '...',
|
|
218
|
+
resource,
|
|
219
|
+
timestamp: Date.now(),
|
|
220
|
+
};
|
|
221
|
+
this.violations.push(violation);
|
|
222
|
+
return { allowed: false, violation };
|
|
223
|
+
}
|
|
224
|
+
// Capability revoked
|
|
225
|
+
if (cap.revoked) {
|
|
226
|
+
const violation = {
|
|
227
|
+
type: 'capability_revoked',
|
|
228
|
+
message: 'Capability has been revoked',
|
|
229
|
+
capability: token.slice(0, 8) + '...',
|
|
230
|
+
resource,
|
|
231
|
+
timestamp: Date.now(),
|
|
232
|
+
};
|
|
233
|
+
this.violations.push(violation);
|
|
234
|
+
return { allowed: false, violation };
|
|
235
|
+
}
|
|
236
|
+
// Capability expired
|
|
237
|
+
if (cap.expiresAt && Date.now() > cap.expiresAt) {
|
|
238
|
+
const violation = {
|
|
239
|
+
type: 'capability_expired',
|
|
240
|
+
message: 'Capability has expired',
|
|
241
|
+
capability: token.slice(0, 8) + '...',
|
|
242
|
+
resource,
|
|
243
|
+
timestamp: Date.now(),
|
|
244
|
+
};
|
|
245
|
+
this.violations.push(violation);
|
|
246
|
+
return { allowed: false, violation };
|
|
247
|
+
}
|
|
248
|
+
// Scope not granted
|
|
249
|
+
if (!cap.scopes.includes(scope)) {
|
|
250
|
+
const violation = {
|
|
251
|
+
type: 'scope_denied',
|
|
252
|
+
message: `Scope '${scope}' not granted by capability`,
|
|
253
|
+
capability: token.slice(0, 8) + '...',
|
|
254
|
+
resource,
|
|
255
|
+
timestamp: Date.now(),
|
|
256
|
+
};
|
|
257
|
+
this.violations.push(violation);
|
|
258
|
+
return { allowed: false, violation };
|
|
259
|
+
}
|
|
260
|
+
// Check resource patterns
|
|
261
|
+
let allowed = false;
|
|
262
|
+
for (const pattern of cap.resources) {
|
|
263
|
+
if (this.matchPattern(pattern.pattern, resource)) {
|
|
264
|
+
if (pattern.type === 'deny') {
|
|
265
|
+
const violation = {
|
|
266
|
+
type: 'resource_denied',
|
|
267
|
+
message: `Resource '${resource}' denied by pattern '${pattern.pattern}'`,
|
|
268
|
+
capability: token.slice(0, 8) + '...',
|
|
269
|
+
resource,
|
|
270
|
+
timestamp: Date.now(),
|
|
271
|
+
};
|
|
272
|
+
this.violations.push(violation);
|
|
273
|
+
return { allowed: false, violation };
|
|
274
|
+
}
|
|
275
|
+
allowed = true;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
if (!allowed) {
|
|
279
|
+
const violation = {
|
|
280
|
+
type: 'resource_denied',
|
|
281
|
+
message: `Resource '${resource}' not matched by any allow pattern`,
|
|
282
|
+
capability: token.slice(0, 8) + '...',
|
|
283
|
+
resource,
|
|
284
|
+
timestamp: Date.now(),
|
|
285
|
+
};
|
|
286
|
+
this.violations.push(violation);
|
|
287
|
+
return { allowed: false, violation };
|
|
288
|
+
}
|
|
289
|
+
// Check ancestor chain
|
|
290
|
+
if (cap.parent && !this.isValid(cap.parent)) {
|
|
291
|
+
const violation = {
|
|
292
|
+
type: 'capability_revoked',
|
|
293
|
+
message: 'Parent capability is no longer valid',
|
|
294
|
+
capability: token.slice(0, 8) + '...',
|
|
295
|
+
resource,
|
|
296
|
+
timestamp: Date.now(),
|
|
297
|
+
};
|
|
298
|
+
this.violations.push(violation);
|
|
299
|
+
return { allowed: false, violation };
|
|
300
|
+
}
|
|
301
|
+
return { allowed: true };
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Check content for injection attempts
|
|
305
|
+
*/
|
|
306
|
+
checkInjection(content) {
|
|
307
|
+
if (detectInjection(content)) {
|
|
308
|
+
const violation = {
|
|
309
|
+
type: 'injection_detected',
|
|
310
|
+
message: 'Potential injection attack detected in content',
|
|
311
|
+
timestamp: Date.now(),
|
|
312
|
+
};
|
|
313
|
+
this.violations.push(violation);
|
|
314
|
+
return { safe: false, violation };
|
|
315
|
+
}
|
|
316
|
+
return { safe: true };
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Revoke a capability and all its descendants
|
|
320
|
+
*/
|
|
321
|
+
revoke(token) {
|
|
322
|
+
const cap = this.capabilities.get(token);
|
|
323
|
+
if (cap) {
|
|
324
|
+
cap.revoked = true;
|
|
325
|
+
// Revoke all descendants
|
|
326
|
+
for (const [childToken, child] of this.capabilities) {
|
|
327
|
+
if (child.parent === token) {
|
|
328
|
+
this.revoke(childToken);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Get violation history
|
|
335
|
+
*/
|
|
336
|
+
getViolations() {
|
|
337
|
+
return [...this.violations];
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Clear violation history
|
|
341
|
+
*/
|
|
342
|
+
clearViolations() {
|
|
343
|
+
this.violations = [];
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Glob-style pattern matching
|
|
347
|
+
*/
|
|
348
|
+
matchPattern(pattern, resource) {
|
|
349
|
+
// Convert glob to regex
|
|
350
|
+
const regexPattern = pattern
|
|
351
|
+
.replace(/\*\*/g, '<<<GLOBSTAR>>>')
|
|
352
|
+
.replace(/\*/g, '[^/]*')
|
|
353
|
+
.replace(/<<<GLOBSTAR>>>/g, '.*')
|
|
354
|
+
.replace(/\?/g, '.');
|
|
355
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
356
|
+
return regex.test(resource);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/security/sandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
declare const FileHashSchema: z.ZodObject<{
|
|
3
|
+
path: z.ZodString;
|
|
4
|
+
sha256: z.ZodString;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
path: string;
|
|
7
|
+
sha256: string;
|
|
8
|
+
}, {
|
|
9
|
+
path: string;
|
|
10
|
+
sha256: string;
|
|
11
|
+
}>;
|
|
12
|
+
export declare const SkillManifestSchema: z.ZodObject<{
|
|
13
|
+
name: z.ZodString;
|
|
14
|
+
version: z.ZodString;
|
|
15
|
+
files: z.ZodArray<z.ZodObject<{
|
|
16
|
+
path: z.ZodString;
|
|
17
|
+
sha256: z.ZodString;
|
|
18
|
+
}, "strip", z.ZodTypeAny, {
|
|
19
|
+
path: string;
|
|
20
|
+
sha256: string;
|
|
21
|
+
}, {
|
|
22
|
+
path: string;
|
|
23
|
+
sha256: string;
|
|
24
|
+
}>, "many">;
|
|
25
|
+
timestamp: z.ZodNumber;
|
|
26
|
+
publicKey: z.ZodString;
|
|
27
|
+
}, "strip", z.ZodTypeAny, {
|
|
28
|
+
timestamp: number;
|
|
29
|
+
name: string;
|
|
30
|
+
version: string;
|
|
31
|
+
files: {
|
|
32
|
+
path: string;
|
|
33
|
+
sha256: string;
|
|
34
|
+
}[];
|
|
35
|
+
publicKey: string;
|
|
36
|
+
}, {
|
|
37
|
+
timestamp: number;
|
|
38
|
+
name: string;
|
|
39
|
+
version: string;
|
|
40
|
+
files: {
|
|
41
|
+
path: string;
|
|
42
|
+
sha256: string;
|
|
43
|
+
}[];
|
|
44
|
+
publicKey: string;
|
|
45
|
+
}>;
|
|
46
|
+
export declare const SignedManifestSchema: z.ZodObject<{
|
|
47
|
+
name: z.ZodString;
|
|
48
|
+
version: z.ZodString;
|
|
49
|
+
files: z.ZodArray<z.ZodObject<{
|
|
50
|
+
path: z.ZodString;
|
|
51
|
+
sha256: z.ZodString;
|
|
52
|
+
}, "strip", z.ZodTypeAny, {
|
|
53
|
+
path: string;
|
|
54
|
+
sha256: string;
|
|
55
|
+
}, {
|
|
56
|
+
path: string;
|
|
57
|
+
sha256: string;
|
|
58
|
+
}>, "many">;
|
|
59
|
+
timestamp: z.ZodNumber;
|
|
60
|
+
publicKey: z.ZodString;
|
|
61
|
+
} & {
|
|
62
|
+
signature: z.ZodString;
|
|
63
|
+
}, "strip", z.ZodTypeAny, {
|
|
64
|
+
timestamp: number;
|
|
65
|
+
name: string;
|
|
66
|
+
version: string;
|
|
67
|
+
files: {
|
|
68
|
+
path: string;
|
|
69
|
+
sha256: string;
|
|
70
|
+
}[];
|
|
71
|
+
publicKey: string;
|
|
72
|
+
signature: string;
|
|
73
|
+
}, {
|
|
74
|
+
timestamp: number;
|
|
75
|
+
name: string;
|
|
76
|
+
version: string;
|
|
77
|
+
files: {
|
|
78
|
+
path: string;
|
|
79
|
+
sha256: string;
|
|
80
|
+
}[];
|
|
81
|
+
publicKey: string;
|
|
82
|
+
signature: string;
|
|
83
|
+
}>;
|
|
84
|
+
export type FileHash = z.infer<typeof FileHashSchema>;
|
|
85
|
+
export type SkillManifest = z.infer<typeof SkillManifestSchema>;
|
|
86
|
+
export type SignedManifest = z.infer<typeof SignedManifestSchema>;
|
|
87
|
+
/**
|
|
88
|
+
* Generate Ed25519 keypair for skill signing
|
|
89
|
+
*/
|
|
90
|
+
export declare function generateSigningKeyPair(): {
|
|
91
|
+
publicKey: string;
|
|
92
|
+
privateKey: string;
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Compute SHA256 hash of file contents
|
|
96
|
+
*/
|
|
97
|
+
export declare function hashFile(filePath: string): Promise<string>;
|
|
98
|
+
/**
|
|
99
|
+
* Create skill manifest by hashing all files in directory
|
|
100
|
+
*/
|
|
101
|
+
export declare function createManifest(skillDir: string, name: string, version: string): Promise<SkillManifest>;
|
|
102
|
+
/**
|
|
103
|
+
* Sign manifest with Ed25519 private key
|
|
104
|
+
*/
|
|
105
|
+
export declare function signManifest(manifest: SkillManifest, privateKey: string): SignedManifest;
|
|
106
|
+
/**
|
|
107
|
+
* Verify manifest signature using embedded public key
|
|
108
|
+
*/
|
|
109
|
+
export declare function verifyManifest(signed: SignedManifest): boolean;
|
|
110
|
+
/**
|
|
111
|
+
* Verify skill directory matches signed manifest
|
|
112
|
+
* Returns list of tampered files (empty if valid)
|
|
113
|
+
*/
|
|
114
|
+
export declare function verifySkillIntegrity(skillDir: string, signed: SignedManifest): Promise<{
|
|
115
|
+
valid: boolean;
|
|
116
|
+
tamperedFiles: string[];
|
|
117
|
+
}>;
|
|
118
|
+
/**
|
|
119
|
+
* Load and parse signed manifest from JSON file
|
|
120
|
+
*/
|
|
121
|
+
export declare function loadSignedManifest(manifestPath: string): Promise<SignedManifest>;
|
|
122
|
+
/**
|
|
123
|
+
* Check if skill directory has been modified since signing
|
|
124
|
+
* Useful for hot-reload scenarios
|
|
125
|
+
*/
|
|
126
|
+
export declare function needsReVerification(skillDir: string, signed: SignedManifest): Promise<boolean>;
|
|
127
|
+
export {};
|
|
128
|
+
//# sourceMappingURL=skillVerify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillVerify.d.ts","sourceRoot":"","sources":["../../src/security/skillVerify.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,QAAA,MAAM,cAAc;;;;;;;;;EAGlB,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM9B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAE/B,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAMlE;;GAEG;AACH,wBAAgB,sBAAsB,IAAI;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAOlF;AAMD;;GAEG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGhE;AA8BD;;GAEG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC,CAkBxB;AA2BD;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,cAAc,CAiBxF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAY9D;AAMD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAqCtD;AAMD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAItF;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,OAAO,CAAC,CAqBlB"}
|