Skip to content

dsh-himarket

Verified

dsh-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)为不稳定快照,仅记录/可尝试使用,出现问题优先反馈。

给同事(小白)用:三步

  1. 打开 DSH Web → 设置 → HiMarket。
  2. 点「一键登录」,用公司账号(Keycloak SSO)在浏览器里完成登录 —— 无需手填账号密码。
  3. 登录成功后会自动同步,然后:
    • 已订阅的 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

覆盖优先级(低 → 高):

  1. 内置默认(新环境 *.ai.ict.cmcc)
  2. 环境变量 DSH_DEPLOY_ENV=legacy 整体切回旧环境;或 DSH_DOMAIN_SUFFIX=<后缀> 只换后缀
  3. 环境变量 DSH_HIMARKET_BASE_URL / DSH_HIMARKET_GATEWAY_URL 给整条 URL
  4. cordis.patch.yml 行 config 的 baseUrl / gatewayUrl
  5. 设置页「HiMarket」卡片(settings.yaml 的 himarket namespace)—— ⚠️ 仅调试态可写

⚠️ 设置页的地址框默认只读:baseUrl / gatewayUrl 属服务端统一下发项 (launcher env_defaults.rs 的 FORCE_OVERRIDE_KEYS),每次同步会强制覆盖本地值。 故默认态下设置页不可改(改也无效),host 侧 /himarket/save-config 也会拒绝这两个键 (返回 403)。运维需要改地址请走 ①~④(服务端下发 / 行 config / 环境变量), 或临时开启调试开关。

📌 注意区分「服务端下发」与「插件内置默认」:FORCE_OVERRIDE_KEYS 只在服务端 确实下发了该键时才强制覆盖。若服务端没配 himarket.baseUrl,settings.yaml 里的值 其实来自本插件的内置默认(第 1 层),与「服务端下发」无关 —— 两者甚至可能不同 (内置 http://market.ai.ict.cmcc vs 服务端 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,用 Cordis ctx.plugin() 动态建/拆 fiber,serverName 由 HiMarket name 清洗得到。
  • 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