dsh-project-room 0.2.1 → 0.2.3
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.
- package/client.js +68 -16
- 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
|
|
391
|
-
.pr-runbar { display: flex; flex-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
//
|
|
1498
|
-
|
|
1499
|
-
? h('
|
|
1500
|
-
className: 'pr-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
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.
|
|
3
|
+
"version": "0.2.3",
|
|
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",
|