@zhin.js/agent 0.1.25 → 0.1.26

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 (307) hide show
  1. package/lib/agent-prompt/registry.js +1 -1
  2. package/lib/agent-prompt/registry.js.map +1 -1
  3. package/lib/ai-event-bus.d.ts +19 -0
  4. package/lib/ai-event-bus.d.ts.map +1 -0
  5. package/lib/ai-event-bus.js +75 -0
  6. package/lib/ai-event-bus.js.map +1 -0
  7. package/lib/ai-event-subscriber.d.ts +38 -0
  8. package/lib/ai-event-subscriber.d.ts.map +1 -0
  9. package/lib/ai-event-subscriber.js +61 -0
  10. package/lib/ai-event-subscriber.js.map +1 -0
  11. package/lib/builtin/ask-user-tool.d.ts +2 -0
  12. package/lib/builtin/ask-user-tool.d.ts.map +1 -1
  13. package/lib/builtin/ask-user-tool.js +2 -0
  14. package/lib/builtin/ask-user-tool.js.map +1 -1
  15. package/lib/builtin/bash-tool.d.ts +7 -3
  16. package/lib/builtin/bash-tool.d.ts.map +1 -1
  17. package/lib/builtin/bash-tool.js +51 -9
  18. package/lib/builtin/bash-tool.js.map +1 -1
  19. package/lib/builtin/bing-search-html.d.ts.map +1 -1
  20. package/lib/builtin/bing-search-html.js +14 -7
  21. package/lib/builtin/bing-search-html.js.map +1 -1
  22. package/lib/builtin/builtin-base-tool.d.ts +2 -0
  23. package/lib/builtin/builtin-base-tool.d.ts.map +1 -1
  24. package/lib/builtin/builtin-base-tool.js +5 -0
  25. package/lib/builtin/builtin-base-tool.js.map +1 -1
  26. package/lib/builtin/edit-file-tool.d.ts +1 -1
  27. package/lib/builtin/edit-file-tool.d.ts.map +1 -1
  28. package/lib/builtin/edit-file-tool.js +33 -1
  29. package/lib/builtin/edit-file-tool.js.map +1 -1
  30. package/lib/builtin/file-edit-quote-utils.d.ts +1 -3
  31. package/lib/builtin/file-edit-quote-utils.d.ts.map +1 -1
  32. package/lib/builtin/file-edit-quote-utils.js +1 -3
  33. package/lib/builtin/file-edit-quote-utils.js.map +1 -1
  34. package/lib/builtin/glob-tool.d.ts +1 -1
  35. package/lib/builtin/glob-tool.d.ts.map +1 -1
  36. package/lib/builtin/glob-tool.js +15 -3
  37. package/lib/builtin/glob-tool.js.map +1 -1
  38. package/lib/builtin/grep-tool.d.ts +1 -1
  39. package/lib/builtin/grep-tool.d.ts.map +1 -1
  40. package/lib/builtin/grep-tool.js +16 -3
  41. package/lib/builtin/grep-tool.js.map +1 -1
  42. package/lib/builtin/list-dir-tool.d.ts +1 -1
  43. package/lib/builtin/list-dir-tool.d.ts.map +1 -1
  44. package/lib/builtin/list-dir-tool.js +14 -3
  45. package/lib/builtin/list-dir-tool.js.map +1 -1
  46. package/lib/builtin/read-file-tool.d.ts +1 -1
  47. package/lib/builtin/read-file-tool.d.ts.map +1 -1
  48. package/lib/builtin/read-file-tool.js +24 -3
  49. package/lib/builtin/read-file-tool.js.map +1 -1
  50. package/lib/builtin/run-deferred-task-tool.d.ts +3 -0
  51. package/lib/builtin/run-deferred-task-tool.d.ts.map +1 -1
  52. package/lib/builtin/run-deferred-task-tool.js +2 -0
  53. package/lib/builtin/run-deferred-task-tool.js.map +1 -1
  54. package/lib/builtin/spawn-task-tool.d.ts.map +1 -1
  55. package/lib/builtin/spawn-task-tool.js +2 -0
  56. package/lib/builtin/spawn-task-tool.js.map +1 -1
  57. package/lib/builtin/web-fetch-tool.d.ts +2 -2
  58. package/lib/builtin/web-fetch-tool.d.ts.map +1 -1
  59. package/lib/builtin/web-fetch-tool.js +12 -18
  60. package/lib/builtin/web-fetch-tool.js.map +1 -1
  61. package/lib/builtin/write-file-tool.d.ts +1 -1
  62. package/lib/builtin/write-file-tool.d.ts.map +1 -1
  63. package/lib/builtin/write-file-tool.js +33 -1
  64. package/lib/builtin/write-file-tool.js.map +1 -1
  65. package/lib/common-adapter-tools.d.ts +8 -41
  66. package/lib/common-adapter-tools.d.ts.map +1 -1
  67. package/lib/common-adapter-tools.js +23 -182
  68. package/lib/common-adapter-tools.js.map +1 -1
  69. package/lib/deferred-worker-runner.d.ts +13 -2
  70. package/lib/deferred-worker-runner.d.ts.map +1 -1
  71. package/lib/deferred-worker-runner.js +91 -13
  72. package/lib/deferred-worker-runner.js.map +1 -1
  73. package/lib/discovery/agents.js +1 -1
  74. package/lib/discovery/agents.js.map +1 -1
  75. package/lib/discovery/skills.js +1 -1
  76. package/lib/discovery/skills.js.map +1 -1
  77. package/lib/discovery/tools.d.ts +1 -1
  78. package/lib/discovery/tools.d.ts.map +1 -1
  79. package/lib/discovery/tools.js +17 -4
  80. package/lib/discovery/tools.js.map +1 -1
  81. package/lib/discovery/utils.js +1 -1
  82. package/lib/discovery/utils.js.map +1 -1
  83. package/lib/hooks.d.ts.map +1 -1
  84. package/lib/hooks.js +2 -0
  85. package/lib/hooks.js.map +1 -1
  86. package/lib/index.d.ts +9 -1
  87. package/lib/index.d.ts.map +1 -1
  88. package/lib/index.js +6 -0
  89. package/lib/index.js.map +1 -1
  90. package/lib/init/message-media.d.ts +3 -1
  91. package/lib/init/message-media.d.ts.map +1 -1
  92. package/lib/init/message-media.js +20 -0
  93. package/lib/init/message-media.js.map +1 -1
  94. package/lib/init/register-ai-service.js.map +1 -1
  95. package/lib/init/register-ai-trigger.d.ts.map +1 -1
  96. package/lib/init/register-ai-trigger.js +71 -10
  97. package/lib/init/register-ai-trigger.js.map +1 -1
  98. package/lib/init/register-builtin-tools.js +7 -7
  99. package/lib/init/register-builtin-tools.js.map +1 -1
  100. package/lib/init/register-typing-indicator.d.ts +9 -0
  101. package/lib/init/register-typing-indicator.d.ts.map +1 -0
  102. package/lib/init/register-typing-indicator.js +206 -0
  103. package/lib/init/register-typing-indicator.js.map +1 -0
  104. package/lib/init.d.ts.map +1 -1
  105. package/lib/init.js +2 -0
  106. package/lib/init.js.map +1 -1
  107. package/lib/mcp-client/connection.d.ts +2 -0
  108. package/lib/mcp-client/connection.d.ts.map +1 -1
  109. package/lib/mcp-client/connection.js +7 -0
  110. package/lib/mcp-client/connection.js.map +1 -1
  111. package/lib/mcp-client/index.d.ts +2 -0
  112. package/lib/mcp-client/index.d.ts.map +1 -1
  113. package/lib/mcp-client/index.js +19 -2
  114. package/lib/mcp-client/index.js.map +1 -1
  115. package/lib/monitoring/index.d.ts +79 -0
  116. package/lib/monitoring/index.d.ts.map +1 -0
  117. package/lib/monitoring/index.js +197 -0
  118. package/lib/monitoring/index.js.map +1 -0
  119. package/lib/monitoring/metrics.d.ts +240 -0
  120. package/lib/monitoring/metrics.d.ts.map +1 -0
  121. package/lib/monitoring/metrics.js +483 -0
  122. package/lib/monitoring/metrics.js.map +1 -0
  123. package/lib/orchestrator/agent-dispatcher.d.ts +170 -0
  124. package/lib/orchestrator/agent-dispatcher.d.ts.map +1 -0
  125. package/lib/orchestrator/agent-dispatcher.js +379 -0
  126. package/lib/orchestrator/agent-dispatcher.js.map +1 -0
  127. package/lib/orchestrator/hook-registry.d.ts.map +1 -1
  128. package/lib/orchestrator/hook-registry.js +2 -0
  129. package/lib/orchestrator/hook-registry.js.map +1 -1
  130. package/lib/orchestrator/index.d.ts +2 -0
  131. package/lib/orchestrator/index.d.ts.map +1 -1
  132. package/lib/orchestrator/index.js +2 -0
  133. package/lib/orchestrator/index.js.map +1 -1
  134. package/lib/orchestrator/mcp-lifecycle.d.ts +1 -1
  135. package/lib/orchestrator/mcp-lifecycle.d.ts.map +1 -1
  136. package/lib/orchestrator/mcp-lifecycle.js +2 -2
  137. package/lib/orchestrator/mcp-lifecycle.js.map +1 -1
  138. package/lib/orchestrator/mcp-registry.d.ts +8 -1
  139. package/lib/orchestrator/mcp-registry.d.ts.map +1 -1
  140. package/lib/orchestrator/mcp-registry.js +28 -5
  141. package/lib/orchestrator/mcp-registry.js.map +1 -1
  142. package/lib/orchestrator/task-queue.d.ts +147 -0
  143. package/lib/orchestrator/task-queue.d.ts.map +1 -0
  144. package/lib/orchestrator/task-queue.js +337 -0
  145. package/lib/orchestrator/task-queue.js.map +1 -0
  146. package/lib/orchestrator/tool-selection.d.ts.map +1 -1
  147. package/lib/orchestrator/tool-selection.js +3 -0
  148. package/lib/orchestrator/tool-selection.js.map +1 -1
  149. package/lib/orchestrator/types.d.ts +8 -0
  150. package/lib/orchestrator/types.d.ts.map +1 -1
  151. package/lib/plugin-ai-hook-bus.d.ts +4 -0
  152. package/lib/plugin-ai-hook-bus.d.ts.map +1 -0
  153. package/lib/plugin-ai-hook-bus.js +24 -0
  154. package/lib/plugin-ai-hook-bus.js.map +1 -0
  155. package/lib/security/anomaly-detection.d.ts +119 -0
  156. package/lib/security/anomaly-detection.d.ts.map +1 -0
  157. package/lib/security/anomaly-detection.js +305 -0
  158. package/lib/security/anomaly-detection.js.map +1 -0
  159. package/lib/security/audit-logger.d.ts +158 -0
  160. package/lib/security/audit-logger.d.ts.map +1 -0
  161. package/lib/security/audit-logger.js +379 -0
  162. package/lib/security/audit-logger.js.map +1 -0
  163. package/lib/security/bash-tool-context.d.ts +3 -3
  164. package/lib/security/bash-tool-context.d.ts.map +1 -1
  165. package/lib/security/budget-limiter.d.ts +156 -0
  166. package/lib/security/budget-limiter.d.ts.map +1 -0
  167. package/lib/security/budget-limiter.js +363 -0
  168. package/lib/security/budget-limiter.js.map +1 -0
  169. package/lib/security/dangerous-tool-policy.d.ts +17 -0
  170. package/lib/security/dangerous-tool-policy.d.ts.map +1 -0
  171. package/lib/security/dangerous-tool-policy.js +137 -0
  172. package/lib/security/dangerous-tool-policy.js.map +1 -0
  173. package/lib/security/exec-policy.d.ts +21 -12
  174. package/lib/security/exec-policy.d.ts.map +1 -1
  175. package/lib/security/exec-policy.js +198 -25
  176. package/lib/security/exec-policy.js.map +1 -1
  177. package/lib/security/file-policy.d.ts +0 -1
  178. package/lib/security/file-policy.d.ts.map +1 -1
  179. package/lib/security/file-policy.js +112 -14
  180. package/lib/security/file-policy.js.map +1 -1
  181. package/lib/security/file-role-policy.d.ts +119 -0
  182. package/lib/security/file-role-policy.d.ts.map +1 -0
  183. package/lib/security/file-role-policy.js +268 -0
  184. package/lib/security/file-role-policy.js.map +1 -0
  185. package/lib/security/index.d.ts +59 -0
  186. package/lib/security/index.d.ts.map +1 -1
  187. package/lib/security/index.js +68 -0
  188. package/lib/security/index.js.map +1 -1
  189. package/lib/security/network-policy.d.ts +94 -0
  190. package/lib/security/network-policy.d.ts.map +1 -0
  191. package/lib/security/network-policy.js +291 -0
  192. package/lib/security/network-policy.js.map +1 -0
  193. package/lib/security/owner-approve-always-store.d.ts +2 -0
  194. package/lib/security/owner-approve-always-store.d.ts.map +1 -1
  195. package/lib/security/owner-approve-always-store.js +37 -0
  196. package/lib/security/owner-approve-always-store.js.map +1 -1
  197. package/lib/security/sandbox-enhanced.d.ts +170 -0
  198. package/lib/security/sandbox-enhanced.d.ts.map +1 -0
  199. package/lib/security/sandbox-enhanced.js +630 -0
  200. package/lib/security/sandbox-enhanced.js.map +1 -0
  201. package/lib/security/sandbox.d.ts +104 -0
  202. package/lib/security/sandbox.d.ts.map +1 -0
  203. package/lib/security/sandbox.js +373 -0
  204. package/lib/security/sandbox.js.map +1 -0
  205. package/lib/security/security-config.example.d.ts +33 -0
  206. package/lib/security/security-config.example.d.ts.map +1 -0
  207. package/lib/security/security-config.example.js +166 -0
  208. package/lib/security/security-config.example.js.map +1 -0
  209. package/lib/subagent-goal-notify.d.ts +13 -0
  210. package/lib/subagent-goal-notify.d.ts.map +1 -0
  211. package/lib/subagent-goal-notify.js +32 -0
  212. package/lib/subagent-goal-notify.js.map +1 -0
  213. package/lib/subagent.d.ts +24 -0
  214. package/lib/subagent.d.ts.map +1 -1
  215. package/lib/subagent.js +98 -16
  216. package/lib/subagent.js.map +1 -1
  217. package/lib/typing-indicator/adapter-integration.d.ts +140 -0
  218. package/lib/typing-indicator/adapter-integration.d.ts.map +1 -0
  219. package/lib/typing-indicator/adapter-integration.js +473 -0
  220. package/lib/typing-indicator/adapter-integration.js.map +1 -0
  221. package/lib/typing-indicator/index.d.ts +170 -0
  222. package/lib/typing-indicator/index.d.ts.map +1 -0
  223. package/lib/typing-indicator/index.js +311 -0
  224. package/lib/typing-indicator/index.js.map +1 -0
  225. package/lib/typing-indicator/integration.d.ts +91 -0
  226. package/lib/typing-indicator/integration.d.ts.map +1 -0
  227. package/lib/typing-indicator/integration.js +219 -0
  228. package/lib/typing-indicator/integration.js.map +1 -0
  229. package/lib/zhin-agent/config.d.ts +20 -2
  230. package/lib/zhin-agent/config.d.ts.map +1 -1
  231. package/lib/zhin-agent/config.js +27 -9
  232. package/lib/zhin-agent/config.js.map +1 -1
  233. package/lib/zhin-agent/event-emitter.d.ts +11 -0
  234. package/lib/zhin-agent/event-emitter.d.ts.map +1 -0
  235. package/lib/zhin-agent/event-emitter.js +43 -0
  236. package/lib/zhin-agent/event-emitter.js.map +1 -0
  237. package/lib/zhin-agent/index.d.ts +9 -31
  238. package/lib/zhin-agent/index.d.ts.map +1 -1
  239. package/lib/zhin-agent/index.js +70 -672
  240. package/lib/zhin-agent/index.js.map +1 -1
  241. package/lib/zhin-agent/llm-runner.d.ts +16 -0
  242. package/lib/zhin-agent/llm-runner.d.ts.map +1 -0
  243. package/lib/zhin-agent/llm-runner.js +85 -0
  244. package/lib/zhin-agent/llm-runner.js.map +1 -0
  245. package/lib/zhin-agent/model-resolver.d.ts +9 -0
  246. package/lib/zhin-agent/model-resolver.d.ts.map +1 -0
  247. package/lib/zhin-agent/model-resolver.js +25 -0
  248. package/lib/zhin-agent/model-resolver.js.map +1 -0
  249. package/lib/zhin-agent/phase-trace.d.ts +12 -0
  250. package/lib/zhin-agent/phase-trace.d.ts.map +1 -0
  251. package/lib/zhin-agent/phase-trace.js +24 -0
  252. package/lib/zhin-agent/phase-trace.js.map +1 -0
  253. package/lib/zhin-agent/prompt-assembly.d.ts +22 -0
  254. package/lib/zhin-agent/prompt-assembly.d.ts.map +1 -0
  255. package/lib/zhin-agent/prompt-assembly.js +66 -0
  256. package/lib/zhin-agent/prompt-assembly.js.map +1 -0
  257. package/lib/zhin-agent/prompt-builder.d.ts +200 -0
  258. package/lib/zhin-agent/prompt-builder.d.ts.map +1 -0
  259. package/lib/zhin-agent/prompt-builder.js +574 -0
  260. package/lib/zhin-agent/prompt-builder.js.map +1 -0
  261. package/lib/zhin-agent/prompt-templates.d.ts +160 -0
  262. package/lib/zhin-agent/prompt-templates.d.ts.map +1 -0
  263. package/lib/zhin-agent/prompt-templates.js +436 -0
  264. package/lib/zhin-agent/prompt-templates.js.map +1 -0
  265. package/lib/zhin-agent/prompt.d.ts +15 -0
  266. package/lib/zhin-agent/prompt.d.ts.map +1 -1
  267. package/lib/zhin-agent/prompt.js +149 -4
  268. package/lib/zhin-agent/prompt.js.map +1 -1
  269. package/lib/zhin-agent/session-io.d.ts +10 -0
  270. package/lib/zhin-agent/session-io.d.ts.map +1 -0
  271. package/lib/zhin-agent/session-io.js +14 -0
  272. package/lib/zhin-agent/session-io.js.map +1 -0
  273. package/lib/zhin-agent/task-continuation.d.ts +144 -0
  274. package/lib/zhin-agent/task-continuation.d.ts.map +1 -0
  275. package/lib/zhin-agent/task-continuation.js +346 -0
  276. package/lib/zhin-agent/task-continuation.js.map +1 -0
  277. package/lib/zhin-agent/text-sanitize.d.ts +2 -5
  278. package/lib/zhin-agent/text-sanitize.d.ts.map +1 -1
  279. package/lib/zhin-agent/text-sanitize.js +2 -25
  280. package/lib/zhin-agent/text-sanitize.js.map +1 -1
  281. package/lib/zhin-agent/tool-calls-user-format.d.ts.map +1 -1
  282. package/lib/zhin-agent/tool-calls-user-format.js +12 -3
  283. package/lib/zhin-agent/tool-calls-user-format.js.map +1 -1
  284. package/lib/zhin-agent/tool-orchestration.d.ts +9 -0
  285. package/lib/zhin-agent/tool-orchestration.d.ts.map +1 -0
  286. package/lib/zhin-agent/tool-orchestration.js +68 -0
  287. package/lib/zhin-agent/tool-orchestration.js.map +1 -0
  288. package/lib/zhin-agent/tool-search-orchestrator.d.ts.map +1 -1
  289. package/lib/zhin-agent/tool-search-orchestrator.js +5 -2
  290. package/lib/zhin-agent/tool-search-orchestrator.js.map +1 -1
  291. package/lib/zhin-agent/turn-pipeline.d.ts +5 -0
  292. package/lib/zhin-agent/turn-pipeline.d.ts.map +1 -0
  293. package/lib/zhin-agent/turn-pipeline.js +541 -0
  294. package/lib/zhin-agent/turn-pipeline.js.map +1 -0
  295. package/lib/zhin-agent/turn-tracker.d.ts +17 -0
  296. package/lib/zhin-agent/turn-tracker.d.ts.map +1 -0
  297. package/lib/zhin-agent/turn-tracker.js +54 -0
  298. package/lib/zhin-agent/turn-tracker.js.map +1 -0
  299. package/lib/zhin-agent/web-search-locale-attach.d.ts +4 -0
  300. package/lib/zhin-agent/web-search-locale-attach.d.ts.map +1 -0
  301. package/lib/zhin-agent/web-search-locale-attach.js +19 -0
  302. package/lib/zhin-agent/web-search-locale-attach.js.map +1 -0
  303. package/lib/zhin-agent/zhin-agent-private.d.ts +66 -0
  304. package/lib/zhin-agent/zhin-agent-private.d.ts.map +1 -0
  305. package/lib/zhin-agent/zhin-agent-private.js +4 -0
  306. package/lib/zhin-agent/zhin-agent-private.js.map +1 -0
  307. package/package.json +5 -5
@@ -1,18 +1,18 @@
1
1
  /**
2
2
  * ZhinAgent 执行策略 — bash 命令的安全检查与工具包装
3
3
  *
4
- * 参考 Claude Code bashPermissions.ts 的纵深防御策略:
5
4
  * 1. 危险命令黑名单 — 即使 full 模式也阻止解释器/提权命令
6
5
  * 2. 环境变量前缀剥离 — `FOO=bar cmd` → 按 `cmd` 做白名单匹配
7
6
  * 3. Safe wrapper 剥离 — `timeout 10 cmd` → 按 `cmd` 做匹配
8
7
  * 4. 复合命令拆分 — `&&` `||` `;` 逐段独立检查,deny 优先
9
8
  * 5. 只读命令自动放行 — 与 file-policy classifyBashCommand 集成
10
- * 6. Owner 信号 — execAsk=true 时返回需审批(ZHIN_NEEDS_OWNER),由编排层可硬触发 ask_user
9
+ * 6. Owner 信号 — execApprovalMode=ask 时返回需审批(ZHIN_NEEDS_OWNER),由编排层可硬触发 ask_user
11
10
  */
12
11
  import { getPlugin } from '@zhin.js/core';
13
12
  import { classifyBashCommand } from './file-policy.js';
14
- import { getCurrentBashToolContext, isDirectAgentExecution } from './bash-tool-context.js';
15
- import { isIcqqSensitiveSubcommand, matchesBashOwnerExecBypass, } from './owner-approve-always-store.js';
13
+ import { getCurrentBashToolContext } from './bash-tool-context.js';
14
+ import { isIcqqSensitiveSubcommand, matchesBashOwnerExecBypass, resolveToolRequesterRole, } from './owner-approve-always-store.js';
15
+ import { getAuditLogger } from './audit-logger.js';
16
16
  // ── 预设命令白名单 ──────────────────────────────────────────────────
17
17
  const PRESET_READONLY = ['ls', 'cat', 'pwd', 'date', 'whoami', 'grep', 'find', 'head', 'tail', 'wc', 'stat', 'file'];
18
18
  const PRESET_NETWORK = [...PRESET_READONLY, 'curl', 'wget', 'ping', 'dig', 'nslookup', 'host'];
@@ -22,7 +22,7 @@ export const EXEC_PRESETS = {
22
22
  network: PRESET_NETWORK,
23
23
  development: PRESET_DEVELOPMENT,
24
24
  };
25
- // ── 危险命令黑名单(参考 Claude Code DANGEROUS_COMMANDS)──────────────
25
+ // ── 危险命令黑名单──────────────
26
26
  /**
27
27
  * 即使在 full 模式下也会被阻止的危险命令。
28
28
  * 这些命令可以执行任意代码、提权或造成不可逆破坏。
@@ -39,24 +39,70 @@ const DANGEROUS_COMMANDS = new Set([
39
39
  // 环境注入(敏感变量可被设置)
40
40
  'export',
41
41
  ]);
42
+ /**
43
+ * 无论审批模式如何都禁止的破坏性路径操作(避免误删依赖目录)。
44
+ */
42
45
  /**
43
46
  * 检查命令是否在危险黑名单中。
44
47
  */
45
48
  export function isDangerousCommand(cmdName) {
46
49
  return DANGEROUS_COMMANDS.has(cmdName);
47
50
  }
48
- // ── 环境变量前缀剥离(参考 Claude Code stripEnvVars)──────────────
51
+ function matchHardBlockedCommand(command) {
52
+ const lower = command.trim().toLowerCase();
53
+ if (/\b(?:rm|rmdir)\b/.test(lower) && lower.includes('node_modules')) {
54
+ return '拒绝删除依赖目录 node_modules(高风险破坏操作)。';
55
+ }
56
+ if (lower.includes('find') && lower.includes('node_modules') && lower.includes('-delete')) {
57
+ return '拒绝通过 find -delete 删除 node_modules(高风险破坏操作)。';
58
+ }
59
+ return undefined;
60
+ }
61
+ // ── 环境变量前缀剥离──────────────
49
62
  /**
50
63
  * 剥离命令前面的 `KEY=value` 环境变量前缀。
51
64
  * 例如 `FOO=bar BAZ=1 curl http://...` → `curl http://...`
52
65
  *
53
66
  * 只剥离安全的 key=value 对,不剥离含特殊字符的值(可能是注入)。
54
67
  */
68
+ function tryStripOneEnvAssignment(command) {
69
+ const trimmed = command.trimStart();
70
+ const keyMatch = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)=/);
71
+ if (!keyMatch)
72
+ return { rest: command, stripped: false };
73
+ let i = keyMatch[0].length;
74
+ const ch = trimmed[i];
75
+ if (ch === "'") {
76
+ const end = trimmed.indexOf("'", i + 1);
77
+ if (end === -1)
78
+ return { rest: command, stripped: false };
79
+ i = end + 1;
80
+ }
81
+ else if (ch === '"') {
82
+ const end = trimmed.indexOf('"', i + 1);
83
+ if (end === -1)
84
+ return { rest: command, stripped: false };
85
+ i = end + 1;
86
+ }
87
+ else {
88
+ while (i < trimmed.length && !/[\s;|&]/.test(trimmed[i]))
89
+ i++;
90
+ }
91
+ while (i < trimmed.length && /\s/.test(trimmed[i]))
92
+ i++;
93
+ return { rest: trimmed.slice(i), stripped: true };
94
+ }
55
95
  export function stripEnvVarPrefix(command) {
56
- // env 前缀环境变量格式: WORD=VALUE (VALUE 可以被引号或不含空格的字符串)
57
- return command.replace(/^(\s*[A-Za-z_][A-Za-z0-9_]*=(('[^']*'|"[^"]*"|[^\s;|&]*))\s*)+/, '').trim();
96
+ let rest = command;
97
+ for (let n = 0; n < 32; n++) {
98
+ const next = tryStripOneEnvAssignment(rest);
99
+ if (!next.stripped)
100
+ break;
101
+ rest = next.rest;
102
+ }
103
+ return rest.trim();
58
104
  }
59
- // ── Safe wrapper 剥离(参考 Claude Code stripSafeWrappers)──────────
105
+ // ── Safe wrapper 剥离──────────────
60
106
  /**
61
107
  * Safe wrapper 命令列表 — 这些命令本身是安全的"包装器",
62
108
  * 真正需要检查的是它们后面的实际命令。
@@ -92,7 +138,7 @@ export function stripSafeWrappers(command) {
92
138
  }
93
139
  return remaining;
94
140
  }
95
- // ── 复合命令拆分(参考 Claude Code compound command checking)──────
141
+ // ── 复合命令拆分──────────────
96
142
  /**
97
143
  * 将复合命令按 `&&`, `||`, `;` 拆分为独立子命令。
98
144
  * 管道 `|` 不拆分 — 管道中的只读性由 classifyBashCommand 判断。
@@ -100,8 +146,32 @@ export function stripSafeWrappers(command) {
100
146
  * 注意:不处理 subshell `$(...)` 和反引号 — 这些场景由危险黑名单覆盖。
101
147
  */
102
148
  export function splitCompoundCommand(command) {
103
- // &&, ||, ; 拆分,保留管道作为整体
104
- return command.split(/\s*(?:&&|\|\||;)\s*/).map(s => s.trim()).filter(Boolean);
149
+ const parts = [];
150
+ let current = '';
151
+ let i = 0;
152
+ while (i < command.length) {
153
+ if (command.startsWith('&&', i) || command.startsWith('||', i) || command[i] === ';') {
154
+ const trimmed = current.trim();
155
+ if (trimmed)
156
+ parts.push(trimmed);
157
+ current = '';
158
+ if (command.startsWith('&&', i))
159
+ i += 2;
160
+ else if (command.startsWith('||', i))
161
+ i += 2;
162
+ else
163
+ i += 1;
164
+ while (i < command.length && /\s/.test(command[i]))
165
+ i++;
166
+ continue;
167
+ }
168
+ current += command[i];
169
+ i++;
170
+ }
171
+ const tail = current.trim();
172
+ if (tail)
173
+ parts.push(tail);
174
+ return parts;
105
175
  }
106
176
  /**
107
177
  * 从命令字符串中提取实际的可执行程序名。
@@ -113,6 +183,24 @@ export function extractCommandName(command) {
113
183
  const name = stripped.split(/[\s|]/)[0] || '';
114
184
  return name;
115
185
  }
186
+ /**
187
+ * 解析有效审批模式。
188
+ */
189
+ export function resolveExecApprovalMode(config) {
190
+ return config.execApprovalMode;
191
+ }
192
+ function resolveRequesterRole() {
193
+ const ctx = getCurrentBashToolContext();
194
+ if (!ctx?.platform || !ctx?.botId || !ctx?.senderId)
195
+ return 'unknown';
196
+ try {
197
+ const plugin = getPlugin().root ?? getPlugin();
198
+ return resolveToolRequesterRole(plugin, ctx);
199
+ }
200
+ catch {
201
+ return 'unknown';
202
+ }
203
+ }
116
204
  // ── 核心检查函数 ────────────────────────────────────────────────────
117
205
  /**
118
206
  * Resolves the effective allowlist by merging preset commands with custom allowlist.
@@ -140,7 +228,11 @@ function tryExecBypassForSensitiveIcqq(normalizedSubCommand) {
140
228
  * 检查单条子命令是否允许执行。
141
229
  * 内部函数 — 不做复合命令拆分。
142
230
  */
143
- function checkSingleCommand(cmdName, fullSubCommand, allowlist, security, execAsk) {
231
+ function checkSingleCommand(cmdName, fullSubCommand, allowlist, security, approvalMode, requesterRole) {
232
+ const hardBlockedReason = matchHardBlockedCommand(fullSubCommand);
233
+ if (hardBlockedReason) {
234
+ return { allowed: false, reason: hardBlockedReason };
235
+ }
144
236
  // 1. 危险黑名单 — 任何模式都拒绝
145
237
  if (isDangerousCommand(cmdName)) {
146
238
  return { allowed: false, reason: `拒绝执行危险命令「${cmdName}」— 该命令可提权或执行任意代码。` };
@@ -163,7 +255,26 @@ function checkSingleCommand(cmdName, fullSubCommand, allowlist, security, execAs
163
255
  if (tryExecBypassForSensitiveIcqq(norm)) {
164
256
  return { allowed: true };
165
257
  }
166
- if (execAsk) {
258
+ if (requesterRole === 'owner') {
259
+ return { allowed: true };
260
+ }
261
+ if (requesterRole === 'admin') {
262
+ return {
263
+ allowed: false,
264
+ needsApproval: true,
265
+ reason: `icqq 敏感操作不在 execAllowlist,需 Owner 确认:${norm.slice(0, 280)}`,
266
+ };
267
+ }
268
+ if (requesterRole === 'other') {
269
+ return {
270
+ allowed: false,
271
+ reason: `icqq 敏感操作仅允许 owner 直接执行;admin 需 Owner 审批:${norm.slice(0, 280)}`,
272
+ };
273
+ }
274
+ if (approvalMode === 'allow') {
275
+ return { allowed: true };
276
+ }
277
+ if (approvalMode === 'ask') {
167
278
  return {
168
279
  allowed: false,
169
280
  needsApproval: true,
@@ -172,7 +283,7 @@ function checkSingleCommand(cmdName, fullSubCommand, allowlist, security, execAs
172
283
  }
173
284
  return {
174
285
  allowed: false,
175
- reason: `icqq 敏感操作已被拒绝(未开启 execAsk):${norm.slice(0, 280)}`,
286
+ reason: `icqq 敏感操作已被拒绝(execApprovalMode=deny):${norm.slice(0, 280)}`,
176
287
  };
177
288
  }
178
289
  // 4. 白名单匹配
@@ -188,8 +299,27 @@ function checkSingleCommand(cmdName, fullSubCommand, allowlist, security, execAs
188
299
  if (allowed) {
189
300
  return { allowed: true };
190
301
  }
302
+ if (requesterRole === 'owner') {
303
+ return { allowed: true };
304
+ }
305
+ if (requesterRole === 'admin') {
306
+ return {
307
+ allowed: false,
308
+ needsApproval: true,
309
+ reason: `命令「${cmdName}」不在 execAllowlist,需 Owner 确认后执行。`,
310
+ };
311
+ }
312
+ if (requesterRole === 'other') {
313
+ return {
314
+ allowed: false,
315
+ reason: `命令「${cmdName}」不在 execAllowlist,且发起者不是 owner/admin,已拒绝。`,
316
+ };
317
+ }
191
318
  // 5. 需审批或拒绝
192
- if (execAsk) {
319
+ if (approvalMode === 'allow') {
320
+ return { allowed: true };
321
+ }
322
+ if (approvalMode === 'ask') {
193
323
  return {
194
324
  allowed: false,
195
325
  needsApproval: true,
@@ -210,10 +340,20 @@ function checkSingleCommand(cmdName, fullSubCommand, allowlist, security, execAs
210
340
  export function checkExecPolicy(config, command) {
211
341
  const security = config.execSecurity ?? 'deny';
212
342
  if (security === 'deny') {
213
- return { allowed: false, reason: '当前配置禁止执行 Shell 命令(execSecurity=deny)。如需开放请在配置中设置 ai.agent.execSecurity。' };
343
+ const result = { allowed: false, reason: '当前配置禁止执行 Shell 命令(execSecurity=deny)。如需开放请在配置中设置 ai.agent.execSecurity。' };
344
+ // 记录审计日志
345
+ try {
346
+ const auditLogger = getAuditLogger();
347
+ auditLogger.logExecPolicy(command, false, result.reason);
348
+ }
349
+ catch {
350
+ // 忽略审计日志错误
351
+ }
352
+ return result;
214
353
  }
215
354
  const allowlist = resolveExecAllowlist(config);
216
- const execAsk = config.execAsk ?? false;
355
+ const approvalMode = resolveExecApprovalMode(config);
356
+ const requesterRole = resolveRequesterRole();
217
357
  const cmd = (command || '').trim();
218
358
  if (!cmd) {
219
359
  return { allowed: false, reason: '命令为空' };
@@ -225,9 +365,17 @@ export function checkExecPolicy(config, command) {
225
365
  const cmdName = extractCommandName(sub);
226
366
  if (!cmdName)
227
367
  continue;
228
- const result = checkSingleCommand(cmdName, sub, allowlist, security, execAsk);
368
+ const result = checkSingleCommand(cmdName, sub, allowlist, security, approvalMode, requesterRole);
229
369
  // deny 立即返回(deny > ask 优先级)
230
370
  if (!result.allowed && !result.needsApproval) {
371
+ // 记录审计日志
372
+ try {
373
+ const auditLogger = getAuditLogger();
374
+ auditLogger.logExecPolicy(sub, false, result.reason);
375
+ }
376
+ catch {
377
+ // 忽略审计日志错误
378
+ }
231
379
  return result;
232
380
  }
233
381
  // 记录第一个需要审批的
@@ -237,15 +385,41 @@ export function checkExecPolicy(config, command) {
237
385
  }
238
386
  // 有需要审批的段
239
387
  if (pendingApproval) {
388
+ // 记录审计日志
389
+ try {
390
+ const auditLogger = getAuditLogger();
391
+ auditLogger.logExecPolicy(cmd, false, pendingApproval.reason);
392
+ }
393
+ catch {
394
+ // 忽略审计日志错误
395
+ }
240
396
  return pendingApproval;
241
397
  }
398
+ // 记录成功的审计日志
399
+ try {
400
+ const auditLogger = getAuditLogger();
401
+ auditLogger.logExecPolicy(cmd, true);
402
+ }
403
+ catch {
404
+ // 忽略审计日志错误
405
+ }
242
406
  return { allowed: true };
243
407
  }
408
+ export function checkExecPolicyWithOptions(config, command, options = {}) {
409
+ if (!options.approvalMode) {
410
+ return checkExecPolicy(config, command);
411
+ }
412
+ const shadowConfig = {
413
+ ...config,
414
+ execApprovalMode: options.approvalMode,
415
+ };
416
+ return checkExecPolicy(shadowConfig, command);
417
+ }
244
418
  /**
245
419
  * Wrap `bash` tools with exec policy enforcement.
246
- * 当 execAsk=true 且命令需审批时,返回提示信息而非抛错。
420
+ * 当 execApprovalMode=ask 且命令需审批时,返回提示信息而非抛错。
247
421
  */
248
- export function applyExecPolicyToTools(config, tools) {
422
+ export function applyExecPolicyToTools(config, tools, options = {}) {
249
423
  return tools.map(t => {
250
424
  if (t.name !== 'bash')
251
425
  return t;
@@ -254,12 +428,11 @@ export function applyExecPolicyToTools(config, tools) {
254
428
  ...t,
255
429
  execute: async (args) => {
256
430
  const cmd = args?.command != null ? String(args.command) : '';
257
- const result = checkExecPolicy(config, cmd);
431
+ const result = checkExecPolicyWithOptions(config, cmd, {
432
+ approvalMode: options.approvalMode,
433
+ });
258
434
  if (!result.allowed) {
259
435
  if (result.needsApproval) {
260
- if (isDirectAgentExecution()) {
261
- return original(args);
262
- }
263
436
  // 权威首行 + 正文:硬编排识别;与旧「请使用 ask_user」话术合并为单套
264
437
  return `ZHIN_NEEDS_OWNER:\n⚠️ ${result.reason}\n\n此 shell 命令需 Bot Owner 审批后方可执行。`;
265
438
  }
@@ -1 +1 @@
1
- {"version":3,"file":"exec-policy.js","sourceRoot":"","sources":["../../src/security/exec-policy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"exec-policy.js","sourceRoot":"","sources":["../../src/security/exec-policy.ts"],"names":[],"mappings":"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"}
@@ -56,7 +56,6 @@ export interface BashCommandClassification {
56
56
  * 对管道命令(如 `cat file | grep pattern`),所有非中性部分
57
57
  * 都必须是搜索/读/列出类,整条命令才算只读。
58
58
  *
59
- * 参考 Claude Code BashTool `isSearchOrReadBashCommand`。
60
59
  */
61
60
  export declare function classifyBashCommand(command: string): BashCommandClassification;
62
61
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"file-policy.d.ts","sourceRoot":"","sources":["../../src/security/file-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA8BH;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQ7D;AAID,gCAAgC;AAChC,eAAO,MAAM,kBAAkB,QAAoB,CAAC;AACpD,qCAAqC;AACrC,eAAO,MAAM,kBAAkB,QAAqB,CAAC;AA2ErD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAiBD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,qBAAqB,CAoCvE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAKvD;AAYD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAoB1F;AAyBD,MAAM,WAAW,yBAAyB;IACxC,cAAc;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,4BAA4B;IAC5B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,yBAAyB,CAsC9E;AAID;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIpE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAG7E;AAID;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C"}
1
+ {"version":3,"file":"file-policy.d.ts","sourceRoot":"","sources":["../../src/security/file-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA+BH;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQ7D;AAID,gCAAgC;AAChC,eAAO,MAAM,kBAAkB,QAAoB,CAAC;AACpD,qCAAqC;AACrC,eAAO,MAAM,kBAAkB,QAAqB,CAAC;AA2ErD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAiBD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,qBAAqB,CAoFvE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAKvD;AA8DD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAoB1F;AAyBD,MAAM,WAAW,yBAAyB;IACxC,cAAc;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,4BAA4B;IAC5B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,yBAAyB,CAqC9E;AAID;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIpE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAG7E;AAID;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C"}
@@ -12,7 +12,8 @@
12
12
  */
13
13
  import * as path from 'node:path';
14
14
  import * as os from 'node:os';
15
- // ── 设备路径阻止(参考 Claude Code FileReadTool BLOCKED_DEVICE_PATHS)──
15
+ import { getAuditLogger } from './audit-logger.js';
16
+ // ── 设备路径阻止──────────────
16
17
  /**
17
18
  * 会导致进程挂起的设备文件路径。
18
19
  * 检查纯路径即可(无 I/O),安全设备如 /dev/null 不在此列。
@@ -47,7 +48,7 @@ export function isBlockedDevicePath(filePath) {
47
48
  return true;
48
49
  return false;
49
50
  }
50
- // ── 文件大小限制(参考 Claude Code FileEditTool MAX_EDIT_FILE_SIZE)──
51
+ // ── 文件大小限制──────────────
51
52
  /** 读取文件最大字节数(256 MiB),防止 OOM */
52
53
  export const MAX_READ_FILE_SIZE = 256 * 1024 * 1024;
53
54
  /** 编辑文件最大字节数(1 GiB),防止 V8 字符串长度溢出 */
@@ -143,29 +144,73 @@ export function checkFileAccess(filePath) {
143
144
  // 1. 检查敏感路径前缀
144
145
  for (const prefix of SENSITIVE_PATH_PREFIXES) {
145
146
  if (normalizedCandidates.some(candidate => candidate.startsWith(prefix))) {
146
- return { allowed: false, reason: `拒绝访问系统敏感文件: ${prefix}` };
147
+ const result = { allowed: false, reason: `拒绝访问系统敏感文件: ${prefix}` };
148
+ // 记录审计日志
149
+ try {
150
+ const auditLogger = getAuditLogger();
151
+ auditLogger.logFileAccess(filePath, false, result.reason);
152
+ }
153
+ catch {
154
+ // 忽略审计日志错误
155
+ }
156
+ return result;
147
157
  }
148
158
  }
149
159
  // 2. 检查敏感目录
150
160
  const parts = normalizePathSeparators(resolved).split('/');
151
161
  for (let i = 0; i < parts.length; i++) {
152
162
  if (SENSITIVE_DIR_NAMES.has(parts[i])) {
153
- return { allowed: false, reason: `拒绝访问敏感目录: ${parts[i]}` };
163
+ const result = { allowed: false, reason: `拒绝访问敏感目录: ${parts[i]}` };
164
+ // 记录审计日志
165
+ try {
166
+ const auditLogger = getAuditLogger();
167
+ auditLogger.logFileAccess(filePath, false, result.reason);
168
+ }
169
+ catch {
170
+ // 忽略审计日志错误
171
+ }
172
+ return result;
154
173
  }
155
174
  // 对多级目录名做拼接检查(如 .config/gcloud)
156
175
  if (i > 0) {
157
176
  const twoLevel = `${parts[i - 1]}/${parts[i]}`;
158
177
  if (SENSITIVE_DIR_NAMES.has(twoLevel)) {
159
- return { allowed: false, reason: `拒绝访问敏感目录: ${twoLevel}` };
178
+ const result = { allowed: false, reason: `拒绝访问敏感目录: ${twoLevel}` };
179
+ // 记录审计日志
180
+ try {
181
+ const auditLogger = getAuditLogger();
182
+ auditLogger.logFileAccess(filePath, false, result.reason);
183
+ }
184
+ catch {
185
+ // 忽略审计日志错误
186
+ }
187
+ return result;
160
188
  }
161
189
  }
162
190
  }
163
191
  // 3. 检查敏感文件名
164
192
  for (const pattern of SENSITIVE_BASENAME_PATTERNS) {
165
193
  if (pattern.test(basename)) {
166
- return { allowed: false, reason: `拒绝访问敏感文件: ${basename} 可能包含密钥或凭据` };
194
+ const result = { allowed: false, reason: `拒绝访问敏感文件: ${basename} 可能包含密钥或凭据` };
195
+ // 记录审计日志
196
+ try {
197
+ const auditLogger = getAuditLogger();
198
+ auditLogger.logFileAccess(filePath, false, result.reason);
199
+ }
200
+ catch {
201
+ // 忽略审计日志错误
202
+ }
203
+ return result;
167
204
  }
168
205
  }
206
+ // 记录成功的审计日志
207
+ try {
208
+ const auditLogger = getAuditLogger();
209
+ auditLogger.logFileAccess(filePath, true);
210
+ }
211
+ catch {
212
+ // 忽略审计日志错误
213
+ }
169
214
  return { allowed: true };
170
215
  }
171
216
  /**
@@ -185,7 +230,62 @@ export function assertFileAccess(filePath) {
185
230
  */
186
231
  const ENV_DUMP_COMMANDS = /^\s*(env|printenv|export|set)\b/;
187
232
  const ENV_ECHO_PATTERN = /\$\{?\w*(KEY|SECRET|TOKEN|PASSWORD|PASS|CREDENTIAL|AUTH|APIKEY|API_KEY)\w*\}?/i;
188
- const ENV_CAT_SENSITIVE = /\bcat\b.*\.(env|pem|key|p12|pfx)\b/i;
233
+ function splitPipeSegments(command) {
234
+ const parts = [];
235
+ let current = '';
236
+ for (let i = 0; i < command.length; i++) {
237
+ if (command[i] === '|' && command[i + 1] !== '|') {
238
+ const seg = current.trim();
239
+ if (seg)
240
+ parts.push(seg);
241
+ current = '';
242
+ continue;
243
+ }
244
+ current += command[i];
245
+ }
246
+ const tail = current.trim();
247
+ if (tail)
248
+ parts.push(tail);
249
+ return parts;
250
+ }
251
+ function isCatSensitiveFile(command) {
252
+ const lower = command.toLowerCase();
253
+ if (!/\bcat\b/.test(lower))
254
+ return false;
255
+ return (lower.includes('.env') ||
256
+ lower.includes('.pem') ||
257
+ lower.includes('.key') ||
258
+ lower.includes('.p12') ||
259
+ lower.includes('.pfx'));
260
+ }
261
+ function splitShellOperatorParts(command) {
262
+ const parts = [];
263
+ let current = '';
264
+ let i = 0;
265
+ while (i < command.length) {
266
+ if (command.startsWith('&&', i) || command.startsWith('||', i) || command[i] === ';' || command[i] === '|') {
267
+ const trimmed = current.trim();
268
+ if (trimmed)
269
+ parts.push(trimmed);
270
+ current = '';
271
+ if (command.startsWith('&&', i))
272
+ i += 2;
273
+ else if (command.startsWith('||', i))
274
+ i += 2;
275
+ else
276
+ i += 1;
277
+ while (i < command.length && /\s/.test(command[i]))
278
+ i++;
279
+ continue;
280
+ }
281
+ current += command[i];
282
+ i++;
283
+ }
284
+ const tail = current.trim();
285
+ if (tail)
286
+ parts.push(tail);
287
+ return parts;
288
+ }
189
289
  /**
190
290
  * 检查 bash 命令是否可能泄漏敏感环境变量或文件。
191
291
  * 返回 { safe: true } 或 { safe: false, reason: string }。
@@ -193,7 +293,7 @@ const ENV_CAT_SENSITIVE = /\bcat\b.*\.(env|pem|key|p12|pfx)\b/i;
193
293
  export function checkBashCommandSafety(command) {
194
294
  const trimmed = command.trim();
195
295
  // 拆管道,检查每段
196
- const segments = trimmed.split(/\s*\|\s*/);
296
+ const segments = splitPipeSegments(trimmed);
197
297
  for (const seg of segments) {
198
298
  if (ENV_DUMP_COMMANDS.test(seg)) {
199
299
  return { safe: false, reason: '禁止执行环境变量导出命令(env/printenv/export/set),可能泄漏密钥' };
@@ -202,12 +302,12 @@ export function checkBashCommandSafety(command) {
202
302
  if (ENV_ECHO_PATTERN.test(trimmed)) {
203
303
  return { safe: false, reason: '禁止通过 echo/printf 输出含密钥名的环境变量' };
204
304
  }
205
- if (ENV_CAT_SENSITIVE.test(trimmed)) {
305
+ if (isCatSensitiveFile(trimmed)) {
206
306
  return { safe: false, reason: '禁止通过 cat 读取敏感文件(.env/.pem/.key)' };
207
307
  }
208
308
  return { safe: true };
209
309
  }
210
- // ── bash 命令读写分类(参考 Claude Code BashTool isSearchOrReadBashCommand)──
310
+ // ── bash 命令读写分类──────────────
211
311
  /** 搜索类命令 */
212
312
  const BASH_SEARCH_COMMANDS = new Set([
213
313
  'find', 'grep', 'rg', 'ag', 'ack', 'locate', 'which', 'whereis',
@@ -231,12 +331,10 @@ const BASH_NEUTRAL_COMMANDS = new Set([
231
331
  * 对管道命令(如 `cat file | grep pattern`),所有非中性部分
232
332
  * 都必须是搜索/读/列出类,整条命令才算只读。
233
333
  *
234
- * 参考 Claude Code BashTool `isSearchOrReadBashCommand`。
235
334
  */
236
335
  export function classifyBashCommand(command) {
237
336
  const trimmed = command.trim();
238
- // 按管道和操作符拆分
239
- const parts = trimmed.split(/\s*(?:\|\||&&|\||;)\s*/);
337
+ const parts = splitShellOperatorParts(trimmed);
240
338
  let hasSearch = false;
241
339
  let hasRead = false;
242
340
  let hasList = false;
@@ -271,7 +369,7 @@ export function classifyBashCommand(command) {
271
369
  isReadOnly: hasSearch || hasRead || hasList,
272
370
  };
273
371
  }
274
- // ── 文件 mtime 比对(参考 Claude Code FileEditTool stale detection)──
372
+ // ── 文件 mtime 比对──────────────
275
373
  /**
276
374
  * 文件修改时间快照,用于检测编辑前是否被并发修改。
277
375
  */