dsh-bailinghub 0.1.0 → 0.2.0
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/CHANGELOG.md +22 -0
- package/PRIVACY.md +12 -0
- package/README.md +146 -60
- package/SECURITY.md +14 -1
- package/cordis.agent-client.patch.yml +8 -0
- package/docs/AGENT_CLIENT_CONTRACT.md +198 -0
- package/docs/COMPATIBILITY.md +71 -5
- package/docs/MIGRATION_VNEXT.md +106 -0
- package/docs/PROJECT_BOUNDARIES.md +25 -7
- package/docs/README.zh-CN.md +179 -0
- package/lib/index.js +53 -0
- package/lib/runtime.js +1394 -0
- package/lib/transport.js +93 -0
- package/package.json +17 -7
- package/README.zh-CN.md +0 -94
package/lib/transport.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
const DEFAULT_SDK_MODULE = 'bailinghub-mcp-server/sdk'
|
|
2
|
+
|
|
3
|
+
const REQUIRED_METHODS = [
|
|
4
|
+
'login',
|
|
5
|
+
'status',
|
|
6
|
+
'logout',
|
|
7
|
+
'workspaces',
|
|
8
|
+
'use',
|
|
9
|
+
'startTurn',
|
|
10
|
+
'searchCapabilities',
|
|
11
|
+
'invoke',
|
|
12
|
+
'resume',
|
|
13
|
+
'completeRun',
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
function assertTransport(transport) {
|
|
17
|
+
if (transport === null || typeof transport !== 'object') {
|
|
18
|
+
throw new TypeError('BailingHub Agent Client transport must be an object')
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
for (const method of REQUIRED_METHODS) {
|
|
22
|
+
if (typeof transport[method] !== 'function') {
|
|
23
|
+
throw new TypeError(`BailingHub Agent Client transport is missing ${method}()`)
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return transport
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function resolveSdkFactory(module) {
|
|
31
|
+
for (const candidate of [
|
|
32
|
+
module.createAgentClientTransport,
|
|
33
|
+
module.createAgentClient,
|
|
34
|
+
module.default,
|
|
35
|
+
]) {
|
|
36
|
+
if (typeof candidate === 'function') return candidate
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
throw new TypeError(
|
|
40
|
+
`${DEFAULT_SDK_MODULE} must export createAgentClientTransport(), createAgentClient(), or a default factory`,
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Lazily resolves the generic BailingHub Agent Client SDK. The SDK, rather than
|
|
46
|
+
* this DSH adapter, owns browser authorization, token storage, refresh, and the
|
|
47
|
+
* HTTP endpoint mapping. A missing SDK therefore degrades only the first use;
|
|
48
|
+
* it never prevents Cordis from loading the plugin candidate.
|
|
49
|
+
*/
|
|
50
|
+
export function createLazySdkTransport(config, options = {}) {
|
|
51
|
+
const importModule = options.importModule ?? ((specifier) => import(specifier))
|
|
52
|
+
const moduleName = options.moduleName ?? DEFAULT_SDK_MODULE
|
|
53
|
+
let clientPromise
|
|
54
|
+
|
|
55
|
+
const client = () => {
|
|
56
|
+
clientPromise ??= Promise.resolve(importModule(moduleName)).then(async (sdkModule) => {
|
|
57
|
+
const factory = resolveSdkFactory(sdkModule)
|
|
58
|
+
return assertTransport(
|
|
59
|
+
await factory({
|
|
60
|
+
hubUrl: config.hubUrl,
|
|
61
|
+
clientAppId: config.clientAppId,
|
|
62
|
+
workspace: config.workspace,
|
|
63
|
+
route: config.workspace,
|
|
64
|
+
connectionName: config.connectionName,
|
|
65
|
+
}),
|
|
66
|
+
)
|
|
67
|
+
})
|
|
68
|
+
return clientPromise
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return Object.fromEntries(
|
|
72
|
+
REQUIRED_METHODS.map((method) => [
|
|
73
|
+
method,
|
|
74
|
+
async (...args) => (await client())[method](...args),
|
|
75
|
+
]),
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function createTransportProvider(config, options = {}) {
|
|
80
|
+
let transportPromise
|
|
81
|
+
|
|
82
|
+
return async () => {
|
|
83
|
+
transportPromise ??= Promise.resolve(
|
|
84
|
+
options.transport ??
|
|
85
|
+
options.transportFactory?.(config) ??
|
|
86
|
+
createLazySdkTransport(config, options.sdk),
|
|
87
|
+
).then(assertTransport)
|
|
88
|
+
|
|
89
|
+
return transportPromise
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export { DEFAULT_SDK_MODULE, REQUIRED_METHODS, assertTransport }
|
package/package.json
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-bailinghub",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Native DeepSeek Harness adapter for the BailingHub Agent Client Core.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
|
+
"main": "lib/index.js",
|
|
8
|
+
"exports": "./lib/index.js",
|
|
7
9
|
"author": {
|
|
8
10
|
"name": "BailingHub Contributors",
|
|
9
11
|
"email": "niejingchuan@live.com"
|
|
@@ -16,6 +18,10 @@
|
|
|
16
18
|
"url": "https://github.com/bailinghub/bailinghub-dsh-plugin/issues"
|
|
17
19
|
},
|
|
18
20
|
"homepage": "https://github.com/bailinghub/bailinghub-dsh-plugin#readme",
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public",
|
|
23
|
+
"provenance": true
|
|
24
|
+
},
|
|
19
25
|
"keywords": [
|
|
20
26
|
"deepseek-harness",
|
|
21
27
|
"dsh",
|
|
@@ -29,8 +35,12 @@
|
|
|
29
35
|
"self-hosted"
|
|
30
36
|
],
|
|
31
37
|
"files": [
|
|
38
|
+
"lib",
|
|
39
|
+
"cordis.agent-client.patch.yml",
|
|
32
40
|
"cordis.patch.yml",
|
|
33
|
-
"
|
|
41
|
+
"docs/AGENT_CLIENT_CONTRACT.md",
|
|
42
|
+
"docs/MIGRATION_VNEXT.md",
|
|
43
|
+
"docs/README.zh-CN.md",
|
|
34
44
|
"SECURITY.md",
|
|
35
45
|
"PRIVACY.md",
|
|
36
46
|
"CHANGELOG.md",
|
|
@@ -47,13 +57,13 @@
|
|
|
47
57
|
"verify": "npm run check:project && npm test",
|
|
48
58
|
"prepack": "npm run verify"
|
|
49
59
|
},
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
60
|
+
"dependencies": {
|
|
61
|
+
"@deepseek-ai/schemastery": "^3.18.1",
|
|
62
|
+
"bailinghub-mcp-server": "0.2.0"
|
|
53
63
|
},
|
|
54
64
|
"dsh": {
|
|
55
65
|
"bundle": {
|
|
56
|
-
"patch": "./cordis.patch.yml"
|
|
66
|
+
"patch": "./cordis.agent-client.patch.yml"
|
|
57
67
|
}
|
|
58
68
|
}
|
|
59
69
|
}
|
package/README.zh-CN.md
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
# BailingHub for DeepSeek Harness
|
|
2
|
-
|
|
3
|
-
[English](README.md) | 简体中文
|
|
4
|
-
|
|
5
|
-
在电脑上的 DeepSeek Harness 里,通过 BailingHub 向已经接入的业务 route 发起受控任务,
|
|
6
|
-
并在同一会话中持续查看状态和可用结果,不必再进入每个业务后台里的嵌入聊天入口。
|
|
7
|
-
|
|
8
|
-
这是独立社区集成,不是 DeepSeek 官方开发、认证、合作、背书或推荐的插件。
|
|
9
|
-
|
|
10
|
-
## 使用者得到什么
|
|
11
|
-
|
|
12
|
-
安装后,DeepSeek Harness 会发现三个原生工具:
|
|
13
|
-
|
|
14
|
-
| Harness 工具 | 能力 |
|
|
15
|
-
| --- | --- |
|
|
16
|
-
| `mcp__bailinghub__submit_governed_job` | 使用稳定请求 ID 提交一项业务任务 |
|
|
17
|
-
| `mcp__bailinghub__get_governed_job` | 查询同一个任务的当前状态和公开结果 |
|
|
18
|
-
| `mcp__bailinghub__wait_for_governed_job` | 有界等待同一个任务,不重复提交 |
|
|
19
|
-
|
|
20
|
-
BailingHub 仍位于模型与业务系统之间。中枢地址、Client Token 和 route 都由运营者预先
|
|
21
|
-
配置,不是模型参数;模型不能借工具参数切换 route,也不能提交管理员凭据、执行器凭据、
|
|
22
|
-
审批结论或业务系统密钥。
|
|
23
|
-
|
|
24
|
-
## 安装
|
|
25
|
-
|
|
26
|
-
前置条件:
|
|
27
|
-
|
|
28
|
-
- Node.js `22.19.0+` 或 `24+`;
|
|
29
|
-
- 已安装 `pnpm` 与 `@deepseek-ai/dsh@0.1.0-rc.7`;
|
|
30
|
-
- 一套可访问的 [BailingHub](https://github.com/bailinghub/bailinghub#快速上手);
|
|
31
|
-
- 一个只允许目标 route 的 BailingHub Client Token。
|
|
32
|
-
|
|
33
|
-
```bash
|
|
34
|
-
npm install --global pnpm @deepseek-ai/dsh@0.1.0-rc.7
|
|
35
|
-
dsh plugin --profile web add dsh-bailinghub@0.1.0
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
在启动 Harness 的终端或进程环境中配置:
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
export BAILINGHUB_BASE_URL='https://hub.example.com'
|
|
42
|
-
export BAILINGHUB_CLIENT_TOKEN='替换为仅允许指定-route-的-client-token'
|
|
43
|
-
export BAILINGHUB_ROUTE='order_assistant'
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
检查最终配置,然后启动本机 Web 界面:
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
dsh --profile web --dump-config
|
|
50
|
-
dsh web
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
接下来可以直接要求 Harness 通过 BailingHub 提交任务、保存返回的 `job_id`,并等待或
|
|
54
|
-
查询同一个任务。
|
|
55
|
-
|
|
56
|
-
第一次尝试时,请选择当前 route 已支持的任务,并明确要求:使用稳定 `request_id` 只提交
|
|
57
|
-
一次,保存返回的 `job_id`;有界等待超时后,只查询同一个任务,不要重新提交。
|
|
58
|
-
|
|
59
|
-
## 正确任务流程
|
|
60
|
-
|
|
61
|
-
1. 为一项业务请求生成一个稳定的 `request_id`;
|
|
62
|
-
2. 只调用一次 `mcp__bailinghub__submit_governed_job`;
|
|
63
|
-
3. 保存返回的 `job_id`;
|
|
64
|
-
4. 短时调用 `wait_for_governed_job`,或者稍后调用 `get_governed_job`;
|
|
65
|
-
5. 等待超时不等于任务失败,不能因此重新提交一份替代任务。
|
|
66
|
-
|
|
67
|
-
## 身份与权限边界
|
|
68
|
-
|
|
69
|
-
使用本机 Harness 界面,省掉的是“必须打开业务后台聊天入口”这一步;它不代表 Harness
|
|
70
|
-
登录态或本机用户自动成为可信业务身份。`0.1.0` 有意不接受模型传入行动主体。route 或
|
|
71
|
-
下游业务系统仍需解析可信主体并执行最终授权;如果目标动作必须具备业务身份,而当前接入
|
|
72
|
-
路径无法建立该身份,该动作就应保持不可用或被拒绝。
|
|
73
|
-
|
|
74
|
-
本 Bundle 只治理通过这三个 BailingHub 工具提交的任务,不会自动拦截 Harness 中安装的
|
|
75
|
-
其他工具。
|
|
76
|
-
|
|
77
|
-
## 供应链说明
|
|
78
|
-
|
|
79
|
-
这个 Bundle 没有自定义运行时代码、生产依赖和安装脚本。Harness 启动时,会由内置 MCP
|
|
80
|
-
Client 在 Agent 沙箱之外执行固定命令
|
|
81
|
-
`npx -y --package=bailinghub-mcp-server@0.1.1 bailinghub-mcp-server`。首次启动可能需要
|
|
82
|
-
访问 npm;敏感环境应审查并固定版本,生产镜像可提前缓存该精确版本。
|
|
83
|
-
|
|
84
|
-
MCP Server 默认拒绝非回环明文 HTTP。只有在受控私网中已经由其他可信边界终止 TLS 时,
|
|
85
|
-
才可设置 `BAILINGHUB_ALLOW_INSECURE_HTTP=true`。
|
|
86
|
-
|
|
87
|
-
## 兼容范围与反馈
|
|
88
|
-
|
|
89
|
-
首版验证范围为 DeepSeek Harness `0.1.0-rc.7`、`bailinghub-mcp-server@0.1.1` 与
|
|
90
|
-
BailingHub Client API v1。Harness 当前仍是 Developer Preview,升级 Harness 后应重新
|
|
91
|
-
执行兼容性 Smoke。
|
|
92
|
-
|
|
93
|
-
问题请提交到 [GitHub Issues](https://github.com/bailinghub/bailinghub-dsh-plugin/issues)。
|
|
94
|
-
请勿附带 Token、私有部署地址、个人信息或生产业务数据。
|