@songsid/agend 2.1.4-beta.4 → 2.1.4-beta.40

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 (168) hide show
  1. package/README.md +1 -1
  2. package/README.zh-TW.md +1 -1
  3. package/dist/agent-endpoint.js +1 -1
  4. package/dist/agent-endpoint.js.map +1 -1
  5. package/dist/backend/antigravity.d.ts +9 -5
  6. package/dist/backend/antigravity.js +156 -31
  7. package/dist/backend/antigravity.js.map +1 -1
  8. package/dist/backend/claude-code.d.ts +62 -23
  9. package/dist/backend/claude-code.js +296 -43
  10. package/dist/backend/claude-code.js.map +1 -1
  11. package/dist/backend/codex.d.ts +18 -0
  12. package/dist/backend/codex.js +148 -8
  13. package/dist/backend/codex.js.map +1 -1
  14. package/dist/backend/gemini-cli.js +2 -2
  15. package/dist/backend/gemini-cli.js.map +1 -1
  16. package/dist/backend/grok.js +2 -2
  17. package/dist/backend/grok.js.map +1 -1
  18. package/dist/backend/kiro.d.ts +2 -0
  19. package/dist/backend/kiro.js +24 -3
  20. package/dist/backend/kiro.js.map +1 -1
  21. package/dist/backend/opencode.d.ts +27 -11
  22. package/dist/backend/opencode.js +65 -41
  23. package/dist/backend/opencode.js.map +1 -1
  24. package/dist/backend/types.d.ts +45 -3
  25. package/dist/backend/types.js +12 -1
  26. package/dist/backend/types.js.map +1 -1
  27. package/dist/channel/adapters/discord.d.ts +44 -2
  28. package/dist/channel/adapters/discord.js +526 -78
  29. package/dist/channel/adapters/discord.js.map +1 -1
  30. package/dist/channel/adapters/telegram.d.ts +30 -0
  31. package/dist/channel/adapters/telegram.js +212 -18
  32. package/dist/channel/adapters/telegram.js.map +1 -1
  33. package/dist/channel/agy-mcp-launcher.d.ts +2 -0
  34. package/dist/channel/agy-mcp-launcher.js +28 -0
  35. package/dist/channel/agy-mcp-launcher.js.map +1 -0
  36. package/dist/channel/ipc-bridge.d.ts +2 -1
  37. package/dist/channel/ipc-bridge.js +33 -4
  38. package/dist/channel/ipc-bridge.js.map +1 -1
  39. package/dist/channel/mcp-server.js +28 -25
  40. package/dist/channel/mcp-server.js.map +1 -1
  41. package/dist/channel/mcp-tools.js +4 -2
  42. package/dist/channel/mcp-tools.js.map +1 -1
  43. package/dist/channel/message-queue.js +62 -1
  44. package/dist/channel/message-queue.js.map +1 -1
  45. package/dist/channel/types.d.ts +31 -1
  46. package/dist/classic-channel-manager.d.ts +40 -3
  47. package/dist/classic-channel-manager.js +218 -31
  48. package/dist/classic-channel-manager.js.map +1 -1
  49. package/dist/cli.js +109 -37
  50. package/dist/cli.js.map +1 -1
  51. package/dist/config-validator.js +48 -7
  52. package/dist/config-validator.js.map +1 -1
  53. package/dist/config.d.ts +4 -0
  54. package/dist/config.js +12 -1
  55. package/dist/config.js.map +1 -1
  56. package/dist/cross-instance-envelope.d.ts +6 -0
  57. package/dist/cross-instance-envelope.js +30 -0
  58. package/dist/cross-instance-envelope.js.map +1 -0
  59. package/dist/daemon.d.ts +319 -9
  60. package/dist/daemon.js +1402 -255
  61. package/dist/daemon.js.map +1 -1
  62. package/dist/doctor.d.ts +41 -0
  63. package/dist/doctor.js +267 -0
  64. package/dist/doctor.js.map +1 -0
  65. package/dist/fleet-context.d.ts +47 -0
  66. package/dist/fleet-manager.d.ts +265 -11
  67. package/dist/fleet-manager.js +2273 -455
  68. package/dist/fleet-manager.js.map +1 -1
  69. package/dist/fleet-yaml-slim.d.ts +10 -0
  70. package/dist/fleet-yaml-slim.js +59 -0
  71. package/dist/fleet-yaml-slim.js.map +1 -0
  72. package/dist/general-knowledge/skills/backend-providers/SKILL.md +114 -0
  73. package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +3 -1
  74. package/dist/general-knowledge/skills/delegation-playbook/SKILL.md +52 -0
  75. package/dist/general-knowledge/skills/development-workflow/SKILL.md +28 -0
  76. package/dist/general-knowledge/skills/fleet-config/SKILL.md +1 -0
  77. package/dist/general-knowledge/skills/fleet-health/SKILL.md +1 -0
  78. package/dist/general-knowledge/skills/fleet-restart/SKILL.md +1 -0
  79. package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +1 -0
  80. package/dist/general-knowledge/skills/model-discovery/SKILL.md +64 -16
  81. package/dist/general-knowledge/skills/multi-channel/SKILL.md +1 -0
  82. package/dist/general-knowledge/skills/scheduling/SKILL.md +1 -0
  83. package/dist/general-knowledge/skills/session-management/SKILL.md +1 -0
  84. package/dist/general-knowledge/skills/tui-effort/SKILL.md +1 -0
  85. package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +30 -0
  86. package/dist/instance-lifecycle.d.ts +67 -0
  87. package/dist/instance-lifecycle.js +273 -8
  88. package/dist/instance-lifecycle.js.map +1 -1
  89. package/dist/instructions.d.ts +12 -0
  90. package/dist/instructions.js +35 -1
  91. package/dist/instructions.js.map +1 -1
  92. package/dist/locale.js +958 -288
  93. package/dist/locale.js.map +1 -1
  94. package/dist/login-flows.d.ts +91 -0
  95. package/dist/login-flows.js +170 -0
  96. package/dist/login-flows.js.map +1 -0
  97. package/dist/login-manager.d.ts +63 -0
  98. package/dist/login-manager.js +134 -0
  99. package/dist/login-manager.js.map +1 -0
  100. package/dist/network-family.d.ts +18 -0
  101. package/dist/network-family.js +20 -0
  102. package/dist/network-family.js.map +1 -0
  103. package/dist/outbound-handlers.d.ts +8 -0
  104. package/dist/outbound-handlers.js +101 -18
  105. package/dist/outbound-handlers.js.map +1 -1
  106. package/dist/outbound-schemas.d.ts +7 -1
  107. package/dist/outbound-schemas.js +9 -0
  108. package/dist/outbound-schemas.js.map +1 -1
  109. package/dist/reply-dedup.d.ts +7 -8
  110. package/dist/reply-dedup.js +0 -0
  111. package/dist/reply-dedup.js.map +1 -1
  112. package/dist/restart-progress.d.ts +2 -0
  113. package/dist/restart-progress.js +3 -0
  114. package/dist/restart-progress.js.map +1 -1
  115. package/dist/scheduler/db.d.ts +12 -0
  116. package/dist/scheduler/db.js +59 -0
  117. package/dist/scheduler/db.js.map +1 -1
  118. package/dist/service-installer.d.ts +11 -0
  119. package/dist/service-installer.js +84 -18
  120. package/dist/service-installer.js.map +1 -1
  121. package/dist/settings-api.js +1 -1
  122. package/dist/settings-api.js.map +1 -1
  123. package/dist/setup-wizard.js +2 -2
  124. package/dist/setup-wizard.js.map +1 -1
  125. package/dist/spawn-gate.d.ts +30 -0
  126. package/dist/spawn-gate.js +79 -0
  127. package/dist/spawn-gate.js.map +1 -0
  128. package/dist/storm-window.d.ts +83 -0
  129. package/dist/storm-window.js +251 -0
  130. package/dist/storm-window.js.map +1 -0
  131. package/dist/tips.d.ts +44 -0
  132. package/dist/tips.js +355 -0
  133. package/dist/tips.js.map +1 -0
  134. package/dist/tmux-manager.d.ts +16 -0
  135. package/dist/tmux-manager.js +110 -25
  136. package/dist/tmux-manager.js.map +1 -1
  137. package/dist/tool-progress.d.ts +40 -0
  138. package/dist/tool-progress.js +289 -0
  139. package/dist/tool-progress.js.map +1 -0
  140. package/dist/topic-commands.d.ts +42 -4
  141. package/dist/topic-commands.js +354 -66
  142. package/dist/topic-commands.js.map +1 -1
  143. package/dist/transcript-monitor.d.ts +15 -2
  144. package/dist/transcript-monitor.js +63 -17
  145. package/dist/transcript-monitor.js.map +1 -1
  146. package/dist/transcript-sources.d.ts +131 -0
  147. package/dist/transcript-sources.js +580 -0
  148. package/dist/transcript-sources.js.map +1 -0
  149. package/dist/types.d.ts +13 -0
  150. package/dist/ui/dashboard.html +55 -32
  151. package/dist/ui/settings.html +200 -60
  152. package/dist/ui/view.html +147 -30
  153. package/dist/usage/format-rich.js +24 -23
  154. package/dist/usage/format-rich.js.map +1 -1
  155. package/dist/usage/i18n-keys.d.ts +7 -0
  156. package/dist/usage/i18n-keys.js +34 -0
  157. package/dist/usage/i18n-keys.js.map +1 -0
  158. package/dist/usage/i18n.d.ts +5 -0
  159. package/dist/usage/i18n.js +27 -0
  160. package/dist/usage/i18n.js.map +1 -0
  161. package/dist/usage/providers.d.ts +19 -0
  162. package/dist/usage/providers.js +150 -74
  163. package/dist/usage/providers.js.map +1 -1
  164. package/dist/usage/usage-api.d.ts +8 -2
  165. package/dist/usage/usage-api.js +45 -23
  166. package/dist/usage/usage-api.js.map +1 -1
  167. package/dist/workflow-templates/default.md +2 -1
  168. package/package.json +2 -2
@@ -0,0 +1,41 @@
1
+ import { type SpawnSyncReturns } from "node:child_process";
2
+ import type { ServiceInfo } from "./service-installer.js";
3
+ import { type NetworkFamilyState } from "./network-family.js";
4
+ export type DoctorCheckStatus = "ok" | "warn" | "error";
5
+ export interface DoctorCheck {
6
+ section: "Prerequisites" | "Service" | "Fleet" | "Channel gateways" | "MCP IPC";
7
+ status: DoctorCheckStatus;
8
+ label: string;
9
+ detail: string;
10
+ }
11
+ export interface DoctorReport {
12
+ checks: DoctorCheck[];
13
+ errors: number;
14
+ warnings: number;
15
+ }
16
+ interface DoctorDeps {
17
+ env: NodeJS.ProcessEnv;
18
+ platform: NodeJS.Platform;
19
+ run: (file: string, args: string[]) => SpawnSyncReturns<string>;
20
+ processAlive: (pid: number) => boolean;
21
+ connectSocket: (path: string) => Promise<boolean>;
22
+ networkFamily: () => NetworkFamilyState;
23
+ fetchFleetHealth: (port: number) => Promise<{
24
+ adapters?: {
25
+ details?: Record<string, {
26
+ status?: string;
27
+ isReady?: boolean;
28
+ reconnectCount?: number;
29
+ heartbeatAgeMs?: number | null;
30
+ shards?: Array<{
31
+ heartbeatAgeMs?: number | null;
32
+ }>;
33
+ }>;
34
+ };
35
+ }>;
36
+ }
37
+ export declare function connectUnixSocket(path: string, timeoutMs?: number): Promise<boolean>;
38
+ /** Collect read-only diagnostics. Dependencies are injectable for deterministic tests. */
39
+ export declare function collectDoctorReport(dataDir: string, service: ServiceInfo, overrides?: Partial<DoctorDeps>): Promise<DoctorReport>;
40
+ export declare function formatDoctorReport(report: DoctorReport): string;
41
+ export {};
package/dist/doctor.js ADDED
@@ -0,0 +1,267 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { platform } from "node:os";
4
+ import { spawnSync } from "node:child_process";
5
+ import net from "node:net";
6
+ import { loadRawFleetConfig } from "./config.js";
7
+ import { hasPausedMarker } from "./pause-marker.js";
8
+ import { getTmuxSessionName, getTmuxSocketName } from "./paths.js";
9
+ import { BACKENDS } from "./setup-wizard.js";
10
+ import { t } from "./locale.js";
11
+ import { AGEND_NETWORK_FAMILY_ATTEMPT_TIMEOUT_MS, getNetworkFamilyState, } from "./network-family.js";
12
+ const defaultDeps = {
13
+ env: process.env,
14
+ platform: platform(),
15
+ run: (file, args) => spawnSync(file, args, { encoding: "utf8", timeout: 5000 }),
16
+ processAlive: pid => {
17
+ try {
18
+ process.kill(pid, 0);
19
+ return true;
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ },
25
+ connectSocket: connectUnixSocket,
26
+ networkFamily: getNetworkFamilyState,
27
+ fetchFleetHealth: async (port) => {
28
+ const response = await fetch(`http://127.0.0.1:${port}/health`, { signal: AbortSignal.timeout(3000) });
29
+ return await response.json();
30
+ },
31
+ };
32
+ function tmuxArgs(args) {
33
+ const socket = getTmuxSocketName();
34
+ return socket ? ["-L", socket, ...args] : args;
35
+ }
36
+ function readPid(path) {
37
+ try {
38
+ const pid = Number.parseInt(readFileSync(path, "utf8").trim(), 10);
39
+ return Number.isInteger(pid) && pid > 0 ? pid : null;
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ function hasCrashLoop(dataDir, name) {
46
+ try {
47
+ const value = JSON.parse(readFileSync(join(dataDir, "instances", name, "crash-state.json"), "utf8"));
48
+ return Number(value?.crashesInWindow) >= 3;
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }
54
+ export async function connectUnixSocket(path, timeoutMs = 1000) {
55
+ if (!existsSync(path))
56
+ return false;
57
+ return new Promise(resolve => {
58
+ const client = net.createConnection(path);
59
+ let settled = false;
60
+ const finish = (value) => {
61
+ if (settled)
62
+ return;
63
+ settled = true;
64
+ clearTimeout(timer);
65
+ client.destroy();
66
+ resolve(value);
67
+ };
68
+ const timer = setTimeout(() => finish(false), timeoutMs);
69
+ timer.unref?.();
70
+ client.once("connect", () => finish(true));
71
+ client.once("error", () => finish(false));
72
+ });
73
+ }
74
+ /** Collect read-only diagnostics. Dependencies are injectable for deterministic tests. */
75
+ export async function collectDoctorReport(dataDir, service, overrides = {}) {
76
+ const deps = { ...defaultDeps, ...overrides };
77
+ const checks = [];
78
+ const add = (section, status, label, detail) => {
79
+ checks.push({ section, status, label, detail });
80
+ };
81
+ const configPath = join(dataDir, "fleet.yaml");
82
+ let raw = {};
83
+ try {
84
+ raw = loadRawFleetConfig(configPath);
85
+ }
86
+ catch (err) {
87
+ add("Fleet", "error", "fleet.yaml", t("doctor.config_invalid", err.message.split("\n")[0]));
88
+ }
89
+ const defaultBackend = raw.defaults?.backend ?? "claude-code";
90
+ const backendIds = new Set([defaultBackend]);
91
+ for (const config of Object.values(raw.instances ?? {})) {
92
+ backendIds.add(config.backend ?? defaultBackend);
93
+ }
94
+ for (const id of backendIds) {
95
+ // `mock` is an in-process test backend and deliberately has no CLI binary.
96
+ if (id === "mock")
97
+ continue;
98
+ const backend = BACKENDS.find(item => item.id === id);
99
+ if (!backend) {
100
+ add("Prerequisites", "error", t("doctor.backend_label", id), t("doctor.backend_unknown"));
101
+ continue;
102
+ }
103
+ const result = deps.run(backend.binary, ["--version"]);
104
+ const version = String(result.stdout ?? "").trim().split("\n")[0];
105
+ if (!result.error && result.status === 0) {
106
+ add("Prerequisites", "ok", backend.label, version || t("doctor.binary_available", backend.binary));
107
+ }
108
+ else {
109
+ add("Prerequisites", "error", backend.label, t("doctor.binary_missing", backend.binary));
110
+ }
111
+ }
112
+ const tmuxVersion = deps.run("tmux", ["-V"]);
113
+ const tmuxAvailable = !tmuxVersion.error && tmuxVersion.status === 0;
114
+ add("Prerequisites", tmuxAvailable ? "ok" : "error", "tmux", tmuxAvailable ? String(tmuxVersion.stdout ?? "").trim() : t("doctor.not_found"));
115
+ add("Prerequisites", deps.env.TERM ? "ok" : "warn", "TERM", deps.env.TERM || t("doctor.term_unset"));
116
+ const networkFamily = deps.networkFamily();
117
+ const networkFamilyNeedsAttention = networkFamily.autoSelectFamily
118
+ && networkFamily.attemptTimeoutMs < AGEND_NETWORK_FAMILY_ATTEMPT_TIMEOUT_MS;
119
+ add("Prerequisites", networkFamilyNeedsAttention ? "warn" : "ok", t("doctor.network_family"), networkFamily.autoSelectFamily
120
+ ? networkFamilyNeedsAttention
121
+ ? t("doctor.network_family_short", networkFamily.attemptTimeoutMs, AGEND_NETWORK_FAMILY_ATTEMPT_TIMEOUT_MS)
122
+ : t("doctor.network_family_auto", networkFamily.attemptTimeoutMs)
123
+ : t("doctor.network_family_disabled", networkFamily.attemptTimeoutMs));
124
+ if (!service.installed) {
125
+ add("Service", "warn", t("doctor.service_installed"), t("doctor.service_none"));
126
+ }
127
+ else {
128
+ const managerUnavailable = service.manager === "systemd --user"
129
+ ? t("doctor.manager_user_unavailable")
130
+ : t("doctor.manager_unavailable");
131
+ add("Service", "ok", t("doctor.service_installed"), `${service.manager}: ${service.path}`);
132
+ add("Service", service.enabled === true ? "ok" : "warn", t("doctor.service_enabled"), service.enabled == null ? managerUnavailable : service.enabled ? t("doctor.yes") : t("doctor.no_install"));
133
+ add("Service", service.active === true ? "ok" : "warn", t("doctor.service_active"), service.active == null ? managerUnavailable : service.active ? t("doctor.service_running") : t("doctor.inactive_start"));
134
+ }
135
+ if (deps.platform === "linux") {
136
+ add("Service", deps.env.DBUS_SESSION_BUS_ADDRESS ? "ok" : "warn", "D-Bus", deps.env.DBUS_SESSION_BUS_ADDRESS
137
+ ? t("doctor.dbus_set")
138
+ : t("doctor.dbus_unset"));
139
+ }
140
+ const fleetPidPath = join(dataDir, "fleet.pid");
141
+ const fleetPid = readPid(fleetPidPath);
142
+ const fleetAlive = fleetPid != null && deps.processAlive(fleetPid);
143
+ if (!existsSync(fleetPidPath)) {
144
+ add("Fleet", "warn", t("doctor.fleet_process"), t("doctor.pid_missing"));
145
+ }
146
+ else if (fleetPid == null) {
147
+ add("Fleet", "error", t("doctor.fleet_process"), t("doctor.pid_invalid"));
148
+ }
149
+ else if (!fleetAlive) {
150
+ add("Fleet", "error", t("doctor.fleet_process"), t("doctor.pid_stale", fleetPid));
151
+ }
152
+ else {
153
+ add("Fleet", "ok", t("doctor.fleet_process"), t("doctor.pid_alive", fleetPid));
154
+ }
155
+ const sessionName = getTmuxSessionName();
156
+ const tmuxSession = tmuxAvailable
157
+ ? deps.run("tmux", tmuxArgs(["has-session", "-t", sessionName]))
158
+ : null;
159
+ const sessionAlive = !!tmuxSession && !tmuxSession.error && tmuxSession.status === 0;
160
+ add("Fleet", sessionAlive ? "ok" : fleetAlive ? "error" : "warn", t("doctor.tmux_session"), sessionAlive ? t("doctor.session_exists", sessionName) : t("doctor.session_missing", sessionName));
161
+ if (!existsSync(configPath)) {
162
+ add("Fleet", "warn", t("doctor.instances"), t("doctor.config_missing", configPath));
163
+ }
164
+ const names = Object.keys(raw.instances ?? {});
165
+ const counts = { running: 0, paused: 0, stopped: 0, crashed: 0 };
166
+ const runningNames = [];
167
+ for (const name of names) {
168
+ const instanceDir = join(dataDir, "instances", name);
169
+ if (hasPausedMarker(instanceDir)) {
170
+ counts.paused++;
171
+ continue;
172
+ }
173
+ if (hasCrashLoop(dataDir, name)) {
174
+ counts.crashed++;
175
+ continue;
176
+ }
177
+ const pid = readPid(join(instanceDir, "daemon.pid"));
178
+ if (pid != null && deps.processAlive(pid)) {
179
+ counts.running++;
180
+ runningNames.push(name);
181
+ }
182
+ else {
183
+ counts.stopped++;
184
+ }
185
+ }
186
+ add("Fleet", "ok", t("doctor.instances"), t("doctor.instance_counts", counts.running, counts.paused, counts.stopped, counts.crashed, names.length));
187
+ const rawChannels = Array.isArray(raw.channels)
188
+ ? raw.channels
189
+ : raw.channel ? [raw.channel] : [];
190
+ const hasDiscord = rawChannels.some((channel) => channel?.type === "discord");
191
+ if (!hasDiscord) {
192
+ // Telegram and local-only fleets have no Discord Gateway session to inspect.
193
+ }
194
+ else if (!fleetAlive) {
195
+ add("Channel gateways", "warn", t("doctor.gateway_health"), t("doctor.gateway_unknown"));
196
+ }
197
+ else {
198
+ try {
199
+ const healthPort = typeof raw.health_port === "number" ? raw.health_port : 19280;
200
+ const health = await deps.fetchFleetHealth(healthPort);
201
+ const details = health.adapters?.details ?? {};
202
+ const entries = Object.entries(details);
203
+ if (entries.length === 0) {
204
+ add("Channel gateways", "warn", t("doctor.gateway_health"), t("doctor.gateway_no_details"));
205
+ }
206
+ else {
207
+ for (const [id, detail] of entries) {
208
+ const ages = (detail.shards ?? [])
209
+ .map(shard => shard.heartbeatAgeMs)
210
+ .filter((age) => typeof age === "number");
211
+ const newestAge = typeof detail.heartbeatAgeMs === "number"
212
+ ? detail.heartbeatAgeMs
213
+ : ages.length > 0 ? Math.max(...ages) : null;
214
+ const healthy = detail.status === "connected" && detail.isReady === true;
215
+ add("Channel gateways", healthy ? "ok" : "error", id, t("doctor.gateway_detail", detail.status ?? "unknown", detail.reconnectCount ?? 0, newestAge == null ? "—" : `${Math.round(newestAge / 1000)}s`));
216
+ }
217
+ }
218
+ }
219
+ catch (err) {
220
+ add("Channel gateways", "warn", t("doctor.gateway_health"), t("doctor.gateway_unreachable", err.message));
221
+ }
222
+ }
223
+ const ipcResults = await Promise.all(runningNames.map(async (name) => {
224
+ const socketPath = join(dataDir, "instances", name, "channel.sock");
225
+ return { name, socketPath, exists: existsSync(socketPath), connected: await deps.connectSocket(socketPath) };
226
+ }));
227
+ const connected = ipcResults.filter(result => result.connected).length;
228
+ const missing = ipcResults.filter(result => !result.exists).map(result => result.name);
229
+ const unreachable = ipcResults.filter(result => result.exists && !result.connected).map(result => result.name);
230
+ const ipcProblems = [...missing, ...unreachable];
231
+ add("MCP IPC", ipcProblems.length === 0 ? "ok" : "error", "channel.sock", ipcProblems.length === 0
232
+ ? t("doctor.ipc_ok", connected, runningNames.length)
233
+ : t("doctor.ipc_failed", connected, runningNames.length, ipcProblems.join(", ")));
234
+ return {
235
+ checks,
236
+ errors: checks.filter(check => check.status === "error").length,
237
+ warnings: checks.filter(check => check.status === "warn").length,
238
+ };
239
+ }
240
+ export function formatDoctorReport(report) {
241
+ const sectionLabels = {
242
+ Prerequisites: t("doctor.section.prerequisites"),
243
+ Service: t("doctor.section.service"),
244
+ Fleet: t("doctor.section.fleet"),
245
+ "Channel gateways": t("doctor.section.gateways"),
246
+ "MCP IPC": t("doctor.section.ipc"),
247
+ };
248
+ const lines = ["", ` \x1b[1m${t("doctor.title")}\x1b[0m`];
249
+ let section;
250
+ for (const check of report.checks) {
251
+ if (check.section !== section) {
252
+ section = check.section;
253
+ lines.push("", ` \x1b[1m${sectionLabels[section]}\x1b[0m`);
254
+ }
255
+ const icon = check.status === "ok"
256
+ ? "\x1b[32m✓\x1b[0m"
257
+ : check.status === "warn"
258
+ ? "\x1b[33m⚠\x1b[0m"
259
+ : "\x1b[31m✗\x1b[0m";
260
+ lines.push(` ${icon} ${check.label}: ${check.detail}`);
261
+ }
262
+ lines.push("", report.errors === 0
263
+ ? ` \x1b[32m✓ ${t("doctor.complete", report.warnings)}\x1b[0m`
264
+ : ` \x1b[31m✗ ${t("doctor.errors", report.errors, report.warnings)}\x1b[0m`, "");
265
+ return lines.join("\n");
266
+ }
267
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
@@ -54,6 +54,12 @@ export interface FleetContext {
54
54
  readonly classicChannels: ClassicChannelManager | null;
55
55
  getSysInfo(): SysInfo;
56
56
  getInstanceStatus(name: string): "running" | "paused" | "stopped" | "crashed";
57
+ /** Current cancellation epoch stamped onto direct daemon IPC deliveries. */
58
+ getDeliveryEpoch?(name: string): number;
59
+ /** Subscription provider IDs used by running or paused fleet/Classic instances. */
60
+ getActiveUsageProviderIds?(): ReadonlySet<string>;
61
+ /** Effective backend IDs used by running or paused fleet/Classic instances. */
62
+ getActiveBackendIds?(): ReadonlySet<string>;
57
63
  toggleFleetCollab(instanceName: string): boolean;
58
64
  /** Apply a model to an instance (runtime paste or persist + restart). Returns a status string. */
59
65
  applyModel(instanceName: string, model: string): Promise<string>;
@@ -83,6 +89,42 @@ export interface FleetContext {
83
89
  /** Persist and edit one `/update` message across the fleet process restart. */
84
90
  beginUpdateProgress?(adapter: import("./channel/types.js").ChannelAdapter, chatId: string, threadId: string | undefined, messageId: string): void;
85
91
  failUpdateProgress?(message: string): void;
92
+ /** Post one random, not-yet-dismissed tip with a dismiss button. */
93
+ promptTip?(generalName: string, adapter: import("./channel/types.js").ChannelAdapter, chatId: string, threadId?: string): Promise<"posted" | "empty" | "unavailable">;
94
+ /** Persistently enable advanced tips without waiting for the dismissal threshold. */
95
+ unlockAdvancedTips?(userId: string): boolean;
96
+ /** `/login` backend chooser buttons. Caller enforces fleet-admin. */
97
+ promptLoginBackends?(chat: {
98
+ adapter: import("./channel/types.js").ChannelAdapter;
99
+ adapterId: string;
100
+ chatId: string;
101
+ threadId?: string;
102
+ }): Promise<void>;
103
+ /**
104
+ * Start a remote login session for one backend; returns a status line, or
105
+ * null when a still-valid-auth confirmation prompt was posted instead.
106
+ */
107
+ startLoginSession?(backend: string, chat: {
108
+ adapter: import("./channel/types.js").ChannelAdapter;
109
+ adapterId: string;
110
+ chatId: string;
111
+ threadId?: string;
112
+ }, opts?: {
113
+ skipAuthCheck?: boolean;
114
+ }): Promise<string | null>;
115
+ /** Paste admin-supplied text (auth code / start URL) into the login window. */
116
+ loginSubmitInput?(text: string): Promise<string>;
117
+ /** Abort the active login session. */
118
+ cancelLoginSession?(): Promise<string>;
119
+ /** `/install-cli <backend>` — install a CLI in a dedicated window; returns a status line. */
120
+ startInstallSession?(backend: string, chat: {
121
+ adapter: import("./channel/types.js").ChannelAdapter;
122
+ adapterId: string;
123
+ chatId: string;
124
+ threadId?: string;
125
+ }): Promise<string>;
126
+ /** Abort the active install session. */
127
+ cancelInstallSession?(): Promise<string>;
86
128
  /** Human-readable effective model for an instance (resolves inherited defaults). */
87
129
  modelDisplayForInstance?(name: string): string;
88
130
  /**
@@ -100,4 +142,9 @@ export interface FleetContext {
100
142
  applyEffort?(instanceName: string, level: string): Promise<string>;
101
143
  /** TG inline-keyboard effort menu; same contract as promptModelMenu. */
102
144
  promptEffortMenu?(instanceName: string, userId: string, channelId: string, adapter: import("./channel/types.js").ChannelAdapter, chatId: string, threadId?: string): Promise<string | null>;
145
+ /**
146
+ * Post a nonce-armed confirmation before the destructive `/clear` command.
147
+ * Returns null when the buttons were posted, otherwise a user-facing error.
148
+ */
149
+ promptClearConfirmation?(instanceName: string, channelId: string, adapter: import("./channel/types.js").ChannelAdapter, chatId: string, threadId?: string): Promise<string | null>;
103
150
  }