@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,527 @@
1
+ // Copyright 2026 Cisco Systems, Inc. and its affiliates
2
+ //
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ /**
5
+ * Configuration loader for OpenAPI Lint Orchestrator
6
+ *
7
+ * Zero-config by default with sensible defaults
8
+ * Optional YAML file for advanced configuration
9
+ * Environment variable overrides always available
10
+ */
11
+ import 'dotenv/config'; // Load .env file before any config loading
12
+ import { readFile } from 'fs/promises';
13
+ import { parse as parseYaml } from 'yaml';
14
+ import path from 'path';
15
+ import { fileURLToPath } from 'url';
16
+ import os from 'os';
17
+ // Resolve installation directory for default paths
18
+ const __filename = fileURLToPath(import.meta.url);
19
+ const __dirname = path.dirname(__filename);
20
+ const INSTALL_DIR = path.resolve(__dirname, '..');
21
+ /**
22
+ * Resolve a resolver module name to its absolute file path.
23
+ * Module lives in `{packageRoot}/resolvers/{name}.js`.
24
+ * Returns `undefined` if `name` is falsy (disabled).
25
+ */
26
+ export function resolveResolverPath(name) {
27
+ if (!name)
28
+ return undefined;
29
+ // INSTALL_DIR is the package root (one level above build/)
30
+ return path.resolve(INSTALL_DIR, 'resolvers', `${name}.js`);
31
+ }
32
+ /**
33
+ * Resolve the orchestrator home directory.
34
+ * SPECTIFY_HOME env var overrides the default ~/.spectify.
35
+ * Used as the base for all runtime data (uploads, reports, config).
36
+ */
37
+ export function spectifyHome() {
38
+ return process.env.SPECTIFY_HOME || path.join(os.homedir(), '.spectify');
39
+ }
40
+ /**
41
+ * Default configuration (zero-config defaults)
42
+ */
43
+ const DEFAULT_CONFIG = {
44
+ server: {
45
+ port: 3003,
46
+ host: '0.0.0.0',
47
+ maxDocumentSizeMB: 20 // 20MB default for large OpenAPI documents
48
+ },
49
+ documentStore: {
50
+ type: 'local',
51
+ baseDir: './uploads',
52
+ fallbackHttp: 'http://localhost:3002'
53
+ },
54
+ workerPool: {
55
+ minWorkersPerRuleset: 1,
56
+ maxWorkersPerRuleset: 2,
57
+ totalMaxWorkers: 15,
58
+ taskTimeout: 30000,
59
+ maxRetries: 2,
60
+ workerWaitTimeout: 30000, // Max ms to wait for a busy worker to become ready
61
+ scaleUpThreshold: 10,
62
+ scaleDownThreshold: 1,
63
+ exponentialBackoff: {
64
+ initialDelay: 1000,
65
+ maxDelay: 30000,
66
+ multiplier: 2
67
+ },
68
+ documentCache: {
69
+ enabled: true,
70
+ maxDocumentsPerWorker: 1,
71
+ maxCacheSizePerWorker: 52428800, // 50MB
72
+ evictAfterMinutes: 5
73
+ }
74
+ },
75
+ rulesets: {
76
+ directory: path.join(INSTALL_DIR, 'rulesets'),
77
+ defaultVersion: 'latest',
78
+ cacheEnabled: true
79
+ },
80
+ storage: {
81
+ type: 'memory'
82
+ },
83
+ logging: {
84
+ level: 'info',
85
+ format: 'json',
86
+ destination: 'console'
87
+ },
88
+ resolver: 'ignore-external-refs'
89
+ };
90
+ /**
91
+ * Load configuration from optional file or use defaults
92
+ */
93
+ export async function loadConfig(configPath) {
94
+ let config = JSON.parse(JSON.stringify(DEFAULT_CONFIG)); // Deep clone
95
+ // If config file provided via --config flag, load it
96
+ if (configPath) {
97
+ try {
98
+ const configContent = await readFile(configPath, 'utf-8');
99
+ const fileConfig = parseYaml(configContent);
100
+ config = mergeConfig(config, fileConfig);
101
+ }
102
+ catch (error) {
103
+ console.warn(`Warning: Could not load config file ${configPath}, using defaults`);
104
+ }
105
+ }
106
+ // Apply environment variable overrides (always available)
107
+ applyEnvOverrides(config);
108
+ // Auto-detect CPU-based limits
109
+ applyAutoDetection(config);
110
+ // Resolve rulesets directory relative to binary location if relative path
111
+ resolveRulesetsDirectory(config);
112
+ return config;
113
+ }
114
+ /**
115
+ * Deep merge two configuration objects
116
+ */
117
+ function mergeConfig(base, override) {
118
+ const result = { ...base };
119
+ for (const key in override) {
120
+ if (override[key] && typeof override[key] === 'object' && !Array.isArray(override[key])) {
121
+ result[key] = mergeConfig(base[key] || {}, override[key]);
122
+ }
123
+ else {
124
+ result[key] = override[key];
125
+ }
126
+ }
127
+ return result;
128
+ }
129
+ /**
130
+ * Resolve rulesets directory to absolute path
131
+ * If relative path, resolve relative to the binary location (build/ directory)
132
+ * This allows spectifyd to run from any directory
133
+ */
134
+ function resolveRulesetsDirectory(config) {
135
+ const rulesetsDir = config.rulesets.directory;
136
+ // If already absolute, leave it
137
+ if (path.isAbsolute(rulesetsDir)) {
138
+ return;
139
+ }
140
+ // Get the directory containing this config module
141
+ // In production: /path/to/spectify/build/config.js
142
+ // We want: /path/to/spectify/rulesets
143
+ const moduleDir = new URL('.', import.meta.url).pathname;
144
+ const projectRoot = path.resolve(moduleDir, '..');
145
+ const absoluteRulesetsDir = path.resolve(projectRoot, rulesetsDir);
146
+ config.rulesets.directory = absoluteRulesetsDir;
147
+ }
148
+ /**
149
+ * Get default pending reports directory based on environment
150
+ * Production: ~/.spectify/reports/pending
151
+ * Development: ./pending-reports (local to project)
152
+ */
153
+ function getPendingDir() {
154
+ if (process.env.SPECTIFYD_REPORTS_PENDING_DIR) {
155
+ return process.env.SPECTIFYD_REPORTS_PENDING_DIR;
156
+ }
157
+ return path.join(spectifyHome(), 'reports', 'pending');
158
+ }
159
+ /**
160
+ * Get reports-service mode with auto-detection from deployment context
161
+ */
162
+ function getReportServiceMode(deploymentMode) {
163
+ return deploymentMode;
164
+ }
165
+ /**
166
+ * Determine if the daemon should stop on linting-reporting-service unavailability
167
+ * Mode-based defaults:
168
+ * - Light mode: false (optional, continue if unavailable)
169
+ * - Companion/Standalone: true (required, fail if unavailable)
170
+ */
171
+ function getStopIfUnavailable(mode) {
172
+ // Environment override takes precedence
173
+ if (process.env.SPECTIFYD_REPORTS_STOP_IF_UNAVAILABLE !== undefined) {
174
+ return process.env.SPECTIFYD_REPORTS_STOP_IF_UNAVAILABLE === 'true';
175
+ }
176
+ // Mode-based defaults:
177
+ // - Light mode: optional (continue if unavailable)
178
+ // - Companion/Standalone: required (fail if unavailable)
179
+ return mode === 'companion' || mode === 'standalone';
180
+ }
181
+ /**
182
+ * Apply environment variable overrides
183
+ *
184
+ * Daemon-side env vars are prefixed SPECTIFYD_*. Client-side connection
185
+ * config for the linting reporting service is prefixed
186
+ * SPECTIFYD_REPORTS_* (the reports service itself reads SPECTIFYR_*).
187
+ */
188
+ function applyEnvOverrides(config) {
189
+ // Rulesets directory (allow override via environment)
190
+ if (process.env.SPECTIFYD_RULESETS_DIR) {
191
+ config.rulesets.directory = process.env.SPECTIFYD_RULESETS_DIR;
192
+ }
193
+ // Server configuration
194
+ if (process.env.SPECTIFYD_PORT) {
195
+ config.server.port = parseInt(process.env.SPECTIFYD_PORT, 10);
196
+ }
197
+ if (process.env.SPECTIFYD_HOST) {
198
+ config.server.host = process.env.SPECTIFYD_HOST;
199
+ }
200
+ // Document store
201
+ if (process.env.SPECTIFYD_DOCUMENT_STORE_TYPE) {
202
+ config.documentStore.type = process.env.SPECTIFYD_DOCUMENT_STORE_TYPE;
203
+ }
204
+ if (process.env.SPECTIFYD_DOCUMENT_STORE_DIR) {
205
+ config.documentStore.baseDir = process.env.SPECTIFYD_DOCUMENT_STORE_DIR;
206
+ }
207
+ else {
208
+ // Default to SPECTIFY_HOME/uploads rather than ./uploads
209
+ config.documentStore.baseDir = path.join(spectifyHome(), 'uploads');
210
+ }
211
+ if (process.env.SPECTIFYD_DOCUMENT_STORE_FALLBACK_HTTP) {
212
+ config.documentStore.fallbackHttp = process.env.SPECTIFYD_DOCUMENT_STORE_FALLBACK_HTTP;
213
+ }
214
+ // Worker pool
215
+ if (process.env.SPECTIFYD_MIN_WORKERS_PER_RULESET) {
216
+ config.workerPool.minWorkersPerRuleset = parseInt(process.env.SPECTIFYD_MIN_WORKERS_PER_RULESET, 10);
217
+ }
218
+ if (process.env.SPECTIFYD_MAX_WORKERS_PER_RULESET) {
219
+ config.workerPool.maxWorkersPerRuleset = parseInt(process.env.SPECTIFYD_MAX_WORKERS_PER_RULESET, 10);
220
+ }
221
+ if (process.env.SPECTIFYD_TOTAL_MAX_WORKERS) {
222
+ config.workerPool.totalMaxWorkers = parseInt(process.env.SPECTIFYD_TOTAL_MAX_WORKERS, 10);
223
+ }
224
+ if (process.env.SPECTIFYD_WORKER_TIMEOUT) {
225
+ config.workerPool.taskTimeout = parseInt(process.env.SPECTIFYD_WORKER_TIMEOUT, 10);
226
+ }
227
+ if (process.env.SPECTIFYD_WORKER_WAIT_TIMEOUT) {
228
+ config.workerPool.workerWaitTimeout = parseInt(process.env.SPECTIFYD_WORKER_WAIT_TIMEOUT, 10);
229
+ }
230
+ // Document cache
231
+ if (process.env.SPECTIFYD_DOCUMENT_CACHE_ENABLED) {
232
+ config.workerPool.documentCache.enabled = process.env.SPECTIFYD_DOCUMENT_CACHE_ENABLED === 'true';
233
+ }
234
+ // Storage
235
+ if (process.env.SPECTIFYD_STORAGE_TYPE) {
236
+ config.storage.type = process.env.SPECTIFYD_STORAGE_TYPE;
237
+ }
238
+ if (process.env.SPECTIFYD_REDIS_URL) {
239
+ config.storage.connectionString = process.env.SPECTIFYD_REDIS_URL;
240
+ }
241
+ // Logging
242
+ if (process.env.SPECTIFYD_LOG_LEVEL) {
243
+ config.logging.level = process.env.SPECTIFYD_LOG_LEVEL;
244
+ }
245
+ if (process.env.SPECTIFYD_LOG_FORMAT) {
246
+ config.logging.format = process.env.SPECTIFYD_LOG_FORMAT;
247
+ }
248
+ // Resolver (custom $ref resolver module name)
249
+ if (process.env.SPECTIFYD_RESOLVER !== undefined) {
250
+ config.resolver = process.env.SPECTIFYD_RESOLVER;
251
+ }
252
+ // Linting reporting service integration (client-side connection config)
253
+ if (process.env.SPECTIFYD_REPORTS_ENABLED === 'true') {
254
+ // Get deployment mode from config (will be set by factory functions)
255
+ const deploymentMode = config.mode || 'standalone';
256
+ const mode = getReportServiceMode(deploymentMode);
257
+ config.reportService = {
258
+ enabled: true,
259
+ url: process.env.SPECTIFYD_REPORTS_URL || 'http://localhost:3010',
260
+ apiKey: process.env.SPECTIFYD_REPORTS_API_KEY || '',
261
+ mode,
262
+ timeout: parseInt(process.env.SPECTIFYD_REPORTS_TIMEOUT || '5000', 10),
263
+ maxRetries: parseInt(process.env.SPECTIFYD_REPORTS_MAX_RETRIES || '3', 10),
264
+ baseRetryDelay: parseInt(process.env.SPECTIFYD_REPORTS_BASE_RETRY_DELAY || '1000', 10),
265
+ pendingDir: getPendingDir(),
266
+ enableRetryJob: process.env.SPECTIFYD_REPORTS_RETRY_JOB_ENABLED !== 'false',
267
+ retryJobInterval: parseInt(process.env.SPECTIFYD_REPORTS_RETRY_JOB_INTERVAL || '300000', 10),
268
+ stopIfUnavailable: getStopIfUnavailable(mode),
269
+ };
270
+ }
271
+ else if (process.env.SPECTIFYD_REPORTS_ENABLED === 'false') {
272
+ config.reportService = undefined;
273
+ }
274
+ // If SPECTIFYD_REPORTS_ENABLED not set, leave as undefined (not configured)
275
+ }
276
+ /**
277
+ * Auto-detect optimal worker pool size based on CPU cores
278
+ */
279
+ function applyAutoDetection(config) {
280
+ const cpuCount = os.cpus().length;
281
+ // Auto-detect total max workers if not explicitly set
282
+ // Use 75% of CPU cores, capped at configured max
283
+ const autoDetectedMax = Math.max(4, Math.floor(cpuCount * 0.75));
284
+ const configuredMax = config.workerPool.totalMaxWorkers || 15;
285
+ // Use the minimum of auto-detected and configured
286
+ config.workerPool.totalMaxWorkers = Math.min(autoDetectedMax, configuredMax);
287
+ // Adjust max workers per ruleset to be reasonable
288
+ const maxPerRuleset = config.workerPool.maxWorkersPerRuleset || 2;
289
+ // Ensure we can support at least 3-4 rulesets concurrently
290
+ const minTotalForRulesets = maxPerRuleset * 4;
291
+ if (config.workerPool.totalMaxWorkers < minTotalForRulesets) {
292
+ console.warn(`Warning: totalMaxWorkers (${config.workerPool.totalMaxWorkers}) may be too low. ` +
293
+ `Recommended: at least ${minTotalForRulesets} for ${maxPerRuleset} workers per ruleset × 4 rulesets`);
294
+ }
295
+ }
296
+ /**
297
+ * Validate configuration
298
+ */
299
+ export function validateConfig(config) {
300
+ if (config.server.port < 1 || config.server.port > 65535) {
301
+ throw new Error(`Invalid port: ${config.server.port}`);
302
+ }
303
+ if (config.workerPool.minWorkersPerRuleset < 1) {
304
+ throw new Error('minWorkersPerRuleset must be at least 1');
305
+ }
306
+ if (config.workerPool.maxWorkersPerRuleset < config.workerPool.minWorkersPerRuleset) {
307
+ throw new Error('maxWorkersPerRuleset must be >= minWorkersPerRuleset');
308
+ }
309
+ if (config.workerPool.totalMaxWorkers < config.workerPool.maxWorkersPerRuleset) {
310
+ throw new Error('totalMaxWorkers must be >= maxWorkersPerRuleset');
311
+ }
312
+ if (config.workerPool.taskTimeout < 1000) {
313
+ throw new Error('taskTimeout must be at least 1000ms');
314
+ }
315
+ if (config.workerPool.workerWaitTimeout < 1000) {
316
+ throw new Error('workerWaitTimeout must be at least 1000ms');
317
+ }
318
+ if (!['memory', 'redis', 'custom'].includes(config.storage.type)) {
319
+ throw new Error(`Invalid storage type: ${config.storage.type}`);
320
+ }
321
+ if (!['local', 'passthrough', 'filesystem', 'http', 'hybrid'].includes(config.documentStore.type)) {
322
+ throw new Error(`Invalid documentStore type: ${config.documentStore.type}`);
323
+ }
324
+ }
325
+ /**
326
+ * Get configuration summary for logging
327
+ */
328
+ export function getConfigSummary(config) {
329
+ return {
330
+ port: config.server.port,
331
+ workerPool: {
332
+ minPerRuleset: config.workerPool.minWorkersPerRuleset,
333
+ maxPerRuleset: config.workerPool.maxWorkersPerRuleset,
334
+ totalMax: config.workerPool.totalMaxWorkers,
335
+ timeout: config.workerPool.taskTimeout,
336
+ cacheEnabled: config.workerPool.documentCache.enabled
337
+ },
338
+ storage: config.storage.type,
339
+ documentStore: config.documentStore.type,
340
+ logging: config.logging.level
341
+ };
342
+ }
343
+ /**
344
+ * Create lightweight configuration for embedded mode
345
+ *
346
+ * Used by CLI when starting embedded server
347
+ * Optimized for single-user, developer laptop use
348
+ */
349
+ export function createEmbeddedModeConfig(overrides) {
350
+ const homeDir = os.homedir();
351
+ const config = {
352
+ mode: 'embedded',
353
+ server: {
354
+ port: 3005, // Separate port for embedded mode (avoid conflict with standalone)
355
+ host: '0.0.0.0',
356
+ maxDocumentSizeMB: 20
357
+ },
358
+ documentStore: {
359
+ type: 'local',
360
+ baseDir: `${homeDir}/.spectify/uploads`,
361
+ fallbackHttp: 'http://localhost:3002'
362
+ },
363
+ workerPool: {
364
+ minWorkersPerRuleset: 1,
365
+ maxWorkersPerRuleset: 2,
366
+ totalMaxWorkers: 10, // Lighter footprint for laptops
367
+ taskTimeout: 30000,
368
+ maxRetries: 2,
369
+ workerWaitTimeout: 30000,
370
+ scaleUpThreshold: 10,
371
+ scaleDownThreshold: 1,
372
+ exponentialBackoff: {
373
+ initialDelay: 1000,
374
+ maxDelay: 30000,
375
+ multiplier: 2
376
+ },
377
+ documentCache: {
378
+ enabled: true,
379
+ maxDocumentsPerWorker: 1,
380
+ maxCacheSizePerWorker: 52428800, // 50MB
381
+ evictAfterMinutes: 5
382
+ }
383
+ },
384
+ rulesets: {
385
+ directory: path.join(INSTALL_DIR, 'rulesets'),
386
+ defaultVersion: 'latest',
387
+ cacheEnabled: true
388
+ },
389
+ storage: {
390
+ type: 'memory' // No persistence needed in embedded mode
391
+ },
392
+ logging: {
393
+ level: 'info',
394
+ format: 'text',
395
+ destination: 'console'
396
+ }
397
+ };
398
+ // Apply overrides
399
+ if (overrides) {
400
+ return mergeConfig(config, overrides);
401
+ }
402
+ return config;
403
+ }
404
+ /**
405
+ * Create production configuration for standalone server mode
406
+ *
407
+ * Used when running spectifyd as dedicated process
408
+ * Optimized for production, multi-user, always-on deployments
409
+ * Document store defaults to ~/.spectify/uploads (user home directory)
410
+ */
411
+ export function createStandaloneModeConfig(overrides) {
412
+ const homeDir = os.homedir();
413
+ const config = {
414
+ mode: 'standalone',
415
+ server: {
416
+ port: 3003,
417
+ host: '0.0.0.0',
418
+ maxDocumentSizeMB: 20
419
+ },
420
+ documentStore: {
421
+ type: 'local',
422
+ baseDir: `${homeDir}/.spectify/uploads`, // Default to user's home directory
423
+ fallbackHttp: 'http://localhost:3002'
424
+ },
425
+ workerPool: {
426
+ minWorkersPerRuleset: 2,
427
+ maxWorkersPerRuleset: 10,
428
+ totalMaxWorkers: 40, // Production-grade capacity (see docs/SCALABILITY.md)
429
+ taskTimeout: 30000,
430
+ maxRetries: 3,
431
+ workerWaitTimeout: 30000,
432
+ scaleUpThreshold: 10,
433
+ scaleDownThreshold: 2,
434
+ exponentialBackoff: {
435
+ initialDelay: 1000,
436
+ maxDelay: 30000,
437
+ multiplier: 2
438
+ },
439
+ documentCache: {
440
+ enabled: true,
441
+ maxDocumentsPerWorker: 1,
442
+ maxCacheSizePerWorker: 52428800, // 50MB
443
+ evictAfterMinutes: 10
444
+ }
445
+ },
446
+ rulesets: {
447
+ directory: path.join(INSTALL_DIR, 'rulesets'),
448
+ defaultVersion: 'latest',
449
+ cacheEnabled: true
450
+ },
451
+ storage: {
452
+ type: 'memory' // Can be overridden to 'redis' for persistence
453
+ },
454
+ logging: {
455
+ level: 'info',
456
+ format: 'json',
457
+ destination: 'console'
458
+ }
459
+ };
460
+ // Apply overrides
461
+ if (overrides) {
462
+ return mergeConfig(config, overrides);
463
+ }
464
+ return config;
465
+ }
466
+ /**
467
+ * Create configuration for MCP companion mode
468
+ *
469
+ * Used when the orchestrator is started by MCP OpenAPI Analyzer
470
+ * Shares MCP's document store, lighter resource footprint
471
+ * Document store path MUST be provided explicitly (no default)
472
+ */
473
+ export function createCompanionModeConfig(overrides) {
474
+ const config = {
475
+ mode: 'companion',
476
+ server: {
477
+ port: 3004, // Use 3004 to avoid conflicts with standalone (3003)
478
+ host: '0.0.0.0',
479
+ maxDocumentSizeMB: 20
480
+ },
481
+ documentStore: {
482
+ type: 'passthrough',
483
+ baseDir: '', // MUST be provided via CLI or environment - no default!
484
+ fallbackHttp: 'http://localhost:3002'
485
+ },
486
+ workerPool: {
487
+ minWorkersPerRuleset: 2,
488
+ maxWorkersPerRuleset: 8,
489
+ totalMaxWorkers: 30, // Scaled up for batch workloads (see docs/SCALABILITY.md)
490
+ taskTimeout: 30000,
491
+ maxRetries: 2,
492
+ workerWaitTimeout: 30000,
493
+ scaleUpThreshold: 10,
494
+ scaleDownThreshold: 1,
495
+ exponentialBackoff: {
496
+ initialDelay: 1000,
497
+ maxDelay: 30000,
498
+ multiplier: 2
499
+ },
500
+ documentCache: {
501
+ enabled: true,
502
+ maxDocumentsPerWorker: 1,
503
+ maxCacheSizePerWorker: 52428800, // 50MB
504
+ evictAfterMinutes: 5
505
+ }
506
+ },
507
+ rulesets: {
508
+ directory: path.join(INSTALL_DIR, 'rulesets'),
509
+ defaultVersion: 'latest',
510
+ cacheEnabled: true
511
+ },
512
+ storage: {
513
+ type: 'memory' // MCP handles persistence
514
+ },
515
+ logging: {
516
+ level: 'debug', // More verbose for troubleshooting
517
+ format: 'json',
518
+ destination: 'console'
519
+ }
520
+ };
521
+ // Apply overrides
522
+ if (overrides) {
523
+ return mergeConfig(config, overrides);
524
+ }
525
+ return config;
526
+ }
527
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ export interface DocumentAccessorConfig {
2
+ /**
3
+ * Path to MCP server's document upload directory
4
+ * Example: '../mcp-openapi-analysis/uploads'
5
+ */
6
+ documentStorePath: string;
7
+ /**
8
+ * Fallback HTTP URL if file not found (optional)
9
+ * Example: 'http://localhost:3002'
10
+ */
11
+ fallbackHttpUrl?: string;
12
+ }
13
+ export interface DocumentMetadata {
14
+ documentId: string;
15
+ filePath: string;
16
+ exists: boolean;
17
+ size?: number;
18
+ createdAt?: Date;
19
+ modifiedAt?: Date;
20
+ }
21
+ /**
22
+ * DocumentAccessor - Direct filesystem access to MCP document store
23
+ */
24
+ export declare class DocumentAccessor {
25
+ private config;
26
+ constructor(config: DocumentAccessorConfig);
27
+ /**
28
+ * Get absolute file path for a document ID
29
+ *
30
+ * @param documentId - Document UUID from MCP server
31
+ * @returns Absolute path to document JSON file
32
+ */
33
+ getDocumentPath(documentId: string): string;
34
+ /**
35
+ * Check if document exists in filesystem
36
+ *
37
+ * @param documentId - Document UUID
38
+ * @returns True if file exists
39
+ */
40
+ documentExists(documentId: string): Promise<boolean>;
41
+ /**
42
+ * Get metadata about a document without loading content
43
+ *
44
+ * @param documentId - Document UUID
45
+ * @returns Document metadata including file stats
46
+ */
47
+ getDocumentMetadata(documentId: string): Promise<DocumentMetadata>;
48
+ /**
49
+ * Load document content from filesystem
50
+ *
51
+ * NOTE: Workers should use this directly in their threads to avoid
52
+ * passing large document content across thread boundaries.
53
+ *
54
+ * @param documentId - Document UUID
55
+ * @returns Parsed OpenAPI document
56
+ */
57
+ loadDocument(documentId: string): Promise<any>;
58
+ /**
59
+ * Validate document store accessibility
60
+ *
61
+ * @throws {Error} If document store directory is not accessible
62
+ */
63
+ validateDocumentStore(): Promise<void>;
64
+ /**
65
+ * List all documents in the store
66
+ *
67
+ * @returns Array of document IDs (without .json extension)
68
+ */
69
+ listDocuments(): Promise<string[]>;
70
+ /**
71
+ * Get document store statistics
72
+ */
73
+ getStoreStats(): Promise<{
74
+ documentCount: number;
75
+ totalSize: number;
76
+ storePath: string;
77
+ }>;
78
+ }
79
+ //# sourceMappingURL=document-accessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-accessor.d.ts","sourceRoot":"","sources":["../src/document-accessor.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,UAAU,CAAC,EAAE,IAAI,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAyB;gBAE3B,MAAM,EAAE,sBAAsB;IAI1C;;;;;OAKG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAK3C;;;;;OAKG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1D;;;;;OAKG;IACG,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsBxE;;;;;;;;OAQG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAepD;;;;OAIG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB5C;;;;OAIG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAexC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC;QAC7B,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CAiBH"}