@generacy-ai/orchestrator 0.0.0-preview-20260304013206
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/LICENSE +191 -0
- package/dist/auth/api-key.d.ts +63 -0
- package/dist/auth/api-key.d.ts.map +1 -0
- package/dist/auth/api-key.js +102 -0
- package/dist/auth/api-key.js.map +1 -0
- package/dist/auth/github-oauth.d.ts +29 -0
- package/dist/auth/github-oauth.d.ts.map +1 -0
- package/dist/auth/github-oauth.js +136 -0
- package/dist/auth/github-oauth.js.map +1 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +9 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/jwt.d.ts +34 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/jwt.js +74 -0
- package/dist/auth/jwt.js.map +1 -0
- package/dist/auth/middleware.d.ts +43 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +101 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +5 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +21 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +295 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +733 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +174 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +30 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +173 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/index.d.ts +4 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +4 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/rate-limit.d.ts +32 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -0
- package/dist/middleware/rate-limit.js +92 -0
- package/dist/middleware/rate-limit.js.map +1 -0
- package/dist/middleware/request-logger.d.ts +31 -0
- package/dist/middleware/request-logger.d.ts.map +1 -0
- package/dist/middleware/request-logger.js +89 -0
- package/dist/middleware/request-logger.js.map +1 -0
- package/dist/routes/agents.d.ts +7 -0
- package/dist/routes/agents.d.ts.map +1 -0
- package/dist/routes/agents.js +78 -0
- package/dist/routes/agents.js.map +1 -0
- package/dist/routes/dispatch.d.ts +8 -0
- package/dist/routes/dispatch.d.ts.map +1 -0
- package/dist/routes/dispatch.js +46 -0
- package/dist/routes/dispatch.js.map +1 -0
- package/dist/routes/events.d.ts +14 -0
- package/dist/routes/events.d.ts.map +1 -0
- package/dist/routes/events.js +240 -0
- package/dist/routes/events.js.map +1 -0
- package/dist/routes/health.d.ts +14 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +132 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/index.d.ts +36 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +34 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/integrations.d.ts +34 -0
- package/dist/routes/integrations.d.ts.map +1 -0
- package/dist/routes/integrations.js +81 -0
- package/dist/routes/integrations.js.map +1 -0
- package/dist/routes/metrics.d.ts +31 -0
- package/dist/routes/metrics.d.ts.map +1 -0
- package/dist/routes/metrics.js +157 -0
- package/dist/routes/metrics.js.map +1 -0
- package/dist/routes/pr-webhooks.d.ts +15 -0
- package/dist/routes/pr-webhooks.d.ts.map +1 -0
- package/dist/routes/pr-webhooks.js +114 -0
- package/dist/routes/pr-webhooks.js.map +1 -0
- package/dist/routes/queue.d.ts +7 -0
- package/dist/routes/queue.d.ts.map +1 -0
- package/dist/routes/queue.js +94 -0
- package/dist/routes/queue.js.map +1 -0
- package/dist/routes/webhooks.d.ts +15 -0
- package/dist/routes/webhooks.d.ts.map +1 -0
- package/dist/routes/webhooks.js +117 -0
- package/dist/routes/webhooks.js.map +1 -0
- package/dist/routes/workflows.d.ts +7 -0
- package/dist/routes/workflows.d.ts.map +1 -0
- package/dist/routes/workflows.js +138 -0
- package/dist/routes/workflows.js.map +1 -0
- package/dist/server.d.ts +35 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +264 -0
- package/dist/server.js.map +1 -0
- package/dist/services/agent-registry.d.ts +89 -0
- package/dist/services/agent-registry.d.ts.map +1 -0
- package/dist/services/agent-registry.js +173 -0
- package/dist/services/agent-registry.js.map +1 -0
- package/dist/services/epic-completion-monitor-service.d.ts +69 -0
- package/dist/services/epic-completion-monitor-service.d.ts.map +1 -0
- package/dist/services/epic-completion-monitor-service.js +200 -0
- package/dist/services/epic-completion-monitor-service.js.map +1 -0
- package/dist/services/identity.d.ts +41 -0
- package/dist/services/identity.d.ts.map +1 -0
- package/dist/services/identity.js +91 -0
- package/dist/services/identity.js.map +1 -0
- package/dist/services/index.d.ts +13 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +13 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/label-monitor-service.d.ts +95 -0
- package/dist/services/label-monitor-service.d.ts.map +1 -0
- package/dist/services/label-monitor-service.js +414 -0
- package/dist/services/label-monitor-service.js.map +1 -0
- package/dist/services/label-sync-service.d.ts +76 -0
- package/dist/services/label-sync-service.d.ts.map +1 -0
- package/dist/services/label-sync-service.js +108 -0
- package/dist/services/label-sync-service.js.map +1 -0
- package/dist/services/phase-tracker-service.d.ts +32 -0
- package/dist/services/phase-tracker-service.d.ts.map +1 -0
- package/dist/services/phase-tracker-service.js +82 -0
- package/dist/services/phase-tracker-service.js.map +1 -0
- package/dist/services/pr-feedback-monitor-service.d.ts +86 -0
- package/dist/services/pr-feedback-monitor-service.d.ts.map +1 -0
- package/dist/services/pr-feedback-monitor-service.js +423 -0
- package/dist/services/pr-feedback-monitor-service.js.map +1 -0
- package/dist/services/queue-service.d.ts +62 -0
- package/dist/services/queue-service.d.ts.map +1 -0
- package/dist/services/queue-service.js +147 -0
- package/dist/services/queue-service.js.map +1 -0
- package/dist/services/redis-queue-adapter.d.ts +35 -0
- package/dist/services/redis-queue-adapter.d.ts.map +1 -0
- package/dist/services/redis-queue-adapter.js +218 -0
- package/dist/services/redis-queue-adapter.js.map +1 -0
- package/dist/services/smee-receiver.d.ts +87 -0
- package/dist/services/smee-receiver.d.ts.map +1 -0
- package/dist/services/smee-receiver.js +225 -0
- package/dist/services/smee-receiver.js.map +1 -0
- package/dist/services/webhook-setup-service.d.ts +253 -0
- package/dist/services/webhook-setup-service.d.ts.map +1 -0
- package/dist/services/webhook-setup-service.js +369 -0
- package/dist/services/webhook-setup-service.js.map +1 -0
- package/dist/services/worker-dispatcher.d.ts +57 -0
- package/dist/services/worker-dispatcher.d.ts.map +1 -0
- package/dist/services/worker-dispatcher.js +211 -0
- package/dist/services/worker-dispatcher.js.map +1 -0
- package/dist/services/workflow-service.d.ts +65 -0
- package/dist/services/workflow-service.d.ts.map +1 -0
- package/dist/services/workflow-service.js +164 -0
- package/dist/services/workflow-service.js.map +1 -0
- package/dist/sse/events.d.ts +50 -0
- package/dist/sse/events.d.ts.map +1 -0
- package/dist/sse/events.js +152 -0
- package/dist/sse/events.js.map +1 -0
- package/dist/sse/index.d.ts +4 -0
- package/dist/sse/index.d.ts.map +1 -0
- package/dist/sse/index.js +7 -0
- package/dist/sse/index.js.map +1 -0
- package/dist/sse/stream.d.ts +109 -0
- package/dist/sse/stream.d.ts.map +1 -0
- package/dist/sse/stream.js +239 -0
- package/dist/sse/stream.js.map +1 -0
- package/dist/sse/subscriptions.d.ts +91 -0
- package/dist/sse/subscriptions.d.ts.map +1 -0
- package/dist/sse/subscriptions.js +299 -0
- package/dist/sse/subscriptions.js.map +1 -0
- package/dist/types/api.d.ts +651 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +169 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +27 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/monitor.d.ts +243 -0
- package/dist/types/monitor.d.ts.map +1 -0
- package/dist/types/monitor.js +2 -0
- package/dist/types/monitor.js.map +1 -0
- package/dist/types/problem-details.d.ts +63 -0
- package/dist/types/problem-details.d.ts.map +1 -0
- package/dist/types/problem-details.js +37 -0
- package/dist/types/problem-details.js.map +1 -0
- package/dist/types/sse.d.ts +224 -0
- package/dist/types/sse.d.ts.map +1 -0
- package/dist/types/sse.js +103 -0
- package/dist/types/sse.js.map +1 -0
- package/dist/types/webhook.d.ts +59 -0
- package/dist/types/webhook.d.ts.map +1 -0
- package/dist/types/webhook.js +2 -0
- package/dist/types/webhook.js.map +1 -0
- package/dist/utils/correlation.d.ts +30 -0
- package/dist/utils/correlation.d.ts.map +1 -0
- package/dist/utils/correlation.js +34 -0
- package/dist/utils/correlation.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/shutdown.d.ts +28 -0
- package/dist/utils/shutdown.d.ts.map +1 -0
- package/dist/utils/shutdown.js +86 -0
- package/dist/utils/shutdown.js.map +1 -0
- package/dist/worker/claude-cli-worker.d.ts +61 -0
- package/dist/worker/claude-cli-worker.d.ts.map +1 -0
- package/dist/worker/claude-cli-worker.js +330 -0
- package/dist/worker/claude-cli-worker.js.map +1 -0
- package/dist/worker/cli-spawner.d.ts +42 -0
- package/dist/worker/cli-spawner.d.ts.map +1 -0
- package/dist/worker/cli-spawner.js +183 -0
- package/dist/worker/cli-spawner.js.map +1 -0
- package/dist/worker/config.d.ts +76 -0
- package/dist/worker/config.d.ts.map +1 -0
- package/dist/worker/config.js +39 -0
- package/dist/worker/config.js.map +1 -0
- package/dist/worker/epic-post-tasks.d.ts +73 -0
- package/dist/worker/epic-post-tasks.d.ts.map +1 -0
- package/dist/worker/epic-post-tasks.js +266 -0
- package/dist/worker/epic-post-tasks.js.map +1 -0
- package/dist/worker/gate-checker.d.ts +22 -0
- package/dist/worker/gate-checker.d.ts.map +1 -0
- package/dist/worker/gate-checker.js +41 -0
- package/dist/worker/gate-checker.js.map +1 -0
- package/dist/worker/index.d.ts +13 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +19 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/label-manager.d.ts +89 -0
- package/dist/worker/label-manager.d.ts.map +1 -0
- package/dist/worker/label-manager.js +200 -0
- package/dist/worker/label-manager.js.map +1 -0
- package/dist/worker/output-capture.d.ts +58 -0
- package/dist/worker/output-capture.d.ts.map +1 -0
- package/dist/worker/output-capture.js +153 -0
- package/dist/worker/output-capture.js.map +1 -0
- package/dist/worker/phase-loop.d.ts +64 -0
- package/dist/worker/phase-loop.d.ts.map +1 -0
- package/dist/worker/phase-loop.js +185 -0
- package/dist/worker/phase-loop.js.map +1 -0
- package/dist/worker/phase-resolver.d.ts +62 -0
- package/dist/worker/phase-resolver.d.ts.map +1 -0
- package/dist/worker/phase-resolver.js +144 -0
- package/dist/worker/phase-resolver.js.map +1 -0
- package/dist/worker/pr-feedback-handler.d.ts +105 -0
- package/dist/worker/pr-feedback-handler.d.ts.map +1 -0
- package/dist/worker/pr-feedback-handler.js +391 -0
- package/dist/worker/pr-feedback-handler.js.map +1 -0
- package/dist/worker/pr-linker.d.ts +69 -0
- package/dist/worker/pr-linker.d.ts.map +1 -0
- package/dist/worker/pr-linker.js +108 -0
- package/dist/worker/pr-linker.js.map +1 -0
- package/dist/worker/pr-manager.d.ts +61 -0
- package/dist/worker/pr-manager.d.ts.map +1 -0
- package/dist/worker/pr-manager.js +140 -0
- package/dist/worker/pr-manager.js.map +1 -0
- package/dist/worker/repo-checkout.d.ts +63 -0
- package/dist/worker/repo-checkout.d.ts.map +1 -0
- package/dist/worker/repo-checkout.js +160 -0
- package/dist/worker/repo-checkout.js.map +1 -0
- package/dist/worker/stage-comment-manager.d.ts +34 -0
- package/dist/worker/stage-comment-manager.d.ts.map +1 -0
- package/dist/worker/stage-comment-manager.js +114 -0
- package/dist/worker/stage-comment-manager.js.map +1 -0
- package/dist/worker/types.d.ts +192 -0
- package/dist/worker/types.d.ts.map +1 -0
- package/dist/worker/types.js +53 -0
- package/dist/worker/types.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { WorkerConfigSchema } from '../worker/config.js';
|
|
3
|
+
/**
|
|
4
|
+
* Logging level configuration
|
|
5
|
+
*/
|
|
6
|
+
export const LogLevelSchema = z.enum(['trace', 'debug', 'info', 'warn', 'error']);
|
|
7
|
+
/**
|
|
8
|
+
* Server configuration
|
|
9
|
+
*/
|
|
10
|
+
export const ServerConfigSchema = z.object({
|
|
11
|
+
/** Port to listen on (0 = random available port) */
|
|
12
|
+
port: z.number().int().min(0).max(65535).default(3000),
|
|
13
|
+
/** Host to bind to */
|
|
14
|
+
host: z.string().default('0.0.0.0'),
|
|
15
|
+
});
|
|
16
|
+
/**
|
|
17
|
+
* Redis configuration
|
|
18
|
+
*/
|
|
19
|
+
export const RedisConfigSchema = z.object({
|
|
20
|
+
/** Redis connection URL */
|
|
21
|
+
url: z.string().url().default('redis://localhost:6379'),
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* GitHub OAuth configuration
|
|
25
|
+
*/
|
|
26
|
+
export const GitHubOAuthConfigSchema = z.object({
|
|
27
|
+
/** GitHub OAuth client ID */
|
|
28
|
+
clientId: z.string().min(1),
|
|
29
|
+
/** GitHub OAuth client secret */
|
|
30
|
+
clientSecret: z.string().min(1),
|
|
31
|
+
/** OAuth callback URL */
|
|
32
|
+
callbackUrl: z.string().url().default('http://localhost:3000/auth/github/callback'),
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* JWT configuration
|
|
36
|
+
*/
|
|
37
|
+
export const JWTConfigSchema = z.object({
|
|
38
|
+
/** Secret key for signing JWTs */
|
|
39
|
+
secret: z.string().min(32),
|
|
40
|
+
/** Token expiration time */
|
|
41
|
+
expiresIn: z.string().default('24h'),
|
|
42
|
+
});
|
|
43
|
+
/**
|
|
44
|
+
* Authentication configuration
|
|
45
|
+
*/
|
|
46
|
+
export const AuthConfigSchema = z.object({
|
|
47
|
+
/** Whether authentication is enabled */
|
|
48
|
+
enabled: z.boolean().default(true),
|
|
49
|
+
/** Enabled authentication providers */
|
|
50
|
+
providers: z.array(z.enum(['apiKey', 'github-oauth2'])).default(['apiKey']),
|
|
51
|
+
/** GitHub OAuth configuration (required if github-oauth2 provider is enabled) */
|
|
52
|
+
github: GitHubOAuthConfigSchema.optional(),
|
|
53
|
+
/** JWT configuration */
|
|
54
|
+
jwt: JWTConfigSchema,
|
|
55
|
+
});
|
|
56
|
+
/**
|
|
57
|
+
* Rate limit configuration
|
|
58
|
+
*/
|
|
59
|
+
export const RateLimitConfigSchema = z.object({
|
|
60
|
+
/** Whether rate limiting is enabled */
|
|
61
|
+
enabled: z.boolean().default(true),
|
|
62
|
+
/** Maximum requests per time window */
|
|
63
|
+
max: z.number().int().positive().default(100),
|
|
64
|
+
/** Time window for rate limiting */
|
|
65
|
+
timeWindow: z.string().default('1 minute'),
|
|
66
|
+
});
|
|
67
|
+
/**
|
|
68
|
+
* CORS configuration
|
|
69
|
+
*/
|
|
70
|
+
export const CorsConfigSchema = z.object({
|
|
71
|
+
/** Allowed origins (true = reflect request origin) */
|
|
72
|
+
origin: z.union([z.boolean(), z.string(), z.array(z.string())]).default(true),
|
|
73
|
+
/** Whether to include credentials */
|
|
74
|
+
credentials: z.boolean().default(true),
|
|
75
|
+
});
|
|
76
|
+
/**
|
|
77
|
+
* Logging configuration
|
|
78
|
+
*/
|
|
79
|
+
export const LoggingConfigSchema = z.object({
|
|
80
|
+
/** Log level */
|
|
81
|
+
level: LogLevelSchema.default('info'),
|
|
82
|
+
/** Pretty print logs (for development) */
|
|
83
|
+
pretty: z.boolean().default(false),
|
|
84
|
+
});
|
|
85
|
+
/**
|
|
86
|
+
* Repository configuration for label sync
|
|
87
|
+
*/
|
|
88
|
+
export const RepositoryConfigSchema = z.object({
|
|
89
|
+
/** GitHub organization or username */
|
|
90
|
+
owner: z.string().min(1),
|
|
91
|
+
/** Repository name */
|
|
92
|
+
repo: z.string().min(1),
|
|
93
|
+
});
|
|
94
|
+
/**
|
|
95
|
+
* Monitor configuration for label detection
|
|
96
|
+
*/
|
|
97
|
+
export const MonitorConfigSchema = z.object({
|
|
98
|
+
/** Polling interval in milliseconds */
|
|
99
|
+
pollIntervalMs: z.number().int().min(5000).default(30000),
|
|
100
|
+
/** GitHub webhook secret for signature verification */
|
|
101
|
+
webhookSecret: z.string().optional(),
|
|
102
|
+
/** Maximum concurrent GitHub API calls during polling */
|
|
103
|
+
maxConcurrentPolls: z.number().int().min(1).max(20).default(5),
|
|
104
|
+
/** Enable adaptive polling frequency */
|
|
105
|
+
adaptivePolling: z.boolean().default(true),
|
|
106
|
+
/** GitHub username for this cluster — used to filter issues by assignee */
|
|
107
|
+
clusterGithubUsername: z.string().optional(),
|
|
108
|
+
});
|
|
109
|
+
/**
|
|
110
|
+
* PR feedback monitor configuration
|
|
111
|
+
*/
|
|
112
|
+
export const PrMonitorConfigSchema = z.object({
|
|
113
|
+
/** Whether the PR feedback monitor is enabled */
|
|
114
|
+
enabled: z.boolean().default(true),
|
|
115
|
+
/** Polling interval in milliseconds */
|
|
116
|
+
pollIntervalMs: z.number().int().min(5000).default(60000),
|
|
117
|
+
/** GitHub webhook secret for signature verification */
|
|
118
|
+
webhookSecret: z.string().optional(),
|
|
119
|
+
/** Enable adaptive polling frequency */
|
|
120
|
+
adaptivePolling: z.boolean().default(true),
|
|
121
|
+
/** Maximum concurrent GitHub API calls during polling */
|
|
122
|
+
maxConcurrentPolls: z.number().int().min(1).max(20).default(3),
|
|
123
|
+
});
|
|
124
|
+
/**
|
|
125
|
+
* Epic completion monitor configuration
|
|
126
|
+
*/
|
|
127
|
+
export const EpicMonitorConfigSchema = z.object({
|
|
128
|
+
/** Whether the epic completion monitor is enabled */
|
|
129
|
+
enabled: z.boolean().default(true),
|
|
130
|
+
/** Polling interval in milliseconds (minimum 60 seconds) */
|
|
131
|
+
pollIntervalMs: z.number().int().min(60000).default(300000),
|
|
132
|
+
});
|
|
133
|
+
/**
|
|
134
|
+
* Dispatch configuration for worker queue and dispatcher
|
|
135
|
+
*/
|
|
136
|
+
export const DispatchConfigSchema = z.object({
|
|
137
|
+
/** Interval between queue polls in milliseconds */
|
|
138
|
+
pollIntervalMs: z.number().int().min(1000).default(5000),
|
|
139
|
+
/** Maximum number of concurrent workers */
|
|
140
|
+
maxConcurrentWorkers: z.number().int().min(1).max(20).default(3),
|
|
141
|
+
/** Worker heartbeat TTL in milliseconds */
|
|
142
|
+
heartbeatTtlMs: z.number().int().min(5000).default(30000),
|
|
143
|
+
/** Interval between heartbeat/reaper checks in milliseconds */
|
|
144
|
+
heartbeatCheckIntervalMs: z.number().int().min(5000).default(15000),
|
|
145
|
+
/** Timeout for graceful shutdown of workers in milliseconds */
|
|
146
|
+
shutdownTimeoutMs: z.number().int().min(5000).default(60000),
|
|
147
|
+
/** Maximum retry attempts before dead-lettering */
|
|
148
|
+
maxRetries: z.number().int().min(1).default(3),
|
|
149
|
+
});
|
|
150
|
+
export { WorkerConfigSchema };
|
|
151
|
+
/**
|
|
152
|
+
* Complete orchestrator configuration
|
|
153
|
+
*/
|
|
154
|
+
export const OrchestratorConfigSchema = z.object({
|
|
155
|
+
server: ServerConfigSchema.default({}),
|
|
156
|
+
redis: RedisConfigSchema.default({}),
|
|
157
|
+
auth: AuthConfigSchema,
|
|
158
|
+
rateLimit: RateLimitConfigSchema.default({}),
|
|
159
|
+
cors: CorsConfigSchema.default({}),
|
|
160
|
+
logging: LoggingConfigSchema.default({}),
|
|
161
|
+
repositories: z.array(RepositoryConfigSchema).default([]),
|
|
162
|
+
monitor: MonitorConfigSchema.default({}),
|
|
163
|
+
prMonitor: PrMonitorConfigSchema.default({}),
|
|
164
|
+
epicMonitor: EpicMonitorConfigSchema.default({}),
|
|
165
|
+
dispatch: DispatchConfigSchema.default({}),
|
|
166
|
+
worker: WorkerConfigSchema.default({}),
|
|
167
|
+
});
|
|
168
|
+
/**
|
|
169
|
+
* Validate configuration and return typed result
|
|
170
|
+
*/
|
|
171
|
+
export function validateConfig(config) {
|
|
172
|
+
return OrchestratorConfigSchema.parse(config);
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export { createServer, startServer, createTestServer, type CreateServerOptions } from './server.js';
|
|
2
|
+
export { loadConfig, createTestConfig, validateConfig, type OrchestratorConfig, type ServerConfig, type RedisConfig, type AuthConfig, type RateLimitConfig, type CorsConfig, type LoggingConfig, type LoadConfigOptions, type MonitorConfig, type RepositoryConfig, type DispatchConfig, } from './config/index.js';
|
|
3
|
+
export { type ProblemDetails, type ValidationError, type ErrorType, ErrorTypes, createProblemDetails, type WorkflowStatus, type CreateWorkflowRequest, type WorkflowResponse, type WorkflowListResponse, type ListWorkflowsQuery, type Pagination, type DecisionType, type DecisionPriority, type DecisionOption, type DecisionQueueItem, type CreateDecisionRequest, type DecisionResponseRequest, type DecisionResponse, type QueueQuery, type AgentType, type AgentConnectionStatus, type ConnectedAgent, type IntegrationType, type IntegrationStatusValue, type Integration, type IntegrationStatus, type HealthStatus, type ServiceStatus, type HealthResponse, type ApiScope, type ApiKeyCredential, type JWTPayload, type GitHubUser, type AuthContext, type SSEChannel, type SSEEventType, type SSEEvent, type WorkflowEventData, type WorkflowSSEEvent, type QueueEventData, type QueueSSEEvent, type AgentEventData, type AgentSSEEvent, type ErrorEventData, type ErrorSSEEvent, type SSEFilters, type SSESubscription, type SSEConnection, type SSEConnectionOptions, type SSEStreamConfig, DEFAULT_SSE_CONFIG, type QueueItem, type LabelEvent, type GitHubWebhookPayload, type MonitorState, type QueueAdapter, type PhaseTracker, type QueueItemWithScore, type SerializedQueueItem, type QueueManager, type WorkerInfo, type WorkerHandler, } from './types/index.js';
|
|
4
|
+
export { WorkflowService, InMemoryWorkflowStore, type WorkflowEngine, } from './services/workflow-service.js';
|
|
5
|
+
export { QueueService, InMemoryQueueStore, type MessageRouter, } from './services/queue-service.js';
|
|
6
|
+
export { AgentRegistry, type AgentRegistration, } from './services/agent-registry.js';
|
|
7
|
+
export { LabelSyncService, type LabelSyncResult, type RepoSyncResult, type SyncAllResult, } from './services/label-sync-service.js';
|
|
8
|
+
export { LabelMonitorService, type LabelMonitorOptions, } from './services/label-monitor-service.js';
|
|
9
|
+
export { SmeeWebhookReceiver, type SmeeReceiverOptions, } from './services/smee-receiver.js';
|
|
10
|
+
export { PhaseTrackerService, type PhaseTrackerOptions, } from './services/phase-tracker-service.js';
|
|
11
|
+
export { RedisQueueAdapter } from './services/redis-queue-adapter.js';
|
|
12
|
+
export { WorkerDispatcher } from './services/worker-dispatcher.js';
|
|
13
|
+
export { WebhookSetupService, type WebhookSetupSummary, type WebhookSetupResult, type GitHubWebhook, } from './services/webhook-setup-service.js';
|
|
14
|
+
export { resolveClusterIdentity, filterByAssignee, type FilterableIssue, } from './services/identity.js';
|
|
15
|
+
export { API_KEY_HEADER, hashApiKey, validateApiKey, InMemoryApiKeyStore, type ApiKeyStore, } from './auth/api-key.js';
|
|
16
|
+
export { createAuthMiddleware, requireScopes, requireRead, requireWrite, type AuthMiddlewareOptions, } from './auth/middleware.js';
|
|
17
|
+
export { setupRateLimit, generateRateLimitKey, } from './middleware/rate-limit.js';
|
|
18
|
+
export { setupErrorHandler, HttpError, Errors, } from './middleware/error-handler.js';
|
|
19
|
+
export { registerRoutes, type RouteRegistrationOptions, } from './routes/index.js';
|
|
20
|
+
export { InMemoryIntegrationRegistry, type IntegrationRegistry, } from './routes/integrations.js';
|
|
21
|
+
export { SSEStream, createSSEStream, parseLastEventId, formatSSEEvent, formatHeartbeat, createWorkflowEvent, createQueueEvent, createAgentEvent, createErrorEvent, createConnectedEvent, SSESubscriptionManager, getSSESubscriptionManager, resetSSESubscriptionManager, } from './sse/index.js';
|
|
22
|
+
export { setupEventsRoutes, getActiveConnectionCount, closeAllSSEConnections, } from './routes/events.js';
|
|
23
|
+
export { setupGracefulShutdown, CORRELATION_ID_HEADER, generateCorrelationId, } from './utils/index.js';
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Server
|
|
2
|
+
export { createServer, startServer, createTestServer } from './server.js';
|
|
3
|
+
// Configuration
|
|
4
|
+
export { loadConfig, createTestConfig, validateConfig, } from './config/index.js';
|
|
5
|
+
// Types
|
|
6
|
+
export { ErrorTypes, createProblemDetails, DEFAULT_SSE_CONFIG, } from './types/index.js';
|
|
7
|
+
// Services
|
|
8
|
+
export { WorkflowService, InMemoryWorkflowStore, } from './services/workflow-service.js';
|
|
9
|
+
export { QueueService, InMemoryQueueStore, } from './services/queue-service.js';
|
|
10
|
+
export { AgentRegistry, } from './services/agent-registry.js';
|
|
11
|
+
export { LabelSyncService, } from './services/label-sync-service.js';
|
|
12
|
+
export { LabelMonitorService, } from './services/label-monitor-service.js';
|
|
13
|
+
export { SmeeWebhookReceiver, } from './services/smee-receiver.js';
|
|
14
|
+
export { PhaseTrackerService, } from './services/phase-tracker-service.js';
|
|
15
|
+
export { RedisQueueAdapter } from './services/redis-queue-adapter.js';
|
|
16
|
+
export { WorkerDispatcher } from './services/worker-dispatcher.js';
|
|
17
|
+
export { WebhookSetupService, } from './services/webhook-setup-service.js';
|
|
18
|
+
export { resolveClusterIdentity, filterByAssignee, } from './services/identity.js';
|
|
19
|
+
// Auth
|
|
20
|
+
export { API_KEY_HEADER, hashApiKey, validateApiKey, InMemoryApiKeyStore, } from './auth/api-key.js';
|
|
21
|
+
export { createAuthMiddleware, requireScopes, requireRead, requireWrite, } from './auth/middleware.js';
|
|
22
|
+
// Middleware
|
|
23
|
+
export { setupRateLimit, generateRateLimitKey, } from './middleware/rate-limit.js';
|
|
24
|
+
export { setupErrorHandler, HttpError, Errors, } from './middleware/error-handler.js';
|
|
25
|
+
// Routes
|
|
26
|
+
export { registerRoutes, } from './routes/index.js';
|
|
27
|
+
export { InMemoryIntegrationRegistry, } from './routes/integrations.js';
|
|
28
|
+
// SSE
|
|
29
|
+
export { SSEStream, createSSEStream, parseLastEventId, formatSSEEvent, formatHeartbeat, createWorkflowEvent, createQueueEvent, createAgentEvent, createErrorEvent, createConnectedEvent, SSESubscriptionManager, getSSESubscriptionManager, resetSSESubscriptionManager, } from './sse/index.js';
|
|
30
|
+
export { setupEventsRoutes, getActiveConnectionCount, closeAllSSEConnections, } from './routes/events.js';
|
|
31
|
+
// Utils
|
|
32
|
+
export { setupGracefulShutdown, CORRELATION_ID_HEADER, generateCorrelationId, } from './utils/index.js';
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAA4B,MAAM,aAAa,CAAC;AAEpG,gBAAgB;AAChB,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,cAAc,GAYf,MAAM,mBAAmB,CAAC;AAE3B,QAAQ;AACR,OAAO,EAKL,UAAU,EACV,oBAAoB,EAqDpB,kBAAkB,GAcnB,MAAM,kBAAkB,CAAC;AAE1B,WAAW;AACX,OAAO,EACL,eAAe,EACf,qBAAqB,GAEtB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,YAAY,EACZ,kBAAkB,GAEnB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,aAAa,GAEd,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,gBAAgB,GAIjB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,mBAAmB,GAEpB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACL,mBAAmB,GAEpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,mBAAmB,GAEpB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,EACL,mBAAmB,GAIpB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACL,sBAAsB,EACtB,gBAAgB,GAEjB,MAAM,wBAAwB,CAAC;AAEhC,OAAO;AACP,OAAO,EACL,cAAc,EACd,UAAU,EACV,cAAc,EACd,mBAAmB,GAEpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,YAAY,GAEb,MAAM,sBAAsB,CAAC;AAE9B,aAAa;AACb,OAAO,EACL,cAAc,EACd,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,MAAM,GACP,MAAM,+BAA+B,CAAC;AAEvC,SAAS;AACT,OAAO,EACL,cAAc,GAEf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,2BAA2B,GAE5B,MAAM,0BAA0B,CAAC;AAElC,MAAM;AACN,OAAO,EACL,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAE5B,QAAQ;AACR,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { FastifyInstance, FastifyError, FastifyRequest } from 'fastify';
|
|
2
|
+
import { type ProblemDetails } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Create error response from various error types
|
|
5
|
+
*/
|
|
6
|
+
export declare function createErrorResponse(error: Error | FastifyError, request: FastifyRequest): ProblemDetails;
|
|
7
|
+
/**
|
|
8
|
+
* Setup global error handler
|
|
9
|
+
*/
|
|
10
|
+
export declare function setupErrorHandler(server: FastifyInstance): void;
|
|
11
|
+
/**
|
|
12
|
+
* Create a typed error with status code
|
|
13
|
+
*/
|
|
14
|
+
export declare class HttpError extends Error {
|
|
15
|
+
readonly statusCode: number;
|
|
16
|
+
readonly errorType: string;
|
|
17
|
+
constructor(statusCode: number, message: string, errorType?: string);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create common HTTP errors
|
|
21
|
+
*/
|
|
22
|
+
export declare const Errors: {
|
|
23
|
+
badRequest: (message: string) => HttpError;
|
|
24
|
+
unauthorized: (message: string) => HttpError;
|
|
25
|
+
forbidden: (message: string) => HttpError;
|
|
26
|
+
notFound: (message: string) => HttpError;
|
|
27
|
+
conflict: (message: string) => HttpError;
|
|
28
|
+
internal: (message: string) => HttpError;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=error-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/middleware/error-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE7E,OAAO,EACL,KAAK,cAAc,EAKpB,MAAM,mBAAmB,CAAC;AAmC3B;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,KAAK,GAAG,YAAY,EAC3B,OAAO,EAAE,cAAc,GACtB,cAAc,CAuChB;AAkDD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CA+B/D;AAED;;GAEG;AACH,qBAAa,SAAU,SAAQ,KAAK;IAClC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,SAAS,EAAE,MAAM,CAAC;gBAEtB,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;CAMpE;AAED;;GAEG;AACH,eAAO,MAAM,MAAM;0BACK,MAAM;4BACJ,MAAM;yBACT,MAAM;wBACP,MAAM;wBACN,MAAM;wBACN,MAAM;CAC3B,CAAC"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { ZodError } from 'zod';
|
|
2
|
+
import { ErrorTypes, createProblemDetails, } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Convert Zod error to validation errors
|
|
5
|
+
*/
|
|
6
|
+
function zodErrorToValidationErrors(error) {
|
|
7
|
+
return error.errors.map((issue) => ({
|
|
8
|
+
field: issue.path.join('.'),
|
|
9
|
+
message: issue.message,
|
|
10
|
+
code: issue.code,
|
|
11
|
+
}));
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Check if error is a Fastify validation error
|
|
15
|
+
*/
|
|
16
|
+
function isFastifyValidationError(error) {
|
|
17
|
+
return error.code === 'FST_ERR_VALIDATION' || error.validation !== undefined;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Convert Fastify validation error to validation errors
|
|
21
|
+
*/
|
|
22
|
+
function fastifyValidationToErrors(error) {
|
|
23
|
+
if (!error.validation) {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
return error.validation.map((v) => ({
|
|
27
|
+
field: v.instancePath?.replace(/^\//, '').replace(/\//g, '.') || v.params?.missingProperty || 'unknown',
|
|
28
|
+
message: v.message || 'Validation failed',
|
|
29
|
+
code: v.keyword || 'validation',
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create error response from various error types
|
|
34
|
+
*/
|
|
35
|
+
export function createErrorResponse(error, request) {
|
|
36
|
+
// Zod validation error
|
|
37
|
+
if (error instanceof ZodError) {
|
|
38
|
+
return createProblemDetails(ErrorTypes.VALIDATION_ERROR, 'Validation Error', 400, {
|
|
39
|
+
detail: 'Request validation failed',
|
|
40
|
+
instance: request.url,
|
|
41
|
+
traceId: request.correlationId,
|
|
42
|
+
errors: zodErrorToValidationErrors(error),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
// Fastify validation error
|
|
46
|
+
if ('code' in error && isFastifyValidationError(error)) {
|
|
47
|
+
return createProblemDetails(ErrorTypes.VALIDATION_ERROR, 'Validation Error', 400, {
|
|
48
|
+
detail: error.message,
|
|
49
|
+
instance: request.url,
|
|
50
|
+
traceId: request.correlationId,
|
|
51
|
+
errors: fastifyValidationToErrors(error),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
// Fastify error with status code
|
|
55
|
+
if ('statusCode' in error) {
|
|
56
|
+
const statusCode = error.statusCode || 500;
|
|
57
|
+
const errorType = getErrorTypeForStatus(statusCode);
|
|
58
|
+
return createProblemDetails(errorType, getErrorTitle(statusCode), statusCode, {
|
|
59
|
+
detail: error.message,
|
|
60
|
+
instance: request.url,
|
|
61
|
+
traceId: request.correlationId,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// Generic error
|
|
65
|
+
return createProblemDetails(ErrorTypes.INTERNAL, 'Internal Server Error', 500, {
|
|
66
|
+
detail: process.env.NODE_ENV === 'production' ? 'An unexpected error occurred' : error.message,
|
|
67
|
+
instance: request.url,
|
|
68
|
+
traceId: request.correlationId,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get error type URI for HTTP status code
|
|
73
|
+
*/
|
|
74
|
+
function getErrorTypeForStatus(statusCode) {
|
|
75
|
+
switch (statusCode) {
|
|
76
|
+
case 400:
|
|
77
|
+
return ErrorTypes.VALIDATION_ERROR;
|
|
78
|
+
case 401:
|
|
79
|
+
return ErrorTypes.UNAUTHORIZED;
|
|
80
|
+
case 403:
|
|
81
|
+
return ErrorTypes.FORBIDDEN;
|
|
82
|
+
case 404:
|
|
83
|
+
return ErrorTypes.NOT_FOUND;
|
|
84
|
+
case 409:
|
|
85
|
+
return ErrorTypes.CONFLICT;
|
|
86
|
+
case 429:
|
|
87
|
+
return ErrorTypes.RATE_LIMITED;
|
|
88
|
+
case 503:
|
|
89
|
+
return ErrorTypes.SERVICE_UNAVAILABLE;
|
|
90
|
+
default:
|
|
91
|
+
return ErrorTypes.INTERNAL;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get error title for HTTP status code
|
|
96
|
+
*/
|
|
97
|
+
function getErrorTitle(statusCode) {
|
|
98
|
+
switch (statusCode) {
|
|
99
|
+
case 400:
|
|
100
|
+
return 'Bad Request';
|
|
101
|
+
case 401:
|
|
102
|
+
return 'Unauthorized';
|
|
103
|
+
case 403:
|
|
104
|
+
return 'Forbidden';
|
|
105
|
+
case 404:
|
|
106
|
+
return 'Not Found';
|
|
107
|
+
case 409:
|
|
108
|
+
return 'Conflict';
|
|
109
|
+
case 429:
|
|
110
|
+
return 'Too Many Requests';
|
|
111
|
+
case 503:
|
|
112
|
+
return 'Service Unavailable';
|
|
113
|
+
default:
|
|
114
|
+
return 'Internal Server Error';
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Setup global error handler
|
|
119
|
+
*/
|
|
120
|
+
export function setupErrorHandler(server) {
|
|
121
|
+
server.setErrorHandler((error, request, reply) => {
|
|
122
|
+
const problemDetails = createErrorResponse(error, request);
|
|
123
|
+
// Log the error
|
|
124
|
+
if (problemDetails.status >= 500) {
|
|
125
|
+
request.log.error({ err: error, problemDetails }, 'Server error');
|
|
126
|
+
}
|
|
127
|
+
else if (problemDetails.status >= 400) {
|
|
128
|
+
request.log.warn({ err: error, problemDetails }, 'Client error');
|
|
129
|
+
}
|
|
130
|
+
// Send RFC 7807 response
|
|
131
|
+
return reply
|
|
132
|
+
.status(problemDetails.status)
|
|
133
|
+
.header('content-type', 'application/problem+json')
|
|
134
|
+
.send(problemDetails);
|
|
135
|
+
});
|
|
136
|
+
// Handle 404 Not Found
|
|
137
|
+
server.setNotFoundHandler((request, reply) => {
|
|
138
|
+
const problemDetails = createProblemDetails(ErrorTypes.NOT_FOUND, 'Not Found', 404, {
|
|
139
|
+
detail: `Route ${request.method} ${request.url} not found`,
|
|
140
|
+
instance: request.url,
|
|
141
|
+
traceId: request.correlationId,
|
|
142
|
+
});
|
|
143
|
+
return reply
|
|
144
|
+
.status(404)
|
|
145
|
+
.header('content-type', 'application/problem+json')
|
|
146
|
+
.send(problemDetails);
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Create a typed error with status code
|
|
151
|
+
*/
|
|
152
|
+
export class HttpError extends Error {
|
|
153
|
+
statusCode;
|
|
154
|
+
errorType;
|
|
155
|
+
constructor(statusCode, message, errorType) {
|
|
156
|
+
super(message);
|
|
157
|
+
this.name = 'HttpError';
|
|
158
|
+
this.statusCode = statusCode;
|
|
159
|
+
this.errorType = errorType || getErrorTypeForStatus(statusCode);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Create common HTTP errors
|
|
164
|
+
*/
|
|
165
|
+
export const Errors = {
|
|
166
|
+
badRequest: (message) => new HttpError(400, message, ErrorTypes.VALIDATION_ERROR),
|
|
167
|
+
unauthorized: (message) => new HttpError(401, message, ErrorTypes.UNAUTHORIZED),
|
|
168
|
+
forbidden: (message) => new HttpError(403, message, ErrorTypes.FORBIDDEN),
|
|
169
|
+
notFound: (message) => new HttpError(404, message, ErrorTypes.NOT_FOUND),
|
|
170
|
+
conflict: (message) => new HttpError(409, message, ErrorTypes.CONFLICT),
|
|
171
|
+
internal: (message) => new HttpError(500, message, ErrorTypes.INTERNAL),
|
|
172
|
+
};
|
|
173
|
+
//# sourceMappingURL=error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/middleware/error-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { generateRateLimitKey, parseTimeWindow, setupRateLimit, type RateLimitKeyOptions, type RateLimitInfo, } from './rate-limit.js';
|
|
2
|
+
export { requestStartHook, requestEndHook, requestErrorHook, sanitizeUrl, } from './request-logger.js';
|
|
3
|
+
export { createErrorResponse, setupErrorHandler, HttpError, Errors, } from './error-handler.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,KAAK,mBAAmB,EACxB,KAAK,aAAa,GACnB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,SAAS,EACT,MAAM,GACP,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { generateRateLimitKey, parseTimeWindow, setupRateLimit, } from './rate-limit.js';
|
|
2
|
+
export { requestStartHook, requestEndHook, requestErrorHook, sanitizeUrl, } from './request-logger.js';
|
|
3
|
+
export { createErrorResponse, setupErrorHandler, HttpError, Errors, } from './error-handler.js';
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,cAAc,GAGf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,SAAS,EACT,MAAM,GACP,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { FastifyInstance, FastifyRequest } from 'fastify';
|
|
2
|
+
import type { RateLimitConfig } from '../config/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Rate limit key generator options
|
|
5
|
+
*/
|
|
6
|
+
export interface RateLimitKeyOptions {
|
|
7
|
+
/** Use API key for rate limiting (default: true) */
|
|
8
|
+
useApiKey?: boolean;
|
|
9
|
+
/** Fallback to IP if no API key (default: true) */
|
|
10
|
+
fallbackToIp?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Generate rate limit key from request
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateRateLimitKey(request: FastifyRequest, options?: RateLimitKeyOptions): string;
|
|
16
|
+
/**
|
|
17
|
+
* Parse time window string to milliseconds
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseTimeWindow(timeWindow: string): number;
|
|
20
|
+
/**
|
|
21
|
+
* Setup rate limiting middleware
|
|
22
|
+
*/
|
|
23
|
+
export declare function setupRateLimit(server: FastifyInstance, config: RateLimitConfig): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Rate limit info for a key
|
|
26
|
+
*/
|
|
27
|
+
export interface RateLimitInfo {
|
|
28
|
+
limit: number;
|
|
29
|
+
remaining: number;
|
|
30
|
+
reset: number;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=rate-limit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,oDAAoD;IACpD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,cAAc,EACvB,OAAO,GAAE,mBAAwB,GAChC,MAAM,CAwBR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA4B1D;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC,CAkCf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { API_KEY_HEADER } from '../auth/api-key.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate rate limit key from request
|
|
4
|
+
*/
|
|
5
|
+
export function generateRateLimitKey(request, options = {}) {
|
|
6
|
+
const { useApiKey = true, fallbackToIp = true } = options;
|
|
7
|
+
// Try API key first
|
|
8
|
+
if (useApiKey) {
|
|
9
|
+
const apiKey = request.headers[API_KEY_HEADER];
|
|
10
|
+
if (typeof apiKey === 'string' && apiKey.length > 0) {
|
|
11
|
+
// Use first 8 chars of API key as identifier (avoid exposing full key)
|
|
12
|
+
return `apikey:${apiKey.substring(0, 8)}`;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
// Try authenticated user
|
|
16
|
+
if (request.auth?.userId) {
|
|
17
|
+
return `user:${request.auth.userId}`;
|
|
18
|
+
}
|
|
19
|
+
// Fallback to IP
|
|
20
|
+
if (fallbackToIp) {
|
|
21
|
+
const ip = request.ip || request.headers['x-forwarded-for'] || 'unknown';
|
|
22
|
+
return `ip:${Array.isArray(ip) ? ip[0] : ip}`;
|
|
23
|
+
}
|
|
24
|
+
return 'anonymous';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Parse time window string to milliseconds
|
|
28
|
+
*/
|
|
29
|
+
export function parseTimeWindow(timeWindow) {
|
|
30
|
+
const match = timeWindow.match(/^(\d+)\s*(s|sec|second|seconds|m|min|minute|minutes|h|hour|hours)$/i);
|
|
31
|
+
if (!match || !match[1] || !match[2]) {
|
|
32
|
+
// Default to 1 minute
|
|
33
|
+
return 60 * 1000;
|
|
34
|
+
}
|
|
35
|
+
const value = parseInt(match[1], 10);
|
|
36
|
+
const unit = match[2].toLowerCase();
|
|
37
|
+
switch (unit) {
|
|
38
|
+
case 's':
|
|
39
|
+
case 'sec':
|
|
40
|
+
case 'second':
|
|
41
|
+
case 'seconds':
|
|
42
|
+
return value * 1000;
|
|
43
|
+
case 'm':
|
|
44
|
+
case 'min':
|
|
45
|
+
case 'minute':
|
|
46
|
+
case 'minutes':
|
|
47
|
+
return value * 60 * 1000;
|
|
48
|
+
case 'h':
|
|
49
|
+
case 'hour':
|
|
50
|
+
case 'hours':
|
|
51
|
+
return value * 60 * 60 * 1000;
|
|
52
|
+
default:
|
|
53
|
+
return 60 * 1000;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Setup rate limiting middleware
|
|
58
|
+
*/
|
|
59
|
+
export async function setupRateLimit(server, config) {
|
|
60
|
+
if (!config.enabled) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const rateLimit = await import('@fastify/rate-limit');
|
|
64
|
+
await server.register(rateLimit.default, {
|
|
65
|
+
max: config.max,
|
|
66
|
+
timeWindow: parseTimeWindow(config.timeWindow),
|
|
67
|
+
keyGenerator: (request) => generateRateLimitKey(request),
|
|
68
|
+
errorResponseBuilder: (request, context) => {
|
|
69
|
+
return {
|
|
70
|
+
type: 'urn:generacy:error:rate-limited',
|
|
71
|
+
title: 'Rate Limit Exceeded',
|
|
72
|
+
status: 429,
|
|
73
|
+
detail: `You have exceeded the rate limit of ${context.max} requests per ${config.timeWindow}`,
|
|
74
|
+
instance: request.url,
|
|
75
|
+
traceId: request.correlationId,
|
|
76
|
+
retryAfter: Math.ceil(context.ttl / 1000),
|
|
77
|
+
};
|
|
78
|
+
},
|
|
79
|
+
addHeadersOnExceeding: {
|
|
80
|
+
'x-ratelimit-limit': true,
|
|
81
|
+
'x-ratelimit-remaining': true,
|
|
82
|
+
'x-ratelimit-reset': true,
|
|
83
|
+
},
|
|
84
|
+
addHeaders: {
|
|
85
|
+
'x-ratelimit-limit': true,
|
|
86
|
+
'x-ratelimit-remaining': true,
|
|
87
|
+
'x-ratelimit-reset': true,
|
|
88
|
+
'retry-after': true,
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=rate-limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"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"}
|