@songsid/agend 2.1.1-beta.10 → 2.1.1-beta.12
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/dist/backend/antigravity.js +9 -11
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.js +7 -7
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex.d.ts +16 -0
- package/dist/backend/codex.js +251 -62
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/gemini-cli.js +4 -7
- package/dist/backend/gemini-cli.js.map +1 -1
- package/dist/backend/grok.js +24 -7
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro.js +22 -9
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/opencode.js +4 -7
- package/dist/backend/opencode.js.map +1 -1
- package/dist/backend/types.d.ts +7 -0
- package/dist/backend/types.js +3 -3
- package/dist/backend/types.js.map +1 -1
- package/dist/channel/adapters/discord.js +4 -5
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.js +50 -15
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/ipc-bridge.d.ts +8 -0
- package/dist/channel/ipc-bridge.js +41 -14
- package/dist/channel/ipc-bridge.js.map +1 -1
- package/dist/channel/mcp-server.js +25 -10
- package/dist/channel/mcp-server.js.map +1 -1
- package/dist/channel/mcp-tools.js +25 -0
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/message-queue.d.ts +1 -0
- package/dist/channel/message-queue.js +49 -17
- package/dist/channel/message-queue.js.map +1 -1
- package/dist/channel/reconnect-backoff.d.ts +17 -0
- package/dist/channel/reconnect-backoff.js +21 -0
- package/dist/channel/reconnect-backoff.js.map +1 -0
- package/dist/cli.js +71 -26
- package/dist/cli.js.map +1 -1
- package/dist/completion.d.ts +27 -0
- package/dist/completion.js +121 -0
- package/dist/completion.js.map +1 -0
- package/dist/config-validator.js +9 -0
- package/dist/config-validator.js.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/daemon.d.ts +74 -8
- package/dist/daemon.js +254 -18
- package/dist/daemon.js.map +1 -1
- package/dist/fleet-manager.d.ts +7 -1
- package/dist/fleet-manager.js +89 -16
- package/dist/fleet-manager.js.map +1 -1
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +22 -0
- package/dist/general-knowledge/skills/model-discovery/SKILL.md +14 -23
- package/dist/general-knowledge/skills/session-management/SKILL.md +15 -34
- package/dist/instance-lifecycle.d.ts +13 -1
- package/dist/instance-lifecycle.js +70 -3
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instructions.d.ts +5 -0
- package/dist/instructions.js +9 -11
- package/dist/instructions.js.map +1 -1
- package/dist/logger.js +14 -0
- package/dist/logger.js.map +1 -1
- package/dist/mcp-liveness.d.ts +21 -0
- package/dist/mcp-liveness.js +27 -0
- package/dist/mcp-liveness.js.map +1 -0
- package/dist/outbound-handlers.d.ts +9 -0
- package/dist/outbound-handlers.js +46 -26
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.js +1 -1
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/tmux-control.js +4 -2
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-manager.d.ts +14 -0
- package/dist/tmux-manager.js +20 -6
- package/dist/tmux-manager.js.map +1 -1
- package/dist/topic-commands.d.ts +22 -1
- package/dist/topic-commands.js +95 -57
- package/dist/topic-commands.js.map +1 -1
- package/dist/tui-glyphs.d.ts +25 -0
- package/dist/tui-glyphs.js +26 -0
- package/dist/tui-glyphs.js.map +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/ui/view.html +114 -2
- package/dist/usage/providers.d.ts +26 -0
- package/dist/usage/providers.js +447 -0
- package/dist/usage/providers.js.map +1 -0
- package/dist/usage/usage-api.d.ts +35 -0
- package/dist/usage/usage-api.js +52 -0
- package/dist/usage/usage-api.js.map +1 -0
- package/dist/view-api.d.ts +3 -0
- package/dist/view-api.js +10 -2
- package/dist/view-api.js.map +1 -1
- package/package.json +1 -1
|
@@ -4,20 +4,35 @@ const WORKER_BETWEEN_MS = 50;
|
|
|
4
4
|
const MAX_BACKOFF_MS = 30_000;
|
|
5
5
|
const FLOOD_CONTROL_THRESHOLD_MS = 10_000;
|
|
6
6
|
const INITIAL_BACKOFF_MS = 1_000;
|
|
7
|
-
function
|
|
7
|
+
function isDefinite429Rejection(err) {
|
|
8
8
|
if (err instanceof Error) {
|
|
9
9
|
const e = err;
|
|
10
10
|
if (e.status === 429)
|
|
11
11
|
return true;
|
|
12
12
|
if (e.code === 429)
|
|
13
13
|
return true;
|
|
14
|
-
if (e.
|
|
14
|
+
if (e.error_code === 429)
|
|
15
15
|
return true;
|
|
16
|
-
if (e.
|
|
16
|
+
if (e.response?.status === 429)
|
|
17
17
|
return true;
|
|
18
18
|
}
|
|
19
19
|
return false;
|
|
20
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Carries only operations which the remote API explicitly rejected before
|
|
23
|
+
* delivery. Earlier operations in the same merged batch may already have been
|
|
24
|
+
* accepted and must never be replayed.
|
|
25
|
+
*/
|
|
26
|
+
class QueueDeliveryError extends Error {
|
|
27
|
+
cause;
|
|
28
|
+
retryItems;
|
|
29
|
+
constructor(cause, retryItems) {
|
|
30
|
+
super(cause instanceof Error ? cause.message : String(cause));
|
|
31
|
+
this.cause = cause;
|
|
32
|
+
this.retryItems = retryItems;
|
|
33
|
+
this.name = "QueueDeliveryError";
|
|
34
|
+
}
|
|
35
|
+
}
|
|
21
36
|
function splitText(text) {
|
|
22
37
|
const chunks = [];
|
|
23
38
|
let offset = 0;
|
|
@@ -36,6 +51,13 @@ export class MessageQueue {
|
|
|
36
51
|
this.sender = sender;
|
|
37
52
|
this.logger = logger;
|
|
38
53
|
}
|
|
54
|
+
warn(obj, msg) {
|
|
55
|
+
if (this.logger) {
|
|
56
|
+
this.logger.warn(obj, msg);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
console.warn(`[message-queue] ${msg}`, obj);
|
|
60
|
+
}
|
|
39
61
|
queueKey(chatId, threadId) {
|
|
40
62
|
return threadId != null ? `${chatId}:${threadId}` : `${chatId}:`;
|
|
41
63
|
}
|
|
@@ -101,7 +123,7 @@ export class MessageQueue {
|
|
|
101
123
|
// out the full exponential delay.
|
|
102
124
|
state.backoffMs = INITIAL_BACKOFF_MS;
|
|
103
125
|
state.backoffUntil = 0;
|
|
104
|
-
this.
|
|
126
|
+
this.warn({ chatId: state.key.chatId, dropped: before - state.items.length }, "MessageQueue flood control: dropped status_update items, backoff reset");
|
|
105
127
|
}
|
|
106
128
|
}
|
|
107
129
|
if (state.items.length === 0) {
|
|
@@ -122,16 +144,20 @@ export class MessageQueue {
|
|
|
122
144
|
await this.sleep(WORKER_BETWEEN_MS);
|
|
123
145
|
}
|
|
124
146
|
catch (err) {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
147
|
+
const deliveryErr = err instanceof QueueDeliveryError ? err : null;
|
|
148
|
+
const cause = deliveryErr?.cause ?? err;
|
|
149
|
+
if (isDefinite429Rejection(cause)) {
|
|
150
|
+
// Re-insert only operations the API explicitly rejected. Content
|
|
151
|
+
// earlier in a merged batch may already have been delivered.
|
|
152
|
+
state.items.unshift(...(deliveryErr?.retryItems ?? pendingItems));
|
|
128
153
|
// Exponential backoff, cap at MAX_BACKOFF_MS
|
|
129
154
|
state.backoffUntil = Date.now() + state.backoffMs;
|
|
130
155
|
state.backoffMs = Math.min(state.backoffMs * 2, MAX_BACKOFF_MS);
|
|
131
156
|
}
|
|
132
157
|
else {
|
|
133
|
-
//
|
|
134
|
-
|
|
158
|
+
// A timeout/network error may have happened after the remote API
|
|
159
|
+
// accepted the message. Drop rather than risk a duplicate.
|
|
160
|
+
this.warn({ err: cause, chatId: state.key.chatId }, "Message dropped because delivery outcome is unknown or error is non-retryable");
|
|
135
161
|
state.backoffMs = INITIAL_BACKOFF_MS;
|
|
136
162
|
state.backoffUntil = 0;
|
|
137
163
|
await this.sleep(WORKER_BETWEEN_MS);
|
|
@@ -153,15 +179,21 @@ export class MessageQueue {
|
|
|
153
179
|
if (first.type === "content") {
|
|
154
180
|
const { merged, consumed } = this.mergeContentMessages(state);
|
|
155
181
|
const work = async () => {
|
|
156
|
-
for (
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
const parts = splitText(chunk.text);
|
|
162
|
-
for (const part of parts) {
|
|
163
|
-
await this.sender.send(chatId, threadId, part);
|
|
182
|
+
for (let i = 0; i < merged.length; i++) {
|
|
183
|
+
const chunk = merged[i];
|
|
184
|
+
try {
|
|
185
|
+
if (chunk.filePath) {
|
|
186
|
+
await this.sender.sendFile(chatId, threadId, chunk.filePath);
|
|
164
187
|
}
|
|
188
|
+
else if (chunk.text) {
|
|
189
|
+
await this.sender.send(chatId, threadId, chunk.text);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
const retryItems = merged.slice(i).map(remaining => remaining.filePath
|
|
194
|
+
? { type: "content", filePath: remaining.filePath }
|
|
195
|
+
: { type: "content", text: remaining.text ?? "" });
|
|
196
|
+
throw new QueueDeliveryError(err, retryItems);
|
|
165
197
|
}
|
|
166
198
|
}
|
|
167
199
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-queue.js","sourceRoot":"","sources":["../../src/channel/message-queue.ts"],"names":[],"mappings":"AAEA,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,cAAc,GAAG,MAAM,CAAC;AAC9B,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAC1C,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAqBjC,SAAS,
|
|
1
|
+
{"version":3,"file":"message-queue.js","sourceRoot":"","sources":["../../src/channel/message-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IPC reconnect backoff for the per-instance MCP server.
|
|
3
|
+
*
|
|
4
|
+
* Kept in its own module because mcp-server.ts runs `main()` on import (it is a
|
|
5
|
+
* CLI entrypoint) — importing it from a test would exit the process.
|
|
6
|
+
*
|
|
7
|
+
* There is deliberately NO give-up: the MCP server used to stop after
|
|
8
|
+
* 20 × 3s = 60s, but a fleet restart routinely takes longer (142s measured on a
|
|
9
|
+
* fleet with ~2k tasks), and an exited MCP server cannot be respawned mid-session
|
|
10
|
+
* by its client — the agent silently loses every agend tool until the user
|
|
11
|
+
* restarts the CLI. Idle retries cost ~nothing (one unix-socket connect), and the
|
|
12
|
+
* server's orphan check still terminates it when its own CLI goes away.
|
|
13
|
+
*/
|
|
14
|
+
export declare const RECONNECT_BASE_MS = 1000;
|
|
15
|
+
export declare const RECONNECT_MAX_MS = 30000;
|
|
16
|
+
/** Delay before reconnect attempt N (1-based): 1s, 2s, 4s, 8s, 16s, then 30s forever. */
|
|
17
|
+
export declare function reconnectDelayMs(attempt: number): number;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IPC reconnect backoff for the per-instance MCP server.
|
|
3
|
+
*
|
|
4
|
+
* Kept in its own module because mcp-server.ts runs `main()` on import (it is a
|
|
5
|
+
* CLI entrypoint) — importing it from a test would exit the process.
|
|
6
|
+
*
|
|
7
|
+
* There is deliberately NO give-up: the MCP server used to stop after
|
|
8
|
+
* 20 × 3s = 60s, but a fleet restart routinely takes longer (142s measured on a
|
|
9
|
+
* fleet with ~2k tasks), and an exited MCP server cannot be respawned mid-session
|
|
10
|
+
* by its client — the agent silently loses every agend tool until the user
|
|
11
|
+
* restarts the CLI. Idle retries cost ~nothing (one unix-socket connect), and the
|
|
12
|
+
* server's orphan check still terminates it when its own CLI goes away.
|
|
13
|
+
*/
|
|
14
|
+
export const RECONNECT_BASE_MS = 1_000;
|
|
15
|
+
export const RECONNECT_MAX_MS = 30_000;
|
|
16
|
+
/** Delay before reconnect attempt N (1-based): 1s, 2s, 4s, 8s, 16s, then 30s forever. */
|
|
17
|
+
export function reconnectDelayMs(attempt) {
|
|
18
|
+
const exp = Math.min(Math.max(attempt, 1) - 1, 5);
|
|
19
|
+
return Math.min(RECONNECT_BASE_MS * 2 ** exp, RECONNECT_MAX_MS);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=reconnect-backoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconnect-backoff.js","sourceRoot":"","sources":["../../src/channel/reconnect-backoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AACvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC,yFAAyF;AACzF,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,IAAI,GAAG,EAAE,gBAAgB,CAAC,CAAC;AAClE,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -13,6 +13,8 @@ import { spawn, execSync, execFileSync } from "node:child_process";
|
|
|
13
13
|
import { getAgendHome, getTmuxSocketName } from "./paths.js";
|
|
14
14
|
import { readClassicLastActivityAt } from "./classic-channel-manager.js";
|
|
15
15
|
import { hasPausedMarker } from "./pause-marker.js";
|
|
16
|
+
import { PIE_PERCENT_RE } from "./tui-glyphs.js";
|
|
17
|
+
import { COMPLETION_SHELLS, completionScript } from "./completion.js";
|
|
16
18
|
import { getUpdateSelector, lookupTargetVersion, reportUpdateRestart, shouldSkipUpdate, } from "./update-check.js";
|
|
17
19
|
/** Prefix tmux args with -L when socket isolation is active. */
|
|
18
20
|
function tmuxArgs(args) {
|
|
@@ -1834,28 +1836,7 @@ async function fuzzyMatch(query, names) {
|
|
|
1834
1836
|
return null;
|
|
1835
1837
|
}
|
|
1836
1838
|
async function resolveInstance(query, config) {
|
|
1837
|
-
const names =
|
|
1838
|
-
// Include classic instances from classicBot.yaml
|
|
1839
|
-
try {
|
|
1840
|
-
const classicPath = join(DATA_DIR, "classicBot.yaml");
|
|
1841
|
-
if (existsSync(classicPath)) {
|
|
1842
|
-
const yamlMod = (await import("js-yaml")).default;
|
|
1843
|
-
const classic = yamlMod.load(readFileSync(classicPath, "utf-8"));
|
|
1844
|
-
if (classic?.channels) {
|
|
1845
|
-
for (const [key, val] of Object.entries(classic.channels)) {
|
|
1846
|
-
// New format persists instanceName; old format keyed by channelId.
|
|
1847
|
-
if (val.instanceName) {
|
|
1848
|
-
names.push(val.instanceName);
|
|
1849
|
-
continue;
|
|
1850
|
-
}
|
|
1851
|
-
const channelId = val.channelId ?? key;
|
|
1852
|
-
const chName = (val.name ?? channelId).toLowerCase().replace(/[^\p{L}\d-]/gu, "-").replace(/-+/g, "-").replace(/^-|-$/g, "") || "project";
|
|
1853
|
-
names.push(`classic-${chName}-${channelId.slice(-4)}`);
|
|
1854
|
-
}
|
|
1855
|
-
}
|
|
1856
|
-
}
|
|
1857
|
-
}
|
|
1858
|
-
catch { /* ignore */ }
|
|
1839
|
+
const names = await listInstanceNames(config);
|
|
1859
1840
|
const match = await fuzzyMatch(query, names);
|
|
1860
1841
|
if (!match) {
|
|
1861
1842
|
console.error(`No instance matching "${query}". Available: ${names.join(", ")}`);
|
|
@@ -1950,7 +1931,7 @@ function formatTimeSince(isoStr) {
|
|
|
1950
1931
|
* Universal context-% parser for `agend ls` (all backends). Kept in sync with
|
|
1951
1932
|
* parseContextPercent() in topic-commands.ts — same formats, bottom-up so the
|
|
1952
1933
|
* most recent prompt wins:
|
|
1953
|
-
* kiro classic "8% !>" / TUI "
|
|
1934
|
+
* kiro classic "8% !>" / TUI "◑ 1%" (any pie glyph) / bracket "[8%]" / prompt "8% ❯"
|
|
1954
1935
|
* codex "Context N% left" (remaining → 100-N) or "Context N% used"
|
|
1955
1936
|
* opencode "1.2K (6%)"
|
|
1956
1937
|
* grok "12K / 500K" (used tokens / context window)
|
|
@@ -1977,7 +1958,7 @@ const defaultParser = (output) => {
|
|
|
1977
1958
|
return used / total * 100;
|
|
1978
1959
|
}
|
|
1979
1960
|
const m = line.match(/(\d+)%.*[!❯>]/)
|
|
1980
|
-
|| line.match(
|
|
1961
|
+
|| line.match(PIE_PERCENT_RE)
|
|
1981
1962
|
|| line.match(/\[(\d+)%\]/)
|
|
1982
1963
|
|| line.match(/Context\s+(\d+)%\s+used/i)
|
|
1983
1964
|
|| line.match(/\d+(?:\.\d+)?[KM]?\s*\((\d+)%\)/);
|
|
@@ -1988,10 +1969,48 @@ const defaultParser = (output) => {
|
|
|
1988
1969
|
};
|
|
1989
1970
|
/** Optional backend-specific overrides; none needed — defaultParser covers all. */
|
|
1990
1971
|
const contextParsers = {};
|
|
1972
|
+
/**
|
|
1973
|
+
* Every instance name the CLI accepts: fleet.yaml instances plus the
|
|
1974
|
+
* dynamically-created ClassicBot ones. Shared by `resolveInstance` (fuzzy
|
|
1975
|
+
* matching for `attach`) and `ls --names-only` (shell completion), so the
|
|
1976
|
+
* candidates offered by tab-completion are exactly the ones `attach` resolves.
|
|
1977
|
+
*/
|
|
1978
|
+
async function listInstanceNames(config) {
|
|
1979
|
+
const names = Object.keys(config.instances);
|
|
1980
|
+
try {
|
|
1981
|
+
const classicPath = join(DATA_DIR, "classicBot.yaml");
|
|
1982
|
+
if (existsSync(classicPath)) {
|
|
1983
|
+
const yamlMod = (await import("js-yaml")).default;
|
|
1984
|
+
const classic = yamlMod.load(readFileSync(classicPath, "utf-8"));
|
|
1985
|
+
if (classic?.channels) {
|
|
1986
|
+
for (const [key, val] of Object.entries(classic.channels)) {
|
|
1987
|
+
// New format persists instanceName; old format keyed by channelId.
|
|
1988
|
+
if (val.instanceName) {
|
|
1989
|
+
names.push(val.instanceName);
|
|
1990
|
+
continue;
|
|
1991
|
+
}
|
|
1992
|
+
const channelId = val.channelId ?? key;
|
|
1993
|
+
const chName = (val.name ?? channelId).toLowerCase().replace(/[^\p{L}\d-]/gu, "-").replace(/-+/g, "-").replace(/^-|-$/g, "") || "project";
|
|
1994
|
+
names.push(`classic-${chName}-${channelId.slice(-4)}`);
|
|
1995
|
+
}
|
|
1996
|
+
}
|
|
1997
|
+
}
|
|
1998
|
+
}
|
|
1999
|
+
catch { /* ignore */ }
|
|
2000
|
+
return names;
|
|
2001
|
+
}
|
|
1991
2002
|
async function lsAction(opts) {
|
|
1992
2003
|
const yaml = (await import("js-yaml")).default;
|
|
1993
2004
|
const config = yaml.load(readFileSync(FLEET_CONFIG_PATH, "utf-8"));
|
|
1994
2005
|
const names = Object.keys(config.instances);
|
|
2006
|
+
// --names-only feeds shell completion, so it must return before any tmux or
|
|
2007
|
+
// status work (a tab press should not wait on the fleet) and must print
|
|
2008
|
+
// nothing but names — a "no instances" notice would become a candidate.
|
|
2009
|
+
if (opts.namesOnly) {
|
|
2010
|
+
for (const n of await listInstanceNames(config))
|
|
2011
|
+
console.log(n);
|
|
2012
|
+
return;
|
|
2013
|
+
}
|
|
1995
2014
|
// Load classic channels from classicBot.yaml (keyed by channelId)
|
|
1996
2015
|
const classicPath = join(DATA_DIR, "classicBot.yaml");
|
|
1997
2016
|
let classicConfig = null;
|
|
@@ -2277,12 +2296,38 @@ program
|
|
|
2277
2296
|
.command("ls")
|
|
2278
2297
|
.description("List all instances with status, backend, team, and last activity")
|
|
2279
2298
|
.option("--json", "Output as JSON")
|
|
2299
|
+
.option("--names-only", "Print instance names one per line (for shell completion)")
|
|
2280
2300
|
.action(async (opts) => {
|
|
2281
2301
|
await lsAction(opts);
|
|
2282
2302
|
});
|
|
2283
2303
|
program
|
|
2284
|
-
.command("
|
|
2285
|
-
.description("
|
|
2304
|
+
.command("completion")
|
|
2305
|
+
.description("Print a shell completion script (bash or zsh)")
|
|
2306
|
+
.argument("<shell>", `Shell to generate for (${COMPLETION_SHELLS.join(", ")})`)
|
|
2307
|
+
.addHelpText("after", `
|
|
2308
|
+
Install:
|
|
2309
|
+
bash echo 'eval "$(agend completion bash)"' >> ~/.bashrc
|
|
2310
|
+
zsh echo 'eval "$(agend completion zsh)"' >> ~/.zshrc
|
|
2311
|
+
|
|
2312
|
+
Then reload the shell. Tab-completes instance names for \`agend attach\` and
|
|
2313
|
+
\`agend fleet start|stop|restart\`, and subcommands elsewhere.`)
|
|
2314
|
+
.action((shell) => {
|
|
2315
|
+
if (!COMPLETION_SHELLS.includes(shell)) {
|
|
2316
|
+
console.error(`Unsupported shell: ${shell}. Supported: ${COMPLETION_SHELLS.join(", ")}`);
|
|
2317
|
+
process.exit(2);
|
|
2318
|
+
}
|
|
2319
|
+
// Subcommand names come from commander itself, so the script can't drift
|
|
2320
|
+
// out of sync with the CLI the way a hardcoded list would.
|
|
2321
|
+
const fleetCmd = program.commands.find(c => c.name() === "fleet");
|
|
2322
|
+
console.log(completionScript(shell, {
|
|
2323
|
+
topLevel: program.commands.map(c => c.name()),
|
|
2324
|
+
fleetSub: fleetCmd?.commands.map(c => c.name()) ?? [],
|
|
2325
|
+
instanceCommands: ["attach"],
|
|
2326
|
+
fleetInstanceCommands: ["start", "stop", "restart"],
|
|
2327
|
+
}));
|
|
2328
|
+
});
|
|
2329
|
+
program
|
|
2330
|
+
.command("health").description("Fleet health check — shows problems and diagnostics")
|
|
2286
2331
|
.option("--json", "Output as JSON")
|
|
2287
2332
|
.option("-q, --quiet", "One-line summary only")
|
|
2288
2333
|
.action(async (opts) => {
|