@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,291 @@
1
+ /**
2
+ * Orchestrator command implementation.
3
+ * Starts the orchestrator HTTP server for worker coordination.
4
+ * Optionally enables label monitoring to watch GitHub repos for process:* labels.
5
+ */
6
+ import { Command } from 'commander';
7
+ import { getLogger } from '../utils/logger.js';
8
+ import { createOrchestratorServer } from '../../orchestrator/index.js';
9
+ import { createJobQueue } from '../../orchestrator/redis-job-queue.js';
10
+ import { LabelMonitorBridge } from '../../orchestrator/label-monitor-bridge.js';
11
+ /**
12
+ * Create the orchestrator command
13
+ */
14
+ export function orchestratorCommand() {
15
+ const command = new Command('orchestrator');
16
+ command
17
+ .description('Start the orchestrator server that coordinates workers and distributes jobs')
18
+ .option('-p, --port <port>', 'HTTP server port', '3100')
19
+ .option('-h, --host <host>', 'Host to bind to', '0.0.0.0')
20
+ .option('--worker-timeout <ms>', 'Worker heartbeat timeout in milliseconds', '60000')
21
+ .option('--auth-token <token>', 'Authentication token (or set ORCHESTRATOR_TOKEN env var)')
22
+ .option('--redis-url <url>', 'Redis URL for persistent job queue (or set REDIS_URL env var)')
23
+ .option('--label-monitor', 'Enable GitHub label monitoring (or set LABEL_MONITOR_ENABLED=true)')
24
+ .option('--poll-interval <ms>', 'Label monitor poll interval in milliseconds (or set POLL_INTERVAL_MS)')
25
+ .option('--monitored-repos <repos>', 'Comma-separated owner/repo list (or set MONITORED_REPOS)')
26
+ .action(async (options) => {
27
+ const logger = getLogger();
28
+ const port = parseInt(options['port'], 10);
29
+ const host = options['host'];
30
+ const workerTimeout = parseInt(options['workerTimeout'], 10);
31
+ const authToken = options['authToken'];
32
+ const redisUrl = options['redisUrl'] ?? process.env['REDIS_URL'];
33
+ // Validate port
34
+ if (isNaN(port) || port < 1 || port > 65535) {
35
+ logger.error('Invalid port number. Must be between 1 and 65535.');
36
+ process.exit(1);
37
+ }
38
+ // Validate timeout
39
+ if (isNaN(workerTimeout) || workerTimeout < 1000) {
40
+ logger.error('Invalid worker timeout. Must be at least 1000ms.');
41
+ process.exit(1);
42
+ }
43
+ const loggerAdapter = {
44
+ info: (message, data) => logger.info(data ?? {}, message),
45
+ warn: (message, data) => logger.warn(data ?? {}, message),
46
+ error: (message, data) => logger.error(data ?? {}, message),
47
+ };
48
+ logger.info({
49
+ port,
50
+ host,
51
+ workerTimeout,
52
+ authEnabled: !!(authToken || process.env['ORCHESTRATOR_TOKEN']),
53
+ redisUrl: redisUrl ? redisUrl.replace(/\/\/.*@/, '//***@') : undefined,
54
+ }, 'Starting orchestrator server');
55
+ // Create job queue (Redis if URL provided, in-memory fallback)
56
+ const jobQueue = await createJobQueue(redisUrl, loggerAdapter);
57
+ // Create server with pino logger adapter
58
+ const server = createOrchestratorServer({
59
+ port,
60
+ host,
61
+ workerTimeout,
62
+ authToken,
63
+ jobQueue,
64
+ logger: loggerAdapter,
65
+ });
66
+ // Label monitor setup
67
+ const labelMonitorEnabled = options['labelMonitor'] === true ||
68
+ process.env['LABEL_MONITOR_ENABLED'] === 'true';
69
+ let labelMonitorSetup = null;
70
+ if (labelMonitorEnabled) {
71
+ labelMonitorSetup = await setupLabelMonitor(options, redisUrl, server, loggerAdapter, logger);
72
+ }
73
+ // Graceful shutdown handler
74
+ let isShuttingDown = false;
75
+ const shutdown = async (signal) => {
76
+ if (isShuttingDown) {
77
+ return;
78
+ }
79
+ isShuttingDown = true;
80
+ logger.info({ signal }, 'Received shutdown signal, stopping orchestrator...');
81
+ try {
82
+ // Stop label monitor and smee receiver before closing the server
83
+ if (labelMonitorSetup) {
84
+ labelMonitorSetup.monitor.stopPolling();
85
+ if (labelMonitorSetup.smeeReceiver) {
86
+ labelMonitorSetup.smeeReceiver.stop();
87
+ }
88
+ logger.info('Label monitor stopped');
89
+ }
90
+ // Give a brief grace period for in-flight requests
91
+ await new Promise(resolve => setTimeout(resolve, 1000));
92
+ await server.close();
93
+ logger.info('Orchestrator shutdown complete');
94
+ process.exit(0);
95
+ }
96
+ catch (error) {
97
+ logger.error({ error: String(error) }, 'Error during shutdown');
98
+ process.exit(1);
99
+ }
100
+ };
101
+ // Handle signals
102
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
103
+ process.on('SIGINT', () => shutdown('SIGINT'));
104
+ // Handle uncaught errors
105
+ process.on('uncaughtException', (error) => {
106
+ logger.error({ error: error.message, stack: error.stack }, 'Uncaught exception');
107
+ shutdown('uncaughtException');
108
+ });
109
+ process.on('unhandledRejection', (reason) => {
110
+ logger.error({ reason: String(reason) }, 'Unhandled rejection');
111
+ shutdown('unhandledRejection');
112
+ });
113
+ // Start the server
114
+ try {
115
+ await server.listen();
116
+ logger.info({
117
+ port: server.getPort(),
118
+ host,
119
+ labelMonitor: labelMonitorEnabled,
120
+ endpoints: [
121
+ 'GET /api/health',
122
+ 'POST /api/workers/register',
123
+ 'DELETE /api/workers/:workerId',
124
+ 'POST /api/workers/:workerId/heartbeat',
125
+ 'GET /api/jobs/poll',
126
+ 'GET /api/jobs/:jobId',
127
+ 'PUT /api/jobs/:jobId/status',
128
+ 'POST /api/jobs/:jobId/result',
129
+ 'POST /api/jobs/:jobId/cancel',
130
+ ],
131
+ }, 'Orchestrator server ready and listening');
132
+ // Start label monitoring after server is ready
133
+ if (labelMonitorSetup) {
134
+ // Start smee receiver for real-time webhook events (if configured)
135
+ if (labelMonitorSetup.smeeReceiver) {
136
+ labelMonitorSetup.smeeReceiver.start().catch((error) => {
137
+ logger.error({ error: String(error) }, 'Smee webhook receiver failed');
138
+ });
139
+ logger.info('Smee webhook receiver started');
140
+ }
141
+ // Start polling as primary (no smee) or fallback (with smee)
142
+ labelMonitorSetup.monitor.startPolling().catch((error) => {
143
+ logger.error({ error: String(error) }, 'Label monitor polling failed');
144
+ });
145
+ logger.info({ mode: labelMonitorSetup.smeeReceiver ? 'smee+polling-fallback' : 'polling-only' }, 'Label monitor started');
146
+ }
147
+ }
148
+ catch (error) {
149
+ logger.error({ error: String(error) }, 'Failed to start orchestrator server');
150
+ process.exit(1);
151
+ }
152
+ });
153
+ return command;
154
+ }
155
+ /**
156
+ * Default poll interval when smee.io webhooks are active.
157
+ * Polling serves as a fallback only, so it can be very infrequent.
158
+ */
159
+ const SMEE_FALLBACK_POLL_INTERVAL_MS = 300_000; // 5 minutes
160
+ /**
161
+ * Setup label monitoring when enabled.
162
+ * Dynamically imports orchestrator services to avoid loading them when disabled.
163
+ * Returns both the monitor service and an optional smee receiver.
164
+ */
165
+ async function setupLabelMonitor(options, redisUrl, server, loggerAdapter, logger) {
166
+ // Dynamic import to avoid loading orchestrator deps when label monitor is disabled
167
+ const { LabelMonitorService, LabelSyncService, SmeeWebhookReceiver, PhaseTrackerService, WebhookSetupService, resolveClusterIdentity } = await import('@generacy-ai/orchestrator');
168
+ const { createGitHubClient } = await import('@generacy-ai/workflow-engine');
169
+ const { Redis: IORedis } = await import('ioredis');
170
+ // Parse repositories
171
+ const reposStr = options['monitoredRepos'] ??
172
+ process.env['MONITORED_REPOS'] ?? '';
173
+ const repositories = reposStr
174
+ .split(',')
175
+ .map(r => r.trim())
176
+ .filter(Boolean)
177
+ .map(r => {
178
+ const [owner, repo] = r.split('/');
179
+ if (!owner || !repo) {
180
+ logger.warn({ repo: r }, 'Invalid repository format, expected owner/repo');
181
+ return null;
182
+ }
183
+ return { owner, repo };
184
+ })
185
+ .filter((r) => r !== null);
186
+ if (repositories.length === 0) {
187
+ logger.error('Label monitor enabled but no valid repositories configured. Set MONITORED_REPOS.');
188
+ process.exit(1);
189
+ }
190
+ // Check for smee.io channel URL
191
+ const smeeChannelUrl = process.env['SMEE_CHANNEL_URL'];
192
+ const useSmee = !!smeeChannelUrl;
193
+ // When smee is active, polling is just a fallback — use a much longer interval
194
+ const configuredPollMs = parseInt(options['pollInterval'] ??
195
+ process.env['POLL_INTERVAL_MS'] ?? '30000', 10);
196
+ const pollIntervalMs = useSmee ? SMEE_FALLBACK_POLL_INTERVAL_MS : configuredPollMs;
197
+ // Create Redis connection for phase tracker (reuse URL from job queue)
198
+ let phaseTrackerRedis = null;
199
+ if (redisUrl) {
200
+ try {
201
+ phaseTrackerRedis = new IORedis(redisUrl);
202
+ await phaseTrackerRedis.ping();
203
+ logger.info('Phase tracker Redis connected');
204
+ }
205
+ catch (error) {
206
+ logger.warn({ error: String(error) }, 'Failed to connect Redis for phase tracker, dedup will be disabled');
207
+ phaseTrackerRedis = null;
208
+ }
209
+ }
210
+ // Pino-compatible logger adapter for LabelMonitorService
211
+ // The service calls logger.info(obj, msg) or logger.info(msg)
212
+ const monitorLogger = {
213
+ info: (msgOrObj, msg) => {
214
+ if (typeof msgOrObj === 'string') {
215
+ logger.info(msgOrObj);
216
+ }
217
+ else {
218
+ logger.info(msgOrObj, msg ?? '');
219
+ }
220
+ },
221
+ warn: (msgOrObj, msg) => {
222
+ if (typeof msgOrObj === 'string') {
223
+ logger.warn(msgOrObj);
224
+ }
225
+ else {
226
+ logger.warn(msgOrObj, msg ?? '');
227
+ }
228
+ },
229
+ error: (msgOrObj, msg) => {
230
+ if (typeof msgOrObj === 'string') {
231
+ logger.error(msgOrObj);
232
+ }
233
+ else {
234
+ logger.error(msgOrObj, msg ?? '');
235
+ }
236
+ },
237
+ };
238
+ // Sync workflow labels to all monitored repositories
239
+ const labelSyncService = new LabelSyncService(monitorLogger, createGitHubClient);
240
+ try {
241
+ const syncResult = await labelSyncService.syncAll(repositories);
242
+ logger.info({ successful: syncResult.successfulRepos, failed: syncResult.failedRepos, total: syncResult.totalRepos }, 'Label sync complete');
243
+ if (syncResult.failedRepos > 0) {
244
+ logger.warn(`Label sync: ${syncResult.failedRepos} repo(s) failed`);
245
+ }
246
+ }
247
+ catch (error) {
248
+ logger.warn({ error: String(error) }, 'Label sync failed (continuing with startup)');
249
+ }
250
+ const phaseTracker = new PhaseTrackerService(monitorLogger, phaseTrackerRedis);
251
+ const bridge = new LabelMonitorBridge(server, createGitHubClient, loggerAdapter);
252
+ // Resolve cluster identity for assignee-based issue filtering
253
+ const clusterGithubUsername = await resolveClusterIdentity(process.env['CLUSTER_GITHUB_USERNAME'], monitorLogger);
254
+ const monitor = new LabelMonitorService(monitorLogger, createGitHubClient, phaseTracker, bridge, { pollIntervalMs, maxConcurrentPolls: 5, adaptivePolling: !useSmee }, repositories, clusterGithubUsername);
255
+ // Create smee receiver if channel URL is configured
256
+ let smeeReceiver = null;
257
+ if (useSmee) {
258
+ const watchedRepos = new Set(repositories.map(r => `${r.owner}/${r.repo}`));
259
+ smeeReceiver = new SmeeWebhookReceiver(monitorLogger, monitor, {
260
+ channelUrl: smeeChannelUrl,
261
+ watchedRepos,
262
+ });
263
+ logger.info({ channelUrl: smeeChannelUrl, pollFallbackMs: pollIntervalMs }, 'Smee.io webhook receiver configured (polling reduced to fallback)');
264
+ // Auto-configure GitHub webhooks for all monitored repositories
265
+ logger.info('Configuring GitHub webhooks...');
266
+ try {
267
+ const webhookService = new WebhookSetupService(monitorLogger);
268
+ const summary = await webhookService.ensureWebhooks(smeeChannelUrl, repositories);
269
+ logger.info({
270
+ total: summary.total,
271
+ created: summary.created,
272
+ skipped: summary.skipped,
273
+ reactivated: summary.reactivated,
274
+ failed: summary.failed,
275
+ }, 'Webhook auto-configuration complete');
276
+ // Warn if any webhooks failed to set up
277
+ if (summary.failed > 0) {
278
+ const failedRepos = summary.results
279
+ .filter((r) => r.action === 'failed')
280
+ .map((r) => `${r.owner}/${r.repo}`);
281
+ logger.warn({ failedRepos }, 'Some webhooks failed to configure - these repos will use polling fallback');
282
+ }
283
+ }
284
+ catch (error) {
285
+ logger.warn({ error: String(error) }, 'Webhook auto-configuration failed (falling back to polling)');
286
+ }
287
+ }
288
+ logger.info({ repositories: repositories.length, pollIntervalMs, smee: useSmee }, 'Label monitor configured');
289
+ return { monitor, smeeReceiver };
290
+ }
291
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/cli/commands/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Run command implementation.
3
+ * Loads and executes a workflow from a file.
4
+ */
5
+ import { Command } from 'commander';
6
+ /**
7
+ * Create the run command
8
+ */
9
+ export declare function runCommand(): Command;
10
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuCpC;;GAEG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAoHpC"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Run command implementation.
3
+ * Loads and executes a workflow from a file.
4
+ */
5
+ import { Command } from 'commander';
6
+ import { resolve } from 'node:path';
7
+ import { loadWorkflow, prepareWorkflow, WorkflowExecutor, registerBuiltinActions, } from '@generacy-ai/workflow-engine';
8
+ import { getLogger, createWorkflowLogger } from '../utils/logger.js';
9
+ /**
10
+ * Parse input arguments in key=value format
11
+ */
12
+ function parseInputs(inputs) {
13
+ const result = {};
14
+ for (const input of inputs) {
15
+ const eqIndex = input.indexOf('=');
16
+ if (eqIndex === -1) {
17
+ throw new Error(`Invalid input format: ${input}. Expected key=value`);
18
+ }
19
+ const key = input.substring(0, eqIndex);
20
+ const value = input.substring(eqIndex + 1);
21
+ // Try to parse as JSON, otherwise use as string
22
+ try {
23
+ result[key] = JSON.parse(value);
24
+ }
25
+ catch {
26
+ result[key] = value;
27
+ }
28
+ }
29
+ return result;
30
+ }
31
+ /**
32
+ * Create the run command
33
+ */
34
+ export function runCommand() {
35
+ const command = new Command('run');
36
+ command
37
+ .description('Execute a workflow from a file')
38
+ .argument('<workflow>', 'Path to workflow YAML file')
39
+ .option('-i, --input <key=value...>', 'Input values for the workflow', [])
40
+ .option('-w, --workdir <path>', 'Working directory for execution', process.cwd())
41
+ .option('--dry-run', 'Validate workflow without executing')
42
+ .option('-v, --verbose', 'Enable verbose output')
43
+ .action(async (workflowPath, options) => {
44
+ const logger = getLogger();
45
+ const workflowLogger = createWorkflowLogger(logger);
46
+ try {
47
+ // Resolve workflow path
48
+ const resolvedPath = resolve(options.workdir, workflowPath);
49
+ logger.info({ path: resolvedPath }, 'Loading workflow');
50
+ // Load and validate workflow
51
+ const definition = await loadWorkflow(resolvedPath);
52
+ logger.info({ name: definition.name }, 'Workflow loaded');
53
+ // Parse inputs
54
+ const inputs = parseInputs(options.input || []);
55
+ if (Object.keys(inputs).length > 0) {
56
+ logger.info({ inputs: Object.keys(inputs) }, 'Parsed inputs');
57
+ }
58
+ // Prepare workflow for execution
59
+ const workflow = prepareWorkflow(definition, inputs);
60
+ // Register builtin actions
61
+ registerBuiltinActions();
62
+ // Create executor
63
+ const executor = new WorkflowExecutor({
64
+ logger: workflowLogger,
65
+ });
66
+ // Set up event listener for progress
67
+ const eventListener = (event) => {
68
+ if (options.verbose) {
69
+ logger.debug({ event }, 'Execution event');
70
+ }
71
+ switch (event.type) {
72
+ case 'execution:start':
73
+ logger.info({ workflow: event.workflowName }, 'Starting workflow');
74
+ break;
75
+ case 'phase:start':
76
+ logger.info({ phase: event.phaseName }, 'Starting phase');
77
+ break;
78
+ case 'step:start':
79
+ logger.info({ step: event.stepName }, 'Starting step');
80
+ break;
81
+ case 'step:complete':
82
+ logger.info({ step: event.stepName }, 'Step completed');
83
+ break;
84
+ case 'step:error':
85
+ logger.error({ step: event.stepName, error: event.message }, 'Step failed');
86
+ break;
87
+ case 'phase:complete':
88
+ logger.info({ phase: event.phaseName }, 'Phase completed');
89
+ break;
90
+ case 'execution:complete':
91
+ logger.info({ workflow: event.workflowName }, 'Workflow completed');
92
+ break;
93
+ case 'execution:error':
94
+ logger.error({ workflow: event.workflowName, error: event.message }, 'Workflow failed');
95
+ break;
96
+ }
97
+ };
98
+ const subscription = executor.addEventListener(eventListener);
99
+ let result;
100
+ if (options.dryRun) {
101
+ // Validate only
102
+ logger.info('Running in dry-run mode (validation only)');
103
+ result = await executor.validate(workflow, process.env);
104
+ }
105
+ else {
106
+ // Full execution
107
+ result = await executor.execute(workflow, {
108
+ mode: 'normal',
109
+ cwd: options.workdir,
110
+ env: process.env,
111
+ }, inputs);
112
+ }
113
+ // Clean up listener
114
+ subscription.dispose();
115
+ // Display results
116
+ displayResult(result, logger);
117
+ // Exit with appropriate code
118
+ if (result.status === 'failed' || result.status === 'cancelled') {
119
+ process.exit(1);
120
+ }
121
+ }
122
+ catch (error) {
123
+ logger.error({ error }, 'Failed to execute workflow');
124
+ if (error instanceof Error) {
125
+ console.error(`Error: ${error.message}`);
126
+ }
127
+ process.exit(1);
128
+ }
129
+ });
130
+ return command;
131
+ }
132
+ /**
133
+ * Display execution result summary
134
+ */
135
+ function displayResult(result, logger) {
136
+ const durationSec = result.duration !== undefined ? (result.duration / 1000).toFixed(2) : '?';
137
+ console.log('\n' + '='.repeat(60));
138
+ console.log('EXECUTION SUMMARY');
139
+ console.log('='.repeat(60));
140
+ console.log(`Status: ${result.status.toUpperCase()}`);
141
+ console.log(`Duration: ${durationSec}s`);
142
+ if (result.phaseResults.length > 0) {
143
+ console.log('\nPhases:');
144
+ for (const phase of result.phaseResults) {
145
+ const phaseIcon = phase.status === 'completed' ? '✓' : phase.status === 'failed' ? '✗' : '○';
146
+ console.log(` ${phaseIcon} ${phase.phaseName} (${phase.stepResults.length} steps)`);
147
+ for (const step of phase.stepResults) {
148
+ const stepIcon = step.status === 'completed' ? '✓' : step.status === 'failed' ? '✗' : '○';
149
+ const stepDuration = step.duration ? ` (${(step.duration / 1000).toFixed(2)}s)` : '';
150
+ console.log(` ${stepIcon} ${step.stepName}${stepDuration}`);
151
+ if (step.error) {
152
+ console.log(` Error: ${step.error}`);
153
+ }
154
+ }
155
+ }
156
+ }
157
+ // Check if any phase failed and show error
158
+ const failedPhase = result.phaseResults.find((p) => p.status === 'failed');
159
+ if (failedPhase) {
160
+ const failedStep = failedPhase.stepResults.find(s => s.status === 'failed');
161
+ if (failedStep?.error) {
162
+ console.log(`\nError: ${failedStep.error}`);
163
+ }
164
+ }
165
+ console.log('='.repeat(60) + '\n');
166
+ }
167
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Setup auth subcommand.
3
+ * Configures git credentials and GitHub CLI authentication.
4
+ * Replaces .devcontainer/ensure-auth.sh
5
+ */
6
+ import { Command } from 'commander';
7
+ /**
8
+ * Create the `setup auth` subcommand.
9
+ */
10
+ export declare function setupAuthCommand(): Command;
11
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/setup/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BpC;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAyG1C"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Setup auth subcommand.
3
+ * Configures git credentials and GitHub CLI authentication.
4
+ * Replaces .devcontainer/ensure-auth.sh
5
+ */
6
+ import { Command } from 'commander';
7
+ import { writeFileSync, mkdirSync } from 'node:fs';
8
+ import { homedir } from 'node:os';
9
+ import { join } from 'node:path';
10
+ import { getLogger } from '../../utils/logger.js';
11
+ import { exec, execSafe } from '../../utils/exec.js';
12
+ /**
13
+ * Resolve auth config with three-tier priority: defaults → env vars → CLI args.
14
+ */
15
+ function resolveAuthConfig(cliArgs) {
16
+ return {
17
+ email: cliArgs.email ?? process.env['GH_EMAIL'],
18
+ username: cliArgs.username ?? process.env['GH_USERNAME'],
19
+ token: cliArgs.token ?? process.env['GH_TOKEN'],
20
+ };
21
+ }
22
+ /**
23
+ * Create the `setup auth` subcommand.
24
+ */
25
+ export function setupAuthCommand() {
26
+ const command = new Command('auth');
27
+ command
28
+ .description('Configure git credentials and GitHub CLI authentication')
29
+ .option('--email <email>', 'Git user email (or GH_EMAIL env)')
30
+ .option('--username <name>', 'Git user name (or GH_USERNAME env)')
31
+ .action(async (options) => {
32
+ const logger = getLogger();
33
+ const config = resolveAuthConfig(options);
34
+ logger.info('Configuring CLI authentication');
35
+ // Step 1: Configure git identity
36
+ if (config.username && config.email) {
37
+ exec(`git config --global user.name "${config.username}"`);
38
+ exec(`git config --global user.email "${config.email}"`);
39
+ logger.info({ username: config.username, email: config.email }, 'Git user configured');
40
+ }
41
+ else {
42
+ if (config.username) {
43
+ exec(`git config --global user.name "${config.username}"`);
44
+ logger.info({ username: config.username }, 'Git user.name configured');
45
+ }
46
+ if (config.email) {
47
+ exec(`git config --global user.email "${config.email}"`);
48
+ logger.info({ email: config.email }, 'Git user.email configured');
49
+ }
50
+ if (!config.username) {
51
+ logger.warn('GH_USERNAME not set — git user.name not configured');
52
+ }
53
+ if (!config.email) {
54
+ logger.warn('GH_EMAIL not set — git user.email not configured');
55
+ }
56
+ }
57
+ // Step 2: Configure git credential helper
58
+ if (config.token) {
59
+ exec('git config --global credential.helper store');
60
+ const home = homedir();
61
+ mkdirSync(home, { recursive: true });
62
+ const credentialsPath = join(home, '.git-credentials');
63
+ const credentialUser = config.username ?? 'git';
64
+ writeFileSync(credentialsPath, `https://${credentialUser}:${config.token}@github.com\n`, { mode: 0o600 });
65
+ logger.info('Git credentials configured for github.com');
66
+ }
67
+ else {
68
+ logger.warn('GH_TOKEN not set — git push/pull to private repos will require manual authentication');
69
+ }
70
+ // Step 3: Configure gh CLI auth
71
+ if (config.token) {
72
+ const authCheck = execSafe('gh auth status');
73
+ if (authCheck.ok) {
74
+ logger.info('GitHub CLI authenticated via GH_TOKEN env var');
75
+ }
76
+ else {
77
+ // Pipe token to gh auth login
78
+ const loginResult = execSafe(`echo "${config.token}" | gh auth login --with-token`);
79
+ if (loginResult.ok) {
80
+ logger.info('GitHub CLI authenticated via GH_TOKEN');
81
+ }
82
+ else {
83
+ logger.error({ stderr: loginResult.stderr }, 'Failed to authenticate GitHub CLI');
84
+ }
85
+ }
86
+ }
87
+ else {
88
+ const authCheck = execSafe('gh auth status');
89
+ if (authCheck.ok) {
90
+ logger.info('GitHub CLI is authenticated');
91
+ }
92
+ else {
93
+ logger.warn('GitHub CLI is not authenticated — set GH_TOKEN in agent.env or run: gh auth login');
94
+ }
95
+ }
96
+ // Step 4: Verify authentication
97
+ const verification = execSafe('gh auth status');
98
+ if (verification.ok) {
99
+ logger.info({ stdout: verification.stdout }, 'Authentication verified');
100
+ }
101
+ else {
102
+ logger.error({ stderr: verification.stderr }, 'Authentication verification failed');
103
+ process.exit(1);
104
+ }
105
+ });
106
+ return command;
107
+ }
108
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../src/cli/commands/setup/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Setup build subcommand.
3
+ * Cleans stale Claude plugin state, builds Agency and Generacy packages.
4
+ * Replaces .devcontainer/setup-plugins.sh
5
+ */
6
+ import { Command } from 'commander';
7
+ /**
8
+ * Create the `setup build` subcommand.
9
+ */
10
+ export declare function setupBuildCommand(): Command;
11
+ //# sourceMappingURL=build.d.ts.map