dsh-interconnect 0.7.0 → 0.10.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/README.md +76 -32
- package/assets/dsh-interconnect.md +92 -0
- package/cordis.patch.yml +4 -1
- package/dsh.plugin.json +2 -2
- package/lib/index.js +268 -285
- package/lib/interconnect/index.js +268 -285
- package/lib/interconnect/index.js.map +3 -3
- package/lib/skill-interconnect/index.js +50 -0
- package/lib/skill-interconnect/index.js.map +7 -0
- package/lib/skill-interconnect/invariant.js +13 -0
- package/lib/skill-interconnect/invariant.js.map +7 -0
- package/lib/tool-interconnect/index.js +14 -15
- package/lib/tool-interconnect/index.js.map +2 -2
- package/lib/types/interconnect/index.d.ts +57 -33
- package/lib/types/interconnect/index.d.ts.map +1 -1
- package/lib/types/interconnect/types.d.ts +86 -32
- package/lib/types/interconnect/types.d.ts.map +1 -1
- package/lib/types/skill-interconnect/index.d.ts +20 -0
- package/lib/types/skill-interconnect/index.d.ts.map +1 -0
- package/lib/types/skill-interconnect/invariant.d.ts +16 -0
- package/lib/types/skill-interconnect/invariant.d.ts.map +1 -0
- package/lib/types/tool-interconnect/index.d.ts.map +1 -1
- package/package.json +13 -2
package/README.md
CHANGED
|
@@ -3,12 +3,13 @@
|
|
|
3
3
|
跨实例消息互通与事件通知插件,用于 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (DSH)。
|
|
4
4
|
让一个 DSH 实例能向同一个实例、另一台机器、或另一台机器上的别的 DSH 实例发送消息、探测活性,并在实例之间双向推送事件。
|
|
5
5
|
|
|
6
|
-
##
|
|
6
|
+
## 包含三个插件
|
|
7
7
|
|
|
8
8
|
**`interconnect`** —— host 服务(`ctx.interconnect`):
|
|
9
9
|
|
|
10
|
-
-
|
|
11
|
-
- `/interconnect/link` WebSocket
|
|
10
|
+
- 全走持久 WebSocket 链接:跨实例、跨机器投递消息、枚举 live session、探测活性(`send`/`reply`/`ping`/`list` 经 `/interconnect/link` 的 `msg`/`query` 帧)
|
|
11
|
+
- `/interconnect/link` WebSocket 端点:双向实时事件推流,含心跳与指数退避重连;也承载
|
|
12
|
+
`send`/`reply` 消息(`msg`/`msg-result` 帧,WS 优先 + HTTP 回退)
|
|
12
13
|
- 事件 fan-out(HTTP + WebSocket),入站事件以 `interconnect/event` 发出
|
|
13
14
|
- 共享密钥鉴权(`DSH_INTERCONNECT_TOKEN`,bearer,fail-closed,timing-safe 比较)
|
|
14
15
|
|
|
@@ -19,12 +20,28 @@
|
|
|
19
20
|
- `interconnect_ping`:探测对端实例活性与身份
|
|
20
21
|
- `interconnect_reply`:向记录过的发送方回传消息,只需本机 session id + 文本,无需再次寻址
|
|
21
22
|
|
|
23
|
+
**`skill-interconnect`** —— 配套 skill:
|
|
24
|
+
|
|
25
|
+
- 向模型注册 `dsh-interconnect` skill,说明 `list`/`ping`/`send`/`reply` 的完整用法、
|
|
26
|
+
投递模式、`resume` 唤醒语义与失败处理。
|
|
27
|
+
- 明确告知模型:`interconnect_send` 会自动注入发送方的 `instanceId` 和 `sessionId`,
|
|
28
|
+
接收方凭记录的 sender 即可用 `interconnect_reply` 回信,不需要手工传地址。
|
|
29
|
+
- 依赖 `interconnect` 服务,只有传输层存在时才注册进 `ctx.skills`。
|
|
30
|
+
|
|
22
31
|
## 用法
|
|
23
32
|
|
|
24
|
-
###
|
|
33
|
+
### 寻址(0.9 起用 instanceId,全走持久链接)
|
|
34
|
+
|
|
35
|
+
从 0.9 起,**传输只走 WebSocket 持久链接,不再有 HTTP 端点**,寻址参数从 `baseUrl` 改为 `instanceId`:
|
|
25
36
|
|
|
26
|
-
`interconnect_send
|
|
27
|
-
|
|
37
|
+
- `interconnect_send(instanceId="peer", sessionId=..., text=...)`
|
|
38
|
+
- `interconnect_ping(instanceId="peer")`
|
|
39
|
+
- `interconnect_list(instanceId="peer")`
|
|
40
|
+
- `interconnect_reply(sessionId=...)`(只需本地 session,目标从记录的 sender 解析)
|
|
41
|
+
|
|
42
|
+
`instanceId` 是 `interconnect` 行 `peers` 映射里的键;真正用来拨号的 origin 由该映射的值给出(例如隧道端点 `http://127.0.0.1:13080`),**instanceId 本身从不出现在线上**,也不参与路由——origin 才是唯一的拨号依据。到**未配置 / 未联通**的对端 `send`/`ping`/`list` 返回 `unreachable`(无 HTTP 回退)。
|
|
43
|
+
|
|
44
|
+
`interconnect_list` 返回对端**当前 live** 的 session,每一行的 `sessionId` 在调用时刻都是合法的投递目标:
|
|
28
45
|
|
|
29
46
|
```
|
|
30
47
|
session-264d37b0-… 重构 interconnect 插件 [idle]
|
|
@@ -40,27 +57,53 @@ session-b07326da-… [running]
|
|
|
40
57
|
|
|
41
58
|
### 回复(`reply`)
|
|
42
59
|
|
|
43
|
-
`send`
|
|
44
|
-
|
|
45
|
-
|
|
60
|
+
`send` 的线负载带一个 `sender` 身份(**无地址**:`instanceId` + `sessionId`),收到消息的
|
|
61
|
+
instance 会按「本地 session id → 该 sender」记下这份身份。之后那个 session 可以只凭**自己的
|
|
62
|
+
session id + 文本**把消息回传给发送方,不用再次给出对端 instanceId 或远程 session id——回信
|
|
63
|
+
走的是本机到那个 instance 的持久链接。
|
|
46
64
|
|
|
47
65
|
```text
|
|
48
|
-
# 源实例 A 指定目标 B 的 session
|
|
49
|
-
interconnect_send(
|
|
66
|
+
# 源实例 A 指定目标 B 的 session,并带上自己的身份(无 baseUrl)
|
|
67
|
+
interconnect_send(instanceId="b", sessionId=B-sess, text="…", sender={instanceId:A, sessionId:A-sess})
|
|
50
68
|
|
|
69
|
+
# B 回传:只给本地 session id + 文本,目标从记录的 sender 解析
|
|
70
|
+
interconnect_reply(sessionId=B-sess, text="reply")
|
|
71
|
+
```
|
|
51
72
|
# B 回传:只给本地 session id + 文本,目标从记录的 sender 解析
|
|
52
73
|
interconnect_reply(sessionId=B-sess, text="reply")
|
|
53
74
|
```
|
|
54
75
|
|
|
55
76
|
- `sender` 是**自报**的,只用于 reply 归因与寻址,**不是**路由或鉴权依据——连接本身仍由
|
|
56
77
|
共享密钥在每个 origin 上独立鉴权。
|
|
57
|
-
- 回复的消息也带 `sender
|
|
78
|
+
- 回复的消息也带 `sender`(本机恒带,不再需要配置 origin),所以对话可双向多轮延续。
|
|
58
79
|
- 只有当入站 send **带了 `sender`** 时 reply 才有目标;对端版本没带、或本 session 从未收过
|
|
59
80
|
互联消息时,`reply` 返回 `delivered: false, reason: "no-sender-known"`。
|
|
60
81
|
- `sender` **不进模型上下文**(和 `source` 一样只落到持久化日志与 UI 归因)——这条消息的
|
|
61
82
|
内容字面就是 wire 上传来的 `text`,模型看到的仍是普通 user 文本,只是不带任何结构化的
|
|
62
83
|
发送方标记。
|
|
63
84
|
|
|
85
|
+
### 消息信道:全走 WS(`msg` / `query` 帧)
|
|
86
|
+
|
|
87
|
+
从 0.9 起**不再有任何 HTTP 端点**——`send`/`reply`/`ping`/`list` 全部在持久 WebSocket 链路
|
|
88
|
+
(`/interconnect/link`)上完成。`peers` 映射在激活时**自动 `link()` 每个对端**(心跳 + 指数退避
|
|
89
|
+
重连沿用既有实现),寻址按 `instanceId` 查对应链接。
|
|
90
|
+
|
|
91
|
+
| 帧 | 方向 | 作用 |
|
|
92
|
+
|---|---|---|
|
|
93
|
+
| `hello` | 双方 | 拨号方自报 instance id |
|
|
94
|
+
| `event` | 双方 | 生命周期事件推流 |
|
|
95
|
+
| `msg` | 请求方 → 接收方 | 携带 `kind`(`send`/`reply`)、`sessionId`、`text`、`sender`/`delivery`/`resume`、`reqId` |
|
|
96
|
+
| `msg-result` | 接收方 → 请求方 | 与 `reqId` 对应的 `SendResult` |
|
|
97
|
+
| `query` | 请求方 → 接收方 | `ping` / `list` / `event` 发现与事件查询 |
|
|
98
|
+
| `query-result` | 接收方 → 请求方 | 与 `reqId` 对应的查询结果 |
|
|
99
|
+
|
|
100
|
+
- **出站**:`interconnect_send`/`interconnect_reply`/`ping`/`list` 都发对应帧并等待匹配 `reqId`
|
|
101
|
+
的结果(受 `requestTimeoutMs` 约束)。到**未配置或未联通**的对端直接返回 `unreachable`——
|
|
102
|
+
**没有 HTTP 回退**,这是 0.9 的破坏性变化。
|
|
103
|
+
- **入站**:`msg` 帧走 `deliver`/`reply` 逻辑(sender 记录、subagent 封栏、`no-sender-known`
|
|
104
|
+
等),结果经同一 socket 回 `msg-result`;`query` 帧回 `query-result`。
|
|
105
|
+
- 心跳与指数退避重连沿用既有实现。
|
|
106
|
+
|
|
64
107
|
### 投递失败的原因
|
|
65
108
|
|
|
66
109
|
`delivered: false` 单独一个布尔值无法据以行动,因为不同失败需要不同应对,所以
|
|
@@ -73,7 +116,7 @@ interconnect_reply(sessionId=B-sess, text="reply")
|
|
|
73
116
|
| `resume-refused` | 请求了唤醒,但对端不允许(`allowResume: false`) | 再带 `resume` 也没用 |
|
|
74
117
|
| `resume-failed` | 允许唤醒且尝试了,但没得到 live agent(无此持久化 session,或被别的 owner 持有) | 换目标 |
|
|
75
118
|
| `session-owned-by-subagent` | 该 session 属于 subagent 路由,投递权在它的父 agent | 通过父 agent 触达,别直接投 |
|
|
76
|
-
| `no-sender-known` | `reply` 指向的本地 session 从未记录过发送方(它没收到过带 `sender` 的消息,或对端版本过旧没带 `sender`) | 先用 `interconnect_send`
|
|
119
|
+
| `no-sender-known` | `reply` 指向的本地 session 从未记录过发送方(它没收到过带 `sender` 的消息,或对端版本过旧没带 `sender`) | 先用 `interconnect_send` 主动建立联系 |
|
|
77
120
|
|
|
78
121
|
`reason` 恰好在 `delivered` 为 false 时出现。
|
|
79
122
|
|
|
@@ -119,10 +162,10 @@ context** 拥有,实测确认插件 fiber 被 dispose 时会把 resume 出来
|
|
|
119
162
|
|
|
120
163
|
```text
|
|
121
164
|
# 唤醒并让对方实际处理(会起一个计费回合)
|
|
122
|
-
interconnect_send(
|
|
165
|
+
interconnect_send(instanceId="peer", sessionId, text, resume=true, delivery="followup")
|
|
123
166
|
|
|
124
167
|
# 唤醒但不起回合:只写入上下文,等对方下次被唤醒时一起读
|
|
125
|
-
interconnect_send(
|
|
168
|
+
interconnect_send(instanceId="peer", sessionId, text, resume=true, delivery="inject")
|
|
126
169
|
```
|
|
127
170
|
|
|
128
171
|
已实测:`resume=true` + `inject` 之后目标从非 live 变 live(`interconnect_list` 计数 +1),
|
|
@@ -151,10 +194,9 @@ Host 自己的 resume 路径对同一个 session 报 `SessionFormatUnsupportedEr
|
|
|
151
194
|
|
|
152
195
|
| 字段 | 默认 | 说明 |
|
|
153
196
|
|---|---|---|
|
|
154
|
-
| `instanceId` | `'dsh'` | 本实例自报的 id,出现在 `ping`/`send`/`list`
|
|
155
|
-
| `selfBaseUrl` | 无 | 本实例对外可达的 origin(如 `http://my-box:3080`)。设置后,出站 `send`/`reply` 会带上本实例的 `sender` 身份,使对端能回信;不设置则不归因、对端 `reply` 报 `no-sender-known` |
|
|
197
|
+
| `instanceId` | `'dsh'` | 本实例自报的 id,出现在 `ping`/`send`/`list` 的回包里。也作为「对端如何寻址到我」的身份 |
|
|
156
198
|
| `requestTimeoutMs` | `10000` | 出站请求超时,上限 60000 |
|
|
157
|
-
| `peers` | `
|
|
199
|
+
| `peers` | `{}` | **对端路由映射**:`{ [对端 instanceId]: 我拨向它的 origin }`,例如隧道端点 `http://127.0.0.1:13080`。激活时对每个对端自动建持久 WS 链;`send`/`reply`/`ping`/`list` 都按 instanceId 走对应链接 |
|
|
158
200
|
| `delivery` | `'followup'` | 入站消息未带 `delivery` 时的默认投递模式 |
|
|
159
201
|
| `allowResume` | `true` | 是否允许发送方用 `resume` 唤醒本机的离线 session |
|
|
160
202
|
|
|
@@ -162,8 +204,9 @@ Host 自己的 resume 路径对同一个 session 报 `SessionFormatUnsupportedEr
|
|
|
162
204
|
- id: interconnect
|
|
163
205
|
config:
|
|
164
206
|
instanceId: my-box
|
|
165
|
-
|
|
166
|
-
|
|
207
|
+
peers:
|
|
208
|
+
peer-a: http://127.0.0.1:13080 # 我拨向对端 peer-a 的 origin
|
|
209
|
+
peer-b: http://127.0.0.1:13081
|
|
167
210
|
delivery: followup
|
|
168
211
|
allowResume: false # 拒绝一切唤醒请求
|
|
169
212
|
```
|
|
@@ -175,7 +218,7 @@ Host 自己的 resume 路径对同一个 session 报 `SessionFormatUnsupportedEr
|
|
|
175
218
|
|
|
176
219
|
本包已发布到 npm:[`dsh-interconnect`](https://www.npmjs.com/package/dsh-interconnect)。
|
|
177
220
|
本仓库是一个 DSH profile bundle(根 `package.json` 声明 `dsh.bundle.patch` 指向
|
|
178
|
-
根 `cordis.patch.yml`,后者 `insert`
|
|
221
|
+
根 `cordis.patch.yml`,后者 `insert` 三个插件行)。
|
|
179
222
|
|
|
180
223
|
```bash
|
|
181
224
|
# 从 npm
|
|
@@ -206,31 +249,32 @@ pnpm run build # esbuild → lib/
|
|
|
206
249
|
|
|
207
250
|
## 架构说明
|
|
208
251
|
|
|
209
|
-
-
|
|
210
|
-
服务(有 HTTP/WS 端点),必须 host 级;`tool-interconnect`
|
|
211
|
-
`interconnect` 未做 TypeRT `@Remote`/Gateway 绑定,放进 agent preset
|
|
212
|
-
realm
|
|
252
|
+
- 三个插件都挂在 **host composition**:`interconnect` 是跨 session、跨机器的进程级
|
|
253
|
+
服务(有 HTTP/WS 端点),必须 host 级;`tool-interconnect` 和 `skill-interconnect`
|
|
254
|
+
也放 host,因为 `interconnect` 未做 TypeRT `@Remote`/Gateway 绑定,放进 agent preset
|
|
255
|
+
的 isolate realm 会导致工具/技能行无法 inject 到该服务。
|
|
213
256
|
- `ws` 是运行依赖,由宿主的 node_modules 提供(构建时 external)。
|
|
214
257
|
|
|
215
258
|
## 验证
|
|
216
259
|
|
|
217
|
-
-
|
|
260
|
+
- 38/38 单测通过(服务 + 工具 + skill);类型检查、构建均干净。
|
|
218
261
|
- 已在两台机器之间实测双向互通:消息投递、WebSocket 事件推流、以及 agent 经
|
|
219
262
|
`interconnect_send` 工具反向回发,均验证通过。
|
|
220
263
|
- CI(GitHub Actions):clone 公开 DSH 仓库作为 sibling,跑 `pnpm run check`。
|
|
221
264
|
- 已发布版本:从 registry 下载的 tarball 与本地构建 shasum 一致;干净消费端
|
|
222
|
-
解析 `.`、`./tool-interconnect`
|
|
223
|
-
`number`)如期报 `TS2322`。
|
|
265
|
+
解析 `.`、`./tool-interconnect`、`./skill-interconnect` 入口的类型均通过,负例(把
|
|
266
|
+
`string` 赋给 `number`)如期报 `TS2322`。
|
|
224
267
|
- 投递消息以 `source: { kind: 'plugin', plugin: 'dsh-interconnect' }` 落库,而不是
|
|
225
268
|
`{ kind: 'user' }`。负例:把该 source 改回 `kind: 'user'`,对应断言转红。
|
|
226
269
|
**注意 `source` 不进模型上下文**——只有 `role` 和 `content` 会,而 `role` 是 `user`。
|
|
227
270
|
所以这个字段的价值在持久化日志与 UI 归因,接收方的**模型本身分辨不出**消息来自插件。
|
|
228
271
|
同理,reply 的记录与寻址依赖 `sender`,它同样不进模型上下文。
|
|
229
|
-
- reply 双向多轮延续在**同一测试进程内用真实
|
|
272
|
+
- reply 双向多轮延续在**同一测试进程内用真实 WS 双向回环**验证(A→B→A→B),不是 mockout。
|
|
230
273
|
- 每个行为改动都配负例对照(删掉实现使对应断言转红),而不只是「测试通过」。
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
274
|
+
例如:去掉 `peers` 激活时的自动 `link()`,3 条「自动建链投递 / ping/list / reply 回环」
|
|
275
|
+
测试转红;去掉 `requestTimeoutMs` 的定时会违反「超时即 unreachable」的契约。
|
|
276
|
+
- WS + instanceId 传输在**真实 WS 链路**上验证:接收方只暴露 upgrade 路由、不暴露任何 HTTP,
|
|
277
|
+
一条 `send` 仍投递成功——排除了「其实走了 HTTP 回退」的误判(0.9 起根本没有 HTTP)。
|
|
234
278
|
|
|
235
279
|
## 许可
|
|
236
280
|
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# dsh-interconnect
|
|
2
|
+
|
|
3
|
+
Use the `dsh-interconnect` tools whenever you need to exchange messages with
|
|
4
|
+
another DSH session, another DSH instance, or another machine: hand off a task,
|
|
5
|
+
ask a peer agent for information, notify a remote session, or reply to an
|
|
6
|
+
incoming interconnect message.
|
|
7
|
+
|
|
8
|
+
The transport is already connected and authenticated by the host plugin. Your
|
|
9
|
+
job is only to pick the right tool and the right target.
|
|
10
|
+
|
|
11
|
+
## Tools
|
|
12
|
+
|
|
13
|
+
- `interconnect_list` — discover which sessions are live on a peer instance.
|
|
14
|
+
Every returned `sessionId` is a valid `interconnect_send` target at that
|
|
15
|
+
moment. Use this first when you do not already know the target session id.
|
|
16
|
+
- `interconnect_ping` — probe whether a peer instance is reachable and learn
|
|
17
|
+
its self-reported instance id.
|
|
18
|
+
- `interconnect_send` — deliver one text message to a live session on a peer
|
|
19
|
+
instance. Pass `instanceId`, `sessionId`, and `text`. The sending
|
|
20
|
+
instance/session identity is attached automatically by the tool, so you must
|
|
21
|
+
NOT pass a sender parameter.
|
|
22
|
+
- `interconnect_reply` — send a message back to the peer that this session last
|
|
23
|
+
received an interconnect message from. Pass only the LOCAL session id that
|
|
24
|
+
received the message and the reply text. The remote target is recalled
|
|
25
|
+
automatically; do not try to look up or pass the sender address again.
|
|
26
|
+
|
|
27
|
+
## Sender identity is automatic
|
|
28
|
+
|
|
29
|
+
When you call `interconnect_send`, the plugin automatically attaches your own
|
|
30
|
+
`instanceId` and `sessionId` to the wire payload. The receiving instance
|
|
31
|
+
records that identity per local session, which is exactly what lets the
|
|
32
|
+
receiver use `interconnect_reply` later without re-addressing.
|
|
33
|
+
|
|
34
|
+
A reply also carries your identity automatically, so a multi-hop conversation
|
|
35
|
+
(A → B → A → B) keeps working without either side manually forwarding
|
|
36
|
+
addresses.
|
|
37
|
+
|
|
38
|
+
## Recommended workflow
|
|
39
|
+
|
|
40
|
+
1. If you know the peer instance but not the target session, call
|
|
41
|
+
`interconnect_list(instanceId=...)` and choose a live session.
|
|
42
|
+
2. Call `interconnect_send(instanceId=..., sessionId=..., text=...)`.
|
|
43
|
+
3. When a message arrives on your side and you need to respond, call
|
|
44
|
+
`interconnect_reply(sessionId=<your-local-session-id>, text=...)`. The
|
|
45
|
+
recorded sender is used as the destination.
|
|
46
|
+
|
|
47
|
+
## Delivery modes
|
|
48
|
+
|
|
49
|
+
The `delivery` parameter is per-message urgency:
|
|
50
|
+
|
|
51
|
+
- `followup` — queues the message as its own turn after whatever the receiver
|
|
52
|
+
is doing now.
|
|
53
|
+
- `steer` — cuts into the nearest step boundary of a running turn; use for
|
|
54
|
+
urgent interruptions.
|
|
55
|
+
- `inject` — only writes the message into context, without waking an idle
|
|
56
|
+
agent; it may sit unread.
|
|
57
|
+
|
|
58
|
+
Omit `delivery` to use the receiver's configured default.
|
|
59
|
+
|
|
60
|
+
## Waking offline sessions
|
|
61
|
+
|
|
62
|
+
`resume` defaults to off. Setting `resume: true` asks the receiver to wake a
|
|
63
|
+
persisted but not-running session, which starts a real billed agent turn with
|
|
64
|
+
that session's full toolset. Only use it when the specific session must be
|
|
65
|
+
reached and the receiver allows it. Prefer `interconnect_list` and an
|
|
66
|
+
already-live target when possible.
|
|
67
|
+
|
|
68
|
+
## Failure reasons
|
|
69
|
+
|
|
70
|
+
When a send/reply reports `delivered: false`, read `reason`:
|
|
71
|
+
|
|
72
|
+
- `session-not-live` — the receiver answered, but that session has no running
|
|
73
|
+
agent. Use `interconnect_list` to choose another target, or consider
|
|
74
|
+
`resume`.
|
|
75
|
+
- `unreachable` — no usable answer arrived; the target may still be fine, so a
|
|
76
|
+
retry can succeed.
|
|
77
|
+
- `resume-refused` / `resume-failed` — waking is not allowed or did not work;
|
|
78
|
+
choose a live target instead.
|
|
79
|
+
- `session-owned-by-subagent` — the session belongs to a subagent and its
|
|
80
|
+
parent owns delivery; reach it through the parent.
|
|
81
|
+
- `no-sender-known` — a `reply` was attempted for a local session that never
|
|
82
|
+
received a sender-carrying interconnect message; establish contact with
|
|
83
|
+
`interconnect_send` first.
|
|
84
|
+
|
|
85
|
+
## Rules
|
|
86
|
+
|
|
87
|
+
- Do not fabricate an `instanceId`, `sessionId`, or sender identity. Use values
|
|
88
|
+
returned by `interconnect_list`, `interconnect_ping`, or already recorded by
|
|
89
|
+
the service.
|
|
90
|
+
- Do not ask the user for a sender address to reply; use `interconnect_reply`.
|
|
91
|
+
- Treat interconnect messages as authenticated but sender-reported: identity is
|
|
92
|
+
for reply attribution, not for routing or authorization.
|
package/cordis.patch.yml
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# dsh-interconnect bundle patch: mount the
|
|
1
|
+
# dsh-interconnect bundle patch: mount the three host plugins under their
|
|
2
2
|
# subpath entries, resolved through the profile's node_modules (the healed
|
|
3
3
|
# mirror makes every bundle dependency resolvable to bare rows).
|
|
4
4
|
- insert:
|
|
@@ -10,3 +10,6 @@
|
|
|
10
10
|
|
|
11
11
|
- id: tool-interconnect
|
|
12
12
|
name: dsh-interconnect/tool-interconnect
|
|
13
|
+
|
|
14
|
+
- id: skill-interconnect
|
|
15
|
+
name: dsh-interconnect/skill-interconnect
|
package/dsh.plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-interconnect",
|
|
3
|
-
"description": "Cross-instance message/event handoff for DeepSeek Harness (DSH):
|
|
4
|
-
"version": "0.
|
|
3
|
+
"description": "Cross-instance message/event handoff for DeepSeek Harness (DSH): WebSocket link, model-facing tools, and companion skill.",
|
|
4
|
+
"version": "0.10.0",
|
|
5
5
|
"entry": {
|
|
6
6
|
"name": "dsh-interconnect/interconnect",
|
|
7
7
|
"inject": ["webServer", "agents", "credentials"]
|