botmux 2.71.4 → 2.72.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 (89) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +8 -93
  3. package/dist/cli.js.map +1 -1
  4. package/dist/core/ask-api.d.ts +2 -20
  5. package/dist/core/ask-api.d.ts.map +1 -1
  6. package/dist/core/ask-api.js +2 -25
  7. package/dist/core/ask-api.js.map +1 -1
  8. package/dist/core/ask-args.d.ts +3 -3
  9. package/dist/core/ask-args.js +3 -3
  10. package/dist/core/ask-broker.d.ts +3 -1
  11. package/dist/core/ask-broker.d.ts.map +1 -1
  12. package/dist/core/ask-broker.js +20 -5
  13. package/dist/core/ask-broker.js.map +1 -1
  14. package/dist/core/ask-types.d.ts +3 -8
  15. package/dist/core/ask-types.d.ts.map +1 -1
  16. package/dist/core/ask-types.js.map +1 -1
  17. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  18. package/dist/core/dashboard-ipc-server.js +134 -2
  19. package/dist/core/dashboard-ipc-server.js.map +1 -1
  20. package/dist/core/dashboard-rows.d.ts +4 -0
  21. package/dist/core/dashboard-rows.d.ts.map +1 -1
  22. package/dist/core/dashboard-rows.js +4 -0
  23. package/dist/core/dashboard-rows.js.map +1 -1
  24. package/dist/core/session-board.d.ts +9 -0
  25. package/dist/core/session-board.d.ts.map +1 -0
  26. package/dist/core/session-board.js +24 -0
  27. package/dist/core/session-board.js.map +1 -0
  28. package/dist/daemon.d.ts.map +1 -1
  29. package/dist/daemon.js +14 -35
  30. package/dist/daemon.js.map +1 -1
  31. package/dist/dashboard/federated-group-core.d.ts.map +1 -1
  32. package/dist/dashboard/federated-group-core.js +5 -0
  33. package/dist/dashboard/federated-group-core.js.map +1 -1
  34. package/dist/dashboard/federation-api.d.ts.map +1 -1
  35. package/dist/dashboard/federation-api.js +70 -1
  36. package/dist/dashboard/federation-api.js.map +1 -1
  37. package/dist/dashboard/federation-spoke-api.d.ts +16 -2
  38. package/dist/dashboard/federation-spoke-api.d.ts.map +1 -1
  39. package/dist/dashboard/federation-spoke-api.js +96 -3
  40. package/dist/dashboard/federation-spoke-api.js.map +1 -1
  41. package/dist/dashboard/web/app.d.ts.map +1 -1
  42. package/dist/dashboard/web/app.js +52 -0
  43. package/dist/dashboard/web/app.js.map +1 -1
  44. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  45. package/dist/dashboard/web/i18n.js +64 -0
  46. package/dist/dashboard/web/i18n.js.map +1 -1
  47. package/dist/dashboard/web/kanban-model.d.ts +19 -0
  48. package/dist/dashboard/web/kanban-model.d.ts.map +1 -0
  49. package/dist/dashboard/web/kanban-model.js +40 -0
  50. package/dist/dashboard/web/kanban-model.js.map +1 -0
  51. package/dist/dashboard/web/preferences.d.ts +12 -1
  52. package/dist/dashboard/web/preferences.d.ts.map +1 -1
  53. package/dist/dashboard/web/preferences.js +32 -1
  54. package/dist/dashboard/web/preferences.js.map +1 -1
  55. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  56. package/dist/dashboard/web/sessions.js +1059 -10
  57. package/dist/dashboard/web/sessions.js.map +1 -1
  58. package/dist/dashboard-web/app.js +519 -433
  59. package/dist/dashboard-web/index.html +3 -0
  60. package/dist/dashboard-web/style.css +692 -1
  61. package/dist/dashboard.js +72 -3
  62. package/dist/dashboard.js.map +1 -1
  63. package/dist/i18n/en.d.ts.map +1 -1
  64. package/dist/i18n/en.js +1 -0
  65. package/dist/i18n/en.js.map +1 -1
  66. package/dist/i18n/zh.d.ts.map +1 -1
  67. package/dist/i18n/zh.js +1 -0
  68. package/dist/i18n/zh.js.map +1 -1
  69. package/dist/im/lark/ask-card.js +4 -7
  70. package/dist/im/lark/ask-card.js.map +1 -1
  71. package/dist/im/lark/client.d.ts +8 -0
  72. package/dist/im/lark/client.d.ts.map +1 -1
  73. package/dist/im/lark/client.js +32 -0
  74. package/dist/im/lark/client.js.map +1 -1
  75. package/dist/services/team-board-store.d.ts +33 -0
  76. package/dist/services/team-board-store.d.ts.map +1 -0
  77. package/dist/services/team-board-store.js +88 -0
  78. package/dist/services/team-board-store.js.map +1 -0
  79. package/dist/services/team-groups-store.d.ts +8 -0
  80. package/dist/services/team-groups-store.d.ts.map +1 -0
  81. package/dist/services/team-groups-store.js +31 -0
  82. package/dist/services/team-groups-store.js.map +1 -0
  83. package/dist/setup/bot-config-editor.d.ts +3 -2
  84. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  85. package/dist/setup/bot-config-editor.js +1 -2
  86. package/dist/setup/bot-config-editor.js.map +1 -1
  87. package/dist/types.d.ts +5 -0
  88. package/dist/types.d.ts.map +1 -1
  89. package/package.json +1 -1
@@ -32,6 +32,9 @@
32
32
  </nav>
33
33
  <div class="sidebar-foot">
34
34
  <span id="status" class="connection-status"></span>
35
+ <button type="button" id="sidebar-toggle" class="sidebar-toggle" aria-label="Toggle sidebar">
36
+ <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M9.8 3.5 5.3 8l4.5 4.5"/></svg>
37
+ </button>
35
38
  </div>
36
39
  </aside>
37
40
  <div class="workspace">
@@ -158,6 +158,77 @@ a { color: inherit; }
158
158
  .sidebar-foot {
159
159
  margin-top: auto;
160
160
  padding: 10px 8px 4px;
161
+ display: flex;
162
+ align-items: center;
163
+ justify-content: space-between;
164
+ gap: 8px;
165
+ }
166
+
167
+ .sidebar-toggle {
168
+ flex: none;
169
+ width: 28px;
170
+ height: 28px;
171
+ min-height: 28px;
172
+ padding: 0;
173
+ display: inline-flex;
174
+ align-items: center;
175
+ justify-content: center;
176
+ border: 1px solid var(--border-soft);
177
+ border-radius: var(--radius-sm);
178
+ background: transparent;
179
+ color: var(--muted);
180
+ cursor: pointer;
181
+ }
182
+
183
+ .sidebar-toggle:hover {
184
+ background: var(--surface-muted);
185
+ color: var(--fg);
186
+ }
187
+
188
+ .sidebar-toggle svg {
189
+ width: 14px;
190
+ height: 14px;
191
+ display: block;
192
+ fill: none;
193
+ stroke: currentColor;
194
+ stroke-width: 1.6;
195
+ stroke-linecap: round;
196
+ stroke-linejoin: round;
197
+ transition: transform 160ms ease;
198
+ }
199
+
200
+ /* 收起态:侧栏收窄成图标栏(只在桌面布局生效;窄屏侧栏本来就折成顶栏) */
201
+ @media (min-width: 981px) {
202
+ :root[data-sidebar="collapsed"] {
203
+ --sidebar-width: 68px;
204
+ }
205
+ :root[data-sidebar="collapsed"] .sidebar {
206
+ padding: 18px 10px;
207
+ }
208
+ :root[data-sidebar="collapsed"] .brand {
209
+ justify-content: center;
210
+ padding: 8px 0;
211
+ }
212
+ :root[data-sidebar="collapsed"] .brand > span:not(.brand-mark) {
213
+ display: none;
214
+ }
215
+ :root[data-sidebar="collapsed"] .sidebar-nav a {
216
+ justify-content: center;
217
+ padding: 8px;
218
+ }
219
+ :root[data-sidebar="collapsed"] .sidebar-nav a span {
220
+ display: none;
221
+ }
222
+ :root[data-sidebar="collapsed"] .connection-status {
223
+ display: none;
224
+ }
225
+ :root[data-sidebar="collapsed"] .sidebar-foot {
226
+ justify-content: center;
227
+ padding: 10px 0 4px;
228
+ }
229
+ :root[data-sidebar="collapsed"] .sidebar-toggle svg {
230
+ transform: rotate(180deg);
231
+ }
161
232
  }
162
233
 
163
234
  .connection-status {
@@ -315,7 +386,8 @@ a { color: inherit; }
315
386
 
316
387
  main {
317
388
  width: 100%;
318
- max-width: 1480px;
389
+ /* 不设上限:收起侧栏腾出的宽度交还内容区(看板/表格都按容器弹性布局)。 */
390
+ max-width: none;
319
391
  padding: 24px;
320
392
  }
321
393
 
@@ -1141,6 +1213,609 @@ button.primary {
1141
1213
  font-size: 12px;
1142
1214
  }
1143
1215
 
1216
+ /* ── 看板视图(multica Issues 风格):横排状态列 + 简洁卡片 ─────────────────── */
1217
+ .sessions-kanban {
1218
+ display: flex;
1219
+ align-items: stretch;
1220
+ gap: 12px;
1221
+ overflow-x: auto;
1222
+ padding: 4px 2px 12px;
1223
+ }
1224
+
1225
+ .sessions-kanban[hidden] {
1226
+ display: none;
1227
+ }
1228
+
1229
+ .kanban-column {
1230
+ /* 弹性等分而非固定 280px:5 列在任何视口宽度下收缩到容器内,
1231
+ 不再把页面撑出横向滚动条(极窄屏由媒体查询改纵向堆叠兜底)。 */
1232
+ flex: 1 1 0;
1233
+ min-width: 0;
1234
+ display: flex;
1235
+ flex-direction: column;
1236
+ min-height: 320px;
1237
+ max-height: calc(100vh - 250px);
1238
+ border: 1px solid var(--border-soft);
1239
+ border-radius: 12px;
1240
+ background: color-mix(in srgb, var(--surface-muted) 72%, transparent);
1241
+ }
1242
+
1243
+ .kanban-column > header {
1244
+ flex: none;
1245
+ display: flex;
1246
+ align-items: center;
1247
+ gap: 7px;
1248
+ padding: 10px 12px 8px;
1249
+ }
1250
+
1251
+ .kanban-col-icon {
1252
+ display: inline-flex;
1253
+ flex: none;
1254
+ }
1255
+
1256
+ .kanban-col-icon svg {
1257
+ width: 14px;
1258
+ height: 14px;
1259
+ display: block;
1260
+ }
1261
+
1262
+ .kanban-column h2 {
1263
+ margin: 0;
1264
+ font-size: 13px;
1265
+ font-weight: 700;
1266
+ line-height: 1.4;
1267
+ }
1268
+
1269
+ .kanban-col-count {
1270
+ color: var(--muted);
1271
+ font-size: 12px;
1272
+ font-variant-numeric: tabular-nums;
1273
+ }
1274
+
1275
+ /* 视图控件排布:团队筛选 + 分组维度切换 + 视图切换并排(窄屏自动换行) */
1276
+ .sessions-view-controls {
1277
+ display: flex;
1278
+ align-items: center;
1279
+ justify-content: flex-end;
1280
+ gap: 8px;
1281
+ flex-wrap: wrap;
1282
+ }
1283
+
1284
+ /* .segmented 自带 display:inline-flex 会盖掉 [hidden] 的 UA 样式——显式补回 */
1285
+ .sessions-view-controls [hidden] {
1286
+ display: none !important;
1287
+ }
1288
+
1289
+ /* 团队下拉做成与右侧 .segmented 同款胶囊:同高、同边框、圆角 999,
1290
+ 去掉原生箭头换内嵌 chevron */
1291
+ .kanban-team-select {
1292
+ appearance: none;
1293
+ -webkit-appearance: none;
1294
+ max-width: 200px;
1295
+ min-height: 38px;
1296
+ padding: 0 30px 0 14px;
1297
+ border: 1px solid var(--border);
1298
+ border-radius: 999px;
1299
+ background-color: var(--surface);
1300
+ color: var(--fg);
1301
+ font: inherit;
1302
+ font-size: 13px;
1303
+ font-weight: 600;
1304
+ line-height: 1;
1305
+ cursor: pointer;
1306
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2.6 4.4 6 7.8l3.4-3.4' fill='none' stroke='%238b98aa' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
1307
+ background-repeat: no-repeat;
1308
+ background-position: right 12px center;
1309
+ background-size: 12px;
1310
+ }
1311
+
1312
+ .kanban-team-select:hover {
1313
+ background-color: var(--surface-muted);
1314
+ }
1315
+
1316
+ .kanban-team-select:focus-visible {
1317
+ outline: 2px solid var(--accent);
1318
+ outline-offset: 1px;
1319
+ }
1320
+
1321
+ /* 团队筛选范围统计:让"筛掉了什么"可见 */
1322
+ .kanban-team-stats {
1323
+ color: var(--muted);
1324
+ font-size: 12px;
1325
+ white-space: nowrap;
1326
+ }
1327
+
1328
+ /* 团队清单加载中的整板占位(替代裸文本) */
1329
+ .kanban-loading {
1330
+ flex: 1;
1331
+ min-height: 220px;
1332
+ display: grid;
1333
+ place-items: center;
1334
+ color: var(--faint);
1335
+ font-size: 13px;
1336
+ border: 1px dashed var(--border);
1337
+ border-radius: 12px;
1338
+ }
1339
+
1340
+ .kanban-team-select:disabled {
1341
+ opacity: 0.7;
1342
+ cursor: default;
1343
+ }
1344
+
1345
+ /* 对方部署的会话卡:来源徽章 + 虚线边框区分快照身份 */
1346
+ .kanban-remote-badge {
1347
+ background: color-mix(in srgb, var(--accent) 12%, var(--surface-muted));
1348
+ color: var(--accent-strong);
1349
+ white-space: nowrap;
1350
+ flex: none;
1351
+ }
1352
+
1353
+ .kanban-card-remote {
1354
+ border-style: dashed;
1355
+ }
1356
+
1357
+ /* 机器人视角:bot 多时列不再无限压缩——固定列宽 + 容器横向滚动 */
1358
+ .sessions-kanban.kanban-mode-bot .kanban-column {
1359
+ flex: 0 0 264px;
1360
+ }
1361
+
1362
+ /* 整簇拖拽 */
1363
+ .kanban-cluster > header {
1364
+ cursor: grab;
1365
+ }
1366
+
1367
+ .kanban-cluster.dragging {
1368
+ opacity: 0.45;
1369
+ }
1370
+
1371
+ /* 同群聚簇容器:虚线框 + 群名头,一眼看出卡片同属一个群 */
1372
+ .kanban-cluster {
1373
+ display: grid;
1374
+ gap: 6px;
1375
+ padding: 6px;
1376
+ border: 1px dashed color-mix(in srgb, var(--accent) 38%, var(--border));
1377
+ border-radius: 10px;
1378
+ background: color-mix(in srgb, var(--accent) 3%, transparent);
1379
+ }
1380
+
1381
+ .kanban-cluster > header {
1382
+ display: flex;
1383
+ align-items: center;
1384
+ gap: 6px;
1385
+ min-width: 0;
1386
+ padding: 0 2px;
1387
+ color: var(--muted);
1388
+ font-size: 11px;
1389
+ font-weight: 600;
1390
+ }
1391
+
1392
+ .kanban-cluster-name {
1393
+ min-width: 0;
1394
+ overflow: hidden;
1395
+ text-overflow: ellipsis;
1396
+ white-space: nowrap;
1397
+ }
1398
+
1399
+ .kanban-cluster-count {
1400
+ flex: none;
1401
+ padding: 1px 7px;
1402
+ border-radius: 999px;
1403
+ background: var(--surface-muted);
1404
+ color: var(--muted);
1405
+ font-variant-numeric: tabular-nums;
1406
+ }
1407
+
1408
+ /* 团队模式列头:bot 头像替代状态图标 */
1409
+ .kanban-col-avatar {
1410
+ display: inline-flex;
1411
+ flex: none;
1412
+ }
1413
+
1414
+ .kanban-backlog .kanban-col-icon { color: var(--faint); }
1415
+ .kanban-todo .kanban-col-icon { color: var(--muted); }
1416
+ .kanban-in_progress .kanban-col-icon { color: var(--warning); }
1417
+ .kanban-in_review .kanban-col-icon { color: var(--success); }
1418
+ .kanban-done .kanban-col-icon { color: var(--accent); }
1419
+
1420
+ /* 拖拽视觉:目标列描边、插入位置在目标卡上沿画一条插入线、拖拽源半透明 */
1421
+ .kanban-column.drag-over {
1422
+ border-color: color-mix(in srgb, var(--accent) 55%, var(--border));
1423
+ }
1424
+
1425
+ .kanban-card.dragging {
1426
+ opacity: 0.45;
1427
+ }
1428
+
1429
+ .kanban-card.drop-before {
1430
+ box-shadow: 0 -2px 0 0 var(--accent);
1431
+ }
1432
+
1433
+ .kanban-col-list {
1434
+ flex: 1;
1435
+ min-height: 0;
1436
+ display: grid;
1437
+ gap: 8px;
1438
+ align-content: start;
1439
+ padding: 2px 8px 10px;
1440
+ overflow-y: auto;
1441
+ }
1442
+
1443
+ .kanban-col-empty {
1444
+ padding: 32px 0;
1445
+ color: var(--faint);
1446
+ font-size: 12px;
1447
+ text-align: center;
1448
+ }
1449
+
1450
+ .kanban-col-more {
1451
+ padding: 6px 0 2px;
1452
+ color: var(--faint);
1453
+ font-size: 11px;
1454
+ text-align: center;
1455
+ }
1456
+
1457
+ .kanban-card {
1458
+ display: grid;
1459
+ gap: 6px;
1460
+ padding: 12px 10px;
1461
+ border: 1px solid var(--border);
1462
+ border-radius: 8px;
1463
+ background: var(--surface-raised);
1464
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
1465
+ cursor: pointer;
1466
+ transition: border-color 120ms ease, background 120ms ease;
1467
+ }
1468
+
1469
+ .kanban-card:hover {
1470
+ border-color: color-mix(in srgb, var(--accent) 45%, var(--border));
1471
+ background: color-mix(in srgb, var(--accent) 4%, var(--surface-raised));
1472
+ }
1473
+
1474
+ .kanban-card:focus-visible {
1475
+ outline: 2px solid var(--accent);
1476
+ outline-offset: 1px;
1477
+ }
1478
+
1479
+ .kanban-card-top {
1480
+ display: flex;
1481
+ align-items: center;
1482
+ gap: 6px;
1483
+ min-width: 0;
1484
+ }
1485
+
1486
+ /* CLI 徽章别折行(claude-code 之类带连字符的会被 280px 卡片拆成两行) */
1487
+ .kanban-card-top .badge {
1488
+ white-space: nowrap;
1489
+ flex: none;
1490
+ }
1491
+
1492
+ /* 右上角动作区:运行状态点常显;重命名/详情按钮平时隐身,悬停/聚焦才浮现 */
1493
+ .kanban-card-top-right {
1494
+ margin-left: auto;
1495
+ display: inline-flex;
1496
+ align-items: center;
1497
+ gap: 4px;
1498
+ }
1499
+
1500
+ .kanban-card-dot {
1501
+ width: 8px;
1502
+ height: 8px;
1503
+ border-radius: 50%;
1504
+ background: var(--faint);
1505
+ flex: none;
1506
+ }
1507
+
1508
+ .kanban-card-dot[data-status="working"],
1509
+ .kanban-card-dot[data-status="analyzing"],
1510
+ .kanban-card-dot[data-status="active"] {
1511
+ background: var(--success);
1512
+ }
1513
+
1514
+ .kanban-card-dot[data-status="starting"] {
1515
+ background: var(--warning);
1516
+ }
1517
+
1518
+ .kanban-card-dot[data-status="limited"] {
1519
+ background: var(--danger);
1520
+ }
1521
+
1522
+ .kanban-card-dot[data-status="closed"] {
1523
+ background: var(--border);
1524
+ }
1525
+
1526
+ /* 选择器带上 .kanban-card 提特异性:通用 .card-act 基础规则(display/尺寸)
1527
+ 定义在本节之后,同特异性会反杀这里的覆盖。 */
1528
+ .kanban-card .kanban-card-act {
1529
+ width: 24px;
1530
+ height: 24px;
1531
+ min-height: 24px;
1532
+ /* 不悬停时彻底不占位(opacity:0 仍会把短 ID 永久挤成省略号) */
1533
+ display: none;
1534
+ }
1535
+
1536
+ .kanban-card:hover .kanban-card-act,
1537
+ .kanban-card:focus-within .kanban-card-act {
1538
+ display: inline-flex;
1539
+ }
1540
+
1541
+ /* 标题就地编辑输入框:占标题原位,不撑破卡片 */
1542
+ .kanban-rename-input {
1543
+ width: 100%;
1544
+ min-width: 0;
1545
+ margin: 0;
1546
+ padding: 2px 6px;
1547
+ border: 1px solid var(--accent);
1548
+ border-radius: 6px;
1549
+ background: var(--surface);
1550
+ color: var(--fg);
1551
+ font-size: 13px;
1552
+ font-weight: 600;
1553
+ line-height: 1.45;
1554
+ }
1555
+
1556
+ .kanban-card-title {
1557
+ margin: 0;
1558
+ color: var(--fg);
1559
+ font-size: 13px;
1560
+ font-weight: 600;
1561
+ line-height: 1.45;
1562
+ display: -webkit-box;
1563
+ -webkit-line-clamp: 2;
1564
+ -webkit-box-orient: vertical;
1565
+ overflow: hidden;
1566
+ }
1567
+
1568
+ .kanban-card-desc {
1569
+ margin: 0;
1570
+ color: var(--muted);
1571
+ font-size: 12px;
1572
+ white-space: nowrap;
1573
+ overflow: hidden;
1574
+ text-overflow: ellipsis;
1575
+ }
1576
+
1577
+ .kanban-card-foot {
1578
+ display: flex;
1579
+ align-items: center;
1580
+ justify-content: space-between;
1581
+ gap: 8px;
1582
+ margin-top: 2px;
1583
+ min-width: 0;
1584
+ }
1585
+
1586
+ .kanban-card-owner {
1587
+ display: inline-flex;
1588
+ align-items: center;
1589
+ gap: 6px;
1590
+ min-width: 0;
1591
+ color: var(--fg);
1592
+ font-size: 12px;
1593
+ }
1594
+
1595
+ .kanban-card-owner > span:last-child {
1596
+ overflow: hidden;
1597
+ text-overflow: ellipsis;
1598
+ white-space: nowrap;
1599
+ }
1600
+
1601
+ .kanban-card-updated {
1602
+ flex: none;
1603
+ color: var(--faint);
1604
+ font-size: 11px;
1605
+ }
1606
+
1607
+ /* ── 页面内终端弹窗(看板卡片点击落点)───────────────────────────────────── */
1608
+ .term-modal {
1609
+ width: min(1560px, 96vw);
1610
+ height: min(88vh, 1100px);
1611
+ max-height: calc(100vh - 24px);
1612
+ padding: 0;
1613
+ overflow: hidden;
1614
+ }
1615
+
1616
+ .term-modal[open] {
1617
+ display: flex;
1618
+ flex-direction: column;
1619
+ }
1620
+
1621
+ .term-modal-head {
1622
+ flex: none;
1623
+ display: flex;
1624
+ align-items: center;
1625
+ justify-content: space-between;
1626
+ gap: 10px;
1627
+ padding: 10px 12px;
1628
+ border-bottom: 1px solid var(--border-soft);
1629
+ }
1630
+
1631
+ .term-modal-title {
1632
+ display: inline-flex;
1633
+ align-items: center;
1634
+ gap: 8px;
1635
+ min-width: 0;
1636
+ }
1637
+
1638
+ .term-modal-title strong {
1639
+ font-size: 13px;
1640
+ overflow: hidden;
1641
+ text-overflow: ellipsis;
1642
+ white-space: nowrap;
1643
+ }
1644
+
1645
+ /* 终端弹窗标题旁的铅笔:常显小尺寸,与 card-act 一致 */
1646
+ .term-modal-title .card-act {
1647
+ width: 26px;
1648
+ height: 26px;
1649
+ min-height: 26px;
1650
+ flex: none;
1651
+ }
1652
+
1653
+ /* 标题就地编辑输入框:宽度由 JS 按内容实测设定(fitInput),这里只给兜底上限 */
1654
+ .term-modal-name-input {
1655
+ max-width: 60vw;
1656
+ margin: 0;
1657
+ padding: 3px 8px;
1658
+ border: 1px solid var(--accent);
1659
+ border-radius: 6px;
1660
+ background: var(--surface);
1661
+ color: var(--fg);
1662
+ font-size: 13px;
1663
+ font-weight: 600;
1664
+ }
1665
+
1666
+ .term-modal-actions {
1667
+ flex: none;
1668
+ display: inline-flex;
1669
+ align-items: center;
1670
+ gap: 6px;
1671
+ }
1672
+
1673
+ .term-modal-body {
1674
+ flex: 1;
1675
+ min-height: 0;
1676
+ display: flex;
1677
+ }
1678
+
1679
+ .term-modal-frame {
1680
+ flex: 1;
1681
+ width: 100%;
1682
+ height: 100%;
1683
+ border: 0;
1684
+ background: #000;
1685
+ }
1686
+
1687
+ .term-modal-loading {
1688
+ margin: auto;
1689
+ color: var(--faint);
1690
+ font-size: 13px;
1691
+ }
1692
+
1693
+ /* ── 会话历史弹窗:飞书式左右气泡 ─────────────────────────────────────────── */
1694
+ .history-modal {
1695
+ width: min(860px, 94vw);
1696
+ height: min(82vh, 900px);
1697
+ max-height: calc(100vh - 24px);
1698
+ padding: 0;
1699
+ overflow: hidden;
1700
+ }
1701
+
1702
+ .history-modal[open] {
1703
+ display: flex;
1704
+ flex-direction: column;
1705
+ }
1706
+
1707
+ .history-scope-tag {
1708
+ flex: none;
1709
+ padding: 2px 8px;
1710
+ border-radius: 999px;
1711
+ background: var(--surface-muted);
1712
+ color: var(--muted);
1713
+ font-size: 11px;
1714
+ }
1715
+
1716
+ .history-body {
1717
+ flex: 1;
1718
+ min-height: 0;
1719
+ display: flex;
1720
+ flex-direction: column;
1721
+ overflow-y: auto;
1722
+ padding: 14px 16px;
1723
+ background: var(--bg-soft);
1724
+ }
1725
+
1726
+ .history-list {
1727
+ display: grid;
1728
+ gap: 12px;
1729
+ }
1730
+
1731
+ .history-msg {
1732
+ display: flex;
1733
+ gap: 8px;
1734
+ align-items: flex-start;
1735
+ max-width: 82%;
1736
+ }
1737
+
1738
+ .history-msg.mine {
1739
+ margin-left: auto;
1740
+ flex-direction: row-reverse;
1741
+ }
1742
+
1743
+ .history-msg-main {
1744
+ min-width: 0;
1745
+ }
1746
+
1747
+ .history-msg-meta {
1748
+ display: flex;
1749
+ gap: 8px;
1750
+ margin-bottom: 3px;
1751
+ color: var(--faint);
1752
+ font-size: 11px;
1753
+ }
1754
+
1755
+ .history-msg.mine .history-msg-meta {
1756
+ justify-content: flex-end;
1757
+ }
1758
+
1759
+ .history-bubble {
1760
+ padding: 8px 11px;
1761
+ border-radius: 10px;
1762
+ border: 1px solid var(--border-soft);
1763
+ background: var(--surface-raised);
1764
+ color: var(--fg);
1765
+ font-size: 13px;
1766
+ line-height: 1.55;
1767
+ white-space: pre-wrap;
1768
+ overflow-wrap: anywhere;
1769
+ }
1770
+
1771
+ .history-msg.mine .history-bubble {
1772
+ background: var(--accent-soft);
1773
+ border-color: color-mix(in srgb, var(--accent) 30%, transparent);
1774
+ }
1775
+
1776
+ .history-avatar-user {
1777
+ flex: none;
1778
+ width: 24px;
1779
+ height: 24px;
1780
+ display: inline-flex;
1781
+ align-items: center;
1782
+ justify-content: center;
1783
+ border-radius: 50%;
1784
+ background: var(--accent);
1785
+ color: var(--on-accent);
1786
+ font-size: 12px;
1787
+ }
1788
+
1789
+ /* 真人头像(contact API 拿到的)——与首字圆同尺寸 */
1790
+ .history-avatar-img {
1791
+ flex: none;
1792
+ width: 24px;
1793
+ height: 24px;
1794
+ border-radius: 50%;
1795
+ object-fit: cover;
1796
+ }
1797
+
1798
+ /* 左上角 brand 的 owner 头像:盖满 brand-mark 方块 */
1799
+ .brand-mark {
1800
+ position: relative;
1801
+ overflow: hidden;
1802
+ }
1803
+
1804
+ .brand-owner-img {
1805
+ position: absolute;
1806
+ inset: 0;
1807
+ width: 100%;
1808
+ height: 100%;
1809
+ object-fit: cover;
1810
+ border-radius: inherit;
1811
+ }
1812
+
1813
+ .history-error {
1814
+ margin: auto;
1815
+ color: var(--faint);
1816
+ font-size: 13px;
1817
+ }
1818
+
1144
1819
  /* 图标方按钮:会话卡片操作行一排,也被详情抽屉 .actions 复用(chat-scope 的
1145
1820
  「打开群聊」走同一个 .card-act)。图标宽度与语言无关,en/zh 都稳定一行,修掉了
1146
1821
  EN 文案更宽把「关闭」挤下行的崩布局。基础按钮外观放在通用 .card-act 选择器上,
@@ -1668,6 +2343,22 @@ input.row-select,
1668
2343
  .sessions-board {
1669
2344
  grid-template-columns: 1fr;
1670
2345
  }
2346
+ /* 窄屏看板:列改纵向堆叠,高度交还内容 */
2347
+ .sessions-kanban {
2348
+ flex-direction: column;
2349
+ }
2350
+ .kanban-column {
2351
+ flex: none;
2352
+ min-height: 0;
2353
+ max-height: none;
2354
+ }
2355
+ .kanban-col-list {
2356
+ overflow-y: visible;
2357
+ }
2358
+ .term-modal {
2359
+ width: calc(100vw - 16px);
2360
+ height: calc(100vh - 24px);
2361
+ }
1671
2362
  .filter-check-group {
1672
2363
  grid-template-columns: repeat(2, minmax(0, 1fr));
1673
2364
  }