@dsh-edge/dsh-edge-agent 0.0.0-stage → 0.1.2

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.
Files changed (238) hide show
  1. package/CHANGELOG.md +158 -0
  2. package/LICENSE +21 -0
  3. package/README.md +181 -2
  4. package/config/edge.example.json +179 -0
  5. package/config/privacy-policy.json +202 -0
  6. package/cordis.desktop-safe.patch.yml +129 -0
  7. package/cordis.patch.yml +382 -0
  8. package/cordis.yml +374 -0
  9. package/lib/attestation.d.ts +2 -0
  10. package/lib/attestation.d.ts.map +1 -0
  11. package/lib/attestation.js +2 -0
  12. package/lib/audit-log.d.ts +2 -0
  13. package/lib/audit-log.d.ts.map +1 -0
  14. package/lib/audit-log.js +2 -0
  15. package/lib/client.js +87 -0
  16. package/lib/cloud-llm-adapter.d.ts +2 -0
  17. package/lib/cloud-llm-adapter.d.ts.map +1 -0
  18. package/lib/cloud-llm-adapter.js +2 -0
  19. package/lib/dsh-adapter/attestation.d.ts +42 -0
  20. package/lib/dsh-adapter/attestation.d.ts.map +1 -0
  21. package/lib/dsh-adapter/attestation.js +40 -0
  22. package/lib/dsh-adapter/audit-log.d.ts +139 -0
  23. package/lib/dsh-adapter/audit-log.d.ts.map +1 -0
  24. package/lib/dsh-adapter/audit-log.js +376 -0
  25. package/lib/dsh-adapter/cloud-egress.d.ts +181 -0
  26. package/lib/dsh-adapter/cloud-egress.d.ts.map +1 -0
  27. package/lib/dsh-adapter/cloud-egress.js +257 -0
  28. package/lib/dsh-adapter/cloud-llm-adapter.d.ts +416 -0
  29. package/lib/dsh-adapter/cloud-llm-adapter.d.ts.map +1 -0
  30. package/lib/dsh-adapter/cloud-llm-adapter.js +1472 -0
  31. package/lib/dsh-adapter/contract.d.ts +80 -0
  32. package/lib/dsh-adapter/contract.d.ts.map +1 -0
  33. package/lib/dsh-adapter/contract.js +194 -0
  34. package/lib/dsh-adapter/desktop-cookie-janitor.d.ts +214 -0
  35. package/lib/dsh-adapter/desktop-cookie-janitor.d.ts.map +1 -0
  36. package/lib/dsh-adapter/desktop-cookie-janitor.js +409 -0
  37. package/lib/dsh-adapter/dsh-edge-agent.d.ts +48 -0
  38. package/lib/dsh-adapter/dsh-edge-agent.d.ts.map +1 -0
  39. package/lib/dsh-adapter/dsh-edge-agent.js +64 -0
  40. package/lib/dsh-adapter/edge-config.d.ts +484 -0
  41. package/lib/dsh-adapter/edge-config.d.ts.map +1 -0
  42. package/lib/dsh-adapter/edge-config.js +898 -0
  43. package/lib/dsh-adapter/edge-context-view.d.ts +184 -0
  44. package/lib/dsh-adapter/edge-context-view.d.ts.map +1 -0
  45. package/lib/dsh-adapter/edge-context-view.js +483 -0
  46. package/lib/dsh-adapter/effective-model.d.ts +85 -0
  47. package/lib/dsh-adapter/effective-model.d.ts.map +1 -0
  48. package/lib/dsh-adapter/effective-model.js +171 -0
  49. package/lib/dsh-adapter/etscli-shell-guard.d.ts +244 -0
  50. package/lib/dsh-adapter/etscli-shell-guard.d.ts.map +1 -0
  51. package/lib/dsh-adapter/etscli-shell-guard.js +420 -0
  52. package/lib/dsh-adapter/etscli-tools.d.ts +112 -0
  53. package/lib/dsh-adapter/etscli-tools.d.ts.map +1 -0
  54. package/lib/dsh-adapter/etscli-tools.js +393 -0
  55. package/lib/dsh-adapter/file-logger.d.ts +294 -0
  56. package/lib/dsh-adapter/file-logger.d.ts.map +1 -0
  57. package/lib/dsh-adapter/file-logger.js +564 -0
  58. package/lib/dsh-adapter/function-call-external.d.ts +357 -0
  59. package/lib/dsh-adapter/function-call-external.d.ts.map +1 -0
  60. package/lib/dsh-adapter/function-call-external.js +1005 -0
  61. package/lib/dsh-adapter/host-egress-guard.d.ts +161 -0
  62. package/lib/dsh-adapter/host-egress-guard.d.ts.map +1 -0
  63. package/lib/dsh-adapter/host-egress-guard.js +213 -0
  64. package/lib/dsh-adapter/host-llm-trace.d.ts +198 -0
  65. package/lib/dsh-adapter/host-llm-trace.d.ts.map +1 -0
  66. package/lib/dsh-adapter/host-llm-trace.js +344 -0
  67. package/lib/dsh-adapter/http-api-routes.d.ts +61 -0
  68. package/lib/dsh-adapter/http-api-routes.d.ts.map +1 -0
  69. package/lib/dsh-adapter/http-api-routes.js +79 -0
  70. package/lib/dsh-adapter/http-api-sessions.d.ts +105 -0
  71. package/lib/dsh-adapter/http-api-sessions.d.ts.map +1 -0
  72. package/lib/dsh-adapter/http-api-sessions.js +173 -0
  73. package/lib/dsh-adapter/http-api.d.ts +221 -0
  74. package/lib/dsh-adapter/http-api.d.ts.map +1 -0
  75. package/lib/dsh-adapter/http-api.js +1811 -0
  76. package/lib/dsh-adapter/index.d.ts +62 -0
  77. package/lib/dsh-adapter/index.d.ts.map +1 -0
  78. package/lib/dsh-adapter/index.js +97 -0
  79. package/lib/dsh-adapter/input-guard-messages.d.ts +56 -0
  80. package/lib/dsh-adapter/input-guard-messages.d.ts.map +1 -0
  81. package/lib/dsh-adapter/input-guard-messages.js +136 -0
  82. package/lib/dsh-adapter/input-guard.d.ts +508 -0
  83. package/lib/dsh-adapter/input-guard.d.ts.map +1 -0
  84. package/lib/dsh-adapter/input-guard.js +2174 -0
  85. package/lib/dsh-adapter/intent-prompts.d.ts +77 -0
  86. package/lib/dsh-adapter/intent-prompts.d.ts.map +1 -0
  87. package/lib/dsh-adapter/intent-prompts.js +97 -0
  88. package/lib/dsh-adapter/intent-router.d.ts +710 -0
  89. package/lib/dsh-adapter/intent-router.d.ts.map +1 -0
  90. package/lib/dsh-adapter/intent-router.js +2802 -0
  91. package/lib/dsh-adapter/intent-signals.d.ts +208 -0
  92. package/lib/dsh-adapter/intent-signals.d.ts.map +1 -0
  93. package/lib/dsh-adapter/intent-signals.js +391 -0
  94. package/lib/dsh-adapter/invariant-install.d.ts +16 -0
  95. package/lib/dsh-adapter/invariant-install.d.ts.map +1 -0
  96. package/lib/dsh-adapter/invariant-install.js +15 -0
  97. package/lib/dsh-adapter/invariant.d.ts +16 -0
  98. package/lib/dsh-adapter/invariant.d.ts.map +1 -0
  99. package/lib/dsh-adapter/invariant.js +22 -0
  100. package/lib/dsh-adapter/llm-adapters.d.ts +19 -0
  101. package/lib/dsh-adapter/llm-adapters.d.ts.map +1 -0
  102. package/lib/dsh-adapter/llm-adapters.js +16 -0
  103. package/lib/dsh-adapter/llm-internal-caller.d.ts +92 -0
  104. package/lib/dsh-adapter/llm-internal-caller.d.ts.map +1 -0
  105. package/lib/dsh-adapter/llm-internal-caller.js +100 -0
  106. package/lib/dsh-adapter/llm-max-turns.d.ts +55 -0
  107. package/lib/dsh-adapter/llm-max-turns.d.ts.map +1 -0
  108. package/lib/dsh-adapter/llm-max-turns.js +127 -0
  109. package/lib/dsh-adapter/llm-trace-store.d.ts +131 -0
  110. package/lib/dsh-adapter/llm-trace-store.d.ts.map +1 -0
  111. package/lib/dsh-adapter/llm-trace-store.js +205 -0
  112. package/lib/dsh-adapter/llm-trace.d.ts +450 -0
  113. package/lib/dsh-adapter/llm-trace.d.ts.map +1 -0
  114. package/lib/dsh-adapter/llm-trace.js +463 -0
  115. package/lib/dsh-adapter/local-llm-adapter.d.ts +141 -0
  116. package/lib/dsh-adapter/local-llm-adapter.d.ts.map +1 -0
  117. package/lib/dsh-adapter/local-llm-adapter.js +787 -0
  118. package/lib/dsh-adapter/local-storage.d.ts +96 -0
  119. package/lib/dsh-adapter/local-storage.d.ts.map +1 -0
  120. package/lib/dsh-adapter/local-storage.js +198 -0
  121. package/lib/dsh-adapter/model-router.d.ts +79 -0
  122. package/lib/dsh-adapter/model-router.d.ts.map +1 -0
  123. package/lib/dsh-adapter/model-router.js +107 -0
  124. package/lib/dsh-adapter/ohttp-gateway.d.ts +49 -0
  125. package/lib/dsh-adapter/ohttp-gateway.d.ts.map +1 -0
  126. package/lib/dsh-adapter/ohttp-gateway.js +32 -0
  127. package/lib/dsh-adapter/openai-sse.d.ts +85 -0
  128. package/lib/dsh-adapter/openai-sse.d.ts.map +1 -0
  129. package/lib/dsh-adapter/openai-sse.js +462 -0
  130. package/lib/dsh-adapter/pii-utils.d.ts +96 -0
  131. package/lib/dsh-adapter/pii-utils.d.ts.map +1 -0
  132. package/lib/dsh-adapter/pii-utils.js +324 -0
  133. package/lib/dsh-adapter/plugin-host.d.ts +38 -0
  134. package/lib/dsh-adapter/plugin-host.d.ts.map +1 -0
  135. package/lib/dsh-adapter/plugin-host.js +38 -0
  136. package/lib/dsh-adapter/plugin.d.ts +46 -0
  137. package/lib/dsh-adapter/plugin.d.ts.map +1 -0
  138. package/lib/dsh-adapter/plugin.js +100 -0
  139. package/lib/dsh-adapter/privacy-policy.d.ts +237 -0
  140. package/lib/dsh-adapter/privacy-policy.d.ts.map +1 -0
  141. package/lib/dsh-adapter/privacy-policy.js +391 -0
  142. package/lib/dsh-adapter/prompt-guard.d.ts +152 -0
  143. package/lib/dsh-adapter/prompt-guard.d.ts.map +1 -0
  144. package/lib/dsh-adapter/prompt-guard.js +872 -0
  145. package/lib/dsh-adapter/realm-skill-bridge.d.ts +365 -0
  146. package/lib/dsh-adapter/realm-skill-bridge.d.ts.map +1 -0
  147. package/lib/dsh-adapter/realm-skill-bridge.js +1180 -0
  148. package/lib/dsh-adapter/sanitizer-pipeline.d.ts +140 -0
  149. package/lib/dsh-adapter/sanitizer-pipeline.d.ts.map +1 -0
  150. package/lib/dsh-adapter/sanitizer-pipeline.js +431 -0
  151. package/lib/dsh-adapter/secure-bridge.d.ts +47 -0
  152. package/lib/dsh-adapter/secure-bridge.d.ts.map +1 -0
  153. package/lib/dsh-adapter/secure-bridge.js +35 -0
  154. package/lib/dsh-adapter/session-attribution.d.ts +70 -0
  155. package/lib/dsh-adapter/session-attribution.d.ts.map +1 -0
  156. package/lib/dsh-adapter/session-attribution.js +76 -0
  157. package/lib/dsh-adapter/sessions.d.ts +86 -0
  158. package/lib/dsh-adapter/sessions.d.ts.map +1 -0
  159. package/lib/dsh-adapter/sessions.js +179 -0
  160. package/lib/dsh-adapter/tcm.d.ts +55 -0
  161. package/lib/dsh-adapter/tcm.d.ts.map +1 -0
  162. package/lib/dsh-adapter/tcm.js +94 -0
  163. package/lib/dsh-adapter/td-bus.d.ts +87 -0
  164. package/lib/dsh-adapter/td-bus.d.ts.map +1 -0
  165. package/lib/dsh-adapter/td-bus.js +196 -0
  166. package/lib/dsh-adapter/tool-runner.d.ts +185 -0
  167. package/lib/dsh-adapter/tool-runner.d.ts.map +1 -0
  168. package/lib/dsh-adapter/tool-runner.js +271 -0
  169. package/lib/dsh-adapter/tools.d.ts +118 -0
  170. package/lib/dsh-adapter/tools.d.ts.map +1 -0
  171. package/lib/dsh-adapter/tools.js +292 -0
  172. package/lib/dsh-adapter/types.d.ts +23 -0
  173. package/lib/dsh-adapter/types.d.ts.map +1 -0
  174. package/lib/dsh-adapter/types.js +16 -0
  175. package/lib/dsh-adapter/voice-input.d.ts +30 -0
  176. package/lib/dsh-adapter/voice-input.d.ts.map +1 -0
  177. package/lib/dsh-adapter/voice-input.js +34 -0
  178. package/lib/dsh-adapter/web-search-tavily-bocha.d.ts +152 -0
  179. package/lib/dsh-adapter/web-search-tavily-bocha.d.ts.map +1 -0
  180. package/lib/dsh-adapter/web-search-tavily-bocha.js +289 -0
  181. package/lib/http-api.d.ts +2 -0
  182. package/lib/http-api.d.ts.map +1 -0
  183. package/lib/http-api.js +2 -0
  184. package/lib/index.d.ts +48 -0
  185. package/lib/index.d.ts.map +1 -0
  186. package/lib/index.js +49 -0
  187. package/lib/intent-router.d.ts +2 -0
  188. package/lib/intent-router.d.ts.map +1 -0
  189. package/lib/intent-router.js +2 -0
  190. package/lib/llm-adapters.d.ts +2 -0
  191. package/lib/llm-adapters.d.ts.map +1 -0
  192. package/lib/llm-adapters.js +2 -0
  193. package/lib/local-llm-adapter.d.ts +2 -0
  194. package/lib/local-llm-adapter.d.ts.map +1 -0
  195. package/lib/local-llm-adapter.js +2 -0
  196. package/lib/local-storage.d.ts +2 -0
  197. package/lib/local-storage.d.ts.map +1 -0
  198. package/lib/local-storage.js +2 -0
  199. package/lib/model-router.d.ts +2 -0
  200. package/lib/model-router.d.ts.map +1 -0
  201. package/lib/model-router.js +2 -0
  202. package/lib/ohttp-gateway.d.ts +2 -0
  203. package/lib/ohttp-gateway.d.ts.map +1 -0
  204. package/lib/ohttp-gateway.js +2 -0
  205. package/lib/plugin-host.d.ts +2 -0
  206. package/lib/plugin-host.d.ts.map +1 -0
  207. package/lib/plugin-host.js +2 -0
  208. package/lib/privacy-policy.d.ts +2 -0
  209. package/lib/privacy-policy.d.ts.map +1 -0
  210. package/lib/privacy-policy.js +2 -0
  211. package/lib/prompt-guard.d.ts +2 -0
  212. package/lib/prompt-guard.d.ts.map +1 -0
  213. package/lib/prompt-guard.js +2 -0
  214. package/lib/sanitizer-pipeline.d.ts +2 -0
  215. package/lib/sanitizer-pipeline.d.ts.map +1 -0
  216. package/lib/sanitizer-pipeline.js +2 -0
  217. package/lib/secure-bridge.d.ts +2 -0
  218. package/lib/secure-bridge.d.ts.map +1 -0
  219. package/lib/secure-bridge.js +2 -0
  220. package/lib/sessions.d.ts +2 -0
  221. package/lib/sessions.d.ts.map +1 -0
  222. package/lib/sessions.js +2 -0
  223. package/lib/tcm.d.ts +2 -0
  224. package/lib/tcm.d.ts.map +1 -0
  225. package/lib/tcm.js +2 -0
  226. package/lib/td-bus.d.ts +2 -0
  227. package/lib/td-bus.d.ts.map +1 -0
  228. package/lib/td-bus.js +2 -0
  229. package/lib/tools.d.ts +2 -0
  230. package/lib/tools.d.ts.map +1 -0
  231. package/lib/tools.js +2 -0
  232. package/lib/voice-input.d.ts +2 -0
  233. package/lib/voice-input.d.ts.map +1 -0
  234. package/lib/voice-input.js +2 -0
  235. package/package.json +253 -3
  236. package/presets/agent-preset-edge.json +50 -0
  237. package/presets/edge.desktop-safe.patch.yml +503 -0
  238. package/presets/edge.patch.yml +557 -0
@@ -0,0 +1,357 @@
1
+ /**
2
+ * function-call-external — §7.93.1(2026-09-25 通用化重构):
3
+ * 通用 tool-call 外置小模型能力,client 负责把 user query + tool schemas POST 给
4
+ * 一个外部 HTTP service,让该 service 返回 function_calls 结构化结果。
5
+ * 完整 pipeline(8 fail-open gate + circuit breaker + boot probe + 周期
6
+ * recovery + ToolRunner 执行 + 合成 user-role message 注入 decision.messages)
7
+ * 是 §7.93 已验证的,本文件不重做设计,只重命名 + 抽出 provider 接口。
8
+ *
9
+ * **Phase 路线**(沿用 §7.93):
10
+ * - §7.93 Phase 4=骨架;5=waterfall listener;6=breaker+probe;7=失败路径
11
+ * 细分;8=E2E+bench;9=部署+boot-verify
12
+ * - §7.93.1(本次)=generic 化:
13
+ * - 名字脱离"needle":plugin / config / env / audit / ops log 全 generic
14
+ * - 抽出 `ExternalToolCaller` interface;当前实现 = `NeedleHttpCaller`
15
+ * (cactus-needle 3.0.1,API.md v1.1 契约,GET /health + POST /extract)
16
+ * - 后续替换 = 新增一个 class implements `ExternalToolCaller`,改
17
+ * `apply()` 里一行 `new XxxCaller(...)` 即可
18
+ *
19
+ * **架构(沿用 §7.93)**:user query + tool schemas → ExternalToolCaller →
20
+ * 拿回 function_calls → TS tool-runner 执行(realm/PII/audit 零绕过)→
21
+ * 整段对话给 LOCAL LLM 合成回复。所有失败 fall through 到 §7.42 P0-1
22
+ * LLM 自提取路径(本插件是 prefill 不是替代)。
23
+ *
24
+ * **服务边界**:
25
+ * - 一切失败(caller down / 超时 / 低置信 / 空 schemas / 0 executed)
26
+ * fall through 到 LLM 自提取路径(§7.42 P0-1 patch 保留作 fallback)
27
+ * - CLOUD intent 跳过(云端 LLM 自带 native tool calling);REJECT intent
28
+ * input-guard 已拒、我们看不到 realm;undefined realm 跳过(稳健于启动
29
+ * 时序:即使 apply 顺序出错也不会 crash,只是不优化)
30
+ *
31
+ * **注入约束**(沿用 §7.93 Phase 4.5 + Phase 5 关键修正):
32
+ * 1. `agent/request` waterfall 只携带 config,**没有 messages** ——
33
+ * 真实注入点 `agent/pre-step`(decision.messages → appended as
34
+ * user/message events → deriveMessages)
35
+ * 2. assembly.tools 在 pre-step 之前就锁死 — pre-step listener 改不了;
36
+ * 强指令 + §7.42 P0-1 + Layer 3 realm gate 兜底
37
+ * 3. decision.messages 全部以 user/message append;assistant tool_call
38
+ * role 在该 hook 不可达 → 只追加 user-role message
39
+ * 4. **插件 apply 顺序**:必须在 input-guard **之前**(cordis waterfall
40
+ * 注册顺序 = 执行顺序;await next() 串到 input-guard,等 classify +
41
+ * setSessionRealm 完成后才看得到本 turn 的 realm)
42
+ *
43
+ * audit 面(source='function-call-external'):
44
+ * external.hook.registered (info,apply 时一次性)
45
+ * external.boot_probe (info/warn,Phase 6)
46
+ * external.boot_probe.skipped (info,配置关掉 boot probe)
47
+ * external.boot_probe.unexpected (error,probe 自己抛)
48
+ * external.probe (info,Phase 6 周期 probe)
49
+ * external.circuit_open (warn,Phase 6)
50
+ * external.circuit_open_skip (info,Gate 2 短路)
51
+ * external.recovered (info,周期 probe 命中 2xx 关 breaker)
52
+ * external.extract (info,/extract 调用 metadata)
53
+ * external.extract_retry (warn,Phase 7 退避重试 503/502)
54
+ * external.extract_failed (warn,4xx/5xx/网络错)
55
+ * external.low_confidence_skip (info,采纳门未过)
56
+ * external.timeout_skip (warn,extract 超时)
57
+ * external.synthesis_injected (info,合成 user-role 已注入)
58
+ * external.realm_unset_skip (info,realm 未注册跳过)
59
+ * external.listener.error (error,handlePreStep 自身 catch 兜底)
60
+ * tool-runner(source='tool-runner',Phase 3):
61
+ * external.executed / .execution_failed / .realm_rejected /
62
+ * external.fabricated_arg / .unknown_tool
63
+ *
64
+ * inject(§7.92.2 proxy trap:读 ctx.X 前必须先列 inject):
65
+ * - auditLog 审计
66
+ * - realmSkillBridge getToolSchemasForExternal + getSessionRealm
67
+ * - tools 宿主 ToolRuntime,ToolRunner 的执行面
68
+ *
69
+ * @module dsh-edge-agent/function-call-external
70
+ */
71
+ import type { Context } from '@deepseek-ai/cordis';
72
+ import { Service } from '@deepseek-ai/cordis';
73
+ import Schema from '@deepseek-ai/schemastery';
74
+ import { ToolRunner } from './tool-runner.js';
75
+ export declare const name = "function-call-external";
76
+ export declare const inject: readonly ["auditLog", "realmSkillBridge", "tools"];
77
+ /** Minimal interface for the audit-log service (same shape as intent-router). */
78
+ interface AuditLike {
79
+ log(entry: {
80
+ level: 'debug' | 'info' | 'warn' | 'error' | 'security';
81
+ kind: string;
82
+ source: string;
83
+ payload: Record<string, unknown>;
84
+ }): Promise<unknown>;
85
+ }
86
+ /** ── Provider abstraction (§7.93.1 + §7.94) ────────────────────────────────
87
+ * ExternalToolCaller:把 HTTP 协议层隔离开。Plugin 持有 caller,所有 HTTP/JSON
88
+ * 逻辑都在 caller 里。Plugin 只关心:
89
+ * - caller.healthCheck(signal) → 是否能用
90
+ * - caller.extract({query, tools, signal, system?}) → 是否成功 + 原始响应
91
+ *
92
+ * §7.94:HTTP 契约即接口边界(详见 docs/function-call-external-http-contract.md)。
93
+ * 当前实现 = `NeedleHttpCaller`(cactus-needle 3.0.1,API.md v1.1 §4)。
94
+ * 未来端侧模型 = 自暴露 GET /health + POST /extract,改
95
+ * `FUNCTION_CALL_EXTERNAL_URL` 即可,plugin 零改动。
96
+ *
97
+ * 3 个只读元数据(`id` / `kind` / `capabilities`)纯可观测,无新行为:
98
+ * - `id`:稳定标识,audit/ops log 携带('needle-http' / 未来 'native-onnx-v1')
99
+ * - `kind`:transport 类型(HTTP / IPC / in-process),影响 ops log 字段
100
+ * - `capabilities`:能力声明(maxTools / maxQueryLen / supportsUngrounded)
101
+ */
102
+ export interface ExternalToolCaller {
103
+ /** §7.94:稳定标识 —— audit/ops log 通过 callerId 索引 */
104
+ readonly id: string;
105
+ /** §7.94:transport 类型 */
106
+ readonly kind: 'http' | 'ipc' | 'in-process';
107
+ /** §7.94:能力声明 —— maxTools / maxQueryLen / supportsUngrounded */
108
+ readonly capabilities: Readonly<{
109
+ /** 单次请求支持的 max tools(schema context 上限) */
110
+ maxTools?: number;
111
+ /** 单次请求支持的 max query 长度(字符) */
112
+ maxQueryLen?: number;
113
+ /** 是否支持 validation.ungrounded 字段 */
114
+ supportsUngrounded?: boolean;
115
+ }>;
116
+ /** /health probe. throws on transport error. ok=false on non-2xx. */
117
+ healthCheck(signal: AbortSignal): Promise<{
118
+ ok: boolean;
119
+ httpStatus: number;
120
+ latencyMs: number;
121
+ error?: string;
122
+ }>;
123
+ /** /extract call. throws on transport error. ok=false on non-2xx (caller
124
+ * decides retry/breaker based on status). On 2xx, raw is parsed JSON. */
125
+ extract(req: {
126
+ query: string;
127
+ tools: ReadonlyArray<{
128
+ name: string;
129
+ description: string;
130
+ parameters: Record<string, unknown>;
131
+ }>;
132
+ signal: AbortSignal;
133
+ system?: string;
134
+ }): Promise<{
135
+ ok: boolean;
136
+ status: number;
137
+ body: string;
138
+ raw?: unknown;
139
+ }>;
140
+ }
141
+ /** Phase 5 TypeScript-loose re-shape of PreStepDecision (dynamic import avoidance)。 */
142
+ interface PreStepDecisionShape {
143
+ kind: 'enter' | 'reject';
144
+ messages?: ReadonlyArray<Record<string, unknown>>;
145
+ reason?: string;
146
+ startsRequestSeries?: true;
147
+ /** Phase 5 doesn't override this; input-guard pattern preserves it as-is. */
148
+ assembly?: unknown;
149
+ }
150
+ export interface Config {
151
+ /** 总开关。schema 默认 false;生产 cordis.patch.yml 用 env 翻译层给值
152
+ * (Phase 9)。false 时 boot 但 isAvailable() 恒 false,Phase 5 listener
153
+ * 直接 next() 透传。 */
154
+ functionCallExternalEnabled?: boolean;
155
+ /** HTTP 服务基址。当前实现 = cactus-needle 3.0.1 (needle-http :8081);
156
+ * 后续替换 = 改这个 URL + apply() 里一行构造新 caller。 */
157
+ functionCallExternalUrl?: string;
158
+ /** 单次 POST 超时(ms)。实测 needle 引擎 4-7s(dry-run #1 spec 376-548ms 是
159
+ * 理想值,实际 25-30x degradation);默认 10s 给单请求 1x 余量。 */
160
+ functionCallExternalTimeoutMs?: number;
161
+ /** 采纳阈值:confidence < 此值 → fall through(实测 needle 报
162
+ * 0.5-0.7 区间合理);0.5 让多数有 tool match 的提取通过 adopt gate。 */
163
+ functionCallExternalConfidenceThreshold?: number;
164
+ /** breaker 打开后的 TTL(ms);期间 classify 跳过 caller 直走 LLM。 */
165
+ functionCallExternalBreakerTtlMs?: number;
166
+ /** Phase 6:apply() 时 fire-and-forGET /health;fail → 预开 breaker。 */
167
+ functionCallExternalBootProbeEnabled?: boolean;
168
+ /** boot probe 超时(ms)。 */
169
+ functionCallExternalBootProbeTimeoutMs?: number;
170
+ /** breaker 打开期间的周期恢复 probe 间隔(ms)。 */
171
+ functionCallExternalBreakerProbeMs?: number;
172
+ /** 周期 probe 超时(ms)。 */
173
+ functionCallExternalProbeTimeoutMs?: number;
174
+ }
175
+ export declare const Config: Schema<Config>;
176
+ /** In-memory counters exposed via getStats(). Pure observability; the audit
177
+ * log already carries every per-call kind, but counters give operators an
178
+ * O(1) read for dashboards / alerts (rate of timeouts, % sanitized, etc.)
179
+ * without parsing JSONL. */
180
+ export interface FunctionCallExternalStats {
181
+ /** 配置快照:总开关(运维排查"为什么没走 external"第一问)。 */
182
+ functionCallExternalEnabled: boolean;
183
+ /** Phase 6:boot probe 成功/失败(失败 = breaker 预开)。 */
184
+ functionCallExternalBootProbeOk: number;
185
+ functionCallExternalBootProbeFail: number;
186
+ /** Phase 6:周期 probe 尝试/恢复(breaker 关闭)次数。 */
187
+ functionCallExternalProbeAttempts: number;
188
+ functionCallExternalRecoveredProbe: number;
189
+ /** Phase 6:breaker 当前是否打开(getStats 时快照)。 */
190
+ functionCallExternalCircuitOpen: boolean;
191
+ /** Phase 5/6:因 breaker 打开跳过 caller 的请求数。 */
192
+ functionCallExternalCircuitSkip: number;
193
+ /** Phase 5:realm 未注册(undefined)跳过 + 非 LOCAL/SANITIZED 跳过。 */
194
+ functionCallExternalRealmUnsetSkip: number;
195
+ /** Phase 5:/extract 调用数 / 成功采纳数 / 低置信跳过 / 超时跳过。 */
196
+ functionCallExternalExtractCalls: number;
197
+ functionCallExternalExtractOk: number;
198
+ functionCallExternalLowConfSkip: number;
199
+ functionCallExternalTimeoutSkip: number;
200
+ /** Phase 3(tool-runner 归一的 outcome 计数,由 Phase 5 汇入)。 */
201
+ functionCallExternalExecuted: number;
202
+ functionCallExternalErrors: number;
203
+ /** Phase 5:≥1 executed → 注入合成 message 的次数。 */
204
+ functionCallExternalSynthesisInjected: number;
205
+ /** /extract 累计延迟(取驱动决策的响应,均值 = total/calls)。 */
206
+ functionCallExternalLatencyMsTotal: number;
207
+ /** Phase 7:503/502 退避重试的尝试次数(不算首次);一次 logical extract
208
+ * call 最多 +1。 */
209
+ functionCallExternalRetryAttempts: number;
210
+ }
211
+ export declare class FunctionCallExternalServiceImpl extends Service {
212
+ private readonly auditLog;
213
+ private readonly functionCallExternalEnabled;
214
+ private readonly functionCallExternalUrl;
215
+ private readonly functionCallExternalTimeoutMs;
216
+ private readonly functionCallExternalConfidenceThreshold;
217
+ private readonly functionCallExternalBreakerTtlMs;
218
+ private readonly functionCallExternalBootProbeEnabled;
219
+ private readonly functionCallExternalBootProbeTimeoutMs;
220
+ private readonly functionCallExternalBreakerProbeMs;
221
+ private readonly functionCallExternalProbeTimeoutMs;
222
+ /** Provider abstraction(§7.93.1):所有 HTTP 走 caller。Plugin 不直接
223
+ * fetch。替换 = 改 apply() 里的构造,plugin 代码不变。 */
224
+ private readonly caller;
225
+ /** §7.92.6:ms-epoch timestamp until which the breaker is open.
226
+ * 0 = closed. openBreaker() sets it; closeBreaker() resets it. */
227
+ private functionCallExternalBreakerOpenUntil;
228
+ /** §7.92.7:setInterval handle for the periodic recovery probe. */
229
+ private functionCallExternalBreakerProbeTimer;
230
+ /** §7.92.7:in-flight boot probe promise。track 让 stop() / dispose
231
+ * 能 await 而不留下 dangling fetch racing constructor's first
232
+ * classify() call. */
233
+ private functionCallExternalBootProbePromise;
234
+ /** §7.92.7 helper:最近一次 periodic probe wall-clock。 */
235
+ private functionCallExternalLastProbeLatencyMs;
236
+ private readonly stats;
237
+ constructor(ctx: Context, config: Config, auditLog?: AuditLike, caller?: ExternalToolCaller);
238
+ /**
239
+ * §7.92.6 (2026-09-24):breaker-aware availability。
240
+ * Phase 4 语义:enabled。Phase 6 叠加:enabled && Date.now() >= breakerOpenUntil
241
+ * (jev `isJevAvailable()` 同款语义)。Phase 5 listener Gate 2
242
+ * `if (!isAvailable()) return decision` 因此自动承担 short-circuit:
243
+ * 0ms 短路,不付出 extract 1.5s 超时。audit `external.circuit_open_skip`
244
+ * 由 Gate 2 显式落(见 handlePreStep)。
245
+ */
246
+ isAvailable(): boolean;
247
+ /** ctx.fetch access — production ctx is a cordis proxy and throws if the
248
+ * key isn't in `inject:` (§7.92.2). Tests use a plain object ctx and
249
+ * set `fetch` directly. Swallow the cordis proxy throw + fall through
250
+ * to NeedleHttpCaller's globalThis.fetch fallback. */
251
+ private tryFetchOverride;
252
+ /** 配置只读视图(ops 排查 + 测试断言;env 翻译层是否生效一眼可见)。 */
253
+ getConfigView(): Readonly<{
254
+ functionCallExternalEnabled: boolean;
255
+ functionCallExternalUrl: string;
256
+ functionCallExternalTimeoutMs: number;
257
+ functionCallExternalConfidenceThreshold: number;
258
+ functionCallExternalBreakerTtlMs: number;
259
+ functionCallExternalBootProbeEnabled: boolean;
260
+ functionCallExternalBootProbeTimeoutMs: number;
261
+ functionCallExternalBreakerProbeMs: number;
262
+ functionCallExternalProbeTimeoutMs: number;
263
+ }>;
264
+ getStats(): FunctionCallExternalStats;
265
+ start(): void;
266
+ stop(): Promise<void>;
267
+ /**
268
+ * §7.92.7:probe caller /health.returns true on 2xx, false on anything else
269
+ * (transport error, timeout, non-2xx). Always resolves — never throws.
270
+ */
271
+ private probeHealth;
272
+ /**
273
+ * §7.92.7:启动周期 recovery probe。idempotent。
274
+ */
275
+ private startBreakerProbe;
276
+ private stopBreakerProbe;
277
+ /**
278
+ * §7.92.6:open-on-first-failure(jev 是 all-batches 失败才开,这里
279
+ * 单 fetch 等价于"这一发失败")。timeout 与 5xx 都计入(§7.93 dry-run #1
280
+ * 验证 needle 引擎当前 25x degradation,1.5s timeout 几乎全中)。
281
+ * 4xx 不开(client error ≠ engine down)。idempotent:已开则 no-op。
282
+ */
283
+ private openBreaker;
284
+ private closeBreaker;
285
+ createToolRunner(): ToolRunner | undefined;
286
+ audit(level: 'debug' | 'info' | 'warn' | 'error' | 'security', kind: string, payload: Record<string, unknown>): void;
287
+ /**
288
+ * §7.46 ops-log-coverage-principle 双轨(file-logger + audit-log)。
289
+ * audit 走 JSONL 解析器;ops log 走 file-logger 运维 grep。
290
+ * 两者 metadata only,绝不落 query/arguments/result 内容(PII 纪律)。
291
+ */
292
+ opsLog(event: string, fields: string): void;
293
+ private bridge;
294
+ /**
295
+ * POST /extract(caller.extract)。失败路径细分(沿用 §7.93 Phase 7):
296
+ * 422 invalid body → 不重试,不开 breaker
297
+ * 503 + body 'loading' → 不重试,开 breaker
298
+ * 503 + body 'busy' → 重试 1 次 200ms,二次仍 503 → 开 breaker
299
+ * 502 engine internal → 重试 1 次 200ms,二次仍 502 → 开 breaker
300
+ * 408/504 timeout proxy → 不重试,开 breaker
301
+ * 其他 5xx → 不重试,开 breaker
302
+ * AbortError(本地超时) → 不重试,开 breaker
303
+ * 其它网络错 → 不重试,开 breaker
304
+ * no fetcher → 不重试,开 breaker
305
+ */
306
+ private extractCalls;
307
+ /** Single attempt:thin wrapper around caller.extract + AbortSignal composition. */
308
+ private attemptExtractOnce;
309
+ /** Parse 200 response fields(API.md v1.1 §4.5 contract). */
310
+ private parseExtractResponse;
311
+ private buildSynthesisContext;
312
+ private safeArgSummary;
313
+ /**
314
+ * agent/pre-step waterfall listener. **总是 await next() FIRST** ——
315
+ * 让我们(plugin)在 chain 中是 input-guard 的外层,input-guard 的
316
+ * classify + setSessionRealm 完成后才返回到这里,我们才看得到本 turn
317
+ * 的 realm。决策树(全 fail-open,永不 throw):
318
+ *
319
+ * await next()
320
+ * ├─ decision.kind === 'reject' → 透传(input-guard 已拒)
321
+ * ├─ !isAvailable() → 透传(总开关关 / breaker 开)
322
+ * ├─ sessionId 缺失 → 透传
323
+ * ├─ realm 未注册 / 非 LOCAL|SANITIZED → 透传
324
+ * ├─ 用户最后一条文本为空 → 透传
325
+ * ├─ getToolSchemasForExternal 空 → 透传
326
+ * ├─ caller.extract 失败(非 retryable)→ 透传
327
+ * ├─ adopt gate 未过 → 透传
328
+ * ├─ createToolRunner undefined → 透传
329
+ * ├─ outcomes ≥1 executed → 注入 user-role synthesis message
330
+ * └─ 全 denied/skipped/error → 透传(0 executed 不污染)
331
+ *
332
+ * 整个 body 包 try/catch,decision 提到 try 外:catch 拿到 decision → 透传
333
+ * (不污染 cordis dispatch);catch 没 decision(await next() 自身抛)→ 重抛
334
+ * (让上层处理真基础设施错)。
335
+ */
336
+ handlePreStep(payload: {
337
+ agent?: {
338
+ session?: {
339
+ id?: string;
340
+ } & Record<string, unknown>;
341
+ } & Record<string, unknown>;
342
+ messages: ReadonlyArray<Record<string, unknown>>;
343
+ step?: number;
344
+ signal?: AbortSignal;
345
+ }, next: () => Promise<PreStepDecisionShape>): Promise<PreStepDecisionShape>;
346
+ /** Last user-role text message(沿用 input-guard.findLastUserText 模式)。 */
347
+ private findLastUserText;
348
+ }
349
+ /** Module augmentation: expose the service on ctx. */
350
+ declare module '@deepseek-ai/cordis' {
351
+ interface Context {
352
+ functionCallExternal: FunctionCallExternalServiceImpl;
353
+ }
354
+ }
355
+ export declare function apply(ctx: Context, config: Config): Promise<() => Promise<void>>;
356
+ export {};
357
+ //# sourceMappingURL=function-call-external.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-call-external.d.ts","sourceRoot":"","sources":["../../src/dsh-adapter/function-call-external.ts"],"names":[],"mappings":"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"}