@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.
Files changed (147) hide show
  1. package/dist/access-path.js +15 -6
  2. package/dist/access-path.js.map +1 -1
  3. package/dist/agent-endpoint.d.ts +2 -0
  4. package/dist/agent-endpoint.js +17 -1
  5. package/dist/agent-endpoint.js.map +1 -1
  6. package/dist/backend/antigravity.d.ts +18 -0
  7. package/dist/backend/antigravity.js +32 -3
  8. package/dist/backend/antigravity.js.map +1 -1
  9. package/dist/backend/claude-code.d.ts +37 -0
  10. package/dist/backend/claude-code.js +43 -1
  11. package/dist/backend/claude-code.js.map +1 -1
  12. package/dist/backend/codex.d.ts +1 -0
  13. package/dist/backend/codex.js +25 -0
  14. package/dist/backend/codex.js.map +1 -1
  15. package/dist/backend/grok.d.ts +23 -0
  16. package/dist/backend/grok.js +45 -0
  17. package/dist/backend/grok.js.map +1 -1
  18. package/dist/backend/kiro.d.ts +20 -0
  19. package/dist/backend/kiro.js +77 -2
  20. package/dist/backend/kiro.js.map +1 -1
  21. package/dist/backend/types.d.ts +34 -0
  22. package/dist/backend/types.js +1 -1
  23. package/dist/backend/types.js.map +1 -1
  24. package/dist/channel/adapters/discord.d.ts +15 -0
  25. package/dist/channel/adapters/discord.js +91 -2
  26. package/dist/channel/adapters/discord.js.map +1 -1
  27. package/dist/channel/adapters/telegram.d.ts +21 -0
  28. package/dist/channel/adapters/telegram.js +82 -0
  29. package/dist/channel/adapters/telegram.js.map +1 -1
  30. package/dist/channel/ipc-bridge.d.ts +17 -1
  31. package/dist/channel/ipc-bridge.js +53 -17
  32. package/dist/channel/ipc-bridge.js.map +1 -1
  33. package/dist/channel/ipc-timeouts.d.ts +46 -0
  34. package/dist/channel/ipc-timeouts.js +65 -0
  35. package/dist/channel/ipc-timeouts.js.map +1 -0
  36. package/dist/channel/mcp-server.js +30 -14
  37. package/dist/channel/mcp-server.js.map +1 -1
  38. package/dist/channel/mcp-tools.js +28 -1
  39. package/dist/channel/mcp-tools.js.map +1 -1
  40. package/dist/channel/reconnect-backoff.d.ts +17 -0
  41. package/dist/channel/reconnect-backoff.js +21 -0
  42. package/dist/channel/reconnect-backoff.js.map +1 -0
  43. package/dist/channel/types.d.ts +29 -0
  44. package/dist/classic-channel-manager.js +1 -5
  45. package/dist/classic-channel-manager.js.map +1 -1
  46. package/dist/cli.js +132 -52
  47. package/dist/cli.js.map +1 -1
  48. package/dist/completion.d.ts +27 -0
  49. package/dist/completion.js +121 -0
  50. package/dist/completion.js.map +1 -0
  51. package/dist/config-validator.js +9 -0
  52. package/dist/config-validator.js.map +1 -1
  53. package/dist/config.js +1 -0
  54. package/dist/config.js.map +1 -1
  55. package/dist/cost-guard.d.ts +3 -1
  56. package/dist/cost-guard.js +3 -1
  57. package/dist/cost-guard.js.map +1 -1
  58. package/dist/daemon.d.ts +219 -13
  59. package/dist/daemon.js +919 -303
  60. package/dist/daemon.js.map +1 -1
  61. package/dist/event-log.d.ts +31 -0
  62. package/dist/event-log.js +96 -0
  63. package/dist/event-log.js.map +1 -1
  64. package/dist/fleet-manager.d.ts +238 -2
  65. package/dist/fleet-manager.js +1008 -90
  66. package/dist/fleet-manager.js.map +1 -1
  67. package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +22 -0
  68. package/dist/general-knowledge/skills/model-discovery/SKILL.md +14 -23
  69. package/dist/general-knowledge/skills/session-management/SKILL.md +15 -34
  70. package/dist/hang-detector.d.ts +19 -13
  71. package/dist/hang-detector.js +19 -49
  72. package/dist/hang-detector.js.map +1 -1
  73. package/dist/instance-lifecycle.d.ts +13 -1
  74. package/dist/instance-lifecycle.js +84 -3
  75. package/dist/instance-lifecycle.js.map +1 -1
  76. package/dist/instructions.d.ts +5 -0
  77. package/dist/instructions.js +9 -11
  78. package/dist/instructions.js.map +1 -1
  79. package/dist/locale.js +2 -1
  80. package/dist/locale.js.map +1 -1
  81. package/dist/logger.js +14 -0
  82. package/dist/logger.js.map +1 -1
  83. package/dist/mcp-liveness.d.ts +21 -0
  84. package/dist/mcp-liveness.js +27 -0
  85. package/dist/mcp-liveness.js.map +1 -0
  86. package/dist/outbound-handlers.d.ts +16 -0
  87. package/dist/outbound-handlers.js +121 -27
  88. package/dist/outbound-handlers.js.map +1 -1
  89. package/dist/outbound-schemas.d.ts +8 -3
  90. package/dist/outbound-schemas.js +13 -2
  91. package/dist/outbound-schemas.js.map +1 -1
  92. package/dist/pane-write-lock.d.ts +48 -0
  93. package/dist/pane-write-lock.js +73 -0
  94. package/dist/pane-write-lock.js.map +1 -0
  95. package/dist/process-memory.d.ts +31 -0
  96. package/dist/process-memory.js +79 -0
  97. package/dist/process-memory.js.map +1 -0
  98. package/dist/quickstart.js +17 -16
  99. package/dist/quickstart.js.map +1 -1
  100. package/dist/reply-dedup.d.ts +41 -0
  101. package/dist/reply-dedup.js +0 -0
  102. package/dist/reply-dedup.js.map +1 -0
  103. package/dist/scheduler/db.js +3 -0
  104. package/dist/scheduler/db.js.map +1 -1
  105. package/dist/sd-notify.d.ts +27 -0
  106. package/dist/sd-notify.js +33 -1
  107. package/dist/sd-notify.js.map +1 -1
  108. package/dist/secret-file.d.ts +33 -0
  109. package/dist/secret-file.js +36 -0
  110. package/dist/secret-file.js.map +1 -0
  111. package/dist/setup-wizard.js +9 -7
  112. package/dist/setup-wizard.js.map +1 -1
  113. package/dist/tmux-control.d.ts +58 -5
  114. package/dist/tmux-control.js +102 -14
  115. package/dist/tmux-control.js.map +1 -1
  116. package/dist/tmux-manager.d.ts +31 -1
  117. package/dist/tmux-manager.js +40 -11
  118. package/dist/tmux-manager.js.map +1 -1
  119. package/dist/topic-commands.d.ts +50 -10
  120. package/dist/topic-commands.js +242 -106
  121. package/dist/topic-commands.js.map +1 -1
  122. package/dist/tui-glyphs.d.ts +25 -0
  123. package/dist/tui-glyphs.js +26 -0
  124. package/dist/tui-glyphs.js.map +1 -0
  125. package/dist/types.d.ts +6 -0
  126. package/dist/ui/view.html +123 -2
  127. package/dist/usage/format-rich.d.ts +11 -0
  128. package/dist/usage/format-rich.js +108 -0
  129. package/dist/usage/format-rich.js.map +1 -0
  130. package/dist/usage/providers.d.ts +97 -0
  131. package/dist/usage/providers.js +834 -0
  132. package/dist/usage/providers.js.map +1 -0
  133. package/dist/usage/usage-api.d.ts +50 -0
  134. package/dist/usage/usage-api.js +111 -0
  135. package/dist/usage/usage-api.js.map +1 -0
  136. package/dist/view-api.d.ts +3 -0
  137. package/dist/view-api.js +11 -2
  138. package/dist/view-api.js.map +1 -1
  139. package/dist/web-api.js +5 -2
  140. package/dist/web-api.js.map +1 -1
  141. package/package.json +4 -1
  142. package/dist/channel/tool-tracker.d.ts +0 -13
  143. package/dist/channel/tool-tracker.js +0 -58
  144. package/dist/channel/tool-tracker.js.map +0 -1
  145. package/dist/daemon-entry.d.ts +0 -1
  146. package/dist/daemon-entry.js +0 -30
  147. package/dist/daemon-entry.js.map +0 -1
@@ -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
- "Everything for the user goes inside the `reply` call. Your final terminal text is",
31
- "NOT delivered to their chat it only reaches local logs and `/view`. This is the",
32
- "opposite of normal CLI behavior. After `reply` succeeds, end the turn with a final",
33
- "text of exactly `.` (some backends such as Kiro CLI error on a turn with no text",
34
- "at all). Only exception: if `reply` fails, say so in the final text so the failure",
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.",
@@ -1 +1 @@
1
- {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"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"}
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;AAmBzC,MAAM,UAAU,sBAAsB,CAAC,MAA+B;IACpE,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAC3G,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,iBAAiB;IACjB,QAAQ,CAAC,IAAI,CAAC,oCAAoC,YAAY,mEAAmE,gBAAgB,KAAK,CAAC,CAAC;IACxJ,IAAI,eAAe,EAAE,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,iBAAiB,eAAe,CAAC,IAAI,aAAa,eAAe,CAAC,OAAO,WAAW,eAAe,CAAC,KAAK,GAAG,CAAC,CAAC;IAC9H,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC,yBAAyB,WAAW,wCAAwC,CAAC,CAAC;IAC9F,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,uGAAuG,CAAC,CAAC;IACzH,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC,YAAY,WAAW,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,oCAAoC;IACpC,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3B,uCAAuC;QACvC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,+CAA+C;QAC/C,QAAQ,CAAC,IAAI,CAAC;YACZ,mBAAmB;YACnB,wGAAwG;YACxG,2HAA2H;YAC3H,EAAE;YACF,sFAAsF;YACtF,2FAA2F;YAC3F,qFAAqF;YACrF,2FAA2F;YAC3F,uFAAuF;YACvF,EAAE;YACF,4BAA4B;YAC5B,oHAAoH;YACpH,uCAAuC;YACvC,yFAAyF;YACzF,sFAAsF;YACtF,EAAE;YACF,eAAe;YACf,2HAA2H;YAC3H,0EAA0E;YAC1E,wGAAwG;YACxG,qFAAqF;YACrF,oFAAoF;YACpF,oIAAoI;YACpI,EAAE;YACF,wBAAwB;YACxB,kHAAkH;YAClH,sHAAsH;YACtH,gFAAgF;YAChF,2EAA2E;YAC3E,uHAAuH;SACxH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAChB,CAAC;IAED,0BAA0B;IAC1B,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC9B,IAAI,eAAe,GAAkB,IAAI,CAAC;QAC1C,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrD,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,+BAA+B,CAAC,EAAE,OAAO,CAAC,CAAC;YACvF,CAAC;YAAC,MAAM,CAAC,CAAC,+BAA+B,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC;YACvC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC5C,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC3E,OAAO,OAAO,CAAC,CAAC,KAAK,OAAO,SAAS,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC;QACH,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,SAAS,CAAC,MAAM,GAAG,GAAG,6CAA6C,CAAC,CAAC;QACzF,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,2BAA2B;IAC3B,IAAI,YAAY,EAAE,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
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": "Show fleet status and costs",
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",
@@ -1 +1 @@
1
- {"version":3,"file":"locale.js","sourceRoot":"","sources":["../src/locale.ts"],"names":[],"mappings":"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"}
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}`;
@@ -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
- try {
94
- await deliverToInstance(ctx, targetInstanceName, { type: "fleet_inbound", targetSession, content: message, meta: ipcMeta });
95
- }
96
- catch (err) {
97
- respond(null, sanitizeError(err, ctx, `wake/deliver to ${targetName}`));
98
- return;
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 ?? null,
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: null,
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
- const deliveryResults = await Promise.all(targetNames.map(async (targetName) => {
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
- return { targetName, sent: false };
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
- try {
637
- await deliverToInstance(ctx, hostInstance, { type: "fleet_inbound", targetSession: targetName, content: message, meta: ipcMeta });
638
- return { targetName, sent: true };
639
- }
640
- catch {
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],