swagger-parser-mcp-server 2.0.4 → 2.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 (131) hide show
  1. package/README.md +131 -100
  2. package/dist/application/snapshot/createSnapshotRuntime.d.ts +2 -0
  3. package/dist/application/snapshot/createSnapshotRuntime.d.ts.map +1 -0
  4. package/dist/application/snapshot/createSnapshotRuntime.js +2 -0
  5. package/dist/application/snapshot/createSnapshotRuntime.js.map +1 -0
  6. package/dist/application/snapshot/snapshotCaptureService.d.ts +90 -0
  7. package/dist/application/snapshot/snapshotCaptureService.d.ts.map +1 -0
  8. package/dist/application/snapshot/snapshotCaptureService.js +394 -0
  9. package/dist/application/snapshot/snapshotCaptureService.js.map +1 -0
  10. package/dist/application/snapshot/snapshotRepository.d.ts +77 -0
  11. package/dist/application/snapshot/snapshotRepository.d.ts.map +1 -0
  12. package/dist/application/snapshot/snapshotRepository.js +2 -0
  13. package/dist/application/snapshot/snapshotRepository.js.map +1 -0
  14. package/dist/domain/canonical/canonicalSnapshot.d.ts +61 -0
  15. package/dist/domain/canonical/canonicalSnapshot.d.ts.map +1 -0
  16. package/dist/domain/canonical/canonicalSnapshot.js +300 -0
  17. package/dist/domain/canonical/canonicalSnapshot.js.map +1 -0
  18. package/dist/domain/contracts/runtimeEnvironmentContract.d.ts +21 -0
  19. package/dist/domain/contracts/runtimeEnvironmentContract.d.ts.map +1 -0
  20. package/dist/domain/contracts/runtimeEnvironmentContract.js +50 -0
  21. package/dist/domain/contracts/runtimeEnvironmentContract.js.map +1 -0
  22. package/dist/domain/contracts/snapshotDiffContract.d.ts +270 -0
  23. package/dist/domain/contracts/snapshotDiffContract.d.ts.map +1 -0
  24. package/dist/domain/contracts/snapshotDiffContract.js +99 -0
  25. package/dist/domain/contracts/snapshotDiffContract.js.map +1 -0
  26. package/dist/domain/diff/endpointDiffClassifier.d.ts +78 -0
  27. package/dist/domain/diff/endpointDiffClassifier.d.ts.map +1 -0
  28. package/dist/domain/diff/endpointDiffClassifier.js +317 -0
  29. package/dist/domain/diff/endpointDiffClassifier.js.map +1 -0
  30. package/dist/http.d.ts +3 -0
  31. package/dist/http.d.ts.map +1 -0
  32. package/dist/http.js +52 -0
  33. package/dist/http.js.map +1 -0
  34. package/dist/index.d.ts +2 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +88 -266
  37. package/dist/index.js.map +1 -1
  38. package/dist/infrastructure/postgres/migrationRunner.d.ts +14 -0
  39. package/dist/infrastructure/postgres/migrationRunner.d.ts.map +1 -0
  40. package/dist/infrastructure/postgres/migrationRunner.js +161 -0
  41. package/dist/infrastructure/postgres/migrationRunner.js.map +1 -0
  42. package/dist/infrastructure/postgres/migrations/001_snapshot_schema.sql +29 -0
  43. package/dist/infrastructure/postgres/migrations/002_snapshot_change_history.sql +32 -0
  44. package/dist/infrastructure/postgres/postgresSnapshotRepository.d.ts +25 -0
  45. package/dist/infrastructure/postgres/postgresSnapshotRepository.d.ts.map +1 -0
  46. package/dist/infrastructure/postgres/postgresSnapshotRepository.js +323 -0
  47. package/dist/infrastructure/postgres/postgresSnapshotRepository.js.map +1 -0
  48. package/dist/infrastructure/postgres/runMigrations.d.ts +3 -0
  49. package/dist/infrastructure/postgres/runMigrations.d.ts.map +1 -0
  50. package/dist/infrastructure/postgres/runMigrations.js +33 -0
  51. package/dist/infrastructure/postgres/runMigrations.js.map +1 -0
  52. package/dist/infrastructure/runtime/createSnapshotRuntime.d.ts +17 -0
  53. package/dist/infrastructure/runtime/createSnapshotRuntime.d.ts.map +1 -0
  54. package/dist/infrastructure/runtime/createSnapshotRuntime.js +38 -0
  55. package/dist/infrastructure/runtime/createSnapshotRuntime.js.map +1 -0
  56. package/dist/schemas.d.ts +284 -3
  57. package/dist/schemas.d.ts.map +1 -1
  58. package/dist/schemas.js +110 -1
  59. package/dist/schemas.js.map +1 -1
  60. package/dist/tests/canonicalSnapshot.test.d.ts +2 -0
  61. package/dist/tests/canonicalSnapshot.test.d.ts.map +1 -0
  62. package/dist/tests/canonicalSnapshot.test.js +425 -0
  63. package/dist/tests/canonicalSnapshot.test.js.map +1 -0
  64. package/dist/tests/endpointDiffClassifier.test.d.ts +2 -0
  65. package/dist/tests/endpointDiffClassifier.test.d.ts.map +1 -0
  66. package/dist/tests/endpointDiffClassifier.test.js +633 -0
  67. package/dist/tests/endpointDiffClassifier.test.js.map +1 -0
  68. package/dist/tests/httpSnapshotTransport.test.d.ts +2 -0
  69. package/dist/tests/httpSnapshotTransport.test.d.ts.map +1 -0
  70. package/dist/tests/httpSnapshotTransport.test.js +356 -0
  71. package/dist/tests/httpSnapshotTransport.test.js.map +1 -0
  72. package/dist/tests/indexLifecycle.test.d.ts +2 -0
  73. package/dist/tests/indexLifecycle.test.d.ts.map +1 -0
  74. package/dist/tests/indexLifecycle.test.js +23 -0
  75. package/dist/tests/indexLifecycle.test.js.map +1 -0
  76. package/dist/tests/mcpSnapshotTools.test.d.ts +2 -0
  77. package/dist/tests/mcpSnapshotTools.test.d.ts.map +1 -0
  78. package/dist/tests/mcpSnapshotTools.test.js +316 -0
  79. package/dist/tests/mcpSnapshotTools.test.js.map +1 -0
  80. package/dist/tests/postgresMigrationSmoke.test.d.ts +2 -0
  81. package/dist/tests/postgresMigrationSmoke.test.d.ts.map +1 -0
  82. package/dist/tests/postgresMigrationSmoke.test.js +187 -0
  83. package/dist/tests/postgresMigrationSmoke.test.js.map +1 -0
  84. package/dist/tests/realPostgresTestSchema.d.ts +10 -0
  85. package/dist/tests/realPostgresTestSchema.d.ts.map +1 -0
  86. package/dist/tests/realPostgresTestSchema.js +73 -0
  87. package/dist/tests/realPostgresTestSchema.js.map +1 -0
  88. package/dist/tests/snapshotCapturePipeline.test.d.ts +2 -0
  89. package/dist/tests/snapshotCapturePipeline.test.d.ts.map +1 -0
  90. package/dist/tests/snapshotCapturePipeline.test.js +475 -0
  91. package/dist/tests/snapshotCapturePipeline.test.js.map +1 -0
  92. package/dist/tests/snapshotDiffContract.test.d.ts +2 -0
  93. package/dist/tests/snapshotDiffContract.test.d.ts.map +1 -0
  94. package/dist/tests/snapshotDiffContract.test.js +156 -0
  95. package/dist/tests/snapshotDiffContract.test.js.map +1 -0
  96. package/dist/tests/snapshotPersistence.real.test.d.ts +2 -0
  97. package/dist/tests/snapshotPersistence.real.test.d.ts.map +1 -0
  98. package/dist/tests/snapshotPersistence.real.test.js +310 -0
  99. package/dist/tests/snapshotPersistence.real.test.js.map +1 -0
  100. package/dist/tests/webServerRuntime.test.d.ts +2 -0
  101. package/dist/tests/webServerRuntime.test.d.ts.map +1 -0
  102. package/dist/tests/webServerRuntime.test.js +123 -0
  103. package/dist/tests/webServerRuntime.test.js.map +1 -0
  104. package/dist/transport/createSnapshotToolRuntime.d.ts +7 -0
  105. package/dist/transport/createSnapshotToolRuntime.d.ts.map +1 -0
  106. package/dist/transport/createSnapshotToolRuntime.js +40 -0
  107. package/dist/transport/createSnapshotToolRuntime.js.map +1 -0
  108. package/dist/transport/httpSnapshotServer.d.ts +11 -0
  109. package/dist/transport/httpSnapshotServer.d.ts.map +1 -0
  110. package/dist/transport/httpSnapshotServer.js +216 -0
  111. package/dist/transport/httpSnapshotServer.js.map +1 -0
  112. package/dist/transport/mcpToolRouter.d.ts +81 -0
  113. package/dist/transport/mcpToolRouter.d.ts.map +1 -0
  114. package/dist/transport/mcpToolRouter.js +416 -0
  115. package/dist/transport/mcpToolRouter.js.map +1 -0
  116. package/dist/transport/webServerRuntime.d.ts +17 -0
  117. package/dist/transport/webServerRuntime.d.ts.map +1 -0
  118. package/dist/transport/webServerRuntime.js +73 -0
  119. package/dist/transport/webServerRuntime.js.map +1 -0
  120. package/dist/utils/swaggerCache.d.ts +4 -0
  121. package/dist/utils/swaggerCache.d.ts.map +1 -1
  122. package/dist/utils/swaggerCache.js +8 -0
  123. package/dist/utils/swaggerCache.js.map +1 -1
  124. package/dist/utils/types.d.ts +2 -1
  125. package/dist/utils/types.d.ts.map +1 -1
  126. package/dist/utils/types.js +2 -0
  127. package/dist/utils/types.js.map +1 -1
  128. package/dist/web/dashboard.css +411 -0
  129. package/dist/web/dashboard.html +141 -0
  130. package/dist/web/dashboard.js +540 -0
  131. package/package.json +27 -17
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshotDiffContract.test.js","sourceRoot":"","sources":["../../src/tests/snapshotDiffContract.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=snapshotPersistence.real.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshotPersistence.real.test.d.ts","sourceRoot":"","sources":["../../src/tests/snapshotPersistence.real.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,310 @@
1
+ import { Pool } from 'pg';
2
+ import { createSnapshotRuntime } from '../application/snapshot/createSnapshotRuntime.js';
3
+ import { PostgresSnapshotRepository } from '../infrastructure/postgres/postgresSnapshotRepository.js';
4
+ import { runPostgresMigrations } from '../infrastructure/postgres/migrationRunner.js';
5
+ import { createRealPostgresTestSchema, readTestDatabaseUrl } from './realPostgresTestSchema.js';
6
+ function createDocument(paths, version = '1.0.0') {
7
+ return {
8
+ openapi: '3.0.0',
9
+ info: {
10
+ title: 'Real DB Snapshot API',
11
+ version,
12
+ },
13
+ paths,
14
+ };
15
+ }
16
+ function createBaselineDocument() {
17
+ return createDocument({
18
+ '/pets': {
19
+ get: {
20
+ responses: {
21
+ '200': {
22
+ description: 'OK',
23
+ content: {
24
+ 'application/json': {
25
+ schema: {
26
+ type: 'object',
27
+ required: ['id'],
28
+ properties: {
29
+ id: { type: 'string' },
30
+ },
31
+ },
32
+ },
33
+ },
34
+ },
35
+ },
36
+ },
37
+ },
38
+ });
39
+ }
40
+ function createChangedDocument() {
41
+ return createDocument({
42
+ '/pets': {
43
+ get: {
44
+ responses: {
45
+ '200': {
46
+ description: 'OK',
47
+ content: {
48
+ 'application/json': {
49
+ schema: {
50
+ type: 'object',
51
+ required: ['id'],
52
+ properties: {
53
+ id: { type: 'string' },
54
+ },
55
+ },
56
+ },
57
+ },
58
+ },
59
+ },
60
+ },
61
+ post: {
62
+ requestBody: {
63
+ required: false,
64
+ content: {
65
+ 'application/json': {
66
+ schema: {
67
+ type: 'object',
68
+ properties: {
69
+ name: { type: 'string' },
70
+ },
71
+ },
72
+ },
73
+ },
74
+ },
75
+ responses: {
76
+ '201': {
77
+ description: 'Created',
78
+ content: {
79
+ 'application/json': {
80
+ schema: {
81
+ type: 'object',
82
+ required: ['id'],
83
+ properties: {
84
+ id: { type: 'string' },
85
+ },
86
+ },
87
+ },
88
+ },
89
+ },
90
+ },
91
+ },
92
+ },
93
+ });
94
+ }
95
+ function createMockLoader(sequence) {
96
+ let index = 0;
97
+ return {
98
+ loadFresh: jest.fn((_url) => {
99
+ const safeIndex = Math.min(index, sequence.length - 1);
100
+ const selected = sequence[safeIndex];
101
+ index += 1;
102
+ return Promise.resolve(selected);
103
+ }),
104
+ };
105
+ }
106
+ function createRuntimeEnv(databaseUrl, suffix) {
107
+ return {
108
+ DATABASE_URL: databaseUrl,
109
+ PROJECT_KEY: `real-db-${suffix}`,
110
+ SWAGGER_URL: `https://api.example.com/${suffix}/openapi.json`,
111
+ };
112
+ }
113
+ async function createRuntime(env, documents) {
114
+ const loader = createMockLoader(documents);
115
+ return createSnapshotRuntime(env, runtimeEnv => {
116
+ const pool = new Pool({
117
+ connectionString: runtimeEnv.DATABASE_URL,
118
+ });
119
+ return {
120
+ pool,
121
+ repository: new PostgresSnapshotRepository(pool),
122
+ loader,
123
+ };
124
+ });
125
+ }
126
+ const describeRealDatabase = readTestDatabaseUrl() ? describe : describe.skip;
127
+ describeRealDatabase('실 Postgres 영속성 회귀', () => {
128
+ it('bootstrap -> capture -> dispose -> runtime 재생성 후에도 list/replay 결과가 유지된다', async () => {
129
+ let schema = null;
130
+ let firstRuntime = null;
131
+ let secondRuntime = null;
132
+ let schemaProbePool = null;
133
+ let baselineSnapshotId = '';
134
+ let targetSnapshotId = '';
135
+ let sourceId = '';
136
+ let expectedCounts = null;
137
+ let expectedHistoryTargetSnapshotId = '';
138
+ let env = null;
139
+ try {
140
+ schema = await createRealPostgresTestSchema(process.env, { schemaPrefix: 'real_restart' });
141
+ env = createRuntimeEnv(schema.databaseUrl, 'restart');
142
+ firstRuntime = await createRuntime(env, [createBaselineDocument(), createChangedDocument()]);
143
+ schemaProbePool = new Pool({ connectionString: env.DATABASE_URL });
144
+ const schemaResult = await schemaProbePool.query('SELECT current_schema() AS current_schema;');
145
+ expect(schemaResult.rows[0].current_schema).toBe(schema.schemaName);
146
+ await schemaProbePool.end();
147
+ schemaProbePool = null;
148
+ const bootstrap = await firstRuntime.service.bootstrap(env);
149
+ expect(bootstrap.project.projectKey).toBe('real-db-restart');
150
+ const firstCapture = await firstRuntime.service.capture(env);
151
+ const secondCapture = await firstRuntime.service.capture(env);
152
+ baselineSnapshotId = firstCapture.snapshot.id;
153
+ targetSnapshotId = secondCapture.snapshot.id;
154
+ sourceId = secondCapture.source.id;
155
+ expectedCounts = secondCapture.diffResult.counts;
156
+ expectedHistoryTargetSnapshotId = secondCapture.snapshot.id;
157
+ await firstRuntime.dispose();
158
+ firstRuntime = null;
159
+ secondRuntime = await createRuntime(env, [createChangedDocument()]);
160
+ const snapshots = await secondRuntime.service.listSnapshotsBySource(sourceId);
161
+ expect(snapshots).toHaveLength(2);
162
+ expect(snapshots.map(snapshot => snapshot.id)).toEqual(expect.arrayContaining([baselineSnapshotId, targetSnapshotId]));
163
+ const replayed = await secondRuntime.service.replayDiff({
164
+ baselineSnapshotId,
165
+ targetSnapshotId,
166
+ });
167
+ expect(replayed.counts).toEqual(expectedCounts);
168
+ expect(replayed.summary.baselineSnapshotId).toBe(baselineSnapshotId);
169
+ expect(replayed.summary.targetSnapshotId).toBe(targetSnapshotId);
170
+ const history = await secondRuntime.service.listEndpointChangeHistory({
171
+ sourceId,
172
+ });
173
+ expect(history).toHaveLength(1);
174
+ expect(history[0].targetSnapshotId).toBe(expectedHistoryTargetSnapshotId);
175
+ }
176
+ finally {
177
+ if (schemaProbePool) {
178
+ await schemaProbePool.end().catch(() => undefined);
179
+ }
180
+ if (secondRuntime) {
181
+ await secondRuntime.dispose().catch(() => undefined);
182
+ }
183
+ if (firstRuntime) {
184
+ await firstRuntime.dispose().catch(() => undefined);
185
+ }
186
+ if (schema) {
187
+ await schema.dispose().catch(() => undefined);
188
+ }
189
+ }
190
+ });
191
+ it('동일 spec 재캡처는 재시작 전후 no-op이며 snapshot row 수가 증가하지 않는다', async () => {
192
+ let schema = null;
193
+ let firstRuntime = null;
194
+ let secondRuntime = null;
195
+ let env = null;
196
+ let baselineSnapshotId = '';
197
+ let sourceId = '';
198
+ try {
199
+ schema = await createRealPostgresTestSchema(process.env, { schemaPrefix: 'real_noop' });
200
+ env = createRuntimeEnv(schema.databaseUrl, 'noop');
201
+ firstRuntime = await createRuntime(env, [createBaselineDocument(), createBaselineDocument()]);
202
+ const firstCapture = await firstRuntime.service.capture(env);
203
+ const secondCapture = await firstRuntime.service.capture(env);
204
+ baselineSnapshotId = firstCapture.snapshot.id;
205
+ sourceId = firstCapture.source.id;
206
+ expect(secondCapture.isNoopCapture).toBe(true);
207
+ expect(secondCapture.snapshot.id).toBe(baselineSnapshotId);
208
+ const beforeRestart = await firstRuntime.service.listSnapshotsBySource(sourceId);
209
+ expect(beforeRestart).toHaveLength(1);
210
+ await firstRuntime.dispose();
211
+ firstRuntime = null;
212
+ secondRuntime = await createRuntime(env, [createBaselineDocument()]);
213
+ const thirdCapture = await secondRuntime.service.capture(env);
214
+ expect(thirdCapture.isNoopCapture).toBe(true);
215
+ expect(thirdCapture.snapshot.id).toBe(baselineSnapshotId);
216
+ const afterRestart = await secondRuntime.service.listSnapshotsBySource(sourceId);
217
+ expect(afterRestart).toHaveLength(1);
218
+ }
219
+ finally {
220
+ if (secondRuntime) {
221
+ await secondRuntime.dispose().catch(() => undefined);
222
+ }
223
+ if (firstRuntime) {
224
+ await firstRuntime.dispose().catch(() => undefined);
225
+ }
226
+ if (schema) {
227
+ await schema.dispose().catch(() => undefined);
228
+ }
229
+ }
230
+ });
231
+ it('migration을 두 번 실행해도 schema_migrations 행은 하나만 유지된다', async () => {
232
+ let schema = null;
233
+ let pool = null;
234
+ try {
235
+ schema = await createRealPostgresTestSchema(process.env, { schemaPrefix: 'real_migration' });
236
+ pool = new Pool({ connectionString: schema.databaseUrl });
237
+ const firstRun = await runPostgresMigrations(pool);
238
+ expect(firstRun.applied).toEqual(['001_snapshot_schema.sql', '002_snapshot_change_history.sql']);
239
+ const secondRun = await runPostgresMigrations(pool);
240
+ expect(secondRun.applied).toEqual([]);
241
+ expect(secondRun.skipped).toContain('001_snapshot_schema.sql');
242
+ expect(secondRun.skipped).toContain('002_snapshot_change_history.sql');
243
+ const history = await pool.query(`
244
+ SELECT version
245
+ FROM schema_migrations
246
+ ORDER BY version ASC;
247
+ `);
248
+ expect(history.rows).toHaveLength(2);
249
+ expect(history.rows.map(row => row.version)).toEqual([
250
+ '001_snapshot_schema.sql',
251
+ '002_snapshot_change_history.sql',
252
+ ]);
253
+ }
254
+ finally {
255
+ if (pool) {
256
+ await pool.end().catch(() => undefined);
257
+ }
258
+ if (schema) {
259
+ await schema.dispose().catch(() => undefined);
260
+ }
261
+ }
262
+ });
263
+ it('동일 source/spec hash로 동시 capture해도 해당 snapshot row는 1개만 생성된다', async () => {
264
+ let schema = null;
265
+ let runtimeA = null;
266
+ let runtimeB = null;
267
+ let verificationPool = null;
268
+ let env = null;
269
+ try {
270
+ schema = await createRealPostgresTestSchema(process.env, { schemaPrefix: 'real_concurrent' });
271
+ env = createRuntimeEnv(schema.databaseUrl, 'concurrent');
272
+ runtimeA = await createRuntime(env, [createBaselineDocument(), createChangedDocument()]);
273
+ runtimeB = await createRuntime(env, [createChangedDocument()]);
274
+ verificationPool = new Pool({ connectionString: schema.databaseUrl });
275
+ await runtimeA.service.capture(env);
276
+ const [left, right] = await Promise.all([runtimeA.service.capture(env), runtimeB.service.capture(env)]);
277
+ expect(left.snapshot.id).toBe(right.snapshot.id);
278
+ expect(left.snapshot.specHash).toBe(right.snapshot.specHash);
279
+ const result = await verificationPool.query(`
280
+ SELECT COUNT(*)::int AS count
281
+ FROM snapshots
282
+ WHERE source_id = $1
283
+ AND spec_hash = $2;
284
+ `, [left.source.id, left.snapshot.specHash]);
285
+ expect(result.rows[0].count).toBe(1);
286
+ const snapshots = await runtimeA.service.listSnapshotsBySource(left.source.id);
287
+ expect(snapshots).toHaveLength(2);
288
+ const history = await runtimeA.service.listEndpointChangeHistory({
289
+ sourceId: left.source.id,
290
+ });
291
+ expect(history).toHaveLength(1);
292
+ expect(history[0].targetSnapshotId).toBe(left.snapshot.id);
293
+ }
294
+ finally {
295
+ if (verificationPool) {
296
+ await verificationPool.end().catch(() => undefined);
297
+ }
298
+ if (runtimeB) {
299
+ await runtimeB.dispose().catch(() => undefined);
300
+ }
301
+ if (runtimeA) {
302
+ await runtimeA.dispose().catch(() => undefined);
303
+ }
304
+ if (schema) {
305
+ await schema.dispose().catch(() => undefined);
306
+ }
307
+ }
308
+ });
309
+ });
310
+ //# sourceMappingURL=snapshotPersistence.real.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshotPersistence.real.test.js","sourceRoot":"","sources":["../../src/tests/snapshotPersistence.real.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=webServerRuntime.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webServerRuntime.test.d.ts","sourceRoot":"","sources":["../../src/tests/webServerRuntime.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,123 @@
1
+ import { createServer } from 'node:http';
2
+ import { startSnapshotWebServer, isSnapshotWebEnabled } from '../transport/webServerRuntime.js';
3
+ async function reservePort() {
4
+ const server = createServer();
5
+ await new Promise((resolve, reject) => {
6
+ server.once('error', reject);
7
+ server.listen(0, '127.0.0.1', () => resolve());
8
+ });
9
+ const address = server.address();
10
+ await new Promise((resolve, reject) => {
11
+ server.close(error => {
12
+ if (error) {
13
+ reject(error);
14
+ return;
15
+ }
16
+ resolve();
17
+ });
18
+ });
19
+ return address.port;
20
+ }
21
+ describe('web server runtime', () => {
22
+ it('should enable web server by default', () => {
23
+ expect(isSnapshotWebEnabled({})).toBe(true);
24
+ expect(isSnapshotWebEnabled({ SNAPSHOT_WEB_ENABLED: undefined })).toBe(true);
25
+ });
26
+ it('should disable web server when SNAPSHOT_WEB_ENABLED is false-like', () => {
27
+ const falseLikeValues = ['false', 'FALSE', '0', 'off', 'OFF', 'no', 'NO', ' false '];
28
+ falseLikeValues.forEach(value => {
29
+ expect(isSnapshotWebEnabled({ SNAPSHOT_WEB_ENABLED: value })).toBe(false);
30
+ });
31
+ });
32
+ it('should start and close web server when enabled', async () => {
33
+ const port = await reservePort();
34
+ const handle = await startSnapshotWebServer({
35
+ env: {
36
+ HTTP_HOST: '127.0.0.1',
37
+ HTTP_PORT: String(port),
38
+ },
39
+ toolRouter: {
40
+ executeStructured: jest.fn().mockResolvedValue({
41
+ ok: true,
42
+ statusCode: 200,
43
+ data: {},
44
+ }),
45
+ },
46
+ });
47
+ try {
48
+ expect(handle.enabled).toBe(true);
49
+ expect(handle.port).toBe(port);
50
+ const healthResponse = await fetch(`http://127.0.0.1:${handle.port}/health`);
51
+ const healthPayload = (await healthResponse.json());
52
+ expect(healthResponse.status).toBe(200);
53
+ expect(healthPayload.ok).toBe(true);
54
+ }
55
+ finally {
56
+ await handle.close();
57
+ }
58
+ });
59
+ it('should skip startup when disabled and forceEnable is not set', async () => {
60
+ const handle = await startSnapshotWebServer({
61
+ env: {
62
+ SNAPSHOT_WEB_ENABLED: 'false',
63
+ HTTP_HOST: '127.0.0.1',
64
+ HTTP_PORT: '31337',
65
+ },
66
+ toolRouter: {
67
+ executeStructured: jest.fn(),
68
+ },
69
+ });
70
+ expect(handle.enabled).toBe(false);
71
+ await expect(handle.close()).resolves.toBeUndefined();
72
+ });
73
+ it('should fallback to default port when configured port is out of range', async () => {
74
+ const handle = await startSnapshotWebServer({
75
+ env: {
76
+ SNAPSHOT_WEB_ENABLED: 'false',
77
+ HTTP_HOST: '127.0.0.1',
78
+ HTTP_PORT: '70000',
79
+ },
80
+ toolRouter: {
81
+ executeStructured: jest.fn(),
82
+ },
83
+ });
84
+ expect(handle.enabled).toBe(false);
85
+ expect(handle.port).toBe(3100);
86
+ await expect(handle.close()).resolves.toBeUndefined();
87
+ });
88
+ it('should fail startup when requested port is already in use', async () => {
89
+ const port = await reservePort();
90
+ const first = await startSnapshotWebServer({
91
+ env: {
92
+ HTTP_HOST: '127.0.0.1',
93
+ HTTP_PORT: String(port),
94
+ },
95
+ toolRouter: {
96
+ executeStructured: jest.fn().mockResolvedValue({
97
+ ok: true,
98
+ statusCode: 200,
99
+ data: {},
100
+ }),
101
+ },
102
+ });
103
+ try {
104
+ await expect(startSnapshotWebServer({
105
+ env: {
106
+ HTTP_HOST: '127.0.0.1',
107
+ HTTP_PORT: String(port),
108
+ },
109
+ toolRouter: {
110
+ executeStructured: jest.fn().mockResolvedValue({
111
+ ok: true,
112
+ statusCode: 200,
113
+ data: {},
114
+ }),
115
+ },
116
+ })).rejects.toMatchObject({ code: 'EADDRINUSE' });
117
+ }
118
+ finally {
119
+ await first.close();
120
+ }
121
+ });
122
+ });
123
+ //# sourceMappingURL=webServerRuntime.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webServerRuntime.test.js","sourceRoot":"","sources":["../../src/tests/webServerRuntime.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { McpToolRouter } from './mcpToolRouter.js';
2
+ export interface SnapshotToolRuntime {
3
+ toolRouter: McpToolRouter;
4
+ dispose(): Promise<void>;
5
+ }
6
+ export declare function createSnapshotToolRuntime(env: NodeJS.ProcessEnv): SnapshotToolRuntime;
7
+ //# sourceMappingURL=createSnapshotToolRuntime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSnapshotToolRuntime.d.ts","sourceRoot":"","sources":["../../src/transport/createSnapshotToolRuntime.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIxE,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,aAAa,CAAC;IAC1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,mBAAmB,CAqCrF"}
@@ -0,0 +1,40 @@
1
+ import { createSnapshotRuntime } from '../application/snapshot/createSnapshotRuntime.js';
2
+ import { createMcpToolRouter } from './mcpToolRouter.js';
3
+ import { SchemaResolver } from '../utils/schemaResolver.js';
4
+ import { SwaggerCache } from '../utils/swaggerCache.js';
5
+ export function createSnapshotToolRuntime(env) {
6
+ const swaggerCache = new SwaggerCache();
7
+ const schemaResolver = new SchemaResolver({
8
+ maxDepth: 10,
9
+ includeCircularRefs: false,
10
+ circularRefPlaceholder: '[Circular Reference]',
11
+ });
12
+ let snapshotRuntimePromise = null;
13
+ const getSnapshotRuntime = async () => {
14
+ if (!snapshotRuntimePromise) {
15
+ snapshotRuntimePromise = createSnapshotRuntime(env).catch(error => {
16
+ snapshotRuntimePromise = null;
17
+ throw error;
18
+ });
19
+ }
20
+ return snapshotRuntimePromise;
21
+ };
22
+ return {
23
+ toolRouter: createMcpToolRouter({
24
+ swaggerCache,
25
+ schemaResolver,
26
+ runtimeProvider: getSnapshotRuntime,
27
+ }),
28
+ async dispose() {
29
+ if (!snapshotRuntimePromise) {
30
+ return;
31
+ }
32
+ const runtime = await snapshotRuntimePromise.catch(() => null);
33
+ snapshotRuntimePromise = null;
34
+ if (runtime) {
35
+ await runtime.dispose();
36
+ }
37
+ },
38
+ };
39
+ }
40
+ //# sourceMappingURL=createSnapshotToolRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSnapshotToolRuntime.js","sourceRoot":"","sources":["../../src/transport/createSnapshotToolRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAmB,MAAM,kDAAkD,CAAC;AAC1G,OAAO,EAAE,mBAAmB,EAAiB,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAOxD,MAAM,UAAU,yBAAyB,CAAC,GAAsB;IAC9D,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IACxC,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC;QACxC,QAAQ,EAAE,EAAE;QACZ,mBAAmB,EAAE,KAAK;QAC1B,sBAAsB,EAAE,sBAAsB;KAC/C,CAAC,CAAC;IAEH,IAAI,sBAAsB,GAAoC,IAAI,CAAC;IACnE,MAAM,kBAAkB,GAAG,KAAK,IAA8B,EAAE;QAC9D,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC5B,sBAAsB,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;gBAChE,sBAAsB,GAAG,IAAI,CAAC;gBAC9B,MAAM,KAAK,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,sBAAsB,CAAC;IAChC,CAAC,CAAC;IAEF,OAAO;QACL,UAAU,EAAE,mBAAmB,CAAC;YAC9B,YAAY;YACZ,cAAc;YACd,eAAe,EAAE,kBAAkB;SACpC,CAAC;QACF,KAAK,CAAC,OAAO;YACX,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC5B,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAC/D,sBAAsB,GAAG,IAAI,CAAC;YAC9B,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Server } from 'node:http';
2
+ import { createMcpToolRouter } from './mcpToolRouter.js';
3
+ type ToolRouter = Pick<ReturnType<typeof createMcpToolRouter>, 'executeStructured'>;
4
+ export interface HttpSnapshotServerDeps {
5
+ toolRouter: ToolRouter;
6
+ basePath?: string;
7
+ dashboardAssetsDir?: string;
8
+ }
9
+ export declare function createHttpSnapshotServer(deps: HttpSnapshotServerDeps): Server;
10
+ export {};
11
+ //# sourceMappingURL=httpSnapshotServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpSnapshotServer.d.ts","sourceRoot":"","sources":["../../src/transport/httpSnapshotServer.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,MAAM,EAAgC,MAAM,WAAW,CAAC;AAGlF,OAAO,EAAwB,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE/E,KAAK,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,mBAAmB,CAAC,EAAE,mBAAmB,CAAC,CAAC;AAIpF,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AA4PD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,sBAAsB,GAAG,MAAM,CAa7E"}