@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,202 @@
1
+ {
2
+ "version": "1.9.0",
3
+ "_comment": "sanitizationRules 的 pattern 必须与 src/dsh-adapter/pii-utils.ts 的 PII_PATTERNS 保持一致(tests/unit/pii-utils.test.ts 有一致性断言)。已移除 replacement 字段:占位符由 sanitizer-pipeline 自行生成为 [<PIITYPE>_<seq>],该字段历史上不生效。",
4
+ "_categories_comment": "§7.110(默认本地,类别简并):categories 只需要**肯定式定义例外**——CLOUD(需要公网信息)和 REJECT(危险请求);其余一切(本地操作、日常问答、含 PII 的本地处理)都是默认 LOCAL,不设行。SANITIZED 不再单列:CLOUD 路径本来必经 sanitizer(fail-closed,脱不了敏不上云),含敏感数据的操作另有 PII LOCAL 正则护栏兜底。 jevIntents 同步收敛:只保留无歧义的 CLOUD/REJECT 信号标签(知识问答/通用咨询属日常问答 → 默认 LOCAL,不再进 CLOUD)。intent-router 在 policy 无 LOCAL 行时自动补 catch-all 提示行并放行 LOCAL 输出。",
5
+ "_stages_comment": "§7.109(语义优先裁决):路由以 jev/LLM 的语义判决为主——stages.intent.semanticCloudMinConfidence 是操作者对分类器的信任阈值,语义判 CLOUD 且置信度 ≥ 阈值即出网(无需关键词佐证)。关键词/正则只作护栏与零成本快路径(REJECT 危险操作、PII LOCAL 安全网、内置新闻/天气类信号),不再为领域扩词——子串匹配易误命中(如「游戏攻略」)。stages.intent.cloudKeywords/localEntities/fallbackKeywords 仍是可用的扩展面(追加/替换语义见 §7.108),但默认为空。全部热重载。",
6
+ "categories": [
7
+ {
8
+ "id": "CLOUD",
9
+ "description": "需要检索公网上信息的任务:新闻、天气、行情、搜索引擎,以及旅游攻略、景点推荐、行程规划等需要实时公网信息的任务",
10
+ "examples": [
11
+ "今天北京天气",
12
+ "查一下最新的AI新闻",
13
+ "准备一个杭州游玩的攻略",
14
+ "规划一个西湖一日游"
15
+ ],
16
+ "jevIntents": [
17
+ "天气",
18
+ "新闻",
19
+ "搜索",
20
+ "旅游攻略",
21
+ "景点推荐",
22
+ "行程规划",
23
+ "weather",
24
+ "news",
25
+ "search",
26
+ "travel",
27
+ "travel_planning",
28
+ "attraction"
29
+ ]
30
+ },
31
+ {
32
+ "id": "REJECT",
33
+ "description": "高危 / 违法 / 违规请求(危险系统操作、破坏性命令、投诉、法务)",
34
+ "examples": [
35
+ "rm -rf /",
36
+ "drop table users",
37
+ "我要投诉"
38
+ ],
39
+ "jevIntents": [
40
+ "投诉",
41
+ "法务咨询",
42
+ "complaint",
43
+ "legal"
44
+ ]
45
+ }
46
+ ],
47
+ "routingRules": [
48
+ {
49
+ "pattern": "(导出|删除|清空|格式化).*(数据库|系统|磁盘|全部数据)",
50
+ "realm": "REJECT",
51
+ "confidence": 0.9,
52
+ "rationale": "危险系统操作"
53
+ },
54
+ {
55
+ "pattern": "(drop\\s+table|rm\\s+-rf|format\\s+[a-z]:|del\\s+/[fs])",
56
+ "realm": "REJECT",
57
+ "confidence": 0.95,
58
+ "rationale": "破坏性命令特征"
59
+ },
60
+ {
61
+ "pattern": "(本地|local|文件|file|计算|calculate|读取|写入)",
62
+ "realm": "LOCAL",
63
+ "confidence": 0.8,
64
+ "rationale": "本地操作不出设备"
65
+ },
66
+ {
67
+ "pattern": "(密码|password|secret|密钥|private.?key|token)",
68
+ "realm": "LOCAL",
69
+ "confidence": 0.9,
70
+ "rationale": "敏感凭据不得离开设备"
71
+ },
72
+ {
73
+ "pattern": "(身份证号|id.?card|银行卡|bank.?card|信用卡|credit.?card)",
74
+ "realm": "LOCAL",
75
+ "confidence": 0.95,
76
+ "rationale": "金融/身份类 PII 必须留在本地"
77
+ },
78
+ {
79
+ "pattern": "(手机号|电话号码|手机.{0,5}号|phone.?number|mobile.?number)",
80
+ "realm": "LOCAL",
81
+ "confidence": 0.95,
82
+ "rationale": "手机号 PII 必须留在本地"
83
+ },
84
+ {
85
+ "pattern": "(邮箱|电邮|email.?address|e-?mail)",
86
+ "realm": "LOCAL",
87
+ "confidence": 0.95,
88
+ "rationale": "邮箱 PII 必须留在本地"
89
+ },
90
+ {
91
+ "pattern": "(IP\\s*地址|服务器.{0,8}(IP|地址)|server\\s+IP|局域网.{0,8}(IP|地址))",
92
+ "realm": "LOCAL",
93
+ "confidence": 0.9,
94
+ "rationale": "IP 地址 PII 必须留在本地"
95
+ },
96
+ {
97
+ "pattern": "(家庭住址|住址|home\\s+address|通信地址)",
98
+ "realm": "LOCAL",
99
+ "confidence": 0.85,
100
+ "rationale": "家庭住址 PII 必须留在本地"
101
+ },
102
+ {
103
+ "pattern": "(联网|上网|网上查|搜索引擎|搜索一下网上|web search|search the web|look up online|weather forecast|天气预报|实时行情|股价|汇率|current price)",
104
+ "realm": "CLOUD",
105
+ "confidence": 0.8,
106
+ "rationale": "需要检索公网上的信息 → 才允许走云端 LLM"
107
+ }
108
+ ],
109
+ "stages": {
110
+ "intent": {
111
+ "_semantic_comment": "§7.123 (2026-10-27): raised 0.75 → 0.95. The bailian decision-model answers a `choice` question and frequently reports NO numeric confidence; the decoder then substitutes a synthetic 0.9 ('decisive-by-construction'). At 0.75 that placeholder was always >= threshold, so EVERY CLOUD verdict from that provider left the device with no public-web signal — the §7.107 gate was inert on the one path that talks to a cloud service. 0.95 sits above the synthetic placeholder so only a MEASURED high confidence can unlock the semantic path. §7.123 also added a provenance guard in code (Intent.confidenceReported): a synthetic confidence can never satisfy this threshold at all. Lower it only if your classifier genuinely reports calibrated confidences; 0.95 is the safe floor for a choice-style model.",
112
+ "semanticCloudMinConfidence": 0.95,
113
+ "deviceCommands": {
114
+ "_comment": "家庭设备操作正则层的扩展词表 —— 追加到内置词表(灯/空调/电视/窗帘…)。devices = 设备名词,actions = 动作词。改这里即时生效(热重载),不用重启 App。",
115
+ "devices": [],
116
+ "actions": []
117
+ }
118
+ }
119
+ },
120
+ "sanitizationRules": [
121
+ {
122
+ "pattern": "\\b[1-9]\\d{5}(?:19|20)\\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]\\b",
123
+ "dataClass": "secret",
124
+ "piiType": "id-card",
125
+ "keepPrefix": 6
126
+ },
127
+ {
128
+ "pattern": "\\b\\d{16,19}\\b",
129
+ "dataClass": "secret",
130
+ "piiType": "bank-card"
131
+ },
132
+ {
133
+ "pattern": "\\b1[3-9]\\d{9}\\b",
134
+ "dataClass": "confidential",
135
+ "piiType": "phone",
136
+ "keepPrefix": 7
137
+ },
138
+ {
139
+ "pattern": "[\\w.-]+@[\\w.-]+\\.\\w+",
140
+ "dataClass": "confidential",
141
+ "piiType": "email"
142
+ },
143
+ {
144
+ "pattern": "(?:sk-(?:proj-|ant-|live-|test-|org-)?[a-zA-Z0-9]{20,}|key-[a-zA-Z0-9]{16,}|api[_-]?key[_-]?[a-zA-Z0-9]{16,})",
145
+ "dataClass": "secret",
146
+ "piiType": "api-key"
147
+ },
148
+ {
149
+ "pattern": "(?:密码|口令|用户名|账号|账户|passwd|password|pwd|username|account|secret|access[ _-]?token|token|api[ _-]?key)[\"'  ]{0,2}(?:[::=]|是|为|\\s+is\\s+)[\"'  ]?[^\\s\"',,;;<>()()]{3,64}",
150
+ "dataClass": "secret",
151
+ "piiType": "credential",
152
+ "replacement": "<PII_CREDENTIAL_n>"
153
+ },
154
+ {
155
+ "pattern": "(?<![vV\\d.])(?:(?:25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)(?!\\.?\\d)",
156
+ "dataClass": "confidential",
157
+ "piiType": "ip-address"
158
+ },
159
+ {
160
+ "pattern": "(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}",
161
+ "dataClass": "confidential",
162
+ "piiType": "mac-address"
163
+ },
164
+ {
165
+ "pattern": "\\b(?:E[0-9A-Z]\\d{7}|G\\d{8})\\b",
166
+ "dataClass": "secret",
167
+ "piiType": "passport"
168
+ },
169
+ {
170
+ "pattern": "[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤川青藏琼][A-Z][A-HJ-NP-Z0-9]{5}",
171
+ "dataClass": "confidential",
172
+ "piiType": "license-plate"
173
+ }
174
+ ],
175
+ "dataClassifications": [
176
+ {
177
+ "class": "public",
178
+ "defaultRealm": "CLOUD",
179
+ "ttlSeconds": 3600
180
+ },
181
+ {
182
+ "class": "internal",
183
+ "defaultRealm": "SANITIZED",
184
+ "ttlSeconds": 1800
185
+ },
186
+ {
187
+ "class": "confidential",
188
+ "defaultRealm": "LOCAL",
189
+ "ttlSeconds": 900
190
+ },
191
+ {
192
+ "class": "secret",
193
+ "defaultRealm": "LOCAL",
194
+ "ttlSeconds": 300
195
+ }
196
+ ],
197
+ "globalConstraints": {
198
+ "maxCloudRequestsPerMinute": 20,
199
+ "requireAttestation": false,
200
+ "blockIfTcbCompromised": true
201
+ }
202
+ }
@@ -0,0 +1,129 @@
1
+ # dsh-edge-agent — desktop-safe overlay
2
+ #
3
+ # This patch is intended for loading the bundle into an existing DSH Desktop /
4
+ # Web profile through the Plugins page. Unlike the production `cordis.patch.yml`,
5
+ # it **only inserts** the edge privacy stack. It does not rewrite host defaults:
6
+ #
7
+ # - no system-prompt/persona override
8
+ # - no agent-default-model override
9
+ # - no approval/sandbox override
10
+ # - no session-root override
11
+ # - no http-api listener
12
+ # - no upstream tool/subagent/workflow disables
13
+ #
14
+ # What it does mount:
15
+ # - durable ops log + audit log
16
+ # - TCM stub + threat bus
17
+ # - Realm-aware skill/tool bridge
18
+ # - privacy policy + PII sanitizer
19
+ # - prompt guard + intent router + input guard orchestrator
20
+ # - §7.100 / §7.171 LLM routes: BOTH pools are DELEGATE adapters by default
21
+ # (they forward to the host profile's own configured model provider — the
22
+ # Desktop GUI's model picker — with host-side credential resolution; the
23
+ # bundle never reads any secret). A pool becomes a DIRECT (edge-owned) one
24
+ # only when its own endpoint is configured in config/edge.json
25
+ # (llm.local.baseUrl / llm.cloud.baseUrl).
26
+ #
27
+ # Notes:
28
+ # - §7.171 (2026-11-10) made llm.local symmetric with llm.cloud: with no
29
+ # `llm.local.baseUrl` the local route still registers, but forwards to the
30
+ # host provider. Consequence to be aware of: the internal LLM stages
31
+ # (intent classification / guard model-detection) are pinned to
32
+ # `local-llm`, so with no local endpoint they now run on the host's model
33
+ # and the text under inspection rides along. The 2026-10-18 ruling
34
+ # ("internal LLM calls must never borrow the host's cloud model") is
35
+ # therefore honoured only when a local endpoint IS configured — or when
36
+ # `llm.local.delegate=false`, which leaves the route unregistered and
37
+ # sends the stages back to their keyword/regex tier.
38
+ # - SANITIZED/CLOUD answers egress through the host's own provider — the
39
+ # same destination plain Desktop use already picks — after PII
40
+ # placeholder sanitization.
41
+ # - LLM-based guard/intent detection config comes from config/edge.json
42
+ # (stages.guard.* / stages.intent.*): both are ON by default, both point
43
+ # at `local-llm`, and intent-router falls back to keyword/policy rules
44
+ # when its classifier provider is unavailable.
45
+ # - The privacy pipeline still intercepts every agent step. That is expected:
46
+ # this is what makes it an edge-agent. If you want zero behavior change,
47
+ # set DSH_EDGE_INPUT_GUARD=false before starting/restarting the profile.
48
+
49
+ - id: tool-web
50
+ disabled: false
51
+ config:
52
+ search: true
53
+ fetch: true
54
+ searchMaxResults: 8
55
+ searchTimeoutMs: 30000
56
+ fetchTimeoutMs: 30000
57
+ - id: web
58
+ config:
59
+ searchProvider: tavily-bocha-fallback
60
+ fetchProvider: http
61
+ - id: web-search-deepseek
62
+ disabled: true
63
+
64
+ # ── 本 bundle 留在宿主树的三行(§7.136)──────────────────────────────────
65
+ # 理由见 scripts/_isolate-edge-group.mjs 的文件头:
66
+ # dsh-edge-agent(裸包名)—— 宿主 client-modules 只扫宿主 Loader 的 entries,
67
+ # preset 树不在其中 ⇒ Edge tab 的浏览器半边只能从这里被发现;
68
+ # audit-log / file-logger —— 裸包名行 inject auditLog,且它的 installFileLogger
69
+ # 会先占住 fileLogger 服务名 ⇒ 两者必须在 root realm,且 file-logger 行要更早装载。
70
+ - insert:
71
+ # §7.101.x (2026-10-20, fix #5) + §7.136: the BARE-package host-half row.
72
+ # The webview client-module system (@deepseek-ai/dsh-client-modules) scans
73
+ # LOADER ENTRY NAMES for a `dsh.client` declaration — and its package
74
+ # locator only accepts bare package-root specifiers (`exactPackageSpecifier`),
75
+ # so subpath rows like '@scope/pkg/audit-log' can never surface the
76
+ # bundle's browser half. dsh-context shows the working shape: one bare
77
+ # row (`name: dsh-context`) whose main entry IS the plugin AND whose
78
+ # manifest carries `dsh.client.platform: "web"`.
79
+ #
80
+ # §7.136: this row must stay in the HOST tree. client-modules scans
81
+ # `ctx.loader.entries()` — the host Loader's entries — while a preset's
82
+ # plugin list lives in its own EntryTree, outside that enumeration. A bare
83
+ # row inside the preset would therefore never surface the browser half and
84
+ # the Edge tab would vanish in every work mode.
85
+ - id: dsh-edge-agent
86
+ name: '@dsh-edge/dsh-edge-agent'
87
+
88
+ # Ops log exporter. Mount first so later plugin logs land on disk.
89
+ - id: file-logger
90
+ name: '@dsh-edge/dsh-edge-agent/file-logger'
91
+ config:
92
+ # §7.102 "one config file": only profile-specific statics live here.
93
+ # root / level / rotation come from config/edge.json (audit.*);
94
+ # no process.env reads — the desktop GUI never had them.
95
+ filename: dsh-edge-agent-desktop.log
96
+ flushIntervalMs: 1000
97
+ queueCapacity: 10000
98
+ maxFileSizeBytes: 52428800
99
+
100
+ # Security ledger. Default root stays isolated under ~/.dsh-edge-agent.
101
+ - id: audit-log
102
+ name: '@dsh-edge/dsh-edge-agent/audit-log'
103
+ config:
104
+ # §7.102 "one config file": minLevel / flush / root come from
105
+ # config/edge.json (audit.*). Only static wiring stays here.
106
+ ringBufferSize: 512
107
+ filename: audit.plain.jsonl
108
+ enablePIIRedaction: true
109
+ maxFileSizeBytes: 10485760
110
+ maxFileAgeDays: 7
111
+ maxRotatedFiles: 5
112
+
113
+ # §7.145: 桌面版「起不来」的根因修复(431)。
114
+ #
115
+ # 这一行**必须**留在宿主树(不是 preset)—— 它修的不是 Edge 行为,而是
116
+ # **宿主自己的启动**:Electron 外壳的 welcome 握手带着 Chromium cookie jar
117
+ # 出发,cookie 越攒越多 ⇒ 请求头爆 16 KB ⇒ 431 ⇒ 外壳拆宿主 ⇒
118
+ # 「DeepSeek Harness is unavailable」。握手发生在**任何工作方式选定之前**
119
+ # ⇒ 修它的插件也必须在 preset 之外。
120
+ #
121
+ # 它自带 `process.versions.electron` 判据 ⇒ headless profile 里直接跳过。
122
+ - id: desktop-cookie-janitor
123
+ name: '@dsh-edge/dsh-edge-agent/desktop-cookie-janitor'
124
+ config:
125
+ enabled: true
126
+ # 宿主 web 服务是裸 createServer(16 KB 头上限);抬到 64 KB 让
127
+ # 一个已经攒胖的 cookie jar 也不会打死启动。
128
+ maxHeaderBytes: 65536
129
+