跳到正文
GitHub

桌面版,照 Muse 的做法 ​

Meta 的 Muse 桌面应用长什么样、做什么,是用过之后记下来的;还有跑在 DeepSeek Harness 上的 nanoMuse 桌面版从它那里取了什么、舍了什么、哪些按自己的方式来。只记界面:没有账号,没有对话, 没有当时那次会话里的任何屏幕内容。Muse 是 Meta 的商标;nanoMuse 是社区项目,与 Meta 无关——见 README。

这里的桌面应用是 DeepSeek Harness 加上 dsh-nanomuse 插件包(bundle) (harness.md)。dsh 带来循环、工具和一个完整的网页应用,上面留着插件可以接管的 插槽(seat);插件包接管那些能让窗口看起来、用起来像 Muse 的插槽,藏起 Muse 没有的东西,再加上 手机 App 有而 Muse 没有的——每台设备上都在的账号、Reach、一层开放的模型层。

窗口 ​

Muse。 一个窗口。最左边一条窄窄的图标侧栏,旁边一列聊天,中间是对话。智能体的脸和名字在对话 上方居中,名字下面一行状态随着它干活而变(「思考中」「正在看屏幕」「正在生成选项」)。底部的 输入框有附件按钮和麦克风;智能体干活时发送按钮变成一个停止方块。浅色、深色、跟随系统三种主题, 一种强调色,系统字体;没有任何装饰,每个表面都是和相邻那块只差一级的平色。

dsh 上的 nanoMuse。 同一个窗口,一屏对一屏,来自 dsh 的 sidebar 插槽,加一张盖在 harness 稳定 DOM 钩子(data-composer-card、data-chat-flow-kind、data-approval-key……)上的样式表:

  • 侧栏,按 Muse 的顺序:聊天(智能体干活时有一个点)、搜索、动态(有你还没看的帖子时有一个点)、 点子、目标、资源库、设备;一段空白;底部是汉堡菜单(日程和 harness 的其他面板都在它的菜单里)。 侧栏上没有脸——和 Muse 一样,脸是钉在顶部的页头和资料面板。macOS 上窗口没有标题栏:红绿灯按钮 落在侧栏空着的顶端,那一块是拖动把手,全屏时这段留白收掉。Windows 得到同样的无边框窗口,系统 自己的标题栏按钮画在右上角(titleBarOverlay,按主题重新上色);Linux 保留窗口管理器的标题栏, 因为那里没有可移植的覆盖层。
  • 聊天列:一个「搜索」框带一个「···」菜单(已归档的聊天),主要聊天——一个始终留在顶部的会话, 要么是第一个,要么是你用「设为主要聊天」选定的那个——以及带「+」的旁聊:其余所有会话,置顶的 在前,每个都有一个「···」,里面是「设为主要聊天」「置顶」「重命名」(就地改)「归档」。空会话显示 「新聊天」;一个点标记正在运行的,一个记号标记等你回复的。它可以收起,只剩侧栏。这一列显示的是 已登录账号的内容:同步来的对话记得自己来自哪个账号,所以另一个账号的对话留在这台电脑上,但不出现 在列表和搜索里,直到那个账号再次登录,而且永远不会被推送到别的账号名下;换账号后拉取从头开始。 退出登录时,本地的一切都显示出来。
  • 对话上方,在 harness 的 conversation.header.leading 插槽里,脸和名字钉在顶部正中,旁边是状态 标签:「已连接」/「未登录」/「思考中…」/「Hands · 第 N 步 · 它正在做的事」/「Reach · 第 N 步 · 在 Laptop B 上:…」/「等你确认」;一轮运行时旁边有「停止」按钮。智能体干活时和等你回答时标签会 上色。点脸打开资料面板。右上角是「邀请」(有账号时),然后是 harness 的右侧栏开关;harness 自己 的标题行、标签页(「对话」/「Trace」)和会话操作都藏起来——重命名、置顶和归档由聊天行承担。
  • 对话:你的消息在右边,气泡用强调色调出来;智能体的在左边,大圆角的灰色气泡;时间戳和每条消息 的操作只在悬停时出现;空聊天没有问候语——输入框在底部等着,和 Muse 一样,上面是工作区和预设那一行。
  • 输入框是一个胶囊:「+」(附件)、「消息」、发送圆钮(一轮运行时是停止方块)。harness 的模型选择器、 权限模式和计划开关都从这里藏起来(模型放在「设置 → 模型」,dsh 自己的「模型」页在「高级」下面,默认权限模式放在「通用」,和 Muse 一样),打开「通用」下的「显示 DeepSeek Harness 原生控件」它们才回来。在「插件」里打开 harness 的 语音输入后麦克风才出现(「设置 → 听写」会说怎么开)。
  • 主题:harness 的浅色和深色调色板都改成 Muse 的色调(浅色下 #f9f9f9 表面、#e3e4e6 智能体 气泡;深色下 #171717、#242424 气泡和 #2b2b2b 输入框),强调色跟随账号上那张脸的颜色, 所以在手机上给脸上了什么色,桌面也是什么色。桌面外壳用同样的底色画窗口,深色下改变窗口大小 绝不会闪一下白。

第一次打开 ​

Muse。 登录(手机号,一条短信验证码——「登录或创建账号」),一个加载页,然后是三页全窗口的 页面,右上角有 ‹ ›,底下是圆点翻页器:「允许 Muse 使用你的电脑?」(辅助功能用于点击和输入;录屏 用于截图——每行一个「允许」按钮,允许后变成绿色对勾,还有小字说明,卡片下方的「跳过」在两项都 允许后变成蓝色的「继续」)、「允许 Muse 访问你的文件和本地应用?」(一个「完全磁盘访问权限」 状态胶囊,一列本地应用,每个带一个只读/…下拉菜单,「继续」)、「打开语音输入」(麦克风,「允许」、 「跳过」)。然后是主窗口,聊天里是智能体的自我介绍、一张给它起名的卡片,和一条连接器推荐。

dsh 上的 nanoMuse。 手机的那几页(Android 上的 FirstRunSetup),全窗口,放在 harness 的 settings.onboarding 插槽里(我们接管了自带那一步的 id,所以新装的应用见到的是智能体,而不是被 要一把 DeepSeek key)。宿主把状态存在 $DSH_HOME/nanomuse/firstrun.json(src/firstrun.ts)—— 按过「开始」之后算完成,权限页看过没有,由哪个来源回答——所以这几页在新装时绝不会跳过,也绝不会 显示两次:

  1. 欢迎——应用的标志(形象要到最后一页「认识」才出现,随对话一起来)、「欢迎使用 nanoMuse」、 三行功能(对话、Hands、Reach)、社区声明、一个蓝色的「登录」胶囊和「改用自己的 API key」,后者 直接进入选择模型页,不需要账号(登录可以以后再说;在那一页「先跳过」而没存 key,就回到欢迎页)。 登录是手机那一套:「手机号或邮箱」,下面一行说明中国大陆手机号收短信、其他发到邮箱,输到第六位就自动校验的验证码 格子,「试试其他方式」改用密码(/v1/auth/code、/v1/auth/verify、/v1/auth/login)。
  2. 设一个密码(只对新账号;「以后再说」跳过)。
  3. 让哪个模型来回答——Cloud 账号的模型,或者你自己的 key。
  4. 选择模型(只在用自己的 key 时)——目录里的服务商(assets/providers.json,和手机、网页版 同一份列表),你所在地区的排在前面——中国大陆是阿里云百炼,一把 key 包下对话、手、图片和短视频; 其他地区先是 OpenRouter,然后是 OpenAI——每一行写明它覆盖什么(「对话 · 操作屏幕 · 图片 · 视频」),「去拿 key」打开厂商的 key 页面,「添加 key」就地把 key 收下(存进凭证库,键名 NANOMUSE_KEY_<PROVIDER>;cloud.json 只记名字)。OpenAI 下面有 用 ChatGPT 登录:通过 OpenAI 的页面登录一个 Plus、Pro 或 Team 套餐,只覆盖对话和手——没有图片,没有短视频——附一行 老实话:OpenAI 的条款只允许在它自己的 Codex 里使用 ChatGPT 套餐,其他应用的这条路曾被切断过。 「更多途径」展开目录的其余部分、这台电脑上的服务器(Ollama、LM Studio、vLLM)和任何手动填写的 OpenAI 兼容接口。保存一把 key 或完成一次登录之前是「先跳过」;之后是「继续」。
  5. 允许 nanoMuse 使用你的电脑?(仅 macOS)——「辅助功能」和「录屏」两行,每行一个「允许」, 通过桌面外壳向系统请求,系统放行后变成绿色对勾(轮询检查,窗口获得焦点或页面重新可见时再查一次—— 同一个钩子 permissions.ts,支撑每一处显示权限的地方);按过「允许」之后按钮变成「打开系统设置」。 只需要打开 nanoMuse Desktop 这一项:macOS 把随附运行时的截屏和输入事件都算到启动它的那个 应用头上,所以没有第二个条目要找。对「录屏」,外壳在打开设置面板之前先截一次,这样 nanoMuse 就 出现在面板的列表里;如果权限是在应用运行中才给的,会弹一个对话框说 macOS 只对重新启动后的应用 生效,带「立即重启」(经桥接调用 relaunch)。「试一下」几行——截一张测试图、动一下鼠标——和 运行时那一行会告诉你能不能用(这一行写明用的是哪个二进制;上一次为手启动失败时,附上宿主记下的 原因),截出来是黑屏时另有一条提示,带「立即重启」。Linux 和 Windows 上 这一页跳过。
  6. 认识 <名字>——脸,「开始」。

「开始」把主要聊天(智能体自己的文件夹 ~/nanoMuse,注册为工作区,输入框因此可用)绑定为 第一场对话,也就是手机的 FirstConversation:应用先开口——三句写好的台词,不花 token,永远 不进模型的历史——然后问该怎么称呼你。从这里起由模型接着说,并在回复末尾用一小段 nanomuse-naming 块汇报发生了什么(对你的称呼、它建议的名字、它拿到的名字);聊天把建议显示成起名卡片(NamingCard, 点一下或者直接输一个名字),阶段只跟着这个块推进,别的都不算——回复里没有这个块,就说明人在聊别的, 模型帮完忙再把话题拉回来。智能体有了名字,第一次打开就结束了:动态的第一天写出来,每日例程设好。

「帮助与支持 → 再看一遍首次引导」可以有意重开这几页(第一场对话不会重复)。

资料与脸 ​

Muse。 顶部的脸打开右侧的资料面板:一个大头像带一支笔(「更换头像」/「编辑名字」),几个标签页: 资料、审批记录(允许过什么、什么时候,「本次任务允许」/「始终允许」)、活动,还有更多。新的脸在 聊天里画:四个候选排成网格,挑一个,智能体用文字确认。

dsh 上的 nanoMuse。 顶部的脸打开智能体的页面——手机的 AgentProfileScreen,310 px 宽,在聊天 右侧(聊天让出位置;× 或 Escape 关闭):86 px 的头像带一支笔——更换虚拟形象把手机的那句话放进 输入框(「把虚拟形象改成…」,聊天流程见下文)、编辑名称、形象工坊…(小龙、一个表情放在一种 颜色上,或者一张画出来的脸,写到账号里,每台设备都穿它)——名字、「online」/「未登录」/「离线」或 智能体此刻正在做的事、一个分享按钮(一张带脸和名字的卡片,可以存成图片或复制),以及一个四段的 分段控件:活动(会话和 hub 的通知,「今天」和「更早」)、审核记录(按应用的「始终允许」授权, 带撤回,「管理权限」→ 设置 → 电脑操作,然后是你在审批卡片上允许或拒绝过的,带时间;只存在这台 电脑上)、每日(例程;「管理每日任务」打开 harness 的日程面板)、SOUL 与记忆——智能体记得的 关于你的事,一行一条:一个输入框添一条,× 忘掉一条,「导入记忆」(Muse 的那张表单:把另一个助手 对你的了解粘进来,一行一条记忆),账号有描述时还有智能体的描述。你告诉它一件下次该记得的事, 智能体就用 remember 工具自己写进记忆,每场聊天的提示词都带着这份清单(rooms.json,只在这台 电脑上)。「更换形象」里有小龙、一个表情放在一种颜色上,还有画一个——形象工作室:描述角色, 选一种风格(默认是 Muse 的玩偶风格),看看按今天的额度要花多少,「画四个」,四个候选以 2×2 网格 出现,标着「选项 1–4」;「就这个」从选中的那张画出其他姿势(干活中、等你回复、搞定、出了点问题), 新形象就穿上了,账号的每台设备都是。图片来自账号的图像模型,经中继(/v1/images/generations、 /v1/images/edits),浏览器把每张静态图裁成 512 px 的正方形 WebP,宿主把脸写到账号上 (PUT /v1/me/profile,带 face 映射)再拉回到 faces/<id>/ 下。提示词是运行时的,所以在手机上 画和在这里画出来的脸是一样的。

在聊天里换新形象是手机的 AvatarFlow,一字不差:"change your avatar to an orange cat with a scarf"、「把你的形象换成一只橘猫」、"become a robot"(同一组正则表达式,src/avatar-flow.ts) 在发出去之前就被截住;输入框上方的一张卡片说明四张图按今天的额度要花多少(手机的 FaceCostDialog), 「开始画」让四个候选带编号以 2×2 网格出现,你点一下或者说一句来挑——「第二个」、"the second one"、 "regenerate"——然后「正在完成形象」画出其他姿势,新形象在每台设备上穿上,「分享形象」给出那张卡片。 穿上之后,宿主留下手机那条记忆(- <日期>:用户把我的虚拟形象换成了"…"),并请智能体用一句话说 出来、写下 nanomuse-avatar 围栏,聊天把它显示成一张带新脸的小卡片。智能体自己的 draw_new_look 仍然会为它想提议的任何形象打开工作室。

脸会动。 Muse 的头像按状态有动画;这里小龙的四个状态(待命、干活中、等你回复、搞定)是手机 App 的短视频(assets/dragon-<state>.mp4),凡是脸不小于 44 px 的地方——页头、资料面板、舞台的光标 标记——都静音循环播放,静态图作为封面;小于这个尺寸时、系统要求减弱动态效果时,或者列表只想要 一张安静的图时,只显示静态图。画出来的脸也有自己的短视频,和手机上一样:四段 4 秒的短视频—— 待命、干活中、等你回复、搞定——由 wan2.2-i2v-flash 从这张脸画出来,走中继或你自己的百炼 key (src/video.ts、src/motion.ts;手机的提示词,一字不差),存在这台电脑的 avatar/motion/ 下, 由 faces 路由提供(/face/<id>/<state>.webp|mp4),在页头、侧边栏和胶囊里播放。「设置 → 图像与视频」 里有「换形象后自动生成动作」(默认开)、「现在生成动作 / 重新生成」和用到的模型;工作室的费用估算 把短视频算在内。短视频还没做好,或者这个设置关着时,画出来的脸和表情就只做 CSS 做得到的动作: 待命时慢慢呼吸,智能体干活时摇摆,等你回复时小跳一下。

电脑操作 ​

Muse。 被控制的屏幕作为一块调暗的实时舞台显示在窗口里:左上角一个 × 用来停止,右上角是接管 控件,左下角一行说明刚做了什么(「已输入 · <应用>」、「按下 ↵ · <应用>」),脸作为光标标记。聊天里 嵌着权限卡片——「允许 <名字> 截屏?」/「写一个文件?」——带「允许(本次任务)」「始终允许」「拒绝」。 (nanoMuse 从 0.1.34 到 0.1.39 有过这样一个舞台,0.1.40 去掉了它,换成下面的轨迹:一块跟着手走的 画中画又是一个在动的东西,而且事后看不回去。)

dsh 上的 nanoMuse。 手是运行时经 MCP 提供的 computer_screen / computer_act,所以模型看到的 就是它要来的那张截图,干活时状态标签写着「Hands · 第 N 步 · 点击"保存"」。harness 的审批卡片改成 Muse 权限卡片的样子——一面盾、标题、细节、蓝色的「允许一次」在前、灰色的「拒绝」——每个回答都 写进智能体页面的审核记录标签页;哨兵(Sentinel)给的理由(sentinel.md)就在标题里。 同一个问题——「允许一次」、「在 <应用> 里始终允许」(针对手的工具;应用取自窗口标题的第一段)、 「拒绝」(宿主的 ApprovalDesk 排在 approval/request 瀑布的最前面,替卡片作答)——也出现在 胶囊上,也就是 nanoMuse 窗口不在前台时外壳显示的那个始终置顶的小药丸,这样你在哪都能回答。 「在 <应用> 里始终允许」写下一条 computer_app:<app> 授权:在那个应用里手的工具不再询问,直到你 在智能体页面或「设置 → 电脑操作 → 已始终允许」撤回这条授权。「设置 → 电脑操作」显示两项 macOS 权限,带「允许」和「打开系统设置」(通过桌面外壳;手第一次要开始时,外壳会按顺序请求它们,每项都 说一句为什么,和手机、Codex 的做法一样——先辅助功能,再给 nanoMuse Desktop 的录屏,从 0.1.36 起 它就是负责截屏和点击的那个二进制;随附的 nanomuse 运行时只在脱离外壳单独运行时才需要它们)、 「操作时保持屏幕常亮」(会话运行期间外壳持有一个阻止省电的锁)和一条说明:凡是会发送、付款或删除 的操作都会先问。

暂停——轮到谁。 智能体需要你时(密码、人机验证、一个不该由它做的选择),它用 action: "hand_over" 和一个 reason 调用 computer_act;宿主开一个暂停(契约 C1:{type:"hold", tool:"computer", status:"on", by:"agent", reason}),聊天里的轨迹卡片写着 该你了——<原因>——好了,胶囊在窗口外 也这么说(琥珀色,光晕跟着变琥珀色),工具调用一直等(最多十分钟),直到你按好了。我来接手—— 在轨迹卡片和胶囊上都有——由你自己开一个暂停(POST /nanomuse/cloud/holds),智能体在下一次手的 调用之前停住,你来用鼠标;「好了」恢复。提问仍然保持打开。停止(那个方块)照样取消这一轮。

操作器。 手本身是外壳的(src/operator.ts,从 UI-TARS-desktop 的 NutJSOperator 移植,基于 @computer-use/nut-js):截图走 Electron 的 desktopCapturer,按显示器的实际尺寸(Mac 上改走辅助 程序 nanoMuse Computer Use 和 ScreenCaptureKit——desktop.md), 指针直接移到目标点、停 100 ms 再点,拖动、滚动,非 ASCII 的内容经剪贴板输入,还有快捷键表(Mac 上 ctrl 就是 ⌘)。运行时的 nanomuse mcp 通过外壳每次启动时开的一个回环 HTTP 服务器够到它们 (环境变量 NANOMUSE_OPERATOR_URL / NANOMUSE_OPERATOR_TOKEN,预设把它们透传给 MCP 服务器), 所以模型给的坐标——它看到的那张图的像素——只换算一次成操作器的屏幕像素,落在它指的地方,缩放 显示器和普通显示器一样(gui.md)。没有 外壳时(单独运行 nanomuse),运行时退回到 pyautogui / xdotool。

呼吸,不流动。 从 0.1.40 起,桌面应用里没有任何东西沿着边缘转圈、扫过表面或闪烁:每一盏表示 「在干活」的灯——聊天名字旁的点、页头的状态点、另一台设备那一轮的点、运行中一轮下方的思考点、 监听中的麦克风、光晕、胶囊的圆环和小条、轨迹的实时点——都按手机的节奏呼吸:2.4 s 亮起、2.4 s 暗下,ease-in-out,在暗和全亮之间。一次性的动作保留(卡片滑入、标记锁定、点击的两圈涟漪),脸的 几种状态和普通的转圈指示器也保留。系统开着减弱动态效果时,每盏呼吸的灯都变成常亮,标记的弧线 也不转了。

光晕。 手运行时,外壳在整块显示器上盖一层透明、点击穿透、始终置顶的窗口(UI-TARS 的 ScreenMarker,用手机的话说——就是为桌面重画的 HandsStage.kt):一道光沿四条边呼吸,宽度是短边 的 7 %,边缘一条 1.5 px 的发丝线——手干活时是 Muse 的动作蓝,暂停时是琥珀色——在操作器动作的那个 精确位置上是标记:一圈柔光、一个 12 px 的动作蓝圆环、一道绕着它转的青色弧线、中心一个带白芯 的点,旁边一个深色药丸写着动作的名字(靠近右边缘时放到左侧)。它在 220 ms 内从 1.8 倍缩小锁定, 点击时随着点击落下泛两圈涟漪;拖动时画出从蓝到青的虚线路径,带箭头和终点的落地环,并把圆环沿着 路径送过去;输入、组合键、打开应用和等待这些屏幕上没有落点的动作,把名字写在上一个圆环的位置。 标记在动作后 1.6 s 淡出。它来自操作器本身(它自己对显示器的比例坐标),不是客户端对工具调用的 解读,所以它就在点击真正落下的地方;换别的后端动手时(运行时自己的手),用客户端的坐标顶上,不带 文字。光晕在整段运行里一直亮着:从这一轮第一次 computer_screen 或 computer_act 调用起,到这 一轮结束为止,模型在两步之间思考的那几秒也不熄(宿主在 hands.run 里说明是哪个会话占着屏幕;以前 光晕和胶囊跟着进行中的调用走,每两步之间都会暗一下);这一轮结束、按下「停止」或五分钟没有任何调用 之后 400 ms 消失。光晕拿不到焦点也接不到点击;它、胶囊和手占着屏幕期间的 nanoMuse 窗口本身 都设了 setContentProtection(true),所以运行时截的图里没有它们——Linux 上内容保护不起作用,光晕 和胶囊改为在截图的那一瞬间让开。手机的长按圆环在桌面上没有对应物(没有什么是长按的);手机的脸 只在它自己的胶囊里跟着手指走,所以桌面上跟着指针跑的脸(0.1.34–0.1.39)去掉了。

胶囊是手机的 HandsCapsule,按指针操作调整了尺寸:工作区顶部正中最宽 420 px 的一个药丸 (82 % 的墨色,一道白色发丝线),智能体的脸放在一个 36 px 的三色环里——动作蓝、紫、青——和四根 小条一起呼吸,第 N 步和手正在做的事(「正在看屏幕」、「已点击"保存"」、「已输入"hello"」;模型 思考下一步时,上一步的话留在那里),我来接手和一个红色的停止。手开始时它用 320 ms 滑入, 和光晕一样整段运行都在,只在 nanoMuse 窗口不在前台时显示 (聊天里的轨迹卡片显示同样的内容),运行结束 220 ms 后消失。手要在它下面点击或拖动时,它先挪到 工作区底部(下次再回到顶上),就像手机的胶囊躲开手指。暂停让它变成琥珀色,写着该你了——<原因>—— 好了;智能体在某一步之前问的问题作为一张卡片挂在它下面,带「允许一次」「在 <应用> 里始终允许」 「拒绝」。外壳从主窗口经 IPC 喂给它数据(nanomuse:overlay,{hands: {active, held, step, title, text, face, stop, take, x, y, kind}, cards}),它的回答也从同一条路回来。

轨迹是在聊天里回看一次手的运行的方式,运行中和运行后都是:这一轮最后一个工具调用下方的一张 卡片(聊天自己的一行,所以跟着对话一起滚动),有那一步的截图,截图上用标记的几种颜色画出手在那里 做了什么——点击的圆环和点(双击两个圆环)、拖动的虚线路径和箭头、滚动的一个 V 形、输入的文字、 组合键或者动作没有落点时标签药丸里的应用名——一行文字说明(「第 3 步 · 已点击"保存" · Finder」)、 智能体在这一步之前说的话(它的简短推理,卡片上最多三行)、一条缩略图胶片、「上一步」和「下一步」 (卡片有焦点时是 ← 和 → 键,Home 和 End 跳到两端)、「放大查看」(在一张表单里看这一步和完整文字) 和「复制这一步」。运行进行中,卡片跟着最新一步,带一个呼吸的点,并提供我来接手和停止; 暂停时显示「该你了——<原因>」和好了。图片按需加载,只有选中那一步的是全尺寸。宿主把运行留在 内存里(src/trajectory.ts):一次运行从一轮里第一次手的调用开始,到这一轮结束或手歇了十分钟 为止;一步是模型看到的一帧(computer_screen 返回一帧,computer_act 返回动作之后的屏幕—— 一个 tools/execute 中间件从 MCP 结果里把它取出来,连同第一行里的窗口标题和尺寸),加上模型接着 在这帧上做的动作,以及它动手之前最后一条助手消息的文字。上限:每次运行 40 步(更早的从前面掉 出去,卡片写着「最早的 N 步已不再保留」),总共 4 次运行,图片合计不超过 64 MB(最旧的先走; 它们对应的步保留文字,并说明图片已经没了)。什么都不写到磁盘;重启就忘。浏览器这一半读 GET /nanomuse/cloud/trajectory?session=<id>({rev, runs: [{id, sessionId, source, device, startedAt, endedAt, firstCall, lastCall, dropped, steps: [{i, seq, at, width, height, title, action, words, callId}]}]},不含字节数据),图片读 GET /nanomuse/cloud/stage/frame?seq=N(不可变,缓存 一小时);实时状态里的 trajectory: {rev, sessions} 告诉它什么时候该再读一次。智能体通过 Reach 看一台手机时(device_screen),这次运行是一次设备运行,带手机的名字——那就是手机 App 自己的 Hands 干活时显示的东西(gui.md),从这边看过去。

设置 ​

Muse。 一个带侧边栏的对话框:通用(账号、用量、语言、外观——模式和强调色、开机启动、显示在 菜单栏、悬浮按钮、快捷键、关于——版本和检查更新)· 连接器 · 电脑操作(两项 macOS 权限、保持屏幕 常亮,电脑控制和浏览器自动化各自的每次询问 / 始终允许 / 始终拒绝,屏蔽的应用)· 文件系统访问 · 听写 · 钱包 · 安全存储 · 权限 · 消息渠道 · 设备 · 数据控制(隐私、导入记忆、下载你的数据、重置)· 帮助 · 法律信息 · 退出登录。

dsh 上的 nanoMuse。 同样的形状,来自 harness 的 sidebar.settings 插槽,自带的「通用」插件在 插件包这一层关掉。一页上的链接打开另一页时(「模型」页的「添加服务商」打开账号页的接入方式;「通用」 的账号卡片打开账号页;「文件」页的「沙箱」打开智能体页),打开的那一页顶上留着回去的路,写着你来自 哪一页;在侧边栏点选则重新开始。

  • 通用——按 Muse 的顺序:账号卡片(打码后的标识,或者「登录」,点开账号页)、使用情况 (套餐和它的进度条——「会员」/「不限量」,或者免费额度和还剩多少,加「升级」)、语言(harness 自己的那一行,放进我们的卡片)、外观(harness 的浅色 / 深色 / 跟随系统开关;强调色跟着脸走)、 有桌面外壳时的应用行为——「开机启动」(一个登录项;Linux 上是 freedesktop 的自启动条目)、 「显示在菜单栏」/「显示在系统托盘」(一个图标,带「打开 nanoMuse」「新聊天」「退出」)、「快速唤起 (⌥ Space)」(其他平台是 Ctrl+Alt+Space:窗口带着一个新聊天弹出来,输入框已聚焦;窗口在前台时 再按,它就退到一边)——存在应用主目录下的 desktop.json 里;快捷键(「Quick Chat」和它的组合键—— 「更改」记录你按的下一个组合,Esc 取消,「恢复默认」换回平台默认,别的应用占着这个组合时会有一行 说明——以及键盘参考);简介(nanoMuse,基于 DeepSeek Harness,许可证,以及始终都在的两行版本: 「nanoMuse 桌面版 <app> · harness <bundle>——已安装」和「最新 0.1.x——已经是最新版本」/「0.1.x 已发布——更新」/「没法检查——点一下再试」;检查先读 nanomuse.cn/dl/index.json,再读 GitHub 的 releases,每天一次);还有「开发者」:「显示 DeepSeek Harness 原生控件」(模型选择器、模式、代替 聊天列的工作区浏览器)。harness 的其他几行(权限预设、字号、链接打开方式、回车发送、性能、会话 日志)在「高级 → Harness」下。

  • 模型(紧跟在「通用」后面,0.1.41 起)——模型替你做的每件事占一行:对话(「和你说话的模型。」)、 操作屏幕(「看着屏幕替你操作,需要能看图的模型。」)、生成图片(「形象的肖像,以及你要的 图片。」)和生成视频(「形象的短视频。」),每行一个选择器。登录时每个选择器都把 nanoMuse Cloud 排在最前,推荐的模型标着「推荐」,之后是你添加的每个服务商各一组,每组只列能做这件事的模型;值 写成「<服务商> · <模型>」。换了对话模型会写「新对话起生效。」;换了手的模型,从手的下一步起生效 (插件用新模型重新启动 nanomuse mcp,不用冷重启)。手只会说 OpenAI 的接口格式,所以 Anthropic 或 Google 原生接口的 key 在这一行下面用一句话点名,不进列表。什么都做不了的一行显示门禁那句话—— 「生成图片需要有图像模型的服务商:阿里云百炼、智谱 GLM、SiliconFlow……」——和「添加服务商」;页面 底部也有「添加服务商」,打开账号页里的可用途径。没选的时候,一行跟着新对话用的那个服务商走(它在目录 里对这件事的默认模型),前提是那是你自己的服务商;否则登录时用 nanoMuse Cloud;再否则用你第一个能做 这件事的服务商。

  • 账号(在「高级」下)——nanoMuse 账号:登录或打码后的标识、额度、形象、「打开设备页」,一行 写着对话和手现在用什么、点开「设置 → 模型」,还有自己的 key 和账号共用的那一块:

    • 可用的途径——登录时你账号的那一行在最前(它此刻覆盖什么,取自中继的模型列表),然后是目录, 按第一次打开时的分组:你所在地区的服务商、ChatGPT 登录、其余按覆盖多少排序、本机服务器、自定义 接口。每一行写明它覆盖什么,就地填入或更换 key,链接到厂商的 key 页面,还有「移除」;移除一行 会连带删掉它的凭证,以及任何指向它的对话或手的模型选择。ChatGPT 这一行跑的是随附运行时的登录: 「登录」打开 OpenAI 的页面,这一行带着「取消」(和再来一次的「打开登录页面」)等着,然后变成 「已登录:ChatGPT Plus」并提供「退出登录」;这个登录只覆盖对话和手,不含图片和短视频,关于 OpenAI 条款的那一行就在它下面。没有运行时的话这一行会说明,并保持禁用。已经存着的登录在重启后会回来, 连同它的本地桥接。退出账号后,同样的一块放在登录表单下面,所以没有账号也能换 key。存好一把 key 之后会出一张卡片问用它来做什么——「选这把 key 负责哪些事,其余仍由 nanoMuse Cloud 负责。」—— 这把 key 能做的每件事(对话、屏幕、图片、视频)各一个开关,默认全开,各写着会用的模型;「就这样」 把模型页上那几行换成这个服务商,「暂不」什么都不改,脚注写着「以后可以在 设置 › 模型 里改。」
  • 图像与视频——画脸和它的短视频用的模型:和「设置 → 模型」里「生成图片」「生成视频」是同样的两个 选择器,登录时 nanoMuse Cloud 在最前,之后是每个自己服务商的模型(视频选择器还有「关」)。用自己的 key 画图直接走那个服务商——百炼的原生图像接口、OpenRouter 的图像接口,OpenAI、智谱、SiliconFlow、 火山引擎和 xAI 走 OpenAI 的格式——工作室在费用估算的位置写「由 <服务商> · <模型> 来画,不计入你的 nanoMuse Cloud 账号。」;Google 的 key 只能通过它的 OpenAI 兼容层画。配好的东西里没有一样能画图或做短视频时, 这一行会说在你所在的地区谁能,并给出去「设置 → nanoMuse Cloud」的路——和形象工作室代替费用估算显示的是 同一句话——只有 ChatGPT 登录时则说图片和短视频不在它的覆盖范围内。 下面是「换形象后自动生成动作」、「现在生成动作 / 重新生成」带四段各自的状态,以及费用说明。用自己的 key 生成的短视频失败了而你已登录时,失败那一行会给出「这次改用 nanoMuse Cloud」:这一轮走账号,选择器 不动;工作室一轮画失败后也给同样的按钮。

  • 模型、智能体——harness 的页面,原样,在「高级」下。

  • 连接器——Muse 的目录形状:一个搜索框,分类标签(「全部」「内置」「工作」「沟通」「文件」 「代码与部署」「数据」「设计与网站」「支付」「搜索与网页」「基础设施」……),已连接的行在前,然后是 目录,每一行是服务的品牌标在一块白色方块上(标志来自 simple-icons, CC0,由 scripts/brand-marks.mjs 写进 src/client/brand-marks.ts;没有的用字母方块),末尾是 「连接」;每个连接器有一页详情,写它能做什么——按服务器自己的描述列出工具,每个工具一个开关—— 什么把着它的门(权限预设,手和邮箱则是哨兵)、厂商的文档,以及「断开连接」(问两次)。三种行:

    • 内置是智能体真能够到的东西:「手——这台电脑」(运行时回应了就是开着的;没回应时附原因:没有运行时、 路径指向不存在的文件,或运行时没启动起来,带启动时的报错)、 「邮箱」「日历」「通讯录」(运行时的连接器,它们的工具经 nanomuse mcp 到达就是开着的)、 「Reach——你的其他设备」「网页」「文件」「终端」、几个房间、「日程」。在邮箱、日历或通讯录上点「连接」 会打开一张 Muse 风格的知情同意表单——智能体会得到什么、谁来决定、凭证存在哪里——接着是步骤 (nanomuse vault set …、config.toml 里的几行、重启),带复制按钮;这里故意没有登录按钮,凭证 留在你自己的保险库里。
    • 服务——目录(src/connectors-catalogue.ts,七十五个远程 MCP 服务器:Notion、Linear、 Atlassian、Asana、GitHub、GitLab、Sentry、Vercel、Cloudflare、Supabase、Stripe、PayPal、QuickBooks、 Figma、Miro、Canva、Dropbox、Box、Hugging Face、DeepWiki……),每个带地址和它放客户端进来的方式。 「连接」去问服务器本身(initialize):开放的服务器立刻连上;会说 MCP authorization 的 服务器在系统浏览器里打开登录页——受保护资源和授权服务器的元数据、动态客户端注册(RFC 7591)、 PKCE、resource(RFC 8707)、127.0.0.1:38417/oauth/callback 的回环回调、过期前刷新——表单带着 「再次打开登录页」「再试一次」和「重新开始」(重新注册一次,给忘了我们的服务器用)等着;要密钥 的服务器用一张表单来要,表单上写着厂商在哪里发它。授权服务器不接受注册客户端的服务(GitHub、 Slack、Discord、HubSpot、Render、Bitrise、PagerDuty、Box——目录里标了 clientIdRequired 的, 以及任何实际发现是这样的地址)有自己的一张表单:到厂商的开发者页面(有链接)建一个 OAuth 应用, 填上我们的回调地址(显示出来,带复制按钮),粘贴 client id 和(如果有的话)secret;这个 id 像一次 注册一样存下来,下一次在那里登录就不再问。搜索框下的行同时搜索公开的 MCP 注册表 (registry.modelcontextprotocol.io),输入两个字符就开始,按地址连接接受任何 Streamable HTTP URL,「更多选项」里可以填密钥或预先注册好的 OAuth 客户端。凭证存在 $DSH_HOME/nanomuse/connectors.json,只在这台电脑上,永远到不了模型那里:智能体的 dsh-mcp-client 指向一个回环代理(/c/<id>/mcp,由一个秘密请求头把关),代理负责加上 token 或密钥、刷新它、 把 tools/list 过滤成打开了开关的那些工具、对其余的拒绝 tools/call;工具以 mcp__<service>__<tool> 出现,预设行 nanomuse-connectors-tools 为每个连接挂一个客户端,并跟着 页面走(连接、开关、断开——不用重启)。刷新被拒的连接变成「需要重新登录」,带「重新登录」;密钥 就地更换。
    • 预设——手动配在智能体预设里的每个 MCP 服务器(@deepseek-ai/dsh-mcp-client 行),这里只读, 「添加连接器」打开预设。

    Muse 有而这里没有的:按动作分的权限下拉菜单(我们的是权限预设加工具开关),以及那些 MCP 服务器 要求事先在厂商那里注册客户端的服务(Zapier、Heroku……)——它们在目录里是密钥或地址行,不是 登录。

  • 电脑操作——系统权限(macOS)、保持常亮、风险说明。

  • 文件访问——智能体用到的文件夹(主目录、资源库、下载、nanoMuse 自己的文件;每个都能在文件 管理器里打开,这一页不授权任何目录)、规则(你点名的任何东西都能读;写入按这场聊天的权限预设, 除非智能体页另有设置,否则是 workspace-write:聊天的目录随便改,主要聊天的目录是 ~/nanoMuse, 目录之外的改动会被拒绝,除非智能体向你申请、你允许这一次;read-only 每次改动前都问,full access 什么都不问;沙箱),以及 macOS 上的「完全磁盘访问权限」,它只关系到能不能读「桌面」「文稿」「下载」。 主目录、下载和应用自己的文件有意放在主要聊天的目录之外;从资源库打开的聊天、在你自己的文件夹上 开的聊天,就写在那里。

  • 听写——harness 自己的语音输入(本地 SenseVoice;在「插件」里打开,发送旁边出现一个麦克风, 音频留在这台电脑上)、macOS 上的麦克风权限,以及怎么把系统的听写用到输入框里。

  • 设备——这台电脑(它的名字、让手机能在这里跑东西的远程控制开关)和账号下的其他设备、在线 的点、「移除」。

  • 权限——一页说清智能体可以碰什么(电脑操作、文件、麦克风、连接器、其他设备连同远程控制的 状态),每一行点开就是带开关的那一页;它怎么问(权限预设,从输入框上方的标签切换);最近的审批。

  • 钱包、安全存储、消息渠道——Muse 的几页,写的是这里的实情:不保存任何付款方式,聊天里 不会买任何东西(智能体在结账处停下,用量放在「通用」下);这台电脑上哪些文件存着什么(账号的 登录、智能体的资料、房间和文档、脸——每个带路径和「显示文件夹」)和什么永远不存(系统钥匙串、 你的密码);哪些渠道能找到智能体(这台桌面、浏览器、登录后的邀请链接、你的其他设备),以及没有 接入任何第三方聊天软件。

  • 数据控制——「我们认真对待你的隐私」加隐私政策,「在我的设备之间同步对话」(账号的开关,带中继 保存了多少个聊天、多少条消息,以及「删除已同步的对话」),它下面是「同时同步旁聊」(这台电脑自己的 开关,默认关——「关:旁聊只留在本机。开:本机的旁聊上传到账号,其他设备的旁聊也会同步过来」;见 every-device.md),「帮助改进 nanoMuse 的 AI 模型」(中继的开关,带它保存了 多少轮和「删除」),和其他每个应用一样;然后是「在这台电脑上」:导入记忆、下载你的智能体 数据(一个 zip 放到「下载」里——不含登录 token 的账号快照、形象和脸、房间、记忆,以及 harness 保存形式的聊天;在文件管理器里显示出来)和重置(记忆、房间和本地的形象清掉,账号退出;聊天 保留)。

  • 帮助与支持——文档、网站、讨论区、报告问题、版本。

  • 法律信息——许可证、Meta 商标声明、致谢(DeepSeek Harness、OpenMinis)和隐私政策(nanomuse.cn/privacy/,各端链接的同一页)。

  • 高级——其他插件注册的每一页(harness 的插件管理器、已归档的会话……),集中放在底部,在那里 但不碍事。

  • 登录时底部有退出登录。退出登录(或「重置」)把窗口带回欢迎页,和新装时一样。

钱包、安全存储和消息渠道其实不存在:Cloud 没有钱包——会员有的是额度(cloud.md)—— nanoMuse 不替智能体保存任何密码,消息通过手机 App 的通知到你手里,而不是通过某个聊天软件。

侧栏上的其他房间——动态、点子、目标、资源库 ​

Muse。 侧栏上还有四个房间:智能体发帖的动态(带图的摘要,赞 / 讨论,一段用来引导后续帖子的 文字);点子,按生活领域给出的主动建议,每条是一张卡片,写着为什么、包含什么、怎么运作、「现在 开始」;目标,带分类、运行中的自动化(类似 cron)和一条带日期的时间线;资源库,所有生成出来的 东西——文档(一个 Markdown 编辑器)、网页构件、图片、视频、播客、系统文件。

dsh 上的 nanoMuse。 四个房间都在侧栏上,按 Muse 的顺序(聊天、搜索、动态、点子、目标、资源库、 设备),每个都是 harness 布局里的一个 main 面板,所以聊天列留在原处,房间在它的位置上打开。一个 宿主服务(nanomuse-rooms,src/rooms.ts)把它们存在 $DSH_HOME/nanomuse/rooms.json,提供 /nanomuse/rooms/*,并把变化流式推给浏览器这一半:

  • 动态——智能体在一个隐藏的聊天里写给你的帖子,依据是你的动态偏好、你的目标和资料:标题、 带行内链接的 Markdown 正文、它读的页面有图时的一张图、♡ 和讨论(在这条帖子上开一场旁聊)。 房间打开时先是手机的介绍卡片(「关于动态」——帖子由什么写成、「编辑偏好」、「知道了」);空着的时候 文字会说每日例程什么时候跑(「每天 08:00,我会读一遍记得的关于你的东西……」),带现在写一批; 第一天在第一场对话结束时写出来,每日例程(08:00,一个可以在滑杆下面挪时间或关掉的日程)在房间 第一次打开时创建。侧栏上的一个点标记比你上次来访更新的帖子。智能体也可以在任何聊天里用 feed_post 发帖。
  • 点子——手机的精选列表(assets/ideas.{en,zh}.json,同样的 24 条,分六节:出行、工作、生活、 学习、家庭与关系、更多点子),每行一个表情、一句第一人称的介绍和一行细节;点开一行是一张表单, 说明试一试会创建什么——「开始一场对话」「创建例程 · 08:00」「创建目标」——带发到聊天(点子的 文字进入输入框,由你补完)、创建例程(在它自己的聊天里按点子的时间建一条每日日程;「例程已 创建,去设定时间和细节」)或开始这个目标(目标对话,用这条点子起头);试过的点子得到一个绿色 对勾,⋯ 可以隐藏一条。
  • 目标——「● 追踪」列表,带分类(健康、人际关系、金融、职业、兴趣、效率提升)、智能体的一行 状态、它汇报过进度之后出现的进度条,以及一个「需要留意」标记。**创建目标 › <分类>**是手机的流程: 「我想创建一个健康方面的目标。」进入你所在的聊天(它忙着时就开一个新的),带着手机的塑形提示; 智能体最多问三个简短的问题,一次一个——做什么、为什么、什么时候之前,多久检查一次——然后写一个 nanomuse-goal 围栏,聊天把它显示成一张「目标已创建」卡片(标题、为什么、步骤、「每天 09:00 检查」/「每 N 小时检查一次」、「在「目标」中查看」),宿主把它变成目标:那场聊天成了它的家,并用 harness 的日程插件在那里排一次检查(「该看看这个目标了:…」、「第一次:…」)。每次检查——以及任何进度变了 的一轮——都以一个 nanomuse-goal-update 围栏结束(goal_id、progress、status 取 on_track / attention / done、note):聊天里一张「目标进展」卡片,带进度条和备注,目标的状态、进度和时间线 跟着更新;智能体也可以调用 goals_room_update。菜单里的「改为直接写下目标…」照样用你自己的话 创建目标;「问问进展」现在就跑一次检查。
  • 资源库——几个书架(全部、文档、网页;影音内容:图片、视频、播客;底部是系统文件),「选择」、 「+ 创建…」(一份简介 → 一场把文件写到 ~/nanoMuse/Library 下的聊天——中文界面里叫 构件——用 workspace-write 预设)、「最近」和一个卡片网格;文字有查看器和 Markdown 编辑器(把 IDENTITY.md 或 SOUL.md 恢复成原始文本前会先问一句),图片和影音内容就地显示,其余用「打开」/「在文件夹中显示」。智能体用 present 交付的一切都落在这里,library_add 则只登记一个文件而不交付。

房间需要一个能回答的模型;退出登录后它们会这么说。写动态用的那个隐藏聊天解析完就归档,聊天列 始终是你自己的。智能体在任何聊天里写的 nanomuse-feed 围栏(手机的发帖方式)也落进动态,显示为 一张「已发到动态」卡片。

汉堡菜单 ​

Muse。 设置;报告问题(附带一张截图)。

dsh 上的 nanoMuse。 设置(带快捷键;有新版本时它和 ••• 按钮上都有一个点)、有新版本时的 更新到 0.1.x(打开发布页)、关于 nanoMuse(版本行「nanoMuse 桌面版 <app> · harness <bundle>」、 许可证、GitHub / Releases / 文档 / Issues)、键盘快捷键、日程和 harness 的其他面板(插件,以及装了 的别的什么),收起 / 展开聊天列,「报告问题」——在桌面外壳下,窗口的一张截图存到「下载」,GitHub 的 issue 页面打开,构建的信息已经填好(一条提示告诉你拖哪个文件进去);在浏览器里则打开 issues 页面。dsh 有而 Muse 没有的一切——插件管理器、面板列表、已归档的会话、开发者工具——都从这里或 「设置 → 高级」进,别处没有。

Muse 没有、nanoMuse 有的 ​

  • 每台设备上都在的账号。 用同一个号码在手机上登录,桌面的状态行就会把它算进去;Reach 让任何 一边向另一边提要求(hub.md)。
  • 任何模型,你自己的 key。 会员用中继的模型,或者一把 DeepSeek key,或者 harness 支持的任何 OpenAI 兼容服务商。「设置 → 模型」显示四行:对话(中继 /v1/models 里标了 for: ["chat"] 的 条目,默认 deepseek-v4.1-flash)、操作屏幕(for: ["gui"],默认 qwen3.8-27b)、生成图片 和生成视频;DeepSeek 的条目只在 id 里带 v4.1、vision 或 ocr 时才算能看图。手的模型写到 $DSH_HOME/nanomuse/hands.json(权限 0600),由插件自己的 MCP 客户端作为环境变量交给 nanomuse mcp, 模型一变就重启它。自己的模型在某一轮失败时,卡片给出「这次改用 nanoMuse Cloud」(已登录时):这一条 消息再走一次账号,这一轮结束后对话回到自己的模型,模型页保持原样。不会自动回退。
  • 每台设备上都有的连接器。 你在这里连上的东西(服务、名称、自定义 MCP 的 URL、登录方式、哪台 设备)发布到账号的资料里(契约 C3;永远不含 token 或密钥——宿主拒绝任何名字像它们的字段),所以 手机和其他电脑在「在你的其他设备上」下列出它,带连接,这台电脑也列出它们的。
  • 按地区排列的模型获取方式。 界面是中文、用手机号登录,或者中继账号在中国大陆时,账号页先列 百炼,再列 OpenRouter;其他地区反过来,每个都带「去拿 key」。
  • 更新。 每天一次,以及在「简介」里点「检查更新」时,宿主先读 nanomuse.cn/dl/index.json 这份镜像索引(大陆可达、没有速率限制),索引不应答时再问 GitHub 的 releases API,然后比较版本; 有更新的就显示为一个点、一个「更新到 0.1.x」菜单项,以及「简介」里针对这个平台安装包的「下载」 按钮(Linux 上是 .deb;正在运行的是 AppImage 时则是 AppImage)。
  • 开源,没有闭源组件。 插件包是 GPL-3.0-or-later;harness 是 MIT,带着它的声明一起走;「简介」 那一行写明了这一点。

GPL-3.0-or-later。nanoMuse 是独立的社区项目,与 Meta 无关。