dsh-himarket
Verifieddsh-himarket · v0.2.1 · MIT · Web UI
HiMarket bridge for DeepSeek Harness: sync subscribed MCP servers and install published Skills into DSH, with a beginner-friendly settings panel and chat tools
Install
dsh plugin add dsh-himarket Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Published to npm without a public repository. Inspect the package contents before installing.
Readme
dsh-himarket
把 HiMarket(企业 AI 能力市场)接入 DeepSeek Harness(DSH) 的桥接插件。
- 同步已订阅的 MCP Server → 自动注册成模型可调用的工具(
mcp__<name>__<tool>) - 一键安装已发布的 Skill → 落盘到
~/.dsh/skills/,装完即可用,无需重启 - 小白友好:设置页一个「HiMarket」卡片 + 对话式入口(说「同步 HiMarket」「安装 xx 技能」即可)
DeepSeek Harness 版本适配
本插件为运行时宿主解析设计:除 @deepseek-ai/cordis(peerDependencies,type-only)外,所有官方宿主能力(@deepseek-ai/dsh-mcp-client / @deepseek-ai/dsh-tools / @deepseek-ai/dsh-skill-filesystem / @deepseek-ai/schemastery 等)都在运行时经 createRequire(ctx.baseUrl) 从已安装的 DSH 宿主解析(lib/index.js 零静态外部 import),因此天然兼容各 rc 宿主版本,无需随宿主每日 rc 同步改码。
| 宿主包 | peer/dev 范围 | 引用方式 |
|---|---|---|
@deepseek-ai/cordis |
^4.0.2 |
Context(type-only) |
@deepseek-ai/schemastery |
^3.18.2(dev) |
仅构建/测试期 |
其余 @deepseek-ai/dsh-* |
无(运行时动态解析) | importOfficial/requireOfficial |
注意:本插件的宿主兼容性取决于实际安装的 dsh 宿主版本及其提供的
dsh-mcp-client/dsh-tools/dsh-skill-filesystem/schemastery。若某个 dsh rc 改变了这些包的对外 API,可能出现运行时解析失败——此时请升级到下一个适配版本;alpha(如0.1.5-alpha.1)为不稳定快照,仅记录/可尝试使用,出现问题优先反馈。
给同事(小白)用:三步
- 打开 DSH Web → 设置 → HiMarket。
- 点「一键登录」,用公司账号(Keycloak SSO)在浏览器里完成登录 —— 无需手填账号密码。
- 登录成功后会自动同步,然后:
- 已订阅的 MCP 工具会自动出现在对话里,直接说「用 xxx 查一下…」即可;
- 想装技能,点技能卡片上的「安装」,装完在对话里说「帮我用 xx 技能…」。
连接地址(HiMarket 地址 / 包装层地址)是只读的。设置页会在每个地址旁显示来源徽标,如实告知该值是谁给的:
徽标 含义 服务端下发 公司服务器统一下发,每次同步自动覆盖 —— 这是最常见的正常状态 插件内置默认 服务端未下发此项,当前用的是插件内置默认值(随插件升级更新) 本地配置 服务端未下发,值是本地自己配的 来源未知 找不到启动器的同步记录(本实例可能不是启动器启动的) 只读的原因:地址由服务端每次同步强制覆盖,本地改了也无效 —— 反而会出现「改了地址后连不上,还不知道为什么」。
确实要改怎么办:点设置页的「如何修改?」展开说明,或直接看下文「调试开关」。
也可以在对话里直接说「同步 HiMarket」或「安装 xx 技能」,效果一样。
给 DSH 管理员:安装
# 方式一:公司内网 registry 发布后
dsh plugin --profile web add dsh-himarket
# 方式二:本地源码(开发)
dsh plugin --profile web add link:E:/path/to/dsh-himarket
然后在 ~/.dsh/profiles/web/cordis.patch.yml 里加一行(dsh plugin add 会自动写):
- insert:
- id: himarket
name: dsh-himarket
重启 dsh web,刷新页面,设置里会出现「HiMarket」卡片。
配置
所有配置走 DSH 的 settings(~/.dsh/settings.yaml,热加载),也可以在桥接行里给默认值:
- insert:
- id: himarket
name: dsh-himarket
config:
skillInstallDir: '' # 留空 = ~/.dsh/skills;可改成公司统一技能目录
| 字段 | 默认 | 说明 |
|---|---|---|
baseUrl |
http://market.ai.ict.cmcc |
HiMarket 后端地址(不含尾斜杠)。旧环境填 http://ai-market.ict.cmcc |
gatewayUrl |
http://gateway.ai.ict.cmcc |
岗位网关(包装层)地址。旧环境填 http://ai-job.ict.cmcc |
username |
空 | 开发者账号用户名 |
password |
空 | 开发者账号密码(明文,仅存本机 settings.yaml) |
skillInstallDir |
空 | Skill 安装根;留空回退 ~/.dsh/skills |
域名配置(新旧环境并存)
内网原有 *.ict.cmcc,新部署的 K8S 环境改用 *.ai.ict.cmcc。两套环境并存,
故域名不写死:默认指向新环境,可随时切回旧环境或指向其他环境。
| 用途 | 旧环境 | 新环境(默认) |
|---|---|---|
HiMarket 门户(baseUrl) |
http://ai-market.ict.cmcc |
http://market.ai.ict.cmcc |
岗位网关(gatewayUrl) |
http://ai-job.ict.cmcc |
http://gateway.ai.ict.cmcc |
| 数字员工花名册 | http://ai-roster.ict.cmcc |
http://roster.ai.ict.cmcc |
| 启动器配置中心 | http://ai-conf.ict.cmcc |
http://conf.ai.ict.cmcc |
覆盖优先级(低 → 高):
- 内置默认(新环境
*.ai.ict.cmcc) - 环境变量
DSH_DEPLOY_ENV=legacy整体切回旧环境;或DSH_DOMAIN_SUFFIX=<后缀>只换后缀 - 环境变量
DSH_HIMARKET_BASE_URL/DSH_HIMARKET_GATEWAY_URL给整条 URL cordis.patch.yml行 config 的baseUrl/gatewayUrl- 设置页「HiMarket」卡片(
settings.yaml的himarketnamespace)—— ⚠️ 仅调试态可写
⚠️ 设置页的地址框默认只读:
baseUrl/gatewayUrl属服务端统一下发项 (launcherenv_defaults.rs的FORCE_OVERRIDE_KEYS),每次同步会强制覆盖本地值。 故默认态下设置页不可改(改也无效),host 侧/himarket/save-config也会拒绝这两个键 (返回 403)。运维需要改地址请走 ①~④(服务端下发 / 行 config / 环境变量), 或临时开启调试开关。📌 注意区分「服务端下发」与「插件内置默认」:
FORCE_OVERRIDE_KEYS只在服务端 确实下发了该键时才强制覆盖。若服务端没配himarket.baseUrl,settings.yaml 里的值 其实来自本插件的内置默认(第 1 层),与「服务端下发」无关 —— 两者甚至可能不同 (内置http://market.ai.ict.cmccvs 服务端https://market.ai.ict.cmcc)。 设置页的来源徽标就是用来如实区分这一点的,不要只看「只读」就断定是服务端下发的。
# 切回旧环境(任一即可)
export DSH_DEPLOY_ENV=legacy
export DSH_HIMARKET_BASE_URL=http://ai-market.ict.cmcc
调试开关(研发/运维)
默认关闭 —— 账密框与地址框均只读,只能一键登录。开启后两者都可编辑, 并出现「保存配置」按钮。两种方式取或:
# 方式一:环境变量(研发临时调试,不改文件)
DSH_HIMARKET_ALLOW_PASSWORD=1
# 方式二:settings.yaml 的 himarket 段(运维统一下发,热加载生效)
# himarket:
# allowPasswordLogin: true
可识别真值:1 / true / yes / on(大小写不敏感)。
⚠️ Windows + pm2:
pm2 restart不会清除已注入的环境变量,关闭时须显式置空:DSH_HIMARKET_ALLOW_PASSWORD= pm2 restart <id> --update-env
架构与实现要点
- 不发布服务:桥接只消费
webServer/tools/settings,放 host 平面、行 loose、无 isolate realm(与dsh-matrix同形)。 - MCP 复用官方客户端:不重造 MCP 客户端,运行时经
createRequire(ctx.baseUrl)+ 动态import()解析@deepseek-ai/dsh-mcp-client,用 Cordisctx.plugin()动态建/拆 fiber,serverName由 HiMarketname清洗得到。 - Skill 靠写文件生效:下载 ZIP → 系统
bsdtar解压 → 定位SKILL.md→ 落盘~/.dsh/skills/<name>/,由 DSH 自带的@deepseek-ai/dsh-skill-filesystem扫描发现(无需重启)。 - 凭证走 settings:与 DSH Web 的 Models 页同一机制,热加载、重启自动恢复。
- HiMarket API 契约(由 HiMarket 后端提供,本插件只做字段容错):
POST /developers/login→{code, data:{access_token}}GET /cli-providers/market-mcps→{data:{mcpServers:[{name,url,transportType}], authHeaders}}GET /cli-providers/market-skills→{data:{items:[{productId,name,description}]}}GET /skills/{productId}/download→ ZIP
开发
pnpm install
pnpm build # tsc 编译 src → lib + esbuild 打包 client → lib/client.js
pnpm test # tsc + esbuild + node --test(单元测试)
- host 端源码在
src/(TypeScript,编译到lib/)。 - 浏览器端源码在
src/client-main.js(ES module,import React),由scripts/build-client.mjs用 esbuild 打包为lib/client.js(__ModuleLoader__.load格式,react 外部化),与dsh-matrix-agent同款。 - 端到端冒烟:
node tests/mock-himarket.mjs 18080起假后端,再对运行中的 web 实例调/himarket/save-config、/himarket/sync、/himarket/install-skill。
发布
推 v* tag(或手动触发)后,.github/workflows/npm-publish.yml 自动构建、测试、npm publish 并建 GitHub Release。需在仓库配 NPM_TOKEN secret。
已知限制
stdio型 MCP 暂不支持(HiMarket 的market-mcps目前只暴露 http 型 URL)。- 密码明文存本机
settings.yaml(与 DSH Models 页的 apiKey 同一风险等级);后续可换 token 直填或系统凭据库。 transportType: sse统一按streamable-http处理(官方 mcp-client 的 Streamable HTTP 传输兼容 SSE 端点)。- 清空配置需重启或重新 sync 才会完全清除内存态(token 已在 save-config 清空时一并处理)。
许可
MIT