@dsh-edge/dsh-edge-agent 0.1.2 → 0.1.3
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 +59 -0
- package/lib/dsh-adapter/http-api.d.ts.map +1 -1
- package/lib/dsh-adapter/http-api.js +40 -3
- package/lib/dsh-adapter/input-guard.d.ts +6 -0
- package/lib/dsh-adapter/input-guard.d.ts.map +1 -1
- package/lib/dsh-adapter/input-guard.js +24 -1
- package/lib/dsh-adapter/intent-router.d.ts.map +1 -1
- package/lib/dsh-adapter/intent-router.js +40 -34
- package/lib/dsh-adapter/llm-drain-deadline.d.ts +55 -0
- package/lib/dsh-adapter/llm-drain-deadline.d.ts.map +1 -0
- package/lib/dsh-adapter/llm-drain-deadline.js +77 -0
- package/lib/dsh-adapter/prompt-guard.d.ts.map +1 -1
- package/lib/dsh-adapter/prompt-guard.js +39 -33
- package/lib/dsh-adapter/web-search-tavily-bocha.d.ts.map +1 -1
- package/lib/dsh-adapter/web-search-tavily-bocha.js +51 -1
- package/package.json +5 -2
package/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,65 @@
|
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
## [0.1.3] — 2026-11-12
|
|
13
|
+
|
|
14
|
+
**修掉「边缘模式发请求卡住」,并把发版前置条件变成第 29 道门禁。** 2026-11-11 → 2026-11-12。
|
|
15
|
+
|
|
16
|
+
### 行为修复:边缘模式「发请求卡住」
|
|
17
|
+
|
|
18
|
+
> ⚠️ **0.1.2 不含这个修复**(实测拆包确认:0.1.2 的 `input-guard.js` 不含
|
|
19
|
+
> `isLocalPoolForward` 判据,也没有 `llm-drain-deadline`)⇒ 停在 0.1.2 的用户仍会遇到;
|
|
20
|
+
> **本版(0.1.3)包含**。
|
|
21
|
+
|
|
22
|
+
**症状**:桌面版加载插件 → 边缘模式发请求 → 一直「等待」,LLM 调用 0 次,**不报错**。
|
|
23
|
+
**触发条件**:没有 `edge.json`(两池都落到 DELEGATE 转发模式)+ 宿主有可选模型 +
|
|
24
|
+
边缘模式 + 同会话第二轮。
|
|
25
|
+
|
|
26
|
+
**根因**:本地池的 DELEGATE 转发回来那一趟,provider 变成了宿主的目标路由;
|
|
27
|
+
`input-guard` 的改道判据只认 provider 名、**不认「这是本地池自己发起的转发」**
|
|
28
|
+
⇒ 那趟又被改道 ⇒ 乒乓 ⇒ 递归吃内存 ⇒ **请求根本没走到网络层** ⇒ promise 永不 settle
|
|
29
|
+
⇒ 所以表现是「卡住」而不是「报错」。
|
|
30
|
+
|
|
31
|
+
**修复**(§7.190 / §7.191 / §7.192):改道判据加**转发标记**
|
|
32
|
+
(`__edgeLocalPoolForward`)—— 本地池自己的转发不再被改道;另加时限收口
|
|
33
|
+
(`llm-drain-deadline`)与「本地没配模型就取 DSH 配置的模型」。
|
|
34
|
+
|
|
35
|
+
**验证(本机 Windows 实盘,四轮独立冷启动、可复现)**:
|
|
36
|
+
|
|
37
|
+
| | 改道跳数 | 审计 `reroute` 次数 | 真实网络请求 | 收口 |
|
|
38
|
+
|---|---|---|---|---|
|
|
39
|
+
| 修复前(npm 0.1.1) | **41**(打满探针上限) | **20** | **0**(没出网) | 探针中止(≈500ms) |
|
|
40
|
+
| 修复后(本版构建) | **3** | **1** | REQ + RESP | ✅ 27–55ms |
|
|
41
|
+
|
|
42
|
+
四轮的原始输出与复现步骤见 [`docs/PROGRESS.md`](docs/PROGRESS.md) §7.194。
|
|
43
|
+
|
|
44
|
+
### 把「发版前置条件」从口头记忆变成门禁
|
|
45
|
+
|
|
46
|
+
这一段**不改变运行时行为** —— 它改的是**发布链本身**与**文档口径**;
|
|
47
|
+
本版的**行为变化**在上面的「行为修复」一节。(§7.193,2026-11-11)
|
|
48
|
+
|
|
49
|
+
#### 修掉的两处「与实际行为相反」
|
|
50
|
+
|
|
51
|
+
- **staged publishing 的上线判据**:旧文档写「`npm view <pkg> version` 返回 `0.0.0-stage`
|
|
52
|
+
⇒ 还卡着」—— 实测**不是这样**:发 0.1.2 时它返回的是**上一个真实版本 `0.1.1`**。
|
|
53
|
+
⇒ 正确判据是**看 `versions` 数组里有没有出现新版本**(`npm view <pkg> versions --json`)。
|
|
54
|
+
拿旧判据会**误判成「已上线」**,进而提前推 tag、让 CI 撞 409。
|
|
55
|
+
- **trusted publisher 的前置**:旧文档只说「去包页登记 trusted publisher」,
|
|
56
|
+
没写**账号必须已经开着 2FA**。npm 官方 `npm trust` 文档写明 trusted publisher 要求
|
|
57
|
+
**账号级 2FA**,且**不接受**勾了 bypass 的 granular token ⇒ **顺序是「先开 2FA →
|
|
58
|
+
再挂 trusted publisher」**。
|
|
59
|
+
|
|
60
|
+
#### 新的第 29 道门禁:`verify:npm-readiness`
|
|
61
|
+
|
|
62
|
+
- **9 项静态断言**(全离线、只读):`publish.yml` 有 `id-token: write`、被 `v*` tag 触发、
|
|
63
|
+
publish 步骤 cwd 是 `dist/.npm-stage`、命令带 `--access public` / `--ignore-scripts` /
|
|
64
|
+
`--no-git-checks`、`--provenance` 与 `--no-provenance` 两条分支都在、有 tag↔version 断言、
|
|
65
|
+
真的有 `pnpm publish`;
|
|
66
|
+
- **token 字面量扫描**:git 追踪的文件里不得出现 npm token 的字面量;
|
|
67
|
+
- **`--online`** 才查 registry 实况(匿名只读),**网络失败不算失败**;
|
|
68
|
+
- **机器查不了的事,如实报「查不了」**:账号 2FA 状态(CLI 实测 403)与 trusted publisher
|
|
69
|
+
是否已挂(registry 无可查端点)—— 每次 CI 都打印「去哪确认、为什么机器查不了」。
|
|
70
|
+
|
|
12
71
|
## [0.1.2] — 2026-11-11
|
|
13
72
|
|
|
14
73
|
**修三处「写的东西与实际行为不一致」,并把 README 收瘦。** 2026-08-18 → 2026-11-11。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-api.d.ts","sourceRoot":"","sources":["../../src/dsh-adapter/http-api.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,MAAM,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"http-api.d.ts","sourceRoot":"","sources":["../../src/dsh-adapter/http-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ import { redactString } from './pii-utils.js';
|
|
|
15
15
|
import { findRoute } from './http-api-routes.js';
|
|
16
16
|
import { HttpApiSessionsImpl } from './http-api-sessions.js';
|
|
17
17
|
import { cloudPool, loadEdgeConfig, localPool } from './edge-config.js';
|
|
18
|
+
import { resolveEffectiveLocalModelSync } from './effective-model.js';
|
|
18
19
|
/**
|
|
19
20
|
* Snapshot a live Session's event log, papering over the upstream API
|
|
20
21
|
* change: 0.1.2-alpha.x exposed `.events` directly, 0.1.2-rc.1 removed it
|
|
@@ -1719,6 +1720,41 @@ export class HttpApiServiceImpl extends Service {
|
|
|
1719
1720
|
];
|
|
1720
1721
|
}
|
|
1721
1722
|
}
|
|
1723
|
+
/**
|
|
1724
|
+
* §7.192(2026-11-12):这个池**这一轮真正会跑**的模型名。
|
|
1725
|
+
*
|
|
1726
|
+
* 池**配了** model(直连池)⇒ 就是它 —— §7.102 的老口径一个字不改。
|
|
1727
|
+
*
|
|
1728
|
+
* 池**没配** model(没配置文件 ⇒ DELEGATE,§7.171)⇒ **取 DSH 配置的模型**
|
|
1729
|
+
* —— 也就是宿主当前那个选择(桌面 GUI 的模型选择器)。
|
|
1730
|
+
*
|
|
1731
|
+
* 为什么必须这样:委托模式下 wire 上真正跑的就是宿主当前那个模型
|
|
1732
|
+
* (§7.171/§7.179 同一份解析链)⇒ 写死一个别的名字(老代码写的是
|
|
1733
|
+
* `qwen3-4b-instruct-2507`)等于**面板显示一件没发生过的事** —— 审计行
|
|
1734
|
+
* `http.chat.route` / `http.chat.stream.route` 与会话的 agent options 都会
|
|
1735
|
+
* 带着那个假名字。
|
|
1736
|
+
*
|
|
1737
|
+
* 解析链复用 `resolveEffectiveLocalModelSync`(§7.179/§7.180)——
|
|
1738
|
+
* 与 local-llm-adapter / prompt-guard / intent-router **同一份事实源**,
|
|
1739
|
+
* 这里不另写一套。解析链挂了(宿主没有可选模型 / 委托被关掉)⇒ 退回写死的
|
|
1740
|
+
* 兜底(不因此让整条请求失败)。
|
|
1741
|
+
*/
|
|
1742
|
+
function poolEffectiveModel(ctx, isLocal, pool) {
|
|
1743
|
+
const configured = (pool.model ?? '').trim();
|
|
1744
|
+
if (configured.length > 0)
|
|
1745
|
+
return configured;
|
|
1746
|
+
const fallback = isLocal ? 'qwen3-4b-instruct-2507' : 'deepseek-chat';
|
|
1747
|
+
try {
|
|
1748
|
+
const effective = resolveEffectiveLocalModelSync(ctx, pool, fallback, isLocal ? 'local-llm' : 'cloud-llm');
|
|
1749
|
+
const model = (effective?.model ?? '').trim();
|
|
1750
|
+
if (model.length > 0)
|
|
1751
|
+
return model;
|
|
1752
|
+
}
|
|
1753
|
+
catch {
|
|
1754
|
+
// 解析链抛错 ⇒ 退回写死的兜底(soft-dep 语义,不让整条请求失败)。
|
|
1755
|
+
}
|
|
1756
|
+
return fallback;
|
|
1757
|
+
}
|
|
1722
1758
|
/**
|
|
1723
1759
|
* Pure (exported for unit tests) route resolver. See the inline comment
|
|
1724
1760
|
* in HttpApiServiceImpl#resolveRoute for the soft-dep / fail-open contract.
|
|
@@ -1730,10 +1766,11 @@ export function resolveRoute(ctx, isLocal) {
|
|
|
1730
1766
|
// layer in edge-config.ts keeps DSH_EDGE_LOCAL_LLM_MODEL / DSH_EDGE_MODEL
|
|
1731
1767
|
// working, so the desktop GUI and the CLI profiles end up on the same
|
|
1732
1768
|
// model.
|
|
1769
|
+
//
|
|
1770
|
+
// §7.192:池没配 model 时不再写死一个名字,而是**取 DSH 配置的模型**
|
|
1771
|
+
//(见 `poolEffectiveModel`)。
|
|
1733
1772
|
const pools = loadEdgeConfig(true);
|
|
1734
|
-
const fallbackModel = isLocal
|
|
1735
|
-
? (localPool(pools).model ?? 'qwen3-4b-instruct-2507')
|
|
1736
|
-
: (cloudPool(pools).model ?? 'deepseek-chat');
|
|
1773
|
+
const fallbackModel = poolEffectiveModel(ctx, isLocal, isLocal ? localPool(pools) : cloudPool(pools));
|
|
1737
1774
|
const mr = typeof ctx?.get === 'function' ? (() => { try {
|
|
1738
1775
|
return ctx.get('modelRouter');
|
|
1739
1776
|
}
|
|
@@ -298,6 +298,12 @@ export declare class InputGuardServiceImpl extends Service {
|
|
|
298
298
|
* 重新派发会再进一次 waterfall ⇒ 那趟的 provider 已是本地池 ⇒ 天然不再改道
|
|
299
299
|
* (**防自锁**),且本地池按 §7.131 带**全部**历史(本地池不出网,不裁)。
|
|
300
300
|
*
|
|
301
|
+
* §7.191(2026-11-12)更正:上面那句「provider 已是本地池 ⇒ 天然不再改道」
|
|
302
|
+
* **只在直连池下成立**。DELEGATE 池(§7.171)会把请求转给宿主的目标路由
|
|
303
|
+
* ⇒ 回来那一趟的 provider 不是本地池 ⇒ 防自锁失效 ⇒ 无限乒乓 ⇒ OOM。
|
|
304
|
+
* ⇒ 防自锁现在有**两个**判据:provider 名(直连池)+ 转发标记
|
|
305
|
+
* (`LOCAL_POOL_FORWARD_MARKER`,DELEGATE 池)—— 见 `needsLocalReroute`。
|
|
306
|
+
*
|
|
301
307
|
* fail-closed:改不动(本地路由不存在 / 解析不到 model id / 宿主 LLM runtime
|
|
302
308
|
* 不可用)⇒ **抛错**,绝不放行到可能上云的 provider。
|
|
303
309
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-guard.d.ts","sourceRoot":"","sources":["../../src/dsh-adapter/input-guard.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"input-guard.d.ts","sourceRoot":"","sources":["../../src/dsh-adapter/input-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,7 +50,7 @@ import { HostCallRecorder, OWN_POOL_PROVIDERS, isOwnPoolProvider, } from './host
|
|
|
50
50
|
// 轮次走的是**宿主原生 provider**(桌面 GUI 选的模型),压根不进
|
|
51
51
|
// cloud-llm-adapter ⇒ adapter 里的 §7.131 裁剪一次都没跑过。守卫补在
|
|
52
52
|
// `llm/stream` waterfall 上 —— 真正的出网那一跳。
|
|
53
|
-
import { HostEgressGuard } from './host-egress-guard.js';
|
|
53
|
+
import { HostEgressGuard, isLocalPoolForward } from './host-egress-guard.js';
|
|
54
54
|
import { sessionIdField } from './session-attribution.js';
|
|
55
55
|
export const name = 'input-guard';
|
|
56
56
|
export const inject = [
|
|
@@ -245,11 +245,34 @@ export class InputGuardServiceImpl extends Service {
|
|
|
245
245
|
* 重新派发会再进一次 waterfall ⇒ 那趟的 provider 已是本地池 ⇒ 天然不再改道
|
|
246
246
|
* (**防自锁**),且本地池按 §7.131 带**全部**历史(本地池不出网,不裁)。
|
|
247
247
|
*
|
|
248
|
+
* §7.191(2026-11-12)更正:上面那句「provider 已是本地池 ⇒ 天然不再改道」
|
|
249
|
+
* **只在直连池下成立**。DELEGATE 池(§7.171)会把请求转给宿主的目标路由
|
|
250
|
+
* ⇒ 回来那一趟的 provider 不是本地池 ⇒ 防自锁失效 ⇒ 无限乒乓 ⇒ OOM。
|
|
251
|
+
* ⇒ 防自锁现在有**两个**判据:provider 名(直连池)+ 转发标记
|
|
252
|
+
* (`LOCAL_POOL_FORWARD_MARKER`,DELEGATE 池)—— 见 `needsLocalReroute`。
|
|
253
|
+
*
|
|
248
254
|
* fail-closed:改不动(本地路由不存在 / 解析不到 model id / 宿主 LLM runtime
|
|
249
255
|
* 不可用)⇒ **抛错**,绝不放行到可能上云的 provider。
|
|
250
256
|
*/
|
|
251
257
|
/** §7.184: 这一通请求要不要改道到本地池? */
|
|
252
258
|
needsLocalReroute(options, state) {
|
|
259
|
+
// §7.191(2026-11-12):**本地池自己的 DELEGATE 转发**不改道。
|
|
260
|
+
//
|
|
261
|
+
// 上面那句注释「重新派发回来的那趟 provider 已是本地池 ⇒ 天然不再改道
|
|
262
|
+
// (防自锁)」**只在直连池下成立**。DELEGATE 池(§7.171)会把请求转给
|
|
263
|
+
// **宿主的目标路由**(如 `qwen-token-plan-cn`)⇒ 回来那一趟的 provider
|
|
264
|
+
// 不是本地池 ⇒ 「provider !== localProvider」判据失效 ⇒ 改道 → 本地池 →
|
|
265
|
+
// 再委托 → 再改道 ⇒ **无限乒乓**。
|
|
266
|
+
//
|
|
267
|
+
// 实测(2026-11-12 桌面版):递归 123 万次,JS 堆 4GB 爆掉,整机
|
|
268
|
+
// OOM abort;意图分类器的 LLM 调用 5 次全挂(0/5),安检 5/6 挂。
|
|
269
|
+
//
|
|
270
|
+
// 判据用**转发标记**(`LOCAL_POOL_FORWARD_MARKER`)而不是 provider 名:
|
|
271
|
+
// 转发后 provider 是宿主的目标路由,与「用户直接选了那个模型」在
|
|
272
|
+
// provider 维度无法区分 —— 唯一的区别在发起方。裁剪路径
|
|
273
|
+
// (`hostEgressGuard.plan()`,§7.171)早就在用同一个标记。
|
|
274
|
+
if (isLocalPoolForward(options))
|
|
275
|
+
return false;
|
|
253
276
|
// 只对「本轮必须留在设备上」的轮次改道。CLOUD / SANITIZED 轮次按设计就是
|
|
254
277
|
// 要出网的(脱敏 + 只带云段历史),不改道。
|
|
255
278
|
if (this.turnCategory.get(state.sessionId) !== 'LOCAL')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intent-router.d.ts","sourceRoot":"","sources":["../../src/dsh-adapter/intent-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,MAAM,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"intent-router.d.ts","sourceRoot":"","sources":["../../src/dsh-adapter/intent-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ import { createUserMessage } from '@deepseek-ai/dsh-llm';
|
|
|
14
14
|
import { danglingSecretRefs, formatDanglingSecretRefs, jevPool, loadEdgeConfig, localPool, } from './edge-config.js';
|
|
15
15
|
import { resolveEffectiveLocalModel } from './effective-model.js';
|
|
16
16
|
import { withInternalCaller } from './llm-internal-caller.js';
|
|
17
|
+
import { raceWithDeadline } from './llm-drain-deadline.js';
|
|
17
18
|
import { buildRequestTrace, buildResponseTrace, emitTrace, resolveLlmTraceConfig, } from './llm-trace.js';
|
|
18
19
|
import { getTraceStore, nextCallId } from './llm-trace-store.js';
|
|
19
20
|
import { sessionIdField } from './session-attribution.js';
|
|
@@ -2037,42 +2038,47 @@ export class IntentRouterServiceImpl extends Service {
|
|
|
2037
2038
|
// the try so the post-loop throw isn't swallowed by our own catch.
|
|
2038
2039
|
let providerFailure;
|
|
2039
2040
|
try {
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
:
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2041
|
+
// §7.190:这次调用**自身**也带时限 —— 不只靠 abort 通知下游。
|
|
2042
|
+
// 下游不守规矩时(promise 永不 settle),光有 abort 会让
|
|
2043
|
+
// `for await` 永远挂着 ⇒ 整轮卡死(实测 2026-11-11 三次全同)。
|
|
2044
|
+
await raceWithDeadline(async () => {
|
|
2045
|
+
const streamRaw = this.llm.stream({
|
|
2046
|
+
provider,
|
|
2047
|
+
model,
|
|
2048
|
+
messages: [userMessage],
|
|
2049
|
+
signal: controller.signal,
|
|
2050
|
+
// §7.53 (2026-09-13): propagate sessionId for ops log correlation.
|
|
2051
|
+
// local-llm-adapter reads options.sessionId for its 'LLM call start'
|
|
2052
|
+
// line; realm-skill-bridge probe reads p.sessionId from the
|
|
2053
|
+
// llm/stream waterfall payload. Both go from <pre-session> to the
|
|
2054
|
+
// real sessionId when this is set.
|
|
2055
|
+
...(sessionId ? { sessionId } : {}),
|
|
2056
|
+
// §7.132: 标记这是**意图分类器内部调用**,不是主对话出网。
|
|
2057
|
+
...withInternalCaller({}, 'intent-classifier'),
|
|
2058
|
+
});
|
|
2059
|
+
// §7.37: this.llm.stream() returns Promise<AsyncIterable<StreamChunk>>
|
|
2060
|
+
// since dsh-llm 0.1.2-rc.1 — await if thenable, otherwise use directly.
|
|
2061
|
+
const stream = (streamRaw != null && typeof streamRaw.then === 'function')
|
|
2062
|
+
? await streamRaw
|
|
2063
|
+
: streamRaw;
|
|
2064
|
+
for await (const chunk of stream) {
|
|
2065
|
+
chunks++;
|
|
2066
|
+
if (chunk.type === 'text-delta') {
|
|
2067
|
+
responseText += chunk.text;
|
|
2068
|
+
}
|
|
2069
|
+
else if (chunk.type === 'finish') {
|
|
2070
|
+
// §7.100: adapter 侧错误(NO_ADAPTER / NO_CLOUD_TARGET / key 缺失…)
|
|
2071
|
+
// 被上游转成 terminal error finish chunk,不 throw。以前这里零
|
|
2072
|
+
// text-delta → 落到 'unclear' 分支,dashboard 把基础设施故障记成
|
|
2073
|
+
// "模型输出看不懂"。现在显式识别,归因 llm-error + provider_error。
|
|
2074
|
+
// (检测放 try 外抛出,避免本函数 catch 二次计数/重包裹。)
|
|
2075
|
+
const reason = chunk.reason;
|
|
2076
|
+
if (reason?.kind === 'error' || reason?.kind === 'aborted') {
|
|
2077
|
+
providerFailure = { code: reason.failure?.code, message: reason.failure?.message };
|
|
2078
|
+
}
|
|
2073
2079
|
}
|
|
2074
2080
|
}
|
|
2075
|
-
}
|
|
2081
|
+
}, this.llmTimeoutMs, controller);
|
|
2076
2082
|
}
|
|
2077
2083
|
catch (err) {
|
|
2078
2084
|
const isAbort = err?.name === 'AbortError' || controller.signal.aborted;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* llm-drain-deadline —— §7.190(2026-11-11):给「一次内部 LLM 调用」**自身**加时限。
|
|
3
|
+
*
|
|
4
|
+
* ## 为什么不能只靠 AbortController
|
|
5
|
+
*
|
|
6
|
+
* 现有的两处内部 LLM 调用(安检 `prompt-guard`、意图分类 `intent-router`)都是
|
|
7
|
+
* 这个形状:
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* const controller = new AbortController()
|
|
11
|
+
* const timer = setTimeout(() => controller.abort(), timeoutMs)
|
|
12
|
+
* const streamRaw = this.llm.stream({ ...opts, signal: controller.signal })
|
|
13
|
+
* const stream = await streamRaw // ← 阶段一:等 promise
|
|
14
|
+
* for await (const chunk of stream) { ... } // ← 阶段二:读流
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* `abort()` 只是**通知**下游取消。若下游那趟请求的 promise **永远不 settle**
|
|
18
|
+
* (既不产出 chunk、也不结束、也不抛错),两个阶段都会**永远挂着** ——
|
|
19
|
+
* abort 触发了也没用,因为没有任何东西被唤醒。
|
|
20
|
+
*
|
|
21
|
+
* **实测(2026-11-11 桌面版,22:31:58 / 22:37:45 / 22:39:45 三次全同)**:
|
|
22
|
+
* 无活配置 ⇒ 本地池走 DELEGATE(转发宿主 provider)⇒ 意图分类那一跳挂在
|
|
23
|
+
* provider 那一侧。证据链:
|
|
24
|
+
*
|
|
25
|
+
* - 60 秒时限到了:宿主的活动资源里 `Timeout` 计数归零(定时器已触发并消失);
|
|
26
|
+
* - 但审计链里**没有** `intent.llm.timeout`(说明 abort 没让循环退出,
|
|
27
|
+
* catch 分支根本没进);
|
|
28
|
+
* - 也没有 `intent.classify.end`;
|
|
29
|
+
* - 宿主进程里**没有一条到 provider 的外连 socket**(只有 Electron 的回环 IPC)
|
|
30
|
+
* ⇒ 请求压根没走到网络层。
|
|
31
|
+
*
|
|
32
|
+
* ⇒ 整轮卡在「意图判定」,面板如实显示:攻击检测进行中 / 意图判定等待 /
|
|
33
|
+
* 路由未定 / LLM 调用 0。
|
|
34
|
+
*
|
|
35
|
+
* ## 这里做什么
|
|
36
|
+
*
|
|
37
|
+
* 让「这次调用」和「时限」**赛跑**:时限先到 ⇒ 我们自己 abort 掉 controller 并抛
|
|
38
|
+
* 一个 `name === 'AbortError'` 的错误。上层的超时分支照常记 `*.timeout` 并
|
|
39
|
+
* fail-open(安检放行、意图分类退回规则层)⇒ **阶段不再能永久卡死整轮**。
|
|
40
|
+
*
|
|
41
|
+
* 这不替代 abort —— abort 仍然照常发给下游(下游守规矩时,它自己会更快地
|
|
42
|
+
* 抛错/结束)。这里只是**兜底**:下游不守规矩时,由我们收口。
|
|
43
|
+
*/
|
|
44
|
+
/**
|
|
45
|
+
* 在给定时限内跑完 `work`;时限到了就自己收口。
|
|
46
|
+
*
|
|
47
|
+
* 时限到了:先 `controller.abort()`(通知下游收尾),再抛一个 `AbortError`
|
|
48
|
+
* —— 与下游自己因 abort 抛出的错误**同形**,上层的 `isAbort` 判定照常成立。
|
|
49
|
+
*
|
|
50
|
+
* @param work 这次调用要做的事(拿流 + 读完流)
|
|
51
|
+
* @param timeoutMs 时限(毫秒);<= 0 或非有限数表示不限时
|
|
52
|
+
* @param controller 用来通知下游取消的 controller
|
|
53
|
+
*/
|
|
54
|
+
export declare function raceWithDeadline<T>(work: () => Promise<T>, timeoutMs: number, controller: AbortController): Promise<T>;
|
|
55
|
+
//# sourceMappingURL=llm-drain-deadline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-drain-deadline.d.ts","sourceRoot":"","sources":["../../src/dsh-adapter/llm-drain-deadline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACtB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,eAAe,GAC1B,OAAO,CAAC,CAAC,CAAC,CAqBZ"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* llm-drain-deadline —— §7.190(2026-11-11):给「一次内部 LLM 调用」**自身**加时限。
|
|
3
|
+
*
|
|
4
|
+
* ## 为什么不能只靠 AbortController
|
|
5
|
+
*
|
|
6
|
+
* 现有的两处内部 LLM 调用(安检 `prompt-guard`、意图分类 `intent-router`)都是
|
|
7
|
+
* 这个形状:
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* const controller = new AbortController()
|
|
11
|
+
* const timer = setTimeout(() => controller.abort(), timeoutMs)
|
|
12
|
+
* const streamRaw = this.llm.stream({ ...opts, signal: controller.signal })
|
|
13
|
+
* const stream = await streamRaw // ← 阶段一:等 promise
|
|
14
|
+
* for await (const chunk of stream) { ... } // ← 阶段二:读流
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* `abort()` 只是**通知**下游取消。若下游那趟请求的 promise **永远不 settle**
|
|
18
|
+
* (既不产出 chunk、也不结束、也不抛错),两个阶段都会**永远挂着** ——
|
|
19
|
+
* abort 触发了也没用,因为没有任何东西被唤醒。
|
|
20
|
+
*
|
|
21
|
+
* **实测(2026-11-11 桌面版,22:31:58 / 22:37:45 / 22:39:45 三次全同)**:
|
|
22
|
+
* 无活配置 ⇒ 本地池走 DELEGATE(转发宿主 provider)⇒ 意图分类那一跳挂在
|
|
23
|
+
* provider 那一侧。证据链:
|
|
24
|
+
*
|
|
25
|
+
* - 60 秒时限到了:宿主的活动资源里 `Timeout` 计数归零(定时器已触发并消失);
|
|
26
|
+
* - 但审计链里**没有** `intent.llm.timeout`(说明 abort 没让循环退出,
|
|
27
|
+
* catch 分支根本没进);
|
|
28
|
+
* - 也没有 `intent.classify.end`;
|
|
29
|
+
* - 宿主进程里**没有一条到 provider 的外连 socket**(只有 Electron 的回环 IPC)
|
|
30
|
+
* ⇒ 请求压根没走到网络层。
|
|
31
|
+
*
|
|
32
|
+
* ⇒ 整轮卡在「意图判定」,面板如实显示:攻击检测进行中 / 意图判定等待 /
|
|
33
|
+
* 路由未定 / LLM 调用 0。
|
|
34
|
+
*
|
|
35
|
+
* ## 这里做什么
|
|
36
|
+
*
|
|
37
|
+
* 让「这次调用」和「时限」**赛跑**:时限先到 ⇒ 我们自己 abort 掉 controller 并抛
|
|
38
|
+
* 一个 `name === 'AbortError'` 的错误。上层的超时分支照常记 `*.timeout` 并
|
|
39
|
+
* fail-open(安检放行、意图分类退回规则层)⇒ **阶段不再能永久卡死整轮**。
|
|
40
|
+
*
|
|
41
|
+
* 这不替代 abort —— abort 仍然照常发给下游(下游守规矩时,它自己会更快地
|
|
42
|
+
* 抛错/结束)。这里只是**兜底**:下游不守规矩时,由我们收口。
|
|
43
|
+
*/
|
|
44
|
+
/**
|
|
45
|
+
* 在给定时限内跑完 `work`;时限到了就自己收口。
|
|
46
|
+
*
|
|
47
|
+
* 时限到了:先 `controller.abort()`(通知下游收尾),再抛一个 `AbortError`
|
|
48
|
+
* —— 与下游自己因 abort 抛出的错误**同形**,上层的 `isAbort` 判定照常成立。
|
|
49
|
+
*
|
|
50
|
+
* @param work 这次调用要做的事(拿流 + 读完流)
|
|
51
|
+
* @param timeoutMs 时限(毫秒);<= 0 或非有限数表示不限时
|
|
52
|
+
* @param controller 用来通知下游取消的 controller
|
|
53
|
+
*/
|
|
54
|
+
export async function raceWithDeadline(work, timeoutMs, controller) {
|
|
55
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0)
|
|
56
|
+
return await work();
|
|
57
|
+
let timer;
|
|
58
|
+
const deadline = new Promise((_resolve, reject) => {
|
|
59
|
+
timer = setTimeout(() => {
|
|
60
|
+
// 先通知下游收尾(下游守规矩时它自己会结束;不守规矩时我们照样收口)。
|
|
61
|
+
try {
|
|
62
|
+
controller.abort();
|
|
63
|
+
}
|
|
64
|
+
catch { /* 通知失败不影响收口 */ }
|
|
65
|
+
const err = new Error(`llm call did not settle within ${timeoutMs}ms`);
|
|
66
|
+
err.name = 'AbortError';
|
|
67
|
+
reject(err);
|
|
68
|
+
}, timeoutMs);
|
|
69
|
+
});
|
|
70
|
+
try {
|
|
71
|
+
return await Promise.race([work(), deadline]);
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
if (timer !== undefined)
|
|
75
|
+
clearTimeout(timer);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-guard.d.ts","sourceRoot":"","sources":["../../src/dsh-adapter/prompt-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAE7C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"prompt-guard.d.ts","sourceRoot":"","sources":["../../src/dsh-adapter/prompt-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,7 @@ import { resolveEffectiveLocalModel } from './effective-model.js';
|
|
|
24
24
|
// two layers can never disagree about what counts as a device operation.
|
|
25
25
|
import { matchDeviceCommand, isPureDeviceCommand } from './intent-signals.js';
|
|
26
26
|
import { withInternalCaller } from './llm-internal-caller.js';
|
|
27
|
+
import { raceWithDeadline } from './llm-drain-deadline.js';
|
|
27
28
|
export const name = 'prompt-guard';
|
|
28
29
|
export const inject = ['privacyPolicy', 'auditLog', 'llm'];
|
|
29
30
|
export const Config = Schema.object({
|
|
@@ -581,41 +582,46 @@ export class PromptGuardServiceImpl extends Service {
|
|
|
581
582
|
// 被上游转成 terminal finish)。声明在 try 外,检测在 try 后处理。
|
|
582
583
|
let providerFailure;
|
|
583
584
|
try {
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
:
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
585
|
+
// §7.190:这次调用**自身**也带时限 —— 不只靠 abort 通知下游。
|
|
586
|
+
// 下游不守规矩时(promise 永不 settle),光有 abort 会让
|
|
587
|
+
// `for await` 永远挂着 ⇒ 整轮卡死(实测 2026-11-11 三次全同)。
|
|
588
|
+
await raceWithDeadline(async () => {
|
|
589
|
+
const streamRaw = this.llm.stream({
|
|
590
|
+
provider: cfg.modelDetectionProvider,
|
|
591
|
+
model: detectModel,
|
|
592
|
+
messages: [userMessage],
|
|
593
|
+
system: systemPrompt,
|
|
594
|
+
signal: controller.signal,
|
|
595
|
+
temperature: 0,
|
|
596
|
+
maxTokens: 256,
|
|
597
|
+
// §7.53 (2026-09-13): propagate sessionId for ops log correlation.
|
|
598
|
+
// local-llm-adapter reads options.sessionId for its 'LLM call start'
|
|
599
|
+
// line; realm-skill-bridge probe reads p.sessionId from the
|
|
600
|
+
// llm/stream waterfall payload. Both go from <pre-session> to the
|
|
601
|
+
// real sessionId when this is set.
|
|
602
|
+
...(sessionId ? { sessionId } : {}),
|
|
603
|
+
// §7.132: 标记这是**安检内部调用**,不是主对话出网。adapter 会把它
|
|
604
|
+
// 落到出口审计行的 `internal` 字段,面板据此把「答案出口」与它分开。
|
|
605
|
+
...withInternalCaller({}, 'prompt-guard'),
|
|
606
|
+
});
|
|
607
|
+
// §7.37: this.llm.stream() returns Promise<AsyncIterable<StreamChunk>>
|
|
608
|
+
// since dsh-llm 0.1.2-rc.1 — await if thenable, otherwise use directly.
|
|
609
|
+
const stream = (streamRaw != null && typeof streamRaw.then === 'function')
|
|
610
|
+
? await streamRaw
|
|
611
|
+
: streamRaw;
|
|
612
|
+
for await (const chunk of stream) {
|
|
613
|
+
chunks++;
|
|
614
|
+
if (chunk.type === 'text-delta' && responseText.length < MAX_ASSEMBLED) {
|
|
615
|
+
responseText += chunk.text;
|
|
616
|
+
}
|
|
617
|
+
else if (chunk.type === 'finish') {
|
|
618
|
+
const reason = chunk.reason;
|
|
619
|
+
if (reason?.kind === 'error' || reason?.kind === 'aborted') {
|
|
620
|
+
providerFailure = reason.failure;
|
|
621
|
+
}
|
|
616
622
|
}
|
|
617
623
|
}
|
|
618
|
-
}
|
|
624
|
+
}, cfg.modelDetectionTimeoutMs, controller);
|
|
619
625
|
}
|
|
620
626
|
catch (err) {
|
|
621
627
|
const isAbort = err?.name === 'AbortError' || controller.signal.aborted;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-search-tavily-bocha.d.ts","sourceRoot":"","sources":["../../src/dsh-adapter/web-search-tavily-bocha.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAAY,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACpH,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAA;AAC7E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAW7C,6EAA6E;AAC7E,eAAO,MAAM,wBAAwB,0BAA0B,CAAA;AAE/D;;GAEG;AACH,eAAO,MAAM,IAAI,4BAA4B,CAAA;AAE7C,4EAA4E;AAC5E,eAAO,MAAM,MAAM,UAAU,CAAA;AAE7B;;;;;;GAMG;AACH,MAAM,WAAW,MAAM;IACrB,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,CAEhC,CAAA;AAEF;;;GAGG;AACH,qBAAa,2BAA4B,YAAW,iBAAiB;IAIjE,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAQ,CAAC,KAAK;IAjBxB,QAAQ,CAAC,EAAE,2BAA2B;gBAGnB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,QAAQ,EAAE,sBAAsB;IACjD;;;;;;;;;OASG;IACc,KAAK,GAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO;IAGlF,OAAO,KAAK,aAAa,GAGxB;IAED,OAAO,KAAK,YAAY,GAGvB;IAED;;;;;;;;;;;;;;OAcG;IACH,SAAS,IAAI,OAAO;IAId,MAAM,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;YA+CzE,YAAY;YAwCZ,WAAW;CA8D1B;AAGD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"web-search-tavily-bocha.d.ts","sourceRoot":"","sources":["../../src/dsh-adapter/web-search-tavily-bocha.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAAY,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACpH,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAA;AAC7E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAW7C,6EAA6E;AAC7E,eAAO,MAAM,wBAAwB,0BAA0B,CAAA;AAE/D;;GAEG;AACH,eAAO,MAAM,IAAI,4BAA4B,CAAA;AAE7C,4EAA4E;AAC5E,eAAO,MAAM,MAAM,UAAU,CAAA;AAE7B;;;;;;GAMG;AACH,MAAM,WAAW,MAAM;IACrB,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,CAEhC,CAAA;AAEF;;;GAGG;AACH,qBAAa,2BAA4B,YAAW,iBAAiB;IAIjE,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAQ,CAAC,KAAK;IAjBxB,QAAQ,CAAC,EAAE,2BAA2B;gBAGnB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,QAAQ,EAAE,sBAAsB;IACjD;;;;;;;;;OASG;IACc,KAAK,GAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO;IAGlF,OAAO,KAAK,aAAa,GAGxB;IAED,OAAO,KAAK,YAAY,GAGvB;IAED;;;;;;;;;;;;;;OAcG;IACH,SAAS,IAAI,OAAO;IAId,MAAM,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;YA+CzE,YAAY;YAwCZ,WAAW;CA8D1B;AAGD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyFxE;;;;;;AAED,wBAAsC"}
|
|
@@ -284,6 +284,56 @@ export async function apply(ctx, _config) {
|
|
|
284
284
|
// The `web` seam is registered by `@deepseek-ai/dsh-tool-web` upstream;
|
|
285
285
|
// it's not part of the stock `Context` interface, so cast narrowly.
|
|
286
286
|
const webCtx = ctx;
|
|
287
|
-
|
|
287
|
+
try {
|
|
288
|
+
webCtx.web.registerSearchProvider(provider);
|
|
289
|
+
}
|
|
290
|
+
catch (err) {
|
|
291
|
+
// §7.189 (2026-11-11): 同一个 id 被占用,**不该**拖垮整条 preset。
|
|
292
|
+
//
|
|
293
|
+
// 实测(桌面 App 日志 2026-11-11 21:52:38.886):
|
|
294
|
+
// ERROR [web-search-tavily-bocha] WebError: a web provider with id
|
|
295
|
+
// "tavily-bocha-fallback" is already registered
|
|
296
|
+
// 作用域链:#web-search-tavily-bocha → #edge-stack →
|
|
297
|
+
// #agent-preset-registry → #include
|
|
298
|
+
//
|
|
299
|
+
// 这一行失败 ⇒ 宿主 dsh-agent-preset-registry 的 mountPreset() 直接
|
|
300
|
+
// throw(audit.failed 非空 ⇒ 整条 preset 挂载失败)⇒「边缘模式」这个
|
|
301
|
+
// 工作方式从设置页消失 ⇒ 主人看到的症状是「部署了 npm 包,模式里却
|
|
302
|
+
// 没有边缘模式」(2026-11-11 实测)。
|
|
303
|
+
//
|
|
304
|
+
// 触发场景是**热装切换**:桌面端插件管理器把旧副本换成本 npm 包时,
|
|
305
|
+
// 旧实例还没卸载,新实例已经挂上 ⇒ 同一个 id 注册两次。
|
|
306
|
+
//
|
|
307
|
+
// 对策:与 local-llm-adapter / cloud-llm-adapter 同一范式 ——
|
|
308
|
+
// 重复注册时**让位**(不抛),因为 id 是本插件的常量,注册表里已有的那
|
|
309
|
+
// 一个与我们等价(同样的 provider 类、同样的 key 来源)。
|
|
310
|
+
//
|
|
311
|
+
// 判定走 `err.code`:宿主 HarnessError 自带 code 字段,且宿主源码明确
|
|
312
|
+
// 写着「route on this, never by parsing message」(dsh-llm HarnessError)。
|
|
313
|
+
if (err?.code !== 'WEB_DUPLICATE_PROVIDER')
|
|
314
|
+
throw err;
|
|
315
|
+
ctx.logger?.error?.(`[web-search-tavily-bocha] provider id "${TAVILY_BOCHA_PROVIDER_ID}" 已被注册 `
|
|
316
|
+
+ '(本插件的另一个实例 —— 多半是桌面端热装切换时旧副本尚未卸载);'
|
|
317
|
+
+ '本实例让位,不重复注册。');
|
|
318
|
+
// 让位是「发生了一件事」⇒ 必须留痕,不能静悄悄。
|
|
319
|
+
// auditLog 走**延迟注入**(ctx.get),不写进 inject 数组:inject 是
|
|
320
|
+
// cordis 的硬依赖,声明它等于要求 cordis 等到 auditLog 就绪才起我们
|
|
321
|
+
// 这一行(§7.175/§7.176 的教训:闸门不该因服务次序而缺席)。
|
|
322
|
+
try {
|
|
323
|
+
const auditLog = ctx.get?.('auditLog');
|
|
324
|
+
void auditLog?.log?.({
|
|
325
|
+
level: 'warn',
|
|
326
|
+
kind: 'web.search.registration.duplicate',
|
|
327
|
+
source: 'web-search-tavily-bocha',
|
|
328
|
+
payload: {
|
|
329
|
+
providerId: TAVILY_BOCHA_PROVIDER_ID,
|
|
330
|
+
error: String(err?.message ?? err),
|
|
331
|
+
},
|
|
332
|
+
})?.catch?.(() => { });
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
// 审计不可用也不影响让位 —— 但日志那一行已经记过,不算静悄悄。
|
|
336
|
+
}
|
|
337
|
+
}
|
|
288
338
|
}
|
|
289
339
|
export default { name, inject, apply };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dsh-edge/dsh-edge-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Edge-side private agent built on DSH Cordis plugin mechanism: TEE-secured, OHTTP-encrypted, multi-LLM-routed, zero-core-modification.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -222,7 +222,10 @@
|
|
|
222
222
|
"cordis.yml",
|
|
223
223
|
"presets",
|
|
224
224
|
"CHANGELOG.md",
|
|
225
|
-
"!config/edge.json"
|
|
225
|
+
"!config/edge.json",
|
|
226
|
+
"!config/edge.json.*",
|
|
227
|
+
"!config/*.bak*",
|
|
228
|
+
"!config/.DS_Store"
|
|
226
229
|
],
|
|
227
230
|
"engines": {
|
|
228
231
|
"node": "^22.19 || >=24",
|