@songsid/agend 2.2.0-alpha.5 → 2.2.0-alpha.6

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 (43) hide show
  1. package/dist/auth-api.d.ts +22 -0
  2. package/dist/auth-api.js +65 -1
  3. package/dist/auth-api.js.map +1 -1
  4. package/dist/channel/adapters/discord.js +9 -0
  5. package/dist/channel/adapters/discord.js.map +1 -1
  6. package/dist/command-table.d.ts +8 -1
  7. package/dist/command-table.js +13 -4
  8. package/dist/command-table.js.map +1 -1
  9. package/dist/fleet-manager.d.ts +38 -0
  10. package/dist/fleet-manager.js +128 -5
  11. package/dist/fleet-manager.js.map +1 -1
  12. package/dist/locale.js +10 -0
  13. package/dist/locale.js.map +1 -1
  14. package/dist/public-web-gateway.js +2 -2
  15. package/dist/public-web-gateway.js.map +1 -1
  16. package/dist/topic-commands.js +3 -2
  17. package/dist/topic-commands.js.map +1 -1
  18. package/dist/ui/chat-render.js +6 -0
  19. package/dist/ui/chat-strings.js +4 -0
  20. package/dist/ui/chat-thread.js +7 -3
  21. package/dist/ui/panel-chat.js +7 -0
  22. package/dist/ui/preview-panel.js +2 -1
  23. package/dist/ui/preview.js +49 -0
  24. package/dist/ui/shared/agend-auth.js +15 -7
  25. package/dist/ui/shared/app.css +8 -1
  26. package/dist/ui/shared/signin.js +38 -1
  27. package/dist/ui/signin.html +3 -0
  28. package/dist/web-chat-history.d.ts +97 -6
  29. package/dist/web-chat-history.js +189 -12
  30. package/dist/web-chat-history.js.map +1 -1
  31. package/dist/web-chat-store.d.ts +45 -0
  32. package/dist/web-chat-store.js +192 -0
  33. package/dist/web-chat-store.js.map +1 -0
  34. package/dist/web-login.d.ts +2 -0
  35. package/dist/web-login.js +4 -0
  36. package/dist/web-login.js.map +1 -1
  37. package/dist/web-returning-device.d.ts +84 -0
  38. package/dist/web-returning-device.js +204 -0
  39. package/dist/web-returning-device.js.map +1 -0
  40. package/dist/web-upload.d.ts +21 -0
  41. package/dist/web-upload.js +50 -1
  42. package/dist/web-upload.js.map +1 -1
  43. package/package.json +1 -1
@@ -92,8 +92,17 @@ export const COMMANDS = [
92
92
  { name: "tips", slash: true, denied: PERMISSION_DENIED, scopes: everywhere("anyone"), telegram: tg(ANYONE, ANYONE, PASS) },
93
93
  ];
94
94
  const BY_NAME = new Map(COMMANDS.map(spec => [spec.name, spec]));
95
+ /**
96
+ * #1569: other names for a command. An alias is the SAME row — its permission gate, scopes, disabled state, refusals and
97
+ * subcommands are the target's, never a copy that could drift. Every lookup by name resolves through this.
98
+ */
99
+ export const COMMAND_ALIASES = Object.freeze({ web: "dashboard" });
100
+ /** The command-table name a typed or slash name stands for (itself unless it is an alias). */
101
+ export function canonicalCommand(name) {
102
+ return Object.prototype.hasOwnProperty.call(COMMAND_ALIASES, name) ? COMMAND_ALIASES[name] : name;
103
+ }
95
104
  export function commandSpec(name) {
96
- return BY_NAME.get(name);
105
+ return BY_NAME.get(canonicalCommand(name));
97
106
  }
98
107
  export function ruleFor(spec, scope, platform) {
99
108
  return platform === "telegram" ? spec.telegram[scope] : spec.scopes[scope];
@@ -107,7 +116,7 @@ export function isLocked(spec) {
107
116
  }
108
117
  /** The prefix for a slash command's menu description: generated, never typed. Unknown names get none. */
109
118
  export function slashLock(name) {
110
- const spec = BY_NAME.get(name);
119
+ const spec = BY_NAME.get(canonicalCommand(name));
111
120
  return spec && isLocked(spec) ? "🔒 " : "";
112
121
  }
113
122
  /** What a menu entry says after its description, as a locale key: the argument a command takes (#1145). */
@@ -122,7 +131,7 @@ export const TELEGRAM_MENUS = {
122
131
  /** The fleet's forum group (its `chat` and `chat_administrators` scopes): the General topic and the instance topics. */
123
132
  fleet: {
124
133
  scopes: ["general", "fleet"],
125
- names: ["status", "sysinfo", "dashboard", "ctx", "compact", "steer", "btw", "clear", "model", "effort",
134
+ names: ["status", "sysinfo", "dashboard", "web", "ctx", "compact", "steer", "btw", "clear", "model", "effort",
126
135
  "pause", "wake", "restart", "collab", "update", "profile", "doctor", "login", "usage", "tips", "visibility"],
127
136
  },
128
137
  /**
@@ -148,7 +157,7 @@ export function isLockedOnTelegram(spec, scopes) {
148
157
  export function telegramMenu(menu) {
149
158
  const { scopes, names } = TELEGRAM_MENUS[menu];
150
159
  return names.map(name => {
151
- const spec = BY_NAME.get(name);
160
+ const spec = BY_NAME.get(canonicalCommand(name));
152
161
  if (!spec)
153
162
  throw new Error(`Telegram ${menu} menu lists /${name}, which the command table does not know`);
154
163
  const argHint = TELEGRAM_ARG_HINTS[name];
@@ -1 +1 @@
1
- {"version":3,"file":"command-table.js","sourceRoot":"","sources":["../src/command-table.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command-table.js","sourceRoot":"","sources":["../src/command-table.ts"],"names":[],"mappings":"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"}
@@ -66,6 +66,7 @@ import { type WebNeedsItem } from "./needs-you-hub.js";
66
66
  import { type OrgChart } from "./web-org.js";
67
67
  import { type CacheReport } from "./cache-service.js";
68
68
  import { type WebCommandResult } from "./web-commands.js";
69
+ import { type ReturningDevice } from "./web-returning-device.js";
69
70
  import { type PreviewAvailability } from "./web-preview.js";
70
71
  import { type ConnectionMetadata, type ConnectionBinding, type BindingProbe, type SecretApplyJob, type ProviderSecretApplyJob } from "./connection-secrets.js";
71
72
  import { type ProviderSecretStatus } from "./provider-secret-registry.js";
@@ -434,6 +435,8 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
434
435
  private sseClients;
435
436
  /** The web chat's recent messages: what `/ui/history` serves and what a reconnecting SSE stream is sent. */
436
437
  readonly webChatHistory: WebChatHistory;
438
+ /** #1565: the web chat history's files (set at fleet start, once the home and the instances are known). */
439
+ private webChatStore;
437
440
  /** Uploaded files and the files the dashboard may fetch back (uploads, reply attachments). */
438
441
  readonly webFiles: WebFileLedger;
439
442
  /**
@@ -464,6 +467,9 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
464
467
  sseHeartbeatMs: number;
465
468
  /** The dashboard's login codes. Memory only: a code that outlives the process is a code nobody can prove was not copied. */
466
469
  private webLoginCodes;
470
+ /** #1570: browsers that may ask the sign-in page for a fresh code, and how often they may. */
471
+ private returningDevices;
472
+ private readonly codeRequestLimiter;
467
473
  /**
468
474
  * Set while a Settings apply job is driving the reconcile. The reconcile
469
475
  * stays the single doer; it just says out loud what it is doing to whom, so
@@ -1122,6 +1128,31 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
1122
1128
  count: number;
1123
1129
  durable: boolean;
1124
1130
  };
1131
+ /** #1570 (auth-api): this browser becomes a returning device of the code's owner. The cookie value, or null. */
1132
+ rememberReturningDevice(owner: LoginCodeOwner, input: {
1133
+ surface: "local" | "gateway";
1134
+ label: string;
1135
+ }): string | null;
1136
+ /** #1570 (auth-api): the returning device a cookie value proves under the CURRENT token, or null. */
1137
+ verifyReturningDevice(value: string | undefined): ReturningDevice | null;
1138
+ /**
1139
+ * #1570: a returning device asks for a fresh code. It goes privately (a DM, the path /dashboard uses) to the person
1140
+ * whose code that browser last redeemed — and only if they are still a fleet admin of that bot, the bot is live, the
1141
+ * breaker is closed and the rate limits allow it. A public-link request must belong to the link that is open now; the
1142
+ * code carries the owner, so its sign-in still goes through confirmPublicWebLogin. Nothing is posted anywhere else.
1143
+ */
1144
+ requestReturningCode(device: ReturningDevice, input: {
1145
+ surface: "local" | "gateway";
1146
+ exposureId?: string;
1147
+ label: string;
1148
+ }): Promise<{
1149
+ kind: "sent";
1150
+ } | {
1151
+ kind: "limited";
1152
+ retryAfterMs: number;
1153
+ } | {
1154
+ kind: "refused";
1155
+ }>;
1125
1156
  /** Called by the sign-in endpoint: a login the operator did not make should be visible to them. */
1126
1157
  onWebLogin(info: {
1127
1158
  label: string;
@@ -2362,6 +2393,13 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
2362
2393
  /** Discord native `/login` slash — shared by every adapter dispatch block. */
2363
2394
  private handleLoginSlash;
2364
2395
  queueMirrorMessage(text: string): void;
2396
+ /**
2397
+ * #1565: restore the web chat history of the configured instances from disk and keep writing it back. A file that
2398
+ * is skipped says so in the log; nothing here stops the fleet.
2399
+ */
2400
+ private restoreWebChat;
2401
+ /** #1565: who an instance is, for its web chat file: its working directory, or its ClassicBot room; null if neither. */
2402
+ private webChatOwner;
2365
2403
  /** Push an SSE event to all connected Web UI clients. */
2366
2404
  emitSseEvent(event: string, data: unknown): void;
2367
2405
  listClaimedTasks(assignee: string): Array<{
@@ -23,7 +23,7 @@ import { freemem, totalmem, cpus, homedir } from "node:os";
23
23
  import { createServer } from "node:http";
24
24
  import { Worker } from "node:worker_threads";
25
25
  import { ProbeWorkerPool } from "./probe-worker-pool.js";
26
- import { join, dirname, basename, delimiter, isAbsolute } from "node:path";
26
+ import { join, dirname, basename, delimiter, isAbsolute, resolve as resolvePath } from "node:path";
27
27
  import { fileURLToPath } from "node:url";
28
28
  import { getAgendHome, ensureWorkspaceGit } from "./paths.js";
29
29
  import { fleetLabel } from "./fleet-label.js";
@@ -126,6 +126,7 @@ export function applyTaskListCap(tasks, filterAssignee, filterStatus) {
126
126
  }
127
127
  import { handleWebRequest, broadcastSseEvent, SSE_HEARTBEAT_MS } from "./web-api.js";
128
128
  import { WebChatHistory, WEB_CHAT_TEXT_MAX, isWebMessageId, newWebMessageId } from "./web-chat-history.js";
129
+ import { WebChatDiskStore } from "./web-chat-store.js";
129
130
  import { ReplyButtonStore, parseReplyButtons, replyButtonClickText, replyButtonsFallbackText, REPLY_BUTTON_PREFIX } from "./reply-buttons.js";
130
131
  import { ReplyButtonsController } from "./reply-buttons-controller.js";
131
132
  import { publicAttachment, sweepOrphanedUploads, WebFileLedger } from "./web-upload.js";
@@ -139,7 +140,7 @@ import { LOGIN_FLOWS, LOGIN_BACKEND_ALIASES } from "./login-flows.js";
139
140
  import { LoginSession } from "./login-manager.js";
140
141
  import { tightenInstanceDirs } from "./private-dir.js";
141
142
  import { decideSlash } from "./slash-authz.js";
142
- import { commandSpec, decideCommand, ruleFor } from "./command-table.js";
143
+ import { canonicalCommand, commandSpec, decideCommand, ruleFor } from "./command-table.js";
143
144
  import { runVisibilityCommand } from "./cross-instance-notice.js";
144
145
  import { installedChannel, isPrereleaseVersion, updateNoticeKey } from "./update-check.js";
145
146
  import { resolveInstalledAgend } from "./update-dispatch.js";
@@ -180,6 +181,7 @@ import { bypassesWebGate, handleAuthRequest, serveSigninPage } from "./auth-api.
180
181
  import { isWebPageNavigation } from "./web-shell-routes.js";
181
182
  import { tokenEpoch, WebSessionStore } from "./web-session.js";
182
183
  import { WebLoginCodes, LOGIN_CODE_TTL_MS } from "./web-login.js";
184
+ import { CodeRequestLimiter, ReturningDevices } from "./web-returning-device.js";
183
185
  import { allowedHostNames, applyWebSecurityHeaders, hostnameOf, isHostAllowed, WEB_HOST_REJECTED_MESSAGE } from "./web-host-guard.js";
184
186
  import { createPreviewListener, previewAvailability, previewSettings } from "./web-preview.js";
185
187
  import { fleetLevelDifferences, fleetLevelSignature, appendedConnections } from "./fleet-level-config.js";
@@ -751,6 +753,8 @@ export class FleetManager {
751
753
  sseClients = new Set();
752
754
  /** The web chat's recent messages: what `/ui/history` serves and what a reconnecting SSE stream is sent. */
753
755
  webChatHistory = new WebChatHistory();
756
+ /** #1565: the web chat history's files (set at fleet start, once the home and the instances are known). */
757
+ webChatStore = null;
754
758
  /** Uploaded files and the files the dashboard may fetch back (uploads, reply attachments). */
755
759
  webFiles = new WebFileLedger();
756
760
  /**
@@ -1016,6 +1020,9 @@ export class FleetManager {
1016
1020
  sseHeartbeatMs = SSE_HEARTBEAT_MS;
1017
1021
  /** The dashboard's login codes. Memory only: a code that outlives the process is a code nobody can prove was not copied. */
1018
1022
  webLoginCodes = null;
1023
+ /** #1570: browsers that may ask the sign-in page for a fresh code, and how often they may. */
1024
+ returningDevices = null;
1025
+ codeRequestLimiter = new CodeRequestLimiter();
1019
1026
  /**
1020
1027
  * Set while a Settings apply job is driving the reconcile. The reconcile
1021
1028
  * stays the single doer; it just says out loud what it is doing to whom, so
@@ -3194,7 +3201,9 @@ export class FleetManager {
3194
3201
  * The door, the table and the start of the command run in one synchronous stretch (#1399 review): no await between
3195
3202
  * the check and the act, so the channel's instance cannot be rebound to another bot in between.
3196
3203
  */
3197
- async dispatchSlash(data, adapterId, adapter) {
3204
+ async dispatchSlash(slash, adapterId, adapter) {
3205
+ // #1569: an alias (/web) is its command (/dashboard) from here on — the door, the table and the handler see one name.
3206
+ const data = { ...slash, command: canonicalCommand(slash.command) };
3198
3207
  const door = this.slashDoor(data, adapterId);
3199
3208
  if ("refusal" in door) {
3200
3209
  await data.respond(t(door.refusal)).catch(() => { });
@@ -4510,6 +4519,9 @@ export class FleetManager {
4510
4519
  onWarn: message => this.logger.warn(message),
4511
4520
  });
4512
4521
  }
4522
+ if (!this.returningDevices) {
4523
+ this.returningDevices = new ReturningDevices({ dataDir: this.dataDir, onWarn: message => this.logger.warn(message) });
4524
+ }
4513
4525
  if (!this.webLoginCodes) {
4514
4526
  this.webLoginCodes = new WebLoginCodes({
4515
4527
  onEvent: event => {
@@ -4807,13 +4819,81 @@ export class FleetManager {
4807
4819
  this.initializeWebSessions();
4808
4820
  void this.publicWebLink?.close("dashboard revoke");
4809
4821
  this.webLoginCodes.revoke();
4810
- const result = this.webSessions.revokeAll();
4822
+ // #1570: no browser may ask the sign-in page for a code any more.
4823
+ const devices = this.returningDevices.revokeAll();
4824
+ const sessions = this.webSessions.revokeAll();
4825
+ const result = { count: sessions.count, durable: sessions.durable && devices.durable };
4811
4826
  if (result.durable)
4812
- this.logger.info({ count: result.count }, "Web sessions revoked (all)");
4827
+ this.logger.info({ count: result.count, devices: devices.count }, "Web sessions revoked (all)");
4813
4828
  else
4814
4829
  this.logger.warn({ count: result.count }, "Web sessions revoked in memory only — the session file could not be updated or removed");
4815
4830
  return result;
4816
4831
  }
4832
+ /** #1570 (auth-api): this browser becomes a returning device of the code's owner. The cookie value, or null. */
4833
+ rememberReturningDevice(owner, input) {
4834
+ const token = this.webToken;
4835
+ if (!token)
4836
+ return null;
4837
+ this.initializeWebSessions();
4838
+ return this.returningDevices.remember(owner, { ...input, tokenEpoch: tokenEpoch(token), webToken: token });
4839
+ }
4840
+ /** #1570 (auth-api): the returning device a cookie value proves under the CURRENT token, or null. */
4841
+ verifyReturningDevice(value) {
4842
+ const token = this.webToken;
4843
+ if (!token)
4844
+ return null;
4845
+ this.initializeWebSessions();
4846
+ return this.returningDevices.verify(value, token, tokenEpoch(token));
4847
+ }
4848
+ /**
4849
+ * #1570: a returning device asks for a fresh code. It goes privately (a DM, the path /dashboard uses) to the person
4850
+ * whose code that browser last redeemed — and only if they are still a fleet admin of that bot, the bot is live, the
4851
+ * breaker is closed and the rate limits allow it. A public-link request must belong to the link that is open now; the
4852
+ * code carries the owner, so its sign-in still goes through confirmPublicWebLogin. Nothing is posted anywhere else.
4853
+ */
4854
+ async requestReturningCode(device, input) {
4855
+ const token = this.webToken;
4856
+ if (!token || this.shuttingDown)
4857
+ return { kind: "refused" };
4858
+ this.initializeWebSessions();
4859
+ const paused = this.webLoginCodes.pausedForMs();
4860
+ if (paused > 0)
4861
+ return { kind: "limited", retryAfterMs: paused };
4862
+ const admitted = this.codeRequestLimiter.admit(device.idHash);
4863
+ if (!admitted.ok)
4864
+ return { kind: "limited", retryAfterMs: admitted.retryAfterMs };
4865
+ const { adapterId, userId, chatId, threadId } = device.owner;
4866
+ const adapter = this.adapters.get(adapterId);
4867
+ // The same owner gate /dashboard's private delivery uses: still a fleet admin, the same General, the bot live.
4868
+ const owner = { adapterId, userId, chatId, ...(threadId !== undefined ? { threadId } : {}), binding: adapter };
4869
+ if (!adapter?.sendDirect || !this.publicOwnerCurrent(owner)) {
4870
+ this.logger.info({ adapterId }, "Sign-in code request refused: the recorded owner is no longer a fleet admin of a live bot");
4871
+ return { kind: "refused" };
4872
+ }
4873
+ if (input.surface === "gateway") {
4874
+ const link = this.publicWebLink;
4875
+ if (!link || !input.exposureId || link.exposureId !== input.exposureId || link.status().state !== "open")
4876
+ return { kind: "refused" };
4877
+ }
4878
+ else if (input.exposureId !== undefined)
4879
+ return { kind: "refused" };
4880
+ const issued = this.webLoginCodes.issue({ epoch: tokenEpoch(token), audience: input.exposureId ?? "local", owner });
4881
+ const text = t("web.resend_code", issued.display, Math.round(LOGIN_CODE_TTL_MS / 60_000), input.label || t("web.resend_unknown_browser"), t(input.surface === "gateway" ? "web.resend_public" : "web.resend_local"));
4882
+ try {
4883
+ await withinBudget(adapter.sendDirect(userId, text, { disablePreview: true }), performance.now() + 5_000);
4884
+ }
4885
+ catch (err) {
4886
+ this.webLoginCodes.revokeIfCurrent(issued.issuanceId);
4887
+ this.logger.info({ err: err?.message, adapterId }, "Sign-in code request: the private message could not be sent");
4888
+ return { kind: "refused" };
4889
+ }
4890
+ if (this.webToken !== token || !this.publicOwnerCurrent(owner)) {
4891
+ this.webLoginCodes.revokeIfCurrent(issued.issuanceId);
4892
+ return { kind: "refused" };
4893
+ }
4894
+ this.logger.info({ adapterId, surface: input.surface }, "Web sign-in code sent privately to a returning device's owner");
4895
+ return { kind: "sent" };
4896
+ }
4817
4897
  /** Called by the sign-in endpoint: a login the operator did not make should be visible to them. */
4818
4898
  onWebLogin(info) {
4819
4899
  if (this.fleetConfig?.web?.notify_login === false)
@@ -5123,6 +5203,9 @@ export class FleetManager {
5123
5203
  if (ch.adapterId)
5124
5204
  this.instanceWorldBinding.set(ch.instanceName, ch.adapterId);
5125
5205
  }
5206
+ // #1565: the web chat as it was before this process — the configured instances' only (fleet.yaml and ClassicBot
5207
+ // rooms), before the dashboard serves anything; from now on every change is written back (off the loop).
5208
+ this.restoreWebChat(fleet);
5126
5209
  // Poll classicBot.yaml for external changes every 30s
5127
5210
  this.classicReloadTimer = setInterval(() => {
5128
5211
  // Attributes the synchronous part, up to the reload's first await (#1235).
@@ -13001,6 +13084,43 @@ export class FleetManager {
13001
13084
  }, 3000);
13002
13085
  }
13003
13086
  }
13087
+ /**
13088
+ * #1565: restore the web chat history of the configured instances from disk and keep writing it back. A file that
13089
+ * is skipped says so in the log; nothing here stops the fleet.
13090
+ */
13091
+ restoreWebChat(fleet) {
13092
+ try {
13093
+ const store = new WebChatDiskStore({ home: getAgendHome(), logger: this.logger, ownerOf: (name) => this.webChatOwner(name) });
13094
+ const names = new Set([...Object.keys(fleet.instances ?? {}), ...(this.classicChannels?.getAll().map(c => c.instanceName) ?? [])]);
13095
+ // A kept message's files are served again under their ids only from the instance's own inbox, by the ledger's
13096
+ // checks (web-upload.ts restoreServed); they leave the ledger with their message.
13097
+ this.webChatHistory.setFiles({
13098
+ storablePath: (id) => this.webFiles.storablePath(id),
13099
+ restore: (entry, instance) => this.webFiles.restoreServed(entry, instance, join(getAgendHome(), "workspaces", instance, "inbox")),
13100
+ drop: (ids) => this.webFiles.dropServed(ids),
13101
+ });
13102
+ let restored = 0;
13103
+ for (const name of names)
13104
+ restored += this.webChatHistory.restore(name, store.load(name));
13105
+ this.webChatStore = store;
13106
+ this.webChatHistory.setStore(store);
13107
+ if (restored)
13108
+ this.logger.info({ restored, instances: names.size }, "Web chat history restored from disk");
13109
+ }
13110
+ catch (err) {
13111
+ this.logger.warn({ err }, "Web chat history could not be restored; it starts empty");
13112
+ }
13113
+ }
13114
+ /** #1565: who an instance is, for its web chat file: its working directory, or its ClassicBot room; null if neither. */
13115
+ webChatOwner(name) {
13116
+ const insts = this.fleetConfig?.instances ?? {};
13117
+ if (Object.prototype.hasOwnProperty.call(insts, name)) {
13118
+ const wd = insts[name].working_directory;
13119
+ return `dir:${wd ? resolvePath(wd) : ""}`;
13120
+ }
13121
+ const room = this.classicChannels?.getAll().find(c => c.instanceName === name);
13122
+ return room ? `room:${room.channelId}:${room.adapterId ?? ""}` : null;
13123
+ }
13004
13124
  /** Push an SSE event to all connected Web UI clients. */
13005
13125
  emitSseEvent(event, data) {
13006
13126
  // #1386: a prompt opened or closed, or an instance's state moved — "Needs you" may have changed.
@@ -15218,6 +15338,8 @@ Plus the operational skills (fleet-health, instance-lifecycle, scheduling, sessi
15218
15338
  // #1490 P3: stop() now returns a Promise; await it so the final
15219
15339
  // ledger flush completes before process.exit(0) in doStopAll's caller.
15220
15340
  const cacheStopped = this.cacheService?.stop() ?? Promise.resolve();
15341
+ // #1565: the web chat's last changes reach the disk (bounded: a slow disk does not hold the shutdown).
15342
+ const webChatStopped = this.webChatStore ? Promise.race([this.webChatStore.flush().catch(() => { }), new Promise(r => setTimeout(r, 3_000).unref?.())]) : Promise.resolve();
15221
15343
  const profileStopped = this.runtimeCpuProfiler?.shutdown("fleet shutdown");
15222
15344
  this.ipcStoppingInstances.add("__fleet_stopping__");
15223
15345
  // Release held delivery promises before awaiting daemon shutdown, then
@@ -15252,6 +15374,7 @@ Plus the operational skills (fleet-health, instance-lifecycle, scheduling, sessi
15252
15374
  await needsStopped;
15253
15375
  await settingsControlStopped;
15254
15376
  await cacheStopped;
15377
+ await webChatStopped;
15255
15378
  await this.cpuProfileControl?.close();
15256
15379
  this.cpuProfileControl = null;
15257
15380
  await this.shutdownLoginWindows();