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.
- package/.env.example +169 -0
- package/.eslintrc.cjs +23 -0
- package/.github/workflows/ci.yml +51 -0
- package/.github/workflows/keep-alive.yml +22 -0
- package/.github/workflows/publish.yml +34 -0
- package/ARCHITECTURE.md +594 -0
- package/Dockerfile +16 -0
- package/LICENSE +28 -0
- package/README.md +261 -0
- package/dist/alerts/discord.d.ts +19 -0
- package/dist/alerts/discord.d.ts.map +1 -0
- package/dist/alerts/discord.js +70 -0
- package/dist/alerts/discord.js.map +1 -0
- package/dist/cache/redisCache.d.ts +45 -0
- package/dist/cache/redisCache.d.ts.map +1 -0
- package/dist/cache/redisCache.js +171 -0
- package/dist/cache/redisCache.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +251 -0
- package/dist/config.js.map +1 -0
- package/dist/fallback/templateFallback.d.ts +7 -0
- package/dist/fallback/templateFallback.d.ts.map +1 -0
- package/dist/fallback/templateFallback.js +29 -0
- package/dist/fallback/templateFallback.js.map +1 -0
- package/dist/index.d.ts +121 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +198 -0
- package/dist/index.js.map +1 -0
- package/dist/logging.d.ts +10 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +44 -0
- package/dist/logging.js.map +1 -0
- package/dist/metrics/metrics.d.ts +22 -0
- package/dist/metrics/metrics.d.ts.map +1 -0
- package/dist/metrics/metrics.js +78 -0
- package/dist/metrics/metrics.js.map +1 -0
- package/dist/providers/factory.d.ts +11 -0
- package/dist/providers/factory.d.ts.map +1 -0
- package/dist/providers/factory.js +52 -0
- package/dist/providers/factory.js.map +1 -0
- package/dist/providers/hfSpace.adapter.d.ts +21 -0
- package/dist/providers/hfSpace.adapter.d.ts.map +1 -0
- package/dist/providers/hfSpace.adapter.js +110 -0
- package/dist/providers/hfSpace.adapter.js.map +1 -0
- package/dist/providers/httpTemplate.adapter.d.ts +42 -0
- package/dist/providers/httpTemplate.adapter.d.ts.map +1 -0
- package/dist/providers/httpTemplate.adapter.js +98 -0
- package/dist/providers/httpTemplate.adapter.js.map +1 -0
- package/dist/providers/promptBuilder.d.ts +34 -0
- package/dist/providers/promptBuilder.d.ts.map +1 -0
- package/dist/providers/promptBuilder.js +315 -0
- package/dist/providers/promptBuilder.js.map +1 -0
- package/dist/providers/provider.interface.d.ts +45 -0
- package/dist/providers/provider.interface.d.ts.map +1 -0
- package/dist/providers/provider.interface.js +47 -0
- package/dist/providers/provider.interface.js.map +1 -0
- package/dist/providers/specs.d.ts +18 -0
- package/dist/providers/specs.d.ts.map +1 -0
- package/dist/providers/specs.js +326 -0
- package/dist/providers/specs.js.map +1 -0
- package/dist/providers/unified.adapter.d.ts +37 -0
- package/dist/providers/unified.adapter.d.ts.map +1 -0
- package/dist/providers/unified.adapter.js +141 -0
- package/dist/providers/unified.adapter.js.map +1 -0
- package/dist/queue/producer.d.ts +30 -0
- package/dist/queue/producer.d.ts.map +1 -0
- package/dist/queue/producer.js +87 -0
- package/dist/queue/producer.js.map +1 -0
- package/dist/queue/worker.d.ts +9 -0
- package/dist/queue/worker.d.ts.map +1 -0
- package/dist/queue/worker.js +137 -0
- package/dist/queue/worker.js.map +1 -0
- package/dist/server/app.d.ts +4 -0
- package/dist/server/app.d.ts.map +1 -0
- package/dist/server/app.js +394 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/start.d.ts +16 -0
- package/dist/server/start.d.ts.map +1 -0
- package/dist/server/start.js +45 -0
- package/dist/server/start.js.map +1 -0
- package/dist/stepper/orchestrator.d.ts +22 -0
- package/dist/stepper/orchestrator.d.ts.map +1 -0
- package/dist/stepper/orchestrator.js +333 -0
- package/dist/stepper/orchestrator.js.map +1 -0
- package/dist/types.d.ts +216 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +14 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/redaction.d.ts +9 -0
- package/dist/utils/redaction.d.ts.map +1 -0
- package/dist/utils/redaction.js +41 -0
- package/dist/utils/redaction.js.map +1 -0
- package/dist/utils/safeRequest.d.ts +38 -0
- package/dist/utils/safeRequest.d.ts.map +1 -0
- package/dist/utils/safeRequest.js +104 -0
- package/dist/utils/safeRequest.js.map +1 -0
- package/dist/validation/report.schema.d.ts +48 -0
- package/dist/validation/report.schema.d.ts.map +1 -0
- package/dist/validation/report.schema.js +72 -0
- package/dist/validation/report.schema.js.map +1 -0
- package/dist/webhooks/delivery.d.ts +31 -0
- package/dist/webhooks/delivery.d.ts.map +1 -0
- package/dist/webhooks/delivery.js +102 -0
- package/dist/webhooks/delivery.js.map +1 -0
- package/docs/assets/architecture.png +0 -0
- package/package.json +75 -0
- package/render.yaml +25 -0
- package/src/alerts/README.md +25 -0
- package/src/alerts/discord.ts +86 -0
- package/src/cache/How redis caching works in package stepper.md +971 -0
- package/src/cache/README.md +51 -0
- package/src/cache/redisCache.ts +194 -0
- package/src/ci/deploy.sh +36 -0
- package/src/cli.ts +9 -0
- package/src/config.ts +265 -0
- package/src/fallback/templateFallback.ts +32 -0
- package/src/index.ts +246 -0
- package/src/logging.ts +46 -0
- package/src/metrics/README.md +24 -0
- package/src/metrics/metrics.ts +84 -0
- package/src/providers/How the providers interact.md +121 -0
- package/src/providers/README.md +121 -0
- package/src/providers/factory.ts +57 -0
- package/src/providers/hfSpace.adapter.ts +119 -0
- package/src/providers/httpTemplate.adapter.ts +138 -0
- package/src/providers/promptBuilder.ts +330 -0
- package/src/providers/provider.interface.ts +73 -0
- package/src/providers/specs.ts +366 -0
- package/src/providers/unified.adapter.ts +172 -0
- package/src/queue/How queue works in package stepper.md +149 -0
- package/src/queue/README.md +41 -0
- package/src/queue/producer.ts +108 -0
- package/src/queue/worker.ts +170 -0
- package/src/server/app.ts +451 -0
- package/src/server/start.ts +68 -0
- package/src/stepper/Dockerfile +48 -0
- package/src/stepper/How orchestrator works in package stepper.md +746 -0
- package/src/stepper/README.md +43 -0
- package/src/stepper/orchestrator.ts +437 -0
- package/src/types.ts +238 -0
- package/src/utils/redaction.ts +50 -0
- package/src/utils/safeRequest.ts +140 -0
- package/src/validation/README.md +25 -0
- package/src/validation/report.schema.ts +96 -0
- package/src/webhooks/delivery.ts +162 -0
- package/tests/integration/full-flow.test.ts +192 -0
- package/tests/unit/alerts/discord.test.ts +119 -0
- package/tests/unit/cache.test.ts +87 -0
- package/tests/unit/orchestrator-fallback.test.ts +92 -0
- package/tests/unit/orchestrator.test.ts +105 -0
- package/tests/unit/providers/factory.test.ts +161 -0
- package/tests/unit/providers/unified.adapter.test.ts +206 -0
- package/tests/unit/utils/redaction.test.ts +140 -0
- package/tests/unit/utils/safeRequest.test.ts +164 -0
- 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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|