@kya-os/mcp-i 0.1.0-alpha.3.9 → 1.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.
Files changed (328) hide show
  1. package/README.md +350 -213
  2. package/dist/149.js +1 -0
  3. package/dist/189.js +1 -0
  4. package/dist/261.js +1 -0
  5. package/dist/28.js +1 -0
  6. package/dist/295.js +1 -0
  7. package/dist/460.js +1 -0
  8. package/dist/570.js +1 -0
  9. package/dist/634.js +1 -0
  10. package/dist/647.js +1 -0
  11. package/dist/67.js +1 -0
  12. package/dist/739.js +1 -0
  13. package/dist/742.js +1 -0
  14. package/dist/904.js +1 -0
  15. package/dist/938.js +1 -0
  16. package/dist/auth/api-key.d.ts +16 -0
  17. package/dist/auth/api-key.js +82 -0
  18. package/dist/auth/jwt.d.ts +43 -0
  19. package/dist/auth/jwt.js +51 -0
  20. package/dist/auth/oauth/factory.d.ts +12 -0
  21. package/dist/auth/oauth/factory.js +36 -0
  22. package/dist/auth/oauth/index.d.ts +5 -0
  23. package/dist/auth/oauth/index.js +27 -0
  24. package/dist/auth/oauth/providers/proxy-provider.d.ts +13 -0
  25. package/dist/auth/oauth/providers/proxy-provider.js +159 -0
  26. package/dist/auth/oauth/router.d.ts +4 -0
  27. package/dist/auth/oauth/router.js +294 -0
  28. package/dist/auth/oauth/storage/memory-storage.d.ts +12 -0
  29. package/dist/auth/oauth/storage/memory-storage.js +40 -0
  30. package/dist/auth/oauth/types.d.ts +112 -0
  31. package/dist/cache/__tests__/cloudflare-kv-nonce-cache.test.d.ts +4 -0
  32. package/dist/cache/__tests__/cloudflare-kv-nonce-cache.test.js +176 -0
  33. package/dist/cache/__tests__/concurrency.test.d.ts +5 -0
  34. package/dist/cache/__tests__/concurrency.test.js +300 -0
  35. package/dist/cache/__tests__/dynamodb-nonce-cache.test.d.ts +4 -0
  36. package/dist/cache/__tests__/dynamodb-nonce-cache.test.js +176 -0
  37. package/dist/cache/__tests__/memory-nonce-cache.test.d.ts +4 -0
  38. package/dist/cache/__tests__/memory-nonce-cache.test.js +132 -0
  39. package/dist/cache/__tests__/nonce-cache-factory-simple.test.d.ts +4 -0
  40. package/dist/cache/__tests__/nonce-cache-factory-simple.test.js +133 -0
  41. package/dist/cache/__tests__/nonce-cache-factory.test.d.ts +4 -0
  42. package/dist/cache/__tests__/nonce-cache-factory.test.js +252 -0
  43. package/dist/cache/__tests__/redis-nonce-cache.test.d.ts +4 -0
  44. package/dist/cache/__tests__/redis-nonce-cache.test.js +95 -0
  45. package/dist/cache/cloudflare-kv-nonce-cache.d.ts +14 -0
  46. package/dist/cache/cloudflare-kv-nonce-cache.js +93 -0
  47. package/dist/cache/dynamodb-nonce-cache.d.ts +15 -0
  48. package/dist/cache/dynamodb-nonce-cache.js +92 -0
  49. package/dist/cache/index.d.ts +16 -0
  50. package/dist/cache/index.js +32 -0
  51. package/dist/cache/memory-nonce-cache.d.ts +44 -0
  52. package/dist/cache/memory-nonce-cache.js +105 -0
  53. package/dist/cache/nonce-cache-factory.d.ts +20 -0
  54. package/dist/cache/nonce-cache-factory.js +208 -0
  55. package/dist/cache/redis-nonce-cache.d.ts +14 -0
  56. package/dist/cache/redis-nonce-cache.js +53 -0
  57. package/dist/compiler/compiler-context.d.ts +23 -0
  58. package/dist/compiler/compiler-context.js +24 -0
  59. package/dist/compiler/config/constants.d.ts +41 -0
  60. package/dist/compiler/config/constants.js +45 -0
  61. package/dist/compiler/config/index.d.ts +252 -0
  62. package/dist/compiler/config/index.js +15 -0
  63. package/dist/compiler/config/injection.d.ts +26 -0
  64. package/dist/compiler/config/injection.js +58 -0
  65. package/dist/compiler/config/schemas/experimental/index.d.ts +91 -0
  66. package/dist/compiler/config/schemas/experimental/index.js +16 -0
  67. package/dist/compiler/config/schemas/experimental/oauth.d.ts +74 -0
  68. package/dist/compiler/config/schemas/experimental/oauth.js +25 -0
  69. package/dist/compiler/config/schemas/index.d.ts +6 -0
  70. package/dist/compiler/config/schemas/index.js +17 -0
  71. package/dist/compiler/config/schemas/paths.d.ts +9 -0
  72. package/dist/compiler/config/schemas/paths.js +12 -0
  73. package/dist/compiler/config/schemas/transport/http.d.ts +82 -0
  74. package/dist/compiler/config/schemas/transport/http.js +33 -0
  75. package/dist/compiler/config/schemas/transport/stdio.d.ts +9 -0
  76. package/dist/compiler/config/schemas/transport/stdio.js +15 -0
  77. package/dist/compiler/config/schemas/webpack.d.ts +3 -0
  78. package/dist/compiler/config/schemas/webpack.js +15 -0
  79. package/dist/compiler/config/types.d.ts +1 -0
  80. package/dist/compiler/config/types.js +2 -0
  81. package/dist/compiler/config/utils.d.ts +20 -0
  82. package/dist/compiler/config/utils.js +36 -0
  83. package/dist/compiler/generate-env-code.d.ts +1 -0
  84. package/dist/compiler/generate-env-code.js +8 -0
  85. package/dist/compiler/generate-import-code.d.ts +1 -0
  86. package/dist/compiler/generate-import-code.js +24 -0
  87. package/dist/compiler/get-webpack-config/get-entries.d.ts +3 -0
  88. package/dist/compiler/get-webpack-config/get-entries.js +29 -0
  89. package/dist/compiler/get-webpack-config/get-externals.d.ts +7 -0
  90. package/dist/compiler/get-webpack-config/get-externals.js +88 -0
  91. package/dist/compiler/get-webpack-config/get-injected-variables.d.ts +8 -0
  92. package/dist/compiler/get-webpack-config/get-injected-variables.js +25 -0
  93. package/dist/compiler/get-webpack-config/index.d.ts +4 -0
  94. package/dist/compiler/get-webpack-config/index.js +101 -0
  95. package/dist/compiler/get-webpack-config/plugins.d.ts +8 -0
  96. package/dist/compiler/get-webpack-config/plugins.js +132 -0
  97. package/dist/compiler/get-webpack-config/resolve-tsconfig-paths.d.ts +9 -0
  98. package/dist/compiler/get-webpack-config/resolve-tsconfig-paths.js +40 -0
  99. package/dist/compiler/index.d.ts +6 -0
  100. package/dist/compiler/index.js +194 -0
  101. package/dist/compiler/on-first-build.d.ts +3 -0
  102. package/dist/compiler/on-first-build.js +58 -0
  103. package/dist/compiler/parse-xmcp-config.d.ts +9 -0
  104. package/dist/compiler/parse-xmcp-config.js +155 -0
  105. package/dist/compiler/start-http-server.d.ts +1 -0
  106. package/dist/compiler/start-http-server.js +34 -0
  107. package/dist/index.d.ts +12 -0
  108. package/dist/index.js +38 -0
  109. package/dist/index.js.LICENSE.txt +49 -0
  110. package/dist/runtime/__tests__/audit.test.d.ts +4 -0
  111. package/dist/runtime/__tests__/audit.test.js +328 -0
  112. package/dist/runtime/__tests__/identity.test.d.ts +4 -0
  113. package/dist/runtime/__tests__/identity.test.js +164 -0
  114. package/dist/runtime/__tests__/mcpi-runtime.test.d.ts +4 -0
  115. package/dist/runtime/__tests__/mcpi-runtime.test.js +372 -0
  116. package/dist/runtime/__tests__/proof.test.d.ts +4 -0
  117. package/dist/runtime/__tests__/proof.test.js +302 -0
  118. package/dist/runtime/__tests__/session.test.d.ts +4 -0
  119. package/dist/runtime/__tests__/session.test.js +254 -0
  120. package/dist/runtime/__tests__/well-known.test.d.ts +4 -0
  121. package/dist/runtime/__tests__/well-known.test.js +312 -0
  122. package/dist/runtime/adapter-express.js +2 -0
  123. package/dist/runtime/adapter-express.js.LICENSE.txt +252 -0
  124. package/dist/runtime/adapter-nextjs.js +2 -0
  125. package/dist/runtime/adapter-nextjs.js.LICENSE.txt +53 -0
  126. package/dist/runtime/adapters/express/index.d.ts +2 -0
  127. package/dist/runtime/adapters/express/index.js +48 -0
  128. package/dist/runtime/adapters/nextjs/index.d.ts +8 -0
  129. package/dist/runtime/adapters/nextjs/index.js +18 -0
  130. package/dist/runtime/audit.d.ts +93 -0
  131. package/dist/runtime/audit.js +212 -0
  132. package/dist/runtime/debug.d.ts +118 -0
  133. package/dist/runtime/debug.js +612 -0
  134. package/dist/runtime/delegation-hooks.d.ts +85 -0
  135. package/dist/runtime/delegation-hooks.js +116 -0
  136. package/dist/runtime/demo.d.ts +71 -0
  137. package/dist/runtime/demo.js +135 -0
  138. package/dist/runtime/headers.d.ts +1 -0
  139. package/dist/runtime/headers.js +9 -0
  140. package/dist/runtime/http.js +2 -0
  141. package/dist/runtime/http.js.LICENSE.txt +252 -0
  142. package/dist/runtime/identity.d.ts +105 -0
  143. package/dist/runtime/identity.js +232 -0
  144. package/dist/runtime/index.d.ts +16 -0
  145. package/dist/runtime/index.js +56 -0
  146. package/dist/runtime/mcpi-runtime.d.ts +164 -0
  147. package/dist/runtime/mcpi-runtime.js +352 -0
  148. package/dist/runtime/proof.d.ts +87 -0
  149. package/dist/runtime/proof.js +223 -0
  150. package/dist/runtime/session.d.ts +88 -0
  151. package/dist/runtime/session.js +216 -0
  152. package/dist/runtime/stdio.js +2 -0
  153. package/dist/runtime/stdio.js.LICENSE.txt +1 -0
  154. package/dist/runtime/templates/home.d.ts +2 -0
  155. package/dist/runtime/templates/home.js +50 -0
  156. package/dist/runtime/transports/http/base-streamable-http.d.ts +25 -0
  157. package/dist/runtime/transports/http/base-streamable-http.js +16 -0
  158. package/dist/runtime/transports/http/http-context.d.ts +9 -0
  159. package/dist/runtime/transports/http/http-context.js +8 -0
  160. package/dist/runtime/transports/http/index.js +55 -0
  161. package/dist/runtime/transports/http/setup-cors.d.ts +4 -0
  162. package/dist/runtime/transports/http/setup-cors.js +24 -0
  163. package/dist/runtime/transports/http/stateless-streamable-http.d.ts +39 -0
  164. package/dist/runtime/transports/http/stateless-streamable-http.js +331 -0
  165. package/dist/runtime/transports/stdio/index.d.ts +1 -0
  166. package/dist/runtime/transports/stdio/index.js +51 -0
  167. package/dist/runtime/utils/server.d.ts +42 -0
  168. package/dist/runtime/utils/server.js +39 -0
  169. package/dist/runtime/utils/tools.d.ts +8 -0
  170. package/dist/runtime/utils/tools.js +115 -0
  171. package/dist/runtime/verifier-middleware.d.ts +76 -0
  172. package/dist/runtime/verifier-middleware.js +322 -0
  173. package/dist/runtime/well-known.d.ts +151 -0
  174. package/dist/runtime/well-known.js +258 -0
  175. package/dist/storage/config.d.ts +28 -0
  176. package/dist/storage/config.js +79 -0
  177. package/dist/storage/delegation.d.ts +59 -0
  178. package/dist/storage/delegation.js +130 -0
  179. package/dist/storage/merkle-verifier.d.ts +84 -0
  180. package/dist/storage/merkle-verifier.js +261 -0
  181. package/dist/test/__tests__/nonce-cache-integration.test.d.ts +1 -0
  182. package/dist/test/__tests__/nonce-cache-integration.test.js +116 -0
  183. package/dist/test/__tests__/nonce-cache.test.d.ts +1 -0
  184. package/dist/test/__tests__/nonce-cache.test.js +122 -0
  185. package/dist/test/__tests__/runtime-integration.test.d.ts +4 -0
  186. package/dist/test/__tests__/runtime-integration.test.js +192 -0
  187. package/dist/test/__tests__/test-infrastructure.test.d.ts +4 -0
  188. package/dist/test/__tests__/test-infrastructure.test.js +178 -0
  189. package/dist/test/deterministic-keys.d.ts +31 -0
  190. package/dist/test/deterministic-keys.js +108 -0
  191. package/dist/test/examples/test-usage-example.d.ts +140 -0
  192. package/dist/test/examples/test-usage-example.js +175 -0
  193. package/dist/test/index.d.ts +11 -0
  194. package/dist/test/index.js +27 -0
  195. package/dist/test/local-verification.d.ts +28 -0
  196. package/dist/test/local-verification.js +342 -0
  197. package/dist/test/mock-identity-provider.d.ts +96 -0
  198. package/dist/test/mock-identity-provider.js +243 -0
  199. package/dist/test/runtime-integration.d.ts +63 -0
  200. package/dist/test/runtime-integration.js +140 -0
  201. package/dist/test/test-environment.d.ts +26 -0
  202. package/dist/test/test-environment.js +50 -0
  203. package/dist/types/declarations.d.ts +1 -0
  204. package/dist/types/declarations.js +6 -0
  205. package/dist/types/middleware.d.ts +2 -0
  206. package/dist/types/middleware.js +2 -0
  207. package/dist/types/tool.d.ts +80 -0
  208. package/dist/types/tool.js +2 -0
  209. package/dist/utils/cli-icons.d.ts +3 -0
  210. package/dist/utils/cli-icons.js +7 -0
  211. package/dist/utils/constants.d.ts +6 -0
  212. package/dist/utils/constants.js +13 -0
  213. package/dist/utils/context.d.ts +33 -0
  214. package/dist/utils/context.js +58 -0
  215. package/dist/utils/file-watcher.d.ts +19 -0
  216. package/dist/utils/file-watcher.js +49 -0
  217. package/dist/utils/fs-utils.d.ts +2 -0
  218. package/dist/utils/fs-utils.js +22 -0
  219. package/dist/utils/path-validation.d.ts +3 -0
  220. package/dist/utils/path-validation.js +56 -0
  221. package/dist/utils/spawn-process.d.ts +9 -0
  222. package/dist/utils/spawn-process.js +50 -0
  223. package/dist/utils/subscribable.d.ts +12 -0
  224. package/dist/utils/subscribable.js +44 -0
  225. package/package.json +91 -77
  226. package/dist/cjs/auto.js +0 -16
  227. package/dist/cjs/cli-mode.d.ts +0 -16
  228. package/dist/cjs/cli-mode.js +0 -32
  229. package/dist/cjs/crypto.d.ts +0 -16
  230. package/dist/cjs/crypto.js +0 -212
  231. package/dist/cjs/dev-helper.d.ts +0 -3
  232. package/dist/cjs/dev-helper.js +0 -46
  233. package/dist/cjs/encrypted-storage.d.ts +0 -11
  234. package/dist/cjs/encrypted-storage.js +0 -73
  235. package/dist/cjs/index.d.ts +0 -56
  236. package/dist/cjs/index.js +0 -727
  237. package/dist/cjs/logger.d.ts +0 -32
  238. package/dist/cjs/logger.js +0 -85
  239. package/dist/cjs/nextjs.d.ts +0 -10
  240. package/dist/cjs/nextjs.js +0 -83
  241. package/dist/cjs/platform-info.d.ts +0 -36
  242. package/dist/cjs/platform-info.js +0 -274
  243. package/dist/cjs/polling.d.ts +0 -13
  244. package/dist/cjs/polling.js +0 -52
  245. package/dist/cjs/registry/index.d.ts +0 -12
  246. package/dist/cjs/registry/index.js +0 -56
  247. package/dist/cjs/registry/knowthat.d.ts +0 -17
  248. package/dist/cjs/registry/knowthat.js +0 -173
  249. package/dist/cjs/rotation.d.ts +0 -35
  250. package/dist/cjs/rotation.js +0 -102
  251. package/dist/cjs/storage.d.ts +0 -41
  252. package/dist/cjs/storage.js +0 -163
  253. package/dist/cjs/transport.d.ts +0 -35
  254. package/dist/cjs/transport.js +0 -300
  255. package/dist/cjs/types.d.ts +0 -206
  256. package/dist/cjs/vercel-adapter.d.ts +0 -8
  257. package/dist/cjs/vercel-adapter.js +0 -67
  258. package/dist/esm/auto.d.ts +0 -13
  259. package/dist/esm/auto.d.ts.map +0 -1
  260. package/dist/esm/auto.js +0 -30
  261. package/dist/esm/auto.js.map +0 -1
  262. package/dist/esm/cli-mode.d.ts +0 -52
  263. package/dist/esm/cli-mode.d.ts.map +0 -1
  264. package/dist/esm/cli-mode.js +0 -59
  265. package/dist/esm/cli-mode.js.map +0 -1
  266. package/dist/esm/crypto.d.ts +0 -51
  267. package/dist/esm/crypto.d.ts.map +0 -1
  268. package/dist/esm/crypto.js +0 -230
  269. package/dist/esm/crypto.js.map +0 -1
  270. package/dist/esm/dev-helper.d.ts +0 -15
  271. package/dist/esm/dev-helper.d.ts.map +0 -1
  272. package/dist/esm/dev-helper.js +0 -63
  273. package/dist/esm/dev-helper.js.map +0 -1
  274. package/dist/esm/encrypted-storage.d.ts +0 -19
  275. package/dist/esm/encrypted-storage.d.ts.map +0 -1
  276. package/dist/esm/encrypted-storage.js +0 -48
  277. package/dist/esm/encrypted-storage.js.map +0 -1
  278. package/dist/esm/index.d.ts +0 -129
  279. package/dist/esm/index.d.ts.map +0 -1
  280. package/dist/esm/index.js +0 -853
  281. package/dist/esm/index.js.map +0 -1
  282. package/dist/esm/logger.d.ts +0 -46
  283. package/dist/esm/logger.d.ts.map +0 -1
  284. package/dist/esm/logger.js +0 -100
  285. package/dist/esm/logger.js.map +0 -1
  286. package/dist/esm/nextjs.d.ts +0 -22
  287. package/dist/esm/nextjs.d.ts.map +0 -1
  288. package/dist/esm/nextjs.js +0 -83
  289. package/dist/esm/nextjs.js.map +0 -1
  290. package/dist/esm/package.json +0 -1
  291. package/dist/esm/platform-info.d.ts +0 -74
  292. package/dist/esm/platform-info.d.ts.map +0 -1
  293. package/dist/esm/platform-info.js +0 -293
  294. package/dist/esm/platform-info.js.map +0 -1
  295. package/dist/esm/polling.d.ts +0 -29
  296. package/dist/esm/polling.d.ts.map +0 -1
  297. package/dist/esm/polling.js +0 -76
  298. package/dist/esm/polling.js.map +0 -1
  299. package/dist/esm/registry/index.d.ts +0 -43
  300. package/dist/esm/registry/index.d.ts.map +0 -1
  301. package/dist/esm/registry/index.js +0 -89
  302. package/dist/esm/registry/index.js.map +0 -1
  303. package/dist/esm/registry/knowthat.d.ts +0 -44
  304. package/dist/esm/registry/knowthat.d.ts.map +0 -1
  305. package/dist/esm/registry/knowthat.js +0 -220
  306. package/dist/esm/registry/knowthat.js.map +0 -1
  307. package/dist/esm/rotation.d.ts +0 -57
  308. package/dist/esm/rotation.d.ts.map +0 -1
  309. package/dist/esm/rotation.js +0 -133
  310. package/dist/esm/rotation.js.map +0 -1
  311. package/dist/esm/storage.d.ts +0 -65
  312. package/dist/esm/storage.d.ts.map +0 -1
  313. package/dist/esm/storage.js +0 -160
  314. package/dist/esm/storage.js.map +0 -1
  315. package/dist/esm/transport.d.ts +0 -52
  316. package/dist/esm/transport.d.ts.map +0 -1
  317. package/dist/esm/transport.js +0 -340
  318. package/dist/esm/transport.js.map +0 -1
  319. package/dist/esm/types.d.ts +0 -293
  320. package/dist/esm/types.d.ts.map +0 -1
  321. package/dist/esm/types.js +0 -5
  322. package/dist/esm/types.js.map +0 -1
  323. package/dist/esm/vercel-adapter.d.ts +0 -26
  324. package/dist/esm/vercel-adapter.d.ts.map +0 -1
  325. package/dist/esm/vercel-adapter.js +0 -80
  326. package/dist/esm/vercel-adapter.js.map +0 -1
  327. /package/dist/{cjs → auth/oauth}/types.js +0 -0
  328. /package/dist/{cjs/auto.d.ts → runtime/transports/http/index.d.ts} +0 -0
@@ -0,0 +1,302 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for Detached Proof Generation
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const vitest_1 = require("vitest");
7
+ const proof_js_1 = require("../proof.js");
8
+ (0, vitest_1.describe)("ProofGenerator", () => {
9
+ let proofGenerator;
10
+ let mockIdentity;
11
+ let mockSession;
12
+ (0, vitest_1.beforeEach)(() => {
13
+ // Create mock identity with test keys
14
+ mockIdentity = {
15
+ did: "did:web:example.com:agents:test-agent",
16
+ keyId: "key-test-123",
17
+ privateKey: Buffer.from("test-private-key-32-bytes-long!!").toString("base64"),
18
+ publicKey: Buffer.from("test-public-key-32-bytes-long!!!").toString("base64"),
19
+ createdAt: new Date().toISOString(),
20
+ };
21
+ // Create mock session
22
+ mockSession = {
23
+ sessionId: "sess_test_123",
24
+ audience: "example.com",
25
+ nonce: "test-nonce-456",
26
+ timestamp: Math.floor(Date.now() / 1000),
27
+ createdAt: Math.floor(Date.now() / 1000),
28
+ lastActivity: Math.floor(Date.now() / 1000),
29
+ ttlMinutes: 30,
30
+ };
31
+ proofGenerator = new proof_js_1.ProofGenerator(mockIdentity);
32
+ });
33
+ (0, vitest_1.describe)("Canonical Hash Generation", () => {
34
+ (0, vitest_1.it)("should generate consistent hashes for same request/response", async () => {
35
+ const request = {
36
+ method: "test-tool",
37
+ params: { input: "hello" },
38
+ };
39
+ const response = {
40
+ data: { output: "world" },
41
+ };
42
+ const proof1 = await proofGenerator.generateProof(request, response, mockSession);
43
+ const proof2 = await proofGenerator.generateProof(request, response, mockSession);
44
+ // Hashes should be identical for same input
45
+ (0, vitest_1.expect)(proof1.meta.requestHash).toBe(proof2.meta.requestHash);
46
+ (0, vitest_1.expect)(proof1.meta.responseHash).toBe(proof2.meta.responseHash);
47
+ });
48
+ (0, vitest_1.it)("should generate different hashes for different requests", async () => {
49
+ const request1 = {
50
+ method: "test-tool",
51
+ params: { input: "hello" },
52
+ };
53
+ const request2 = {
54
+ method: "test-tool",
55
+ params: { input: "goodbye" },
56
+ };
57
+ const response = {
58
+ data: { output: "world" },
59
+ };
60
+ const proof1 = await proofGenerator.generateProof(request1, response, mockSession);
61
+ const proof2 = await proofGenerator.generateProof(request2, response, mockSession);
62
+ (0, vitest_1.expect)(proof1.meta.requestHash).not.toBe(proof2.meta.requestHash);
63
+ (0, vitest_1.expect)(proof1.meta.responseHash).toBe(proof2.meta.responseHash); // Same response
64
+ });
65
+ (0, vitest_1.it)("should generate different hashes for different responses", async () => {
66
+ const request = {
67
+ method: "test-tool",
68
+ params: { input: "hello" },
69
+ };
70
+ const response1 = {
71
+ data: { output: "world" },
72
+ };
73
+ const response2 = {
74
+ data: { output: "universe" },
75
+ };
76
+ const proof1 = await proofGenerator.generateProof(request, response1, mockSession);
77
+ const proof2 = await proofGenerator.generateProof(request, response2, mockSession);
78
+ (0, vitest_1.expect)(proof1.meta.requestHash).toBe(proof2.meta.requestHash); // Same request
79
+ (0, vitest_1.expect)(proof1.meta.responseHash).not.toBe(proof2.meta.responseHash);
80
+ });
81
+ (0, vitest_1.it)("should generate SHA-256 hashes with correct format", async () => {
82
+ const request = {
83
+ method: "test-tool",
84
+ params: { input: "hello" },
85
+ };
86
+ const response = {
87
+ data: { output: "world" },
88
+ };
89
+ const proof = await proofGenerator.generateProof(request, response, mockSession);
90
+ (0, vitest_1.expect)(proof.meta.requestHash).toMatch(/^sha256:[a-f0-9]{64}$/);
91
+ (0, vitest_1.expect)(proof.meta.responseHash).toMatch(/^sha256:[a-f0-9]{64}$/);
92
+ });
93
+ (0, vitest_1.it)("should handle requests without params", async () => {
94
+ const request = {
95
+ method: "simple-tool",
96
+ };
97
+ const response = {
98
+ data: { result: "success" },
99
+ };
100
+ const proof = await proofGenerator.generateProof(request, response, mockSession);
101
+ (0, vitest_1.expect)(proof.meta.requestHash).toMatch(/^sha256:[a-f0-9]{64}$/);
102
+ (0, vitest_1.expect)(proof.meta.responseHash).toMatch(/^sha256:[a-f0-9]{64}$/);
103
+ });
104
+ });
105
+ (0, vitest_1.describe)("Proof Metadata", () => {
106
+ (0, vitest_1.it)("should include all required metadata fields", async () => {
107
+ const request = {
108
+ method: "test-tool",
109
+ params: { input: "hello" },
110
+ };
111
+ const response = {
112
+ data: { output: "world" },
113
+ };
114
+ const proof = await proofGenerator.generateProof(request, response, mockSession);
115
+ (0, vitest_1.expect)(proof.meta.did).toBe(mockIdentity.did);
116
+ (0, vitest_1.expect)(proof.meta.kid).toBe(mockIdentity.keyId);
117
+ (0, vitest_1.expect)(proof.meta.ts).toBeTypeOf("number");
118
+ (0, vitest_1.expect)(proof.meta.nonce).toBe(mockSession.nonce);
119
+ (0, vitest_1.expect)(proof.meta.audience).toBe(mockSession.audience);
120
+ (0, vitest_1.expect)(proof.meta.sessionId).toBe(mockSession.sessionId);
121
+ (0, vitest_1.expect)(proof.meta.requestHash).toBeTruthy();
122
+ (0, vitest_1.expect)(proof.meta.responseHash).toBeTruthy();
123
+ });
124
+ (0, vitest_1.it)("should include optional fields when provided", async () => {
125
+ const request = {
126
+ method: "test-tool",
127
+ params: { input: "hello" },
128
+ };
129
+ const response = {
130
+ data: { output: "world" },
131
+ };
132
+ const options = {
133
+ scopeId: "orders.create",
134
+ delegationRef: "delegation-ref-123",
135
+ };
136
+ const proof = await proofGenerator.generateProof(request, response, mockSession, options);
137
+ (0, vitest_1.expect)(proof.meta.scopeId).toBe("orders.create");
138
+ (0, vitest_1.expect)(proof.meta.delegationRef).toBe("delegation-ref-123");
139
+ });
140
+ (0, vitest_1.it)("should bind request and response hashes to same session", async () => {
141
+ const request = {
142
+ method: "test-tool",
143
+ params: { input: "hello" },
144
+ };
145
+ const response = {
146
+ data: { output: "world" },
147
+ };
148
+ const proof = await proofGenerator.generateProof(request, response, mockSession);
149
+ // Both hashes should be bound to the same session and audience
150
+ (0, vitest_1.expect)(proof.meta.sessionId).toBe(mockSession.sessionId);
151
+ (0, vitest_1.expect)(proof.meta.audience).toBe(mockSession.audience);
152
+ (0, vitest_1.expect)(proof.meta.nonce).toBe(mockSession.nonce);
153
+ });
154
+ });
155
+ (0, vitest_1.describe)("Detached JWS Generation", () => {
156
+ (0, vitest_1.it)("should generate detached JWS in correct format", async () => {
157
+ const request = {
158
+ method: "test-tool",
159
+ params: { input: "hello" },
160
+ };
161
+ const response = {
162
+ data: { output: "world" },
163
+ };
164
+ const proof = await proofGenerator.generateProof(request, response, mockSession);
165
+ // Detached JWS should have format: header..signature (empty payload)
166
+ const jwsParts = proof.jws.split(".");
167
+ (0, vitest_1.expect)(jwsParts).toHaveLength(3);
168
+ (0, vitest_1.expect)(jwsParts[1]).toBe(""); // Empty payload for detached format
169
+ (0, vitest_1.expect)(jwsParts[0]).toBeTruthy(); // Header should exist
170
+ (0, vitest_1.expect)(jwsParts[2]).toBeTruthy(); // Signature should exist
171
+ });
172
+ (0, vitest_1.it)("should use EdDSA algorithm", async () => {
173
+ const request = {
174
+ method: "test-tool",
175
+ params: { input: "hello" },
176
+ };
177
+ const response = {
178
+ data: { output: "world" },
179
+ };
180
+ const proof = await proofGenerator.generateProof(request, response, mockSession);
181
+ // Decode header to check algorithm
182
+ const [headerB64] = proof.jws.split(".");
183
+ const header = JSON.parse(Buffer.from(headerB64, "base64url").toString());
184
+ (0, vitest_1.expect)(header.alg).toBe("EdDSA");
185
+ (0, vitest_1.expect)(header.kid).toBe(mockIdentity.keyId);
186
+ });
187
+ });
188
+ (0, vitest_1.describe)("Proof Verification", () => {
189
+ (0, vitest_1.it)("should verify valid proof structure", async () => {
190
+ const request = {
191
+ method: "test-tool",
192
+ params: { input: "hello" },
193
+ };
194
+ const response = {
195
+ data: { output: "world" },
196
+ };
197
+ const proof = await proofGenerator.generateProof(request, response, mockSession);
198
+ const isValid = await proofGenerator.verifyProof(proof, request, response);
199
+ (0, vitest_1.expect)(isValid).toBe(true);
200
+ });
201
+ (0, vitest_1.it)("should reject proof with mismatched request", async () => {
202
+ const request1 = {
203
+ method: "test-tool",
204
+ params: { input: "hello" },
205
+ };
206
+ const request2 = {
207
+ method: "test-tool",
208
+ params: { input: "goodbye" },
209
+ };
210
+ const response = {
211
+ data: { output: "world" },
212
+ };
213
+ const proof = await proofGenerator.generateProof(request1, response, mockSession);
214
+ const isValid = await proofGenerator.verifyProof(proof, request2, response);
215
+ (0, vitest_1.expect)(isValid).toBe(false);
216
+ });
217
+ (0, vitest_1.it)("should reject proof with mismatched response", async () => {
218
+ const request = {
219
+ method: "test-tool",
220
+ params: { input: "hello" },
221
+ };
222
+ const response1 = {
223
+ data: { output: "world" },
224
+ };
225
+ const response2 = {
226
+ data: { output: "universe" },
227
+ };
228
+ const proof = await proofGenerator.generateProof(request, response1, mockSession);
229
+ const isValid = await proofGenerator.verifyProof(proof, request, response2);
230
+ (0, vitest_1.expect)(isValid).toBe(false);
231
+ });
232
+ });
233
+ (0, vitest_1.describe)("JSON Canonicalization", () => {
234
+ (0, vitest_1.it)("should canonicalize objects with sorted keys", () => {
235
+ const canonical = (0, proof_js_1.extractCanonicalData)({ method: "test", params: { b: 2, a: 1 } }, { data: { z: 26, a: 1 } });
236
+ // Keys should be sorted in canonical form
237
+ (0, vitest_1.expect)(canonical.request).toEqual({
238
+ method: "test",
239
+ params: { b: 2, a: 1 },
240
+ });
241
+ (0, vitest_1.expect)(canonical.response).toEqual({ z: 26, a: 1 });
242
+ });
243
+ (0, vitest_1.it)("should handle nested objects and arrays", () => {
244
+ const canonical = (0, proof_js_1.extractCanonicalData)({
245
+ method: "complex-tool",
246
+ params: {
247
+ nested: { c: 3, a: 1 },
248
+ array: [3, 1, 2],
249
+ },
250
+ }, { data: { result: [{ b: 2, a: 1 }] } });
251
+ (0, vitest_1.expect)(canonical.request.params.nested).toEqual({ c: 3, a: 1 });
252
+ (0, vitest_1.expect)(canonical.request.params.array).toEqual([3, 1, 2]);
253
+ (0, vitest_1.expect)(canonical.response.result).toEqual([{ b: 2, a: 1 }]);
254
+ });
255
+ });
256
+ });
257
+ (0, vitest_1.describe)("Utility Functions", () => {
258
+ let mockIdentity;
259
+ let mockSession;
260
+ (0, vitest_1.beforeEach)(() => {
261
+ mockIdentity = {
262
+ did: "did:web:example.com:agents:test-agent",
263
+ keyId: "key-test-123",
264
+ privateKey: Buffer.from("test-private-key-32-bytes-long!!").toString("base64"),
265
+ publicKey: Buffer.from("test-public-key-32-bytes-long!!!").toString("base64"),
266
+ createdAt: new Date().toISOString(),
267
+ };
268
+ mockSession = {
269
+ sessionId: "sess_test_123",
270
+ audience: "example.com",
271
+ nonce: "test-nonce-456",
272
+ timestamp: Math.floor(Date.now() / 1000),
273
+ createdAt: Math.floor(Date.now() / 1000),
274
+ lastActivity: Math.floor(Date.now() / 1000),
275
+ ttlMinutes: 30,
276
+ };
277
+ });
278
+ (0, vitest_1.describe)("createProofResponse", () => {
279
+ (0, vitest_1.it)("should create response with proof metadata", async () => {
280
+ const request = {
281
+ method: "test-tool",
282
+ params: { input: "hello" },
283
+ };
284
+ const data = { output: "world" };
285
+ const response = await (0, proof_js_1.createProofResponse)(request, data, mockIdentity, mockSession);
286
+ (0, vitest_1.expect)(response.data).toEqual(data);
287
+ (0, vitest_1.expect)(response.meta?.proof).toBeDefined();
288
+ (0, vitest_1.expect)(response.meta?.proof?.meta.did).toBe(mockIdentity.did);
289
+ (0, vitest_1.expect)(response.meta?.proof?.jws).toBeTruthy();
290
+ });
291
+ (0, vitest_1.it)("should include optional proof options", async () => {
292
+ const request = {
293
+ method: "test-tool",
294
+ params: { input: "hello" },
295
+ };
296
+ const data = { output: "world" };
297
+ const options = { scopeId: "orders.create" };
298
+ const response = await (0, proof_js_1.createProofResponse)(request, data, mockIdentity, mockSession, options);
299
+ (0, vitest_1.expect)(response.meta?.proof?.meta.scopeId).toBe("orders.create");
300
+ });
301
+ });
302
+ });
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Tests for Session Management System
3
+ */
4
+ export {};
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for Session Management System
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const vitest_1 = require("vitest");
7
+ const session_js_1 = require("../session.js");
8
+ const memory_nonce_cache_js_1 = require("../../cache/memory-nonce-cache.js");
9
+ (0, vitest_1.describe)("SessionManager", () => {
10
+ let sessionManager;
11
+ let mockNonceCache;
12
+ (0, vitest_1.beforeEach)(() => {
13
+ mockNonceCache = new memory_nonce_cache_js_1.MemoryNonceCache();
14
+ sessionManager = new session_js_1.SessionManager({
15
+ timestampSkewSeconds: 120,
16
+ sessionTtlMinutes: 30,
17
+ nonceCache: mockNonceCache,
18
+ });
19
+ // Mock console.warn to avoid noise in tests
20
+ vitest_1.vi.spyOn(console, "warn").mockImplementation(() => { });
21
+ });
22
+ (0, vitest_1.afterEach)(() => {
23
+ mockNonceCache.destroy();
24
+ vitest_1.vi.restoreAllMocks();
25
+ });
26
+ (0, vitest_1.describe)("Handshake Validation", () => {
27
+ (0, vitest_1.it)("should accept valid handshake", async () => {
28
+ const request = {
29
+ nonce: "test-nonce-123",
30
+ audience: "example.com",
31
+ timestamp: Math.floor(Date.now() / 1000),
32
+ };
33
+ const result = await sessionManager.validateHandshake(request);
34
+ (0, vitest_1.expect)(result.success).toBe(true);
35
+ (0, vitest_1.expect)(result.session).toBeDefined();
36
+ (0, vitest_1.expect)(result.session.audience).toBe("example.com");
37
+ (0, vitest_1.expect)(result.session.nonce).toBe("test-nonce-123");
38
+ (0, vitest_1.expect)(result.session.sessionId).toMatch(/^sess_/);
39
+ });
40
+ (0, vitest_1.it)("should reject handshake with timestamp too old", async () => {
41
+ const request = {
42
+ nonce: "test-nonce-old",
43
+ audience: "example.com",
44
+ timestamp: Math.floor(Date.now() / 1000) - 200, // 200 seconds ago
45
+ };
46
+ const result = await sessionManager.validateHandshake(request);
47
+ (0, vitest_1.expect)(result.success).toBe(false);
48
+ (0, vitest_1.expect)(result.error?.code).toBe("XMCP_I_EHANDSHAKE");
49
+ (0, vitest_1.expect)(result.error?.message).toContain("Timestamp outside acceptable range");
50
+ (0, vitest_1.expect)(result.error?.remediation).toContain("Check NTP sync");
51
+ });
52
+ (0, vitest_1.it)("should reject handshake with timestamp too far in future", async () => {
53
+ const request = {
54
+ nonce: "test-nonce-future",
55
+ audience: "example.com",
56
+ timestamp: Math.floor(Date.now() / 1000) + 200, // 200 seconds in future
57
+ };
58
+ const result = await sessionManager.validateHandshake(request);
59
+ (0, vitest_1.expect)(result.success).toBe(false);
60
+ (0, vitest_1.expect)(result.error?.code).toBe("XMCP_I_EHANDSHAKE");
61
+ (0, vitest_1.expect)(result.error?.message).toContain("Timestamp outside acceptable range");
62
+ });
63
+ (0, vitest_1.it)("should reject duplicate nonce (replay attack)", async () => {
64
+ const request = {
65
+ nonce: "duplicate-nonce",
66
+ audience: "example.com",
67
+ timestamp: Math.floor(Date.now() / 1000),
68
+ };
69
+ // First request should succeed
70
+ const result1 = await sessionManager.validateHandshake(request);
71
+ (0, vitest_1.expect)(result1.success).toBe(true);
72
+ // Second request with same nonce should fail
73
+ const result2 = await sessionManager.validateHandshake(request);
74
+ (0, vitest_1.expect)(result2.success).toBe(false);
75
+ (0, vitest_1.expect)(result2.error?.code).toBe("XMCP_I_EHANDSHAKE");
76
+ (0, vitest_1.expect)(result2.error?.message).toContain("Nonce already used");
77
+ });
78
+ (0, vitest_1.it)("should respect custom timestamp skew configuration", async () => {
79
+ const customManager = new session_js_1.SessionManager({
80
+ timestampSkewSeconds: 60, // 1 minute
81
+ nonceCache: mockNonceCache,
82
+ });
83
+ const request = {
84
+ nonce: "test-nonce-skew",
85
+ audience: "example.com",
86
+ timestamp: Math.floor(Date.now() / 1000) - 90, // 90 seconds ago
87
+ };
88
+ const result = await customManager.validateHandshake(request);
89
+ (0, vitest_1.expect)(result.success).toBe(false);
90
+ (0, vitest_1.expect)(result.error?.message).toContain("±60s");
91
+ });
92
+ });
93
+ (0, vitest_1.describe)("Session Management", () => {
94
+ (0, vitest_1.it)("should retrieve active session", async () => {
95
+ const request = {
96
+ nonce: "session-test-nonce",
97
+ audience: "example.com",
98
+ timestamp: Math.floor(Date.now() / 1000),
99
+ };
100
+ const handshakeResult = await sessionManager.validateHandshake(request);
101
+ (0, vitest_1.expect)(handshakeResult.success).toBe(true);
102
+ const sessionId = handshakeResult.session.sessionId;
103
+ const retrievedSession = await sessionManager.getSession(sessionId);
104
+ (0, vitest_1.expect)(retrievedSession).toBeDefined();
105
+ (0, vitest_1.expect)(retrievedSession.sessionId).toBe(sessionId);
106
+ (0, vitest_1.expect)(retrievedSession.audience).toBe("example.com");
107
+ });
108
+ (0, vitest_1.it)("should return null for non-existent session", async () => {
109
+ const session = await sessionManager.getSession("non-existent-session");
110
+ (0, vitest_1.expect)(session).toBeNull();
111
+ });
112
+ (0, vitest_1.it)("should expire session after idle timeout", async () => {
113
+ const shortTtlManager = new session_js_1.SessionManager({
114
+ sessionTtlMinutes: 0.01, // 0.6 seconds
115
+ nonceCache: mockNonceCache,
116
+ });
117
+ const request = {
118
+ nonce: "expire-test-nonce",
119
+ audience: "example.com",
120
+ timestamp: Math.floor(Date.now() / 1000),
121
+ };
122
+ const handshakeResult = await shortTtlManager.validateHandshake(request);
123
+ const sessionId = handshakeResult.session.sessionId;
124
+ // Session should exist initially
125
+ let session = await shortTtlManager.getSession(sessionId);
126
+ (0, vitest_1.expect)(session).toBeDefined();
127
+ // Wait for expiration
128
+ await new Promise((resolve) => setTimeout(resolve, 1000));
129
+ // Session should be expired
130
+ session = await shortTtlManager.getSession(sessionId);
131
+ (0, vitest_1.expect)(session).toBeNull();
132
+ });
133
+ (0, vitest_1.it)("should update last activity on session access", async () => {
134
+ const request = {
135
+ nonce: "activity-test-nonce",
136
+ audience: "example.com",
137
+ timestamp: Math.floor(Date.now() / 1000),
138
+ };
139
+ const handshakeResult = await sessionManager.validateHandshake(request);
140
+ const sessionId = handshakeResult.session.sessionId;
141
+ const initialActivity = handshakeResult.session.lastActivity;
142
+ // Wait a bit to ensure time difference
143
+ await new Promise((resolve) => setTimeout(resolve, 1100));
144
+ // Access session
145
+ const session = await sessionManager.getSession(sessionId);
146
+ (0, vitest_1.expect)(session.lastActivity).toBeGreaterThan(initialActivity);
147
+ });
148
+ (0, vitest_1.it)("should respect absolute session lifetime when configured", async () => {
149
+ const absoluteLifetimeManager = new session_js_1.SessionManager({
150
+ sessionTtlMinutes: 60, // 1 hour idle
151
+ absoluteSessionLifetime: 0.01, // 0.6 seconds absolute
152
+ nonceCache: mockNonceCache,
153
+ });
154
+ const request = {
155
+ nonce: "absolute-test-nonce",
156
+ audience: "example.com",
157
+ timestamp: Math.floor(Date.now() / 1000),
158
+ };
159
+ const handshakeResult = await absoluteLifetimeManager.validateHandshake(request);
160
+ const sessionId = handshakeResult.session.sessionId;
161
+ // Wait for absolute expiration
162
+ await new Promise((resolve) => setTimeout(resolve, 1000));
163
+ // Session should be expired due to absolute lifetime
164
+ const session = await absoluteLifetimeManager.getSession(sessionId);
165
+ (0, vitest_1.expect)(session).toBeNull();
166
+ });
167
+ });
168
+ (0, vitest_1.describe)("Cleanup", () => {
169
+ (0, vitest_1.it)("should clean up expired sessions", async () => {
170
+ const shortTtlManager = new session_js_1.SessionManager({
171
+ sessionTtlMinutes: 0.01, // 0.6 seconds
172
+ nonceCache: mockNonceCache,
173
+ });
174
+ const request = {
175
+ nonce: "cleanup-test-nonce",
176
+ audience: "example.com",
177
+ timestamp: Math.floor(Date.now() / 1000),
178
+ };
179
+ await shortTtlManager.validateHandshake(request);
180
+ // Should have 1 active session
181
+ (0, vitest_1.expect)(shortTtlManager.getStats().activeSessions).toBe(1);
182
+ // Wait for expiration
183
+ await new Promise((resolve) => setTimeout(resolve, 1000));
184
+ // Cleanup
185
+ await shortTtlManager.cleanup();
186
+ // Should have 0 active sessions
187
+ (0, vitest_1.expect)(shortTtlManager.getStats().activeSessions).toBe(0);
188
+ });
189
+ });
190
+ (0, vitest_1.describe)("Statistics", () => {
191
+ (0, vitest_1.it)("should provide session statistics", async () => {
192
+ const stats = sessionManager.getStats();
193
+ (0, vitest_1.expect)(stats).toHaveProperty("activeSessions");
194
+ (0, vitest_1.expect)(stats).toHaveProperty("config");
195
+ (0, vitest_1.expect)(stats.config.timestampSkewSeconds).toBe(120);
196
+ (0, vitest_1.expect)(stats.config.sessionTtlMinutes).toBe(30);
197
+ (0, vitest_1.expect)(stats.config.cacheType).toBe("MemoryNonceCache");
198
+ });
199
+ });
200
+ (0, vitest_1.describe)("Environment Configuration", () => {
201
+ (0, vitest_1.it)("should read configuration from environment variables", () => {
202
+ // Mock environment variables
203
+ const originalEnv = process.env;
204
+ process.env.XMCP_I_TS_SKEW_SEC = "60";
205
+ process.env.XMCP_I_SESSION_TTL_MIN = "15";
206
+ const envManager = new session_js_1.SessionManager();
207
+ const stats = envManager.getStats();
208
+ (0, vitest_1.expect)(stats.config.timestampSkewSeconds).toBe(60);
209
+ (0, vitest_1.expect)(stats.config.sessionTtlMinutes).toBe(15);
210
+ // Restore environment
211
+ process.env = originalEnv;
212
+ });
213
+ });
214
+ });
215
+ (0, vitest_1.describe)("Utility Functions", () => {
216
+ (0, vitest_1.describe)("createHandshakeRequest", () => {
217
+ (0, vitest_1.it)("should create valid handshake request", () => {
218
+ const request = (0, session_js_1.createHandshakeRequest)("example.com");
219
+ (0, vitest_1.expect)(request.audience).toBe("example.com");
220
+ (0, vitest_1.expect)(request.nonce).toBeTruthy();
221
+ (0, vitest_1.expect)(request.timestamp).toBeCloseTo(Math.floor(Date.now() / 1000), 1);
222
+ });
223
+ (0, vitest_1.it)("should generate unique nonces", () => {
224
+ const request1 = (0, session_js_1.createHandshakeRequest)("example.com");
225
+ const request2 = (0, session_js_1.createHandshakeRequest)("example.com");
226
+ (0, vitest_1.expect)(request1.nonce).not.toBe(request2.nonce);
227
+ });
228
+ });
229
+ (0, vitest_1.describe)("validateHandshakeFormat", () => {
230
+ (0, vitest_1.it)("should validate correct handshake format", () => {
231
+ const validRequest = {
232
+ nonce: "test-nonce",
233
+ audience: "example.com",
234
+ timestamp: Math.floor(Date.now() / 1000),
235
+ };
236
+ (0, vitest_1.expect)((0, session_js_1.validateHandshakeFormat)(validRequest)).toBe(true);
237
+ });
238
+ (0, vitest_1.it)("should reject invalid handshake formats", () => {
239
+ const invalidRequests = [
240
+ null,
241
+ undefined,
242
+ {},
243
+ { nonce: "", audience: "example.com", timestamp: 123 },
244
+ { nonce: "test", audience: "", timestamp: 123 },
245
+ { nonce: "test", audience: "example.com", timestamp: "invalid" },
246
+ { nonce: "test", audience: "example.com", timestamp: -1 },
247
+ { nonce: "test", audience: "example.com", timestamp: 123.45 },
248
+ ];
249
+ for (const invalid of invalidRequests) {
250
+ (0, vitest_1.expect)((0, session_js_1.validateHandshakeFormat)(invalid)).toBe(false);
251
+ }
252
+ });
253
+ });
254
+ });
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Tests for Well-Known Endpoints
3
+ */
4
+ export {};