herdctl 0.0.1 → 0.0.2
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/bin/herdctl.js +9 -0
- package/dist/commands/__tests__/config.test.d.ts +2 -0
- package/dist/commands/__tests__/config.test.d.ts.map +1 -0
- package/dist/commands/__tests__/config.test.js +299 -0
- package/dist/commands/__tests__/config.test.js.map +1 -0
- package/dist/commands/__tests__/init.test.d.ts +2 -0
- package/dist/commands/__tests__/init.test.d.ts.map +1 -0
- package/dist/commands/__tests__/init.test.js +247 -0
- package/dist/commands/__tests__/init.test.js.map +1 -0
- package/dist/commands/__tests__/start.test.d.ts +2 -0
- package/dist/commands/__tests__/start.test.d.ts.map +1 -0
- package/dist/commands/__tests__/start.test.js +185 -0
- package/dist/commands/__tests__/start.test.js.map +1 -0
- package/dist/commands/__tests__/status.test.d.ts +2 -0
- package/dist/commands/__tests__/status.test.d.ts.map +1 -0
- package/dist/commands/__tests__/status.test.js +342 -0
- package/dist/commands/__tests__/status.test.js.map +1 -0
- package/dist/commands/__tests__/stop.test.d.ts +2 -0
- package/dist/commands/__tests__/stop.test.d.ts.map +1 -0
- package/dist/commands/__tests__/stop.test.js +229 -0
- package/dist/commands/__tests__/stop.test.js.map +1 -0
- package/dist/commands/__tests__/trigger.test.d.ts +2 -0
- package/dist/commands/__tests__/trigger.test.d.ts.map +1 -0
- package/dist/commands/__tests__/trigger.test.js +321 -0
- package/dist/commands/__tests__/trigger.test.js.map +1 -0
- package/dist/commands/cancel.d.ts +20 -0
- package/dist/commands/cancel.d.ts.map +1 -0
- package/dist/commands/cancel.js +263 -0
- package/dist/commands/cancel.js.map +1 -0
- package/dist/commands/config.d.ts +26 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +287 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/init.d.ts +16 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +305 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/job.d.ts +19 -0
- package/dist/commands/job.d.ts.map +1 -0
- package/dist/commands/job.js +460 -0
- package/dist/commands/job.js.map +1 -0
- package/dist/commands/jobs.d.ts +23 -0
- package/dist/commands/jobs.d.ts.map +1 -0
- package/dist/commands/jobs.js +328 -0
- package/dist/commands/jobs.js.map +1 -0
- package/dist/commands/logs.d.ts +25 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +360 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/start.d.ts +17 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +166 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +18 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +373 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +18 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +161 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/trigger.d.ts +23 -0
- package/dist/commands/trigger.d.ts.map +1 -0
- package/dist/commands/trigger.js +332 -0
- package/dist/commands/trigger.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +283 -0
- package/dist/index.js.map +1 -0
- package/package.json +46 -7
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* herdctl logs - Show agent logs
|
|
3
|
+
*
|
|
4
|
+
* Commands:
|
|
5
|
+
* - herdctl logs Recent logs from all agents
|
|
6
|
+
* - herdctl logs <agent> Logs from specific agent
|
|
7
|
+
* - herdctl logs -f Follow mode (stream new logs)
|
|
8
|
+
* - herdctl logs -f <agent> Follow specific agent
|
|
9
|
+
* - herdctl logs --job <id> Logs from specific job
|
|
10
|
+
* - herdctl logs -n 100 Last 100 lines (default: 50)
|
|
11
|
+
* - herdctl logs --json JSON output for each log entry
|
|
12
|
+
*/
|
|
13
|
+
import { FleetManager, ConfigNotFoundError, AgentNotFoundError, JobNotFoundError, isFleetManagerError, } from "@herdctl/core";
|
|
14
|
+
/**
|
|
15
|
+
* Default state directory
|
|
16
|
+
*/
|
|
17
|
+
const DEFAULT_STATE_DIR = ".herdctl";
|
|
18
|
+
/**
|
|
19
|
+
* Default number of log lines to show
|
|
20
|
+
*/
|
|
21
|
+
const DEFAULT_LINES = 50;
|
|
22
|
+
/**
|
|
23
|
+
* Check if colors should be disabled
|
|
24
|
+
*/
|
|
25
|
+
function shouldUseColor() {
|
|
26
|
+
// NO_COLOR takes precedence (https://no-color.org/)
|
|
27
|
+
if (process.env.NO_COLOR !== undefined && process.env.NO_COLOR !== "") {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
// Also check FORCE_COLOR for override
|
|
31
|
+
if (process.env.FORCE_COLOR !== undefined && process.env.FORCE_COLOR !== "0") {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
// Check if stdout is a TTY
|
|
35
|
+
return process.stdout.isTTY === true;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* ANSI color codes
|
|
39
|
+
*/
|
|
40
|
+
const colors = {
|
|
41
|
+
reset: "\x1b[0m",
|
|
42
|
+
bold: "\x1b[1m",
|
|
43
|
+
dim: "\x1b[2m",
|
|
44
|
+
green: "\x1b[32m",
|
|
45
|
+
yellow: "\x1b[33m",
|
|
46
|
+
red: "\x1b[31m",
|
|
47
|
+
cyan: "\x1b[36m",
|
|
48
|
+
gray: "\x1b[90m",
|
|
49
|
+
blue: "\x1b[34m",
|
|
50
|
+
magenta: "\x1b[35m",
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Get a colored string, respecting NO_COLOR
|
|
54
|
+
*/
|
|
55
|
+
function colorize(text, color) {
|
|
56
|
+
if (!shouldUseColor()) {
|
|
57
|
+
return text;
|
|
58
|
+
}
|
|
59
|
+
return `${colors[color]}${text}${colors.reset}`;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get color for log level
|
|
63
|
+
*/
|
|
64
|
+
function getLevelColor(level) {
|
|
65
|
+
switch (level) {
|
|
66
|
+
case "error":
|
|
67
|
+
return "red";
|
|
68
|
+
case "warn":
|
|
69
|
+
return "yellow";
|
|
70
|
+
case "info":
|
|
71
|
+
return "green";
|
|
72
|
+
case "debug":
|
|
73
|
+
return "gray";
|
|
74
|
+
default:
|
|
75
|
+
return "reset";
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get color for log source (output type)
|
|
80
|
+
*/
|
|
81
|
+
function getSourceColor(source, data) {
|
|
82
|
+
// Check if there's an outputType in the data (from job output)
|
|
83
|
+
const outputType = data?.outputType;
|
|
84
|
+
if (outputType) {
|
|
85
|
+
switch (outputType) {
|
|
86
|
+
case "assistant":
|
|
87
|
+
return "cyan";
|
|
88
|
+
case "tool":
|
|
89
|
+
return "magenta";
|
|
90
|
+
case "result":
|
|
91
|
+
return "blue";
|
|
92
|
+
case "error":
|
|
93
|
+
return "red";
|
|
94
|
+
case "system":
|
|
95
|
+
return "gray";
|
|
96
|
+
default:
|
|
97
|
+
return "reset";
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Fallback to source-based coloring
|
|
101
|
+
switch (source) {
|
|
102
|
+
case "agent":
|
|
103
|
+
return "cyan";
|
|
104
|
+
case "job":
|
|
105
|
+
return "blue";
|
|
106
|
+
case "scheduler":
|
|
107
|
+
return "magenta";
|
|
108
|
+
case "fleet":
|
|
109
|
+
return "green";
|
|
110
|
+
default:
|
|
111
|
+
return "reset";
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Format timestamp to local timezone
|
|
116
|
+
*/
|
|
117
|
+
function formatTimestamp(isoTimestamp) {
|
|
118
|
+
const date = new Date(isoTimestamp);
|
|
119
|
+
return date.toLocaleString(undefined, {
|
|
120
|
+
hour: "2-digit",
|
|
121
|
+
minute: "2-digit",
|
|
122
|
+
second: "2-digit",
|
|
123
|
+
hour12: false,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Format a log entry for console output with colors
|
|
128
|
+
*/
|
|
129
|
+
function formatLogEntry(entry) {
|
|
130
|
+
const timestamp = colorize(formatTimestamp(entry.timestamp), "dim");
|
|
131
|
+
const level = colorize(entry.level.toUpperCase().padEnd(5), getLevelColor(entry.level));
|
|
132
|
+
// Build source label
|
|
133
|
+
let sourceLabel = "";
|
|
134
|
+
if (entry.agentName) {
|
|
135
|
+
sourceLabel = colorize(`[${entry.agentName}]`, getSourceColor("agent", entry.data));
|
|
136
|
+
}
|
|
137
|
+
else if (entry.source) {
|
|
138
|
+
sourceLabel = colorize(`[${entry.source}]`, getSourceColor(entry.source, entry.data));
|
|
139
|
+
}
|
|
140
|
+
// Add job ID if present
|
|
141
|
+
const jobInfo = entry.jobId
|
|
142
|
+
? colorize(` (${entry.jobId.substring(0, 12)})`, "dim")
|
|
143
|
+
: "";
|
|
144
|
+
// Format the message with output type coloring if available
|
|
145
|
+
let message = entry.message;
|
|
146
|
+
const outputType = entry.data?.outputType;
|
|
147
|
+
if (outputType) {
|
|
148
|
+
message = colorize(message, getSourceColor("", entry.data));
|
|
149
|
+
}
|
|
150
|
+
return `${timestamp} ${level} ${sourceLabel}${jobInfo} ${message}`;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Format a log entry as JSON
|
|
154
|
+
*/
|
|
155
|
+
function formatLogEntryJson(entry) {
|
|
156
|
+
return JSON.stringify(entry);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Show logs (herdctl logs)
|
|
160
|
+
*/
|
|
161
|
+
export async function logsCommand(agentName, options) {
|
|
162
|
+
const stateDir = options.state || DEFAULT_STATE_DIR;
|
|
163
|
+
const lines = parseInt(options.lines || String(DEFAULT_LINES), 10);
|
|
164
|
+
const isFollowMode = options.follow === true;
|
|
165
|
+
const isJsonOutput = options.json === true;
|
|
166
|
+
const jobId = options.job;
|
|
167
|
+
// Validate lines option
|
|
168
|
+
if (isNaN(lines) || lines < 1) {
|
|
169
|
+
console.error("Error: --lines must be a positive integer");
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
// Create FleetManager
|
|
173
|
+
const manager = new FleetManager({
|
|
174
|
+
configPath: options.config,
|
|
175
|
+
stateDir,
|
|
176
|
+
});
|
|
177
|
+
// Track if we're shutting down
|
|
178
|
+
let isShuttingDown = false;
|
|
179
|
+
/**
|
|
180
|
+
* Graceful shutdown handler
|
|
181
|
+
*/
|
|
182
|
+
function shutdown() {
|
|
183
|
+
if (isShuttingDown) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
isShuttingDown = true;
|
|
187
|
+
if (!isJsonOutput) {
|
|
188
|
+
console.log("");
|
|
189
|
+
}
|
|
190
|
+
process.exit(0);
|
|
191
|
+
}
|
|
192
|
+
// Register signal handlers for follow mode
|
|
193
|
+
if (isFollowMode) {
|
|
194
|
+
process.on("SIGINT", shutdown);
|
|
195
|
+
process.on("SIGTERM", shutdown);
|
|
196
|
+
}
|
|
197
|
+
try {
|
|
198
|
+
// Initialize to load configuration
|
|
199
|
+
await manager.initialize();
|
|
200
|
+
// Determine which stream to use
|
|
201
|
+
let logStream;
|
|
202
|
+
if (jobId) {
|
|
203
|
+
// Stream logs from specific job
|
|
204
|
+
logStream = manager.streamJobOutput(jobId);
|
|
205
|
+
}
|
|
206
|
+
else if (agentName) {
|
|
207
|
+
// Stream logs from specific agent
|
|
208
|
+
logStream = manager.streamAgentLogs(agentName);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
// Stream all logs
|
|
212
|
+
logStream = manager.streamLogs({
|
|
213
|
+
level: "info",
|
|
214
|
+
includeHistory: true,
|
|
215
|
+
historyLimit: isFollowMode ? lines : lines,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
// Collect entries for non-follow mode
|
|
219
|
+
const entries = [];
|
|
220
|
+
// Process log entries
|
|
221
|
+
for await (const entry of logStream) {
|
|
222
|
+
if (isShuttingDown) {
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
if (isFollowMode) {
|
|
226
|
+
// In follow mode, output immediately
|
|
227
|
+
if (isJsonOutput) {
|
|
228
|
+
console.log(formatLogEntryJson(entry));
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
console.log(formatLogEntry(entry));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
// In non-follow mode, collect entries
|
|
236
|
+
entries.push(entry);
|
|
237
|
+
// Keep only the last N entries
|
|
238
|
+
if (entries.length > lines) {
|
|
239
|
+
entries.shift();
|
|
240
|
+
}
|
|
241
|
+
// For job-specific logs, we need to consume the entire stream
|
|
242
|
+
// For general logs, we can stop early if not in follow mode
|
|
243
|
+
if (!jobId && entries.length >= lines * 2) {
|
|
244
|
+
// We have enough entries, stop collecting
|
|
245
|
+
// (collect 2x to handle filtering)
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// Output collected entries for non-follow mode
|
|
251
|
+
if (!isFollowMode) {
|
|
252
|
+
const toOutput = entries.slice(-lines);
|
|
253
|
+
if (toOutput.length === 0) {
|
|
254
|
+
if (!isJsonOutput) {
|
|
255
|
+
console.log("No log entries found.");
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
for (const entry of toOutput) {
|
|
260
|
+
if (isJsonOutput) {
|
|
261
|
+
console.log(formatLogEntryJson(entry));
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
console.log(formatLogEntry(entry));
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
// Handle specific error types
|
|
272
|
+
if (error instanceof ConfigNotFoundError) {
|
|
273
|
+
if (isJsonOutput) {
|
|
274
|
+
console.log(JSON.stringify({
|
|
275
|
+
error: {
|
|
276
|
+
code: "CONFIG_NOT_FOUND",
|
|
277
|
+
message: "No configuration file found",
|
|
278
|
+
startDirectory: error.startDirectory,
|
|
279
|
+
},
|
|
280
|
+
}));
|
|
281
|
+
process.exit(1);
|
|
282
|
+
}
|
|
283
|
+
console.error("");
|
|
284
|
+
console.error("Error: No configuration file found.");
|
|
285
|
+
console.error(`Searched from: ${error.startDirectory}`);
|
|
286
|
+
console.error("");
|
|
287
|
+
console.error("Run 'herdctl init' to create a configuration file.");
|
|
288
|
+
process.exit(1);
|
|
289
|
+
}
|
|
290
|
+
if (error instanceof AgentNotFoundError) {
|
|
291
|
+
if (isJsonOutput) {
|
|
292
|
+
console.log(JSON.stringify({
|
|
293
|
+
error: {
|
|
294
|
+
code: "AGENT_NOT_FOUND",
|
|
295
|
+
message: error.message,
|
|
296
|
+
agentName: agentName,
|
|
297
|
+
},
|
|
298
|
+
}));
|
|
299
|
+
process.exit(1);
|
|
300
|
+
}
|
|
301
|
+
console.error("");
|
|
302
|
+
console.error(`Error: Agent '${agentName}' not found.`);
|
|
303
|
+
console.error("");
|
|
304
|
+
console.error("Run 'herdctl status' to see all agents.");
|
|
305
|
+
process.exit(1);
|
|
306
|
+
}
|
|
307
|
+
if (error instanceof JobNotFoundError) {
|
|
308
|
+
if (isJsonOutput) {
|
|
309
|
+
console.log(JSON.stringify({
|
|
310
|
+
error: {
|
|
311
|
+
code: "JOB_NOT_FOUND",
|
|
312
|
+
message: error.message,
|
|
313
|
+
jobId: jobId,
|
|
314
|
+
},
|
|
315
|
+
}));
|
|
316
|
+
process.exit(1);
|
|
317
|
+
}
|
|
318
|
+
console.error("");
|
|
319
|
+
console.error(`Error: Job '${jobId}' not found.`);
|
|
320
|
+
console.error("");
|
|
321
|
+
console.error("Run 'herdctl status' to see running jobs.");
|
|
322
|
+
process.exit(1);
|
|
323
|
+
}
|
|
324
|
+
if (isFleetManagerError(error)) {
|
|
325
|
+
if (isJsonOutput) {
|
|
326
|
+
console.log(JSON.stringify({
|
|
327
|
+
error: {
|
|
328
|
+
code: error.code,
|
|
329
|
+
message: error.message,
|
|
330
|
+
},
|
|
331
|
+
}));
|
|
332
|
+
process.exit(1);
|
|
333
|
+
}
|
|
334
|
+
console.error("");
|
|
335
|
+
console.error(`Error: ${error.message}`);
|
|
336
|
+
if (error.code) {
|
|
337
|
+
console.error(`Code: ${error.code}`);
|
|
338
|
+
}
|
|
339
|
+
process.exit(1);
|
|
340
|
+
}
|
|
341
|
+
// Handle stream interruption during shutdown gracefully
|
|
342
|
+
if (isShuttingDown) {
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
// Generic error
|
|
346
|
+
if (isJsonOutput) {
|
|
347
|
+
console.log(JSON.stringify({
|
|
348
|
+
error: {
|
|
349
|
+
code: "UNKNOWN_ERROR",
|
|
350
|
+
message: error instanceof Error ? error.message : String(error),
|
|
351
|
+
},
|
|
352
|
+
}));
|
|
353
|
+
process.exit(1);
|
|
354
|
+
}
|
|
355
|
+
console.error("");
|
|
356
|
+
console.error("Error:", error instanceof Error ? error.message : String(error));
|
|
357
|
+
process.exit(1);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* herdctl start - Start the fleet
|
|
3
|
+
*
|
|
4
|
+
* Commands:
|
|
5
|
+
* - herdctl start Start all agents
|
|
6
|
+
* - herdctl start --config ./path/to/config Custom config path
|
|
7
|
+
* - herdctl start --state ./path/to/state Custom state directory
|
|
8
|
+
*/
|
|
9
|
+
export interface StartOptions {
|
|
10
|
+
config?: string;
|
|
11
|
+
state?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Start the fleet
|
|
15
|
+
*/
|
|
16
|
+
export declare function startCommand(options: StartOptions): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=start.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA6ED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAqGvE"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* herdctl start - Start the fleet
|
|
3
|
+
*
|
|
4
|
+
* Commands:
|
|
5
|
+
* - herdctl start Start all agents
|
|
6
|
+
* - herdctl start --config ./path/to/config Custom config path
|
|
7
|
+
* - herdctl start --state ./path/to/state Custom state directory
|
|
8
|
+
*/
|
|
9
|
+
import * as fs from "node:fs";
|
|
10
|
+
import * as path from "node:path";
|
|
11
|
+
import { FleetManager, ConfigNotFoundError, isFleetManagerError, } from "@herdctl/core";
|
|
12
|
+
/**
|
|
13
|
+
* Default state directory
|
|
14
|
+
*/
|
|
15
|
+
const DEFAULT_STATE_DIR = ".herdctl";
|
|
16
|
+
/**
|
|
17
|
+
* Format a FleetStatus for startup display
|
|
18
|
+
*/
|
|
19
|
+
function formatStartupStatus(status) {
|
|
20
|
+
const lines = [];
|
|
21
|
+
lines.push("");
|
|
22
|
+
lines.push("Fleet Status");
|
|
23
|
+
lines.push("============");
|
|
24
|
+
lines.push(`State: ${status.state}`);
|
|
25
|
+
lines.push(`Agents: ${status.counts.totalAgents}`);
|
|
26
|
+
lines.push(`Schedules: ${status.counts.totalSchedules}`);
|
|
27
|
+
if (status.startedAt) {
|
|
28
|
+
lines.push(`Started: ${new Date(status.startedAt).toLocaleString()}`);
|
|
29
|
+
}
|
|
30
|
+
lines.push("");
|
|
31
|
+
lines.push("Press Ctrl+C to stop the fleet");
|
|
32
|
+
lines.push("");
|
|
33
|
+
return lines.join("\n");
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Format a log entry for console output
|
|
37
|
+
*/
|
|
38
|
+
function formatLogEntry(entry) {
|
|
39
|
+
const timestamp = new Date(entry.timestamp).toLocaleTimeString();
|
|
40
|
+
const level = entry.level.toUpperCase().padEnd(5);
|
|
41
|
+
const source = entry.agentName
|
|
42
|
+
? `[${entry.agentName}]`
|
|
43
|
+
: entry.source
|
|
44
|
+
? `[${entry.source}]`
|
|
45
|
+
: "";
|
|
46
|
+
const jobInfo = entry.jobId ? ` (${entry.jobId})` : "";
|
|
47
|
+
return `${timestamp} ${level} ${source}${jobInfo} ${entry.message}`;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Write PID file to state directory
|
|
51
|
+
*/
|
|
52
|
+
async function writePidFile(stateDir) {
|
|
53
|
+
const pidFile = path.join(stateDir, "herdctl.pid");
|
|
54
|
+
const pid = process.pid.toString();
|
|
55
|
+
// Ensure state directory exists
|
|
56
|
+
await fs.promises.mkdir(stateDir, { recursive: true });
|
|
57
|
+
await fs.promises.writeFile(pidFile, pid, "utf-8");
|
|
58
|
+
return pidFile;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Remove PID file from state directory
|
|
62
|
+
*/
|
|
63
|
+
async function removePidFile(stateDir) {
|
|
64
|
+
const pidFile = path.join(stateDir, "herdctl.pid");
|
|
65
|
+
try {
|
|
66
|
+
await fs.promises.unlink(pidFile);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
// Ignore if file doesn't exist
|
|
70
|
+
if (error.code !== "ENOENT") {
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Start the fleet
|
|
77
|
+
*/
|
|
78
|
+
export async function startCommand(options) {
|
|
79
|
+
const stateDir = options.state || DEFAULT_STATE_DIR;
|
|
80
|
+
console.log("Starting fleet...");
|
|
81
|
+
// Create FleetManager
|
|
82
|
+
const manager = new FleetManager({
|
|
83
|
+
configPath: options.config,
|
|
84
|
+
stateDir,
|
|
85
|
+
});
|
|
86
|
+
// Track if we're shutting down to prevent multiple shutdown attempts
|
|
87
|
+
let isShuttingDown = false;
|
|
88
|
+
/**
|
|
89
|
+
* Graceful shutdown handler
|
|
90
|
+
*/
|
|
91
|
+
async function shutdown(signal) {
|
|
92
|
+
if (isShuttingDown) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
isShuttingDown = true;
|
|
96
|
+
console.log("");
|
|
97
|
+
console.log(`Received ${signal}, shutting down gracefully...`);
|
|
98
|
+
try {
|
|
99
|
+
await manager.stop({
|
|
100
|
+
waitForJobs: true,
|
|
101
|
+
timeout: 30000,
|
|
102
|
+
cancelOnTimeout: true,
|
|
103
|
+
});
|
|
104
|
+
await removePidFile(stateDir);
|
|
105
|
+
console.log("Fleet stopped successfully.");
|
|
106
|
+
process.exit(0);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
console.error("Error during shutdown:", error instanceof Error ? error.message : String(error));
|
|
110
|
+
await removePidFile(stateDir);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Register signal handlers
|
|
115
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
116
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
117
|
+
try {
|
|
118
|
+
// Initialize the fleet manager
|
|
119
|
+
await manager.initialize();
|
|
120
|
+
// Start the fleet
|
|
121
|
+
await manager.start();
|
|
122
|
+
// Write PID file
|
|
123
|
+
const pidFile = await writePidFile(stateDir);
|
|
124
|
+
console.log(`PID file written: ${pidFile}`);
|
|
125
|
+
// Get and display startup status
|
|
126
|
+
const status = await manager.getFleetStatus();
|
|
127
|
+
console.log(formatStartupStatus(status));
|
|
128
|
+
// Stream logs to stdout
|
|
129
|
+
// This keeps the process running since it's an async iterator
|
|
130
|
+
try {
|
|
131
|
+
for await (const entry of manager.streamLogs({ level: "info", includeHistory: false })) {
|
|
132
|
+
console.log(formatLogEntry(entry));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
// If the log stream ends (e.g., during shutdown), that's expected
|
|
137
|
+
if (!isShuttingDown) {
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
// Handle specific error types
|
|
144
|
+
if (error instanceof ConfigNotFoundError) {
|
|
145
|
+
console.error("");
|
|
146
|
+
console.error("Error: No configuration file found.");
|
|
147
|
+
console.error(`Searched from: ${error.startDirectory}`);
|
|
148
|
+
console.error("");
|
|
149
|
+
console.error("Run 'herdctl init' to create a configuration file.");
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
if (isFleetManagerError(error)) {
|
|
153
|
+
console.error("");
|
|
154
|
+
console.error(`Error: ${error.message}`);
|
|
155
|
+
if (error.code) {
|
|
156
|
+
console.error(`Code: ${error.code}`);
|
|
157
|
+
}
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
160
|
+
// Generic error
|
|
161
|
+
console.error("");
|
|
162
|
+
console.error("Error:", error instanceof Error ? error.message : String(error));
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* herdctl status - Show fleet and agent status
|
|
3
|
+
*
|
|
4
|
+
* Commands:
|
|
5
|
+
* - herdctl status Overview of all agents
|
|
6
|
+
* - herdctl status <agent> Detailed status of specific agent
|
|
7
|
+
* - herdctl status --json JSON output for scripting
|
|
8
|
+
*/
|
|
9
|
+
export interface StatusOptions {
|
|
10
|
+
json?: boolean;
|
|
11
|
+
state?: string;
|
|
12
|
+
config?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Show fleet status (herdctl status)
|
|
16
|
+
*/
|
|
17
|
+
export declare function statusCommand(agentName: string | undefined, options: StatusOptions): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAoTD;;GAEG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CA0Gf"}
|