ai-inference-stepper 1.0.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 (160) hide show
  1. package/.env.example +169 -0
  2. package/.eslintrc.cjs +23 -0
  3. package/.github/workflows/ci.yml +51 -0
  4. package/.github/workflows/keep-alive.yml +22 -0
  5. package/.github/workflows/publish.yml +34 -0
  6. package/ARCHITECTURE.md +594 -0
  7. package/Dockerfile +16 -0
  8. package/LICENSE +28 -0
  9. package/README.md +261 -0
  10. package/dist/alerts/discord.d.ts +19 -0
  11. package/dist/alerts/discord.d.ts.map +1 -0
  12. package/dist/alerts/discord.js +70 -0
  13. package/dist/alerts/discord.js.map +1 -0
  14. package/dist/cache/redisCache.d.ts +45 -0
  15. package/dist/cache/redisCache.d.ts.map +1 -0
  16. package/dist/cache/redisCache.js +171 -0
  17. package/dist/cache/redisCache.js.map +1 -0
  18. package/dist/cli.d.ts +3 -0
  19. package/dist/cli.d.ts.map +1 -0
  20. package/dist/cli.js +8 -0
  21. package/dist/cli.js.map +1 -0
  22. package/dist/config.d.ts +6 -0
  23. package/dist/config.d.ts.map +1 -0
  24. package/dist/config.js +251 -0
  25. package/dist/config.js.map +1 -0
  26. package/dist/fallback/templateFallback.d.ts +7 -0
  27. package/dist/fallback/templateFallback.d.ts.map +1 -0
  28. package/dist/fallback/templateFallback.js +29 -0
  29. package/dist/fallback/templateFallback.js.map +1 -0
  30. package/dist/index.d.ts +121 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +198 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/logging.d.ts +10 -0
  35. package/dist/logging.d.ts.map +1 -0
  36. package/dist/logging.js +44 -0
  37. package/dist/logging.js.map +1 -0
  38. package/dist/metrics/metrics.d.ts +22 -0
  39. package/dist/metrics/metrics.d.ts.map +1 -0
  40. package/dist/metrics/metrics.js +78 -0
  41. package/dist/metrics/metrics.js.map +1 -0
  42. package/dist/providers/factory.d.ts +11 -0
  43. package/dist/providers/factory.d.ts.map +1 -0
  44. package/dist/providers/factory.js +52 -0
  45. package/dist/providers/factory.js.map +1 -0
  46. package/dist/providers/hfSpace.adapter.d.ts +21 -0
  47. package/dist/providers/hfSpace.adapter.d.ts.map +1 -0
  48. package/dist/providers/hfSpace.adapter.js +110 -0
  49. package/dist/providers/hfSpace.adapter.js.map +1 -0
  50. package/dist/providers/httpTemplate.adapter.d.ts +42 -0
  51. package/dist/providers/httpTemplate.adapter.d.ts.map +1 -0
  52. package/dist/providers/httpTemplate.adapter.js +98 -0
  53. package/dist/providers/httpTemplate.adapter.js.map +1 -0
  54. package/dist/providers/promptBuilder.d.ts +34 -0
  55. package/dist/providers/promptBuilder.d.ts.map +1 -0
  56. package/dist/providers/promptBuilder.js +315 -0
  57. package/dist/providers/promptBuilder.js.map +1 -0
  58. package/dist/providers/provider.interface.d.ts +45 -0
  59. package/dist/providers/provider.interface.d.ts.map +1 -0
  60. package/dist/providers/provider.interface.js +47 -0
  61. package/dist/providers/provider.interface.js.map +1 -0
  62. package/dist/providers/specs.d.ts +18 -0
  63. package/dist/providers/specs.d.ts.map +1 -0
  64. package/dist/providers/specs.js +326 -0
  65. package/dist/providers/specs.js.map +1 -0
  66. package/dist/providers/unified.adapter.d.ts +37 -0
  67. package/dist/providers/unified.adapter.d.ts.map +1 -0
  68. package/dist/providers/unified.adapter.js +141 -0
  69. package/dist/providers/unified.adapter.js.map +1 -0
  70. package/dist/queue/producer.d.ts +30 -0
  71. package/dist/queue/producer.d.ts.map +1 -0
  72. package/dist/queue/producer.js +87 -0
  73. package/dist/queue/producer.js.map +1 -0
  74. package/dist/queue/worker.d.ts +9 -0
  75. package/dist/queue/worker.d.ts.map +1 -0
  76. package/dist/queue/worker.js +137 -0
  77. package/dist/queue/worker.js.map +1 -0
  78. package/dist/server/app.d.ts +4 -0
  79. package/dist/server/app.d.ts.map +1 -0
  80. package/dist/server/app.js +394 -0
  81. package/dist/server/app.js.map +1 -0
  82. package/dist/server/start.d.ts +16 -0
  83. package/dist/server/start.d.ts.map +1 -0
  84. package/dist/server/start.js +45 -0
  85. package/dist/server/start.js.map +1 -0
  86. package/dist/stepper/orchestrator.d.ts +22 -0
  87. package/dist/stepper/orchestrator.d.ts.map +1 -0
  88. package/dist/stepper/orchestrator.js +333 -0
  89. package/dist/stepper/orchestrator.js.map +1 -0
  90. package/dist/types.d.ts +216 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +14 -0
  93. package/dist/types.js.map +1 -0
  94. package/dist/utils/redaction.d.ts +9 -0
  95. package/dist/utils/redaction.d.ts.map +1 -0
  96. package/dist/utils/redaction.js +41 -0
  97. package/dist/utils/redaction.js.map +1 -0
  98. package/dist/utils/safeRequest.d.ts +38 -0
  99. package/dist/utils/safeRequest.d.ts.map +1 -0
  100. package/dist/utils/safeRequest.js +104 -0
  101. package/dist/utils/safeRequest.js.map +1 -0
  102. package/dist/validation/report.schema.d.ts +48 -0
  103. package/dist/validation/report.schema.d.ts.map +1 -0
  104. package/dist/validation/report.schema.js +72 -0
  105. package/dist/validation/report.schema.js.map +1 -0
  106. package/dist/webhooks/delivery.d.ts +31 -0
  107. package/dist/webhooks/delivery.d.ts.map +1 -0
  108. package/dist/webhooks/delivery.js +102 -0
  109. package/dist/webhooks/delivery.js.map +1 -0
  110. package/docs/assets/architecture.png +0 -0
  111. package/package.json +75 -0
  112. package/render.yaml +25 -0
  113. package/src/alerts/README.md +25 -0
  114. package/src/alerts/discord.ts +86 -0
  115. package/src/cache/How redis caching works in package stepper.md +971 -0
  116. package/src/cache/README.md +51 -0
  117. package/src/cache/redisCache.ts +194 -0
  118. package/src/ci/deploy.sh +36 -0
  119. package/src/cli.ts +9 -0
  120. package/src/config.ts +265 -0
  121. package/src/fallback/templateFallback.ts +32 -0
  122. package/src/index.ts +246 -0
  123. package/src/logging.ts +46 -0
  124. package/src/metrics/README.md +24 -0
  125. package/src/metrics/metrics.ts +84 -0
  126. package/src/providers/How the providers interact.md +121 -0
  127. package/src/providers/README.md +121 -0
  128. package/src/providers/factory.ts +57 -0
  129. package/src/providers/hfSpace.adapter.ts +119 -0
  130. package/src/providers/httpTemplate.adapter.ts +138 -0
  131. package/src/providers/promptBuilder.ts +330 -0
  132. package/src/providers/provider.interface.ts +73 -0
  133. package/src/providers/specs.ts +366 -0
  134. package/src/providers/unified.adapter.ts +172 -0
  135. package/src/queue/How queue works in package stepper.md +149 -0
  136. package/src/queue/README.md +41 -0
  137. package/src/queue/producer.ts +108 -0
  138. package/src/queue/worker.ts +170 -0
  139. package/src/server/app.ts +451 -0
  140. package/src/server/start.ts +68 -0
  141. package/src/stepper/Dockerfile +48 -0
  142. package/src/stepper/How orchestrator works in package stepper.md +746 -0
  143. package/src/stepper/README.md +43 -0
  144. package/src/stepper/orchestrator.ts +437 -0
  145. package/src/types.ts +238 -0
  146. package/src/utils/redaction.ts +50 -0
  147. package/src/utils/safeRequest.ts +140 -0
  148. package/src/validation/README.md +25 -0
  149. package/src/validation/report.schema.ts +96 -0
  150. package/src/webhooks/delivery.ts +162 -0
  151. package/tests/integration/full-flow.test.ts +192 -0
  152. package/tests/unit/alerts/discord.test.ts +119 -0
  153. package/tests/unit/cache.test.ts +87 -0
  154. package/tests/unit/orchestrator-fallback.test.ts +92 -0
  155. package/tests/unit/orchestrator.test.ts +105 -0
  156. package/tests/unit/providers/factory.test.ts +161 -0
  157. package/tests/unit/providers/unified.adapter.test.ts +206 -0
  158. package/tests/unit/utils/redaction.test.ts +140 -0
  159. package/tests/unit/utils/safeRequest.test.ts +164 -0
  160. package/tsconfig.json +26 -0
package/dist/config.js ADDED
@@ -0,0 +1,251 @@
1
+ /**
2
+ * Load configuration from environment variables with sensible defaults.
3
+ * This is the central brain for all timing, retry, and safety-switch logic.
4
+ */
5
+ /**
6
+ * Load provider configurations from environment
7
+ */
8
+ function loadProviderConfigs() {
9
+ const providers = [];
10
+ // Helper to add provider config
11
+ const addProvider = (name, envPrefix) => {
12
+ const enabled = process.env[`${envPrefix}_ENABLED`] === 'true';
13
+ if (enabled) {
14
+ providers.push({
15
+ name,
16
+ apiKey: process.env[`${envPrefix}_API_KEY`],
17
+ baseUrl: process.env[`${envPrefix}_BASE_URL`],
18
+ modelName: process.env[`${envPrefix}_MODEL`],
19
+ timeout: parseInt(process.env[`${envPrefix}_TIMEOUT`] || '15000', 10),
20
+ rateLimitRPS: parseInt(process.env[`${envPrefix}_RPS`] || '5', 10),
21
+ concurrency: parseInt(process.env[`${envPrefix}_CONCURRENCY`] || '2', 10),
22
+ enabled: true,
23
+ });
24
+ }
25
+ };
26
+ // Special case: HuggingFace Space
27
+ if (process.env.HF_SPACE_ENABLED === 'true') {
28
+ providers.push({
29
+ name: 'hf-space',
30
+ baseUrl: process.env.HF_SPACE_URL,
31
+ apiKey: process.env.HF_SPACE_API_KEY,
32
+ timeout: parseInt(process.env.HF_SPACE_TIMEOUT || '30000', 10),
33
+ rateLimitRPS: parseInt(process.env.HF_SPACE_RPS || '3', 10),
34
+ concurrency: parseInt(process.env.HF_SPACE_CONCURRENCY || '1', 10),
35
+ enabled: true,
36
+ });
37
+ }
38
+ // Add all other providers
39
+ addProvider('gemini', 'GEMINI');
40
+ addProvider('openai', 'OPENAI');
41
+ addProvider('anthropic', 'ANTHROPIC');
42
+ addProvider('cohere', 'COHERE');
43
+ addProvider('deepseek', 'DEEPSEEK');
44
+ addProvider('groq', 'GROQ');
45
+ addProvider('openrouter', 'OPENROUTER');
46
+ addProvider('mistral', 'MISTRAL');
47
+ addProvider('perplexity', 'PERPLEXITY');
48
+ addProvider('together', 'TOGETHER');
49
+ return providers;
50
+ }
51
+ export function loadConfig() {
52
+ const redisUrl = process.env.REDIS_URL || 'redis://localhost:6379';
53
+ // Provider configurations: Rules for how we talk to each AI
54
+ const providers = [
55
+ {
56
+ name: 'hf-space',
57
+ enabled: process.env.HF_SPACE_ENABLED === 'true',
58
+ baseUrl: process.env.HF_SPACE_URL || 'https://your-space.hf.space',
59
+ apiKeyEnvVar: 'HF_SPACE_API_KEY',
60
+ // RPM (Requests Per Minute): We allow 5 requests every 60 seconds (one every 12 seconds)
61
+ // high RPM leads to "429 Too Many Requests" errors.
62
+ rateLimitRPM: parseInt(process.env.HF_SPACE_RPM || '5', 10),
63
+ // Concurrency: Max 2 active conversations at once. Prevents overloading the AI slot.
64
+ concurrency: parseInt(process.env.HF_SPACE_CONCURRENCY || '2', 10),
65
+ // Timeout: Give the AI 1 minute to think before we give up and try another provider.
66
+ timeout: parseInt(process.env.HF_SPACE_TIMEOUT || '60000', 10),
67
+ },
68
+ {
69
+ name: 'gemini',
70
+ enabled: process.env.GEMINI_ENABLED === 'true',
71
+ baseUrl: process.env.GEMINI_BASE_URL || 'https://generativelanguage.googleapis.com/v1',
72
+ modelName: process.env.GEMINI_MODEL || 'gemini-pro',
73
+ apiKeyEnvVar: 'GEMINI_API_KEY',
74
+ rateLimitRPM: parseInt(process.env.GEMINI_RPM || '5', 10),
75
+ concurrency: parseInt(process.env.GEMINI_CONCURRENCY || '2', 10),
76
+ timeout: parseInt(process.env.GEMINI_TIMEOUT || '60000', 10),
77
+ },
78
+ {
79
+ name: 'cohere',
80
+ enabled: process.env.COHERE_ENABLED === 'true',
81
+ baseUrl: process.env.COHERE_BASE_URL || 'https://api.cohere.ai/v1',
82
+ modelName: process.env.COHERE_MODEL || 'command',
83
+ apiKeyEnvVar: 'COHERE_API_KEY',
84
+ rateLimitRPM: parseInt(process.env.COHERE_RPM || '5', 10),
85
+ concurrency: parseInt(process.env.COHERE_CONCURRENCY || '2', 10),
86
+ timeout: parseInt(process.env.COHERE_TIMEOUT || '60000', 10),
87
+ },
88
+ ];
89
+ // Filter enabled providers and enforce order
90
+ const staticProviders = providers.filter((p) => p.enabled);
91
+ const dynamicProviders = loadProviderConfigs();
92
+ // Combine, preferring static if name conflicts
93
+ const allProviders = [...staticProviders];
94
+ for (const dp of dynamicProviders) {
95
+ if (!allProviders.some(sp => sp.name === dp.name)) {
96
+ allProviders.push(dp);
97
+ }
98
+ }
99
+ return {
100
+ providers: allProviders,
101
+ fallback: {
102
+ enabled: process.env.FALLBACK_ENABLED !== 'false',
103
+ },
104
+ redis: {
105
+ url: redisUrl,
106
+ keyPrefix: process.env.REDIS_KEY_PREFIX || 'stepper:',
107
+ },
108
+ cache: {
109
+ // TTL: How long the report stays in the database (Default: 2 days)
110
+ ttlSeconds: parseInt(process.env.CACHE_TTL_SECONDS || '172800', 10),
111
+ // Stale Threshold: After 24 hours (or effectively never if TTL < 24h), we consider the data "old"
112
+ staleThresholdSeconds: parseInt(process.env.CACHE_STALE_THRESHOLD || '86400', 10),
113
+ enableStaleWhileRevalidate: process.env.CACHE_STALE_WHILE_REVALIDATE !== 'false',
114
+ },
115
+ queue: {
116
+ name: process.env.QUEUE_NAME || 'report-generation',
117
+ // How many total background jobs we run across all providers
118
+ concurrency: parseInt(process.env.QUEUE_CONCURRENCY || '5', 10),
119
+ },
120
+ webhook: {
121
+ enabled: process.env.WEBHOOK_ENABLED !== 'false', // Enabled by default
122
+ secret: process.env.WEBHOOK_SECRET || '',
123
+ maxRetries: parseInt(process.env.WEBHOOK_MAX_RETRIES || '3', 10),
124
+ retryDelayMs: parseInt(process.env.WEBHOOK_RETRY_DELAY_MS || '5000', 10),
125
+ },
126
+ retry: {
127
+ // Max Attempts: Try a single provider 3 times before moving to the next one.
128
+ maxAttemptsPerProvider: parseInt(process.env.RETRY_MAX_ATTEMPTS || '3', 10),
129
+ // Base Delay: After a simple error (like network), wait 40 seconds before retrying.
130
+ baseDelayMs: parseInt(process.env.RETRY_BASE_DELAY_MS || '40000', 10),
131
+ // Jitter: Random +/- 10 seconds to prevent multiple retries hitting at once.
132
+ maxJitterMs: parseInt(process.env.RETRY_MAX_JITTER_MS || '10000', 10),
133
+ // Rate Limit Fallback: If AI says "Busy" but doesn't say for how long, wait ~2 hours (extreme safety).
134
+ // Note: User set this to 5400 in .env which is ~90mins.
135
+ rateLimitFallbackSeconds: parseInt(process.env.RETRY_RATE_LIMIT_FALLBACK || '7200', 10),
136
+ },
137
+ circuit: {
138
+ // Failure Threshold: Kill the provider if 5 requests in a row fail.
139
+ failureThreshold: parseInt(process.env.CIRCUIT_FAILURE_THRESHOLD || '5', 10),
140
+ // Window: Only look at failures from the last 5 minutes.
141
+ windowSeconds: parseInt(process.env.CIRCUIT_WINDOW_SECONDS || '300', 10),
142
+ // Cooldown: After killing a provider, wait 5 minutes before trying it again.
143
+ cooldownSeconds: parseInt(process.env.CIRCUIT_COOLDOWN_SECONDS || '300', 10),
144
+ },
145
+ security: {
146
+ redactBeforeSend: process.env.REDACT_BEFORE_SEND !== 'false',
147
+ // CORS: Control which domains can access your API
148
+ cors: {
149
+ enabled: process.env.CORS_ENABLED !== 'false', // Enabled by default
150
+ allowedOrigins: process.env.CORS_ALLOWED_ORIGINS
151
+ ? process.env.CORS_ALLOWED_ORIGINS.split(',').map(s => s.trim())
152
+ : ['*'], // Default allows all; in production, specify your domains
153
+ allowCredentials: process.env.CORS_ALLOW_CREDENTIALS === 'true',
154
+ },
155
+ // Rate Limiting: Prevent abuse and DDoS
156
+ rateLimit: {
157
+ enabled: process.env.RATE_LIMIT_ENABLED !== 'false', // Enabled by default
158
+ windowMs: parseInt(process.env.RATE_LIMIT_WINDOW_MS || '900000', 10), // 15 minutes default
159
+ maxRequests: parseInt(process.env.RATE_LIMIT_MAX_REQUESTS || '100', 10), // 100 per window per IP
160
+ maxRequestsPerUser: parseInt(process.env.RATE_LIMIT_MAX_PER_USER || '50', 10), // 50 per window per userId
161
+ skipHealthEndpoints: process.env.RATE_LIMIT_SKIP_HEALTH !== 'false', // Skip /health & /metrics by default
162
+ },
163
+ // Helmet: Security headers (XSS, clickjacking, etc.)
164
+ helmet: {
165
+ enabled: process.env.HELMET_ENABLED !== 'false', // Enabled by default
166
+ },
167
+ // API Key: Simple authentication for API access
168
+ apiKey: {
169
+ enabled: process.env.API_KEY_ENABLED === 'true', // Disabled by default; opt-in
170
+ headerName: process.env.API_KEY_HEADER || 'x-api-key',
171
+ skipHealthEndpoints: process.env.API_KEY_SKIP_HEALTH !== 'false', // Skip auth for health/metrics
172
+ },
173
+ },
174
+ server: {
175
+ port: parseInt(process.env.PORT || '3001', 10),
176
+ metricsPort: process.env.METRICS_PORT ? parseInt(process.env.METRICS_PORT, 10) : undefined,
177
+ },
178
+ };
179
+ }
180
+ function mergeConfig(base, overrides) {
181
+ return {
182
+ ...base,
183
+ ...overrides,
184
+ providers: overrides.providers ?? base.providers,
185
+ providerConfigs: overrides.providerConfigs ?? base.providerConfigs,
186
+ redis: {
187
+ ...base.redis,
188
+ ...overrides.redis,
189
+ },
190
+ cache: {
191
+ ...base.cache,
192
+ ...overrides.cache,
193
+ },
194
+ queue: {
195
+ ...base.queue,
196
+ ...overrides.queue,
197
+ },
198
+ webhook: {
199
+ ...base.webhook,
200
+ ...overrides.webhook,
201
+ },
202
+ retry: {
203
+ ...base.retry,
204
+ ...overrides.retry,
205
+ },
206
+ circuit: {
207
+ ...base.circuit,
208
+ ...overrides.circuit,
209
+ },
210
+ security: {
211
+ ...base.security,
212
+ ...overrides.security,
213
+ cors: {
214
+ ...base.security.cors,
215
+ ...overrides.security?.cors,
216
+ },
217
+ rateLimit: {
218
+ ...base.security.rateLimit,
219
+ ...overrides.security?.rateLimit,
220
+ },
221
+ helmet: {
222
+ ...base.security.helmet,
223
+ ...overrides.security?.helmet,
224
+ },
225
+ apiKey: {
226
+ ...base.security.apiKey,
227
+ ...overrides.security?.apiKey,
228
+ },
229
+ },
230
+ server: {
231
+ ...base.server,
232
+ ...overrides.server,
233
+ },
234
+ };
235
+ }
236
+ export function createConfig(overrides) {
237
+ const base = loadConfig();
238
+ if (!overrides) {
239
+ return base;
240
+ }
241
+ return mergeConfig(base, overrides);
242
+ }
243
+ export let config = loadConfig();
244
+ export function applyConfigOverrides(overrides) {
245
+ if (!overrides) {
246
+ return config;
247
+ }
248
+ config = mergeConfig(loadConfig(), overrides);
249
+ return config;
250
+ }
251
+ //# 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,7 @@
1
+ import { PromptInput, ReportOutput } from '../types.js';
2
+ /**
3
+ * Generate a deterministic, template-based fallback report
4
+ * Used when all AI providers fail
5
+ */
6
+ export declare function generateTemplateFallback(input: PromptInput): ReportOutput;
7
+ //# sourceMappingURL=templateFallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateFallback.d.ts","sourceRoot":"","sources":["../../src/fallback/templateFallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,CAyBzE"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Generate a deterministic, template-based fallback report
3
+ * Used when all AI providers fail
4
+ */
5
+ export function generateTemplateFallback(input) {
6
+ const { message, files, components, diffSummary, repo } = input;
7
+ // Extract basic info from commit message
8
+ const firstLine = message.split('\n')[0] || 'Code changes';
9
+ const fileCount = files.length;
10
+ const componentCount = components.length;
11
+ return {
12
+ title: `${firstLine.slice(0, 80)}`,
13
+ summary: `This commit modifies ${fileCount} file${fileCount !== 1 ? 's' : ''} in ${repo}. ` +
14
+ `The changes affect ${componentCount} component${componentCount !== 1 ? 's' : ''}. ` +
15
+ `Commit message: "${message.slice(0, 200)}${message.length > 200 ? '...' : ''}"`,
16
+ changes: files.slice(0, 10).map((f) => `Modified ${f}`),
17
+ rationale: `Automated fallback: Unable to generate AI-powered analysis. ` +
18
+ `Diff summary: ${diffSummary.slice(0, 300)}${diffSummary.length > 300 ? '...' : ''}`,
19
+ impact_and_tests: `Please review the changes manually. Ensure tests are updated for modified files: ${files.slice(0, 5).join(', ')}`,
20
+ next_steps: [
21
+ 'Review changes manually',
22
+ 'Run test suite',
23
+ 'Verify component integration',
24
+ 'Update documentation if needed',
25
+ ],
26
+ tags: components.slice(0, 5).join(', ') || 'general',
27
+ };
28
+ }
29
+ //# sourceMappingURL=templateFallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateFallback.js","sourceRoot":"","sources":["../../src/fallback/templateFallback.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAkB;IACzD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAEhE,yCAAyC;IACzC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC;IAC3D,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;IAC/B,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC;IAEzC,OAAO;QACL,KAAK,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;QAClC,OAAO,EAAE,wBAAwB,SAAS,QAAQ,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,IAAI;YACzF,sBAAsB,cAAc,aAAa,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI;YACpF,oBAAoB,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG;QAClF,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;QACvD,SAAS,EAAE,8DAA8D;YACvE,iBAAiB,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;QACtF,gBAAgB,EAAE,oFAAoF,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACpI,UAAU,EAAE;YACV,yBAAyB;YACzB,gBAAgB;YAChB,8BAA8B;YAC9B,gCAAgC;SACjC;QACD,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS;KACrD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,121 @@
1
+ import { PromptInput, ReportOutput, ProviderResult, StepperCallbacks, StepperConfig, ProviderConfig } from './types.js';
2
+ /**
3
+ * Initialize Stepper with optional config overrides.
4
+ * Useful for npm consumers who want programmatic config instead of env.
5
+ */
6
+ export declare function initStepper(options?: {
7
+ config?: Partial<StepperConfig>;
8
+ providers?: ProviderConfig[];
9
+ }): StepperConfig;
10
+ /**
11
+ * Register lifecycle callbacks
12
+ *
13
+ * @example
14
+ * registerCallbacks({
15
+ * onSuccess: (jobId, provider, result) => {
16
+ * // handle success
17
+ * },
18
+ * onFallback: (jobId, result, meta) => {
19
+ * // handle fallback
20
+ * }
21
+ * });
22
+ */
23
+ export declare function registerCallbacks(callbacks: StepperCallbacks): void;
24
+ /**
25
+ * Enqueue a report generation job (async, non-blocking)
26
+ *
27
+ * Returns cached result immediately if available (fresh or stale),
28
+ * or enqueues job and returns 202 status with jobId.
29
+ *
30
+ * @param input - Commit information
31
+ * @returns Promise with either immediate result or job info
32
+ *
33
+ * @example
34
+ * const result = await enqueueReport({
35
+ * userId: 'user_123',
36
+ * commitSha: 'abc123',
37
+ * repo: 'myorg/myrepo',
38
+ * message: 'Fix bug in auth',
39
+ * files: ['src/auth.ts'],
40
+ * components: ['auth'],
41
+ * diffSummary: '+ fixed token validation'
42
+ * });
43
+ *
44
+ * if (result.status === 200) {
45
+ * // handle cached result
46
+ * } else {
47
+ * // handle enqueued result
48
+ * }
49
+ */
50
+ export declare function enqueueReport(input: PromptInput): Promise<{
51
+ status: 200;
52
+ data: ReportOutput;
53
+ cached: true;
54
+ stale?: boolean;
55
+ } | {
56
+ status: 202;
57
+ jobId: string;
58
+ cached: false;
59
+ }>;
60
+ /**
61
+ * Generate report synchronously (blocking, immediate)
62
+ *
63
+ * Useful for testing or when you need the result immediately.
64
+ * This bypasses the queue and calls providers directly.
65
+ *
66
+ * @param input - Commit information
67
+ * @returns Promise with generated report and metadata
68
+ *
69
+ * @example
70
+ * const result = await generateReportNow({
71
+ * userId: 'user_123',
72
+ * commitSha: 'abc123',
73
+ * repo: 'myorg/myrepo',
74
+ * message: 'Refactor API',
75
+ * files: ['src/api.ts'],
76
+ * components: ['api'],
77
+ * diffSummary: '- old code\n+ new code'
78
+ * });
79
+ *
80
+ * // handle provider and report result
81
+ */
82
+ export declare function generateReport(input: PromptInput): Promise<ProviderResult>;
83
+ /**
84
+ * Get job status by ID
85
+ *
86
+ * @param jobId - Job identifier returned from enqueueReport
87
+ * @returns Job status information or null if not found
88
+ */
89
+ export declare function getJob(jobId: string): Promise<{
90
+ id: string;
91
+ state: string;
92
+ progress?: number;
93
+ result?: unknown;
94
+ failedReason?: string;
95
+ data?: unknown;
96
+ } | null>;
97
+ /**
98
+ * Delete a cached report entry.
99
+ *
100
+ * Call this once you have successfully saved the report to your own database
101
+ * to keep the Stepper's Redis storage footprint minimal.
102
+ *
103
+ * @param userId - User identifier
104
+ * @param commitSha - Commit SHA
105
+ * @param template - Template name (optional)
106
+ */
107
+ export declare function deleteReport(userId: string, commitSha: string, template?: string): Promise<void>;
108
+ /**
109
+ * Health check - returns provider status and system health
110
+ */
111
+ export declare function healthcheck(): Promise<{
112
+ status: 'healthy' | 'degraded' | 'unhealthy';
113
+ providers: Array<{
114
+ name: string;
115
+ healthy: boolean;
116
+ }>;
117
+ timestamp: string;
118
+ }>;
119
+ export * from './types.js';
120
+ export { config } from './config.js';
121
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA6BxH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,cAAc,EAAE,CAAA;CAAE,GAAG,aAAa,CAUtH;AAUD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAGnE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,aAAa,CAC/B,KAAK,EAAE,WAAW,GACnB,OAAO,CACJ;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAClE;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,CAAA;CAAE,CAClD,CAgDA;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAIhF;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAClB,GAAG,IAAI,CAAC,CAER;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAItG;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC;IACzC,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAC7C,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACrD,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC,CAmBD;AAGD,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,198 @@
1
+ // packages/stepper/src/index.ts
2
+ import { logger } from './logging.js';
3
+ import { buildCacheKey, getReportCache, setDehydrated, isHydratedFresh, isStaleButUsable, deleteCacheEntry, } from './cache/redisCache.js';
4
+ import { enqueueReportJob, getJobStatus } from './queue/producer.js';
5
+ import { generateReportNow, registerCallbacks as registerOrchestratorCallbacks, initializeProviders, getProviderHealth } from './stepper/orchestrator.js';
6
+ import { recordCacheHit, recordCacheMiss } from './metrics/metrics.js';
7
+ import crypto from 'crypto';
8
+ import { applyConfigOverrides } from './config.js';
9
+ let isInitialized = false;
10
+ function ensureInitialized() {
11
+ if (!isInitialized) {
12
+ const existingProviders = getProviderHealth();
13
+ if (existingProviders.length > 0) {
14
+ isInitialized = true;
15
+ return;
16
+ }
17
+ initStepper();
18
+ }
19
+ }
20
+ /**
21
+ * Initialize Stepper with optional config overrides.
22
+ * Useful for npm consumers who want programmatic config instead of env.
23
+ */
24
+ export function initStepper(options) {
25
+ const overrides = options?.config ? { ...options.config } : {};
26
+ if (options?.providers) {
27
+ overrides.providers = options.providers;
28
+ }
29
+ const nextConfig = applyConfigOverrides(overrides);
30
+ initializeProviders(nextConfig.providers);
31
+ isInitialized = true;
32
+ return nextConfig;
33
+ }
34
+ /**
35
+ * Compute template hash for cache key
36
+ */
37
+ function computeTemplateHash(template) {
38
+ const templateStr = template || 'default';
39
+ return crypto.createHash('sha256').update(templateStr).digest('hex').slice(0, 16);
40
+ }
41
+ /**
42
+ * Register lifecycle callbacks
43
+ *
44
+ * @example
45
+ * registerCallbacks({
46
+ * onSuccess: (jobId, provider, result) => {
47
+ * // handle success
48
+ * },
49
+ * onFallback: (jobId, result, meta) => {
50
+ * // handle fallback
51
+ * }
52
+ * });
53
+ */
54
+ export function registerCallbacks(callbacks) {
55
+ registerOrchestratorCallbacks(callbacks);
56
+ logger.info('Callbacks registered');
57
+ }
58
+ /**
59
+ * Enqueue a report generation job (async, non-blocking)
60
+ *
61
+ * Returns cached result immediately if available (fresh or stale),
62
+ * or enqueues job and returns 202 status with jobId.
63
+ *
64
+ * @param input - Commit information
65
+ * @returns Promise with either immediate result or job info
66
+ *
67
+ * @example
68
+ * const result = await enqueueReport({
69
+ * userId: 'user_123',
70
+ * commitSha: 'abc123',
71
+ * repo: 'myorg/myrepo',
72
+ * message: 'Fix bug in auth',
73
+ * files: ['src/auth.ts'],
74
+ * components: ['auth'],
75
+ * diffSummary: '+ fixed token validation'
76
+ * });
77
+ *
78
+ * if (result.status === 200) {
79
+ * // handle cached result
80
+ * } else {
81
+ * // handle enqueued result
82
+ * }
83
+ */
84
+ export async function enqueueReport(input) {
85
+ ensureInitialized();
86
+ const templateHash = computeTemplateHash(input.template);
87
+ const cacheKey = buildCacheKey(input.userId, input.commitSha, templateHash);
88
+ // Check cache
89
+ const cached = await getReportCache(cacheKey);
90
+ if (cached && cached.status === 'hydrated' && cached.result) {
91
+ const fresh = isHydratedFresh(cached);
92
+ if (fresh) {
93
+ // Fresh cache hit - return immediately and cleanup
94
+ recordCacheHit('fresh');
95
+ logger.info({ cacheKey, userId: input.userId }, 'Cache hit (fresh), returning and clearing');
96
+ // We clear immediately because caller is expected to save this
97
+ deleteCacheEntry(cacheKey).catch(err => {
98
+ logger.error({ err, cacheKey }, 'Failed to cleanup cache after fresh hit');
99
+ });
100
+ return { status: 200, data: cached.result, cached: true };
101
+ }
102
+ // Stale but usable - return and schedule background refresh
103
+ if (isStaleButUsable(cached)) {
104
+ recordCacheHit('stale');
105
+ logger.info({ cacheKey, userId: input.userId }, 'Cache hit (stale), scheduling refresh');
106
+ // Schedule low-priority background refresh
107
+ enqueueReportJob(input, cacheKey, { priority: 10 }).catch((err) => {
108
+ logger.error({ err, cacheKey }, 'Failed to enqueue background refresh');
109
+ });
110
+ return { status: 200, data: cached.result, cached: true, stale: true };
111
+ }
112
+ }
113
+ // Cache miss or dehydrated - enqueue job
114
+ recordCacheMiss();
115
+ logger.info({ cacheKey, userId: input.userId }, 'Cache miss, enqueueing job');
116
+ const jobId = await enqueueReportJob(input, cacheKey);
117
+ // Create dehydrated placeholder
118
+ await setDehydrated(cacheKey, jobId);
119
+ return { status: 202, jobId, cached: false };
120
+ }
121
+ /**
122
+ * Generate report synchronously (blocking, immediate)
123
+ *
124
+ * Useful for testing or when you need the result immediately.
125
+ * This bypasses the queue and calls providers directly.
126
+ *
127
+ * @param input - Commit information
128
+ * @returns Promise with generated report and metadata
129
+ *
130
+ * @example
131
+ * const result = await generateReportNow({
132
+ * userId: 'user_123',
133
+ * commitSha: 'abc123',
134
+ * repo: 'myorg/myrepo',
135
+ * message: 'Refactor API',
136
+ * files: ['src/api.ts'],
137
+ * components: ['api'],
138
+ * diffSummary: '- old code\n+ new code'
139
+ * });
140
+ *
141
+ * // handle provider and report result
142
+ */
143
+ export async function generateReport(input) {
144
+ ensureInitialized();
145
+ const jobId = `sync_${Date.now()}`;
146
+ return generateReportNow(input, jobId);
147
+ }
148
+ /**
149
+ * Get job status by ID
150
+ *
151
+ * @param jobId - Job identifier returned from enqueueReport
152
+ * @returns Job status information or null if not found
153
+ */
154
+ export async function getJob(jobId) {
155
+ return getJobStatus(jobId);
156
+ }
157
+ /**
158
+ * Delete a cached report entry.
159
+ *
160
+ * Call this once you have successfully saved the report to your own database
161
+ * to keep the Stepper's Redis storage footprint minimal.
162
+ *
163
+ * @param userId - User identifier
164
+ * @param commitSha - Commit SHA
165
+ * @param template - Template name (optional)
166
+ */
167
+ export async function deleteReport(userId, commitSha, template) {
168
+ const templateHash = computeTemplateHash(template);
169
+ const cacheKey = buildCacheKey(userId, commitSha, templateHash);
170
+ await deleteCacheEntry(cacheKey);
171
+ }
172
+ /**
173
+ * Health check - returns provider status and system health
174
+ */
175
+ export async function healthcheck() {
176
+ ensureInitialized();
177
+ const providerHealth = getProviderHealth();
178
+ const healthyCount = providerHealth.filter((p) => p.healthy).length;
179
+ let status;
180
+ if (healthyCount === 0) {
181
+ status = 'unhealthy';
182
+ }
183
+ else if (healthyCount < providerHealth.length) {
184
+ status = 'degraded';
185
+ }
186
+ else {
187
+ status = 'healthy';
188
+ }
189
+ return {
190
+ status,
191
+ providers: providerHealth.map((p) => ({ name: p.name, healthy: p.healthy })),
192
+ timestamp: new Date().toISOString(),
193
+ };
194
+ }
195
+ // Re-export types for consumers
196
+ export * from './types.js';
197
+ export { config } from './config.js';
198
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import pino from 'pino';
2
+ /**
3
+ * Base pino logger instance with structured logging
4
+ */
5
+ export declare const logger: import("pino").Logger<never>;
6
+ /**
7
+ * Create a child logger with additional context (e.g., jobId, requestId)
8
+ */
9
+ export declare function createChildLogger(context: Record<string, unknown>): pino.Logger<never>;
10
+ //# sourceMappingURL=logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB;;GAEG;AACH,eAAO,MAAM,MAAM,8BA+BjB,CAAC;AAEH;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,sBAEjE"}