retestkit 1.4.1 → 1.5.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 (238) hide show
  1. package/README.md +59 -40
  2. package/dist/config.js +8 -8
  3. package/dist/config.js.map +1 -1
  4. package/dist/logger.js +1 -1
  5. package/dist/logger.js.map +1 -1
  6. package/dist/prompts/index.d.ts +1 -1
  7. package/dist/prompts/index.d.ts.map +1 -1
  8. package/dist/prompts/index.js +21 -21
  9. package/dist/prompts/index.js.map +1 -1
  10. package/dist/prompts/templates/mcp/retest-crawl.md +7 -0
  11. package/{src/prompts/templates/mcp/webtest-discover-flows.md → dist/prompts/templates/mcp/retest-discover-flows.md} +1 -1
  12. package/{src/prompts/templates/mcp/webtest-discover.md → dist/prompts/templates/mcp/retest-discover.md} +2 -2
  13. package/dist/prompts/templates/mcp/retest-full-workflow.md +12 -0
  14. package/{src/prompts/templates/mcp/webtest-generate-tests.md → dist/prompts/templates/mcp/retest-generate-tests.md} +1 -1
  15. package/{src/prompts/templates/mcp/webtest-run-test.md → dist/prompts/templates/mcp/retest-run-test.md} +1 -1
  16. package/{src/prompts/templates/mcp/webtest-start.md → dist/prompts/templates/mcp/retest-start.md} +1 -1
  17. package/{src → dist}/prompts/templates/sampling/system-prefix.md +1 -1
  18. package/dist/resources/index.js +7 -7
  19. package/dist/resources/index.js.map +1 -1
  20. package/dist/schemas/config.js +2 -2
  21. package/dist/schemas/config.js.map +1 -1
  22. package/dist/security/index.js +1 -1
  23. package/dist/security/index.js.map +1 -1
  24. package/dist/server.js +3 -3
  25. package/dist/server.js.map +1 -1
  26. package/dist/test-utils/mock-context.js +22 -22
  27. package/dist/test-utils/mock-context.js.map +1 -1
  28. package/dist/tools/index.d.ts +1 -1
  29. package/dist/tools/index.d.ts.map +1 -1
  30. package/dist/tools/index.js +5 -5
  31. package/dist/tools/index.js.map +1 -1
  32. package/dist/tools/retest/crawl.d.ts.map +1 -0
  33. package/dist/tools/{webtest → retest}/crawl.js +7 -7
  34. package/dist/tools/retest/crawl.js.map +1 -0
  35. package/dist/tools/retest/discover-features.d.ts.map +1 -0
  36. package/dist/tools/{webtest → retest}/discover-features.js +6 -6
  37. package/dist/tools/retest/discover-features.js.map +1 -0
  38. package/dist/tools/retest/discover-flows.d.ts.map +1 -0
  39. package/dist/tools/{webtest → retest}/discover-flows.js +6 -6
  40. package/dist/tools/retest/discover-flows.js.map +1 -0
  41. package/dist/tools/retest/generate-tests.d.ts.map +1 -0
  42. package/dist/tools/{webtest → retest}/generate-tests.js +5 -5
  43. package/dist/tools/retest/generate-tests.js.map +1 -0
  44. package/dist/tools/retest/index.d.ts.map +1 -0
  45. package/dist/tools/retest/index.js.map +1 -0
  46. package/dist/tools/retest/run-test-case.d.ts.map +1 -0
  47. package/dist/tools/{webtest → retest}/run-test-case.js +3 -3
  48. package/dist/tools/retest/run-test-case.js.map +1 -0
  49. package/dist/tools/retest/schemas.d.ts.map +1 -0
  50. package/dist/tools/retest/schemas.js.map +1 -0
  51. package/dist/tools/retest/start-analysis.d.ts.map +1 -0
  52. package/dist/tools/{webtest → retest}/start-analysis.js +5 -5
  53. package/dist/tools/retest/start-analysis.js.map +1 -0
  54. package/dist/workspace/index.js +8 -8
  55. package/dist/workspace/index.js.map +1 -1
  56. package/dist/workspace/types.d.ts +2 -2
  57. package/dist/workspace/types.d.ts.map +1 -1
  58. package/package.json +6 -2
  59. package/.claude/commands/openspec/apply.md +0 -23
  60. package/.claude/commands/openspec/archive.md +0 -27
  61. package/.claude/commands/openspec/proposal.md +0 -28
  62. package/.gemini/commands/openspec/apply.toml +0 -21
  63. package/.gemini/commands/openspec/archive.toml +0 -25
  64. package/.gemini/commands/openspec/proposal.toml +0 -26
  65. package/.github/prompts/openspec-apply.prompt.md +0 -22
  66. package/.github/prompts/openspec-archive.prompt.md +0 -26
  67. package/.github/prompts/openspec-proposal.prompt.md +0 -27
  68. package/.github/workflows/release.yml +0 -33
  69. package/.kilocode/workflows/openspec-apply.md +0 -17
  70. package/.kilocode/workflows/openspec-archive.md +0 -21
  71. package/.kilocode/workflows/openspec-proposal.md +0 -22
  72. package/.mcp.json +0 -23
  73. package/.opencode/command/openspec-apply.md +0 -25
  74. package/.opencode/command/openspec-archive.md +0 -28
  75. package/.opencode/command/openspec-proposal.md +0 -30
  76. package/.roo/commands/openspec-apply.md +0 -20
  77. package/.roo/commands/openspec-archive.md +0 -24
  78. package/.roo/commands/openspec-proposal.md +0 -25
  79. package/.vscode/mcp.json +0 -23
  80. package/AGENTS.md +0 -18
  81. package/CLAUDE.md +0 -18
  82. package/dist/tools/webtest/crawl.d.ts.map +0 -1
  83. package/dist/tools/webtest/crawl.js.map +0 -1
  84. package/dist/tools/webtest/discover-features.d.ts.map +0 -1
  85. package/dist/tools/webtest/discover-features.js.map +0 -1
  86. package/dist/tools/webtest/discover-flows.d.ts.map +0 -1
  87. package/dist/tools/webtest/discover-flows.js.map +0 -1
  88. package/dist/tools/webtest/generate-tests.d.ts.map +0 -1
  89. package/dist/tools/webtest/generate-tests.js.map +0 -1
  90. package/dist/tools/webtest/index.d.ts.map +0 -1
  91. package/dist/tools/webtest/index.js.map +0 -1
  92. package/dist/tools/webtest/run-test-case.d.ts.map +0 -1
  93. package/dist/tools/webtest/run-test-case.js.map +0 -1
  94. package/dist/tools/webtest/schemas.d.ts.map +0 -1
  95. package/dist/tools/webtest/schemas.js.map +0 -1
  96. package/dist/tools/webtest/start-analysis.d.ts.map +0 -1
  97. package/dist/tools/webtest/start-analysis.js.map +0 -1
  98. package/openspec/AGENTS.md +0 -456
  99. package/openspec/changes/archive/2025-12-18-add-hybrid-artifact-paths/proposal.md +0 -33
  100. package/openspec/changes/archive/2025-12-18-add-hybrid-artifact-paths/specs/webtest-resources/spec.md +0 -27
  101. package/openspec/changes/archive/2025-12-18-add-hybrid-artifact-paths/specs/webtest-tools/spec.md +0 -304
  102. package/openspec/changes/archive/2025-12-18-add-hybrid-artifact-paths/tasks.md +0 -43
  103. package/openspec/changes/archive/2025-12-18-add-mcp-server-foundation/design.md +0 -209
  104. package/openspec/changes/archive/2025-12-18-add-mcp-server-foundation/proposal.md +0 -41
  105. package/openspec/changes/archive/2025-12-18-add-mcp-server-foundation/specs/mcp-server-core/spec.md +0 -183
  106. package/openspec/changes/archive/2025-12-18-add-mcp-server-foundation/tasks.md +0 -112
  107. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/design.md +0 -333
  108. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/proposal.md +0 -66
  109. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/mcp-server-core/spec.md +0 -129
  110. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/webtest-lifecycle/spec.md +0 -138
  111. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/webtest-logging/spec.md +0 -211
  112. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/webtest-prompts/spec.md +0 -157
  113. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/webtest-resources/spec.md +0 -213
  114. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/webtest-sampling/spec.md +0 -257
  115. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/webtest-tools/spec.md +0 -501
  116. package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/tasks.md +0 -264
  117. package/openspec/changes/archive/2025-12-18-allow-analysis-of-incomplete-crawls/proposal.md +0 -24
  118. package/openspec/changes/archive/2025-12-18-allow-analysis-of-incomplete-crawls/specs/webtest-tools/spec.md +0 -80
  119. package/openspec/changes/archive/2025-12-18-allow-analysis-of-incomplete-crawls/tasks.md +0 -8
  120. package/openspec/changes/archive/2025-12-18-fix-crawl-loop-stability/design.md +0 -90
  121. package/openspec/changes/archive/2025-12-18-fix-crawl-loop-stability/proposal.md +0 -28
  122. package/openspec/changes/archive/2025-12-18-fix-crawl-loop-stability/specs/webtest-sampling/spec.md +0 -90
  123. package/openspec/changes/archive/2025-12-18-fix-crawl-loop-stability/tasks.md +0 -33
  124. package/openspec/changes/archive/2025-12-18-use-markdown-artifacts/design.md +0 -558
  125. package/openspec/changes/archive/2025-12-18-use-markdown-artifacts/proposal.md +0 -119
  126. package/openspec/changes/archive/2025-12-18-use-markdown-artifacts/specs/webtest-resources/spec.md +0 -109
  127. package/openspec/changes/archive/2025-12-18-use-markdown-artifacts/specs/webtest-tools/spec.md +0 -121
  128. package/openspec/changes/archive/2025-12-18-use-markdown-artifacts/tasks.md +0 -133
  129. package/openspec/changes/extract-prompts-to-markdown/design.md +0 -86
  130. package/openspec/changes/extract-prompts-to-markdown/proposal.md +0 -50
  131. package/openspec/changes/extract-prompts-to-markdown/specs/webtest-prompts/spec.md +0 -74
  132. package/openspec/changes/extract-prompts-to-markdown/tasks.md +0 -40
  133. package/openspec/changes/refactor-webtest-naming/design.md +0 -95
  134. package/openspec/changes/refactor-webtest-naming/proposal.md +0 -66
  135. package/openspec/changes/refactor-webtest-naming/specs/webtest-prompts/spec.md +0 -79
  136. package/openspec/changes/refactor-webtest-naming/specs/webtest-resources/spec.md +0 -80
  137. package/openspec/changes/refactor-webtest-naming/specs/webtest-sampling/spec.md +0 -122
  138. package/openspec/changes/refactor-webtest-naming/specs/webtest-tools/spec.md +0 -113
  139. package/openspec/changes/refactor-webtest-naming/tasks.md +0 -119
  140. package/openspec/changes/rename-package-to-retest/proposal.md +0 -52
  141. package/openspec/changes/rename-package-to-retest/specs/mcp-server-core/spec.md +0 -53
  142. package/openspec/changes/rename-package-to-retest/specs/retest-lifecycle/spec.md +0 -68
  143. package/openspec/changes/rename-package-to-retest/specs/retest-logging/spec.md +0 -35
  144. package/openspec/changes/rename-package-to-retest/specs/retest-prompts/spec.md +0 -159
  145. package/openspec/changes/rename-package-to-retest/specs/retest-resources/spec.md +0 -251
  146. package/openspec/changes/rename-package-to-retest/specs/retest-sampling/spec.md +0 -99
  147. package/openspec/changes/rename-package-to-retest/specs/retest-tools/spec.md +0 -295
  148. package/openspec/changes/rename-package-to-retest/tasks.md +0 -71
  149. package/openspec/project.md +0 -31
  150. package/openspec/specs/mcp-server-core/spec.md +0 -178
  151. package/openspec/specs/webtest-lifecycle/spec.md +0 -136
  152. package/openspec/specs/webtest-logging/spec.md +0 -209
  153. package/openspec/specs/webtest-prompts/spec.md +0 -155
  154. package/openspec/specs/webtest-resources/spec.md +0 -248
  155. package/openspec/specs/webtest-sampling/spec.md +0 -344
  156. package/openspec/specs/webtest-tools/spec.md +0 -282
  157. package/release.config.js +0 -9
  158. package/src/config.test.ts +0 -96
  159. package/src/config.ts +0 -32
  160. package/src/elicitation/index.test.ts +0 -399
  161. package/src/elicitation/index.ts +0 -171
  162. package/src/elicitation/types.ts +0 -68
  163. package/src/index.ts +0 -83
  164. package/src/lifecycle/index.test.ts +0 -260
  165. package/src/lifecycle/index.ts +0 -101
  166. package/src/logger.redaction.test.ts +0 -322
  167. package/src/logger.test.ts +0 -123
  168. package/src/logger.ts +0 -229
  169. package/src/playwright-client/index.ts +0 -392
  170. package/src/playwright-client/types.ts +0 -99
  171. package/src/progress/index.test.ts +0 -327
  172. package/src/progress/index.ts +0 -170
  173. package/src/progress/types.ts +0 -25
  174. package/src/prompts/index.test.ts +0 -451
  175. package/src/prompts/index.ts +0 -246
  176. package/src/prompts/loader.test.ts +0 -100
  177. package/src/prompts/loader.ts +0 -59
  178. package/src/prompts/templates/mcp/webtest-crawl.md +0 -7
  179. package/src/prompts/templates/mcp/webtest-full-workflow.md +0 -12
  180. package/src/resources/index.ts +0 -250
  181. package/src/resources/subscriptions.ts +0 -37
  182. package/src/sampling/index.test.ts +0 -414
  183. package/src/sampling/index.ts +0 -286
  184. package/src/sampling/prompts.ts +0 -194
  185. package/src/sampling/types.ts +0 -60
  186. package/src/schemas/config.ts +0 -39
  187. package/src/security/index.test.ts +0 -441
  188. package/src/security/index.ts +0 -361
  189. package/src/security/security-scenarios.test.ts +0 -468
  190. package/src/server.ts +0 -211
  191. package/src/test-utils/index.ts +0 -6
  192. package/src/test-utils/mock-context.ts +0 -426
  193. package/src/test-utils/mock-playwright-client.ts +0 -422
  194. package/src/tools/index.ts +0 -11
  195. package/src/tools/webtest/crawl.test.ts +0 -834
  196. package/src/tools/webtest/crawl.ts +0 -901
  197. package/src/tools/webtest/discover-features.ts +0 -412
  198. package/src/tools/webtest/discover-flows.ts +0 -408
  199. package/src/tools/webtest/generate-tests.test.ts +0 -532
  200. package/src/tools/webtest/generate-tests.ts +0 -425
  201. package/src/tools/webtest/index.ts +0 -7
  202. package/src/tools/webtest/integration.test.ts +0 -536
  203. package/src/tools/webtest/run-test-case.test.ts +0 -659
  204. package/src/tools/webtest/run-test-case.ts +0 -508
  205. package/src/tools/webtest/schemas.ts +0 -201
  206. package/src/tools/webtest/start-analysis.test.ts +0 -151
  207. package/src/tools/webtest/start-analysis.ts +0 -158
  208. package/src/transports/http.ts +0 -19
  209. package/src/transports/index.ts +0 -30
  210. package/src/transports/stdio.ts +0 -7
  211. package/src/types/capabilities.test.ts +0 -193
  212. package/src/types/capabilities.ts +0 -50
  213. package/src/types/context.ts +0 -21
  214. package/src/types/tool.ts +0 -11
  215. package/src/workspace/index.ts +0 -945
  216. package/src/workspace/markdown.ts +0 -272
  217. package/src/workspace/types.ts +0 -186
  218. package/tests/integration/server.test.ts +0 -89
  219. package/tests/integration/tools.test.ts +0 -99
  220. package/tsconfig.json +0 -20
  221. package/vitest.config.ts +0 -9
  222. package/vitest.integration.config.ts +0 -10
  223. /package/{src → dist}/prompts/templates/sampling/crawl-action.md +0 -0
  224. /package/{src → dist}/prompts/templates/sampling/feature-discovery.md +0 -0
  225. /package/{src → dist}/prompts/templates/sampling/flow-discovery.md +0 -0
  226. /package/{src → dist}/prompts/templates/sampling/page-content-wrapper.md +0 -0
  227. /package/{src → dist}/prompts/templates/sampling/test-evaluation.md +0 -0
  228. /package/{src → dist}/prompts/templates/sampling/test-generation.md +0 -0
  229. /package/dist/tools/{webtest → retest}/crawl.d.ts +0 -0
  230. /package/dist/tools/{webtest → retest}/discover-features.d.ts +0 -0
  231. /package/dist/tools/{webtest → retest}/discover-flows.d.ts +0 -0
  232. /package/dist/tools/{webtest → retest}/generate-tests.d.ts +0 -0
  233. /package/dist/tools/{webtest → retest}/index.d.ts +0 -0
  234. /package/dist/tools/{webtest → retest}/index.js +0 -0
  235. /package/dist/tools/{webtest → retest}/run-test-case.d.ts +0 -0
  236. /package/dist/tools/{webtest → retest}/schemas.d.ts +0 -0
  237. /package/dist/tools/{webtest → retest}/schemas.js +0 -0
  238. /package/dist/tools/{webtest → retest}/start-analysis.d.ts +0 -0
package/src/index.ts DELETED
@@ -1,83 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createServer as createHttpServer } from "node:http";
3
- import { loadConfig } from "./config.js";
4
- import { createLogger } from "./logger.js";
5
- import { createServer } from "./server.js";
6
- import { createTransport } from "./transports/index.js";
7
-
8
- async function main(): Promise<void> {
9
- // Load and validate configuration
10
- let config;
11
- try {
12
- config = loadConfig();
13
- } catch (error) {
14
- console.error(
15
- "Configuration error:",
16
- error instanceof Error ? error.message : error
17
- );
18
- process.exit(1);
19
- }
20
-
21
- const logger = createLogger(config.logLevel);
22
- logger.info("Starting server", { transport: config.transport });
23
-
24
- // Create MCP server with all components
25
- const { server, cleanup } = createServer(config, logger);
26
-
27
- // Create transport based on configuration
28
- const transportResult = createTransport(config, logger);
29
-
30
- // Set up graceful shutdown
31
- const shutdown = async (signal: string) => {
32
- logger.info("Received shutdown signal", { signal });
33
- try {
34
- await cleanup();
35
- await server.close();
36
- logger.info("Server closed gracefully");
37
- process.exit(0);
38
- } catch (error) {
39
- logger.error("Error during shutdown", {
40
- error: error instanceof Error ? error.message : "Unknown error",
41
- });
42
- process.exit(1);
43
- }
44
- };
45
-
46
- process.on("SIGINT", () => shutdown("SIGINT"));
47
- process.on("SIGTERM", () => shutdown("SIGTERM"));
48
-
49
- // Connect based on transport type
50
- if (transportResult.type === "stdio") {
51
- await server.connect(transportResult.transport);
52
- logger.info("Server connected via stdio");
53
- } else {
54
- // HTTP transport requires an HTTP server
55
- const httpServer = createHttpServer(async (req, res) => {
56
- // Handle MCP requests
57
- if (req.method === "POST") {
58
- await transportResult.transport.handleRequest(req, res);
59
- } else if (req.method === "GET") {
60
- // Health check endpoint
61
- res.writeHead(200, { "Content-Type": "application/json" });
62
- res.end(JSON.stringify({ status: "ok" }));
63
- } else {
64
- res.writeHead(405);
65
- res.end();
66
- }
67
- });
68
-
69
- await server.connect(transportResult.transport);
70
-
71
- httpServer.listen(transportResult.port, () => {
72
- logger.info("Server listening", {
73
- transport: "http",
74
- port: transportResult.port,
75
- });
76
- });
77
- }
78
- }
79
-
80
- main().catch((error) => {
81
- console.error("Fatal error:", error);
82
- process.exit(1);
83
- });
@@ -1,260 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
2
- import {
3
- parseClientCapabilities,
4
- getServerCapabilities,
5
- checkCapability,
6
- REQUIRED_PROTOCOL_VERSION,
7
- type InitializeResult,
8
- } from "./index.js";
9
- import type { Logger } from "../logger.js";
10
-
11
- describe("lifecycle", () => {
12
- let mockLogger: Logger;
13
-
14
- beforeEach(() => {
15
- mockLogger = {
16
- debug: vi.fn(),
17
- info: vi.fn(),
18
- warn: vi.fn(),
19
- error: vi.fn(),
20
- setLevel: vi.fn(),
21
- withCorrelation: vi.fn().mockReturnThis(),
22
- } as unknown as Logger;
23
- });
24
-
25
- describe("parseClientCapabilities", () => {
26
- it("parses full capabilities correctly", () => {
27
- const initResult: InitializeResult = {
28
- protocolVersion: "2025-06-18",
29
- capabilities: {
30
- sampling: {},
31
- elicitation: {},
32
- logging: {},
33
- resources: {
34
- listChanged: true,
35
- subscribe: true,
36
- },
37
- },
38
- clientInfo: {
39
- name: "TestClient",
40
- version: "1.0.0",
41
- },
42
- };
43
-
44
- const caps = parseClientCapabilities(initResult, mockLogger);
45
-
46
- expect(caps.sampling).toBe(true);
47
- expect(caps.elicitation).toBe(true);
48
- expect(caps.logging).toBe(true);
49
- expect(caps.resourcesListChanged).toBe(true);
50
- expect(caps.resourcesSubscribe).toBe(true);
51
- expect(caps.progress).toBe(true); // Linked to sampling
52
- expect(caps.protocolVersion).toBe("2025-06-18");
53
- });
54
-
55
- it("handles missing capabilities", () => {
56
- const initResult: InitializeResult = {
57
- protocolVersion: "2025-06-18",
58
- capabilities: {},
59
- };
60
-
61
- const caps = parseClientCapabilities(initResult, mockLogger);
62
-
63
- expect(caps.sampling).toBe(false);
64
- expect(caps.elicitation).toBe(false);
65
- expect(caps.logging).toBe(false);
66
- expect(caps.resourcesListChanged).toBe(false);
67
- expect(caps.resourcesSubscribe).toBe(false);
68
- expect(caps.progress).toBe(false);
69
- });
70
-
71
- it("disables elicitation for older protocol versions", () => {
72
- const initResult: InitializeResult = {
73
- protocolVersion: "2024-12-01",
74
- capabilities: {
75
- sampling: {},
76
- elicitation: {},
77
- },
78
- };
79
-
80
- const caps = parseClientCapabilities(initResult, mockLogger);
81
-
82
- expect(caps.sampling).toBe(true);
83
- expect(caps.elicitation).toBe(false); // Disabled due to old protocol
84
- expect(mockLogger.warn).toHaveBeenCalledWith(
85
- "Running in degraded mode due to older protocol version",
86
- expect.any(Object)
87
- );
88
- });
89
-
90
- it("enables elicitation for required protocol version", () => {
91
- const initResult: InitializeResult = {
92
- protocolVersion: REQUIRED_PROTOCOL_VERSION,
93
- capabilities: {
94
- elicitation: {},
95
- },
96
- };
97
-
98
- const caps = parseClientCapabilities(initResult, mockLogger);
99
-
100
- expect(caps.elicitation).toBe(true);
101
- });
102
-
103
- it("enables elicitation for newer protocol versions", () => {
104
- const initResult: InitializeResult = {
105
- protocolVersion: "2025-12-01",
106
- capabilities: {
107
- elicitation: {},
108
- },
109
- };
110
-
111
- const caps = parseClientCapabilities(initResult, mockLogger);
112
-
113
- expect(caps.elicitation).toBe(true);
114
- });
115
-
116
- it("links progress to sampling capability", () => {
117
- const withSampling: InitializeResult = {
118
- protocolVersion: "2025-06-18",
119
- capabilities: { sampling: {} },
120
- };
121
-
122
- const withoutSampling: InitializeResult = {
123
- protocolVersion: "2025-06-18",
124
- capabilities: {},
125
- };
126
-
127
- const capsWithSampling = parseClientCapabilities(withSampling, mockLogger);
128
- const capsWithoutSampling = parseClientCapabilities(
129
- withoutSampling,
130
- mockLogger
131
- );
132
-
133
- expect(capsWithSampling.progress).toBe(true);
134
- expect(capsWithoutSampling.progress).toBe(false);
135
- });
136
-
137
- it("handles missing protocolVersion", () => {
138
- const initResult: InitializeResult = {
139
- protocolVersion: "",
140
- capabilities: {},
141
- };
142
-
143
- const caps = parseClientCapabilities(initResult, mockLogger);
144
-
145
- // Empty string is treated as falsy and defaults to "unknown"
146
- expect(caps.protocolVersion).toBe("unknown");
147
- });
148
-
149
- it("logs warning when sampling unavailable", () => {
150
- const initResult: InitializeResult = {
151
- protocolVersion: "2025-06-18",
152
- capabilities: {},
153
- };
154
-
155
- parseClientCapabilities(initResult, mockLogger);
156
-
157
- expect(mockLogger.warn).toHaveBeenCalledWith(
158
- "Sampling not available - AI-powered features will use fallback mode",
159
- expect.any(Object)
160
- );
161
- });
162
-
163
- it("logs info when elicitation unavailable", () => {
164
- const initResult: InitializeResult = {
165
- protocolVersion: "2025-06-18",
166
- capabilities: { sampling: {} },
167
- };
168
-
169
- parseClientCapabilities(initResult, mockLogger);
170
-
171
- expect(mockLogger.info).toHaveBeenCalledWith(
172
- "Elicitation not available - user decisions via tool output",
173
- expect.any(Object)
174
- );
175
- });
176
-
177
- it("logs detected capabilities", () => {
178
- const initResult: InitializeResult = {
179
- protocolVersion: "2025-06-18",
180
- capabilities: {
181
- sampling: {},
182
- logging: {},
183
- },
184
- };
185
-
186
- parseClientCapabilities(initResult, mockLogger);
187
-
188
- expect(mockLogger.info).toHaveBeenCalledWith(
189
- "Client capabilities detected",
190
- expect.objectContaining({
191
- sampling: true,
192
- logging: true,
193
- })
194
- );
195
- });
196
- });
197
-
198
- describe("getServerCapabilities", () => {
199
- it("returns correct server capabilities", () => {
200
- const caps = getServerCapabilities();
201
-
202
- expect(caps).toEqual({
203
- tools: {},
204
- resources: {
205
- listChanged: true,
206
- subscribe: true,
207
- },
208
- prompts: {},
209
- logging: {},
210
- });
211
- });
212
-
213
- it("advertises resource capabilities", () => {
214
- const caps = getServerCapabilities();
215
-
216
- expect(caps.resources.listChanged).toBe(true);
217
- expect(caps.resources.subscribe).toBe(true);
218
- });
219
- });
220
-
221
- describe("checkCapability", () => {
222
- it("returns true for enabled capabilities", () => {
223
- const caps = {
224
- sampling: true,
225
- elicitation: true,
226
- logging: false,
227
- progress: true,
228
- resourcesListChanged: false,
229
- resourcesSubscribe: false,
230
- protocolVersion: "2025-06-18",
231
- };
232
-
233
- expect(checkCapability(caps, "sampling")).toBe(true);
234
- expect(checkCapability(caps, "elicitation")).toBe(true);
235
- expect(checkCapability(caps, "progress")).toBe(true);
236
- });
237
-
238
- it("returns false for disabled capabilities", () => {
239
- const caps = {
240
- sampling: false,
241
- elicitation: false,
242
- logging: false,
243
- progress: false,
244
- resourcesListChanged: false,
245
- resourcesSubscribe: false,
246
- protocolVersion: "2025-06-18",
247
- };
248
-
249
- expect(checkCapability(caps, "sampling")).toBe(false);
250
- expect(checkCapability(caps, "elicitation")).toBe(false);
251
- expect(checkCapability(caps, "logging")).toBe(false);
252
- });
253
- });
254
-
255
- describe("REQUIRED_PROTOCOL_VERSION", () => {
256
- it("is set to expected version", () => {
257
- expect(REQUIRED_PROTOCOL_VERSION).toBe("2025-06-18");
258
- });
259
- });
260
- });
@@ -1,101 +0,0 @@
1
- import type { Logger } from "../logger.js";
2
- import {
3
- type ClientCapabilities,
4
- DEFAULT_CAPABILITIES,
5
- } from "../types/capabilities.js";
6
-
7
- export const REQUIRED_PROTOCOL_VERSION = "2025-06-18";
8
-
9
- export interface InitializeResult {
10
- protocolVersion: string;
11
- capabilities: {
12
- sampling?: Record<string, unknown>;
13
- elicitation?: Record<string, unknown>;
14
- logging?: Record<string, unknown>;
15
- resources?: {
16
- listChanged?: boolean;
17
- subscribe?: boolean;
18
- };
19
- };
20
- clientInfo?: {
21
- name: string;
22
- version: string;
23
- };
24
- }
25
-
26
- export function parseClientCapabilities(
27
- initResult: InitializeResult,
28
- logger: Logger
29
- ): ClientCapabilities {
30
- const caps = initResult.capabilities || {};
31
- const protocolVersion = initResult.protocolVersion || "unknown";
32
-
33
- const clientCaps: ClientCapabilities = {
34
- ...DEFAULT_CAPABILITIES,
35
- protocolVersion,
36
- sampling: !!caps.sampling,
37
- logging: !!caps.logging,
38
- resourcesListChanged: !!caps.resources?.listChanged,
39
- resourcesSubscribe: !!caps.resources?.subscribe,
40
- // Elicitation requires protocol version 2025-06-18+
41
- elicitation:
42
- !!caps.elicitation && protocolVersion >= REQUIRED_PROTOCOL_VERSION,
43
- // Progress is typically available if sampling is available
44
- progress: !!caps.sampling,
45
- };
46
-
47
- // Log capability detection
48
- logger.info("Client capabilities detected", {
49
- protocolVersion,
50
- sampling: clientCaps.sampling,
51
- elicitation: clientCaps.elicitation,
52
- logging: clientCaps.logging,
53
- resourcesListChanged: clientCaps.resourcesListChanged,
54
- resourcesSubscribe: clientCaps.resourcesSubscribe,
55
- });
56
-
57
- // Warn about degraded mode
58
- if (protocolVersion < REQUIRED_PROTOCOL_VERSION) {
59
- logger.warn("Running in degraded mode due to older protocol version", {
60
- clientVersion: protocolVersion,
61
- requiredVersion: REQUIRED_PROTOCOL_VERSION,
62
- disabledFeatures: ["elicitation"],
63
- });
64
- }
65
-
66
- if (!clientCaps.sampling) {
67
- logger.warn(
68
- "Sampling not available - AI-powered features will use fallback mode",
69
- {
70
- fallbackBehavior: "manual prompts via resources",
71
- }
72
- );
73
- }
74
-
75
- if (!clientCaps.elicitation) {
76
- logger.info("Elicitation not available - user decisions via tool output", {
77
- fallbackBehavior: "questions in tool response",
78
- });
79
- }
80
-
81
- return clientCaps;
82
- }
83
-
84
- export function getServerCapabilities() {
85
- return {
86
- tools: {},
87
- resources: {
88
- listChanged: true,
89
- subscribe: true,
90
- },
91
- prompts: {},
92
- logging: {},
93
- };
94
- }
95
-
96
- export function checkCapability(
97
- caps: ClientCapabilities,
98
- capability: keyof Omit<ClientCapabilities, "protocolVersion">
99
- ): boolean {
100
- return caps[capability];
101
- }