@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.
- package/LICENSE +191 -0
- package/README.md +207 -0
- package/bin/generacy.js +11 -0
- package/dist/agency/index.d.ts +68 -0
- package/dist/agency/index.d.ts.map +1 -0
- package/dist/agency/index.js +28 -0
- package/dist/agency/index.js.map +1 -0
- package/dist/agency/network.d.ts +41 -0
- package/dist/agency/network.d.ts.map +1 -0
- package/dist/agency/network.js +133 -0
- package/dist/agency/network.js.map +1 -0
- package/dist/agency/subprocess.d.ts +58 -0
- package/dist/agency/subprocess.d.ts.map +1 -0
- package/dist/agency/subprocess.js +216 -0
- package/dist/agency/subprocess.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +10 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +216 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/doctor/checks/agency-mcp.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/agency-mcp.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/agency-mcp.js +51 -0
- package/dist/cli/commands/doctor/checks/agency-mcp.js.map +1 -0
- package/dist/cli/commands/doctor/checks/anthropic-key.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/anthropic-key.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/anthropic-key.js +68 -0
- package/dist/cli/commands/doctor/checks/anthropic-key.js.map +1 -0
- package/dist/cli/commands/doctor/checks/config.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/config.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/config.js +81 -0
- package/dist/cli/commands/doctor/checks/config.js.map +1 -0
- package/dist/cli/commands/doctor/checks/devcontainer.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/devcontainer.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/devcontainer.js +58 -0
- package/dist/cli/commands/doctor/checks/devcontainer.js.map +1 -0
- package/dist/cli/commands/doctor/checks/docker.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/docker.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/docker.js +71 -0
- package/dist/cli/commands/doctor/checks/docker.js.map +1 -0
- package/dist/cli/commands/doctor/checks/env-file.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/env-file.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/env-file.js +56 -0
- package/dist/cli/commands/doctor/checks/env-file.js.map +1 -0
- package/dist/cli/commands/doctor/checks/github-token.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/github-token.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/github-token.js +99 -0
- package/dist/cli/commands/doctor/checks/github-token.js.map +1 -0
- package/dist/cli/commands/doctor/checks/npm-packages.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/npm-packages.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/npm-packages.js +117 -0
- package/dist/cli/commands/doctor/checks/npm-packages.js.map +1 -0
- package/dist/cli/commands/doctor/formatter.d.ts +27 -0
- package/dist/cli/commands/doctor/formatter.d.ts.map +1 -0
- package/dist/cli/commands/doctor/formatter.js +162 -0
- package/dist/cli/commands/doctor/formatter.js.map +1 -0
- package/dist/cli/commands/doctor/index.d.ts +5 -0
- package/dist/cli/commands/doctor/index.d.ts.map +1 -0
- package/dist/cli/commands/doctor/index.js +8 -0
- package/dist/cli/commands/doctor/index.js.map +1 -0
- package/dist/cli/commands/doctor/registry.d.ts +48 -0
- package/dist/cli/commands/doctor/registry.d.ts.map +1 -0
- package/dist/cli/commands/doctor/registry.js +166 -0
- package/dist/cli/commands/doctor/registry.js.map +1 -0
- package/dist/cli/commands/doctor/runner.d.ts +14 -0
- package/dist/cli/commands/doctor/runner.d.ts.map +1 -0
- package/dist/cli/commands/doctor/runner.js +257 -0
- package/dist/cli/commands/doctor/runner.js.map +1 -0
- package/dist/cli/commands/doctor/types.d.ts +87 -0
- package/dist/cli/commands/doctor/types.d.ts.map +1 -0
- package/dist/cli/commands/doctor/types.js +2 -0
- package/dist/cli/commands/doctor/types.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +12 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +97 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init/conflicts.d.ts +36 -0
- package/dist/cli/commands/init/conflicts.d.ts.map +1 -0
- package/dist/cli/commands/init/conflicts.js +165 -0
- package/dist/cli/commands/init/conflicts.js.map +1 -0
- package/dist/cli/commands/init/github.d.ts +32 -0
- package/dist/cli/commands/init/github.d.ts.map +1 -0
- package/dist/cli/commands/init/github.js +161 -0
- package/dist/cli/commands/init/github.js.map +1 -0
- package/dist/cli/commands/init/index.d.ts +21 -0
- package/dist/cli/commands/init/index.d.ts.map +1 -0
- package/dist/cli/commands/init/index.js +175 -0
- package/dist/cli/commands/init/index.js.map +1 -0
- package/dist/cli/commands/init/prompts.d.ts +15 -0
- package/dist/cli/commands/init/prompts.d.ts.map +1 -0
- package/dist/cli/commands/init/prompts.js +281 -0
- package/dist/cli/commands/init/prompts.js.map +1 -0
- package/dist/cli/commands/init/repo-utils.d.ts +32 -0
- package/dist/cli/commands/init/repo-utils.d.ts.map +1 -0
- package/dist/cli/commands/init/repo-utils.js +112 -0
- package/dist/cli/commands/init/repo-utils.js.map +1 -0
- package/dist/cli/commands/init/resolver.d.ts +20 -0
- package/dist/cli/commands/init/resolver.d.ts.map +1 -0
- package/dist/cli/commands/init/resolver.js +273 -0
- package/dist/cli/commands/init/resolver.js.map +1 -0
- package/dist/cli/commands/init/summary.d.ts +21 -0
- package/dist/cli/commands/init/summary.d.ts.map +1 -0
- package/dist/cli/commands/init/summary.js +100 -0
- package/dist/cli/commands/init/summary.js.map +1 -0
- package/dist/cli/commands/init/types.d.ts +53 -0
- package/dist/cli/commands/init/types.d.ts.map +1 -0
- package/dist/cli/commands/init/types.js +2 -0
- package/dist/cli/commands/init/types.js.map +1 -0
- package/dist/cli/commands/init/writer.d.ts +22 -0
- package/dist/cli/commands/init/writer.d.ts.map +1 -0
- package/dist/cli/commands/init/writer.js +96 -0
- package/dist/cli/commands/init/writer.js.map +1 -0
- package/dist/cli/commands/orchestrator.d.ts +11 -0
- package/dist/cli/commands/orchestrator.d.ts.map +1 -0
- package/dist/cli/commands/orchestrator.js +291 -0
- package/dist/cli/commands/orchestrator.js.map +1 -0
- package/dist/cli/commands/run.d.ts +10 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +167 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/setup/auth.d.ts +11 -0
- package/dist/cli/commands/setup/auth.d.ts.map +1 -0
- package/dist/cli/commands/setup/auth.js +108 -0
- package/dist/cli/commands/setup/auth.js.map +1 -0
- package/dist/cli/commands/setup/build.d.ts +11 -0
- package/dist/cli/commands/setup/build.d.ts.map +1 -0
- package/dist/cli/commands/setup/build.js +212 -0
- package/dist/cli/commands/setup/build.js.map +1 -0
- package/dist/cli/commands/setup/services.d.ts +11 -0
- package/dist/cli/commands/setup/services.d.ts.map +1 -0
- package/dist/cli/commands/setup/services.js +294 -0
- package/dist/cli/commands/setup/services.js.map +1 -0
- package/dist/cli/commands/setup/workspace.d.ts +11 -0
- package/dist/cli/commands/setup/workspace.d.ts.map +1 -0
- package/dist/cli/commands/setup/workspace.js +215 -0
- package/dist/cli/commands/setup/workspace.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +7 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +19 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +10 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +164 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/commands/worker.d.ts +10 -0
- package/dist/cli/commands/worker.d.ts.map +1 -0
- package/dist/cli/commands/worker.js +224 -0
- package/dist/cli/commands/worker.js.map +1 -0
- package/dist/cli/index.d.ts +14 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +68 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/config.d.ts +49 -0
- package/dist/cli/utils/config.d.ts.map +1 -0
- package/dist/cli/utils/config.js +110 -0
- package/dist/cli/utils/config.js.map +1 -0
- package/dist/cli/utils/exec.d.ts +39 -0
- package/dist/cli/utils/exec.d.ts.map +1 -0
- package/dist/cli/utils/exec.js +68 -0
- package/dist/cli/utils/exec.js.map +1 -0
- package/dist/cli/utils/logger.d.ts +47 -0
- package/dist/cli/utils/logger.d.ts.map +1 -0
- package/dist/cli/utils/logger.js +97 -0
- package/dist/cli/utils/logger.js.map +1 -0
- package/dist/config/index.d.ts +10 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +13 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +104 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +266 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +304 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +160 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/validator.d.ts +60 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +112 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/health/server.d.ts +47 -0
- package/dist/health/server.d.ts.map +1 -0
- package/dist/health/server.js +92 -0
- package/dist/health/server.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/async-event-queue.d.ts +28 -0
- package/dist/orchestrator/async-event-queue.d.ts.map +1 -0
- package/dist/orchestrator/async-event-queue.js +57 -0
- package/dist/orchestrator/async-event-queue.js.map +1 -0
- package/dist/orchestrator/client.d.ts +110 -0
- package/dist/orchestrator/client.d.ts.map +1 -0
- package/dist/orchestrator/client.js +288 -0
- package/dist/orchestrator/client.js.map +1 -0
- package/dist/orchestrator/event-bus.d.ts +195 -0
- package/dist/orchestrator/event-bus.d.ts.map +1 -0
- package/dist/orchestrator/event-bus.js +557 -0
- package/dist/orchestrator/event-bus.js.map +1 -0
- package/dist/orchestrator/heartbeat.d.ts +71 -0
- package/dist/orchestrator/heartbeat.d.ts.map +1 -0
- package/dist/orchestrator/heartbeat.js +116 -0
- package/dist/orchestrator/heartbeat.js.map +1 -0
- package/dist/orchestrator/index.d.ts +25 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +15 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/job-handler.d.ts +109 -0
- package/dist/orchestrator/job-handler.d.ts.map +1 -0
- package/dist/orchestrator/job-handler.js +612 -0
- package/dist/orchestrator/job-handler.js.map +1 -0
- package/dist/orchestrator/job-queue.d.ts +81 -0
- package/dist/orchestrator/job-queue.d.ts.map +1 -0
- package/dist/orchestrator/job-queue.js +206 -0
- package/dist/orchestrator/job-queue.js.map +1 -0
- package/dist/orchestrator/label-monitor-bridge.d.ts +25 -0
- package/dist/orchestrator/label-monitor-bridge.d.ts.map +1 -0
- package/dist/orchestrator/label-monitor-bridge.js +57 -0
- package/dist/orchestrator/label-monitor-bridge.js.map +1 -0
- package/dist/orchestrator/log-buffer.d.ts +74 -0
- package/dist/orchestrator/log-buffer.d.ts.map +1 -0
- package/dist/orchestrator/log-buffer.js +104 -0
- package/dist/orchestrator/log-buffer.js.map +1 -0
- package/dist/orchestrator/redis-job-queue.d.ts +44 -0
- package/dist/orchestrator/redis-job-queue.d.ts.map +1 -0
- package/dist/orchestrator/redis-job-queue.js +300 -0
- package/dist/orchestrator/redis-job-queue.js.map +1 -0
- package/dist/orchestrator/router.d.ts +125 -0
- package/dist/orchestrator/router.d.ts.map +1 -0
- package/dist/orchestrator/router.js +143 -0
- package/dist/orchestrator/router.js.map +1 -0
- package/dist/orchestrator/server.d.ts +62 -0
- package/dist/orchestrator/server.d.ts.map +1 -0
- package/dist/orchestrator/server.js +711 -0
- package/dist/orchestrator/server.js.map +1 -0
- package/dist/orchestrator/types.d.ts +184 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/orchestrator/types.js +6 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/dist/orchestrator/worker-registry.d.ts +110 -0
- package/dist/orchestrator/worker-registry.d.ts.map +1 -0
- package/dist/orchestrator/worker-registry.js +191 -0
- package/dist/orchestrator/worker-registry.js.map +1 -0
- 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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"}
|