@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,224 @@
1
+ /**
2
+ * Worker command implementation.
3
+ * Connects to orchestrator and processes jobs.
4
+ */
5
+ import { Command } from 'commander';
6
+ import { randomUUID } from 'node:crypto';
7
+ import { hostname } from 'node:os';
8
+ import { getLogger, createWorkflowLogger } from '../utils/logger.js';
9
+ import { createConfig } from '../utils/config.js';
10
+ import { OrchestratorClient, OrchestratorClientError, HeartbeatManager, JobHandler, } from '../../orchestrator/index.js';
11
+ import { HumancyApiDecisionHandler } from '@generacy-ai/workflow-engine';
12
+ import { createHealthServer } from '../../health/server.js';
13
+ /**
14
+ * Create the worker command
15
+ */
16
+ export function workerCommand() {
17
+ const command = new Command('worker');
18
+ command
19
+ .description('Start a worker that processes jobs from the orchestrator')
20
+ .option('-u, --url <url>', 'Orchestrator URL', process.env['ORCHESTRATOR_URL'])
21
+ .option('-i, --worker-id <id>', 'Worker ID (auto-generated if not provided)')
22
+ .option('-n, --worker-name <name>', 'Worker name', `worker-${hostname()}`)
23
+ .option('-c, --capabilities <caps...>', 'Worker capabilities/tags', [])
24
+ .option('-w, --workdir <path>', 'Working directory for job execution', process.cwd())
25
+ .option('-p, --health-port <port>', 'Health check port', '8080')
26
+ .option('--heartbeat-interval <ms>', 'Heartbeat interval in milliseconds', '30000')
27
+ .option('--poll-interval <ms>', 'Job poll interval in milliseconds', '5000')
28
+ .option('--max-concurrent <n>', 'Maximum concurrent jobs', '1')
29
+ .action(async (options) => {
30
+ const logger = getLogger();
31
+ // Validate required options
32
+ if (!options['url']) {
33
+ logger.error('Orchestrator URL is required. Set ORCHESTRATOR_URL env var or use --url option');
34
+ process.exit(1);
35
+ }
36
+ // Create configuration
37
+ const config = createConfig({
38
+ orchestratorUrl: options['url'],
39
+ workerId: options['workerId'],
40
+ workdir: options['workdir'],
41
+ healthPort: parseInt(options['healthPort'], 10),
42
+ heartbeatInterval: parseInt(options['heartbeatInterval'], 10),
43
+ pollInterval: parseInt(options['pollInterval'], 10),
44
+ });
45
+ const workerId = config.workerId ?? randomUUID();
46
+ const workerName = options['workerName'] ?? `worker-${hostname()}`;
47
+ const capabilities = options['capabilities'] ?? [];
48
+ logger.info({ workerId, workerName, capabilities }, 'Starting worker');
49
+ // Create orchestrator client
50
+ const client = new OrchestratorClient({
51
+ baseUrl: config.orchestratorUrl,
52
+ });
53
+ // Register worker
54
+ const registration = {
55
+ id: workerId,
56
+ name: workerName,
57
+ capabilities,
58
+ maxConcurrent: parseInt(options['maxConcurrent'], 10),
59
+ healthEndpoint: `http://localhost:${config.healthPort}/health`,
60
+ };
61
+ try {
62
+ await client.register(registration);
63
+ logger.info({ workerId }, 'Worker registered with orchestrator');
64
+ }
65
+ catch (error) {
66
+ const msg = error instanceof Error ? error.message : String(error);
67
+ logger.error({ error: msg }, 'Failed to register worker');
68
+ process.exit(1);
69
+ }
70
+ // Re-registration helper for when the orchestrator drops us
71
+ let isReregistering = false;
72
+ const reregister = async () => {
73
+ if (isReregistering)
74
+ return;
75
+ isReregistering = true;
76
+ try {
77
+ logger.info({ workerId }, 'Worker not found in orchestrator, re-registering...');
78
+ await client.register(registration);
79
+ logger.info({ workerId }, 'Worker re-registered with orchestrator');
80
+ }
81
+ catch (regError) {
82
+ const msg = regError instanceof Error ? regError.message : String(regError);
83
+ logger.error({ error: msg }, 'Re-registration failed');
84
+ }
85
+ finally {
86
+ isReregistering = false;
87
+ }
88
+ };
89
+ // Helper to detect WORKER_NOT_FOUND errors
90
+ const isWorkerNotFound = (error) => error instanceof OrchestratorClientError && error.code === 'WORKER_NOT_FOUND';
91
+ // Create heartbeat manager
92
+ const heartbeatManager = new HeartbeatManager({
93
+ client,
94
+ workerId,
95
+ interval: config.heartbeatInterval,
96
+ onCommand: (cmd) => {
97
+ logger.info({ command: cmd }, 'Received command from orchestrator');
98
+ if (cmd.type === 'shutdown') {
99
+ logger.info('Shutdown requested by orchestrator');
100
+ shutdown();
101
+ }
102
+ else if (cmd.type === 'cancel') {
103
+ logger.info('Cancel requested by orchestrator');
104
+ jobHandler.cancelCurrentJob();
105
+ }
106
+ },
107
+ onError: (error) => {
108
+ logger.warn({ error: error.message }, 'Heartbeat failed');
109
+ if (isWorkerNotFound(error)) {
110
+ reregister();
111
+ }
112
+ },
113
+ });
114
+ // Create Humancy API decision handler if configured
115
+ const humancyApiUrl = process.env['HUMANCY_API_URL'];
116
+ let humanDecisionHandler;
117
+ if (humancyApiUrl) {
118
+ const humancyAgentId = process.env['HUMANCY_AGENT_ID'] ?? workerId;
119
+ const humancyAuthToken = process.env['HUMANCY_AUTH_TOKEN'] ?? process.env['ORCHESTRATOR_TOKEN'];
120
+ const handlerLogger = {
121
+ info: (msg) => logger.info(msg),
122
+ warn: (msg) => logger.warn(msg),
123
+ error: (msg) => logger.error(msg),
124
+ debug: (msg) => logger.debug(msg),
125
+ };
126
+ humanDecisionHandler = new HumancyApiDecisionHandler({
127
+ apiUrl: humancyApiUrl,
128
+ agentId: humancyAgentId,
129
+ authToken: humancyAuthToken,
130
+ fallbackToSimulation: true,
131
+ }, handlerLogger);
132
+ logger.info({ humancyApiUrl, humancyAgentId }, 'Humancy API decision handler configured');
133
+ }
134
+ // Create job handler
135
+ const workflowLogger = createWorkflowLogger(logger);
136
+ const jobHandler = new JobHandler({
137
+ client,
138
+ workerId,
139
+ pollInterval: config.pollInterval,
140
+ logger: workflowLogger,
141
+ workdir: config.workdir,
142
+ capabilities,
143
+ humanDecisionHandler,
144
+ onJobStart: (job) => {
145
+ logger.info({ jobId: job.id, jobName: job.name }, 'Job started');
146
+ heartbeatManager.setStatus('busy');
147
+ heartbeatManager.setCurrentJob(job.id);
148
+ },
149
+ onJobComplete: (job, result) => {
150
+ logger.info({ jobId: job.id, status: result.status }, 'Job completed');
151
+ heartbeatManager.setStatus('idle');
152
+ heartbeatManager.setCurrentJob(undefined);
153
+ },
154
+ onError: (error, job) => {
155
+ logger.error({ error: error.message, jobId: job?.id }, 'Job error');
156
+ if (isWorkerNotFound(error)) {
157
+ reregister();
158
+ }
159
+ },
160
+ });
161
+ // Create health server
162
+ const healthServer = createHealthServer({
163
+ port: config.healthPort,
164
+ getStatus: () => ({
165
+ status: jobHandler.isBusy() ? 'busy' : 'healthy',
166
+ uptime: heartbeatManager.getUptime(),
167
+ lastHeartbeat: heartbeatManager.getLastHeartbeat()?.toISOString(),
168
+ currentJob: jobHandler.getCurrentJob()?.id,
169
+ }),
170
+ });
171
+ // Graceful shutdown handler
172
+ let isShuttingDown = false;
173
+ const shutdown = async () => {
174
+ if (isShuttingDown) {
175
+ return;
176
+ }
177
+ isShuttingDown = true;
178
+ logger.info('Shutting down worker...');
179
+ heartbeatManager.setStatus('stopping');
180
+ // Stop accepting new jobs
181
+ jobHandler.stop();
182
+ // Wait for current job to finish (with timeout)
183
+ const shutdownTimeout = 60000; // 1 minute
184
+ const startTime = Date.now();
185
+ while (jobHandler.isBusy() && Date.now() - startTime < shutdownTimeout) {
186
+ await new Promise(resolve => setTimeout(resolve, 1000));
187
+ }
188
+ // Force cancel if still running
189
+ if (jobHandler.isBusy()) {
190
+ logger.warn('Shutdown timeout reached, cancelling current job');
191
+ jobHandler.cancelCurrentJob();
192
+ await new Promise(resolve => setTimeout(resolve, 5000));
193
+ }
194
+ // Stop heartbeat
195
+ heartbeatManager.stop();
196
+ // Unregister from orchestrator
197
+ try {
198
+ await client.unregister(workerId);
199
+ logger.info('Worker unregistered from orchestrator');
200
+ }
201
+ catch (error) {
202
+ logger.warn({ error }, 'Failed to unregister worker');
203
+ }
204
+ // Close health server
205
+ healthServer.close();
206
+ logger.info('Worker shutdown complete');
207
+ process.exit(0);
208
+ };
209
+ // Handle signals
210
+ process.on('SIGTERM', shutdown);
211
+ process.on('SIGINT', shutdown);
212
+ // Start services
213
+ heartbeatManager.start();
214
+ jobHandler.start();
215
+ healthServer.listen();
216
+ logger.info({
217
+ workerId,
218
+ orchestratorUrl: config.orchestratorUrl,
219
+ healthPort: config.healthPort,
220
+ }, 'Worker started and ready to process jobs');
221
+ });
222
+ return command;
223
+ }
224
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/cli/commands/worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * CLI entry point.
3
+ * Sets up Commander.js program and registers subcommands.
4
+ */
5
+ import { Command } from 'commander';
6
+ /**
7
+ * Create and configure the CLI program
8
+ */
9
+ export declare function createProgram(): Command;
10
+ /**
11
+ * Run the CLI with given arguments
12
+ */
13
+ export declare function run(args?: string[]): Promise<void>;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CA6BvC;AAED;;GAEG;AACH,wBAAsB,GAAG,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBtE"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * CLI entry point.
3
+ * Sets up Commander.js program and registers subcommands.
4
+ */
5
+ import { Command } from 'commander';
6
+ import { runCommand } from './commands/run.js';
7
+ import { workerCommand } from './commands/worker.js';
8
+ import { agentCommand } from './commands/agent.js';
9
+ import { orchestratorCommand } from './commands/orchestrator.js';
10
+ import { setupCommand } from './commands/setup.js';
11
+ import { validateCommand } from './commands/validate.js';
12
+ import { doctorCommand } from './commands/doctor.js';
13
+ import { initCommand } from './commands/init/index.js';
14
+ import { createLogger, setLogger } from './utils/logger.js';
15
+ // Package version - will be replaced at build time
16
+ const VERSION = '0.0.1';
17
+ /**
18
+ * Create and configure the CLI program
19
+ */
20
+ export function createProgram() {
21
+ const program = new Command();
22
+ program
23
+ .name('generacy')
24
+ .description('Generacy CLI - Headless workflow execution engine')
25
+ .version(VERSION)
26
+ .option('-l, --log-level <level>', 'Log level (trace, debug, info, warn, error, fatal, silent)', 'info')
27
+ .option('--no-pretty', 'Disable pretty logging (use JSON)')
28
+ .hook('preAction', (thisCommand) => {
29
+ const opts = thisCommand.opts();
30
+ const logger = createLogger({
31
+ level: opts['logLevel'],
32
+ pretty: opts['pretty'] !== false,
33
+ });
34
+ setLogger(logger);
35
+ });
36
+ // Register subcommands
37
+ program.addCommand(runCommand());
38
+ program.addCommand(workerCommand());
39
+ program.addCommand(agentCommand());
40
+ program.addCommand(orchestratorCommand());
41
+ program.addCommand(setupCommand());
42
+ program.addCommand(validateCommand());
43
+ program.addCommand(doctorCommand());
44
+ program.addCommand(initCommand());
45
+ return program;
46
+ }
47
+ /**
48
+ * Run the CLI with given arguments
49
+ */
50
+ export async function run(args = process.argv) {
51
+ const program = createProgram();
52
+ try {
53
+ await program.parseAsync(args);
54
+ }
55
+ catch (error) {
56
+ if (error instanceof Error) {
57
+ console.error(`Error: ${error.message}`);
58
+ if (process.env['DEBUG']) {
59
+ console.error(error.stack);
60
+ }
61
+ }
62
+ else {
63
+ console.error('An unknown error occurred');
64
+ }
65
+ process.exit(1);
66
+ }
67
+ }
68
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG5D,mDAAmD;AACnD,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,UAAU,CAAC;SAChB,WAAW,CAAC,mDAAmD,CAAC;SAChE,OAAO,CAAC,OAAO,CAAC;SAChB,MAAM,CAAC,yBAAyB,EAAE,4DAA4D,EAAE,MAAM,CAAC;SACvG,MAAM,CAAC,aAAa,EAAE,mCAAmC,CAAC;SAC1D,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE;QACjC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,YAAY,CAAC;YAC1B,KAAK,EAAE,IAAI,CAAC,UAAU,CAAa;YACnC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK;SACjC,CAAC,CAAC;QACH,SAAS,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEL,uBAAuB;IACvB,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;IACjC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAElC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,OAAiB,OAAO,CAAC,IAAI;IACrD,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACzC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * CLI configuration resolution.
3
+ * Merges defaults, environment variables, and CLI arguments.
4
+ */
5
+ import type { LogLevel } from './logger.js';
6
+ /**
7
+ * CLI configuration interface
8
+ */
9
+ export interface CLIConfig {
10
+ /** Log level */
11
+ logLevel: LogLevel;
12
+ /** Enable pretty logging (colors, formatting) */
13
+ prettyLog: boolean;
14
+ /** Default workflow file path */
15
+ workflowFile?: string;
16
+ /** Working directory for workflow execution */
17
+ workdir: string;
18
+ /** Orchestrator URL for worker mode */
19
+ orchestratorUrl?: string;
20
+ /** Worker ID for registration */
21
+ workerId?: string;
22
+ /** Health check port */
23
+ healthPort: number;
24
+ /** Heartbeat interval in milliseconds */
25
+ heartbeatInterval: number;
26
+ /** Job poll interval in milliseconds */
27
+ pollInterval: number;
28
+ /** Agency mode: 'subprocess' | 'network' */
29
+ agencyMode: 'subprocess' | 'network';
30
+ /** Agency URL for network mode */
31
+ agencyUrl?: string;
32
+ /** Agency command for subprocess mode */
33
+ agencyCommand?: string;
34
+ }
35
+ /**
36
+ * Resolve final configuration by merging sources
37
+ * Priority: CLI args > env vars > defaults
38
+ */
39
+ export declare function resolveConfig(cliArgs?: Partial<CLIConfig>): CLIConfig;
40
+ /**
41
+ * Validate configuration
42
+ * @throws Error if configuration is invalid
43
+ */
44
+ export declare function validateConfig(config: CLIConfig): void;
45
+ /**
46
+ * Create and validate configuration
47
+ */
48
+ export declare function createConfig(cliArgs?: Partial<CLIConfig>): CLIConfig;
49
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,gBAAgB;IAChB,QAAQ,EAAE,QAAQ,CAAC;IAEnB,iDAAiD;IACjD,SAAS,EAAE,OAAO,CAAC;IAEnB,iCAAiC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAEhB,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;IAEnB,yCAAyC;IACzC,iBAAiB,EAAE,MAAM,CAAC;IAE1B,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC;IAErB,4CAA4C;IAC5C,UAAU,EAAE,YAAY,GAAG,SAAS,CAAC;IAErC,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,yCAAyC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAoFD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,OAAO,CAAC,SAAS,CAAM,GAAG,SAAS,CAQzE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqBtD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,OAAO,CAAC,SAAS,CAAM,GAAG,SAAS,CAIxE"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Default configuration values
3
+ */
4
+ const defaults = {
5
+ logLevel: 'info',
6
+ prettyLog: process.env['NODE_ENV'] !== 'production',
7
+ workdir: process.cwd(),
8
+ healthPort: 8080,
9
+ heartbeatInterval: 30000, // 30 seconds
10
+ pollInterval: 5000, // 5 seconds
11
+ agencyMode: 'subprocess',
12
+ };
13
+ /**
14
+ * Read configuration from environment variables
15
+ */
16
+ function readEnvConfig() {
17
+ const config = {};
18
+ if (process.env['LOG_LEVEL']) {
19
+ config.logLevel = process.env['LOG_LEVEL'];
20
+ }
21
+ if (process.env['GENERACY_PRETTY_LOG']) {
22
+ config.prettyLog = process.env['GENERACY_PRETTY_LOG'] === 'true';
23
+ }
24
+ if (process.env['GENERACY_WORKFLOW_FILE']) {
25
+ config.workflowFile = process.env['GENERACY_WORKFLOW_FILE'];
26
+ }
27
+ if (process.env['GENERACY_WORKDIR']) {
28
+ config.workdir = process.env['GENERACY_WORKDIR'];
29
+ }
30
+ if (process.env['ORCHESTRATOR_URL']) {
31
+ config.orchestratorUrl = process.env['ORCHESTRATOR_URL'];
32
+ }
33
+ if (process.env['WORKER_ID']) {
34
+ config.workerId = process.env['WORKER_ID'];
35
+ }
36
+ if (process.env['HEALTH_PORT']) {
37
+ const port = parseInt(process.env['HEALTH_PORT'], 10);
38
+ if (!isNaN(port)) {
39
+ config.healthPort = port;
40
+ }
41
+ }
42
+ if (process.env['HEARTBEAT_INTERVAL']) {
43
+ const interval = parseInt(process.env['HEARTBEAT_INTERVAL'], 10);
44
+ if (!isNaN(interval)) {
45
+ config.heartbeatInterval = interval;
46
+ }
47
+ }
48
+ if (process.env['POLL_INTERVAL']) {
49
+ const interval = parseInt(process.env['POLL_INTERVAL'], 10);
50
+ if (!isNaN(interval)) {
51
+ config.pollInterval = interval;
52
+ }
53
+ }
54
+ if (process.env['AGENCY_MODE']) {
55
+ const mode = process.env['AGENCY_MODE'];
56
+ if (mode === 'subprocess' || mode === 'network') {
57
+ config.agencyMode = mode;
58
+ }
59
+ }
60
+ if (process.env['AGENCY_URL']) {
61
+ config.agencyUrl = process.env['AGENCY_URL'];
62
+ }
63
+ if (process.env['AGENCY_COMMAND']) {
64
+ config.agencyCommand = process.env['AGENCY_COMMAND'];
65
+ }
66
+ return config;
67
+ }
68
+ /**
69
+ * Resolve final configuration by merging sources
70
+ * Priority: CLI args > env vars > defaults
71
+ */
72
+ export function resolveConfig(cliArgs = {}) {
73
+ const envConfig = readEnvConfig();
74
+ return {
75
+ ...defaults,
76
+ ...envConfig,
77
+ ...cliArgs,
78
+ };
79
+ }
80
+ /**
81
+ * Validate configuration
82
+ * @throws Error if configuration is invalid
83
+ */
84
+ export function validateConfig(config) {
85
+ const validLogLevels = ['trace', 'debug', 'info', 'warn', 'error', 'fatal', 'silent'];
86
+ if (!validLogLevels.includes(config.logLevel)) {
87
+ throw new Error(`Invalid log level: ${config.logLevel}. Valid levels: ${validLogLevels.join(', ')}`);
88
+ }
89
+ if (config.healthPort < 0 || config.healthPort > 65535) {
90
+ throw new Error(`Invalid health port: ${config.healthPort}. Must be between 0 and 65535`);
91
+ }
92
+ if (config.heartbeatInterval < 1000) {
93
+ throw new Error(`Heartbeat interval too short: ${config.heartbeatInterval}ms. Minimum is 1000ms`);
94
+ }
95
+ if (config.pollInterval < 1000) {
96
+ throw new Error(`Poll interval too short: ${config.pollInterval}ms. Minimum is 1000ms`);
97
+ }
98
+ if (config.agencyMode === 'network' && !config.agencyUrl) {
99
+ throw new Error('Agency URL is required when agency mode is "network"');
100
+ }
101
+ }
102
+ /**
103
+ * Create and validate configuration
104
+ */
105
+ export function createConfig(cliArgs = {}) {
106
+ const config = resolveConfig(cliArgs);
107
+ validateConfig(config);
108
+ return config;
109
+ }
110
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/utils/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Shell execution utilities for CLI commands.
3
+ * Wraps child_process.execSync and spawn with structured logging.
4
+ */
5
+ import { type ChildProcess, type SpawnOptions } from 'node:child_process';
6
+ /**
7
+ * Options for synchronous command execution.
8
+ */
9
+ export interface ExecOptions {
10
+ /** Working directory for the command */
11
+ cwd?: string;
12
+ /** Environment variables merged with process.env */
13
+ env?: Record<string, string | undefined>;
14
+ /** Execution timeout in milliseconds */
15
+ timeout?: number;
16
+ /** stdout/stderr handling: 'pipe' captures output, 'inherit' streams to parent */
17
+ stdio?: 'pipe' | 'inherit';
18
+ }
19
+ /**
20
+ * Result of a safe (non-throwing) command execution.
21
+ */
22
+ export interface ExecResult {
23
+ ok: boolean;
24
+ stdout: string;
25
+ stderr: string;
26
+ }
27
+ /**
28
+ * Run a command synchronously, return stdout. Throws on non-zero exit.
29
+ */
30
+ export declare function exec(cmd: string, options?: ExecOptions): string;
31
+ /**
32
+ * Run a command synchronously, return success boolean. Does not throw.
33
+ */
34
+ export declare function execSafe(cmd: string, options?: ExecOptions): ExecResult;
35
+ /**
36
+ * Spawn a long-running background process. Returns ChildProcess.
37
+ */
38
+ export declare function spawnBackground(cmd: string, args: string[], options?: SpawnOptions): ChildProcess;
39
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/exec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAmB,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG3F;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,CAe/D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,UAAU,CAsBvE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,YAAY,GACrB,YAAY,CAUd"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Shell execution utilities for CLI commands.
3
+ * Wraps child_process.execSync and spawn with structured logging.
4
+ */
5
+ import { execSync, spawn } from 'node:child_process';
6
+ import { getLogger } from './logger.js';
7
+ /**
8
+ * Run a command synchronously, return stdout. Throws on non-zero exit.
9
+ */
10
+ export function exec(cmd, options) {
11
+ const logger = getLogger();
12
+ logger.debug({ cmd, cwd: options?.cwd }, 'exec');
13
+ try {
14
+ return execSync(cmd, {
15
+ encoding: 'utf-8',
16
+ cwd: options?.cwd,
17
+ env: options?.env ? { ...process.env, ...options.env } : undefined,
18
+ timeout: options?.timeout,
19
+ stdio: options?.stdio === 'inherit' ? 'inherit' : 'pipe',
20
+ }).trim();
21
+ }
22
+ catch (error) {
23
+ logger.error({ cmd, error: String(error) }, 'Command failed');
24
+ throw error;
25
+ }
26
+ }
27
+ /**
28
+ * Run a command synchronously, return success boolean. Does not throw.
29
+ */
30
+ export function execSafe(cmd, options) {
31
+ const logger = getLogger();
32
+ logger.debug({ cmd, cwd: options?.cwd }, 'execSafe');
33
+ try {
34
+ const stdout = execSync(cmd, {
35
+ encoding: 'utf-8',
36
+ cwd: options?.cwd,
37
+ env: options?.env ? { ...process.env, ...options.env } : undefined,
38
+ timeout: options?.timeout,
39
+ stdio: ['pipe', 'pipe', 'pipe'],
40
+ }).trim();
41
+ return { ok: true, stdout, stderr: '' };
42
+ }
43
+ catch (error) {
44
+ const execError = error;
45
+ const stdout = typeof execError.stdout === 'string'
46
+ ? execError.stdout.trim()
47
+ : (execError.stdout?.toString() ?? '').trim();
48
+ const stderr = typeof execError.stderr === 'string'
49
+ ? execError.stderr.trim()
50
+ : (execError.stderr?.toString() ?? '').trim();
51
+ return { ok: false, stdout, stderr };
52
+ }
53
+ }
54
+ /**
55
+ * Spawn a long-running background process. Returns ChildProcess.
56
+ */
57
+ export function spawnBackground(cmd, args, options) {
58
+ const logger = getLogger();
59
+ logger.debug({ cmd, args, cwd: options?.cwd }, 'spawnBackground');
60
+ const child = spawn(cmd, args, {
61
+ detached: true,
62
+ stdio: 'ignore',
63
+ ...options,
64
+ });
65
+ child.unref();
66
+ return child;
67
+ }
68
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../../src/cli/utils/exec.ts"],"names":[],"mappings":"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"}