登记并管理智能体在本地启动的服务与静态页
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/22 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add kjx-talesofai/dsh-plugin-localhost该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · dev
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 11 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 16 处,展示前 15 条)
- 读取本地文件index.js:137
const info = statSync(REGISTRY_PATH) - 读取本地文件index.js:148
text = readFileSync(REGISTRY_PATH, 'utf8') - 写入本地文件index.js:198
mkdirSync(STATE_DIR, { recursive: true }) - 写入本地文件index.js:200
writeFileSync(tmp, `${JSON.stringify({ version: 1, services: entries }, null, 2)}\n`) - 写入本地文件index.js:201
renameSync(tmp, REGISTRY_PATH) - 读取本地文件index.js:236
if (!existsSync(dir)) throw new Error(`directory does not exist: ${dir}`) - 执行外部命令来自配置/变量index.js:307
execFile( - 读取本地文件index.js:502
createReadStream(target).pipe(res) - 读取本地文件index.js:524
return statSync(path) - 读取本地文件index.js:582
if (entry.kind === 'static' && !existsSync(entry.dir)) throw new Error(`directory does not exist: ${entry.dir}`) - 执行外部命令来自配置/变量index.js:880
const child = spawnOneShot(command, [...flags, target], { stdio: 'ignore', detached: true }) - 发起网络请求client.js:215
const response = await fetch(API.list, { headers: { accept: 'application/json' } }) - 发起网络请求client.js:259
const response = await fetch(`${API.logs}?id=${encodeURIComponent(expanded)}`, { - 发起网络请求client.js:284
const response = await fetch(url, { - 发起网络请求client.js:307
const response = await fetch(API.reveal, {
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
一个面板,用来查看智能体在 localhost 启动的服务器和静态页面:端口、目录、注册会话,每个都能一键停止。
README
由 DeepSeek 最新模型翻译生成dsh-plugin-localhost
一个面板,回答「这台机器上现在跑着什么、在哪个目录、哪个会话开的、怎么关掉」。
智能体在开发里起服务是常态:pnpm dev、python -m http.server、一个 dist/ 静态页。它们都是临时的,但不会自己消失——三个小时后你没死,那个端口也没死。这个插件把「起服务」变成一次登记,于是端口不用猜、目录不会丢、关掉有地方点。
它做什么
两种东西,都归它管;第三种它老实承认管不了。
| 类型 | 谁在跑 | 生命周期 |
| 静态页 | 插件自己(127.0.0.1 上的一个小服务器) | 跟着 DSH 一起关 |
| 命令 | 插件通过 Harness 的 subprocess 服务启动 | 插件停它就停,DSH 退出时全部停 |
| 别的进程 | 智能体自己用 bash 起的 | 不在这里。杀不掉的进程不该显示成「运行中」 |
这不是洁癖。后台进程如果没人拥有,它就会活过它该活的时间——见 docs/plan.md 里那四个活了十一天的东西。
装
github:kjx-talesofai/dsh-plugin-localhost#v0.4.0
装完重启桌面端(host 半边只在启动时加载)。
展开完整文档(README 剩余 1 节)
dsh-plugin-localhost
一个面板,回答「这台机器上现在跑着什么、在哪个目录、哪个会话开的、怎么关掉」。
智能体在开发里起服务是常态:pnpm dev、python -m http.server、一个 dist/ 静态页。它们都是临时的,但不会自己消失——三个小时后你没死,那个端口也没死。这个插件把「起服务」变成一次登记,于是端口不用猜、目录不会丢、关掉有地方点。
它做什么
两种东西,都归它管;第三种它老实承认管不了。
| 类型 | 谁在跑 | 生命周期 |
| 静态页 | 插件自己(127.0.0.1 上的一个小服务器) | 跟着 DSH 一起关 |
| 命令 | 插件通过 Harness 的 subprocess 服务启动 | 插件停它就停,DSH 退出时全部停 |
| 别的进程 | 智能体自己用 bash 起的 | 不在这里。杀不掉的进程不该显示成「运行中」 |
这不是洁癖。后台进程如果没人拥有,它就会活过它该活的时间——见 docs/plan.md 里那四个活了十一天的东西。
装
github:kjx-talesofai/dsh-plugin-localhost#v0.4.0
装完重启桌面端(host 半边只在启动时加载)。
智能体怎么用
给智能体的是一个工具 serve,不是一堆 bash:
{ "action": "register", "kind": "spawned", "name": "preview",
"dir": "/path/to/project", "cmd": "pnpm dev --port $PORT",
"path": "/" }
{ "action": "register", "kind": "static", "name": "deck",
"dir": "/path/to/dist" }
返回里带 port 和 url。端口是插件分的(8840–8899),不是智能体挑的——所以「这个工作区开过哪些服务」这个问题有答案,而不是靠回忆。
其他动作:list / start / stop / remove / logs。logs 返回最近的输出,排错不用截图;remove 删掉登记并把进程停掉,别再去手改 services.json(改了也会被读回来,见下)。
想让它下次开机自己起来,注册时带上 "autoStart": true,或者之后在面板上点那颗「自动启动」。
面板
侧边栏里,紧挨在 Tailscale Remote Access 下面。每行:状态点、名字、类型、端口、状态。展开后有:
- 目录 —— 点「用 Finder 打开」
- 入口文件(静态页)—— 点「显示入口文件」,Finder 里直接选中它
- 登记会话 —— 点「跳到会话」,回到当初开它的那个对话
- 日志 —— 最近 400 行,运行中会自己滚
行上的按钮:打开 / 启动 / 停止 / 自动启动 / 收起。展开后最下面有「移除」——点一次问、点两次删,删之前先把进程停掉。
登记表就是文件。 ~/.dsh/localhost/services.json 是唯一的事实来源,内存只是它的镜像:手工删掉一行,面板下一次读就跟着没了,而且不会被下一次保存写回来。v0.3.0 及以前反过来——内存说了算,删掉的行会复活,只能重启。
老实说(边界)
- 只登记它自己起的。智能体用 bash 起的服务,这个面板看不见——它杀不掉,就不能声称拥有。
- DSH 退出 = 全部停止。重启后条目显示「已停止」,需要手动点启动;只有你显式标了「自动启动」的才会自己起来,默认不标。
- 自动启动失败不会拖垮 DSH。端口被别人占了、目录被删了,都只在那一行上写原因(红点 + 一行说明),别的服务照常起。
- 端口是分给它的,所以别在别的脚本里硬编码 8840。想要固定端口就在 cmd 里自己用 $PORT。
- 静态页由它自己发,不是复制文件:dir 改了立刻生效,dir 删了就 404。
- 只在 127.0.0.1 上。这个端口没有认证,不要以为它是个「分享」按钮;要给别人看,走 Tailscale。
- 从手机打开:面板会读 tailscale serve status,把已经发布到 tailnet 的端口配上远端地址;此时「打开」在你的手机浏览器里打开那个地址,而不是让 Mac 弹浏览器。没发布的端口在手机上不给「打开」按钮,并明说只在本机可访问。
- 静态页的 SPA 回退只对浏览器导航生效(Accept: text/html),这样 /etc/hosts 这类路径不会假装成路由。
Compatibility
实测于 macOS(Apple Silicon)+ DSH Desktop 0.2.1-rc.2。依赖的上游契约:
| 契约 | 来自 |
| webServer.register({ kind: 'exact', path }),以及 connection.admit(req) 的准入栅栏 | dsh-host-webserver、dsh-api-remotes |
| subprocess.spawn 的句柄、collected.*.readFrom(offset)、terminate(),以及服务销毁时杀掉所有在管进程 | dsh-subprocess-local |
| ctx.tools.register 的 ToolDefinition(parameters 里 required 写在字段内) | dsh-tools |
| sidebar.panellist / main 两个槽位,order 决定导航顺序 | dsh-client-ui-sidebar、dsh-client-ui-layout |
| locale.bind(ns) 支持 {name} 插值 | dsh-client-locale |
| uiWorkspace.openSession(id) 接受裸 session id | dsh-client-ui-workspace |
开发
npm test # 45 条,不需要安装任何依赖
Host 半边没有运行时依赖,所以测试真的 import 它,用假 ctx 驱动:静态服务走真实 socket,spawned 走假 subprocess,断言的是 spawn 规格,而不是「看起来跑了」。Client 半边按页面加载的方式在 node:vm 里求值,再用一个迷你 hooks 运行时把面板渲染出来断言。
没有构建步骤:client.js 就是发布物。
它做什么
两类东西,都归插件管;第三类它不假装能管:
| 类型 | 谁运行 | 生命周期 |
| static | 本插件(一个小的 127.0.0.1 服务) | 随 DSH 停止 |
| command | 本插件,经由 Harness subprocess 服务 | 收到请求时停止,DSH 退出时也停止 |
| 其他 | 智能体,用 bash | 不在此列出。杀不掉的进程,不能显示成「运行中」。 |
智能体只拿到一个工具 serve,不用再堆一堆 bash:注册一个目录或一条启动命令,就能拿回分配的端口和 URL。端口取自 8840–8899,由插件分配,智能体从不手写——正因如此,「我在这儿起了什么」这个问题才有答案。
面板位于 Tailscale Remote Access 之下:状态、名称、类型、端口,外加一个开关。展开一行,可以看到目录(在 Finder 中显示)、入口文件、注册它的会话(跳回去),以及日志尾部。
实话实说的限制
- 只列出它自己启动的东西。智能体用 bash 起的服务看不见——也杀不掉——所以不显示。
- DSH 退出会停掉一切;重启后每条记录都显示为已停止,没有任何东西会自动重启。
- 静态页面直接从所在目录提供,不复制;端口不做鉴权,且只监听回环地址。
- SPA 回退只对浏览器导航生效(Accept: text/html),所以文件缺失时仍然是 404。
开发
npm test # 45 tests, no install step
Host 半边没有运行时依赖,所以测试套件直接 import 它,驱动一个假上下文:静态服务走真实 socket,spawned 路径走假的 ctx.subprocess。Client 半边在 node:vm 里作为脚本求值,再通过一个迷你 hooks 运行时渲染。
许可证
MIT © 2026 Jiaxin Kou预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
kjx-talesofai/dsh-plugin-localhost
登记并管理智能体在本地启动的服务与静态页
相关插件 · 开发 / 工程
隐私简历生成器reactive-resume/reactive-resume
Reactive Resume 已迁至 GitHub 上的…
★ 45,125已汉化MCP
71.7
AI 架构文档生成器sopaco/deepwiki-rs
🚀 Litho 已进化为 Terrain —— 给你的 AI 智能体一张会呼吸的代码库地图。
★ 3,157已汉化DSH
70.8
长时任务执行闭环AMAP-ML/LongHorizon-Harness
面向 Computer-Use Agent 的 Loop Engineering
★ 1,764已汉化DSH
70.5
AI 编程纪律方法包GanyuanRan/Aegis
让 AI 编程 agent 变得可信:少返工、更安全、说“完成”前先给证据。
★ 1,384已汉化DSH
69.6
多代理编排运行时Enderfga/claw-orchestrator
面向编程智能体的运行时。把 Claude Code、Codex、Antigravity、Grok…
★ 586已汉化MCP
69.4
记忆进化插件csyangwen/dsh-memory-evolve
dsh-memory-evolve 使用场景指南
★ 461已汉化DSH
67.9