@songsid/agend 2.2.0-beta.2 → 2.2.0-beta.4

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 (131) hide show
  1. package/dist/agent-cli.js +6 -2
  2. package/dist/agent-cli.js.map +1 -1
  3. package/dist/auth-api.js +2 -0
  4. package/dist/auth-api.js.map +1 -1
  5. package/dist/backend/claude-code.d.ts +39 -2
  6. package/dist/backend/claude-code.js +115 -31
  7. package/dist/backend/claude-code.js.map +1 -1
  8. package/dist/backend/credential-profile.d.ts +33 -3
  9. package/dist/backend/credential-profile.js +107 -5
  10. package/dist/backend/credential-profile.js.map +1 -1
  11. package/dist/backend/types.d.ts +1 -1
  12. package/dist/cache-service.d.ts +2 -0
  13. package/dist/cache-service.js +2 -1
  14. package/dist/cache-service.js.map +1 -1
  15. package/dist/channel/adapters/discord.d.ts +14 -1
  16. package/dist/channel/adapters/discord.js +42 -0
  17. package/dist/channel/adapters/discord.js.map +1 -1
  18. package/dist/channel/adapters/telegram.d.ts +18 -3
  19. package/dist/channel/adapters/telegram.js +66 -10
  20. package/dist/channel/adapters/telegram.js.map +1 -1
  21. package/dist/channel/telegram-markdown.d.ts +6 -0
  22. package/dist/channel/telegram-markdown.js +104 -0
  23. package/dist/channel/telegram-markdown.js.map +1 -0
  24. package/dist/channel/tool-router.js +5 -4
  25. package/dist/channel/tool-router.js.map +1 -1
  26. package/dist/channel/types.d.ts +27 -4
  27. package/dist/config-validator.js +10 -5
  28. package/dist/config-validator.js.map +1 -1
  29. package/dist/daemon.d.ts +108 -0
  30. package/dist/daemon.js +432 -32
  31. package/dist/daemon.js.map +1 -1
  32. package/dist/delivery-outbox.d.ts +29 -7
  33. package/dist/delivery-outbox.js +134 -16
  34. package/dist/delivery-outbox.js.map +1 -1
  35. package/dist/delivery-reconciliation.d.ts +18 -1
  36. package/dist/delivery-reconciliation.js +67 -2
  37. package/dist/delivery-reconciliation.js.map +1 -1
  38. package/dist/fleet-context.d.ts +1 -0
  39. package/dist/fleet-manager.d.ts +81 -4
  40. package/dist/fleet-manager.js +452 -85
  41. package/dist/fleet-manager.js.map +1 -1
  42. package/dist/general-knowledge/skills/credential-profiles/SKILL.md +43 -10
  43. package/dist/host-memory.d.ts +10 -0
  44. package/dist/host-memory.js +33 -1
  45. package/dist/host-memory.js.map +1 -1
  46. package/dist/instance-lifecycle.d.ts +25 -6
  47. package/dist/instance-lifecycle.js +73 -26
  48. package/dist/instance-lifecycle.js.map +1 -1
  49. package/dist/locale.js +48 -18
  50. package/dist/locale.js.map +1 -1
  51. package/dist/login-controller.d.ts +20 -3
  52. package/dist/login-controller.js +71 -19
  53. package/dist/login-controller.js.map +1 -1
  54. package/dist/login-flows.d.ts +5 -2
  55. package/dist/login-flows.js +5 -4
  56. package/dist/login-flows.js.map +1 -1
  57. package/dist/memory-pressure.d.ts +13 -1
  58. package/dist/memory-pressure.js +50 -10
  59. package/dist/memory-pressure.js.map +1 -1
  60. package/dist/outbound-handlers.d.ts +63 -0
  61. package/dist/outbound-handlers.js +121 -46
  62. package/dist/outbound-handlers.js.map +1 -1
  63. package/dist/outbound-schemas.d.ts +3 -2
  64. package/dist/outbound-schemas.js +3 -1
  65. package/dist/outbound-schemas.js.map +1 -1
  66. package/dist/public-web-gateway.js +8 -5
  67. package/dist/public-web-gateway.js.map +1 -1
  68. package/dist/settings-api.js +10 -4
  69. package/dist/settings-api.js.map +1 -1
  70. package/dist/settings-change.js +2 -2
  71. package/dist/spawn-gate.js +5 -1
  72. package/dist/spawn-gate.js.map +1 -1
  73. package/dist/spawn-hold-reply.d.ts +12 -0
  74. package/dist/spawn-hold-reply.js +39 -0
  75. package/dist/spawn-hold-reply.js.map +1 -0
  76. package/dist/tips.js +1 -1
  77. package/dist/tips.js.map +1 -1
  78. package/dist/topic-commands.js +9 -2
  79. package/dist/topic-commands.js.map +1 -1
  80. package/dist/transcript-delta-reader.d.ts +3 -3
  81. package/dist/transcript-delta-reader.js +8 -8
  82. package/dist/transcript-delta-reader.js.map +1 -1
  83. package/dist/turn-resume.d.ts +2 -0
  84. package/dist/turn-resume.js +1 -1
  85. package/dist/turn-resume.js.map +1 -1
  86. package/dist/types.d.ts +2 -0
  87. package/dist/ui/chat-mentions.js +63 -0
  88. package/dist/ui/chat-render.js +25 -0
  89. package/dist/ui/chat-store.js +1 -1
  90. package/dist/ui/chat-strings.js +12 -12
  91. package/dist/ui/chat-thread.js +48 -11
  92. package/dist/ui/panel-chat.js +20 -9
  93. package/dist/ui/panel-details.js +2 -0
  94. package/dist/ui/panel-fleet.js +51 -22
  95. package/dist/ui/panel-settings.js +18 -9
  96. package/dist/ui/preview-panel.js +48 -14
  97. package/dist/ui/preview.js +5 -1
  98. package/dist/ui/settings-strings.js +6 -2
  99. package/dist/ui/settings-token.js +1 -1
  100. package/dist/ui/shared/app-i18n.js +35 -13
  101. package/dist/ui/shared/app-prefs.js +249 -0
  102. package/dist/ui/shared/app-shell.js +17 -4
  103. package/dist/ui/shared/app-store.js +5 -1
  104. package/dist/ui/shared/app.css +41 -7
  105. package/dist/ui/shared/app.js +6 -1
  106. package/dist/ui/shared/header-tools.js +55 -5
  107. package/dist/ui/shared/instance-nav.js +131 -38
  108. package/dist/ui/shared/panel-view.js +6 -0
  109. package/dist/ui/shared/theme.js +39 -7
  110. package/dist/ui/shared/ui-icons.js +1 -0
  111. package/dist/ui/shared/usage-dialog.js +13 -4
  112. package/dist/ui/shared/view-strings.js +26 -2
  113. package/dist/unrecognised-prompt.d.ts +23 -0
  114. package/dist/unrecognised-prompt.js +74 -0
  115. package/dist/unrecognised-prompt.js.map +1 -0
  116. package/dist/view-api.js +5 -0
  117. package/dist/view-api.js.map +1 -1
  118. package/dist/web-api.d.ts +13 -1
  119. package/dist/web-api.js +218 -18
  120. package/dist/web-api.js.map +1 -1
  121. package/dist/web-auth.js +3 -2
  122. package/dist/web-auth.js.map +1 -1
  123. package/dist/web-mentions.d.ts +44 -0
  124. package/dist/web-mentions.js +75 -0
  125. package/dist/web-mentions.js.map +1 -0
  126. package/dist/web-prefs.d.ts +63 -0
  127. package/dist/web-prefs.js +263 -0
  128. package/dist/web-prefs.js.map +1 -0
  129. package/dist/web-session.js +1 -1
  130. package/dist/web-session.js.map +1 -1
  131. package/package.json +1 -1
@@ -4,6 +4,8 @@ import { platform } from "node:os";
4
4
  const MiB = 1024 * 1024;
5
5
  export const MEMORY_SAMPLE_MS = 30_000;
6
6
  export const MEMORY_RECOVERY_MS = 30_000;
7
+ /** AgEnD policy, in percent; documented together in docs/memory-pressure.md. */
8
+ export const LINUX_PSI_THRESHOLDS = Object.freeze({ someAvg60Elevated: 10, fullAvg10Elevated: 5, fullAvg10Critical: 20 });
7
9
  /** One fleet sampler/policy, shared by spawn admission and health. Linux reads stay synchronous; macOS uses a bounded async probe. */
8
10
  export class MemoryPressure {
9
11
  options;
@@ -22,13 +24,18 @@ export class MemoryPressure {
22
24
  history = [];
23
25
  listeners = new Set();
24
26
  recoveryUntil = 0;
27
+ // A PSI level cannot arm RAM/swap release thresholds. Track actual triggers,
28
+ // including ones masked by simultaneous PSI, independently of the aggregate.
29
+ ramCriticalHeld = false;
30
+ ramLowHeld = false;
31
+ ramSwapHeld = false;
25
32
  current = {
26
33
  level: "unknown", memory: null, sampledAt: null, recovering: false, samples: 0, trend: null,
27
34
  };
28
35
  constructor(options = {}) {
29
36
  this.options = options;
30
37
  this.platform = options.platform ?? platform();
31
- this.read = options.read ?? (() => readHostMemory({ platform: this.platform }));
38
+ this.read = options.read ?? (() => readHostMemory({ platform: this.platform, includePressure: this.platform === "linux" }));
32
39
  this.now = options.now ?? Date.now;
33
40
  this.monotonicNow = options.monotonicNow ?? (() => performance.now());
34
41
  this.native = this.platform === "darwin" && !options.read ? options.darwinProbe ?? new DarwinMemoryProbe({ includePressure: true }) : null;
@@ -59,14 +66,17 @@ export class MemoryPressure {
59
66
  return this.snapshot();
60
67
  this.recoveryUntil = (this.platform === "darwin" ? this.monotonicNow() : this.now()) + MEMORY_RECOVERY_MS;
61
68
  this.current = { ...this.current, recovering: true,
69
+ ...(this.platform === "linux" && this.current.level === "normal" ? { signal: "recovery" } : {}),
62
70
  level: this.current.level === "normal" ? "elevated" : this.current.level };
63
71
  return this.snapshot();
64
72
  }
65
73
  /** Health readers cannot create samples or move recovery deadlines. */
66
74
  snapshot() {
67
- return { ...this.current, memory: this.current.memory && { ...this.current.memory }, trend: this.current.trend && { ...this.current.trend } };
75
+ return { ...this.current, memory: this.current.memory && { ...this.current.memory,
76
+ ...(this.current.memory.linuxPsi !== undefined ? { linuxPsi: this.current.memory.linuxPsi && { ...this.current.memory.linuxPsi } } : {}) },
77
+ trend: this.current.trend && { ...this.current.trend } };
68
78
  }
69
- /** Unknown Darwin kernel alarms cannot restrict admission or spend a notice cooldown. Linux is unchanged. */
79
+ /** Only unknown Darwin kernel alarms bypass pressure admission; unavailable Linux PSI uses RAM fallback. */
70
80
  advisoryOnly() {
71
81
  return this.platform === "darwin" && this.current.level === "unknown";
72
82
  }
@@ -134,6 +144,11 @@ export class MemoryPressure {
134
144
  if (value && Number.isFinite(value.totalBytes) && value.totalBytes > 0
135
145
  && value.availableBytes !== null && Number.isFinite(value.availableBytes) && value.availableBytes >= 0 && value.availableBytes <= value.totalBytes) {
136
146
  memory = { ...value, availableBytes: value.availableBytes };
147
+ if (value.linuxPsi !== undefined) {
148
+ const psi = value.linuxPsi;
149
+ memory.linuxPsi = psi && [psi.someAvg60, psi.fullAvg10].every(n => Number.isFinite(n) && n >= 0 && n <= 100)
150
+ ? { ...psi } : null;
151
+ }
137
152
  if (value.swapTotalBytes === null || value.swapFreeBytes === null
138
153
  || !Number.isFinite(value.swapTotalBytes) || !Number.isFinite(value.swapFreeBytes)
139
154
  || value.swapTotalBytes < 0 || value.swapFreeBytes < 0 || value.swapFreeBytes > value.swapTotalBytes) {
@@ -143,27 +158,50 @@ export class MemoryPressure {
143
158
  }
144
159
  catch { /* Unavailable data slows admissions; it cannot deadlock the fleet. */ }
145
160
  let level = "unknown";
161
+ let signal = null;
146
162
  if (memory) {
163
+ const linux = this.platform === "linux";
164
+ const psi = linux ? memory.linuxPsi : null;
147
165
  const critical = Math.max(this.options.criticalBytes ?? 300 * MiB, memory.totalBytes * 0.02);
148
166
  const low = Math.max(critical * 2, memory.totalBytes * 0.05);
149
167
  const swapRatio = memory.swapTotalBytes && memory.swapFreeBytes !== null
150
168
  ? memory.swapFreeBytes / memory.swapTotalBytes : null;
151
169
  const swapTight = swapRatio !== null && swapRatio <= 0.05;
152
- const criticalNow = memory.availableKind === "available"
170
+ const psiCritical = !!psi && psi.fullAvg10 >= LINUX_PSI_THRESHOLDS.fullAvg10Critical;
171
+ const psiFullElevated = !!psi && psi.fullAvg10 >= LINUX_PSI_THRESHOLDS.fullAvg10Elevated;
172
+ const psiSomeElevated = !!psi && psi.someAvg60 >= LINUX_PSI_THRESHOLDS.someAvg60Elevated;
173
+ const ramCritical = memory.availableKind === "available"
153
174
  && (memory.availableBytes < critical || (memory.availableBytes < low && swapTight));
175
+ const swapCanElevate = !linux || (!psi && memory.availableBytes < low * 2);
176
+ const swapLingering = swapCanElevate && swapRatio !== null && swapRatio <= 0.1;
177
+ if (linux) {
178
+ this.ramCriticalHeld = ramCritical || (this.ramCriticalHeld
179
+ && memory.availableKind === "available" && memory.availableBytes < critical * 1.5);
180
+ this.ramLowHeld = memory.availableBytes < low || (this.ramLowHeld && memory.availableBytes < low * 1.2);
181
+ this.ramSwapHeld = (swapTight && swapCanElevate) || (this.ramSwapHeld && swapLingering);
182
+ }
183
+ const ramCriticalHold = linux ? this.ramCriticalHeld : ramCritical || (this.current.level === "critical"
184
+ && memory.availableKind === "available" && memory.availableBytes < critical * 1.5);
185
+ const ramLowHold = linux ? this.ramLowHeld : memory.availableBytes < low
186
+ || (this.current.level === "elevated" && memory.availableBytes < low * 1.2);
187
+ const ramSwapHold = linux ? this.ramSwapHeld : (swapTight && swapCanElevate)
188
+ || (this.current.level === "elevated" && swapLingering);
154
189
  // MemFree alone cannot distinguish healthy reclaimable cache from pressure.
155
190
  // It can throttle, but must never impose an indefinite Linux procfs-failure hold.
156
- if (criticalNow || (this.current.level === "critical"
157
- && memory.availableKind === "available" && memory.availableBytes < critical * 1.5)) {
191
+ if (psiCritical || ramCriticalHold) {
158
192
  level = "critical";
193
+ signal = psiCritical ? "psi-full" : memory.availableBytes < critical || !ramCritical ? "available" : "available-swap";
159
194
  this.recoveryUntil = 0;
160
195
  }
161
196
  else {
162
197
  if (this.current.level === "critical")
163
198
  this.recoveryUntil = at + MEMORY_RECOVERY_MS;
164
- const lingering = this.current.level === "elevated"
165
- && (memory.availableBytes < low * 1.2 || (swapRatio !== null && swapRatio <= 0.1));
166
- level = memory.availableBytes < low || swapTight || lingering || at < this.recoveryUntil ? "elevated" : "normal";
199
+ // Cold swap is not pressure. Its fallback and release hysteresis need low RAM too.
200
+ level = psiFullElevated || psiSomeElevated || ramLowHold || ramSwapHold
201
+ || at < this.recoveryUntil ? "elevated" : "normal";
202
+ if (level === "elevated")
203
+ signal = psiFullElevated ? "psi-full" : psiSomeElevated ? "psi-some"
204
+ : ramLowHold ? "available" : ramSwapHold ? "available-swap" : "recovery";
167
205
  }
168
206
  const last = this.history.at(-1);
169
207
  // Admission bursts must not fill history with near-identical microsecond samples.
@@ -176,6 +214,7 @@ export class MemoryPressure {
176
214
  else {
177
215
  this.history = [];
178
216
  this.recoveryUntil = 0;
217
+ this.ramCriticalHeld = this.ramLowHeld = this.ramSwapHeld = false;
179
218
  }
180
219
  let trend = null;
181
220
  const first = this.history[0];
@@ -189,7 +228,8 @@ export class MemoryPressure {
189
228
  ? (last.memory.swapFreeBytes - first.memory.swapFreeBytes) / minutes : null,
190
229
  };
191
230
  }
192
- this.current = { level, memory, sampledAt: at, recovering: at < this.recoveryUntil, samples: this.history.length, trend };
231
+ this.current = { level, memory, sampledAt: at, recovering: at < this.recoveryUntil, samples: this.history.length, trend,
232
+ ...(this.platform === "linux" ? { signal } : {}) };
193
233
  if (this.timer) {
194
234
  try {
195
235
  this.options.onSample?.(this.snapshot());
@@ -1 +1 @@
1
- {"version":3,"file":"memory-pressure.js","sourceRoot":"","sources":["../src/memory-pressure.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory-pressure.js","sourceRoot":"","sources":["../src/memory-pressure.ts"],"names":[],"mappings":"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"}
@@ -84,6 +84,8 @@ export interface OutboundContext {
84
84
  /** Post a notice into an instance's own topic (used to report failed deliveries). */
85
85
  notifyInstanceTopic?(instanceName: string, text: string): void;
86
86
  sendCancelButton?(instanceName: string, correlationId?: string): Promise<void>;
87
+ /** Push a web UI event; a "message" is recorded in the instance's web chat history (#1565). */
88
+ emitSseEvent?(event: string, data: unknown): void;
87
89
  clearCancelButton?(instanceName: string): void;
88
90
  clearCancelButtonByCorrelation?(correlationId: string): void;
89
91
  getInstanceInteraction?(name: string): InteractionSnapshot | null;
@@ -126,5 +128,66 @@ export declare function setCrossInstanceRetryForTests(cfg: {
126
128
  } | null): void;
127
129
  /** Long enough for the relaunched CLI to be listening; matches replace_instance. */
128
130
  export declare const PROFILE_HANDOVER_SETTLE_MS = 3000;
131
+ /**
132
+ * #1692: the one creation of a team — create_team (agents) and POST /ui/teams (the web) both come here. Members must be
133
+ * instances fleet.yaml defines (own keys; repeats dropped); an existing team is never overwritten (409); a name every
134
+ * object already has (`__proto__`, `constructor`, `toString`…) is not a team name. The team and its save are one: a
135
+ * save that throws removes it again (500).
136
+ */
137
+ export declare function commitTeamCreate(fleetConfig: {
138
+ instances: Record<string, unknown>;
139
+ teams?: Record<string, {
140
+ members: string[];
141
+ description?: string;
142
+ }>;
143
+ } | null, args: {
144
+ name: string;
145
+ members: string[];
146
+ description?: string;
147
+ }, save: () => void): {
148
+ ok: true;
149
+ result: {
150
+ created: string;
151
+ members: string[];
152
+ };
153
+ } | {
154
+ ok: false;
155
+ status: 400 | 409 | 500;
156
+ error: string;
157
+ };
158
+ /**
159
+ * #1689: the one update of a team — update_team (agents) and PATCH /ui/teams/<name> (the web) both come here. Own keys
160
+ * only: a team or an instance is one fleet.yaml defines (`__proto__` and `constructor` are not); nothing changes unless
161
+ * everything is valid. `description`: "" clears it. Renaming is not an update (the org chart and agents name teams).
162
+ * The caller saves fleet.yaml after an ok.
163
+ */
164
+ export declare function applyTeamUpdate(fleetConfig: {
165
+ instances: Record<string, unknown>;
166
+ teams?: Record<string, {
167
+ members: string[];
168
+ description?: string;
169
+ }>;
170
+ } | null, args: {
171
+ name: string;
172
+ add?: string[];
173
+ remove?: string[];
174
+ description?: string;
175
+ }): {
176
+ ok: true;
177
+ result: {
178
+ name: string;
179
+ members: string[];
180
+ description: string | null;
181
+ };
182
+ } | {
183
+ ok: false;
184
+ status: 400 | 404 | 500;
185
+ error: string;
186
+ };
187
+ /**
188
+ * #1689 review: the update and its save as one — a save that fails (an I/O error) puts the team back as it was, so the
189
+ * live fleet never differs from fleet.yaml; that is a 500 (the input was fine), not a 400.
190
+ */
191
+ export declare function commitTeamUpdate(fleetConfig: Parameters<typeof applyTeamUpdate>[0], args: Parameters<typeof applyTeamUpdate>[1], save: () => void): ReturnType<typeof applyTeamUpdate>;
129
192
  export declare const outboundHandlers: Map<string, Handler>;
130
193
  export {};
@@ -11,7 +11,7 @@ import { truncatePreview } from "./channel/markdown-chunk.js";
11
11
  import { crossInstanceVisibility, senderTopicNotice, targetTopicNotice } from "./cross-instance-notice.js";
12
12
  import { instanceSupportsSteer } from "./steer-capability.js";
13
13
  import { assignDisplayLabels, displayInstanceName, readStatuslineModel } from "./topic-commands.js";
14
- import { credentialProfileLogin, credentialSwitchStartsFresh, instanceCredentialProfile } from "./backend/credential-profile.js";
14
+ import { CHAT_PROFILE_LOGIN_BACKENDS, credentialProfileLogin, credentialSwitchStartsFresh, instanceCredentialProfile } from "./backend/credential-profile.js";
15
15
  import { kiroEngineCandidates, kiroEngineStatus } from "./kiro-engine-status.js";
16
16
  import { formatCrossInstanceInboundMessage, MAX_ASSEMBLED_CROSS_INSTANCE_MESSAGE_BYTES, } from "./cross-instance-envelope.js";
17
17
  import { BroadcastArgs, CreateInstanceArgs, CreateTeamArgs, DelegateTaskArgs, DeleteInstanceArgs, DeleteTeamArgs, DeployTemplateArgs, DescribeInstanceArgs, ListDeploymentsArgs, ListInstancesArgs, ListTeamsArgs, ReplaceInstanceArgs, ReportResultArgs, DeliveryStatusArgs, RequestInformationArgs, RestartInstanceArgs, SendToInstanceArgs, PauseInstanceArgs, WakeInstanceArgs, StopInstanceArgs, GetInstanceLogsArgs, GetEffortArgs, KiroEngineStatusArgs, GetUsageArgs, ListModelsArgs, GetFleetConfigArgs, UpdateInstanceConfigArgs, UpdateFleetDefaultsArgs, StartInstanceArgs, TeardownDeploymentArgs, UpdateTeamArgs, validateArgs, } from "./outbound-schemas.js";
@@ -336,33 +336,43 @@ const sendToInstance = async (ctx, rawArgs, respond, meta) => {
336
336
  displayName: ctx.fleetConfig?.instances[name]?.display_name,
337
337
  })));
338
338
  const displayLabel = (name) => fleetLabels.get(name) ?? displayInstanceName(name, ctx.fleetConfig?.instances[name]?.display_name);
339
+ const instances = ctx.fleetConfig?.instances ?? {};
340
+ const notice = { label: `${displayLabel(senderLabel)} → ${displayLabel(targetName)}`, message, requestKind, taskSummary: ipcMeta.task_summary };
341
+ const targetInstance = instances[targetInstanceName];
342
+ const targetIsGeneral = targetInstance?.general_topic === true;
343
+ const targetText = targetTopicNotice(crossInstanceVisibility(ctx.fleetConfig, targetInstanceName), notice);
344
+ const targetShown = targetText !== null && !targetIsGeneral && !ctx.sessionRegistry.has(targetName);
345
+ const senderInstance = instances[meta.instanceName];
346
+ const senderIsGeneral = senderInstance?.general_topic === true;
347
+ const senderText = senderTopicNotice(crossInstanceVisibility(ctx.fleetConfig, meta.instanceName), notice);
348
+ const senderShown = senderText !== null && !senderIsGeneral;
339
349
  if (groupId && ctx.adapter) {
340
- const instances = ctx.fleetConfig?.instances ?? {};
341
- const notificationLabel = `${displayLabel(senderLabel)} → ${displayLabel(targetName)}`;
342
- const notice = { label: notificationLabel, message, requestKind, taskSummary: ipcMeta.task_summary };
343
350
  // ── Target topic notification ──
344
- const targetInstance = instances[targetInstanceName];
345
351
  const targetTopicId = targetInstance?.topic_id;
346
- const targetIsGeneral = targetInstance?.general_topic === true;
347
- const targetText = targetTopicNotice(crossInstanceVisibility(ctx.fleetConfig, targetInstanceName), notice);
348
- if (targetText !== null && targetTopicId && !targetIsGeneral && !ctx.sessionRegistry.has(targetName)) {
352
+ if (targetShown && targetTopicId) {
349
353
  const targetAdapter = ctx.getAdapterForInstance?.(targetInstanceName) ?? ctx.adapter;
350
354
  const targetGroupId = ctx.getGroupIdForInstance?.(targetInstanceName) ?? String(groupId);
351
355
  targetAdapter.sendText(String(targetGroupId), targetText, { threadId: String(targetTopicId) })
352
356
  .catch(e => ctx.logger.warn({ err: e }, "Failed to post target topic notification"));
353
357
  }
354
358
  // ── Sender topic notification ──
355
- const senderInstance = instances[meta.instanceName];
356
359
  const senderTopicId = senderInstance?.topic_id;
357
- const senderIsGeneral = senderInstance?.general_topic === true;
358
- const senderText = senderTopicNotice(crossInstanceVisibility(ctx.fleetConfig, meta.instanceName), notice);
359
- if (senderText !== null && senderTopicId && !senderIsGeneral) {
360
+ if (senderShown && senderTopicId) {
360
361
  const senderAdapter = ctx.getAdapterForInstance?.(meta.instanceName) ?? ctx.adapter;
361
362
  const senderGroupId = ctx.getGroupIdForInstance?.(meta.instanceName) ?? String(groupId);
362
363
  senderAdapter.sendText(senderGroupId, senderText, { threadId: String(senderTopicId) })
363
364
  .catch(e => ctx.logger.warn({ err: e }, "Failed to post sender topic notification"));
364
365
  }
365
366
  }
367
+ // #1672: the same notices in each instance's web chat — a muted status line, never an agent's or a person's message.
368
+ // Not gated on a topic or a chat platform (a web-only fleet, a topic-less instance); recorded in its history (#1565).
369
+ const webNotice = (instance, text) => ctx.emitSseEvent?.("message", {
370
+ instance, sender: displayLabel(senderLabel), role: "status", text, ts: new Date().toISOString(),
371
+ });
372
+ if (targetShown)
373
+ webNotice(targetInstanceName, targetText);
374
+ if (senderShown)
375
+ webNotice(meta.instanceName, senderText);
366
376
  // #856: the same line, now carrying the envelope's message_id and a short
367
377
  // content digest, so a disputed message can be matched to its outbox row
368
378
  // and paste digests without adding a log line per delivery.
@@ -1029,7 +1039,9 @@ const updateInstanceConfig = (ctx, rawArgs, respond) => {
1029
1039
  const login = credentialProfileLogin(ctx.dataDir, backendAfter, profileAfter);
1030
1040
  if (login.state === "signed-out") {
1031
1041
  rollback();
1032
- respond(null, `Rejected: credential profile "${profileAfter}" has no ${backendAfter} login yet, and switching to it would leave the agent waiting at a sign-in prompt. Log it in first:\n ${login.loginCommand}`);
1042
+ // #1699 part 2: a claude-code profile can also be signed in from chat, in the browser terminal.
1043
+ const fromChat = CHAT_PROFILE_LOGIN_BACKENDS.has(backendAfter) ? `\n or from chat: /login ${backendAfter} ${profileAfter}` : "";
1044
+ respond(null, `Rejected: credential profile "${profileAfter}" has no ${backendAfter} login yet, and switching to it would leave the agent waiting at a sign-in prompt. Log it in first:\n ${login.loginCommand}${fromChat}`);
1033
1045
  return;
1034
1046
  }
1035
1047
  }
@@ -1404,30 +1416,50 @@ const broadcast = async (ctx, rawArgs, respond, meta) => {
1404
1416
  });
1405
1417
  };
1406
1418
  // ── Teams ────────────────────────────────────────────────────────────────
1419
+ /**
1420
+ * #1692: the one creation of a team — create_team (agents) and POST /ui/teams (the web) both come here. Members must be
1421
+ * instances fleet.yaml defines (own keys; repeats dropped); an existing team is never overwritten (409); a name every
1422
+ * object already has (`__proto__`, `constructor`, `toString`…) is not a team name. The team and its save are one: a
1423
+ * save that throws removes it again (500).
1424
+ */
1425
+ export function commitTeamCreate(fleetConfig, args, save) {
1426
+ if (!fleetConfig)
1427
+ return { ok: false, status: 500, error: "Fleet config not available" };
1428
+ if (args.name in Object.prototype)
1429
+ return { ok: false, status: 400, error: `Invalid team name: ${args.name}` };
1430
+ const invalid = args.members.filter(m => !Object.hasOwn(fleetConfig.instances, m));
1431
+ if (invalid.length)
1432
+ return { ok: false, status: 400, error: `Invalid instance names: ${invalid.join(", ")}` };
1433
+ if (fleetConfig.teams && Object.hasOwn(fleetConfig.teams, args.name))
1434
+ return { ok: false, status: 409, error: `Team already exists: ${args.name}` };
1435
+ const createdMap = !fleetConfig.teams;
1436
+ const teams = (fleetConfig.teams ??= {});
1437
+ const members = [...new Set(args.members)];
1438
+ const description = args.description?.trim();
1439
+ teams[args.name] = { members, ...(description ? { description } : {}) };
1440
+ try {
1441
+ save();
1442
+ }
1443
+ catch (err) {
1444
+ delete teams[args.name];
1445
+ if (createdMap)
1446
+ delete fleetConfig.teams;
1447
+ return { ok: false, status: 500, error: `Saving fleet.yaml failed; no team was created: ${err?.message ?? String(err)}` };
1448
+ }
1449
+ return { ok: true, result: { created: args.name, members } };
1450
+ }
1407
1451
  const createTeam = (ctx, rawArgs, respond) => {
1408
1452
  const v = validateArgs(CreateTeamArgs, rawArgs, "create_team");
1409
1453
  if (!v.ok) {
1410
1454
  respond(null, v.error);
1411
1455
  return;
1412
1456
  }
1413
- const { name, members, description } = v.data;
1414
- if (!ctx.fleetConfig) {
1415
- respond(null, "Fleet config not available");
1416
- return;
1417
- }
1418
- const invalid = members.filter(m => !ctx.fleetConfig.instances[m]);
1419
- if (invalid.length) {
1420
- respond(null, `Invalid instance names: ${invalid.join(", ")}`);
1421
- return;
1422
- }
1423
- ctx.fleetConfig.teams ??= {};
1424
- if (ctx.fleetConfig.teams[name]) {
1425
- respond(null, `Team already exists: ${name}`);
1457
+ const r = commitTeamCreate(ctx.fleetConfig, v.data, () => ctx.saveFleetConfig());
1458
+ if (!r.ok) {
1459
+ respond(null, r.error);
1426
1460
  return;
1427
1461
  }
1428
- ctx.fleetConfig.teams[name] = { members, ...(description ? { description } : {}) };
1429
- ctx.saveFleetConfig();
1430
- respond({ created: name, members });
1462
+ respond(r.result);
1431
1463
  };
1432
1464
  const deleteTeam = (ctx, rawArgs, respond) => {
1433
1465
  const v = validateArgs(DeleteTeamArgs, rawArgs, "delete_team");
@@ -1461,31 +1493,74 @@ const listTeams = (ctx, rawArgs, respond) => {
1461
1493
  }));
1462
1494
  respond(result);
1463
1495
  };
1496
+ /**
1497
+ * #1689: the one update of a team — update_team (agents) and PATCH /ui/teams/<name> (the web) both come here. Own keys
1498
+ * only: a team or an instance is one fleet.yaml defines (`__proto__` and `constructor` are not); nothing changes unless
1499
+ * everything is valid. `description`: "" clears it. Renaming is not an update (the org chart and agents name teams).
1500
+ * The caller saves fleet.yaml after an ok.
1501
+ */
1502
+ export function applyTeamUpdate(fleetConfig, args) {
1503
+ if (!fleetConfig)
1504
+ return { ok: false, status: 500, error: "Fleet config not available" };
1505
+ const teams = fleetConfig.teams;
1506
+ if (!teams || !Object.hasOwn(teams, args.name))
1507
+ return { ok: false, status: 404, error: `Team not found: ${args.name}` };
1508
+ const team = teams[args.name];
1509
+ const invalid = (args.add ?? []).filter(m => !Object.hasOwn(fleetConfig.instances, m));
1510
+ if (invalid.length)
1511
+ return { ok: false, status: 400, error: `Invalid instance names: ${invalid.join(", ")}` };
1512
+ let members = [...team.members];
1513
+ if (args.add?.length)
1514
+ members = [...new Set([...members, ...args.add])];
1515
+ if (args.remove?.length)
1516
+ members = members.filter(m => !args.remove.includes(m));
1517
+ team.members = members;
1518
+ if (args.description !== undefined) {
1519
+ if (args.description.trim())
1520
+ team.description = args.description.trim();
1521
+ else
1522
+ delete team.description;
1523
+ }
1524
+ return { ok: true, result: { name: args.name, members: team.members, description: team.description ?? null } };
1525
+ }
1526
+ /**
1527
+ * #1689 review: the update and its save as one — a save that fails (an I/O error) puts the team back as it was, so the
1528
+ * live fleet never differs from fleet.yaml; that is a 500 (the input was fine), not a 400.
1529
+ */
1530
+ export function commitTeamUpdate(fleetConfig, args, save) {
1531
+ const teams = fleetConfig?.teams;
1532
+ const team = teams && Object.hasOwn(teams, args.name) ? teams[args.name] : null;
1533
+ const before = team ? { members: [...team.members], hadDescription: Object.hasOwn(team, "description"), description: team.description } : null;
1534
+ const r = applyTeamUpdate(fleetConfig, args);
1535
+ if (!r.ok)
1536
+ return r;
1537
+ try {
1538
+ save();
1539
+ }
1540
+ catch (err) {
1541
+ if (team && before) {
1542
+ team.members = before.members;
1543
+ if (before.hadDescription)
1544
+ team.description = before.description;
1545
+ else
1546
+ delete team.description;
1547
+ }
1548
+ return { ok: false, status: 500, error: `Saving fleet.yaml failed; the team is unchanged: ${err?.message ?? String(err)}` };
1549
+ }
1550
+ return r;
1551
+ }
1464
1552
  const updateTeam = (ctx, rawArgs, respond) => {
1465
1553
  const v = validateArgs(UpdateTeamArgs, rawArgs, "update_team");
1466
1554
  if (!v.ok) {
1467
1555
  respond(null, v.error);
1468
1556
  return;
1469
1557
  }
1470
- const { name, add, remove } = v.data;
1471
- if (!ctx.fleetConfig?.teams?.[name]) {
1472
- respond(null, `Team not found: ${name}`);
1558
+ const r = commitTeamUpdate(ctx.fleetConfig, v.data, () => ctx.saveFleetConfig());
1559
+ if (!r.ok) {
1560
+ respond(null, r.error);
1473
1561
  return;
1474
1562
  }
1475
- const team = ctx.fleetConfig.teams[name];
1476
- if (add?.length) {
1477
- const invalid = add.filter(m => !ctx.fleetConfig.instances[m]);
1478
- if (invalid.length) {
1479
- respond(null, `Invalid instance names: ${invalid.join(", ")}`);
1480
- return;
1481
- }
1482
- team.members = [...new Set([...team.members, ...add])];
1483
- }
1484
- if (remove?.length) {
1485
- team.members = team.members.filter(m => !remove.includes(m));
1486
- }
1487
- ctx.saveFleetConfig();
1488
- respond({ name, members: team.members });
1563
+ respond(r.result);
1489
1564
  };
1490
1565
  // ── Fleet Templates ────────────────────────────────────────────────────
1491
1566
  const deployTemplate = async (ctx, rawArgs, respond) => {