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.
Files changed (70) hide show
  1. package/bin/herdctl.js +9 -0
  2. package/dist/commands/__tests__/config.test.d.ts +2 -0
  3. package/dist/commands/__tests__/config.test.d.ts.map +1 -0
  4. package/dist/commands/__tests__/config.test.js +299 -0
  5. package/dist/commands/__tests__/config.test.js.map +1 -0
  6. package/dist/commands/__tests__/init.test.d.ts +2 -0
  7. package/dist/commands/__tests__/init.test.d.ts.map +1 -0
  8. package/dist/commands/__tests__/init.test.js +247 -0
  9. package/dist/commands/__tests__/init.test.js.map +1 -0
  10. package/dist/commands/__tests__/start.test.d.ts +2 -0
  11. package/dist/commands/__tests__/start.test.d.ts.map +1 -0
  12. package/dist/commands/__tests__/start.test.js +185 -0
  13. package/dist/commands/__tests__/start.test.js.map +1 -0
  14. package/dist/commands/__tests__/status.test.d.ts +2 -0
  15. package/dist/commands/__tests__/status.test.d.ts.map +1 -0
  16. package/dist/commands/__tests__/status.test.js +342 -0
  17. package/dist/commands/__tests__/status.test.js.map +1 -0
  18. package/dist/commands/__tests__/stop.test.d.ts +2 -0
  19. package/dist/commands/__tests__/stop.test.d.ts.map +1 -0
  20. package/dist/commands/__tests__/stop.test.js +229 -0
  21. package/dist/commands/__tests__/stop.test.js.map +1 -0
  22. package/dist/commands/__tests__/trigger.test.d.ts +2 -0
  23. package/dist/commands/__tests__/trigger.test.d.ts.map +1 -0
  24. package/dist/commands/__tests__/trigger.test.js +321 -0
  25. package/dist/commands/__tests__/trigger.test.js.map +1 -0
  26. package/dist/commands/cancel.d.ts +20 -0
  27. package/dist/commands/cancel.d.ts.map +1 -0
  28. package/dist/commands/cancel.js +263 -0
  29. package/dist/commands/cancel.js.map +1 -0
  30. package/dist/commands/config.d.ts +26 -0
  31. package/dist/commands/config.d.ts.map +1 -0
  32. package/dist/commands/config.js +287 -0
  33. package/dist/commands/config.js.map +1 -0
  34. package/dist/commands/init.d.ts +16 -0
  35. package/dist/commands/init.d.ts.map +1 -0
  36. package/dist/commands/init.js +305 -0
  37. package/dist/commands/init.js.map +1 -0
  38. package/dist/commands/job.d.ts +19 -0
  39. package/dist/commands/job.d.ts.map +1 -0
  40. package/dist/commands/job.js +460 -0
  41. package/dist/commands/job.js.map +1 -0
  42. package/dist/commands/jobs.d.ts +23 -0
  43. package/dist/commands/jobs.d.ts.map +1 -0
  44. package/dist/commands/jobs.js +328 -0
  45. package/dist/commands/jobs.js.map +1 -0
  46. package/dist/commands/logs.d.ts +25 -0
  47. package/dist/commands/logs.d.ts.map +1 -0
  48. package/dist/commands/logs.js +360 -0
  49. package/dist/commands/logs.js.map +1 -0
  50. package/dist/commands/start.d.ts +17 -0
  51. package/dist/commands/start.d.ts.map +1 -0
  52. package/dist/commands/start.js +166 -0
  53. package/dist/commands/start.js.map +1 -0
  54. package/dist/commands/status.d.ts +18 -0
  55. package/dist/commands/status.d.ts.map +1 -0
  56. package/dist/commands/status.js +373 -0
  57. package/dist/commands/status.js.map +1 -0
  58. package/dist/commands/stop.d.ts +18 -0
  59. package/dist/commands/stop.d.ts.map +1 -0
  60. package/dist/commands/stop.js +161 -0
  61. package/dist/commands/stop.js.map +1 -0
  62. package/dist/commands/trigger.d.ts +23 -0
  63. package/dist/commands/trigger.d.ts.map +1 -0
  64. package/dist/commands/trigger.js +332 -0
  65. package/dist/commands/trigger.js.map +1 -0
  66. package/dist/index.d.ts +23 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +283 -0
  69. package/dist/index.js.map +1 -0
  70. 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"}