@songsid/agend 2.2.0-alpha.4 → 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 (71) hide show
  1. package/dist/auth-api.d.ts +22 -0
  2. package/dist/auth-api.js +69 -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 +47 -0
  10. package/dist/fleet-manager.js +139 -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 +17 -0
  20. package/dist/ui/chat-thread.js +22 -3
  21. package/dist/ui/image-lightbox.js +104 -0
  22. package/dist/ui/panel-chat.js +20 -52
  23. package/dist/ui/panel-details.js +146 -0
  24. package/dist/ui/panel-fleet.js +2 -1
  25. package/dist/ui/panel-settings.js +18 -0
  26. package/dist/ui/preview-panel.js +2 -1
  27. package/dist/ui/preview.js +49 -0
  28. package/dist/ui/settings-request.js +9 -0
  29. package/dist/ui/shared/agend-auth.js +15 -7
  30. package/dist/ui/shared/app-i18n.js +4 -2
  31. package/dist/ui/shared/app-route.js +7 -2
  32. package/dist/ui/shared/app-shell.js +22 -8
  33. package/dist/ui/shared/app.css +51 -1
  34. package/dist/ui/shared/app.js +6 -0
  35. package/dist/ui/shared/header-tools.js +93 -0
  36. package/dist/ui/shared/instance-nav.js +7 -4
  37. package/dist/ui/shared/instance-switch.js +16 -0
  38. package/dist/ui/shared/panel-view.js +14 -153
  39. package/dist/ui/shared/read-stream.js +26 -0
  40. package/dist/ui/shared/signin.js +38 -1
  41. package/dist/ui/shared/ui-icons.js +1 -0
  42. package/dist/ui/shared/usage-dialog.js +125 -0
  43. package/dist/ui/shared/view-strings.js +2 -2
  44. package/dist/ui/signin.html +3 -0
  45. package/dist/update-install.js +3 -1
  46. package/dist/update-install.js.map +1 -1
  47. package/dist/web-api.d.ts +16 -0
  48. package/dist/web-api.js +29 -4
  49. package/dist/web-api.js.map +1 -1
  50. package/dist/web-chat-history.d.ts +97 -6
  51. package/dist/web-chat-history.js +189 -12
  52. package/dist/web-chat-history.js.map +1 -1
  53. package/dist/web-chat-store.d.ts +45 -0
  54. package/dist/web-chat-store.js +192 -0
  55. package/dist/web-chat-store.js.map +1 -0
  56. package/dist/web-login.d.ts +2 -0
  57. package/dist/web-login.js +4 -0
  58. package/dist/web-login.js.map +1 -1
  59. package/dist/web-returning-device.d.ts +84 -0
  60. package/dist/web-returning-device.js +204 -0
  61. package/dist/web-returning-device.js.map +1 -0
  62. package/dist/web-shell-routes.d.ts +4 -0
  63. package/dist/web-shell-routes.js +9 -0
  64. package/dist/web-shell-routes.js.map +1 -1
  65. package/dist/web-upload.d.ts +21 -0
  66. package/dist/web-upload.js +50 -1
  67. package/dist/web-upload.js.map +1 -1
  68. package/launcher/old-updater-note.cjs +48 -0
  69. package/launcher/postinstall.cjs +8 -1
  70. package/package.json +1 -1
  71. package/scripts/preinstall-guard.cjs +5 -2
@@ -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
@@ -744,6 +750,15 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
744
750
  /** Effective backends with a running or persisted-paused fleet/Classic instance. */
745
751
  getActiveBackendIds(): ReadonlySet<string>;
746
752
  isClassicInstance(name: string): boolean;
753
+ /** #1523 N2: a ClassicBot room's own summary for its Details page (classicBot.yaml), or null. */
754
+ classicRoomFor(name: string): {
755
+ name: string;
756
+ channel_id: string;
757
+ adapter_id: string | null;
758
+ backend: string;
759
+ display_name: string | null;
760
+ description: string | null;
761
+ } | null;
747
762
  private cacheInstanceExecutionState;
748
763
  private cancelIdleButtonRetirement;
749
764
  private scheduleIdleButtonRetirement;
@@ -1113,6 +1128,31 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
1113
1128
  count: number;
1114
1129
  durable: boolean;
1115
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
+ }>;
1116
1156
  /** Called by the sign-in endpoint: a login the operator did not make should be visible to them. */
1117
1157
  onWebLogin(info: {
1118
1158
  label: string;
@@ -2353,6 +2393,13 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
2353
2393
  /** Discord native `/login` slash — shared by every adapter dispatch block. */
2354
2394
  private handleLoginSlash;
2355
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;
2356
2403
  /** Push an SSE event to all connected Web UI clients. */
2357
2404
  emitSseEvent(event: string, data: unknown): void;
2358
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
@@ -2552,6 +2559,17 @@ export class FleetManager {
2552
2559
  isClassicInstance(name) {
2553
2560
  return this.classicChannels?.getAll().some(channel => channel.instanceName === name) ?? false;
2554
2561
  }
2562
+ /** #1523 N2: a ClassicBot room's own summary for its Details page (classicBot.yaml), or null. */
2563
+ classicRoomFor(name) {
2564
+ const ch = this.classicChannels?.getAll().find(channel => channel.instanceName === name);
2565
+ if (!ch)
2566
+ return null;
2567
+ return {
2568
+ name: ch.name, channel_id: ch.channelId, adapter_id: ch.adapterId ?? null,
2569
+ backend: this.classicChannels.getBackendByInstance(name, this.fleetConfig?.defaults?.backend),
2570
+ display_name: ch.displayName ?? null, description: ch.description ?? null,
2571
+ };
2572
+ }
2555
2573
  cacheInstanceExecutionState(name, msg) {
2556
2574
  const state = msg.state;
2557
2575
  if (state !== "idle" && state !== "working" && state !== "stuck")
@@ -3183,7 +3201,9 @@ export class FleetManager {
3183
3201
  * The door, the table and the start of the command run in one synchronous stretch (#1399 review): no await between
3184
3202
  * the check and the act, so the channel's instance cannot be rebound to another bot in between.
3185
3203
  */
3186
- 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) };
3187
3207
  const door = this.slashDoor(data, adapterId);
3188
3208
  if ("refusal" in door) {
3189
3209
  await data.respond(t(door.refusal)).catch(() => { });
@@ -4499,6 +4519,9 @@ export class FleetManager {
4499
4519
  onWarn: message => this.logger.warn(message),
4500
4520
  });
4501
4521
  }
4522
+ if (!this.returningDevices) {
4523
+ this.returningDevices = new ReturningDevices({ dataDir: this.dataDir, onWarn: message => this.logger.warn(message) });
4524
+ }
4502
4525
  if (!this.webLoginCodes) {
4503
4526
  this.webLoginCodes = new WebLoginCodes({
4504
4527
  onEvent: event => {
@@ -4796,13 +4819,81 @@ export class FleetManager {
4796
4819
  this.initializeWebSessions();
4797
4820
  void this.publicWebLink?.close("dashboard revoke");
4798
4821
  this.webLoginCodes.revoke();
4799
- 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 };
4800
4826
  if (result.durable)
4801
- this.logger.info({ count: result.count }, "Web sessions revoked (all)");
4827
+ this.logger.info({ count: result.count, devices: devices.count }, "Web sessions revoked (all)");
4802
4828
  else
4803
4829
  this.logger.warn({ count: result.count }, "Web sessions revoked in memory only — the session file could not be updated or removed");
4804
4830
  return result;
4805
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
+ }
4806
4897
  /** Called by the sign-in endpoint: a login the operator did not make should be visible to them. */
4807
4898
  onWebLogin(info) {
4808
4899
  if (this.fleetConfig?.web?.notify_login === false)
@@ -5112,6 +5203,9 @@ export class FleetManager {
5112
5203
  if (ch.adapterId)
5113
5204
  this.instanceWorldBinding.set(ch.instanceName, ch.adapterId);
5114
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);
5115
5209
  // Poll classicBot.yaml for external changes every 30s
5116
5210
  this.classicReloadTimer = setInterval(() => {
5117
5211
  // Attributes the synchronous part, up to the reload's first await (#1235).
@@ -12990,6 +13084,43 @@ export class FleetManager {
12990
13084
  }, 3000);
12991
13085
  }
12992
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
+ }
12993
13124
  /** Push an SSE event to all connected Web UI clients. */
12994
13125
  emitSseEvent(event, data) {
12995
13126
  // #1386: a prompt opened or closed, or an instance's state moved — "Needs you" may have changed.
@@ -15207,6 +15338,8 @@ Plus the operational skills (fleet-health, instance-lifecycle, scheduling, sessi
15207
15338
  // #1490 P3: stop() now returns a Promise; await it so the final
15208
15339
  // ledger flush completes before process.exit(0) in doStopAll's caller.
15209
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();
15210
15343
  const profileStopped = this.runtimeCpuProfiler?.shutdown("fleet shutdown");
15211
15344
  this.ipcStoppingInstances.add("__fleet_stopping__");
15212
15345
  // Release held delivery promises before awaiting daemon shutdown, then
@@ -15241,6 +15374,7 @@ Plus the operational skills (fleet-health, instance-lifecycle, scheduling, sessi
15241
15374
  await needsStopped;
15242
15375
  await settingsControlStopped;
15243
15376
  await cacheStopped;
15377
+ await webChatStopped;
15244
15378
  await this.cpuProfileControl?.close();
15245
15379
  this.cpuProfileControl = null;
15246
15380
  await this.shutdownLoginWindows();