@cisco_open/linting-orchestrator 1.0.0-rc.4

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 (197) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +5 -0
  3. package/README.md +43 -0
  4. package/build/cli/api-client.d.ts +170 -0
  5. package/build/cli/api-client.d.ts.map +1 -0
  6. package/build/cli/api-client.js +284 -0
  7. package/build/cli/api-client.js.map +1 -0
  8. package/build/cli/commands/agents.d.ts +7 -0
  9. package/build/cli/commands/agents.d.ts.map +1 -0
  10. package/build/cli/commands/agents.js +694 -0
  11. package/build/cli/commands/agents.js.map +1 -0
  12. package/build/cli/commands/completion.d.ts +9 -0
  13. package/build/cli/commands/completion.d.ts.map +1 -0
  14. package/build/cli/commands/completion.js +177 -0
  15. package/build/cli/commands/completion.js.map +1 -0
  16. package/build/cli/commands/config.d.ts +10 -0
  17. package/build/cli/commands/config.d.ts.map +1 -0
  18. package/build/cli/commands/config.js +284 -0
  19. package/build/cli/commands/config.js.map +1 -0
  20. package/build/cli/commands/health.d.ts +11 -0
  21. package/build/cli/commands/health.d.ts.map +1 -0
  22. package/build/cli/commands/health.js +38 -0
  23. package/build/cli/commands/health.js.map +1 -0
  24. package/build/cli/commands/help.d.ts +6 -0
  25. package/build/cli/commands/help.d.ts.map +1 -0
  26. package/build/cli/commands/help.js +20 -0
  27. package/build/cli/commands/help.js.map +1 -0
  28. package/build/cli/commands/history.d.ts +11 -0
  29. package/build/cli/commands/history.d.ts.map +1 -0
  30. package/build/cli/commands/history.js +50 -0
  31. package/build/cli/commands/history.js.map +1 -0
  32. package/build/cli/commands/jobs.d.ts +12 -0
  33. package/build/cli/commands/jobs.d.ts.map +1 -0
  34. package/build/cli/commands/jobs.js +84 -0
  35. package/build/cli/commands/jobs.js.map +1 -0
  36. package/build/cli/commands/lint.d.ts +15 -0
  37. package/build/cli/commands/lint.d.ts.map +1 -0
  38. package/build/cli/commands/lint.js +384 -0
  39. package/build/cli/commands/lint.js.map +1 -0
  40. package/build/cli/commands/ps.d.ts +8 -0
  41. package/build/cli/commands/ps.d.ts.map +1 -0
  42. package/build/cli/commands/ps.js +74 -0
  43. package/build/cli/commands/ps.js.map +1 -0
  44. package/build/cli/commands/reproduce.d.ts +9 -0
  45. package/build/cli/commands/reproduce.d.ts.map +1 -0
  46. package/build/cli/commands/reproduce.js +31 -0
  47. package/build/cli/commands/reproduce.js.map +1 -0
  48. package/build/cli/commands/reset.d.ts +5 -0
  49. package/build/cli/commands/reset.d.ts.map +1 -0
  50. package/build/cli/commands/reset.js +13 -0
  51. package/build/cli/commands/reset.js.map +1 -0
  52. package/build/cli/commands/results.d.ts +13 -0
  53. package/build/cli/commands/results.d.ts.map +1 -0
  54. package/build/cli/commands/results.js +129 -0
  55. package/build/cli/commands/results.js.map +1 -0
  56. package/build/cli/commands/rulesets/check.d.ts +12 -0
  57. package/build/cli/commands/rulesets/check.d.ts.map +1 -0
  58. package/build/cli/commands/rulesets/check.js +226 -0
  59. package/build/cli/commands/rulesets/check.js.map +1 -0
  60. package/build/cli/commands/rulesets/index.d.ts +5 -0
  61. package/build/cli/commands/rulesets/index.d.ts.map +1 -0
  62. package/build/cli/commands/rulesets/index.js +6 -0
  63. package/build/cli/commands/rulesets/index.js.map +1 -0
  64. package/build/cli/commands/rulesets/view.d.ts +16 -0
  65. package/build/cli/commands/rulesets/view.d.ts.map +1 -0
  66. package/build/cli/commands/rulesets/view.js +100 -0
  67. package/build/cli/commands/rulesets/view.js.map +1 -0
  68. package/build/cli/commands/start.d.ts +16 -0
  69. package/build/cli/commands/start.d.ts.map +1 -0
  70. package/build/cli/commands/start.js +167 -0
  71. package/build/cli/commands/start.js.map +1 -0
  72. package/build/cli/commands/status.d.ts +9 -0
  73. package/build/cli/commands/status.d.ts.map +1 -0
  74. package/build/cli/commands/status.js +46 -0
  75. package/build/cli/commands/status.js.map +1 -0
  76. package/build/cli/commands/stop.d.ts +11 -0
  77. package/build/cli/commands/stop.d.ts.map +1 -0
  78. package/build/cli/commands/stop.js +78 -0
  79. package/build/cli/commands/stop.js.map +1 -0
  80. package/build/cli/config-manager.d.ts +134 -0
  81. package/build/cli/config-manager.d.ts.map +1 -0
  82. package/build/cli/config-manager.js +288 -0
  83. package/build/cli/config-manager.js.map +1 -0
  84. package/build/cli/formatters.d.ts +62 -0
  85. package/build/cli/formatters.d.ts.map +1 -0
  86. package/build/cli/formatters.js +715 -0
  87. package/build/cli/formatters.js.map +1 -0
  88. package/build/cli/history-manager.d.ts +97 -0
  89. package/build/cli/history-manager.d.ts.map +1 -0
  90. package/build/cli/history-manager.js +201 -0
  91. package/build/cli/history-manager.js.map +1 -0
  92. package/build/cli/index.d.ts +16 -0
  93. package/build/cli/index.d.ts.map +1 -0
  94. package/build/cli/index.js +335 -0
  95. package/build/cli/index.js.map +1 -0
  96. package/build/cli/list-rulesets.d.ts +15 -0
  97. package/build/cli/list-rulesets.d.ts.map +1 -0
  98. package/build/cli/list-rulesets.js +193 -0
  99. package/build/cli/list-rulesets.js.map +1 -0
  100. package/build/cli/utils/connection-error.d.ts +9 -0
  101. package/build/cli/utils/connection-error.d.ts.map +1 -0
  102. package/build/cli/utils/connection-error.js +30 -0
  103. package/build/cli/utils/connection-error.js.map +1 -0
  104. package/build/cli/utils/embedded-server.d.ts +21 -0
  105. package/build/cli/utils/embedded-server.d.ts.map +1 -0
  106. package/build/cli/utils/embedded-server.js +61 -0
  107. package/build/cli/utils/embedded-server.js.map +1 -0
  108. package/build/cli/utils/mode-validator.d.ts +13 -0
  109. package/build/cli/utils/mode-validator.d.ts.map +1 -0
  110. package/build/cli/utils/mode-validator.js +31 -0
  111. package/build/cli/utils/mode-validator.js.map +1 -0
  112. package/build/cli/utils/port-checker.d.ts +20 -0
  113. package/build/cli/utils/port-checker.d.ts.map +1 -0
  114. package/build/cli/utils/port-checker.js +49 -0
  115. package/build/cli/utils/port-checker.js.map +1 -0
  116. package/build/config.d.ts +57 -0
  117. package/build/config.d.ts.map +1 -0
  118. package/build/config.js +527 -0
  119. package/build/config.js.map +1 -0
  120. package/build/document-accessor.d.ts +79 -0
  121. package/build/document-accessor.d.ts.map +1 -0
  122. package/build/document-accessor.js +148 -0
  123. package/build/document-accessor.js.map +1 -0
  124. package/build/formatters/reproduce-markdown.d.ts +14 -0
  125. package/build/formatters/reproduce-markdown.d.ts.map +1 -0
  126. package/build/formatters/reproduce-markdown.js +182 -0
  127. package/build/formatters/reproduce-markdown.js.map +1 -0
  128. package/build/formatters/sarif-builder.d.ts +86 -0
  129. package/build/formatters/sarif-builder.d.ts.map +1 -0
  130. package/build/formatters/sarif-builder.js +276 -0
  131. package/build/formatters/sarif-builder.js.map +1 -0
  132. package/build/index.d.ts +3 -0
  133. package/build/index.d.ts.map +1 -0
  134. package/build/index.js +174 -0
  135. package/build/index.js.map +1 -0
  136. package/build/logger.d.ts +38 -0
  137. package/build/logger.d.ts.map +1 -0
  138. package/build/logger.js +105 -0
  139. package/build/logger.js.map +1 -0
  140. package/build/mock-server.d.ts +2 -0
  141. package/build/mock-server.d.ts.map +1 -0
  142. package/build/mock-server.js +290 -0
  143. package/build/mock-server.js.map +1 -0
  144. package/build/orchestrator.d.ts +149 -0
  145. package/build/orchestrator.d.ts.map +1 -0
  146. package/build/orchestrator.js +874 -0
  147. package/build/orchestrator.js.map +1 -0
  148. package/build/ruleset-loader.d.ts +79 -0
  149. package/build/ruleset-loader.d.ts.map +1 -0
  150. package/build/ruleset-loader.js +514 -0
  151. package/build/ruleset-loader.js.map +1 -0
  152. package/build/schemas.d.ts +2568 -0
  153. package/build/schemas.d.ts.map +1 -0
  154. package/build/schemas.js +674 -0
  155. package/build/schemas.js.map +1 -0
  156. package/build/server.d.ts +39 -0
  157. package/build/server.d.ts.map +1 -0
  158. package/build/server.js +834 -0
  159. package/build/server.js.map +1 -0
  160. package/build/storage/memory-storage.d.ts +190 -0
  161. package/build/storage/memory-storage.d.ts.map +1 -0
  162. package/build/storage/memory-storage.js +629 -0
  163. package/build/storage/memory-storage.js.map +1 -0
  164. package/build/storage/redis-storage.d.ts +134 -0
  165. package/build/storage/redis-storage.d.ts.map +1 -0
  166. package/build/storage/redis-storage.js +236 -0
  167. package/build/storage/redis-storage.js.map +1 -0
  168. package/build/storage/storage-adapter.d.ts +189 -0
  169. package/build/storage/storage-adapter.d.ts.map +1 -0
  170. package/build/storage/storage-adapter.js +36 -0
  171. package/build/storage/storage-adapter.js.map +1 -0
  172. package/build/types.d.ts +981 -0
  173. package/build/types.d.ts.map +1 -0
  174. package/build/types.js +5 -0
  175. package/build/types.js.map +1 -0
  176. package/build/utils/version.d.ts +40 -0
  177. package/build/utils/version.d.ts.map +1 -0
  178. package/build/utils/version.js +94 -0
  179. package/build/utils/version.js.map +1 -0
  180. package/build/validation.d.ts +95 -0
  181. package/build/validation.d.ts.map +1 -0
  182. package/build/validation.js +150 -0
  183. package/build/validation.js.map +1 -0
  184. package/build/worker-pool.d.ts +137 -0
  185. package/build/worker-pool.d.ts.map +1 -0
  186. package/build/worker-pool.js +549 -0
  187. package/build/worker-pool.js.map +1 -0
  188. package/build/worker.d.ts +2 -0
  189. package/build/worker.d.ts.map +1 -0
  190. package/build/worker.js +427 -0
  191. package/build/worker.js.map +1 -0
  192. package/package.json +110 -0
  193. package/rulesets/CHANGELOG.md +25 -0
  194. package/rulesets/config/rulesets.yaml +96 -0
  195. package/rulesets/sources/README.md +47 -0
  196. package/rulesets/sources/example/oas-recommended/v1.0.0/ruleset.yaml +6 -0
  197. package/rulesets/sources/example/oas-recommended/v2.0.0/ruleset.yaml +14 -0
@@ -0,0 +1,629 @@
1
+ /**
2
+ * In-Memory Storage Implementation for OpenAPI Lint Orchestrator
3
+ *
4
+ * Fast, local storage implementation using JavaScript Maps.
5
+ * Suitable for development, testing, and single-instance deployments.
6
+ *
7
+ * Features:
8
+ * - Optional TTL (time-to-live) support with automatic expiration
9
+ * - Fast O(1) lookups by job ID
10
+ * - Efficient indexing by document ID for invalidation
11
+ * - Memory-efficient storage with periodic cleanup
12
+ *
13
+ * Limitations:
14
+ * - Data lost on process restart
15
+ * - Not shared across multiple instances
16
+ * - Memory usage grows with stored jobs
17
+ *
18
+ * @module storage/memory-storage
19
+ */
20
+ import { makeCompositeKey } from './storage-adapter.js';
21
+ /**
22
+ * In-memory storage implementation
23
+ *
24
+ * Uses JavaScript Maps for fast lookups and indexing.
25
+ */
26
+ export class MemoryLintStorage {
27
+ /**
28
+ * Main storage: jobId -> StorageEntry
29
+ */
30
+ jobResults = new Map();
31
+ /**
32
+ * Index: documentId -> Set of jobIds
33
+ * Used for efficient invalidation of all jobs for a document
34
+ */
35
+ documentIndex = new Map();
36
+ /**
37
+ * Index: composite key -> jobId
38
+ * Used for retrieving results by document + ruleset
39
+ */
40
+ compositeIndex = new Map();
41
+ /**
42
+ * Index: status -> Set of jobIds
43
+ * Used for efficient filtering by job status
44
+ */
45
+ statusIndex = new Map();
46
+ /**
47
+ * Index: rulesetName -> Set of jobIds
48
+ * Used for efficient filtering by ruleset
49
+ */
50
+ rulesetIndex = new Map();
51
+ /**
52
+ * Index: timestamp -> jobId (sorted)
53
+ * Used for efficient time-based filtering and sorting
54
+ */
55
+ timestampIndex = [];
56
+ /**
57
+ * TTL in milliseconds (if enabled)
58
+ */
59
+ ttlMs;
60
+ /**
61
+ * Cleanup interval timer
62
+ */
63
+ cleanupInterval;
64
+ /**
65
+ * Statistics
66
+ */
67
+ stats = {
68
+ totalStored: 0,
69
+ totalExpired: 0,
70
+ totalInvalidated: 0
71
+ };
72
+ /**
73
+ * Initialize storage with optional configuration
74
+ *
75
+ * @param options - Storage options including TTL
76
+ */
77
+ async initialize(options) {
78
+ if (options?.ttl) {
79
+ this.ttlMs = options.ttl * 1000; // Convert seconds to milliseconds
80
+ // Start periodic cleanup every minute
81
+ // Use unref() to allow process to exit if this is the only active timer
82
+ this.cleanupInterval = setInterval(() => {
83
+ this.cleanupExpired();
84
+ }, 60000);
85
+ this.cleanupInterval.unref();
86
+ }
87
+ }
88
+ /**
89
+ * Store complete job result
90
+ *
91
+ * @param result - The lint job result
92
+ */
93
+ async storeJob(result) {
94
+ const entry = {
95
+ result,
96
+ storedAt: new Date(),
97
+ expiresAt: this.ttlMs ? new Date(Date.now() + this.ttlMs) : undefined
98
+ };
99
+ // Store by job ID
100
+ this.jobResults.set(result.jobId, entry);
101
+ // Index by document ID
102
+ if (!this.documentIndex.has(result.documentId)) {
103
+ this.documentIndex.set(result.documentId, new Set());
104
+ }
105
+ this.documentIndex.get(result.documentId).add(result.jobId);
106
+ // Index by composite key (document + ruleset + version)
107
+ const compositeKey = makeCompositeKey(result.documentId, result.rulesetName, result.rulesetVersion);
108
+ this.compositeIndex.set(compositeKey, result.jobId);
109
+ // Index by status
110
+ if (!this.statusIndex.has(result.status)) {
111
+ this.statusIndex.set(result.status, new Set());
112
+ }
113
+ this.statusIndex.get(result.status).add(result.jobId);
114
+ // Index by ruleset
115
+ if (!this.rulesetIndex.has(result.rulesetName)) {
116
+ this.rulesetIndex.set(result.rulesetName, new Set());
117
+ }
118
+ this.rulesetIndex.get(result.rulesetName).add(result.jobId);
119
+ // Index by timestamp (maintain sorted order)
120
+ const timestamp = result.timestamp.getTime();
121
+ this.timestampIndex.push({ timestamp, jobId: result.jobId });
122
+ // Keep sorted by timestamp (descending - newest first)
123
+ this.timestampIndex.sort((a, b) => b.timestamp - a.timestamp);
124
+ this.stats.totalStored++;
125
+ }
126
+ /**
127
+ * Retrieve job result by job ID
128
+ *
129
+ * @param jobId - The job identifier
130
+ * @returns The job result, or null if not found or expired
131
+ */
132
+ async retrieveJobById(jobId) {
133
+ const entry = this.jobResults.get(jobId);
134
+ if (!entry) {
135
+ return null;
136
+ }
137
+ // Check if expired
138
+ if (this.isExpired(entry)) {
139
+ await this.removeEntry(jobId);
140
+ return null;
141
+ }
142
+ return entry.result;
143
+ }
144
+ /**
145
+ * Retrieve job result by document + ruleset
146
+ *
147
+ * @param documentId - The document identifier
148
+ * @param rulesetName - The ruleset name
149
+ * @param rulesetVersion - The ruleset version
150
+ * @returns The job result, or null if not found or expired
151
+ */
152
+ async retrieveJob(documentId, rulesetName, rulesetVersion) {
153
+ const compositeKey = makeCompositeKey(documentId, rulesetName, rulesetVersion);
154
+ const jobId = this.compositeIndex.get(compositeKey);
155
+ if (!jobId) {
156
+ return null;
157
+ }
158
+ return this.retrieveJobById(jobId);
159
+ }
160
+ /**
161
+ * Check if cached results exist
162
+ *
163
+ * @param documentId - The document identifier
164
+ * @param rulesetName - The ruleset name
165
+ * @param rulesetVersion - The ruleset version
166
+ * @returns True if results exist and haven't expired
167
+ */
168
+ async exists(documentId, rulesetName, rulesetVersion) {
169
+ const result = await this.retrieveJob(documentId, rulesetName, rulesetVersion);
170
+ return result !== null;
171
+ }
172
+ /**
173
+ * Invalidate all results for a document
174
+ *
175
+ * @param documentId - The document identifier
176
+ * @returns Number of invalidated jobs
177
+ */
178
+ async invalidate(documentId) {
179
+ const jobIds = this.documentIndex.get(documentId);
180
+ if (!jobIds || jobIds.size === 0) {
181
+ return 0;
182
+ }
183
+ let count = 0;
184
+ for (const jobId of jobIds) {
185
+ await this.removeEntry(jobId);
186
+ count++;
187
+ }
188
+ this.documentIndex.delete(documentId);
189
+ this.stats.totalInvalidated += count;
190
+ return count;
191
+ }
192
+ /**
193
+ * Get storage statistics
194
+ *
195
+ * @returns Storage statistics
196
+ */
197
+ async getStats() {
198
+ // Calculate total results and failure stats
199
+ let totalResults = 0;
200
+ let storageSize = 0;
201
+ let totalFailed = 0;
202
+ let totalTimeout = 0;
203
+ let totalCompleted = 0;
204
+ for (const entry of this.jobResults.values()) {
205
+ totalResults += entry.result.results.length;
206
+ // Rough estimate of storage size
207
+ storageSize += JSON.stringify(entry.result).length;
208
+ // Track failure statistics
209
+ if (entry.result.status === 'failed') {
210
+ totalFailed++;
211
+ }
212
+ else if (entry.result.status === 'timeout') {
213
+ totalTimeout++;
214
+ }
215
+ else if (entry.result.status === 'completed' || entry.result.status === 'completed_with_errors') {
216
+ totalCompleted++;
217
+ }
218
+ }
219
+ const totalJobs = this.jobResults.size;
220
+ const failureRate = totalJobs > 0 ? (totalFailed + totalTimeout) / totalJobs : 0;
221
+ return {
222
+ totalJobs,
223
+ totalResults,
224
+ storageSize,
225
+ expiredEntries: this.stats.totalExpired,
226
+ failureStats: {
227
+ totalFailed,
228
+ totalTimeout,
229
+ totalCompleted,
230
+ failureRate
231
+ },
232
+ totalStored: this.stats.totalStored,
233
+ totalInvalidated: this.stats.totalInvalidated,
234
+ activeJobs: this.jobResults.size,
235
+ indexedDocuments: this.documentIndex.size,
236
+ compositeKeys: this.compositeIndex.size
237
+ };
238
+ }
239
+ /**
240
+ * Clear all stored data
241
+ *
242
+ * @returns Number of jobs cleared
243
+ */
244
+ async clear() {
245
+ const count = this.jobResults.size;
246
+ this.jobResults.clear();
247
+ this.documentIndex.clear();
248
+ this.compositeIndex.clear();
249
+ this.statusIndex.clear();
250
+ this.rulesetIndex.clear();
251
+ this.timestampIndex = [];
252
+ return count;
253
+ }
254
+ /**
255
+ * Close storage and cleanup resources
256
+ */
257
+ async close() {
258
+ if (this.cleanupInterval) {
259
+ clearInterval(this.cleanupInterval);
260
+ this.cleanupInterval = undefined;
261
+ }
262
+ // Final cleanup
263
+ await this.clear();
264
+ }
265
+ /**
266
+ * Check if entry has expired
267
+ *
268
+ * @param entry - Storage entry
269
+ * @returns True if expired
270
+ */
271
+ isExpired(entry) {
272
+ if (!entry.expiresAt) {
273
+ return false;
274
+ }
275
+ return Date.now() > entry.expiresAt.getTime();
276
+ }
277
+ /**
278
+ * Remove a single entry and update indexes
279
+ *
280
+ * @param jobId - Job identifier
281
+ */
282
+ async removeEntry(jobId) {
283
+ const entry = this.jobResults.get(jobId);
284
+ if (!entry) {
285
+ return;
286
+ }
287
+ const result = entry.result;
288
+ // Remove from main storage
289
+ this.jobResults.delete(jobId);
290
+ // Remove from document index
291
+ const documentJobs = this.documentIndex.get(result.documentId);
292
+ if (documentJobs) {
293
+ documentJobs.delete(jobId);
294
+ if (documentJobs.size === 0) {
295
+ this.documentIndex.delete(result.documentId);
296
+ }
297
+ }
298
+ // Remove from composite index
299
+ const compositeKey = makeCompositeKey(result.documentId, result.rulesetName, result.rulesetVersion);
300
+ // Only remove if this job is the current entry for this composite key
301
+ if (this.compositeIndex.get(compositeKey) === jobId) {
302
+ this.compositeIndex.delete(compositeKey);
303
+ }
304
+ // Remove from status index
305
+ const statusJobs = this.statusIndex.get(result.status);
306
+ if (statusJobs) {
307
+ statusJobs.delete(jobId);
308
+ if (statusJobs.size === 0) {
309
+ this.statusIndex.delete(result.status);
310
+ }
311
+ }
312
+ // Remove from ruleset index
313
+ const rulesetJobs = this.rulesetIndex.get(result.rulesetName);
314
+ if (rulesetJobs) {
315
+ rulesetJobs.delete(jobId);
316
+ if (rulesetJobs.size === 0) {
317
+ this.rulesetIndex.delete(result.rulesetName);
318
+ }
319
+ }
320
+ // Remove from timestamp index
321
+ const timestampIdx = this.timestampIndex.findIndex(item => item.jobId === jobId);
322
+ if (timestampIdx !== -1) {
323
+ this.timestampIndex.splice(timestampIdx, 1);
324
+ }
325
+ if (this.isExpired(entry)) {
326
+ this.stats.totalExpired++;
327
+ }
328
+ }
329
+ /**
330
+ * Clean up expired entries
331
+ *
332
+ * Called periodically when TTL is enabled.
333
+ *
334
+ * @returns Number of entries cleaned up
335
+ */
336
+ cleanupExpired() {
337
+ if (!this.ttlMs) {
338
+ return 0;
339
+ }
340
+ let count = 0;
341
+ const jobsToRemove = [];
342
+ // Find expired entries
343
+ for (const [jobId, entry] of this.jobResults.entries()) {
344
+ if (this.isExpired(entry)) {
345
+ jobsToRemove.push(jobId);
346
+ }
347
+ }
348
+ // Remove them
349
+ for (const jobId of jobsToRemove) {
350
+ this.removeEntry(jobId);
351
+ count++;
352
+ }
353
+ return count;
354
+ }
355
+ /**
356
+ * List jobs with filtering and pagination
357
+ *
358
+ * @param options - Filter and pagination options
359
+ * @returns Array of job summaries (lightweight, documentId only)
360
+ */
361
+ async listJobs(options = {}) {
362
+ const { status, documentId, rulesetName, startDate, endDate,
363
+ // sessionId, // Future: filter by runtime session ID
364
+ limit = 50, offset = 0, sortBy = 'timestamp', sortOrder = 'desc' } = options;
365
+ // Start with all job IDs
366
+ let candidateJobIds = new Set(this.jobResults.keys());
367
+ // Apply filters using indexes for efficiency
368
+ if (status) {
369
+ const statusArray = Array.isArray(status) ? status : [status];
370
+ const statusMatches = new Set();
371
+ for (const s of statusArray) {
372
+ const jobIds = this.statusIndex.get(s);
373
+ if (jobIds) {
374
+ jobIds.forEach(id => statusMatches.add(id));
375
+ }
376
+ }
377
+ candidateJobIds = new Set([...candidateJobIds].filter(id => statusMatches.has(id)));
378
+ }
379
+ if (documentId) {
380
+ const docJobs = this.documentIndex.get(documentId) || new Set();
381
+ candidateJobIds = new Set([...candidateJobIds].filter(id => docJobs.has(id)));
382
+ }
383
+ if (rulesetName) {
384
+ const rulesetJobs = this.rulesetIndex.get(rulesetName) || new Set();
385
+ candidateJobIds = new Set([...candidateJobIds].filter(id => rulesetJobs.has(id)));
386
+ }
387
+ // Filter by date range and sessionId (requires full scan of candidates)
388
+ const filteredResults = [];
389
+ for (const jobId of candidateJobIds) {
390
+ const entry = this.jobResults.get(jobId);
391
+ if (!entry || this.isExpired(entry)) {
392
+ continue;
393
+ }
394
+ const result = entry.result;
395
+ // Date range filter
396
+ if (startDate && result.timestamp < startDate)
397
+ continue;
398
+ if (endDate && result.timestamp > endDate)
399
+ continue;
400
+ // Session ID filter (if provided)
401
+ // Note: sessionId would need to be added to LintJobResult in future
402
+ // For now, we skip this filter
403
+ // if (sessionId && result.sessionId !== sessionId) continue;
404
+ filteredResults.push(result);
405
+ }
406
+ // Sort results
407
+ filteredResults.sort((a, b) => {
408
+ let comparison = 0;
409
+ switch (sortBy) {
410
+ case 'timestamp':
411
+ comparison = a.timestamp.getTime() - b.timestamp.getTime();
412
+ break;
413
+ case 'status':
414
+ comparison = a.status.localeCompare(b.status);
415
+ break;
416
+ case 'documentId':
417
+ comparison = a.documentId.localeCompare(b.documentId);
418
+ break;
419
+ case 'rulesetName':
420
+ comparison = a.rulesetName.localeCompare(b.rulesetName);
421
+ break;
422
+ }
423
+ return sortOrder === 'desc' ? -comparison : comparison;
424
+ });
425
+ // Apply pagination
426
+ const paginatedResults = filteredResults.slice(offset, offset + limit);
427
+ // Convert to JobSummary (lightweight, documentId only)
428
+ return paginatedResults.map(result => ({
429
+ jobId: result.jobId,
430
+ documentId: result.documentId, // ID only, no metadata
431
+ rulesetName: result.rulesetName,
432
+ rulesetVersion: result.rulesetVersion,
433
+ status: result.status,
434
+ timestamp: result.timestamp,
435
+ totalExecutionTime: result.totalExecutionTime,
436
+ summary: result.summary
437
+ }));
438
+ }
439
+ /**
440
+ * Get lint activity for a specific document
441
+ *
442
+ * @param documentId - The document identifier
443
+ * @returns Document lint activity summary
444
+ */
445
+ async getDocumentLintActivity(documentId) {
446
+ const jobIds = this.documentIndex.get(documentId);
447
+ if (!jobIds || jobIds.size === 0) {
448
+ return null;
449
+ }
450
+ const jobsByStatus = {};
451
+ const jobsByRuleset = {};
452
+ let lastLintedAt;
453
+ let totalJobs = 0;
454
+ for (const jobId of jobIds) {
455
+ const entry = this.jobResults.get(jobId);
456
+ if (!entry || this.isExpired(entry)) {
457
+ continue;
458
+ }
459
+ const result = entry.result;
460
+ totalJobs++;
461
+ // Track by status
462
+ jobsByStatus[result.status] = (jobsByStatus[result.status] || 0) + 1;
463
+ // Track by ruleset
464
+ jobsByRuleset[result.rulesetName] = (jobsByRuleset[result.rulesetName] || 0) + 1;
465
+ // Track most recent lint
466
+ if (!lastLintedAt || result.timestamp > lastLintedAt) {
467
+ lastLintedAt = result.timestamp;
468
+ }
469
+ }
470
+ return {
471
+ documentId,
472
+ totalJobs,
473
+ lastLintedAt,
474
+ jobsByStatus: jobsByStatus,
475
+ jobsByRuleset
476
+ };
477
+ }
478
+ /**
479
+ * Get all job IDs for a document (for testing/debugging)
480
+ *
481
+ * @param documentId - Document identifier
482
+ * @returns Set of job IDs
483
+ */
484
+ getJobsForDocument(documentId) {
485
+ return this.documentIndex.get(documentId) || new Set();
486
+ }
487
+ /**
488
+ * Get all stored job IDs (for testing/debugging)
489
+ *
490
+ * @returns Array of job IDs
491
+ */
492
+ getAllJobIds() {
493
+ return Array.from(this.jobResults.keys());
494
+ }
495
+ // ============================================
496
+ // Paginated Result Queries
497
+ // ============================================
498
+ /**
499
+ * Filter issues based on query options
500
+ */
501
+ filterIssues(issues, options) {
502
+ let filtered = issues;
503
+ if (options.severity !== undefined) {
504
+ filtered = filtered.filter(i => i.severity === options.severity);
505
+ }
506
+ if (options.rule) {
507
+ filtered = filtered.filter(i => i.ruleId === options.rule || i.code === options.rule);
508
+ }
509
+ if (options.pathPrefix) {
510
+ const prefix = options.pathPrefix;
511
+ filtered = filtered.filter(i => {
512
+ const pathStr = i.path.join('.');
513
+ return pathStr.startsWith(prefix);
514
+ });
515
+ }
516
+ return filtered;
517
+ }
518
+ /**
519
+ * Retrieve job results with pagination and filtering
520
+ */
521
+ async queryJobResults(jobId, options) {
522
+ const entry = this.jobResults.get(jobId);
523
+ if (!entry)
524
+ return null;
525
+ if (this.isExpired(entry)) {
526
+ await this.removeEntry(jobId);
527
+ return null;
528
+ }
529
+ const result = entry.result;
530
+ const hasFilters = options.severity !== undefined || options.rule !== undefined || options.pathPrefix !== undefined;
531
+ const hasPagination = options.offset !== undefined || options.limit !== undefined;
532
+ // Apply filters
533
+ const filtered = hasFilters ? this.filterIssues(result.results, options) : result.results;
534
+ const totalMatching = filtered.length;
535
+ // Apply pagination
536
+ const offset = options.offset ?? 0;
537
+ const limit = options.limit ?? filtered.length;
538
+ const paginated = filtered.slice(offset, offset + limit);
539
+ const response = {
540
+ jobId: result.jobId,
541
+ documentId: result.documentId,
542
+ rulesetName: result.rulesetName,
543
+ rulesetVersion: result.rulesetVersion,
544
+ status: result.status,
545
+ timestamp: result.timestamp,
546
+ totalExecutionTime: result.totalExecutionTime,
547
+ summary: result.summary,
548
+ results: paginated,
549
+ };
550
+ if (hasPagination) {
551
+ response.pagination = {
552
+ offset,
553
+ limit,
554
+ returned: paginated.length,
555
+ totalMatching,
556
+ hasMore: offset + paginated.length < totalMatching,
557
+ };
558
+ }
559
+ if (hasFilters) {
560
+ response.filters = {
561
+ severity: options.severity ?? null,
562
+ rule: options.rule ?? null,
563
+ pathPrefix: options.pathPrefix ?? null,
564
+ };
565
+ }
566
+ if (result.truncated) {
567
+ response.truncated = result.truncated;
568
+ response.truncationInfo = result.truncationInfo;
569
+ }
570
+ return response;
571
+ }
572
+ /**
573
+ * Get aggregated statistics for a job's lint results
574
+ */
575
+ async getJobStats(jobId) {
576
+ const entry = this.jobResults.get(jobId);
577
+ if (!entry)
578
+ return null;
579
+ if (this.isExpired(entry)) {
580
+ await this.removeEntry(jobId);
581
+ return null;
582
+ }
583
+ const result = entry.result;
584
+ const issues = result.results;
585
+ // Build rule breakdown: count issues per rule, track severity
586
+ const ruleMap = new Map();
587
+ for (const issue of issues) {
588
+ const rule = issue.ruleId || issue.code;
589
+ const existing = ruleMap.get(rule);
590
+ if (existing) {
591
+ existing.count++;
592
+ }
593
+ else {
594
+ ruleMap.set(rule, { count: 1, severity: issue.severity });
595
+ }
596
+ }
597
+ const ruleBreakdown = Array.from(ruleMap.entries())
598
+ .map(([rule, data]) => ({ rule, count: data.count, severity: data.severity }))
599
+ .sort((a, b) => b.count - a.count);
600
+ // Build top paths: group by first 2 path segments (e.g., "paths./pets")
601
+ const pathMap = new Map();
602
+ for (const issue of issues) {
603
+ if (issue.path.length >= 2) {
604
+ const prefix = issue.path.slice(0, 2).join('.');
605
+ pathMap.set(prefix, (pathMap.get(prefix) || 0) + 1);
606
+ }
607
+ }
608
+ const topPaths = Array.from(pathMap.entries())
609
+ .map(([pathPrefix, count]) => ({ pathPrefix, count }))
610
+ .sort((a, b) => b.count - a.count)
611
+ .slice(0, 20); // Top 20 paths
612
+ const stats = {
613
+ jobId: result.jobId,
614
+ documentId: result.documentId,
615
+ rulesetName: result.rulesetName,
616
+ rulesetVersion: result.rulesetVersion,
617
+ status: result.status,
618
+ summary: result.summary,
619
+ ruleBreakdown,
620
+ topPaths,
621
+ };
622
+ if (result.truncated) {
623
+ stats.truncated = result.truncated;
624
+ stats.truncationInfo = result.truncationInfo;
625
+ }
626
+ return stats;
627
+ }
628
+ }
629
+ //# sourceMappingURL=memory-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-storage.js","sourceRoot":"","sources":["../../src/storage/memory-storage.ts"],"names":[],"mappings":"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"}