dsh-project-room 0.2.5 → 0.2.7

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 (3) hide show
  1. package/README.md +10 -0
  2. package/client.js +51 -51
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -56,6 +56,16 @@
56
56
 
57
57
  ## 安装
58
58
 
59
+ ### 整套装(一条命令)
60
+
61
+ 想把 AI-Agent-Hub 这套插件一次装齐(本插件 + 另外 7 个 + 依赖闭包):
62
+
63
+ ```bash
64
+ npx dsh-hub-suite # 先看它要改什么:npx dsh-hub-suite --dry-run
65
+ ```
66
+
67
+ 需要 Node.js 18+;它会把依赖写进 DSH profile 的 `package.json`、安装依赖,并把包名登记进 `dsh.profile.bundles`。装完重启 DeepSeek Harness。
68
+
59
69
  ```sh
60
70
  dsh plugin --profile <profile> add dsh-project-room
61
71
  ```
package/client.js CHANGED
@@ -303,42 +303,42 @@ window.__ModuleLoader__.load({
303
303
  flex: 1; min-width: 0; height: 22px; box-sizing: border-box; padding: 0 6px;
304
304
  border-radius: 6px; border: 1px solid var(--dsw-alias-border-l1);
305
305
  background: var(--dsw-alias-bg-layer-1); color: var(--dsw-alias-label-primary);
306
- font-size: 11px; outline: none;
306
+ font-size: calc(11px + var(--dsh-content-font-delta, 0px)); outline: none;
307
307
  }
308
308
  .pr-head { display: flex; align-items: center; gap: 6px; padding: 2px 6px 4px; flex: 0 0 auto; }
309
- .pr-head-title { font-size: 11.5px; letter-spacing: 0.04em; font-weight: 600; color: var(--dsw-alias-label-secondary); }
310
- .pr-head-count { font-size: 10px; color: var(--dsw-alias-label-secondary); opacity: .75; margin-left: auto; }
309
+ .pr-head-title { font-size: calc(11.5px + var(--dsh-content-font-delta, 0px)); letter-spacing: 0.04em; font-weight: 600; color: var(--dsw-alias-label-secondary); }
310
+ .pr-head-count { font-size: calc(10px + var(--dsh-content-font-delta, 0px)); color: var(--dsw-alias-label-secondary); opacity: .75; margin-left: auto; }
311
311
  /* 「未分组」那一行:折叠按钮 + 清理按钮 */
312
312
  .pr-loose-row { display: flex; gap: 4px; align-items: center; padding: 0 6px 6px; flex: 0 0 auto; }
313
313
  .pr-loose-toggle {
314
314
  padding: 1px 6px;
315
315
  border: 1px solid var(--dsw-alias-border-l1); border-radius: 6px;
316
316
  background: transparent; color: var(--dsw-alias-label-secondary);
317
- font-size: 10px; line-height: 1.6; cursor: pointer; flex: 0 0 auto;
317
+ font-size: calc(10px + var(--dsh-content-font-delta, 0px)); line-height: 1.6; cursor: pointer; flex: 0 0 auto;
318
318
  }
319
319
  .pr-loose-toggle:hover { background: var(--dsw-alias-bg-layer-2); color: var(--dsw-alias-label-primary); }
320
320
  .pr-chip-badge {
321
321
  flex: 0 0 auto; min-width: 14px; height: 14px; padding: 0 3px; border-radius: 7px;
322
322
  display: inline-flex; align-items: center; justify-content: center;
323
323
  background: var(--dsw-alias-bg-layer-2); color: var(--dsw-alias-label-secondary);
324
- font-size: 9px; line-height: 1; font-variant-numeric: tabular-nums;
324
+ font-size: calc(9px + var(--dsh-content-font-delta, 0px)); line-height: 1; font-variant-numeric: tabular-nums;
325
325
  }
326
- .pr-chip-elapsed { flex: 0 0 auto; font-size: 9px; line-height: 1; font-variant-numeric: tabular-nums; color: var(--dsw-alias-state-success-primary); }
326
+ .pr-chip-elapsed { flex: 0 0 auto; font-size: calc(9px + var(--dsh-content-font-delta, 0px)); line-height: 1; font-variant-numeric: tabular-nums; color: var(--dsw-alias-state-success-primary); }
327
327
  /* 分身子行:树状(├ / └ 竖线缩进) */
328
328
  .pr-chip-clones { display: flex; flex-direction: column; gap: 1px; margin-top: 1px; padding-left: 0; }
329
329
  .pr-clone-row {
330
330
  display: flex; align-items: center; gap: 3px;
331
- font-size: 9.5px; line-height: 1.5; color: var(--dsw-alias-label-secondary);
331
+ font-size: calc(9.5px + var(--dsh-content-font-delta, 0px)); line-height: 1.5; color: var(--dsw-alias-label-secondary);
332
332
  cursor: pointer; border-radius: 3px; padding: 0;
333
333
  }
334
334
  .pr-clone-row:hover { background: var(--dsw-alias-interactive-bg-hover, rgba(255,255,255,0.06)); color: var(--dsw-alias-label-primary); }
335
- .pr-tree-rail { flex: 0 0 auto; width: 7px; color: var(--dsw-alias-border-l2, #4a4a4a); font-size: 9px; line-height: 1.5; }
335
+ .pr-tree-rail { flex: 0 0 auto; width: 7px; color: var(--dsw-alias-border-l2, #4a4a4a); font-size: calc(9px + var(--dsh-content-font-delta, 0px)); line-height: 1.5; }
336
336
  .pr-clone-dot { flex: 0 0 auto; width: 5px; height: 5px; border-radius: 50%; background: transparent; box-shadow: inset 0 0 0 1px var(--dsw-alias-label-secondary); }
337
337
  .pr-clone-dot.on { background: var(--dsw-alias-state-success-primary, #4ade80); box-shadow: none; }
338
338
  /* 同理:分身子行名不再 ellipsis,长任务名完整显示(行高会自动撑开)。 */
339
339
  .pr-clone-name { min-width: 0; white-space: normal; overflow-wrap: anywhere; word-break: break-word; }
340
340
  .pr-clone-elapsed {
341
- flex: 0 0 auto; margin-left: 3px; font-size: 9px; line-height: 1;
341
+ flex: 0 0 auto; margin-left: 3px; font-size: calc(9px + var(--dsh-content-font-delta, 0px)); line-height: 1;
342
342
  font-variant-numeric: tabular-nums;
343
343
  color: var(--dsw-alias-state-success-primary);
344
344
  }
@@ -347,31 +347,31 @@ window.__ModuleLoader__.load({
347
347
  position: fixed; z-index: 1000; min-width: 168px; padding: 4px;
348
348
  border-radius: 8px; border: 1px solid var(--dsw-alias-border-l2);
349
349
  background: var(--dsw-alias-bg-layer-2); box-shadow: 0 12px 32px rgba(0,0,0,.45);
350
- font-size: 12px;
350
+ font-size: calc(12px + var(--dsh-content-font-delta, 0px));
351
351
  }
352
352
  .pr-menu-item {
353
353
  display: block; width: 100%; text-align: left; padding: 5px 8px; border: none; border-radius: 5px;
354
- background: transparent; color: var(--dsw-alias-label-primary); font: inherit; font-size: 12px; cursor: pointer;
354
+ background: transparent; color: var(--dsw-alias-label-primary); font: inherit; font-size: calc(12px + var(--dsh-content-font-delta, 0px)); cursor: pointer;
355
355
  }
356
356
  .pr-menu-item:hover { background: var(--dsw-alias-bg-layer-1); }
357
- .pr-menu-msg { padding: 4px 8px; font-size: 10.5px; color: var(--dsw-alias-label-secondary); }
357
+ .pr-menu-msg { padding: 4px 8px; font-size: calc(10.5px + var(--dsh-content-font-delta, 0px)); color: var(--dsw-alias-label-secondary); }
358
358
  .pr-modal { position: fixed; inset: 0; z-index: 1001; display: flex; align-items: center; justify-content: center; background: rgba(0,0,0,.45); }
359
359
  .pr-modal-box { width: min(420px, 88vw); padding: 14px; border-radius: 10px; background: var(--dsw-alias-bg-base); border: 1px solid var(--dsw-alias-border-l2); }
360
- .pr-modal-title { font-size: 13px; font-weight: 600; margin-bottom: 8px; }
361
- .pr-modal-input { width: 100%; box-sizing: border-box; height: 30px; padding: 0 8px; border-radius: 6px; border: 1px solid var(--dsw-alias-border-l1); background: var(--dsw-alias-bg-layer-1); color: var(--dsw-alias-label-primary); font-size: 12.5px; outline: none; }
360
+ .pr-modal-title { font-size: calc(13px + var(--dsh-content-font-delta, 0px)); font-weight: 600; margin-bottom: 8px; }
361
+ .pr-modal-input { width: 100%; box-sizing: border-box; height: 30px; padding: 0 8px; border-radius: 6px; border: 1px solid var(--dsw-alias-border-l1); background: var(--dsw-alias-bg-layer-1); color: var(--dsw-alias-label-primary); font-size: calc(12.5px + var(--dsh-content-font-delta, 0px)); outline: none; }
362
362
  .pr-modal-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 12px; }
363
363
  /* 头部「+ 新项目」按钮 */
364
364
  .pr-new-btn {
365
365
  flex: 0 0 auto; height: 18px; padding: 0 6px; border-radius: 5px;
366
366
  border: 1px solid var(--dsw-alias-border-l1); background: transparent;
367
- color: var(--dsw-alias-label-secondary); font-size: 10px; line-height: 1; cursor: pointer;
367
+ color: var(--dsw-alias-label-secondary); font-size: calc(10px + var(--dsh-content-font-delta, 0px)); line-height: 1; cursor: pointer;
368
368
  }
369
369
  .pr-new-btn:hover { background: var(--dsw-alias-bg-layer-2); color: var(--dsw-alias-label-primary); }
370
370
  /* 房间关闭按钮:显式带文字,避免全屏遮罩下只剩一个小图标找不着 */
371
371
  .pr-close-btn {
372
372
  flex: 0 0 auto; height: 22px; padding: 0 10px; border-radius: 6px;
373
373
  border: 1px solid var(--dsw-alias-border-l2); background: var(--dsw-alias-bg-layer-2);
374
- color: var(--dsw-alias-label-primary); font-size: 11.5px; line-height: 1; cursor: pointer;
374
+ color: var(--dsw-alias-label-primary); font-size: calc(11.5px + var(--dsh-content-font-delta, 0px)); line-height: 1; cursor: pointer;
375
375
  }
376
376
  .pr-close-btn:hover { border-color: var(--dsw-alias-brand-primary); }
377
377
  /* 一页三段布局 */
@@ -396,11 +396,11 @@ window.__ModuleLoader__.load({
396
396
  .pr-section { margin-bottom: 16px; }
397
397
  .pr-section:last-child { margin-bottom: 4px; }
398
398
  .pr-section-title {
399
- font-size: 11px; font-weight: 700; letter-spacing: .06em;
399
+ font-size: calc(11px + var(--dsh-content-font-delta, 0px)); font-weight: 700; letter-spacing: .06em;
400
400
  color: var(--dsw-alias-label-secondary); text-transform: uppercase;
401
401
  margin-bottom: 6px;
402
402
  }
403
- .pr-loose-msg { font-size: 10px; color: var(--dsw-alias-label-secondary); padding: 0 6px 6px; line-height: 1.5; flex: 0 0 auto; }
403
+ .pr-loose-msg { font-size: calc(10px + var(--dsh-content-font-delta, 0px)); color: var(--dsw-alias-label-secondary); padding: 0 6px 6px; line-height: 1.5; flex: 0 0 auto; }
404
404
 
405
405
  /* 运行中快捷栏(对齐 AI-Agent-Hub):两段竖排 —— 上「运行中」、下「完成未读」 */
406
406
  .pr-runbar { display: flex; flex-direction: column; gap: 4px; padding: 2px 4px 6px; flex: 0 0 auto; min-width: 0; }
@@ -413,7 +413,7 @@ window.__ModuleLoader__.load({
413
413
  }
414
414
  .pr-runbar-sec-title {
415
415
  display: flex; align-items: center; gap: 4px; min-width: 0;
416
- padding: 0 2px; font-size: 9px; line-height: 1.4;
416
+ padding: 0 2px; font-size: calc(9px + var(--dsh-content-font-delta, 0px)); line-height: 1.4;
417
417
  color: var(--dsw-alias-label-secondary); letter-spacing: .03em;
418
418
  }
419
419
  .pr-runbar-sec[data-kind="done"] .pr-runbar-sec-title { color: #d97757; }
@@ -425,7 +425,7 @@ window.__ModuleLoader__.load({
425
425
  width: 10px; height: 10px; border-radius: 50%; flex: 0 0 auto;
426
426
  display: inline-flex; align-items: center; justify-content: center;
427
427
  background: #d97757; color: #fff;
428
- font-size: 8px; font-weight: 700; line-height: 1;
428
+ font-size: calc(8px + var(--dsh-content-font-delta, 0px)); font-weight: 700; line-height: 1;
429
429
  }
430
430
  .pr-runbar-sec-label { flex: 0 0 auto; white-space: nowrap; }
431
431
  .pr-runbar-sec-count {
@@ -436,12 +436,12 @@ window.__ModuleLoader__.load({
436
436
  子行样式与侧栏芯片的 pr-clone-row / pr-tree-rail 完全一致。 */
437
437
  .pr-run-wrap { display: inline-flex; flex-direction: column; gap: 1px; align-items: flex-start; }
438
438
  .pr-run-clones { display: flex; flex-direction: column; gap: 1px; padding-left: 6px; margin: 0 0 1px; }
439
- .pr-run-clones .pr-clone-row { font-size: 9px; line-height: 1.4; }
439
+ .pr-run-clones .pr-clone-row { font-size: calc(9px + var(--dsh-content-font-delta, 0px)); line-height: 1.4; }
440
440
  .pr-readall {
441
441
  /* 2026-11-11:一键已读搬进「完成未读」区的小标题里,靠右对齐 */
442
442
  flex: 0 0 auto; margin: 0 0 0 auto; padding: 1px 6px; border-radius: 8px;
443
443
  border: 1px solid var(--dsw-alias-border-l1); background: transparent;
444
- color: #d97757; font-size: 9.5px; line-height: 1.4;
444
+ color: #d97757; font-size: calc(9.5px + var(--dsh-content-font-delta, 0px)); line-height: 1.4;
445
445
  white-space: nowrap; cursor: pointer;
446
446
  }
447
447
  .pr-readall:hover { background: var(--dsw-alias-bg-layer-2); }
@@ -451,7 +451,7 @@ window.__ModuleLoader__.load({
451
451
  min-height: 20px; padding: 2px 7px 2px 3px; border-radius: 11px;
452
452
  border: 1px solid transparent; background: transparent;
453
453
  color: var(--dsw-alias-label-secondary);
454
- font: inherit; font-size: 11.5px; line-height: 1.2; white-space: nowrap; cursor: pointer;
454
+ font: inherit; font-size: calc(11.5px + var(--dsh-content-font-delta, 0px)); line-height: 1.2; white-space: nowrap; cursor: pointer;
455
455
  }
456
456
  .pr-run-pill:hover { background: var(--dsw-alias-bg-layer-1); }
457
457
  .pr-run-pill[data-active="1"] {
@@ -462,28 +462,28 @@ window.__ModuleLoader__.load({
462
462
  .pr-run-avatar { width: 16px; height: 16px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; line-height: 1; }
463
463
  .pr-run-project { display: inline-flex; align-items: center; gap: 3px; flex: 0 0 auto; min-width: 0; }
464
464
  .pr-run-project-dot { width: 6px; height: 6px; border-radius: 2px; flex: 0 0 auto; }
465
- .pr-run-project-name { font-size: 9px; line-height: 1; font-variant-numeric: tabular-nums; white-space: nowrap; }
465
+ .pr-run-project-name { font-size: calc(9px + var(--dsh-content-font-delta, 0px)); line-height: 1; font-variant-numeric: tabular-nums; white-space: nowrap; }
466
466
  /* 2026-11-09 用户令「标题要显示全」:快捷栏 pill 名字原来 nowrap+ellipsis 会被吃掉,改为可换行。 */
467
467
  .pr-run-name { min-width: 0; flex: 0 1 auto; white-space: normal; overflow-wrap: anywhere; word-break: break-word; }
468
468
  .pr-run-badge {
469
469
  flex: 0 0 auto; min-width: 14px; height: 14px; padding: 0 3px; border-radius: 7px;
470
470
  display: inline-flex; align-items: center; justify-content: center;
471
471
  background: var(--dsw-alias-bg-layer-2); color: var(--dsw-alias-label-secondary);
472
- font-size: 9px; line-height: 1; font-variant-numeric: tabular-nums;
472
+ font-size: calc(9px + var(--dsh-content-font-delta, 0px)); line-height: 1; font-variant-numeric: tabular-nums;
473
473
  }
474
- .pr-run-done { display: inline-flex; align-items: center; gap: 3px; flex: 0 0 auto; font-size: 9px; line-height: 1; color: var(--dsw-alias-brand-primary); }
474
+ .pr-run-done { display: inline-flex; align-items: center; gap: 3px; flex: 0 0 auto; font-size: calc(9px + var(--dsh-content-font-delta, 0px)); line-height: 1; color: var(--dsw-alias-brand-primary); }
475
475
  .pr-run-check {
476
476
  width: 10px; height: 10px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center;
477
- background: #d97757; color: #fff; font-size: 8px; font-weight: 700; line-height: 1;
477
+ background: #d97757; color: #fff; font-size: calc(8px + var(--dsh-content-font-delta, 0px)); font-weight: 700; line-height: 1;
478
478
  }
479
- .pr-run-elapsed { flex: 0 0 auto; font-size: 9px; line-height: 1; font-variant-numeric: tabular-nums; color: var(--dsw-alias-state-success-primary); }
479
+ .pr-run-elapsed { flex: 0 0 auto; font-size: calc(9px + var(--dsh-content-font-delta, 0px)); line-height: 1; font-variant-numeric: tabular-nums; color: var(--dsw-alias-state-success-primary); }
480
480
 
481
481
  /* 项目行:22px 紧凑行高 + 顶部细线,读起来像「项目」而不是一行会话 */
482
482
  .pr-proj {
483
483
  display: flex; align-items: center; gap: 6px;
484
484
  height: 22px; min-height: 22px; padding: 0 6px;
485
485
  margin-top: 6px; border-radius: 6px;
486
- font-size: 12px; font-weight: 600;
486
+ font-size: calc(12px + var(--dsh-content-font-delta, 0px)); font-weight: 600;
487
487
  box-shadow: inset 0 1px 0 var(--dsw-alias-border-l1);
488
488
  cursor: pointer; overflow: hidden;
489
489
  }
@@ -492,11 +492,11 @@ window.__ModuleLoader__.load({
492
492
  .pr-dot { width: 6px; height: 6px; border-radius: 2px; flex: 0 0 auto; }
493
493
  .pr-proj-name { flex: 0 1 auto; max-width: 100%; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
494
494
  .pr-spacer { flex: 1 1 auto; min-width: 4px; }
495
- .pr-meta { font-size: 10px; font-weight: 500; color: var(--dsw-alias-label-secondary); flex: 0 0 auto; font-variant-numeric: tabular-nums; }
495
+ .pr-meta { font-size: calc(10px + var(--dsh-content-font-delta, 0px)); font-weight: 500; color: var(--dsw-alias-label-secondary); flex: 0 0 auto; font-variant-numeric: tabular-nums; }
496
496
  .pr-icon-btn {
497
497
  width: 18px; height: 18px; flex: 0 0 auto; border: none; padding: 0; border-radius: 5px;
498
498
  background: transparent; color: var(--dsw-alias-label-secondary);
499
- cursor: pointer; font-size: 10px; line-height: 1;
499
+ cursor: pointer; font-size: calc(10px + var(--dsh-content-font-delta, 0px)); line-height: 1;
500
500
  }
501
501
  .pr-icon-btn:hover { background: var(--dsw-alias-bg-layer-2); color: var(--dsw-alias-label-primary); }
502
502
  /* 图钉:默认隐藏,悬停显形;已置顶常显 */
@@ -519,7 +519,7 @@ window.__ModuleLoader__.load({
519
519
  padding: 0; border-radius: 11px;
520
520
  border: 1px solid transparent; background: transparent;
521
521
  color: var(--dsw-alias-label-secondary);
522
- font: inherit; font-size: 11.5px; line-height: 1.2;
522
+ font: inherit; font-size: calc(11.5px + var(--dsh-content-font-delta, 0px)); line-height: 1.2;
523
523
  cursor: pointer; box-sizing: border-box; overflow-wrap: anywhere;
524
524
  }
525
525
  /* 本体那一行(头像 + 名字 + badge + 圆点 + 时长):单独成盒,选中背景只作用在它上面 */
@@ -579,25 +579,25 @@ window.__ModuleLoader__.load({
579
579
  100% { transform: scale(1); opacity: 1; box-shadow: 0 0 0 0 transparent; }
580
580
  }
581
581
  .pr-running-dot { width: 6px; height: 6px; border-radius: 50%; flex: 0 0 auto; background: var(--dsw-alias-state-success-primary); animation: pr-pulse 1.4s ease-in-out infinite; }
582
- .pr-empty { padding: 10px 8px; font-size: 11px; color: var(--dsw-alias-label-secondary); text-align: center; }
582
+ .pr-empty { padding: 10px 8px; font-size: calc(11px + var(--dsh-content-font-delta, 0px)); color: var(--dsw-alias-label-secondary); text-align: center; }
583
583
 
584
584
  /* 房间浮层 */
585
585
  .pr-overlay { position: fixed; z-index: 900; display: flex; flex-direction: column; background: var(--dsw-alias-bg-base); border-left: 1px solid var(--dsw-alias-border-l1); }
586
586
  .pr-panel { width: 100%; height: 100%; display: flex; flex-direction: column; background: var(--dsw-alias-bg-base); }
587
587
  .pr-panel-head { display: flex; align-items: center; gap: 8px; padding: 10px 14px; border-bottom: 1px solid var(--dsw-alias-border-l1); }
588
- .pr-panel-title { font-size: 13px; font-weight: 700; }/* 2026-11-10 用户令「群聊页字体太大」:14px→13px,与分区标题/正文一起收一档 */
588
+ .pr-panel-title { font-size: calc(13px + var(--dsh-content-font-delta, 0px)); font-weight: 700; }/* 2026-11-10 用户令「群聊页字体太大」:14px→13px,与分区标题/正文一起收一档 */
589
589
  .pr-tabs { display: flex; gap: 2px; margin-left: 10px; }
590
- .pr-tab { padding: 3px 10px; border-radius: 6px; border: none; background: transparent; color: var(--dsw-alias-label-secondary); font-size: 12px; cursor: pointer; }
590
+ .pr-tab { padding: 3px 10px; border-radius: 6px; border: none; background: transparent; color: var(--dsw-alias-label-secondary); font-size: calc(12px + var(--dsh-content-font-delta, 0px)); cursor: pointer; }
591
591
  .pr-tab.on { background: var(--dsw-alias-bg-layer-2); color: var(--dsw-alias-label-primary); font-weight: 600; }
592
592
  .pr-panel-body { flex: 1; min-height: 0; overflow: hidden; padding: 12px 14px; display: flex; flex-direction: column; }
593
593
  .pr-panel-foot { border-top: 1px solid var(--dsw-alias-border-l1); padding: 8px 14px; display: flex; gap: 8px; align-items: flex-end; }
594
- .pr-textarea { flex: 1; min-height: 34px; max-height: 120px; resize: vertical; padding: 6px 8px; border-radius: 6px; border: 1px solid var(--dsw-alias-border-l1); background: var(--dsw-alias-bg-layer-1); color: var(--dsw-alias-label-primary); font-size: 12px; font-family: inherit; outline: none; }
595
- .pr-btn { padding: 6px 12px; border-radius: 6px; border: 1px solid var(--dsw-alias-border-l2); background: var(--dsw-alias-bg-layer-2); color: var(--dsw-alias-label-primary); font-size: 12px; cursor: pointer; white-space: nowrap; }
594
+ .pr-textarea { flex: 1; min-height: 34px; max-height: 120px; resize: vertical; padding: 6px 8px; border-radius: 6px; border: 1px solid var(--dsw-alias-border-l1); background: var(--dsw-alias-bg-layer-1); color: var(--dsw-alias-label-primary); font-size: calc(12px + var(--dsh-content-font-delta, 0px)); font-family: inherit; outline: none; }
595
+ .pr-btn { padding: 6px 12px; border-radius: 6px; border: 1px solid var(--dsw-alias-border-l2); background: var(--dsw-alias-bg-layer-2); color: var(--dsw-alias-label-primary); font-size: calc(12px + var(--dsh-content-font-delta, 0px)); cursor: pointer; white-space: nowrap; }
596
596
  .pr-btn:hover { border-color: var(--dsw-alias-brand-primary); }
597
597
  .pr-btn.primary { background: var(--dsw-alias-brand-primary); border-color: var(--dsw-alias-brand-primary); color: #08111a; font-weight: 600; }
598
598
  .pr-btn:disabled { opacity: .5; cursor: default; }
599
- .pr-board { width: 100%; min-height: 200px; resize: vertical; padding: 10px; border-radius: 8px; border: 1px solid var(--dsw-alias-border-l1); background: var(--dsw-alias-bg-layer-1); color: var(--dsw-alias-label-primary); font-size: 12.5px; line-height: 1.6; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; outline: none; }
600
- .pr-todo { display: flex; align-items: center; gap: 8px; padding: 5px 0; border-bottom: 1px dashed var(--dsw-alias-border-l1); font-size: 12.5px; }
599
+ .pr-board { width: 100%; min-height: 200px; resize: vertical; padding: 10px; border-radius: 8px; border: 1px solid var(--dsw-alias-border-l1); background: var(--dsw-alias-bg-layer-1); color: var(--dsw-alias-label-primary); font-size: calc(12.5px + var(--dsh-content-font-delta, 0px)); line-height: 1.6; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; outline: none; }
600
+ .pr-todo { display: flex; align-items: center; gap: 8px; padding: 5px 0; border-bottom: 1px dashed var(--dsw-alias-border-l1); font-size: calc(12.5px + var(--dsh-content-font-delta, 0px)); }
601
601
  .pr-todo input[type=checkbox] { flex: 0 0 auto; }
602
602
  .pr-todo-text { flex: 1; min-width: 0; }
603
603
  .pr-todo.done .pr-todo-text { text-decoration: line-through; opacity: .55; }
@@ -619,7 +619,7 @@ window.__ModuleLoader__.load({
619
619
  display: flex; align-items: flex-start; gap: 5px; padding: 5px 8px;
620
620
  border-bottom: 1px solid var(--dsw-alias-border-l1);
621
621
  background: var(--dsw-alias-bg-layer-2);
622
- font-size: 11.5px; font-weight: 600;/* 2026-11-09 用户令:lane 标题完整显示 */
622
+ font-size: calc(11.5px + var(--dsh-content-font-delta, 0px)); font-weight: 600;/* 2026-11-09 用户令:lane 标题完整显示 */
623
623
  }
624
624
  /* ⚠️ 2026-11-10 补回上面这条规则的收尾花括号:58ca983 改 lane 标题换行时把块尾的 } 弄丢了,
625
625
  浏览器(Chrome 120+ 支持 CSS 嵌套)会把 .pr-lane-name 之后的**全部规则**当成
@@ -629,7 +629,7 @@ window.__ModuleLoader__.load({
629
629
  .pr-lane-archive {
630
630
  margin-left: auto; flex: 0 0 auto; height: 18px; padding: 0 6px; border-radius: 5px;
631
631
  border: 1px solid transparent; background: transparent;
632
- color: var(--dsw-alias-label-secondary); font-size: 10px; line-height: 1; cursor: pointer;
632
+ color: var(--dsw-alias-label-secondary); font-size: calc(10px + var(--dsh-content-font-delta, 0px)); line-height: 1; cursor: pointer;
633
633
  }
634
634
  .pr-lane-archive:hover {
635
635
  border-color: var(--dsw-alias-border-l2); background: var(--dsw-alias-bg-layer-1);
@@ -637,13 +637,13 @@ window.__ModuleLoader__.load({
637
637
  }
638
638
  .pr-lane-dot { width: 7px; height: 7px; border-radius: 50%; flex: 0 0 auto; }
639
639
  .pr-lane-sub {
640
- padding: 0 8px 4px; font-size: 9.5px; color: var(--dsw-alias-label-secondary);
640
+ padding: 0 8px 4px; font-size: calc(9.5px + var(--dsh-content-font-delta, 0px)); color: var(--dsw-alias-label-secondary);
641
641
  border-bottom: 1px solid var(--dsw-alias-border-l1);
642
642
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
643
643
  }
644
644
  .pr-lane-body { flex: 1; min-height: 90px; max-height: 210px; overflow-y: auto; padding: 6px; display: flex; flex-direction: column; gap: 5px; }
645
645
  .pr-lane-msg {
646
- font-size: 11px; line-height: 1.4; color: var(--dsw-alias-label-primary);
646
+ font-size: calc(11px + var(--dsh-content-font-delta, 0px)); line-height: 1.4; color: var(--dsw-alias-label-primary);
647
647
  background: var(--dsw-alias-bg-base); border-radius: 6px; padding: 4px 6px;
648
648
  display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;
649
649
  white-space: pre-wrap; word-break: break-word;
@@ -656,25 +656,25 @@ window.__ModuleLoader__.load({
656
656
  /* 看板:渲染视图(纵向滚动)+ 编辑切换 */
657
657
  .pr-board-section { display: flex; flex-direction: column; min-height: 0; }
658
658
  .pr-section-head { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
659
- .pr-board-toggle { height: 22px; padding: 0 9px; font-size: 11px; }
659
+ .pr-board-toggle { height: 22px; padding: 0 9px; font-size: calc(11px + var(--dsh-content-font-delta, 0px)); }
660
660
  .pr-board-count {
661
- margin-left: auto; font-size: 10px; color: var(--dsw-alias-label-secondary);
661
+ margin-left: auto; font-size: calc(10px + var(--dsh-content-font-delta, 0px)); color: var(--dsw-alias-label-secondary);
662
662
  font-variant-numeric: tabular-nums; white-space: nowrap;
663
663
  }
664
664
  .pr-md-view {
665
665
  flex: 1; min-height: 120px; max-height: 42vh; overflow-y: auto;
666
666
  padding: 8px 10px; border: 1px solid var(--dsw-alias-border-l1); border-radius: 8px;
667
- background: var(--dsw-alias-bg-layer-1); font-size: 12px; line-height: 1.55;
667
+ background: var(--dsw-alias-bg-layer-1); font-size: calc(12px + var(--dsh-content-font-delta, 0px)); line-height: 1.55;
668
668
  word-break: break-word;
669
669
  }
670
- .pr-md-h { margin: 6px 0 4px; font-size: 12.5px; font-weight: 700; color: var(--dsw-alias-label-primary); }
670
+ .pr-md-h { margin: 6px 0 4px; font-size: calc(12.5px + var(--dsh-content-font-delta, 0px)); font-weight: 700; color: var(--dsw-alias-label-primary); }
671
671
  .pr-md-h:first-child { margin-top: 0; }
672
672
  .pr-md-p { margin: 2px 0; color: var(--dsw-alias-label-primary); white-space: pre-wrap; }
673
673
  .pr-md-ul { margin: 3px 0; padding-left: 16px; }
674
674
  .pr-md-ul li { margin: 1px 0; }
675
675
  .pr-md-code {
676
676
  padding: 0 4px; border-radius: 4px; background: var(--dsw-alias-bg-layer-2);
677
- font-size: 11px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
677
+ font-size: calc(11px + var(--dsh-content-font-delta, 0px)); font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
678
678
  }
679
679
  .pr-board-edit { min-height: 200px; max-height: 42vh; }
680
680
  .pr-board-actions { display: flex; gap: 8px; margin-top: 6px; align-items: center; }
@@ -700,10 +700,10 @@ window.__ModuleLoader__.load({
700
700
  overflow-wrap: anywhere;
701
701
  text-overflow: clip;
702
702
  }
703
- .pr-hint { font-size: 11px; color: var(--dsw-alias-label-secondary); padding: 6px 0; }
704
- .pr-err { font-size: 11.5px; color: #f87171; padding: 4px 0; }
703
+ .pr-hint { font-size: calc(11px + var(--dsh-content-font-delta, 0px)); color: var(--dsw-alias-label-secondary); padding: 6px 0; }
704
+ .pr-err { font-size: calc(11.5px + var(--dsh-content-font-delta, 0px)); color: #f87171; padding: 4px 0; }
705
705
  .pr-send-row { display: flex; gap: 6px; align-items: center; width: 100%; }
706
- .pr-select { max-width: 200px; height: 30px; padding: 0 6px; border-radius: 6px; border: 1px solid var(--dsw-alias-border-l1); background: var(--dsw-alias-bg-layer-1); color: var(--dsw-alias-label-primary); font-size: 12px; }
706
+ .pr-select { max-width: 200px; height: 30px; padding: 0 6px; border-radius: 6px; border: 1px solid var(--dsw-alias-border-l1); background: var(--dsw-alias-bg-layer-1); color: var(--dsw-alias-label-primary); font-size: calc(12px + var(--dsh-content-font-delta, 0px)); }
707
707
  `;
708
708
 
709
709
  function ensureStyle() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-project-room",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
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",