@songsid/agend 2.1.2-beta.2 → 2.1.2-beta.21
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/access-path.js +15 -6
- package/dist/access-path.js.map +1 -1
- package/dist/agent-endpoint.d.ts +2 -0
- package/dist/agent-endpoint.js +17 -1
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/backend/antigravity.d.ts +18 -0
- package/dist/backend/antigravity.js +32 -3
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.d.ts +37 -0
- package/dist/backend/claude-code.js +43 -1
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex.d.ts +1 -0
- package/dist/backend/codex.js +25 -0
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/grok.d.ts +23 -0
- package/dist/backend/grok.js +45 -0
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro.d.ts +20 -0
- package/dist/backend/kiro.js +77 -2
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/types.d.ts +34 -0
- package/dist/backend/types.js +1 -1
- package/dist/backend/types.js.map +1 -1
- package/dist/channel/adapters/discord.d.ts +15 -0
- package/dist/channel/adapters/discord.js +91 -2
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +21 -0
- package/dist/channel/adapters/telegram.js +82 -0
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/ipc-bridge.d.ts +17 -1
- package/dist/channel/ipc-bridge.js +53 -17
- package/dist/channel/ipc-bridge.js.map +1 -1
- package/dist/channel/ipc-timeouts.d.ts +46 -0
- package/dist/channel/ipc-timeouts.js +65 -0
- package/dist/channel/ipc-timeouts.js.map +1 -0
- package/dist/channel/mcp-server.js +30 -14
- package/dist/channel/mcp-server.js.map +1 -1
- package/dist/channel/mcp-tools.js +28 -1
- package/dist/channel/mcp-tools.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/channel/types.d.ts +29 -0
- package/dist/classic-channel-manager.js +1 -5
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +132 -52
- 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/cost-guard.d.ts +3 -1
- package/dist/cost-guard.js +3 -1
- package/dist/cost-guard.js.map +1 -1
- package/dist/daemon.d.ts +219 -13
- package/dist/daemon.js +919 -303
- package/dist/daemon.js.map +1 -1
- package/dist/event-log.d.ts +31 -0
- package/dist/event-log.js +96 -0
- package/dist/event-log.js.map +1 -1
- package/dist/fleet-manager.d.ts +238 -2
- package/dist/fleet-manager.js +1008 -90
- 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/hang-detector.d.ts +19 -13
- package/dist/hang-detector.js +19 -49
- package/dist/hang-detector.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +13 -1
- package/dist/instance-lifecycle.js +84 -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/locale.js +2 -1
- package/dist/locale.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 +16 -0
- package/dist/outbound-handlers.js +121 -27
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +8 -3
- package/dist/outbound-schemas.js +13 -2
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/pane-write-lock.d.ts +48 -0
- package/dist/pane-write-lock.js +73 -0
- package/dist/pane-write-lock.js.map +1 -0
- package/dist/process-memory.d.ts +31 -0
- package/dist/process-memory.js +79 -0
- package/dist/process-memory.js.map +1 -0
- package/dist/quickstart.js +17 -16
- package/dist/quickstart.js.map +1 -1
- package/dist/reply-dedup.d.ts +41 -0
- package/dist/reply-dedup.js +0 -0
- package/dist/reply-dedup.js.map +1 -0
- package/dist/scheduler/db.js +3 -0
- package/dist/scheduler/db.js.map +1 -1
- package/dist/sd-notify.d.ts +27 -0
- package/dist/sd-notify.js +33 -1
- package/dist/sd-notify.js.map +1 -1
- package/dist/secret-file.d.ts +33 -0
- package/dist/secret-file.js +36 -0
- package/dist/secret-file.js.map +1 -0
- package/dist/setup-wizard.js +9 -7
- package/dist/setup-wizard.js.map +1 -1
- package/dist/tmux-control.d.ts +58 -5
- package/dist/tmux-control.js +102 -14
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-manager.d.ts +31 -1
- package/dist/tmux-manager.js +40 -11
- package/dist/tmux-manager.js.map +1 -1
- package/dist/topic-commands.d.ts +50 -10
- package/dist/topic-commands.js +242 -106
- 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 +123 -2
- package/dist/usage/format-rich.d.ts +11 -0
- package/dist/usage/format-rich.js +108 -0
- package/dist/usage/format-rich.js.map +1 -0
- package/dist/usage/providers.d.ts +97 -0
- package/dist/usage/providers.js +834 -0
- package/dist/usage/providers.js.map +1 -0
- package/dist/usage/usage-api.d.ts +50 -0
- package/dist/usage/usage-api.js +111 -0
- package/dist/usage/usage-api.js.map +1 -0
- package/dist/view-api.d.ts +3 -0
- package/dist/view-api.js +11 -2
- package/dist/view-api.js.map +1 -1
- package/dist/web-api.js +5 -2
- package/dist/web-api.js.map +1 -1
- package/package.json +4 -1
- package/dist/channel/tool-tracker.d.ts +0 -13
- package/dist/channel/tool-tracker.js +0 -58
- package/dist/channel/tool-tracker.js.map +0 -1
- package/dist/daemon-entry.d.ts +0 -1
- package/dist/daemon-entry.js +0 -30
- package/dist/daemon-entry.js.map +0 -1
package/dist/tmux-manager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tmux-manager.js","sourceRoot":"","sources":["../src/tmux-manager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tmux-manager.js","sourceRoot":"","sources":["../src/tmux-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/topic-commands.d.ts
CHANGED
|
@@ -20,20 +20,12 @@ export declare function parsePauseWakeCommand(text: string): {
|
|
|
20
20
|
action: "pause" | "wake";
|
|
21
21
|
instance?: string;
|
|
22
22
|
} | null;
|
|
23
|
-
/**
|
|
24
|
-
* The in-session compact/context-reset command for a backend NAME (the fleet
|
|
25
|
-
* process routes /compact via IPC and only has the backend string, not a
|
|
26
|
-
* CliBackend instance). Keep in sync with each backend's getCompactCommand().
|
|
27
|
-
* Most CLIs (claude-code, kiro-cli, codex, opencode, gemini-cli) use "/compact".
|
|
28
|
-
* Antigravity (agy) has NO summarizing compact — its only manual context-reset
|
|
29
|
-
* is "/clear" (a full reset; it also auto-summarizes at a token threshold).
|
|
30
|
-
*/
|
|
31
23
|
export declare function compactCommandForBackend(backend: string): string;
|
|
32
24
|
/**
|
|
33
25
|
* Extract context-usage % from a captured CLI pane. Scans bottom-up so the
|
|
34
26
|
* MOST RECENT prompt wins (a captured scrollback may hold several). Covers the
|
|
35
27
|
* common CLI prompt formats:
|
|
36
|
-
* kiro-cli classic: "6% !>" kiro-cli TUI: "◔ 6%"
|
|
28
|
+
* kiro-cli classic: "6% !>" kiro-cli TUI: "◔ 6%" (any pie glyph)
|
|
37
29
|
* bracketed: "[6%]" claude/others prompt: "6% ❯" / "6% >"
|
|
38
30
|
* codex TUI footer: "Context 94% left" (remaining) or "Context 6% used"
|
|
39
31
|
* opencode footer: "1.2K (6%)" (token count then parenthesized %)
|
|
@@ -50,6 +42,38 @@ export interface TokenContextRatio {
|
|
|
50
42
|
export declare function parseTokenContextRatio(pane: string): TokenContextRatio | null;
|
|
51
43
|
export declare function formatContextUsageLine(context: number, tokenRatio?: TokenContextRatio | null): string;
|
|
52
44
|
export declare function parseContextPercent(pane: string): number | null;
|
|
45
|
+
/** Claude Code statusline.json context used % (null if missing / unreadable). */
|
|
46
|
+
export declare function readStatuslineContextPct(dataDir: string, instanceName: string): number | null;
|
|
47
|
+
/** Live-pane scrape used by /ctx, /status Ctx, and /view sidebar. */
|
|
48
|
+
export declare function scrapePaneContext(instanceName: string, backend: string): {
|
|
49
|
+
context: number | null;
|
|
50
|
+
tokenRatio: TokenContextRatio | null;
|
|
51
|
+
};
|
|
52
|
+
/** Forget a deleted instance's cached context so the map can't grow forever. */
|
|
53
|
+
export declare function forgetInstanceContext(instanceName: string): void;
|
|
54
|
+
/**
|
|
55
|
+
* Single source of truth for instance context % across /ctx, /status, and View.
|
|
56
|
+
* Claude-code prefers statusline.json (authoritative, no TUI scrape); everyone
|
|
57
|
+
* else scrapes the live pane with the same parsers /ctx uses.
|
|
58
|
+
*
|
|
59
|
+
* Non-blocking by default (stale-while-revalidate): a fresh cache entry is
|
|
60
|
+
* returned as-is; a stale or missing one is returned immediately anyway while a
|
|
61
|
+
* background refresh runs. This used to scrape synchronously with `execFileSync`
|
|
62
|
+
* (2s timeout) on a cache miss, and the 12s TTL is LONGER than the dashboard's
|
|
63
|
+
* 10s poll — so roughly every other tick did N blocking captures. With ten
|
|
64
|
+
* non-claude-code instances and a slow tmux that froze the entire fleet event
|
|
65
|
+
* loop for up to 20s per tick: no IPC, no message delivery, no watchdog ping.
|
|
66
|
+
* Three open browser tabs ran three independent polls.
|
|
67
|
+
*
|
|
68
|
+
* Pass `bypassCache` for a synchronous, authoritative read — used by `/ctx`,
|
|
69
|
+
* where a user is asking right now and 2s of blocking is the correct trade.
|
|
70
|
+
*/
|
|
71
|
+
export declare function resolveInstanceContext(dataDir: string, instanceName: string, backend: string, opts?: {
|
|
72
|
+
bypassCache?: boolean;
|
|
73
|
+
}): {
|
|
74
|
+
context: number | null;
|
|
75
|
+
tokenRatio: TokenContextRatio | null;
|
|
76
|
+
};
|
|
53
77
|
export declare class TopicCommands {
|
|
54
78
|
private ctx;
|
|
55
79
|
constructor(ctx: ExecutionFleetContext);
|
|
@@ -74,6 +98,8 @@ export declare class TopicCommands {
|
|
|
74
98
|
/** Handle /ctx or /compact in any instance topic — returns true if handled */
|
|
75
99
|
handleInstanceCommand(msg: InboundMessage, instanceName: string): Promise<boolean>;
|
|
76
100
|
runPauseWake(instanceName: string, action: "pause" | "wake"): Promise<string>;
|
|
101
|
+
/** Resolve the effective backend name for fleet or classic instances. */
|
|
102
|
+
private effectiveBackend;
|
|
77
103
|
/** Get context usage text for an instance (shared by TG + DC) */
|
|
78
104
|
getCtxText(instanceName: string): Promise<string>;
|
|
79
105
|
/** Send the backend-appropriate compact command to an instance's tmux pane */
|
|
@@ -81,6 +107,13 @@ export declare class TopicCommands {
|
|
|
81
107
|
/** Send a backend-appropriate session-save command to a fleet-topic instance. */
|
|
82
108
|
sendSave(instanceName: string, filename: string): Promise<string>;
|
|
83
109
|
private handleRestartCommand;
|
|
110
|
+
/**
|
|
111
|
+
* `/usage` — AI subscription usage for every CLI backend logged in on this
|
|
112
|
+
* machine, one compact message. Same permission level as /ctx (none): whoever
|
|
113
|
+
* can talk to the fleet may see how much headroom it has left. Vendor rate
|
|
114
|
+
* limits are protected by the shared 5-minute cache, not by gating callers.
|
|
115
|
+
*/
|
|
116
|
+
private handleUsageCommand;
|
|
84
117
|
private handleStatusCommand;
|
|
85
118
|
/** Compact label for status/sysinfo tables: prefer display_name, else strip the
|
|
86
119
|
* `-t<topicId>` suffix (e.g. doupo-server-t1503381916525793300 → doupo-server).
|
|
@@ -90,7 +123,14 @@ export declare class TopicCommands {
|
|
|
90
123
|
/** Get fleet status as markdown text (shared by TG + DC) */
|
|
91
124
|
getStatusText(): Promise<string>;
|
|
92
125
|
private handleSysInfoCommand;
|
|
93
|
-
/**
|
|
126
|
+
/**
|
|
127
|
+
* Get system info as markdown text (shared by TG + DC).
|
|
128
|
+
*
|
|
129
|
+
* System-level only. The per-instance table (state/IPC/cost) moved to /status,
|
|
130
|
+
* which was already the fleet-per-instance view — the two tables overlapped on
|
|
131
|
+
* everything but the IPC column, and each command answered half of "is the
|
|
132
|
+
* machine fine and are the instances fine".
|
|
133
|
+
*/
|
|
94
134
|
getSysInfoText(): string;
|
|
95
135
|
private handleUpdateCommand;
|
|
96
136
|
private handleDoctorCommand;
|
package/dist/topic-commands.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { readFileSync, existsSync } from "node:fs";
|
|
2
|
-
import { exec } from "node:child_process";
|
|
2
|
+
import { exec, execFileSync } from "node:child_process";
|
|
3
3
|
import { promisify } from "node:util";
|
|
4
4
|
import { join, basename } from "node:path";
|
|
5
|
+
import { release } from "node:os";
|
|
5
6
|
import { createRequire } from "node:module";
|
|
6
7
|
const execAsync = promisify(exec);
|
|
7
8
|
import { DEFAULT_INSTANCE_CONFIG } from "./config.js";
|
|
8
9
|
import { formatCents } from "./cost-guard.js";
|
|
9
|
-
import { getAgendHome } from "./paths.js";
|
|
10
|
+
import { getAgendHome, getTmuxSocketName, getTmuxSessionName } from "./paths.js";
|
|
10
11
|
import { t } from "./locale.js";
|
|
12
|
+
import { PIE_PERCENT_RE } from "./tui-glyphs.js";
|
|
11
13
|
/** Sanitize a directory name into a valid instance name. Keeps Unicode letters (incl. CJK). */
|
|
12
14
|
export function sanitizeInstanceName(name) {
|
|
13
15
|
const sanitized = name.toLowerCase().replace(/[^\p{L}\d-]/gu, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
|
|
@@ -47,6 +49,32 @@ export function parsePauseWakeCommand(text) {
|
|
|
47
49
|
* Antigravity (agy) has NO summarizing compact — its only manual context-reset
|
|
48
50
|
* is "/clear" (a full reset; it also auto-summarizes at a token threshold).
|
|
49
51
|
*/
|
|
52
|
+
/** os.release(), guarded — purely informational, must never break /sysinfo. */
|
|
53
|
+
function osRelease() {
|
|
54
|
+
try {
|
|
55
|
+
return release();
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return "?";
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* `tmux -V`, memoised. One short synchronous exec for the lifetime of the
|
|
63
|
+
* process — /sysinfo is on-demand and rare, and the version cannot change under
|
|
64
|
+
* a running fleet (the server would have to restart with it).
|
|
65
|
+
*/
|
|
66
|
+
let cachedTmuxVersion = null;
|
|
67
|
+
function tmuxVersion() {
|
|
68
|
+
if (cachedTmuxVersion === null) {
|
|
69
|
+
try {
|
|
70
|
+
cachedTmuxVersion = execFileSync("tmux", ["-V"], { encoding: "utf-8", timeout: 3000 }).trim();
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
cachedTmuxVersion = "not found";
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return cachedTmuxVersion;
|
|
77
|
+
}
|
|
50
78
|
export function compactCommandForBackend(backend) {
|
|
51
79
|
if (backend === "antigravity")
|
|
52
80
|
return "/clear";
|
|
@@ -91,7 +119,7 @@ export function parseContextPercent(pane) {
|
|
|
91
119
|
if (ratio)
|
|
92
120
|
return ratio.percentage;
|
|
93
121
|
const m = line.match(/(\d+)%.*[!❯>]/)
|
|
94
|
-
|| line.match(
|
|
122
|
+
|| line.match(PIE_PERCENT_RE)
|
|
95
123
|
|| line.match(/\[(\d+)%\]/)
|
|
96
124
|
|| line.match(/Context\s+(\d+)%\s+used/i) // codex "context-used" variant
|
|
97
125
|
|| line.match(/\d+(?:\.\d+)?[KM]?\s*\((\d+)%\)/); // opencode "1.2K (6%)"
|
|
@@ -100,6 +128,115 @@ export function parseContextPercent(pane) {
|
|
|
100
128
|
}
|
|
101
129
|
return null;
|
|
102
130
|
}
|
|
131
|
+
/** Claude Code statusline.json context used % (null if missing / unreadable). */
|
|
132
|
+
export function readStatuslineContextPct(dataDir, instanceName) {
|
|
133
|
+
try {
|
|
134
|
+
const statusFile = join(dataDir, "instances", instanceName, "statusline.json");
|
|
135
|
+
if (!existsSync(statusFile))
|
|
136
|
+
return null;
|
|
137
|
+
const data = JSON.parse(readFileSync(statusFile, "utf-8"));
|
|
138
|
+
const pct = data.context_window?.used_percentage;
|
|
139
|
+
return typeof pct === "number" && Number.isFinite(pct) ? pct : null;
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** Live-pane scrape used by /ctx, /status Ctx, and /view sidebar. */
|
|
146
|
+
export function scrapePaneContext(instanceName, backend) {
|
|
147
|
+
try {
|
|
148
|
+
const socketName = getTmuxSocketName();
|
|
149
|
+
// Scrollback (-S -60) so a recent footer/statusline is kept even mid-output.
|
|
150
|
+
const baseArgs = ["capture-pane", "-t", `${getTmuxSessionName()}:${instanceName}`, "-p", "-S", "-60"];
|
|
151
|
+
const tmuxArgs = socketName ? ["-L", socketName, ...baseArgs] : baseArgs;
|
|
152
|
+
const pane = execFileSync("tmux", tmuxArgs, {
|
|
153
|
+
encoding: "utf-8",
|
|
154
|
+
timeout: 2000,
|
|
155
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
156
|
+
});
|
|
157
|
+
const tokenRatio = backend === "grok" ? parseTokenContextRatio(pane) : null;
|
|
158
|
+
const context = tokenRatio?.percentage ?? parseContextPercent(pane);
|
|
159
|
+
return { context, tokenRatio };
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return { context: null, tokenRatio: null };
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const paneContextCache = new Map();
|
|
166
|
+
// Below the dashboard's 10s SSE tick on purpose: at the previous 12s the cache was
|
|
167
|
+
// guaranteed to be stale on roughly every other tick, which is what made the
|
|
168
|
+
// blocking scrape fire so often. Now a tick either hits the cache or triggers a
|
|
169
|
+
// background refresh, never a synchronous capture.
|
|
170
|
+
const PANE_CONTEXT_CACHE_MS = 8_000;
|
|
171
|
+
/** Instances with a background scrape in flight, so polls don't pile up captures. */
|
|
172
|
+
const paneScrapeInFlight = new Set();
|
|
173
|
+
/** Async twin of scrapePaneContext — same parsers, no blocking. */
|
|
174
|
+
async function scrapePaneContextAsync(instanceName, backend) {
|
|
175
|
+
try {
|
|
176
|
+
const socketName = getTmuxSocketName();
|
|
177
|
+
const baseArgs = ["capture-pane", "-t", `${getTmuxSessionName()}:${instanceName}`, "-p", "-S", "-60"];
|
|
178
|
+
const tmuxArgs = socketName ? ["-L", socketName, ...baseArgs] : baseArgs;
|
|
179
|
+
const { promisify } = await import("node:util");
|
|
180
|
+
const { execFile } = await import("node:child_process");
|
|
181
|
+
const { stdout } = await promisify(execFile)("tmux", tmuxArgs, { encoding: "utf-8", timeout: 2000 });
|
|
182
|
+
const pane = stdout.toString();
|
|
183
|
+
const tokenRatio = backend === "grok" ? parseTokenContextRatio(pane) : null;
|
|
184
|
+
return { context: tokenRatio?.percentage ?? parseContextPercent(pane), tokenRatio };
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return { context: null, tokenRatio: null };
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/** Refresh one instance's cached context in the background (deduped per instance). */
|
|
191
|
+
function refreshPaneContext(instanceName, backend) {
|
|
192
|
+
if (paneScrapeInFlight.has(instanceName))
|
|
193
|
+
return;
|
|
194
|
+
paneScrapeInFlight.add(instanceName);
|
|
195
|
+
void scrapePaneContextAsync(instanceName, backend)
|
|
196
|
+
.then(scraped => { paneContextCache.set(instanceName, { at: Date.now(), ...scraped }); })
|
|
197
|
+
.finally(() => { paneScrapeInFlight.delete(instanceName); });
|
|
198
|
+
}
|
|
199
|
+
/** Forget a deleted instance's cached context so the map can't grow forever. */
|
|
200
|
+
export function forgetInstanceContext(instanceName) {
|
|
201
|
+
paneContextCache.delete(instanceName);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Single source of truth for instance context % across /ctx, /status, and View.
|
|
205
|
+
* Claude-code prefers statusline.json (authoritative, no TUI scrape); everyone
|
|
206
|
+
* else scrapes the live pane with the same parsers /ctx uses.
|
|
207
|
+
*
|
|
208
|
+
* Non-blocking by default (stale-while-revalidate): a fresh cache entry is
|
|
209
|
+
* returned as-is; a stale or missing one is returned immediately anyway while a
|
|
210
|
+
* background refresh runs. This used to scrape synchronously with `execFileSync`
|
|
211
|
+
* (2s timeout) on a cache miss, and the 12s TTL is LONGER than the dashboard's
|
|
212
|
+
* 10s poll — so roughly every other tick did N blocking captures. With ten
|
|
213
|
+
* non-claude-code instances and a slow tmux that froze the entire fleet event
|
|
214
|
+
* loop for up to 20s per tick: no IPC, no message delivery, no watchdog ping.
|
|
215
|
+
* Three open browser tabs ran three independent polls.
|
|
216
|
+
*
|
|
217
|
+
* Pass `bypassCache` for a synchronous, authoritative read — used by `/ctx`,
|
|
218
|
+
* where a user is asking right now and 2s of blocking is the correct trade.
|
|
219
|
+
*/
|
|
220
|
+
export function resolveInstanceContext(dataDir, instanceName, backend, opts) {
|
|
221
|
+
if (backend === "claude-code") {
|
|
222
|
+
const fromFile = readStatuslineContextPct(dataDir, instanceName);
|
|
223
|
+
if (fromFile != null)
|
|
224
|
+
return { context: fromFile, tokenRatio: null };
|
|
225
|
+
}
|
|
226
|
+
if (opts?.bypassCache) {
|
|
227
|
+
const scraped = scrapePaneContext(instanceName, backend);
|
|
228
|
+
paneContextCache.set(instanceName, { at: Date.now(), ...scraped });
|
|
229
|
+
return scraped;
|
|
230
|
+
}
|
|
231
|
+
const hit = paneContextCache.get(instanceName);
|
|
232
|
+
if (hit && Date.now() - hit.at < PANE_CONTEXT_CACHE_MS) {
|
|
233
|
+
return { context: hit.context, tokenRatio: hit.tokenRatio };
|
|
234
|
+
}
|
|
235
|
+
// Stale or absent: kick off the refresh and answer with what we have. A brand-new
|
|
236
|
+
// instance reads as "no data" for one tick rather than blocking the fleet.
|
|
237
|
+
refreshPaneContext(instanceName, backend);
|
|
238
|
+
return hit ? { context: hit.context, tokenRatio: hit.tokenRatio } : { context: null, tokenRatio: null };
|
|
239
|
+
}
|
|
103
240
|
export class TopicCommands {
|
|
104
241
|
ctx;
|
|
105
242
|
constructor(ctx) {
|
|
@@ -134,6 +271,10 @@ export class TopicCommands {
|
|
|
134
271
|
await this.handleDoctorCommand(msg);
|
|
135
272
|
return true;
|
|
136
273
|
}
|
|
274
|
+
if (text === "/usage" || text.startsWith("/usage@")) {
|
|
275
|
+
await this.handleUsageCommand(msg);
|
|
276
|
+
return true;
|
|
277
|
+
}
|
|
137
278
|
if (text === "/update" || text.startsWith("/update@")) {
|
|
138
279
|
await this.handleUpdateCommand(msg);
|
|
139
280
|
return true;
|
|
@@ -306,50 +447,22 @@ export class TopicCommands {
|
|
|
306
447
|
return t(`${action}.failed`, instanceName, err.message);
|
|
307
448
|
}
|
|
308
449
|
}
|
|
309
|
-
/**
|
|
310
|
-
|
|
311
|
-
// Classic instances live in classicBot.yaml, not fleet.yaml → consult the
|
|
312
|
-
// classic channel manager for those so we don't mis-report defaults.backend.
|
|
313
|
-
// getBackendByInstance always returns a string (its own fallback), so only
|
|
314
|
-
// use it when the instance is ACTUALLY classic — otherwise a fleet instance
|
|
315
|
-
// that inherits its backend would wrongly pick up the classic default.
|
|
450
|
+
/** Resolve the effective backend name for fleet or classic instances. */
|
|
451
|
+
effectiveBackend(instanceName) {
|
|
316
452
|
const classicBackend = this.ctx.classicChannels?.getChannelIdByInstance(instanceName)
|
|
317
|
-
? this.ctx.classicChannels.getBackendByInstance(instanceName)
|
|
453
|
+
? this.ctx.classicChannels.getBackendByInstance(instanceName, this.ctx.fleetConfig?.defaults?.backend)
|
|
318
454
|
: undefined;
|
|
319
|
-
|
|
455
|
+
return this.ctx.fleetConfig?.instances[instanceName]?.backend
|
|
320
456
|
?? classicBackend
|
|
321
457
|
?? this.ctx.fleetConfig?.defaults?.backend ?? "claude-code";
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
//
|
|
326
|
-
//
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
if (existsSync(statusFile)) {
|
|
331
|
-
const d = JSON.parse(readFileSync(statusFile, "utf-8"));
|
|
332
|
-
context = d.context_window?.used_percentage ?? null;
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
catch { /* ignore */ }
|
|
336
|
-
}
|
|
337
|
-
if (context == null) {
|
|
338
|
-
try {
|
|
339
|
-
const { execFileSync } = await import("node:child_process");
|
|
340
|
-
const { getTmuxSocketName, getTmuxSessionName } = await import("./paths.js");
|
|
341
|
-
const socketName = getTmuxSocketName();
|
|
342
|
-
// Include scrollback (-S -60) so a recent prompt is captured even when
|
|
343
|
-
// the CLI is mid-output and the bottom of the visible pane has no prompt.
|
|
344
|
-
const baseArgs = ["capture-pane", "-t", `${getTmuxSessionName()}:${instanceName}`, "-p", "-S", "-60"];
|
|
345
|
-
const tmuxArgs = socketName ? ["-L", socketName, ...baseArgs] : baseArgs;
|
|
346
|
-
const pane = execFileSync("tmux", tmuxArgs, { encoding: "utf-8", timeout: 2000, stdio: ["pipe", "pipe", "pipe"] });
|
|
347
|
-
if (backend === "grok")
|
|
348
|
-
tokenRatio = parseTokenContextRatio(pane);
|
|
349
|
-
context = tokenRatio?.percentage ?? parseContextPercent(pane);
|
|
350
|
-
}
|
|
351
|
-
catch { /* ignore */ }
|
|
352
|
-
}
|
|
458
|
+
}
|
|
459
|
+
/** Get context usage text for an instance (shared by TG + DC) */
|
|
460
|
+
async getCtxText(instanceName) {
|
|
461
|
+
// Classic instances live in classicBot.yaml, not fleet.yaml → consult the
|
|
462
|
+
// classic channel manager for those so we don't mis-report defaults.backend.
|
|
463
|
+
const backend = this.effectiveBackend(instanceName);
|
|
464
|
+
// Fresh scrape for /ctx (user is asking right now) — bypass short cache.
|
|
465
|
+
const { context, tokenRatio } = resolveInstanceContext(this.ctx.dataDir, instanceName, backend, { bypassCache: true });
|
|
353
466
|
const contextLine = context == null ? null : formatContextUsageLine(context, tokenRatio);
|
|
354
467
|
// Effective model (resolves per-instance → fleet default → classic channel →
|
|
355
468
|
// the CLI's own default) via the shared resolver, so /ctx and /model agree.
|
|
@@ -363,7 +476,11 @@ export class TopicCommands {
|
|
|
363
476
|
async sendCompact(instanceName) {
|
|
364
477
|
const ipc = this.ctx.instanceIpcClients.get(instanceName);
|
|
365
478
|
if (ipc?.connected) {
|
|
479
|
+
const classicBackend = this.ctx.classicChannels?.getChannelIdByInstance(instanceName)
|
|
480
|
+
? this.ctx.classicChannels.getBackendByInstance(instanceName, this.ctx.fleetConfig?.defaults?.backend)
|
|
481
|
+
: undefined;
|
|
366
482
|
const backend = this.ctx.fleetConfig?.instances[instanceName]?.backend
|
|
483
|
+
?? classicBackend
|
|
367
484
|
?? this.ctx.fleetConfig?.defaults?.backend ?? "claude-code";
|
|
368
485
|
const cmd = compactCommandForBackend(backend);
|
|
369
486
|
ipc.send({ type: "raw_paste", content: cmd });
|
|
@@ -373,7 +490,11 @@ export class TopicCommands {
|
|
|
373
490
|
}
|
|
374
491
|
/** Send a backend-appropriate session-save command to a fleet-topic instance. */
|
|
375
492
|
async sendSave(instanceName, filename) {
|
|
493
|
+
const classicBackend = this.ctx.classicChannels?.getChannelIdByInstance(instanceName)
|
|
494
|
+
? this.ctx.classicChannels.getBackendByInstance(instanceName, this.ctx.fleetConfig?.defaults?.backend)
|
|
495
|
+
: undefined;
|
|
376
496
|
const backend = this.ctx.fleetConfig?.instances[instanceName]?.backend
|
|
497
|
+
?? classicBackend
|
|
377
498
|
?? this.ctx.fleetConfig?.defaults?.backend ?? "claude-code";
|
|
378
499
|
const cmd = saveCommandForBackend(backend, filename);
|
|
379
500
|
if (!cmd)
|
|
@@ -399,10 +520,44 @@ export class TopicCommands {
|
|
|
399
520
|
await adapter.sendText(chatId, t("restart.graceful"), { threadId });
|
|
400
521
|
process.kill(process.pid, "SIGUSR2");
|
|
401
522
|
}
|
|
523
|
+
/**
|
|
524
|
+
* `/usage` — AI subscription usage for every CLI backend logged in on this
|
|
525
|
+
* machine, one compact message. Same permission level as /ctx (none): whoever
|
|
526
|
+
* can talk to the fleet may see how much headroom it has left. Vendor rate
|
|
527
|
+
* limits are protected by the shared 5-minute cache, not by gating callers.
|
|
528
|
+
*/
|
|
529
|
+
async handleUsageCommand(msg) {
|
|
530
|
+
const adapter = this.getReplyAdapter(msg);
|
|
531
|
+
if (!adapter)
|
|
532
|
+
return;
|
|
533
|
+
try {
|
|
534
|
+
const { getUsageSnapshot } = await import("./usage/usage-api.js");
|
|
535
|
+
const { renderUsageHtml, renderUsageMarkdown } = await import("./usage/format-rich.js");
|
|
536
|
+
const payload = await getUsageSnapshot();
|
|
537
|
+
// Each platform gets its native rich format: Telegram needs parse_mode
|
|
538
|
+
// HTML; Discord renders Markdown in plain content. Anything else falls back
|
|
539
|
+
// to Markdown, which degrades to readable text.
|
|
540
|
+
if (adapter.type === "telegram") {
|
|
541
|
+
await adapter.sendText(msg.chatId, renderUsageHtml(payload), { threadId: msg.threadId, format: "html" });
|
|
542
|
+
}
|
|
543
|
+
else {
|
|
544
|
+
await adapter.sendText(msg.chatId, renderUsageMarkdown(payload), { threadId: msg.threadId });
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
catch (err) {
|
|
548
|
+
await adapter.sendText(msg.chatId, `⚠️ Usage fetch failed: ${err.message}`, { threadId: msg.threadId });
|
|
549
|
+
}
|
|
550
|
+
}
|
|
402
551
|
async handleStatusCommand(msg) {
|
|
403
552
|
const adapter = this.getReplyAdapter(msg);
|
|
404
553
|
if (!adapter || !this.ctx.fleetConfig)
|
|
405
554
|
return;
|
|
555
|
+
// Admin-gated: with the /sysinfo instance table folded in, /status now shows
|
|
556
|
+
// the whole fleet's per-instance costs and IPC health in one message.
|
|
557
|
+
if (!this.ctx.isFleetAdmin(msg.userId, msg.adapterId)) {
|
|
558
|
+
await adapter.sendText(msg.chatId, t("cmd.admin_required", "/status"), { threadId: msg.threadId });
|
|
559
|
+
return;
|
|
560
|
+
}
|
|
406
561
|
const text = await this.getStatusText();
|
|
407
562
|
await adapter.sendText(msg.chatId, text, { threadId: msg.threadId });
|
|
408
563
|
}
|
|
@@ -437,18 +592,16 @@ export class TopicCommands {
|
|
|
437
592
|
const costPaused = this.ctx.costGuard?.isLimited(name);
|
|
438
593
|
if (status === "paused")
|
|
439
594
|
pausedCount++;
|
|
440
|
-
let contextStr = "-";
|
|
441
|
-
try {
|
|
442
|
-
const data = JSON.parse(readFileSync(join(this.ctx.dataDir, "instances", name, "statusline.json"), "utf-8"));
|
|
443
|
-
if (data.context_window?.used_percentage != null) {
|
|
444
|
-
contextStr = `${Math.round(data.context_window.used_percentage)}%`;
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
catch { /* file may not exist yet */ }
|
|
448
|
-
const costCents = this.ctx.costGuard?.getDailyCostCents(name) ?? 0;
|
|
449
595
|
const backend = classic
|
|
450
596
|
? this.ctx.classicChannels?.getBackendByInstance(name, this.ctx.fleetConfig.defaults?.backend) ?? "-"
|
|
451
597
|
: this.ctx.fleetConfig.instances[name]?.backend ?? this.ctx.fleetConfig.defaults?.backend ?? "-";
|
|
598
|
+
// Same source as /ctx (statusline for claude-code, pane scrape otherwise).
|
|
599
|
+
// Without this, kiro/grok/codex always showed "-" in the Ctx column.
|
|
600
|
+
const { context } = backend === "-"
|
|
601
|
+
? { context: null }
|
|
602
|
+
: resolveInstanceContext(this.ctx.dataDir, name, backend);
|
|
603
|
+
const contextStr = context == null ? "-" : `${Math.round(context)}%`;
|
|
604
|
+
const costCents = this.ctx.costGuard?.getDailyCostCents(name) ?? 0;
|
|
452
605
|
let icon;
|
|
453
606
|
if (costPaused || status === "paused")
|
|
454
607
|
icon = "⏸";
|
|
@@ -464,15 +617,18 @@ export class TopicCommands {
|
|
|
464
617
|
: executionState === "paused" ? "⏸ paused"
|
|
465
618
|
: "—";
|
|
466
619
|
const displayName = this.shortInstanceName(name);
|
|
467
|
-
|
|
620
|
+
// IPC reachability moved here from /sysinfo: it is per-instance health, and
|
|
621
|
+
// /status is now the one place that shows the fleet per instance.
|
|
622
|
+
const ipc = this.ctx.instanceIpcClients.has(name) ? "✓" : "✗";
|
|
623
|
+
rows.push(`| ${displayName} | ${backend} | ${contextStr} | ${formatCents(costCents)} | ${icon} | ${stateLabel} | ${ipc} |`);
|
|
468
624
|
}
|
|
469
625
|
if (rows.length === 0)
|
|
470
626
|
return "No instances configured.";
|
|
471
627
|
const lines = [
|
|
472
628
|
"## Fleet Status",
|
|
473
629
|
"",
|
|
474
|
-
"| Instance | Backend | Ctx | Cost | Status | State |",
|
|
475
|
-
"
|
|
630
|
+
"| Instance | Backend | Ctx | Cost | Status | State | IPC |",
|
|
631
|
+
"|----------|---------|-----|------|--------|-------|-----|",
|
|
476
632
|
...rows,
|
|
477
633
|
"",
|
|
478
634
|
`Paused instances: ${pausedCount}`,
|
|
@@ -503,63 +659,33 @@ export class TopicCommands {
|
|
|
503
659
|
const text = this.getSysInfoText();
|
|
504
660
|
await adapter.sendText(msg.chatId, text, { threadId: msg.threadId });
|
|
505
661
|
}
|
|
506
|
-
/**
|
|
662
|
+
/**
|
|
663
|
+
* Get system info as markdown text (shared by TG + DC).
|
|
664
|
+
*
|
|
665
|
+
* System-level only. The per-instance table (state/IPC/cost) moved to /status,
|
|
666
|
+
* which was already the fleet-per-instance view — the two tables overlapped on
|
|
667
|
+
* everything but the IPC column, and each command answered half of "is the
|
|
668
|
+
* machine fine and are the instances fine".
|
|
669
|
+
*/
|
|
507
670
|
getSysInfoText() {
|
|
508
671
|
const info = this.ctx.getSysInfo();
|
|
509
672
|
const upHours = Math.floor(info.uptime_seconds / 3600);
|
|
510
673
|
const upMins = Math.floor((info.uptime_seconds % 3600) / 60);
|
|
511
674
|
const require = createRequire(import.meta.url);
|
|
512
675
|
const agendVersion = require("../package.json").version ?? "unknown";
|
|
513
|
-
|
|
676
|
+
return [
|
|
514
677
|
"## System Info",
|
|
515
678
|
"",
|
|
516
679
|
"| Metric | Value |",
|
|
517
680
|
"|--------|-------|",
|
|
518
681
|
`| AgEnD | v${agendVersion} |`,
|
|
682
|
+
`| OS | ${process.platform} ${osRelease()} (${process.arch}) |`,
|
|
683
|
+
`| Node | ${process.version} |`,
|
|
684
|
+
`| tmux | ${tmuxVersion()} |`,
|
|
519
685
|
`| Uptime | ${upHours}h ${upMins}m |`,
|
|
520
686
|
`| Memory | ${info.memory_mb.rss} MB RSS |`,
|
|
521
687
|
`| Heap | ${info.memory_mb.heapUsed} / ${info.memory_mb.heapTotal} MB |`,
|
|
522
|
-
|
|
523
|
-
"## Instances",
|
|
524
|
-
"",
|
|
525
|
-
"| Name | State | IPC | Cost | Rate |",
|
|
526
|
-
"|------|-------|-----|------|------|",
|
|
527
|
-
];
|
|
528
|
-
const fleetNames = new Set(info.instances.map(inst => inst.name));
|
|
529
|
-
const classicInstances = (this.ctx.classicChannels?.getAll() ?? [])
|
|
530
|
-
.filter(ch => !fleetNames.has(ch.instanceName))
|
|
531
|
-
.map(ch => ({
|
|
532
|
-
name: ch.instanceName,
|
|
533
|
-
status: this.ctx.getInstanceStatus(ch.instanceName),
|
|
534
|
-
state: this.ctx.getInstanceExecutionState?.(ch.instanceName) ?? null,
|
|
535
|
-
ipc: this.ctx.instanceIpcClients.has(ch.instanceName),
|
|
536
|
-
costCents: this.ctx.costGuard?.getDailyCostCents(ch.instanceName) ?? 0,
|
|
537
|
-
rateLimits: null,
|
|
538
|
-
classic: true,
|
|
539
|
-
}));
|
|
540
|
-
const instances = [
|
|
541
|
-
...info.instances.map(inst => ({ ...inst, classic: false })),
|
|
542
|
-
...classicInstances,
|
|
543
|
-
];
|
|
544
|
-
for (const inst of instances) {
|
|
545
|
-
const executionState = inst.state;
|
|
546
|
-
const displayState = inst.status === "paused" ? "paused"
|
|
547
|
-
: inst.status === "stopped" || inst.status === "crashed" ? inst.status
|
|
548
|
-
: executionState ?? "running";
|
|
549
|
-
const icon = displayState === "idle" ? "🟢"
|
|
550
|
-
: displayState === "working" ? "🔵"
|
|
551
|
-
: displayState === "stuck" || displayState === "crashed" ? "🔴"
|
|
552
|
-
: displayState === "paused" ? "⏸"
|
|
553
|
-
: displayState === "stopped" ? "⚪" : "🟢";
|
|
554
|
-
const ipc = inst.ipc ? "✓" : "✗";
|
|
555
|
-
const rate = inst.rateLimits ? `5h:${inst.rateLimits.five_hour_pct}%` : "-";
|
|
556
|
-
const displayName = this.shortInstanceName(inst.name);
|
|
557
|
-
lines.push(`| ${icon} ${displayName} | ${displayState} | ${ipc} | ${formatCents(inst.costCents)} | ${rate} |`);
|
|
558
|
-
}
|
|
559
|
-
if (info.fleet_cost_limit_cents > 0) {
|
|
560
|
-
lines.push("", `Fleet cost: ${formatCents(info.fleet_cost_cents)} / ${formatCents(info.fleet_cost_limit_cents)} daily`);
|
|
561
|
-
}
|
|
562
|
-
return lines.join("\n");
|
|
688
|
+
].join("\n");
|
|
563
689
|
}
|
|
564
690
|
async handleUpdateCommand(msg) {
|
|
565
691
|
const adapter = this.getReplyAdapter(msg);
|
|
@@ -596,17 +722,26 @@ export class TopicCommands {
|
|
|
596
722
|
return;
|
|
597
723
|
}
|
|
598
724
|
await adapter.sendText(chatId, t("doctor.running"), { threadId });
|
|
725
|
+
// Async, and execFile rather than a shell string: as execSync this froze the
|
|
726
|
+
// whole fleet event loop for up to 30s — no IPC, no delivery, no WATCHDOG
|
|
727
|
+
// ping — and any allowlisted user could trigger it with /doctor.
|
|
728
|
+
const stripAnsi = (s) => s.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, "");
|
|
729
|
+
const backend = this.ctx.fleetConfig?.defaults?.backend || "claude-code";
|
|
730
|
+
let output;
|
|
599
731
|
try {
|
|
600
|
-
const {
|
|
601
|
-
const
|
|
602
|
-
const
|
|
603
|
-
|
|
604
|
-
|
|
732
|
+
const { execFile } = await import("node:child_process");
|
|
733
|
+
const { promisify } = await import("node:util");
|
|
734
|
+
const { stdout } = await promisify(execFile)("agend", ["backend", "doctor", backend], {
|
|
735
|
+
timeout: 30_000,
|
|
736
|
+
encoding: "utf-8",
|
|
737
|
+
});
|
|
738
|
+
output = stripAnsi(stdout) || "No output";
|
|
605
739
|
}
|
|
606
740
|
catch (err) {
|
|
607
|
-
const
|
|
608
|
-
|
|
741
|
+
const e = err;
|
|
742
|
+
output = stripAnsi(e.stdout ?? e.message ?? "Doctor failed");
|
|
609
743
|
}
|
|
744
|
+
await adapter.sendText(chatId, output, { threadId });
|
|
610
745
|
}
|
|
611
746
|
/** Reply with redirect when message arrives in an unbound topic */
|
|
612
747
|
async handleUnboundTopic(msg) {
|
|
@@ -725,7 +860,7 @@ export class TopicCommands {
|
|
|
725
860
|
headers: { "Content-Type": "application/json" },
|
|
726
861
|
body: JSON.stringify({
|
|
727
862
|
commands: [
|
|
728
|
-
{ command: "status", description: "
|
|
863
|
+
{ command: "status", description: "🔒 Fleet status, per-instance costs and health" },
|
|
729
864
|
{ command: "sysinfo", description: "System diagnostics" },
|
|
730
865
|
{ command: "dashboard", description: "🔒 Get dashboard URLs" },
|
|
731
866
|
{ command: "ctx", description: "Show context usage" },
|
|
@@ -737,6 +872,7 @@ export class TopicCommands {
|
|
|
737
872
|
{ command: "collab", description: "🔒 Toggle bot/webhook mode" },
|
|
738
873
|
{ command: "update", description: "🔒 Update AgEnD to latest" },
|
|
739
874
|
{ command: "doctor", description: "🔒 Run health diagnostics" },
|
|
875
|
+
{ command: "usage", description: "AI subscription usage" },
|
|
740
876
|
],
|
|
741
877
|
scope: { type: "chat", chat_id: ch.group_id },
|
|
742
878
|
}),
|