botmux 2.112.0 → 2.114.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 (122) hide show
  1. package/dist/bot-registry.d.ts +31 -0
  2. package/dist/bot-registry.d.ts.map +1 -1
  3. package/dist/bot-registry.js +8 -0
  4. package/dist/bot-registry.js.map +1 -1
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +12 -6
  7. package/dist/cli.js.map +1 -1
  8. package/dist/core/ask-broker.d.ts +1 -1
  9. package/dist/core/ask-broker.d.ts.map +1 -1
  10. package/dist/core/ask-broker.js +2 -1
  11. package/dist/core/ask-broker.js.map +1 -1
  12. package/dist/core/ask-types.d.ts +5 -0
  13. package/dist/core/ask-types.d.ts.map +1 -1
  14. package/dist/core/ask-types.js.map +1 -1
  15. package/dist/core/dashboard-ipc-server.d.ts +10 -0
  16. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  17. package/dist/core/dashboard-ipc-server.js +73 -2
  18. package/dist/core/dashboard-ipc-server.js.map +1 -1
  19. package/dist/core/reply-target.d.ts +30 -1
  20. package/dist/core/reply-target.d.ts.map +1 -1
  21. package/dist/core/reply-target.js +70 -7
  22. package/dist/core/reply-target.js.map +1 -1
  23. package/dist/core/types.d.ts +8 -0
  24. package/dist/core/types.d.ts.map +1 -1
  25. package/dist/core/types.js.map +1 -1
  26. package/dist/core/worker-pool.d.ts +18 -1
  27. package/dist/core/worker-pool.d.ts.map +1 -1
  28. package/dist/core/worker-pool.js +67 -11
  29. package/dist/core/worker-pool.js.map +1 -1
  30. package/dist/daemon.d.ts +1 -1
  31. package/dist/daemon.d.ts.map +1 -1
  32. package/dist/daemon.js +85 -16
  33. package/dist/daemon.js.map +1 -1
  34. package/dist/dashboard/web/bot-defaults-page.d.ts +8 -1
  35. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  36. package/dist/dashboard/web/bot-defaults-page.js +238 -21
  37. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  38. package/dist/dashboard/web/bot-defaults.d.ts +23 -0
  39. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  40. package/dist/dashboard/web/bot-defaults.js +17 -0
  41. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  42. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  43. package/dist/dashboard/web/i18n.js +54 -2
  44. package/dist/dashboard/web/i18n.js.map +1 -1
  45. package/dist/dashboard/web/ui.d.ts +4 -0
  46. package/dist/dashboard/web/ui.d.ts.map +1 -1
  47. package/dist/dashboard/web/ui.js +11 -0
  48. package/dist/dashboard/web/ui.js.map +1 -1
  49. package/dist/dashboard-web/app.js +1 -1
  50. package/dist/dashboard-web/chunks/bot-defaults-page-SRCBF7Z3.js +5 -0
  51. package/dist/dashboard-web/chunks/{chunk-NYZHARIU.js → chunk-3H6MVXXU.js} +8 -6
  52. package/dist/dashboard-web/chunks/{chunk-YBOHL7T7.js → chunk-77KD4TK2.js} +1 -1
  53. package/dist/dashboard-web/chunks/{chunk-CMDPZOPK.js → chunk-D2I5F4MY.js} +1 -1
  54. package/dist/dashboard-web/chunks/{chunk-YWCPDL4S.js → chunk-NGRUZCXP.js} +1 -1
  55. package/dist/dashboard-web/chunks/{connectors-page-DAMP7TTV.js → connectors-page-RM3BJVMV.js} +1 -1
  56. package/dist/dashboard-web/chunks/{groups-page-BPFA356N.js → groups-page-3D4YSYLA.js} +1 -1
  57. package/dist/dashboard-web/chunks/{insights-page-SHOPHTWY.js → insights-page-CRFJKA54.js} +1 -1
  58. package/dist/dashboard-web/chunks/{monitor-room-PXPJGZCN.js → monitor-room-HLK3XDT2.js} +1 -1
  59. package/dist/dashboard-web/chunks/{monitoring-page-4DF54M5Y.js → monitoring-page-E3SNZFFN.js} +1 -1
  60. package/dist/dashboard-web/chunks/{office-page-6OHU6KMZ.js → office-page-MKQ2TENK.js} +1 -1
  61. package/dist/dashboard-web/chunks/overview-page-ICFKKRLV.js +1 -0
  62. package/dist/dashboard-web/chunks/{roles-page-JYTBYKEF.js → roles-page-2DFJ7YRU.js} +1 -1
  63. package/dist/dashboard-web/chunks/{schedules-page-WJ72T7KV.js → schedules-page-S4WDIXH5.js} +1 -1
  64. package/dist/dashboard-web/chunks/{sessions-page-QC56OIAI.js → sessions-page-4XWGUGB5.js} +1 -1
  65. package/dist/dashboard-web/chunks/{settings-page-TCKWEXTN.js → settings-page-OBTE4LYP.js} +1 -1
  66. package/dist/dashboard-web/chunks/{skills-page-RJJNIECW.js → skills-page-CTRQJR47.js} +1 -1
  67. package/dist/dashboard-web/chunks/{team-federation-page-ZMDX3E7K.js → team-federation-page-GICLDKJP.js} +1 -1
  68. package/dist/dashboard-web/chunks/{v3-page-VLLAUQ33.js → v3-page-DI55IRL5.js} +1 -1
  69. package/dist/dashboard-web/chunks/{whiteboards-page-NAO53CKM.js → whiteboards-page-7KFWMILV.js} +1 -1
  70. package/dist/dashboard-web/style.css +113 -1
  71. package/dist/dashboard.js +48 -0
  72. package/dist/dashboard.js.map +1 -1
  73. package/dist/i18n/en.d.ts.map +1 -1
  74. package/dist/i18n/en.js +3 -2
  75. package/dist/i18n/en.js.map +1 -1
  76. package/dist/i18n/zh.d.ts.map +1 -1
  77. package/dist/i18n/zh.js +3 -2
  78. package/dist/i18n/zh.js.map +1 -1
  79. package/dist/im/lark/card-handler.d.ts.map +1 -1
  80. package/dist/im/lark/card-handler.js +9 -2
  81. package/dist/im/lark/card-handler.js.map +1 -1
  82. package/dist/im/lark/client.d.ts +30 -0
  83. package/dist/im/lark/client.d.ts.map +1 -1
  84. package/dist/im/lark/client.js +63 -13
  85. package/dist/im/lark/client.js.map +1 -1
  86. package/dist/im/lark/event-dispatcher.d.ts +7 -3
  87. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  88. package/dist/im/lark/event-dispatcher.js +66 -15
  89. package/dist/im/lark/event-dispatcher.js.map +1 -1
  90. package/dist/im/lark/substitute-command.d.ts.map +1 -1
  91. package/dist/im/lark/substitute-command.js +10 -1
  92. package/dist/im/lark/substitute-command.js.map +1 -1
  93. package/dist/services/oncall-store.d.ts +8 -0
  94. package/dist/services/oncall-store.d.ts.map +1 -1
  95. package/dist/services/oncall-store.js +48 -2
  96. package/dist/services/oncall-store.js.map +1 -1
  97. package/dist/services/open-platform-rename.d.ts +31 -3
  98. package/dist/services/open-platform-rename.d.ts.map +1 -1
  99. package/dist/services/open-platform-rename.js +262 -48
  100. package/dist/services/open-platform-rename.js.map +1 -1
  101. package/dist/services/substitute-mode-normalize.d.ts.map +1 -1
  102. package/dist/services/substitute-mode-normalize.js +17 -1
  103. package/dist/services/substitute-mode-normalize.js.map +1 -1
  104. package/dist/services/substitute-mode-store.d.ts +24 -5
  105. package/dist/services/substitute-mode-store.d.ts.map +1 -1
  106. package/dist/services/substitute-mode-store.js +36 -16
  107. package/dist/services/substitute-mode-store.js.map +1 -1
  108. package/dist/skills/definitions.d.ts +1 -1
  109. package/dist/skills/definitions.d.ts.map +1 -1
  110. package/dist/skills/definitions.js +15 -3
  111. package/dist/skills/definitions.js.map +1 -1
  112. package/dist/types.d.ts +22 -0
  113. package/dist/types.d.ts.map +1 -1
  114. package/dist/utils/bot-routing.d.ts +1 -0
  115. package/dist/utils/bot-routing.d.ts.map +1 -1
  116. package/dist/utils/bot-routing.js +1 -1
  117. package/dist/utils/bot-routing.js.map +1 -1
  118. package/dist/workflows/migration/v2-run-archive-schema.d.ts +2 -2
  119. package/dist/workflows/v3/run-envelope.d.ts +16 -16
  120. package/package.json +1 -1
  121. package/dist/dashboard-web/chunks/bot-defaults-page-RYBL4ZYE.js +0 -4
  122. package/dist/dashboard-web/chunks/overview-page-IHIZ6F5M.js +0 -1
@@ -8676,6 +8676,57 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
8676
8676
  width: 48px;
8677
8677
  height: 48px;
8678
8678
  }
8679
+ /* 档案头头像可点击上传(BotAvatarControl)。 */
8680
+ .bd-avatar-editable { position: relative; }
8681
+ .bd-avatar-btn {
8682
+ display: grid;
8683
+ place-items: center;
8684
+ width: 100%;
8685
+ height: 100%;
8686
+ padding: 0;
8687
+ border: 0;
8688
+ background: none;
8689
+ border-radius: var(--radius-full);
8690
+ cursor: pointer;
8691
+ }
8692
+ .bd-avatar-btn:disabled { cursor: progress; }
8693
+ .bd-avatar-edit-badge {
8694
+ position: absolute;
8695
+ right: -3px;
8696
+ bottom: -3px;
8697
+ display: grid;
8698
+ place-items: center;
8699
+ width: 20px;
8700
+ height: 20px;
8701
+ font-size: 11px;
8702
+ border-radius: var(--radius-full);
8703
+ color: var(--text);
8704
+ background: var(--surface);
8705
+ border: 1px solid var(--border-soft);
8706
+ box-shadow: var(--shadow);
8707
+ opacity: 0;
8708
+ transition: opacity 0.15s ease;
8709
+ pointer-events: none;
8710
+ }
8711
+ .bd-avatar-editable:hover .bd-avatar-edit-badge,
8712
+ .bd-avatar-btn:focus-visible .bd-avatar-edit-badge,
8713
+ .bd-avatar-btn:disabled .bd-avatar-edit-badge { opacity: 1; }
8714
+ /* 状态气泡挂在头像下方,避免撑坏 58px 头像栏的网格布局。 */
8715
+ .bd-avatar-status {
8716
+ position: absolute;
8717
+ top: calc(100% + 6px);
8718
+ left: 0;
8719
+ z-index: 6;
8720
+ min-width: 240px;
8721
+ max-width: 340px;
8722
+ padding: 6px 9px;
8723
+ border-radius: var(--radius-sm);
8724
+ border: 1px solid var(--border-soft);
8725
+ background: var(--surface);
8726
+ box-shadow: var(--shadow);
8727
+ line-height: 1.5;
8728
+ }
8729
+ .bd-avatar-status .bd-feishu-login { margin-left: 6px; }
8679
8730
  .bd-profile-main {
8680
8731
  min-width: 0;
8681
8732
  display: grid;
@@ -20821,7 +20872,7 @@ dialog select[multiple]:hover:not(:disabled) {
20821
20872
  min-width: 0;
20822
20873
  }
20823
20874
 
20824
- .bot-defaults-page .bd-substitute-target-row > :where(.bd-field-menu, input) {
20875
+ .bot-defaults-page .bd-substitute-target-row > :where(.bd-field-menu, input, .bd-substitute-target-name) {
20825
20876
  min-width: 0;
20826
20877
  }
20827
20878
 
@@ -20922,6 +20973,67 @@ dialog select[multiple]:hover:not(:disabled) {
20922
20973
  .bot-defaults-page .bd-substitute-target-remove { grid-area: remove; }
20923
20974
  }
20924
20975
 
20976
+ .bot-defaults-page .bd-substitute-target-name {
20977
+ display: flex;
20978
+ align-items: center;
20979
+ gap: 6px;
20980
+ min-width: 0;
20981
+ }
20982
+
20983
+ .bot-defaults-page .bd-substitute-target-name > input {
20984
+ flex: 1 1 auto;
20985
+ min-width: 0;
20986
+ }
20987
+
20988
+ .bot-defaults-page .bd-substitute-target-name > input:disabled {
20989
+ background: transparent;
20990
+ color: var(--text);
20991
+ opacity: 1;
20992
+ cursor: default;
20993
+ }
20994
+
20995
+ .bot-defaults-page .bd-substitute-target-name-chip {
20996
+ display: inline-flex;
20997
+ align-items: center;
20998
+ gap: 6px;
20999
+ max-width: 100%;
21000
+ min-height: 26px;
21001
+ padding: 4px 16px;
21002
+ border-radius: 999px;
21003
+ background: var(--accent);
21004
+ color: var(--on-accent);
21005
+ font-size: 13px;
21006
+ font-weight: 600;
21007
+ line-height: 1;
21008
+ white-space: nowrap;
21009
+ overflow: hidden;
21010
+ text-overflow: ellipsis;
21011
+ user-select: none;
21012
+ }
21013
+
21014
+ :root[data-theme="dark"] .bot-defaults-page .bd-substitute-target-name-chip {
21015
+ color: var(--bg);
21016
+ }
21017
+
21018
+ .bot-defaults-page .bd-substitute-target-resolving {
21019
+ font-size: 12px;
21020
+ color: var(--muted);
21021
+ }
21022
+
21023
+ .bot-defaults-page .bd-substitute-target-resolution-badge {
21024
+ display: inline-flex;
21025
+ align-items: center;
21026
+ min-height: 22px;
21027
+ padding: 0 8px;
21028
+ border-radius: var(--radius-sm);
21029
+ border: 1px solid color-mix(in srgb, var(--danger) 40%, var(--border-soft));
21030
+ background: color-mix(in srgb, var(--danger) 10%, var(--surface-muted));
21031
+ color: var(--danger);
21032
+ font-size: 11px;
21033
+ font-weight: 700;
21034
+ line-height: 1;
21035
+ }
21036
+
20925
21037
  .bot-defaults-page .bd-field-menu {
20926
21038
  width: 100%;
20927
21039
  min-width: 0;
package/dist/dashboard.js CHANGED
@@ -3452,6 +3452,24 @@ const server = createServer(async (req, res) => {
3452
3452
  res.end(await upstream.text());
3453
3453
  return;
3454
3454
  }
3455
+ // POST /api/bots/:appId/substitute-targets/resolve — preview resolution for a
3456
+ // single target without persisting; used for dashboard auto-fill.
3457
+ let mBotSubstituteResolve;
3458
+ if (req.method === 'POST' && (mBotSubstituteResolve = url.pathname.match(/^\/api\/bots\/([^/]+)\/substitute-targets\/resolve$/))) {
3459
+ const appId = decodeURIComponent(mBotSubstituteResolve[1]);
3460
+ const chunks = [];
3461
+ for await (const c of req)
3462
+ chunks.push(c);
3463
+ const raw = Buffer.concat(chunks).toString('utf8') || '{}';
3464
+ const upstream = await proxyToDaemon(appId, `/api/bot-substitute-targets/resolve`, {
3465
+ method: 'POST',
3466
+ headers: { 'content-type': 'application/json' },
3467
+ body: raw,
3468
+ });
3469
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
3470
+ res.end(await upstream.text());
3471
+ return;
3472
+ }
3455
3473
  // PUT /api/bots/:appId/summary-range — proxy to that bot's daemon. Body
3456
3474
  // `{ limit, sinceHours }`; daemon updates the explicit /summary range.
3457
3475
  let mBotSummaryRange;
@@ -3565,6 +3583,36 @@ const server = createServer(async (req, res) => {
3565
3583
  res.end(await upstream.text());
3566
3584
  return;
3567
3585
  }
3586
+ // PUT /api/bots/:appId/avatar — proxy to that bot's daemon. Body
3587
+ // `{ imageBase64: string }` (512×512 PNG, canvas-normalized by the web UI).
3588
+ // The daemon runs the Open Platform automation (upload icon + base_info +
3589
+ // publish a version); there is no local fallback — failures return the
3590
+ // structured reason so the UI can prompt for a Feishu web login.
3591
+ let mBotAvatar;
3592
+ if (req.method === 'PUT' && (mBotAvatar = url.pathname.match(/^\/api\/bots\/([^/]+)\/avatar$/))) {
3593
+ const appId = decodeURIComponent(mBotAvatar[1]);
3594
+ const chunks = [];
3595
+ let received = 0;
3596
+ for await (const c of req) {
3597
+ received += c.length;
3598
+ // base64 of a 512×512 PNG stays well under this; cap before buffering more.
3599
+ if (received > 4_000_000) {
3600
+ res.writeHead(413, { 'content-type': 'application/json' });
3601
+ res.end(JSON.stringify({ ok: false, error: 'image_too_large' }));
3602
+ return;
3603
+ }
3604
+ chunks.push(c);
3605
+ }
3606
+ const raw = Buffer.concat(chunks).toString('utf8') || '{}';
3607
+ const upstream = await proxyToDaemon(appId, `/api/bot-avatar`, {
3608
+ method: 'PUT',
3609
+ headers: { 'content-type': 'application/json' },
3610
+ body: raw,
3611
+ });
3612
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
3613
+ res.end(await upstream.text());
3614
+ return;
3615
+ }
3568
3616
  // PUT /api/bots/:appId/max-live-workers — proxy to that bot's daemon. Body
3569
3617
  // `{ maxLiveWorkers: number | null }` (null = clear → fall back to the
3570
3618
  // built-in default of 30; a positive integer overrides it).