@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,65 @@
1
+ import type { CreateWorkflowRequest, WorkflowResponse, WorkflowListResponse, ListWorkflowsQuery } from '../types/index.js';
2
+ /**
3
+ * Workflow engine interface (facade over internal workflow engine)
4
+ * This will be implemented by the actual WorkflowEngine from #3
5
+ */
6
+ export interface WorkflowEngine {
7
+ create(request: CreateWorkflowRequest): Promise<WorkflowResponse>;
8
+ get(id: string): Promise<WorkflowResponse | null>;
9
+ list(query: ListWorkflowsQuery): Promise<WorkflowListResponse>;
10
+ pause(id: string): Promise<WorkflowResponse>;
11
+ resume(id: string): Promise<WorkflowResponse>;
12
+ cancel(id: string): Promise<void>;
13
+ }
14
+ /**
15
+ * In-memory workflow store for development/testing
16
+ */
17
+ export declare class InMemoryWorkflowStore implements WorkflowEngine {
18
+ private workflows;
19
+ create(request: CreateWorkflowRequest): Promise<WorkflowResponse>;
20
+ get(id: string): Promise<WorkflowResponse | null>;
21
+ list(query: ListWorkflowsQuery): Promise<WorkflowListResponse>;
22
+ pause(id: string): Promise<WorkflowResponse>;
23
+ resume(id: string): Promise<WorkflowResponse>;
24
+ cancel(id: string): Promise<void>;
25
+ /**
26
+ * Clear all workflows (for testing)
27
+ */
28
+ clear(): void;
29
+ /**
30
+ * Get workflow count (for testing)
31
+ */
32
+ count(): number;
33
+ }
34
+ /**
35
+ * Workflow service - facade over workflow engine
36
+ */
37
+ export declare class WorkflowService {
38
+ private engine;
39
+ constructor(engine: WorkflowEngine);
40
+ /**
41
+ * Create and start a new workflow
42
+ */
43
+ create(request: CreateWorkflowRequest): Promise<WorkflowResponse>;
44
+ /**
45
+ * Get workflow by ID
46
+ */
47
+ get(id: string): Promise<WorkflowResponse>;
48
+ /**
49
+ * List workflows with optional filters
50
+ */
51
+ list(query?: Partial<ListWorkflowsQuery>): Promise<WorkflowListResponse>;
52
+ /**
53
+ * Pause a running workflow
54
+ */
55
+ pause(id: string): Promise<WorkflowResponse>;
56
+ /**
57
+ * Resume a paused workflow
58
+ */
59
+ resume(id: string): Promise<WorkflowResponse>;
60
+ /**
61
+ * Cancel a workflow
62
+ */
63
+ cancel(id: string): Promise<void>;
64
+ }
65
+ //# sourceMappingURL=workflow-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-service.d.ts","sourceRoot":"","sources":["../../src/services/workflow-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAG3B;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAClE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC/D,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC9C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAC1D,OAAO,CAAC,SAAS,CAA4C;IAEvD,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAgCjE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAIjD,IAAI,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAgC9D,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAe5C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAe7C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAevC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,KAAK,IAAI,MAAM;CAGhB;AAED;;GAEG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAE1C;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIvE;;OAEG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQhD;;OAEG;IACG,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAQ9E;;OAEG;IACG,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIlD;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAInD;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxC"}
@@ -0,0 +1,164 @@
1
+ import { Errors } from '../middleware/error-handler.js';
2
+ /**
3
+ * In-memory workflow store for development/testing
4
+ */
5
+ export class InMemoryWorkflowStore {
6
+ workflows = new Map();
7
+ async create(request) {
8
+ const id = crypto.randomUUID();
9
+ const now = new Date().toISOString();
10
+ const workflow = {
11
+ id,
12
+ status: 'created',
13
+ currentStep: null,
14
+ context: request.context,
15
+ metadata: {
16
+ name: request.metadata?.name,
17
+ tags: request.metadata?.tags ?? [],
18
+ },
19
+ createdAt: now,
20
+ updatedAt: now,
21
+ };
22
+ this.workflows.set(id, workflow);
23
+ // Simulate starting the workflow
24
+ setTimeout(() => {
25
+ const w = this.workflows.get(id);
26
+ if (w && w.status === 'created') {
27
+ w.status = 'running';
28
+ w.currentStep = 'initial';
29
+ w.updatedAt = new Date().toISOString();
30
+ }
31
+ }, 100);
32
+ return workflow;
33
+ }
34
+ async get(id) {
35
+ return this.workflows.get(id) ?? null;
36
+ }
37
+ async list(query) {
38
+ let workflows = Array.from(this.workflows.values());
39
+ // Filter by status
40
+ if (query.status) {
41
+ workflows = workflows.filter((w) => w.status === query.status);
42
+ }
43
+ // Sort by creation date (newest first)
44
+ workflows.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
45
+ // Pagination
46
+ const total = workflows.length;
47
+ const page = query.page ?? 1;
48
+ const pageSize = query.pageSize ?? 20;
49
+ const start = (page - 1) * pageSize;
50
+ const end = start + pageSize;
51
+ const paginatedWorkflows = workflows.slice(start, end);
52
+ return {
53
+ workflows: paginatedWorkflows,
54
+ pagination: {
55
+ page,
56
+ pageSize,
57
+ total,
58
+ hasMore: end < total,
59
+ },
60
+ };
61
+ }
62
+ async pause(id) {
63
+ const workflow = this.workflows.get(id);
64
+ if (!workflow) {
65
+ throw Errors.notFound(`Workflow ${id} not found`);
66
+ }
67
+ if (workflow.status !== 'running') {
68
+ throw Errors.conflict(`Workflow ${id} is not running (current status: ${workflow.status})`);
69
+ }
70
+ workflow.status = 'paused';
71
+ workflow.updatedAt = new Date().toISOString();
72
+ return workflow;
73
+ }
74
+ async resume(id) {
75
+ const workflow = this.workflows.get(id);
76
+ if (!workflow) {
77
+ throw Errors.notFound(`Workflow ${id} not found`);
78
+ }
79
+ if (workflow.status !== 'paused') {
80
+ throw Errors.conflict(`Workflow ${id} is not paused (current status: ${workflow.status})`);
81
+ }
82
+ workflow.status = 'running';
83
+ workflow.updatedAt = new Date().toISOString();
84
+ return workflow;
85
+ }
86
+ async cancel(id) {
87
+ const workflow = this.workflows.get(id);
88
+ if (!workflow) {
89
+ throw Errors.notFound(`Workflow ${id} not found`);
90
+ }
91
+ if (workflow.status === 'completed' || workflow.status === 'cancelled') {
92
+ throw Errors.conflict(`Workflow ${id} cannot be cancelled (current status: ${workflow.status})`);
93
+ }
94
+ workflow.status = 'cancelled';
95
+ workflow.updatedAt = new Date().toISOString();
96
+ workflow.completedAt = new Date().toISOString();
97
+ }
98
+ /**
99
+ * Clear all workflows (for testing)
100
+ */
101
+ clear() {
102
+ this.workflows.clear();
103
+ }
104
+ /**
105
+ * Get workflow count (for testing)
106
+ */
107
+ count() {
108
+ return this.workflows.size;
109
+ }
110
+ }
111
+ /**
112
+ * Workflow service - facade over workflow engine
113
+ */
114
+ export class WorkflowService {
115
+ engine;
116
+ constructor(engine) {
117
+ this.engine = engine;
118
+ }
119
+ /**
120
+ * Create and start a new workflow
121
+ */
122
+ async create(request) {
123
+ return this.engine.create(request);
124
+ }
125
+ /**
126
+ * Get workflow by ID
127
+ */
128
+ async get(id) {
129
+ const workflow = await this.engine.get(id);
130
+ if (!workflow) {
131
+ throw Errors.notFound(`Workflow ${id} not found`);
132
+ }
133
+ return workflow;
134
+ }
135
+ /**
136
+ * List workflows with optional filters
137
+ */
138
+ async list(query) {
139
+ return this.engine.list({
140
+ page: query?.page ?? 1,
141
+ pageSize: query?.pageSize ?? 20,
142
+ status: query?.status,
143
+ });
144
+ }
145
+ /**
146
+ * Pause a running workflow
147
+ */
148
+ async pause(id) {
149
+ return this.engine.pause(id);
150
+ }
151
+ /**
152
+ * Resume a paused workflow
153
+ */
154
+ async resume(id) {
155
+ return this.engine.resume(id);
156
+ }
157
+ /**
158
+ * Cancel a workflow
159
+ */
160
+ async cancel(id) {
161
+ return this.engine.cancel(id);
162
+ }
163
+ }
164
+ //# sourceMappingURL=workflow-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-service.js","sourceRoot":"","sources":["../../src/services/workflow-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { SSEEvent, SSEEventType, WorkflowEventType, WorkflowEventData, SSEChannel, WorkflowSSEEvent, QueueSSEEvent, AgentSSEEvent, ErrorSSEEvent, ConnectedSSEEvent } from '../types/sse.js';
2
+ import type { DecisionQueueItem, DecisionResponse, ConnectedAgent } from '../types/api.js';
3
+ /**
4
+ * Generate a unique event ID
5
+ * Format: {timestamp}_{connectionId}_{sequence}
6
+ */
7
+ export declare function generateEventId(connectionId: string, sequence: number): string;
8
+ /**
9
+ * Create an event ID generator for a connection
10
+ */
11
+ export declare function createEventIdGenerator(connectionId: string): () => string;
12
+ /**
13
+ * Format SSE event for transmission
14
+ * Produces the SSE text format:
15
+ * event: <type>
16
+ * id: <id>
17
+ * data: <json>
18
+ *
19
+ */
20
+ export declare function formatSSEEvent<T>(event: SSEEvent<T>): string;
21
+ /**
22
+ * Format heartbeat comment
23
+ * SSE comments start with ':' and are used for keep-alive
24
+ */
25
+ export declare function formatHeartbeat(): string;
26
+ /**
27
+ * Create a workflow event
28
+ */
29
+ export declare function createWorkflowEvent(eventType: WorkflowEventType, data: WorkflowEventData, connectionId: string, sequence: number): WorkflowSSEEvent;
30
+ /**
31
+ * Create a queue update event
32
+ */
33
+ export declare function createQueueEvent(action: 'added' | 'removed' | 'updated', items: DecisionQueueItem[], queueSize: number, connectionId: string, sequence: number, response?: DecisionResponse): QueueSSEEvent;
34
+ /**
35
+ * Create an agent status event
36
+ */
37
+ export declare function createAgentEvent(status: 'connected' | 'disconnected' | 'busy' | 'idle', agent: ConnectedAgent, connectionId: string, sequence: number): AgentSSEEvent;
38
+ /**
39
+ * Create an error event
40
+ */
41
+ export declare function createErrorEvent(title: string, detail: string, status: number, connectionId: string, sequence: number, traceId?: string): ErrorSSEEvent;
42
+ /**
43
+ * Create a connected confirmation event
44
+ */
45
+ export declare function createConnectedEvent(connectionId: string, channels: SSEChannel[], sequence: number): ConnectedSSEEvent;
46
+ /**
47
+ * Create a generic SSE event
48
+ */
49
+ export declare function createSSEEvent<T>(eventType: SSEEventType, data: T, connectionId: string, sequence: number): SSEEvent<T>;
50
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/sse/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,aAAa,EACb,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAG3F;;;GAGG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,MAAM,CAGzE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAqB5D;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,iBAAiB,EAC5B,IAAI,EAAE,iBAAiB,EACvB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAOlB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,EACvC,KAAK,EAAE,iBAAiB,EAAE,EAC1B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,aAAa,CAoBf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,MAAM,GAAG,MAAM,EACtD,KAAK,EAAE,cAAc,EACrB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,aAAa,CAmBf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,aAAa,CAsBf;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,UAAU,EAAE,EACtB,QAAQ,EAAE,MAAM,GACf,iBAAiB,CAWnB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,SAAS,EAAE,YAAY,EACvB,IAAI,EAAE,CAAC,EACP,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,QAAQ,CAAC,CAAC,CAAC,CAOb"}
@@ -0,0 +1,152 @@
1
+ import { ErrorTypes } from '../types/problem-details.js';
2
+ /**
3
+ * Generate a unique event ID
4
+ * Format: {timestamp}_{connectionId}_{sequence}
5
+ */
6
+ export function generateEventId(connectionId, sequence) {
7
+ return `${Date.now()}_${connectionId}_${sequence}`;
8
+ }
9
+ /**
10
+ * Create an event ID generator for a connection
11
+ */
12
+ export function createEventIdGenerator(connectionId) {
13
+ let sequence = 0;
14
+ return () => generateEventId(connectionId, ++sequence);
15
+ }
16
+ /**
17
+ * Format SSE event for transmission
18
+ * Produces the SSE text format:
19
+ * event: <type>
20
+ * id: <id>
21
+ * data: <json>
22
+ *
23
+ */
24
+ export function formatSSEEvent(event) {
25
+ const lines = [];
26
+ // Event type
27
+ lines.push(`event: ${event.event}`);
28
+ // Event ID
29
+ lines.push(`id: ${event.id}`);
30
+ // Data - handle multi-line JSON by splitting and prefixing each line
31
+ const jsonData = JSON.stringify(event.data);
32
+ const dataLines = jsonData.split('\n');
33
+ for (const line of dataLines) {
34
+ lines.push(`data: ${line}`);
35
+ }
36
+ // SSE requires double newline to end event
37
+ lines.push('');
38
+ lines.push('');
39
+ return lines.join('\n');
40
+ }
41
+ /**
42
+ * Format heartbeat comment
43
+ * SSE comments start with ':' and are used for keep-alive
44
+ */
45
+ export function formatHeartbeat() {
46
+ return `: heartbeat ${new Date().toISOString()}\n\n`;
47
+ }
48
+ /**
49
+ * Create a workflow event
50
+ */
51
+ export function createWorkflowEvent(eventType, data, connectionId, sequence) {
52
+ return {
53
+ event: eventType,
54
+ id: generateEventId(connectionId, sequence),
55
+ data,
56
+ timestamp: new Date().toISOString(),
57
+ };
58
+ }
59
+ /**
60
+ * Create a queue update event
61
+ */
62
+ export function createQueueEvent(action, items, queueSize, connectionId, sequence, response) {
63
+ const event = action === 'added'
64
+ ? 'queue:item:added'
65
+ : action === 'removed'
66
+ ? 'queue:item:removed'
67
+ : 'queue:updated';
68
+ return {
69
+ event,
70
+ id: generateEventId(connectionId, sequence),
71
+ data: {
72
+ action,
73
+ items,
74
+ item: items[0],
75
+ queueSize,
76
+ ...(response && { response }),
77
+ },
78
+ timestamp: new Date().toISOString(),
79
+ };
80
+ }
81
+ /**
82
+ * Create an agent status event
83
+ */
84
+ export function createAgentEvent(status, agent, connectionId, sequence) {
85
+ const event = status === 'connected'
86
+ ? 'agent:connected'
87
+ : status === 'disconnected'
88
+ ? 'agent:disconnected'
89
+ : 'agent:status';
90
+ return {
91
+ event,
92
+ id: generateEventId(connectionId, sequence),
93
+ data: {
94
+ agentId: agent.id,
95
+ status,
96
+ capabilities: agent.capabilities,
97
+ agent,
98
+ },
99
+ timestamp: new Date().toISOString(),
100
+ };
101
+ }
102
+ /**
103
+ * Create an error event
104
+ */
105
+ export function createErrorEvent(title, detail, status, connectionId, sequence, traceId) {
106
+ const errorType = status === 401
107
+ ? ErrorTypes.UNAUTHORIZED
108
+ : status === 403
109
+ ? ErrorTypes.FORBIDDEN
110
+ : status === 404
111
+ ? ErrorTypes.NOT_FOUND
112
+ : ErrorTypes.INTERNAL;
113
+ return {
114
+ event: 'error',
115
+ id: generateEventId(connectionId, sequence),
116
+ data: {
117
+ type: errorType,
118
+ title,
119
+ status,
120
+ detail,
121
+ traceId,
122
+ },
123
+ timestamp: new Date().toISOString(),
124
+ };
125
+ }
126
+ /**
127
+ * Create a connected confirmation event
128
+ */
129
+ export function createConnectedEvent(connectionId, channels, sequence) {
130
+ return {
131
+ event: 'connected',
132
+ id: generateEventId(connectionId, sequence),
133
+ data: {
134
+ connectionId,
135
+ channels,
136
+ timestamp: new Date().toISOString(),
137
+ },
138
+ timestamp: new Date().toISOString(),
139
+ };
140
+ }
141
+ /**
142
+ * Create a generic SSE event
143
+ */
144
+ export function createSSEEvent(eventType, data, connectionId, sequence) {
145
+ return {
146
+ event: eventType,
147
+ id: generateEventId(connectionId, sequence),
148
+ data,
149
+ timestamp: new Date().toISOString(),
150
+ };
151
+ }
152
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/sse/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { SSEStream, createSSEStream, parseLastEventId } from './stream.js';
2
+ export { generateEventId, createEventIdGenerator, formatSSEEvent, formatHeartbeat, createWorkflowEvent, createQueueEvent, createAgentEvent, createErrorEvent, createConnectedEvent, createSSEEvent, } from './events.js';
3
+ export { SSESubscriptionManager, getSSESubscriptionManager, resetSSESubscriptionManager, } from './subscriptions.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sse/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG3E,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,GACf,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,7 @@
1
+ // SSE Stream Management
2
+ export { SSEStream, createSSEStream, parseLastEventId } from './stream.js';
3
+ // SSE Events
4
+ export { generateEventId, createEventIdGenerator, formatSSEEvent, formatHeartbeat, createWorkflowEvent, createQueueEvent, createAgentEvent, createErrorEvent, createConnectedEvent, createSSEEvent, } from './events.js';
5
+ // SSE Subscriptions
6
+ export { SSESubscriptionManager, getSSESubscriptionManager, resetSSESubscriptionManager, } from './subscriptions.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sse/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE3E,aAAa;AACb,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,oBAAoB;AACpB,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,109 @@
1
+ import type { FastifyReply, FastifyRequest } from 'fastify';
2
+ import type { ServerResponse } from 'http';
3
+ import type { SSEConnectionOptions, SSEStreamConfig, SSEChannel, SSEFilters, SSEEvent } from '../types/sse.js';
4
+ /**
5
+ * SSE Stream Manager
6
+ * Manages individual SSE connections with heartbeat and event delivery
7
+ */
8
+ export declare class SSEStream {
9
+ private connection;
10
+ private config;
11
+ private closed;
12
+ constructor(response: ServerResponse, request: FastifyRequest, userId: string, options?: SSEConnectionOptions, config?: Partial<SSEStreamConfig>);
13
+ /**
14
+ * Get connection ID
15
+ */
16
+ get id(): string;
17
+ /**
18
+ * Get user ID
19
+ */
20
+ get userId(): string;
21
+ /**
22
+ * Get subscribed channels
23
+ */
24
+ get channels(): SSEChannel[];
25
+ /**
26
+ * Get subscription filters
27
+ */
28
+ get filters(): SSEFilters;
29
+ /**
30
+ * Check if connection is closed
31
+ */
32
+ get isClosed(): boolean;
33
+ /**
34
+ * Get last event ID
35
+ */
36
+ get lastEventId(): string | undefined;
37
+ /**
38
+ * Get next sequence number
39
+ */
40
+ private nextSequence;
41
+ /**
42
+ * Start the SSE stream
43
+ * Sets up headers, sends initial connected event, and starts heartbeat
44
+ */
45
+ start(): void;
46
+ /**
47
+ * Send an SSE event
48
+ */
49
+ send<T>(event: SSEEvent<T>): boolean;
50
+ /**
51
+ * Send raw SSE data
52
+ */
53
+ private sendRaw;
54
+ /**
55
+ * Send heartbeat
56
+ */
57
+ sendHeartbeat(): boolean;
58
+ /**
59
+ * Start heartbeat timer
60
+ */
61
+ private startHeartbeat;
62
+ /**
63
+ * Stop heartbeat timer
64
+ */
65
+ private stopHeartbeat;
66
+ /**
67
+ * Check if connection is subscribed to a channel
68
+ */
69
+ isSubscribedTo(channel: SSEChannel): boolean;
70
+ /**
71
+ * Check if event matches subscription filters
72
+ */
73
+ matchesFilters(workflowId?: string, tags?: string[]): boolean;
74
+ /**
75
+ * Update subscription channels
76
+ */
77
+ updateChannels(channels: SSEChannel[]): void;
78
+ /**
79
+ * Update subscription filters
80
+ */
81
+ updateFilters(filters: SSEFilters): void;
82
+ /**
83
+ * Close the connection
84
+ */
85
+ close(): void;
86
+ /**
87
+ * Get connection info for logging
88
+ */
89
+ getInfo(): {
90
+ id: string;
91
+ userId: string;
92
+ channels: SSEChannel[];
93
+ connectedAt: Date;
94
+ filters: SSEFilters;
95
+ };
96
+ }
97
+ /**
98
+ * Create SSE response and return stream manager
99
+ */
100
+ export declare function createSSEStream(reply: FastifyReply, request: FastifyRequest, userId: string, options?: SSEConnectionOptions, config?: Partial<SSEStreamConfig>): SSEStream;
101
+ /**
102
+ * Parse Last-Event-ID header for reconnection support
103
+ */
104
+ export declare function parseLastEventId(request: FastifyRequest): {
105
+ timestamp: number;
106
+ connectionId: string;
107
+ sequence: number;
108
+ } | null;
109
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/sse/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAE3C,OAAO,KAAK,EAEV,oBAAoB,EACpB,eAAe,EACf,UAAU,EACV,UAAU,EACV,QAAQ,EACT,MAAM,iBAAiB,CAAC;AAIzB;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAkB;gBAG9B,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,oBAAyB,EAClC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAsBvC;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAEf;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,UAAU,EAAE,CAE3B;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,UAAU,CAExB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAEpC;IAED;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;;OAGG;IACH,KAAK,IAAI,IAAI;IA0Bb;;OAEG;IACH,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO;IAKpC;;OAEG;IACH,OAAO,CAAC,OAAO;IAiBf;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAYtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO;IAI5C;;OAEG;IACH,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO;IAwB7D;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI;IAI5C;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAIxC;;OAEG;IACH,KAAK,IAAI,IAAI;IAeb;;OAEG;IACH,OAAO,IAAI;QACT,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,UAAU,EAAE,CAAC;QACvB,WAAW,EAAE,IAAI,CAAC;QAClB,OAAO,EAAE,UAAU,CAAC;KACrB;CASF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,oBAAyB,EAClC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,GACpC,SAAS,CAQX;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,cAAc,GACtB;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOtE"}