@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,31 @@
1
+ import type { FastifyRequest, FastifyReply, HookHandlerDoneFunction } from 'fastify';
2
+ /**
3
+ * Request start time symbol
4
+ */
5
+ declare const REQUEST_START_TIME: unique symbol;
6
+ /**
7
+ * Augment FastifyRequest with start time
8
+ */
9
+ declare module 'fastify' {
10
+ interface FastifyRequest {
11
+ [REQUEST_START_TIME]?: bigint;
12
+ }
13
+ }
14
+ /**
15
+ * Log request start
16
+ */
17
+ export declare function requestStartHook(request: FastifyRequest, _reply: FastifyReply, done: HookHandlerDoneFunction): void;
18
+ /**
19
+ * Log request completion
20
+ */
21
+ export declare function requestEndHook(request: FastifyRequest, reply: FastifyReply, done: HookHandlerDoneFunction): void;
22
+ /**
23
+ * Log request errors
24
+ */
25
+ export declare function requestErrorHook(request: FastifyRequest, _reply: FastifyReply, error: Error, done: HookHandlerDoneFunction): void;
26
+ /**
27
+ * Sanitize URL for logging (remove sensitive query params)
28
+ */
29
+ export declare function sanitizeUrl(url: string): string;
30
+ export {};
31
+ //# sourceMappingURL=request-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-logger.d.ts","sourceRoot":"","sources":["../../src/middleware/request-logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAErF;;GAEG;AACH,QAAA,MAAM,kBAAkB,eAA6B,CAAC;AAEtD;;GAEG;AACH,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,cAAc;QACtB,CAAC,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC;KAC/B;CACF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,uBAAuB,GAC5B,IAAI,CAYN;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,uBAAuB,GAC5B,IAAI,CA2BN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,uBAAuB,GAC5B,IAAI,CAsBN;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAe/C"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Request start time symbol
3
+ */
4
+ const REQUEST_START_TIME = Symbol('requestStartTime');
5
+ /**
6
+ * Log request start
7
+ */
8
+ export function requestStartHook(request, _reply, done) {
9
+ request[REQUEST_START_TIME] = process.hrtime.bigint();
10
+ request.log.info({
11
+ correlationId: request.correlationId,
12
+ method: request.method,
13
+ url: request.url,
14
+ userAgent: request.headers['user-agent'],
15
+ ip: request.ip,
16
+ }, 'Request started');
17
+ done();
18
+ }
19
+ /**
20
+ * Log request completion
21
+ */
22
+ export function requestEndHook(request, reply, done) {
23
+ const startTime = request[REQUEST_START_TIME];
24
+ let durationMs = 0;
25
+ if (startTime) {
26
+ const endTime = process.hrtime.bigint();
27
+ durationMs = Number(endTime - startTime) / 1_000_000;
28
+ }
29
+ const logData = {
30
+ correlationId: request.correlationId,
31
+ method: request.method,
32
+ url: request.url,
33
+ statusCode: reply.statusCode,
34
+ durationMs: Math.round(durationMs * 100) / 100,
35
+ userId: request.auth?.userId,
36
+ };
37
+ if (reply.statusCode >= 500) {
38
+ request.log.error(logData, 'Request completed with server error');
39
+ }
40
+ else if (reply.statusCode >= 400) {
41
+ request.log.warn(logData, 'Request completed with client error');
42
+ }
43
+ else {
44
+ request.log.info(logData, 'Request completed');
45
+ }
46
+ done();
47
+ }
48
+ /**
49
+ * Log request errors
50
+ */
51
+ export function requestErrorHook(request, _reply, error, done) {
52
+ const startTime = request[REQUEST_START_TIME];
53
+ let durationMs = 0;
54
+ if (startTime) {
55
+ const endTime = process.hrtime.bigint();
56
+ durationMs = Number(endTime - startTime) / 1_000_000;
57
+ }
58
+ request.log.error({
59
+ correlationId: request.correlationId,
60
+ method: request.method,
61
+ url: request.url,
62
+ durationMs: Math.round(durationMs * 100) / 100,
63
+ error: {
64
+ message: error.message,
65
+ name: error.name,
66
+ stack: error.stack,
67
+ },
68
+ }, 'Request error');
69
+ done();
70
+ }
71
+ /**
72
+ * Sanitize URL for logging (remove sensitive query params)
73
+ */
74
+ export function sanitizeUrl(url) {
75
+ try {
76
+ const parsed = new URL(url, 'http://localhost');
77
+ const sensitiveParams = ['token', 'api_key', 'apikey', 'secret', 'password', 'code'];
78
+ for (const param of sensitiveParams) {
79
+ if (parsed.searchParams.has(param)) {
80
+ parsed.searchParams.set(param, '[REDACTED]');
81
+ }
82
+ }
83
+ return parsed.pathname + parsed.search;
84
+ }
85
+ catch {
86
+ return url;
87
+ }
88
+ }
89
+ //# sourceMappingURL=request-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-logger.js","sourceRoot":"","sources":["../../src/middleware/request-logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ import { AgentRegistry } from '../services/agent-registry.js';
3
+ /**
4
+ * Setup agent routes
5
+ */
6
+ export declare function setupAgentRoutes(server: FastifyInstance, agentRegistry: AgentRegistry): Promise<void>;
7
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/routes/agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAG9D;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,eAAe,EACvB,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,IAAI,CAAC,CA4Ff"}
@@ -0,0 +1,78 @@
1
+ import { requireRead } from '../auth/middleware.js';
2
+ /**
3
+ * Setup agent routes
4
+ */
5
+ export async function setupAgentRoutes(server, agentRegistry) {
6
+ // GET /agents - List connected agents
7
+ server.get('/agents', {
8
+ preHandler: [requireRead('agents')],
9
+ schema: {
10
+ description: 'List connected agents',
11
+ tags: ['Agents'],
12
+ querystring: {
13
+ type: 'object',
14
+ properties: {
15
+ status: {
16
+ type: 'string',
17
+ enum: ['connected', 'idle', 'busy', 'disconnected'],
18
+ },
19
+ type: {
20
+ type: 'string',
21
+ enum: ['claude', 'gpt4', 'custom'],
22
+ },
23
+ },
24
+ },
25
+ },
26
+ }, async (request, reply) => {
27
+ const query = request.query;
28
+ let agents = agentRegistry.list();
29
+ // Filter by status
30
+ if (query.status) {
31
+ agents = agents.filter((a) => a.status === query.status);
32
+ }
33
+ // Filter by type
34
+ if (query.type) {
35
+ agents = agents.filter((a) => a.type === query.type);
36
+ }
37
+ return reply.send(agents);
38
+ });
39
+ // GET /agents/:id - Get agent details
40
+ server.get('/agents/:id', {
41
+ preHandler: [requireRead('agents')],
42
+ schema: {
43
+ description: 'Get agent details',
44
+ tags: ['Agents'],
45
+ params: {
46
+ type: 'object',
47
+ properties: {
48
+ id: { type: 'string' },
49
+ },
50
+ required: ['id'],
51
+ },
52
+ },
53
+ }, async (request, reply) => {
54
+ const params = request.params;
55
+ const agent = agentRegistry.get(params.id);
56
+ if (!agent) {
57
+ return reply.status(404).send({
58
+ type: 'urn:generacy:error:not-found',
59
+ title: 'Not Found',
60
+ status: 404,
61
+ detail: `Agent ${params.id} not found`,
62
+ traceId: request.correlationId,
63
+ });
64
+ }
65
+ return reply.send(agent);
66
+ });
67
+ // GET /agents/stats - Get agent statistics
68
+ server.get('/agents/stats', {
69
+ preHandler: [requireRead('agents')],
70
+ }, async (_request, reply) => {
71
+ const stats = agentRegistry.getStats();
72
+ return reply.send({
73
+ total: agentRegistry.size(),
74
+ byStatus: stats,
75
+ });
76
+ });
77
+ }
78
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/routes/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ import type { QueueManager } from '../types/index.js';
3
+ /**
4
+ * Setup dispatch queue routes for monitoring queue status.
5
+ * Separate from the decision queue routes (/queue).
6
+ */
7
+ export declare function setupDispatchRoutes(server: FastifyInstance, queueManager: QueueManager): Promise<void>;
8
+ //# sourceMappingURL=dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/routes/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAQtD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,eAAe,EACvB,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,IAAI,CAAC,CAgDf"}
@@ -0,0 +1,46 @@
1
+ import { z } from 'zod';
2
+ import { requireRead } from '../auth/middleware.js';
3
+ const QueueItemsQuerySchema = z.object({
4
+ offset: z.coerce.number().int().min(0).default(0),
5
+ limit: z.coerce.number().int().min(1).max(100).default(10),
6
+ });
7
+ /**
8
+ * Setup dispatch queue routes for monitoring queue status.
9
+ * Separate from the decision queue routes (/queue).
10
+ */
11
+ export async function setupDispatchRoutes(server, queueManager) {
12
+ // GET /dispatch/queue/depth
13
+ server.get('/dispatch/queue/depth', {
14
+ preHandler: [requireRead('queue')],
15
+ schema: {},
16
+ }, async (_request, reply) => {
17
+ const depth = await queueManager.getQueueDepth();
18
+ return reply.send({ depth });
19
+ });
20
+ // GET /dispatch/queue/items
21
+ server.get('/dispatch/queue/items', {
22
+ preHandler: [requireRead('queue')],
23
+ schema: {
24
+ querystring: {
25
+ type: 'object',
26
+ properties: {
27
+ offset: { type: 'number', default: 0 },
28
+ limit: { type: 'number', default: 10 },
29
+ },
30
+ },
31
+ },
32
+ }, async (request, reply) => {
33
+ const query = QueueItemsQuerySchema.parse(request.query);
34
+ const items = await queueManager.getQueueItems(query.offset, query.limit);
35
+ return reply.send({ items, offset: query.offset, limit: query.limit });
36
+ });
37
+ // GET /dispatch/queue/workers
38
+ server.get('/dispatch/queue/workers', {
39
+ preHandler: [requireRead('queue')],
40
+ schema: {},
41
+ }, async (_request, reply) => {
42
+ const count = await queueManager.getActiveWorkerCount();
43
+ return reply.send({ count });
44
+ });
45
+ }
46
+ //# sourceMappingURL=dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/routes/dispatch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACjD,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAC3D,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAuB,EACvB,YAA0B;IAE1B,4BAA4B;IAC5B,MAAM,CAAC,GAAG,CACR,uBAAuB,EACvB;QACE,UAAU,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,EAAE,EAAE;KACX,EACD,KAAK,EAAE,QAAwB,EAAE,KAAmB,EAAE,EAAE;QACtD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,aAAa,EAAE,CAAC;QACjD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/B,CAAC,CACF,CAAC;IAEF,4BAA4B;IAC5B,MAAM,CAAC,GAAG,CACR,uBAAuB,EACvB;QACE,UAAU,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,EAAE;YACN,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;oBACtC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;iBACvC;aACF;SACF;KACF,EACD,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QACrD,MAAM,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1E,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC,CACF,CAAC;IAEF,8BAA8B;IAC9B,MAAM,CAAC,GAAG,CACR,yBAAyB,EACzB;QACE,UAAU,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,EAAE,EAAE;KACX,EACD,KAAK,EAAE,QAAwB,EAAE,KAAmB,EAAE,EAAE;QACtD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,oBAAoB,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/B,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ /**
3
+ * Get active connection count
4
+ */
5
+ export declare function getActiveConnectionCount(): number;
6
+ /**
7
+ * Close all active SSE connections (for graceful shutdown)
8
+ */
9
+ export declare function closeAllSSEConnections(): void;
10
+ /**
11
+ * Setup SSE event routes
12
+ */
13
+ export declare function setupEventsRoutes(server: FastifyInstance): Promise<void>;
14
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/routes/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAe7E;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAI7C;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAwH9E"}
@@ -0,0 +1,240 @@
1
+ import { z } from 'zod';
2
+ import { SSEQuerySchema, parseChannels } from '../types/sse.js';
3
+ import { createSSEStream, parseLastEventId } from '../sse/stream.js';
4
+ import { getSSESubscriptionManager, } from '../sse/subscriptions.js';
5
+ import { requireRead } from '../auth/middleware.js';
6
+ /**
7
+ * SSE connection tracking for graceful shutdown
8
+ */
9
+ const activeConnections = new Set();
10
+ /**
11
+ * Get active connection count
12
+ */
13
+ export function getActiveConnectionCount() {
14
+ return activeConnections.size;
15
+ }
16
+ /**
17
+ * Close all active SSE connections (for graceful shutdown)
18
+ */
19
+ export function closeAllSSEConnections() {
20
+ const manager = getSSESubscriptionManager();
21
+ manager.closeAll();
22
+ activeConnections.clear();
23
+ }
24
+ /**
25
+ * Setup SSE event routes
26
+ */
27
+ export async function setupEventsRoutes(server) {
28
+ const subscriptionManager = getSSESubscriptionManager();
29
+ // GET /events - Global event stream (all channels)
30
+ server.get('/events', {
31
+ preHandler: [requireRead('workflows')],
32
+ schema: {
33
+ description: 'Subscribe to real-time events via Server-Sent Events',
34
+ tags: ['Events'],
35
+ querystring: {
36
+ type: 'object',
37
+ properties: {
38
+ channels: {
39
+ type: 'string',
40
+ description: 'Comma-separated list of channels (workflows, queue, agents)',
41
+ },
42
+ workflowId: {
43
+ type: 'string',
44
+ format: 'uuid',
45
+ description: 'Filter events to specific workflow',
46
+ },
47
+ },
48
+ },
49
+ headers: {
50
+ type: 'object',
51
+ properties: {
52
+ 'last-event-id': {
53
+ type: 'string',
54
+ description: 'Resume from last event ID (for reconnection)',
55
+ },
56
+ },
57
+ },
58
+ response: {
59
+ 200: {
60
+ type: 'string',
61
+ description: 'SSE event stream',
62
+ },
63
+ },
64
+ },
65
+ }, async (request, reply) => {
66
+ return handleSSEConnection(request, reply, subscriptionManager);
67
+ });
68
+ // GET /workflows/:id/events - Workflow-specific event stream
69
+ server.get('/workflows/:id/events', {
70
+ preHandler: [requireRead('workflows')],
71
+ schema: {
72
+ description: 'Subscribe to events for a specific workflow',
73
+ tags: ['Events', 'Workflows'],
74
+ params: {
75
+ type: 'object',
76
+ properties: {
77
+ id: { type: 'string', format: 'uuid' },
78
+ },
79
+ required: ['id'],
80
+ },
81
+ headers: {
82
+ type: 'object',
83
+ properties: {
84
+ 'last-event-id': {
85
+ type: 'string',
86
+ description: 'Resume from last event ID',
87
+ },
88
+ },
89
+ },
90
+ response: {
91
+ 200: {
92
+ type: 'string',
93
+ description: 'SSE event stream',
94
+ },
95
+ },
96
+ },
97
+ }, async (request, reply) => {
98
+ const params = z.object({ id: z.string().uuid() }).parse(request.params);
99
+ return handleSSEConnection(request, reply, subscriptionManager, {
100
+ channels: ['workflows'],
101
+ filters: { workflowId: params.id },
102
+ });
103
+ });
104
+ // GET /queue/events - Queue event stream
105
+ server.get('/queue/events', {
106
+ preHandler: [requireRead('queue')],
107
+ schema: {
108
+ description: 'Subscribe to queue update events',
109
+ tags: ['Events', 'Queue'],
110
+ headers: {
111
+ type: 'object',
112
+ properties: {
113
+ 'last-event-id': {
114
+ type: 'string',
115
+ description: 'Resume from last event ID',
116
+ },
117
+ },
118
+ },
119
+ response: {
120
+ 200: {
121
+ type: 'string',
122
+ description: 'SSE event stream',
123
+ },
124
+ },
125
+ },
126
+ }, async (request, reply) => {
127
+ return handleSSEConnection(request, reply, subscriptionManager, {
128
+ channels: ['queue'],
129
+ });
130
+ });
131
+ }
132
+ /**
133
+ * Handle SSE connection setup and management
134
+ */
135
+ async function handleSSEConnection(request, reply, subscriptionManager, overrides) {
136
+ // Validate auth
137
+ if (!request.auth || request.auth.userId === 'anonymous') {
138
+ return reply.status(401).send({
139
+ type: 'https://api.generacy.ai/problems/unauthorized',
140
+ title: 'Unauthorized',
141
+ status: 401,
142
+ detail: 'SSE connections require authentication',
143
+ traceId: request.correlationId,
144
+ });
145
+ }
146
+ // Parse query parameters
147
+ const query = SSEQuerySchema.safeParse(request.query);
148
+ if (!query.success) {
149
+ return reply.status(400).send({
150
+ type: 'https://api.generacy.ai/problems/validation-error',
151
+ title: 'Validation Error',
152
+ status: 400,
153
+ detail: 'Invalid query parameters',
154
+ errors: query.error.errors,
155
+ traceId: request.correlationId,
156
+ });
157
+ }
158
+ // Determine channels and filters
159
+ const channels = overrides?.channels || parseChannels(query.data.channels);
160
+ const filters = overrides?.filters || { workflowId: query.data.workflowId };
161
+ // Parse Last-Event-ID for reconnection
162
+ const lastEventId = parseLastEventId(request);
163
+ // Check connection limits
164
+ const userConnections = subscriptionManager.getUserConnections(request.auth.userId);
165
+ if (userConnections.length >= 3) {
166
+ return reply.status(429).send({
167
+ type: 'https://api.generacy.ai/problems/rate-limit',
168
+ title: 'Too Many Connections',
169
+ status: 429,
170
+ detail: 'Maximum of 3 concurrent SSE connections per user',
171
+ traceId: request.correlationId,
172
+ });
173
+ }
174
+ // Create SSE stream
175
+ const stream = createSSEStream(reply, request, request.auth.userId, {
176
+ channels,
177
+ filters,
178
+ lastEventId: lastEventId
179
+ ? `${lastEventId.timestamp}_${lastEventId.connectionId}_${lastEventId.sequence}`
180
+ : undefined,
181
+ });
182
+ // Try to add connection
183
+ if (!subscriptionManager.addConnection(stream)) {
184
+ stream.close();
185
+ return reply.status(429).send({
186
+ type: 'https://api.generacy.ai/problems/rate-limit',
187
+ title: 'Too Many Connections',
188
+ status: 429,
189
+ detail: 'Connection limit exceeded',
190
+ traceId: request.correlationId,
191
+ });
192
+ }
193
+ // Track connection
194
+ activeConnections.add(stream.id);
195
+ // Log connection
196
+ request.log.info({
197
+ connectionId: stream.id,
198
+ userId: request.auth.userId,
199
+ channels,
200
+ filters,
201
+ correlationId: request.correlationId,
202
+ }, 'SSE connection established');
203
+ // Start the stream
204
+ stream.start();
205
+ // Replay missed events if reconnecting
206
+ if (lastEventId) {
207
+ const replayedCount = subscriptionManager.replayMissedEvents(stream);
208
+ if (replayedCount > 0) {
209
+ request.log.info({
210
+ connectionId: stream.id,
211
+ replayedCount,
212
+ lastEventId: `${lastEventId.timestamp}_${lastEventId.connectionId}_${lastEventId.sequence}`,
213
+ }, 'Replayed missed events');
214
+ }
215
+ }
216
+ // Handle client disconnect
217
+ request.raw.on('close', () => {
218
+ request.log.info({
219
+ connectionId: stream.id,
220
+ userId: request.auth.userId,
221
+ correlationId: request.correlationId,
222
+ }, 'SSE connection closed');
223
+ subscriptionManager.removeConnection(stream.id);
224
+ activeConnections.delete(stream.id);
225
+ });
226
+ // Handle errors
227
+ request.raw.on('error', (error) => {
228
+ request.log.error({
229
+ err: error,
230
+ connectionId: stream.id,
231
+ userId: request.auth.userId,
232
+ correlationId: request.correlationId,
233
+ }, 'SSE connection error');
234
+ subscriptionManager.removeConnection(stream.id);
235
+ activeConnections.delete(stream.id);
236
+ });
237
+ // Prevent Fastify from sending a response (we're handling it manually)
238
+ reply.hijack();
239
+ }
240
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/routes/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ import type { ServiceStatus } from '../types/index.js';
3
+ /**
4
+ * Health check options
5
+ */
6
+ export interface HealthCheckOptions {
7
+ /** Custom health checks for services */
8
+ checks?: Record<string, () => Promise<ServiceStatus>>;
9
+ }
10
+ /**
11
+ * Setup health routes
12
+ */
13
+ export declare function setupHealthRoutes(server: FastifyInstance, options?: HealthCheckOptions): Promise<void>;
14
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAC7E,OAAO,KAAK,EAAgC,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAErF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;CACvD;AASD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CA2If"}