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,394 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { analyzeCanonicalChange, createCanonicalSnapshot, } from '../../domain/canonical/canonicalSnapshot.js';
3
+ import { classifyEndpointDiffs } from '../../domain/diff/endpointDiffClassifier.js';
4
+ import { validateEnvironment } from '../../domain/contracts/runtimeEnvironmentContract.js';
5
+ import { snapshotDiffResultSchema } from '../../domain/contracts/snapshotDiffContract.js';
6
+ function toStableJson(value) {
7
+ if (Array.isArray(value)) {
8
+ return `[${value.map(item => toStableJson(item)).join(',')}]`;
9
+ }
10
+ if (value !== null && typeof value === 'object') {
11
+ const entries = Object.entries(value).sort(([left], [right]) => left.localeCompare(right));
12
+ return `{${entries.map(([key, child]) => `${JSON.stringify(key)}:${toStableJson(child)}`).join(',')}}`;
13
+ }
14
+ return JSON.stringify(value);
15
+ }
16
+ export function createSpecHash(document) {
17
+ return createHash('sha256').update(toStableJson(document)).digest('hex');
18
+ }
19
+ function buildWarnings(analysis, targetSnapshot) {
20
+ const warnings = [];
21
+ if (analysis.isVersionOnlyChange) {
22
+ warnings.push({
23
+ code: 'VERSION_ONLY_CHANGE',
24
+ message: 'Only version signal changed while structural fingerprint stayed the same.',
25
+ });
26
+ }
27
+ if (analysis.hasVersionMismatch) {
28
+ const infoVersion = targetSnapshot.versionSignal.infoVersion ?? 'unknown';
29
+ const hints = targetSnapshot.versionSignal.urlVersionHints.join(', ');
30
+ warnings.push({
31
+ code: 'VERSION_MISMATCH',
32
+ message: `info.version (${infoVersion}) does not match URL version hints (${hints || 'none'}).`,
33
+ });
34
+ }
35
+ return warnings;
36
+ }
37
+ function zeroCounts() {
38
+ return {
39
+ total: 0,
40
+ breaking: 0,
41
+ nonBreaking: 0,
42
+ info: 0,
43
+ };
44
+ }
45
+ function normalizeEnvironment(env) {
46
+ return validateEnvironment(env);
47
+ }
48
+ function createEmptyDiffResult(params) {
49
+ return snapshotDiffResultSchema.parse({
50
+ summary: {
51
+ projectKey: params.projectKey,
52
+ sourceUrl: params.sourceUrl,
53
+ baselineSnapshotId: params.baselineSnapshotId,
54
+ targetSnapshotId: params.targetSnapshotId,
55
+ comparedAt: params.comparedAt.toISOString(),
56
+ hasChanges: false,
57
+ isNoopCapture: params.isNoopCapture,
58
+ },
59
+ counts: zeroCounts(),
60
+ changes: [],
61
+ warnings: params.warnings,
62
+ });
63
+ }
64
+ function createDiffResult(params) {
65
+ const precomputed = precomputeDiffPayload(params.baselineSnapshot, params.targetSnapshot);
66
+ return createDiffResultFromPrecomputed({
67
+ projectKey: params.projectKey,
68
+ sourceUrl: params.sourceUrl,
69
+ baselineSnapshotId: params.baselineSnapshotId,
70
+ targetSnapshotId: params.targetSnapshotId,
71
+ comparedAt: params.comparedAt,
72
+ isNoopCapture: params.isNoopCapture,
73
+ precomputed,
74
+ });
75
+ }
76
+ function precomputeDiffPayload(baselineSnapshot, targetSnapshot) {
77
+ const analysis = analyzeCanonicalChange(baselineSnapshot, targetSnapshot);
78
+ if (!analysis.hasStructuralChanges) {
79
+ return {
80
+ counts: zeroCounts(),
81
+ changes: [],
82
+ warnings: buildWarnings(analysis, targetSnapshot),
83
+ };
84
+ }
85
+ const classified = classifyEndpointDiffs(baselineSnapshot, targetSnapshot);
86
+ const changes = classified.changes.map(change => ({
87
+ url: change.url,
88
+ method: change.method,
89
+ classification: change.classification,
90
+ changeReason: change.changeReason,
91
+ }));
92
+ return {
93
+ counts: classified.counts,
94
+ changes,
95
+ warnings: buildWarnings(analysis, targetSnapshot),
96
+ };
97
+ }
98
+ function createDiffResultFromPrecomputed(params) {
99
+ if (params.precomputed.changes.length === 0) {
100
+ return createEmptyDiffResult({
101
+ projectKey: params.projectKey,
102
+ sourceUrl: params.sourceUrl,
103
+ baselineSnapshotId: params.baselineSnapshotId,
104
+ targetSnapshotId: params.targetSnapshotId,
105
+ comparedAt: params.comparedAt,
106
+ isNoopCapture: params.isNoopCapture,
107
+ warnings: params.precomputed.warnings,
108
+ });
109
+ }
110
+ return snapshotDiffResultSchema.parse({
111
+ summary: {
112
+ projectKey: params.projectKey,
113
+ sourceUrl: params.sourceUrl,
114
+ baselineSnapshotId: params.baselineSnapshotId,
115
+ targetSnapshotId: params.targetSnapshotId,
116
+ comparedAt: params.comparedAt.toISOString(),
117
+ hasChanges: params.precomputed.counts.total > 0,
118
+ isNoopCapture: params.isNoopCapture,
119
+ },
120
+ counts: params.precomputed.counts,
121
+ changes: params.precomputed.changes,
122
+ warnings: params.precomputed.warnings,
123
+ });
124
+ }
125
+ function toSelfAnalysis(snapshot) {
126
+ return analyzeCanonicalChange(snapshot, snapshot);
127
+ }
128
+ function createTransitionPayload(previousSnapshot, targetSnapshot) {
129
+ const precomputed = precomputeDiffPayload(previousSnapshot.canonicalSnapshot, targetSnapshot);
130
+ return {
131
+ baselineSnapshotId: previousSnapshot.id,
132
+ counts: precomputed.counts,
133
+ warnings: precomputed.warnings,
134
+ events: precomputed.changes.map(change => ({
135
+ path: change.url,
136
+ method: change.method,
137
+ classification: change.classification,
138
+ changeReason: change.changeReason,
139
+ })),
140
+ };
141
+ }
142
+ function normalizeHistoryFilter(input) {
143
+ const hasPath = typeof input.path === 'string' && input.path.trim().length > 0;
144
+ const hasMethod = typeof input.method === 'string' && input.method.trim().length > 0;
145
+ if (hasPath !== hasMethod) {
146
+ throw new Error('path and method must be provided together.');
147
+ }
148
+ if (!hasPath || !hasMethod) {
149
+ return {
150
+ sourceId: input.sourceId,
151
+ limit: input.limit,
152
+ };
153
+ }
154
+ return {
155
+ sourceId: input.sourceId,
156
+ limit: input.limit,
157
+ path: input.path.trim(),
158
+ method: input.method.toLowerCase(),
159
+ };
160
+ }
161
+ function toEndpointHistoryEvent(record) {
162
+ return {
163
+ baselineSnapshotId: record.baselineSnapshotId,
164
+ targetSnapshotId: record.targetSnapshotId,
165
+ path: record.path,
166
+ method: record.method,
167
+ classification: record.classification,
168
+ changeReason: record.changeReason,
169
+ changedAt: record.changedAt,
170
+ };
171
+ }
172
+ export class SnapshotCaptureService {
173
+ repository;
174
+ loader;
175
+ now;
176
+ initializePromise = null;
177
+ constructor(repository, loader, now = () => new Date()) {
178
+ this.repository = repository;
179
+ this.loader = loader;
180
+ this.now = now;
181
+ }
182
+ async initialize() {
183
+ if (!this.initializePromise) {
184
+ this.initializePromise = this.repository.initializeSchema().catch(error => {
185
+ this.initializePromise = null;
186
+ throw error;
187
+ });
188
+ }
189
+ await this.initializePromise;
190
+ }
191
+ async resolveBootstrapContext(env) {
192
+ const normalized = normalizeEnvironment(env);
193
+ const project = await this.repository.ensureProject(normalized.PROJECT_KEY);
194
+ const source = await this.repository.ensureSource(project.id, normalized.SWAGGER_URL);
195
+ return {
196
+ environment: normalized,
197
+ project,
198
+ source,
199
+ };
200
+ }
201
+ async bootstrap(env) {
202
+ await this.initialize();
203
+ return this.resolveBootstrapContext(env);
204
+ }
205
+ async capture(env) {
206
+ await this.initialize();
207
+ const bootstrap = await this.resolveBootstrapContext(env);
208
+ const fetchedDocument = await this.loader.loadFresh(bootstrap.environment.SWAGGER_URL);
209
+ const canonicalSnapshot = createCanonicalSnapshot({
210
+ document: fetchedDocument,
211
+ sourceUrl: bootstrap.environment.SWAGGER_URL,
212
+ });
213
+ const specHash = createSpecHash(fetchedDocument);
214
+ const previousSnapshot = await this.repository.getLatestSnapshot(bootstrap.source.id);
215
+ const comparedAt = this.now();
216
+ if (previousSnapshot && previousSnapshot.specHash === specHash) {
217
+ const warnings = buildWarnings(toSelfAnalysis(previousSnapshot.canonicalSnapshot), previousSnapshot.canonicalSnapshot);
218
+ const diffResult = createEmptyDiffResult({
219
+ projectKey: bootstrap.project.projectKey,
220
+ sourceUrl: bootstrap.source.swaggerUrl,
221
+ baselineSnapshotId: previousSnapshot.id,
222
+ targetSnapshotId: previousSnapshot.id,
223
+ comparedAt,
224
+ isNoopCapture: true,
225
+ warnings,
226
+ });
227
+ return {
228
+ ...bootstrap,
229
+ specHash,
230
+ snapshot: previousSnapshot,
231
+ previousSnapshot,
232
+ isNoopCapture: true,
233
+ diffResult,
234
+ };
235
+ }
236
+ const transition = previousSnapshot ? createTransitionPayload(previousSnapshot, canonicalSnapshot) : undefined;
237
+ const saveResult = await this.repository.saveSnapshot({
238
+ sourceId: bootstrap.source.id,
239
+ specHash,
240
+ documentFingerprint: canonicalSnapshot.documentFingerprint,
241
+ canonicalSnapshot,
242
+ transition,
243
+ });
244
+ const savedSnapshot = saveResult.snapshot;
245
+ if (!saveResult.created) {
246
+ const warnings = buildWarnings(toSelfAnalysis(savedSnapshot.canonicalSnapshot), savedSnapshot.canonicalSnapshot);
247
+ const diffResult = createEmptyDiffResult({
248
+ projectKey: bootstrap.project.projectKey,
249
+ sourceUrl: bootstrap.source.swaggerUrl,
250
+ baselineSnapshotId: savedSnapshot.id,
251
+ targetSnapshotId: savedSnapshot.id,
252
+ comparedAt,
253
+ isNoopCapture: true,
254
+ warnings,
255
+ });
256
+ return {
257
+ ...bootstrap,
258
+ specHash,
259
+ snapshot: savedSnapshot,
260
+ previousSnapshot,
261
+ isNoopCapture: true,
262
+ diffResult,
263
+ };
264
+ }
265
+ if (!previousSnapshot) {
266
+ const warnings = buildWarnings(toSelfAnalysis(savedSnapshot.canonicalSnapshot), savedSnapshot.canonicalSnapshot);
267
+ const diffResult = createEmptyDiffResult({
268
+ projectKey: bootstrap.project.projectKey,
269
+ sourceUrl: bootstrap.source.swaggerUrl,
270
+ baselineSnapshotId: savedSnapshot.id,
271
+ targetSnapshotId: savedSnapshot.id,
272
+ comparedAt,
273
+ isNoopCapture: false,
274
+ warnings,
275
+ });
276
+ return {
277
+ ...bootstrap,
278
+ specHash,
279
+ snapshot: savedSnapshot,
280
+ previousSnapshot: null,
281
+ isNoopCapture: false,
282
+ diffResult,
283
+ };
284
+ }
285
+ const precomputed = precomputeDiffPayload(previousSnapshot.canonicalSnapshot, canonicalSnapshot);
286
+ const diffResult = createDiffResultFromPrecomputed({
287
+ projectKey: bootstrap.project.projectKey,
288
+ sourceUrl: bootstrap.source.swaggerUrl,
289
+ baselineSnapshotId: previousSnapshot.id,
290
+ targetSnapshotId: savedSnapshot.id,
291
+ comparedAt,
292
+ isNoopCapture: false,
293
+ precomputed,
294
+ });
295
+ return {
296
+ ...bootstrap,
297
+ specHash,
298
+ snapshot: savedSnapshot,
299
+ previousSnapshot,
300
+ isNoopCapture: false,
301
+ diffResult,
302
+ };
303
+ }
304
+ async listSnapshotsBySource(sourceId, limit = 50) {
305
+ await this.initialize();
306
+ const snapshots = await this.repository.listSnapshotsBySource(sourceId, limit);
307
+ return snapshots.map(snapshot => ({
308
+ id: snapshot.id,
309
+ sourceId: snapshot.sourceId,
310
+ specHash: snapshot.specHash,
311
+ documentFingerprint: snapshot.documentFingerprint,
312
+ capturedAt: snapshot.capturedAt,
313
+ }));
314
+ }
315
+ async listEndpointChangeHistory(input) {
316
+ await this.initialize();
317
+ const normalized = normalizeHistoryFilter(input);
318
+ const records = await this.repository.listEndpointChangeHistory(normalized);
319
+ return records.map(toEndpointHistoryEvent);
320
+ }
321
+ async resolveReplaySnapshots(input) {
322
+ const baselineSnapshot = await this.repository.getSnapshotById(input.baselineSnapshotId);
323
+ if (!baselineSnapshot) {
324
+ throw new Error(`Baseline snapshot not found: ${input.baselineSnapshotId}`);
325
+ }
326
+ const targetSnapshot = await this.repository.getSnapshotById(input.targetSnapshotId);
327
+ if (!targetSnapshot) {
328
+ throw new Error(`Target snapshot not found: ${input.targetSnapshotId}`);
329
+ }
330
+ if (baselineSnapshot.sourceId !== targetSnapshot.sourceId) {
331
+ throw new Error('Cannot replay diff across different sources.');
332
+ }
333
+ return {
334
+ baselineSnapshot,
335
+ targetSnapshot,
336
+ };
337
+ }
338
+ async replayDiff(input) {
339
+ const replaySnapshots = await this.resolveReplaySnapshots(input);
340
+ const sourceIdentity = await this.repository.getSourceIdentityById(replaySnapshots.baselineSnapshot.sourceId);
341
+ if (!sourceIdentity) {
342
+ throw new Error(`Source identity not found for snapshot source: ${replaySnapshots.baselineSnapshot.sourceId}`);
343
+ }
344
+ return createDiffResult({
345
+ projectKey: sourceIdentity.projectKey,
346
+ sourceUrl: sourceIdentity.swaggerUrl,
347
+ baselineSnapshotId: replaySnapshots.baselineSnapshot.id,
348
+ targetSnapshotId: replaySnapshots.targetSnapshot.id,
349
+ baselineSnapshot: replaySnapshots.baselineSnapshot.canonicalSnapshot,
350
+ targetSnapshot: replaySnapshots.targetSnapshot.canonicalSnapshot,
351
+ comparedAt: this.now(),
352
+ isNoopCapture: false,
353
+ });
354
+ }
355
+ async getEndpointDiffDetail(input) {
356
+ await this.initialize();
357
+ const replaySnapshots = await this.resolveReplaySnapshots(input);
358
+ const targetMethod = input.method.toLowerCase();
359
+ const classified = classifyEndpointDiffs(replaySnapshots.baselineSnapshot.canonicalSnapshot, replaySnapshots.targetSnapshot.canonicalSnapshot);
360
+ const matchedChange = classified.changes.find(change => change.url === input.path && change.method === targetMethod);
361
+ if (matchedChange) {
362
+ return {
363
+ baselineSnapshotId: replaySnapshots.baselineSnapshot.id,
364
+ targetSnapshotId: replaySnapshots.targetSnapshot.id,
365
+ path: input.path,
366
+ method: targetMethod,
367
+ hasChange: true,
368
+ classification: matchedChange.classification,
369
+ changeReason: matchedChange.changeReason,
370
+ details: matchedChange.details,
371
+ before: matchedChange.before,
372
+ after: matchedChange.after,
373
+ };
374
+ }
375
+ const beforeEndpoint = replaySnapshots.baselineSnapshot.canonicalSnapshot.endpoints.find(endpoint => endpoint.path === input.path && endpoint.method === targetMethod);
376
+ const afterEndpoint = replaySnapshots.targetSnapshot.canonicalSnapshot.endpoints.find(endpoint => endpoint.path === input.path && endpoint.method === targetMethod);
377
+ if (!beforeEndpoint && !afterEndpoint) {
378
+ throw new Error(`Endpoint not found for ${targetMethod.toUpperCase()} ${input.path} in requested snapshots.`);
379
+ }
380
+ return {
381
+ baselineSnapshotId: replaySnapshots.baselineSnapshot.id,
382
+ targetSnapshotId: replaySnapshots.targetSnapshot.id,
383
+ path: input.path,
384
+ method: targetMethod,
385
+ hasChange: false,
386
+ classification: null,
387
+ changeReason: null,
388
+ details: [],
389
+ before: beforeEndpoint?.canonicalOperation ?? null,
390
+ after: afterEndpoint?.canonicalOperation ?? null,
391
+ };
392
+ }
393
+ }
394
+ //# sourceMappingURL=snapshotCaptureService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshotCaptureService.js","sourceRoot":"","sources":["../../../src/application/snapshot/snapshotCaptureService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { CanonicalEndpointSnapshot, CanonicalSnapshot } from '../../domain/canonical/canonicalSnapshot.js';
2
+ import { SnapshotDiffResult } from '../../domain/contracts/snapshotDiffContract.js';
3
+ export interface SnapshotProjectRecord {
4
+ id: string;
5
+ projectKey: string;
6
+ createdAt: string;
7
+ }
8
+ export interface SnapshotSourceRecord {
9
+ id: string;
10
+ projectId: string;
11
+ swaggerUrl: string;
12
+ createdAt: string;
13
+ }
14
+ export interface SnapshotRecord {
15
+ id: string;
16
+ sourceId: string;
17
+ specHash: string;
18
+ documentFingerprint: string;
19
+ canonicalSnapshot: CanonicalSnapshot;
20
+ capturedAt: string;
21
+ }
22
+ export interface SaveSnapshotInput {
23
+ sourceId: string;
24
+ specHash: string;
25
+ documentFingerprint: string;
26
+ canonicalSnapshot: CanonicalSnapshot;
27
+ transition?: PersistedTransitionInput;
28
+ }
29
+ export interface SaveSnapshotResult {
30
+ snapshot: SnapshotRecord;
31
+ created: boolean;
32
+ }
33
+ export interface SnapshotSourceIdentityRecord {
34
+ sourceId: string;
35
+ projectId: string;
36
+ projectKey: string;
37
+ swaggerUrl: string;
38
+ }
39
+ export interface PersistedTransitionEvent {
40
+ path: string;
41
+ method: CanonicalEndpointSnapshot['method'];
42
+ classification: SnapshotDiffResult['changes'][number]['classification'];
43
+ changeReason: string;
44
+ }
45
+ export interface PersistedTransitionInput {
46
+ baselineSnapshotId: string;
47
+ counts: SnapshotDiffResult['counts'];
48
+ warnings: SnapshotDiffResult['warnings'];
49
+ events: PersistedTransitionEvent[];
50
+ }
51
+ export interface EndpointChangeHistoryRecord {
52
+ baselineSnapshotId: string;
53
+ targetSnapshotId: string;
54
+ path: string;
55
+ method: CanonicalEndpointSnapshot['method'];
56
+ classification: SnapshotDiffResult['changes'][number]['classification'];
57
+ changeReason: string;
58
+ changedAt: string;
59
+ }
60
+ export interface ListEndpointChangeHistoryInput {
61
+ sourceId: string;
62
+ limit?: number;
63
+ path?: string;
64
+ method?: CanonicalEndpointSnapshot['method'];
65
+ }
66
+ export interface SnapshotRepository {
67
+ initializeSchema(): Promise<void>;
68
+ ensureProject(projectKey: string): Promise<SnapshotProjectRecord>;
69
+ ensureSource(projectId: string, swaggerUrl: string): Promise<SnapshotSourceRecord>;
70
+ getSourceIdentityById(sourceId: string): Promise<SnapshotSourceIdentityRecord | null>;
71
+ getLatestSnapshot(sourceId: string): Promise<SnapshotRecord | null>;
72
+ saveSnapshot(input: SaveSnapshotInput): Promise<SaveSnapshotResult>;
73
+ getSnapshotById(snapshotId: string): Promise<SnapshotRecord | null>;
74
+ listSnapshotsBySource(sourceId: string, limit?: number): Promise<SnapshotRecord[]>;
75
+ listEndpointChangeHistory(input: ListEndpointChangeHistoryInput): Promise<EndpointChangeHistoryRecord[]>;
76
+ }
77
+ //# sourceMappingURL=snapshotRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshotRepository.d.ts","sourceRoot":"","sources":["../../../src/application/snapshot/snapshotRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=snapshotRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshotRepository.js","sourceRoot":"","sources":["../../../src/application/snapshot/snapshotRepository.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ import { OpenAPIDocument } from '../../utils/types.js';
2
+ declare const HTTP_METHODS: readonly ["get", "post", "put", "patch", "delete", "head", "options", "trace"];
3
+ type CanonicalHttpMethod = (typeof HTTP_METHODS)[number];
4
+ export interface CanonicalEndpointSnapshot {
5
+ path: string;
6
+ method: CanonicalHttpMethod;
7
+ fingerprint: string;
8
+ canonicalOperation: CanonicalOperationShape;
9
+ }
10
+ export interface VersionSignal {
11
+ infoVersion: string | null;
12
+ normalizedInfoVersion: string | null;
13
+ urlVersionHints: string[];
14
+ hasVersionMismatch: boolean;
15
+ }
16
+ export interface CanonicalSnapshot {
17
+ sourceUrl: string;
18
+ documentFingerprint: string;
19
+ endpoints: CanonicalEndpointSnapshot[];
20
+ versionSignal: VersionSignal;
21
+ }
22
+ export interface CanonicalSnapshotInput {
23
+ document: OpenAPIDocument;
24
+ sourceUrl: string;
25
+ }
26
+ export interface CanonicalChangeAnalysis {
27
+ hasStructuralChanges: boolean;
28
+ hasVersionChange: boolean;
29
+ isVersionOnlyChange: boolean;
30
+ hasVersionMismatch: boolean;
31
+ }
32
+ export interface CanonicalMediaContent {
33
+ mediaType: string;
34
+ hasSchema: boolean;
35
+ schema?: unknown;
36
+ }
37
+ export interface CanonicalRequestBody {
38
+ required: boolean;
39
+ content: CanonicalMediaContent[];
40
+ }
41
+ export interface CanonicalResponse {
42
+ statusCode: string;
43
+ content: CanonicalMediaContent[];
44
+ }
45
+ export interface CanonicalParameter {
46
+ name: string;
47
+ in: string;
48
+ required: boolean;
49
+ schema?: unknown;
50
+ content?: CanonicalMediaContent[];
51
+ }
52
+ export interface CanonicalOperationShape {
53
+ parameters: CanonicalParameter[];
54
+ requestBody?: CanonicalRequestBody;
55
+ responses: CanonicalResponse[];
56
+ }
57
+ export declare function extractVersionSignal(document: OpenAPIDocument, sourceUrl: string): VersionSignal;
58
+ export declare function createCanonicalSnapshot(input: CanonicalSnapshotInput): CanonicalSnapshot;
59
+ export declare function analyzeCanonicalChange(baseline: CanonicalSnapshot, target: CanonicalSnapshot): CanonicalChangeAnalysis;
60
+ export {};
61
+ //# sourceMappingURL=canonicalSnapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonicalSnapshot.d.ts","sourceRoot":"","sources":["../../../src/domain/canonical/canonicalSnapshot.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,QAAA,MAAM,YAAY,gFAAiF,CAAC;AAMpG,KAAK,mBAAmB,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,uBAAuB,CAAC;CAC7C;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,yBAAyB,EAAE,CAAC;IACvC,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,eAAe,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,qBAAqB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,qBAAqB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,qBAAqB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,SAAS,EAAE,iBAAiB,EAAE,CAAC;CAChC;AAwSD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,CAahG;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,sBAAsB,GAAG,iBAAiB,CAgDxF;AAgBD,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,iBAAiB,GACxB,uBAAuB,CAYzB"}