dsh-agent-office 4.2.0 → 4.5.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-agent-office",
3
- "version": "4.2.0",
3
+ "version": "4.5.0",
4
4
  "description": "实时 3D 办公室可视化 DSH 会话;Catora 发布后拓展笔记、思维导图、私人知识库与 RAG 检索。",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -27,6 +27,7 @@
27
27
  "NOTICE",
28
28
  "README.md",
29
29
  "screenshot.png",
30
+ "screenshot-day.png",
30
31
  "screenshot-focus.png",
31
32
  "screenshot-client.png"
32
33
  ],
Binary file
@@ -3,11 +3,12 @@
3
3
  <head>
4
4
  <meta charset="utf-8">
5
5
  <meta name="viewport" content="width=device-width,initial-scale=1">
6
- <title>智能体办公室 · DSH 会话办公室</title>
6
+ <title>Office · DSH 会话办公室</title>
7
7
  <style>
8
8
  :root{
9
9
  --bg:#05070a;
10
- --panel:rgba(12,15,20,.66);
10
+ --panel-rgb:12 15 20;
11
+ --panel-alpha:.66;
11
12
  --panel-2:rgba(17,21,28,.78);
12
13
  --line:rgba(255,255,255,.08);
13
14
  --line-2:rgba(255,255,255,.14);
@@ -20,6 +21,22 @@
20
21
  --red:#ff6b6b;
21
22
  --green:#7dd3a0;
22
23
  --purple:#a78bfa;
24
+ --surface:rgba(255,255,255,.035);
25
+ --surface-hover:rgba(255,255,255,.045);
26
+ --surface-active:rgba(61,225,198,.1);
27
+ --active-line:rgba(61,225,198,.28);
28
+ --track:rgba(255,255,255,.06);
29
+ --scroll:rgba(255,255,255,.2);
30
+ --scroll-hi:rgba(255,255,255,.32);
31
+ --label:rgba(8,11,15,.82);
32
+ --hint:rgba(12,15,20,.66);
33
+ --chip:rgba(12,18,22,.86);
34
+ --focus-line:rgba(61,225,198,.3);
35
+ --focus-btn:rgba(61,225,198,.16);
36
+ --focus-btn-hi:rgba(61,225,198,.26);
37
+ --check-bg:rgba(125,211,160,.14);
38
+ --check-line:rgba(125,211,160,.4);
39
+ --shadow:0 22px 60px rgba(0,0,0,.45);
23
40
  --radius:18px;
24
41
  --mono:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;
25
42
  --sans:Inter,system-ui,-apple-system,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
@@ -34,25 +51,54 @@
34
51
  #labels .lbl{pointer-events:auto;cursor:pointer}
35
52
 
36
53
  /* ---------- 顶部 ---------- */
37
- #top{position:absolute;left:18px;right:18px;top:16px;height:58px;display:flex;align-items:center;gap:16px;padding:0 18px;border:1px solid var(--line);border-radius:16px;background:var(--panel);backdrop-filter:blur(16px);z-index:10}
38
- .brand{display:flex;align-items:center;gap:11px;white-space:nowrap}
39
- .brand .mark{width:26px;height:26px;border-radius:9px;border:0;padding:0;background:conic-gradient(from 210deg,#3de1c6,#5b8cff,#a78bfa,#3de1c6);box-shadow:0 0 18px rgba(61,225,198,.35);position:relative;cursor:pointer;flex:none}
40
- .brand .mark{cursor:default}
41
- .brand .mark .icon{position:absolute;inset:0;margin:auto;width:14px;height:14px;color:#071014;transition:opacity .25s,transform .25s}
42
- .brand .mark .sun{opacity:0;transform:rotate(-30deg) scale(.8)}
43
- body.day .brand .mark .moon{opacity:0;transform:rotate(30deg) scale(.8)}
44
- body.day .brand .mark .sun{opacity:1;transform:none}
45
- body.day{--bg:#b9cbd8;--panel:rgba(10,13,18,.84);--panel-2:rgba(14,18,24,.9);--line:rgba(255,255,255,.1);--line-2:rgba(255,255,255,.16)}
54
+ #top{box-shadow:0 10px 30px rgba(0,0,0,.18);position:absolute;left:18px;right:18px;top:16px;height:58px;display:flex;align-items:center;gap:16px;padding:0 18px;border:1px solid var(--line);border-radius:16px;background:rgb(var(--panel-rgb) / var(--glass-alpha, var(--panel-alpha)));backdrop-filter:blur(16px);z-index:10}
55
+ .brand{display:flex;align-items:baseline;gap:8px;white-space:nowrap}
46
56
  .brand b{font-size:17px;font-weight:650;letter-spacing:-.2px}
47
- .brand span{font-family:var(--mono);font-size:11px;letter-spacing:.8px;color:var(--dim);margin-left:6px}
57
+ .brand span{font-family:var(--mono);font-size:11px;letter-spacing:.8px;color:var(--dim)}
58
+ body.day{
59
+ --bg:#b9cbd8;
60
+ --panel-rgb:248 251 252;
61
+ --panel-alpha:.88;
62
+ --panel-2:rgba(255,255,255,.94);
63
+ --line:rgba(16,40,54,.12);
64
+ --line-2:rgba(16,40,54,.2);
65
+ --ink:#102029;
66
+ --dim:#455965;
67
+ --dim-2:#5d707d;
68
+ --acc:#087565;
69
+ --acc-2:#075e52;
70
+ --amber:#8a4d0f;
71
+ --red:#a83232;
72
+ --green:#256b45;
73
+ --purple:#5b4a9e;
74
+ --surface:rgba(16,40,54,.045);
75
+ --surface-hover:rgba(16,40,54,.065);
76
+ --surface-active:rgba(8,117,101,.1);
77
+ --active-line:rgba(8,117,101,.3);
78
+ --track:rgba(16,40,54,.07);
79
+ --scroll:rgba(16,40,54,.2);
80
+ --scroll-hi:rgba(16,40,54,.32);
81
+ --label:rgba(250,252,253,.95);
82
+ --hint:rgba(250,252,253,.84);
83
+ --chip:rgba(252,253,254,.92);
84
+ --focus-line:rgba(8,117,101,.3);
85
+ --focus-btn:rgba(8,117,101,.12);
86
+ --focus-btn-hi:rgba(8,117,101,.2);
87
+ --check-bg:rgba(37,107,69,.12);
88
+ --check-line:rgba(37,107,69,.4);
89
+ --shadow:0 16px 42px rgba(27,52,68,.14);
90
+ }
91
+ body.day #top{box-shadow:0 10px 26px rgba(27,52,68,.1)}
92
+ body.day #clock i{box-shadow:none}
93
+ body.day .panel,body.day #top,body.day .lbl,body.day .floorlbl,body.day #hint,body.day #focusChip{transition:background-color .45s,border-color .45s,color .45s,box-shadow .45s}
48
94
  .pills{display:flex;gap:8px;margin-left:auto}
49
95
  .pill{display:flex;align-items:center;gap:7px;height:30px;padding:0 12px;border:1px solid var(--line);border-radius:999px;font-family:var(--mono);font-size:12px;color:var(--dim);white-space:nowrap}
50
96
  .pill i{width:7px;height:7px;border-radius:50%;background:var(--dim-2)}
51
- .pill b{color:var(--ink);font-weight:600;font-size:13px}
97
+ .pill b{color:var(--ink);font-weight:600;font-size:13px;font-variant-numeric:tabular-nums}
52
98
  .pill.working i{background:var(--acc);box-shadow:0 0 8px var(--acc)}
53
99
  .pill.need i{background:var(--amber);box-shadow:0 0 8px var(--amber)}
54
100
  .pill.stuck i{background:var(--red);box-shadow:0 0 8px var(--red)}
55
- #clock{font-family:var(--mono);font-size:12px;color:var(--dim);display:flex;align-items:center;gap:8px;white-space:nowrap}
101
+ #clock{font-family:var(--mono);font-size:12px;font-variant-numeric:tabular-nums;color:var(--dim);display:flex;align-items:center;gap:8px;white-space:nowrap}
56
102
  #clock i{width:6px;height:6px;border-radius:50%;background:var(--acc);box-shadow:0 0 8px var(--acc);animation:breathe 2.4s ease-in-out infinite}
57
103
  #headStats{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);display:flex;align-items:center;gap:18px;white-space:nowrap;pointer-events:auto}
58
104
  .hstat{display:flex;align-items:baseline;gap:7px;font-family:var(--mono);font-size:10.5px;letter-spacing:1.2px;color:var(--dim)}
@@ -71,9 +117,9 @@
71
117
  @keyframes breathe{0%,100%{opacity:.45}50%{opacity:1}}
72
118
 
73
119
  /* ---------- 面板通用 ---------- */
74
- .panel{position:absolute;border:1px solid var(--line);border-radius:var(--radius);background:var(--panel);backdrop-filter:blur(16px);box-shadow:0 22px 60px rgba(0,0,0,.45);z-index:9}
120
+ .panel{position:absolute;border:1px solid var(--line);border-radius:var(--radius);background:rgb(var(--panel-rgb) / var(--glass-alpha, var(--panel-alpha)));backdrop-filter:blur(16px);box-shadow:var(--shadow);z-index:9}
75
121
  .panel__head{display:flex;align-items:center;gap:8px;padding:14px 16px 10px;font-family:var(--mono);font-size:11px;letter-spacing:1.8px;color:var(--dim)}
76
- .panel__head b{margin-left:auto;color:var(--dim);font-weight:500;letter-spacing:1px}
122
+ .panel__head b{margin-left:auto;color:var(--dim);font-weight:500;letter-spacing:1px;font-variant-numeric:tabular-nums}
77
123
  .panel__body{padding:0 10px 12px}
78
124
 
79
125
  /* ---------- 左侧栏:榜单 + 楼层 ---------- */
@@ -82,68 +128,82 @@
82
128
  #board{position:relative;left:auto;top:auto;width:auto;flex:1 1 auto;min-height:0;max-height:none;display:flex;flex-direction:column}
83
129
  #board .panel__body{overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;padding-right:6px;scrollbar-gutter:stable}
84
130
  #board .panel__body::-webkit-scrollbar{width:8px}
85
- #board .panel__body::-webkit-scrollbar-track{background:rgba(255,255,255,.03);border-radius:4px}
86
- #board .panel__body::-webkit-scrollbar-thumb{background:rgba(255,255,255,.2);border-radius:4px}
87
- #board .panel__body::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.32)}
88
- .row{display:flex;align-items:center;gap:10px;padding:10px 10px;border-radius:12px;cursor:pointer;transition:background .15s;appearance:none;width:100%;border:0;background:transparent;color:inherit;font:inherit;text-align:left}
89
- .row:hover{background:rgba(255,255,255,.045)}
131
+ #board .panel__body::-webkit-scrollbar-track{background:var(--track);border-radius:4px}
132
+ #board .panel__body::-webkit-scrollbar-thumb{background:var(--scroll);border-radius:4px}
133
+ #board .panel__body::-webkit-scrollbar-thumb:hover{background:var(--scroll-hi)}
134
+ .row{display:flex;align-items:center;gap:10px;padding:10px 10px;border-radius:8px;cursor:pointer;transition:background .15s;appearance:none;width:100%;border:0;background:transparent;color:inherit;font:inherit;text-align:left}
135
+ .row:hover{background:var(--surface-hover)}
136
+ .row:active{background:var(--surface-active)}
90
137
  .row:focus-visible,.floor:focus-visible{outline:2px solid rgba(61,225,198,.55);outline-offset:1px}
91
- .row.on{background:rgba(61,225,198,.1);box-shadow:inset 0 0 0 1px rgba(61,225,198,.28)}
138
+ .row.on{background:var(--surface-active);box-shadow:inset 0 0 0 1px var(--active-line)}
92
139
  .dot{width:9px;height:9px;border-radius:50%;flex:none}
93
140
  .row__main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
94
141
  .row__name{font-size:13.5px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
95
142
  .row__sub{font-family:var(--mono);font-size:10.5px;color:var(--dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:2px}
96
- .row__bar{display:block;height:3px;border-radius:2px;background:rgba(255,255,255,.06);margin-top:4px;overflow:hidden}
143
+ .row__bar{display:block;height:3px;border-radius:2px;background:var(--track);margin-top:4px;overflow:hidden}
97
144
  .row__bar i{display:block;height:100%;border-radius:2px;background:linear-gradient(90deg,var(--acc-2),var(--acc))}
98
- .row__pct{font-family:var(--mono);font-size:13px;color:var(--ink);flex:none;min-width:42px;text-align:right}
145
+ .row__pct{font-family:var(--mono);font-size:13px;color:var(--ink);flex:none;min-width:42px;text-align:right;font-variant-numeric:tabular-nums}
99
146
 
100
147
  /* ---------- 楼层 ---------- */
101
148
  #floors{position:relative;left:auto;bottom:auto;width:auto;flex:none}
102
149
  #floors .panel__body{display:flex;flex-direction:column;gap:4px;max-height:min(30vh,238px);overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;scrollbar-gutter:stable}
103
150
  #floors .panel__body::-webkit-scrollbar{width:8px}
104
- #floors .panel__body::-webkit-scrollbar-track{background:rgba(255,255,255,.03);border-radius:4px}
105
- #floors .panel__body::-webkit-scrollbar-thumb{background:rgba(255,255,255,.2);border-radius:4px}
106
- #floors .panel__body::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.32)}
107
- .floor{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:10px;cursor:pointer;font-size:13px;appearance:none;width:100%;border:0;background:transparent;color:inherit;font:inherit;text-align:left}
108
- .floor:hover{background:rgba(255,255,255,.045)}
109
- .floor.on{background:rgba(61,225,198,.1)}
110
- .floor__no{width:22px;height:22px;border-radius:7px;background:rgba(255,255,255,.06);display:grid;place-items:center;font-family:var(--mono);font-size:11px;color:var(--dim)}
151
+ #floors .panel__body::-webkit-scrollbar-track{background:var(--track);border-radius:4px}
152
+ #floors .panel__body::-webkit-scrollbar-thumb{background:var(--scroll);border-radius:4px}
153
+ #floors .panel__body::-webkit-scrollbar-thumb:hover{background:var(--scroll-hi)}
154
+ .floor{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:8px;cursor:pointer;font-size:13px;appearance:none;width:100%;border:0;background:transparent;color:inherit;font:inherit;text-align:left}
155
+ .floor:hover{background:var(--surface-hover)}
156
+ .floor:active{background:var(--surface-active)}
157
+ .floor.on{background:var(--surface-active)}
158
+ .floor__no{width:22px;height:22px;border-radius:7px;background:var(--surface);display:grid;place-items:center;font-family:var(--mono);font-size:11px;color:var(--dim)}
111
159
  .floor.on .floor__no{background:rgba(61,225,198,.2);color:var(--acc)}
112
- .floor__ct{margin-left:auto;font-family:var(--mono);font-size:11px;color:var(--dim)}
160
+ .floor__ct{margin-left:auto;font-family:var(--mono);font-size:11px;color:var(--dim);font-variant-numeric:tabular-nums}
113
161
 
114
162
  /* ---------- 右侧 ---------- */
115
163
  #right{position:absolute;right:18px;top:92px;bottom:18px;width:346px;display:flex;flex-direction:column;gap:14px;z-index:9;max-height:none;overflow:auto;scrollbar-width:none}
116
164
  #right::-webkit-scrollbar{display:none}
117
165
  #right > .panel{position:relative;left:auto;right:auto;top:auto;bottom:auto}
118
166
  #card{position:relative;display:none}
119
- #card.show{display:block}
167
+ #card.show{display:block;animation:cardIn .22s cubic-bezier(.2,0,0,1) both}
168
+ #card.show.is-out{animation:cardOut .16s ease-out both;pointer-events:none}
169
+ @keyframes cardIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
170
+ @keyframes cardOut{from{opacity:1;transform:none}to{opacity:0;transform:translateY(4px)}}
120
171
  #card .panel__head b{margin-left:0;margin-right:26px;color:var(--dim)}
121
- #cardx{position:absolute;top:12px;right:12px;width:26px;height:26px;border-radius:50%;border:1px solid var(--line-2);background:rgba(255,255,255,.05);color:var(--dim);font-size:15px;line-height:1;cursor:pointer;z-index:2}
122
- #cardx:hover{color:var(--ink);background:rgba(255,255,255,.12)}
172
+ #cardx{position:absolute;top:12px;right:12px;width:28px;height:28px;border-radius:50%;border:1px solid var(--line-2);background:var(--surface);color:var(--dim);cursor:pointer;z-index:2;display:grid;place-items:center;padding:0;transition:background-color .15s ease,color .15s ease,transform .12s ease}
173
+ #cardx::before{content:"";position:absolute;inset:-6px;border-radius:50%}
174
+ #cardx svg{width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round}
175
+ #cardx:active{transform:scale(.96)}
176
+ #cardx:hover{color:var(--ink);background:var(--surface-hover)}
123
177
  .card__title{display:flex;align-items:center;gap:10px;padding:0 16px 8px}
124
178
  .card__title .glyph{width:34px;height:34px;border-radius:11px;display:grid;place-items:center;font-size:16px;flex:none}
125
- .card__title b{font-size:16px;font-weight:650;line-height:1.25;word-break:break-all}
179
+ .card__title b{font-size:16px;font-weight:650;line-height:1.3;overflow-wrap:anywhere;word-break:normal;text-wrap:pretty}
126
180
  .card__title span{display:block;font-family:var(--mono);font-size:11px;color:var(--dim);margin-top:2px}
127
- .card__status{margin:0 16px;display:inline-flex;align-items:center;gap:7px;height:26px;padding:0 11px;border-radius:999px;font-family:var(--mono);font-size:11.5px;border:1px solid}
181
+ .card__status{margin:0 16px;display:inline-flex;align-items:center;gap:7px;height:26px;padding:0 11px;border-radius:999px;font-family:var(--mono);font-size:11.5px;border:1px solid;color:var(--c,var(--dim));border-color:color-mix(in srgb,var(--c,var(--dim)) 45%,transparent);background:color-mix(in srgb,var(--c,var(--dim)) 12%,transparent)}
182
+ .card__status[data-status="working"]{--c:var(--acc)}
183
+ .card__status[data-status="need_me"]{--c:var(--amber)}
184
+ .card__status[data-status="stuck"]{--c:var(--red)}
185
+ .card__status[data-status="done"]{--c:var(--green)}
186
+ .card__status[data-status="resting"]{--c:var(--dim)}
128
187
  .card__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;padding:12px 16px 4px}
129
- .card__grid div{background:rgba(255,255,255,.035);border:1px solid var(--line);border-radius:12px;padding:10px}
130
- .card__grid b{display:block;font-family:var(--mono);font-size:19px;font-weight:650;letter-spacing:-.5px}
188
+ .card__grid div{background:var(--surface);border:1px solid var(--line);border-radius:8px;padding:10px}
189
+ .card__grid b{display:block;font-family:var(--mono);font-size:19px;font-weight:650;letter-spacing:-.5px;font-variant-numeric:tabular-nums}
131
190
  .card__grid span{font-family:var(--mono);font-size:9.5px;letter-spacing:1.2px;color:var(--dim)}
132
191
  .card__row{display:flex;justify-content:space-between;gap:12px;margin:10px 16px 0;padding-top:10px;border-top:1px solid var(--line);font-family:var(--mono);font-size:11.5px;color:var(--dim)}
133
- .card__row b{color:var(--ink);font-weight:500;text-align:right;word-break:break-all;max-width:220px}
192
+ .card__row b{color:var(--ink);font-weight:500;text-align:right;overflow-wrap:anywhere;word-break:normal;max-width:220px;text-wrap:pretty}
134
193
  .card__foot{height:10px}
135
194
 
136
195
  #checks .panel__body{display:flex;flex-direction:column;gap:7px}
137
196
  .check{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--dim);font-family:var(--mono)}
138
197
  .check i{width:15px;height:15px;border-radius:5px;border:1px solid var(--line-2);display:grid;place-items:center;font-style:normal;font-size:10px;color:transparent}
198
+ .check i svg{width:10px;height:10px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
139
199
  .check.ok{color:var(--ink)}
140
- .check.ok i{background:rgba(125,211,160,.14);border-color:rgba(125,211,160,.4);color:var(--green)}
200
+ .check.ok i{background:var(--check-bg);border-color:var(--check-line);color:var(--green)}
141
201
 
142
202
  /* ---------- 动态 ---------- */
143
203
  #feed{left:358px;right:382px;bottom:18px;width:auto;max-height:168px;display:flex;flex-direction:column;overflow:hidden}
144
204
  #feed .panel__body{display:flex;flex-direction:column;gap:2px;overflow:auto;min-height:0}
145
205
  .evt{display:flex;align-items:center;gap:9px;padding:5px 6px;font-size:12px;color:var(--dim);white-space:nowrap;overflow:hidden}
146
- .evt .t{font-family:var(--mono);font-size:10.5px;color:var(--dim-2);flex:none}
206
+ .evt .t{font-family:var(--mono);font-size:10.5px;color:var(--dim-2);flex:none;font-variant-numeric:tabular-nums}
147
207
  .evt i{width:6px;height:6px;border-radius:50%;flex:none}
148
208
  .evt b{color:var(--ink);font-weight:600;flex:none;max-width:150px;overflow:hidden;text-overflow:ellipsis}
149
209
  .evt span{overflow:hidden;text-overflow:ellipsis}
@@ -167,26 +227,29 @@
167
227
  #balance .sub b{color:var(--ink);font-weight:500}
168
228
 
169
229
  /* ---------- 提示/空态 ---------- */
170
- #focusChip{position:absolute;left:50%;top:92px;transform:translateX(-50%);z-index:11;display:flex;align-items:center;gap:10px;padding:6px 6px 6px 14px;border:1px solid rgba(61,225,198,.3);border-radius:999px;background:rgba(12,18,22,.86);backdrop-filter:blur(14px);font-family:var(--mono);font-size:11.5px;color:var(--ink);white-space:nowrap}
230
+ #focusChip{position:absolute;left:50%;top:92px;transform:translateX(-50%);z-index:11;display:flex;align-items:center;gap:10px;padding:6px 6px 6px 14px;border:1px solid var(--focus-line);border-radius:999px;background:var(--chip);backdrop-filter:blur(14px);font-family:var(--mono);font-size:11.5px;color:var(--ink);white-space:nowrap}
171
231
  #focusChip[hidden]{display:none}
172
232
  #focusChip .focus__dot{width:7px;height:7px;border-radius:50%;background:var(--acc);box-shadow:0 0 8px var(--acc)}
173
- #focusChip button{height:26px;padding:0 12px;border-radius:999px;border:0;background:rgba(61,225,198,.16);color:var(--acc);font-family:var(--mono);font-size:11px;font-weight:600;cursor:pointer}
174
- #focusChip button:hover{background:rgba(61,225,198,.26)}
233
+ #focusChip button{position:relative;height:26px;padding:0 12px;border-radius:999px;border:0;background:var(--focus-btn);color:var(--acc);font-family:var(--mono);font-size:11px;font-weight:600;cursor:pointer;transition:background-color .15s ease,transform .12s ease}
234
+ #focusChip button:hover{background:var(--focus-btn-hi)}
235
+ #focusChip button:active{transform:scale(.96)}
236
+ #focusChip button::before{content:"";position:absolute;inset:-7px;border-radius:999px}
175
237
  #focusChip button:focus-visible{outline:2px solid var(--acc);outline-offset:2px}
176
238
  #credit{position:absolute;left:24px;bottom:5px;z-index:8;font-family:var(--mono);font-size:9.5px;letter-spacing:.3px;color:var(--dim-2);opacity:.72;pointer-events:none;white-space:nowrap}
177
239
  #credit b{font-weight:600;color:var(--dim)}
178
- #hint{position:absolute;left:50%;top:92px;transform:translateX(-50%);z-index:8;font-family:var(--mono);font-size:11px;letter-spacing:1.2px;color:rgba(138,148,163,.85);background:rgba(12,15,20,.66);border:1px solid var(--line);border-radius:999px;padding:7px 14px;backdrop-filter:blur(12px);transition:opacity .8s;white-space:nowrap}
240
+ #hint{position:absolute;left:50%;top:92px;transform:translateX(-50%);z-index:8;font-family:var(--mono);font-size:11px;letter-spacing:1.2px;color:rgba(138,148,163,.85);background:var(--hint);border:1px solid var(--line);border-radius:999px;padding:7px 14px;backdrop-filter:blur(12px);transition:opacity .8s;white-space:nowrap}
179
241
  #hint.hide{opacity:0}
180
242
  #hint.lower{top:auto;bottom:20px}
181
243
  #offline{position:absolute;left:50%;top:88px;transform:translateX(-50%);z-index:20;display:none;font-family:var(--mono);font-size:11.5px;color:var(--amber);background:rgba(255,184,107,.12);border:1px solid rgba(255,184,107,.35);border-radius:999px;padding:6px 14px}
182
244
  #offline.show{display:block}
183
- .lbl{position:absolute;transform:translate(-50%,-100%);padding:3px 8px;border-radius:999px;border:1px solid rgba(255,255,255,.14);background:rgba(8,11,15,.82);color:var(--ink);font-family:var(--mono);font-size:10.5px;white-space:nowrap;backdrop-filter:blur(6px);transition:border-color .2s,transform .2s}
184
- .lbl em{font-style:normal;color:var(--dim);margin-left:6px}
245
+ .lbl{position:absolute;transform:translate(-50%,-100%);max-width:250px;overflow:hidden;text-overflow:ellipsis;padding:3px 8px;border-radius:999px;border:1px solid var(--line-2);background:var(--label);color:var(--ink);font-family:var(--mono);font-size:10.5px;white-space:nowrap;backdrop-filter:blur(6px);transition:border-color .2s,transform .2s}
246
+ .lbl em{font-style:normal;color:var(--dim);margin-left:6px;font-variant-numeric:tabular-nums}
185
247
  .lbl:hover{border-color:rgba(61,225,198,.6);transform:translate(-50%,-100%) scale(1.06)}
186
248
  .lbl.on{border-color:var(--acc);box-shadow:0 0 14px rgba(61,225,198,.35)}
187
249
  .lbl .badge{display:inline-block;width:6px;height:6px;border-radius:50%;margin-right:5px;vertical-align:1px}
188
- .floorlbl{position:absolute;transform:translate(-50%,-50%);font-family:var(--mono);font-size:11px;letter-spacing:2px;color:rgba(138,148,163,.9);padding:3px 9px;border:1px solid rgba(255,255,255,.1);border-radius:999px;background:rgba(8,11,15,.6);white-space:nowrap}
250
+ .floorlbl{position:absolute;transform:translate(-50%,-50%);font-family:var(--mono);font-size:11px;letter-spacing:2px;color:rgba(138,148,163,.9);padding:3px 9px;border:1px solid var(--line-2);border-radius:999px;background:var(--label);white-space:nowrap}
189
251
  .floorlbl b{color:var(--ink);font-weight:600;margin-left:6px;letter-spacing:0}
252
+ .officeTag{font-family:var(--mono);font-size:9px;letter-spacing:1.4px;color:var(--dim);padding:2px 7px;border:1px solid var(--line-2);border-radius:999px;background:var(--label);white-space:nowrap;backdrop-filter:blur(6px)}
190
253
  @media (max-width:1180px){
191
254
  #left{width:280px}
192
255
  #right{width:300px}
@@ -225,6 +288,10 @@
225
288
  #right{top:calc(86px + 28vh + 12px)}
226
289
  #meter .big{font-size:32px}
227
290
  }
291
+ @media (prefers-reduced-motion:reduce){
292
+ #card.show,#card.show.is-out{animation:none}
293
+ .row,.floor,#cardx,#focusChip button{transition:none!important}
294
+ }
228
295
  @media (max-height:760px){
229
296
  #floors{display:none}
230
297
  #feed{max-height:112px}
@@ -237,10 +304,7 @@
237
304
  <div id="labels"></div>
238
305
 
239
306
  <header id="top">
240
- <div class="brand"><span class="mark" id="themeToggle" title="昼夜跟随系统时间(06:00–18:00 白天)" aria-label="当前时段">
241
- <svg class="icon moon" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M9.6 1.8a6.3 6.3 0 1 0 4.6 10.4A6.9 6.9 0 0 1 9.6 1.8Z"/></svg>
242
- <svg class="icon sun" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" aria-hidden="true"><circle cx="8" cy="8" r="2.6" fill="currentColor" stroke="none"/><path d="M8 1v1.6M8 13.4V15M1 8h1.6M13.4 8H15M2.9 2.9l1.1 1.1M12 12l1.1 1.1M13.1 2.9 12 4M4 12l-1.1 1.1"/></svg>
243
- </span><b>智能体办公室</b><span>DSH 实时会话办公室</span></div>
307
+ <div class="brand"><b>Office</b><span>DSH 实时会话办公室</span></div>
244
308
  <div id="headStats">
245
309
  <div class="hstat tokens" title="本周 token 用量"><span>本周</span><b id="headTokens">—</b><small>tokens</small></div>
246
310
  <div class="hstat" title="DeepSeek 平台余额"><span>余额</span><b id="headBalance">—</b></div>
@@ -258,7 +322,7 @@
258
322
 
259
323
  <aside id="right">
260
324
  <section id="card" class="panel">
261
- <button id="cardx" title="关闭">×</button>
325
+ <button id="cardx" title="关闭" aria-label="关闭详情"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M4 4l8 8M12 4l-8 8"/></svg></button>
262
326
  <div class="panel__head"><span>会话详情</span><b id="cardTeam"></b></div>
263
327
  <div class="card__title"><span class="glyph" id="cardGlyph">◆</span><div><b id="cardName"></b><span id="cardSub"></span></div></div>
264
328
  <div class="card__status" id="cardStatus"></div>