botmux 2.34.0 → 2.35.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 (71) hide show
  1. package/README.en.md +5 -3
  2. package/README.md +5 -3
  3. package/dist/bot-registry.d.ts +1 -0
  4. package/dist/bot-registry.d.ts.map +1 -1
  5. package/dist/bot-registry.js +7 -0
  6. package/dist/bot-registry.js.map +1 -1
  7. package/dist/cli.js +50 -6
  8. package/dist/cli.js.map +1 -1
  9. package/dist/core/command-handler.d.ts.map +1 -1
  10. package/dist/core/command-handler.js +61 -4
  11. package/dist/core/command-handler.js.map +1 -1
  12. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  13. package/dist/core/dashboard-ipc-server.js +45 -1
  14. package/dist/core/dashboard-ipc-server.js.map +1 -1
  15. package/dist/core/role-resolver.d.ts +28 -0
  16. package/dist/core/role-resolver.d.ts.map +1 -0
  17. package/dist/core/role-resolver.js +120 -0
  18. package/dist/core/role-resolver.js.map +1 -0
  19. package/dist/core/session-manager.d.ts +6 -1
  20. package/dist/core/session-manager.d.ts.map +1 -1
  21. package/dist/core/session-manager.js +21 -2
  22. package/dist/core/session-manager.js.map +1 -1
  23. package/dist/daemon.d.ts.map +1 -1
  24. package/dist/daemon.js +8 -4
  25. package/dist/daemon.js.map +1 -1
  26. package/dist/dashboard/web/app.js +3 -0
  27. package/dist/dashboard/web/app.js.map +1 -1
  28. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  29. package/dist/dashboard/web/i18n.js +38 -0
  30. package/dist/dashboard/web/i18n.js.map +1 -1
  31. package/dist/dashboard/web/roles.d.ts +2 -0
  32. package/dist/dashboard/web/roles.d.ts.map +1 -0
  33. package/dist/dashboard/web/roles.js +352 -0
  34. package/dist/dashboard/web/roles.js.map +1 -0
  35. package/dist/dashboard-web/app.js +393 -324
  36. package/dist/dashboard-web/index.html +1 -0
  37. package/dist/dashboard-web/style.css +269 -0
  38. package/dist/dashboard.js +38 -2
  39. package/dist/dashboard.js.map +1 -1
  40. package/dist/i18n/en.d.ts.map +1 -1
  41. package/dist/i18n/en.js +24 -9
  42. package/dist/i18n/en.js.map +1 -1
  43. package/dist/i18n/zh.d.ts.map +1 -1
  44. package/dist/i18n/zh.js +24 -9
  45. package/dist/i18n/zh.js.map +1 -1
  46. package/dist/im/lark/card-builder.d.ts.map +1 -1
  47. package/dist/im/lark/card-builder.js +0 -1
  48. package/dist/im/lark/card-builder.js.map +1 -1
  49. package/dist/im/lark/card-handler.js +15 -17
  50. package/dist/im/lark/card-handler.js.map +1 -1
  51. package/dist/im/lark/client.d.ts.map +1 -1
  52. package/dist/im/lark/client.js.map +1 -1
  53. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  54. package/dist/im/lark/event-dispatcher.js +15 -5
  55. package/dist/im/lark/event-dispatcher.js.map +1 -1
  56. package/dist/im/lark/grant-command.d.ts.map +1 -1
  57. package/dist/im/lark/grant-command.js +24 -3
  58. package/dist/im/lark/grant-command.js.map +1 -1
  59. package/dist/services/allowed-chat-groups.d.ts +11 -0
  60. package/dist/services/allowed-chat-groups.d.ts.map +1 -0
  61. package/dist/services/allowed-chat-groups.js +20 -0
  62. package/dist/services/allowed-chat-groups.js.map +1 -0
  63. package/dist/services/grant-store.d.ts +11 -2
  64. package/dist/services/grant-store.d.ts.map +1 -1
  65. package/dist/services/grant-store.js +50 -18
  66. package/dist/services/grant-store.js.map +1 -1
  67. package/dist/setup/bot-config-editor.d.ts +22 -0
  68. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  69. package/dist/setup/bot-config-editor.js +47 -1
  70. package/dist/setup/bot-config-editor.js.map +1 -1
  71. package/package.json +1 -1
@@ -0,0 +1,352 @@
1
+ // Roles page: hierarchical group → bot role editor.
2
+ // Displays groups as collapsible sections with bots nested inside.
3
+ // Each bot has its own per-group role definition selectable for editing.
4
+ import { escapeHtml, t } from './ui.js';
5
+ const MAX_ROLE_BYTES = 4096;
6
+ let cache = [];
7
+ let selectedGroupId = null;
8
+ let selectedBotId = null;
9
+ let editingContent = '';
10
+ let expandedGroups = new Set();
11
+ function pageHtml() {
12
+ return `<section class="page roles-page">
13
+ <div class="page-heading">
14
+ <div>
15
+ <p class="eyebrow">${t('nav.roles')}</p>
16
+ <h1>${t('roles.title')}</h1>
17
+ <p>${t('roles.subtitle')}</p>
18
+ </div>
19
+ </div>
20
+ <div class="roles-layout">
21
+ <div class="roles-tree-panel">
22
+ <div class="roles-tree-header">
23
+ <input type="search" id="roles-search" placeholder="${t('roles.search')}" />
24
+ <button type="button" id="roles-refresh">${t('roles.refresh')}</button>
25
+ </div>
26
+ <div id="roles-tree" class="roles-tree"></div>
27
+ </div>
28
+ <div class="roles-editor-panel">
29
+ <div id="roles-editor-empty" class="roles-editor-empty">${t('roles.selectHint')}</div>
30
+ <div id="roles-editor-form" class="roles-editor-form" style="display:none">
31
+ <div class="roles-editor-breadcrumb">
32
+ <span id="roles-editor-group-name"></span>
33
+ <span class="roles-breadcrumb-sep">›</span>
34
+ <span id="roles-editor-bot-name"></span>
35
+ </div>
36
+ <div class="roles-editor-meta">
37
+ <span id="roles-editor-chat-id" class="roles-editor-meta-line"></span>
38
+ </div>
39
+ <textarea id="roles-editor-textarea" placeholder="${t('roles.editorPlaceholder')}" rows="14"></textarea>
40
+ <div class="roles-editor-footer">
41
+ <span id="roles-editor-bytecount" class="roles-bytecount"></span>
42
+ <div class="roles-editor-actions">
43
+ <button type="button" id="roles-delete" class="danger">${t('roles.delete')}</button>
44
+ <button type="button" id="roles-save" class="primary">${t('roles.save')}</button>
45
+ </div>
46
+ </div>
47
+ <div id="roles-preview" class="roles-preview"></div>
48
+ </div>
49
+ </div>
50
+ </div>
51
+ </section>`;
52
+ }
53
+ async function loadGroups() {
54
+ const r = await fetch('/api/groups');
55
+ const data = await r.json();
56
+ cache = (data.chats ?? []).map((c) => ({
57
+ chatId: c.chatId,
58
+ name: c.name ?? c.chatId,
59
+ memberBots: (c.memberBots ?? []).map((m) => ({
60
+ larkAppId: m.larkAppId,
61
+ botName: m.botName ?? m.larkAppId,
62
+ inChat: m.inChat ?? false,
63
+ hasRole: m.hasRole ?? false,
64
+ oncallChat: m.oncallChat ?? null,
65
+ })),
66
+ }));
67
+ }
68
+ async function loadRole(larkAppId, chatId) {
69
+ const r = await fetch(`/api/roles/${encodeURIComponent(larkAppId)}/${encodeURIComponent(chatId)}`);
70
+ return r.json();
71
+ }
72
+ async function saveRole(larkAppId, chatId, content) {
73
+ const r = await fetch(`/api/roles/${encodeURIComponent(larkAppId)}/${encodeURIComponent(chatId)}`, {
74
+ method: 'PUT',
75
+ headers: { 'content-type': 'application/json' },
76
+ body: JSON.stringify({ content }),
77
+ });
78
+ return r.ok;
79
+ }
80
+ async function deleteRole(larkAppId, chatId) {
81
+ const r = await fetch(`/api/roles/${encodeURIComponent(larkAppId)}/${encodeURIComponent(chatId)}`, { method: 'DELETE' });
82
+ return r.ok;
83
+ }
84
+ function botRoleCount(group) {
85
+ return group.memberBots.filter(b => b.inChat && b.hasRole).length;
86
+ }
87
+ function botInChatCount(group) {
88
+ return group.memberBots.filter(b => b.inChat).length;
89
+ }
90
+ function renderTree(filter = '') {
91
+ const tree = document.getElementById('roles-tree');
92
+ if (!tree)
93
+ return;
94
+ const q = filter.toLowerCase();
95
+ const filtered = cache.filter(g => {
96
+ if (!q)
97
+ return true;
98
+ const matchGroup = g.chatId.toLowerCase().includes(q) || (g.name ?? '').toLowerCase().includes(q);
99
+ const matchBot = g.memberBots.some(b => b.larkAppId.toLowerCase().includes(q) || (b.botName ?? '').toLowerCase().includes(q));
100
+ return matchGroup || matchBot;
101
+ });
102
+ if (filtered.length === 0) {
103
+ tree.innerHTML = `<div class="roles-empty">${t('roles.noChats')}</div>`;
104
+ return;
105
+ }
106
+ tree.innerHTML = filtered.map(g => {
107
+ const expanded = expandedGroups.has(g.chatId);
108
+ const inChatBots = g.memberBots.filter(b => b.inChat);
109
+ const arrow = expanded ? '▾' : '▸';
110
+ const roleCount = botRoleCount(g);
111
+ const totalInChat = botInChatCount(g);
112
+ const botRows = expanded
113
+ ? inChatBots.map(b => {
114
+ const isSelected = selectedGroupId === g.chatId && selectedBotId === b.larkAppId;
115
+ return `
116
+ <div class="roles-bot-row ${isSelected ? 'selected' : ''}"
117
+ data-group-id="${escapeHtml(g.chatId)}"
118
+ data-bot-id="${escapeHtml(b.larkAppId)}">
119
+ <span class="roles-bot-indent"></span>
120
+ <span class="roles-bot-icon">🤖</span>
121
+ <div class="roles-bot-info">
122
+ <div class="roles-bot-name">${escapeHtml(b.botName)}</div>
123
+ <div class="roles-bot-id">${escapeHtml(b.larkAppId)}</div>
124
+ </div>
125
+ <span class="roles-badge ${b.hasRole ? 'has-role' : 'no-role'}">
126
+ ${b.hasRole ? t('roles.configured') : t('roles.unconfigured')}
127
+ </span>
128
+ </div>`;
129
+ }).join('')
130
+ : '';
131
+ return `
132
+ <div class="roles-group-section">
133
+ <div class="roles-group-row ${expanded ? 'expanded' : ''} ${selectedGroupId === g.chatId && !selectedBotId ? 'selected' : ''}"
134
+ data-group-id="${escapeHtml(g.chatId)}">
135
+ <span class="roles-group-arrow">${arrow}</span>
136
+ <span class="roles-group-icon">📁</span>
137
+ <div class="roles-group-info">
138
+ <div class="roles-group-name">${escapeHtml(g.name ?? g.chatId)}</div>
139
+ <div class="roles-group-meta">
140
+ ${roleCount}/${totalInChat} ${t('roles.botsWithRoles')}
141
+ </div>
142
+ </div>
143
+ <span class="roles-group-chevron"></span>
144
+ </div>
145
+ <div class="roles-bot-list">${botRows}</div>
146
+ </div>`;
147
+ }).join('');
148
+ // Group row click → toggle expand
149
+ tree.querySelectorAll('.roles-group-row').forEach(row => {
150
+ row.addEventListener('click', () => {
151
+ const gid = row.dataset.groupId;
152
+ if (!gid)
153
+ return;
154
+ if (expandedGroups.has(gid)) {
155
+ expandedGroups.delete(gid);
156
+ }
157
+ else {
158
+ expandedGroups.add(gid);
159
+ }
160
+ renderTree(document.getElementById('roles-search')?.value ?? '');
161
+ });
162
+ });
163
+ // Bot row click → select for editing
164
+ tree.querySelectorAll('.roles-bot-row').forEach(row => {
165
+ row.addEventListener('click', (e) => {
166
+ e.stopPropagation();
167
+ const gid = row.dataset.groupId;
168
+ const bid = row.dataset.botId;
169
+ if (gid && bid)
170
+ selectBot(gid, bid);
171
+ });
172
+ });
173
+ }
174
+ async function selectBot(groupId, botId) {
175
+ selectedGroupId = groupId;
176
+ selectedBotId = botId;
177
+ const role = await loadRole(botId, groupId);
178
+ const empty = document.getElementById('roles-editor-empty');
179
+ const form = document.getElementById('roles-editor-form');
180
+ const textarea = document.getElementById('roles-editor-textarea');
181
+ const groupName = document.getElementById('roles-editor-group-name');
182
+ const botName = document.getElementById('roles-editor-bot-name');
183
+ const chatIdEl = document.getElementById('roles-editor-chat-id');
184
+ if (empty)
185
+ empty.style.display = 'none';
186
+ if (form)
187
+ form.style.display = '';
188
+ const group = cache.find(g => g.chatId === groupId);
189
+ const bot = group?.memberBots.find(b => b.larkAppId === botId);
190
+ if (groupName)
191
+ groupName.textContent = group?.name ?? groupId;
192
+ if (botName)
193
+ botName.textContent = bot?.botName ?? botId;
194
+ if (chatIdEl)
195
+ chatIdEl.textContent = `${groupId} · ${botId}`;
196
+ editingContent = role.content ?? '';
197
+ if (textarea) {
198
+ textarea.value = editingContent;
199
+ textarea.focus();
200
+ }
201
+ updateByteCount();
202
+ updatePreview();
203
+ renderTree(document.getElementById('roles-search')?.value ?? '');
204
+ const delBtn = document.getElementById('roles-delete');
205
+ if (delBtn)
206
+ delBtn.style.display = role.hasRole ? '' : 'none';
207
+ }
208
+ function updateByteCount() {
209
+ const el = document.getElementById('roles-editor-bytecount');
210
+ if (!el)
211
+ return;
212
+ const len = new TextEncoder().encode(editingContent).length;
213
+ el.textContent = `${len} / ${MAX_ROLE_BYTES} bytes`;
214
+ el.className = `roles-bytecount ${len > 3800 ? 'warn' : ''} ${len > MAX_ROLE_BYTES ? 'over' : ''}`;
215
+ updateSaveButton(len);
216
+ }
217
+ function updateSaveButton(byteLen) {
218
+ const btn = document.getElementById('roles-save');
219
+ if (!btn)
220
+ return;
221
+ const len = byteLen ?? new TextEncoder().encode(editingContent).length;
222
+ btn.disabled = len > MAX_ROLE_BYTES || editingContent.trim().length === 0;
223
+ }
224
+ function updatePreview() {
225
+ const preview = document.getElementById('roles-preview');
226
+ if (!preview)
227
+ return;
228
+ if (!editingContent.trim()) {
229
+ preview.innerHTML = `<small>${t('roles.previewEmpty')}</small>`;
230
+ }
231
+ else {
232
+ preview.innerHTML = `<strong>${t('roles.preview')}</strong><pre>${escapeHtml(editingContent)}</pre>`;
233
+ }
234
+ }
235
+ function resetEditor() {
236
+ selectedGroupId = null;
237
+ selectedBotId = null;
238
+ editingContent = '';
239
+ const empty = document.getElementById('roles-editor-empty');
240
+ const form = document.getElementById('roles-editor-form');
241
+ const textarea = document.getElementById('roles-editor-textarea');
242
+ const delBtn = document.getElementById('roles-delete');
243
+ if (empty)
244
+ empty.style.display = '';
245
+ if (form)
246
+ form.style.display = 'none';
247
+ if (textarea)
248
+ textarea.value = '';
249
+ if (delBtn)
250
+ delBtn.style.display = 'none';
251
+ }
252
+ export async function renderRolesPage(root) {
253
+ root.innerHTML = pageHtml();
254
+ expandedGroups.clear();
255
+ resetEditor();
256
+ await loadGroups();
257
+ // Auto-expand groups that have at least one bot with a role
258
+ for (const g of cache) {
259
+ if (botRoleCount(g) > 0)
260
+ expandedGroups.add(g.chatId);
261
+ }
262
+ renderTree();
263
+ // Search
264
+ document.getElementById('roles-search')?.addEventListener('input', (e) => {
265
+ renderTree(e.target.value);
266
+ });
267
+ // Refresh
268
+ document.getElementById('roles-refresh')?.addEventListener('click', async () => {
269
+ await loadGroups();
270
+ renderTree(document.getElementById('roles-search')?.value ?? '');
271
+ // Re-fetch current selection if any
272
+ if (selectedGroupId && selectedBotId) {
273
+ const role = await loadRole(selectedBotId, selectedGroupId);
274
+ const textarea = document.getElementById('roles-editor-textarea');
275
+ if (textarea)
276
+ textarea.value = role.content ?? '';
277
+ editingContent = role.content ?? '';
278
+ updateByteCount();
279
+ updatePreview();
280
+ const delBtn = document.getElementById('roles-delete');
281
+ if (delBtn)
282
+ delBtn.style.display = role.hasRole ? '' : 'none';
283
+ }
284
+ });
285
+ // Save
286
+ document.getElementById('roles-save')?.addEventListener('click', async function () {
287
+ if (!selectedGroupId || !selectedBotId)
288
+ return;
289
+ this.disabled = true;
290
+ this.textContent = '...';
291
+ try {
292
+ const ok = await saveRole(selectedBotId, selectedGroupId, editingContent);
293
+ if (ok) {
294
+ await loadGroups();
295
+ renderTree(document.getElementById('roles-search')?.value ?? '');
296
+ const delBtn = document.getElementById('roles-delete');
297
+ if (delBtn)
298
+ delBtn.style.display = '';
299
+ // Brief saved indicator
300
+ const statusEl = document.createElement('span');
301
+ statusEl.className = 'roles-saved-flash';
302
+ statusEl.textContent = ` ${t('roles.saved')}`;
303
+ const footer = document.querySelector('.roles-editor-footer');
304
+ footer?.appendChild(statusEl);
305
+ setTimeout(() => statusEl.remove(), 2000);
306
+ }
307
+ else {
308
+ // Show error feedback
309
+ const statusEl = document.createElement('span');
310
+ statusEl.className = 'roles-saved-flash roles-save-error';
311
+ statusEl.textContent = editingContent.trim().length === 0
312
+ ? ` ${t('roles.emptyError')}`
313
+ : ` ${t('roles.saveFailed')}`;
314
+ const footer = document.querySelector('.roles-editor-footer');
315
+ footer?.appendChild(statusEl);
316
+ setTimeout(() => statusEl.remove(), 3000);
317
+ }
318
+ }
319
+ finally {
320
+ this.disabled = false;
321
+ this.textContent = t('roles.save');
322
+ }
323
+ });
324
+ // Delete
325
+ document.getElementById('roles-delete')?.addEventListener('click', async function () {
326
+ if (!selectedGroupId || !selectedBotId)
327
+ return;
328
+ if (!confirm(t('roles.confirmDelete')))
329
+ return;
330
+ this.disabled = true;
331
+ this.textContent = '...';
332
+ try {
333
+ const ok = await deleteRole(selectedBotId, selectedGroupId);
334
+ if (ok) {
335
+ await loadGroups();
336
+ resetEditor();
337
+ renderTree(document.getElementById('roles-search')?.value ?? '');
338
+ }
339
+ }
340
+ finally {
341
+ this.disabled = false;
342
+ this.textContent = t('roles.delete');
343
+ }
344
+ });
345
+ // Live edit
346
+ document.getElementById('roles-editor-textarea')?.addEventListener('input', (e) => {
347
+ editingContent = e.target.value;
348
+ updateByteCount();
349
+ updatePreview();
350
+ });
351
+ }
352
+ //# sourceMappingURL=roles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles.js","sourceRoot":"","sources":["../../../src/dashboard/web/roles.ts"],"names":[],"mappings":"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"}