agentlock-shared 0.1.0 → 0.2.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/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-test.log +57 -15
- package/dist/__tests__/crypto.test.js +137 -47
- package/dist/__tests__/crypto.test.js.map +1 -1
- package/dist/__tests__/messaging.test.d.ts +2 -0
- package/dist/__tests__/messaging.test.d.ts.map +1 -0
- package/dist/__tests__/messaging.test.js +75 -0
- package/dist/__tests__/messaging.test.js.map +1 -0
- package/dist/__tests__/policy.test.js +124 -7
- package/dist/__tests__/policy.test.js.map +1 -1
- package/dist/__tests__/signing.test (# Edit conflict 2026-04-01 z3etfmC #).js +51 -0
- package/dist/__tests__/signing.test.js (# Edit conflict 2026-04-01 4rndy9C #).map +1 -0
- package/dist/crypto.d.ts +36 -0
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +150 -5
- package/dist/crypto.js.map +1 -1
- package/dist/plans.d.ts +4 -0
- package/dist/plans.d.ts.map +1 -1
- package/dist/plans.js +16 -0
- package/dist/plans.js.map +1 -1
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +54 -29
- package/dist/policy.js.map +1 -1
- package/dist/redact.d.ts.map +1 -1
- package/dist/redact.js +21 -4
- package/dist/redact.js.map +1 -1
- package/dist/schemas.d.ts +72 -11
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +62 -10
- package/dist/schemas.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/crypto.test.ts +169 -0
- package/src/__tests__/messaging.test.ts +83 -0
- package/src/__tests__/policy.test.ts +141 -7
- package/src/crypto.ts +153 -5
- package/src/plans.ts +20 -0
- package/src/policy.ts +58 -28
- package/src/redact.ts +20 -3
- package/src/schemas.ts +121 -53
- package/src/types.ts +1 -0
package/.turbo/turbo-build.log
CHANGED
package/.turbo/turbo-test.log
CHANGED
|
@@ -1,34 +1,76 @@
|
|
|
1
1
|
|
|
2
|
-
>
|
|
2
|
+
> agentlock-shared@0.1.0 test D:\agentlock\packages\shared
|
|
3
3
|
> vitest run
|
|
4
4
|
|
|
5
5
|
▲ [WARNING] The condition "types" here will never be used as it comes after both "import" and "require" [package.json]
|
|
6
6
|
|
|
7
|
-
package.json:
|
|
8
|
-
|
|
7
|
+
package.json:10:6:
|
|
8
|
+
10 │ "types": "./dist/index.d.ts"
|
|
9
9
|
╵ ~~~~~~~
|
|
10
10
|
|
|
11
11
|
The "import" condition comes earlier and will be used for all "import" statements:
|
|
12
12
|
|
|
13
|
-
package.json:
|
|
14
|
-
|
|
13
|
+
package.json:8:6:
|
|
14
|
+
8 │ "import": "./dist/index.js",
|
|
15
15
|
╵ ~~~~~~~~
|
|
16
16
|
|
|
17
17
|
The "require" condition comes earlier and will be used for all "require" calls:
|
|
18
18
|
|
|
19
|
-
package.json:
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
package.json:9:6:
|
|
20
|
+
9 │ "require": "./dist/index.js",
|
|
21
|
+
╵ ~~~~~~~~~
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
[1m[46m RUN [49m[22m [36mv4.0.18 [39m[90mD:/agentlock/packages/shared[39m
|
|
25
25
|
|
|
26
|
-
[
|
|
27
|
-
|
|
28
|
-
|
|
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
|
+
|
|
29
70
|
|
|
30
|
-
[2m Test Files [22m [1m[32m3 passed[39m[22m[90m (
|
|
31
|
-
[2m Tests [22m [1m[
|
|
32
|
-
[2m Start at [22m
|
|
33
|
-
[2m Duration [22m
|
|
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
|
|
34
75
|
|
|
76
|
+
ELIFECYCLE Test failed. See above for more details.
|
|
@@ -1,53 +1,143 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
const vitest_1 = require("vitest");
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
(0, vitest_1.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
(0, vitest_1.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
7
|
+
const tweetnacl_1 = __importDefault(require("tweetnacl"));
|
|
8
|
+
const crypto_js_1 = require("../crypto.js");
|
|
9
|
+
// Deterministic test key (not from env -- tests must not depend on MASTER_KEY)
|
|
10
|
+
const testMasterKey = tweetnacl_1.default.randomBytes(32);
|
|
11
|
+
(0, vitest_1.describe)('encrypt / decrypt (low-level)', () => {
|
|
12
|
+
(0, vitest_1.it)('round-trips a string', () => {
|
|
13
|
+
const data = 'hello world';
|
|
14
|
+
const encrypted = (0, crypto_js_1.encrypt)(data, testMasterKey);
|
|
15
|
+
(0, vitest_1.expect)(encrypted).not.toBe(data);
|
|
16
|
+
(0, vitest_1.expect)((0, crypto_js_1.decrypt)(encrypted, testMasterKey)).toBe(data);
|
|
17
|
+
});
|
|
18
|
+
(0, vitest_1.it)('produces different ciphertext each call (random nonce)', () => {
|
|
19
|
+
const data = 'deterministic?';
|
|
20
|
+
const a = (0, crypto_js_1.encrypt)(data, testMasterKey);
|
|
21
|
+
const b = (0, crypto_js_1.encrypt)(data, testMasterKey);
|
|
22
|
+
(0, vitest_1.expect)(a).not.toBe(b);
|
|
23
|
+
});
|
|
24
|
+
(0, vitest_1.it)('rejects wrong key', () => {
|
|
25
|
+
const data = 'secret';
|
|
26
|
+
const encrypted = (0, crypto_js_1.encrypt)(data, testMasterKey);
|
|
27
|
+
const wrongKey = tweetnacl_1.default.randomBytes(32);
|
|
28
|
+
(0, vitest_1.expect)(() => (0, crypto_js_1.decrypt)(encrypted, wrongKey)).toThrow('Decryption failed');
|
|
29
|
+
});
|
|
30
|
+
(0, vitest_1.it)('handles empty string', () => {
|
|
31
|
+
const encrypted = (0, crypto_js_1.encrypt)('', testMasterKey);
|
|
32
|
+
(0, vitest_1.expect)((0, crypto_js_1.decrypt)(encrypted, testMasterKey)).toBe('');
|
|
33
|
+
});
|
|
34
|
+
(0, vitest_1.it)('handles unicode', () => {
|
|
35
|
+
const data = 'Hello unicode world';
|
|
36
|
+
const encrypted = (0, crypto_js_1.encrypt)(data, testMasterKey);
|
|
37
|
+
(0, vitest_1.expect)((0, crypto_js_1.decrypt)(encrypted, testMasterKey)).toBe(data);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
(0, vitest_1.describe)('envelopeEncrypt / envelopeDecrypt', () => {
|
|
41
|
+
(0, vitest_1.it)('round-trips a string', () => {
|
|
42
|
+
const data = 'envelope test data';
|
|
43
|
+
const encrypted = (0, crypto_js_1.envelopeEncrypt)(data, testMasterKey);
|
|
44
|
+
(0, vitest_1.expect)(encrypted).toMatch(/^env1:/);
|
|
45
|
+
(0, vitest_1.expect)((0, crypto_js_1.envelopeDecrypt)(encrypted, testMasterKey)).toBe(data);
|
|
46
|
+
});
|
|
47
|
+
(0, vitest_1.it)('produces different ciphertext each call (fresh DEK + nonce)', () => {
|
|
48
|
+
const data = 'same data';
|
|
49
|
+
const a = (0, crypto_js_1.envelopeEncrypt)(data, testMasterKey);
|
|
50
|
+
const b = (0, crypto_js_1.envelopeEncrypt)(data, testMasterKey);
|
|
51
|
+
(0, vitest_1.expect)(a).not.toBe(b);
|
|
52
|
+
});
|
|
53
|
+
(0, vitest_1.it)('rejects wrong master key', () => {
|
|
54
|
+
const data = 'secret';
|
|
55
|
+
const encrypted = (0, crypto_js_1.envelopeEncrypt)(data, testMasterKey);
|
|
56
|
+
const wrongKey = tweetnacl_1.default.randomBytes(32);
|
|
57
|
+
(0, vitest_1.expect)(() => (0, crypto_js_1.envelopeDecrypt)(encrypted, wrongKey)).toThrow();
|
|
58
|
+
});
|
|
59
|
+
(0, vitest_1.it)('handles empty string', () => {
|
|
60
|
+
const encrypted = (0, crypto_js_1.envelopeEncrypt)('', testMasterKey);
|
|
61
|
+
(0, vitest_1.expect)((0, crypto_js_1.envelopeDecrypt)(encrypted, testMasterKey)).toBe('');
|
|
62
|
+
});
|
|
63
|
+
(0, vitest_1.it)('handles large data', () => {
|
|
64
|
+
const data = 'x'.repeat(100_000);
|
|
65
|
+
const encrypted = (0, crypto_js_1.envelopeEncrypt)(data, testMasterKey);
|
|
66
|
+
(0, vitest_1.expect)((0, crypto_js_1.envelopeDecrypt)(encrypted, testMasterKey)).toBe(data);
|
|
67
|
+
});
|
|
68
|
+
(0, vitest_1.it)('handles JSON data', () => {
|
|
69
|
+
const obj = { tool: 'http', payload: { url: 'https://example.com' }, nested: [1, 2, 3] };
|
|
70
|
+
const data = JSON.stringify(obj);
|
|
71
|
+
const encrypted = (0, crypto_js_1.envelopeEncrypt)(data, testMasterKey);
|
|
72
|
+
const decrypted = JSON.parse((0, crypto_js_1.envelopeDecrypt)(encrypted, testMasterKey));
|
|
73
|
+
(0, vitest_1.expect)(decrypted).toEqual(obj);
|
|
74
|
+
});
|
|
75
|
+
(0, vitest_1.it)('envelopeDecrypt rejects non-envelope data', () => {
|
|
76
|
+
const legacy = (0, crypto_js_1.encrypt)('legacy data', testMasterKey);
|
|
77
|
+
(0, vitest_1.expect)(() => (0, crypto_js_1.envelopeDecrypt)(legacy, testMasterKey)).toThrow('missing env1: prefix');
|
|
78
|
+
});
|
|
79
|
+
(0, vitest_1.it)('rejects malformed envelope (no separator)', () => {
|
|
80
|
+
(0, vitest_1.expect)(() => (0, crypto_js_1.envelopeDecrypt)('env1:nodatahere', testMasterKey)).toThrow('missing DEK/payload separator');
|
|
81
|
+
});
|
|
82
|
+
(0, vitest_1.it)('rejects malformed envelope (empty parts)', () => {
|
|
83
|
+
// env1:: has withoutPrefix=":" where lastIndexOf(':') returns 0,
|
|
84
|
+
// caught by the separatorIndex <= 0 check
|
|
85
|
+
(0, vitest_1.expect)(() => (0, crypto_js_1.envelopeDecrypt)('env1::', testMasterKey)).toThrow('missing DEK/payload separator');
|
|
86
|
+
// env1:abc: has empty payload after separator
|
|
87
|
+
(0, vitest_1.expect)(() => (0, crypto_js_1.envelopeDecrypt)('env1:abc:', testMasterKey)).toThrow('empty DEK or payload');
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
(0, vitest_1.describe)('decrypt() backward compatibility', () => {
|
|
91
|
+
(0, vitest_1.it)('transparently decrypts envelope-encrypted data', () => {
|
|
92
|
+
const data = 'new envelope data';
|
|
93
|
+
const encrypted = (0, crypto_js_1.envelopeEncrypt)(data, testMasterKey);
|
|
94
|
+
// decrypt() should auto-detect the env1: prefix and handle it
|
|
95
|
+
(0, vitest_1.expect)((0, crypto_js_1.decrypt)(encrypted, testMasterKey)).toBe(data);
|
|
96
|
+
});
|
|
97
|
+
(0, vitest_1.it)('still decrypts legacy direct-encrypted data', () => {
|
|
98
|
+
const data = 'legacy direct data';
|
|
99
|
+
const encrypted = (0, crypto_js_1.encrypt)(data, testMasterKey);
|
|
100
|
+
// Legacy data should still work with decrypt()
|
|
101
|
+
(0, vitest_1.expect)((0, crypto_js_1.decrypt)(encrypted, testMasterKey)).toBe(data);
|
|
102
|
+
});
|
|
103
|
+
(0, vitest_1.it)('handles mixed legacy and envelope data in sequence', () => {
|
|
104
|
+
const legacyData = 'old format';
|
|
105
|
+
const envelopeData = 'new format';
|
|
106
|
+
const legacyEncrypted = (0, crypto_js_1.encrypt)(legacyData, testMasterKey);
|
|
107
|
+
const envelopeEncrypted = (0, crypto_js_1.envelopeEncrypt)(envelopeData, testMasterKey);
|
|
108
|
+
// Both should decrypt through the same decrypt() function
|
|
109
|
+
(0, vitest_1.expect)((0, crypto_js_1.decrypt)(legacyEncrypted, testMasterKey)).toBe(legacyData);
|
|
110
|
+
(0, vitest_1.expect)((0, crypto_js_1.decrypt)(envelopeEncrypted, testMasterKey)).toBe(envelopeData);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
(0, vitest_1.describe)('encryptCredential / decryptCredential (existing DEK pattern)', () => {
|
|
114
|
+
(0, vitest_1.it)('still works correctly after envelope changes', () => {
|
|
115
|
+
const payload = { api_key: 'sk-test-12345', name: 'test-cred' };
|
|
116
|
+
const { encryptedDEK, encryptedPayload } = (0, crypto_js_1.encryptCredential)(payload, testMasterKey);
|
|
117
|
+
const decrypted = (0, crypto_js_1.decryptCredential)(encryptedDEK, encryptedPayload, testMasterKey);
|
|
118
|
+
(0, vitest_1.expect)(decrypted).toEqual(payload);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
(0, vitest_1.describe)('envelope format structure', () => {
|
|
122
|
+
(0, vitest_1.it)('has exactly the env1:wrappedDEK:payload format', () => {
|
|
123
|
+
const encrypted = (0, crypto_js_1.envelopeEncrypt)('test', testMasterKey);
|
|
124
|
+
const parts = encrypted.split(':');
|
|
125
|
+
// Should be: "env1", wrappedDEK (base64), payload (base64)
|
|
126
|
+
(0, vitest_1.expect)(parts[0]).toBe('env1');
|
|
127
|
+
(0, vitest_1.expect)(parts.length).toBe(3);
|
|
128
|
+
// Both parts after prefix should be valid base64
|
|
129
|
+
(0, vitest_1.expect)(parts[1].length).toBeGreaterThan(0);
|
|
130
|
+
(0, vitest_1.expect)(parts[2].length).toBeGreaterThan(0);
|
|
131
|
+
});
|
|
132
|
+
(0, vitest_1.it)('base64 parts do not contain colons', () => {
|
|
133
|
+
// Run multiple times to catch edge cases with different random nonces
|
|
134
|
+
for (let i = 0; i < 20; i++) {
|
|
135
|
+
const encrypted = (0, crypto_js_1.envelopeEncrypt)(`test data ${i}`, testMasterKey);
|
|
136
|
+
const withoutPrefix = encrypted.slice(5); // remove "env1:"
|
|
137
|
+
const colonCount = (withoutPrefix.match(/:/g) || []).length;
|
|
138
|
+
// Exactly one colon separating wrappedDEK and payload
|
|
139
|
+
(0, vitest_1.expect)(colonCount).toBe(1);
|
|
140
|
+
}
|
|
51
141
|
});
|
|
52
142
|
});
|
|
53
143
|
//# sourceMappingURL=crypto.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.test.js","sourceRoot":"","sources":["../../src/__tests__/crypto.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"crypto.test.js","sourceRoot":"","sources":["../../src/__tests__/crypto.test.ts"],"names":[],"mappings":";;;;;AAAA,mCAA8C;AAC9C,0DAA6B;AAE7B,4CAQsB;AAEtB,+EAA+E;AAC/E,MAAM,aAAa,GAAG,mBAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AAE3C,IAAA,iBAAQ,EAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,IAAA,WAAE,EAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,IAAI,GAAG,aAAa,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAA,mBAAO,EAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC/C,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,IAAA,eAAM,EAAC,IAAA,mBAAO,EAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,IAAI,GAAG,gBAAgB,CAAC;QAC9B,MAAM,CAAC,GAAG,IAAA,mBAAO,EAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,IAAA,mBAAO,EAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACvC,IAAA,eAAM,EAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,IAAI,GAAG,QAAQ,CAAC;QACtB,MAAM,SAAS,GAAG,IAAA,mBAAO,EAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,mBAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACtC,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,mBAAO,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,SAAS,GAAG,IAAA,mBAAO,EAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QAC7C,IAAA,eAAM,EAAC,IAAA,mBAAO,EAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iBAAiB,EAAE,GAAG,EAAE;QACzB,MAAM,IAAI,GAAG,qBAAqB,CAAC;QACnC,MAAM,SAAS,GAAG,IAAA,mBAAO,EAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC/C,IAAA,eAAM,EAAC,IAAA,mBAAO,EAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,IAAA,WAAE,EAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,IAAI,GAAG,oBAAoB,CAAC;QAClC,MAAM,SAAS,GAAG,IAAA,2BAAe,EAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACvD,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAA,eAAM,EAAC,IAAA,2BAAe,EAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,IAAI,GAAG,WAAW,CAAC;QACzB,MAAM,CAAC,GAAG,IAAA,2BAAe,EAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,IAAA,2BAAe,EAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC/C,IAAA,eAAM,EAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,IAAI,GAAG,QAAQ,CAAC;QACtB,MAAM,SAAS,GAAG,IAAA,2BAAe,EAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,mBAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACtC,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,2BAAe,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,SAAS,GAAG,IAAA,2BAAe,EAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QACrD,IAAA,eAAM,EAAC,IAAA,2BAAe,EAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,IAAA,2BAAe,EAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACvD,IAAA,eAAM,EAAC,IAAA,2BAAe,EAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,qBAAqB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACzF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,IAAA,2BAAe,EAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,2BAAe,EAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;QACxE,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG,IAAA,mBAAO,EAAC,aAAa,EAAE,aAAa,CAAC,CAAC;QACrD,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,2BAAe,EAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,2BAAe,EAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAC3G,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,iEAAiE;QACjE,0CAA0C;QAC1C,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,2BAAe,EAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QAChG,8CAA8C;QAC9C,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,2BAAe,EAAC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,IAAA,WAAE,EAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,IAAI,GAAG,mBAAmB,CAAC;QACjC,MAAM,SAAS,GAAG,IAAA,2BAAe,EAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACvD,8DAA8D;QAC9D,IAAA,eAAM,EAAC,IAAA,mBAAO,EAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,IAAI,GAAG,oBAAoB,CAAC;QAClC,MAAM,SAAS,GAAG,IAAA,mBAAO,EAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC/C,+CAA+C;QAC/C,IAAA,eAAM,EAAC,IAAA,mBAAO,EAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,UAAU,GAAG,YAAY,CAAC;QAChC,MAAM,YAAY,GAAG,YAAY,CAAC;QAElC,MAAM,eAAe,GAAG,IAAA,mBAAO,EAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAC3D,MAAM,iBAAiB,GAAG,IAAA,2BAAe,EAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAEvE,0DAA0D;QAC1D,IAAA,eAAM,EAAC,IAAA,mBAAO,EAAC,eAAe,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjE,IAAA,eAAM,EAAC,IAAA,mBAAO,EAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,8DAA8D,EAAE,GAAG,EAAE;IAC5E,IAAA,WAAE,EAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QAChE,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,GAAG,IAAA,6BAAiB,EAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACrF,MAAM,SAAS,GAAG,IAAA,6BAAiB,EAAC,YAAY,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;QACnF,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAA,WAAE,EAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,SAAS,GAAG,IAAA,2BAAe,EAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnC,2DAA2D;QAC3D,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAA,eAAM,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,iDAAiD;QACjD,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,sEAAsE;QACtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,IAAA,2BAAe,EAAC,aAAa,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YACnE,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB;YAC3D,MAAM,UAAU,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAC5D,sDAAsD;YACtD,IAAA,eAAM,EAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messaging.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/messaging.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const schemas_1 = require("../schemas");
|
|
5
|
+
(0, vitest_1.describe)('SendMessageSchema', () => {
|
|
6
|
+
(0, vitest_1.it)('accepts valid message with content only', () => {
|
|
7
|
+
const result = schemas_1.SendMessageSchema.safeParse({ content: 'Hello agent' });
|
|
8
|
+
(0, vitest_1.expect)(result.success).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
(0, vitest_1.it)('accepts message with thread_id and expires_at', () => {
|
|
11
|
+
const result = schemas_1.SendMessageSchema.safeParse({
|
|
12
|
+
content: 'Do this task',
|
|
13
|
+
thread_id: '550e8400-e29b-41d4-a716-446655440000',
|
|
14
|
+
expires_at: '2026-04-01T12:00:00Z',
|
|
15
|
+
});
|
|
16
|
+
(0, vitest_1.expect)(result.success).toBe(true);
|
|
17
|
+
});
|
|
18
|
+
(0, vitest_1.it)('rejects empty content', () => {
|
|
19
|
+
const result = schemas_1.SendMessageSchema.safeParse({ content: '' });
|
|
20
|
+
(0, vitest_1.expect)(result.success).toBe(false);
|
|
21
|
+
});
|
|
22
|
+
(0, vitest_1.it)('rejects content over 4096 chars', () => {
|
|
23
|
+
const result = schemas_1.SendMessageSchema.safeParse({ content: 'x'.repeat(4097) });
|
|
24
|
+
(0, vitest_1.expect)(result.success).toBe(false);
|
|
25
|
+
});
|
|
26
|
+
(0, vitest_1.it)('rejects invalid thread_id', () => {
|
|
27
|
+
const result = schemas_1.SendMessageSchema.safeParse({ content: 'hi', thread_id: 'not-a-uuid' });
|
|
28
|
+
(0, vitest_1.expect)(result.success).toBe(false);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
(0, vitest_1.describe)('AgentSendMessageSchema', () => {
|
|
32
|
+
(0, vitest_1.it)('requires thread_id', () => {
|
|
33
|
+
const result = schemas_1.AgentSendMessageSchema.safeParse({ content: 'Reply' });
|
|
34
|
+
(0, vitest_1.expect)(result.success).toBe(false);
|
|
35
|
+
});
|
|
36
|
+
(0, vitest_1.it)('accepts valid reply', () => {
|
|
37
|
+
const result = schemas_1.AgentSendMessageSchema.safeParse({
|
|
38
|
+
content: 'I found 3 files',
|
|
39
|
+
thread_id: '550e8400-e29b-41d4-a716-446655440000',
|
|
40
|
+
});
|
|
41
|
+
(0, vitest_1.expect)(result.success).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
(0, vitest_1.describe)('ApproveRequestSchema with reply_message', () => {
|
|
45
|
+
(0, vitest_1.it)('accepts approve without reply', () => {
|
|
46
|
+
const result = schemas_1.ApproveRequestSchema.safeParse({ action: 'approve' });
|
|
47
|
+
(0, vitest_1.expect)(result.success).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
(0, vitest_1.it)('accepts approve with reply_message', () => {
|
|
50
|
+
const result = schemas_1.ApproveRequestSchema.safeParse({
|
|
51
|
+
action: 'approve',
|
|
52
|
+
reply_message: 'Only delete files older than 7 days',
|
|
53
|
+
});
|
|
54
|
+
(0, vitest_1.expect)(result.success).toBe(true);
|
|
55
|
+
if (result.success) {
|
|
56
|
+
(0, vitest_1.expect)(result.data.reply_message).toBe('Only delete files older than 7 days');
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
(0, vitest_1.it)('accepts deny with reason and reply_message', () => {
|
|
60
|
+
const result = schemas_1.ApproveRequestSchema.safeParse({
|
|
61
|
+
action: 'deny',
|
|
62
|
+
reason: 'Too risky',
|
|
63
|
+
reply_message: 'Try a safer approach',
|
|
64
|
+
});
|
|
65
|
+
(0, vitest_1.expect)(result.success).toBe(true);
|
|
66
|
+
});
|
|
67
|
+
(0, vitest_1.it)('rejects reply_message over 2000 chars', () => {
|
|
68
|
+
const result = schemas_1.ApproveRequestSchema.safeParse({
|
|
69
|
+
action: 'approve',
|
|
70
|
+
reply_message: 'x'.repeat(2001),
|
|
71
|
+
});
|
|
72
|
+
(0, vitest_1.expect)(result.success).toBe(false);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=messaging.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messaging.test.js","sourceRoot":"","sources":["../../src/__tests__/messaging.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,wCAA6F;AAE7F,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,2BAAiB,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;QACvE,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAG,2BAAiB,CAAC,SAAS,CAAC;YACzC,OAAO,EAAE,cAAc;YACvB,SAAS,EAAE,sCAAsC;YACjD,UAAU,EAAE,sBAAsB;SACnC,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,MAAM,GAAG,2BAAiB,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5D,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,2BAAiB,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1E,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,2BAAiB,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;QACvF,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAA,WAAE,EAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,MAAM,GAAG,gCAAsB,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACtE,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,MAAM,GAAG,gCAAsB,CAAC,SAAS,CAAC;YAC9C,OAAO,EAAE,iBAAiB;YAC1B,SAAS,EAAE,sCAAsC;SAClD,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,IAAA,WAAE,EAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,8BAAoB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACrE,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,MAAM,GAAG,8BAAoB,CAAC,SAAS,CAAC;YAC5C,MAAM,EAAE,SAAS;YACjB,aAAa,EAAE,qCAAqC;SACrD,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QAChF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,MAAM,GAAG,8BAAoB,CAAC,SAAS,CAAC;YAC5C,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,WAAW;YACnB,aAAa,EAAE,sBAAsB;SACtC,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,8BAAoB,CAAC,SAAS,CAAC;YAC5C,MAAM,EAAE,SAAS;YACjB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;SAChC,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -4,7 +4,8 @@ const vitest_1 = require("vitest");
|
|
|
4
4
|
const policy_js_1 = require("../policy.js");
|
|
5
5
|
(0, vitest_1.describe)('Policy Engine', () => {
|
|
6
6
|
(0, vitest_1.it)('should ALLOW read actions by default', () => {
|
|
7
|
-
|
|
7
|
+
// Use a non-http tool to test the default read policy (http without URL is now correctly blocked)
|
|
8
|
+
const action = { action_type: 'read', tool: 'demo.list', payload: {} };
|
|
8
9
|
(0, vitest_1.expect)((0, policy_js_1.evaluatePolicy)(action, policy_js_1.DEFAULT_POLICY_RULES).decision).toBe('ALLOW');
|
|
9
10
|
});
|
|
10
11
|
(0, vitest_1.it)('should REQUIRE_APPROVAL for write actions', () => {
|
|
@@ -43,19 +44,37 @@ const policy_js_1 = require("../policy.js");
|
|
|
43
44
|
};
|
|
44
45
|
(0, vitest_1.expect)((0, policy_js_1.evaluatePolicy)(action, rules).decision).toBe('BLOCK');
|
|
45
46
|
});
|
|
46
|
-
(0, vitest_1.it)('should
|
|
47
|
+
(0, vitest_1.it)('should REQUIRE_APPROVAL for admin actions even when defaultMode is allow', () => {
|
|
47
48
|
const action = { action_type: 'admin', tool: 'system', payload: {} };
|
|
48
49
|
const rules = { ...policy_js_1.DEFAULT_POLICY_RULES, defaultMode: 'allow', rules: [] };
|
|
49
50
|
const result = (0, policy_js_1.evaluatePolicy)(action, rules);
|
|
50
|
-
(0, vitest_1.expect)(result.decision).toBe('
|
|
51
|
-
(0, vitest_1.expect)(result.reason).toBe('Default policy');
|
|
51
|
+
(0, vitest_1.expect)(result.decision).toBe('REQUIRE_APPROVAL');
|
|
52
52
|
});
|
|
53
|
-
(0, vitest_1.it)('should
|
|
53
|
+
(0, vitest_1.it)('should REQUIRE_APPROVAL for financial actions even when defaultMode is allow', () => {
|
|
54
54
|
const action = { action_type: 'financial', tool: 'stripe', payload: {} };
|
|
55
55
|
const rules = { ...policy_js_1.DEFAULT_POLICY_RULES, defaultMode: 'allow', rules: [] };
|
|
56
56
|
const result = (0, policy_js_1.evaluatePolicy)(action, rules);
|
|
57
|
-
(0, vitest_1.expect)(result.decision).toBe('
|
|
58
|
-
|
|
57
|
+
(0, vitest_1.expect)(result.decision).toBe('REQUIRE_APPROVAL');
|
|
58
|
+
});
|
|
59
|
+
(0, vitest_1.it)('should REQUIRE_APPROVAL for admin action even with explicit ALLOW rule', () => {
|
|
60
|
+
const action = { action_type: 'admin', tool: 'admin.delete_user', payload: {} };
|
|
61
|
+
const rules = {
|
|
62
|
+
...policy_js_1.DEFAULT_POLICY_RULES,
|
|
63
|
+
defaultMode: 'allow',
|
|
64
|
+
rules: [{ action_type: 'admin', decision: 'ALLOW' }],
|
|
65
|
+
};
|
|
66
|
+
const result = (0, policy_js_1.evaluatePolicy)(action, rules);
|
|
67
|
+
(0, vitest_1.expect)(result.decision).toBe('REQUIRE_APPROVAL');
|
|
68
|
+
});
|
|
69
|
+
(0, vitest_1.it)('should REQUIRE_APPROVAL for financial action even with explicit ALLOW rule', () => {
|
|
70
|
+
const action = { action_type: 'financial', tool: 'stripe.charge', payload: {} };
|
|
71
|
+
const rules = {
|
|
72
|
+
...policy_js_1.DEFAULT_POLICY_RULES,
|
|
73
|
+
defaultMode: 'allow',
|
|
74
|
+
rules: [{ action_type: 'financial', decision: 'ALLOW' }],
|
|
75
|
+
};
|
|
76
|
+
const result = (0, policy_js_1.evaluatePolicy)(action, rules);
|
|
77
|
+
(0, vitest_1.expect)(result.decision).toBe('REQUIRE_APPROVAL');
|
|
59
78
|
});
|
|
60
79
|
(0, vitest_1.it)('should still respect explicit rules for admin even with defaultMode allow', () => {
|
|
61
80
|
const action = { action_type: 'admin', tool: 'system', payload: {} };
|
|
@@ -76,5 +95,103 @@ const policy_js_1 = require("../policy.js");
|
|
|
76
95
|
const rules = { ...policy_js_1.DEFAULT_POLICY_RULES, limits: { maxCostPerAction: 100 } };
|
|
77
96
|
(0, vitest_1.expect)((0, policy_js_1.evaluatePolicy)(action, rules).decision).toBe('BLOCK');
|
|
78
97
|
});
|
|
98
|
+
// --- Case-sensitivity bypass tests ---
|
|
99
|
+
(0, vitest_1.it)('should enforce HTTP domain allowlist even with mixed-case tool name', () => {
|
|
100
|
+
const action = {
|
|
101
|
+
action_type: 'read',
|
|
102
|
+
tool: 'Http.get',
|
|
103
|
+
payload: { url: 'https://evil.com/data', method: 'GET' },
|
|
104
|
+
};
|
|
105
|
+
const rules = {
|
|
106
|
+
...policy_js_1.DEFAULT_POLICY_RULES,
|
|
107
|
+
http: { allowedDomains: ['trusted.com'], allowedMethods: ['GET'], blockList: [] },
|
|
108
|
+
};
|
|
109
|
+
(0, vitest_1.expect)((0, policy_js_1.evaluatePolicy)(action, rules).decision).toBe('BLOCK');
|
|
110
|
+
});
|
|
111
|
+
(0, vitest_1.it)('should match tool-specific rules case-insensitively', () => {
|
|
112
|
+
const action = {
|
|
113
|
+
action_type: 'read',
|
|
114
|
+
tool: 'MCP.list_tools',
|
|
115
|
+
payload: {},
|
|
116
|
+
};
|
|
117
|
+
const result = (0, policy_js_1.evaluatePolicy)(action, policy_js_1.DEFAULT_POLICY_RULES);
|
|
118
|
+
(0, vitest_1.expect)(result.decision).toBe('ALLOW');
|
|
119
|
+
});
|
|
120
|
+
// --- URL edge cases ---
|
|
121
|
+
(0, vitest_1.it)('should not match subdomain of blocklisted domain (e.g., notevil.com vs evil.com)', () => {
|
|
122
|
+
const action = {
|
|
123
|
+
action_type: 'read',
|
|
124
|
+
tool: 'http.get',
|
|
125
|
+
payload: { url: 'https://notevil.com/data', method: 'GET' },
|
|
126
|
+
};
|
|
127
|
+
const rules = {
|
|
128
|
+
...policy_js_1.DEFAULT_POLICY_RULES,
|
|
129
|
+
http: { allowedDomains: ['notevil.com', 'trusted.com'], allowedMethods: ['GET'], blockList: ['evil.com'] },
|
|
130
|
+
};
|
|
131
|
+
(0, vitest_1.expect)((0, policy_js_1.evaluatePolicy)(action, rules).decision).not.toBe('BLOCK');
|
|
132
|
+
});
|
|
133
|
+
(0, vitest_1.it)('should BLOCK HTTP tool with no URL in payload', () => {
|
|
134
|
+
const action = {
|
|
135
|
+
action_type: 'read',
|
|
136
|
+
tool: 'http.get',
|
|
137
|
+
payload: {},
|
|
138
|
+
};
|
|
139
|
+
const rules = {
|
|
140
|
+
...policy_js_1.DEFAULT_POLICY_RULES,
|
|
141
|
+
http: { allowedDomains: ['trusted.com'], allowedMethods: ['GET'], blockList: [] },
|
|
142
|
+
};
|
|
143
|
+
(0, vitest_1.expect)((0, policy_js_1.evaluatePolicy)(action, rules).decision).toBe('BLOCK');
|
|
144
|
+
});
|
|
145
|
+
// --- Browser tool policy ---
|
|
146
|
+
(0, vitest_1.it)('should REQUIRE_APPROVAL for browser.open', () => {
|
|
147
|
+
const action = {
|
|
148
|
+
action_type: 'write',
|
|
149
|
+
tool: 'browser.open',
|
|
150
|
+
payload: { url: 'https://example.com' },
|
|
151
|
+
};
|
|
152
|
+
const result = (0, policy_js_1.evaluatePolicy)(action, policy_js_1.DEFAULT_POLICY_RULES);
|
|
153
|
+
(0, vitest_1.expect)(result.decision).toBe('REQUIRE_APPROVAL');
|
|
154
|
+
});
|
|
155
|
+
(0, vitest_1.it)('should BLOCK browser.* actions without a session (reaching policy engine)', () => {
|
|
156
|
+
const action = {
|
|
157
|
+
action_type: 'write',
|
|
158
|
+
tool: 'browser.click',
|
|
159
|
+
payload: {},
|
|
160
|
+
};
|
|
161
|
+
const result = (0, policy_js_1.evaluatePolicy)(action, policy_js_1.DEFAULT_POLICY_RULES);
|
|
162
|
+
(0, vitest_1.expect)(result.decision).toBe('BLOCK');
|
|
163
|
+
});
|
|
164
|
+
// --- Unknown action_type ---
|
|
165
|
+
(0, vitest_1.it)('should BLOCK unknown action types', () => {
|
|
166
|
+
const action = {
|
|
167
|
+
action_type: 'delete',
|
|
168
|
+
tool: 'custom.tool',
|
|
169
|
+
payload: {},
|
|
170
|
+
};
|
|
171
|
+
const result = (0, policy_js_1.evaluatePolicy)(action, policy_js_1.DEFAULT_POLICY_RULES);
|
|
172
|
+
(0, vitest_1.expect)(result.decision).toBe('BLOCK');
|
|
173
|
+
});
|
|
174
|
+
// --- cost_estimate omission ---
|
|
175
|
+
(0, vitest_1.it)('should not enforce budget check when cost_estimate is omitted', () => {
|
|
176
|
+
const action = {
|
|
177
|
+
action_type: 'write',
|
|
178
|
+
tool: 'demo',
|
|
179
|
+
payload: {},
|
|
180
|
+
// cost_estimate intentionally omitted
|
|
181
|
+
};
|
|
182
|
+
const rules = { ...policy_js_1.DEFAULT_POLICY_RULES, limits: { maxCostPerAction: 100 } };
|
|
183
|
+
// Should match action_type 'write' rule, not be BLOCK-ed by cost limit
|
|
184
|
+
(0, vitest_1.expect)((0, policy_js_1.evaluatePolicy)(action, rules).decision).toBe('REQUIRE_APPROVAL');
|
|
185
|
+
});
|
|
186
|
+
// --- HTTP allowlist not configured ---
|
|
187
|
+
(0, vitest_1.it)('should REQUIRE_APPROVAL when HTTP allowlist is empty (safe default)', () => {
|
|
188
|
+
const action = {
|
|
189
|
+
action_type: 'read',
|
|
190
|
+
tool: 'http.get',
|
|
191
|
+
payload: { url: 'https://any-site.com/data', method: 'GET' },
|
|
192
|
+
};
|
|
193
|
+
const result = (0, policy_js_1.evaluatePolicy)(action, policy_js_1.DEFAULT_POLICY_RULES);
|
|
194
|
+
(0, vitest_1.expect)(result.decision).toBe('REQUIRE_APPROVAL');
|
|
195
|
+
});
|
|
79
196
|
});
|
|
80
197
|
//# sourceMappingURL=policy.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.test.js","sourceRoot":"","sources":["../../src/__tests__/policy.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,4CAAoE;AAGpE,IAAA,iBAAQ,EAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAuB,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"policy.test.js","sourceRoot":"","sources":["../../src/__tests__/policy.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,4CAAoE;AAGpE,IAAA,iBAAQ,EAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,kGAAkG;QAClG,MAAM,MAAM,GAAuB,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAC3F,IAAA,eAAM,EAAC,IAAA,0BAAc,EAAC,MAAM,EAAE,gCAAoB,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAuB,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACvF,IAAA,eAAM,EAAC,IAAA,0BAAc,EAAC,MAAM,EAAE,gCAAoB,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,MAAM,GAAuB,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACzF,IAAA,eAAM,EAAC,IAAA,0BAAc,EAAC,MAAM,EAAE,gCAAoB,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAuB,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAC7F,IAAA,eAAM,EAAC,IAAA,0BAAc,EAAC,MAAM,EAAE,gCAAoB,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAuB;YACjC,WAAW,EAAE,MAAM;YACnB,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,EAAE,GAAG,EAAE,uBAAuB,EAAE,MAAM,EAAE,KAAK,EAAE;SACzD,CAAC;QACF,MAAM,KAAK,GAAG;YACZ,GAAG,gCAAoB;YACvB,IAAI,EAAE,EAAE,cAAc,EAAE,CAAC,aAAa,CAAC,EAAE,cAAc,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;SAClF,CAAC;QACF,IAAA,eAAM,EAAC,IAAA,0BAAc,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAuB;YACjC,WAAW,EAAE,MAAM;YACnB,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,EAAE,GAAG,EAAE,uBAAuB,EAAE,MAAM,EAAE,KAAK,EAAE;SACzD,CAAC;QACF,MAAM,KAAK,GAAG;YACZ,GAAG,gCAAoB;YACvB,IAAI,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,UAAU,CAAC,EAAE;SAC/E,CAAC;QACF,IAAA,eAAM,EAAC,IAAA,0BAAc,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,MAAM,GAAuB,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACzF,MAAM,KAAK,GAAG,EAAE,GAAG,gCAAoB,EAAE,WAAW,EAAE,OAAgB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACpF,MAAM,MAAM,GAAG,IAAA,0BAAc,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7C,IAAA,eAAM,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,MAAM,MAAM,GAAuB,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAC7F,MAAM,KAAK,GAAG,EAAE,GAAG,gCAAoB,EAAE,WAAW,EAAE,OAAgB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACpF,MAAM,MAAM,GAAG,IAAA,0BAAc,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7C,IAAA,eAAM,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,MAAM,GAAuB,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACpG,MAAM,KAAK,GAAG;YACZ,GAAG,gCAAoB;YACvB,WAAW,EAAE,OAAgB;YAC7B,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,OAAgB,EAAE,QAAQ,EAAE,OAAgB,EAAE,CAAC;SACvE,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,0BAAc,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7C,IAAA,eAAM,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,MAAM,GAAuB,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACpG,MAAM,KAAK,GAAG;YACZ,GAAG,gCAAoB;YACvB,WAAW,EAAE,OAAgB;YAC7B,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,WAAoB,EAAE,QAAQ,EAAE,OAAgB,EAAE,CAAC;SAC3E,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,0BAAc,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7C,IAAA,eAAM,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,MAAM,GAAuB,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACzF,MAAM,KAAK,GAAG;YACZ,GAAG,gCAAoB;YACvB,WAAW,EAAE,OAAgB;YAC7B,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,OAAgB,EAAE,QAAQ,EAAE,OAAgB,EAAE,CAAC;SACvE,CAAC;QACF,IAAA,eAAM,EAAC,IAAA,0BAAc,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAuB;YACjC,WAAW,EAAE,WAAW;YACxB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;YACX,aAAa,EAAE,IAAI;SACpB,CAAC;QACF,MAAM,KAAK,GAAG,EAAE,GAAG,gCAAoB,EAAE,MAAM,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,CAAC;QAC7E,IAAA,eAAM,EAAC,IAAA,0BAAc,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,wCAAwC;IAExC,IAAA,WAAE,EAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,MAAM,GAAuB;YACjC,WAAW,EAAE,MAAM;YACnB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,EAAE,GAAG,EAAE,uBAAuB,EAAE,MAAM,EAAE,KAAK,EAAE;SACzD,CAAC;QACF,MAAM,KAAK,GAAG;YACZ,GAAG,gCAAoB;YACvB,IAAI,EAAE,EAAE,cAAc,EAAE,CAAC,aAAa,CAAC,EAAE,cAAc,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;SAClF,CAAC;QACF,IAAA,eAAM,EAAC,IAAA,0BAAc,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,MAAM,GAAuB;YACjC,WAAW,EAAE,MAAM;YACnB,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,EAAE;SACZ,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,0BAAc,EAAC,MAAM,EAAE,gCAAoB,CAAC,CAAC;QAC5D,IAAA,eAAM,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,yBAAyB;IAEzB,IAAA,WAAE,EAAC,kFAAkF,EAAE,GAAG,EAAE;QAC1F,MAAM,MAAM,GAAuB;YACjC,WAAW,EAAE,MAAM;YACnB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,EAAE,GAAG,EAAE,0BAA0B,EAAE,MAAM,EAAE,KAAK,EAAE;SAC5D,CAAC;QACF,MAAM,KAAK,GAAG;YACZ,GAAG,gCAAoB;YACvB,IAAI,EAAE,EAAE,cAAc,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,cAAc,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,UAAU,CAAC,EAAE;SAC3G,CAAC;QACF,IAAA,eAAM,EAAC,IAAA,0BAAc,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAuB;YACjC,WAAW,EAAE,MAAM;YACnB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,EAAE;SACZ,CAAC;QACF,MAAM,KAAK,GAAG;YACZ,GAAG,gCAAoB;YACvB,IAAI,EAAE,EAAE,cAAc,EAAE,CAAC,aAAa,CAAC,EAAE,cAAc,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;SAClF,CAAC;QACF,IAAA,eAAM,EAAC,IAAA,0BAAc,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,8BAA8B;IAE9B,IAAA,WAAE,EAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAuB;YACjC,WAAW,EAAE,OAAO;YACpB,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,EAAE,GAAG,EAAE,qBAAqB,EAAE;SACxC,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,0BAAc,EAAC,MAAM,EAAE,gCAAoB,CAAC,CAAC;QAC5D,IAAA,eAAM,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,MAAM,GAAuB;YACjC,WAAW,EAAE,OAAO;YACpB,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,EAAE;SACZ,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,0BAAc,EAAC,MAAM,EAAE,gCAAoB,CAAC,CAAC;QAC5D,IAAA,eAAM,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,8BAA8B;IAE9B,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAAG;YACb,WAAW,EAAE,QAAkB;YAC/B,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,EAAE;SACZ,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,0BAAc,EAAC,MAAM,EAAE,gCAAoB,CAAC,CAAC;QAC5D,IAAA,eAAM,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,iCAAiC;IAEjC,IAAA,WAAE,EAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,MAAM,GAAuB;YACjC,WAAW,EAAE,OAAO;YACpB,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,EAAE;YACX,sCAAsC;SACvC,CAAC;QACF,MAAM,KAAK,GAAG,EAAE,GAAG,gCAAoB,EAAE,MAAM,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,CAAC;QAC7E,uEAAuE;QACvE,IAAA,eAAM,EAAC,IAAA,0BAAc,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,wCAAwC;IAExC,IAAA,WAAE,EAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,MAAM,GAAuB;YACjC,WAAW,EAAE,MAAM;YACnB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,EAAE,GAAG,EAAE,2BAA2B,EAAE,MAAM,EAAE,KAAK,EAAE;SAC7D,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,0BAAc,EAAC,MAAM,EAAE,gCAAoB,CAAC,CAAC;QAC5D,IAAA,eAAM,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|