botmux 2.9.0 → 2.9.2
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/README.en.md +140 -76
- package/README.md +134 -75
- package/dist/adapters/backend/pty-backend.d.ts +6 -0
- package/dist/adapters/backend/pty-backend.d.ts.map +1 -1
- package/dist/adapters/backend/pty-backend.js +10 -0
- package/dist/adapters/backend/pty-backend.js.map +1 -1
- package/dist/adapters/backend/session-backend-selector.d.ts +11 -0
- package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -0
- package/dist/adapters/backend/session-backend-selector.js +26 -0
- package/dist/adapters/backend/session-backend-selector.js.map +1 -0
- package/dist/adapters/backend/tmux-backend.d.ts +80 -3
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +301 -49
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.d.ts +100 -0
- package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -0
- package/dist/adapters/backend/tmux-pipe-backend.js +473 -0
- package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -0
- package/dist/adapters/cli/aiden.d.ts.map +1 -1
- package/dist/adapters/cli/aiden.js +5 -0
- package/dist/adapters/cli/aiden.js.map +1 -1
- package/dist/adapters/cli/claude-code.d.ts +40 -1
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +470 -49
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/coco.d.ts.map +1 -1
- package/dist/adapters/cli/coco.js +191 -9
- package/dist/adapters/cli/coco.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +94 -17
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/shared-hints.d.ts +2 -2
- package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
- package/dist/adapters/cli/shared-hints.js +7 -5
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +38 -1
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/autostart.d.ts +14 -0
- package/dist/autostart.d.ts.map +1 -0
- package/dist/autostart.js +357 -0
- package/dist/autostart.js.map +1 -0
- package/dist/bot-registry.d.ts +29 -3
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +91 -12
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/arg-utils.d.ts +11 -0
- package/dist/cli/arg-utils.d.ts.map +1 -0
- package/dist/cli/arg-utils.js +25 -0
- package/dist/cli/arg-utils.js.map +1 -0
- package/dist/cli/create-group-resolver.d.ts +32 -0
- package/dist/cli/create-group-resolver.d.ts.map +1 -0
- package/dist/cli/create-group-resolver.js +70 -0
- package/dist/cli/create-group-resolver.js.map +1 -0
- package/dist/cli/quoted-render.d.ts +30 -0
- package/dist/cli/quoted-render.d.ts.map +1 -0
- package/dist/cli/quoted-render.js +29 -0
- package/dist/cli/quoted-render.js.map +1 -0
- package/dist/cli.js +916 -272
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +18 -8
- package/dist/config.js.map +1 -1
- package/dist/core/command-handler.d.ts +43 -0
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +167 -64
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-events.d.ts +57 -0
- package/dist/core/dashboard-events.d.ts.map +1 -0
- package/dist/core/dashboard-events.js +23 -0
- package/dist/core/dashboard-events.js.map +1 -0
- package/dist/core/dashboard-ipc-server.d.ts +43 -0
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -0
- package/dist/core/dashboard-ipc-server.js +481 -0
- package/dist/core/dashboard-ipc-server.js.map +1 -0
- package/dist/core/dashboard-locate.d.ts +20 -0
- package/dist/core/dashboard-locate.d.ts.map +1 -0
- package/dist/core/dashboard-locate.js +26 -0
- package/dist/core/dashboard-locate.js.map +1 -0
- package/dist/core/dashboard-rows.d.ts +31 -0
- package/dist/core/dashboard-rows.d.ts.map +1 -0
- package/dist/core/dashboard-rows.js +65 -0
- package/dist/core/dashboard-rows.js.map +1 -0
- package/dist/core/inherit-peer.d.ts +14 -0
- package/dist/core/inherit-peer.d.ts.map +1 -0
- package/dist/core/inherit-peer.js +32 -0
- package/dist/core/inherit-peer.js.map +1 -0
- package/dist/core/scheduler.d.ts +24 -0
- package/dist/core/scheduler.d.ts.map +1 -1
- package/dist/core/scheduler.js +93 -2
- package/dist/core/scheduler.js.map +1 -1
- package/dist/core/session-activity.d.ts +3 -0
- package/dist/core/session-activity.d.ts.map +1 -0
- package/dist/core/session-activity.js +20 -0
- package/dist/core/session-activity.js.map +1 -0
- package/dist/core/session-discovery.d.ts +39 -0
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +114 -21
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts +72 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +396 -106
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/types.d.ts +27 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +14 -3
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +72 -3
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +459 -38
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +601 -309
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/aggregator.d.ts +41 -0
- package/dist/dashboard/aggregator.d.ts.map +1 -0
- package/dist/dashboard/aggregator.js +125 -0
- package/dist/dashboard/aggregator.js.map +1 -0
- package/dist/dashboard/auth.d.ts +23 -0
- package/dist/dashboard/auth.d.ts.map +1 -0
- package/dist/dashboard/auth.js +66 -0
- package/dist/dashboard/auth.js.map +1 -0
- package/dist/dashboard/operator-selector.d.ts +20 -0
- package/dist/dashboard/operator-selector.d.ts.map +1 -0
- package/dist/dashboard/operator-selector.js +39 -0
- package/dist/dashboard/operator-selector.js.map +1 -0
- package/dist/dashboard/registry.d.ts +35 -0
- package/dist/dashboard/registry.d.ts.map +1 -0
- package/dist/dashboard/registry.js +74 -0
- package/dist/dashboard/registry.js.map +1 -0
- package/dist/dashboard/web/app.d.ts +2 -0
- package/dist/dashboard/web/app.d.ts.map +1 -0
- package/dist/dashboard/web/app.js +45 -0
- package/dist/dashboard/web/app.js.map +1 -0
- package/dist/dashboard/web/bot-defaults.d.ts +2 -0
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -0
- package/dist/dashboard/web/bot-defaults.js +201 -0
- package/dist/dashboard/web/bot-defaults.js.map +1 -0
- package/dist/dashboard/web/groups.d.ts +16 -0
- package/dist/dashboard/web/groups.d.ts.map +1 -0
- package/dist/dashboard/web/groups.js +584 -0
- package/dist/dashboard/web/groups.js.map +1 -0
- package/dist/dashboard/web/schedules.d.ts +2 -0
- package/dist/dashboard/web/schedules.d.ts.map +1 -0
- package/dist/dashboard/web/schedules.js +105 -0
- package/dist/dashboard/web/schedules.js.map +1 -0
- package/dist/dashboard/web/sessions.d.ts +2 -0
- package/dist/dashboard/web/sessions.d.ts.map +1 -0
- package/dist/dashboard/web/sessions.js +374 -0
- package/dist/dashboard/web/sessions.js.map +1 -0
- package/dist/dashboard/web/store.d.ts +23 -0
- package/dist/dashboard/web/store.d.ts.map +1 -0
- package/dist/dashboard/web/store.js +82 -0
- package/dist/dashboard/web/store.js.map +1 -0
- package/dist/dashboard-web/app.js +263 -0
- package/dist/dashboard-web/index.html +23 -0
- package/dist/dashboard-web/style.css +93 -0
- package/dist/dashboard.d.ts +2 -0
- package/dist/dashboard.d.ts.map +1 -0
- package/dist/dashboard.js +639 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/im/lark/card-builder.d.ts +18 -1
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +70 -9
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +123 -109
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +36 -0
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +119 -13
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +92 -8
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +410 -89
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/forwarded-renderer.d.ts +23 -0
- package/dist/im/lark/forwarded-renderer.d.ts.map +1 -0
- package/dist/im/lark/forwarded-renderer.js +105 -0
- package/dist/im/lark/forwarded-renderer.js.map +1 -0
- package/dist/im/lark/md-card.d.ts +73 -0
- package/dist/im/lark/md-card.d.ts.map +1 -0
- package/dist/im/lark/md-card.js +332 -0
- package/dist/im/lark/md-card.js.map +1 -0
- package/dist/im/lark/merge-forward.d.ts +32 -0
- package/dist/im/lark/merge-forward.d.ts.map +1 -0
- package/dist/im/lark/merge-forward.js +110 -0
- package/dist/im/lark/merge-forward.js.map +1 -0
- package/dist/im/lark/message-parser.d.ts +9 -3
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +48 -13
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/im/lark/quote-hint.d.ts +18 -0
- package/dist/im/lark/quote-hint.d.ts.map +1 -0
- package/dist/im/lark/quote-hint.js +23 -0
- package/dist/im/lark/quote-hint.js.map +1 -0
- package/dist/services/bridge-fallback-gate.d.ts +42 -0
- package/dist/services/bridge-fallback-gate.d.ts.map +1 -0
- package/dist/services/bridge-fallback-gate.js +12 -0
- package/dist/services/bridge-fallback-gate.js.map +1 -0
- package/dist/services/bridge-rotation-policy.d.ts +139 -0
- package/dist/services/bridge-rotation-policy.d.ts.map +1 -0
- package/dist/services/bridge-rotation-policy.js +125 -0
- package/dist/services/bridge-rotation-policy.js.map +1 -0
- package/dist/services/bridge-turn-queue.d.ts +154 -0
- package/dist/services/bridge-turn-queue.d.ts.map +1 -0
- package/dist/services/bridge-turn-queue.js +316 -0
- package/dist/services/bridge-turn-queue.js.map +1 -0
- package/dist/services/chat-first-seen-store.d.ts +27 -0
- package/dist/services/chat-first-seen-store.d.ts.map +1 -0
- package/dist/services/chat-first-seen-store.js +114 -0
- package/dist/services/chat-first-seen-store.js.map +1 -0
- package/dist/services/claude-transcript.d.ts +268 -0
- package/dist/services/claude-transcript.d.ts.map +1 -0
- package/dist/services/claude-transcript.js +798 -0
- package/dist/services/claude-transcript.js.map +1 -0
- package/dist/services/coco-transcript.d.ts +35 -0
- package/dist/services/coco-transcript.d.ts.map +1 -0
- package/dist/services/coco-transcript.js +192 -0
- package/dist/services/coco-transcript.js.map +1 -0
- package/dist/services/codex-bridge-queue.d.ts +56 -0
- package/dist/services/codex-bridge-queue.d.ts.map +1 -0
- package/dist/services/codex-bridge-queue.js +150 -0
- package/dist/services/codex-bridge-queue.js.map +1 -0
- package/dist/services/codex-transcript.d.ts +84 -0
- package/dist/services/codex-transcript.d.ts.map +1 -0
- package/dist/services/codex-transcript.js +298 -0
- package/dist/services/codex-transcript.js.map +1 -0
- package/dist/services/group-creator.d.ts +23 -0
- package/dist/services/group-creator.d.ts.map +1 -0
- package/dist/services/group-creator.js +75 -0
- package/dist/services/group-creator.js.map +1 -0
- package/dist/services/groups-store.d.ts +98 -0
- package/dist/services/groups-store.d.ts.map +1 -0
- package/dist/services/groups-store.js +213 -0
- package/dist/services/groups-store.js.map +1 -0
- package/dist/services/oncall-store.d.ts +80 -8
- package/dist/services/oncall-store.d.ts.map +1 -1
- package/dist/services/oncall-store.js +265 -55
- package/dist/services/oncall-store.js.map +1 -1
- package/dist/services/project-scanner.d.ts +1 -2
- package/dist/services/project-scanner.d.ts.map +1 -1
- package/dist/services/project-scanner.js +118 -68
- package/dist/services/project-scanner.js.map +1 -1
- package/dist/services/schedule-store.d.ts +5 -0
- package/dist/services/schedule-store.d.ts.map +1 -1
- package/dist/services/schedule-store.js +77 -1
- package/dist/services/schedule-store.js.map +1 -1
- package/dist/services/session-store.d.ts +22 -0
- package/dist/services/session-store.d.ts.map +1 -1
- package/dist/services/session-store.js +62 -4
- package/dist/services/session-store.js.map +1 -1
- package/dist/setup/bots-store.d.ts +3 -0
- package/dist/setup/bots-store.d.ts.map +1 -0
- package/dist/setup/bots-store.js +24 -0
- package/dist/setup/bots-store.js.map +1 -0
- package/dist/setup/detect-platform.d.ts +14 -0
- package/dist/setup/detect-platform.d.ts.map +1 -0
- package/dist/setup/detect-platform.js +139 -0
- package/dist/setup/detect-platform.js.map +1 -0
- package/dist/setup/ensure-fonts.d.ts +13 -0
- package/dist/setup/ensure-fonts.d.ts.map +1 -0
- package/dist/setup/ensure-fonts.js +225 -0
- package/dist/setup/ensure-fonts.js.map +1 -0
- package/dist/setup/ensure-tmux.d.ts +60 -0
- package/dist/setup/ensure-tmux.d.ts.map +1 -0
- package/dist/setup/ensure-tmux.js +236 -0
- package/dist/setup/ensure-tmux.js.map +1 -0
- package/dist/setup/index.d.ts +9 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/index.js +46 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/lark-scopes.json +301 -0
- package/dist/setup/register-app.d.ts +52 -0
- package/dist/setup/register-app.d.ts.map +1 -0
- package/dist/setup/register-app.js +91 -0
- package/dist/setup/register-app.js.map +1 -0
- package/dist/setup/verify-permissions.d.ts +115 -0
- package/dist/setup/verify-permissions.d.ts.map +1 -0
- package/dist/setup/verify-permissions.js +207 -0
- package/dist/setup/verify-permissions.js.map +1 -0
- package/dist/skills/definitions.d.ts +4 -0
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +133 -19
- package/dist/skills/definitions.js.map +1 -1
- package/dist/skills/installer.d.ts +3 -1
- package/dist/skills/installer.d.ts.map +1 -1
- package/dist/skills/installer.js +18 -3
- package/dist/skills/installer.js.map +1 -1
- package/dist/types.d.ts +44 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/bot-routing.d.ts +6 -0
- package/dist/utils/bot-routing.d.ts.map +1 -0
- package/dist/utils/bot-routing.js +50 -0
- package/dist/utils/bot-routing.js.map +1 -0
- package/dist/utils/file-lock.d.ts +2 -0
- package/dist/utils/file-lock.d.ts.map +1 -0
- package/dist/utils/file-lock.js +114 -0
- package/dist/utils/file-lock.js.map +1 -0
- package/dist/utils/font-installer.js +1 -1
- package/dist/utils/font-installer.js.map +1 -1
- package/dist/utils/idle-detector.d.ts +6 -0
- package/dist/utils/idle-detector.d.ts.map +1 -1
- package/dist/utils/idle-detector.js +25 -4
- package/dist/utils/idle-detector.js.map +1 -1
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +60 -8
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/render-dimensions.d.ts +48 -0
- package/dist/utils/render-dimensions.d.ts.map +1 -0
- package/dist/utils/render-dimensions.js +55 -0
- package/dist/utils/render-dimensions.js.map +1 -0
- package/dist/utils/screen-analyzer.d.ts.map +1 -1
- package/dist/utils/screen-analyzer.js +24 -0
- package/dist/utils/screen-analyzer.js.map +1 -1
- package/dist/utils/screenshot-renderer.d.ts.map +1 -1
- package/dist/utils/screenshot-renderer.js +67 -23
- package/dist/utils/screenshot-renderer.js.map +1 -1
- package/dist/utils/terminal-renderer.d.ts +16 -0
- package/dist/utils/terminal-renderer.d.ts.map +1 -1
- package/dist/utils/terminal-renderer.js +40 -23
- package/dist/utils/terminal-renderer.js.map +1 -1
- package/dist/utils/transient-snapshot.d.ts +28 -0
- package/dist/utils/transient-snapshot.d.ts.map +1 -0
- package/dist/utils/transient-snapshot.js +96 -0
- package/dist/utils/transient-snapshot.js.map +1 -0
- package/dist/worker.js +2220 -83
- package/dist/worker.js.map +1 -1
- package/package.json +12 -5
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { store } from './store.js';
|
|
2
|
+
const PAGE_HTML = `
|
|
3
|
+
<form id="sched-filters" class="filters">
|
|
4
|
+
<input type="search" name="q" placeholder="search name / prompt / workingDir" />
|
|
5
|
+
<select name="kind">
|
|
6
|
+
<option value="">any kind</option>
|
|
7
|
+
<option>cron</option>
|
|
8
|
+
<option>interval</option>
|
|
9
|
+
<option>once</option>
|
|
10
|
+
</select>
|
|
11
|
+
<label><input type="checkbox" name="enabled"> enabled only</label>
|
|
12
|
+
</form>
|
|
13
|
+
<table>
|
|
14
|
+
<thead><tr>
|
|
15
|
+
<th>name</th><th>bot</th><th>schedule</th><th>next</th><th>last</th>
|
|
16
|
+
<th>repeat</th><th>enabled</th><th>actions</th>
|
|
17
|
+
</tr></thead>
|
|
18
|
+
<tbody id="schedules-tbody"></tbody>
|
|
19
|
+
</table>
|
|
20
|
+
`;
|
|
21
|
+
function escapeHtml(s) {
|
|
22
|
+
return s.replace(/[&<>"']/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]));
|
|
23
|
+
}
|
|
24
|
+
function fmtDate(s) {
|
|
25
|
+
if (!s)
|
|
26
|
+
return '—';
|
|
27
|
+
try {
|
|
28
|
+
const d = new Date(s);
|
|
29
|
+
return d.toLocaleString();
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return s;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function renderSchedulesPage(root) {
|
|
36
|
+
root.innerHTML = PAGE_HTML;
|
|
37
|
+
const tbody = root.querySelector('#schedules-tbody');
|
|
38
|
+
const form = root.querySelector('#sched-filters');
|
|
39
|
+
function filtered() {
|
|
40
|
+
const f = new FormData(form);
|
|
41
|
+
const q = (f.get('q') ?? '').toLowerCase();
|
|
42
|
+
const kind = f.get('kind');
|
|
43
|
+
const enabledOnly = !!f.get('enabled');
|
|
44
|
+
return [...store.schedules.values()]
|
|
45
|
+
.filter(s => !kind || s.parsed?.kind === kind)
|
|
46
|
+
.filter(s => !enabledOnly || s.enabled)
|
|
47
|
+
.filter(s => !q || JSON.stringify(s).toLowerCase().includes(q))
|
|
48
|
+
.sort((a, b) => {
|
|
49
|
+
// enabled first, then earliest nextRunAt
|
|
50
|
+
if (a.enabled !== b.enabled)
|
|
51
|
+
return a.enabled ? -1 : 1;
|
|
52
|
+
const aN = a.nextRunAt ? Date.parse(a.nextRunAt) : Infinity;
|
|
53
|
+
const bN = b.nextRunAt ? Date.parse(b.nextRunAt) : Infinity;
|
|
54
|
+
return aN - bN;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function rerender() {
|
|
58
|
+
tbody.innerHTML = filtered().map(s => `<tr data-id="${escapeHtml(s.id)}">
|
|
59
|
+
<td>${escapeHtml(s.name ?? s.id)}</td>
|
|
60
|
+
<td>${escapeHtml(s.botName ?? s.larkAppId ?? '-')}</td>
|
|
61
|
+
<td><code>${escapeHtml(s.parsed?.display ?? '?')}</code></td>
|
|
62
|
+
<td>${fmtDate(s.nextRunAt)}</td>
|
|
63
|
+
<td>${fmtDate(s.lastRunAt)} ${s.lastStatus === 'error' ? '⚠️' : ''}</td>
|
|
64
|
+
<td>${s.repeat ? `${s.repeat.completed}/${s.repeat.times ?? '∞'}` : '—'}</td>
|
|
65
|
+
<td>${s.enabled ? '✓' : '✗'}</td>
|
|
66
|
+
<td class="actions-cell">
|
|
67
|
+
<button data-op="run" type="button">Run now</button>
|
|
68
|
+
${s.enabled
|
|
69
|
+
? `<button data-op="pause" type="button">Pause</button>`
|
|
70
|
+
: `<button data-op="resume" type="button">Resume</button>`}
|
|
71
|
+
</td>
|
|
72
|
+
</tr>`).join('') || '<tr><td colspan="8" class="empty">No schedules.</td></tr>';
|
|
73
|
+
}
|
|
74
|
+
tbody.addEventListener('click', async (e) => {
|
|
75
|
+
const btn = e.target.closest('button[data-op]');
|
|
76
|
+
if (!btn)
|
|
77
|
+
return;
|
|
78
|
+
const tr = btn.closest('tr[data-id]');
|
|
79
|
+
if (!tr)
|
|
80
|
+
return;
|
|
81
|
+
const id = tr.dataset.id;
|
|
82
|
+
const op = btn.dataset.op;
|
|
83
|
+
btn.disabled = true;
|
|
84
|
+
const original = btn.textContent;
|
|
85
|
+
btn.textContent = '...';
|
|
86
|
+
try {
|
|
87
|
+
const r = await fetch(`/api/schedules/${encodeURIComponent(id)}/${op}`, { method: 'POST' });
|
|
88
|
+
const body = await r.json().catch(() => ({}));
|
|
89
|
+
if (!r.ok || body.ok === false) {
|
|
90
|
+
alert(`Failed: ${r.status} ${body?.error ?? ''}`.trim());
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
alert('Network error: ' + err);
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
btn.disabled = false;
|
|
98
|
+
btn.textContent = original;
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
form.addEventListener('input', rerender);
|
|
102
|
+
store.on(rerender);
|
|
103
|
+
rerender();
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=schedules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedules.js","sourceRoot":"","sources":["../../../src/dashboard/web/schedules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;CAkBjB,CAAC;AAEF,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAC,OAAO,EAAC,GAAG,EAAC,MAAM,EAAC,GAAG,EAAC,MAAM,EAAC,GAAG,EAAC,QAAQ,EAAC,GAAG,EAAC,OAAO,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;AAC1G,CAAC;AAED,SAAS,OAAO,CAAC,CAAU;IACzB,IAAI,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO,CAAC,CAAC,cAAc,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,CAAC,CAAC;IAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAiB;IACnD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAc,kBAAkB,CAAE,CAAC;IACnE,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAkB,gBAAgB,CAAE,CAAC;IAEpE,SAAS,QAAQ;QACf,MAAM,CAAC,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAY,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAW,CAAC;QACrC,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;aACjC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,KAAK,IAAI,CAAC;aAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,OAAO,CAAC;aACtC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;aAC9D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACb,yCAAyC;YACzC,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO;gBAAE,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC5D,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC5D,OAAO,EAAE,GAAG,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,SAAS,QAAQ;QACf,KAAK,CAAC,SAAS,GAAG,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC;YAC1B,UAAU,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC;kBACrC,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,IAAI,GAAG,CAAC;YAC1C,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YACpB,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;YAC5D,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG;YACjE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;;;UAGvB,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,sDAAsD;YACxD,CAAC,CAAC,wDAAwD;;UAE1D,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,2DAA2D,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;QACxC,MAAM,GAAG,GAAI,CAAC,CAAC,MAAsB,CAAC,OAAO,CAAoB,iBAAiB,CAAC,CAAC;QACpF,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAsB,aAAa,CAAC,CAAC;QAC3D,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAG,CAAC;QAC1B,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAG,CAAC;QAC3B,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;QACpB,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC;QACjC,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,kBAAkB,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5F,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9C,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;gBAC/B,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,CAAC,iBAAiB,GAAG,GAAG,CAAC,CAAC;QACjC,CAAC;gBAAS,CAAC;YACT,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;YACrB,GAAG,CAAC,WAAW,GAAG,QAAQ,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IACnB,QAAQ,EAAE,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../src/dashboard/web/sessions.ts"],"names":[],"mappings":"AA4DA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,QA8SnD"}
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
// Sessions page: filter bar, table, detail drawer with locate (30s cooldown) + close.
|
|
2
|
+
import { store } from './store.js';
|
|
3
|
+
const PAGE_HTML = `
|
|
4
|
+
<form id="filters" class="filters">
|
|
5
|
+
<input type="search" name="q" placeholder="search workingDir / title / ids" />
|
|
6
|
+
<select name="cli" multiple size="4">
|
|
7
|
+
<option value="claude-code">claude-code</option>
|
|
8
|
+
<option value="codex">codex</option>
|
|
9
|
+
<option value="gemini">gemini</option>
|
|
10
|
+
<option value="opencode">opencode</option>
|
|
11
|
+
<option value="aiden">aiden</option>
|
|
12
|
+
<option value="coco">coco</option>
|
|
13
|
+
<option value="unknown">unknown</option>
|
|
14
|
+
</select>
|
|
15
|
+
<select name="status">
|
|
16
|
+
<option value="">any status</option>
|
|
17
|
+
<option>starting</option><option>working</option>
|
|
18
|
+
<option>idle</option><option>analyzing</option><option>closed</option>
|
|
19
|
+
</select>
|
|
20
|
+
<select name="adopt">
|
|
21
|
+
<option value="">adopt: any</option>
|
|
22
|
+
<option value="yes">adopt: yes</option>
|
|
23
|
+
<option value="no">adopt: no</option>
|
|
24
|
+
</select>
|
|
25
|
+
<label><input type="checkbox" name="active" checked> active only</label>
|
|
26
|
+
</form>
|
|
27
|
+
<div id="bulk-bar" class="bulk-bar" hidden>
|
|
28
|
+
<span id="bulk-count"></span>
|
|
29
|
+
<button type="button" id="bulk-close" class="contrast">关闭选中</button>
|
|
30
|
+
<button type="button" id="bulk-clear">取消</button>
|
|
31
|
+
</div>
|
|
32
|
+
<table id="sessions-table">
|
|
33
|
+
<thead><tr>
|
|
34
|
+
<th><input type="checkbox" id="select-all" title="全选当前过滤结果"></th>
|
|
35
|
+
<th data-sort="botName">bot</th><th data-sort="cliId">cli</th><th data-sort="status">status</th><th data-sort="title">title</th><th data-sort="workingDir">workingDir</th>
|
|
36
|
+
<th data-sort="spawnedAt">created</th><th data-sort="lastMessageAt">last</th><th data-sort="adopt">adopt</th><th></th>
|
|
37
|
+
</tr></thead>
|
|
38
|
+
<tbody></tbody>
|
|
39
|
+
</table>
|
|
40
|
+
<dialog id="drawer"></dialog>
|
|
41
|
+
`;
|
|
42
|
+
function relTime(ms) {
|
|
43
|
+
if (!ms)
|
|
44
|
+
return '-';
|
|
45
|
+
const diff = Date.now() - ms;
|
|
46
|
+
if (diff < 60_000)
|
|
47
|
+
return 'now';
|
|
48
|
+
if (diff < 3_600_000)
|
|
49
|
+
return Math.floor(diff / 60_000) + 'm';
|
|
50
|
+
if (diff < 86_400_000)
|
|
51
|
+
return Math.floor(diff / 3_600_000) + 'h';
|
|
52
|
+
return Math.floor(diff / 86_400_000) + 'd';
|
|
53
|
+
}
|
|
54
|
+
function escapeHtml(s) {
|
|
55
|
+
return s.replace(/[&<>"']/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]));
|
|
56
|
+
}
|
|
57
|
+
const ICON_MIRROR = '\u{1FA9E}';
|
|
58
|
+
const ICON_PIN = '\u{1F4CD}';
|
|
59
|
+
const ICON_SCREEN = '\u{1F5A5}️';
|
|
60
|
+
export function renderSessionsPage(root) {
|
|
61
|
+
root.innerHTML = PAGE_HTML;
|
|
62
|
+
const tbody = root.querySelector('#sessions-table tbody');
|
|
63
|
+
const filtersForm = root.querySelector('#filters');
|
|
64
|
+
const drawer = root.querySelector('#drawer');
|
|
65
|
+
const selectAllBox = root.querySelector('#select-all');
|
|
66
|
+
const bulkBar = root.querySelector('#bulk-bar');
|
|
67
|
+
const bulkCountSpan = root.querySelector('#bulk-count');
|
|
68
|
+
const bulkCloseBtn = root.querySelector('#bulk-close');
|
|
69
|
+
const bulkClearBtn = root.querySelector('#bulk-clear');
|
|
70
|
+
const table = root.querySelector('#sessions-table');
|
|
71
|
+
// Selection set persists across rerenders (filter changes, SSE updates).
|
|
72
|
+
// Closed/missing sessions get pruned lazily during rerender so the count
|
|
73
|
+
// never overstates active selections.
|
|
74
|
+
const selected = new Set();
|
|
75
|
+
let sortKey = 'lastMessageAt';
|
|
76
|
+
let sortDir = 'desc';
|
|
77
|
+
function rowHtml(s) {
|
|
78
|
+
const closed = s.status === 'closed';
|
|
79
|
+
const checked = selected.has(s.sessionId) ? 'checked' : '';
|
|
80
|
+
return `<tr data-id="${escapeHtml(s.sessionId)}">
|
|
81
|
+
<td><input type="checkbox" class="row-select" ${checked} ${closed ? 'disabled' : ''}></td>
|
|
82
|
+
<td>${escapeHtml(s.botName ?? '')}</td>
|
|
83
|
+
<td><span class="badge cli-${escapeHtml(s.cliId ?? 'unknown')}">${escapeHtml(s.cliId ?? 'unknown')}</span></td>
|
|
84
|
+
<td><span class="status status-${escapeHtml(s.status)}">${escapeHtml(s.status)}</span></td>
|
|
85
|
+
<td>${escapeHtml((s.title ?? '').slice(0, 40))}</td>
|
|
86
|
+
<td title="${escapeHtml(s.workingDir ?? '')}">${escapeHtml((s.workingDir ?? '').slice(-30))}</td>
|
|
87
|
+
<td>${relTime(s.spawnedAt)}</td>
|
|
88
|
+
<td>${relTime(s.lastMessageAt)}</td>
|
|
89
|
+
<td>${s.adopt ? ICON_MIRROR : ''}</td>
|
|
90
|
+
<td><button class="open">⋯</button></td>
|
|
91
|
+
</tr>`;
|
|
92
|
+
}
|
|
93
|
+
function filtered() {
|
|
94
|
+
const f = new FormData(filtersForm);
|
|
95
|
+
const q = (f.get('q') ?? '').toLowerCase();
|
|
96
|
+
const cli = f.getAll('cli');
|
|
97
|
+
const status = f.get('status');
|
|
98
|
+
const adopt = f.get('adopt');
|
|
99
|
+
const active = !!f.get('active');
|
|
100
|
+
const rows = [...store.sessions.values()]
|
|
101
|
+
.filter(s => !cli.length || cli.includes(s.cliId ?? 'unknown'))
|
|
102
|
+
.filter(s => !status || s.status === status)
|
|
103
|
+
.filter(s => !adopt || (adopt === 'yes') === !!s.adopt)
|
|
104
|
+
.filter(s => !active || s.status !== 'closed')
|
|
105
|
+
.filter(s => !q || JSON.stringify(s).toLowerCase().includes(q));
|
|
106
|
+
rows.sort(compareRows);
|
|
107
|
+
return rows;
|
|
108
|
+
}
|
|
109
|
+
function sortValue(s, key) {
|
|
110
|
+
if (key === 'spawnedAt' || key === 'lastMessageAt')
|
|
111
|
+
return Number(s[key] ?? 0);
|
|
112
|
+
if (key === 'adopt')
|
|
113
|
+
return !!s.adopt;
|
|
114
|
+
return String(s[key] ?? '').toLowerCase();
|
|
115
|
+
}
|
|
116
|
+
function compareRows(a, b) {
|
|
117
|
+
const av = sortValue(a, sortKey);
|
|
118
|
+
const bv = sortValue(b, sortKey);
|
|
119
|
+
let cmp = 0;
|
|
120
|
+
if (typeof av === 'number' && typeof bv === 'number')
|
|
121
|
+
cmp = av - bv;
|
|
122
|
+
else if (typeof av === 'boolean' && typeof bv === 'boolean')
|
|
123
|
+
cmp = Number(av) - Number(bv);
|
|
124
|
+
else
|
|
125
|
+
cmp = String(av).localeCompare(String(bv));
|
|
126
|
+
if (cmp === 0)
|
|
127
|
+
cmp = (Number(a.lastMessageAt ?? 0) - Number(b.lastMessageAt ?? 0));
|
|
128
|
+
return sortDir === 'asc' ? cmp : -cmp;
|
|
129
|
+
}
|
|
130
|
+
function paintSortHeaders() {
|
|
131
|
+
table.querySelectorAll('th[data-sort]').forEach(th => {
|
|
132
|
+
const active = th.dataset.sort === sortKey;
|
|
133
|
+
th.classList.toggle('sorted', active);
|
|
134
|
+
th.setAttribute('aria-sort', active ? (sortDir === 'asc' ? 'ascending' : 'descending') : 'none');
|
|
135
|
+
const label = th.textContent?.replace(/ [▲▼]$/, '').trim() ?? '';
|
|
136
|
+
th.textContent = active ? `${label} ${sortDir === 'asc' ? '▲' : '▼'}` : label;
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
function rerender() {
|
|
140
|
+
const rows = filtered();
|
|
141
|
+
// Prune selections whose sessions are no longer present OR are now closed
|
|
142
|
+
// (closed rows are uncheckable; keeping them in `selected` would yield a
|
|
143
|
+
// misleading bulk-bar count that the user can't act on).
|
|
144
|
+
for (const sid of [...selected]) {
|
|
145
|
+
const s = store.sessions.get(sid);
|
|
146
|
+
if (!s || s.status === 'closed')
|
|
147
|
+
selected.delete(sid);
|
|
148
|
+
}
|
|
149
|
+
tbody.innerHTML = rows.map(rowHtml).join('');
|
|
150
|
+
paintSortHeaders();
|
|
151
|
+
syncBulkUi(rows);
|
|
152
|
+
}
|
|
153
|
+
function syncBulkUi(rows) {
|
|
154
|
+
const count = selected.size;
|
|
155
|
+
bulkBar.hidden = count === 0;
|
|
156
|
+
bulkCountSpan.textContent = `已选 ${count} 个会话`;
|
|
157
|
+
// header checkbox tri-state: checked when ALL selectable rows in the
|
|
158
|
+
// current filter are selected; indeterminate when partial; unchecked when
|
|
159
|
+
// none. "Selectable" excludes closed rows.
|
|
160
|
+
const selectable = rows.filter(r => r.status !== 'closed');
|
|
161
|
+
if (selectable.length === 0) {
|
|
162
|
+
selectAllBox.checked = false;
|
|
163
|
+
selectAllBox.indeterminate = false;
|
|
164
|
+
selectAllBox.disabled = true;
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
selectAllBox.disabled = false;
|
|
168
|
+
const selectedInView = selectable.filter(r => selected.has(r.sessionId)).length;
|
|
169
|
+
selectAllBox.checked = selectedInView === selectable.length;
|
|
170
|
+
selectAllBox.indeterminate = selectedInView > 0 && selectedInView < selectable.length;
|
|
171
|
+
}
|
|
172
|
+
function openDrawer(s) {
|
|
173
|
+
const closed = s.status === 'closed';
|
|
174
|
+
drawer.innerHTML = `
|
|
175
|
+
<article>
|
|
176
|
+
<header>
|
|
177
|
+
<h3>${escapeHtml(s.title ?? s.sessionId)}</h3>
|
|
178
|
+
<code>${escapeHtml(s.sessionId)}</code> <button data-copy="${escapeHtml(s.sessionId)}">copy</button>
|
|
179
|
+
</header>
|
|
180
|
+
<p><b>bot:</b> ${escapeHtml(s.botName ?? '-')} · <b>cli:</b> ${escapeHtml(s.cliId ?? '?')} · <b>status:</b> ${escapeHtml(s.status)}</p>
|
|
181
|
+
<p><b>chatId:</b> <code>${escapeHtml(s.chatId)}</code> <button data-copy="${escapeHtml(s.chatId)}">copy</button></p>
|
|
182
|
+
<p><b>rootMessageId:</b> <code>${escapeHtml(s.rootMessageId ?? '')}</code> <button data-copy="${escapeHtml(s.rootMessageId ?? '')}">copy</button></p>
|
|
183
|
+
${s.threadId ? `<p><b>threadId:</b> <code>${escapeHtml(s.threadId)}</code></p>` : ''}
|
|
184
|
+
<p><b>workingDir:</b> ${escapeHtml(s.workingDir ?? '-')}</p>
|
|
185
|
+
<div class="actions">
|
|
186
|
+
<button id="locate-btn" type="button">${ICON_PIN} 定位到飞书话题</button>
|
|
187
|
+
${s.webPort ? `<a class="btn-link" href="http://${escapeHtml(location.hostname)}:${s.webPort}" target="_blank">${ICON_SCREEN} 打开 xterm</a>` : ''}
|
|
188
|
+
${!closed ? `<button id="close-btn" type="button" class="contrast">关闭会话</button>` : ''}
|
|
189
|
+
</div>
|
|
190
|
+
<form method="dialog"><button>关闭</button></form>
|
|
191
|
+
</article>`;
|
|
192
|
+
drawer.querySelectorAll('[data-copy]').forEach(b => {
|
|
193
|
+
b.onclick = () => {
|
|
194
|
+
navigator.clipboard.writeText(b.dataset.copy ?? '');
|
|
195
|
+
b.textContent = 'copied';
|
|
196
|
+
setTimeout(() => { b.textContent = 'copy'; }, 800);
|
|
197
|
+
};
|
|
198
|
+
});
|
|
199
|
+
const locateBtn = drawer.querySelector('#locate-btn');
|
|
200
|
+
if (locateBtn) {
|
|
201
|
+
locateBtn.onclick = async () => {
|
|
202
|
+
locateBtn.disabled = true;
|
|
203
|
+
locateBtn.textContent = `${ICON_PIN} 发送中...`;
|
|
204
|
+
try {
|
|
205
|
+
const r = await fetch(`/api/sessions/${encodeURIComponent(s.sessionId)}/locate`, { method: 'POST' });
|
|
206
|
+
const body = await r.json();
|
|
207
|
+
if (body.ok) {
|
|
208
|
+
// Daemon posted the @mention into the original thread. The
|
|
209
|
+
// notification is what the user navigates from — no AppLink
|
|
210
|
+
// redirect (the previous "open chat in new tab" behavior was
|
|
211
|
+
// explicitly removed by the user as intrusive).
|
|
212
|
+
let left = 30;
|
|
213
|
+
locateBtn.textContent = `${ICON_PIN} (冷却 ${left}s)`;
|
|
214
|
+
const tick = setInterval(() => {
|
|
215
|
+
left -= 1;
|
|
216
|
+
if (left <= 0) {
|
|
217
|
+
clearInterval(tick);
|
|
218
|
+
locateBtn.disabled = false;
|
|
219
|
+
locateBtn.textContent = `${ICON_PIN} 定位到飞书话题`;
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
locateBtn.textContent = `${ICON_PIN} (冷却 ${left}s)`;
|
|
223
|
+
}
|
|
224
|
+
}, 1000);
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
const reason = body.error ?? r.status;
|
|
228
|
+
alert('Locate failed: ' + reason);
|
|
229
|
+
locateBtn.disabled = false;
|
|
230
|
+
locateBtn.textContent = `${ICON_PIN} 定位到飞书话题`;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
catch (e) {
|
|
234
|
+
alert('Locate error: ' + e);
|
|
235
|
+
locateBtn.disabled = false;
|
|
236
|
+
locateBtn.textContent = `${ICON_PIN} 定位到飞书话题`;
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
const closeBtn = drawer.querySelector('#close-btn');
|
|
241
|
+
if (closeBtn) {
|
|
242
|
+
closeBtn.onclick = async () => {
|
|
243
|
+
if (!confirm('关闭这个会话?'))
|
|
244
|
+
return;
|
|
245
|
+
closeBtn.disabled = true;
|
|
246
|
+
try {
|
|
247
|
+
await fetch(`/api/sessions/${encodeURIComponent(s.sessionId)}/close`, { method: 'POST' });
|
|
248
|
+
}
|
|
249
|
+
finally {
|
|
250
|
+
drawer.close();
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
drawer.showModal();
|
|
255
|
+
}
|
|
256
|
+
tbody.addEventListener('click', e => {
|
|
257
|
+
const target = e.target;
|
|
258
|
+
// Checkbox clicks toggle selection; don't open the drawer.
|
|
259
|
+
if (target.classList.contains('row-select')) {
|
|
260
|
+
const tr = target.closest('tr[data-id]');
|
|
261
|
+
if (!tr)
|
|
262
|
+
return;
|
|
263
|
+
const sid = tr.dataset.id;
|
|
264
|
+
const cb = target;
|
|
265
|
+
if (cb.checked)
|
|
266
|
+
selected.add(sid);
|
|
267
|
+
else
|
|
268
|
+
selected.delete(sid);
|
|
269
|
+
syncBulkUi(filtered());
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
// Clicks on the checkbox cell (around the input, not the input itself)
|
|
273
|
+
// shouldn't open the drawer either — that's a fat-finger nuisance.
|
|
274
|
+
const td = target.closest('td');
|
|
275
|
+
if (td && td.querySelector('.row-select'))
|
|
276
|
+
return;
|
|
277
|
+
const tr = target.closest('tr[data-id]');
|
|
278
|
+
if (!tr)
|
|
279
|
+
return;
|
|
280
|
+
const sid = tr.dataset.id;
|
|
281
|
+
const s = store.sessions.get(sid);
|
|
282
|
+
if (s)
|
|
283
|
+
openDrawer(s);
|
|
284
|
+
});
|
|
285
|
+
selectAllBox.addEventListener('change', () => {
|
|
286
|
+
const rows = filtered().filter(r => r.status !== 'closed');
|
|
287
|
+
if (selectAllBox.checked) {
|
|
288
|
+
for (const r of rows)
|
|
289
|
+
selected.add(r.sessionId);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
for (const r of rows)
|
|
293
|
+
selected.delete(r.sessionId);
|
|
294
|
+
}
|
|
295
|
+
rerender();
|
|
296
|
+
});
|
|
297
|
+
bulkClearBtn.addEventListener('click', () => {
|
|
298
|
+
selected.clear();
|
|
299
|
+
rerender();
|
|
300
|
+
});
|
|
301
|
+
bulkCloseBtn.addEventListener('click', async () => {
|
|
302
|
+
const ids = [...selected];
|
|
303
|
+
if (ids.length === 0)
|
|
304
|
+
return;
|
|
305
|
+
if (!confirm(`关闭选中的 ${ids.length} 个会话?`))
|
|
306
|
+
return;
|
|
307
|
+
bulkCloseBtn.disabled = true;
|
|
308
|
+
bulkClearBtn.disabled = true;
|
|
309
|
+
const orig = bulkCloseBtn.textContent;
|
|
310
|
+
let done = 0;
|
|
311
|
+
let failed = 0;
|
|
312
|
+
const failures = [];
|
|
313
|
+
bulkCloseBtn.textContent = `关闭中 0/${ids.length}...`;
|
|
314
|
+
// Concurrency cap: 6 in flight at once. Daemon close is cheap but we don't
|
|
315
|
+
// want to overwhelm the dashboard or hit per-bot Lark rate limits.
|
|
316
|
+
const queue = [...ids];
|
|
317
|
+
async function worker() {
|
|
318
|
+
while (queue.length) {
|
|
319
|
+
const sid = queue.shift();
|
|
320
|
+
try {
|
|
321
|
+
const r = await fetch(`/api/sessions/${encodeURIComponent(sid)}/close`, { method: 'POST' });
|
|
322
|
+
// closeSession always returns { ok: true } today, but treat
|
|
323
|
+
// non-ok-body as failure too so future server changes that surface
|
|
324
|
+
// partial errors via 200 + { ok: false } are accounted for.
|
|
325
|
+
let body = null;
|
|
326
|
+
try {
|
|
327
|
+
body = await r.json();
|
|
328
|
+
}
|
|
329
|
+
catch { /* tolerate non-JSON */ }
|
|
330
|
+
if (!r.ok || body?.ok === false) {
|
|
331
|
+
failed += 1;
|
|
332
|
+
const reason = body?.error ?? `HTTP ${r.status}`;
|
|
333
|
+
failures.push(`${sid.slice(0, 12)}…: ${reason}`);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
catch (e) {
|
|
337
|
+
failed += 1;
|
|
338
|
+
failures.push(`${sid.slice(0, 12)}…: ${e?.message ?? e}`);
|
|
339
|
+
}
|
|
340
|
+
finally {
|
|
341
|
+
done += 1;
|
|
342
|
+
bulkCloseBtn.textContent = `关闭中 ${done}/${ids.length}...`;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
await Promise.all(Array.from({ length: Math.min(6, ids.length) }, () => worker()));
|
|
347
|
+
bulkCloseBtn.textContent = orig;
|
|
348
|
+
bulkCloseBtn.disabled = false;
|
|
349
|
+
bulkClearBtn.disabled = false;
|
|
350
|
+
selected.clear();
|
|
351
|
+
rerender();
|
|
352
|
+
if (failed > 0) {
|
|
353
|
+
const head = failures.slice(0, 3).join('\n');
|
|
354
|
+
const more = failures.length > 3 ? `\n... +${failures.length - 3} 个` : '';
|
|
355
|
+
alert(`关闭完成:成功 ${ids.length - failed} / 失败 ${failed}\n${head}${more}`);
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
table.querySelectorAll('th[data-sort]').forEach(th => {
|
|
359
|
+
th.addEventListener('click', () => {
|
|
360
|
+
const key = th.dataset.sort;
|
|
361
|
+
if (sortKey === key)
|
|
362
|
+
sortDir = sortDir === 'asc' ? 'desc' : 'asc';
|
|
363
|
+
else {
|
|
364
|
+
sortKey = key;
|
|
365
|
+
sortDir = key === 'spawnedAt' || key === 'lastMessageAt' ? 'desc' : 'asc';
|
|
366
|
+
}
|
|
367
|
+
rerender();
|
|
368
|
+
});
|
|
369
|
+
});
|
|
370
|
+
filtersForm.addEventListener('input', rerender);
|
|
371
|
+
store.on(rerender);
|
|
372
|
+
rerender();
|
|
373
|
+
}
|
|
374
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/dashboard/web/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
type Session = Record<string, any> & {
|
|
2
|
+
sessionId: string;
|
|
3
|
+
status: string;
|
|
4
|
+
};
|
|
5
|
+
type Schedule = Record<string, any> & {
|
|
6
|
+
id: string;
|
|
7
|
+
};
|
|
8
|
+
declare class Store {
|
|
9
|
+
sessions: Map<string, Session>;
|
|
10
|
+
schedules: Map<string, Schedule>;
|
|
11
|
+
online: boolean;
|
|
12
|
+
private listeners;
|
|
13
|
+
upsertSessions(rows: Session[]): void;
|
|
14
|
+
upsertSchedules(rows: Schedule[]): void;
|
|
15
|
+
applySse(type: string, body: any): void;
|
|
16
|
+
setOnline(v: boolean): void;
|
|
17
|
+
on(fn: () => void): () => boolean;
|
|
18
|
+
private emit;
|
|
19
|
+
}
|
|
20
|
+
export declare const store: Store;
|
|
21
|
+
export declare function bootstrap(): Promise<void>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/dashboard/web/store.ts"],"names":[],"mappings":"AACA,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAC3E,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,cAAM,KAAK;IACT,QAAQ,uBAA8B;IACtC,SAAS,wBAA+B;IACxC,MAAM,UAAQ;IACd,OAAO,CAAC,SAAS,CAAyB;IAE1C,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE;IAI9B,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE;IAIhC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;IAqBhC,SAAS,CAAC,CAAC,EAAE,OAAO;IAGpB,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI;IACjB,OAAO,CAAC,IAAI;CACb;AAED,eAAO,MAAM,KAAK,OAAc,CAAC;AAEjC,wBAAsB,SAAS,kBAwB9B"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
class Store {
|
|
2
|
+
sessions = new Map();
|
|
3
|
+
schedules = new Map();
|
|
4
|
+
online = true;
|
|
5
|
+
listeners = new Set();
|
|
6
|
+
upsertSessions(rows) {
|
|
7
|
+
for (const r of rows)
|
|
8
|
+
this.sessions.set(r.sessionId, r);
|
|
9
|
+
this.emit();
|
|
10
|
+
}
|
|
11
|
+
upsertSchedules(rows) {
|
|
12
|
+
for (const r of rows)
|
|
13
|
+
this.schedules.set(r.id, r);
|
|
14
|
+
this.emit();
|
|
15
|
+
}
|
|
16
|
+
applySse(type, body) {
|
|
17
|
+
if (type === 'session.spawned') {
|
|
18
|
+
this.sessions.set(body.session.sessionId, body.session);
|
|
19
|
+
}
|
|
20
|
+
else if (type === 'session.update') {
|
|
21
|
+
const cur = this.sessions.get(body.sessionId);
|
|
22
|
+
if (cur)
|
|
23
|
+
this.sessions.set(body.sessionId, { ...cur, ...body.patch });
|
|
24
|
+
}
|
|
25
|
+
else if (type === 'session.exited') {
|
|
26
|
+
const cur = this.sessions.get(body.sessionId);
|
|
27
|
+
if (cur)
|
|
28
|
+
this.sessions.set(body.sessionId, { ...cur, status: 'closed' });
|
|
29
|
+
}
|
|
30
|
+
else if (type === 'schedule.created') {
|
|
31
|
+
this.schedules.set(body.schedule.id, body.schedule);
|
|
32
|
+
}
|
|
33
|
+
else if (type === 'schedule.updated') {
|
|
34
|
+
const cur = this.schedules.get(body.id);
|
|
35
|
+
if (cur)
|
|
36
|
+
this.schedules.set(body.id, { ...cur, ...body.patch });
|
|
37
|
+
}
|
|
38
|
+
else if (type === 'schedule.deleted') {
|
|
39
|
+
this.schedules.delete(body.id);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
return; // heartbeat / schedule.fired — no cache mutation
|
|
43
|
+
}
|
|
44
|
+
this.emit();
|
|
45
|
+
}
|
|
46
|
+
setOnline(v) {
|
|
47
|
+
if (this.online !== v) {
|
|
48
|
+
this.online = v;
|
|
49
|
+
this.emit();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
on(fn) { this.listeners.add(fn); return () => this.listeners.delete(fn); }
|
|
53
|
+
emit() { for (const fn of this.listeners)
|
|
54
|
+
fn(); }
|
|
55
|
+
}
|
|
56
|
+
export const store = new Store();
|
|
57
|
+
export async function bootstrap() {
|
|
58
|
+
const [s, sch] = await Promise.all([
|
|
59
|
+
fetch('/api/sessions').then(r => r.json()),
|
|
60
|
+
fetch('/api/schedules').then(r => r.json()),
|
|
61
|
+
]);
|
|
62
|
+
store.upsertSessions(s.sessions ?? []);
|
|
63
|
+
store.upsertSchedules(sch.schedules ?? []);
|
|
64
|
+
const es = new EventSource('/events');
|
|
65
|
+
const types = [
|
|
66
|
+
'session.spawned', 'session.update', 'session.exited',
|
|
67
|
+
'schedule.created', 'schedule.updated', 'schedule.deleted',
|
|
68
|
+
'schedule.fired', 'heartbeat',
|
|
69
|
+
];
|
|
70
|
+
for (const t of types) {
|
|
71
|
+
es.addEventListener(t, e => {
|
|
72
|
+
try {
|
|
73
|
+
const data = JSON.parse(e.data);
|
|
74
|
+
store.applySse(t, data.body ?? data);
|
|
75
|
+
}
|
|
76
|
+
catch { /* skip malformed */ }
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
es.onerror = () => store.setOnline(false);
|
|
80
|
+
es.onopen = () => store.setOnline(true);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/dashboard/web/store.ts"],"names":[],"mappings":"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"}
|