dsh-agent-office 4.1.8 → 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/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # 智能体办公室 · DSH 插件版
1
+ # Office · DSH 插件版
2
2
 
3
3
  > 非官方第三方插件,与 DeepSeek 官方无隶属或背书关系。
4
4
 
@@ -9,6 +9,8 @@
9
9
 
10
10
  ![全局视角](screenshot.png)
11
11
 
12
+ ![白天主题](screenshot-day.png)
13
+
12
14
  ![单层聚焦](screenshot-focus.png)
13
15
 
14
16
  ## 特性
@@ -21,7 +23,10 @@
21
23
  - 💳 **DeepSeek 余额卡**:读取本机 DSH 登录凭证,查询平台充值钱包余额与赠金(只展示币种/金额,token 不出本机进程);
22
24
  - 🖥️ **显示器状态**:休息/完成时黑屏待机;工作中显示代码编辑器(滚动行 + 光标);工作超过 5 分钟或卡住时显示红色「HIGH LOAD / 执行任务时间过长」告警;
23
25
  - 🐱 **猫猫 Agent(Catora 主题)**:用 catora-cat 的 logo / 表情差分 PNG 做成平面贴图立牌(Three.js Sprite),**永远面向相机**,颜色按 Agent 调色;空闲时用 sleepy 表情 + 飘「Z」睡觉,其他状态用 happy/surprised/dizzy/loved;猫咪用 GSAP 做上下浮动动画,座垫上带随浮动变化的软阴影;
24
- - 🖼️ **自定义猫咪图片**:DSH 设置 →「智能体办公室」上传图片即可替换所有 Agent 头像(本地 localStorage 保存,不上传服务器);
26
+ - 🖼️ **自定义猫咪图片**:DSH 设置 →「Office」上传图片即可替换所有 Agent 头像(本地 localStorage 保存,不上传服务器);
27
+ - 🎚️ **面板不透明度**:DSH 设置 →「Office」可调 HUD 卡片透明度(50%–95%),面板实时跟随;
28
+ - 😅 **状态表情**:正常工作猫猫大汗淋漓;工作超过 5 分钟进入红温,头顶乱线;待机改成两条小缝;
29
+ - 🏢 **双办公室 + MCP 链路**:主楼右侧新增 Annex(3 个固定工位、讲台、小型健身房、备考隔间),虚线 MCP 链路带流动光点,两端蓝色 ✕ 表示暂未接通;
25
30
 
26
31
  - 🏢 **3D 实时办公室**:Three.js 自绘的错层办公室——每层有工位、显示器、会议桌、白板、服务器机柜、玻璃护栏和吊灯;每个会话是一个简洁的立方体 Agent(按状态做呼吸/浮动脉冲,工作/等待/卡住/待机各有反馈);
27
32
  - 🖱️ **楼层聚焦**:左键点任意楼层(或左侧楼层列表)→ 只显示并看清这一层;右键 /「全局视角」按钮 / `Esc` 回到整栋楼的全局视角;
@@ -56,7 +61,7 @@ DSH="/Applications/DeepSeek Harness.app/Contents/Resources/runtime/cli/bin/dsh"
56
61
  "$DSH" plugin --profile desktop add github:mayc0202/dsh-agent-office
57
62
  ```
58
63
 
59
- 安装后在「插件」页勾选 **智能体办公室**(或把 `dsh-agent-office` 追加到
64
+ 安装后在「插件」页勾选 **Office**(或把 `dsh-agent-office` 追加到
60
65
  `~/.dsh/profiles/desktop/package.json` 的 `dsh.profile.bundles`),重启 DSH 生效。
61
66
 
62
67
  ### 方式 C:本地目录
package/lib/client.js CHANGED
@@ -1,11 +1,13 @@
1
+ (() => {
1
2
  /**
2
- * 智能体办公室 —— DSH 客户端半侧。
3
+ * Office —— DSH 客户端半侧。
3
4
  *
4
5
  * 在页面右下角放一个猫头悬浮按钮,点击打开全屏 iframe(/agent-office/)。
5
- * 同时在 DSH 的「设置」里注册一个「智能体办公室」设置分区,用来上传自定义猫咪图片。
6
+ * 同时在 DSH 的「设置」里注册一个「Office」设置分区,用来上传自定义猫咪图片。
6
7
  * 纯 DOM + React 插槽,不依赖宿主 side 的额外接口。
7
8
  */
8
9
  const CUSTOM_FACE_KEY = 'agent-office-custom-face'
10
+ const GLASS_KEY = 'agent-office-ui-opacity'
9
11
  const CAT_BUTTON = 'data:image/png;base64,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'
10
12
 
11
13
  window.__ModuleLoader__.load({
@@ -55,10 +57,17 @@ window.__ModuleLoader__.load({
55
57
  const readCustom = () => {
56
58
  try { return localStorage.getItem(CUSTOM_FACE_KEY) ?? '' } catch { return '' }
57
59
  }
60
+ const readGlass = () => {
61
+ try {
62
+ const value = Number.parseFloat(localStorage.getItem(GLASS_KEY) ?? '')
63
+ return Number.isFinite(value) ? Math.min(95, Math.max(50, Math.round(value))) : 80
64
+ } catch { return 80 }
65
+ }
58
66
  return function NightShiftSettings() {
59
67
  const [preview, setPreview] = useState(readCustom)
60
68
  const [message, setMessage] = useState('')
61
69
  const [busy, setBusy] = useState(false)
70
+ const [glass, setGlass] = useState(readGlass())
62
71
 
63
72
  const choose = async event => {
64
73
  const file = event.target.files?.[0]
@@ -88,6 +97,17 @@ window.__ModuleLoader__.load({
88
97
  setMessage('已恢复默认 Catora 猫咪')
89
98
  }
90
99
 
100
+ const changeGlass = event => {
101
+ const value = Math.min(95, Math.max(50, Number(event.target.value)))
102
+ setGlass(value)
103
+ try { localStorage.setItem(GLASS_KEY, String(value)) } catch {}
104
+ }
105
+
106
+ const resetGlass = () => {
107
+ try { localStorage.removeItem(GLASS_KEY) } catch {}
108
+ setGlass(80)
109
+ }
110
+
91
111
  const titleStyle = { fontSize: 15, fontWeight: 600, margin: '0 0 6px' }
92
112
  const textStyle = { fontSize: 13, lineHeight: 1.6, margin: '0 0 10px', opacity: 0.72 }
93
113
  const buttonStyle = { height: 32, padding: '0 14px', borderRadius: 8, border: '1px solid rgba(127,127,127,.35)', background: 'transparent', color: 'inherit', cursor: 'pointer', fontSize: 13 }
@@ -95,23 +115,42 @@ window.__ModuleLoader__.load({
95
115
  return jsx('div', {
96
116
  style: { padding: '4px 0', maxWidth: 520 },
97
117
  children: [
98
- jsx('h3', { style: titleStyle, children: '智能体办公室' }),
118
+ jsx('h3', { style: titleStyle, children: 'Office' }),
99
119
  jsx('p', { style: textStyle, children: '上传一张图片,替换 3D 面板里所有 Agent 的猫咪头像(本地保存,不会上传到服务器)。' }),
100
120
  preview ? jsx('img', {
101
121
  src: preview,
102
122
  alt: '自定义猫咪预览',
103
123
  style: { width: 96, height: 96, objectFit: 'contain', borderRadius: 12, border: '1px solid rgba(127,127,127,.3)', background: 'rgba(127,127,127,.08)', display: 'block', marginBottom: 12 },
104
124
  }) : null,
105
- jsx('div', { style: { display: 'flex', gap: 10, alignItems: 'center', flexWrap: 'wrap' } }, [
125
+ jsx('div', { style: { display: 'flex', gap: 10, alignItems: 'center', flexWrap: 'wrap' }, children: [
106
126
  jsx('label', {
127
+ className: 'ns-setting-btn',
107
128
  style: { ...buttonStyle, display: 'inline-flex', alignItems: 'center', opacity: busy ? 0.6 : 1 },
108
129
  children: [
109
130
  busy ? '处理中…' : '上传图片',
110
131
  jsx('input', { type: 'file', accept: 'image/*', style: { display: 'none' }, onChange: choose, disabled: busy }),
111
132
  ],
112
133
  }),
113
- jsx('button', { type: 'button', style: buttonStyle, onClick: reset, children: '恢复默认猫猫' }),
114
- ]),
134
+ jsx('button', { type: 'button', className: 'ns-setting-btn', style: buttonStyle, onClick: reset, children: '恢复默认猫猫' }),
135
+ ] }),
136
+ jsx('div', {
137
+ style: { marginTop: 18, padding: '14px 16px', border: '1px solid rgba(127,127,127,.28)', borderRadius: 12, background: 'rgba(127,127,127,.06)' },
138
+ children: [
139
+ jsx('div', { style: { display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 12 }, children: [
140
+ jsx('span', { style: { fontSize: 13, fontWeight: 600 }, children: '卡片不透明度' }),
141
+ jsx('b', { style: { fontSize: 13, fontFamily: 'ui-monospace,monospace' }, children: glass + '%' }),
142
+ ] }),
143
+ jsx('input', {
144
+ type: 'range', min: 50, max: 95, step: 1, value: glass, onChange: changeGlass,
145
+ 'aria-label': '卡片不透明度',
146
+ style: { width: '100%', margin: '10px 0 6px', accentColor: '#087565', cursor: 'pointer' },
147
+ }),
148
+ jsx('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', gap: 10 }, children: [
149
+ jsx('span', { style: { ...textStyle, margin: 0, fontSize: 12 }, children: '越低越通透;文字始终保持清晰。' }),
150
+ jsx('button', { type: 'button', className: 'ns-setting-btn', style: { ...buttonStyle, height: 28, padding: '0 10px', flex: 'none' }, onClick: resetGlass, children: '恢复主题默认' }),
151
+ ] }),
152
+ ],
153
+ }),
115
154
  message ? jsx('p', { style: { ...textStyle, marginTop: 10, marginBottom: 0 }, children: message }) : null,
116
155
  ],
117
156
  })
@@ -127,6 +166,7 @@ window.__ModuleLoader__.load({
127
166
  .dsh-ns-host{position:fixed;z-index:1200;right:20px;bottom:20px;display:flex;flex-direction:column;align-items:flex-end;gap:10px;font-family:Inter,system-ui,-apple-system,"PingFang SC","Microsoft YaHei",sans-serif;-webkit-app-region:no-drag}
128
167
  .dsh-ns-pill{position:relative;display:grid;place-items:center;width:52px;height:52px;padding:0;border:0;background:transparent;box-shadow:none;cursor:pointer;transition:transform .15s ease}
129
168
  .dsh-ns-pill:hover{transform:translateY(-2px) scale(1.04)}
169
+ .dsh-ns-pill:active{transform:translateY(0) scale(.96)}
130
170
  .dsh-ns-pill img{width:46px;height:46px;object-fit:contain;display:block;pointer-events:none;filter:drop-shadow(0 6px 14px rgba(0,0,0,.55))}
131
171
  .dsh-ns-eye{position:absolute;width:5px;height:11px;border-radius:50%;background:#0b0e13;pointer-events:none;left:35.8%;top:57.7%;transform:translate(calc(-50% + var(--ex,0px)), calc(-50% + var(--ey,0px)));transition:transform .08s linear}
132
172
  .dsh-ns-eye.right{left:63.5%}
@@ -136,6 +176,11 @@ window.__ModuleLoader__.load({
136
176
  .dsh-ns-overlay iframe{display:block;width:100%;height:100%;border:0;background:#060607}
137
177
  .dsh-ns-close{position:absolute;top:auto;bottom:18px;right:16px;z-index:2;width:34px;height:34px;border-radius:50%;border:1px solid rgba(255,255,255,.18);background:rgba(20,20,23,.86);color:#f2f0ea;font-size:18px;line-height:1;cursor:pointer;backdrop-filter:blur(8px)}
138
178
  .dsh-ns-close:hover{background:rgba(40,40,45,.95)}
179
+ .dsh-ns-close:active,.dsh-ns-open:active{transform:scale(.96)}
180
+ .dsh-ns-close,.dsh-ns-open{transition:background-color .15s ease,transform .12s ease}
181
+ .ns-setting-btn{position:relative;transition:transform .12s ease,background-color .15s ease}
182
+ .ns-setting-btn::before{content:"";position:absolute;inset:-4px;border-radius:10px}
183
+ .ns-setting-btn:active{transform:scale(.96)}
139
184
  .dsh-ns-open{position:absolute;top:auto;bottom:18px;right:58px;z-index:2;height:34px;padding:0 12px;border-radius:999px;border:1px solid rgba(255,255,255,.18);background:rgba(20,20,23,.86);color:#f2f0ea;font-size:12px;font-weight:600;cursor:pointer;backdrop-filter:blur(8px)}
140
185
  .dsh-ns-open:hover{background:rgba(40,40,45,.95)}
141
186
  html[data-fullscreen] .dsh-ns-pill{bottom:12px}
@@ -145,11 +190,11 @@ window.__ModuleLoader__.load({
145
190
  const host = document.createElement('div')
146
191
  host.className = 'dsh-ns-host'
147
192
  host.innerHTML = `
148
- <button type="button" class="dsh-ns-pill" aria-label="打开智能体办公室" title="打开智能体办公室"><img alt="" /><span class="dsh-ns-eye left"></span><span class="dsh-ns-eye right"></span></button>
193
+ <button type="button" class="dsh-ns-pill" aria-label="打开 Office" title="打开 Office"><img alt="" /><span class="dsh-ns-eye left"></span><span class="dsh-ns-eye right"></span></button>
149
194
  <section class="dsh-ns-overlay" hidden>
150
195
  <button type="button" class="dsh-ns-open">在新标签打开</button>
151
196
  <button type="button" class="dsh-ns-close" aria-label="关闭">×</button>
152
- <iframe title="智能体办公室 3D 面板"></iframe>
197
+ <iframe title="Office 3D 面板"></iframe>
153
198
  </section>
154
199
  `
155
200
  document.body.append(host)
@@ -190,7 +235,7 @@ window.__ModuleLoader__.load({
190
235
  host.querySelector('.dsh-ns-close').addEventListener('click', close)
191
236
  host.querySelector('.dsh-ns-open').addEventListener('click', () => window.open('/agent-office/', '_blank', 'noopener'))
192
237
 
193
- // 在 DSH 设置中注册「智能体办公室」分区:上传自定义猫咪图片
238
+ // 在 DSH 设置中注册「Office」分区:上传自定义猫咪图片
194
239
  if (react && jsx && ctx?.slots?.inject) {
195
240
  try {
196
241
  const SettingsSection = makeSettingsSection(react, jsx)
@@ -199,7 +244,7 @@ window.__ModuleLoader__.load({
199
244
  name: 'settings.section',
200
245
  id: 'agent-office',
201
246
  order: 36,
202
- label: () => '智能体办公室',
247
+ label: () => 'Office',
203
248
  inject: () => ({}),
204
249
  }, SettingsSection)
205
250
  })
@@ -215,3 +260,4 @@ window.__ModuleLoader__.load({
215
260
  return module.exports
216
261
  },
217
262
  })
263
+ })()