dsh-project-room 0.2.1 → 0.2.2

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 (2) hide show
  1. package/client.js +68 -16
  2. package/package.json +1 -1
package/client.js CHANGED
@@ -387,15 +387,44 @@ window.__ModuleLoader__.load({
387
387
  }
388
388
  .pr-loose-msg { font-size: 10px; color: var(--dsw-alias-label-secondary); padding: 0 6px 6px; line-height: 1.5; flex: 0 0 auto; }
389
389
 
390
- /* 运行中快捷栏(对齐 AI-Agent-Hub):一行可折行的 pill,完成未读排在前面 */
391
- .pr-runbar { display: flex; flex-wrap: wrap; gap: 3px; padding: 2px 4px 6px; flex: 0 0 auto; }
390
+ /* 运行中快捷栏(对齐 AI-Agent-Hub):两段竖排 —— 上「运行中」、下「完成未读」 */
391
+ .pr-runbar { display: flex; flex-direction: column; gap: 4px; padding: 2px 4px 6px; flex: 0 0 auto; min-width: 0; }
392
+ /* 2026-11-11 用户令「快捷栏正在运行和完成未读的分开放」:
393
+ 每段 = 一行小标题(色点/✓ + 文案 + 计数)+ 可折行的 pill 区,段间用极细线分隔。 */
394
+ .pr-runbar-sec { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
395
+ .pr-runbar-sec + .pr-runbar-sec {
396
+ border-top: 1px solid var(--dsw-alias-border-l1);
397
+ padding-top: 3px;
398
+ }
399
+ .pr-runbar-sec-title {
400
+ display: flex; align-items: center; gap: 4px; min-width: 0;
401
+ padding: 0 2px; font-size: 9px; line-height: 1.4;
402
+ color: var(--dsw-alias-label-secondary); letter-spacing: .03em;
403
+ }
404
+ .pr-runbar-sec[data-kind="done"] .pr-runbar-sec-title { color: var(--dsw-alias-brand-primary); }
405
+ .pr-runbar-sec-dot {
406
+ width: 5px; height: 5px; border-radius: 50%; flex: 0 0 auto;
407
+ background: var(--dsw-alias-state-success-primary);
408
+ }
409
+ .pr-runbar-sec-check {
410
+ width: 10px; height: 10px; border-radius: 50%; flex: 0 0 auto;
411
+ display: inline-flex; align-items: center; justify-content: center;
412
+ background: var(--dsw-alias-brand-primary); color: #fff;
413
+ font-size: 8px; font-weight: 700; line-height: 1;
414
+ }
415
+ .pr-runbar-sec-label { flex: 0 0 auto; white-space: nowrap; }
416
+ .pr-runbar-sec-count {
417
+ flex: 0 0 auto; font-variant-numeric: tabular-nums; opacity: .75;
418
+ }
419
+ .pr-runbar-sec-body { display: flex; flex-wrap: wrap; gap: 3px; min-width: 0; }
392
420
  /* 快捷栏 pill 也显示分身:每个 pill 变成「按钮 + 树状子行」的竖排小单元,
393
421
  子行样式与侧栏芯片的 pr-clone-row / pr-tree-rail 完全一致。 */
394
422
  .pr-run-wrap { display: inline-flex; flex-direction: column; gap: 1px; align-items: flex-start; }
395
423
  .pr-run-clones { display: flex; flex-direction: column; gap: 1px; padding-left: 6px; margin: 0 0 1px; }
396
424
  .pr-run-clones .pr-clone-row { font-size: 9px; line-height: 1.4; }
397
425
  .pr-readall {
398
- flex: 0 0 auto; margin: 0 2px 0 0; padding: 1px 6px; border-radius: 8px;
426
+ /* 2026-11-11:一键已读搬进「完成未读」区的小标题里,靠右对齐 */
427
+ flex: 0 0 auto; margin: 0 0 0 auto; padding: 1px 6px; border-radius: 8px;
399
428
  border: 1px solid var(--dsw-alias-border-l1); background: transparent;
400
429
  color: var(--dsw-alias-brand-primary); font-size: 9.5px; line-height: 1.4;
401
430
  white-space: nowrap; cursor: pointer;
@@ -1078,8 +1107,13 @@ function summarizeMessage(raw) {
1078
1107
  });
1079
1108
  }, [groups, unreadMap]);
1080
1109
 
1110
+ // 2026-11-11 用户令「快捷栏正在运行和完成未读的分开放」:
1111
+ // 原来两种 pill 混在一个 flex 行里(完成未读还置顶排最前),用户扫一眼分不清谁在跑。
1112
+ // 现在拆成两个区、各带标题;渲染顺序按用户第二次要求 = **完成未读在上、运行中在下**。
1113
+ const runningGroups = runGroups.filter((group) => group.mode === 'running');
1114
+ const doneUnreadGroups = runGroups.filter((group) => group.mode === 'done');
1081
1115
  // 完成未读的组数(决定是否显示「全部已读」按钮)
1082
- const doneGroups = runGroups.filter((group) => group.mode === 'done').length;
1116
+ const doneGroups = doneUnreadGroups.length;
1083
1117
 
1084
1118
  const setPin = (name) => {
1085
1119
  const next = pinned.includes(name) ? pinned.filter((n) => n !== name) : [...pinned, name];
@@ -1494,19 +1528,37 @@ function summarizeMessage(raw) {
1494
1528
  renderNewProject(),
1495
1529
  renderSettings(),
1496
1530
  h('div', { className: 'pr-runbar' },
1497
- // 一键已读:仅当存在「✓完成」pill 时出现,点一下清空未读表(等价逐个点开)
1498
- doneGroups > 0
1499
- ? h('button', {
1500
- className: 'pr-readall',
1501
- title: `全部已读(清掉 ${doneGroups} 个完成待查看)`,
1502
- onClick: (event) => {
1503
- event.stopPropagation();
1504
- saveJson('projectRoom.unread', {});
1505
- setUnread({});
1506
- },
1507
- }, '全部已读')
1531
+ // ── 区①:完成未读(2026-11-11 用户令:这一区排在运行中前面;一键已读只清这一区)──
1532
+ doneUnreadGroups.length
1533
+ ? h('div', { className: 'pr-runbar-sec', 'data-kind': 'done' },
1534
+ h('div', { className: 'pr-runbar-sec-title' },
1535
+ h('span', { className: 'pr-runbar-sec-check' }, '✓'),
1536
+ h('span', { className: 'pr-runbar-sec-label' }, '完成未读'),
1537
+ h('span', { className: 'pr-runbar-sec-count' }, String(doneUnreadGroups.length)),
1538
+ h('button', {
1539
+ className: 'pr-readall',
1540
+ title: `全部已读(清掉 ${doneGroups} 个完成待查看)`,
1541
+ onClick: (event) => {
1542
+ event.stopPropagation();
1543
+ saveJson('projectRoom.unread', {});
1544
+ setUnread({});
1545
+ },
1546
+ }, '全部已读'),
1547
+ ),
1548
+ h('div', { className: 'pr-runbar-sec-body' }, doneUnreadGroups.map(renderRunPill)),
1549
+ )
1550
+ : null,
1551
+ // ── 区②:运行中 ──
1552
+ runningGroups.length
1553
+ ? h('div', { className: 'pr-runbar-sec', 'data-kind': 'running' },
1554
+ h('div', { className: 'pr-runbar-sec-title' },
1555
+ h('span', { className: 'pr-runbar-sec-dot', title: '有 agent 正在运行' }),
1556
+ h('span', { className: 'pr-runbar-sec-label' }, '运行中'),
1557
+ h('span', { className: 'pr-runbar-sec-count' }, String(runningGroups.length)),
1558
+ ),
1559
+ h('div', { className: 'pr-runbar-sec-body' }, runningGroups.map(renderRunPill)),
1560
+ )
1508
1561
  : null,
1509
- runGroups.map(renderRunPill),
1510
1562
  ),
1511
1563
  h('div', { className: 'pr-head' },
1512
1564
  h('span', { className: 'pr-head-title' }, 'Projects'),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-project-room",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "type": "module",
5
5
  "description": "Project rooms for DeepSeek Harness: group sessions into projects, see per-project runtime, and open a room with a shared board, task list, todo queue and message delivery to member sessions.",
6
6
  "main": "index.js",