dsh-agent-office 4.2.0 → 4.6.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 +8 -3
- package/lib/client.js +52 -8
- package/lib/panel.html +305 -241
- package/package.json +2 -1
- package/panel-src/assets/exp-slits.png +0 -0
- package/panel-src/index.html +118 -54
- package/panel-src/main.js +527 -20
- package/screenshot-day.png +0 -0
- package/screenshot-focus.png +0 -0
- package/screenshot.png +0 -0
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Office · DSH 插件版
|
|
2
2
|
|
|
3
3
|
> 非官方第三方插件,与 DeepSeek 官方无隶属或背书关系。
|
|
4
4
|
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
|
|
10
10
|

|
|
11
11
|
|
|
12
|
+

|
|
13
|
+
|
|
12
14
|

|
|
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 设置
|
|
26
|
+
- 🖼️ **自定义猫咪图片**:DSH 设置 →「Office」上传图片即可替换所有 Agent 头像(本地 localStorage 保存,不上传服务器);
|
|
27
|
+
- 🎚️ **面板不透明度**:DSH 设置 →「Office」可调 HUD 卡片透明度(50%–95%),面板实时跟随;
|
|
28
|
+
- 😅 **状态表情**:正常工作猫猫大汗淋漓;工作超过 5 分钟进入红温,头顶乱线;待机改成两条小缝;
|
|
29
|
+
- 🏢 **双办公室 + MCP 链路**:主楼右侧 Annex 是教室布局:后方讲台,三席面朝讲台——通用工位、备考隔间、题库工位(浮动 OCR / 数据库 / 试卷全息图标);虚线 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
|
-
安装后在「插件」页勾选
|
|
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,12 +1,13 @@
|
|
|
1
1
|
(() => {
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Office —— DSH 客户端半侧。
|
|
4
4
|
*
|
|
5
5
|
* 在页面右下角放一个猫头悬浮按钮,点击打开全屏 iframe(/agent-office/)。
|
|
6
|
-
* 同时在 DSH
|
|
6
|
+
* 同时在 DSH 的「设置」里注册一个「Office」设置分区,用来上传自定义猫咪图片。
|
|
7
7
|
* 纯 DOM + React 插槽,不依赖宿主 side 的额外接口。
|
|
8
8
|
*/
|
|
9
9
|
const CUSTOM_FACE_KEY = 'agent-office-custom-face'
|
|
10
|
+
const GLASS_KEY = 'agent-office-ui-opacity'
|
|
10
11
|
const CAT_BUTTON = 'data:image/png;base64,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'
|
|
11
12
|
|
|
12
13
|
window.__ModuleLoader__.load({
|
|
@@ -56,10 +57,17 @@ window.__ModuleLoader__.load({
|
|
|
56
57
|
const readCustom = () => {
|
|
57
58
|
try { return localStorage.getItem(CUSTOM_FACE_KEY) ?? '' } catch { return '' }
|
|
58
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
|
+
}
|
|
59
66
|
return function NightShiftSettings() {
|
|
60
67
|
const [preview, setPreview] = useState(readCustom)
|
|
61
68
|
const [message, setMessage] = useState('')
|
|
62
69
|
const [busy, setBusy] = useState(false)
|
|
70
|
+
const [glass, setGlass] = useState(readGlass())
|
|
63
71
|
|
|
64
72
|
const choose = async event => {
|
|
65
73
|
const file = event.target.files?.[0]
|
|
@@ -89,6 +97,17 @@ window.__ModuleLoader__.load({
|
|
|
89
97
|
setMessage('已恢复默认 Catora 猫咪')
|
|
90
98
|
}
|
|
91
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
|
+
|
|
92
111
|
const titleStyle = { fontSize: 15, fontWeight: 600, margin: '0 0 6px' }
|
|
93
112
|
const textStyle = { fontSize: 13, lineHeight: 1.6, margin: '0 0 10px', opacity: 0.72 }
|
|
94
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 }
|
|
@@ -96,7 +115,7 @@ window.__ModuleLoader__.load({
|
|
|
96
115
|
return jsx('div', {
|
|
97
116
|
style: { padding: '4px 0', maxWidth: 520 },
|
|
98
117
|
children: [
|
|
99
|
-
jsx('h3', { style: titleStyle, children: '
|
|
118
|
+
jsx('h3', { style: titleStyle, children: 'Office' }),
|
|
100
119
|
jsx('p', { style: textStyle, children: '上传一张图片,替换 3D 面板里所有 Agent 的猫咪头像(本地保存,不会上传到服务器)。' }),
|
|
101
120
|
preview ? jsx('img', {
|
|
102
121
|
src: preview,
|
|
@@ -105,14 +124,33 @@ window.__ModuleLoader__.load({
|
|
|
105
124
|
}) : null,
|
|
106
125
|
jsx('div', { style: { display: 'flex', gap: 10, alignItems: 'center', flexWrap: 'wrap' }, children: [
|
|
107
126
|
jsx('label', {
|
|
127
|
+
className: 'ns-setting-btn',
|
|
108
128
|
style: { ...buttonStyle, display: 'inline-flex', alignItems: 'center', opacity: busy ? 0.6 : 1 },
|
|
109
129
|
children: [
|
|
110
130
|
busy ? '处理中…' : '上传图片',
|
|
111
131
|
jsx('input', { type: 'file', accept: 'image/*', style: { display: 'none' }, onChange: choose, disabled: busy }),
|
|
112
132
|
],
|
|
113
133
|
}),
|
|
114
|
-
jsx('button', { type: 'button', style: buttonStyle, onClick: reset, children: '恢复默认猫猫' }),
|
|
134
|
+
jsx('button', { type: 'button', className: 'ns-setting-btn', style: buttonStyle, onClick: reset, children: '恢复默认猫猫' }),
|
|
115
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
|
+
}),
|
|
116
154
|
message ? jsx('p', { style: { ...textStyle, marginTop: 10, marginBottom: 0 }, children: message }) : null,
|
|
117
155
|
],
|
|
118
156
|
})
|
|
@@ -128,6 +166,7 @@ window.__ModuleLoader__.load({
|
|
|
128
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}
|
|
129
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}
|
|
130
168
|
.dsh-ns-pill:hover{transform:translateY(-2px) scale(1.04)}
|
|
169
|
+
.dsh-ns-pill:active{transform:translateY(0) scale(.96)}
|
|
131
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))}
|
|
132
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}
|
|
133
172
|
.dsh-ns-eye.right{left:63.5%}
|
|
@@ -137,6 +176,11 @@ window.__ModuleLoader__.load({
|
|
|
137
176
|
.dsh-ns-overlay iframe{display:block;width:100%;height:100%;border:0;background:#060607}
|
|
138
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)}
|
|
139
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)}
|
|
140
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)}
|
|
141
185
|
.dsh-ns-open:hover{background:rgba(40,40,45,.95)}
|
|
142
186
|
html[data-fullscreen] .dsh-ns-pill{bottom:12px}
|
|
@@ -146,11 +190,11 @@ window.__ModuleLoader__.load({
|
|
|
146
190
|
const host = document.createElement('div')
|
|
147
191
|
host.className = 'dsh-ns-host'
|
|
148
192
|
host.innerHTML = `
|
|
149
|
-
<button type="button" class="dsh-ns-pill" aria-label="
|
|
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>
|
|
150
194
|
<section class="dsh-ns-overlay" hidden>
|
|
151
195
|
<button type="button" class="dsh-ns-open">在新标签打开</button>
|
|
152
196
|
<button type="button" class="dsh-ns-close" aria-label="关闭">×</button>
|
|
153
|
-
<iframe title="
|
|
197
|
+
<iframe title="Office 3D 面板"></iframe>
|
|
154
198
|
</section>
|
|
155
199
|
`
|
|
156
200
|
document.body.append(host)
|
|
@@ -191,7 +235,7 @@ window.__ModuleLoader__.load({
|
|
|
191
235
|
host.querySelector('.dsh-ns-close').addEventListener('click', close)
|
|
192
236
|
host.querySelector('.dsh-ns-open').addEventListener('click', () => window.open('/agent-office/', '_blank', 'noopener'))
|
|
193
237
|
|
|
194
|
-
// 在 DSH
|
|
238
|
+
// 在 DSH 设置中注册「Office」分区:上传自定义猫咪图片
|
|
195
239
|
if (react && jsx && ctx?.slots?.inject) {
|
|
196
240
|
try {
|
|
197
241
|
const SettingsSection = makeSettingsSection(react, jsx)
|
|
@@ -200,7 +244,7 @@ window.__ModuleLoader__.load({
|
|
|
200
244
|
name: 'settings.section',
|
|
201
245
|
id: 'agent-office',
|
|
202
246
|
order: 36,
|
|
203
|
-
label: () => '
|
|
247
|
+
label: () => 'Office',
|
|
204
248
|
inject: () => ({}),
|
|
205
249
|
}, SettingsSection)
|
|
206
250
|
})
|