@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,74 @@
1
+ /**
2
+ * Create JWT payload from GitHub user
3
+ */
4
+ export function createJWTPayloadFromGitHubUser(user, scopes = ['workflows:read', 'queue:read', 'agents:read']) {
5
+ return {
6
+ sub: `github:${user.id}`,
7
+ name: user.name || user.login,
8
+ email: user.email,
9
+ provider: 'github',
10
+ scopes,
11
+ };
12
+ }
13
+ /**
14
+ * Sign a JWT token using Fastify JWT plugin
15
+ */
16
+ export async function signToken(server, payload) {
17
+ return server.jwt.sign(payload);
18
+ }
19
+ /**
20
+ * Verify and decode a JWT token
21
+ */
22
+ export async function verifyToken(request) {
23
+ try {
24
+ await request.jwtVerify();
25
+ return request.user;
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
31
+ /**
32
+ * Create auth context from JWT payload
33
+ */
34
+ export function createAuthContextFromJWT(payload) {
35
+ return {
36
+ userId: payload.sub,
37
+ method: 'jwt',
38
+ scopes: payload.scopes,
39
+ };
40
+ }
41
+ /**
42
+ * Extract bearer token from authorization header
43
+ */
44
+ export function extractBearerToken(authHeader) {
45
+ if (!authHeader) {
46
+ return null;
47
+ }
48
+ const parts = authHeader.split(' ');
49
+ if (parts.length !== 2 || parts[0]?.toLowerCase() !== 'bearer') {
50
+ return null;
51
+ }
52
+ return parts[1] ?? null;
53
+ }
54
+ /**
55
+ * Decode JWT payload without verification (for debugging)
56
+ */
57
+ export function decodeTokenPayload(token) {
58
+ try {
59
+ const parts = token.split('.');
60
+ if (parts.length !== 3) {
61
+ return null;
62
+ }
63
+ const payload = parts[1];
64
+ if (!payload) {
65
+ return null;
66
+ }
67
+ const decoded = Buffer.from(payload, 'base64url').toString('utf-8');
68
+ return JSON.parse(decoded);
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ }
74
+ //# sourceMappingURL=jwt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/auth/jwt.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAC5C,IAAgB,EAChB,SAAqB,CAAC,gBAAgB,EAAE,YAAY,EAAE,aAAa,CAAC;IAEpE,OAAO;QACL,GAAG,EAAE,UAAU,IAAI,CAAC,EAAE,EAAE;QACxB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE,QAAQ;QAClB,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAAuB,EACvB,OAAwC;IAExC,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAuB;IAEvB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC,IAAkB,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAmB;IAC1D,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,GAAG;QACnB,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAA8B;IAC/D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { FastifyRequest, FastifyReply } from 'fastify';
2
+ import type { AuthContext, ApiScope } from '../types/index.js';
3
+ import { type ApiKeyStore } from './api-key.js';
4
+ /**
5
+ * Augment FastifyRequest to include auth context
6
+ */
7
+ declare module 'fastify' {
8
+ interface FastifyRequest {
9
+ auth: AuthContext;
10
+ }
11
+ }
12
+ /**
13
+ * Authentication middleware options
14
+ */
15
+ export interface AuthMiddlewareOptions {
16
+ /** API key store for validating API keys */
17
+ apiKeyStore: ApiKeyStore;
18
+ /** Whether authentication is enabled */
19
+ enabled?: boolean;
20
+ /** Routes to skip authentication */
21
+ skipRoutes?: string[];
22
+ }
23
+ /**
24
+ * Create authentication middleware
25
+ */
26
+ export declare function createAuthMiddleware(options: AuthMiddlewareOptions): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
27
+ /**
28
+ * Create scope-checking hook
29
+ */
30
+ export declare function requireScopes(...requiredScopes: ApiScope[]): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
31
+ /**
32
+ * Create admin-only scope check
33
+ */
34
+ export declare function requireAdmin(): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
35
+ /**
36
+ * Create read scope check for a resource
37
+ */
38
+ export declare function requireRead(resource: 'workflows' | 'queue' | 'agents'): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
39
+ /**
40
+ * Create write scope check for a resource
41
+ */
42
+ export declare function requireWrite(resource: 'workflows' | 'queue'): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
43
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAGtB;;GAEG;AACH,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,cAAc;QACtB,IAAI,EAAE,WAAW,CAAC;KACnB;CACF;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,4CAA4C;IAC5C,WAAW,EAAE,WAAW,CAAC;IACzB,wCAAwC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,IAI/D,SAAS,cAAc,EACvB,OAAO,YAAY,KAClB,OAAO,CAAC,IAAI,CAAC,CAmEjB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,cAAc,EAAE,QAAQ,EAAE,IAEvD,SAAS,cAAc,EACvB,OAAO,YAAY,KAClB,OAAO,CAAC,IAAI,CAAC,CAkBjB;AAED;;GAEG;AACH,wBAAgB,YAAY,cAzBf,cAAc,SAChB,YAAY,KAClB,OAAO,CAAC,IAAI,CAAC,CAyBjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,GAAG,QAAQ,aAhCzD,cAAc,SAChB,YAAY,KAClB,OAAO,CAAC,IAAI,CAAC,CAgCjB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,aAvC/C,cAAc,SAChB,YAAY,KAClB,OAAO,CAAC,IAAI,CAAC,CAuCjB"}
@@ -0,0 +1,101 @@
1
+ import { ErrorTypes, createProblemDetails } from '../types/index.js';
2
+ import { API_KEY_HEADER, validateApiKey, createAuthContextFromApiKey, hasAnyScope, } from './api-key.js';
3
+ import { extractBearerToken, verifyToken, createAuthContextFromJWT } from './jwt.js';
4
+ /**
5
+ * Create authentication middleware
6
+ */
7
+ export function createAuthMiddleware(options) {
8
+ const { apiKeyStore, enabled = true, skipRoutes = [] } = options;
9
+ return async function authMiddleware(request, reply) {
10
+ // Check if auth is disabled
11
+ if (!enabled) {
12
+ request.auth = {
13
+ userId: 'anonymous',
14
+ method: 'api-key',
15
+ scopes: ['admin'],
16
+ };
17
+ return;
18
+ }
19
+ // Check if route should skip auth
20
+ const routePath = request.routeOptions?.url ?? request.url;
21
+ if (skipRoutes.some((route) => routePath.startsWith(route))) {
22
+ request.auth = {
23
+ userId: 'anonymous',
24
+ method: 'api-key',
25
+ scopes: [],
26
+ };
27
+ return;
28
+ }
29
+ // Try API key authentication first
30
+ const apiKey = request.headers[API_KEY_HEADER];
31
+ if (typeof apiKey === 'string' && apiKey.length > 0) {
32
+ const result = await validateApiKey(apiKey, apiKeyStore);
33
+ if (result.valid && result.credential) {
34
+ request.auth = createAuthContextFromApiKey(result.credential);
35
+ return;
36
+ }
37
+ // Invalid API key
38
+ return reply.status(401).send(createProblemDetails(ErrorTypes.UNAUTHORIZED, 'Invalid API Key', 401, {
39
+ detail: result.error,
40
+ traceId: request.correlationId,
41
+ }));
42
+ }
43
+ // Try JWT authentication
44
+ const authHeader = request.headers.authorization;
45
+ const token = extractBearerToken(authHeader);
46
+ if (token) {
47
+ const payload = await verifyToken(request);
48
+ if (payload) {
49
+ request.auth = createAuthContextFromJWT(payload);
50
+ return;
51
+ }
52
+ // Invalid JWT
53
+ return reply.status(401).send(createProblemDetails(ErrorTypes.UNAUTHORIZED, 'Invalid Token', 401, {
54
+ detail: 'The provided JWT token is invalid or expired',
55
+ traceId: request.correlationId,
56
+ }));
57
+ }
58
+ // No authentication provided
59
+ return reply.status(401).send(createProblemDetails(ErrorTypes.UNAUTHORIZED, 'Authentication Required', 401, {
60
+ detail: 'Provide an API key via X-API-Key header or a JWT via Authorization header',
61
+ traceId: request.correlationId,
62
+ }));
63
+ };
64
+ }
65
+ /**
66
+ * Create scope-checking hook
67
+ */
68
+ export function requireScopes(...requiredScopes) {
69
+ return async function scopeCheck(request, reply) {
70
+ if (!request.auth) {
71
+ return reply.status(401).send(createProblemDetails(ErrorTypes.UNAUTHORIZED, 'Authentication Required', 401, {
72
+ traceId: request.correlationId,
73
+ }));
74
+ }
75
+ if (!hasAnyScope(request.auth, requiredScopes)) {
76
+ return reply.status(403).send(createProblemDetails(ErrorTypes.FORBIDDEN, 'Insufficient Permissions', 403, {
77
+ detail: `Required scopes: ${requiredScopes.join(' or ')}`,
78
+ traceId: request.correlationId,
79
+ }));
80
+ }
81
+ };
82
+ }
83
+ /**
84
+ * Create admin-only scope check
85
+ */
86
+ export function requireAdmin() {
87
+ return requireScopes('admin');
88
+ }
89
+ /**
90
+ * Create read scope check for a resource
91
+ */
92
+ export function requireRead(resource) {
93
+ return requireScopes(`${resource}:read`, 'admin');
94
+ }
95
+ /**
96
+ * Create write scope check for a resource
97
+ */
98
+ export function requireWrite(resource) {
99
+ return requireScopes(`${resource}:write`, 'admin');
100
+ }
101
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { LogLevelSchema, type LogLevel, ServerConfigSchema, type ServerConfig, RedisConfigSchema, type RedisConfig, GitHubOAuthConfigSchema, type GitHubOAuthConfig, JWTConfigSchema, type JWTConfig, AuthConfigSchema, type AuthConfig, RateLimitConfigSchema, type RateLimitConfig, CorsConfigSchema, type CorsConfig, LoggingConfigSchema, type LoggingConfig, RepositoryConfigSchema, type RepositoryConfig, MonitorConfigSchema, type MonitorConfig, PrMonitorConfigSchema, type PrMonitorConfig, EpicMonitorConfigSchema, type EpicMonitorConfig, DispatchConfigSchema, type DispatchConfig, WorkerConfigSchema, type WorkerConfig, OrchestratorConfigSchema, type OrchestratorConfig, validateConfig, } from './schema.js';
2
+ export { loadConfig, createTestConfig, type LoadConfigOptions } from './loader.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EACd,KAAK,QAAQ,EACb,kBAAkB,EAClB,KAAK,YAAY,EACjB,iBAAiB,EACjB,KAAK,WAAW,EAChB,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,eAAe,EACf,KAAK,SAAS,EACd,gBAAgB,EAChB,KAAK,UAAU,EACf,qBAAqB,EACrB,KAAK,eAAe,EACpB,gBAAgB,EAChB,KAAK,UAAU,EACf,mBAAmB,EACnB,KAAK,aAAa,EAClB,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,mBAAmB,EACnB,KAAK,aAAa,EAClB,qBAAqB,EACrB,KAAK,eAAe,EACpB,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,oBAAoB,EACpB,KAAK,cAAc,EACnB,kBAAkB,EAClB,KAAK,YAAY,EACjB,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,5 @@
1
+ export {
2
+ // Schema types
3
+ LogLevelSchema, ServerConfigSchema, RedisConfigSchema, GitHubOAuthConfigSchema, JWTConfigSchema, AuthConfigSchema, RateLimitConfigSchema, CorsConfigSchema, LoggingConfigSchema, RepositoryConfigSchema, MonitorConfigSchema, PrMonitorConfigSchema, EpicMonitorConfigSchema, DispatchConfigSchema, WorkerConfigSchema, OrchestratorConfigSchema, validateConfig, } from './schema.js';
4
+ export { loadConfig, createTestConfig } from './loader.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO;AACL,eAAe;AACf,cAAc,EAEd,kBAAkB,EAElB,iBAAiB,EAEjB,uBAAuB,EAEvB,eAAe,EAEf,gBAAgB,EAEhB,qBAAqB,EAErB,gBAAgB,EAEhB,mBAAmB,EAEnB,sBAAsB,EAEtB,mBAAmB,EAEnB,qBAAqB,EAErB,uBAAuB,EAEvB,oBAAoB,EAEpB,kBAAkB,EAElB,wBAAwB,EAExB,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAA0B,MAAM,aAAa,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type OrchestratorConfig } from './schema.js';
2
+ export interface LoadConfigOptions {
3
+ /** Path to configuration file (optional, will search defaults if not provided) */
4
+ configFile?: string;
5
+ /** Whether to load from environment variables (default: true) */
6
+ loadEnv?: boolean;
7
+ }
8
+ /**
9
+ * Load configuration from file and environment variables
10
+ *
11
+ * Priority (highest to lowest):
12
+ * 1. Environment variables
13
+ * 2. Configuration file (specified or found)
14
+ * 3. Default values
15
+ */
16
+ export declare function loadConfig(options?: LoadConfigOptions): OrchestratorConfig;
17
+ /**
18
+ * Create a minimal config for testing
19
+ */
20
+ export declare function createTestConfig(overrides?: Partial<OrchestratorConfig>): OrchestratorConfig;
21
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,kBAAkB,EAAkB,MAAM,aAAa,CAAC;AA2QtE,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,kBAAkB,CA8B9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAC1C,kBAAkB,CA8BpB"}
@@ -0,0 +1,295 @@
1
+ import { readFileSync, existsSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { parse as parseYaml } from 'yaml';
4
+ import { validateConfig } from './schema.js';
5
+ /**
6
+ * Environment variable prefix for configuration
7
+ */
8
+ const ENV_PREFIX = 'ORCHESTRATOR_';
9
+ /**
10
+ * Default configuration file paths to search
11
+ */
12
+ const DEFAULT_CONFIG_PATHS = [
13
+ './orchestrator.yaml',
14
+ './orchestrator.yml',
15
+ './config/orchestrator.yaml',
16
+ './config/orchestrator.yml',
17
+ ];
18
+ /**
19
+ * Load configuration from environment variables
20
+ */
21
+ function loadFromEnv() {
22
+ const config = {
23
+ server: {},
24
+ redis: {},
25
+ auth: {
26
+ jwt: {},
27
+ github: {},
28
+ },
29
+ rateLimit: {},
30
+ cors: {},
31
+ logging: {},
32
+ repositories: undefined,
33
+ };
34
+ // Server config
35
+ if (process.env[`${ENV_PREFIX}PORT`]) {
36
+ config.server.port = parseInt(process.env[`${ENV_PREFIX}PORT`], 10);
37
+ }
38
+ if (process.env[`${ENV_PREFIX}HOST`]) {
39
+ config.server.host = process.env[`${ENV_PREFIX}HOST`];
40
+ }
41
+ // Redis config (REDIS_URL takes precedence, falls back to ORCHESTRATOR_REDIS_URL)
42
+ const redisUrl = process.env['REDIS_URL'] ?? process.env[`${ENV_PREFIX}REDIS_URL`];
43
+ if (redisUrl) {
44
+ config.redis.url = redisUrl;
45
+ }
46
+ // Auth config
47
+ if (process.env[`${ENV_PREFIX}AUTH_ENABLED`]) {
48
+ config.auth.enabled =
49
+ process.env[`${ENV_PREFIX}AUTH_ENABLED`] === 'true';
50
+ }
51
+ if (process.env[`${ENV_PREFIX}JWT_SECRET`]) {
52
+ config.auth.jwt.secret =
53
+ process.env[`${ENV_PREFIX}JWT_SECRET`];
54
+ }
55
+ if (process.env[`${ENV_PREFIX}JWT_EXPIRES_IN`]) {
56
+ config.auth.jwt.expiresIn =
57
+ process.env[`${ENV_PREFIX}JWT_EXPIRES_IN`];
58
+ }
59
+ if (process.env['GITHUB_CLIENT_ID']) {
60
+ config.auth.github.clientId =
61
+ process.env['GITHUB_CLIENT_ID'];
62
+ }
63
+ if (process.env['GITHUB_CLIENT_SECRET']) {
64
+ config.auth.github.clientSecret =
65
+ process.env['GITHUB_CLIENT_SECRET'];
66
+ }
67
+ if (process.env[`${ENV_PREFIX}GITHUB_CALLBACK_URL`]) {
68
+ config.auth.github.callbackUrl =
69
+ process.env[`${ENV_PREFIX}GITHUB_CALLBACK_URL`];
70
+ }
71
+ // Rate limit config
72
+ if (process.env[`${ENV_PREFIX}RATE_LIMIT_ENABLED`]) {
73
+ config.rateLimit.enabled =
74
+ process.env[`${ENV_PREFIX}RATE_LIMIT_ENABLED`] === 'true';
75
+ }
76
+ if (process.env[`${ENV_PREFIX}RATE_LIMIT_MAX`]) {
77
+ config.rateLimit.max = parseInt(process.env[`${ENV_PREFIX}RATE_LIMIT_MAX`], 10);
78
+ }
79
+ if (process.env[`${ENV_PREFIX}RATE_LIMIT_WINDOW`]) {
80
+ config.rateLimit.timeWindow =
81
+ process.env[`${ENV_PREFIX}RATE_LIMIT_WINDOW`];
82
+ }
83
+ // Logging config (LOG_LEVEL takes precedence, falls back to ORCHESTRATOR_LOG_LEVEL)
84
+ const logLevel = process.env['LOG_LEVEL'] ?? process.env[`${ENV_PREFIX}LOG_LEVEL`];
85
+ if (logLevel) {
86
+ config.logging.level = logLevel;
87
+ }
88
+ if (process.env[`${ENV_PREFIX}LOG_PRETTY`]) {
89
+ config.logging.pretty =
90
+ process.env[`${ENV_PREFIX}LOG_PRETTY`] === 'true';
91
+ }
92
+ // Repositories config (MONITORED_REPOS takes precedence, falls back to ORCHESTRATOR_REPOSITORIES)
93
+ const reposStr = process.env['MONITORED_REPOS'] ?? process.env[`${ENV_PREFIX}REPOSITORIES`];
94
+ if (reposStr) {
95
+ const repos = reposStr.split(',').map(r => {
96
+ const [owner, repo] = r.trim().split('/');
97
+ return { owner, repo };
98
+ }).filter(r => r.owner && r.repo);
99
+ config.repositories = repos;
100
+ }
101
+ // Monitor config (POLL_INTERVAL_MS takes precedence, falls back to ORCHESTRATOR_POLL_INTERVAL_MS)
102
+ const pollIntervalMs = process.env['POLL_INTERVAL_MS'] ?? process.env[`${ENV_PREFIX}POLL_INTERVAL_MS`];
103
+ if (pollIntervalMs) {
104
+ if (!config.monitor) {
105
+ config.monitor = {};
106
+ }
107
+ config.monitor.pollIntervalMs = parseInt(pollIntervalMs, 10);
108
+ }
109
+ // Webhook secret (WEBHOOK_SECRET takes precedence, falls back to ORCHESTRATOR_WEBHOOK_SECRET)
110
+ const webhookSecret = process.env['WEBHOOK_SECRET'] ?? process.env[`${ENV_PREFIX}WEBHOOK_SECRET`];
111
+ if (webhookSecret) {
112
+ if (!config.monitor) {
113
+ config.monitor = {};
114
+ }
115
+ config.monitor.webhookSecret = webhookSecret;
116
+ }
117
+ // Cluster GitHub username for assignee-based issue filtering
118
+ const clusterGithubUsername = process.env['CLUSTER_GITHUB_USERNAME'];
119
+ if (clusterGithubUsername) {
120
+ if (!config.monitor) {
121
+ config.monitor = {};
122
+ }
123
+ config.monitor.clusterGithubUsername = clusterGithubUsername;
124
+ }
125
+ // PR Monitor config
126
+ if (process.env['PR_MONITOR_ENABLED']) {
127
+ if (!config.prMonitor) {
128
+ config.prMonitor = {};
129
+ }
130
+ config.prMonitor.enabled =
131
+ process.env['PR_MONITOR_ENABLED'] === 'true';
132
+ }
133
+ if (process.env['PR_MONITOR_POLL_INTERVAL_MS']) {
134
+ if (!config.prMonitor) {
135
+ config.prMonitor = {};
136
+ }
137
+ config.prMonitor.pollIntervalMs = parseInt(process.env['PR_MONITOR_POLL_INTERVAL_MS'], 10);
138
+ }
139
+ if (process.env['PR_MONITOR_WEBHOOK_SECRET']) {
140
+ if (!config.prMonitor) {
141
+ config.prMonitor = {};
142
+ }
143
+ config.prMonitor.webhookSecret =
144
+ process.env['PR_MONITOR_WEBHOOK_SECRET'];
145
+ }
146
+ if (process.env['PR_MONITOR_ADAPTIVE_POLLING']) {
147
+ if (!config.prMonitor) {
148
+ config.prMonitor = {};
149
+ }
150
+ config.prMonitor.adaptivePolling =
151
+ process.env['PR_MONITOR_ADAPTIVE_POLLING'] === 'true';
152
+ }
153
+ if (process.env['PR_MONITOR_MAX_CONCURRENT_POLLS']) {
154
+ if (!config.prMonitor) {
155
+ config.prMonitor = {};
156
+ }
157
+ config.prMonitor.maxConcurrentPolls = parseInt(process.env['PR_MONITOR_MAX_CONCURRENT_POLLS'], 10);
158
+ }
159
+ return config;
160
+ }
161
+ /**
162
+ * Load configuration from a YAML file
163
+ */
164
+ function loadFromFile(filePath) {
165
+ const absolutePath = resolve(filePath);
166
+ if (!existsSync(absolutePath)) {
167
+ throw new Error(`Configuration file not found: ${absolutePath}`);
168
+ }
169
+ const content = readFileSync(absolutePath, 'utf-8');
170
+ const parsed = parseYaml(content);
171
+ // Return the orchestrator section if present, otherwise the whole config
172
+ return parsed.orchestrator || parsed;
173
+ }
174
+ /**
175
+ * Find the first existing config file from default paths
176
+ */
177
+ function findConfigFile() {
178
+ for (const configPath of DEFAULT_CONFIG_PATHS) {
179
+ if (existsSync(resolve(configPath))) {
180
+ return configPath;
181
+ }
182
+ }
183
+ return null;
184
+ }
185
+ /**
186
+ * Deep merge two objects (env overrides file)
187
+ */
188
+ function deepMerge(target, source) {
189
+ const result = { ...target };
190
+ for (const key of Object.keys(source)) {
191
+ const sourceValue = source[key];
192
+ const targetValue = result[key];
193
+ if (sourceValue === undefined || sourceValue === null || sourceValue === '') {
194
+ continue;
195
+ }
196
+ if (typeof sourceValue === 'object' &&
197
+ !Array.isArray(sourceValue) &&
198
+ typeof targetValue === 'object' &&
199
+ !Array.isArray(targetValue)) {
200
+ result[key] = deepMerge(targetValue, sourceValue);
201
+ }
202
+ else {
203
+ result[key] = sourceValue;
204
+ }
205
+ }
206
+ return result;
207
+ }
208
+ /**
209
+ * Remove empty nested objects
210
+ */
211
+ function removeEmpty(obj) {
212
+ const result = {};
213
+ for (const [key, value] of Object.entries(obj)) {
214
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
215
+ const cleaned = removeEmpty(value);
216
+ if (Object.keys(cleaned).length > 0) {
217
+ result[key] = cleaned;
218
+ }
219
+ }
220
+ else if (value !== undefined && value !== null && value !== '') {
221
+ result[key] = value;
222
+ }
223
+ }
224
+ return result;
225
+ }
226
+ /**
227
+ * Load configuration from file and environment variables
228
+ *
229
+ * Priority (highest to lowest):
230
+ * 1. Environment variables
231
+ * 2. Configuration file (specified or found)
232
+ * 3. Default values
233
+ */
234
+ export function loadConfig(options = {}) {
235
+ const { configFile, loadEnv = true } = options;
236
+ let fileConfig = {};
237
+ // Load from file if specified or found
238
+ const configPath = configFile || findConfigFile();
239
+ if (configPath) {
240
+ try {
241
+ fileConfig = loadFromFile(configPath);
242
+ }
243
+ catch (error) {
244
+ if (configFile) {
245
+ // If explicitly specified, throw the error
246
+ throw error;
247
+ }
248
+ // Otherwise, continue without file config
249
+ }
250
+ }
251
+ // Load from environment
252
+ let envConfig = {};
253
+ if (loadEnv) {
254
+ envConfig = removeEmpty(loadFromEnv());
255
+ }
256
+ // Merge configs (env overrides file)
257
+ const mergedConfig = deepMerge(fileConfig, envConfig);
258
+ // Validate and return
259
+ return validateConfig(mergedConfig);
260
+ }
261
+ /**
262
+ * Create a minimal config for testing
263
+ */
264
+ export function createTestConfig(overrides = {}) {
265
+ return validateConfig({
266
+ server: {
267
+ port: 0, // Random port
268
+ host: '127.0.0.1',
269
+ },
270
+ redis: {
271
+ url: 'redis://localhost:6379',
272
+ },
273
+ auth: {
274
+ enabled: false,
275
+ providers: [],
276
+ jwt: {
277
+ secret: 'test-secret-at-least-32-characters-long',
278
+ expiresIn: '1h',
279
+ },
280
+ },
281
+ rateLimit: {
282
+ enabled: false,
283
+ },
284
+ cors: {
285
+ origin: true,
286
+ credentials: true,
287
+ },
288
+ logging: {
289
+ level: 'error',
290
+ pretty: false,
291
+ },
292
+ ...overrides,
293
+ });
294
+ }
295
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}