system0.2.7
插件中心Plugin HubPlugin Hub
@omdsh-plugins/omdsh-plughub
在设置里安装、停用并配置 omdsh 插件。Install, disable, and configure omdsh plugins from inside Settings.
设置页里多出来的一个标签页:上半是可以装的插件目录,一张卡片一个按钮 —— 没装是安装,装了是更新,有新版本才点亮。下半是这个 profile 里已有的插件,装上的和停用的都在;停用只把图层从组装栈拿掉,文件还在,再启用不用再装一遍。模板自带的 bundle、插件中心和模式系统都留在栈上 —— 中心是唯一能把插件装回去的界面,模式系统则是没有谁会自动带上的 peer。表单直接按插件注册的 schema 生成,所以这个中心不认识任何一个具体插件 —— 这正是它存在的意义。装、卸、启、停都会弹出一条重启横幅,因为插件图层是在启动时组合的。
One more tab beside the shipped Plugins pages: a catalog on top, one button per card — Install when it is missing, Update when it is there, lit only when a newer version exists. Below, every plugin this profile has, composed or parked. Disable takes a layer off the stack without touching node_modules, so Enable is not another install. Template bundles, the hub, and the mode system stay on: the hub is the only UI that puts plugins back, and the mode system is the peer nothing auto-installs. The form is generated from the schema the plugin already registered, so the hub knows nothing about any plugin in particular — which is the whole point. Install, remove, enable and disable all raise a restart banner, because plugin layers are composed at boot.
input0.2.5
快捷键ShortcutsShortcuts
@omdsh-plugins/omdsh-shortcuts
为每个命令绑定一个快捷键,桌面菜单与网页端共用一份配置。One chord per command, on the desktop menu and in the page alike.
一份文档,两个界面:shell 类命令由 Electron 主进程通过原生菜单加速键执行,runtime 类走这个插件的交换机,browser 类由页内监听器接住。插件只声明"我能做什么",哪个键找到它由这里决定 —— 改绑当场生效,外壳不用重启,harness 一行不动。
One document, two surfaces: a shell command is performed by the Electron main process through a native accelerator, a runtime command through this plugin's switchboard, a browser command by its in-page listener. A plugin says only what it can do; which chord reaches it is decided here — and editing that rebuilds both in place, with no shell restart and no harness edit.
CmdOrCtrl+Shift+E → panel.files Ctrl+` → panel.terminal
system0.2.4
远程控制Remote ControlRemote Control
@omdsh-plugins/omdsh-remctrl
把你的 dsh 界面开放到公网地址,前面挡一道通行码。Your dsh window, on a public address, behind a passcode.
只有一扇门 —— 一个反向代理:请求打到这个插件绑定的端口上,通行码决定它能不能往里走,能走的原样交给 harness 自己的回环端口 —— HTTP 和两条 WebSocket 下行,一字不改。所以手机上不是一个功能子集,就是 dsh。代价写在明处:代理把 Host 改写成回环地址,这正是 harness 信任围栏放行的原因,也意味着一个已登录的浏览器能拿到桌面端能拿到的一切。于是通行码周围那几样不是功能,是设计本身 —— 默认关;Cookie 落定前,一个字节都不转发;每个地址每分钟只能试六次,所以十个字符就够用;来源围栏在公网这一侧,按浏览器真正用的地址再问一遍;走隧道时,非 HTTPS 的请求在读取凭证之前就以 421 挡回。默认出口是一条 cloudflared quick tunnel,所以没有公网地址的笔记本也能用:不用映射端口,不用开防火墙,不用配证书。
One door, and it is a reverse proxy: requests arrive on a port this plugin binds, the passcode decides whether they go further, and the ones that do are handed to the harness's own loopback port — HTTP and both WebSocket downlinks, verbatim. So a phone gets no subset of anything; it is dsh. The cost is stated rather than hidden: the proxy rewrites Host to loopback, which is what makes the harness's trust fence pass, and which means a signed-in browser reaches everything the desktop can. The controls around the passcode are therefore the design and not features — off by default; nothing forwarded before the cookie resolves; six tries a minute per address, which is what makes ten characters enough; the provenance fence re-imposed at the public boundary, about the address the browser actually used; and under the tunnel a non-HTTPS request refused with 421 before a credential is read off it. The default way out is a supervised cloudflared quick tunnel, so a laptop with no public address forwards no port, opens no firewall, and arranges no certificate.
insight0.2.4
用量UsageUsage
@omdsh-plugins/omdsh-usage
在会话顶栏显示本次会话花费、本项目花费与账户余额。Session spend, project spend, and account balance, in the conversation's top row.
三个数字放进你本来就在看的那一行。Chat 和 Work 里,它坐在模式芯片右边;Code 模式整列是终端,根本没有头部,它就挪到对角去。低于一个可配置的下限(默认 10,按账户计价货币),三个图标全部转红 —— 在那之上,一点颜色都不加。
Three figures in the row you are already reading. In Chat and Work the badge sits right of the mode chip; in Code the whole column is a terminal with no header to sit in, so it moves to the opposite corner. Under a configurable floor — 10 by default, in the account's own currency — all three icons turn red. Above it, nothing is tinted at all.
Help ⚙ Code mode 💬 0.023 ¥ 📁 1.03 ¥ 👛 964.15 ¥
insight0.2.5
状态StatusStatus
@omdsh-plugins/omdsh-status
在会话顶栏的 Session log 按钮左边,显示当前项目名、git 分支和变更计数。Project name and git branch with change counts, in the conversation header left of the Session log button.
哪个项目、哪个分支、动了多少 —— 一眼的事。项目名取自已注册的 workspace;旁边是当前分支,加上领先/落后、已暂存、已修改、未跟踪、冲突里非零的那几项计数 —— 有冲突时只有它一个数字是红的,因为一行里每个符号都喊,等于什么都没说。host 半边按会话解出工作目录,跑一次 git status;浏览器只收到要画的那几个数字,没有路径清单、没有 diff;目录不在 git 仓库里,就只显示项目名。聊天不是项目:装了模式系统时,被判成 chat 的那条对话既不出读数,也不轮询 —— 它的工作区是 harness 自己留的目录,不是谁挑的;把它摆在分支旁边,等于报告一个读者根本没有的项目。这条规则是从 sessionModes 读来的,不是自己再推一遍,所以读数和模式开关不会各说各的。
Which project, which branch, how much has moved — at a glance. The name comes from the workspace you registered; beside it the branch, and whichever of ahead/behind, staged, modified, untracked and conflicts are non-zero — conflicts are the one count drawn in the alarm colour, because a row where every glyph shouts says nothing. The host half resolves the session's directory and runs one git status; the browser receives only the counts it draws, with no path list and no diff, and a directory outside any repository shows the name alone. A chat is not a project: where a mode system is composed, a conversation it classifies as a chat gets no readout and no poll — its workspace is the one the harness keeps rather than one anybody chose, so naming it beside a branch would report a project the reader does not have. That rule is read from sessionModes rather than derived a second time, which is what keeps the readout and the mode switch from disagreeing on screen.
⬇ 导出 omdsh-plugins ⎇ main ↑1 +2 ~3 ?1
system0.2.5
基础模式Base ModeBase Mode
@omdsh-plugins/omdsh-basemode
所有模式插件共用的模式开关,以及按模式给侧栏会话上色的圆点。The switch every mode plugin registers into, and the sidebar dots that colour their conversations.
它自己不发明任何模式 —— 这正是重点。只装了它一个的 profile 能正常启动,也完全看不到那个开关 —— 没有东西可切的控件不是控件。它提供 sessionModes 注册表、悬浮在对话列上方的开关、每一行侧栏前面那颗按模式着色的圆点,以及那次覆盖:把 New Session 先递给正占着这一列的模式。它唯一贡献的姿态,是本来就在屏幕上的那个 —— Work,harness 自己的那一列 —— 好让开关永远有地方切回去;装了 chatmode 之后,由它那个会记事的 Work 顶替。
It invents no mode of its own — that is the point. A profile with this plugin and nothing else composes, boots, and shows no switch at all, because a control with nothing to switch between is not a control. It provides the sessionModes registry, the floating switch above the conversation, the coloured leading dot on every sidebar row, and the override that offers New Session to whichever segment is holding the column. The one posture it does contribute is the one already on screen — Work, the harness's own column — so a switch always has somewhere to switch back to; chatmode's Work, which remembers where you were, replaces it.
workspace0.2.5
聊天模式Chat ModeChat Mode
@omdsh-plugins/omdsh-chatmode
不用选项目目录就能开始对话,这些对话统一放在侧栏的 Chat 下面。Start a conversation without picking a project directory, kept together under Chat.
harness 是编码智能体,新建会话前先问你要哪个工作区 —— 合理,因为编码总要发生在某处。但不是每个问题都是活儿。这个插件在旁边补上另一种姿势:对话上方一个 Chat / Work 开关,加上一个受管的 Chat 工作区(真实目录 <dshHome>/chat)。会话跑在哪里就是它的全部 —— 用哪套 agent,仍由部署的默认预设和 harness 自己的芯片决定。Chat 里那枚工作区 chip 会从新建会话那一行拿掉,只留下预设选择。模式是推导出来的而不是存下来的:一个会话是不是 chat,取决于它算在哪个工作区名下 —— 存一个标志位,迟早会和屏幕上的事实打架。
The harness is a coding agent, and its New Session screen asks for a workspace first — reasonably, because a coding agent works somewhere. But not every question is work. This adds the other posture beside it: a Chat / Work switch above the conversation, and a managed Chat workspace (a real directory at <dshHome>/chat). Where the conversation lives is the whole of it — a chat runs the deployment's default preset, and the harness's own chip is where a reader picks another. In Chat the workspace chip comes off that row, leaving the preset picker. The mode is derived, not stored: a session is a chat exactly when it is accounted under that workspace — a stored flag would eventually disagree with the screen.
workspace0.2.3
代码模式Code ModeCode Mode
@omdsh-plugins/omdsh-codemode
在对话所属的工作区里开一个 harness 终端,与 Chat、Work 并列。A harness terminal in the conversation's workspace, beside Chat and Work.
网页界面和终端是同一个 harness 的两道前门,这个插件就是让其中一道开进另一道里的那条缝:按下 Code,整个对话列换成一个真的 dsh --profile omdsh-tui,banner 都在,跑在这个对话本来就归属的目录里。终端不是重新实现的 —— 屏幕上是 omdsh-tui 自己的前门,这个插件只负责起进程、转发字节。在终端里 /rename 一下,侧栏那一行跟着改。
The web GUI and the terminal are two front doors onto the same harness; this is the seam that lets one be shown inside the other. Pressing Code replaces the conversation column with a real dsh --profile omdsh-tui, banner and all, in the directory the conversation is already accounted under. Nothing of the terminal is reimplemented — this plugin starts that program and relays bytes. A /rename typed inside it moves the sidebar row.
workspace0.2.3
外部编辑器External EditorExternal Editor
@omdsh-plugins/omdsh-editor
用你真正在用的编辑器、终端或文件管理器打开当前会话的目录。Open the conversation's directory in the editor, terminal, or file manager you actually use.
会话头部的一个分裂控件:按左半边,当前对话的目录用你上次选的编辑器打开;点箭头,换一个。harness 既没有这个能力,也没有哪条接缝能让人绕到它外面去实现 —— 所以这个包两半都自己写:host 那半找出机器上装了哪些应用、把它拉起来,browser 那半负责把它们摆出来。
A split control in the session header: press the left half and the conversation's directory opens in the editor you chose last time; press the chevron and pick a different one. The harness has no such capability and no seam that would let one be reached around it, so this package adds both halves — the host side that finds the applications and starts one, and the browser side that offers them.
◧ VS Code ◧ Cursor ▤ Finder ▸ Terminal ▸ iTerm2
input0.2.3
侧边对话Side ChatSide Chat
@omdsh-plugins/omdsh-sidechat
在任何位置召唤一条独立的对话,带上你正看着的东西作为锚点。Summon a conversation of its own anywhere, anchored to whatever you were looking at.
harness 只有一个输入框,在对话列的底部,而它属于你正在跑的那件事。于是每一句"等等,这个函数是干嘛的"都要付两次钱:手离开你正在读的地方,问题挤进那条对话的上下文,然后就一直待在那儿,占着窗口、影响之后每一轮。按 ⌘L,就地开一条属于它自己的会话 —— 多轮、有历史、存在 Chat 工作区里;保存之前不占侧边栏,点了面板右下角的保存按钮,它才归进自己的工作区。界面上只有一个问题、一个答案,和它干活时的一行字。
The harness has one input, at the bottom of the conversation column, and it belongs to the thing you are running. So every "wait, what does this function do?" costs you twice: your hands leave what you were reading, and the question moves into that conversation's context, where it stays — taking up window, shaping every turn after it. Press ⌘L and a conversation of its own opens right where you are: multi-turn, with history, kept out of the sidebar until the Save control in its corner files it under its workspace. It shows a question, an answer, and one line while it works.
input0.2.4
文档DocumentsDocuments
@omdsh-plugins/omdsh-document
把 Word、PPT、Excel、PDF 和文本文件添加到消息里,模型直接读到它们的内容。Attach Word, PowerPoint, Excel, PDF and text files to a message; the agent reads their text.
输入框里什么也不会出现。附件是宿主端为这个对话维护的队列 —— 输入框卡片里那条轨道就是它,紧挨 harness 自己的图片缩略图 —— 宿主在 agent/pre-step 把队列插到消息正下方,作为一条 context 消息:模型紧接着问题读到文档,聊天记录在这条消息底下画一行可折叠的 Context injection。浏览器插件唯一的发送时钩子,是草稿里的一枚 chip;而 chip 是输入框里一个看得见的格子,代表的却不是用户写下的内容。换成宿主端这条缝,输入框就还是输入框。队列归宿主所有,所以它熬得过刷新;轨道清空就是回执 —— 只有真正带着用户话语的那一步才能认领队列,还留着的一行就是没送出去的文件。
Nothing appears in the message box. An attachment is a queue the host keeps for the conversation — the rail inside the composer card is that queue, next to the harness's own image thumbnails — and the host splices it in directly under the message at agent/pre-step, as a context message: the model reads the documents right after the question, and the transcript draws one collapsed Context injection row beneath it. A browser plugin's only send-time hook is a chip in the draft, and a chip is a visible cell in the textarea standing for something the user did not write; the host's seam leaves the message box a message box. The queue being the host's is also why it survives a reload — and why the rail emptying is the receipt: only a step actually carrying the user's words may claim it, so a row that stays is a file that did not go.
workspace0.2.5
侧边面板Side PanelsSide Panels
@omdsh-plugins/omdsh-sidepanel
右边一列文件树,下边一条终端,只在 Work 模式下出现。A file tree down the right edge and a terminal along the bottom, in Work mode.
harness 出厂是三列 —— 会话列表、对话、详情 —— 没有任何地方可以看一个文件或者跑一条命令。这个插件补上这两样,然后就停手:右边列出这个对话自己的目录,一次预览一个文件;下边是同一个目录里的 shell。没有编辑器、没有 git 面板、没有浏览器、没有标签栏 —— 在这里,一个容易被忽略的面板,胜过一个想当第二个应用的面板。
The harness ships a three-column frame — session list, conversation, details — and no place to look at a file or run a command. This adds the two, and stops there. The right panel lists the conversation's own directory and shows one file at a time; the bottom panel is a shell in that same directory. There is no editor, no git surface, no browser, no tab strip: a panel that is easy to ignore is worth more here than one that is a second application.