dsh-himarket 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/skill.js ADDED
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Skill 安装:下载 HiMarket 的 Skill ZIP → 解压 → 定位 SKILL.md → 落盘到
3
+ * ~/.dsh/skills/<name>/。技能由 @deepseek-ai/dsh-skill-filesystem 扫描发现,
4
+ * 写入即生效(该插件有 watcher + fs 工具同步失效),无需重启。
5
+ *
6
+ * 解压用系统 bsdtar(Windows/macOS 自带,Linux 也默认有 tar),避免引入原生
7
+ * 依赖;先落临时目录,校验通过后再搬到目标目录,失败不污染已装内容。
8
+ *
9
+ * @module dsh-himarket/skill
10
+ */
11
+ import { mkdtemp, mkdir, rm, readdir, copyFile, readFile, writeFile } from 'node:fs/promises';
12
+ import { join, basename, resolve, sep } from 'node:path';
13
+ import { tmpdir, homedir } from 'node:os';
14
+ import { existsSync } from 'node:fs';
15
+ import { execFile } from 'node:child_process';
16
+ import { promisify } from 'node:util';
17
+ const execFileAsync = promisify(execFile);
18
+ /** skill 名称合法性(dsh-skill-filesystem 要求 kebab-case)。 */
19
+ const SKILL_NAME_PATTERN = /^[a-z0-9][a-z0-9-]{0,63}$/u;
20
+ /** 默认安装根:~/.dsh/skills(DSH_HOME 优先)。 */
21
+ export function defaultSkillRoot() {
22
+ const home = process.env.DSH_HOME?.trim() || join(homedir(), '.dsh');
23
+ return join(home, 'skills');
24
+ }
25
+ /** 从 SKILL.md frontmatter 提取 name(kebab-case),失败返回 undefined。 */
26
+ async function skillNameFromFrontmatter(skillMdPath) {
27
+ try {
28
+ const text = await readFile(skillMdPath, 'utf8');
29
+ const m = text.match(/^name:\s*([a-z0-9][a-z0-9-]{0,63})\s*$/mu);
30
+ return m?.[1];
31
+ }
32
+ catch {
33
+ return undefined;
34
+ }
35
+ }
36
+ /** 判断目录是否为 skill 根(含 SKILL.md)。 */
37
+ async function hasSkillMd(dir) {
38
+ try {
39
+ await readFile(join(dir, 'SKILL.md'), 'utf8');
40
+ return true;
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ }
46
+ /** 解压 ZIP 到目标目录(系统 bsdtar;多平台可用)。 */
47
+ async function extractZip(zipPath, destDir) {
48
+ await execFileAsync('tar', ['-xf', zipPath, '-C', destDir], { timeout: 120000, windowsHide: true });
49
+ }
50
+ /** 防 zip-slip:确保展开后的路径仍在 root 内。 */
51
+ function isWithin(root, target) {
52
+ const r = resolve(root);
53
+ const t = resolve(target);
54
+ return t === r || t.startsWith(r + sep);
55
+ }
56
+ /** 安全拷贝 skill 目录内容到目标目录(逐文件,忽略符号链接)。 */
57
+ async function copyTreeSafe(srcDir, destDir) {
58
+ await mkdir(destDir, { recursive: true });
59
+ const entries = await readdir(srcDir, { withFileTypes: true });
60
+ for (const entry of entries) {
61
+ const src = join(srcDir, entry.name);
62
+ const dest = join(destDir, entry.name);
63
+ if (!isWithin(destDir, dest))
64
+ continue;
65
+ if (entry.isDirectory()) {
66
+ await copyTreeSafe(src, dest);
67
+ }
68
+ else if (entry.isFile()) {
69
+ await copyFile(src, dest);
70
+ }
71
+ }
72
+ }
73
+ /**
74
+ * 安装一个 Skill(按 productId 下载 ZIP → 定位 SKILL.md → 落盘)。
75
+ * 已装同名 skill 会被覆盖(幂等重装);失败时保留旧版。
76
+ */
77
+ export async function installSkill(client, productId, installRoot) {
78
+ const root = installRoot.trim() === '' ? defaultSkillRoot() : installRoot;
79
+ const bytes = await client.downloadSkill(productId);
80
+ const tmp = await mkdtemp(join(tmpdir(), 'dsh-himarket-skill-'));
81
+ try {
82
+ const zipPath = join(tmp, 'pkg.zip');
83
+ const unpackDir = join(tmp, 'unpack');
84
+ await mkdir(unpackDir, { recursive: true });
85
+ await writeFile(zipPath, bytes);
86
+ await extractZip(zipPath, unpackDir);
87
+ let skillSrc = unpackDir;
88
+ if (!(await hasSkillMd(unpackDir))) {
89
+ const subs = await readdir(unpackDir, { withFileTypes: true });
90
+ const found = subs.find((d) => d.isDirectory() && existsSync(join(unpackDir, d.name, 'SKILL.md')));
91
+ if (found === undefined) {
92
+ throw new Error('技能包内未找到 SKILL.md(根或第一层子目录)');
93
+ }
94
+ skillSrc = join(unpackDir, found.name);
95
+ }
96
+ let skillName = await skillNameFromFrontmatter(join(skillSrc, 'SKILL.md'));
97
+ if (skillName === undefined) {
98
+ const raw = basename(productId).toLowerCase().replace(/[^a-z0-9-]/gu, '-').replace(/^-+|-+$/gu, '');
99
+ skillName = SKILL_NAME_PATTERN.test(raw) ? raw : `skill-${raw}`.slice(0, 64);
100
+ }
101
+ if (!SKILL_NAME_PATTERN.test(skillName)) {
102
+ throw new Error(`技能名「${skillName}」不合法(需 kebab-case)`);
103
+ }
104
+ const dest = join(root, skillName);
105
+ await mkdir(root, { recursive: true });
106
+ await rm(dest, { recursive: true, force: true });
107
+ await copyTreeSafe(skillSrc, dest);
108
+ return {
109
+ ok: true,
110
+ name: skillName,
111
+ dir: dest,
112
+ note: `已安装技能「${skillName}」到 ${dest}`,
113
+ };
114
+ }
115
+ finally {
116
+ await rm(tmp, { recursive: true, force: true });
117
+ }
118
+ }
119
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../src/skill.ts"],"names":[],"mappings":"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"}
package/lib/tools.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * 对话式入口工具:himarket_sync / himarket_install_skill。
3
+ *
4
+ * 工具注册到 host tools 全局层(与 dsh-matrix 一致),所有会话可见、模型可调用。
5
+ * 文案面向小白:用大白话描述,让用户直接对 DSH 说「同步 HiMarket」「安装 xx 技能」即可。
6
+ *
7
+ * @module dsh-himarket/tools
8
+ */
9
+ import type { Context } from '@deepseek-ai/cordis';
10
+ /** 桥接暴露给工具的同步/安装回调(由 index.ts 注入)。 */
11
+ export interface HimarketToolDeps {
12
+ sync(): Promise<string>;
13
+ installSkill(nameOrId: string): Promise<string>;
14
+ }
15
+ /** 注册 himarket_sync 与 himarket_install_skill。 */
16
+ export declare function registerHimarketTools(ctx: Context, baseUrl: string, deps: HimarketToolDeps): Promise<void>;
package/lib/tools.js ADDED
@@ -0,0 +1,69 @@
1
+ /**
2
+ * 对话式入口工具:himarket_sync / himarket_install_skill。
3
+ *
4
+ * 工具注册到 host tools 全局层(与 dsh-matrix 一致),所有会话可见、模型可调用。
5
+ * 文案面向小白:用大白话描述,让用户直接对 DSH 说「同步 HiMarket」「安装 xx 技能」即可。
6
+ *
7
+ * @module dsh-himarket/tools
8
+ */
9
+ import { importOfficial } from './resolver.js';
10
+ /** 把字符串渲染成模型可见文本块。 */
11
+ function renderResult(_args, value) {
12
+ const text = typeof value === 'string' ? value : JSON.stringify(value, null, 2);
13
+ return [{ type: 'text', text }];
14
+ }
15
+ /** 注册 himarket_sync 与 himarket_install_skill。 */
16
+ export async function registerHimarketTools(ctx, baseUrl, deps) {
17
+ const tools = ctx.get('tools');
18
+ if (tools === undefined) {
19
+ ctx.logger.warn('[dsh-himarket] tools 服务不可用,对话式入口未注册');
20
+ return;
21
+ }
22
+ const mod = await importOfficial('@deepseek-ai/dsh-tools', baseUrl);
23
+ const defineTool = mod.defineTool;
24
+ if (typeof defineTool !== 'function') {
25
+ ctx.logger.warn('[dsh-himarket] 官方 dsh-tools 未导出 defineTool,对话式入口未注册');
26
+ return;
27
+ }
28
+ const syncTool = defineTool({
29
+ name: 'himarket_sync',
30
+ description: '从 HiMarket 同步能力:把已订阅的 MCP 工具接入当前会话、刷新可安装的技能清单。当用户说「同步 HiMarket」「刷新市场能力」时调用。',
31
+ parameters: {},
32
+ output: {
33
+ schema: { type: 'string' },
34
+ render: renderResult,
35
+ },
36
+ timeoutMs: 120_000,
37
+ isConcurrencySafe: () => false,
38
+ async execute() {
39
+ return await deps.sync();
40
+ },
41
+ });
42
+ const installTool = defineTool({
43
+ name: 'himarket_install_skill',
44
+ description: '从 HiMarket 安装一个技能(Agent Skill)到本机,装完即可在会话里使用。参数传技能名或产品 ID。当用户说「安装 xx 技能」「装一下 xx」时调用。',
45
+ parameters: {
46
+ nameOrId: {
47
+ type: 'string',
48
+ required: true,
49
+ description: '要安装的技能名或产品 ID(可在同步后的技能清单里找到)',
50
+ },
51
+ },
52
+ output: {
53
+ schema: { type: 'string' },
54
+ render: renderResult,
55
+ },
56
+ timeoutMs: 120_000,
57
+ isConcurrencySafe: () => false,
58
+ async execute(args) {
59
+ const nameOrId = typeof args.nameOrId === 'string' ? args.nameOrId.trim() : '';
60
+ if (nameOrId === '')
61
+ throw new Error('请提供要安装的技能名或产品 ID');
62
+ return await deps.installSkill(nameOrId);
63
+ },
64
+ });
65
+ tools.register(syncTool);
66
+ tools.register(installTool);
67
+ ctx.logger.info('[dsh-himarket] 已注册对话式工具 himarket_sync / himarket_install_skill');
68
+ }
69
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAwB9C,sBAAsB;AACtB,SAAS,YAAY,CAAC,KAA8B,EAAE,KAAc;IAClE,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IAC/E,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;AACjC,CAAC;AAED,iDAAiD;AACjD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAY,EAAE,OAAe,EAAE,IAAsB;IAC/F,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAA0B,CAAA;IACvD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;QACtD,OAAM;IACR,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAA;IACnE,MAAM,UAAU,GAAG,GAAG,CAAC,UAAsC,CAAA;IAC7D,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;QACrC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAA;QACtE,OAAM;IACR,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC;QAC1B,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,6EAA6E;QAC1F,UAAU,EAAE,EAAE;QACd,MAAM,EAAE;YACN,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,MAAM,EAAE,YAAY;SACrB;QACD,SAAS,EAAE,OAAO;QAClB,iBAAiB,EAAE,GAAG,EAAE,CAAC,KAAK;QAC9B,KAAK,CAAC,OAAO;YACX,OAAO,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QAC1B,CAAC;KACF,CAAC,CAAA;IAEF,MAAM,WAAW,GAAG,UAAU,CAAC;QAC7B,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,sFAAsF;QACnG,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,8BAA8B;aAC5C;SACF;QACD,MAAM,EAAE;YACN,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,MAAM,EAAE,YAAY;SACrB;QACD,SAAS,EAAE,OAAO;QAClB,iBAAiB,EAAE,GAAG,EAAE,CAAC,KAAK;QAC9B,KAAK,CAAC,OAAO,CAAC,IAA6B;YACzC,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;YAC9E,IAAI,QAAQ,KAAK,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;YACxD,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;QAC1C,CAAC;KACF,CAAC,CAAA;IAEF,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACxB,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;IAC3B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAA;AACnF,CAAC"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "dsh-himarket",
3
+ "version": "0.1.1",
4
+ "description": "HiMarket bridge for DeepSeek Harness: sync subscribed MCP servers and install published Skills into DSH, with a beginner-friendly settings panel and chat tools",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "lib/index.js",
8
+ "types": "lib/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./lib/index.d.ts",
12
+ "default": "./lib/index.js"
13
+ },
14
+ "./client": "./lib/client.js",
15
+ "./cordis.patch.yml": "./cordis.patch.yml",
16
+ "./package.json": "./package.json"
17
+ },
18
+ "files": [
19
+ "lib",
20
+ "cordis.patch.yml",
21
+ "README.md"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsc -p tsconfig.json && node scripts/build-client.mjs",
25
+ "dev": "tsc -p tsconfig.json --watch",
26
+ "test": "tsc -p tsconfig.json && node scripts/build-client.mjs && node --test",
27
+ "prepare": "tsc -p tsconfig.json && node scripts/build-client.mjs"
28
+ },
29
+ "dsh": {
30
+ "bundle": {
31
+ "patch": "./cordis.patch.yml"
32
+ },
33
+ "client": {
34
+ "platform": "web",
35
+ "inject": [
36
+ "@deepseek-ai/dsh-client-runtime",
37
+ "@deepseek-ai/dsh-client-locale",
38
+ "@deepseek-ai/dsh-client-ui-settings"
39
+ ]
40
+ }
41
+ },
42
+ "peerDependencies": {
43
+ "@deepseek-ai/cordis": "^4.0.1"
44
+ },
45
+ "devDependencies": {
46
+ "@deepseek-ai/cordis": "^4.0.1",
47
+ "@deepseek-ai/schemastery": "^3.18.1",
48
+ "@types/node": "^24.0.0",
49
+ "esbuild": "^0.28.2",
50
+ "typescript": "^5.9.0"
51
+ }
52
+ }