agentlock-shared 0.1.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.
Files changed (171) hide show
  1. package/dist/__tests__/billing.test.d.ts +2 -0
  2. package/dist/__tests__/billing.test.d.ts.map +1 -0
  3. package/dist/__tests__/billing.test.js +31 -0
  4. package/dist/__tests__/billing.test.js.map +1 -0
  5. package/dist/__tests__/crypto.test.js +137 -47
  6. package/dist/__tests__/crypto.test.js.map +1 -1
  7. package/dist/__tests__/dns-pinning.test.d.ts +2 -0
  8. package/dist/__tests__/dns-pinning.test.d.ts.map +1 -0
  9. package/dist/__tests__/dns-pinning.test.js +33 -0
  10. package/dist/__tests__/dns-pinning.test.js.map +1 -0
  11. package/dist/__tests__/llm-classifier-cache-store.test.d.ts +2 -0
  12. package/dist/__tests__/llm-classifier-cache-store.test.d.ts.map +1 -0
  13. package/dist/__tests__/llm-classifier-cache-store.test.js +65 -0
  14. package/dist/__tests__/llm-classifier-cache-store.test.js.map +1 -0
  15. package/dist/__tests__/llm-classifier-cache.test.d.ts +2 -0
  16. package/dist/__tests__/llm-classifier-cache.test.d.ts.map +1 -0
  17. package/dist/__tests__/llm-classifier-cache.test.js +44 -0
  18. package/dist/__tests__/llm-classifier-cache.test.js.map +1 -0
  19. package/dist/__tests__/llm-classifier.test.d.ts +2 -0
  20. package/dist/__tests__/llm-classifier.test.d.ts.map +1 -0
  21. package/dist/__tests__/llm-classifier.test.js +167 -0
  22. package/dist/__tests__/llm-classifier.test.js.map +1 -0
  23. package/dist/__tests__/messaging.test.d.ts +2 -0
  24. package/dist/__tests__/messaging.test.d.ts.map +1 -0
  25. package/dist/__tests__/messaging.test.js +75 -0
  26. package/dist/__tests__/messaging.test.js.map +1 -0
  27. package/dist/__tests__/plans-classifier-limits.test.d.ts +2 -0
  28. package/dist/__tests__/plans-classifier-limits.test.d.ts.map +1 -0
  29. package/dist/__tests__/plans-classifier-limits.test.js +22 -0
  30. package/dist/__tests__/plans-classifier-limits.test.js.map +1 -0
  31. package/dist/__tests__/policy-category-floor.test.d.ts +2 -0
  32. package/dist/__tests__/policy-category-floor.test.d.ts.map +1 -0
  33. package/dist/__tests__/policy-category-floor.test.js +46 -0
  34. package/dist/__tests__/policy-category-floor.test.js.map +1 -0
  35. package/dist/__tests__/policy-claude-bash.test.d.ts +2 -0
  36. package/dist/__tests__/policy-claude-bash.test.d.ts.map +1 -0
  37. package/dist/__tests__/policy-claude-bash.test.js +401 -0
  38. package/dist/__tests__/policy-claude-bash.test.js.map +1 -0
  39. package/dist/__tests__/policy-llm-floor.test.d.ts +2 -0
  40. package/dist/__tests__/policy-llm-floor.test.d.ts.map +1 -0
  41. package/dist/__tests__/policy-llm-floor.test.js +107 -0
  42. package/dist/__tests__/policy-llm-floor.test.js.map +1 -0
  43. package/dist/__tests__/policy-ssh-e2e.test.d.ts +2 -0
  44. package/dist/__tests__/policy-ssh-e2e.test.d.ts.map +1 -0
  45. package/dist/__tests__/policy-ssh-e2e.test.js +89 -0
  46. package/dist/__tests__/policy-ssh-e2e.test.js.map +1 -0
  47. package/dist/__tests__/policy-ssh-sessions.test.d.ts +2 -0
  48. package/dist/__tests__/policy-ssh-sessions.test.d.ts.map +1 -0
  49. package/dist/__tests__/policy-ssh-sessions.test.js +139 -0
  50. package/dist/__tests__/policy-ssh-sessions.test.js.map +1 -0
  51. package/dist/__tests__/policy-ssh.test.d.ts +2 -0
  52. package/dist/__tests__/policy-ssh.test.d.ts.map +1 -0
  53. package/dist/__tests__/policy-ssh.test.js +180 -0
  54. package/dist/__tests__/policy-ssh.test.js.map +1 -0
  55. package/dist/__tests__/policy.test.js +522 -7
  56. package/dist/__tests__/policy.test.js.map +1 -1
  57. package/dist/__tests__/redact.test.js +76 -0
  58. package/dist/__tests__/redact.test.js.map +1 -1
  59. package/dist/__tests__/signing.test.js +89 -0
  60. package/dist/__tests__/signing.test.js.map +1 -1
  61. package/dist/__tests__/ssh-fingerprint.test.d.ts +2 -0
  62. package/dist/__tests__/ssh-fingerprint.test.d.ts.map +1 -0
  63. package/dist/__tests__/ssh-fingerprint.test.js +19 -0
  64. package/dist/__tests__/ssh-fingerprint.test.js.map +1 -0
  65. package/dist/__tests__/vpn-route.test.d.ts +2 -0
  66. package/dist/__tests__/vpn-route.test.d.ts.map +1 -0
  67. package/dist/__tests__/vpn-route.test.js +72 -0
  68. package/dist/__tests__/vpn-route.test.js.map +1 -0
  69. package/dist/__tests__/wireguard.test.d.ts +2 -0
  70. package/dist/__tests__/wireguard.test.d.ts.map +1 -0
  71. package/dist/__tests__/wireguard.test.js +114 -0
  72. package/dist/__tests__/wireguard.test.js.map +1 -0
  73. package/dist/billing.d.ts +12 -0
  74. package/dist/billing.d.ts.map +1 -0
  75. package/dist/billing.js +41 -0
  76. package/dist/billing.js.map +1 -0
  77. package/dist/crypto.d.ts +41 -0
  78. package/dist/crypto.d.ts.map +1 -1
  79. package/dist/crypto.js +208 -6
  80. package/dist/crypto.js.map +1 -1
  81. package/dist/dns-pinning.d.ts +28 -0
  82. package/dist/dns-pinning.d.ts.map +1 -0
  83. package/dist/dns-pinning.js +113 -0
  84. package/dist/dns-pinning.js.map +1 -0
  85. package/dist/index.d.ts +6 -0
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +9 -0
  88. package/dist/index.js.map +1 -1
  89. package/dist/llm-classifier-cache-store.d.ts +49 -0
  90. package/dist/llm-classifier-cache-store.d.ts.map +1 -0
  91. package/dist/llm-classifier-cache-store.js +63 -0
  92. package/dist/llm-classifier-cache-store.js.map +1 -0
  93. package/dist/llm-classifier-cache.d.ts +6 -0
  94. package/dist/llm-classifier-cache.d.ts.map +1 -0
  95. package/dist/llm-classifier-cache.js +52 -0
  96. package/dist/llm-classifier-cache.js.map +1 -0
  97. package/dist/llm-classifier.d.ts +29 -0
  98. package/dist/llm-classifier.d.ts.map +1 -0
  99. package/dist/llm-classifier.js +191 -0
  100. package/dist/llm-classifier.js.map +1 -0
  101. package/dist/observability.d.ts +36 -0
  102. package/dist/observability.d.ts.map +1 -0
  103. package/dist/observability.js +75 -0
  104. package/dist/observability.js.map +1 -0
  105. package/dist/plans.d.ts +21 -0
  106. package/dist/plans.d.ts.map +1 -1
  107. package/dist/plans.js +52 -14
  108. package/dist/plans.js.map +1 -1
  109. package/dist/policy.d.ts +173 -3
  110. package/dist/policy.d.ts.map +1 -1
  111. package/dist/policy.js +951 -58
  112. package/dist/policy.js.map +1 -1
  113. package/dist/redact.d.ts.map +1 -1
  114. package/dist/redact.js +104 -7
  115. package/dist/redact.js.map +1 -1
  116. package/dist/regex-safety.d.ts +21 -0
  117. package/dist/regex-safety.d.ts.map +1 -0
  118. package/dist/regex-safety.js +49 -0
  119. package/dist/regex-safety.js.map +1 -0
  120. package/dist/sanitize.d.ts +31 -0
  121. package/dist/sanitize.d.ts.map +1 -0
  122. package/dist/sanitize.js +54 -0
  123. package/dist/sanitize.js.map +1 -0
  124. package/dist/schemas.d.ts +267 -14
  125. package/dist/schemas.d.ts.map +1 -1
  126. package/dist/schemas.js +152 -10
  127. package/dist/schemas.js.map +1 -1
  128. package/dist/signing.d.ts +15 -0
  129. package/dist/signing.d.ts.map +1 -1
  130. package/dist/signing.js +53 -4
  131. package/dist/signing.js.map +1 -1
  132. package/dist/ssh-fingerprint.d.ts +10 -0
  133. package/dist/ssh-fingerprint.d.ts.map +1 -0
  134. package/dist/ssh-fingerprint.js +52 -0
  135. package/dist/ssh-fingerprint.js.map +1 -0
  136. package/dist/ssrf.d.ts +36 -0
  137. package/dist/ssrf.d.ts.map +1 -0
  138. package/dist/ssrf.js +140 -0
  139. package/dist/ssrf.js.map +1 -0
  140. package/dist/types.d.ts +131 -0
  141. package/dist/types.d.ts.map +1 -1
  142. package/dist/wireguard.d.ts +63 -0
  143. package/dist/wireguard.d.ts.map +1 -0
  144. package/dist/wireguard.js +226 -0
  145. package/dist/wireguard.js.map +1 -0
  146. package/package.json +42 -29
  147. package/.turbo/turbo-build.log +0 -4
  148. package/.turbo/turbo-test.log +0 -34
  149. package/dist/__tests__/content-crypto.test.d.ts +0 -2
  150. package/dist/__tests__/content-crypto.test.d.ts.map +0 -1
  151. package/dist/__tests__/content-crypto.test.js +0 -117
  152. package/dist/__tests__/content-crypto.test.js.map +0 -1
  153. package/dist/content-crypto.d.ts +0 -24
  154. package/dist/content-crypto.d.ts.map +0 -1
  155. package/dist/content-crypto.js +0 -58
  156. package/dist/content-crypto.js.map +0 -1
  157. package/src/__tests__/policy.test.ts +0 -88
  158. package/src/__tests__/redact.test.ts +0 -41
  159. package/src/__tests__/signing.test.ts +0 -55
  160. package/src/crypto.ts +0 -87
  161. package/src/index.ts +0 -8
  162. package/src/mcp-catalog.ts +0 -181
  163. package/src/plans.ts +0 -96
  164. package/src/policy.ts +0 -186
  165. package/src/redact.ts +0 -114
  166. package/src/schemas.ts +0 -53
  167. package/src/signing.ts +0 -120
  168. package/src/types.ts +0 -212
  169. package/test-gateway.mjs +0 -47
  170. package/tsconfig.json +0 -10
  171. package/vitest.config.ts +0 -8
@@ -0,0 +1,63 @@
1
+ import { z } from 'zod';
2
+ export declare const WireGuardConfigSchema: z.ZodObject<{
3
+ privateKey: z.ZodString;
4
+ address: z.ZodEffects<z.ZodString, string, string>;
5
+ dns: z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>;
6
+ mtu: z.ZodOptional<z.ZodNumber>;
7
+ peer: z.ZodObject<{
8
+ publicKey: z.ZodString;
9
+ presharedKey: z.ZodOptional<z.ZodString>;
10
+ endpoint: z.ZodEffects<z.ZodString, string, string>;
11
+ allowedIPs: z.ZodArray<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, "many">;
12
+ persistentKeepalive: z.ZodOptional<z.ZodNumber>;
13
+ }, "strict", z.ZodTypeAny, {
14
+ publicKey: string;
15
+ endpoint: string;
16
+ allowedIPs: string[];
17
+ presharedKey?: string | undefined;
18
+ persistentKeepalive?: number | undefined;
19
+ }, {
20
+ publicKey: string;
21
+ endpoint: string;
22
+ allowedIPs: string[];
23
+ presharedKey?: string | undefined;
24
+ persistentKeepalive?: number | undefined;
25
+ }>;
26
+ }, "strict", z.ZodTypeAny, {
27
+ address: string;
28
+ privateKey: string;
29
+ peer: {
30
+ publicKey: string;
31
+ endpoint: string;
32
+ allowedIPs: string[];
33
+ presharedKey?: string | undefined;
34
+ persistentKeepalive?: number | undefined;
35
+ };
36
+ dns?: string[] | undefined;
37
+ mtu?: number | undefined;
38
+ }, {
39
+ address: string;
40
+ privateKey: string;
41
+ peer: {
42
+ publicKey: string;
43
+ endpoint: string;
44
+ allowedIPs: string[];
45
+ presharedKey?: string | undefined;
46
+ persistentKeepalive?: number | undefined;
47
+ };
48
+ dns?: string[] | undefined;
49
+ mtu?: number | undefined;
50
+ }>;
51
+ export type WireGuardConfig = z.infer<typeof WireGuardConfigSchema>;
52
+ /**
53
+ * Parse a wg-quick-style .conf file into a structured WireGuardConfig.
54
+ * Exactly one [Interface] and exactly one [Peer] block are required.
55
+ */
56
+ export declare function parseWireGuardConfig(raw: string): WireGuardConfig;
57
+ export declare const VPN_LIMITS_BY_PLAN: {
58
+ readonly free: 0;
59
+ readonly pro: 3;
60
+ readonly team: 10;
61
+ };
62
+ export type WorkspacePlan = keyof typeof VPN_LIMITS_BY_PLAN;
63
+ //# sourceMappingURL=wireguard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wireguard.d.ts","sourceRoot":"","sources":["../src/wireguard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA8GxB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4CvB,CAAC;AAEZ,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CA0DjE;AAED,eAAO,MAAM,kBAAkB;;;;CAIrB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,kBAAkB,CAAC"}
@@ -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 &gt; 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":"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"}
package/package.json CHANGED
@@ -1,29 +1,42 @@
1
- {
2
- "name": "agentlock-shared",
3
- "version": "0.1.0",
4
- "main": "./dist/index.js",
5
- "types": "./dist/index.d.ts",
6
- "exports": {
7
- ".": {
8
- "import": "./dist/index.js",
9
- "require": "./dist/index.js",
10
- "types": "./dist/index.d.ts"
11
- }
12
- },
13
- "scripts": {
14
- "build": "tsc",
15
- "typecheck": "tsc --noEmit",
16
- "test": "vitest run",
17
- "test:watch": "vitest"
18
- },
19
- "dependencies": {
20
- "tweetnacl": "^1.0.3",
21
- "tweetnacl-util": "^0.15.1",
22
- "zod": "^3.23.8"
23
- },
24
- "devDependencies": {
25
- "@types/node": "^22.19.11",
26
- "typescript": "^5.6.0",
27
- "vitest": "^4.0.18"
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
+ }
@@ -1,4 +0,0 @@
1
-
2
- > @agentlock/shared@0.1.0 build D:\agentlock\packages\shared
3
- > tsc
4
-
@@ -1,34 +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:11:6:
8
- 11 │ "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:9:6:
14
- 9 │ "import": "./dist/index.js",
15
- ╵ ~~~~~~~~
16
-
17
- The "require" condition comes earlier and will be used for all "require" calls:
18
-
19
- package.json:10:6:
20
- 10 │ "require": "./dist/index.js",
21
- ╵ ~~~~~~~~~
22
-
23
-
24
-  RUN  v4.0.18 D:/agentlock/packages/shared
25
-
26
- ✓ src/__tests__/redact.test.ts (5 tests) 4ms
27
- ✓ src/__tests__/policy.test.ts (7 tests) 4ms
28
- ✓ src/__tests__/signing.test.ts (7 tests) 68ms
29
-
30
-  Test Files  3 passed (3)
31
-  Tests  19 passed (19)
32
-  Start at  21:09:06
33
-  Duration  482ms (transform 192ms, setup 0ms, import 287ms, tests 75ms, environment 0ms)
34
-
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=content-crypto.test.d.ts.map
@@ -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,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"}
@@ -1,58 +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
- exports.PAYLOAD_VERSION_WCK = exports.PAYLOAD_VERSION_LEGACY = void 0;
7
- exports.generateWCK = generateWCK;
8
- exports.wrapKey = wrapKey;
9
- exports.unwrapKey = unwrapKey;
10
- exports.deriveKEK = deriveKEK;
11
- exports.wrapWCKForUser = wrapWCKForUser;
12
- exports.unwrapWCKFromUser = unwrapWCKFromUser;
13
- const tweetnacl_1 = __importDefault(require("tweetnacl"));
14
- const tweetnacl_util_1 = require("tweetnacl-util");
15
- const scrypt_1 = require("@noble/hashes/scrypt");
16
- /** Payload encrypted with MASTER_KEY (legacy) */
17
- exports.PAYLOAD_VERSION_LEGACY = 0;
18
- /** Payload encrypted with per-workspace WCK */
19
- exports.PAYLOAD_VERSION_WCK = 1;
20
- /** Generate a random 32-byte Workspace Content Key */
21
- function generateWCK() {
22
- return tweetnacl_1.default.randomBytes(32);
23
- }
24
- /** Wrap a WCK using a wrapping key (e.g. MASTER_KEY). Returns base64 ciphertext + nonce. */
25
- function wrapKey(wck, wrappingKey) {
26
- const nonce = tweetnacl_1.default.randomBytes(tweetnacl_1.default.secretbox.nonceLength);
27
- const box = tweetnacl_1.default.secretbox(wck, nonce, wrappingKey);
28
- return { ciphertext: (0, tweetnacl_util_1.encodeBase64)(box), nonce: (0, tweetnacl_util_1.encodeBase64)(nonce) };
29
- }
30
- /** Unwrap a WCK using a wrapping key. Returns the raw 32-byte WCK. */
31
- function unwrapKey(ciphertext, nonce, wrappingKey) {
32
- const box = (0, tweetnacl_util_1.decodeBase64)(ciphertext);
33
- const n = (0, tweetnacl_util_1.decodeBase64)(nonce);
34
- const result = tweetnacl_1.default.secretbox.open(box, n, wrappingKey);
35
- if (!result) {
36
- throw new Error('unwrapKey failed: invalid wrapping key or corrupted data');
37
- }
38
- return result;
39
- }
40
- /** Derive a Key Encryption Key from a passphrase using scrypt. */
41
- function deriveKEK(passphrase, salt) {
42
- const pw = new TextEncoder().encode(passphrase);
43
- return (0, scrypt_1.scrypt)(pw, salt, { N: 2 ** 15, r: 8, p: 1, dkLen: 32 });
44
- }
45
- /** Wrap a WCK for a user using their passphrase. Returns base64 strings. */
46
- function wrapWCKForUser(wck, passphrase) {
47
- const salt = tweetnacl_1.default.randomBytes(32);
48
- const kek = deriveKEK(passphrase, salt);
49
- const { ciphertext, nonce } = wrapKey(wck, kek);
50
- return { ciphertext, nonce, salt: (0, tweetnacl_util_1.encodeBase64)(salt) };
51
- }
52
- /** Unwrap a WCK using a user's passphrase. Returns the raw 32-byte WCK. */
53
- function unwrapWCKFromUser(ciphertext, nonce, salt, passphrase) {
54
- const saltBytes = (0, tweetnacl_util_1.decodeBase64)(salt);
55
- const kek = deriveKEK(passphrase, saltBytes);
56
- return unwrapKey(ciphertext, nonce, kek);
57
- }
58
- //# sourceMappingURL=content-crypto.js.map