@songsid/agend 2.1.10 → 2.1.11-beta.1

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 (107) hide show
  1. package/dist/backend/antigravity.js +3 -2
  2. package/dist/backend/antigravity.js.map +1 -1
  3. package/dist/backend/claude-code.d.ts +7 -0
  4. package/dist/backend/claude-code.js +107 -3
  5. package/dist/backend/claude-code.js.map +1 -1
  6. package/dist/backend/cli-env-probe-worker.js +2 -10
  7. package/dist/backend/cli-env-probe-worker.js.map +1 -1
  8. package/dist/backend/cli-env-probe.d.ts +14 -0
  9. package/dist/backend/cli-env-probe.js +13 -0
  10. package/dist/backend/cli-env-probe.js.map +1 -0
  11. package/dist/backend/codex-metadata.d.ts +14 -0
  12. package/dist/backend/codex-metadata.js +70 -0
  13. package/dist/backend/codex-metadata.js.map +1 -0
  14. package/dist/backend/codex.d.ts +1 -2
  15. package/dist/backend/codex.js +112 -65
  16. package/dist/backend/codex.js.map +1 -1
  17. package/dist/backend/effort-metadata.d.ts +32 -0
  18. package/dist/backend/effort-metadata.js +21 -0
  19. package/dist/backend/effort-metadata.js.map +1 -0
  20. package/dist/backend/grok.js +3 -2
  21. package/dist/backend/grok.js.map +1 -1
  22. package/dist/backend/kiro.d.ts +3 -0
  23. package/dist/backend/kiro.js +19 -4
  24. package/dist/backend/kiro.js.map +1 -1
  25. package/dist/backend/muse.js +3 -2
  26. package/dist/backend/muse.js.map +1 -1
  27. package/dist/backend/opencode.d.ts +31 -4
  28. package/dist/backend/opencode.js +66 -23
  29. package/dist/backend/opencode.js.map +1 -1
  30. package/dist/backend/types.d.ts +14 -1
  31. package/dist/backend/types.js.map +1 -1
  32. package/dist/channel/adapters/discord.js +10 -2
  33. package/dist/channel/adapters/discord.js.map +1 -1
  34. package/dist/cli.js +48 -6
  35. package/dist/cli.js.map +1 -1
  36. package/dist/config.js +1 -0
  37. package/dist/config.js.map +1 -1
  38. package/dist/daemon.d.ts +24 -0
  39. package/dist/daemon.js +109 -12
  40. package/dist/daemon.js.map +1 -1
  41. package/dist/doctor.d.ts +3 -1
  42. package/dist/doctor.js +11 -0
  43. package/dist/doctor.js.map +1 -1
  44. package/dist/fleet-context.d.ts +2 -2
  45. package/dist/fleet-control-audit.d.ts +83 -0
  46. package/dist/fleet-control-audit.js +195 -0
  47. package/dist/fleet-control-audit.js.map +1 -0
  48. package/dist/fleet-manager.d.ts +45 -35
  49. package/dist/fleet-manager.js +327 -384
  50. package/dist/fleet-manager.js.map +1 -1
  51. package/dist/full-restart.js +2 -1
  52. package/dist/full-restart.js.map +1 -1
  53. package/dist/general-knowledge/skills/fleet-config/SKILL.md +3 -2
  54. package/dist/host-memory.d.ts +16 -0
  55. package/dist/host-memory.js +32 -0
  56. package/dist/host-memory.js.map +1 -0
  57. package/dist/instance-lifecycle.js +4 -1
  58. package/dist/instance-lifecycle.js.map +1 -1
  59. package/dist/locale.js +62 -16
  60. package/dist/locale.js.map +1 -1
  61. package/dist/log-tail.d.ts +34 -0
  62. package/dist/log-tail.js +66 -0
  63. package/dist/log-tail.js.map +1 -0
  64. package/dist/logger.d.ts +15 -0
  65. package/dist/logger.js +89 -1
  66. package/dist/logger.js.map +1 -1
  67. package/dist/login-controller.d.ts +1 -3
  68. package/dist/login-controller.js +2 -6
  69. package/dist/login-controller.js.map +1 -1
  70. package/dist/login-flows.d.ts +0 -8
  71. package/dist/login-flows.js +1 -11
  72. package/dist/login-flows.js.map +1 -1
  73. package/dist/login-manager.d.ts +5 -20
  74. package/dist/login-manager.js +0 -53
  75. package/dist/login-manager.js.map +1 -1
  76. package/dist/login-window-lock.d.ts +1 -1
  77. package/dist/login-window-lock.js +1 -1
  78. package/dist/memory-pressure.d.ts +41 -0
  79. package/dist/memory-pressure.js +117 -0
  80. package/dist/memory-pressure.js.map +1 -0
  81. package/dist/probe-worker-pool.d.ts +28 -0
  82. package/dist/probe-worker-pool.js +129 -0
  83. package/dist/probe-worker-pool.js.map +1 -0
  84. package/dist/resource-report.d.ts +31 -0
  85. package/dist/resource-report.js +209 -0
  86. package/dist/resource-report.js.map +1 -0
  87. package/dist/rollout-index.d.ts +66 -0
  88. package/dist/rollout-index.js +124 -0
  89. package/dist/rollout-index.js.map +1 -0
  90. package/dist/slash-authz.d.ts +50 -0
  91. package/dist/slash-authz.js +19 -0
  92. package/dist/slash-authz.js.map +1 -0
  93. package/dist/spawn-gate.d.ts +13 -1
  94. package/dist/spawn-gate.js +108 -39
  95. package/dist/spawn-gate.js.map +1 -1
  96. package/dist/storm-window.d.ts +42 -0
  97. package/dist/storm-window.js +84 -1
  98. package/dist/storm-window.js.map +1 -1
  99. package/dist/topic-commands.d.ts +29 -2
  100. package/dist/topic-commands.js +77 -21
  101. package/dist/topic-commands.js.map +1 -1
  102. package/dist/transcript-sources.d.ts +21 -4
  103. package/dist/transcript-sources.js +55 -41
  104. package/dist/transcript-sources.js.map +1 -1
  105. package/dist/types.d.ts +5 -1
  106. package/dist/ui/settings.html +14 -13
  107. package/package.json +1 -1
@@ -22,7 +22,17 @@ export class StormWindow extends EventEmitter {
22
22
  backoffsMs;
23
23
  stableResetMs;
24
24
  recoveryTimeoutMs;
25
+ windowLossThreshold;
26
+ /** The span in which `windowLossThreshold` distinct losses make one event. */
27
+ windowLossWindowMs;
25
28
  phase = "closed";
29
+ kind = "server";
30
+ windowLosses = new Map();
31
+ /**
32
+ * Instances whose last respawn finished outside a storm. A fresh loss withdraws
33
+ * the entry (noteWindowLoss), so it only ever speaks for the loss it followed.
34
+ */
35
+ windowLossRecovered = new Set();
26
36
  generation = 0;
27
37
  crashLevel = 0;
28
38
  crashCount = 0;
@@ -47,10 +57,13 @@ export class StormWindow extends EventEmitter {
47
57
  this.backoffsMs = options.backoffsMs ?? [30_000, 2 * 60_000, 10 * 60_000];
48
58
  this.stableResetMs = options.stableResetMs ?? 10 * 60_000;
49
59
  this.recoveryTimeoutMs = options.recoveryTimeoutMs ?? 10 * 60_000;
60
+ this.windowLossThreshold = Math.max(2, options.windowLossThreshold ?? 4);
61
+ this.windowLossWindowMs = options.windowLossWindowMs ?? 60_000;
50
62
  }
51
63
  snapshot() {
52
64
  return {
53
65
  phase: this.phase,
66
+ kind: this.kind,
54
67
  generation: this.generation,
55
68
  crashLevel: this.crashLevel,
56
69
  crashCount: this.crashCount,
@@ -119,6 +132,69 @@ export class StormWindow extends EventEmitter {
119
132
  this.closeWindow("recovered");
120
133
  }
121
134
  }
135
+ /**
136
+ * An instance confirmed that its tmux window is gone while the server is
137
+ * alive. One such loss is an ordinary crash; several inside the window are one
138
+ * infrastructure event, and N independent respawn loops would stampede (#1127).
139
+ * Returns true when THIS call opens the window. Once a window is open, a loss
140
+ * simply joins it.
141
+ */
142
+ noteWindowLoss(name) {
143
+ if (this.stopped)
144
+ return false;
145
+ const now = this.now();
146
+ for (const [other, at] of this.windowLosses) {
147
+ if (now - at > this.windowLossWindowMs)
148
+ this.windowLosses.delete(other);
149
+ }
150
+ this.windowLosses.set(name, now);
151
+ this.windowLossRecovered.delete(name);
152
+ if (this.isActive()) {
153
+ this.addAffected(name);
154
+ return false;
155
+ }
156
+ if (this.windowLosses.size < this.windowLossThreshold)
157
+ return false;
158
+ this.openWindowLossBurst([...this.windowLosses.keys()]);
159
+ return true;
160
+ }
161
+ openWindowLossBurst(names) {
162
+ this.kind = "window_loss";
163
+ this.generation++;
164
+ this.phase = "recovering";
165
+ this.backoffMs = 0;
166
+ this.retryAt = null;
167
+ this.affected = new Set(names);
168
+ // Members that were respawned before the burst was recognised have already
169
+ // recovered; do not hold their delivery again (#1156 review).
170
+ this.recovered = new Set(names.filter(name => this.windowLossRecovered.has(name)));
171
+ this.suppressed.clear();
172
+ if (this.stableTimer) {
173
+ this.clearTimer(this.stableTimer);
174
+ this.stableTimer = null;
175
+ }
176
+ if (this.recoveryTimer)
177
+ this.clearTimer(this.recoveryTimer);
178
+ this.recoveryTimer = this.setTimer(() => this.closeWindow("timeout"), this.recoveryTimeoutMs);
179
+ this.recoveryTimer?.unref?.();
180
+ this.emit("opened", this.snapshot());
181
+ }
182
+ /**
183
+ * A respawn finished outside a storm. Remember it, so that an instance that
184
+ * recovered before a burst was recognised is not counted as still down when
185
+ * the next loss opens one (inside an open window the caller marks recovery).
186
+ */
187
+ noteWindowRecovered(name) {
188
+ this.windowLossRecovered.add(name);
189
+ }
190
+ /**
191
+ * A live pane inside an open window-loss burst is recovery evidence on its own
192
+ * (a server storm is different: a pane alive then says nothing about the CLI).
193
+ */
194
+ noteWindowAlive(name) {
195
+ if (this.kind === "window_loss" && this.needsRecovery(name))
196
+ this.markRecovered(name);
197
+ }
122
198
  shouldSuppress(kind) {
123
199
  if (!this.isActive() || !STORM_INCIDENT_KINDS.has(kind))
124
200
  return false;
@@ -152,6 +228,8 @@ export class StormWindow extends EventEmitter {
152
228
  recordDistinctCrash() {
153
229
  const now = this.now();
154
230
  const wasClosed = this.phase === "closed";
231
+ const wasWindowLoss = !wasClosed && this.kind === "window_loss";
232
+ this.kind = "server";
155
233
  this.generation++;
156
234
  this.crashCount++;
157
235
  this.crashLevel = Math.min(this.crashLevel + 1, this.backoffsMs.length);
@@ -173,7 +251,10 @@ export class StormWindow extends EventEmitter {
173
251
  this.clearTimer(this.stableTimer);
174
252
  this.stableTimer = null;
175
253
  }
176
- this.emit(wasClosed ? "opened" : "extended", this.snapshot());
254
+ // A window-loss burst turning into a server storm is a NEW storm for the
255
+ // fleet: it must enroll every running instance, not just the four that lost
256
+ // a window (#1156 review).
257
+ this.emit(wasClosed || wasWindowLoss ? "opened" : "extended", this.snapshot());
177
258
  }
178
259
  beginRecovery() {
179
260
  this.backoffTimer = null;
@@ -211,6 +292,8 @@ export class StormWindow extends EventEmitter {
211
292
  this.release(this.spawnWaiters);
212
293
  this.releaseAllDelivery();
213
294
  this.emit("closed", snapshot, reason);
295
+ this.windowLosses.clear();
296
+ this.kind = "server";
214
297
  this.affected.clear();
215
298
  this.recovered.clear();
216
299
  this.suppressed.clear();
@@ -1 +1 @@
1
- {"version":3,"file":"storm-window.js","sourceRoot":"","sources":["../src/storm-window.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storm-window.js","sourceRoot":"","sources":["../src/storm-window.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,33 @@ export declare function parsePauseWakeCommand(text: string): {
28
28
  instance?: string;
29
29
  } | null;
30
30
  export declare function compactCommandForBackend(backend: string): string;
31
+ /**
32
+ * Backends whose `/compact` verifiably takes custom summarization instructions
33
+ * (#1145). Checked against the real CLIs, not assumed:
34
+ * - claude-code 2.1.288: `/compact <text>` appends the text to the summary
35
+ * request under `Additional Instructions:` (confirmed in the request body).
36
+ * - codex 0.160.0: `/compact <text>` is NOT a compaction — the whole line is
37
+ * submitted as an ordinary chat message. Passing the text would turn a
38
+ * compact into a prompt, so it must never be appended.
39
+ * - grok 1.0.46: the binary answers "/compact takes no arguments."
40
+ * - opencode 1.18: `/compact` calls session.summarize with no text.
41
+ * - kiro-cli: takes none (audit); antigravity has no summarizing compact.
42
+ * - muse 1.4.2: accepts the line (empty session: "nothing to summarize") but
43
+ * no use of the text is verifiable — unsupported until shown otherwise.
44
+ */
45
+ export declare function backendSupportsCompactInstructions(backend: string): boolean;
46
+ /** Longest custom-instructions text AgEnD pastes (one line; refused, never truncated, beyond it). */
47
+ export declare const COMPACT_INSTRUCTIONS_MAX = 1000;
48
+ /**
49
+ * One line, no control characters: the text is pasted into a TUI whose Enter
50
+ * submits it, so a newline would end the command and run the rest as a message.
51
+ * Blank means "none" (Claude Code ignores whitespace-only text the same way).
52
+ */
53
+ export declare function normalizeCompactInstructions(raw: unknown): string;
54
+ /** The optional argument of a typed `/compact [@bot] [instructions]`, or null when the text is not /compact. */
55
+ export declare function parseCompactCommand(text: string): {
56
+ instructions: string;
57
+ } | null;
31
58
  /**
32
59
  * Full conversation-reset command for a backend NAME. Keep this routing-only
33
60
  * lookup in sync with CliBackend.getClearCommand(); the fleet process does not
@@ -143,7 +170,7 @@ export declare class TopicCommands {
143
170
  */
144
171
  private autoPauseLineFor;
145
172
  /** Send the backend-appropriate compact command to an instance's tmux pane */
146
- sendCompact(instanceName: string): Promise<string>;
173
+ sendCompact(instanceName: string, instructions?: string): Promise<string>;
147
174
  /** Whether the instance backend exposes a verified full-reset command. */
148
175
  supportsClear(instanceName: string): boolean;
149
176
  /**
@@ -175,7 +202,7 @@ export declare class TopicCommands {
175
202
  */
176
203
  private handleUsageCommand;
177
204
  /**
178
- * `/login [backend] | code <text> | cancel` — remote CLI re-login.
205
+ * `/login [backend] | cancel` — remote CLI re-login.
179
206
  * Fleet-admin only: the flow emits live authorization URLs/codes, and anyone
180
207
  * completing one binds their own account to this fleet's CLI.
181
208
  */
@@ -14,6 +14,7 @@ import { clampContextPercent, parseContextPercent, parseTokenContextRatio, } fro
14
14
  import { isGeneralInstance } from "./general-instance.js";
15
15
  import { backendSupportsSteer } from "./steer-capability.js";
16
16
  import { SYSINFO_BACKEND_IDS } from "./backend/types.js";
17
+ import { recordInternalRequest, withOrigin } from "./fleet-control-audit.js";
17
18
  export { parseContextPercent, parseTokenContextRatio } from "./context-percent.js";
18
19
  /** Sanitize a directory name into a valid instance name. Keeps Unicode letters (incl. CJK). */
19
20
  export function sanitizeInstanceName(name) {
@@ -108,6 +109,42 @@ export function compactCommandForBackend(backend) {
108
109
  return "/clear";
109
110
  return "/compact";
110
111
  }
112
+ /**
113
+ * Backends whose `/compact` verifiably takes custom summarization instructions
114
+ * (#1145). Checked against the real CLIs, not assumed:
115
+ * - claude-code 2.1.288: `/compact <text>` appends the text to the summary
116
+ * request under `Additional Instructions:` (confirmed in the request body).
117
+ * - codex 0.160.0: `/compact <text>` is NOT a compaction — the whole line is
118
+ * submitted as an ordinary chat message. Passing the text would turn a
119
+ * compact into a prompt, so it must never be appended.
120
+ * - grok 1.0.46: the binary answers "/compact takes no arguments."
121
+ * - opencode 1.18: `/compact` calls session.summarize with no text.
122
+ * - kiro-cli: takes none (audit); antigravity has no summarizing compact.
123
+ * - muse 1.4.2: accepts the line (empty session: "nothing to summarize") but
124
+ * no use of the text is verifiable — unsupported until shown otherwise.
125
+ */
126
+ export function backendSupportsCompactInstructions(backend) {
127
+ return backend === "claude-code";
128
+ }
129
+ /** Longest custom-instructions text AgEnD pastes (one line; refused, never truncated, beyond it). */
130
+ export const COMPACT_INSTRUCTIONS_MAX = 1000;
131
+ /**
132
+ * One line, no control characters: the text is pasted into a TUI whose Enter
133
+ * submits it, so a newline would end the command and run the rest as a message.
134
+ * Blank means "none" (Claude Code ignores whitespace-only text the same way).
135
+ */
136
+ export function normalizeCompactInstructions(raw) {
137
+ return String(raw ?? "")
138
+ // eslint-disable-next-line no-control-regex
139
+ .replace(/[\u0000-\u001f\u007f-\u009f\u2028\u2029]+/g, " ")
140
+ .replace(/\s+/g, " ")
141
+ .trim();
142
+ }
143
+ /** The optional argument of a typed `/compact [@bot] [instructions]`, or null when the text is not /compact. */
144
+ export function parseCompactCommand(text) {
145
+ const match = text.trim().match(/^\/compact(?:@\S+)?(?:\s+([\s\S]*))?$/);
146
+ return match ? { instructions: match[1] ?? "" } : null;
147
+ }
111
148
  /**
112
149
  * Full conversation-reset command for a backend NAME. Keep this routing-only
113
150
  * lookup in sync with CliBackend.getClearCommand(); the fleet process does not
@@ -390,12 +427,12 @@ export class TopicCommands {
390
427
  return;
391
428
  const chatId = msg.chatId;
392
429
  const threadId = msg.threadId;
393
- const allowed = this.ctx.fleetConfig?.channel?.access?.allowed_users ?? [];
394
- if (allowed.length === 0) {
430
+ // The caller's own adapter decides, and an empty list means the command is off for everyone.
431
+ if (!this.ctx.hasFleetAdmins(msg.adapterId)) {
395
432
  await adapter.sendText(chatId, t("dashboard.disabled"), { threadId });
396
433
  return;
397
434
  }
398
- if (!allowed.some(u => String(u) === String(msg.userId))) {
435
+ if (!this.ctx.isFleetAdmin(msg.userId, msg.adapterId)) {
399
436
  await adapter.sendText(chatId, t("not_authorized"), { threadId });
400
437
  return;
401
438
  }
@@ -495,11 +532,12 @@ export class TopicCommands {
495
532
  }
496
533
  return true;
497
534
  }
498
- if (text === "/compact" || text.startsWith("/compact@")) {
535
+ const compact = parseCompactCommand(text);
536
+ if (compact) {
499
537
  const adapter = this.getReplyAdapter(msg);
500
538
  if (!adapter)
501
539
  return false;
502
- const result = await this.sendCompact(instanceName);
540
+ const result = await this.sendCompact(instanceName, compact.instructions);
503
541
  await adapter.sendText(msg.chatId, result, { threadId: msg.threadId });
504
542
  return true;
505
543
  }
@@ -693,7 +731,7 @@ export class TopicCommands {
693
731
  return `\n${t("ctx.auto_pause", `${minutes}m`)}`;
694
732
  }
695
733
  /** Send the backend-appropriate compact command to an instance's tmux pane */
696
- async sendCompact(instanceName) {
734
+ async sendCompact(instanceName, instructions) {
697
735
  const ipc = this.ctx.instanceIpcClients.get(instanceName);
698
736
  if (ipc?.connected) {
699
737
  const classicBackend = this.ctx.classicChannels?.getChannelIdByInstance(instanceName)
@@ -702,9 +740,24 @@ export class TopicCommands {
702
740
  const backend = this.ctx.fleetConfig?.instances[instanceName]?.backend
703
741
  ?? classicBackend
704
742
  ?? this.ctx.fleetConfig?.defaults?.backend ?? "claude-code";
705
- const cmd = compactCommandForBackend(backend);
706
- ipc.send({ type: "raw_paste", content: cmd });
707
- return t("compact.sent", cmd);
743
+ const base = compactCommandForBackend(backend);
744
+ const custom = normalizeCompactInstructions(instructions);
745
+ if (custom.length > COMPACT_INSTRUCTIONS_MAX) {
746
+ // Refuse rather than cut: a truncated instruction is a different instruction.
747
+ return t("compact.instructions_too_long", String(COMPACT_INSTRUCTIONS_MAX));
748
+ }
749
+ if (!custom) {
750
+ ipc.send({ type: "raw_paste", content: base });
751
+ return t("compact.sent", base);
752
+ }
753
+ if (backendSupportsCompactInstructions(backend)) {
754
+ ipc.send({ type: "raw_paste", content: `${base} ${custom}` });
755
+ return t("compact.sent_with_instructions", base);
756
+ }
757
+ // Compact as asked, without the text, and say so — never send it (codex
758
+ // would take it for a chat message) and never drop it unannounced.
759
+ ipc.send({ type: "raw_paste", content: base });
760
+ return `${t("compact.sent", base)}\n${t("compact.instructions_ignored", backend)}`;
708
761
  }
709
762
  return t("compact.not_connected");
710
763
  }
@@ -822,6 +875,7 @@ export class TopicCommands {
822
875
  await adapter.sendText(chatId, t("restart.usage"), { threadId });
823
876
  return;
824
877
  }
878
+ recordInternalRequest(this.ctx.dataDir, "restart", `command /restart ${mode ?? "graceful"} by ${msg.adapterId}:${msg.userId}`);
825
879
  if (mode !== "full") {
826
880
  await adapter.sendText(chatId, t("restart.graceful"), { threadId });
827
881
  process.kill(process.pid, "SIGUSR2");
@@ -864,7 +918,7 @@ export class TopicCommands {
864
918
  }
865
919
  }
866
920
  /**
867
- * `/login [backend] | code <text> | cancel` — remote CLI re-login.
921
+ * `/login [backend] | cancel` — remote CLI re-login.
868
922
  * Fleet-admin only: the flow emits live authorization URLs/codes, and anyone
869
923
  * completing one binds their own account to this fleet's CLI.
870
924
  */
@@ -876,8 +930,7 @@ export class TopicCommands {
876
930
  await adapter.sendText(msg.chatId, t("permission.denied"), { threadId: msg.threadId });
877
931
  return;
878
932
  }
879
- if (!this.ctx.startLoginSession || !this.ctx.promptLoginBackends
880
- || !this.ctx.loginSubmitInput || !this.ctx.cancelLoginSession) {
933
+ if (!this.ctx.startLoginSession || !this.ctx.promptLoginBackends || !this.ctx.cancelLoginSession) {
881
934
  await adapter.sendText(msg.chatId, t("login.no_session"), { threadId: msg.threadId });
882
935
  return;
883
936
  }
@@ -1159,13 +1212,12 @@ export class TopicCommands {
1159
1212
  return;
1160
1213
  const chatId = msg.chatId;
1161
1214
  const threadId = msg.threadId;
1162
- // Access control — only allowed users can trigger update; empty = disabled
1163
- const allowed = this.ctx.fleetConfig?.channel?.access?.allowed_users ?? [];
1164
- if (allowed.length === 0) {
1215
+ // Access control — only fleet admins of THIS adapter can trigger an update; empty = disabled
1216
+ if (!this.ctx.hasFleetAdmins(msg.adapterId)) {
1165
1217
  await adapter.sendText(chatId, t("update.disabled"), { threadId });
1166
1218
  return;
1167
1219
  }
1168
- if (!allowed.some(u => String(u) === String(msg.userId))) {
1220
+ if (!this.ctx.isFleetAdmin(msg.userId, msg.adapterId)) {
1169
1221
  await adapter.sendText(chatId, t("not_authorized"), { threadId });
1170
1222
  return;
1171
1223
  }
@@ -1174,7 +1226,11 @@ export class TopicCommands {
1174
1226
  const currentVersion = createRequire(import.meta.url)("../package.json").version ?? "";
1175
1227
  const updateCmd = currentVersion.includes("beta") ? "agend update --beta" : "agend update";
1176
1228
  const { spawn } = await import("node:child_process");
1177
- const child = spawn("sh", ["-c", `sleep 2 && ${updateCmd}`], { detached: true, stdio: "ignore" });
1229
+ const origin = `command /update by ${msg.adapterId}:${msg.userId}`;
1230
+ recordInternalRequest(this.ctx.dataDir, "update", origin);
1231
+ const child = spawn("sh", ["-c", `sleep 2 && ${updateCmd}`], {
1232
+ detached: true, stdio: "ignore", env: withOrigin(origin),
1233
+ });
1178
1234
  child.once("error", err => this.ctx.failUpdateProgress?.(err.message));
1179
1235
  child.unref();
1180
1236
  }
@@ -1184,8 +1240,8 @@ export class TopicCommands {
1184
1240
  return;
1185
1241
  const chatId = msg.chatId;
1186
1242
  const threadId = msg.threadId;
1187
- const allowed = this.ctx.fleetConfig?.channel?.access?.allowed_users ?? [];
1188
- if (allowed.length > 0 && !allowed.some(u => String(u) === String(msg.userId))) {
1243
+ // Same rule as /update: this adapter's fleet admins only, and an empty list is "nobody", not "everybody".
1244
+ if (!this.ctx.hasFleetAdmins(msg.adapterId) || !this.ctx.isFleetAdmin(msg.userId, msg.adapterId)) {
1189
1245
  await adapter.sendText(chatId, t("not_authorized"), { threadId });
1190
1246
  return;
1191
1247
  }
@@ -1335,7 +1391,7 @@ export class TopicCommands {
1335
1391
  { command: "sysinfo", description: t("slash.sysinfo") },
1336
1392
  { command: "dashboard", description: "🔒 " + t("slash.dashboard") },
1337
1393
  { command: "ctx", description: t("slash.ctx") },
1338
- { command: "compact", description: t("slash.compact") },
1394
+ { command: "compact", description: `${t("slash.compact")} ${t("slash.compact_arg")}` },
1339
1395
  { command: "steer", description: t("slash.steer") },
1340
1396
  { command: "btw", description: t("slash.btw") },
1341
1397
  { command: "clear", description: "🔒 " + t("slash.clear") },
@@ -1372,7 +1428,7 @@ export class TopicCommands {
1372
1428
  const classicCommands = [
1373
1429
  { command: "start", description: "🔒 " + t("slash.start") },
1374
1430
  { command: "stop", description: "🔒 " + t("slash.stop") },
1375
- { command: "compact", description: "🔒 " + t("slash.compact") },
1431
+ { command: "compact", description: `🔒 ${t("slash.compact")} ${t("slash.compact_arg")}` },
1376
1432
  { command: "steer", description: t("slash.steer") },
1377
1433
  { command: "btw", description: t("slash.btw") },
1378
1434
  { command: "clear", description: "🔒 " + t("slash.clear") },