agentlock-shared 0.2.0 → 0.3.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/dist/__tests__/billing.test.d.ts +2 -0
- package/dist/__tests__/billing.test.d.ts.map +1 -0
- package/dist/__tests__/billing.test.js +31 -0
- package/dist/__tests__/billing.test.js.map +1 -0
- package/dist/__tests__/dns-pinning.test.d.ts +2 -0
- package/dist/__tests__/dns-pinning.test.d.ts.map +1 -0
- package/dist/__tests__/dns-pinning.test.js +33 -0
- package/dist/__tests__/dns-pinning.test.js.map +1 -0
- package/dist/__tests__/llm-classifier-cache-store.test.d.ts +2 -0
- package/dist/__tests__/llm-classifier-cache-store.test.d.ts.map +1 -0
- package/dist/__tests__/llm-classifier-cache-store.test.js +65 -0
- package/dist/__tests__/llm-classifier-cache-store.test.js.map +1 -0
- package/dist/__tests__/llm-classifier-cache.test.d.ts +2 -0
- package/dist/__tests__/llm-classifier-cache.test.d.ts.map +1 -0
- package/dist/__tests__/llm-classifier-cache.test.js +44 -0
- package/dist/__tests__/llm-classifier-cache.test.js.map +1 -0
- package/dist/__tests__/llm-classifier.test.d.ts +2 -0
- package/dist/__tests__/llm-classifier.test.d.ts.map +1 -0
- package/dist/__tests__/llm-classifier.test.js +167 -0
- package/dist/__tests__/llm-classifier.test.js.map +1 -0
- package/dist/__tests__/plans-classifier-limits.test.d.ts +2 -0
- package/dist/__tests__/plans-classifier-limits.test.d.ts.map +1 -0
- package/dist/__tests__/plans-classifier-limits.test.js +22 -0
- package/dist/__tests__/plans-classifier-limits.test.js.map +1 -0
- package/dist/__tests__/policy-category-floor.test.d.ts +2 -0
- package/dist/__tests__/policy-category-floor.test.d.ts.map +1 -0
- package/dist/__tests__/policy-category-floor.test.js +46 -0
- package/dist/__tests__/policy-category-floor.test.js.map +1 -0
- package/dist/__tests__/policy-claude-bash.test.d.ts +2 -0
- package/dist/__tests__/policy-claude-bash.test.d.ts.map +1 -0
- package/dist/__tests__/policy-claude-bash.test.js +401 -0
- package/dist/__tests__/policy-claude-bash.test.js.map +1 -0
- package/dist/__tests__/policy-llm-floor.test.d.ts +2 -0
- package/dist/__tests__/policy-llm-floor.test.d.ts.map +1 -0
- package/dist/__tests__/policy-llm-floor.test.js +107 -0
- package/dist/__tests__/policy-llm-floor.test.js.map +1 -0
- package/dist/__tests__/policy-ssh-e2e.test.d.ts +2 -0
- package/dist/__tests__/policy-ssh-e2e.test.d.ts.map +1 -0
- package/dist/__tests__/policy-ssh-e2e.test.js +89 -0
- package/dist/__tests__/policy-ssh-e2e.test.js.map +1 -0
- package/dist/__tests__/policy-ssh-sessions.test.d.ts +2 -0
- package/dist/__tests__/policy-ssh-sessions.test.d.ts.map +1 -0
- package/dist/__tests__/policy-ssh-sessions.test.js +139 -0
- package/dist/__tests__/policy-ssh-sessions.test.js.map +1 -0
- package/dist/__tests__/policy-ssh.test.d.ts +2 -0
- package/dist/__tests__/policy-ssh.test.d.ts.map +1 -0
- package/dist/__tests__/policy-ssh.test.js +180 -0
- package/dist/__tests__/policy-ssh.test.js.map +1 -0
- package/dist/__tests__/policy.test.js +400 -2
- package/dist/__tests__/policy.test.js.map +1 -1
- package/dist/__tests__/redact.test.js +76 -0
- package/dist/__tests__/redact.test.js.map +1 -1
- package/dist/__tests__/signing.test.js +89 -0
- package/dist/__tests__/signing.test.js.map +1 -1
- package/dist/__tests__/ssh-fingerprint.test.d.ts +2 -0
- package/dist/__tests__/ssh-fingerprint.test.d.ts.map +1 -0
- package/dist/__tests__/ssh-fingerprint.test.js +19 -0
- package/dist/__tests__/ssh-fingerprint.test.js.map +1 -0
- package/dist/__tests__/vpn-route.test.d.ts +2 -0
- package/dist/__tests__/vpn-route.test.d.ts.map +1 -0
- package/dist/__tests__/vpn-route.test.js +72 -0
- package/dist/__tests__/vpn-route.test.js.map +1 -0
- package/dist/__tests__/wireguard.test.d.ts +2 -0
- package/dist/__tests__/wireguard.test.d.ts.map +1 -0
- package/dist/__tests__/wireguard.test.js +114 -0
- package/dist/__tests__/wireguard.test.js.map +1 -0
- package/dist/billing.d.ts +12 -0
- package/dist/billing.d.ts.map +1 -0
- package/dist/billing.js +41 -0
- package/dist/billing.js.map +1 -0
- package/dist/crypto.d.ts +5 -0
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +80 -23
- package/dist/crypto.js.map +1 -1
- package/dist/dns-pinning.d.ts +28 -0
- package/dist/dns-pinning.d.ts.map +1 -0
- package/dist/dns-pinning.js +113 -0
- package/dist/dns-pinning.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/llm-classifier-cache-store.d.ts +49 -0
- package/dist/llm-classifier-cache-store.d.ts.map +1 -0
- package/dist/llm-classifier-cache-store.js +63 -0
- package/dist/llm-classifier-cache-store.js.map +1 -0
- package/dist/llm-classifier-cache.d.ts +6 -0
- package/dist/llm-classifier-cache.d.ts.map +1 -0
- package/dist/llm-classifier-cache.js +52 -0
- package/dist/llm-classifier-cache.js.map +1 -0
- package/dist/llm-classifier.d.ts +29 -0
- package/dist/llm-classifier.d.ts.map +1 -0
- package/dist/llm-classifier.js +191 -0
- package/dist/llm-classifier.js.map +1 -0
- package/dist/observability.d.ts +36 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +75 -0
- package/dist/observability.js.map +1 -0
- package/dist/plans.d.ts +17 -0
- package/dist/plans.d.ts.map +1 -1
- package/dist/plans.js +36 -14
- package/dist/plans.js.map +1 -1
- package/dist/policy.d.ts +173 -3
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +910 -42
- package/dist/policy.js.map +1 -1
- package/dist/redact.d.ts.map +1 -1
- package/dist/redact.js +83 -3
- package/dist/redact.js.map +1 -1
- package/dist/regex-safety.d.ts +21 -0
- package/dist/regex-safety.d.ts.map +1 -0
- package/dist/regex-safety.js +49 -0
- package/dist/regex-safety.js.map +1 -0
- package/dist/sanitize.d.ts +31 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +54 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/schemas.d.ts +202 -10
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +91 -1
- package/dist/schemas.js.map +1 -1
- package/dist/signing.d.ts +15 -0
- package/dist/signing.d.ts.map +1 -1
- package/dist/signing.js +53 -4
- package/dist/signing.js.map +1 -1
- package/dist/ssh-fingerprint.d.ts +10 -0
- package/dist/ssh-fingerprint.d.ts.map +1 -0
- package/dist/ssh-fingerprint.js +52 -0
- package/dist/ssh-fingerprint.js.map +1 -0
- package/dist/ssrf.d.ts +36 -0
- package/dist/ssrf.d.ts.map +1 -0
- package/dist/ssrf.js +140 -0
- package/dist/ssrf.js.map +1 -0
- package/dist/types.d.ts +130 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/wireguard.d.ts +63 -0
- package/dist/wireguard.d.ts.map +1 -0
- package/dist/wireguard.js +226 -0
- package/dist/wireguard.js.map +1 -0
- package/package.json +42 -29
- package/.turbo/turbo-build.log +0 -4
- package/.turbo/turbo-test.log +0 -76
- package/dist/__tests__/content-crypto.test.d.ts +0 -2
- package/dist/__tests__/content-crypto.test.d.ts.map +0 -1
- package/dist/__tests__/content-crypto.test.js +0 -117
- package/dist/__tests__/content-crypto.test.js.map +0 -1
- package/dist/__tests__/signing.test (# Edit conflict 2026-04-01 z3etfmC #).js +0 -51
- package/dist/__tests__/signing.test.js (# Edit conflict 2026-04-01 4rndy9C #).map +0 -1
- package/dist/content-crypto.d.ts +0 -24
- package/dist/content-crypto.d.ts.map +0 -1
- package/dist/content-crypto.js +0 -58
- package/dist/content-crypto.js.map +0 -1
- package/src/__tests__/crypto.test.ts +0 -169
- package/src/__tests__/messaging.test.ts +0 -83
- package/src/__tests__/policy.test.ts +0 -222
- package/src/__tests__/redact.test.ts +0 -41
- package/src/__tests__/signing.test.ts +0 -55
- package/src/crypto.ts +0 -235
- package/src/index.ts +0 -8
- package/src/mcp-catalog.ts +0 -181
- package/src/plans.ts +0 -116
- package/src/policy.ts +0 -216
- package/src/redact.ts +0 -131
- package/src/schemas.ts +0 -121
- package/src/signing.ts +0 -120
- package/src/types.ts +0 -213
- package/test-gateway.mjs +0 -47
- package/tsconfig.json +0 -10
- package/vitest.config.ts +0 -8
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VPN_LIMITS_BY_PLAN = exports.WireGuardConfigSchema = void 0;
|
|
4
|
+
exports.parseWireGuardConfig = parseWireGuardConfig;
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
const WG_KEY_RE = /^[A-Za-z0-9+/]{43}=$/;
|
|
7
|
+
const WG_ENDPOINT_RE = /^[a-zA-Z0-9.-]+:\d{1,5}$/;
|
|
8
|
+
const WG_CIDR_RE = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$/;
|
|
9
|
+
function isValidIpv4Cidr(cidr) {
|
|
10
|
+
const [ip, prefix] = cidr.split('/');
|
|
11
|
+
if (!ip || !prefix)
|
|
12
|
+
return false;
|
|
13
|
+
const octets = ip.split('.');
|
|
14
|
+
if (octets.length !== 4)
|
|
15
|
+
return false;
|
|
16
|
+
for (const o of octets) {
|
|
17
|
+
const n = Number(o);
|
|
18
|
+
if (!Number.isInteger(n) || n < 0 || n > 255)
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const p = Number(prefix);
|
|
22
|
+
return Number.isInteger(p) && p >= 0 && p <= 32;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Reject AllowedIPs entries that route so broadly that they would effectively
|
|
26
|
+
* turn the tunnel into a catch-all proxy. The HTTP/MCP connectors use the
|
|
27
|
+
* peer's `allowedIPs` as an SSRF exemption list; a 0/0 entry would make
|
|
28
|
+
* cloud-metadata endpoints and unrelated private networks reachable via a
|
|
29
|
+
* single misconfigured credential.
|
|
30
|
+
*
|
|
31
|
+
* Blocks:
|
|
32
|
+
* - 0.0.0.0/0 (default route)
|
|
33
|
+
* - Any prefix ≤ 7 (anything broader than /8 covers > 1 Class-A network)
|
|
34
|
+
*
|
|
35
|
+
* A workspace admin who genuinely needs to proxy the whole internet must use
|
|
36
|
+
* narrower, intentionally listed CIDRs.
|
|
37
|
+
*/
|
|
38
|
+
function isAllowedIpsEntry(cidr) {
|
|
39
|
+
if (!isValidIpv4Cidr(cidr))
|
|
40
|
+
return false;
|
|
41
|
+
const [ip, prefixStr] = cidr.split('/');
|
|
42
|
+
const prefix = Number(prefixStr);
|
|
43
|
+
// 0.0.0.0/0 is explicitly the "route everything" default — forbid.
|
|
44
|
+
if (ip === '0.0.0.0' && prefix === 0)
|
|
45
|
+
return false;
|
|
46
|
+
// Any prefix 0–7 is a supernet of many /8s and is almost never legitimate.
|
|
47
|
+
if (prefix < 8)
|
|
48
|
+
return false;
|
|
49
|
+
// Block ranges that must never be tunnel-reachable (loopback, link-local /
|
|
50
|
+
// cloud-metadata, 0.0.0.0/8) even via an otherwise-legitimate VPN — this
|
|
51
|
+
// closes the `169.254.169.254/32` SSRF-exemption pivot. RFC1918 / CGNAT stay
|
|
52
|
+
// allowed because reaching a private remote network is the point of a VPN.
|
|
53
|
+
if (allowedIpsOverlapsForbidden(cidr))
|
|
54
|
+
return false;
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
function ipv4ToInt(ip) {
|
|
58
|
+
const octets = ip.split('.');
|
|
59
|
+
if (octets.length !== 4)
|
|
60
|
+
return null;
|
|
61
|
+
let value = 0;
|
|
62
|
+
for (const o of octets) {
|
|
63
|
+
const n = Number(o);
|
|
64
|
+
if (!Number.isInteger(n) || n < 0 || n > 255)
|
|
65
|
+
return null;
|
|
66
|
+
value = value * 256 + n;
|
|
67
|
+
}
|
|
68
|
+
return value >>> 0;
|
|
69
|
+
}
|
|
70
|
+
function cidrRangeV4(cidr) {
|
|
71
|
+
const [ip, prefixStr] = cidr.split('/');
|
|
72
|
+
const base = ipv4ToInt(ip);
|
|
73
|
+
if (base === null)
|
|
74
|
+
return null;
|
|
75
|
+
const prefix = Number(prefixStr);
|
|
76
|
+
if (!Number.isInteger(prefix) || prefix < 0 || prefix > 32)
|
|
77
|
+
return null;
|
|
78
|
+
const mask = prefix === 0 ? 0 : (0xffffffff << (32 - prefix)) >>> 0;
|
|
79
|
+
const network = (base & mask) >>> 0;
|
|
80
|
+
const broadcast = (network | (~mask >>> 0)) >>> 0;
|
|
81
|
+
return [network, broadcast];
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Addresses that must never be reachable through the tunnel, even though a
|
|
85
|
+
* tunnel's AllowedIPs are deliberately exempt from the SSRF guard. RFC1918 and
|
|
86
|
+
* CGNAT are intentionally NOT here — reaching a private remote network is the
|
|
87
|
+
* whole point of a VPN credential. What stays blocked is the runner's own
|
|
88
|
+
* loopback, the link-local / cloud-metadata range, and the 0.0.0.0/8 wildcard.
|
|
89
|
+
*/
|
|
90
|
+
const TUNNEL_FORBIDDEN_V4_CIDRS = ['0.0.0.0/8', '127.0.0.0/8', '169.254.0.0/16'];
|
|
91
|
+
function isForbiddenTunnelIpv4(ip) {
|
|
92
|
+
const value = ipv4ToInt(ip);
|
|
93
|
+
if (value === null)
|
|
94
|
+
return false;
|
|
95
|
+
return TUNNEL_FORBIDDEN_V4_CIDRS.some((cidr) => {
|
|
96
|
+
const range = cidrRangeV4(cidr);
|
|
97
|
+
return range !== null && value >= range[0] && value <= range[1];
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
function isForbiddenTunnelIpv6(ip) {
|
|
101
|
+
const lower = ip.toLowerCase();
|
|
102
|
+
if (lower === '::1')
|
|
103
|
+
return true; // loopback
|
|
104
|
+
if (lower.startsWith('fe80:'))
|
|
105
|
+
return true; // link-local
|
|
106
|
+
const mapped = lower.match(/::ffff:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/);
|
|
107
|
+
if (mapped)
|
|
108
|
+
return isForbiddenTunnelIpv4(mapped[1]);
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
/** True if an AllowedIPs CIDR overlaps any tunnel-forbidden range. */
|
|
112
|
+
function allowedIpsOverlapsForbidden(cidr) {
|
|
113
|
+
const range = cidrRangeV4(cidr);
|
|
114
|
+
if (range === null)
|
|
115
|
+
return false;
|
|
116
|
+
return TUNNEL_FORBIDDEN_V4_CIDRS.some((blocked) => {
|
|
117
|
+
const b = cidrRangeV4(blocked);
|
|
118
|
+
return b !== null && range[0] <= b[1] && b[0] <= range[1];
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
exports.WireGuardConfigSchema = zod_1.z.object({
|
|
122
|
+
privateKey: zod_1.z.string().regex(WG_KEY_RE, 'Invalid WireGuard private key'),
|
|
123
|
+
address: zod_1.z
|
|
124
|
+
.string()
|
|
125
|
+
.regex(WG_CIDR_RE, 'Invalid CIDR for Address')
|
|
126
|
+
.refine(isValidIpv4Cidr, 'Invalid IPv4 CIDR'),
|
|
127
|
+
dns: zod_1.z
|
|
128
|
+
.array(zod_1.z
|
|
129
|
+
.string()
|
|
130
|
+
.ip()
|
|
131
|
+
.refine((ip) => !isForbiddenTunnelIpv4(ip) && !isForbiddenTunnelIpv6(ip), 'DNS server must not be a loopback, link-local or cloud-metadata address'))
|
|
132
|
+
.max(4)
|
|
133
|
+
.optional(),
|
|
134
|
+
mtu: zod_1.z.number().int().min(576).max(9000).optional(),
|
|
135
|
+
peer: zod_1.z.object({
|
|
136
|
+
publicKey: zod_1.z.string().regex(WG_KEY_RE, 'Invalid peer public key'),
|
|
137
|
+
presharedKey: zod_1.z.string().regex(WG_KEY_RE, 'Invalid preshared key').optional(),
|
|
138
|
+
endpoint: zod_1.z
|
|
139
|
+
.string()
|
|
140
|
+
.regex(WG_ENDPOINT_RE, 'Endpoint must be host:port')
|
|
141
|
+
.refine((s) => {
|
|
142
|
+
const port = Number(s.split(':').pop());
|
|
143
|
+
return Number.isInteger(port) && port >= 1 && port <= 65535;
|
|
144
|
+
}, 'Endpoint port must be between 1 and 65535'),
|
|
145
|
+
allowedIPs: zod_1.z
|
|
146
|
+
.array(zod_1.z
|
|
147
|
+
.string()
|
|
148
|
+
.regex(WG_CIDR_RE, 'Invalid CIDR in AllowedIPs')
|
|
149
|
+
.refine(isValidIpv4Cidr, 'Invalid IPv4 CIDR')
|
|
150
|
+
.refine(isAllowedIpsEntry, 'AllowedIPs entries broader than /8 are not allowed (e.g. 0.0.0.0/0). Use a narrower, intentional CIDR.'))
|
|
151
|
+
.min(1)
|
|
152
|
+
.max(20),
|
|
153
|
+
persistentKeepalive: zod_1.z.number().int().min(0).max(65535).optional(),
|
|
154
|
+
}).strict(),
|
|
155
|
+
}).strict();
|
|
156
|
+
/**
|
|
157
|
+
* Parse a wg-quick-style .conf file into a structured WireGuardConfig.
|
|
158
|
+
* Exactly one [Interface] and exactly one [Peer] block are required.
|
|
159
|
+
*/
|
|
160
|
+
function parseWireGuardConfig(raw) {
|
|
161
|
+
const sections = {};
|
|
162
|
+
let current = null;
|
|
163
|
+
const peerBlocks = [];
|
|
164
|
+
for (const rawLine of raw.split('\n')) {
|
|
165
|
+
const line = rawLine.replace(/#.*$/, '').trim();
|
|
166
|
+
if (!line)
|
|
167
|
+
continue;
|
|
168
|
+
const sectionMatch = line.match(/^\[(\w+)\]$/);
|
|
169
|
+
if (sectionMatch) {
|
|
170
|
+
current = sectionMatch[1];
|
|
171
|
+
if (current === 'Peer') {
|
|
172
|
+
peerBlocks.push({});
|
|
173
|
+
}
|
|
174
|
+
else if (current === 'Interface') {
|
|
175
|
+
if (sections[current])
|
|
176
|
+
throw new Error('Duplicate [Interface] section');
|
|
177
|
+
sections[current] = {};
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
sections[current] = {};
|
|
181
|
+
}
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
const kvMatch = line.match(/^([A-Za-z]+)\s*=\s*(.+)$/);
|
|
185
|
+
if (!kvMatch || !current)
|
|
186
|
+
continue;
|
|
187
|
+
const [, key, value] = kvMatch;
|
|
188
|
+
if (current === 'Peer') {
|
|
189
|
+
const block = peerBlocks[peerBlocks.length - 1];
|
|
190
|
+
if (key in block)
|
|
191
|
+
throw new Error(`Duplicate key: ${key}`);
|
|
192
|
+
block[key] = value;
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
if (key in sections[current])
|
|
196
|
+
throw new Error(`Duplicate key: ${key}`);
|
|
197
|
+
sections[current][key] = value;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (!sections.Interface)
|
|
201
|
+
throw new Error('Missing [Interface] section');
|
|
202
|
+
if (peerBlocks.length !== 1)
|
|
203
|
+
throw new Error('Config must contain exactly one [Peer] block');
|
|
204
|
+
const iface = sections.Interface;
|
|
205
|
+
const peer = peerBlocks[0];
|
|
206
|
+
const parsed = {
|
|
207
|
+
privateKey: iface.PrivateKey,
|
|
208
|
+
address: iface.Address,
|
|
209
|
+
...(iface.DNS && { dns: iface.DNS.split(',').map((s) => s.trim()).filter(Boolean) }),
|
|
210
|
+
...(iface.MTU && { mtu: parseInt(iface.MTU, 10) }),
|
|
211
|
+
peer: {
|
|
212
|
+
publicKey: peer.PublicKey,
|
|
213
|
+
...(peer.PresharedKey && { presharedKey: peer.PresharedKey }),
|
|
214
|
+
endpoint: peer.Endpoint,
|
|
215
|
+
allowedIPs: (peer.AllowedIPs ?? '').split(',').map((s) => s.trim()).filter(Boolean),
|
|
216
|
+
...(peer.PersistentKeepalive && { persistentKeepalive: parseInt(peer.PersistentKeepalive, 10) }),
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
return exports.WireGuardConfigSchema.parse(parsed);
|
|
220
|
+
}
|
|
221
|
+
exports.VPN_LIMITS_BY_PLAN = {
|
|
222
|
+
free: 0,
|
|
223
|
+
pro: 3,
|
|
224
|
+
team: 10,
|
|
225
|
+
};
|
|
226
|
+
//# sourceMappingURL=wireguard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wireguard.js","sourceRoot":"","sources":["../src/wireguard.ts"],"names":[],"mappings":";;;AAkKA,oDA0DC;AA5ND,6BAAwB;AAExB,MAAM,SAAS,GAAG,sBAAsB,CAAC;AACzC,MAAM,cAAc,GAAG,0BAA0B,CAAC;AAClD,MAAM,UAAU,GAAG,+CAA+C,CAAC;AAEnE,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACjC,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG;YAAE,OAAO,KAAK,CAAC;IAC7D,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACzB,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AAClD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,iBAAiB,CAAC,IAAY;IACrC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACjC,mEAAmE;IACnE,IAAI,EAAE,KAAK,SAAS,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,2EAA2E;IAC3E,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7B,2EAA2E;IAC3E,yEAAyE;IACzE,6EAA6E;IAC7E,2EAA2E;IAC3E,IAAI,2BAA2B,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,EAAU;IAC3B,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG;YAAE,OAAO,IAAI,CAAC;QAC1D,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,KAAK,KAAK,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC3B,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,EAAE;QAAE,OAAO,IAAI,CAAC;IACxE,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,yBAAyB,GAAG,CAAC,WAAW,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC;AAEjF,SAAS,qBAAqB,CAAC,EAAU;IACvC,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC5B,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACjC,OAAO,yBAAyB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QAC7C,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,EAAU;IACvC,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/B,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC,CAAC,WAAW;IAC7C,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,aAAa;IACzD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAC3E,IAAI,MAAM;QAAE,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,sEAAsE;AACtE,SAAS,2BAA2B,CAAC,IAAY;IAC/C,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACjC,OAAO,yBAAyB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QAChD,MAAM,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAC/B,OAAO,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC;AAEY,QAAA,qBAAqB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC5C,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,+BAA+B,CAAC;IACxE,OAAO,EAAE,OAAC;SACP,MAAM,EAAE;SACR,KAAK,CAAC,UAAU,EAAE,0BAA0B,CAAC;SAC7C,MAAM,CAAC,eAAe,EAAE,mBAAmB,CAAC;IAC/C,GAAG,EAAE,OAAC;SACH,KAAK,CACJ,OAAC;SACE,MAAM,EAAE;SACR,EAAE,EAAE;SACJ,MAAM,CACL,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,qBAAqB,CAAC,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,EAChE,yEAAyE,CAC1E,CACJ;SACA,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;IACb,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;IACnD,IAAI,EAAE,OAAC,CAAC,MAAM,CAAC;QACb,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,yBAAyB,CAAC;QACjE,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC,QAAQ,EAAE;QAC7E,QAAQ,EAAE,OAAC;aACR,MAAM,EAAE;aACR,KAAK,CAAC,cAAc,EAAE,4BAA4B,CAAC;aACnD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACZ,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACxC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC;QAC9D,CAAC,EAAE,2CAA2C,CAAC;QACjD,UAAU,EAAE,OAAC;aACV,KAAK,CACJ,OAAC;aACE,MAAM,EAAE;aACR,KAAK,CAAC,UAAU,EAAE,4BAA4B,CAAC;aAC/C,MAAM,CAAC,eAAe,EAAE,mBAAmB,CAAC;aAC5C,MAAM,CACL,iBAAiB,EACjB,wGAAwG,CACzG,CACJ;aACA,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,EAAE,CAAC;QACV,mBAAmB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;KACnE,CAAC,CAAC,MAAM,EAAE;CACZ,CAAC,CAAC,MAAM,EAAE,CAAC;AAIZ;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,GAAW;IAC9C,MAAM,QAAQ,GAA2C,EAAE,CAAC;IAC5D,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,MAAM,UAAU,GAA6B,EAAE,CAAC;IAEhD,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;gBACvB,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtB,CAAC;iBAAM,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;gBACnC,IAAI,QAAQ,CAAC,OAAO,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBACxE,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACzB,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACvD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO;YAAE,SAAS;QACnC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC;QAE/B,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAChD,IAAI,GAAG,IAAI,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC;YAC3D,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC;YACvE,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACjC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACxE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAE7F,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC;IACjC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAE3B,MAAM,MAAM,GAAG;QACb,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACpF,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QAClD,IAAI,EAAE;YACJ,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;YAC7D,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YACnF,GAAG,CAAC,IAAI,CAAC,mBAAmB,IAAI,EAAE,mBAAmB,EAAE,QAAQ,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC,EAAE,CAAC;SACjG;KACF,CAAC;IAEF,OAAO,6BAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAEY,QAAA,kBAAkB,GAAG;IAChC,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,EAAE;CACA,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,29 +1,42 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "agentlock-shared",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
"
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
"
|
|
28
|
-
|
|
29
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "agentlock-shared",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"files": [
|
|
5
|
+
"dist"
|
|
6
|
+
],
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./ssrf": {
|
|
16
|
+
"types": "./dist/ssrf.d.ts",
|
|
17
|
+
"import": "./dist/ssrf.js",
|
|
18
|
+
"require": "./dist/ssrf.js"
|
|
19
|
+
},
|
|
20
|
+
"./dns-pinning": {
|
|
21
|
+
"types": "./dist/dns-pinning.d.ts",
|
|
22
|
+
"import": "./dist/dns-pinning.js",
|
|
23
|
+
"require": "./dist/dns-pinning.js"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"tweetnacl": "^1.0.3",
|
|
28
|
+
"tweetnacl-util": "^0.15.1",
|
|
29
|
+
"zod": "^3.23.8"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/node": "^22.19.11",
|
|
33
|
+
"typescript": "^5.6.0",
|
|
34
|
+
"vitest": "^4.0.18"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsc",
|
|
38
|
+
"typecheck": "tsc --noEmit",
|
|
39
|
+
"test": "vitest run",
|
|
40
|
+
"test:watch": "vitest"
|
|
41
|
+
}
|
|
42
|
+
}
|
package/.turbo/turbo-build.log
DELETED
package/.turbo/turbo-test.log
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
> agentlock-shared@0.1.0 test D:\agentlock\packages\shared
|
|
3
|
-
> vitest run
|
|
4
|
-
|
|
5
|
-
▲ [WARNING] The condition "types" here will never be used as it comes after both "import" and "require" [package.json]
|
|
6
|
-
|
|
7
|
-
package.json:10:6:
|
|
8
|
-
10 │ "types": "./dist/index.d.ts"
|
|
9
|
-
╵ ~~~~~~~
|
|
10
|
-
|
|
11
|
-
The "import" condition comes earlier and will be used for all "import" statements:
|
|
12
|
-
|
|
13
|
-
package.json:8:6:
|
|
14
|
-
8 │ "import": "./dist/index.js",
|
|
15
|
-
╵ ~~~~~~~~
|
|
16
|
-
|
|
17
|
-
The "require" condition comes earlier and will be used for all "require" calls:
|
|
18
|
-
|
|
19
|
-
package.json:9:6:
|
|
20
|
-
9 │ "require": "./dist/index.js",
|
|
21
|
-
╵ ~~~~~~~~~
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
[1m[46m RUN [49m[22m [36mv4.0.18 [39m[90mD:/agentlock/packages/shared[39m
|
|
25
|
-
|
|
26
|
-
[31m❯[39m src/__tests__/policy.test.ts [2m([22m[2m21 tests[22m[2m | [22m[31m1 failed[39m[2m)[22m[32m 12[2mms[22m[39m
|
|
27
|
-
[31m [31m×[31m should ALLOW read actions by default[39m[32m 7[2mms[22m[39m
|
|
28
|
-
[32m✓[39m should REQUIRE_APPROVAL for write actions[32m 0[2mms[22m[39m
|
|
29
|
-
[32m✓[39m should BLOCK admin actions[32m 0[2mms[22m[39m
|
|
30
|
-
[32m✓[39m should REQUIRE_APPROVAL for financial actions[32m 0[2mms[22m[39m
|
|
31
|
-
[32m✓[39m should BLOCK disallowed HTTP domains[32m 0[2mms[22m[39m
|
|
32
|
-
[32m✓[39m should BLOCK explicitly blocklisted domains[32m 0[2mms[22m[39m
|
|
33
|
-
[32m✓[39m should REQUIRE_APPROVAL for admin actions even when defaultMode is allow[32m 0[2mms[22m[39m
|
|
34
|
-
[32m✓[39m should REQUIRE_APPROVAL for financial actions even when defaultMode is allow[32m 0[2mms[22m[39m
|
|
35
|
-
[32m✓[39m should REQUIRE_APPROVAL for admin action even with explicit ALLOW rule[32m 0[2mms[22m[39m
|
|
36
|
-
[32m✓[39m should REQUIRE_APPROVAL for financial action even with explicit ALLOW rule[32m 0[2mms[22m[39m
|
|
37
|
-
[32m✓[39m should still respect explicit rules for admin even with defaultMode allow[32m 0[2mms[22m[39m
|
|
38
|
-
[32m✓[39m should BLOCK when cost exceeds limit[32m 0[2mms[22m[39m
|
|
39
|
-
[32m✓[39m should enforce HTTP domain allowlist even with mixed-case tool name[32m 0[2mms[22m[39m
|
|
40
|
-
[32m✓[39m should match tool-specific rules case-insensitively[32m 0[2mms[22m[39m
|
|
41
|
-
[32m✓[39m should not match subdomain of blocklisted domain (e.g., notevil.com vs evil.com)[32m 0[2mms[22m[39m
|
|
42
|
-
[32m✓[39m should BLOCK HTTP tool with no URL in payload[32m 0[2mms[22m[39m
|
|
43
|
-
[32m✓[39m should REQUIRE_APPROVAL for browser.open[32m 0[2mms[22m[39m
|
|
44
|
-
[32m✓[39m should BLOCK browser.* actions without a session (reaching policy engine)[32m 0[2mms[22m[39m
|
|
45
|
-
[32m✓[39m should BLOCK unknown action types[32m 0[2mms[22m[39m
|
|
46
|
-
[32m✓[39m should not enforce budget check when cost_estimate is omitted[32m 0[2mms[22m[39m
|
|
47
|
-
[32m✓[39m should REQUIRE_APPROVAL when HTTP allowlist is empty (safe default)[32m 0[2mms[22m[39m
|
|
48
|
-
[32m✓[39m src/__tests__/redact.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
|
|
49
|
-
[32m✓[39m src/__tests__/signing.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 73[2mms[22m[39m
|
|
50
|
-
[32m✓[39m src/__tests__/messaging.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 7[2mms[22m[39m
|
|
51
|
-
|
|
52
|
-
[31m⎯⎯⎯⎯⎯⎯⎯[39m[1m[41m Failed Tests 1 [49m[22m[31m⎯⎯⎯⎯⎯⎯⎯[39m
|
|
53
|
-
|
|
54
|
-
[41m[1m FAIL [22m[49m src/__tests__/policy.test.ts[2m > [22mPolicy Engine[2m > [22mshould ALLOW read actions by default
|
|
55
|
-
[31m[1mAssertionError[22m: expected 'BLOCK' to be 'ALLOW' // Object.is equality[39m
|
|
56
|
-
|
|
57
|
-
Expected: [32m"ALLOW"[39m
|
|
58
|
-
Received: [31m"BLOCK"[39m
|
|
59
|
-
|
|
60
|
-
[36m [2m❯[22m src/__tests__/policy.test.ts:[2m8:67[22m[39m
|
|
61
|
-
[90m 6| [39m [34mit[39m([32m'should ALLOW read actions by default'[39m[33m,[39m () [33m=>[39m {
|
|
62
|
-
[90m 7| [39m const action: AgentActionRequest = { action_type: 'read', tool: 'h…
|
|
63
|
-
[90m 8| [39m expect(evaluatePolicy(action, DEFAULT_POLICY_RULES).decision).toBe…
|
|
64
|
-
[90m | [39m [31m^[39m
|
|
65
|
-
[90m 9| [39m })[33m;[39m
|
|
66
|
-
[90m 10| [39m
|
|
67
|
-
|
|
68
|
-
[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯[22m[39m
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
[2m Test Files [22m [1m[31m1 failed[39m[22m[2m | [22m[1m[32m3 passed[39m[22m[90m (4)[39m
|
|
72
|
-
[2m Tests [22m [1m[31m1 failed[39m[22m[2m | [22m[1m[32m43 passed[39m[22m[90m (44)[39m
|
|
73
|
-
[2m Start at [22m 00:05:31
|
|
74
|
-
[2m Duration [22m 738ms[2m (transform 982ms, setup 0ms, import 1.39s, tests 96ms, environment 1ms)[22m
|
|
75
|
-
|
|
76
|
-
ELIFECYCLE Test failed. See above for more details.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"content-crypto.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/content-crypto.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const vitest_1 = require("vitest");
|
|
7
|
-
const content_crypto_1 = require("../content-crypto");
|
|
8
|
-
const crypto_1 = require("../crypto");
|
|
9
|
-
const tweetnacl_1 = __importDefault(require("tweetnacl"));
|
|
10
|
-
const tweetnacl_util_1 = require("tweetnacl-util");
|
|
11
|
-
(0, vitest_1.describe)('content-crypto', () => {
|
|
12
|
-
(0, vitest_1.describe)('generateWCK', () => {
|
|
13
|
-
(0, vitest_1.it)('returns a 32-byte key', () => {
|
|
14
|
-
const wck = (0, content_crypto_1.generateWCK)();
|
|
15
|
-
(0, vitest_1.expect)(wck).toBeInstanceOf(Uint8Array);
|
|
16
|
-
(0, vitest_1.expect)(wck.length).toBe(32);
|
|
17
|
-
});
|
|
18
|
-
(0, vitest_1.it)('generates unique keys', () => {
|
|
19
|
-
const a = (0, content_crypto_1.generateWCK)();
|
|
20
|
-
const b = (0, content_crypto_1.generateWCK)();
|
|
21
|
-
(0, vitest_1.expect)(Buffer.from(a).equals(Buffer.from(b))).toBe(false);
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
(0, vitest_1.describe)('wrapKey / unwrapKey (server roundtrip)', () => {
|
|
25
|
-
(0, vitest_1.it)('wraps and unwraps a WCK with MASTER_KEY', () => {
|
|
26
|
-
const masterKey = (0, crypto_1.generateKey)();
|
|
27
|
-
const wck = (0, content_crypto_1.generateWCK)();
|
|
28
|
-
const { ciphertext, nonce } = (0, content_crypto_1.wrapKey)(wck, masterKey);
|
|
29
|
-
(0, vitest_1.expect)(typeof ciphertext).toBe('string');
|
|
30
|
-
(0, vitest_1.expect)(typeof nonce).toBe('string');
|
|
31
|
-
const unwrapped = (0, content_crypto_1.unwrapKey)(ciphertext, nonce, masterKey);
|
|
32
|
-
(0, vitest_1.expect)(Buffer.from(unwrapped).equals(Buffer.from(wck))).toBe(true);
|
|
33
|
-
});
|
|
34
|
-
(0, vitest_1.it)('throws with wrong wrapping key', () => {
|
|
35
|
-
const masterKey = (0, crypto_1.generateKey)();
|
|
36
|
-
const wrongKey = (0, crypto_1.generateKey)();
|
|
37
|
-
const wck = (0, content_crypto_1.generateWCK)();
|
|
38
|
-
const { ciphertext, nonce } = (0, content_crypto_1.wrapKey)(wck, masterKey);
|
|
39
|
-
(0, vitest_1.expect)(() => (0, content_crypto_1.unwrapKey)(ciphertext, nonce, wrongKey)).toThrow('unwrapKey failed');
|
|
40
|
-
});
|
|
41
|
-
(0, vitest_1.it)('throws with corrupted ciphertext', () => {
|
|
42
|
-
const masterKey = (0, crypto_1.generateKey)();
|
|
43
|
-
const wck = (0, content_crypto_1.generateWCK)();
|
|
44
|
-
const { ciphertext, nonce } = (0, content_crypto_1.wrapKey)(wck, masterKey);
|
|
45
|
-
// Corrupt ciphertext
|
|
46
|
-
const bytes = (0, tweetnacl_util_1.decodeBase64)(ciphertext);
|
|
47
|
-
bytes[0] ^= 0xff;
|
|
48
|
-
const corrupted = Buffer.from(bytes).toString('base64');
|
|
49
|
-
(0, vitest_1.expect)(() => (0, content_crypto_1.unwrapKey)(corrupted, nonce, masterKey)).toThrow();
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
(0, vitest_1.describe)('wrapWCKForUser / unwrapWCKFromUser (passphrase roundtrip)', () => {
|
|
53
|
-
(0, vitest_1.it)('wraps and unwraps with passphrase', () => {
|
|
54
|
-
const wck = (0, content_crypto_1.generateWCK)();
|
|
55
|
-
const passphrase = 'my-strong-passphrase-2024!';
|
|
56
|
-
const { ciphertext, nonce, salt } = (0, content_crypto_1.wrapWCKForUser)(wck, passphrase);
|
|
57
|
-
(0, vitest_1.expect)(typeof ciphertext).toBe('string');
|
|
58
|
-
(0, vitest_1.expect)(typeof nonce).toBe('string');
|
|
59
|
-
(0, vitest_1.expect)(typeof salt).toBe('string');
|
|
60
|
-
const unwrapped = (0, content_crypto_1.unwrapWCKFromUser)(ciphertext, nonce, salt, passphrase);
|
|
61
|
-
(0, vitest_1.expect)(Buffer.from(unwrapped).equals(Buffer.from(wck))).toBe(true);
|
|
62
|
-
});
|
|
63
|
-
(0, vitest_1.it)('throws with wrong passphrase', () => {
|
|
64
|
-
const wck = (0, content_crypto_1.generateWCK)();
|
|
65
|
-
const { ciphertext, nonce, salt } = (0, content_crypto_1.wrapWCKForUser)(wck, 'correct-pass');
|
|
66
|
-
(0, vitest_1.expect)(() => (0, content_crypto_1.unwrapWCKFromUser)(ciphertext, nonce, salt, 'wrong-pass')).toThrow();
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
(0, vitest_1.describe)('deriveKEK', () => {
|
|
70
|
-
(0, vitest_1.it)('is deterministic for same passphrase+salt', () => {
|
|
71
|
-
const salt = tweetnacl_1.default.randomBytes(32);
|
|
72
|
-
const kek1 = (0, content_crypto_1.deriveKEK)('test-passphrase', salt);
|
|
73
|
-
const kek2 = (0, content_crypto_1.deriveKEK)('test-passphrase', salt);
|
|
74
|
-
(0, vitest_1.expect)(Buffer.from(kek1).equals(Buffer.from(kek2))).toBe(true);
|
|
75
|
-
});
|
|
76
|
-
(0, vitest_1.it)('produces different keys for different passphrases', () => {
|
|
77
|
-
const salt = tweetnacl_1.default.randomBytes(32);
|
|
78
|
-
const kek1 = (0, content_crypto_1.deriveKEK)('pass-1', salt);
|
|
79
|
-
const kek2 = (0, content_crypto_1.deriveKEK)('pass-2', salt);
|
|
80
|
-
(0, vitest_1.expect)(Buffer.from(kek1).equals(Buffer.from(kek2))).toBe(false);
|
|
81
|
-
});
|
|
82
|
-
(0, vitest_1.it)('produces different keys for different salts', () => {
|
|
83
|
-
const salt1 = tweetnacl_1.default.randomBytes(32);
|
|
84
|
-
const salt2 = tweetnacl_1.default.randomBytes(32);
|
|
85
|
-
const kek1 = (0, content_crypto_1.deriveKEK)('same-pass', salt1);
|
|
86
|
-
const kek2 = (0, content_crypto_1.deriveKEK)('same-pass', salt2);
|
|
87
|
-
(0, vitest_1.expect)(Buffer.from(kek1).equals(Buffer.from(kek2))).toBe(false);
|
|
88
|
-
});
|
|
89
|
-
(0, vitest_1.it)('returns a 32-byte key', () => {
|
|
90
|
-
const salt = tweetnacl_1.default.randomBytes(32);
|
|
91
|
-
const kek = (0, content_crypto_1.deriveKEK)('test', salt);
|
|
92
|
-
(0, vitest_1.expect)(kek.length).toBe(32);
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
(0, vitest_1.describe)('cross-compatibility with existing encrypt/decrypt', () => {
|
|
96
|
-
(0, vitest_1.it)('WCK works as a key with existing encrypt/decrypt', () => {
|
|
97
|
-
const wck = (0, content_crypto_1.generateWCK)();
|
|
98
|
-
const data = JSON.stringify({ tool: 'demo.write', action_type: 'write' });
|
|
99
|
-
const encrypted = (0, crypto_1.encrypt)(data, wck);
|
|
100
|
-
const decrypted = (0, crypto_1.decrypt)(encrypted, wck);
|
|
101
|
-
(0, vitest_1.expect)(decrypted).toBe(data);
|
|
102
|
-
});
|
|
103
|
-
(0, vitest_1.it)('data encrypted with WCK cannot be decrypted with MASTER_KEY', () => {
|
|
104
|
-
const wck = (0, content_crypto_1.generateWCK)();
|
|
105
|
-
const masterKey = (0, crypto_1.generateKey)();
|
|
106
|
-
const encrypted = (0, crypto_1.encrypt)('sensitive data', wck);
|
|
107
|
-
(0, vitest_1.expect)(() => (0, crypto_1.decrypt)(encrypted, masterKey)).toThrow();
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
(0, vitest_1.describe)('version constants', () => {
|
|
111
|
-
(0, vitest_1.it)('has correct version values', () => {
|
|
112
|
-
(0, vitest_1.expect)(content_crypto_1.PAYLOAD_VERSION_LEGACY).toBe(0);
|
|
113
|
-
(0, vitest_1.expect)(content_crypto_1.PAYLOAD_VERSION_WCK).toBe(1);
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
//# sourceMappingURL=content-crypto.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"content-crypto.test.js","sourceRoot":"","sources":["../../src/__tests__/content-crypto.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const vitest_1 = require("vitest");
|
|
4
|
-
const signing_js_1 = require("../signing.js");
|
|
5
|
-
(0, vitest_1.describe)('Ed25519 Signing', () => {
|
|
6
|
-
(0, vitest_1.it)('should generate valid keypair', () => {
|
|
7
|
-
const kp = (0, signing_js_1.generateKeypair)();
|
|
8
|
-
(0, vitest_1.expect)(kp.publicKey).toBeTruthy();
|
|
9
|
-
(0, vitest_1.expect)(kp.privateKey).toBeTruthy();
|
|
10
|
-
(0, vitest_1.expect)(kp.publicKey.length).toBeGreaterThan(0);
|
|
11
|
-
});
|
|
12
|
-
(0, vitest_1.it)('should sign and verify a request', () => {
|
|
13
|
-
const kp = (0, signing_js_1.generateKeypair)();
|
|
14
|
-
const body = { action_type: 'write', tool: 'demo', payload: { key: 'value' } };
|
|
15
|
-
const headers = (0, signing_js_1.signRequest)(body, 'agent-123', kp.privateKey);
|
|
16
|
-
(0, vitest_1.expect)(() => (0, signing_js_1.verifyRequest)(body, headers, kp.publicKey)).not.toThrow();
|
|
17
|
-
});
|
|
18
|
-
(0, vitest_1.it)('should reject tampered body (top-level field)', () => {
|
|
19
|
-
const kp = (0, signing_js_1.generateKeypair)();
|
|
20
|
-
const body = { action_type: 'write', tool: 'demo', payload: { key: 'value' } };
|
|
21
|
-
const headers = (0, signing_js_1.signRequest)(body, 'agent-123', kp.privateKey);
|
|
22
|
-
const tampered = { ...body, tool: 'admin' };
|
|
23
|
-
(0, vitest_1.expect)(() => (0, signing_js_1.verifyRequest)(tampered, headers, kp.publicKey)).toThrow('Invalid signature');
|
|
24
|
-
});
|
|
25
|
-
(0, vitest_1.it)('should reject tampered nested payload field', () => {
|
|
26
|
-
const kp = (0, signing_js_1.generateKeypair)();
|
|
27
|
-
const body = { action_type: 'write', tool: 'demo', payload: { key: 'value', amount: 100 } };
|
|
28
|
-
const headers = (0, signing_js_1.signRequest)(body, 'agent-123', kp.privateKey);
|
|
29
|
-
const tampered = { ...body, payload: { key: 'value', amount: 999999 } };
|
|
30
|
-
(0, vitest_1.expect)(() => (0, signing_js_1.verifyRequest)(tampered, headers, kp.publicKey)).toThrow('Invalid signature');
|
|
31
|
-
});
|
|
32
|
-
(0, vitest_1.it)('canonicalStringify should sort keys recursively at all nesting levels', () => {
|
|
33
|
-
const obj = { z: 1, a: { y: 2, b: 3 }, m: [{ q: 4, c: 5 }] };
|
|
34
|
-
const result = (0, signing_js_1.canonicalStringify)(obj);
|
|
35
|
-
// All object levels must have sorted keys
|
|
36
|
-
(0, vitest_1.expect)(result).toBe('{"a":{"b":3,"y":2},"m":[{"c":5,"q":4}],"z":1}');
|
|
37
|
-
});
|
|
38
|
-
(0, vitest_1.it)('should reject missing headers', () => {
|
|
39
|
-
const kp = (0, signing_js_1.generateKeypair)();
|
|
40
|
-
const body = { action_type: 'write', tool: 'demo', payload: {} };
|
|
41
|
-
(0, vitest_1.expect)(() => (0, signing_js_1.verifyRequest)(body, {}, kp.publicKey)).toThrow('Missing required signature headers');
|
|
42
|
-
});
|
|
43
|
-
(0, vitest_1.it)('should reject stale timestamp', () => {
|
|
44
|
-
const kp = (0, signing_js_1.generateKeypair)();
|
|
45
|
-
const body = { action_type: 'write', tool: 'demo', payload: {} };
|
|
46
|
-
const headers = (0, signing_js_1.signRequest)(body, 'agent-123', kp.privateKey);
|
|
47
|
-
headers['x-timestamp'] = String(Date.now() - 10 * 60 * 1000);
|
|
48
|
-
(0, vitest_1.expect)(() => (0, signing_js_1.verifyRequest)(body, headers, kp.publicKey)).toThrow('Timestamp skew');
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
//# sourceMappingURL=signing.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signing.test.js","sourceRoot":"","sources":["../../src/__tests__/signing.test.ts"],"names":[],"mappings":"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"}
|
package/dist/content-crypto.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/** Payload encrypted with MASTER_KEY (legacy) */
|
|
2
|
-
export declare const PAYLOAD_VERSION_LEGACY = 0;
|
|
3
|
-
/** Payload encrypted with per-workspace WCK */
|
|
4
|
-
export declare const PAYLOAD_VERSION_WCK = 1;
|
|
5
|
-
/** Generate a random 32-byte Workspace Content Key */
|
|
6
|
-
export declare function generateWCK(): Uint8Array;
|
|
7
|
-
/** Wrap a WCK using a wrapping key (e.g. MASTER_KEY). Returns base64 ciphertext + nonce. */
|
|
8
|
-
export declare function wrapKey(wck: Uint8Array, wrappingKey: Uint8Array): {
|
|
9
|
-
ciphertext: string;
|
|
10
|
-
nonce: string;
|
|
11
|
-
};
|
|
12
|
-
/** Unwrap a WCK using a wrapping key. Returns the raw 32-byte WCK. */
|
|
13
|
-
export declare function unwrapKey(ciphertext: string, nonce: string, wrappingKey: Uint8Array): Uint8Array;
|
|
14
|
-
/** Derive a Key Encryption Key from a passphrase using scrypt. */
|
|
15
|
-
export declare function deriveKEK(passphrase: string, salt: Uint8Array): Uint8Array;
|
|
16
|
-
/** Wrap a WCK for a user using their passphrase. Returns base64 strings. */
|
|
17
|
-
export declare function wrapWCKForUser(wck: Uint8Array, passphrase: string): {
|
|
18
|
-
ciphertext: string;
|
|
19
|
-
nonce: string;
|
|
20
|
-
salt: string;
|
|
21
|
-
};
|
|
22
|
-
/** Unwrap a WCK using a user's passphrase. Returns the raw 32-byte WCK. */
|
|
23
|
-
export declare function unwrapWCKFromUser(ciphertext: string, nonce: string, salt: string, passphrase: string): Uint8Array;
|
|
24
|
-
//# sourceMappingURL=content-crypto.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"content-crypto.d.ts","sourceRoot":"","sources":["../src/content-crypto.ts"],"names":[],"mappings":"AAIA,iDAAiD;AACjD,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,+CAA+C;AAC/C,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,sDAAsD;AACtD,wBAAgB,WAAW,IAAI,UAAU,CAExC;AAED,4FAA4F;AAC5F,wBAAgB,OAAO,CACrB,GAAG,EAAE,UAAU,EACf,WAAW,EAAE,UAAU,GACtB;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAIvC;AAED,sEAAsE;AACtE,wBAAgB,SAAS,CACvB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,UAAU,GACtB,UAAU,CAQZ;AAED,kEAAkE;AAClE,wBAAgB,SAAS,CACvB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,UAAU,GACf,UAAU,CAGZ;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAC5B,GAAG,EAAE,UAAU,EACf,UAAU,EAAE,MAAM,GACjB;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAKrD;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB,UAAU,CAIZ"}
|