@generacy-ai/generacy 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 (244) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +207 -0
  3. package/bin/generacy.js +11 -0
  4. package/dist/agency/index.d.ts +68 -0
  5. package/dist/agency/index.d.ts.map +1 -0
  6. package/dist/agency/index.js +28 -0
  7. package/dist/agency/index.js.map +1 -0
  8. package/dist/agency/network.d.ts +41 -0
  9. package/dist/agency/network.d.ts.map +1 -0
  10. package/dist/agency/network.js +133 -0
  11. package/dist/agency/network.js.map +1 -0
  12. package/dist/agency/subprocess.d.ts +58 -0
  13. package/dist/agency/subprocess.d.ts.map +1 -0
  14. package/dist/agency/subprocess.js +216 -0
  15. package/dist/agency/subprocess.js.map +1 -0
  16. package/dist/cli/commands/agent.d.ts +10 -0
  17. package/dist/cli/commands/agent.d.ts.map +1 -0
  18. package/dist/cli/commands/agent.js +216 -0
  19. package/dist/cli/commands/agent.js.map +1 -0
  20. package/dist/cli/commands/doctor/checks/agency-mcp.d.ts +3 -0
  21. package/dist/cli/commands/doctor/checks/agency-mcp.d.ts.map +1 -0
  22. package/dist/cli/commands/doctor/checks/agency-mcp.js +51 -0
  23. package/dist/cli/commands/doctor/checks/agency-mcp.js.map +1 -0
  24. package/dist/cli/commands/doctor/checks/anthropic-key.d.ts +3 -0
  25. package/dist/cli/commands/doctor/checks/anthropic-key.d.ts.map +1 -0
  26. package/dist/cli/commands/doctor/checks/anthropic-key.js +68 -0
  27. package/dist/cli/commands/doctor/checks/anthropic-key.js.map +1 -0
  28. package/dist/cli/commands/doctor/checks/config.d.ts +3 -0
  29. package/dist/cli/commands/doctor/checks/config.d.ts.map +1 -0
  30. package/dist/cli/commands/doctor/checks/config.js +81 -0
  31. package/dist/cli/commands/doctor/checks/config.js.map +1 -0
  32. package/dist/cli/commands/doctor/checks/devcontainer.d.ts +3 -0
  33. package/dist/cli/commands/doctor/checks/devcontainer.d.ts.map +1 -0
  34. package/dist/cli/commands/doctor/checks/devcontainer.js +58 -0
  35. package/dist/cli/commands/doctor/checks/devcontainer.js.map +1 -0
  36. package/dist/cli/commands/doctor/checks/docker.d.ts +3 -0
  37. package/dist/cli/commands/doctor/checks/docker.d.ts.map +1 -0
  38. package/dist/cli/commands/doctor/checks/docker.js +71 -0
  39. package/dist/cli/commands/doctor/checks/docker.js.map +1 -0
  40. package/dist/cli/commands/doctor/checks/env-file.d.ts +3 -0
  41. package/dist/cli/commands/doctor/checks/env-file.d.ts.map +1 -0
  42. package/dist/cli/commands/doctor/checks/env-file.js +56 -0
  43. package/dist/cli/commands/doctor/checks/env-file.js.map +1 -0
  44. package/dist/cli/commands/doctor/checks/github-token.d.ts +3 -0
  45. package/dist/cli/commands/doctor/checks/github-token.d.ts.map +1 -0
  46. package/dist/cli/commands/doctor/checks/github-token.js +99 -0
  47. package/dist/cli/commands/doctor/checks/github-token.js.map +1 -0
  48. package/dist/cli/commands/doctor/checks/npm-packages.d.ts +3 -0
  49. package/dist/cli/commands/doctor/checks/npm-packages.d.ts.map +1 -0
  50. package/dist/cli/commands/doctor/checks/npm-packages.js +117 -0
  51. package/dist/cli/commands/doctor/checks/npm-packages.js.map +1 -0
  52. package/dist/cli/commands/doctor/formatter.d.ts +27 -0
  53. package/dist/cli/commands/doctor/formatter.d.ts.map +1 -0
  54. package/dist/cli/commands/doctor/formatter.js +162 -0
  55. package/dist/cli/commands/doctor/formatter.js.map +1 -0
  56. package/dist/cli/commands/doctor/index.d.ts +5 -0
  57. package/dist/cli/commands/doctor/index.d.ts.map +1 -0
  58. package/dist/cli/commands/doctor/index.js +8 -0
  59. package/dist/cli/commands/doctor/index.js.map +1 -0
  60. package/dist/cli/commands/doctor/registry.d.ts +48 -0
  61. package/dist/cli/commands/doctor/registry.d.ts.map +1 -0
  62. package/dist/cli/commands/doctor/registry.js +166 -0
  63. package/dist/cli/commands/doctor/registry.js.map +1 -0
  64. package/dist/cli/commands/doctor/runner.d.ts +14 -0
  65. package/dist/cli/commands/doctor/runner.d.ts.map +1 -0
  66. package/dist/cli/commands/doctor/runner.js +257 -0
  67. package/dist/cli/commands/doctor/runner.js.map +1 -0
  68. package/dist/cli/commands/doctor/types.d.ts +87 -0
  69. package/dist/cli/commands/doctor/types.d.ts.map +1 -0
  70. package/dist/cli/commands/doctor/types.js +2 -0
  71. package/dist/cli/commands/doctor/types.js.map +1 -0
  72. package/dist/cli/commands/doctor.d.ts +12 -0
  73. package/dist/cli/commands/doctor.d.ts.map +1 -0
  74. package/dist/cli/commands/doctor.js +97 -0
  75. package/dist/cli/commands/doctor.js.map +1 -0
  76. package/dist/cli/commands/init/conflicts.d.ts +36 -0
  77. package/dist/cli/commands/init/conflicts.d.ts.map +1 -0
  78. package/dist/cli/commands/init/conflicts.js +165 -0
  79. package/dist/cli/commands/init/conflicts.js.map +1 -0
  80. package/dist/cli/commands/init/github.d.ts +32 -0
  81. package/dist/cli/commands/init/github.d.ts.map +1 -0
  82. package/dist/cli/commands/init/github.js +161 -0
  83. package/dist/cli/commands/init/github.js.map +1 -0
  84. package/dist/cli/commands/init/index.d.ts +21 -0
  85. package/dist/cli/commands/init/index.d.ts.map +1 -0
  86. package/dist/cli/commands/init/index.js +175 -0
  87. package/dist/cli/commands/init/index.js.map +1 -0
  88. package/dist/cli/commands/init/prompts.d.ts +15 -0
  89. package/dist/cli/commands/init/prompts.d.ts.map +1 -0
  90. package/dist/cli/commands/init/prompts.js +281 -0
  91. package/dist/cli/commands/init/prompts.js.map +1 -0
  92. package/dist/cli/commands/init/repo-utils.d.ts +32 -0
  93. package/dist/cli/commands/init/repo-utils.d.ts.map +1 -0
  94. package/dist/cli/commands/init/repo-utils.js +112 -0
  95. package/dist/cli/commands/init/repo-utils.js.map +1 -0
  96. package/dist/cli/commands/init/resolver.d.ts +20 -0
  97. package/dist/cli/commands/init/resolver.d.ts.map +1 -0
  98. package/dist/cli/commands/init/resolver.js +273 -0
  99. package/dist/cli/commands/init/resolver.js.map +1 -0
  100. package/dist/cli/commands/init/summary.d.ts +21 -0
  101. package/dist/cli/commands/init/summary.d.ts.map +1 -0
  102. package/dist/cli/commands/init/summary.js +100 -0
  103. package/dist/cli/commands/init/summary.js.map +1 -0
  104. package/dist/cli/commands/init/types.d.ts +53 -0
  105. package/dist/cli/commands/init/types.d.ts.map +1 -0
  106. package/dist/cli/commands/init/types.js +2 -0
  107. package/dist/cli/commands/init/types.js.map +1 -0
  108. package/dist/cli/commands/init/writer.d.ts +22 -0
  109. package/dist/cli/commands/init/writer.d.ts.map +1 -0
  110. package/dist/cli/commands/init/writer.js +96 -0
  111. package/dist/cli/commands/init/writer.js.map +1 -0
  112. package/dist/cli/commands/orchestrator.d.ts +11 -0
  113. package/dist/cli/commands/orchestrator.d.ts.map +1 -0
  114. package/dist/cli/commands/orchestrator.js +291 -0
  115. package/dist/cli/commands/orchestrator.js.map +1 -0
  116. package/dist/cli/commands/run.d.ts +10 -0
  117. package/dist/cli/commands/run.d.ts.map +1 -0
  118. package/dist/cli/commands/run.js +167 -0
  119. package/dist/cli/commands/run.js.map +1 -0
  120. package/dist/cli/commands/setup/auth.d.ts +11 -0
  121. package/dist/cli/commands/setup/auth.d.ts.map +1 -0
  122. package/dist/cli/commands/setup/auth.js +108 -0
  123. package/dist/cli/commands/setup/auth.js.map +1 -0
  124. package/dist/cli/commands/setup/build.d.ts +11 -0
  125. package/dist/cli/commands/setup/build.d.ts.map +1 -0
  126. package/dist/cli/commands/setup/build.js +212 -0
  127. package/dist/cli/commands/setup/build.js.map +1 -0
  128. package/dist/cli/commands/setup/services.d.ts +11 -0
  129. package/dist/cli/commands/setup/services.d.ts.map +1 -0
  130. package/dist/cli/commands/setup/services.js +294 -0
  131. package/dist/cli/commands/setup/services.js.map +1 -0
  132. package/dist/cli/commands/setup/workspace.d.ts +11 -0
  133. package/dist/cli/commands/setup/workspace.d.ts.map +1 -0
  134. package/dist/cli/commands/setup/workspace.js +215 -0
  135. package/dist/cli/commands/setup/workspace.js.map +1 -0
  136. package/dist/cli/commands/setup.d.ts +7 -0
  137. package/dist/cli/commands/setup.d.ts.map +1 -0
  138. package/dist/cli/commands/setup.js +19 -0
  139. package/dist/cli/commands/setup.js.map +1 -0
  140. package/dist/cli/commands/validate.d.ts +10 -0
  141. package/dist/cli/commands/validate.d.ts.map +1 -0
  142. package/dist/cli/commands/validate.js +164 -0
  143. package/dist/cli/commands/validate.js.map +1 -0
  144. package/dist/cli/commands/worker.d.ts +10 -0
  145. package/dist/cli/commands/worker.d.ts.map +1 -0
  146. package/dist/cli/commands/worker.js +224 -0
  147. package/dist/cli/commands/worker.js.map +1 -0
  148. package/dist/cli/index.d.ts +14 -0
  149. package/dist/cli/index.d.ts.map +1 -0
  150. package/dist/cli/index.js +68 -0
  151. package/dist/cli/index.js.map +1 -0
  152. package/dist/cli/utils/config.d.ts +49 -0
  153. package/dist/cli/utils/config.d.ts.map +1 -0
  154. package/dist/cli/utils/config.js +110 -0
  155. package/dist/cli/utils/config.js.map +1 -0
  156. package/dist/cli/utils/exec.d.ts +39 -0
  157. package/dist/cli/utils/exec.d.ts.map +1 -0
  158. package/dist/cli/utils/exec.js +68 -0
  159. package/dist/cli/utils/exec.js.map +1 -0
  160. package/dist/cli/utils/logger.d.ts +47 -0
  161. package/dist/cli/utils/logger.d.ts.map +1 -0
  162. package/dist/cli/utils/logger.js +97 -0
  163. package/dist/cli/utils/logger.js.map +1 -0
  164. package/dist/config/index.d.ts +10 -0
  165. package/dist/config/index.d.ts.map +1 -0
  166. package/dist/config/index.js +13 -0
  167. package/dist/config/index.js.map +1 -0
  168. package/dist/config/loader.d.ts +104 -0
  169. package/dist/config/loader.d.ts.map +1 -0
  170. package/dist/config/loader.js +266 -0
  171. package/dist/config/loader.js.map +1 -0
  172. package/dist/config/schema.d.ts +304 -0
  173. package/dist/config/schema.d.ts.map +1 -0
  174. package/dist/config/schema.js +160 -0
  175. package/dist/config/schema.js.map +1 -0
  176. package/dist/config/validator.d.ts +60 -0
  177. package/dist/config/validator.d.ts.map +1 -0
  178. package/dist/config/validator.js +112 -0
  179. package/dist/config/validator.js.map +1 -0
  180. package/dist/health/server.d.ts +47 -0
  181. package/dist/health/server.d.ts.map +1 -0
  182. package/dist/health/server.js +92 -0
  183. package/dist/health/server.js.map +1 -0
  184. package/dist/index.d.ts +21 -0
  185. package/dist/index.d.ts.map +1 -0
  186. package/dist/index.js +22 -0
  187. package/dist/index.js.map +1 -0
  188. package/dist/orchestrator/async-event-queue.d.ts +28 -0
  189. package/dist/orchestrator/async-event-queue.d.ts.map +1 -0
  190. package/dist/orchestrator/async-event-queue.js +57 -0
  191. package/dist/orchestrator/async-event-queue.js.map +1 -0
  192. package/dist/orchestrator/client.d.ts +110 -0
  193. package/dist/orchestrator/client.d.ts.map +1 -0
  194. package/dist/orchestrator/client.js +288 -0
  195. package/dist/orchestrator/client.js.map +1 -0
  196. package/dist/orchestrator/event-bus.d.ts +195 -0
  197. package/dist/orchestrator/event-bus.d.ts.map +1 -0
  198. package/dist/orchestrator/event-bus.js +557 -0
  199. package/dist/orchestrator/event-bus.js.map +1 -0
  200. package/dist/orchestrator/heartbeat.d.ts +71 -0
  201. package/dist/orchestrator/heartbeat.d.ts.map +1 -0
  202. package/dist/orchestrator/heartbeat.js +116 -0
  203. package/dist/orchestrator/heartbeat.js.map +1 -0
  204. package/dist/orchestrator/index.d.ts +25 -0
  205. package/dist/orchestrator/index.d.ts.map +1 -0
  206. package/dist/orchestrator/index.js +15 -0
  207. package/dist/orchestrator/index.js.map +1 -0
  208. package/dist/orchestrator/job-handler.d.ts +109 -0
  209. package/dist/orchestrator/job-handler.d.ts.map +1 -0
  210. package/dist/orchestrator/job-handler.js +612 -0
  211. package/dist/orchestrator/job-handler.js.map +1 -0
  212. package/dist/orchestrator/job-queue.d.ts +81 -0
  213. package/dist/orchestrator/job-queue.d.ts.map +1 -0
  214. package/dist/orchestrator/job-queue.js +206 -0
  215. package/dist/orchestrator/job-queue.js.map +1 -0
  216. package/dist/orchestrator/label-monitor-bridge.d.ts +25 -0
  217. package/dist/orchestrator/label-monitor-bridge.d.ts.map +1 -0
  218. package/dist/orchestrator/label-monitor-bridge.js +57 -0
  219. package/dist/orchestrator/label-monitor-bridge.js.map +1 -0
  220. package/dist/orchestrator/log-buffer.d.ts +74 -0
  221. package/dist/orchestrator/log-buffer.d.ts.map +1 -0
  222. package/dist/orchestrator/log-buffer.js +104 -0
  223. package/dist/orchestrator/log-buffer.js.map +1 -0
  224. package/dist/orchestrator/redis-job-queue.d.ts +44 -0
  225. package/dist/orchestrator/redis-job-queue.d.ts.map +1 -0
  226. package/dist/orchestrator/redis-job-queue.js +300 -0
  227. package/dist/orchestrator/redis-job-queue.js.map +1 -0
  228. package/dist/orchestrator/router.d.ts +125 -0
  229. package/dist/orchestrator/router.d.ts.map +1 -0
  230. package/dist/orchestrator/router.js +143 -0
  231. package/dist/orchestrator/router.js.map +1 -0
  232. package/dist/orchestrator/server.d.ts +62 -0
  233. package/dist/orchestrator/server.d.ts.map +1 -0
  234. package/dist/orchestrator/server.js +711 -0
  235. package/dist/orchestrator/server.js.map +1 -0
  236. package/dist/orchestrator/types.d.ts +184 -0
  237. package/dist/orchestrator/types.d.ts.map +1 -0
  238. package/dist/orchestrator/types.js +6 -0
  239. package/dist/orchestrator/types.js.map +1 -0
  240. package/dist/orchestrator/worker-registry.d.ts +110 -0
  241. package/dist/orchestrator/worker-registry.d.ts.map +1 -0
  242. package/dist/orchestrator/worker-registry.js +191 -0
  243. package/dist/orchestrator/worker-registry.js.map +1 -0
  244. package/package.json +80 -0
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Job queue module for the orchestrator server.
3
+ * Provides an in-memory job queue implementation with priority-based ordering.
4
+ */
5
+ import type { Job, JobStatus, JobResult } from './types.js';
6
+ /**
7
+ * Job queue interface for managing workflow jobs.
8
+ */
9
+ export interface JobQueue {
10
+ /**
11
+ * Add a job to the queue.
12
+ * @param job - The job to enqueue
13
+ */
14
+ enqueue(job: Job): Promise<void>;
15
+ /**
16
+ * Poll for the next available job matching worker capabilities.
17
+ * @param workerId - The worker ID requesting a job
18
+ * @param capabilities - Array of capability tags the worker supports
19
+ * @returns The next job or null if none available
20
+ */
21
+ poll(workerId: string, capabilities: string[]): Promise<Job | null>;
22
+ /**
23
+ * Update the status of a job.
24
+ * @param jobId - The job ID to update
25
+ * @param status - The new status
26
+ * @param metadata - Optional metadata to merge with job metadata
27
+ */
28
+ updateStatus(jobId: string, status: JobStatus, metadata?: Record<string, unknown>): Promise<void>;
29
+ /**
30
+ * Report the result of a completed job.
31
+ * @param jobId - The job ID
32
+ * @param result - The job result
33
+ */
34
+ reportResult(jobId: string, result: JobResult): Promise<void>;
35
+ /**
36
+ * Get a job by ID.
37
+ * @param jobId - The job ID to retrieve
38
+ * @returns The job or null if not found
39
+ */
40
+ getJob(jobId: string): Promise<Job | null>;
41
+ /**
42
+ * Cancel a job.
43
+ * @param jobId - The job ID to cancel
44
+ * @param reason - Optional cancellation reason
45
+ */
46
+ cancelJob(jobId: string, reason?: string): Promise<void>;
47
+ /**
48
+ * Requeue a job that was dequeued but could not be assigned.
49
+ * Returns the job to the pending queue at its correct priority position.
50
+ * @param jobId - The job ID to requeue
51
+ * @throws Error if job not found or not in 'assigned' status
52
+ */
53
+ requeue(jobId: string): Promise<void>;
54
+ }
55
+ /**
56
+ * In-memory job queue implementation.
57
+ * WARNING: This queue stores all data in memory and will lose all jobs on restart.
58
+ */
59
+ export declare class InMemoryJobQueue implements JobQueue {
60
+ /** Map of job ID to job data */
61
+ private jobs;
62
+ /** Array of pending job IDs sorted by priority (highest first) */
63
+ private pendingQueue;
64
+ constructor();
65
+ /**
66
+ * Insert a job ID into the pending queue maintaining priority order.
67
+ */
68
+ private insertIntoQueue;
69
+ /**
70
+ * Check if a job matches the given worker capabilities.
71
+ */
72
+ private matchesCapabilities;
73
+ enqueue(job: Job): Promise<void>;
74
+ poll(workerId: string, capabilities: string[]): Promise<Job | null>;
75
+ updateStatus(jobId: string, status: JobStatus, metadata?: Record<string, unknown>): Promise<void>;
76
+ reportResult(jobId: string, result: JobResult): Promise<void>;
77
+ getJob(jobId: string): Promise<Job | null>;
78
+ cancelJob(jobId: string, reason?: string): Promise<void>;
79
+ requeue(jobId: string): Promise<void>;
80
+ }
81
+ //# sourceMappingURL=job-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-queue.d.ts","sourceRoot":"","sources":["../../src/orchestrator/job-queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAe,MAAM,YAAY,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjC;;;;;OAKG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAEpE;;;;;OAKG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElG;;;;OAIG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9D;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAE3C;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzD;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAYD;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,QAAQ;IAC/C,gCAAgC;IAChC,OAAO,CAAC,IAAI,CAA+B;IAE3C,kEAAkE;IAClE,OAAO,CAAC,YAAY,CAAgB;;IASpC;;OAEG;IACH,OAAO,CAAC,eAAe;IAqBvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAerB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAUhC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAsCnE,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,EACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IAwCV,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B7D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAK1C,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BxD,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAkB5C"}
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Job queue module for the orchestrator server.
3
+ * Provides an in-memory job queue implementation with priority-based ordering.
4
+ */
5
+ /**
6
+ * Priority ordering: urgent > high > normal > low
7
+ */
8
+ const PRIORITY_ORDER = {
9
+ urgent: 4,
10
+ high: 3,
11
+ normal: 2,
12
+ low: 1,
13
+ };
14
+ /**
15
+ * In-memory job queue implementation.
16
+ * WARNING: This queue stores all data in memory and will lose all jobs on restart.
17
+ */
18
+ export class InMemoryJobQueue {
19
+ /** Map of job ID to job data */
20
+ jobs = new Map();
21
+ /** Array of pending job IDs sorted by priority (highest first) */
22
+ pendingQueue = [];
23
+ constructor() {
24
+ console.warn('[JobQueue] Using in-memory job queue. All queued jobs will be lost on server restart. ' +
25
+ 'Consider using a persistent backend (e.g., Redis) for production deployments.');
26
+ }
27
+ /**
28
+ * Insert a job ID into the pending queue maintaining priority order.
29
+ */
30
+ insertIntoQueue(jobId, priority) {
31
+ const priorityValue = PRIORITY_ORDER[priority];
32
+ // Find the insertion index to maintain descending priority order
33
+ let insertIndex = this.pendingQueue.length;
34
+ for (let i = 0; i < this.pendingQueue.length; i++) {
35
+ const existingJobId = this.pendingQueue[i];
36
+ if (existingJobId === undefined)
37
+ continue;
38
+ const existingJob = this.jobs.get(existingJobId);
39
+ if (existingJob) {
40
+ const existingPriority = PRIORITY_ORDER[existingJob.priority];
41
+ if (priorityValue > existingPriority) {
42
+ insertIndex = i;
43
+ break;
44
+ }
45
+ }
46
+ }
47
+ this.pendingQueue.splice(insertIndex, 0, jobId);
48
+ }
49
+ /**
50
+ * Check if a job matches the given worker capabilities.
51
+ */
52
+ matchesCapabilities(job, capabilities) {
53
+ // Empty capabilities or wildcard matches all jobs
54
+ if (capabilities.length === 0 || capabilities.includes('*')) {
55
+ return true;
56
+ }
57
+ // If job has no tags, only wildcard workers can match
58
+ if (!job.tags || job.tags.length === 0) {
59
+ return true; // Jobs without tags can be picked up by any worker
60
+ }
61
+ // Check if any of the job's tags match worker capabilities
62
+ return job.tags.some((tag) => capabilities.includes(tag));
63
+ }
64
+ async enqueue(job) {
65
+ // Store the job
66
+ this.jobs.set(job.id, { ...job });
67
+ // Only add to pending queue if status is 'pending'
68
+ if (job.status === 'pending') {
69
+ this.insertIntoQueue(job.id, job.priority);
70
+ }
71
+ }
72
+ async poll(workerId, capabilities) {
73
+ // Find the highest priority pending job that matches capabilities
74
+ for (let i = 0; i < this.pendingQueue.length; i++) {
75
+ const jobId = this.pendingQueue[i];
76
+ if (jobId === undefined)
77
+ continue;
78
+ const job = this.jobs.get(jobId);
79
+ if (!job) {
80
+ // Clean up stale queue entry
81
+ this.pendingQueue.splice(i, 1);
82
+ i--;
83
+ continue;
84
+ }
85
+ if (job.status !== 'pending') {
86
+ // Job is no longer pending, remove from queue
87
+ this.pendingQueue.splice(i, 1);
88
+ i--;
89
+ continue;
90
+ }
91
+ if (this.matchesCapabilities(job, capabilities)) {
92
+ // Remove from pending queue
93
+ this.pendingQueue.splice(i, 1);
94
+ // Update job to assigned status
95
+ const now = new Date().toISOString();
96
+ job.status = 'assigned';
97
+ job.assignedAt = now;
98
+ job.workerId = workerId;
99
+ return { ...job };
100
+ }
101
+ }
102
+ return null;
103
+ }
104
+ async updateStatus(jobId, status, metadata) {
105
+ const job = this.jobs.get(jobId);
106
+ if (!job) {
107
+ throw new Error(`Job not found: ${jobId}`);
108
+ }
109
+ const now = new Date().toISOString();
110
+ // Update status
111
+ job.status = status;
112
+ // Update relevant timestamps based on status
113
+ switch (status) {
114
+ case 'running':
115
+ job.startedAt = now;
116
+ break;
117
+ case 'completed':
118
+ case 'failed':
119
+ case 'cancelled':
120
+ job.completedAt = now;
121
+ break;
122
+ case 'assigned':
123
+ job.assignedAt = now;
124
+ break;
125
+ }
126
+ // Merge metadata if provided
127
+ if (metadata) {
128
+ job.metadata = {
129
+ ...job.metadata,
130
+ ...metadata,
131
+ };
132
+ }
133
+ // If job goes back to pending, re-add to queue
134
+ if (status === 'pending') {
135
+ this.insertIntoQueue(jobId, job.priority);
136
+ }
137
+ }
138
+ async reportResult(jobId, result) {
139
+ const job = this.jobs.get(jobId);
140
+ if (!job) {
141
+ throw new Error(`Job not found: ${jobId}`);
142
+ }
143
+ const now = new Date().toISOString();
144
+ // Update job status from result
145
+ job.status = result.status;
146
+ job.completedAt = now;
147
+ // Store result data in metadata
148
+ job.metadata = {
149
+ ...job.metadata,
150
+ result: {
151
+ outputs: result.outputs,
152
+ error: result.error,
153
+ errorStack: result.errorStack,
154
+ duration: result.duration,
155
+ phases: result.phases,
156
+ steps: result.steps,
157
+ },
158
+ };
159
+ }
160
+ async getJob(jobId) {
161
+ const job = this.jobs.get(jobId);
162
+ return job ? { ...job } : null;
163
+ }
164
+ async cancelJob(jobId, reason) {
165
+ const job = this.jobs.get(jobId);
166
+ if (!job) {
167
+ throw new Error(`Job not found: ${jobId}`);
168
+ }
169
+ // Only cancel if not already in a terminal state
170
+ const terminalStates = ['completed', 'failed', 'cancelled'];
171
+ if (terminalStates.includes(job.status)) {
172
+ return; // Already in terminal state, no-op
173
+ }
174
+ const now = new Date().toISOString();
175
+ job.status = 'cancelled';
176
+ job.completedAt = now;
177
+ // Store cancellation reason in metadata
178
+ if (reason) {
179
+ job.metadata = {
180
+ ...job.metadata,
181
+ cancellationReason: reason,
182
+ };
183
+ }
184
+ // Remove from pending queue if present
185
+ const queueIndex = this.pendingQueue.indexOf(jobId);
186
+ if (queueIndex !== -1) {
187
+ this.pendingQueue.splice(queueIndex, 1);
188
+ }
189
+ }
190
+ async requeue(jobId) {
191
+ const job = this.jobs.get(jobId);
192
+ if (!job) {
193
+ throw new Error(`Job not found: ${jobId}`);
194
+ }
195
+ if (job.status !== 'assigned') {
196
+ throw new Error(`Cannot requeue job ${jobId}: expected status 'assigned', got '${job.status}'`);
197
+ }
198
+ // Reset to clean pending state
199
+ job.status = 'pending';
200
+ job.workerId = undefined;
201
+ job.assignedAt = undefined;
202
+ // Re-insert at correct priority position
203
+ this.insertIntoQueue(jobId, job.priority);
204
+ }
205
+ }
206
+ //# sourceMappingURL=job-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-queue.js","sourceRoot":"","sources":["../../src/orchestrator/job-queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Bridge adapter that connects the LabelMonitorService (from @generacy-ai/orchestrator)
3
+ * to the simple orchestrator's job queue.
4
+ *
5
+ * Implements the QueueAdapter interface expected by LabelMonitorService,
6
+ * converting QueueItem → Job and submitting via the orchestrator server.
7
+ * Fetches issue details from GitHub to populate workflow inputs.
8
+ */
9
+ import type { QueueAdapter, QueueItem } from '@generacy-ai/orchestrator';
10
+ import type { GitHubClientFactory } from '@generacy-ai/workflow-engine';
11
+ import type { OrchestratorServer } from './server.js';
12
+ interface Logger {
13
+ info(message: string, data?: Record<string, unknown>): void;
14
+ warn(message: string, data?: Record<string, unknown>): void;
15
+ error(message: string, data?: Record<string, unknown>): void;
16
+ }
17
+ export declare class LabelMonitorBridge implements QueueAdapter {
18
+ private readonly server;
19
+ private readonly createGitHubClient;
20
+ private readonly logger;
21
+ constructor(server: OrchestratorServer, createGitHubClient: GitHubClientFactory, logger: Logger);
22
+ enqueue(item: QueueItem): Promise<void>;
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=label-monitor-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label-monitor-bridge.d.ts","sourceRoot":"","sources":["../../src/orchestrator/label-monitor-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGtD,UAAU,MAAM;IACd,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9D;AAED,qBAAa,kBAAmB,YAAW,YAAY;IAEnD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,MAAM,EAAE,kBAAkB,EAC1B,kBAAkB,EAAE,mBAAmB,EACvC,MAAM,EAAE,MAAM;IAG3B,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAgD9C"}
@@ -0,0 +1,57 @@
1
+ export class LabelMonitorBridge {
2
+ server;
3
+ createGitHubClient;
4
+ logger;
5
+ constructor(server, createGitHubClient, logger) {
6
+ this.server = server;
7
+ this.createGitHubClient = createGitHubClient;
8
+ this.logger = logger;
9
+ }
10
+ async enqueue(item) {
11
+ const priority = 'high';
12
+ const issueUrl = `https://github.com/${item.owner}/${item.repo}/issues/${item.issueNumber}`;
13
+ // Fetch issue details to populate workflow inputs (e.g. description)
14
+ let description = `Issue #${item.issueNumber} from ${item.owner}/${item.repo}`;
15
+ try {
16
+ const github = this.createGitHubClient();
17
+ const issue = await github.getIssue(item.owner, item.repo, item.issueNumber);
18
+ description = issue.body || issue.title;
19
+ }
20
+ catch (error) {
21
+ this.logger.warn('Failed to fetch issue details, using fallback description', {
22
+ owner: item.owner,
23
+ repo: item.repo,
24
+ issueNumber: item.issueNumber,
25
+ error: String(error),
26
+ });
27
+ }
28
+ const jobId = await this.server.submitJob({
29
+ name: `${item.command}:${item.owner}/${item.repo}#${item.issueNumber}`,
30
+ priority,
31
+ workflow: item.workflowName,
32
+ inputs: {
33
+ description,
34
+ owner: item.owner,
35
+ repo: item.repo,
36
+ issue_number: item.issueNumber,
37
+ issue_url: issueUrl,
38
+ command: item.command,
39
+ },
40
+ tags: ['label-monitor', item.command, `${item.owner}/${item.repo}`],
41
+ metadata: {
42
+ source: 'label-monitor',
43
+ enqueuedAt: item.enqueuedAt,
44
+ workflowName: item.workflowName,
45
+ },
46
+ });
47
+ this.logger.info('Label monitor job submitted', {
48
+ jobId,
49
+ owner: item.owner,
50
+ repo: item.repo,
51
+ issueNumber: item.issueNumber,
52
+ command: item.command,
53
+ workflowName: item.workflowName,
54
+ });
55
+ }
56
+ }
57
+ //# sourceMappingURL=label-monitor-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label-monitor-bridge.js","sourceRoot":"","sources":["../../src/orchestrator/label-monitor-bridge.ts"],"names":[],"mappings":"AAmBA,MAAM,OAAO,kBAAkB;IAEV;IACA;IACA;IAHnB,YACmB,MAA0B,EAC1B,kBAAuC,EACvC,MAAc;QAFd,WAAM,GAAN,MAAM,CAAoB;QAC1B,uBAAkB,GAAlB,kBAAkB,CAAqB;QACvC,WAAM,GAAN,MAAM,CAAQ;IAC9B,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,IAAe;QAC3B,MAAM,QAAQ,GAAgB,MAAM,CAAC;QACrC,MAAM,QAAQ,GAAG,sBAAsB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,WAAW,IAAI,CAAC,WAAW,EAAE,CAAC;QAE5F,qEAAqE;QACrE,IAAI,WAAW,GAAG,UAAU,IAAI,CAAC,WAAW,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/E,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAC7E,WAAW,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2DAA2D,EAAE;gBAC5E,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;aACrB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YACxC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE;YACtE,QAAQ;YACR,QAAQ,EAAE,IAAI,CAAC,YAAY;YAC3B,MAAM,EAAE;gBACN,WAAW;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,YAAY,EAAE,IAAI,CAAC,WAAW;gBAC9B,SAAS,EAAE,QAAQ;gBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB;YACD,IAAI,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACnE,QAAQ,EAAE;gBACR,MAAM,EAAE,eAAe;gBACvB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;aAChC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;YAC9C,KAAK;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,74 @@
1
+ /** A single log entry from a speckit operation's stdout/stderr. */
2
+ export interface LogEntry {
3
+ /** Monotonic ID within the job's log buffer */
4
+ id: number;
5
+ /** Unix epoch ms */
6
+ timestamp: number;
7
+ /** 'stdout' or 'stderr' */
8
+ stream: string;
9
+ /** Speckit operation name (e.g. 'specify', 'plan', 'implement') */
10
+ stepName: string;
11
+ /** The log content */
12
+ content: string;
13
+ /** Task index for implement operation */
14
+ taskIndex?: number;
15
+ /** Task title for implement operation */
16
+ taskTitle?: string;
17
+ }
18
+ /**
19
+ * Per-job log buffer backed by a RingBuffer.
20
+ *
21
+ * Assigns monotonic IDs to entries so clients can do incremental
22
+ * fetches with `getAfterId(sinceId)`.
23
+ */
24
+ export declare class LogBuffer {
25
+ private readonly buffer;
26
+ private counter;
27
+ constructor(capacity?: number);
28
+ /** Append a log entry, assigning a monotonic ID. Returns the full entry. */
29
+ append(entry: Omit<LogEntry, 'id'>): LogEntry;
30
+ /** Return all buffered entries in insertion order. */
31
+ getAll(): LogEntry[];
32
+ /**
33
+ * Return entries with IDs strictly greater than `sinceId`.
34
+ *
35
+ * ID mapping to RingBuffer logical index: entry with id=N was pushed
36
+ * at logical index (N - 1). `getAfterIndex(N - 1)` returns items with
37
+ * logical index > (N - 1), i.e. id > N — exactly what we want.
38
+ */
39
+ getAfterId(sinceId: number): LogEntry[];
40
+ /** Clear all entries and reset the ID counter. */
41
+ clear(): void;
42
+ /** Number of entries currently in the buffer. */
43
+ get size(): number;
44
+ }
45
+ /**
46
+ * Manages per-job LogBuffer instances with automatic cleanup.
47
+ *
48
+ * Buffers are lazily created on first access and scheduled for cleanup
49
+ * after a job reaches a terminal state. The grace period (default 5 min)
50
+ * aligns with the EventBus cleanup to give reconnecting clients time
51
+ * to catch up.
52
+ */
53
+ export declare class LogBufferManager {
54
+ private readonly buffers;
55
+ private readonly cleanupTimers;
56
+ private readonly capacity;
57
+ private readonly gracePeriod;
58
+ constructor(options?: {
59
+ capacity?: number;
60
+ gracePeriod?: number;
61
+ });
62
+ /** Get the log buffer for a job, creating one if it doesn't exist. */
63
+ getOrCreate(jobId: string): LogBuffer;
64
+ /** Get the log buffer for a job, or undefined if none exists. */
65
+ get(jobId: string): LogBuffer | undefined;
66
+ /**
67
+ * Schedule cleanup of a job's log buffer after the grace period.
68
+ * Resets any existing timer for the same job.
69
+ */
70
+ scheduleCleanup(jobId: string): void;
71
+ /** Clean shutdown: clear all timers and buffers. */
72
+ destroy(): void;
73
+ }
74
+ //# sourceMappingURL=log-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-buffer.d.ts","sourceRoot":"","sources":["../../src/orchestrator/log-buffer.ts"],"names":[],"mappings":"AASA,mEAAmE;AACnE,MAAM,WAAW,QAAQ;IACvB,+CAA+C;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,OAAO,CAAK;gBAER,QAAQ,SAAQ;IAI5B,4EAA4E;IAC5E,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,QAAQ;IAM7C,sDAAsD;IACtD,MAAM,IAAI,QAAQ,EAAE;IAIpB;;;;;;OAMG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE;IAIvC,kDAAkD;IAClD,KAAK,IAAI,IAAI;IAKb,iDAAiD;IACjD,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAED;;;;;;;GAOG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IACxD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoD;IAClF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;IAKjE,sEAAsE;IACtE,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS;IASrC,iEAAiE;IACjE,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIzC;;;OAGG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAYpC,oDAAoD;IACpD,OAAO,IAAI,IAAI;CAKhB"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * LogBuffer and LogBufferManager for per-job log storage.
3
+ *
4
+ * LogBuffer wraps a RingBuffer to store log entries from streaming
5
+ * stdout/stderr output of speckit operations. LogBufferManager manages
6
+ * per-job buffers with automatic cleanup after a grace period.
7
+ */
8
+ import { RingBuffer } from './event-bus.js';
9
+ /**
10
+ * Per-job log buffer backed by a RingBuffer.
11
+ *
12
+ * Assigns monotonic IDs to entries so clients can do incremental
13
+ * fetches with `getAfterId(sinceId)`.
14
+ */
15
+ export class LogBuffer {
16
+ buffer;
17
+ counter = 0;
18
+ constructor(capacity = 10000) {
19
+ this.buffer = new RingBuffer(capacity);
20
+ }
21
+ /** Append a log entry, assigning a monotonic ID. Returns the full entry. */
22
+ append(entry) {
23
+ const full = { ...entry, id: ++this.counter };
24
+ this.buffer.push(full);
25
+ return full;
26
+ }
27
+ /** Return all buffered entries in insertion order. */
28
+ getAll() {
29
+ return this.buffer.getAll();
30
+ }
31
+ /**
32
+ * Return entries with IDs strictly greater than `sinceId`.
33
+ *
34
+ * ID mapping to RingBuffer logical index: entry with id=N was pushed
35
+ * at logical index (N - 1). `getAfterIndex(N - 1)` returns items with
36
+ * logical index > (N - 1), i.e. id > N — exactly what we want.
37
+ */
38
+ getAfterId(sinceId) {
39
+ return this.buffer.getAfterIndex(sinceId - 1);
40
+ }
41
+ /** Clear all entries and reset the ID counter. */
42
+ clear() {
43
+ this.buffer.clear();
44
+ this.counter = 0;
45
+ }
46
+ /** Number of entries currently in the buffer. */
47
+ get size() {
48
+ return this.buffer.size;
49
+ }
50
+ }
51
+ /**
52
+ * Manages per-job LogBuffer instances with automatic cleanup.
53
+ *
54
+ * Buffers are lazily created on first access and scheduled for cleanup
55
+ * after a job reaches a terminal state. The grace period (default 5 min)
56
+ * aligns with the EventBus cleanup to give reconnecting clients time
57
+ * to catch up.
58
+ */
59
+ export class LogBufferManager {
60
+ buffers = new Map();
61
+ cleanupTimers = new Map();
62
+ capacity;
63
+ gracePeriod;
64
+ constructor(options) {
65
+ this.capacity = options?.capacity ?? 10000;
66
+ this.gracePeriod = options?.gracePeriod ?? 300_000; // 5 min
67
+ }
68
+ /** Get the log buffer for a job, creating one if it doesn't exist. */
69
+ getOrCreate(jobId) {
70
+ let buf = this.buffers.get(jobId);
71
+ if (!buf) {
72
+ buf = new LogBuffer(this.capacity);
73
+ this.buffers.set(jobId, buf);
74
+ }
75
+ return buf;
76
+ }
77
+ /** Get the log buffer for a job, or undefined if none exists. */
78
+ get(jobId) {
79
+ return this.buffers.get(jobId);
80
+ }
81
+ /**
82
+ * Schedule cleanup of a job's log buffer after the grace period.
83
+ * Resets any existing timer for the same job.
84
+ */
85
+ scheduleCleanup(jobId) {
86
+ const existing = this.cleanupTimers.get(jobId);
87
+ if (existing)
88
+ clearTimeout(existing);
89
+ const timer = setTimeout(() => {
90
+ this.buffers.get(jobId)?.clear();
91
+ this.buffers.delete(jobId);
92
+ this.cleanupTimers.delete(jobId);
93
+ }, this.gracePeriod);
94
+ this.cleanupTimers.set(jobId, timer);
95
+ }
96
+ /** Clean shutdown: clear all timers and buffers. */
97
+ destroy() {
98
+ for (const timer of this.cleanupTimers.values())
99
+ clearTimeout(timer);
100
+ this.cleanupTimers.clear();
101
+ this.buffers.clear();
102
+ }
103
+ }
104
+ //# sourceMappingURL=log-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-buffer.js","sourceRoot":"","sources":["../../src/orchestrator/log-buffer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Redis-backed job queue implementation for the orchestrator server.
3
+ * Provides persistent job storage with priority-based ordering using Redis sorted sets.
4
+ */
5
+ import type { Job, JobStatus, JobResult } from './types.js';
6
+ import type { JobQueue } from './job-queue.js';
7
+ /**
8
+ * Redis-backed job queue implementation.
9
+ * Jobs survive orchestrator restarts as long as Redis persists.
10
+ */
11
+ export declare class RedisJobQueue implements JobQueue {
12
+ private redis;
13
+ private isConnected;
14
+ constructor(redisUrl: string);
15
+ /**
16
+ * Connect to Redis. Must be called before using the queue.
17
+ * Throws if connection fails.
18
+ */
19
+ connect(): Promise<void>;
20
+ /**
21
+ * Disconnect from Redis.
22
+ */
23
+ close(): Promise<void>;
24
+ /**
25
+ * Compute sorted set score: priority-first, FIFO within same priority.
26
+ */
27
+ private computeScore;
28
+ enqueue(job: Job): Promise<void>;
29
+ poll(workerId: string, capabilities: string[]): Promise<Job | null>;
30
+ updateStatus(jobId: string, status: JobStatus, metadata?: Record<string, unknown>): Promise<void>;
31
+ reportResult(jobId: string, result: JobResult): Promise<void>;
32
+ getJob(jobId: string): Promise<Job | null>;
33
+ cancelJob(jobId: string, reason?: string): Promise<void>;
34
+ requeue(jobId: string): Promise<void>;
35
+ }
36
+ /**
37
+ * Create a job queue, preferring Redis if a URL is provided.
38
+ * Falls back to InMemoryJobQueue if Redis connection fails.
39
+ */
40
+ export declare function createJobQueue(redisUrl: string | undefined, logger?: {
41
+ info: (msg: string, data?: Record<string, unknown>) => void;
42
+ warn: (msg: string, data?: Record<string, unknown>) => void;
43
+ }): Promise<JobQueue>;
44
+ //# sourceMappingURL=redis-job-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-job-queue.d.ts","sourceRoot":"","sources":["../../src/orchestrator/redis-job-queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAe,MAAM,YAAY,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAwG/C;;;GAGG;AACH,qBAAa,aAAc,YAAW,QAAQ;IAC5C,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,WAAW,CAAS;gBAEhB,QAAQ,EAAE,MAAM;IAmB5B;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;OAEG;IACH,OAAO,CAAC,YAAY;IAQd,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAUhC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAmBnE,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,EACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IA0CV,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B7D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAM1C,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BxD,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAwB5C;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,CAAC,EAAE;IAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;CAAE,GACpI,OAAO,CAAC,QAAQ,CAAC,CAgBnB"}