botmux 3.1.1 → 3.2.0

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 (190) hide show
  1. package/dist/adapters/backend/sandbox.d.ts +23 -0
  2. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  3. package/dist/adapters/backend/sandbox.js +68 -1
  4. package/dist/adapters/backend/sandbox.js.map +1 -1
  5. package/dist/adapters/cli/read-isolation.d.ts +1 -1
  6. package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
  7. package/dist/adapters/cli/read-isolation.js +15 -7
  8. package/dist/adapters/cli/read-isolation.js.map +1 -1
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +117 -25
  11. package/dist/cli.js.map +1 -1
  12. package/dist/core/command-handler.d.ts.map +1 -1
  13. package/dist/core/command-handler.js +11 -4
  14. package/dist/core/command-handler.js.map +1 -1
  15. package/dist/core/dashboard-ipc-server.d.ts +1 -0
  16. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  17. package/dist/core/dashboard-ipc-server.js +132 -0
  18. package/dist/core/dashboard-ipc-server.js.map +1 -1
  19. package/dist/core/maintenance.d.ts +23 -1
  20. package/dist/core/maintenance.d.ts.map +1 -1
  21. package/dist/core/maintenance.js +63 -25
  22. package/dist/core/maintenance.js.map +1 -1
  23. package/dist/core/plugins/cli-generation.d.ts.map +1 -1
  24. package/dist/core/plugins/cli-generation.js +7 -0
  25. package/dist/core/plugins/cli-generation.js.map +1 -1
  26. package/dist/core/plugins/convention-scanner.d.ts +3 -3
  27. package/dist/core/plugins/convention-scanner.d.ts.map +1 -1
  28. package/dist/core/plugins/convention-scanner.js.map +1 -1
  29. package/dist/core/plugins/install.d.ts.map +1 -1
  30. package/dist/core/plugins/install.js +84 -26
  31. package/dist/core/plugins/install.js.map +1 -1
  32. package/dist/core/plugins/mcp/environment.d.ts +12 -0
  33. package/dist/core/plugins/mcp/environment.d.ts.map +1 -0
  34. package/dist/core/plugins/mcp/environment.js +17 -0
  35. package/dist/core/plugins/mcp/environment.js.map +1 -0
  36. package/dist/core/plugins/mcp/gateway-installer.d.ts.map +1 -1
  37. package/dist/core/plugins/mcp/gateway-installer.js +9 -3
  38. package/dist/core/plugins/mcp/gateway-installer.js.map +1 -1
  39. package/dist/core/plugins/mcp/gateway.d.ts +13 -1
  40. package/dist/core/plugins/mcp/gateway.d.ts.map +1 -1
  41. package/dist/core/plugins/mcp/gateway.js +143 -23
  42. package/dist/core/plugins/mcp/gateway.js.map +1 -1
  43. package/dist/core/plugins/mcp/host.d.ts +18 -0
  44. package/dist/core/plugins/mcp/host.d.ts.map +1 -0
  45. package/dist/core/plugins/mcp/host.js +126 -0
  46. package/dist/core/plugins/mcp/host.js.map +1 -0
  47. package/dist/core/plugins/mcp/private-store.d.ts +15 -0
  48. package/dist/core/plugins/mcp/private-store.d.ts.map +1 -0
  49. package/dist/core/plugins/mcp/private-store.js +162 -0
  50. package/dist/core/plugins/mcp/private-store.js.map +1 -0
  51. package/dist/core/plugins/mcp/session-runtime.d.ts +25 -0
  52. package/dist/core/plugins/mcp/session-runtime.d.ts.map +1 -0
  53. package/dist/core/plugins/mcp/session-runtime.js +76 -0
  54. package/dist/core/plugins/mcp/session-runtime.js.map +1 -0
  55. package/dist/core/plugins/mcp/socket-auth.d.ts +9 -0
  56. package/dist/core/plugins/mcp/socket-auth.d.ts.map +1 -0
  57. package/dist/core/plugins/mcp/socket-auth.js +94 -0
  58. package/dist/core/plugins/mcp/socket-auth.js.map +1 -0
  59. package/dist/core/plugins/paths.d.ts +3 -0
  60. package/dist/core/plugins/paths.d.ts.map +1 -1
  61. package/dist/core/plugins/paths.js +9 -0
  62. package/dist/core/plugins/paths.js.map +1 -1
  63. package/dist/core/plugins/pm2.d.ts.map +1 -1
  64. package/dist/core/plugins/pm2.js +3 -1
  65. package/dist/core/plugins/pm2.js.map +1 -1
  66. package/dist/core/plugins/runtime.d.ts +2 -0
  67. package/dist/core/plugins/runtime.d.ts.map +1 -1
  68. package/dist/core/plugins/runtime.js.map +1 -1
  69. package/dist/core/plugins/service-manager.d.ts +22 -0
  70. package/dist/core/plugins/service-manager.d.ts.map +1 -1
  71. package/dist/core/plugins/service-manager.js +189 -52
  72. package/dist/core/plugins/service-manager.js.map +1 -1
  73. package/dist/core/plugins/types.d.ts +15 -1
  74. package/dist/core/plugins/types.d.ts.map +1 -1
  75. package/dist/core/restart-report.d.ts +1 -1
  76. package/dist/core/restart-report.d.ts.map +1 -1
  77. package/dist/core/restart-report.js +5 -3
  78. package/dist/core/restart-report.js.map +1 -1
  79. package/dist/core/scheduler.d.ts +47 -0
  80. package/dist/core/scheduler.d.ts.map +1 -1
  81. package/dist/core/scheduler.js +117 -0
  82. package/dist/core/scheduler.js.map +1 -1
  83. package/dist/core/session-manager.d.ts +7 -0
  84. package/dist/core/session-manager.d.ts.map +1 -1
  85. package/dist/core/session-manager.js +130 -33
  86. package/dist/core/session-manager.js.map +1 -1
  87. package/dist/core/silent-schedule-turns.d.ts +5 -0
  88. package/dist/core/silent-schedule-turns.d.ts.map +1 -0
  89. package/dist/core/silent-schedule-turns.js +47 -0
  90. package/dist/core/silent-schedule-turns.js.map +1 -0
  91. package/dist/core/types.d.ts +6 -0
  92. package/dist/core/types.d.ts.map +1 -1
  93. package/dist/core/types.js.map +1 -1
  94. package/dist/core/update-check.d.ts +16 -0
  95. package/dist/core/update-check.d.ts.map +1 -1
  96. package/dist/core/update-check.js +52 -0
  97. package/dist/core/update-check.js.map +1 -1
  98. package/dist/core/worker-pool.d.ts.map +1 -1
  99. package/dist/core/worker-pool.js +30 -23
  100. package/dist/core/worker-pool.js.map +1 -1
  101. package/dist/dashboard/schedule-card-model.d.ts +3 -0
  102. package/dist/dashboard/schedule-card-model.d.ts.map +1 -1
  103. package/dist/dashboard/schedule-card-model.js +5 -0
  104. package/dist/dashboard/schedule-card-model.js.map +1 -1
  105. package/dist/dashboard/web/app.d.ts.map +1 -1
  106. package/dist/dashboard/web/app.js +295 -6
  107. package/dist/dashboard/web/app.js.map +1 -1
  108. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  109. package/dist/dashboard/web/i18n.js +92 -0
  110. package/dist/dashboard/web/i18n.js.map +1 -1
  111. package/dist/dashboard/web/plugin-page.d.ts.map +1 -1
  112. package/dist/dashboard/web/plugin-page.js +1 -3
  113. package/dist/dashboard/web/plugin-page.js.map +1 -1
  114. package/dist/dashboard/web/schedules-page.d.ts.map +1 -1
  115. package/dist/dashboard/web/schedules-page.js +111 -4
  116. package/dist/dashboard/web/schedules-page.js.map +1 -1
  117. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  118. package/dist/dashboard/web/settings-page.js +5 -1
  119. package/dist/dashboard/web/settings-page.js.map +1 -1
  120. package/dist/dashboard/web/update-action.d.ts +16 -0
  121. package/dist/dashboard/web/update-action.d.ts.map +1 -0
  122. package/dist/dashboard/web/update-action.js +64 -0
  123. package/dist/dashboard/web/update-action.js.map +1 -0
  124. package/dist/dashboard-web/app.js +1 -1
  125. package/dist/dashboard-web/chunks/{bot-defaults-page-KLDCZNLP.js → bot-defaults-page-4PM4T6QQ.js} +1 -1
  126. package/dist/dashboard-web/chunks/{chunk-FMJNOATE.js → chunk-3PMN55Z6.js} +1 -1
  127. package/dist/dashboard-web/chunks/{chunk-MLNI5BKE.js → chunk-AIDN2WZB.js} +1 -1
  128. package/dist/dashboard-web/chunks/{chunk-EZAW2EPM.js → chunk-IKCZ677K.js} +1 -1
  129. package/dist/dashboard-web/chunks/{chunk-KEAOTUL3.js → chunk-RXVA6XW3.js} +7 -7
  130. package/dist/dashboard-web/chunks/{connectors-page-O32LFAL5.js → connectors-page-2MKF4YTN.js} +1 -1
  131. package/dist/dashboard-web/chunks/{groups-page-PSAFIZ6M.js → groups-page-TAU2UIVS.js} +1 -1
  132. package/dist/dashboard-web/chunks/{insights-page-V23LLATX.js → insights-page-PJ2XVM6T.js} +1 -1
  133. package/dist/dashboard-web/chunks/{monitor-room-7X5AKYOF.js → monitor-room-D6445HJO.js} +1 -1
  134. package/dist/dashboard-web/chunks/{monitoring-page-CBA3CQYL.js → monitoring-page-GUHMCKSO.js} +1 -1
  135. package/dist/dashboard-web/chunks/{office-page-RL6QSEM7.js → office-page-6K6U2MS5.js} +1 -1
  136. package/dist/dashboard-web/chunks/{overview-page-XQIPO6KH.js → overview-page-USDYU7U5.js} +1 -1
  137. package/dist/dashboard-web/chunks/plugin-page-JXC5F5YV.js +1 -0
  138. package/dist/dashboard-web/chunks/{roles-page-ACIWV7QS.js → roles-page-O4OUA7ZH.js} +1 -1
  139. package/dist/dashboard-web/chunks/schedules-page-LNIBXJSZ.js +1 -0
  140. package/dist/dashboard-web/chunks/{sessions-page-2WDWHSP4.js → sessions-page-B6U6TCFF.js} +1 -1
  141. package/dist/dashboard-web/chunks/{settings-page-6VX4OUGG.js → settings-page-PXLRFF7I.js} +2 -2
  142. package/dist/dashboard-web/chunks/{skills-page-WXE3UYLT.js → skills-page-M5KYNXBA.js} +1 -1
  143. package/dist/dashboard-web/chunks/{team-federation-page-PYTF4FLM.js → team-federation-page-GT7UFQMN.js} +1 -1
  144. package/dist/dashboard-web/chunks/{v3-page-G6CD6O3I.js → v3-page-UYZIRJ2C.js} +1 -1
  145. package/dist/dashboard-web/chunks/{whiteboards-page-6SG33GP4.js → whiteboards-page-WAR77DQE.js} +1 -1
  146. package/dist/dashboard-web/style.css +697 -0
  147. package/dist/dashboard.js +404 -29
  148. package/dist/dashboard.js.map +1 -1
  149. package/dist/i18n/en.d.ts.map +1 -1
  150. package/dist/i18n/en.js +4 -0
  151. package/dist/i18n/en.js.map +1 -1
  152. package/dist/i18n/zh.d.ts.map +1 -1
  153. package/dist/i18n/zh.js +4 -0
  154. package/dist/i18n/zh.js.map +1 -1
  155. package/dist/im/lark/schedules-card.d.ts.map +1 -1
  156. package/dist/im/lark/schedules-card.js +2 -0
  157. package/dist/im/lark/schedules-card.js.map +1 -1
  158. package/dist/services/plugin-registry-store.d.ts.map +1 -1
  159. package/dist/services/plugin-registry-store.js +100 -18
  160. package/dist/services/plugin-registry-store.js.map +1 -1
  161. package/dist/services/restart-intent-store.d.ts +17 -2
  162. package/dist/services/restart-intent-store.d.ts.map +1 -1
  163. package/dist/services/restart-intent-store.js +110 -0
  164. package/dist/services/restart-intent-store.js.map +1 -1
  165. package/dist/services/schedule-store.d.ts +3 -1
  166. package/dist/services/schedule-store.d.ts.map +1 -1
  167. package/dist/services/schedule-store.js +5 -0
  168. package/dist/services/schedule-store.js.map +1 -1
  169. package/dist/skills/definitions.d.ts.map +1 -1
  170. package/dist/skills/definitions.js +3 -2
  171. package/dist/skills/definitions.js.map +1 -1
  172. package/dist/types.d.ts +16 -0
  173. package/dist/types.d.ts.map +1 -1
  174. package/dist/utils/child-env.d.ts +1 -1
  175. package/dist/utils/child-env.d.ts.map +1 -1
  176. package/dist/utils/child-env.js +5 -0
  177. package/dist/utils/child-env.js.map +1 -1
  178. package/dist/utils/global-install.d.ts +2 -0
  179. package/dist/utils/global-install.d.ts.map +1 -1
  180. package/dist/utils/global-install.js +14 -0
  181. package/dist/utils/global-install.js.map +1 -1
  182. package/dist/worker.js +125 -17
  183. package/dist/worker.js.map +1 -1
  184. package/dist/workflows/hostExecutors/botmux-schedule.d.ts +3 -0
  185. package/dist/workflows/hostExecutors/botmux-schedule.d.ts.map +1 -1
  186. package/dist/workflows/hostExecutors/botmux-schedule.js +9 -0
  187. package/dist/workflows/hostExecutors/botmux-schedule.js.map +1 -1
  188. package/package.json +1 -1
  189. package/dist/dashboard-web/chunks/plugin-page-7FW2LPJH.js +0 -1
  190. package/dist/dashboard-web/chunks/schedules-page-KJDUKOJV.js +0 -1
@@ -89,6 +89,11 @@ export function computeDeliveryButtonAvailability(task, target) {
89
89
  if (current === 'local') {
90
90
  return { enabled: false, reasonKey: 'schedules.action.delivery.local' };
91
91
  }
92
+ // Silent tasks fire without any message; new-topic needs a first message to
93
+ // open the topic, so the switch is disabled (mirrors scheduler.toggleDelivery).
94
+ if (task.silent && target === 'new-topic') {
95
+ return { enabled: false, reasonKey: 'schedules.action.delivery.silentOriginOnly' };
96
+ }
92
97
  if (current === target) {
93
98
  return {
94
99
  enabled: false,
@@ -1 +1 @@
1
- {"version":3,"file":"schedule-card-model.js","sourceRoot":"","sources":["../../src/dashboard/schedule-card-model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schedule-card-model.js","sourceRoot":"","sources":["../../src/dashboard/schedule-card-model.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/dashboard/web/app.tsx"],"names":[],"mappings":"AAwoBA,wBAAgB,sBAAsB,IAAI,IAAI,CAI7C;AAGD,wBAAgB,iBAAiB,IAAI,IAAI,CAexC"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/dashboard/web/app.tsx"],"names":[],"mappings":"AAgnCA,wBAAgB,sBAAsB,IAAI,IAAI,CAI7C;AAGD,wBAAgB,iBAAiB,IAAI,IAAI,CAexC"}
@@ -15,6 +15,7 @@ import { requestOpenCreateSession } from './create-session-entry.js';
15
15
  import { InfoTip } from './dashboard-components.js';
16
16
  import { initFloatingScrollbars } from './floating-scrollbars.js';
17
17
  import { PLUGIN_PINS_CHANGED_EVENT } from './plugin-events.js';
18
+ import { updateAndRestartBotmux } from './update-action.js';
18
19
  const MANAGE_ROUTES = [
19
20
  'roles',
20
21
  'role-profiles',
@@ -72,6 +73,7 @@ let ownerAvatar = null;
72
73
  let updateBehind = false;
73
74
  let latestVersion = null;
74
75
  let updateBadgeKind = null;
76
+ let botmuxUpdateStatus = null;
75
77
  let routeRoot = null;
76
78
  let appRoot = null;
77
79
  const routeState = createDashboardRouteState();
@@ -295,6 +297,284 @@ function AuthExpiredOverlay(props) {
295
297
  return (_jsx("div", { id: "auth-expired-overlay", className: "auth-expired-overlay", role: "presentation", onClick: event => { if (event.target === event.currentTarget)
296
298
  props.onClose(); }, children: _jsxs("div", { className: "auth-expired-dialog", role: "dialog", "aria-modal": "true", "aria-labelledby": "auth-expired-title", children: [_jsx("h2", { id: "auth-expired-title", children: "\u8BBF\u95EE\u94FE\u63A5\u5DF2\u5931\u6548" }), _jsx("p", { children: "\u5F53\u524D\u94FE\u63A5/\u8BBF\u95EE\u5DF2\u5931\u6548\uFF0C\u8BF7\u4F7F\u7528\u6700\u65B0\u6388\u6743\u94FE\u63A5\u91CD\u65B0\u8FDB\u5165\uFF08\u8FD0\u884C botmux dashboard \u83B7\u53D6\uFF09\u3002" }), _jsx("button", { id: "auth-expired-dismiss", type: "button", className: "primary", onClick: props.onClose, children: "\u77E5\u9053\u4E86" })] }) }));
297
299
  }
300
+ function formatRollbackDate(publishedAt) {
301
+ const date = new Date(publishedAt);
302
+ if (Number.isNaN(date.getTime()))
303
+ return publishedAt.slice(0, 10);
304
+ try {
305
+ return new Intl.DateTimeFormat(ui.locale === 'zh' ? 'zh-CN' : 'en-US', {
306
+ year: 'numeric',
307
+ month: 'numeric',
308
+ day: 'numeric',
309
+ }).format(date);
310
+ }
311
+ catch {
312
+ return publishedAt.slice(0, 10);
313
+ }
314
+ }
315
+ async function dashboardInstance() {
316
+ const response = await fetch('/__selfcheck', { cache: 'no-store' });
317
+ const instance = await response.text();
318
+ if (!response.ok || !instance) {
319
+ throw new Error(t('update.healthCheckFailed'));
320
+ }
321
+ return instance;
322
+ }
323
+ function TopbarVersionControl(props) {
324
+ const { status } = props;
325
+ const [open, setOpen] = useState(false);
326
+ const [phase, setPhase] = useState('idle');
327
+ const [refreshing, setRefreshing] = useState(false);
328
+ const [refreshFailed, setRefreshFailed] = useState(false);
329
+ const [errorDetail, setErrorDetail] = useState('');
330
+ const [rollbackOpen, setRollbackOpen] = useState(false);
331
+ const [rollbackLoaded, setRollbackLoaded] = useState(false);
332
+ const [rollbackLoading, setRollbackLoading] = useState(false);
333
+ const [rollbackLoadFailed, setRollbackLoadFailed] = useState(false);
334
+ const [rollbackVersions, setRollbackVersions] = useState([]);
335
+ const [selectedRollback, setSelectedRollback] = useState(null);
336
+ const [activeRollback, setActiveRollback] = useState(null);
337
+ const actionInFlightRef = useRef(false);
338
+ const reconnectTimerRef = useRef(null);
339
+ const rootRef = useRef(null);
340
+ const triggerRef = useRef(null);
341
+ const clearReconnectTimer = () => {
342
+ if (reconnectTimerRef.current === null)
343
+ return;
344
+ window.clearTimeout(reconnectTimerRef.current);
345
+ reconnectTimerRef.current = null;
346
+ };
347
+ useEffect(() => {
348
+ actionInFlightRef.current = false;
349
+ setPhase('idle');
350
+ setRefreshing(false);
351
+ setRefreshFailed(false);
352
+ setErrorDetail('');
353
+ setRollbackOpen(false);
354
+ setRollbackLoaded(false);
355
+ setRollbackLoading(false);
356
+ setRollbackLoadFailed(false);
357
+ setRollbackVersions([]);
358
+ setSelectedRollback(null);
359
+ setActiveRollback(null);
360
+ }, [status?.current, status?.latest]);
361
+ useEffect(() => {
362
+ if (status)
363
+ setRefreshFailed(status.versionLookupOk === false);
364
+ }, [status]);
365
+ useEffect(() => {
366
+ if (!open)
367
+ setRollbackOpen(false);
368
+ }, [open]);
369
+ useEffect(() => () => clearReconnectTimer(), []);
370
+ useEffect(() => {
371
+ if (!open)
372
+ return;
373
+ const closeOnPointerDown = (event) => {
374
+ if (!rootRef.current?.contains(event.target))
375
+ setOpen(false);
376
+ };
377
+ const closeOnEscape = (event) => {
378
+ if (event.key !== 'Escape')
379
+ return;
380
+ setOpen(false);
381
+ triggerRef.current?.focus();
382
+ };
383
+ document.addEventListener('pointerdown', closeOnPointerDown);
384
+ document.addEventListener('keydown', closeOnEscape);
385
+ return () => {
386
+ document.removeEventListener('pointerdown', closeOnPointerDown);
387
+ document.removeEventListener('keydown', closeOnEscape);
388
+ };
389
+ }, [open]);
390
+ if (!status)
391
+ return null;
392
+ const behind = status.behind && !!status.latest;
393
+ const unknown = !status.latest;
394
+ const automatic = behind && status.updateSupported && !status.localDevInstall && status.node.ok;
395
+ const rollbackSupported = status.updateSupported && !status.localDevInstall && status.node.ok;
396
+ const busy = phase === 'updating' || phase === 'restarting';
397
+ const command = status.updateCommand ?? 'botmux update';
398
+ const currentVersion = `v${status.current}`;
399
+ const latestVersion = status.latest ? `v${status.latest}` : '';
400
+ const unavailableReason = status.localDevInstall
401
+ ? t('update.localDev')
402
+ : !status.updateSupported
403
+ ? t('update.unsupportedInstall')
404
+ : !status.node.ok
405
+ ? t('update.nodeWarn', { version: status.node.version, required: status.node.required })
406
+ : '';
407
+ const pollReconnect = (previousInstance) => {
408
+ const startedAt = Date.now();
409
+ const tick = async () => {
410
+ try {
411
+ const response = await fetch('/__selfcheck', { cache: 'no-store' });
412
+ const instance = await response.text();
413
+ if (response.ok && instance && instance !== previousInstance) {
414
+ location.reload();
415
+ return;
416
+ }
417
+ }
418
+ catch { /* dashboard is still restarting */ }
419
+ if (Date.now() - startedAt > 90_000) {
420
+ actionInFlightRef.current = false;
421
+ setPhase('error');
422
+ setErrorDetail(t('update.restartSlow'));
423
+ return;
424
+ }
425
+ reconnectTimerRef.current = window.setTimeout(() => void tick(), 2_000);
426
+ };
427
+ reconnectTimerRef.current = window.setTimeout(() => void tick(), 3_000);
428
+ };
429
+ const run = async () => {
430
+ if (!behind)
431
+ return;
432
+ if (!automatic) {
433
+ setOpen(false);
434
+ location.hash = '#/settings';
435
+ return;
436
+ }
437
+ if (actionInFlightRef.current)
438
+ return;
439
+ actionInFlightRef.current = true;
440
+ setActiveRollback(null);
441
+ setRefreshFailed(false);
442
+ setErrorDetail('');
443
+ try {
444
+ const previousInstance = await dashboardInstance();
445
+ const result = await updateAndRestartBotmux(fetch, setPhase);
446
+ if (!result.restarted) {
447
+ // Update installed but the restart handoff failed — surface it
448
+ // directly instead of polling for a reconnect that will never come.
449
+ actionInFlightRef.current = false;
450
+ setPhase('error');
451
+ setErrorDetail(t('update.restartFailed', { detail: result.restartError ?? 'unknown' }));
452
+ return;
453
+ }
454
+ pollReconnect(previousInstance);
455
+ }
456
+ catch (error) {
457
+ actionInFlightRef.current = false;
458
+ setPhase('error');
459
+ setErrorDetail(error instanceof Error ? error.message : String(error));
460
+ }
461
+ };
462
+ const loadRollbackVersions = async (force = false) => {
463
+ if (rollbackLoading)
464
+ return !rollbackLoadFailed;
465
+ setRollbackLoading(true);
466
+ setRollbackLoadFailed(false);
467
+ try {
468
+ const response = await fetch(`/api/update/versions${force ? '?refresh=1' : ''}`, { cache: 'no-store' });
469
+ const body = await response.json().catch(() => null);
470
+ if (!body || !Array.isArray(body.versions))
471
+ throw new Error('Invalid rollback versions response');
472
+ const versions = body.versions
473
+ .filter((entry) => {
474
+ if (!entry || typeof entry !== 'object')
475
+ return false;
476
+ const value = entry;
477
+ return typeof value.version === 'string'
478
+ && (typeof value.publishedAt === 'string' || value.publishedAt === null);
479
+ })
480
+ .slice(0, 3);
481
+ setRollbackVersions(versions);
482
+ setSelectedRollback(value => versions.some(entry => entry.version === value) ? value : null);
483
+ setRollbackLoaded(true);
484
+ const ok = response.ok && body.ok === true;
485
+ setRollbackLoadFailed(!ok);
486
+ return ok;
487
+ }
488
+ catch {
489
+ setRollbackLoaded(true);
490
+ setRollbackLoadFailed(true);
491
+ return false;
492
+ }
493
+ finally {
494
+ setRollbackLoading(false);
495
+ }
496
+ };
497
+ const runRollback = async () => {
498
+ if (!selectedRollback || !rollbackSupported || rollbackLoading || actionInFlightRef.current)
499
+ return;
500
+ actionInFlightRef.current = true;
501
+ setActiveRollback(selectedRollback);
502
+ setRefreshFailed(false);
503
+ setErrorDetail('');
504
+ try {
505
+ const previousInstance = await dashboardInstance();
506
+ await updateAndRestartBotmux(fetch, setPhase, selectedRollback);
507
+ pollReconnect(previousInstance);
508
+ }
509
+ catch (error) {
510
+ actionInFlightRef.current = false;
511
+ setPhase('error');
512
+ setErrorDetail(error instanceof Error ? error.message : String(error));
513
+ }
514
+ };
515
+ const refresh = async () => {
516
+ if (refreshing || busy)
517
+ return;
518
+ setRefreshing(true);
519
+ setRefreshFailed(false);
520
+ try {
521
+ const statusOk = await props.onRefresh();
522
+ if (rollbackOpen)
523
+ await loadRollbackVersions(true);
524
+ setRefreshFailed(!statusOk);
525
+ }
526
+ finally {
527
+ setRefreshing(false);
528
+ }
529
+ };
530
+ const message = phase === 'updating'
531
+ ? activeRollback
532
+ ? t('update.rollbackInstalling', { version: activeRollback })
533
+ : t('update.updating', { command })
534
+ : phase === 'restarting'
535
+ ? activeRollback
536
+ ? t('update.rollbackRestarting', { version: activeRollback })
537
+ : t('update.restarting')
538
+ : phase === 'error'
539
+ ? activeRollback
540
+ ? t('update.rollbackFailed', { detail: errorDetail })
541
+ : t('update.updateFailed', { detail: errorDetail })
542
+ : refreshFailed
543
+ ? t('update.topbarRefreshFailed')
544
+ : behind
545
+ ? automatic
546
+ ? t('update.versionUpgradePrompt', { version: latestVersion })
547
+ : unavailableReason
548
+ : status.latest
549
+ ? t('update.upToDate')
550
+ : t('update.checkUnavailable');
551
+ const action = !automatic
552
+ ? t('update.topbarReview')
553
+ : phase === 'error'
554
+ ? t('update.topbarRetry')
555
+ : phase === 'idle'
556
+ ? t('update.topbarAction')
557
+ : t('update.topbarWorking');
558
+ const versionSignal = phase === 'error' || (refreshFailed && unknown)
559
+ ? { className: 'is-error', symbol: '!' }
560
+ : behind
561
+ ? { className: 'has-update', symbol: '↑' }
562
+ : unknown
563
+ ? { className: 'is-unknown', symbol: '?' }
564
+ : { className: 'is-current', symbol: '✓' };
565
+ return (_jsxs("div", { ref: rootRef, className: `dashboard-version-control${open ? ' is-open' : ''}`, children: [_jsxs("button", { ref: triggerRef, type: "button", className: `dashboard-version-chip${behind ? ' has-update' : ''}${unknown ? ' is-unknown' : ''}${phase === 'error' ? ' is-error' : ''}`, "aria-haspopup": "dialog", "aria-expanded": open, "aria-label": `${currentVersion}. ${message}`, title: message, onClick: () => setOpen(value => !value), children: [_jsx("span", { children: currentVersion }), busy
566
+ ? _jsx("span", { className: "dashboard-update-spinner", "aria-hidden": "true" })
567
+ : _jsx("span", { className: `dashboard-version-state ${versionSignal.className}`, "aria-hidden": "true", children: versionSignal.symbol })] }), open ? (_jsxs("section", { className: "dashboard-version-popover", role: "dialog", "aria-modal": "false", "aria-labelledby": "dashboard-version-title", children: [_jsxs("header", { className: "dashboard-version-popover-head", children: [_jsx("strong", { id: "dashboard-version-title", children: t('update.current') }), _jsxs("div", { className: "dashboard-version-head-actions", children: [_jsx("button", { type: "button", className: `dashboard-version-refresh${refreshing ? ' is-refreshing' : ''}`, "aria-label": t(refreshing ? 'update.topbarRefreshing' : 'update.topbarRefresh'), title: t(refreshing ? 'update.topbarRefreshing' : 'update.topbarRefresh'), disabled: refreshing || rollbackLoading || busy, onClick: () => void refresh(), children: _jsxs("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: [_jsx("path", { d: "M13.2 5.7A5.8 5.8 0 1 0 13 10.8" }), _jsx("path", { d: "M13.2 2.8v2.9h-2.9" })] }) }), _jsx("button", { type: "button", className: "dashboard-version-close", "aria-label": t('update.topbarClose'), onClick: () => setOpen(false), children: "\u00D7" })] })] }), _jsxs("div", { className: "dashboard-version-popover-body", children: [_jsxs("div", { className: "dashboard-version-current", children: [_jsx("strong", { children: currentVersion }), _jsx("span", { className: versionSignal.className, "aria-hidden": "true", children: busy ? _jsx("span", { className: "dashboard-update-spinner" }) : versionSignal.symbol })] }), _jsx("p", { className: `dashboard-version-message${phase === 'error' || refreshFailed ? ' is-error' : ''}`, role: phase === 'error' || refreshFailed ? 'alert' : 'status', "aria-live": "polite", children: message }), _jsxs("a", { className: "dashboard-version-release-link", href: "https://github.com/deepcoldy/botmux/releases", target: "_blank", rel: "noopener noreferrer", children: [_jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: _jsx("path", { d: "M8 1.5a6.5 6.5 0 0 0-2.1 12.65c.33.06.45-.14.45-.32v-1.26c-1.84.4-2.23-.78-2.23-.78-.3-.76-.73-.96-.73-.96-.6-.41.05-.4.05-.4.66.05 1 .68 1 .68.59 1 1.54.72 1.92.55.06-.42.23-.72.42-.88-1.47-.17-3.02-.74-3.02-3.28 0-.72.26-1.32.68-1.78-.07-.17-.3-.84.07-1.75 0 0 .56-.18 1.79.68A6.2 6.2 0 0 1 8 4.63a6.2 6.2 0 0 1 1.71.22c1.23-.86 1.79-.68 1.79-.68.37.91.14 1.58.07 1.75.42.46.68 1.06.68 1.78 0 2.55-1.55 3.11-3.03 3.28.24.21.45.61.45 1.23v1.62c0 .18.12.38.46.32A6.5 6.5 0 0 0 8 1.5Z" }) }), _jsx("span", { children: t('update.changelogViewOnGitHub') })] }), (behind || rollbackOpen) && status.installs.multiple ? (_jsxs("details", { className: "dashboard-version-installs", children: [_jsx("summary", { children: t('update.multiInstallWarn') }), _jsx("ul", { children: status.installs.entries.map(entry => _jsx("li", { children: entry.binPath }, entry.binPath)) })] })) : null, rollbackSupported ? (_jsxs("details", { className: "dashboard-version-rollback", open: rollbackOpen, "aria-busy": rollbackLoading, onToggle: event => {
568
+ const nextOpen = event.currentTarget.open;
569
+ setRollbackOpen(nextOpen);
570
+ if (nextOpen && !rollbackLoaded && !rollbackLoading)
571
+ void loadRollbackVersions();
572
+ }, children: [_jsxs("summary", { children: [_jsxs("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: [_jsx("circle", { cx: "8", cy: "8", r: "5.5" }), _jsx("path", { d: "M8 4.8V8l2.2 1.3" })] }), _jsx("span", { children: t('update.rollbackTitle') }), _jsx("span", { className: "dashboard-version-rollback-chevron", "aria-hidden": "true", children: "\u2304" })] }), _jsxs("div", { className: "dashboard-version-rollback-body", children: [rollbackLoading && rollbackVersions.length === 0 ? (_jsxs("p", { className: "dashboard-version-rollback-status", role: "status", "aria-live": "polite", children: [_jsx("span", { className: "dashboard-update-spinner", "aria-hidden": "true" }), t('update.rollbackLoading')] })) : null, rollbackLoadFailed ? (_jsxs("p", { className: "dashboard-version-rollback-load-error", role: "alert", children: [_jsx("span", { children: t('update.rollbackLoadFailed') }), _jsx("button", { type: "button", disabled: rollbackLoading, onClick: () => void loadRollbackVersions(true), children: t('update.rollbackRetry') })] })) : null, rollbackLoaded && !rollbackLoading && !rollbackLoadFailed && rollbackVersions.length === 0 ? (_jsx("p", { className: "dashboard-version-rollback-status", children: t('update.rollbackEmpty') })) : null, rollbackVersions.length > 0 ? (_jsxs("fieldset", { disabled: busy || rollbackLoading || rollbackLoadFailed, children: [_jsx("legend", { children: t('update.rollbackHint') }), _jsx("div", { className: "dashboard-version-rollback-options", children: rollbackVersions.map(entry => (_jsxs("label", { className: selectedRollback === entry.version ? 'is-selected' : '', children: [_jsx("input", { type: "radio", name: "dashboard-rollback-version", value: entry.version, checked: selectedRollback === entry.version, onChange: () => setSelectedRollback(entry.version) }), _jsxs("strong", { children: ["v", entry.version] }), entry.publishedAt ? (_jsx("time", { dateTime: entry.publishedAt, children: formatRollbackDate(entry.publishedAt) })) : null] }, entry.version))) })] })) : null, selectedRollback ? (_jsxs("p", { id: "dashboard-version-rollback-risk", className: "dashboard-version-rollback-risk", role: "note", children: [_jsxs("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: [_jsx("path", { d: "M7.1 2.3 1.8 12a1 1 0 0 0 .9 1.5h10.6a1 1 0 0 0 .9-1.5L8.9 2.3a1 1 0 0 0-1.8 0Z" }), _jsx("path", { d: "M8 5.5v3.6M8 11.6h.01" })] }), _jsxs("span", { children: [t('update.rollbackRisk', { version: selectedRollback }), ' ', _jsx("a", { href: `https://github.com/deepcoldy/botmux/releases/tag/v${encodeURIComponent(selectedRollback)}`, target: "_blank", rel: "noopener noreferrer", "aria-label": t('update.rollbackReleaseNotesA11y', { version: selectedRollback }), children: t('update.rollbackReleaseNotes', { version: selectedRollback }) })] })] })) : null, rollbackVersions.length > 0 ? (_jsxs("button", { type: "button", className: "dashboard-version-rollback-action", disabled: !selectedRollback || rollbackLoading || rollbackLoadFailed || busy, "aria-describedby": selectedRollback ? 'dashboard-version-rollback-risk' : undefined, onClick: () => void runRollback(), children: [busy && activeRollback ? _jsx("span", { className: "dashboard-update-spinner", "aria-hidden": "true" }) : null, selectedRollback
573
+ ? phase === 'error' && activeRollback === selectedRollback
574
+ ? t('update.rollbackRetry')
575
+ : t('update.rollbackAction', { version: selectedRollback })
576
+ : t('update.rollbackSelect')] })) : null] })] })) : null] }), behind && !rollbackOpen && !activeRollback ? (_jsxs("footer", { className: "dashboard-version-popover-actions", children: [_jsx("button", { type: "button", className: "dashboard-version-secondary", onClick: () => setOpen(false), children: busy ? t('update.topbarClose') : t('update.topbarLater') }), _jsxs("button", { type: "button", className: "dashboard-version-primary", disabled: busy, onClick: () => void run(), children: [busy ? _jsx("span", { className: "dashboard-update-spinner", "aria-hidden": "true" }) : null, action] })] })) : null] })) : null] }));
577
+ }
298
578
  function DashboardShell() {
299
579
  const statusSummary = dashboardStatusSummary();
300
580
  const [botOnboardingOpen, setBotOnboardingOpen] = useState(false);
@@ -346,7 +626,7 @@ function DashboardShell() {
346
626
  expiredShown = false;
347
627
  setAuthExpiredOpen(false);
348
628
  };
349
- return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "aurora", "aria-hidden": "true", children: [_jsx("i", { className: "a1" }), _jsx("i", { className: "a2" }), _jsx("i", { className: "a3" })] }), _jsxs("div", { className: "app-shell", children: [_jsxs("header", { className: "topbar", children: [_jsx("div", { className: "topbar-left", children: _jsxs("a", { className: "brand", href: "#/", children: [_jsx("span", { className: "brand-mark", "aria-hidden": "true", children: _jsx("img", { className: "brand-logo-img", src: "/assets/brand-logo.png", alt: "", decoding: "sync", loading: "eager", fetchPriority: "high" }) }), _jsx("strong", { className: "brand-wordmark", children: "Botmux" }), _jsx("span", { className: "brand-product", children: "Dashboard" })] }) }), _jsxs("div", { className: "topbar-actions", children: [_jsx(TopbarStatusMenu, { summary: statusSummary, autoOpen: statusAutoOpen }), _jsxs("div", { className: "topbar-tool-group", children: [_jsx("button", { type: "button", className: "topbar-locale-toggle", "aria-label": ui.locale === 'zh' ? 'Switch to English' : '切换到中文', title: ui.locale === 'zh' ? 'Switch to English' : '切换到中文', onClick: () => setLocale(ui.locale === 'zh' ? 'en' : 'zh'), children: ui.locale === 'zh' ? 'CN' : 'EN' }), _jsx(ThemeMenuSlot, {}), _jsxs("a", { className: "topbar-docs-link", href: "https://bytedance.aiforce.cloud/app/app_4k9smq6rdxher/", target: "_blank", rel: "noopener noreferrer", title: t('nav.docs'), "aria-label": t('nav.docs'), children: [icon(_jsxs(_Fragment, { children: [_jsx("rect", { x: "2.2", y: "2.2", width: "11.6", height: "11.6", rx: "2" }), _jsx("path", { d: "M4.8 5.2h6.4M4.8 8h6.4M4.8 10.8h4" })] })), _jsx("span", { children: t('nav.docs') })] })] }), _jsxs("span", { className: "topbar-owner", title: ownerAvatar?.name, "aria-label": ownerAvatar?.name ?? 'Owner', children: [_jsx("span", { className: "topbar-owner-placeholder", "aria-hidden": "true", children: icon(_jsxs(_Fragment, { children: [_jsx("circle", { cx: "8", cy: "6", r: "2.4" }), _jsx("path", { d: "M3.7 13c.7-2.5 2.2-3.7 4.3-3.7s3.6 1.2 4.3 3.7" })] })) }), ownerAvatar?.avatarUrl ? (_jsx("img", { className: "topbar-owner-img", src: ownerAvatar.avatarUrl, alt: "", decoding: "async", referrerPolicy: "no-referrer", onError: (e) => { e.currentTarget.remove(); } })) : null] })] })] }), _jsxs("div", { className: "chrome-body", children: [_jsxs("aside", { className: "sidebar", children: [isAuthed ? (_jsxs("div", { className: "sidebar-create-actions", children: [_jsxs("button", { type: "button", className: "sidebar-create-btn", onClick: () => requestOpenCreateSession(), children: [icon(_jsxs(_Fragment, { children: [_jsx("path", { d: "M2 3.5h12v7H6l-3 3v-3H2z" }), _jsx("path", { d: "M8 4.9v4.2M5.9 7h4.2" })] })), _jsx("span", { className: "sidebar-nav-label", children: t('nav.createSession') })] }), _jsxs("button", { type: "button", className: "sidebar-create-btn", onClick: () => void openBotOnboarding(), children: [icon(_jsxs(_Fragment, { children: [_jsx("rect", { x: "2.5", y: "6", width: "11", height: "7.5", rx: "2" }), _jsx("circle", { cx: "5.8", cy: "9.75", r: "1" }), _jsx("circle", { cx: "10.2", cy: "9.75", r: "1" }), _jsx("path", { d: "M8 6V3.8M6.3 1.9h3.4" })] })), _jsx("span", { className: "sidebar-nav-label", children: t('nav.createBot') })] })] })) : null, _jsx("nav", { className: "sidebar-nav", "aria-label": "Dashboard", children: sidebarNavItems().filter(item => isAuthed || !item.manage).map(item => (_jsxs("a", { href: item.href, "data-route": item.id, className: [navClassName(item), item.plugin ? 'sidebar-plugin-item' : ''].filter(Boolean).join(' ') || undefined, title: item.plugin ? labelOf(item) : undefined, children: [icon(item.icon), _jsx("span", { className: "sidebar-nav-label", children: labelOf(item) }), item.id === 'settings' && updateBehind ? (_jsx(InfoTip, { className: "nav-update-tip", label: updateBadgeTitle(), trigger: _jsx("span", { className: "nav-update-dot", "aria-hidden": "true" }), preventClick: false, focusable: false, children: updateBadgeTitle() })) : null] }, item.id))) })] }), _jsxs("div", { className: "workspace", children: [_jsx("dialog", { id: "create-session-modal", className: "create-session-modal" }), _jsx(BotOnboardingDialog, { open: botOnboardingOpen, onClose: () => setBotOnboardingOpen(false) }), _jsx("main", { id: "root", ref: setRouteRoot })] })] })] }), _jsx(AuthExpiredOverlay, { open: authExpiredOpen, onClose: closeAuthExpired })] }));
629
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "aurora", "aria-hidden": "true", children: [_jsx("i", { className: "a1" }), _jsx("i", { className: "a2" }), _jsx("i", { className: "a3" })] }), _jsxs("div", { className: "app-shell", children: [_jsxs("header", { className: "topbar", children: [_jsx("div", { className: "topbar-left", children: _jsxs("div", { className: "topbar-brand-block", children: [_jsxs("a", { className: "brand", href: "#/", children: [_jsx("span", { className: "brand-mark", "aria-hidden": "true", children: _jsx("img", { className: "brand-logo-img", src: "/assets/brand-logo.png", alt: "", decoding: "sync", loading: "eager", fetchPriority: "high" }) }), _jsx("strong", { className: "brand-wordmark", children: "Botmux" }), _jsx("span", { className: "brand-product", children: "Dashboard" })] }), _jsx(TopbarVersionControl, { status: botmuxUpdateStatus, onRefresh: () => checkUpdateBadge(true) })] }) }), _jsxs("div", { className: "topbar-actions", children: [_jsx(TopbarStatusMenu, { summary: statusSummary, autoOpen: statusAutoOpen }), _jsxs("div", { className: "topbar-tool-group", children: [_jsx("button", { type: "button", className: "topbar-locale-toggle", "aria-label": ui.locale === 'zh' ? 'Switch to English' : '切换到中文', title: ui.locale === 'zh' ? 'Switch to English' : '切换到中文', onClick: () => setLocale(ui.locale === 'zh' ? 'en' : 'zh'), children: ui.locale === 'zh' ? 'CN' : 'EN' }), _jsx(ThemeMenuSlot, {}), _jsxs("a", { className: "topbar-docs-link", href: "https://bytedance.aiforce.cloud/app/app_4k9smq6rdxher/", target: "_blank", rel: "noopener noreferrer", title: t('nav.docs'), "aria-label": t('nav.docs'), children: [icon(_jsxs(_Fragment, { children: [_jsx("rect", { x: "2.2", y: "2.2", width: "11.6", height: "11.6", rx: "2" }), _jsx("path", { d: "M4.8 5.2h6.4M4.8 8h6.4M4.8 10.8h4" })] })), _jsx("span", { children: t('nav.docs') })] })] }), _jsxs("span", { className: "topbar-owner", title: ownerAvatar?.name, "aria-label": ownerAvatar?.name ?? 'Owner', children: [_jsx("span", { className: "topbar-owner-placeholder", "aria-hidden": "true", children: icon(_jsxs(_Fragment, { children: [_jsx("circle", { cx: "8", cy: "6", r: "2.4" }), _jsx("path", { d: "M3.7 13c.7-2.5 2.2-3.7 4.3-3.7s3.6 1.2 4.3 3.7" })] })) }), ownerAvatar?.avatarUrl ? (_jsx("img", { className: "topbar-owner-img", src: ownerAvatar.avatarUrl, alt: "", decoding: "async", referrerPolicy: "no-referrer", onError: (e) => { e.currentTarget.remove(); } })) : null] })] })] }), _jsxs("div", { className: "chrome-body", children: [_jsxs("aside", { className: "sidebar", children: [isAuthed ? (_jsxs("div", { className: "sidebar-create-actions", children: [_jsxs("button", { type: "button", className: "sidebar-create-btn", onClick: () => requestOpenCreateSession(), children: [icon(_jsxs(_Fragment, { children: [_jsx("path", { d: "M2 3.5h12v7H6l-3 3v-3H2z" }), _jsx("path", { d: "M8 4.9v4.2M5.9 7h4.2" })] })), _jsx("span", { className: "sidebar-nav-label", children: t('nav.createSession') })] }), _jsxs("button", { type: "button", className: "sidebar-create-btn", onClick: () => void openBotOnboarding(), children: [icon(_jsxs(_Fragment, { children: [_jsx("rect", { x: "2.5", y: "6", width: "11", height: "7.5", rx: "2" }), _jsx("circle", { cx: "5.8", cy: "9.75", r: "1" }), _jsx("circle", { cx: "10.2", cy: "9.75", r: "1" }), _jsx("path", { d: "M8 6V3.8M6.3 1.9h3.4" })] })), _jsx("span", { className: "sidebar-nav-label", children: t('nav.createBot') })] })] })) : null, _jsx("nav", { className: "sidebar-nav", "aria-label": "Dashboard", children: sidebarNavItems().filter(item => isAuthed || !item.manage).map(item => (_jsxs("a", { href: item.href, "data-route": item.id, className: [navClassName(item), item.plugin ? 'sidebar-plugin-item' : ''].filter(Boolean).join(' ') || undefined, title: item.plugin ? labelOf(item) : undefined, children: [icon(item.icon), _jsx("span", { className: "sidebar-nav-label", children: labelOf(item) }), item.id === 'settings' && updateBehind ? (_jsx(InfoTip, { className: "nav-update-tip", label: updateBadgeTitle(), trigger: _jsx("span", { className: "nav-update-dot", "aria-hidden": "true" }), preventClick: false, focusable: false, children: updateBadgeTitle() })) : null] }, item.id))) })] }), _jsxs("div", { className: "workspace", children: [_jsx("dialog", { id: "create-session-modal", className: "create-session-modal" }), _jsx(BotOnboardingDialog, { open: botOnboardingOpen, onClose: () => setBotOnboardingOpen(false) }), _jsx("main", { id: "root", ref: setRouteRoot })] })] })] }), _jsx(AuthExpiredOverlay, { open: authExpiredOpen, onClose: closeAuthExpired })] }));
350
630
  }
351
631
  function renderShell() {
352
632
  appRoot?.render(_jsx(DashboardShell, {}));
@@ -445,14 +725,15 @@ async function persistLocale(locale) {
445
725
  }
446
726
  catch { /* best-effort; UI already switched locally */ }
447
727
  }
448
- async function checkUpdateBadge() {
728
+ async function checkUpdateBadge(force = false) {
449
729
  if (!isAuthed)
450
- return;
730
+ return false;
451
731
  try {
452
- const r = await fetch('/api/update/status');
732
+ const r = await fetch(`/api/update/status${force ? '?refresh=1' : ''}`, { cache: 'no-store' });
453
733
  if (!r.ok)
454
- return;
734
+ return false;
455
735
  const j = await r.json();
736
+ botmuxUpdateStatus = j;
456
737
  const runtime = Array.isArray(j.cliUpdates)
457
738
  ? j.cliUpdates.find((entry) => entry?.updateAvailable === true && entry?.latest)
458
739
  : null;
@@ -472,8 +753,11 @@ async function checkUpdateBadge() {
472
753
  latestVersion = null;
473
754
  }
474
755
  renderShell();
756
+ return j.versionLookupOk !== false;
757
+ }
758
+ catch {
759
+ return false;
475
760
  }
476
- catch { /* best-effort */ }
477
761
  }
478
762
  function renderAuthRequiredPage(host) {
479
763
  host.innerHTML =
@@ -587,6 +871,11 @@ void (async () => {
587
871
  window.addEventListener(PLUGIN_PINS_CHANGED_EVENT, () => { void loadPinnedPluginNavItems(); });
588
872
  void loadPinnedPluginNavItems();
589
873
  void checkUpdateBadge();
874
+ window.setInterval(() => {
875
+ if (document.hidden)
876
+ return;
877
+ void checkUpdateBadge();
878
+ }, 30 * 60_000);
590
879
  initOwnerAvatar();
591
880
  try {
592
881
  await bootstrap();