botmux 2.95.0 → 2.96.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 (156) hide show
  1. package/README.en.md +4 -4
  2. package/README.md +3 -3
  3. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  4. package/dist/adapters/backend/tmux-backend.js +1 -10
  5. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  6. package/dist/adapters/cli/kimi.d.ts +4 -0
  7. package/dist/adapters/cli/kimi.d.ts.map +1 -0
  8. package/dist/adapters/cli/kimi.js +54 -0
  9. package/dist/adapters/cli/kimi.js.map +1 -0
  10. package/dist/adapters/cli/registry.d.ts +2 -1
  11. package/dist/adapters/cli/registry.d.ts.map +1 -1
  12. package/dist/adapters/cli/registry.js +6 -20
  13. package/dist/adapters/cli/registry.js.map +1 -1
  14. package/dist/adapters/cli/types.d.ts +1 -1
  15. package/dist/adapters/cli/types.d.ts.map +1 -1
  16. package/dist/adapters/hook-installer.d.ts.map +1 -1
  17. package/dist/adapters/hook-installer.js +138 -28
  18. package/dist/adapters/hook-installer.js.map +1 -1
  19. package/dist/bot-registry.d.ts +61 -4
  20. package/dist/bot-registry.d.ts.map +1 -1
  21. package/dist/bot-registry.js +164 -3
  22. package/dist/bot-registry.js.map +1 -1
  23. package/dist/cli/stdin-encoding.d.ts +21 -0
  24. package/dist/cli/stdin-encoding.d.ts.map +1 -1
  25. package/dist/cli/stdin-encoding.js +37 -0
  26. package/dist/cli/stdin-encoding.js.map +1 -1
  27. package/dist/cli.d.ts.map +1 -1
  28. package/dist/cli.js +14 -4
  29. package/dist/cli.js.map +1 -1
  30. package/dist/core/ask-hook/opencode.d.ts +15 -17
  31. package/dist/core/ask-hook/opencode.d.ts.map +1 -1
  32. package/dist/core/ask-hook/opencode.js +17 -19
  33. package/dist/core/ask-hook/opencode.js.map +1 -1
  34. package/dist/core/command-handler.d.ts.map +1 -1
  35. package/dist/core/command-handler.js +1 -0
  36. package/dist/core/command-handler.js.map +1 -1
  37. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  38. package/dist/core/dashboard-ipc-server.js +193 -5
  39. package/dist/core/dashboard-ipc-server.js.map +1 -1
  40. package/dist/core/dashboard-rows.d.ts +2 -0
  41. package/dist/core/dashboard-rows.d.ts.map +1 -1
  42. package/dist/core/dashboard-rows.js +2 -0
  43. package/dist/core/dashboard-rows.js.map +1 -1
  44. package/dist/core/trigger-session.d.ts.map +1 -1
  45. package/dist/core/trigger-session.js +99 -7
  46. package/dist/core/trigger-session.js.map +1 -1
  47. package/dist/core/types.d.ts +16 -0
  48. package/dist/core/types.d.ts.map +1 -1
  49. package/dist/core/types.js.map +1 -1
  50. package/dist/core/worker-pool.d.ts +1 -1
  51. package/dist/core/worker-pool.d.ts.map +1 -1
  52. package/dist/core/worker-pool.js +68 -11
  53. package/dist/core/worker-pool.js.map +1 -1
  54. package/dist/dashboard/bot-payload.d.ts +7 -0
  55. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  56. package/dist/dashboard/bot-payload.js +7 -1
  57. package/dist/dashboard/bot-payload.js.map +1 -1
  58. package/dist/dashboard/session-cleanup.d.ts +1 -0
  59. package/dist/dashboard/session-cleanup.d.ts.map +1 -1
  60. package/dist/dashboard/session-cleanup.js +2 -0
  61. package/dist/dashboard/session-cleanup.js.map +1 -1
  62. package/dist/dashboard/trigger-api.d.ts +4 -0
  63. package/dist/dashboard/trigger-api.d.ts.map +1 -1
  64. package/dist/dashboard/trigger-api.js +20 -0
  65. package/dist/dashboard/trigger-api.js.map +1 -1
  66. package/dist/dashboard/web/bot-defaults.d.ts +1 -0
  67. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  68. package/dist/dashboard/web/bot-defaults.js +247 -4
  69. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  70. package/dist/dashboard/web/connectors.d.ts +11 -0
  71. package/dist/dashboard/web/connectors.d.ts.map +1 -1
  72. package/dist/dashboard/web/connectors.js +45 -1
  73. package/dist/dashboard/web/connectors.js.map +1 -1
  74. package/dist/dashboard/web/groups.d.ts +7 -0
  75. package/dist/dashboard/web/groups.d.ts.map +1 -1
  76. package/dist/dashboard/web/groups.js +62 -15
  77. package/dist/dashboard/web/groups.js.map +1 -1
  78. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  79. package/dist/dashboard/web/i18n.js +52 -2
  80. package/dist/dashboard/web/i18n.js.map +1 -1
  81. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  82. package/dist/dashboard/web/sessions.js +149 -5
  83. package/dist/dashboard/web/sessions.js.map +1 -1
  84. package/dist/dashboard/webhook-routes.d.ts.map +1 -1
  85. package/dist/dashboard/webhook-routes.js +126 -6
  86. package/dist/dashboard/webhook-routes.js.map +1 -1
  87. package/dist/dashboard-web/app.js +818 -751
  88. package/dist/dashboard-web/style.css +47 -0
  89. package/dist/dashboard.js +84 -6
  90. package/dist/dashboard.js.map +1 -1
  91. package/dist/i18n/en.d.ts.map +1 -1
  92. package/dist/i18n/en.js +1 -0
  93. package/dist/i18n/en.js.map +1 -1
  94. package/dist/i18n/zh.d.ts.map +1 -1
  95. package/dist/i18n/zh.js +1 -0
  96. package/dist/i18n/zh.js.map +1 -1
  97. package/dist/im/lark/card-builder.d.ts.map +1 -1
  98. package/dist/im/lark/card-builder.js +1 -0
  99. package/dist/im/lark/card-builder.js.map +1 -1
  100. package/dist/im/lark/client.d.ts +12 -0
  101. package/dist/im/lark/client.d.ts.map +1 -1
  102. package/dist/im/lark/client.js +45 -9
  103. package/dist/im/lark/client.js.map +1 -1
  104. package/dist/im/lark/event-dispatcher.d.ts +13 -0
  105. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  106. package/dist/im/lark/event-dispatcher.js +180 -11
  107. package/dist/im/lark/event-dispatcher.js.map +1 -1
  108. package/dist/im/lark/message-parser.d.ts +11 -0
  109. package/dist/im/lark/message-parser.d.ts.map +1 -1
  110. package/dist/im/lark/message-parser.js +2 -1
  111. package/dist/im/lark/message-parser.js.map +1 -1
  112. package/dist/im/lark/summary-command.d.ts +19 -0
  113. package/dist/im/lark/summary-command.d.ts.map +1 -0
  114. package/dist/im/lark/summary-command.js +276 -0
  115. package/dist/im/lark/summary-command.js.map +1 -0
  116. package/dist/mir-local-runtime.d.ts +40 -0
  117. package/dist/mir-local-runtime.d.ts.map +1 -1
  118. package/dist/mir-local-runtime.js +246 -52
  119. package/dist/mir-local-runtime.js.map +1 -1
  120. package/dist/mir-runner.js +26 -1
  121. package/dist/mir-runner.js.map +1 -1
  122. package/dist/services/card-prefs-store.d.ts +2 -2
  123. package/dist/services/card-prefs-store.d.ts.map +1 -1
  124. package/dist/services/card-prefs-store.js +5 -5
  125. package/dist/services/card-prefs-store.js.map +1 -1
  126. package/dist/services/chat-reply-mode-store.d.ts +6 -4
  127. package/dist/services/chat-reply-mode-store.d.ts.map +1 -1
  128. package/dist/services/chat-reply-mode-store.js +6 -4
  129. package/dist/services/chat-reply-mode-store.js.map +1 -1
  130. package/dist/services/pi-transcript.d.ts +19 -0
  131. package/dist/services/pi-transcript.d.ts.map +1 -0
  132. package/dist/services/pi-transcript.js +222 -0
  133. package/dist/services/pi-transcript.js.map +1 -0
  134. package/dist/services/summary-range-store.d.ts +21 -0
  135. package/dist/services/summary-range-store.d.ts.map +1 -0
  136. package/dist/services/summary-range-store.js +89 -0
  137. package/dist/services/summary-range-store.js.map +1 -0
  138. package/dist/services/trigger-types.d.ts +14 -2
  139. package/dist/services/trigger-types.d.ts.map +1 -1
  140. package/dist/services/trigger-types.js +15 -1
  141. package/dist/services/trigger-types.js.map +1 -1
  142. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  143. package/dist/setup/bot-config-editor.js +2 -0
  144. package/dist/setup/bot-config-editor.js.map +1 -1
  145. package/dist/types.d.ts +20 -1
  146. package/dist/types.d.ts.map +1 -1
  147. package/dist/utils/executable.d.ts +3 -0
  148. package/dist/utils/executable.d.ts.map +1 -0
  149. package/dist/utils/executable.js +24 -0
  150. package/dist/utils/executable.js.map +1 -0
  151. package/dist/worker.js +69 -5
  152. package/dist/worker.js.map +1 -1
  153. package/dist/workflows/definition.d.ts +8 -8
  154. package/dist/workflows/events/payloads.d.ts +10 -10
  155. package/dist/workflows/events/schema.d.ts +28 -28
  156. package/package.json +1 -1
@@ -919,6 +919,22 @@ button.primary {
919
919
  border: 1px solid var(--border-soft);
920
920
  }
921
921
 
922
+ .session-lock-badge {
923
+ display: inline-flex;
924
+ align-items: center;
925
+ min-height: 22px;
926
+ margin-left: 6px;
927
+ padding: 0 8px;
928
+ border-radius: var(--radius-sm);
929
+ border: 1px solid color-mix(in srgb, var(--warning) 38%, var(--border-soft));
930
+ background: color-mix(in srgb, var(--warning) 10%, var(--surface-muted));
931
+ color: var(--warning);
932
+ font-size: 11px;
933
+ font-weight: 800;
934
+ line-height: 1;
935
+ text-transform: uppercase;
936
+ }
937
+
922
938
  .cli-claude-code { background: #e8f0ff; color: #234fb4; border-color: #c8d9ff; }
923
939
  .cli-codex { background: #fff0df; color: #a14c11; border-color: #ffd8ad; }
924
940
  .cli-codex-app { background: #e9f7ff; color: #11638f; border-color: #bde4fa; }
@@ -1140,6 +1156,10 @@ button.primary {
1140
1156
  background: color-mix(in srgb, var(--accent) 5%, var(--surface-raised));
1141
1157
  }
1142
1158
 
1159
+ .session-card.locked {
1160
+ border-color: color-mix(in srgb, var(--warning) 45%, var(--border));
1161
+ }
1162
+
1143
1163
  @media (prefers-reduced-motion: reduce) {
1144
1164
  .session-card { animation: none; transition: none; }
1145
1165
  .session-board-needs-you h2::before { animation: none; }
@@ -1197,6 +1217,19 @@ button.primary {
1197
1217
  font-size: 12px;
1198
1218
  }
1199
1219
 
1220
+ .session-card-status-group,
1221
+ .drawer-status-line {
1222
+ display: inline-flex;
1223
+ align-items: center;
1224
+ gap: 6px;
1225
+ flex-wrap: wrap;
1226
+ }
1227
+
1228
+ .session-card-status-group .session-lock-badge,
1229
+ .drawer-status-line .session-lock-badge {
1230
+ margin-left: 0;
1231
+ }
1232
+
1200
1233
  .session-signal {
1201
1234
  display: inline-flex;
1202
1235
  align-items: center;
@@ -1487,6 +1520,10 @@ button.primary {
1487
1520
  background: color-mix(in srgb, var(--accent) 4%, var(--surface-raised));
1488
1521
  }
1489
1522
 
1523
+ .kanban-card.locked {
1524
+ border-color: color-mix(in srgb, var(--warning) 45%, var(--border));
1525
+ }
1526
+
1490
1527
  .kanban-card:focus-visible {
1491
1528
  outline: 2px solid var(--accent);
1492
1529
  outline-offset: 1px;
@@ -1873,6 +1910,11 @@ button.primary {
1873
1910
  border-color: var(--danger);
1874
1911
  background: color-mix(in srgb, var(--danger) 9%, var(--surface-raised));
1875
1912
  }
1913
+ .card-act.locked {
1914
+ color: var(--warning);
1915
+ border-color: color-mix(in srgb, var(--warning) 45%, var(--border));
1916
+ background: color-mix(in srgb, var(--warning) 8%, var(--surface-raised));
1917
+ }
1876
1918
  .card-act:active { transform: scale(0.9); }
1877
1919
 
1878
1920
  /* 终端访问药丸:左「终端」段(accent ghost·只读旁观) + 右「钥匙」段(accent 实心·
@@ -4216,6 +4258,11 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
4216
4258
  box-shadow: 0 0 8px color-mix(in srgb, var(--accent) 55%, transparent);
4217
4259
  flex: none;
4218
4260
  }
4261
+ .bd-summary-limits {
4262
+ display: grid;
4263
+ grid-template-columns: repeat(2, minmax(0, 1fr));
4264
+ gap: 10px;
4265
+ }
4219
4266
 
4220
4267
  .settings-grid {
4221
4268
  display: grid;
package/dist/dashboard.js CHANGED
@@ -475,8 +475,27 @@ function configuredCliIds() {
475
475
  return new Map();
476
476
  }
477
477
  }
478
+ function configuredBotAgentFields() {
479
+ try {
480
+ return new Map(loadBotConfigs().map(b => [b.larkAppId, {
481
+ cliId: b.cliId,
482
+ wrapperCli: b.wrapperCli,
483
+ model: b.model,
484
+ }]));
485
+ }
486
+ catch {
487
+ return new Map();
488
+ }
489
+ }
478
490
  function withConfiguredCliId(bot, ids) {
479
- return bot.cliId ? bot : { ...bot, cliId: ids.get(bot.larkAppId) };
491
+ const raw = ids.get(bot.larkAppId);
492
+ const fallback = typeof raw === 'string' ? { cliId: raw } : raw;
493
+ return {
494
+ ...bot,
495
+ cliId: bot.cliId || fallback?.cliId,
496
+ wrapperCli: bot.wrapperCli || fallback?.wrapperCli,
497
+ model: bot.model || fallback?.model,
498
+ };
480
499
  }
481
500
  function liveBots() {
482
501
  const ids = configuredCliIds();
@@ -1526,9 +1545,9 @@ const server = createServer(async (req, res) => {
1526
1545
  return jsonRes(res, 400, { ok: false, error: 'bad_request' });
1527
1546
  return jsonRes(res, 200, { ok: true, entry });
1528
1547
  }
1529
- // 看板放置 / 重命名:带 JSON body 的会话写操作,原样转发给 owner daemon。
1548
+ // 看板放置 / 重命名 / 锁定:带 JSON body 的会话写操作,原样转发给 owner daemon。
1530
1549
  // 不在公开读白名单内 → 只读访客在 decideDashboardAuth 已被 401。
1531
- if (req.method === 'POST' && (m = url.pathname.match(/^\/api\/sessions\/([^/]+)\/(board|rename)$/))) {
1550
+ if (req.method === 'POST' && (m = url.pathname.match(/^\/api\/sessions\/([^/]+)\/(board|rename|lock)$/))) {
1532
1551
  const sid = decodeURIComponent(m[1]);
1533
1552
  const op = m[2];
1534
1553
  const owner = aggregator.ownerOf(sid);
@@ -1894,8 +1913,8 @@ const server = createServer(async (req, res) => {
1894
1913
  // [{larkAppId, botName, defaultOncall, ...}]
1895
1914
  // PUT /api/bots/:appId/default-oncall — proxy to that bot's daemon
1896
1915
  if (req.method === 'GET' && url.pathname === '/api/bots') {
1897
- const cliIds = configuredCliIds();
1898
- const onlineBots = [...registry.list()].map(b => withConfiguredCliId(b, cliIds)).sort((a, b) => a.botIndex - b.botIndex);
1916
+ const agentFields = configuredBotAgentFields();
1917
+ const onlineBots = [...registry.list()].map(b => withConfiguredCliId(b, agentFields)).sort((a, b) => a.botIndex - b.botIndex);
1899
1918
  const out = await Promise.all(onlineBots.map(async (d) => {
1900
1919
  try {
1901
1920
  const r = await fetch(`http://127.0.0.1:${d.ipcPort}/api/bot-default-oncall`);
@@ -1903,7 +1922,13 @@ const server = createServer(async (req, res) => {
1903
1922
  return botDefaultsPayload(d, undefined, `http_${r.status}`);
1904
1923
  }
1905
1924
  const j = await r.json();
1906
- return botDefaultsPayload({ ...d, botName: d.botName ?? j.botName }, j);
1925
+ return botDefaultsPayload({
1926
+ ...d,
1927
+ botName: d.botName ?? j.botName,
1928
+ cliId: j.cliId || d.cliId,
1929
+ wrapperCli: j.wrapperCli || d.wrapperCli,
1930
+ model: j.model || d.model,
1931
+ }, j);
1907
1932
  }
1908
1933
  catch (e) {
1909
1934
  return botDefaultsPayload(d, undefined, e?.message ?? String(e));
@@ -1946,6 +1971,24 @@ const server = createServer(async (req, res) => {
1946
1971
  res.end(await upstream.text());
1947
1972
  return;
1948
1973
  }
1974
+ // PUT /api/bots/:appId/agent — proxy to that bot's daemon. Body
1975
+ // `{ cliId, model }`; cliId is the dashboard selection key.
1976
+ let mBotAgent;
1977
+ if (req.method === 'PUT' && (mBotAgent = url.pathname.match(/^\/api\/bots\/([^/]+)\/agent$/))) {
1978
+ const appId = decodeURIComponent(mBotAgent[1]);
1979
+ const chunks = [];
1980
+ for await (const c of req)
1981
+ chunks.push(c);
1982
+ const raw = Buffer.concat(chunks).toString('utf8') || '{}';
1983
+ const upstream = await proxyToDaemon(appId, `/api/bot-agent`, {
1984
+ method: 'PUT',
1985
+ headers: { 'content-type': 'application/json' },
1986
+ body: raw,
1987
+ });
1988
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
1989
+ res.end(await upstream.text());
1990
+ return;
1991
+ }
1949
1992
  // PUT /api/bots/:appId/skills — proxy to that bot's daemon. Body accepts
1950
1993
  // `{ action:'attach'|'detach', name }` or `{ action:'set', policy|null }`.
1951
1994
  let mBotSkills;
@@ -2071,6 +2114,41 @@ const server = createServer(async (req, res) => {
2071
2114
  res.end(await upstream.text());
2072
2115
  return;
2073
2116
  }
2117
+ // PUT /api/bots/:appId/summary-range — proxy to that bot's daemon. Body
2118
+ // `{ limit, sinceHours }`; daemon updates the explicit /summary range.
2119
+ let mBotSummaryRange;
2120
+ if (req.method === 'PUT' && (mBotSummaryRange = url.pathname.match(/^\/api\/bots\/([^/]+)\/summary-range$/))) {
2121
+ const appId = decodeURIComponent(mBotSummaryRange[1]);
2122
+ const chunks = [];
2123
+ for await (const c of req)
2124
+ chunks.push(c);
2125
+ const raw = Buffer.concat(chunks).toString('utf8') || '{}';
2126
+ const upstream = await proxyToDaemon(appId, `/api/bot-summary-range`, {
2127
+ method: 'PUT',
2128
+ headers: { 'content-type': 'application/json' },
2129
+ body: raw,
2130
+ });
2131
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
2132
+ res.end(await upstream.text());
2133
+ return;
2134
+ }
2135
+ // Backward-compatible alias from the short-lived keyword-trigger dashboard.
2136
+ let mBotSummaryTrigger;
2137
+ if (req.method === 'PUT' && (mBotSummaryTrigger = url.pathname.match(/^\/api\/bots\/([^/]+)\/summary-trigger$/))) {
2138
+ const appId = decodeURIComponent(mBotSummaryTrigger[1]);
2139
+ const chunks = [];
2140
+ for await (const c of req)
2141
+ chunks.push(c);
2142
+ const raw = Buffer.concat(chunks).toString('utf8') || '{}';
2143
+ const upstream = await proxyToDaemon(appId, `/api/bot-summary-trigger`, {
2144
+ method: 'PUT',
2145
+ headers: { 'content-type': 'application/json' },
2146
+ body: raw,
2147
+ });
2148
+ res.writeHead(upstream.status, { 'content-type': 'application/json' });
2149
+ res.end(await upstream.text());
2150
+ return;
2151
+ }
2074
2152
  // PUT /api/bots/:appId/p2p-mode — proxy to that bot's daemon. Body
2075
2153
  // `{ p2pMode: 'chat' | 'thread' }` ('chat' = flat continuous DM session;
2076
2154
  // anything else clears back to the per-message thread default).