botmux 2.106.0 → 2.107.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 (182) hide show
  1. package/dist/bot-registry.d.ts +25 -0
  2. package/dist/bot-registry.d.ts.map +1 -1
  3. package/dist/bot-registry.js +6 -0
  4. package/dist/bot-registry.js.map +1 -1
  5. package/dist/core/command-handler.d.ts.map +1 -1
  6. package/dist/core/command-handler.js +5 -0
  7. package/dist/core/command-handler.js.map +1 -1
  8. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  9. package/dist/core/dashboard-ipc-server.js +27 -1
  10. package/dist/core/dashboard-ipc-server.js.map +1 -1
  11. package/dist/core/dashboard-rows.d.ts +6 -0
  12. package/dist/core/dashboard-rows.d.ts.map +1 -1
  13. package/dist/core/dashboard-rows.js +25 -0
  14. package/dist/core/dashboard-rows.js.map +1 -1
  15. package/dist/core/pending-response.d.ts +1 -0
  16. package/dist/core/pending-response.d.ts.map +1 -1
  17. package/dist/core/pending-response.js +1 -0
  18. package/dist/core/pending-response.js.map +1 -1
  19. package/dist/core/resource-monitor/attribution.d.ts +70 -0
  20. package/dist/core/resource-monitor/attribution.d.ts.map +1 -0
  21. package/dist/core/resource-monitor/attribution.js +222 -0
  22. package/dist/core/resource-monitor/attribution.js.map +1 -0
  23. package/dist/core/resource-monitor/procfs.d.ts +22 -0
  24. package/dist/core/resource-monitor/procfs.d.ts.map +1 -0
  25. package/dist/core/resource-monitor/procfs.js +134 -0
  26. package/dist/core/resource-monitor/procfs.js.map +1 -0
  27. package/dist/core/resource-monitor/ring-buffer.d.ts +15 -0
  28. package/dist/core/resource-monitor/ring-buffer.d.ts.map +1 -0
  29. package/dist/core/resource-monitor/ring-buffer.js +61 -0
  30. package/dist/core/resource-monitor/ring-buffer.js.map +1 -0
  31. package/dist/core/resource-monitor/runtime.d.ts +31 -0
  32. package/dist/core/resource-monitor/runtime.d.ts.map +1 -0
  33. package/dist/core/resource-monitor/runtime.js +92 -0
  34. package/dist/core/resource-monitor/runtime.js.map +1 -0
  35. package/dist/core/resource-monitor/top-selector.d.ts +18 -0
  36. package/dist/core/resource-monitor/top-selector.d.ts.map +1 -0
  37. package/dist/core/resource-monitor/top-selector.js +57 -0
  38. package/dist/core/resource-monitor/top-selector.js.map +1 -0
  39. package/dist/core/resource-monitor/types.d.ts +181 -0
  40. package/dist/core/resource-monitor/types.d.ts.map +1 -0
  41. package/dist/core/resource-monitor/types.js +2 -0
  42. package/dist/core/resource-monitor/types.js.map +1 -0
  43. package/dist/core/session-manager.d.ts +3 -1
  44. package/dist/core/session-manager.d.ts.map +1 -1
  45. package/dist/core/session-manager.js +31 -1
  46. package/dist/core/session-manager.js.map +1 -1
  47. package/dist/core/types.d.ts +1 -0
  48. package/dist/core/types.d.ts.map +1 -1
  49. package/dist/core/types.js.map +1 -1
  50. package/dist/daemon.d.ts +1 -1
  51. package/dist/daemon.d.ts.map +1 -1
  52. package/dist/daemon.js +44 -22
  53. package/dist/daemon.js.map +1 -1
  54. package/dist/dashboard/bot-payload.d.ts +1 -0
  55. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  56. package/dist/dashboard/bot-payload.js +1 -0
  57. package/dist/dashboard/bot-payload.js.map +1 -1
  58. package/dist/dashboard/resource-monitor-service.d.ts +56 -0
  59. package/dist/dashboard/resource-monitor-service.d.ts.map +1 -0
  60. package/dist/dashboard/resource-monitor-service.js +446 -0
  61. package/dist/dashboard/resource-monitor-service.js.map +1 -0
  62. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  63. package/dist/dashboard/web/bot-defaults.js +160 -1
  64. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  65. package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -1
  66. package/dist/dashboard/web/dashboard-routes.js +18 -0
  67. package/dist/dashboard/web/dashboard-routes.js.map +1 -1
  68. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  69. package/dist/dashboard/web/i18n.js +274 -2
  70. package/dist/dashboard/web/i18n.js.map +1 -1
  71. package/dist/dashboard/web/monitor-room-store.d.ts +20 -0
  72. package/dist/dashboard/web/monitor-room-store.d.ts.map +1 -0
  73. package/dist/dashboard/web/monitor-room-store.js +80 -0
  74. package/dist/dashboard/web/monitor-room-store.js.map +1 -0
  75. package/dist/dashboard/web/monitor-room.d.ts +31 -0
  76. package/dist/dashboard/web/monitor-room.d.ts.map +1 -0
  77. package/dist/dashboard/web/monitor-room.js +393 -0
  78. package/dist/dashboard/web/monitor-room.js.map +1 -0
  79. package/dist/dashboard/web/monitoring-page.d.ts +155 -0
  80. package/dist/dashboard/web/monitoring-page.d.ts.map +1 -0
  81. package/dist/dashboard/web/monitoring-page.js +189 -0
  82. package/dist/dashboard/web/monitoring-page.js.map +1 -0
  83. package/dist/dashboard/web/overview-page.d.ts.map +1 -1
  84. package/dist/dashboard/web/overview-page.js +108 -1
  85. package/dist/dashboard/web/overview-page.js.map +1 -1
  86. package/dist/dashboard/web/preferences.d.ts +3 -0
  87. package/dist/dashboard/web/preferences.d.ts.map +1 -1
  88. package/dist/dashboard/web/preferences.js +18 -0
  89. package/dist/dashboard/web/preferences.js.map +1 -1
  90. package/dist/dashboard/web/session-terminal.d.ts +7 -0
  91. package/dist/dashboard/web/session-terminal.d.ts.map +1 -0
  92. package/dist/dashboard/web/session-terminal.js +17 -0
  93. package/dist/dashboard/web/session-terminal.js.map +1 -0
  94. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  95. package/dist/dashboard/web/sessions-page.js +2 -1
  96. package/dist/dashboard/web/sessions-page.js.map +1 -1
  97. package/dist/dashboard/web/sessions.d.ts +4 -0
  98. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  99. package/dist/dashboard/web/sessions.js +98 -17
  100. package/dist/dashboard/web/sessions.js.map +1 -1
  101. package/dist/dashboard/web/skills-page.js +1 -1
  102. package/dist/dashboard/web/skills-page.js.map +1 -1
  103. package/dist/dashboard/web/substitute-targets.d.ts +30 -0
  104. package/dist/dashboard/web/substitute-targets.d.ts.map +1 -0
  105. package/dist/dashboard/web/substitute-targets.js +99 -0
  106. package/dist/dashboard/web/substitute-targets.js.map +1 -0
  107. package/dist/dashboard/web/ui.d.ts +1 -1
  108. package/dist/dashboard/web/ui.d.ts.map +1 -1
  109. package/dist/dashboard/web/ui.js +4 -1
  110. package/dist/dashboard/web/ui.js.map +1 -1
  111. package/dist/dashboard-web/app.js +3 -3
  112. package/dist/dashboard-web/chunks/bot-defaults-page-OCIHPGEU.js +438 -0
  113. package/dist/dashboard-web/chunks/chunk-3N2PPQVD.js +1 -0
  114. package/dist/dashboard-web/chunks/chunk-3UJYRR2Q.js +37 -0
  115. package/dist/dashboard-web/chunks/{chunk-VFCACTRF.js → chunk-PE6W3C2C.js} +1 -1
  116. package/dist/dashboard-web/chunks/chunk-QW54DWU3.js +325 -0
  117. package/dist/dashboard-web/chunks/{connectors-VDOAKUW3.js → connectors-IGETYWCP.js} +1 -1
  118. package/dist/dashboard-web/chunks/{groups-page-CX5AN4XG.js → groups-page-MYBS4ZYJ.js} +1 -1
  119. package/dist/dashboard-web/chunks/{insights-page-DOMRL4S6.js → insights-page-UPA32V2S.js} +1 -1
  120. package/dist/dashboard-web/chunks/monitor-room-RFX4HPS5.js +51 -0
  121. package/dist/dashboard-web/chunks/monitoring-page-7T3BESZ2.js +1 -0
  122. package/dist/dashboard-web/chunks/overview-page-LJSBCQW4.js +1 -0
  123. package/dist/dashboard-web/chunks/{roles-page-3FEAH6S4.js → roles-page-ESURTVQH.js} +1 -1
  124. package/dist/dashboard-web/chunks/{schedules-CTQEA7IE.js → schedules-LML2ISOT.js} +1 -1
  125. package/dist/dashboard-web/chunks/sessions-YB73XOTU.js +1 -0
  126. package/dist/dashboard-web/chunks/sessions-page-MCO5QR7Z.js +1 -0
  127. package/dist/dashboard-web/chunks/{settings-page-R23I3IZG.js → settings-page-OSDKNVS3.js} +1 -1
  128. package/dist/dashboard-web/chunks/skills-page-PXBZJ6P6.js +2 -0
  129. package/dist/dashboard-web/chunks/{team-federation-page-ZKL3YMGN.js → team-federation-page-TTPVHFPX.js} +1 -1
  130. package/dist/dashboard-web/chunks/{workflows-4BYQQBFP.js → workflows-FCPM4S4D.js} +1 -1
  131. package/dist/dashboard-web/index.html +2 -1
  132. package/dist/dashboard-web/style.css +818 -8
  133. package/dist/dashboard.js +37 -0
  134. package/dist/dashboard.js.map +1 -1
  135. package/dist/i18n/en.d.ts.map +1 -1
  136. package/dist/i18n/en.js +8 -0
  137. package/dist/i18n/en.js.map +1 -1
  138. package/dist/i18n/zh.d.ts.map +1 -1
  139. package/dist/i18n/zh.js +8 -0
  140. package/dist/i18n/zh.js.map +1 -1
  141. package/dist/im/lark/card-builder.d.ts.map +1 -1
  142. package/dist/im/lark/card-builder.js +18 -0
  143. package/dist/im/lark/card-builder.js.map +1 -1
  144. package/dist/im/lark/card-handler.d.ts.map +1 -1
  145. package/dist/im/lark/card-handler.js +12 -2
  146. package/dist/im/lark/card-handler.js.map +1 -1
  147. package/dist/im/lark/event-dispatcher.d.ts +3 -0
  148. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  149. package/dist/im/lark/event-dispatcher.js +59 -2
  150. package/dist/im/lark/event-dispatcher.js.map +1 -1
  151. package/dist/im/lark/message-parser.d.ts +35 -0
  152. package/dist/im/lark/message-parser.d.ts.map +1 -1
  153. package/dist/im/lark/message-parser.js +56 -0
  154. package/dist/im/lark/message-parser.js.map +1 -1
  155. package/dist/im/lark/substitute-command.d.ts +2 -0
  156. package/dist/im/lark/substitute-command.d.ts.map +1 -0
  157. package/dist/im/lark/substitute-command.js +51 -0
  158. package/dist/im/lark/substitute-command.js.map +1 -0
  159. package/dist/services/substitute-chat-toggle-store.d.ts +3 -0
  160. package/dist/services/substitute-chat-toggle-store.d.ts.map +1 -0
  161. package/dist/services/substitute-chat-toggle-store.js +58 -0
  162. package/dist/services/substitute-chat-toggle-store.js.map +1 -0
  163. package/dist/services/substitute-mode-normalize.d.ts +22 -0
  164. package/dist/services/substitute-mode-normalize.d.ts.map +1 -0
  165. package/dist/services/substitute-mode-normalize.js +56 -0
  166. package/dist/services/substitute-mode-normalize.js.map +1 -0
  167. package/dist/services/substitute-mode-store.d.ts +50 -0
  168. package/dist/services/substitute-mode-store.d.ts.map +1 -0
  169. package/dist/services/substitute-mode-store.js +115 -0
  170. package/dist/services/substitute-mode-store.js.map +1 -0
  171. package/dist/types.d.ts +14 -0
  172. package/dist/types.d.ts.map +1 -1
  173. package/dist/worker.js +20 -1
  174. package/dist/worker.js.map +1 -1
  175. package/package.json +1 -1
  176. package/dist/dashboard-web/chunks/bot-defaults-page-3OIY7N76.js +0 -409
  177. package/dist/dashboard-web/chunks/chunk-BNEXMNQD.js +0 -31
  178. package/dist/dashboard-web/chunks/chunk-DKKOGZCG.js +0 -317
  179. package/dist/dashboard-web/chunks/overview-page-AZBAXVZ7.js +0 -1
  180. package/dist/dashboard-web/chunks/sessions-LVZCXO2Z.js +0 -1
  181. package/dist/dashboard-web/chunks/sessions-page-NHBJDSBC.js +0 -1
  182. package/dist/dashboard-web/chunks/skills-page-VUG3EPWX.js +0 -2
package/dist/dashboard.js CHANGED
@@ -67,6 +67,7 @@ import { automateOpenPlatformSetup } from './setup/open-platform-automation.js';
67
67
  import { VC_MEETING_FEATURE_SCOPES, VC_MEETING_REALTIME_VOICE_SCOPES } from './setup/verify-permissions.js';
68
68
  import { checkLarkCliVersion, MIN_LARK_CLI_VERSION_FOR_VC_BOT } from './vc-agent/polling-source.js';
69
69
  import { larkHosts } from './im/lark/lark-hosts.js';
70
+ import { buildResourceMonitorDaemonSeeds, createResourceMonitorService, handleResourceMonitorApi, toResourceMonitorSessionSeed } from './dashboard/resource-monitor-service.js';
70
71
  const SECRET_PATH = join(homedir(), '.botmux', '.dashboard-secret');
71
72
  const TOKEN_PATH = join(homedir(), '.botmux', '.dashboard-token');
72
73
  /** Per-daemon budget for the cross-daemon insight overview fan-out — bounds
@@ -811,6 +812,20 @@ registry.on(syncSubscriptions);
811
812
  // Initial attach for every daemon already known. Run in parallel so a slow
812
813
  // daemon doesn't block the others.
813
814
  await Promise.all(registry.list().map(attachDaemon));
815
+ const resourceMonitor = createResourceMonitorService({
816
+ intervalMs: 10_000,
817
+ topSessionLimit: 30,
818
+ sessionHistoryMs: 3 * 60 * 60_000,
819
+ aggregateHistoryMs: 24 * 60 * 60_000,
820
+ listSessions: () => {
821
+ const names = new Map(registry.list().map(d => [d.larkAppId, d.botName]));
822
+ return aggregator.getSessions()
823
+ .filter(s => s.status !== 'closed')
824
+ .map(s => toResourceMonitorSessionSeed(s, names.get(String(s.larkAppId ?? ''))));
825
+ },
826
+ listDaemons: () => buildResourceMonitorDaemonSeeds(loadBotConfigs(), registry.list()),
827
+ });
828
+ resourceMonitor.start();
814
829
  // ─── Static frontend ─────────────────────────────────────────────────────────
815
830
  // Path to the bundled frontend (sibling of dist/dashboard.js)
816
831
  const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -1504,6 +1519,9 @@ const server = createServer(async (req, res) => {
1504
1519
  return jsonRes(res, 200, startHd2dDownload());
1505
1520
  }
1506
1521
  // ─── Public API (cookie/token already validated above) ──────────────────
1522
+ if (await handleResourceMonitorApi(req, res, url, resourceMonitor)) {
1523
+ return;
1524
+ }
1507
1525
  if (req.method === 'GET' && url.pathname === '/api/sessions') {
1508
1526
  // Sessions spawned before a bot config carried a display name store the
1509
1527
  // raw appId as botName — resolve through the live registry so consumers
@@ -2611,6 +2629,24 @@ const server = createServer(async (req, res) => {
2611
2629
  res.end(await upstream.text());
2612
2630
  return;
2613
2631
  }
2632
+ // PUT /api/bots/:appId/substitute-mode — proxy to that bot's daemon. Body
2633
+ // carries `{ enabled, targets, disclosure }`.
2634
+ let mBotSubstituteMode;
2635
+ if (req.method === 'PUT' && (mBotSubstituteMode = url.pathname.match(/^\/api\/bots\/([^/]+)\/substitute-mode$/))) {
2636
+ const appId = decodeURIComponent(mBotSubstituteMode[1]);
2637
+ const chunks = [];
2638
+ for await (const c of req)
2639
+ chunks.push(c);
2640
+ const raw = Buffer.concat(chunks).toString('utf8') || '{}';
2641
+ const upstream = await proxyToDaemon(appId, `/api/bot-substitute-mode`, {
2642
+ method: 'PUT',
2643
+ headers: { 'content-type': 'application/json' },
2644
+ body: raw,
2645
+ });
2646
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
2647
+ res.end(await upstream.text());
2648
+ return;
2649
+ }
2614
2650
  // PUT /api/bots/:appId/summary-range — proxy to that bot's daemon. Body
2615
2651
  // `{ limit, sinceHours }`; daemon updates the explicit /summary range.
2616
2652
  let mBotSummaryRange;
@@ -3343,6 +3379,7 @@ function shutdown() {
3343
3379
  off();
3344
3380
  subs.clear();
3345
3381
  registry.stop();
3382
+ resourceMonitor.stop();
3346
3383
  platformTunnel?.stop();
3347
3384
  server.close(() => process.exit(0));
3348
3385
  // Hard-exit fallback after 5s