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.
- package/dist/adapters/backend/sandbox.d.ts +23 -0
- package/dist/adapters/backend/sandbox.d.ts.map +1 -1
- package/dist/adapters/backend/sandbox.js +68 -1
- package/dist/adapters/backend/sandbox.js.map +1 -1
- package/dist/adapters/cli/read-isolation.d.ts +1 -1
- package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
- package/dist/adapters/cli/read-isolation.js +15 -7
- package/dist/adapters/cli/read-isolation.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +117 -25
- package/dist/cli.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +11 -4
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts +1 -0
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +132 -0
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/maintenance.d.ts +23 -1
- package/dist/core/maintenance.d.ts.map +1 -1
- package/dist/core/maintenance.js +63 -25
- package/dist/core/maintenance.js.map +1 -1
- package/dist/core/plugins/cli-generation.d.ts.map +1 -1
- package/dist/core/plugins/cli-generation.js +7 -0
- package/dist/core/plugins/cli-generation.js.map +1 -1
- package/dist/core/plugins/convention-scanner.d.ts +3 -3
- package/dist/core/plugins/convention-scanner.d.ts.map +1 -1
- package/dist/core/plugins/convention-scanner.js.map +1 -1
- package/dist/core/plugins/install.d.ts.map +1 -1
- package/dist/core/plugins/install.js +84 -26
- package/dist/core/plugins/install.js.map +1 -1
- package/dist/core/plugins/mcp/environment.d.ts +12 -0
- package/dist/core/plugins/mcp/environment.d.ts.map +1 -0
- package/dist/core/plugins/mcp/environment.js +17 -0
- package/dist/core/plugins/mcp/environment.js.map +1 -0
- package/dist/core/plugins/mcp/gateway-installer.d.ts.map +1 -1
- package/dist/core/plugins/mcp/gateway-installer.js +9 -3
- package/dist/core/plugins/mcp/gateway-installer.js.map +1 -1
- package/dist/core/plugins/mcp/gateway.d.ts +13 -1
- package/dist/core/plugins/mcp/gateway.d.ts.map +1 -1
- package/dist/core/plugins/mcp/gateway.js +143 -23
- package/dist/core/plugins/mcp/gateway.js.map +1 -1
- package/dist/core/plugins/mcp/host.d.ts +18 -0
- package/dist/core/plugins/mcp/host.d.ts.map +1 -0
- package/dist/core/plugins/mcp/host.js +126 -0
- package/dist/core/plugins/mcp/host.js.map +1 -0
- package/dist/core/plugins/mcp/private-store.d.ts +15 -0
- package/dist/core/plugins/mcp/private-store.d.ts.map +1 -0
- package/dist/core/plugins/mcp/private-store.js +162 -0
- package/dist/core/plugins/mcp/private-store.js.map +1 -0
- package/dist/core/plugins/mcp/session-runtime.d.ts +25 -0
- package/dist/core/plugins/mcp/session-runtime.d.ts.map +1 -0
- package/dist/core/plugins/mcp/session-runtime.js +76 -0
- package/dist/core/plugins/mcp/session-runtime.js.map +1 -0
- package/dist/core/plugins/mcp/socket-auth.d.ts +9 -0
- package/dist/core/plugins/mcp/socket-auth.d.ts.map +1 -0
- package/dist/core/plugins/mcp/socket-auth.js +94 -0
- package/dist/core/plugins/mcp/socket-auth.js.map +1 -0
- package/dist/core/plugins/paths.d.ts +3 -0
- package/dist/core/plugins/paths.d.ts.map +1 -1
- package/dist/core/plugins/paths.js +9 -0
- package/dist/core/plugins/paths.js.map +1 -1
- package/dist/core/plugins/pm2.d.ts.map +1 -1
- package/dist/core/plugins/pm2.js +3 -1
- package/dist/core/plugins/pm2.js.map +1 -1
- package/dist/core/plugins/runtime.d.ts +2 -0
- package/dist/core/plugins/runtime.d.ts.map +1 -1
- package/dist/core/plugins/runtime.js.map +1 -1
- package/dist/core/plugins/service-manager.d.ts +22 -0
- package/dist/core/plugins/service-manager.d.ts.map +1 -1
- package/dist/core/plugins/service-manager.js +189 -52
- package/dist/core/plugins/service-manager.js.map +1 -1
- package/dist/core/plugins/types.d.ts +15 -1
- package/dist/core/plugins/types.d.ts.map +1 -1
- package/dist/core/restart-report.d.ts +1 -1
- package/dist/core/restart-report.d.ts.map +1 -1
- package/dist/core/restart-report.js +5 -3
- package/dist/core/restart-report.js.map +1 -1
- package/dist/core/scheduler.d.ts +47 -0
- package/dist/core/scheduler.d.ts.map +1 -1
- package/dist/core/scheduler.js +117 -0
- package/dist/core/scheduler.js.map +1 -1
- package/dist/core/session-manager.d.ts +7 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +130 -33
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/silent-schedule-turns.d.ts +5 -0
- package/dist/core/silent-schedule-turns.d.ts.map +1 -0
- package/dist/core/silent-schedule-turns.js +47 -0
- package/dist/core/silent-schedule-turns.js.map +1 -0
- package/dist/core/types.d.ts +6 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/update-check.d.ts +16 -0
- package/dist/core/update-check.d.ts.map +1 -1
- package/dist/core/update-check.js +52 -0
- package/dist/core/update-check.js.map +1 -1
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +30 -23
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/dashboard/schedule-card-model.d.ts +3 -0
- package/dist/dashboard/schedule-card-model.d.ts.map +1 -1
- package/dist/dashboard/schedule-card-model.js +5 -0
- package/dist/dashboard/schedule-card-model.js.map +1 -1
- package/dist/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +295 -6
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +92 -0
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/plugin-page.d.ts.map +1 -1
- package/dist/dashboard/web/plugin-page.js +1 -3
- package/dist/dashboard/web/plugin-page.js.map +1 -1
- package/dist/dashboard/web/schedules-page.d.ts.map +1 -1
- package/dist/dashboard/web/schedules-page.js +111 -4
- package/dist/dashboard/web/schedules-page.js.map +1 -1
- package/dist/dashboard/web/settings-page.d.ts.map +1 -1
- package/dist/dashboard/web/settings-page.js +5 -1
- package/dist/dashboard/web/settings-page.js.map +1 -1
- package/dist/dashboard/web/update-action.d.ts +16 -0
- package/dist/dashboard/web/update-action.d.ts.map +1 -0
- package/dist/dashboard/web/update-action.js +64 -0
- package/dist/dashboard/web/update-action.js.map +1 -0
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/{bot-defaults-page-KLDCZNLP.js → bot-defaults-page-4PM4T6QQ.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-FMJNOATE.js → chunk-3PMN55Z6.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-MLNI5BKE.js → chunk-AIDN2WZB.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-EZAW2EPM.js → chunk-IKCZ677K.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-KEAOTUL3.js → chunk-RXVA6XW3.js} +7 -7
- package/dist/dashboard-web/chunks/{connectors-page-O32LFAL5.js → connectors-page-2MKF4YTN.js} +1 -1
- package/dist/dashboard-web/chunks/{groups-page-PSAFIZ6M.js → groups-page-TAU2UIVS.js} +1 -1
- package/dist/dashboard-web/chunks/{insights-page-V23LLATX.js → insights-page-PJ2XVM6T.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-7X5AKYOF.js → monitor-room-D6445HJO.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-CBA3CQYL.js → monitoring-page-GUHMCKSO.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-RL6QSEM7.js → office-page-6K6U2MS5.js} +1 -1
- package/dist/dashboard-web/chunks/{overview-page-XQIPO6KH.js → overview-page-USDYU7U5.js} +1 -1
- package/dist/dashboard-web/chunks/plugin-page-JXC5F5YV.js +1 -0
- package/dist/dashboard-web/chunks/{roles-page-ACIWV7QS.js → roles-page-O4OUA7ZH.js} +1 -1
- package/dist/dashboard-web/chunks/schedules-page-LNIBXJSZ.js +1 -0
- package/dist/dashboard-web/chunks/{sessions-page-2WDWHSP4.js → sessions-page-B6U6TCFF.js} +1 -1
- package/dist/dashboard-web/chunks/{settings-page-6VX4OUGG.js → settings-page-PXLRFF7I.js} +2 -2
- package/dist/dashboard-web/chunks/{skills-page-WXE3UYLT.js → skills-page-M5KYNXBA.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-PYTF4FLM.js → team-federation-page-GT7UFQMN.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-G6CD6O3I.js → v3-page-UYZIRJ2C.js} +1 -1
- package/dist/dashboard-web/chunks/{whiteboards-page-6SG33GP4.js → whiteboards-page-WAR77DQE.js} +1 -1
- package/dist/dashboard-web/style.css +697 -0
- package/dist/dashboard.js +404 -29
- package/dist/dashboard.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +4 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +4 -0
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/schedules-card.d.ts.map +1 -1
- package/dist/im/lark/schedules-card.js +2 -0
- package/dist/im/lark/schedules-card.js.map +1 -1
- package/dist/services/plugin-registry-store.d.ts.map +1 -1
- package/dist/services/plugin-registry-store.js +100 -18
- package/dist/services/plugin-registry-store.js.map +1 -1
- package/dist/services/restart-intent-store.d.ts +17 -2
- package/dist/services/restart-intent-store.d.ts.map +1 -1
- package/dist/services/restart-intent-store.js +110 -0
- package/dist/services/restart-intent-store.js.map +1 -1
- package/dist/services/schedule-store.d.ts +3 -1
- package/dist/services/schedule-store.d.ts.map +1 -1
- package/dist/services/schedule-store.js +5 -0
- package/dist/services/schedule-store.js.map +1 -1
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +3 -2
- package/dist/skills/definitions.js.map +1 -1
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/child-env.d.ts +1 -1
- package/dist/utils/child-env.d.ts.map +1 -1
- package/dist/utils/child-env.js +5 -0
- package/dist/utils/child-env.js.map +1 -1
- package/dist/utils/global-install.d.ts +2 -0
- package/dist/utils/global-install.d.ts.map +1 -1
- package/dist/utils/global-install.js +14 -0
- package/dist/utils/global-install.js.map +1 -1
- package/dist/worker.js +125 -17
- package/dist/worker.js.map +1 -1
- package/dist/workflows/hostExecutors/botmux-schedule.d.ts +3 -0
- package/dist/workflows/hostExecutors/botmux-schedule.d.ts.map +1 -1
- package/dist/workflows/hostExecutors/botmux-schedule.js +9 -0
- package/dist/workflows/hostExecutors/botmux-schedule.js.map +1 -1
- package/package.json +1 -1
- package/dist/dashboard-web/chunks/plugin-page-7FW2LPJH.js +0 -1
- 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":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAQxD,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,uBAAuB,GAAG,GAAG,CAAC;AACpC,MAAM,uBAAuB,GAAG,CAAC,CAAC;
|
|
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":"
|
|
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(
|
|
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();
|