@getaegis/cli 0.8.0 → 0.9.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 +43 -14
- package/dist/agent/agent.d.ts +98 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +212 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +2 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/cli/auth.d.ts +19 -0
- package/dist/cli/auth.d.ts.map +1 -0
- package/dist/cli/auth.js +44 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +6 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +241 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/config.d.ts +6 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +125 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +6 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.js +195 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/db.d.ts +6 -0
- package/dist/cli/commands/db.d.ts.map +1 -0
- package/dist/cli/commands/db.js +139 -0
- package/dist/cli/commands/db.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +6 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +39 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/gate.d.ts +6 -0
- package/dist/cli/commands/gate.d.ts.map +1 -0
- package/dist/cli/commands/gate.js +202 -0
- package/dist/cli/commands/gate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +175 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/key.d.ts +6 -0
- package/dist/cli/commands/key.d.ts.map +1 -0
- package/dist/cli/commands/key.js +49 -0
- package/dist/cli/commands/key.js.map +1 -0
- package/dist/cli/commands/ledger.d.ts +6 -0
- package/dist/cli/commands/ledger.d.ts.map +1 -0
- package/dist/cli/commands/ledger.js +140 -0
- package/dist/cli/commands/ledger.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +6 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +224 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/policy.d.ts +6 -0
- package/dist/cli/commands/policy.d.ts.map +1 -0
- package/dist/cli/commands/policy.js +126 -0
- package/dist/cli/commands/policy.js.map +1 -0
- package/dist/cli/commands/user.d.ts +6 -0
- package/dist/cli/commands/user.d.ts.map +1 -0
- package/dist/cli/commands/user.js +150 -0
- package/dist/cli/commands/user.js.map +1 -0
- package/dist/cli/commands/vault-manager.d.ts +6 -0
- package/dist/cli/commands/vault-manager.d.ts.map +1 -0
- package/dist/cli/commands/vault-manager.js +240 -0
- package/dist/cli/commands/vault-manager.js.map +1 -0
- package/dist/cli/commands/vault.d.ts +6 -0
- package/dist/cli/commands/vault.d.ts.map +1 -0
- package/dist/cli/commands/vault.js +265 -0
- package/dist/cli/commands/vault.js.map +1 -0
- package/dist/cli/commands/webhook.d.ts +6 -0
- package/dist/cli/commands/webhook.d.ts.map +1 -0
- package/dist/cli/commands/webhook.js +151 -0
- package/dist/cli/commands/webhook.js.map +1 -0
- package/dist/cli/helpers.d.ts +12 -0
- package/dist/cli/helpers.d.ts.map +1 -0
- package/dist/cli/helpers.js +61 -0
- package/dist/cli/helpers.js.map +1 -0
- package/dist/cli/index.d.ts +19 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +19 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/validation.d.ts +37 -0
- package/dist/cli/validation.d.ts.map +1 -0
- package/dist/cli/validation.js +104 -0
- package/dist/cli/validation.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +37 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +120 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +401 -0
- package/dist/config.js.map +1 -0
- package/dist/dashboard/dashboard-server.d.ts +95 -0
- package/dist/dashboard/dashboard-server.d.ts.map +1 -0
- package/dist/dashboard/dashboard-server.js +329 -0
- package/dist/dashboard/dashboard-server.js.map +1 -0
- package/dist/dashboard/index.d.ts +3 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +2 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/public/assets/index-Cah0_BKk.js +148 -0
- package/dist/dashboard/public/assets/index-CpMruPNh.css +1 -0
- package/dist/dashboard/public/favicon.svg +6 -0
- package/dist/dashboard/public/index.html +14 -0
- package/dist/db.d.ts +27 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +209 -0
- package/dist/db.js.map +1 -0
- package/dist/doctor.d.ts +37 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +216 -0
- package/dist/doctor.js.map +1 -0
- package/dist/gate/body-inspector.d.ts +31 -0
- package/dist/gate/body-inspector.d.ts.map +1 -0
- package/dist/gate/body-inspector.js +193 -0
- package/dist/gate/body-inspector.js.map +1 -0
- package/dist/gate/gate.d.ts +190 -0
- package/dist/gate/gate.d.ts.map +1 -0
- package/dist/gate/gate.js +1243 -0
- package/dist/gate/gate.js.map +1 -0
- package/dist/gate/index.d.ts +7 -0
- package/dist/gate/index.d.ts.map +1 -0
- package/dist/gate/index.js +4 -0
- package/dist/gate/index.js.map +1 -0
- package/dist/gate/rate-limiter.d.ts +59 -0
- package/dist/gate/rate-limiter.d.ts.map +1 -0
- package/dist/gate/rate-limiter.js +120 -0
- package/dist/gate/rate-limiter.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/key-storage/credential-manager-windows.d.ts +19 -0
- package/dist/key-storage/credential-manager-windows.d.ts.map +1 -0
- package/dist/key-storage/credential-manager-windows.js +87 -0
- package/dist/key-storage/credential-manager-windows.js.map +1 -0
- package/dist/key-storage/file-fallback.d.ts +21 -0
- package/dist/key-storage/file-fallback.d.ts.map +1 -0
- package/dist/key-storage/file-fallback.js +62 -0
- package/dist/key-storage/file-fallback.js.map +1 -0
- package/dist/key-storage/index.d.ts +6 -0
- package/dist/key-storage/index.d.ts.map +1 -0
- package/dist/key-storage/index.js +6 -0
- package/dist/key-storage/index.js.map +1 -0
- package/dist/key-storage/key-storage.d.ts +41 -0
- package/dist/key-storage/key-storage.d.ts.map +1 -0
- package/dist/key-storage/key-storage.js +70 -0
- package/dist/key-storage/key-storage.js.map +1 -0
- package/dist/key-storage/keychain-macos.d.ts +19 -0
- package/dist/key-storage/keychain-macos.d.ts.map +1 -0
- package/dist/key-storage/keychain-macos.js +51 -0
- package/dist/key-storage/keychain-macos.js.map +1 -0
- package/dist/key-storage/secret-service-linux.d.ts +19 -0
- package/dist/key-storage/secret-service-linux.d.ts.map +1 -0
- package/dist/key-storage/secret-service-linux.js +55 -0
- package/dist/key-storage/secret-service-linux.js.map +1 -0
- package/dist/ledger/index.d.ts +3 -0
- package/dist/ledger/index.d.ts.map +1 -0
- package/dist/ledger/index.js +2 -0
- package/dist/ledger/index.js.map +1 -0
- package/dist/ledger/ledger.d.ts +98 -0
- package/dist/ledger/ledger.d.ts.map +1 -0
- package/dist/ledger/ledger.js +145 -0
- package/dist/ledger/ledger.js.map +1 -0
- package/dist/logger/index.d.ts +3 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +2 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/logger.d.ts +58 -0
- package/dist/logger/logger.d.ts.map +1 -0
- package/dist/logger/logger.js +201 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +2 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +130 -0
- package/dist/mcp/mcp-server.d.ts.map +1 -0
- package/dist/mcp/mcp-server.js +775 -0
- package/dist/mcp/mcp-server.js.map +1 -0
- package/dist/metrics/index.d.ts +3 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +2 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/metrics.d.ts +88 -0
- package/dist/metrics/metrics.d.ts.map +1 -0
- package/dist/metrics/metrics.js +179 -0
- package/dist/metrics/metrics.js.map +1 -0
- package/dist/policy/index.d.ts +3 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +2 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/policy.d.ts +119 -0
- package/dist/policy/policy.d.ts.map +1 -0
- package/dist/policy/policy.js +426 -0
- package/dist/policy/policy.js.map +1 -0
- package/dist/user/index.d.ts +3 -0
- package/dist/user/index.d.ts.map +1 -0
- package/dist/user/index.js +2 -0
- package/dist/user/index.js.map +1 -0
- package/dist/user/user.d.ts +102 -0
- package/dist/user/user.d.ts.map +1 -0
- package/dist/user/user.js +216 -0
- package/dist/user/user.js.map +1 -0
- package/dist/vault/crypto.d.ts +28 -0
- package/dist/vault/crypto.d.ts.map +1 -0
- package/dist/vault/crypto.js +44 -0
- package/dist/vault/crypto.js.map +1 -0
- package/dist/vault/index.d.ts +10 -0
- package/dist/vault/index.d.ts.map +1 -0
- package/dist/vault/index.js +6 -0
- package/dist/vault/index.js.map +1 -0
- package/dist/vault/seal.d.ts +68 -0
- package/dist/vault/seal.d.ts.map +1 -0
- package/dist/vault/seal.js +110 -0
- package/dist/vault/seal.js.map +1 -0
- package/dist/vault/shamir.d.ts +33 -0
- package/dist/vault/shamir.d.ts.map +1 -0
- package/dist/vault/shamir.js +174 -0
- package/dist/vault/shamir.js.map +1 -0
- package/dist/vault/vault-manager.d.ts +62 -0
- package/dist/vault/vault-manager.d.ts.map +1 -0
- package/dist/vault/vault-manager.js +151 -0
- package/dist/vault/vault-manager.js.map +1 -0
- package/dist/vault/vault.d.ts +104 -0
- package/dist/vault/vault.d.ts.map +1 -0
- package/dist/vault/vault.js +259 -0
- package/dist/vault/vault.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +18 -0
- package/dist/version.js.map +1 -0
- package/dist/webhook/index.d.ts +3 -0
- package/dist/webhook/index.d.ts.map +1 -0
- package/dist/webhook/index.js +2 -0
- package/dist/webhook/index.js.map +1 -0
- package/dist/webhook/webhook.d.ts +114 -0
- package/dist/webhook/webhook.d.ts.map +1 -0
- package/dist/webhook/webhook.js +269 -0
- package/dist/webhook/webhook.js.map +1 -0
- package/package.json +12 -6
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request Body Inspector — scans outbound request bodies for credential-like
|
|
3
|
+
* patterns that may indicate an agent is trying to exfiltrate secrets.
|
|
4
|
+
*
|
|
5
|
+
* This is a defence-in-depth measure. Even though the agent never sees
|
|
6
|
+
* decrypted credentials directly, an agent could attempt to send previously
|
|
7
|
+
* obtained secrets (e.g. from environment variables, config files) through
|
|
8
|
+
* Gate to an attacker-controlled domain. The body inspector catches this.
|
|
9
|
+
*
|
|
10
|
+
* Sensitivity modes:
|
|
11
|
+
* - "off" — no scanning (fastest, least secure)
|
|
12
|
+
* - "warn" — scan and log matches but allow the request through
|
|
13
|
+
* - "block" — scan and block requests containing credential patterns (default)
|
|
14
|
+
*/
|
|
15
|
+
const CREDENTIAL_PATTERNS = [
|
|
16
|
+
// Bearer tokens embedded in body text
|
|
17
|
+
{
|
|
18
|
+
name: 'Bearer token',
|
|
19
|
+
pattern: /Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi,
|
|
20
|
+
minLength: 20,
|
|
21
|
+
},
|
|
22
|
+
// ── Vendor-specific prefixes ───────────────────────────────────
|
|
23
|
+
// OpenAI / Anthropic
|
|
24
|
+
{
|
|
25
|
+
name: 'API key (sk-* prefix)',
|
|
26
|
+
pattern: /\bsk-[A-Za-z0-9]{20,}\b/g,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'API key (pk-* prefix)',
|
|
30
|
+
pattern: /\bpk-[A-Za-z0-9]{20,}\b/g,
|
|
31
|
+
},
|
|
32
|
+
// Slack tokens
|
|
33
|
+
{
|
|
34
|
+
name: 'Slack token (xoxb/xoxp/xoxa/xoxr)',
|
|
35
|
+
pattern: /\bxox[bpar]-[A-Za-z0-9-]{10,}\b/g,
|
|
36
|
+
},
|
|
37
|
+
// GitHub tokens
|
|
38
|
+
{
|
|
39
|
+
name: 'GitHub token (ghp/gho/ghu/ghs/ghr)',
|
|
40
|
+
pattern: /\bgh[pousr]_[A-Za-z0-9]{30,}\b/g,
|
|
41
|
+
},
|
|
42
|
+
// AWS access keys
|
|
43
|
+
{
|
|
44
|
+
name: 'AWS access key',
|
|
45
|
+
pattern: /\bAKIA[A-Z0-9]{16}\b/g,
|
|
46
|
+
},
|
|
47
|
+
// AWS secret keys (40-char base64-like after common JSON/YAML key names)
|
|
48
|
+
{
|
|
49
|
+
name: 'AWS secret key pattern',
|
|
50
|
+
pattern: /(?:aws_secret_access_key|secret_key|secretAccessKey)["':\s]*[A-Za-z0-9/+=]{40}/gi,
|
|
51
|
+
},
|
|
52
|
+
// Google Cloud / Firebase API keys
|
|
53
|
+
{
|
|
54
|
+
name: 'Google API key (AIza* prefix)',
|
|
55
|
+
pattern: /\bAIza[A-Za-z0-9_-]{35}\b/g,
|
|
56
|
+
},
|
|
57
|
+
// Google OAuth tokens
|
|
58
|
+
{
|
|
59
|
+
name: 'Google OAuth token (ya29.*)',
|
|
60
|
+
pattern: /\bya29\.[A-Za-z0-9_-]{20,}\b/g,
|
|
61
|
+
},
|
|
62
|
+
// Stripe keys
|
|
63
|
+
{
|
|
64
|
+
name: 'Stripe key (sk_live/pk_live/rk_live)',
|
|
65
|
+
pattern: /\b[spr]k_live_[A-Za-z0-9]{20,}\b/g,
|
|
66
|
+
},
|
|
67
|
+
// Stripe test keys (still credentials — should not be in body)
|
|
68
|
+
{
|
|
69
|
+
name: 'Stripe test key (sk_test/pk_test/rk_test)',
|
|
70
|
+
pattern: /\b[spr]k_test_[A-Za-z0-9]{20,}\b/g,
|
|
71
|
+
},
|
|
72
|
+
// Twilio API keys
|
|
73
|
+
{
|
|
74
|
+
name: 'Twilio API key',
|
|
75
|
+
pattern: /\bSK[0-9a-f]{32}\b/g,
|
|
76
|
+
},
|
|
77
|
+
// SendGrid API keys
|
|
78
|
+
{
|
|
79
|
+
name: 'SendGrid API key',
|
|
80
|
+
pattern: /\bSG\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\b/g,
|
|
81
|
+
},
|
|
82
|
+
// npm tokens
|
|
83
|
+
{
|
|
84
|
+
name: 'npm token',
|
|
85
|
+
pattern: /\bnpm_[A-Za-z0-9]{36}\b/g,
|
|
86
|
+
},
|
|
87
|
+
// Discord bot tokens (base64.base64.base64 format)
|
|
88
|
+
{
|
|
89
|
+
name: 'Discord bot token',
|
|
90
|
+
pattern: /\b[A-Za-z0-9]{24,}\.[A-Za-z0-9_-]{6}\.[A-Za-z0-9_-]{27,}\b/g,
|
|
91
|
+
},
|
|
92
|
+
// Azure connection strings
|
|
93
|
+
{
|
|
94
|
+
name: 'Azure connection string',
|
|
95
|
+
pattern: /DefaultEndpointsProtocol=https?;AccountName=[^;]+;AccountKey=[^;]+/gi,
|
|
96
|
+
},
|
|
97
|
+
// Mailgun API keys
|
|
98
|
+
{
|
|
99
|
+
name: 'Mailgun API key',
|
|
100
|
+
pattern: /\bkey-[A-Za-z0-9]{32}\b/g,
|
|
101
|
+
},
|
|
102
|
+
// Heroku API keys
|
|
103
|
+
{
|
|
104
|
+
name: 'Heroku API key',
|
|
105
|
+
pattern: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/g,
|
|
106
|
+
},
|
|
107
|
+
// ── Database connection strings ────────────────────────────────
|
|
108
|
+
// PostgreSQL / MySQL / MongoDB / Redis connection URIs with credentials
|
|
109
|
+
{
|
|
110
|
+
name: 'Database connection string',
|
|
111
|
+
pattern: /\b(?:postgres(?:ql)?|mysql|mongodb(?:\+srv)?|redis|rediss):\/\/[^\s"']+:[^\s"']+@[^\s"']+\b/gi,
|
|
112
|
+
},
|
|
113
|
+
// ── Crypto wallet keys ─────────────────────────────────────────
|
|
114
|
+
// Ethereum / EVM private keys (0x + 64 hex chars)
|
|
115
|
+
{
|
|
116
|
+
name: 'Ethereum private key (0x + 64 hex)',
|
|
117
|
+
pattern: /\b0x[0-9a-fA-F]{64}\b/g,
|
|
118
|
+
},
|
|
119
|
+
// ── Generic heuristics ─────────────────────────────────────────
|
|
120
|
+
// Generic long hex strings (likely keys/tokens — 40+ hex chars)
|
|
121
|
+
{
|
|
122
|
+
name: 'Long hex string (possible key)',
|
|
123
|
+
pattern: /\b[0-9a-f]{40,}\b/gi,
|
|
124
|
+
},
|
|
125
|
+
// Base64-encoded strings that are suspiciously long (likely encoded credentials)
|
|
126
|
+
{
|
|
127
|
+
name: 'Long base64 string (possible encoded credential)',
|
|
128
|
+
pattern: /\b[A-Za-z0-9+/]{50,}={0,2}\b/g,
|
|
129
|
+
},
|
|
130
|
+
// JWT tokens (eyJ prefix = base64-encoded JSON header)
|
|
131
|
+
{
|
|
132
|
+
name: 'JWT token',
|
|
133
|
+
pattern: /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,
|
|
134
|
+
},
|
|
135
|
+
// Basic auth in body (username:password in base64)
|
|
136
|
+
{
|
|
137
|
+
name: 'Basic auth credential',
|
|
138
|
+
pattern: /Basic\s+[A-Za-z0-9+/]+=*/gi,
|
|
139
|
+
minLength: 15,
|
|
140
|
+
},
|
|
141
|
+
// Authorization header value embedded in body
|
|
142
|
+
{
|
|
143
|
+
name: 'Authorization value in body',
|
|
144
|
+
pattern: /["']?authorization["']?\s*[:=]\s*["'][^"']{10,}["']/gi,
|
|
145
|
+
},
|
|
146
|
+
// Generic "api_key", "api-key", "apikey" with a value
|
|
147
|
+
{
|
|
148
|
+
name: 'API key assignment',
|
|
149
|
+
pattern: /["']?(?:api[-_]?key|api[-_]?secret|access[-_]?token|secret[-_]?key|client[-_]?secret|auth[-_]?token)["']?\s*[:=]\s*["'][^"']{8,}["']/gi,
|
|
150
|
+
},
|
|
151
|
+
// Private key blocks (RSA, EC, DSA, ENCRYPTED, generic)
|
|
152
|
+
{
|
|
153
|
+
name: 'Private key block',
|
|
154
|
+
pattern: /-----BEGIN\s(?:RSA\s|EC\s|DSA\s|ENCRYPTED\s|OPENSSH\s)?PRIVATE\sKEY-----/g,
|
|
155
|
+
},
|
|
156
|
+
// Password-like assignments in JSON/YAML/config
|
|
157
|
+
{
|
|
158
|
+
name: 'Password assignment',
|
|
159
|
+
pattern: /["']?(?:password|passwd|pwd|secret)["']?\s*[:=]\s*["'][^"']{8,}["']/gi,
|
|
160
|
+
},
|
|
161
|
+
];
|
|
162
|
+
export class BodyInspector {
|
|
163
|
+
/**
|
|
164
|
+
* Scan a request body string for credential-like patterns.
|
|
165
|
+
*
|
|
166
|
+
* @param body The raw request body as a string
|
|
167
|
+
* @returns An InspectionResult indicating whether suspicious patterns were found
|
|
168
|
+
*/
|
|
169
|
+
inspect(body) {
|
|
170
|
+
if (!body || body.length === 0) {
|
|
171
|
+
return { suspicious: false, matches: [] };
|
|
172
|
+
}
|
|
173
|
+
const matches = [];
|
|
174
|
+
for (const { name, pattern, minLength } of CREDENTIAL_PATTERNS) {
|
|
175
|
+
// Reset lastIndex for global regexes
|
|
176
|
+
pattern.lastIndex = 0;
|
|
177
|
+
const found = body.match(pattern);
|
|
178
|
+
if (found) {
|
|
179
|
+
for (const match of found) {
|
|
180
|
+
if (minLength && match.length < minLength)
|
|
181
|
+
continue;
|
|
182
|
+
// Don't include the actual matched value in the log — it might be a credential!
|
|
183
|
+
matches.push(`${name} detected (${match.length} chars)`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
suspicious: matches.length > 0,
|
|
189
|
+
matches,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=body-inspector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body-inspector.js","sourceRoot":"","sources":["../../src/gate/body-inspector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import type { AgentRegistry } from '../agent/index.js';
|
|
2
|
+
import type { Ledger } from '../ledger/index.js';
|
|
3
|
+
import type { AegisMetrics } from '../metrics/index.js';
|
|
4
|
+
import type { Policy } from '../policy/index.js';
|
|
5
|
+
import type { Vault } from '../vault/index.js';
|
|
6
|
+
import type { WebhookManager } from '../webhook/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Check whether an HTTP method is permitted by a credential's scopes.
|
|
9
|
+
* Returns true if the method is allowed, false if blocked.
|
|
10
|
+
*/
|
|
11
|
+
export declare function methodMatchesScope(method: string, scopes: string[]): boolean;
|
|
12
|
+
export interface TlsOptions {
|
|
13
|
+
/** Path to the PEM-encoded certificate file */
|
|
14
|
+
certPath: string;
|
|
15
|
+
/** Path to the PEM-encoded private key file */
|
|
16
|
+
keyPath: string;
|
|
17
|
+
}
|
|
18
|
+
export interface GateOptions {
|
|
19
|
+
port: number;
|
|
20
|
+
vault: Vault;
|
|
21
|
+
ledger: Ledger;
|
|
22
|
+
logLevel?: 'debug' | 'info' | 'warn' | 'error';
|
|
23
|
+
/** TLS configuration — if provided, Gate starts as HTTPS */
|
|
24
|
+
tls?: TlsOptions;
|
|
25
|
+
/** Maximum time (ms) to wait for in-flight requests during shutdown (default: 10000) */
|
|
26
|
+
shutdownTimeoutMs?: number;
|
|
27
|
+
/** Agent registry — required when agent auth is enabled (default) */
|
|
28
|
+
agentRegistry?: AgentRegistry;
|
|
29
|
+
/** When true (default), every request must include a valid X-Aegis-Agent token. Use --no-agent-auth to disable. */
|
|
30
|
+
requireAgentAuth?: boolean;
|
|
31
|
+
/** Directory containing YAML policy files — enables policy evaluation */
|
|
32
|
+
policyDir?: string;
|
|
33
|
+
/** Policy enforcement mode: "enforce" blocks violations, "dry-run" logs but allows (default: "enforce") */
|
|
34
|
+
policyMode?: 'enforce' | 'dry-run';
|
|
35
|
+
/** Prometheus metrics collector — if provided, Gate records request/block metrics */
|
|
36
|
+
metrics?: AegisMetrics;
|
|
37
|
+
/** Webhook manager — if provided, Gate emits webhook events on blocks */
|
|
38
|
+
webhooks?: WebhookManager;
|
|
39
|
+
/** Callback fired after every audit entry is logged — used by dashboard for live feed */
|
|
40
|
+
onAuditEntry?: (entry: AuditBroadcast) => void;
|
|
41
|
+
/** Maximum request body size in bytes (default: 1 MB). Bodies exceeding this return 413. */
|
|
42
|
+
maxBodySize?: number;
|
|
43
|
+
/** Request timeout in milliseconds (default: 30s). Covers both inbound and outbound. */
|
|
44
|
+
requestTimeout?: number;
|
|
45
|
+
/** Maximum concurrent in-flight requests per agent (default: 50). */
|
|
46
|
+
maxConnectionsPerAgent?: number;
|
|
47
|
+
/** Testing: redirect outbound requests to a local server */
|
|
48
|
+
_testUpstream?: {
|
|
49
|
+
protocol: 'http' | 'https';
|
|
50
|
+
hostname: string;
|
|
51
|
+
port: number;
|
|
52
|
+
};
|
|
53
|
+
/** Testing: inject policies directly without loading from disk */
|
|
54
|
+
_testPolicies?: Map<string, Policy>;
|
|
55
|
+
}
|
|
56
|
+
/** Shape of the audit entry broadcast to the dashboard live feed. */
|
|
57
|
+
export interface AuditBroadcast {
|
|
58
|
+
timestamp: string;
|
|
59
|
+
credentialId: string | null;
|
|
60
|
+
credentialName: string | null;
|
|
61
|
+
service: string;
|
|
62
|
+
targetDomain: string;
|
|
63
|
+
method: string;
|
|
64
|
+
path: string;
|
|
65
|
+
status: 'allowed' | 'blocked' | 'system';
|
|
66
|
+
blockedReason: string | null;
|
|
67
|
+
responseCode: number | null;
|
|
68
|
+
agentName: string | null;
|
|
69
|
+
agentTokenPrefix: string | null;
|
|
70
|
+
channel: 'gate' | 'mcp';
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Aegis Gate — HTTP proxy that sits between an AI agent and external APIs.
|
|
74
|
+
*
|
|
75
|
+
* The agent makes requests to: http://localhost:{port}/{service}/actual/api/path
|
|
76
|
+
* Gate resolves the service → looks up credential → injects auth → forwards to real API.
|
|
77
|
+
*
|
|
78
|
+
* The agent NEVER sees the credential.
|
|
79
|
+
*/
|
|
80
|
+
export declare class Gate {
|
|
81
|
+
private server;
|
|
82
|
+
private vault;
|
|
83
|
+
private ledger;
|
|
84
|
+
private port;
|
|
85
|
+
private logger;
|
|
86
|
+
private tlsOptions?;
|
|
87
|
+
private testUpstream?;
|
|
88
|
+
private rateLimiter;
|
|
89
|
+
private bodyInspector;
|
|
90
|
+
private shuttingDown;
|
|
91
|
+
private activeRequests;
|
|
92
|
+
private shutdownTimeoutMs;
|
|
93
|
+
private agentRegistry?;
|
|
94
|
+
private requireAgentAuth;
|
|
95
|
+
private policyMap;
|
|
96
|
+
private policyMode;
|
|
97
|
+
private policyDir?;
|
|
98
|
+
private policyWatcher?;
|
|
99
|
+
private metrics?;
|
|
100
|
+
private webhooks?;
|
|
101
|
+
private onAuditEntry?;
|
|
102
|
+
private maxBodySize;
|
|
103
|
+
private requestTimeout;
|
|
104
|
+
private maxConnectionsPerAgent;
|
|
105
|
+
/** Tracks in-flight request count per agent (keyed by agent ID). */
|
|
106
|
+
private agentConnections;
|
|
107
|
+
/** Tracks upstream service failures for circuit breaker (keyed by service name). */
|
|
108
|
+
private circuitBreaker;
|
|
109
|
+
/** Dedicated HTTP agent for outbound proxy requests (connection pooling with keep-alive). */
|
|
110
|
+
private httpAgent;
|
|
111
|
+
/** Dedicated HTTPS agent for outbound proxy requests (connection pooling with keep-alive + TLS session reuse). */
|
|
112
|
+
private httpsAgent;
|
|
113
|
+
constructor(options: GateOptions);
|
|
114
|
+
/**
|
|
115
|
+
* Start the Gate proxy server.
|
|
116
|
+
*/
|
|
117
|
+
/**
|
|
118
|
+
* Whether the Gate is running with TLS.
|
|
119
|
+
*/
|
|
120
|
+
get isTls(): boolean;
|
|
121
|
+
/**
|
|
122
|
+
* Whether policies are loaded and active.
|
|
123
|
+
*/
|
|
124
|
+
get hasPolicies(): boolean;
|
|
125
|
+
/**
|
|
126
|
+
* The current policy enforcement mode.
|
|
127
|
+
*/
|
|
128
|
+
get currentPolicyMode(): 'enforce' | 'dry-run';
|
|
129
|
+
/**
|
|
130
|
+
* Load policies from a directory.
|
|
131
|
+
*/
|
|
132
|
+
private loadPolicies;
|
|
133
|
+
/**
|
|
134
|
+
* Reload policies from the configured directory.
|
|
135
|
+
* Called on file system changes for hot-reload.
|
|
136
|
+
*/
|
|
137
|
+
reloadPolicies(): void;
|
|
138
|
+
/**
|
|
139
|
+
* Start watching the policy directory for changes (hot-reload).
|
|
140
|
+
* Debounces changes to avoid rapid reloads.
|
|
141
|
+
*/
|
|
142
|
+
private startPolicyWatcher;
|
|
143
|
+
start(): Promise<void>;
|
|
144
|
+
/**
|
|
145
|
+
* The port the server is listening on (may differ from constructor if 0 was passed).
|
|
146
|
+
*/
|
|
147
|
+
get listeningPort(): number;
|
|
148
|
+
/**
|
|
149
|
+
* Stop the Gate proxy server gracefully.
|
|
150
|
+
*
|
|
151
|
+
* 1. Sets `shuttingDown = true` — new requests receive 503 Service Unavailable.
|
|
152
|
+
* 2. Waits for in-flight requests to complete (up to `shutdownTimeoutMs`).
|
|
153
|
+
* 3. Closes the server socket and returns.
|
|
154
|
+
*
|
|
155
|
+
* During the drain phase the server still accepts connections so clients get
|
|
156
|
+
* a clean 503 rather than a connection-refused error.
|
|
157
|
+
*/
|
|
158
|
+
stop(): Promise<{
|
|
159
|
+
drained: boolean;
|
|
160
|
+
activeAtClose: number;
|
|
161
|
+
}>;
|
|
162
|
+
/**
|
|
163
|
+
* Whether the Gate is currently shutting down (draining in-flight requests).
|
|
164
|
+
*/
|
|
165
|
+
get isShuttingDown(): boolean;
|
|
166
|
+
/**
|
|
167
|
+
* The number of currently in-flight requests.
|
|
168
|
+
*/
|
|
169
|
+
get inFlightRequests(): number;
|
|
170
|
+
private handleRequest;
|
|
171
|
+
/**
|
|
172
|
+
* Record an upstream failure for circuit breaker logic.
|
|
173
|
+
* After 5 consecutive failures, the circuit opens for 30 seconds.
|
|
174
|
+
*/
|
|
175
|
+
private recordCircuitFailure;
|
|
176
|
+
/**
|
|
177
|
+
* Inject the credential into outbound request headers based on auth type.
|
|
178
|
+
* For `query` auth, the secret is appended as a URL query parameter instead.
|
|
179
|
+
*/
|
|
180
|
+
private injectCredential;
|
|
181
|
+
/**
|
|
182
|
+
* Log an allowed request and broadcast to dashboard live feed.
|
|
183
|
+
*/
|
|
184
|
+
private auditAllowed;
|
|
185
|
+
/**
|
|
186
|
+
* Log a blocked request and broadcast to dashboard live feed.
|
|
187
|
+
*/
|
|
188
|
+
private auditBlocked;
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/gate/gate.ts"],"names":[],"mappings":"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"}
|