🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

虚拟办公室 wyx135230/DeepSeek-Office

DeepSeek Harness
wyx13523012 天前有提交已提供中文文档扫描:含敏感能力

和你的 AI 团队,在同一间办公室里工作、开会与休息。

31.4/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/23 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add wyx135230/DeepSeek-Office
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · tool
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 12 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/20) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 63 处,展示前 62 条)
  • 执行外部命令固定命令
    docker/test.mjs:14
    const result = spawnSync('docker', args, {
  • 写入本地文件
    ds-bot/dev/characters.mjs:580
    writeFileSync(process.argv[out + 1], `<!doctype html><meta charset="utf-8"><style>body{margin:0;font:13px -apple-system,system-ui,sans-serif;backgroun
  • 写入本地文件
    ds-bot/dev/llm-tap.mjs:30
    if (bodies) mkdirSync(bodies, { recursive: true })
  • 发起网络请求
    ds-bot/dev/llm-tap.mjs:178
    upstreamResponse = await fetch(`${base}${req.url.replace(/^ v1/, '')}`, { method: req.method, headers, body: raw.length > 0 ? raw : undefined })
  • 写入本地文件
    ds-bot/dev/llm-tap.mjs:182
    appendFileSync(log, JSON.stringify({ t: new Date().toISOString(), id, path: req.url, error: error.message }) + '\n')
  • 写入本地文件
    ds-bot/dev/llm-tap.mjs:197
    appendFileSync(log, JSON.stringify({ t: new Date().toISOString(), id, path: req.url, status: upstreamResponse.status }) + '\n')
  • 写入本地文件
    ds-bot/dev/llm-tap.mjs:206
    if (bodies) writeFileSync(path.join(bodies, `${id}-${call.kind}-${String(who).replace(/[^ .-]+/g, '_')}.json`), raw)
  • 写入本地文件
    ds-bot/dev/llm-tap.mjs:207
    appendFileSync(log, JSON.stringify({
  • 写入本地文件
    ds-bot/dev/logo.mjs:29
    mkdirSync(out, { recursive: true })
  • 写入本地文件
    ds-bot/dev/logo.mjs:32
    writeFileSync(file, logo(mode))
  • 读取本地文件
    ds-bot/dev/memory-e2e.mjs:27
    const url = readFileSync(join(HOME, 'web.log'), 'utf8').match(new RegExp(`http://127\\.0\\.0\\.1:${PORT}/\\?token=\\S+`))?.[0]
  • 发起网络请求
    ds-bot/dev/memory-e2e.mjs:29
    cookie = (await fetch(url, { redirect: 'manual' })).headers.getSetCookie().map(value => value.split(';')[0]).join('; ')
  • 发起网络请求
    ds-bot/dev/memory-e2e.mjs:31
    const response = await fetch(`${BASE}/api/bot`, { method: 'POST', headers: { 'content-type': 'application/json', cookie }, body: JSON.stringify({ endp
  • 读取本地文件
    ds-bot/dev/memory-e2e.mjs:51
    const tapLines = () => (args.tap && existsSync(args.tap) ? readFileSync(args.tap, 'utf8').split('\n').filter(Boolean).map(line => JSON.parse(line)) :
  • 读取本地文件
    ds-bot/dev/memory-e2e.mjs:51
    const tapLines = () => (args.tap && existsSync(args.tap) ? readFileSync(args.tap, 'utf8').split('\n').filter(Boolean).map(line => JSON.parse(line)) :
  • 读取本地文件
    ds-bot/dev/memory-e2e.mjs:54
    return existsSync(path) ? readFileSync(path, 'utf8').split('\n').filter(Boolean).map(line => JSON.parse(line)) : []
  • 读取本地文件
    ds-bot/dev/memory-e2e.mjs:54
    return existsSync(path) ? readFileSync(path, 'utf8').split('\n').filter(Boolean).map(line => JSON.parse(line)) : []
  • 写入本地文件
    ds-bot/dev/memory-e2e.mjs:186
    if (args.out) writeFileSync(args.out, JSON.stringify({ memory, results, log, journal: journal() }, null, 2))
  • 写入本地文件
    ds-bot/dev/mock-llm.mjs:61
    mkdirSync(dirname(LOG), { recursive: true })
  • 写入本地文件
    ds-bot/dev/mock-llm.mjs:599
    appendFileSync(LOG, JSON.stringify({ t: new Date().toISOString(), id: ++seq, images: 0, searchApi: { path: req.url, body, auth: req.headers.authorizat
  • 写入本地文件
    ds-bot/dev/mock-llm.mjs:621
    appendFileSync(LOG, JSON.stringify({ t: new Date().toISOString(), id, images, rejectedImages: true, messages: body.messages?.length ?? 0, last: textOf
  • 写入本地文件
    ds-bot/dev/mock-llm.mjs:629
    appendFileSync(LOG, JSON.stringify({ t: new Date().toISOString(), id, images, overflow: true, messages: body.messages?.length ?? 0, last: textOf(body.
  • 写入本地文件
    ds-bot/dev/mock-llm.mjs:635
    appendFileSync(LOG, JSON.stringify({ t: new Date().toISOString(), id, images, auth: true, messages: body.messages?.length ?? 0 }) + '\n')
  • 写入本地文件
    ds-bot/dev/mock-llm.mjs:641
    appendFileSync(LOG, JSON.stringify({ t: new Date().toISOString(), id, images, fail: true, messages: body.messages?.length ?? 0 }) + '\n')
  • 读取本地文件
    ds-bot/dev/office-bench.mjs:15
    const pkg = JSON.parse(readFileSync(join(plugin, 'package.json'), 'utf8'))
  • 读取本地文件
    ds-bot/dev/office-bench.mjs:18
    if (!existsSync(cli)) throw new Error('Run npm run harness first')
  • 写入本地文件
    ds-bot/dev/office-bench.mjs:30
    mkdirSync(profile, { recursive: true })
  • 读取本地文件
    ds-bot/dev/office-bench.mjs:31
    if (!existsSync(join(profile, 'package.json'))) writeFileSync(join(profile, 'package.json'), `${JSON.stringify({ name: 'office-test-profile', private:
  • 写入本地文件
    ds-bot/dev/office-bench.mjs:31
    if (!existsSync(join(profile, 'package.json'))) writeFileSync(join(profile, 'package.json'), `${JSON.stringify({ name: 'office-test-profile', private:
  • 写入本地文件
    ds-bot/dev/office-bench.mjs:32
    writeFileSync(join(profile, 'pnpm-workspace.yaml'), 'packages:\n - .\n\nnodeLinker: hoisted\nautoInstallPeers: false\n')
  • 写入本地文件
    ds-bot/dev/office-bench.mjs:34
    writeFileSync(overlay, '- id: bot\n config:\n checkRatio: 0.45\n- id: llm-deepseek\n config:\n models:\n - { id: deepseek-flash, contextW
  • 写入本地文件
    ds-bot/dev/office-bench.mjs:46
    const log = createWriteStream(join(home, logName), { flags: 'w' })
  • 执行外部命令来自配置/变量
    ds-bot/dev/office-bench.mjs:47
    const child = spawn(process.execPath, [script, ...args], { cwd: plugin, env, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] })
  • 写入本地文件
    ds-bot/dev/read-page-check.mjs:33
    if (outDir) mkdirSync(outDir, { recursive: true })
  • 写入本地文件
    ds-bot/dev/read-page-check.mjs:48
    writeFileSync(join(outDir, `${String(index + 1).padStart(2, '0')}-read.json`), JSON.stringify({ url, ms, ...read }, null, 2))
  • 写入本地文件
    ds-bot/dev/read-page-check.mjs:49
    writeFileSync(join(outDir, `${String(index + 1).padStart(2, '0')}-tool-result.txt`), text)
  • 读取本地文件
    ds-bot/dev/read-pages.mjs:27
    const file = await readFile(join(root, name))
  • 读取本地文件
    ds-bot/dev/shared-home-check.mjs:24
    const saved = () => JSON.parse(readFileSync(join(HOME, 'bot', 'state.json'), 'utf8'))
  • 读取本地文件
    ds-bot/dev/shared-home-check.mjs:28
    const log = readFileSync(join(HOME, 'web.log'), 'utf8')
  • 发起网络请求
    ds-bot/dev/shared-home-check.mjs:31
    const cookie = (await fetch(login, { redirect: 'manual' })).headers.getSetCookie().map(value => value.split(';')[0]).join('; ')
  • 发起网络请求
    ds-bot/dev/shared-home-check.mjs:32
    const web = (endpoint, payload = {}) => fetch(`http://127.0.0.1:${webPort}/api/bot`, {
  • 发起网络请求
    ds-bot/dev/shared-home-check.mjs:37
    const desktop = (endpoint, payload = {}) => page.evaluate(([e, p]) => fetch('api/bot', {
  • 读取本地文件
    ds-bot/dev/smoke.mjs:29
    const readJson = path => JSON.parse(readFileSync(path, 'utf8'))
  • 读取本地文件
    ds-bot/dev/smoke.mjs:32
    return readFileSync(join(HOME, 'mock.jsonl'), 'utf8').split('\n').filter(Boolean).map(line => JSON.parse(line))
  • 读取本地文件
    ds-bot/dev/smoke.mjs:40
    const log = readFileSync(join(HOME, 'web.log'), 'utf8')
  • 发起网络请求
    ds-bot/dev/smoke.mjs:43
    const response = await fetch(url, { redirect: 'manual' })
  • 发起网络请求
    ds-bot/dev/smoke.mjs:51
    const response = await fetch(`${BASE}/api/bot`, {
  • 读取本地文件
    ds-bot/dev/smoke.mjs:300
    const folderOf = sessionId => readdirSync(join(HOME, 'sessions')).find(dir => existsSync(join(HOME, 'sessions', dir, sessionId)))
  • 读取本地文件
    ds-bot/dev/smoke.mjs:300
    const folderOf = sessionId => readdirSync(join(HOME, 'sessions')).find(dir => existsSync(join(HOME, 'sessions', dir, sessionId)))
  • 删除本地文件递归
    ds-bot/dev/smoke.mjs:315
    rmSync(project, { recursive: true, force: true })
  • 写入本地文件
    ds-bot/dev/smoke.mjs:376
    if (outFile) writeFileSync(outFile, `${JSON.stringify(transcript, null, 2)}\n`)
  • 发起网络请求
    ds-bot/dev/steward-eval.mjs:177
    const response = await fetch(url, { method: 'POST', headers, body: JSON.stringify(body) })
  • 写入本地文件
    ds-bot/dev/steward-eval.mjs:211
    if (args.out) writeFileSync(args.out, JSON.stringify(results, null, 2))
  • 写入本地文件
    ds-bot/dev/ui-shots.mjs:29
    mkdirSync(outDir, { recursive: true })
  • 执行外部命令固定命令
    ds-bot/dev/ui-shots.mjs:34
    try { return execFileSync('sh', ['-c', `command -v ${name}`], { encoding: 'utf8' }).trim() } catch {}
  • 读取本地文件
    ds-bot/dev/ui-shots.mjs:48
    const log = readFileSync(join(root, `.dsh-test-${target}`, 'web.log'), 'utf8')
  • 发起网络请求
    ds-bot/dev/ui-shots.mjs:75
    const result = await page.evaluate(([e, p]) => fetch('api/bot', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringif
  • 发起网络请求
    ds-bot/web-search.js:376
    return { id, name: shape.name, url: shape.url(base, model), model, auth: shape.auth, request: call => shape.request({ ...call, model }), read: shape.r
  • 发起网络请求
    ds-bot/web-search.js:562
    const call = candidate.request({ query: request.query, maxResults: request.maxResults })
  • 发起网络请求
    ds-bot/web-search.js:567
    response = await deps.fetch(candidate.url, {
  • 发起网络请求
    ds-bot/web-search.js:772
    fetch: (url, init) => fetch(url, init),
  • 发起网络请求
    ds-bot/web-search.js:773
    webFetch: (request, signal) => ctx.web.fetch(request, signal),
扫描于 2026/11/3(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

用 dsh-bot 插件做的沉浸式 2.5D 办公室游戏,和你的智能体员工交互协作。

README

由 DeepSeek 最新模型翻译生成
DeepSeek Office 和你的 AI 团队,在同一间办公室里工作、开会与休息。 基于 DeepSeek Harness 的现代 2.5D 办公室模拟,让长期智能体与真实群聊拥有一个可以走进去的空间。 English · 简体中文 v0.7.1 · Three.js + Phaser · 代码采用 Apache-2.0 项目亮点 · 画面展示 · 安装教程 · 怎么玩 · 开发计划 截图来自本地隔离测试团队的实际运行画面。办公室模型与贴图随插件打包。 创建一个团队,给每个人安排职责,然后走进他们的办公室。每个群聊都会变成一层楼:同事拥有自己的工位,会集合开会、共坐沙发,也会起身去喝杯咖啡。他们的工作与对话仍通过原有 Harness 智能体系统运行。 DeepSeek Office 基于 DS Bot,使用 DeepSeek Harness 的公开插件接口。长期身份、记忆、群聊协作、模型设置和权限控制,都继续属于同一支 AI 团队。 0.7.1 更新内容 - 兼容新版 DSH 更新:修复 already-installed,通过 DSH 公开插件管理 API 替换插件包,保留启用状态,并兼容旧版配置安装后重启的流程。 - 版本核验与失败恢复:检查实际安装版本,替换失败时尝试装回旧版本。已有 0.6.1、0.7.0 用户需先手动替换一次插件包,详见下方升级说明。
展开完整文档(README 剩余 1 节)
DeepSeek Office
和你的 AI 团队,在同一间办公室里工作、开会与休息。
基于 DeepSeek Harness 的现代 2.5D 办公室模拟,让长期智能体与真实群聊拥有一个可以走进去的空间。
English · 简体中文 v0.7.1 · Three.js + Phaser · 代码采用 Apache-2.0 项目亮点 · 画面展示 · 安装教程 · 怎么玩 · 开发计划

截图来自本地隔离测试团队的实际运行画面。办公室模型与贴图随插件打包。

创建一个团队,给每个人安排职责,然后走进他们的办公室。每个群聊都会变成一层楼:同事拥有自己的工位,会集合开会、共坐沙发,也会起身去喝杯咖啡。他们的工作与对话仍通过原有 Harness 智能体系统运行。

DeepSeek Office 基于 DS Bot,使用 DeepSeek Harness 的公开插件接口。长期身份、记忆、群聊协作、模型设置和权限控制,都继续属于同一支 AI 团队。

0.7.1 更新内容

- 兼容新版 DSH 更新:修复 already-installed,通过 DSH 公开插件管理 API 替换插件包,保留启用状态,并兼容旧版配置安装后重启的流程。
- 版本核验与失败恢复:检查实际安装版本,替换失败时尝试装回旧版本。已有 0.6.1、0.7.0 用户需先手动替换一次插件包,详见下方升级说明。
- 兼容性验证:已在 DSH 0.2.0-rc.2 和 0.2.1-rc.2 上验证。UI 样式、办公室场景、游戏互动和多智能体行为均未改动。

0.7.0 更新内容

- 更有生活感的房间:工作室增加桌垫、文具、台灯或耳机、理线托盘、软木板和地毯;咖啡室增加杯架、咖啡豆罐和植物装饰画;观影房增加吸音板、织物细节、壁灯和电视柜格栅。这些新增装饰位于既有布局内,保留现有界面与互动规则。
- 场景内的手机:随时打开私聊和群聊,或通过手机里的 Browser 阅读网页;继续使用原有 Session 和原生输入区。
- 对话与导航改进:当面对话支持立绘和消息历史切换;右上角 HUD 集中地图、镜头、楼层、团队和选项;附近提示与紧凑活动卡支持键盘互动。
- 人物模型更新:提供的长发角色模型已绑定既有待机、行走、坐姿、喝水和伸展动作,保留独立外观配色。

项目亮点

| 体验 | 你可以做什么 |
| 一个群聊,一层办公室 | 为不同团队建立独立楼层。房间位置随群聊固定,成员增加时扩出新的工作室。 |
| 走进会议室,直接在群里开会 | 坐上主位,看同事依次入场,在会议聊天框中发送真实群聊消息。 |
| 认得出每一位同事 | 肤色、发色、上装、下装和鞋子独立搭配,配合行走与坐姿动画形成角色辨识度。 |
| 工作间隙也有小乐趣 | 冲咖啡、翻书、玩接星星街机、准备午餐、调制无酒精饮品,或跟着节奏伸展。 |
| 一起坐进观影房 | 六组三人沙发朝向大曲面电视,同一张沙发上的不同座位可以同时使用。 |
| 有时间感的办公室 | 阳光与傍晚灯光跟随本地时间变化,绿植、庭院和周边城市共同构成环境。 |
| 口袋里的聊天与浏览器 | 点击 Phone 或按 P,随时打开私聊、群聊和手机网页阅读器,不必走回工位。 |
| 保留原有 AI 团队能力 | 私聊、群聊、记忆、能力库、定时任务和用量统计继续可用;真实工作优先于休闲动画。 |

会议室墙上的展板可以打开完整群聊,查看历史与实时回复。最近的发言会以简短气泡出现在角色头顶,完整文字和附件仍保留在聊天区域。

画面展示

围坐一桌,讨论真实任务

你坐主位,八个成员座位依次安排,其余同事整齐站在房间四周。

把完整对话放到展板上

墙上展板与会议聊天区使用同一个群聊,保留历史、实时消息和原输入框。

乘电梯,拜访另一层团队

进入轿厢、选择目的地,通过关门与场景渐隐渐显完成楼层切换。

留一个座位,一起休息

三排等距沙发提供 18 个座位。电视目前显示静态影院插画。

截图记录了功能可用的开发版本,具体房间布局随群聊变化。点击图片可以查看原图。

安装教程

1. 准备 Harness

- 安装 DeepSeek Harness。开发测试环境固定使用 0.2.0-rc.2,当前办公室验收使用 Windows 上的隔离 Web 配置。
- 为 AI 成员配置模型。聊天和可选的 AI 外观、主题设计会使用这些模型设置。
- 使用支持 WebGL 的桌面浏览器或 Harness 桌面端。运行插件不需要安装 Godot 或 Blender。

本插件在所选配置中替代原版 ds-bot / 旧版 dsh-bot 团队界面。启用 DeepSeek Office 前,请先禁用原插件,并保留已有团队数据。

2. 获取并安装插件包

使用构建产物或已发布版本提供的 deepseek-office-0.7.1.tgz。如果尚未提供安装包,可以在下载或克隆本仓库后自行构建。源码构建需要 Node.js 22.19 或更高版本和 npm:

cd ds-bot
npm ci
npm run build
node -e "require('node:fs').mkdirSync('../artifacts', { recursive: true })"
npm pack --pack-destination ../artifacts

在 Harness 桌面端中打开「插件 → 添加插件」,填写安装包的绝对本地路径,安装并启用;如提示重启,请完全退出后重新打开。例如:

C:\plugins\deepseek-office-0.7.1.tgz

使用 Harness Web 时,需要可用的 pnpm,并将下面的示例替换为实际安装包路径:

npx @deepseek-ai/dsh@0.2.0-rc.2 plugin --profile web add "/absolute/path/deepseek-office-0.7.1.tgz"
npx @deepseek-ai/dsh@0.2.0-rc.2 web

发布到 npm 后,如何通过包名安装?

项目配置的 npm 包名是 deepseek-office。所有者将包发布到所选安装源后,可以在「添加插件」中输入 deepseek-office,或指定 deepseek-office@0.7.1。仅将源码上传到 GitHub 不会自动发布 npm 包;尚未发布时,请使用本地安装包。

插件实际位于仓库的 ds-bot/ 子目录,因此仓库地址与已发布包名不是相同的安装入口。

已有 DeepSeek Office 时,可以使用插件内的 Update 按钮。旧版 DSH 配置安装后需要重启;支持热重载的新版 DSH 会先移除旧插件包,再安装新版,并保留启用状态。替换失败时,更新器会尝试装回旧版本。继续使用原配置、DSH_HOME 和团队数据。

从 0.6.1 或 0.7.0 升级:这两个版本的 Update 按钮在新版 DSH 中可能报 already-installed。请在 DSH「设置 > 插件」中卸载 DeepSeek Office,再添加 deepseek-office(或选择新版发布安装包)。只移除插件包,保留团队数据;这次手动替换后才能获得修正的更新器。如果移除后安装失败,可在同一插件页面添加原版本。通过公开 CLI 操作时,先停止该配置,再运行 dsh plugin --profile web remove deepseek-office、dsh plugin --profile web add deepseek-office,然后重新启动;将 web 换成实际使用的配置名。

更新器已在 DSH 0.2.0-rc.2 和 0.2.1-rc.2 上做回归验证,仅使用 DSH 公开的插件管理 API。

3. 创建第一层办公室

1. 创建至少 两名 AI 成员,为他们设置姓名、职责、指令和模型。
2. 新建群聊并添加成员。每群支持 2~12 名 AI 成员,你本人不占这个名额。
3. 新群聊会进入对应办公室。侧栏 Office building 打开大厅,Floors 可以选择要拜访的群聊楼层。
4. 走到同事或设施旁互动,也可以通过 Team 直接选择成员。点击 Back to chat 随时回到常规聊天。

团队有群聊后才显示办公室入口。尚未创建群聊时,仍可正常使用原有单聊功能。

前五分钟怎么玩

走动、看场景与交流

| 操作 | 功能 |
| 点击地面 | 绕开墙体与家具,走到指定位置 |
| WASD / 方向键 | 按屏幕方向移动,旋转镜头后仍保持直觉操作 |
| 按住 Shift | 跑步 |
| 靠近人物或物件后按 E | 互动 |
| 鼠标滚轮 / 缩放按钮 | 放大或缩小画面 |
| Rotate view / Overview | 旋转镜头或查看整层总览 |
| 楼层小地图 / Follow | 查看指定房间,再回到人物跟随 |
| Phone / P | 拿出手机聊天或阅读网页 |
| Esc | 关闭当前面板或收起手机 |
| More → Quiet motion | 暂停同事自主休闲走动,减少环境动画 |
| Back to chat | 退出办公室视图,使用常规聊天 |

先开一场会

走入 Meeting room,确认 Start meeting。你会坐上主位,同事按照成员名单依次进入:有座位的就坐,座位满后整齐站在四周。在下方聊天区发送消息,就像平时在群里聊天一样。

与墙上展板互动,或点击 Open display,可以在画面中央查看完整群聊历史。点击 End meeting 后起身,同事恢复各自的日常活动。

再休息一下,或者换层逛逛

靠近沙发或设施后按 E,也可以点击目标旁的互动提示。休息和咖啡会直接开始,其它活动卡会显示对应操作;关闭活动或移动离开即可继续行走。在 Screening room 中,多名角色可以使用同一张沙发的不同座位。根据当前楼层的设施,你还可以喝咖啡、翻书、玩一局 30 秒接星星、准备午餐、调制无酒精饮品或做伸展,也可以在走廊和 Momo 打招呼。

点击小地图中的 Lift 找到电梯。进入轿厢后,查看楼层信息并选择目的地:电梯关门,当前场景渐隐,目标楼层出现后开门。

当面交谈,或拿出手机

靠近同事按 E,或通过 Team 选择成员。对话框显示立绘和单条发言,可切换查看历史消息。你可以选择私聊或群内提及,原生输入区继续提供附件、语音、模型选择等会话工具。

点击 HUD 地图下方的 Phone 或按 P。聊天应用列出全部群聊和同事,支持搜索、未读标记和最近消息预览;这些对话与常规聊天使用同一批 Session。手机里的 Browser 通过运行 DSH 的电脑及其系统代理抓取网页,以沙盒中的手机布局显示;需要登录、提交表单或复杂脚本的页面可以转到系统浏览器。按 Esc 收起手机。玩家持机时停下,世界和智能体回合继续运行。

给团队一点自己的风格

选择成员可以查看或重新生成外观;More → Decorate 用来调整当前楼层主题,AI 设计可以提出墙面、地板与点缀配色。明确的外观描述也可以影响角色配色。可选的 AI 设计会额外调用模型,已保存的结果会重复使用。

当前 3D 角色共用提供的长发、夹克、裙装和靴子模型,通过独立配色区分身份;原裤装配色通道对应裙装。多种角色模型、家具摆放和房间形状编辑属于后续工作。3D 衣着搭配保存在当前浏览器中。

楼层怎样生成

每个群聊楼层都有 一间会议室、一间观影房、两间固定选取的休闲设施,以及一至三间工作室。休闲设施从咖啡室、阅读室、街机室、厨房、无酒精酒吧和运动室中选取。每间工作室最多四个工位,第五、第九名成员加入时增加工作室,已有房间不搬动。

| AI 成员数 | 工作室数量 | 已布置房间总数,含观影房 |
| 2~4 人 | 1 间 | 5 间 |
| 5~8 人 | 2 间 | 6 间 |
| 9~12 人 | 3 间 | 7 间 |

前六个房间位置由群聊 ID 确定,因此重新进入同一个群聊时布局保持一致。未使用的位置成为庭院。观影房固定在东侧扩展区域,电梯位于公共走廊右端;大厅另有接待工作室和休闲设施。

展开查看当前整层总览

当前完整楼层:会议室、观影房、工作室和周边城市绿化

当前版本范围

0.7.1 在可走动的办公室中整合手机聊天、手机网页阅读器、当面对话,以及工作室、咖啡室和观影房的首轮装饰细化;其它休闲设施保留现有布置。装饰细化保留房间布局、通路、座位、互动目标与现有 UI,群聊消息、智能体工作和权限仍使用原有 Harness 流程。

当前 尚未实现跨设备联机、角色位置的云端同步、自由建造编辑器或经营经济系统;观影房电视为静态画面,尚不支持视频播放。3D 场景需要 WebGL。场景内的手机属于桌面玩法,移动设备暂不是主要适配目标。

记忆、权限、工作目录、模型、定时任务和备份等完整说明,见插件参考文档。

开发与验证

cd ds-bot
npm ci
npm run harness
npm run build
npm test
node scripts/build-client.mjs --check
npm run lint

修改 src/client/ 后重新构建;client.js 是需要提交的生成文件。如需使用 mock 模型和项目内测试数据进行隔离预览,请参考办公室开发说明,测试不得使用日常 Harness 数据目录。

| 内容 | 代码或验证记录 |
| 插件与服务端行为 | ds-bot/ · 插件参考 |
| 世界布局、寻路和日常模拟 | src/shared/office/ |
| 2.5D 渲染与界面 | src/client/office/ · 渲染验证 |
| 人物与外观辨识 | 人物验证 |
| 会议、历史和群聊输入框 | 会议室验证 |
| 跨层移动与观影座位 | 电梯验证 · 观影房验证 |
| 手机、对话与房间细节 | 手机设计 · 对话框设计 · 装饰范围 |

致谢与许可

项目建立在 DS Bot 和 DeepSeek Harness 之上。代码保留项目的 Apache-2.0 许可、NOTICE 和第三方说明。

Three.js 与 Phaser 提供渲染和模拟基础,建筑、房间构图与界面由本分支实现。人物、电梯和电视来自所有者提供的模型,其来源分别记录在 office-worker、elevator 和 cinema,不额外声明第三方授权。Momo 使用 Pixel-Boy / Sparklin Labs 的 CC0 Ninja Adventure 素材;保留的 LPC 资源继续遵守原有许可与署名。

新版项目 Logo 为原创 AI 生成图形,见品牌来源与提示词。本项目为独立社区项目。

后续开发计划

以下为开发方向,尚未包含在当前发布版本中。

- [ ] 跨设备联机:实现共享房间、在线状态、玩家移动与外观同步、断线重连及会话权限,让不同电脑上的用户进入同一间办公室。
- [ ] 场景美化:将工作室、咖啡室和观影房的现有细化扩展到其它设施、庭院和建筑,扩充人物体型、服装款式与动画质量。
- [ ] 互动细化:完善接近、转身、坐下和起身衔接,增加设施互动、会议反馈,以及观影房的视频播放与控制。
- [ ] 用户自定义场景:支持摆放家具、调整房间布局、选择装修风格、保存可复用的楼层模板,并进一步探索 AI 辅助场景设计。
预览分享卡片长什么样 ↓wyx135230/DeepSeek-Office
分享 · DeepSeek Harness Hub
wyx135230/DeepSeek-Office

和你的 AI 团队,在同一间办公室里工作、开会与休息。

这是你的仓库?认领条目

回到顶部