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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=billing.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/billing.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const billing_js_1 = require("../billing.js");
5
+ (0, vitest_1.describe)('stripe billing status helpers', () => {
6
+ (0, vitest_1.it)('treats active and trialing subscriptions as entitled', () => {
7
+ (0, vitest_1.expect)((0, billing_js_1.isEntitledStripeSubscriptionStatus)('active')).toBe(true);
8
+ (0, vitest_1.expect)((0, billing_js_1.isEntitledStripeSubscriptionStatus)('trialing')).toBe(true);
9
+ (0, vitest_1.expect)((0, billing_js_1.isEntitledStripeSubscriptionStatus)('past_due')).toBe(false);
10
+ });
11
+ (0, vitest_1.it)('keeps recoverable subscriptions attached to the existing customer flow', () => {
12
+ (0, vitest_1.expect)((0, billing_js_1.isRecoverableStripeSubscriptionStatus)('active')).toBe(true);
13
+ (0, vitest_1.expect)((0, billing_js_1.isRecoverableStripeSubscriptionStatus)('trialing')).toBe(true);
14
+ (0, vitest_1.expect)((0, billing_js_1.isRecoverableStripeSubscriptionStatus)('past_due')).toBe(true);
15
+ (0, vitest_1.expect)((0, billing_js_1.isRecoverableStripeSubscriptionStatus)('unpaid')).toBe(true);
16
+ (0, vitest_1.expect)((0, billing_js_1.isRecoverableStripeSubscriptionStatus)('incomplete')).toBe(true);
17
+ (0, vitest_1.expect)((0, billing_js_1.isRecoverableStripeSubscriptionStatus)('paused')).toBe(true);
18
+ (0, vitest_1.expect)((0, billing_js_1.isRecoverableStripeSubscriptionStatus)('incomplete_expired')).toBe(false);
19
+ });
20
+ (0, vitest_1.it)('only allows a fresh checkout for terminal subscriptions', () => {
21
+ (0, vitest_1.expect)((0, billing_js_1.isTerminalStripeSubscriptionStatus)('canceled')).toBe(true);
22
+ (0, vitest_1.expect)((0, billing_js_1.isTerminalStripeSubscriptionStatus)('incomplete_expired')).toBe(true);
23
+ (0, vitest_1.expect)((0, billing_js_1.isTerminalStripeSubscriptionStatus)('past_due')).toBe(false);
24
+ (0, vitest_1.expect)((0, billing_js_1.canStartNewCheckoutForStripeSubscriptionStatus)('canceled')).toBe(true);
25
+ (0, vitest_1.expect)((0, billing_js_1.canStartNewCheckoutForStripeSubscriptionStatus)('incomplete_expired')).toBe(true);
26
+ (0, vitest_1.expect)((0, billing_js_1.canStartNewCheckoutForStripeSubscriptionStatus)('active')).toBe(false);
27
+ (0, vitest_1.expect)((0, billing_js_1.canStartNewCheckoutForStripeSubscriptionStatus)('paused')).toBe(false);
28
+ (0, vitest_1.expect)((0, billing_js_1.canStartNewCheckoutForStripeSubscriptionStatus)('unknown_future_status')).toBe(false);
29
+ });
30
+ });
31
+ //# sourceMappingURL=billing.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.test.js","sourceRoot":"","sources":["../../src/__tests__/billing.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,8CAKuB;AAEvB,IAAA,iBAAQ,EAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,IAAA,WAAE,EAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,IAAA,eAAM,EAAC,IAAA,+CAAkC,EAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,IAAA,eAAM,EAAC,IAAA,+CAAkC,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClE,IAAA,eAAM,EAAC,IAAA,+CAAkC,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,IAAA,eAAM,EAAC,IAAA,kDAAqC,EAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,IAAA,eAAM,EAAC,IAAA,kDAAqC,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,IAAA,eAAM,EAAC,IAAA,kDAAqC,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,IAAA,eAAM,EAAC,IAAA,kDAAqC,EAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,IAAA,eAAM,EAAC,IAAA,kDAAqC,EAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,IAAA,eAAM,EAAC,IAAA,kDAAqC,EAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,IAAA,eAAM,EAAC,IAAA,kDAAqC,EAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,IAAA,eAAM,EAAC,IAAA,+CAAkC,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClE,IAAA,eAAM,EAAC,IAAA,+CAAkC,EAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5E,IAAA,eAAM,EAAC,IAAA,+CAAkC,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnE,IAAA,eAAM,EAAC,IAAA,2DAA8C,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9E,IAAA,eAAM,EAAC,IAAA,2DAA8C,EAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxF,IAAA,eAAM,EAAC,IAAA,2DAA8C,EAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7E,IAAA,eAAM,EAAC,IAAA,2DAA8C,EAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7E,IAAA,eAAM,EAAC,IAAA,2DAA8C,EAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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 crypto_1 = require("../crypto");
5
- (0, vitest_1.describe)('crypto', () => {
6
- (0, vitest_1.describe)('encrypt / decrypt', () => {
7
- (0, vitest_1.it)('roundtrips plaintext', () => {
8
- const key = (0, crypto_1.generateKey)();
9
- const plaintext = 'Hello, world!';
10
- const encrypted = (0, crypto_1.encrypt)(plaintext, key);
11
- (0, vitest_1.expect)((0, crypto_1.decrypt)(encrypted, key)).toBe(plaintext);
12
- });
13
- (0, vitest_1.it)('throws with wrong key', () => {
14
- const key = (0, crypto_1.generateKey)();
15
- const wrongKey = (0, crypto_1.generateKey)();
16
- const encrypted = (0, crypto_1.encrypt)('secret', key);
17
- (0, vitest_1.expect)(() => (0, crypto_1.decrypt)(encrypted, wrongKey)).toThrow('Decryption failed');
18
- });
19
- (0, vitest_1.it)('handles JSON payloads', () => {
20
- const key = (0, crypto_1.generateKey)();
21
- const data = JSON.stringify({ foo: 'bar', num: 42, arr: [1, 2, 3] });
22
- const encrypted = (0, crypto_1.encrypt)(data, key);
23
- (0, vitest_1.expect)(JSON.parse((0, crypto_1.decrypt)(encrypted, key))).toEqual(JSON.parse(data));
24
- });
25
- });
26
- (0, vitest_1.describe)('encryptDEK / decryptDEK', () => {
27
- (0, vitest_1.it)('roundtrips a DEK through master key', () => {
28
- const masterKey = (0, crypto_1.generateKey)();
29
- const dek = (0, crypto_1.generateKey)();
30
- const encrypted = (0, crypto_1.encryptDEK)(dek, masterKey);
31
- const decrypted = (0, crypto_1.decryptDEK)(encrypted, masterKey);
32
- (0, vitest_1.expect)(Buffer.from(decrypted).equals(Buffer.from(dek))).toBe(true);
33
- });
34
- });
35
- (0, vitest_1.describe)('encryptCredential / decryptCredential', () => {
36
- (0, vitest_1.it)('roundtrips a credential payload', () => {
37
- const masterKey = (0, crypto_1.generateKey)();
38
- const payload = { api_key: 'sk-test-123', endpoint: 'https://api.example.com' };
39
- const { encryptedDEK, encryptedPayload } = (0, crypto_1.encryptCredential)(payload, masterKey);
40
- (0, vitest_1.expect)(typeof encryptedDEK).toBe('string');
41
- (0, vitest_1.expect)(typeof encryptedPayload).toBe('string');
42
- const decrypted = (0, crypto_1.decryptCredential)(encryptedDEK, encryptedPayload, masterKey);
43
- (0, vitest_1.expect)(decrypted).toEqual(payload);
44
- });
45
- (0, vitest_1.it)('fails with wrong master key', () => {
46
- const masterKey = (0, crypto_1.generateKey)();
47
- const wrongKey = (0, crypto_1.generateKey)();
48
- const { encryptedDEK, encryptedPayload } = (0, crypto_1.encryptCredential)({ secret: 'value' }, masterKey);
49
- (0, vitest_1.expect)(() => (0, crypto_1.decryptCredential)(encryptedDEK, encryptedPayload, wrongKey)).toThrow();
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":"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"}
1
+ {"version":3,"file":"crypto.test.js","sourceRoot":"","sources":["../../src/__tests__/crypto.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dns-pinning.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dns-pinning.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/dns-pinning.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const dns_pinning_js_1 = require("../dns-pinning.js");
5
+ (0, vitest_1.describe)('createPinnedLookup', () => {
6
+ (0, vitest_1.it)('returns a literal IPv4 as-is via the resolver (no DNS round-trip)', async () => {
7
+ const lookup = (0, dns_pinning_js_1.createPinnedLookup)();
8
+ const ips = await lookup.resolver('203.0.113.7');
9
+ (0, vitest_1.expect)(ips).toEqual(['203.0.113.7']);
10
+ });
11
+ (0, vitest_1.it)('hands the connect path the same address the resolver validated (pin)', async () => {
12
+ // The SSRF check calls `.resolver(host)`; undici's connect calls the
13
+ // lookup itself. Both must agree on one address or the pin is voided.
14
+ const lookup = (0, dns_pinning_js_1.createPinnedLookup)();
15
+ const viaResolver = await lookup.resolver('198.51.100.42');
16
+ const viaLookup = await new Promise((resolve, reject) => {
17
+ lookup('198.51.100.42', { family: 4 }, (err, address) => (err ? reject(err) : resolve(address)));
18
+ });
19
+ (0, vitest_1.expect)(viaResolver).toEqual(['198.51.100.42']);
20
+ (0, vitest_1.expect)(viaLookup).toBe('198.51.100.42');
21
+ });
22
+ (0, vitest_1.it)('honors undici\'s { all: true } callback shape', async () => {
23
+ // Node >=20 / undici invoke the lookup with { all: true } and expect
24
+ // callback(null, [{ address, family }]). The 3-arg form silently breaks
25
+ // there and voids the pin, so this shape must be supported.
26
+ const lookup = (0, dns_pinning_js_1.createPinnedLookup)();
27
+ const result = await new Promise((resolve, reject) => {
28
+ lookup('192.0.2.10', { all: true }, ((err, addrs) => err ? reject(err) : resolve(addrs)));
29
+ });
30
+ (0, vitest_1.expect)(result).toEqual([{ address: '192.0.2.10', family: 4 }]);
31
+ });
32
+ });
33
+ //# sourceMappingURL=dns-pinning.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dns-pinning.test.js","sourceRoot":"","sources":["../../src/__tests__/dns-pinning.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,sDAAuD;AAEvD,IAAA,iBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAA,WAAE,EAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,MAAM,GAAG,IAAA,mCAAkB,GAAE,CAAC;QACpC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACjD,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,qEAAqE;QACrE,sEAAsE;QACtE,MAAM,MAAM,GAAG,IAAA,mCAAkB,GAAE,CAAC;QACpC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9D,MAAM,CACJ,eAAe,EACf,EAAE,MAAM,EAAE,CAAC,EAA4C,EACvD,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CACzD,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;QAC/C,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,qEAAqE;QACrE,wEAAwE;QACxE,4DAA4D;QAC5D,MAAM,MAAM,GAAG,IAAA,mCAAkB,GAAE,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAC9B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClB,MAAM,CACJ,YAAY,EACZ,EAAE,GAAG,EAAE,IAAI,EAA4C,EACvD,CAAC,CAAC,GAAiC,EAAE,KAAiD,EAAE,EAAE,CACxF,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAI3B,CACV,CAAC;QACJ,CAAC,CACF,CAAC;QACF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=llm-classifier-cache-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-classifier-cache-store.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/llm-classifier-cache-store.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const llm_classifier_cache_store_js_1 = require("../llm-classifier-cache-store.js");
5
+ const SAMPLE = {
6
+ category: 'admin',
7
+ reason: 'tool name suggests privileged operation',
8
+ confidence: 0.95,
9
+ model: 'google/gemini-2.5-flash-lite',
10
+ };
11
+ (0, vitest_1.describe)('InMemoryCacheStore', () => {
12
+ let store;
13
+ (0, vitest_1.beforeEach)(() => {
14
+ store = new llm_classifier_cache_store_js_1.InMemoryCacheStore({ ttlMs: 1000 * 60 * 60 });
15
+ });
16
+ (0, vitest_1.it)('returns null on cache miss', async () => {
17
+ (0, vitest_1.expect)(await store.get('missing-key')).toBeNull();
18
+ });
19
+ (0, vitest_1.it)('returns stored classification marked as cached', async () => {
20
+ await store.set('k1', SAMPLE);
21
+ const got = await store.get('k1');
22
+ (0, vitest_1.expect)(got).not.toBeNull();
23
+ (0, vitest_1.expect)(got.category).toBe('admin');
24
+ (0, vitest_1.expect)(got.cached).toBe(true);
25
+ });
26
+ (0, vitest_1.it)('does not return expired entries', async () => {
27
+ const shortLived = new llm_classifier_cache_store_js_1.InMemoryCacheStore({ ttlMs: 5 });
28
+ await shortLived.set('k1', SAMPLE);
29
+ await new Promise((resolve) => setTimeout(resolve, 20));
30
+ (0, vitest_1.expect)(await shortLived.get('k1')).toBeNull();
31
+ });
32
+ (0, vitest_1.it)('overwrites existing entries', async () => {
33
+ await store.set('k1', SAMPLE);
34
+ await store.set('k1', { ...SAMPLE, category: 'financial', reason: 'updated' });
35
+ const got = await store.get('k1');
36
+ (0, vitest_1.expect)(got.category).toBe('financial');
37
+ });
38
+ (0, vitest_1.it)('does not throw on errors from get or set', async () => {
39
+ await (0, vitest_1.expect)(store.get('k1')).resolves.not.toThrow();
40
+ await (0, vitest_1.expect)(store.set('k1', SAMPLE)).resolves.not.toThrow();
41
+ });
42
+ });
43
+ (0, vitest_1.describe)('classifier cache store singleton', () => {
44
+ (0, vitest_1.beforeEach)(() => {
45
+ (0, llm_classifier_cache_store_js_1.resetClassifierCacheStoreForTest)();
46
+ });
47
+ (0, vitest_1.it)('returns a default InMemoryCacheStore if nothing was set', () => {
48
+ const store = (0, llm_classifier_cache_store_js_1.getClassifierCacheStore)();
49
+ (0, vitest_1.expect)(store).toBeInstanceOf(llm_classifier_cache_store_js_1.InMemoryCacheStore);
50
+ });
51
+ (0, vitest_1.it)('returns the store that was injected via setClassifierCacheStore', () => {
52
+ const custom = {
53
+ get: async () => null,
54
+ set: async () => { },
55
+ };
56
+ (0, llm_classifier_cache_store_js_1.setClassifierCacheStore)(custom);
57
+ (0, vitest_1.expect)((0, llm_classifier_cache_store_js_1.getClassifierCacheStore)()).toBe(custom);
58
+ });
59
+ (0, vitest_1.it)('resetClassifierCacheStoreForTest clears the injected store', () => {
60
+ (0, llm_classifier_cache_store_js_1.setClassifierCacheStore)({ get: async () => null, set: async () => { } });
61
+ (0, llm_classifier_cache_store_js_1.resetClassifierCacheStoreForTest)();
62
+ (0, vitest_1.expect)((0, llm_classifier_cache_store_js_1.getClassifierCacheStore)()).toBeInstanceOf(llm_classifier_cache_store_js_1.InMemoryCacheStore);
63
+ });
64
+ });
65
+ //# sourceMappingURL=llm-classifier-cache-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-classifier-cache-store.test.js","sourceRoot":"","sources":["../../src/__tests__/llm-classifier-cache-store.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=llm-classifier-cache.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-classifier-cache.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/llm-classifier-cache.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const llm_classifier_cache_js_1 = require("../llm-classifier-cache.js");
5
+ (0, vitest_1.describe)('llm-classifier-cache', () => {
6
+ (0, vitest_1.describe)('buildCacheKey', () => {
7
+ (0, vitest_1.it)('produces the same key for identical tool + payload shape', () => {
8
+ const k1 = (0, llm_classifier_cache_js_1.buildCacheKey)('notion.delete_page', { pageId: 'abc', permanent: true });
9
+ const k2 = (0, llm_classifier_cache_js_1.buildCacheKey)('notion.delete_page', { pageId: 'xyz', permanent: false });
10
+ (0, vitest_1.expect)(k1).toBe(k2);
11
+ });
12
+ (0, vitest_1.it)('produces the same key regardless of key ordering', () => {
13
+ const k1 = (0, llm_classifier_cache_js_1.buildCacheKey)('tool.name', { a: 1, b: 2, c: 3 });
14
+ const k2 = (0, llm_classifier_cache_js_1.buildCacheKey)('tool.name', { c: 3, a: 1, b: 2 });
15
+ (0, vitest_1.expect)(k1).toBe(k2);
16
+ });
17
+ (0, vitest_1.it)('produces different keys for different tool names', () => {
18
+ const k1 = (0, llm_classifier_cache_js_1.buildCacheKey)('notion.delete_page', { pageId: 'abc' });
19
+ const k2 = (0, llm_classifier_cache_js_1.buildCacheKey)('notion.archive_page', { pageId: 'abc' });
20
+ (0, vitest_1.expect)(k1).not.toBe(k2);
21
+ });
22
+ (0, vitest_1.it)('produces different keys for different payload shapes', () => {
23
+ const k1 = (0, llm_classifier_cache_js_1.buildCacheKey)('tool', { a: 1, b: 2 });
24
+ const k2 = (0, llm_classifier_cache_js_1.buildCacheKey)('tool', { a: 1, b: 2, c: 3 });
25
+ (0, vitest_1.expect)(k1).not.toBe(k2);
26
+ });
27
+ (0, vitest_1.it)('is case-insensitive on tool name (matches static floor behavior)', () => {
28
+ const k1 = (0, llm_classifier_cache_js_1.buildCacheKey)('Notion.Delete_Page', {});
29
+ const k2 = (0, llm_classifier_cache_js_1.buildCacheKey)('notion.delete_page', {});
30
+ (0, vitest_1.expect)(k1).toBe(k2);
31
+ });
32
+ (0, vitest_1.it)('strips values but preserves nested structure', () => {
33
+ const k1 = (0, llm_classifier_cache_js_1.buildCacheKey)('tool', { nested: { x: 1, y: 2 } });
34
+ const k2 = (0, llm_classifier_cache_js_1.buildCacheKey)('tool', { nested: { x: 999, y: 'different' } });
35
+ (0, vitest_1.expect)(k1).toBe(k2);
36
+ });
37
+ (0, vitest_1.it)('treats arrays by structure of first element', () => {
38
+ const k1 = (0, llm_classifier_cache_js_1.buildCacheKey)('tool', { items: [{ id: 1 }] });
39
+ const k2 = (0, llm_classifier_cache_js_1.buildCacheKey)('tool', { items: [{ id: 2 }, { id: 3 }] });
40
+ (0, vitest_1.expect)(k1).toBe(k2);
41
+ });
42
+ });
43
+ });
44
+ //# sourceMappingURL=llm-classifier-cache.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-classifier-cache.test.js","sourceRoot":"","sources":["../../src/__tests__/llm-classifier-cache.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=llm-classifier.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-classifier.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/llm-classifier.test.ts"],"names":[],"mappings":""}