@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/instructions.js
CHANGED
|
@@ -2,10 +2,13 @@ import { readFileSync } from "node:fs";
|
|
|
2
2
|
import { dirname, join } from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
export function buildFleetInstructions(params) {
|
|
5
|
-
const { instanceName, workingDirectory, displayName, description, customPrompt } = params;
|
|
5
|
+
const { instanceName, workingDirectory, runtimeIdentity, displayName, description, customPrompt } = params;
|
|
6
6
|
const sections = [];
|
|
7
7
|
// ── Identity ──
|
|
8
8
|
sections.push(`# AgEnD Fleet Context\nYou are **${instanceName}**, an instance in an AgEnD fleet.\nYour working directory is \`${workingDirectory}\`.`);
|
|
9
|
+
if (runtimeIdentity) {
|
|
10
|
+
sections.push(`Runtime: kind=${runtimeIdentity.kind}, backend=${runtimeIdentity.backend}, model=${runtimeIdentity.model}.`);
|
|
11
|
+
}
|
|
9
12
|
if (displayName) {
|
|
10
13
|
sections.push(`Your display name is "${displayName}". Use this when introducing yourself.`);
|
|
11
14
|
}
|
|
@@ -27,16 +30,11 @@ export function buildFleetInstructions(params) {
|
|
|
27
30
|
"- `[user:name via platform, id:USER_ID]` — from a Telegram/Discord user → reply with the `reply` tool.",
|
|
28
31
|
"- `[from:instance-name]` — from another fleet instance → use `send_to_instance` or `report_result`, NOT the `reply` tool.",
|
|
29
32
|
"",
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"is visible to the operator.",
|
|
36
|
-
"",
|
|
37
|
-
"For cross-instance messages, put the response in `send_to_instance` or `report_result`.",
|
|
38
|
-
"After that tool succeeds, likewise end the turn with exactly `.`; if it fails, put",
|
|
39
|
-
"the failure in the final text so the operator can diagnose it.",
|
|
33
|
+
"A turn isn't finished until the channel has your conclusion — posted via `reply` (or",
|
|
34
|
+
"`send_to_instance` / `report_result` for another instance). That call is the last step of",
|
|
35
|
+
"the work, not your terminal text. Having nothing new to add is a valid outcome (see",
|
|
36
|
+
"Silence = agreement); having a conclusion you never posted is not. Once the tool returns,",
|
|
37
|
+
"close with a short line like `.` — some backends error on a turn with no text at all.",
|
|
40
38
|
"",
|
|
41
39
|
"## Mentioning Users & Bots",
|
|
42
40
|
"- Discord: `<@USER_ID>` (e.g. `<@368442276000694273>`). Extract the id from the `id:` field in the message header.",
|
package/dist/instructions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"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"}
|
package/dist/locale.js
CHANGED
|
@@ -83,11 +83,12 @@ const messages = {
|
|
|
83
83
|
"slash.save": "Save the agent's conversation",
|
|
84
84
|
"slash.load": "Load a saved conversation",
|
|
85
85
|
"slash.collab": "Toggle bot/webhook collaboration mode",
|
|
86
|
-
"slash.status": "
|
|
86
|
+
"slash.status": "Fleet status, per-instance costs and health (admin only)",
|
|
87
87
|
"slash.sysinfo": "System diagnostics",
|
|
88
88
|
"slash.restart": "Graceful restart all instances",
|
|
89
89
|
"slash.update": "Update AgEnD to latest version",
|
|
90
90
|
"slash.doctor": "Run health diagnostics",
|
|
91
|
+
"slash.usage": "AI subscription usage",
|
|
91
92
|
"chat.usage": "Usage: `/chat <message>`",
|
|
92
93
|
"filename.invalid": "⛔ Invalid filename — only letters, numbers, dots, hyphens, underscores allowed.",
|
|
93
94
|
"dashboard.disabled": "⛔ /dashboard disabled — no allowed_users configured",
|
package/dist/locale.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locale.js","sourceRoot":"","sources":["../src/locale.ts"],"names":[],"mappings":"AAQA,IAAI,OAAO,GAAW,IAAI,CAAC;AAC3B,MAAM,UAAU,SAAS,CAAC,CAAS,IAAU,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;AAC3D,MAAM,UAAU,SAAS,KAAa,OAAO,OAAO,CAAC,CAAC,CAAC;AAEvD,qDAAqD;AACrD,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,YAAY,CAAC,WAAgD;IAC3E,MAAM,GAAG,GAAG,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC;IAC1C,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,GAAG,CAAC;IAChD,OAAO,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAED,MAAM,QAAQ,GAA2C;IACvD,EAAE,EAAE;QACF,eAAe,EAAE,WAAW;QAC5B,aAAa,EAAE,wBAAwB;QACvC,oBAAoB,EAAE,oBAAoB;QAC1C,UAAU,EAAE,uBAAuB;QACnC,aAAa,EAAE,cAAc;QAC7B,WAAW,EAAE,YAAY;QACzB,cAAc,EAAE,eAAe;QAC/B,iBAAiB,EAAE,iCAAiC;QACpD,wBAAwB,EAAE,8DAA8D;QACxF,qBAAqB,EAAE,yDAAyD;QAChF,8BAA8B,EAAE,kDAAkD;QAClF,kBAAkB,EAAE,kCAAkC;QACtD,wBAAwB,EAAE,oDAAoD;QAC9E,iBAAiB,EAAE,6EAA6E;QAChG,wBAAwB,EAAE,kCAAkC;QAC5D,0BAA0B,EAAE,+HAA+H;QAC3J,2BAA2B,EAAE,0DAA0D;QACvF,+BAA+B,EAAE,6EAA6E;QAC9G,iBAAiB,EAAE,mCAAmC;QACtD,uBAAuB,EAAE,kCAAkC;QAC3D,YAAY,EAAE,4BAA4B;QAC1C,gBAAgB,EAAE,uCAAuC;QACzD,mBAAmB,EAAE,sBAAsB;QAC3C,aAAa,EAAE,iCAAiC;QAChD,YAAY,EAAE,gCAAgC;QAC9C,eAAe,EAAE,eAAe;QAChC,cAAc,EAAE,eAAe;QAC/B,gBAAgB,EAAE,2DAA2D;QAC7E,cAAc,EAAE,4BAA4B;QAC5C,aAAa,EAAE,2BAA2B;QAC1C,oBAAoB,EAAE,2BAA2B;QACjD,gBAAgB,EAAE,kBAAkB;QACpC,YAAY,EAAE,0BAA0B;QACxC,iBAAiB,EAAE,oBAAoB;QACvC,kBAAkB,EAAE,2CAA2C;QAC/D,mBAAmB,EAAE,iBAAiB;QACtC,aAAa,EAAE,8CAA8C;QAC7D,yBAAyB,EAAE,4DAA4D;QACvF,kBAAkB,EAAE,+BAA+B;QACnD,oBAAoB,EAAE,oDAAoD;QAC1E,sBAAsB,EAAE,mDAAmD;QAC3E,2BAA2B,EAAE,uJAAuJ;QACpL,uBAAuB,EAAE,4JAA4J;QACrL,sBAAsB,EAAE,2JAA2J;QACnL,oBAAoB,EAAE,mJAAmJ;QACzK,iBAAiB,EAAE,iIAAiI;QACpJ,iBAAiB,EAAE,+IAA+I;QAClK,mBAAmB,EAAE,kDAAkD;QACvE,wBAAwB,EAAE,0FAA0F;QACpH,4BAA4B,EAAE,sEAAsE;QACpG,wBAAwB,EAAE,+BAA+B;QACzD,4BAA4B,EAAE,sEAAsE;QACpG,2BAA2B,EAAE,+DAA+D;QAC5F,qBAAqB,EAAE,2GAA2G;QAClI,gBAAgB,EAAE,4BAA4B;QAC9C,sBAAsB,EAAE,iHAAiH;QACzI,mBAAmB,EAAE,4BAA4B;QACjD,kBAAkB,EAAE,wDAAwD;QAC5E,gBAAgB,EAAE,wDAAwD;QAC1E,aAAa,EAAE,gCAAgC;QAC/C,YAAY,EAAE,gCAAgC;QAC9C,YAAY,EAAE,6BAA6B;QAC3C,WAAW,EAAE,oBAAoB;QACjC,cAAc,EAAE,wDAAwD;QACxE,iBAAiB,EAAE,iCAAiC;QACpD,eAAe,EAAE,8BAA8B;QAC/C,YAAY,EAAE,+BAA+B;QAC7C,YAAY,EAAE,2BAA2B;QACzC,cAAc,EAAE,uCAAuC;QACvD,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"locale.js","sourceRoot":"","sources":["../src/locale.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.js
CHANGED
|
@@ -43,6 +43,20 @@ export function rotateLogIfNeeded(logPath, maxSize = MAX_LOG_SIZE, maxFiles = RO
|
|
|
43
43
|
const stat = statSync(logPath);
|
|
44
44
|
if (stat.size < maxSize)
|
|
45
45
|
return;
|
|
46
|
+
// Ballooned far past the limit (e.g. never-rotated TUI animation flood at
|
|
47
|
+
// hundreds of MB): drop content in place. Copying a 700MB+ file to .1 is
|
|
48
|
+
// slow and wasteful; the open writer (pipe-pane `cat >>`, pino) keeps the
|
|
49
|
+
// same inode so truncate is enough.
|
|
50
|
+
if (stat.size > maxSize * 10) {
|
|
51
|
+
for (let i = 1; i <= maxFiles; i++) {
|
|
52
|
+
try {
|
|
53
|
+
unlinkSync(`${logPath}.${i}`);
|
|
54
|
+
}
|
|
55
|
+
catch { /* no rotated file */ }
|
|
56
|
+
}
|
|
57
|
+
truncateSync(logPath, 0);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
46
60
|
// Shift existing rotated files: .2 → .3 (oldest deleted), .1 → .2, …
|
|
47
61
|
for (let i = maxFiles; i >= 2; i--) {
|
|
48
62
|
const src = `${logPath}.${i - 1}`;
|
package/dist/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Liveness of an instance's MCP server, derived from `channel.mcp.pid`.
|
|
3
|
+
*
|
|
4
|
+
* The MCP server writes that file at startup and unlinks it on a clean exit, so:
|
|
5
|
+
* - **dead** → file present but the pid is gone: it died without cleaning up
|
|
6
|
+
* (crash / OOM / SIGKILL). This is the incident worth reporting.
|
|
7
|
+
* - **unknown** → no file, or an unusable value: not started yet, or exited
|
|
8
|
+
* cleanly. Never alarm on this, or every startup would alert.
|
|
9
|
+
* - **alive** → the pid responds to signal 0 (EPERM counts as alive: the
|
|
10
|
+
* process exists but is owned by another user).
|
|
11
|
+
*/
|
|
12
|
+
export type McpServerState = {
|
|
13
|
+
state: "alive";
|
|
14
|
+
pid: number;
|
|
15
|
+
} | {
|
|
16
|
+
state: "dead";
|
|
17
|
+
pid: number;
|
|
18
|
+
} | {
|
|
19
|
+
state: "unknown";
|
|
20
|
+
};
|
|
21
|
+
export declare function mcpServerState(instanceDir: string): McpServerState;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export function mcpServerState(instanceDir) {
|
|
4
|
+
let raw;
|
|
5
|
+
try {
|
|
6
|
+
raw = readFileSync(join(instanceDir, "channel.mcp.pid"), "utf-8").trim();
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return { state: "unknown" };
|
|
10
|
+
}
|
|
11
|
+
const pid = Number.parseInt(raw, 10);
|
|
12
|
+
// Reject non-numeric, init, and anything unsafe — a bad pid must never be
|
|
13
|
+
// reported as "dead" (that would be a false alarm) nor signalled.
|
|
14
|
+
if (!Number.isSafeInteger(pid) || pid <= 1 || String(pid) !== raw.replace(/^\+/, "")) {
|
|
15
|
+
return { state: "unknown" };
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
process.kill(pid, 0);
|
|
19
|
+
return { state: "alive", pid };
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
if (err.code === "EPERM")
|
|
23
|
+
return { state: "alive", pid };
|
|
24
|
+
return { state: "dead", pid };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=mcp-liveness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-liveness.js","sourceRoot":"","sources":["../src/mcp-liveness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAkBjC,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC9B,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACrC,0EAA0E;IAC1E,kEAAkE;IAClE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;QACrF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC9B,CAAC;IACD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QACpF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAChC,CAAC;AACH,CAAC"}
|
|
@@ -21,10 +21,13 @@ export interface OutboundContext {
|
|
|
21
21
|
instanceName: string;
|
|
22
22
|
name: string;
|
|
23
23
|
backend?: string;
|
|
24
|
+
model?: string;
|
|
24
25
|
channelId: string;
|
|
26
|
+
adapterId?: string;
|
|
25
27
|
}[];
|
|
26
28
|
getChannelIdByInstance?(name: string): string | undefined;
|
|
27
29
|
getBackendByInstance?(name: string, fleetDefault?: string): string;
|
|
30
|
+
getModel?(channelId: string, adapterId?: string, fleetDefault?: string): string | undefined;
|
|
28
31
|
} | null;
|
|
29
32
|
lastActivityMs(name: string): number;
|
|
30
33
|
startInstance(name: string, config: InstanceConfig, topicMode: boolean): Promise<void>;
|
|
@@ -41,10 +44,18 @@ export interface OutboundContext {
|
|
|
41
44
|
id: string;
|
|
42
45
|
adapter: ChannelAdapter;
|
|
43
46
|
} | undefined;
|
|
47
|
+
/** Post a notice into an instance's own topic (used to report failed deliveries). */
|
|
48
|
+
notifyInstanceTopic?(instanceName: string, text: string): void;
|
|
44
49
|
sendCancelButton?(instanceName: string, correlationId?: string): Promise<void>;
|
|
45
50
|
clearCancelButton?(instanceName: string): void;
|
|
46
51
|
clearCancelButtonByCorrelation?(correlationId: string): void;
|
|
47
52
|
getInstanceExecutionState?(name: string): "idle" | "working" | "stuck" | "paused" | null;
|
|
53
|
+
resolveInstanceModel?(name: string): {
|
|
54
|
+
model: string;
|
|
55
|
+
source: "instance" | "fleet-default" | "classic" | "cli-default" | "unresolved";
|
|
56
|
+
display: string;
|
|
57
|
+
reason?: string;
|
|
58
|
+
};
|
|
48
59
|
}
|
|
49
60
|
/** Metadata extracted from the raw outbound message. */
|
|
50
61
|
export interface OutboundMeta {
|
|
@@ -55,5 +66,10 @@ export interface OutboundMeta {
|
|
|
55
66
|
}
|
|
56
67
|
type Respond = (result: unknown, error?: string) => void;
|
|
57
68
|
type Handler = (ctx: OutboundContext, args: Record<string, unknown>, respond: Respond, meta: OutboundMeta) => Promise<void> | void;
|
|
69
|
+
/** Test seam: real retry intervals are 30s, far beyond a test's patience. */
|
|
70
|
+
export declare function setCrossInstanceRetryForTests(cfg: {
|
|
71
|
+
retries: number;
|
|
72
|
+
intervalMs: number;
|
|
73
|
+
} | null): void;
|
|
58
74
|
export declare const outboundHandlers: Map<string, Handler>;
|
|
59
75
|
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { resolve as pathResolve, isAbsolute } from "node:path";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
|
-
import { BroadcastArgs, CreateInstanceArgs, CreateTeamArgs, DelegateTaskArgs, DeleteInstanceArgs, DeleteTeamArgs, DeployTemplateArgs, DescribeInstanceArgs, ListDeploymentsArgs, ListInstancesArgs, ListTeamsArgs, ReplaceInstanceArgs, ReportResultArgs, RequestInformationArgs, RestartInstanceArgs, SendToInstanceArgs, PauseInstanceArgs, WakeInstanceArgs, StopInstanceArgs, GetInstanceLogsArgs, GetFleetConfigArgs, UpdateInstanceConfigArgs, UpdateFleetDefaultsArgs, StartInstanceArgs, TeardownDeploymentArgs, UpdateTeamArgs, validateArgs, } from "./outbound-schemas.js";
|
|
3
|
+
import { BroadcastArgs, CreateInstanceArgs, CreateTeamArgs, DelegateTaskArgs, DeleteInstanceArgs, DeleteTeamArgs, DeployTemplateArgs, DescribeInstanceArgs, ListDeploymentsArgs, ListInstancesArgs, ListTeamsArgs, ReplaceInstanceArgs, ReportResultArgs, RequestInformationArgs, RestartInstanceArgs, SendToInstanceArgs, PauseInstanceArgs, WakeInstanceArgs, StopInstanceArgs, GetInstanceLogsArgs, GetUsageArgs, GetFleetConfigArgs, UpdateInstanceConfigArgs, UpdateFleetDefaultsArgs, StartInstanceArgs, TeardownDeploymentArgs, UpdateTeamArgs, validateArgs, } from "./outbound-schemas.js";
|
|
4
4
|
const HOME_DIR = homedir();
|
|
5
5
|
/**
|
|
6
6
|
* Sanitize an error for inclusion in outbound responses sent to agents.
|
|
@@ -33,6 +33,62 @@ async function deliverToInstance(ctx, instanceName, payload) {
|
|
|
33
33
|
throw new Error(`Instance '${instanceName}' is not connected`);
|
|
34
34
|
ipc.send(payload);
|
|
35
35
|
}
|
|
36
|
+
/** Cross-instance delivery retries: same shape the scheduler already uses. */
|
|
37
|
+
const CROSS_INSTANCE_RETRY_DEFAULTS = { retries: 3, intervalMs: 30_000 };
|
|
38
|
+
let crossInstanceRetry = { ...CROSS_INSTANCE_RETRY_DEFAULTS };
|
|
39
|
+
/** Test seam: real retry intervals are 30s, far beyond a test's patience. */
|
|
40
|
+
export function setCrossInstanceRetryForTests(cfg) {
|
|
41
|
+
crossInstanceRetry = cfg ?? { ...CROSS_INSTANCE_RETRY_DEFAULTS };
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Deliver a cross-instance message with retries, and make a final failure VISIBLE.
|
|
45
|
+
*
|
|
46
|
+
* This path used to be pure fire-and-forget: the handler answered
|
|
47
|
+
* `{sent: true, queued: true}` and a later rejection went to `logger.warn` and
|
|
48
|
+
* nowhere else. The sending agent believed it had delivered, the recipient never
|
|
49
|
+
* got it, and no human was told — the last large hole under "instance messages
|
|
50
|
+
* must not get lost". The failure window is real: `deliverWithIdleGate` throws
|
|
51
|
+
* whenever the target's IPC has gone, which is exactly what happens while a target
|
|
52
|
+
* is restarting or crash-looping.
|
|
53
|
+
*
|
|
54
|
+
* Retries reuse the scheduler's proven numbers (3 attempts, 30s apart). On final
|
|
55
|
+
* failure we log at error, record it in the event log, and post to BOTH the
|
|
56
|
+
* sender's and the target's topic so the agent that sent it and any watching human
|
|
57
|
+
* both find out.
|
|
58
|
+
*/
|
|
59
|
+
async function deliverCrossInstanceWithRetry(ctx, targetInstanceName, targetLabel, senderLabel, correlationId, payload) {
|
|
60
|
+
const attempt = async () => {
|
|
61
|
+
try {
|
|
62
|
+
await deliverToInstance(ctx, targetInstanceName, payload);
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
return err instanceof Error ? err : new Error(String(err));
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
let lastError = await attempt();
|
|
70
|
+
for (let i = 0; lastError && i < crossInstanceRetry.retries; i++) {
|
|
71
|
+
ctx.logger.warn({ err: lastError.message, target: targetLabel, correlation_id: correlationId, attempt: i + 1 }, "Cross-instance delivery failed — retrying");
|
|
72
|
+
await new Promise(r => setTimeout(r, crossInstanceRetry.intervalMs));
|
|
73
|
+
lastError = await attempt();
|
|
74
|
+
}
|
|
75
|
+
if (!lastError)
|
|
76
|
+
return;
|
|
77
|
+
ctx.logger.error({ err: lastError.message, target: targetLabel, correlation_id: correlationId, attempts: crossInstanceRetry.retries + 1 }, "Cross-instance delivery failed after retries — message lost");
|
|
78
|
+
ctx.eventLog?.insert(targetInstanceName, "cross_instance_delivery_failed", {
|
|
79
|
+
from: senderLabel,
|
|
80
|
+
correlation_id: correlationId,
|
|
81
|
+
error: lastError.message,
|
|
82
|
+
});
|
|
83
|
+
const notice = `❌ Message from ${senderLabel} to ${targetLabel} could not be delivered after `
|
|
84
|
+
+ `${crossInstanceRetry.retries + 1} attempts (${lastError.message}). `
|
|
85
|
+
+ `correlation_id: ${correlationId}`;
|
|
86
|
+
// Both topics: the sender's agent needs to know its send did not land, and a human
|
|
87
|
+
// watching the target needs to know something was addressed to it and never arrived.
|
|
88
|
+
ctx.notifyInstanceTopic?.(senderLabel, notice);
|
|
89
|
+
if (targetInstanceName !== senderLabel)
|
|
90
|
+
ctx.notifyInstanceTopic?.(targetInstanceName, notice);
|
|
91
|
+
}
|
|
36
92
|
// ── Handler implementations ─────────────────────────────────────────────
|
|
37
93
|
const sendToInstance = async (ctx, rawArgs, respond, meta) => {
|
|
38
94
|
const v = validateArgs(SendToInstanceArgs, rawArgs, "send_to_instance");
|
|
@@ -90,13 +146,16 @@ const sendToInstance = async (ctx, rawArgs, respond, meta) => {
|
|
|
90
146
|
const senderDisplay = ctx.fleetConfig?.instances[senderLabel]?.display_name;
|
|
91
147
|
if (senderDisplay && senderDisplay !== senderLabel)
|
|
92
148
|
ipcMeta.from_display = senderDisplay;
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
149
|
+
// Fire-and-queue: hand the message to the fleet and respond immediately.
|
|
150
|
+
// deliverToInstance owns waking a paused target, the idle gate and retries;
|
|
151
|
+
// awaiting it here blocked this call for as long as the target stayed busy
|
|
152
|
+
// (up to the idle-gate timeout), which serialized ALL cross-instance traffic
|
|
153
|
+
// and surfaced as "IPC request timed out after 30000ms" on the caller.
|
|
154
|
+
// Unknown/stopped targets already errored synchronously above, so anything
|
|
155
|
+
// failing past this point is a delivery problem to log, not a caller error.
|
|
156
|
+
// Retries and, on final failure, tells both agents' topics — see
|
|
157
|
+
// deliverCrossInstanceWithRetry. It never rejects, so nothing escapes here.
|
|
158
|
+
void deliverCrossInstanceWithRetry(ctx, targetInstanceName, targetName, senderLabel, correlationId, { type: "fleet_inbound", targetSession, content: message, meta: ipcMeta });
|
|
100
159
|
// Show a cancel button on the target's topic so a watching user can interrupt
|
|
101
160
|
// work started by another instance — but only for messages that actually put
|
|
102
161
|
// the recipient to work (task/query). Informational report/update messages
|
|
@@ -155,7 +214,7 @@ const sendToInstance = async (ctx, rawArgs, respond, meta) => {
|
|
|
155
214
|
const taskSummary = ipcMeta.task_summary || (message ?? "").slice(0, 200);
|
|
156
215
|
ctx.eventLog?.logActivity("message", senderLabel, taskSummary, targetName, ipcMeta.request_kind);
|
|
157
216
|
ctx.queueMirrorMessage?.(`${senderLabel} → ${targetName}: ${(message ?? "").slice(0, 500)}${(message ?? "").length > 500 ? " […]" : ""}`);
|
|
158
|
-
respond({ sent: true, target: targetName, correlation_id: correlationId,
|
|
217
|
+
respond({ sent: true, queued: true, target: targetName, correlation_id: correlationId,
|
|
159
218
|
...(ctx.lifecycle.daemons.get(targetInstanceName)?.isErrorState && {
|
|
160
219
|
warning: (() => {
|
|
161
220
|
const daemon = ctx.lifecycle.daemons.get(targetInstanceName);
|
|
@@ -191,6 +250,8 @@ const listInstances = (ctx, rawArgs, respond, meta) => {
|
|
|
191
250
|
display_name: config.display_name ?? null,
|
|
192
251
|
description: config.description ?? null,
|
|
193
252
|
backend: config.backend ?? "claude-code",
|
|
253
|
+
model: ctx.resolveInstanceModel?.(name).model ?? config.model ?? "default",
|
|
254
|
+
kind: "fleet-topic",
|
|
194
255
|
tags: config.tags ?? [],
|
|
195
256
|
last_activity: ctx.lastActivityMs(name) ? new Date(ctx.lastActivityMs(name)).toISOString() : null,
|
|
196
257
|
}));
|
|
@@ -212,7 +273,11 @@ const listInstances = (ctx, rawArgs, respond, meta) => {
|
|
|
212
273
|
topic_id: ch.channelId,
|
|
213
274
|
display_name: `classic: ${ch.name}`,
|
|
214
275
|
description: `ClassicBot channel (${ch.name})`,
|
|
215
|
-
backend: ch.backend ?? "claude-code",
|
|
276
|
+
backend: ctx.classicChannels.getBackendByInstance?.(ch.instanceName, ctx.fleetConfig?.defaults?.backend) ?? ch.backend ?? ctx.fleetConfig?.defaults?.backend ?? "claude-code",
|
|
277
|
+
model: ctx.resolveInstanceModel?.(ch.instanceName).model
|
|
278
|
+
?? ctx.classicChannels.getModel?.(ch.channelId, ch.adapterId, ctx.fleetConfig?.defaults?.model)
|
|
279
|
+
?? "default",
|
|
280
|
+
kind: "classic",
|
|
216
281
|
tags: ["classic"],
|
|
217
282
|
last_activity: ctx.lastActivityMs(ch.instanceName) ? new Date(ctx.lastActivityMs(ch.instanceName)).toISOString() : null,
|
|
218
283
|
});
|
|
@@ -232,9 +297,11 @@ const describeInstance = (ctx, rawArgs, respond) => {
|
|
|
232
297
|
const targetName = v.data.name;
|
|
233
298
|
const config = ctx.fleetConfig?.instances[targetName];
|
|
234
299
|
if (config) {
|
|
300
|
+
const model = ctx.resolveInstanceModel?.(targetName);
|
|
235
301
|
respond({
|
|
236
302
|
name: targetName,
|
|
237
303
|
type: "instance",
|
|
304
|
+
kind: "fleet-topic",
|
|
238
305
|
description: config.description ?? null,
|
|
239
306
|
tags: config.tags ?? [],
|
|
240
307
|
working_directory: config.working_directory,
|
|
@@ -245,7 +312,8 @@ const describeInstance = (ctx, rawArgs, respond) => {
|
|
|
245
312
|
: null,
|
|
246
313
|
topic_id: config.topic_id ?? null,
|
|
247
314
|
backend: config.backend ?? "claude-code",
|
|
248
|
-
model: config.model ??
|
|
315
|
+
model: model?.model ?? config.model ?? "default",
|
|
316
|
+
model_source: model?.source ?? (config.model ? "instance" : "unresolved"),
|
|
249
317
|
last_activity: ctx.lastActivityMs(targetName) ? new Date(ctx.lastActivityMs(targetName)).toISOString() : null,
|
|
250
318
|
worktree_source: config.worktree_source ?? null,
|
|
251
319
|
});
|
|
@@ -255,9 +323,12 @@ const describeInstance = (ctx, rawArgs, respond) => {
|
|
|
255
323
|
if (ctx.classicChannels) {
|
|
256
324
|
const channelId = ctx.classicChannels.getChannelIdByInstance?.(targetName);
|
|
257
325
|
if (channelId) {
|
|
326
|
+
const channel = ctx.classicChannels.getAll().find(ch => ch.instanceName === targetName);
|
|
327
|
+
const model = ctx.resolveInstanceModel?.(targetName);
|
|
258
328
|
respond({
|
|
259
329
|
name: targetName,
|
|
260
330
|
type: "instance",
|
|
331
|
+
kind: "classic",
|
|
261
332
|
description: `ClassicBot channel`,
|
|
262
333
|
tags: ["classic"],
|
|
263
334
|
working_directory: "",
|
|
@@ -265,8 +336,13 @@ const describeInstance = (ctx, rawArgs, respond) => {
|
|
|
265
336
|
instance_state: ctx.getInstanceExecutionState?.(targetName) ?? null,
|
|
266
337
|
last_paused_at: null,
|
|
267
338
|
topic_id: channelId,
|
|
268
|
-
backend: ctx.classicChannels.getBackendByInstance?.(targetName) ?? "claude-code",
|
|
269
|
-
model:
|
|
339
|
+
backend: ctx.classicChannels.getBackendByInstance?.(targetName, ctx.fleetConfig?.defaults?.backend) ?? ctx.fleetConfig?.defaults?.backend ?? "claude-code",
|
|
340
|
+
model: model?.model
|
|
341
|
+
?? ctx.classicChannels.getModel?.(channelId, channel?.adapterId, ctx.fleetConfig?.defaults?.model)
|
|
342
|
+
?? "default",
|
|
343
|
+
model_source: model?.source ?? (ctx.classicChannels.getModel?.(channelId, channel?.adapterId, ctx.fleetConfig?.defaults?.model)
|
|
344
|
+
? "classic"
|
|
345
|
+
: "unresolved"),
|
|
270
346
|
last_activity: ctx.lastActivityMs(targetName) ? new Date(ctx.lastActivityMs(targetName)).toISOString() : null,
|
|
271
347
|
worktree_source: null,
|
|
272
348
|
});
|
|
@@ -388,6 +464,21 @@ const getFleetStatus = (ctx, rawArgs, respond) => {
|
|
|
388
464
|
const stopped = names.length - running - paused;
|
|
389
465
|
respond({ total: names.length, running, paused, stopped });
|
|
390
466
|
};
|
|
467
|
+
const getUsage = async (ctx, rawArgs, respond) => {
|
|
468
|
+
const v = validateArgs(GetUsageArgs, rawArgs, "get_usage");
|
|
469
|
+
if (!v.ok) {
|
|
470
|
+
respond(null, v.error);
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
try {
|
|
474
|
+
// Same structure as GET /api/ai-usage, same 5-minute cache behind it.
|
|
475
|
+
const { getUsageSnapshot } = await import("./usage/usage-api.js");
|
|
476
|
+
respond(await getUsageSnapshot(v.data.force === true));
|
|
477
|
+
}
|
|
478
|
+
catch (err) {
|
|
479
|
+
respond(null, `Usage fetch failed: ${err.message}`);
|
|
480
|
+
}
|
|
481
|
+
};
|
|
391
482
|
const getInstanceLogs = async (ctx, rawArgs, respond) => {
|
|
392
483
|
const v = validateArgs(GetInstanceLogsArgs, rawArgs, "get_instance_logs");
|
|
393
484
|
if (!v.ok) {
|
|
@@ -615,10 +706,17 @@ const broadcast = async (ctx, rawArgs, respond, meta) => {
|
|
|
615
706
|
else {
|
|
616
707
|
targetNames = [...ctx.instanceIpcClients.keys()].filter(n => n !== meta.instanceName && n !== senderLabel);
|
|
617
708
|
}
|
|
618
|
-
|
|
709
|
+
// Fire-and-queue, same rationale as send_to_instance: a broadcast awaiting every
|
|
710
|
+
// target's idle gate blocked for as long as the BUSIEST recipient. Connectivity
|
|
711
|
+
// is decided synchronously (that's the real failure), delivery runs in background.
|
|
712
|
+
const sentTo = [];
|
|
713
|
+
const failed = [];
|
|
714
|
+
for (const targetName of targetNames) {
|
|
619
715
|
const hostInstance = ctx.instanceIpcClients.has(targetName) ? targetName : ctx.sessionRegistry.get(targetName);
|
|
620
|
-
if (!hostInstance || !ctx.instanceIpcClients.has(hostInstance))
|
|
621
|
-
|
|
716
|
+
if (!hostInstance || !ctx.instanceIpcClients.has(hostInstance)) {
|
|
717
|
+
failed.push(targetName);
|
|
718
|
+
continue;
|
|
719
|
+
}
|
|
622
720
|
const correlationId = `bcast-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
623
721
|
const ipcMeta = {
|
|
624
722
|
chat_id: "", message_id: `bcast-${Date.now()}`, user: `instance:${senderLabel}`,
|
|
@@ -633,23 +731,18 @@ const broadcast = async (ctx, rawArgs, respond, meta) => {
|
|
|
633
731
|
ipcMeta.task_summary = task_summary;
|
|
634
732
|
if (senderDisplay && senderDisplay !== senderLabel)
|
|
635
733
|
ipcMeta.from_display = senderDisplay;
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
return { targetName, sent: false };
|
|
642
|
-
}
|
|
643
|
-
}));
|
|
644
|
-
const sentTo = deliveryResults.filter(result => result.sent).map(result => result.targetName);
|
|
645
|
-
const failed = deliveryResults.filter(result => !result.sent).map(result => result.targetName);
|
|
734
|
+
// Same at-least-once treatment as send_to_instance: retry, then surface a
|
|
735
|
+
// final failure on both topics instead of dying in a warn-level log line.
|
|
736
|
+
void deliverCrossInstanceWithRetry(ctx, hostInstance, targetName, senderLabel, correlationId, { type: "fleet_inbound", targetSession: targetName, content: message, meta: ipcMeta });
|
|
737
|
+
sentTo.push(targetName);
|
|
738
|
+
}
|
|
646
739
|
ctx.logger.info(`📢 ${senderLabel} broadcast to ${sentTo.length} instances: ${(message).slice(0, 80)}`);
|
|
647
740
|
const summary = task_summary || message.slice(0, 200);
|
|
648
741
|
for (const target of sentTo) {
|
|
649
742
|
ctx.eventLog?.logActivity("message", senderLabel, summary, target);
|
|
650
743
|
}
|
|
651
744
|
ctx.queueMirrorMessage?.(`📢 ${senderLabel} → [${sentTo.join(", ")}]: ${message.slice(0, 500)}${message.length > 500 ? " […]" : ""}`);
|
|
652
|
-
respond({ sent_to: sentTo, failed, count: sentTo.length });
|
|
745
|
+
respond({ sent_to: sentTo, failed, count: sentTo.length, queued: true });
|
|
653
746
|
};
|
|
654
747
|
// ── Teams ────────────────────────────────────────────────────────────────
|
|
655
748
|
const createTeam = (ctx, rawArgs, respond) => {
|
|
@@ -993,6 +1086,7 @@ export const outboundHandlers = new Map([
|
|
|
993
1086
|
["wake_instance", wakeInstance],
|
|
994
1087
|
["stop_instance", stopInstance],
|
|
995
1088
|
["get_fleet_status", getFleetStatus],
|
|
1089
|
+
["get_usage", getUsage],
|
|
996
1090
|
["get_instance_logs", getInstanceLogs],
|
|
997
1091
|
["get_fleet_config", getFleetConfig],
|
|
998
1092
|
["update_instance_config", updateInstanceConfig],
|