@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.
Files changed (274) hide show
  1. package/LICENSE +191 -0
  2. package/dist/auth/api-key.d.ts +63 -0
  3. package/dist/auth/api-key.d.ts.map +1 -0
  4. package/dist/auth/api-key.js +102 -0
  5. package/dist/auth/api-key.js.map +1 -0
  6. package/dist/auth/github-oauth.d.ts +29 -0
  7. package/dist/auth/github-oauth.d.ts.map +1 -0
  8. package/dist/auth/github-oauth.js +136 -0
  9. package/dist/auth/github-oauth.js.map +1 -0
  10. package/dist/auth/index.d.ts +5 -0
  11. package/dist/auth/index.d.ts.map +1 -0
  12. package/dist/auth/index.js +9 -0
  13. package/dist/auth/index.js.map +1 -0
  14. package/dist/auth/jwt.d.ts +34 -0
  15. package/dist/auth/jwt.d.ts.map +1 -0
  16. package/dist/auth/jwt.js +74 -0
  17. package/dist/auth/jwt.js.map +1 -0
  18. package/dist/auth/middleware.d.ts +43 -0
  19. package/dist/auth/middleware.d.ts.map +1 -0
  20. package/dist/auth/middleware.js +101 -0
  21. package/dist/auth/middleware.js.map +1 -0
  22. package/dist/config/index.d.ts +3 -0
  23. package/dist/config/index.d.ts.map +1 -0
  24. package/dist/config/index.js +5 -0
  25. package/dist/config/index.js.map +1 -0
  26. package/dist/config/loader.d.ts +21 -0
  27. package/dist/config/loader.d.ts.map +1 -0
  28. package/dist/config/loader.js +295 -0
  29. package/dist/config/loader.js.map +1 -0
  30. package/dist/config/schema.d.ts +733 -0
  31. package/dist/config/schema.d.ts.map +1 -0
  32. package/dist/config/schema.js +174 -0
  33. package/dist/config/schema.js.map +1 -0
  34. package/dist/index.d.ts +24 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +33 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/middleware/error-handler.d.ts +30 -0
  39. package/dist/middleware/error-handler.d.ts.map +1 -0
  40. package/dist/middleware/error-handler.js +173 -0
  41. package/dist/middleware/error-handler.js.map +1 -0
  42. package/dist/middleware/index.d.ts +4 -0
  43. package/dist/middleware/index.d.ts.map +1 -0
  44. package/dist/middleware/index.js +4 -0
  45. package/dist/middleware/index.js.map +1 -0
  46. package/dist/middleware/rate-limit.d.ts +32 -0
  47. package/dist/middleware/rate-limit.d.ts.map +1 -0
  48. package/dist/middleware/rate-limit.js +92 -0
  49. package/dist/middleware/rate-limit.js.map +1 -0
  50. package/dist/middleware/request-logger.d.ts +31 -0
  51. package/dist/middleware/request-logger.d.ts.map +1 -0
  52. package/dist/middleware/request-logger.js +89 -0
  53. package/dist/middleware/request-logger.js.map +1 -0
  54. package/dist/routes/agents.d.ts +7 -0
  55. package/dist/routes/agents.d.ts.map +1 -0
  56. package/dist/routes/agents.js +78 -0
  57. package/dist/routes/agents.js.map +1 -0
  58. package/dist/routes/dispatch.d.ts +8 -0
  59. package/dist/routes/dispatch.d.ts.map +1 -0
  60. package/dist/routes/dispatch.js +46 -0
  61. package/dist/routes/dispatch.js.map +1 -0
  62. package/dist/routes/events.d.ts +14 -0
  63. package/dist/routes/events.d.ts.map +1 -0
  64. package/dist/routes/events.js +240 -0
  65. package/dist/routes/events.js.map +1 -0
  66. package/dist/routes/health.d.ts +14 -0
  67. package/dist/routes/health.d.ts.map +1 -0
  68. package/dist/routes/health.js +132 -0
  69. package/dist/routes/health.js.map +1 -0
  70. package/dist/routes/index.d.ts +36 -0
  71. package/dist/routes/index.d.ts.map +1 -0
  72. package/dist/routes/index.js +34 -0
  73. package/dist/routes/index.js.map +1 -0
  74. package/dist/routes/integrations.d.ts +34 -0
  75. package/dist/routes/integrations.d.ts.map +1 -0
  76. package/dist/routes/integrations.js +81 -0
  77. package/dist/routes/integrations.js.map +1 -0
  78. package/dist/routes/metrics.d.ts +31 -0
  79. package/dist/routes/metrics.d.ts.map +1 -0
  80. package/dist/routes/metrics.js +157 -0
  81. package/dist/routes/metrics.js.map +1 -0
  82. package/dist/routes/pr-webhooks.d.ts +15 -0
  83. package/dist/routes/pr-webhooks.d.ts.map +1 -0
  84. package/dist/routes/pr-webhooks.js +114 -0
  85. package/dist/routes/pr-webhooks.js.map +1 -0
  86. package/dist/routes/queue.d.ts +7 -0
  87. package/dist/routes/queue.d.ts.map +1 -0
  88. package/dist/routes/queue.js +94 -0
  89. package/dist/routes/queue.js.map +1 -0
  90. package/dist/routes/webhooks.d.ts +15 -0
  91. package/dist/routes/webhooks.d.ts.map +1 -0
  92. package/dist/routes/webhooks.js +117 -0
  93. package/dist/routes/webhooks.js.map +1 -0
  94. package/dist/routes/workflows.d.ts +7 -0
  95. package/dist/routes/workflows.d.ts.map +1 -0
  96. package/dist/routes/workflows.js +138 -0
  97. package/dist/routes/workflows.js.map +1 -0
  98. package/dist/server.d.ts +35 -0
  99. package/dist/server.d.ts.map +1 -0
  100. package/dist/server.js +264 -0
  101. package/dist/server.js.map +1 -0
  102. package/dist/services/agent-registry.d.ts +89 -0
  103. package/dist/services/agent-registry.d.ts.map +1 -0
  104. package/dist/services/agent-registry.js +173 -0
  105. package/dist/services/agent-registry.js.map +1 -0
  106. package/dist/services/epic-completion-monitor-service.d.ts +69 -0
  107. package/dist/services/epic-completion-monitor-service.d.ts.map +1 -0
  108. package/dist/services/epic-completion-monitor-service.js +200 -0
  109. package/dist/services/epic-completion-monitor-service.js.map +1 -0
  110. package/dist/services/identity.d.ts +41 -0
  111. package/dist/services/identity.d.ts.map +1 -0
  112. package/dist/services/identity.js +91 -0
  113. package/dist/services/identity.js.map +1 -0
  114. package/dist/services/index.d.ts +13 -0
  115. package/dist/services/index.d.ts.map +1 -0
  116. package/dist/services/index.js +13 -0
  117. package/dist/services/index.js.map +1 -0
  118. package/dist/services/label-monitor-service.d.ts +95 -0
  119. package/dist/services/label-monitor-service.d.ts.map +1 -0
  120. package/dist/services/label-monitor-service.js +414 -0
  121. package/dist/services/label-monitor-service.js.map +1 -0
  122. package/dist/services/label-sync-service.d.ts +76 -0
  123. package/dist/services/label-sync-service.d.ts.map +1 -0
  124. package/dist/services/label-sync-service.js +108 -0
  125. package/dist/services/label-sync-service.js.map +1 -0
  126. package/dist/services/phase-tracker-service.d.ts +32 -0
  127. package/dist/services/phase-tracker-service.d.ts.map +1 -0
  128. package/dist/services/phase-tracker-service.js +82 -0
  129. package/dist/services/phase-tracker-service.js.map +1 -0
  130. package/dist/services/pr-feedback-monitor-service.d.ts +86 -0
  131. package/dist/services/pr-feedback-monitor-service.d.ts.map +1 -0
  132. package/dist/services/pr-feedback-monitor-service.js +423 -0
  133. package/dist/services/pr-feedback-monitor-service.js.map +1 -0
  134. package/dist/services/queue-service.d.ts +62 -0
  135. package/dist/services/queue-service.d.ts.map +1 -0
  136. package/dist/services/queue-service.js +147 -0
  137. package/dist/services/queue-service.js.map +1 -0
  138. package/dist/services/redis-queue-adapter.d.ts +35 -0
  139. package/dist/services/redis-queue-adapter.d.ts.map +1 -0
  140. package/dist/services/redis-queue-adapter.js +218 -0
  141. package/dist/services/redis-queue-adapter.js.map +1 -0
  142. package/dist/services/smee-receiver.d.ts +87 -0
  143. package/dist/services/smee-receiver.d.ts.map +1 -0
  144. package/dist/services/smee-receiver.js +225 -0
  145. package/dist/services/smee-receiver.js.map +1 -0
  146. package/dist/services/webhook-setup-service.d.ts +253 -0
  147. package/dist/services/webhook-setup-service.d.ts.map +1 -0
  148. package/dist/services/webhook-setup-service.js +369 -0
  149. package/dist/services/webhook-setup-service.js.map +1 -0
  150. package/dist/services/worker-dispatcher.d.ts +57 -0
  151. package/dist/services/worker-dispatcher.d.ts.map +1 -0
  152. package/dist/services/worker-dispatcher.js +211 -0
  153. package/dist/services/worker-dispatcher.js.map +1 -0
  154. package/dist/services/workflow-service.d.ts +65 -0
  155. package/dist/services/workflow-service.d.ts.map +1 -0
  156. package/dist/services/workflow-service.js +164 -0
  157. package/dist/services/workflow-service.js.map +1 -0
  158. package/dist/sse/events.d.ts +50 -0
  159. package/dist/sse/events.d.ts.map +1 -0
  160. package/dist/sse/events.js +152 -0
  161. package/dist/sse/events.js.map +1 -0
  162. package/dist/sse/index.d.ts +4 -0
  163. package/dist/sse/index.d.ts.map +1 -0
  164. package/dist/sse/index.js +7 -0
  165. package/dist/sse/index.js.map +1 -0
  166. package/dist/sse/stream.d.ts +109 -0
  167. package/dist/sse/stream.d.ts.map +1 -0
  168. package/dist/sse/stream.js +239 -0
  169. package/dist/sse/stream.js.map +1 -0
  170. package/dist/sse/subscriptions.d.ts +91 -0
  171. package/dist/sse/subscriptions.d.ts.map +1 -0
  172. package/dist/sse/subscriptions.js +299 -0
  173. package/dist/sse/subscriptions.js.map +1 -0
  174. package/dist/types/api.d.ts +651 -0
  175. package/dist/types/api.d.ts.map +1 -0
  176. package/dist/types/api.js +169 -0
  177. package/dist/types/api.js.map +1 -0
  178. package/dist/types/index.d.ts +6 -0
  179. package/dist/types/index.d.ts.map +1 -0
  180. package/dist/types/index.js +27 -0
  181. package/dist/types/index.js.map +1 -0
  182. package/dist/types/monitor.d.ts +243 -0
  183. package/dist/types/monitor.d.ts.map +1 -0
  184. package/dist/types/monitor.js +2 -0
  185. package/dist/types/monitor.js.map +1 -0
  186. package/dist/types/problem-details.d.ts +63 -0
  187. package/dist/types/problem-details.d.ts.map +1 -0
  188. package/dist/types/problem-details.js +37 -0
  189. package/dist/types/problem-details.js.map +1 -0
  190. package/dist/types/sse.d.ts +224 -0
  191. package/dist/types/sse.d.ts.map +1 -0
  192. package/dist/types/sse.js +103 -0
  193. package/dist/types/sse.js.map +1 -0
  194. package/dist/types/webhook.d.ts +59 -0
  195. package/dist/types/webhook.d.ts.map +1 -0
  196. package/dist/types/webhook.js +2 -0
  197. package/dist/types/webhook.js.map +1 -0
  198. package/dist/utils/correlation.d.ts +30 -0
  199. package/dist/utils/correlation.d.ts.map +1 -0
  200. package/dist/utils/correlation.js +34 -0
  201. package/dist/utils/correlation.js.map +1 -0
  202. package/dist/utils/index.d.ts +3 -0
  203. package/dist/utils/index.d.ts.map +1 -0
  204. package/dist/utils/index.js +3 -0
  205. package/dist/utils/index.js.map +1 -0
  206. package/dist/utils/shutdown.d.ts +28 -0
  207. package/dist/utils/shutdown.d.ts.map +1 -0
  208. package/dist/utils/shutdown.js +86 -0
  209. package/dist/utils/shutdown.js.map +1 -0
  210. package/dist/worker/claude-cli-worker.d.ts +61 -0
  211. package/dist/worker/claude-cli-worker.d.ts.map +1 -0
  212. package/dist/worker/claude-cli-worker.js +330 -0
  213. package/dist/worker/claude-cli-worker.js.map +1 -0
  214. package/dist/worker/cli-spawner.d.ts +42 -0
  215. package/dist/worker/cli-spawner.d.ts.map +1 -0
  216. package/dist/worker/cli-spawner.js +183 -0
  217. package/dist/worker/cli-spawner.js.map +1 -0
  218. package/dist/worker/config.d.ts +76 -0
  219. package/dist/worker/config.d.ts.map +1 -0
  220. package/dist/worker/config.js +39 -0
  221. package/dist/worker/config.js.map +1 -0
  222. package/dist/worker/epic-post-tasks.d.ts +73 -0
  223. package/dist/worker/epic-post-tasks.d.ts.map +1 -0
  224. package/dist/worker/epic-post-tasks.js +266 -0
  225. package/dist/worker/epic-post-tasks.js.map +1 -0
  226. package/dist/worker/gate-checker.d.ts +22 -0
  227. package/dist/worker/gate-checker.d.ts.map +1 -0
  228. package/dist/worker/gate-checker.js +41 -0
  229. package/dist/worker/gate-checker.js.map +1 -0
  230. package/dist/worker/index.d.ts +13 -0
  231. package/dist/worker/index.d.ts.map +1 -0
  232. package/dist/worker/index.js +19 -0
  233. package/dist/worker/index.js.map +1 -0
  234. package/dist/worker/label-manager.d.ts +89 -0
  235. package/dist/worker/label-manager.d.ts.map +1 -0
  236. package/dist/worker/label-manager.js +200 -0
  237. package/dist/worker/label-manager.js.map +1 -0
  238. package/dist/worker/output-capture.d.ts +58 -0
  239. package/dist/worker/output-capture.d.ts.map +1 -0
  240. package/dist/worker/output-capture.js +153 -0
  241. package/dist/worker/output-capture.js.map +1 -0
  242. package/dist/worker/phase-loop.d.ts +64 -0
  243. package/dist/worker/phase-loop.d.ts.map +1 -0
  244. package/dist/worker/phase-loop.js +185 -0
  245. package/dist/worker/phase-loop.js.map +1 -0
  246. package/dist/worker/phase-resolver.d.ts +62 -0
  247. package/dist/worker/phase-resolver.d.ts.map +1 -0
  248. package/dist/worker/phase-resolver.js +144 -0
  249. package/dist/worker/phase-resolver.js.map +1 -0
  250. package/dist/worker/pr-feedback-handler.d.ts +105 -0
  251. package/dist/worker/pr-feedback-handler.d.ts.map +1 -0
  252. package/dist/worker/pr-feedback-handler.js +391 -0
  253. package/dist/worker/pr-feedback-handler.js.map +1 -0
  254. package/dist/worker/pr-linker.d.ts +69 -0
  255. package/dist/worker/pr-linker.d.ts.map +1 -0
  256. package/dist/worker/pr-linker.js +108 -0
  257. package/dist/worker/pr-linker.js.map +1 -0
  258. package/dist/worker/pr-manager.d.ts +61 -0
  259. package/dist/worker/pr-manager.d.ts.map +1 -0
  260. package/dist/worker/pr-manager.js +140 -0
  261. package/dist/worker/pr-manager.js.map +1 -0
  262. package/dist/worker/repo-checkout.d.ts +63 -0
  263. package/dist/worker/repo-checkout.d.ts.map +1 -0
  264. package/dist/worker/repo-checkout.js +160 -0
  265. package/dist/worker/repo-checkout.js.map +1 -0
  266. package/dist/worker/stage-comment-manager.d.ts +34 -0
  267. package/dist/worker/stage-comment-manager.d.ts.map +1 -0
  268. package/dist/worker/stage-comment-manager.js +114 -0
  269. package/dist/worker/stage-comment-manager.js.map +1 -0
  270. package/dist/worker/types.d.ts +192 -0
  271. package/dist/worker/types.d.ts.map +1 -0
  272. package/dist/worker/types.js +53 -0
  273. package/dist/worker/types.js.map +1 -0
  274. 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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAqB,MAAM,qBAAqB,CAAC;AAE5E;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAGlF;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,oDAAoD;IACpD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACtD,sBAAsB;IACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;CACpC,CAAC,CAAC;AAGH;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,2BAA2B;IAC3B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,wBAAwB,CAAC;CACxD,CAAC,CAAC;AAGH;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,6BAA6B;IAC7B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,iCAAiC;IACjC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,yBAAyB;IACzB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC;CACpF,CAAC,CAAC;AAGH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,kCAAkC;IAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1B,4BAA4B;IAC5B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACrC,CAAC,CAAC;AAGH;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,wCAAwC;IACxC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAClC,uCAAuC;IACvC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC3E,iFAAiF;IACjF,MAAM,EAAE,uBAAuB,CAAC,QAAQ,EAAE;IAC1C,wBAAwB;IACxB,GAAG,EAAE,eAAe;CACrB,CAAC,CAAC;AAGH;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,uCAAuC;IACvC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAClC,uCAAuC;IACvC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IAC7C,oCAAoC;IACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;CAC3C,CAAC,CAAC;AAGH;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,sDAAsD;IACtD,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7E,qCAAqC;IACrC,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CACvC,CAAC,CAAC;AAGH;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,gBAAgB;IAChB,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC;IACrC,0CAA0C;IAC1C,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACnC,CAAC,CAAC;AAGH;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,sCAAsC;IACtC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,sBAAsB;IACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACxB,CAAC,CAAC;AAGH;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,uCAAuC;IACvC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACzD,uDAAuD;IACvD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,yDAAyD;IACzD,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,wCAAwC;IACxC,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC1C,2EAA2E;IAC3E,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7C,CAAC,CAAC;AAGH;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,iDAAiD;IACjD,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAClC,uCAAuC;IACvC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACzD,uDAAuD;IACvD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,wCAAwC;IACxC,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC1C,yDAAyD;IACzD,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;CAC/D,CAAC,CAAC;AAGH;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,qDAAqD;IACrD,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAClC,4DAA4D;IAC5D,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;CAC5D,CAAC,CAAC;AAGH;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,mDAAmD;IACnD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACxD,2CAA2C;IAC3C,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,2CAA2C;IAC3C,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACzD,+DAA+D;IAC/D,wBAAwB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACnE,+DAA+D;IAC/D,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC5D,mDAAmD;IACnD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;CAC/C,CAAC,CAAC;AAGH,OAAO,EAAE,kBAAkB,EAAqB,CAAC;AAEjD;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;IACtC,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;IACpC,IAAI,EAAE,gBAAgB;IACtB,SAAS,EAAE,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;IAClC,OAAO,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;IACxC,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACzD,OAAO,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;IACxC,SAAS,EAAE,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,WAAW,EAAE,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC;IAChD,QAAQ,EAAE,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC;IAC1C,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;CACvC,CAAC,CAAC;AAGH;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,OAAO,wBAAwB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC"}
@@ -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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"}