@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,224 @@
1
+ import { z } from 'zod';
2
+ import type { ServerResponse, IncomingMessage } from 'http';
3
+ import type { DecisionQueueItem, DecisionResponse, ConnectedAgent } from './api.js';
4
+ export declare const SSEChannelSchema: z.ZodEnum<["workflows", "queue", "agents"]>;
5
+ export type SSEChannel = z.infer<typeof SSEChannelSchema>;
6
+ export declare const WorkflowEventTypeSchema: z.ZodEnum<["workflow:started", "workflow:completed", "workflow:failed", "workflow:paused", "workflow:resumed", "workflow:cancelled", "step:started", "step:completed", "step:failed", "decision:requested", "decision:resolved"]>;
7
+ export type WorkflowEventType = z.infer<typeof WorkflowEventTypeSchema>;
8
+ export declare const SSEEventTypeSchema: z.ZodEnum<["workflow:started", "workflow:completed", "workflow:failed", "workflow:paused", "workflow:resumed", "workflow:cancelled", "step:started", "step:completed", "step:failed", "decision:requested", "decision:resolved", "queue:updated", "queue:item:added", "queue:item:removed", "agent:connected", "agent:disconnected", "agent:status", "error", "connected"]>;
9
+ export type SSEEventType = z.infer<typeof SSEEventTypeSchema>;
10
+ /**
11
+ * Base SSE event structure
12
+ */
13
+ export interface SSEEvent<T = unknown> {
14
+ /** Event type (maps to SSE 'event:' field) */
15
+ event: SSEEventType;
16
+ /** Unique event ID (maps to SSE 'id:' field) */
17
+ id: string;
18
+ /** Event payload (serialized to SSE 'data:' field) */
19
+ data: T;
20
+ /** Event timestamp */
21
+ timestamp: string;
22
+ }
23
+ /**
24
+ * Workflow event data payload
25
+ */
26
+ export interface WorkflowEventData {
27
+ workflowId: string;
28
+ stepId?: string;
29
+ progress?: number;
30
+ status?: string;
31
+ error?: {
32
+ type: string;
33
+ message: string;
34
+ };
35
+ metadata?: Record<string, unknown>;
36
+ }
37
+ /**
38
+ * Workflow-specific SSE event
39
+ */
40
+ export interface WorkflowSSEEvent extends SSEEvent<WorkflowEventData> {
41
+ event: WorkflowEventType;
42
+ }
43
+ /**
44
+ * Queue event data payload
45
+ */
46
+ export interface QueueEventData {
47
+ action: 'added' | 'removed' | 'updated';
48
+ item?: DecisionQueueItem;
49
+ items?: DecisionQueueItem[];
50
+ queueSize: number;
51
+ /** Included on 'removed' events when a decision has been responded to */
52
+ response?: DecisionResponse;
53
+ }
54
+ /**
55
+ * Queue update SSE event
56
+ */
57
+ export interface QueueSSEEvent extends SSEEvent<QueueEventData> {
58
+ event: 'queue:updated' | 'queue:item:added' | 'queue:item:removed';
59
+ }
60
+ /**
61
+ * Agent event data payload
62
+ */
63
+ export interface AgentEventData {
64
+ agentId: string;
65
+ status: 'connected' | 'disconnected' | 'busy' | 'idle';
66
+ capabilities?: string[];
67
+ metadata?: Record<string, unknown>;
68
+ agent?: ConnectedAgent;
69
+ }
70
+ /**
71
+ * Agent status SSE event
72
+ */
73
+ export interface AgentSSEEvent extends SSEEvent<AgentEventData> {
74
+ event: 'agent:connected' | 'agent:disconnected' | 'agent:status';
75
+ }
76
+ /**
77
+ * Error event data payload
78
+ */
79
+ export interface ErrorEventData {
80
+ type: string;
81
+ title: string;
82
+ status: number;
83
+ detail?: string;
84
+ traceId?: string;
85
+ }
86
+ /**
87
+ * Error SSE event
88
+ */
89
+ export interface ErrorSSEEvent extends SSEEvent<ErrorEventData> {
90
+ event: 'error';
91
+ }
92
+ /**
93
+ * Connected event data payload
94
+ */
95
+ export interface ConnectedEventData {
96
+ connectionId: string;
97
+ channels: SSEChannel[];
98
+ timestamp: string;
99
+ }
100
+ /**
101
+ * Connection confirmation SSE event
102
+ */
103
+ export interface ConnectedSSEEvent extends SSEEvent<ConnectedEventData> {
104
+ event: 'connected';
105
+ }
106
+ /**
107
+ * Union of all SSE event types
108
+ */
109
+ export type AnySSEEvent = WorkflowSSEEvent | QueueSSEEvent | AgentSSEEvent | ErrorSSEEvent | ConnectedSSEEvent;
110
+ /**
111
+ * Subscription filter options
112
+ */
113
+ export interface SSEFilters {
114
+ /** Filter to specific workflow */
115
+ workflowId?: string;
116
+ /** Filter by tags */
117
+ tags?: string[];
118
+ }
119
+ /**
120
+ * SSE client subscription
121
+ */
122
+ export interface SSESubscription {
123
+ /** Subscribed channels */
124
+ channels: Set<SSEChannel>;
125
+ /** Active filters */
126
+ filters: SSEFilters;
127
+ /** Last event ID received (for reconnection) */
128
+ lastEventId?: string;
129
+ }
130
+ /**
131
+ * Active SSE connection
132
+ */
133
+ export interface SSEConnection {
134
+ /** Unique connection identifier */
135
+ id: string;
136
+ /** Node.js response stream */
137
+ response: ServerResponse;
138
+ /** Original request (for correlation ID) */
139
+ request: IncomingMessage;
140
+ /** Client's user ID (from auth) */
141
+ userId: string;
142
+ /** Subscription configuration */
143
+ subscription: SSESubscription;
144
+ /** Connection established timestamp */
145
+ connectedAt: Date;
146
+ /** Heartbeat timer reference */
147
+ heartbeatTimer?: NodeJS.Timeout;
148
+ /** Event sequence counter */
149
+ sequenceCounter: number;
150
+ }
151
+ /**
152
+ * SSE connection options
153
+ */
154
+ export interface SSEConnectionOptions {
155
+ /** Channels to subscribe to */
156
+ channels?: SSEChannel[];
157
+ /** Filter options */
158
+ filters?: SSEFilters;
159
+ /** Resume from last event ID */
160
+ lastEventId?: string;
161
+ }
162
+ /**
163
+ * SSE stream configuration
164
+ */
165
+ export interface SSEStreamConfig {
166
+ /** Heartbeat interval in milliseconds (default: 30000) */
167
+ heartbeatInterval: number;
168
+ /** Maximum connections per client (default: 3) */
169
+ maxConnectionsPerClient: number;
170
+ /** Buffer size for missed events (default: 100) */
171
+ eventBufferSize: number;
172
+ /** Event retention duration in ms (default: 60000) */
173
+ eventRetentionMs: number;
174
+ }
175
+ /**
176
+ * Default SSE configuration
177
+ */
178
+ export declare const DEFAULT_SSE_CONFIG: SSEStreamConfig;
179
+ /**
180
+ * SSE filters validation schema
181
+ */
182
+ export declare const SSEFiltersSchema: z.ZodOptional<z.ZodObject<{
183
+ workflowId: z.ZodOptional<z.ZodString>;
184
+ tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
185
+ }, "strip", z.ZodTypeAny, {
186
+ tags?: string[] | undefined;
187
+ workflowId?: string | undefined;
188
+ }, {
189
+ tags?: string[] | undefined;
190
+ workflowId?: string | undefined;
191
+ }>>;
192
+ /**
193
+ * Query parameters for SSE endpoints
194
+ */
195
+ export declare const SSEQuerySchema: z.ZodObject<{
196
+ channels: z.ZodOptional<z.ZodString>;
197
+ workflowId: z.ZodOptional<z.ZodString>;
198
+ }, "strip", z.ZodTypeAny, {
199
+ workflowId?: string | undefined;
200
+ channels?: string | undefined;
201
+ }, {
202
+ workflowId?: string | undefined;
203
+ channels?: string | undefined;
204
+ }>;
205
+ export type SSEQuery = z.infer<typeof SSEQuerySchema>;
206
+ /**
207
+ * Parse channels from query string
208
+ */
209
+ export declare function parseChannels(channelsParam?: string): SSEChannel[];
210
+ /**
211
+ * Event ID structure
212
+ * Format: {timestamp}_{connectionId}_{sequence}
213
+ * Example: 1706123456789_conn_abc123_42
214
+ */
215
+ export interface EventIdComponents {
216
+ timestamp: number;
217
+ connectionId: string;
218
+ sequence: number;
219
+ }
220
+ /**
221
+ * Parse event ID components
222
+ */
223
+ export declare function parseEventId(id: string): EventIdComponents | null;
224
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/types/sse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ import { z } from 'zod';
2
+ // ============================================================================
3
+ // Channel Types (shared with WebSocket, will be sole source after migration)
4
+ // ============================================================================
5
+ export const SSEChannelSchema = z.enum(['workflows', 'queue', 'agents']);
6
+ // ============================================================================
7
+ // SSE Event Types
8
+ // ============================================================================
9
+ export const WorkflowEventTypeSchema = z.enum([
10
+ 'workflow:started',
11
+ 'workflow:completed',
12
+ 'workflow:failed',
13
+ 'workflow:paused',
14
+ 'workflow:resumed',
15
+ 'workflow:cancelled',
16
+ 'step:started',
17
+ 'step:completed',
18
+ 'step:failed',
19
+ 'decision:requested',
20
+ 'decision:resolved',
21
+ ]);
22
+ export const SSEEventTypeSchema = z.enum([
23
+ // Workflow events
24
+ 'workflow:started',
25
+ 'workflow:completed',
26
+ 'workflow:failed',
27
+ 'workflow:paused',
28
+ 'workflow:resumed',
29
+ 'workflow:cancelled',
30
+ 'step:started',
31
+ 'step:completed',
32
+ 'step:failed',
33
+ 'decision:requested',
34
+ 'decision:resolved',
35
+ // Queue events
36
+ 'queue:updated',
37
+ 'queue:item:added',
38
+ 'queue:item:removed',
39
+ // Agent events
40
+ 'agent:connected',
41
+ 'agent:disconnected',
42
+ 'agent:status',
43
+ // System events
44
+ 'error',
45
+ 'connected',
46
+ ]);
47
+ /**
48
+ * Default SSE configuration
49
+ */
50
+ export const DEFAULT_SSE_CONFIG = {
51
+ heartbeatInterval: 30000,
52
+ maxConnectionsPerClient: 3,
53
+ eventBufferSize: 100,
54
+ eventRetentionMs: 60000,
55
+ };
56
+ // ============================================================================
57
+ // Query Parameter Validation
58
+ // ============================================================================
59
+ /**
60
+ * SSE filters validation schema
61
+ */
62
+ export const SSEFiltersSchema = z
63
+ .object({
64
+ workflowId: z.string().optional(),
65
+ tags: z.array(z.string()).optional(),
66
+ })
67
+ .optional();
68
+ /**
69
+ * Query parameters for SSE endpoints
70
+ */
71
+ export const SSEQuerySchema = z.object({
72
+ channels: z.string().optional(), // comma-separated
73
+ workflowId: z.string().optional(),
74
+ });
75
+ /**
76
+ * Parse channels from query string
77
+ */
78
+ export function parseChannels(channelsParam) {
79
+ if (!channelsParam) {
80
+ return ['workflows', 'queue', 'agents']; // default: all
81
+ }
82
+ const channels = channelsParam.split(',').map((c) => c.trim());
83
+ return channels.filter((c) => SSEChannelSchema.safeParse(c).success);
84
+ }
85
+ /**
86
+ * Parse event ID components
87
+ */
88
+ export function parseEventId(id) {
89
+ const parts = id.split('_');
90
+ if (parts.length < 3)
91
+ return null;
92
+ const firstPart = parts[0];
93
+ const lastPart = parts[parts.length - 1];
94
+ if (!firstPart || !lastPart)
95
+ return null;
96
+ const timestamp = parseInt(firstPart, 10);
97
+ const connectionId = parts.slice(1, -1).join('_');
98
+ const sequence = parseInt(lastPart, 10);
99
+ if (isNaN(timestamp) || isNaN(sequence))
100
+ return null;
101
+ return { timestamp, connectionId, sequence };
102
+ }
103
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/types/sse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Minimal GitHub webhook response type.
3
+ * Only includes fields needed for matching and reactivation.
4
+ */
5
+ export interface GitHubWebhook {
6
+ /** Webhook ID */
7
+ id: number;
8
+ /** Whether webhook is active */
9
+ active: boolean;
10
+ /** Webhook configuration */
11
+ config: {
12
+ /** Target URL */
13
+ url: string;
14
+ };
15
+ /** Event types webhook subscribes to */
16
+ events: string[];
17
+ }
18
+ /**
19
+ * Summary of webhook setup operation across multiple repositories
20
+ */
21
+ export interface WebhookSetupSummary {
22
+ /** Total repositories checked */
23
+ total: number;
24
+ /** Webhooks created */
25
+ created: number;
26
+ /** Webhooks skipped (already exist) */
27
+ skipped: number;
28
+ /** Webhooks reactivated */
29
+ reactivated: number;
30
+ /** Repositories that failed */
31
+ failed: number;
32
+ /** Per-repository results */
33
+ results: WebhookSetupResult[];
34
+ }
35
+ /**
36
+ * Result of webhook setup for a single repository
37
+ */
38
+ export interface WebhookSetupResult {
39
+ /** Repository owner */
40
+ owner: string;
41
+ /** Repository name */
42
+ repo: string;
43
+ /** Action taken */
44
+ action: 'created' | 'skipped' | 'reactivated' | 'failed';
45
+ /** Webhook ID (if applicable) */
46
+ webhookId?: number;
47
+ /** Error message (if action === 'failed') */
48
+ error?: string;
49
+ }
50
+ /**
51
+ * Repository configuration for webhook setup
52
+ */
53
+ export interface RepositoryConfig {
54
+ /** Repository owner */
55
+ owner: string;
56
+ /** Repository name */
57
+ repo: string;
58
+ }
59
+ //# sourceMappingURL=webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/types/webhook.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,iBAAiB;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,4BAA4B;IAC5B,MAAM,EAAE;QACN,iBAAiB;QACjB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,wCAAwC;IACxC,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ,CAAC;IACzD,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/types/webhook.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import type { FastifyRequest, FastifyReply } from 'fastify';
2
+ /**
3
+ * Header name for request correlation ID
4
+ */
5
+ export declare const CORRELATION_ID_HEADER = "x-request-id";
6
+ /**
7
+ * Augment FastifyRequest to include correlation ID
8
+ */
9
+ declare module 'fastify' {
10
+ interface FastifyRequest {
11
+ correlationId: string;
12
+ }
13
+ }
14
+ /**
15
+ * Generate a new correlation ID
16
+ */
17
+ export declare function generateCorrelationId(): string;
18
+ /**
19
+ * Extract correlation ID from request headers or generate a new one
20
+ */
21
+ export declare function getCorrelationId(request: FastifyRequest): string;
22
+ /**
23
+ * Fastify hook to add correlation ID to requests (async for Fastify v5)
24
+ */
25
+ export declare function correlationIdHook(request: FastifyRequest, _reply: FastifyReply): Promise<void>;
26
+ /**
27
+ * Fastify hook to add correlation ID to response headers (async for Fastify v5)
28
+ */
29
+ export declare function correlationIdResponseHook(request: FastifyRequest, reply: FastifyReply): Promise<void>;
30
+ //# sourceMappingURL=correlation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"correlation.d.ts","sourceRoot":"","sources":["../../src/utils/correlation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,qBAAqB,iBAAiB,CAAC;AAEpD;;GAEG;AACH,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,cAAc;QACtB,aAAa,EAAE,MAAM,CAAC;KACvB;CACF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAMhE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -0,0 +1,34 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ /**
3
+ * Header name for request correlation ID
4
+ */
5
+ export const CORRELATION_ID_HEADER = 'x-request-id';
6
+ /**
7
+ * Generate a new correlation ID
8
+ */
9
+ export function generateCorrelationId() {
10
+ return randomUUID();
11
+ }
12
+ /**
13
+ * Extract correlation ID from request headers or generate a new one
14
+ */
15
+ export function getCorrelationId(request) {
16
+ const headerValue = request.headers[CORRELATION_ID_HEADER];
17
+ if (typeof headerValue === 'string' && headerValue.length > 0) {
18
+ return headerValue;
19
+ }
20
+ return generateCorrelationId();
21
+ }
22
+ /**
23
+ * Fastify hook to add correlation ID to requests (async for Fastify v5)
24
+ */
25
+ export async function correlationIdHook(request, _reply) {
26
+ request.correlationId = getCorrelationId(request);
27
+ }
28
+ /**
29
+ * Fastify hook to add correlation ID to response headers (async for Fastify v5)
30
+ */
31
+ export async function correlationIdResponseHook(request, reply) {
32
+ reply.header(CORRELATION_ID_HEADER, request.correlationId);
33
+ }
34
+ //# sourceMappingURL=correlation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"correlation.js","sourceRoot":"","sources":["../../src/utils/correlation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,cAAc,CAAC;AAWpD;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAuB;IACtD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC3D,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,OAAO,qBAAqB,EAAE,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAuB,EACvB,MAAoB;IAEpB,OAAO,CAAC,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,OAAuB,EACvB,KAAmB;IAEnB,KAAK,CAAC,MAAM,CAAC,qBAAqB,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { CORRELATION_ID_HEADER, generateCorrelationId, getCorrelationId, correlationIdHook, correlationIdResponseHook, } from './correlation.js';
2
+ export { setupGracefulShutdown, isShuttingDown, resetShutdownState, type ShutdownOptions, } from './shutdown.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { CORRELATION_ID_HEADER, generateCorrelationId, getCorrelationId, correlationIdHook, correlationIdResponseHook, } from './correlation.js';
2
+ export { setupGracefulShutdown, isShuttingDown, resetShutdownState, } from './shutdown.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,kBAAkB,GAEnB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ /**
3
+ * Shutdown options
4
+ */
5
+ export interface ShutdownOptions {
6
+ /** Timeout for graceful shutdown in milliseconds (default: 30000) */
7
+ timeout?: number;
8
+ /** Logger for shutdown messages */
9
+ logger?: {
10
+ info: (msg: string) => void;
11
+ error: (msg: string, error?: Error) => void;
12
+ };
13
+ /** Additional cleanup functions to run */
14
+ cleanup?: Array<() => Promise<void>>;
15
+ }
16
+ /**
17
+ * Setup graceful shutdown handlers for SIGTERM and SIGINT
18
+ */
19
+ export declare function setupGracefulShutdown(server: FastifyInstance, options?: ShutdownOptions): () => Promise<void>;
20
+ /**
21
+ * Check if shutdown is in progress
22
+ */
23
+ export declare function isShuttingDown(): boolean;
24
+ /**
25
+ * Reset shutdown state (for testing)
26
+ */
27
+ export declare function resetShutdownState(): void;
28
+ //# sourceMappingURL=shutdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../../src/utils/shutdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAe/C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAC5B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;KAC7C,CAAC;IACF,0CAA0C;IAC1C,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;CACtC;AAyCD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,eAAoB,GAC5B,MAAM,OAAO,CAAC,IAAI,CAAC,CAsCrB;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC"}
@@ -0,0 +1,86 @@
1
+ const state = {
2
+ isShuttingDown: false,
3
+ shutdownPromise: null,
4
+ };
5
+ /**
6
+ * Perform graceful shutdown
7
+ */
8
+ async function performShutdown(server, options) {
9
+ const { timeout = 30000, logger, cleanup = [] } = options;
10
+ logger?.info('Starting graceful shutdown...');
11
+ // Create timeout promise
12
+ const timeoutPromise = new Promise((_, reject) => {
13
+ setTimeout(() => {
14
+ reject(new Error(`Shutdown timed out after ${timeout}ms`));
15
+ }, timeout);
16
+ });
17
+ try {
18
+ // Close server (stops accepting new connections)
19
+ await Promise.race([server.close(), timeoutPromise]);
20
+ logger?.info('Server closed, stopping new connections');
21
+ // Run cleanup functions
22
+ for (const cleanupFn of cleanup) {
23
+ try {
24
+ await Promise.race([cleanupFn(), timeoutPromise]);
25
+ }
26
+ catch (error) {
27
+ logger?.error('Cleanup function failed', error);
28
+ }
29
+ }
30
+ logger?.info('Graceful shutdown complete');
31
+ }
32
+ catch (error) {
33
+ logger?.error('Shutdown failed', error);
34
+ throw error;
35
+ }
36
+ }
37
+ /**
38
+ * Setup graceful shutdown handlers for SIGTERM and SIGINT
39
+ */
40
+ export function setupGracefulShutdown(server, options = {}) {
41
+ const { logger } = options;
42
+ const handleSignal = (signal) => {
43
+ return () => {
44
+ if (state.isShuttingDown) {
45
+ logger?.info(`Received ${signal} but already shutting down`);
46
+ return;
47
+ }
48
+ logger?.info(`Received ${signal}, initiating graceful shutdown`);
49
+ state.isShuttingDown = true;
50
+ state.shutdownPromise = performShutdown(server, options)
51
+ .then(() => {
52
+ process.exit(0);
53
+ })
54
+ .catch((error) => {
55
+ logger?.error('Shutdown failed, forcing exit', error);
56
+ process.exit(1);
57
+ });
58
+ };
59
+ };
60
+ // Register signal handlers
61
+ process.on('SIGTERM', handleSignal('SIGTERM'));
62
+ process.on('SIGINT', handleSignal('SIGINT'));
63
+ // Return a function to manually trigger shutdown (for testing)
64
+ return async () => {
65
+ if (state.isShuttingDown && state.shutdownPromise) {
66
+ return state.shutdownPromise;
67
+ }
68
+ state.isShuttingDown = true;
69
+ state.shutdownPromise = performShutdown(server, options);
70
+ return state.shutdownPromise;
71
+ };
72
+ }
73
+ /**
74
+ * Check if shutdown is in progress
75
+ */
76
+ export function isShuttingDown() {
77
+ return state.isShuttingDown;
78
+ }
79
+ /**
80
+ * Reset shutdown state (for testing)
81
+ */
82
+ export function resetShutdownState() {
83
+ state.isShuttingDown = false;
84
+ state.shutdownPromise = null;
85
+ }
86
+ //# sourceMappingURL=shutdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../../src/utils/shutdown.ts"],"names":[],"mappings":"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"}