@poolzin/pool-bot 2026.2.25 → 2026.2.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 (506) hide show
  1. package/dist/acp/event-mapper.js +87 -22
  2. package/dist/acp/meta.js +12 -6
  3. package/dist/agents/agent-paths.js +8 -9
  4. package/dist/agents/agent-scope.js +7 -5
  5. package/dist/agents/auth-profiles/oauth.js +148 -64
  6. package/dist/agents/auth-profiles/session-override.js +13 -7
  7. package/dist/agents/bash-tools.exec-host-gateway.js +14 -4
  8. package/dist/agents/bash-tools.exec-runtime.js +2 -25
  9. package/dist/agents/bedrock-discovery.js +3 -1
  10. package/dist/agents/byteplus-models.js +97 -0
  11. package/dist/agents/chutes-oauth.js +1 -0
  12. package/dist/agents/cli-runner/helpers.js +4 -0
  13. package/dist/agents/compaction.js +41 -14
  14. package/dist/agents/doubao-models.js +121 -0
  15. package/dist/agents/failover-error.js +2 -0
  16. package/dist/agents/huggingface-models.js +5 -3
  17. package/dist/agents/live-model-filter.js +5 -0
  18. package/dist/agents/minimax-vlm.js +10 -8
  19. package/dist/agents/model-auth.js +6 -0
  20. package/dist/agents/model-catalog.js +3 -1
  21. package/dist/agents/model-selection.js +7 -1
  22. package/dist/agents/models-config.providers.js +93 -11
  23. package/dist/agents/ollama-stream.js +117 -4
  24. package/dist/agents/opencode-zen-models.js +22 -11
  25. package/dist/agents/pi-embedded-helpers/errors.js +55 -33
  26. package/dist/agents/pi-embedded-helpers/messaging-dedupe.js +10 -5
  27. package/dist/agents/pi-embedded-helpers/thinking.js +10 -5
  28. package/dist/agents/pi-embedded-helpers.js +1 -1
  29. package/dist/agents/pi-embedded-runner/compact.js +29 -7
  30. package/dist/agents/pi-embedded-runner/extensions.js +28 -26
  31. package/dist/agents/pi-embedded-runner/google.js +20 -8
  32. package/dist/agents/pi-embedded-runner/run/attempt.js +95 -36
  33. package/dist/agents/pi-embedded-runner/run.js +71 -12
  34. package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +11 -2
  35. package/dist/agents/pi-embedded-runner/session-manager-cache.js +11 -7
  36. package/dist/agents/pi-embedded-runner/system-prompt.js +2 -0
  37. package/dist/agents/pi-embedded-runner/thinking.js +42 -0
  38. package/dist/agents/pi-embedded-runner/tool-name-allowlist.js +19 -0
  39. package/dist/agents/pi-embedded-runner/utils.js +7 -10
  40. package/dist/agents/pi-embedded-subscribe.handlers.lifecycle.js +45 -56
  41. package/dist/agents/pi-embedded-subscribe.handlers.tools.js +2 -2
  42. package/dist/agents/pi-embedded-subscribe.js +9 -4
  43. package/dist/agents/pi-embedded-subscribe.tools.js +68 -14
  44. package/dist/agents/pi-embedded-utils.js +3 -0
  45. package/dist/agents/pi-extensions/compaction-safeguard-runtime.js +4 -20
  46. package/dist/agents/pi-extensions/compaction-safeguard.js +75 -33
  47. package/dist/agents/pi-settings.js +40 -0
  48. package/dist/agents/pi-tools.policy.js +2 -1
  49. package/dist/agents/provider/config-loader.js +1 -1
  50. package/dist/agents/sandbox/browser.js +170 -33
  51. package/dist/agents/sandbox/config-hash.js +14 -27
  52. package/dist/agents/sandbox/config.js +21 -2
  53. package/dist/agents/sandbox/constants.js +2 -0
  54. package/dist/agents/sandbox/docker.js +16 -2
  55. package/dist/agents/sandbox/novnc-auth.js +62 -0
  56. package/dist/agents/sandbox/sanitize-env-vars.js +1 -1
  57. package/dist/agents/sandbox/shared.js +10 -6
  58. package/dist/agents/sandbox-paths.js +24 -11
  59. package/dist/agents/schema/clean-for-gemini.js +132 -85
  60. package/dist/agents/session-slug.js +10 -5
  61. package/dist/agents/session-tool-result-guard-wrapper.js +1 -0
  62. package/dist/agents/session-tool-result-guard.js +3 -1
  63. package/dist/agents/session-transcript-repair.js +40 -6
  64. package/dist/agents/skills/bundled-dir.js +19 -5
  65. package/dist/agents/skills/env-overrides.js +124 -43
  66. package/dist/agents/skills/frontmatter.js +6 -6
  67. package/dist/agents/skills/plugin-skills.js +14 -7
  68. package/dist/agents/skills/workspace.js +1 -0
  69. package/dist/agents/subagent-announce.js +251 -49
  70. package/dist/agents/subagent-lifecycle-events.js +19 -0
  71. package/dist/agents/subagent-registry-cleanup.js +31 -0
  72. package/dist/agents/subagent-registry-completion.js +68 -0
  73. package/dist/agents/subagent-registry-queries.js +117 -0
  74. package/dist/agents/subagent-registry-state.js +46 -0
  75. package/dist/agents/subagent-registry.js +252 -221
  76. package/dist/agents/subagent-registry.store.js +1 -0
  77. package/dist/agents/subagent-registry.types.js +1 -0
  78. package/dist/agents/subagent-spawn.js +195 -7
  79. package/dist/agents/system-prompt.js +22 -6
  80. package/dist/agents/test-helpers/fast-coding-tools.js +1 -18
  81. package/dist/agents/test-helpers/fast-core-tools.js +1 -17
  82. package/dist/agents/timeout.js +18 -6
  83. package/dist/agents/tool-call-id.js +1 -1
  84. package/dist/agents/tool-display-common.js +162 -29
  85. package/dist/agents/tool-images.js +82 -9
  86. package/dist/agents/tool-policy.js +51 -26
  87. package/dist/agents/tools/browser-tool.js +2 -2
  88. package/dist/agents/tools/canvas-tool.js +27 -1
  89. package/dist/agents/tools/common.js +45 -0
  90. package/dist/agents/tools/discord-actions-guild.js +4 -1
  91. package/dist/agents/tools/gateway-tool.js +3 -1
  92. package/dist/agents/tools/nodes-utils.js +1 -10
  93. package/dist/agents/tools/sessions-send-helpers.js +12 -6
  94. package/dist/agents/tools/sessions-spawn-tool.js +8 -2
  95. package/dist/agents/tools/subagents-tool.js +2 -1
  96. package/dist/agents/tools/whatsapp-actions.js +10 -2
  97. package/dist/agents/tools/whatsapp-target-auth.js +18 -0
  98. package/dist/agents/transcript-policy.js +22 -8
  99. package/dist/agents/venice-models.js +11 -3
  100. package/dist/auto-reply/commands-registry.data.js +51 -0
  101. package/dist/auto-reply/commands-registry.js +4 -3
  102. package/dist/auto-reply/group-activation.js +10 -5
  103. package/dist/auto-reply/inbound-debounce.js +10 -5
  104. package/dist/auto-reply/reply/abort.js +1 -1
  105. package/dist/auto-reply/reply/agent-runner-execution.js +4 -1
  106. package/dist/auto-reply/reply/bash-command.js +41 -39
  107. package/dist/auto-reply/reply/command-gates.js +25 -0
  108. package/dist/auto-reply/reply/commands-allowlist.js +111 -72
  109. package/dist/auto-reply/reply/commands-bash.js +6 -5
  110. package/dist/auto-reply/reply/commands-config.js +30 -28
  111. package/dist/auto-reply/reply/commands-core.js +2 -1
  112. package/dist/auto-reply/reply/commands-info.js +1 -0
  113. package/dist/auto-reply/reply/commands-models.js +65 -14
  114. package/dist/auto-reply/reply/commands-session.js +237 -82
  115. package/dist/auto-reply/reply/commands-setunset.js +45 -0
  116. package/dist/auto-reply/reply/commands-subagents/action-agents.js +44 -0
  117. package/dist/auto-reply/reply/commands-subagents/action-focus.js +64 -0
  118. package/dist/auto-reply/reply/commands-subagents/action-help.js +4 -0
  119. package/dist/auto-reply/reply/commands-subagents/action-info.js +45 -0
  120. package/dist/auto-reply/reply/commands-subagents/action-kill.js +60 -0
  121. package/dist/auto-reply/reply/commands-subagents/action-list.js +44 -0
  122. package/dist/auto-reply/reply/commands-subagents/action-log.js +29 -0
  123. package/dist/auto-reply/reply/commands-subagents/action-send.js +119 -0
  124. package/dist/auto-reply/reply/commands-subagents/action-spawn.js +52 -0
  125. package/dist/auto-reply/reply/commands-subagents/action-unfocus.js +30 -0
  126. package/dist/auto-reply/reply/commands-subagents/shared.js +303 -0
  127. package/dist/auto-reply/reply/commands-subagents.js +51 -587
  128. package/dist/auto-reply/reply/commands-tts.js +10 -5
  129. package/dist/auto-reply/reply/config-value.js +10 -5
  130. package/dist/auto-reply/reply/directive-handling.model-picker.js +12 -6
  131. package/dist/auto-reply/reply/directive-handling.persist.js +9 -21
  132. package/dist/auto-reply/reply/directive-handling.shared.js +24 -4
  133. package/dist/auto-reply/reply/followup-runner.js +1 -0
  134. package/dist/auto-reply/reply/get-reply-directives-utils.js +23 -14
  135. package/dist/auto-reply/reply/get-reply-directives.js +17 -28
  136. package/dist/auto-reply/reply/get-reply-inline-actions.js +1 -0
  137. package/dist/auto-reply/reply/get-reply.js +71 -12
  138. package/dist/auto-reply/reply/model-selection.js +80 -39
  139. package/dist/auto-reply/reply/queue/enqueue.js +10 -5
  140. package/dist/auto-reply/reply/queue/state.js +13 -12
  141. package/dist/auto-reply/reply/reply-payloads.js +67 -36
  142. package/dist/auto-reply/reply/reply-reference.js +9 -8
  143. package/dist/auto-reply/reply/route-reply.js +15 -8
  144. package/dist/auto-reply/reply/session-reset-prompt.js +1 -1
  145. package/dist/auto-reply/reply/session.js +22 -6
  146. package/dist/auto-reply/reply/strip-inbound-meta.js +147 -0
  147. package/dist/auto-reply/reply/subagents-utils.js +56 -30
  148. package/dist/auto-reply/reply/typing.js +46 -21
  149. package/dist/auto-reply/send-policy.js +14 -7
  150. package/dist/auto-reply/status.js +140 -16
  151. package/dist/auto-reply/templating.js +10 -5
  152. package/dist/auto-reply/thinking.js +7 -16
  153. package/dist/auto-reply/tokens.js +21 -5
  154. package/dist/browser/bridge-server.js +36 -20
  155. package/dist/browser/cdp.helpers.js +7 -14
  156. package/dist/browser/cdp.js +35 -15
  157. package/dist/browser/chrome.profile-decoration.js +7 -4
  158. package/dist/browser/config.js +4 -0
  159. package/dist/browser/extension-relay-auth.js +55 -0
  160. package/dist/browser/extension-relay.js +74 -29
  161. package/dist/browser/navigation-guard.js +9 -1
  162. package/dist/browser/paths.js +77 -0
  163. package/dist/browser/profiles.js +13 -8
  164. package/dist/browser/pw-ai-module.js +10 -5
  165. package/dist/browser/pw-session.js +76 -39
  166. package/dist/browser/pw-tools-core.interactions.js +14 -7
  167. package/dist/browser/pw-tools-core.state.js +12 -6
  168. package/dist/browser/routes/agent.act.js +2 -2
  169. package/dist/browser/server-context.js +7 -0
  170. package/dist/build-info.json +3 -3
  171. package/dist/channels/allow-from.js +2 -1
  172. package/dist/channels/allowlists/resolve-utils.js +43 -19
  173. package/dist/channels/channel-config.js +14 -7
  174. package/dist/channels/draft-stream-loop.js +7 -0
  175. package/dist/channels/model-overrides.js +82 -0
  176. package/dist/channels/plugins/normalize/imessage.js +14 -7
  177. package/dist/channels/plugins/normalize/slack.js +10 -5
  178. package/dist/channels/plugins/normalize/telegram.js +14 -7
  179. package/dist/channels/plugins/outbound/discord.js +80 -8
  180. package/dist/channels/plugins/outbound/signal.js +11 -11
  181. package/dist/channels/plugins/setup-helpers.js +10 -5
  182. package/dist/channels/sender-label.js +14 -7
  183. package/dist/channels/session.js +4 -2
  184. package/dist/channels/status-reactions.js +297 -0
  185. package/dist/cli/banner.js +1 -1
  186. package/dist/cli/browser-cli-actions-input/register.files-downloads.js +65 -56
  187. package/dist/cli/cli-name.js +11 -11
  188. package/dist/cli/cli-utils.js +13 -3
  189. package/dist/cli/command-format.js +1 -1
  190. package/dist/cli/config-cli.js +1 -1
  191. package/dist/cli/daemon-cli/lifecycle-core.js +31 -19
  192. package/dist/cli/daemon-cli/lifecycle.js +64 -2
  193. package/dist/cli/daemon-cli/restart-health.js +126 -0
  194. package/dist/cli/daemon-cli/status.gather.js +9 -13
  195. package/dist/cli/daemon-cli/status.print.js +2 -10
  196. package/dist/cli/deps.js +27 -22
  197. package/dist/cli/gateway-cli/run-loop.js +23 -5
  198. package/dist/cli/node-cli/register.js +14 -5
  199. package/dist/cli/nodes-media-utils.js +7 -2
  200. package/dist/cli/outbound-send-deps.js +2 -9
  201. package/dist/cli/outbound-send-mapping.js +11 -0
  202. package/dist/cli/pairing-cli.js +40 -14
  203. package/dist/cli/plugins-cli.js +34 -41
  204. package/dist/cli/ports.js +11 -10
  205. package/dist/cli/program/command-registry.js +2 -11
  206. package/dist/cli/program/command-tree.js +16 -0
  207. package/dist/cli/program/preaction.js +13 -9
  208. package/dist/cli/program/register.configure.js +3 -18
  209. package/dist/cli/program/register.maintenance.js +2 -2
  210. package/dist/cli/program/register.onboard.js +2 -0
  211. package/dist/cli/program/register.status-health-sessions.js +16 -17
  212. package/dist/cli/program/register.subclis.js +93 -52
  213. package/dist/cli/route.js +11 -7
  214. package/dist/cli/system-cli.js +36 -46
  215. package/dist/cli/update-cli/shared.js +22 -9
  216. package/dist/cli/update-cli/update-command.js +89 -14
  217. package/dist/cli/update-cli/wizard.js +6 -12
  218. package/dist/commands/agent/run-context.js +18 -5
  219. package/dist/commands/agent/session-store.js +17 -4
  220. package/dist/commands/agent.js +22 -2
  221. package/dist/commands/agents.bindings.js +14 -7
  222. package/dist/commands/agents.commands.add.js +13 -9
  223. package/dist/commands/agents.commands.identity.js +12 -6
  224. package/dist/commands/agents.commands.list.js +11 -6
  225. package/dist/commands/agents.config.js +8 -10
  226. package/dist/commands/agents.providers.js +12 -6
  227. package/dist/commands/auth-choice-options.js +103 -75
  228. package/dist/commands/auth-choice.apply.byteplus.js +55 -0
  229. package/dist/commands/auth-choice.apply.js +4 -0
  230. package/dist/commands/auth-choice.apply.minimax.js +61 -13
  231. package/dist/commands/auth-choice.apply.openai.js +3 -1
  232. package/dist/commands/auth-choice.apply.volcengine.js +55 -0
  233. package/dist/commands/auth-choice.preferred-provider.js +2 -0
  234. package/dist/commands/channels/remove.js +13 -6
  235. package/dist/commands/channels/shared.js +4 -14
  236. package/dist/commands/configure.commands.js +14 -0
  237. package/dist/commands/configure.gateway.js +2 -4
  238. package/dist/commands/configure.js +1 -1
  239. package/dist/commands/configure.shared.js +11 -0
  240. package/dist/commands/daemon-install-helpers.js +2 -2
  241. package/dist/commands/dashboard.js +12 -10
  242. package/dist/commands/docs.js +14 -8
  243. package/dist/commands/doctor-config-flow.js +11 -9
  244. package/dist/commands/doctor-legacy-config.js +281 -0
  245. package/dist/commands/doctor-state-integrity.js +99 -23
  246. package/dist/commands/doctor-update.js +12 -9
  247. package/dist/commands/models/list.list-command.js +7 -5
  248. package/dist/commands/models/set-image.js +2 -21
  249. package/dist/commands/node-daemon-install-helpers.js +10 -8
  250. package/dist/commands/onboard-auth.config-minimax.js +54 -80
  251. package/dist/commands/onboard-auth.config-opencode.js +2 -18
  252. package/dist/commands/onboard-auth.credentials.js +90 -13
  253. package/dist/commands/onboard-auth.js +1 -1
  254. package/dist/commands/onboard-auth.models.js +6 -5
  255. package/dist/commands/onboard-hooks.js +1 -1
  256. package/dist/commands/onboard-non-interactive/api-keys.js +14 -7
  257. package/dist/commands/onboard-non-interactive/local/auth-choice.js +64 -49
  258. package/dist/commands/onboard-provider-auth-flags.js +14 -0
  259. package/dist/commands/onboard-remote.js +14 -7
  260. package/dist/commands/onboard.js +11 -13
  261. package/dist/commands/sandbox-display.js +6 -5
  262. package/dist/commands/status-all/diagnosis.js +14 -10
  263. package/dist/commands/status-all/format.js +1 -0
  264. package/dist/commands/status.gateway-probe.js +1 -16
  265. package/dist/commands/systemd-linger.js +12 -6
  266. package/dist/config/agent-limits.js +2 -0
  267. package/dist/config/commands.js +30 -16
  268. package/dist/config/config-paths.js +9 -11
  269. package/dist/config/defaults.js +22 -2
  270. package/dist/config/discord-preview-streaming.js +104 -0
  271. package/dist/config/env-vars.js +37 -8
  272. package/dist/config/includes.js +4 -0
  273. package/dist/config/io.js +97 -12
  274. package/dist/config/legacy.migrations.part-1.js +189 -78
  275. package/dist/config/legacy.shared.js +3 -1
  276. package/dist/config/merge-patch.js +4 -0
  277. package/dist/config/prototype-keys.js +4 -0
  278. package/dist/config/schema.help.js +44 -7
  279. package/dist/config/schema.labels.js +38 -6
  280. package/dist/config/sessions/delivery-info.js +10 -3
  281. package/dist/config/sessions/main-session.js +10 -5
  282. package/dist/config/sessions/session-file.js +33 -0
  283. package/dist/config/sessions/session-key.js +10 -5
  284. package/dist/config/sessions/store.js +1 -1
  285. package/dist/config/sessions.js +1 -0
  286. package/dist/config/zod-schema.agent-runtime.js +11 -0
  287. package/dist/config/zod-schema.js +148 -13
  288. package/dist/config/zod-schema.providers-core.js +78 -4
  289. package/dist/config/zod-schema.providers.js +6 -1
  290. package/dist/config/zod-schema.session.js +41 -2
  291. package/dist/cron/run-log.js +3 -0
  292. package/dist/cron/schedule.js +21 -10
  293. package/dist/cron/service/ops.js +35 -21
  294. package/dist/cron/service/timer.js +116 -16
  295. package/dist/cron/stagger.js +3 -1
  296. package/dist/discord/api.js +12 -6
  297. package/dist/discord/draft-chunking.js +22 -0
  298. package/dist/discord/draft-stream.js +124 -0
  299. package/dist/discord/monitor/agent-components.js +1 -1
  300. package/dist/discord/monitor/commands.js +5 -0
  301. package/dist/discord/monitor/gateway-plugin.js +2 -1
  302. package/dist/discord/monitor/listeners.js +37 -27
  303. package/dist/discord/monitor/message-handler.js +4 -1
  304. package/dist/discord/monitor/message-handler.preflight.js +65 -8
  305. package/dist/discord/monitor/message-handler.process.js +246 -217
  306. package/dist/discord/monitor/message-utils.js +143 -6
  307. package/dist/discord/monitor/model-picker-preferences.js +143 -0
  308. package/dist/discord/monitor/model-picker.js +651 -0
  309. package/dist/discord/monitor/native-command.js +573 -16
  310. package/dist/discord/monitor/provider.allowlist.js +223 -0
  311. package/dist/discord/monitor/provider.js +275 -347
  312. package/dist/discord/monitor/provider.lifecycle.js +100 -0
  313. package/dist/discord/monitor/reply-delivery.js +123 -16
  314. package/dist/discord/monitor/thread-bindings.discord-api.js +215 -0
  315. package/dist/discord/monitor/thread-bindings.js +4 -0
  316. package/dist/discord/monitor/thread-bindings.lifecycle.js +177 -0
  317. package/dist/discord/monitor/thread-bindings.manager.js +423 -0
  318. package/dist/discord/monitor/thread-bindings.messages.js +55 -0
  319. package/dist/discord/monitor/thread-bindings.state.js +358 -0
  320. package/dist/discord/monitor/thread-bindings.types.js +6 -0
  321. package/dist/discord/resolve-users.js +33 -21
  322. package/dist/discord/send.channels.js +15 -0
  323. package/dist/discord/send.js +3 -2
  324. package/dist/discord/send.outbound.js +82 -26
  325. package/dist/discord/send.permissions.js +83 -30
  326. package/dist/discord/send.reactions.js +8 -4
  327. package/dist/discord/token.js +10 -5
  328. package/dist/discord/voice/command.js +263 -0
  329. package/dist/discord/voice/manager.js +531 -0
  330. package/dist/gateway/auth.js +34 -10
  331. package/dist/gateway/call.js +4 -16
  332. package/dist/gateway/client.js +28 -4
  333. package/dist/gateway/config-reload.js +3 -4
  334. package/dist/gateway/control-ui.js +219 -96
  335. package/dist/gateway/hooks-mapping.js +88 -38
  336. package/dist/gateway/http-auth-helpers.js +3 -2
  337. package/dist/gateway/http-endpoint-helpers.js +1 -0
  338. package/dist/gateway/net.js +54 -12
  339. package/dist/gateway/node-invoke-system-run-approval.js +14 -35
  340. package/dist/gateway/node-registry.js +10 -5
  341. package/dist/gateway/openai-http.js +1 -0
  342. package/dist/gateway/openresponses-http.js +1 -0
  343. package/dist/gateway/origin-check.js +1 -18
  344. package/dist/gateway/protocol/index.js +4 -3
  345. package/dist/gateway/protocol/schema/cron.js +1 -0
  346. package/dist/gateway/protocol/schema/devices.js +1 -0
  347. package/dist/gateway/protocol/schema/protocol-schemas.js +2 -1
  348. package/dist/gateway/protocol/schema/sessions.js +6 -0
  349. package/dist/gateway/role-policy.js +17 -0
  350. package/dist/gateway/server/ws-connection/connect-policy.js +37 -0
  351. package/dist/gateway/server/ws-connection/message-handler.js +175 -148
  352. package/dist/gateway/server-chat.js +83 -25
  353. package/dist/gateway/server-constants.js +10 -9
  354. package/dist/gateway/server-cron.js +1 -0
  355. package/dist/gateway/server-http.js +16 -7
  356. package/dist/gateway/server-maintenance.js +20 -5
  357. package/dist/gateway/server-methods/chat.js +10 -6
  358. package/dist/gateway/server-methods/config.js +12 -14
  359. package/dist/gateway/server-methods/devices.js +17 -3
  360. package/dist/gateway/server-methods/models.js +11 -1
  361. package/dist/gateway/server-methods/sessions.js +64 -8
  362. package/dist/gateway/server-methods/usage.js +162 -75
  363. package/dist/gateway/server-node-events.js +29 -0
  364. package/dist/gateway/server-runtime-config.js +34 -13
  365. package/dist/gateway/server-startup-memory.js +17 -11
  366. package/dist/gateway/session-utils.fs.js +32 -34
  367. package/dist/gateway/sessions-resolve.js +17 -5
  368. package/dist/gateway/test-helpers.openai-mock.js +14 -7
  369. package/dist/gateway/tools-invoke-http.js +21 -10
  370. package/dist/hooks/bundled/bootstrap-extra-files/handler.js +3 -1
  371. package/dist/hooks/bundled/command-logger/handler.js +7 -2
  372. package/dist/hooks/bundled/session-memory/handler.js +6 -5
  373. package/dist/hooks/frontmatter.js +6 -6
  374. package/dist/hooks/gmail-watcher.js +11 -6
  375. package/dist/hooks/internal-hooks.js +11 -1
  376. package/dist/hooks/llm-slug-generator.js +4 -1
  377. package/dist/hooks/workspace.js +47 -17
  378. package/dist/imessage/accounts.js +9 -20
  379. package/dist/imessage/monitor/inbound-processing.js +2 -1
  380. package/dist/infra/archive.js +174 -73
  381. package/dist/infra/control-ui-assets.js +14 -6
  382. package/dist/infra/device-pairing.js +108 -29
  383. package/dist/infra/env.js +10 -5
  384. package/dist/infra/exec-approvals-allowlist.js +122 -0
  385. package/dist/infra/exec-approvals-analysis.js +34 -3
  386. package/dist/infra/exec-approvals.js +5 -17
  387. package/dist/infra/exec-safe-bin-policy.js +53 -45
  388. package/dist/infra/fs-safe.js +71 -39
  389. package/dist/infra/gateway-lock.js +6 -2
  390. package/dist/infra/heartbeat-wake.js +6 -12
  391. package/dist/infra/host-env-security-policy.json +19 -0
  392. package/dist/infra/host-env-security.js +66 -0
  393. package/dist/infra/net/ssrf.js +131 -38
  394. package/dist/infra/outbound/bound-delivery-router.js +88 -0
  395. package/dist/infra/outbound/channel-selection.js +12 -6
  396. package/dist/infra/outbound/envelope.js +1 -1
  397. package/dist/infra/outbound/format.js +12 -6
  398. package/dist/infra/outbound/payloads.js +14 -7
  399. package/dist/infra/outbound/session-binding-service.js +123 -0
  400. package/dist/infra/path-guards.js +25 -0
  401. package/dist/infra/provider-usage.fetch.codex.js +7 -15
  402. package/dist/infra/provider-usage.fetch.gemini.js +14 -11
  403. package/dist/infra/provider-usage.fetch.shared.js +30 -1
  404. package/dist/infra/provider-usage.fetch.zai.js +10 -9
  405. package/dist/infra/retry-policy.js +4 -2
  406. package/dist/infra/retry.js +9 -5
  407. package/dist/infra/session-cost-usage.js +107 -59
  408. package/dist/infra/session-maintenance-warning.js +3 -1
  409. package/dist/infra/shell-env.js +98 -34
  410. package/dist/infra/ssh-config.js +12 -6
  411. package/dist/infra/system-run-command.js +49 -4
  412. package/dist/infra/update-channels.js +10 -5
  413. package/dist/line/accounts.js +5 -7
  414. package/dist/line/bot-access.js +8 -20
  415. package/dist/line/bot-handlers.js +3 -1
  416. package/dist/link-understanding/detect.js +15 -7
  417. package/dist/media/constants.js +15 -6
  418. package/dist/media/image-ops.js +7 -0
  419. package/dist/media/local-roots.js +3 -2
  420. package/dist/media-understanding/apply.js +4 -1
  421. package/dist/media-understanding/concurrency.js +8 -20
  422. package/dist/memory/backend-config.js +45 -6
  423. package/dist/memory/embeddings.js +10 -4
  424. package/dist/memory/fs-utils.js +23 -0
  425. package/dist/memory/manager-search.js +12 -6
  426. package/dist/memory/manager-sync-ops.js +12 -2
  427. package/dist/memory/qmd-manager.js +466 -53
  428. package/dist/memory/query-expansion.js +167 -3
  429. package/dist/memory/status-format.js +10 -5
  430. package/dist/memory/sync-memory-files.js +1 -1
  431. package/dist/node-host/invoke-system-run.js +281 -0
  432. package/dist/node-host/invoke.js +55 -337
  433. package/dist/pairing/pairing-store.js +22 -0
  434. package/dist/plugin-sdk/allow-from.js +1 -1
  435. package/dist/plugin-sdk/command-auth.js +3 -1
  436. package/dist/plugin-sdk/index.js +6 -3
  437. package/dist/plugin-sdk/webhook-targets.js +32 -0
  438. package/dist/plugins/bundled-dir.js +9 -6
  439. package/dist/plugins/hooks.js +50 -0
  440. package/dist/plugins/install.js +28 -16
  441. package/dist/plugins/runtime.js +3 -17
  442. package/dist/plugins/update.js +78 -12
  443. package/dist/process/spawn-utils.js +14 -7
  444. package/dist/providers/github-copilot-token.js +11 -6
  445. package/dist/providers/qwen-portal-oauth.js +14 -6
  446. package/dist/routing/account-id.js +30 -0
  447. package/dist/routing/resolve-route.js +3 -7
  448. package/dist/routing/session-key.js +2 -16
  449. package/dist/security/audit-channel.js +93 -2
  450. package/dist/security/audit-extra.async.js +159 -5
  451. package/dist/security/audit-extra.js +1 -1
  452. package/dist/security/audit-extra.sync.js +85 -6
  453. package/dist/security/audit.js +40 -4
  454. package/dist/security/dm-policy-shared.js +44 -0
  455. package/dist/security/external-content.js +26 -6
  456. package/dist/shared/entry-status.js +6 -0
  457. package/dist/shared/frontmatter.js +5 -5
  458. package/dist/shared/node-match.js +11 -4
  459. package/dist/shared/operator-scope-compat.js +8 -3
  460. package/dist/signal/accounts.js +7 -20
  461. package/dist/signal/monitor/event-handler.js +3 -1
  462. package/dist/slack/accounts.js +6 -19
  463. package/dist/slack/actions.js +11 -3
  464. package/dist/slack/monitor/auth.js +1 -1
  465. package/dist/slack/monitor/message-handler/dispatch.js +50 -29
  466. package/dist/slack/monitor/replies.js +15 -7
  467. package/dist/slack/monitor/slash.js +22 -13
  468. package/dist/slack/resolve-channels.js +10 -5
  469. package/dist/slack/send.js +102 -12
  470. package/dist/slack/stream-mode.js +10 -0
  471. package/dist/slack/streaming.js +4 -2
  472. package/dist/telegram/accounts.js +19 -14
  473. package/dist/telegram/bot/helpers.js +3 -5
  474. package/dist/telegram/bot-access.js +35 -36
  475. package/dist/telegram/bot-handlers.js +120 -148
  476. package/dist/telegram/bot-message-context.js +68 -9
  477. package/dist/telegram/bot-message-dispatch.js +155 -90
  478. package/dist/telegram/bot-native-commands.js +16 -0
  479. package/dist/telegram/draft-stream.js +14 -1
  480. package/dist/telegram/inline-buttons.js +5 -15
  481. package/dist/telegram/monitor.js +11 -7
  482. package/dist/telegram/network-config.js +19 -7
  483. package/dist/telegram/send.js +3 -2
  484. package/dist/telegram/sent-message-cache.js +5 -6
  485. package/dist/telegram/status-reaction-variants.js +208 -0
  486. package/dist/telegram/sticker-cache.js +11 -9
  487. package/dist/terminal/theme.js +12 -12
  488. package/dist/tts/tts.js +80 -567
  489. package/dist/tui/components/chat-log.js +41 -8
  490. package/dist/tui/theme/theme.js +10 -12
  491. package/dist/tui/tui-local-shell.js +16 -6
  492. package/dist/tui/tui.js +58 -6
  493. package/dist/utils/account-id.js +2 -4
  494. package/dist/utils/boolean.js +10 -5
  495. package/dist/utils/directive-tags.js +11 -0
  496. package/dist/utils/queue-helpers.js +67 -12
  497. package/dist/web/auto-reply/deliver-reply.js +8 -4
  498. package/dist/web/auto-reply/mentions.js +10 -5
  499. package/dist/web/auto-reply/monitor/group-members.js +14 -7
  500. package/dist/web/auto-reply/monitor/process-message.js +45 -24
  501. package/dist/web/inbound/access-control.js +5 -2
  502. package/dist/web/login-qr.js +12 -6
  503. package/dist/web/media.js +123 -16
  504. package/extensions/bluebubbles/src/monitor-processing.ts +580 -139
  505. package/extensions/bluebubbles/src/monitor.ts +208 -1950
  506. package/package.json +1 -1
@@ -1,27 +1,16 @@
1
1
  import { spawn } from "node:child_process";
2
- import crypto from "node:crypto";
3
2
  import fs from "node:fs";
4
3
  import path from "node:path";
5
- import { resolveAgentConfig } from "../agents/agent-scope.js";
6
- import { loadConfig } from "../config/config.js";
7
- import { addAllowlistEntry, analyzeArgvCommand, evaluateExecAllowlist, evaluateShellAllowlist, requiresExecApproval, normalizeExecApprovals, mergeExecApprovalsSocketDefaults, recordAllowlistUse, resolveExecApprovals, resolveSafeBins, ensureExecApprovals, readExecApprovalsSnapshot, saveExecApprovals, } from "../infra/exec-approvals.js";
4
+ import { ensureExecApprovals, mergeExecApprovalsSocketDefaults, normalizeExecApprovals, readExecApprovalsSnapshot, saveExecApprovals, } from "../infra/exec-approvals.js";
8
5
  import { requestExecHostViaSocket, } from "../infra/exec-host.js";
9
- import { validateSystemRunCommandConsistency } from "../infra/system-run-command.js";
6
+ import { sanitizeHostExecEnv } from "../infra/host-env-security.js";
10
7
  import { runBrowserProxyCommand } from "./invoke-browser.js";
8
+ import { handleSystemRunInvoke } from "./invoke-system-run.js";
11
9
  const OUTPUT_CAP = 200_000;
12
10
  const OUTPUT_EVENT_TAIL = 20_000;
13
11
  const DEFAULT_NODE_PATH = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";
14
12
  const execHostEnforced = process.env.POOLBOT_NODE_EXEC_HOST?.trim().toLowerCase() === "app";
15
13
  const execHostFallbackAllowed = process.env.POOLBOT_NODE_EXEC_FALLBACK?.trim().toLowerCase() !== "0";
16
- const blockedEnvKeys = new Set([
17
- "NODE_OPTIONS",
18
- "PYTHONHOME",
19
- "PYTHONPATH",
20
- "PERL5LIB",
21
- "PERL5OPT",
22
- "RUBYOPT",
23
- ]);
24
- const blockedEnvPrefixes = ["DYLD_", "LD_"];
25
14
  function resolveExecSecurity(value) {
26
15
  return value === "deny" || value === "allowlist" || value === "full" ? value : "allowlist";
27
16
  }
@@ -37,30 +26,7 @@ function resolveExecAsk(value) {
37
26
  return value === "off" || value === "on-miss" || value === "always" ? value : "on-miss";
38
27
  }
39
28
  export function sanitizeEnv(overrides) {
40
- if (!overrides) {
41
- return undefined;
42
- }
43
- const merged = { ...process.env };
44
- for (const [rawKey, value] of Object.entries(overrides)) {
45
- const key = rawKey.trim();
46
- if (!key) {
47
- continue;
48
- }
49
- const upper = key.toUpperCase();
50
- // PATH is part of the security boundary (command resolution + safe-bin checks). Never allow
51
- // request-scoped PATH overrides from agents/gateways.
52
- if (upper === "PATH") {
53
- continue;
54
- }
55
- if (blockedEnvKeys.has(upper)) {
56
- continue;
57
- }
58
- if (blockedEnvPrefixes.some((prefix) => upper.startsWith(prefix))) {
59
- continue;
60
- }
61
- merged[key] = value;
62
- }
63
- return merged;
29
+ return sanitizeHostExecEnv({ overrides, blockPathOverrides: true });
64
30
  }
65
31
  function truncateOutput(raw, maxChars) {
66
32
  if (raw.length <= maxChars) {
@@ -235,6 +201,27 @@ async function runViaMacAppExecHost(params) {
235
201
  request,
236
202
  });
237
203
  }
204
+ async function sendJsonPayloadResult(client, frame, payload) {
205
+ await sendInvokeResult(client, frame, {
206
+ ok: true,
207
+ payloadJSON: JSON.stringify(payload),
208
+ });
209
+ }
210
+ async function sendRawPayloadResult(client, frame, payloadJSON) {
211
+ await sendInvokeResult(client, frame, {
212
+ ok: true,
213
+ payloadJSON,
214
+ });
215
+ }
216
+ async function sendErrorResult(client, frame, code, message) {
217
+ await sendInvokeResult(client, frame, {
218
+ ok: false,
219
+ error: { code, message },
220
+ });
221
+ }
222
+ async function sendInvalidRequestResult(client, frame, err) {
223
+ await sendErrorResult(client, frame, "INVALID_REQUEST", String(err));
224
+ }
238
225
  export async function handleInvoke(frame, client, skillBins) {
239
226
  const command = String(frame.command ?? "");
240
227
  if (command === "system.execApprovals.get") {
@@ -247,18 +234,12 @@ export async function handleInvoke(frame, client, skillBins) {
247
234
  hash: snapshot.hash,
248
235
  file: redactExecApprovals(snapshot.file),
249
236
  };
250
- await sendInvokeResult(client, frame, {
251
- ok: true,
252
- payloadJSON: JSON.stringify(payload),
253
- });
237
+ await sendJsonPayloadResult(client, frame, payload);
254
238
  }
255
239
  catch (err) {
256
240
  const message = String(err);
257
241
  const code = message.toLowerCase().includes("timed out") ? "TIMEOUT" : "INVALID_REQUEST";
258
- await sendInvokeResult(client, frame, {
259
- ok: false,
260
- error: { code, message },
261
- });
242
+ await sendErrorResult(client, frame, code, message);
262
243
  }
263
244
  return;
264
245
  }
@@ -281,16 +262,10 @@ export async function handleInvoke(frame, client, skillBins) {
281
262
  hash: nextSnapshot.hash,
282
263
  file: redactExecApprovals(nextSnapshot.file),
283
264
  };
284
- await sendInvokeResult(client, frame, {
285
- ok: true,
286
- payloadJSON: JSON.stringify(payload),
287
- });
265
+ await sendJsonPayloadResult(client, frame, payload);
288
266
  }
289
267
  catch (err) {
290
- await sendInvokeResult(client, frame, {
291
- ok: false,
292
- error: { code: "INVALID_REQUEST", message: String(err) },
293
- });
268
+ await sendInvalidRequestResult(client, frame, err);
294
269
  }
295
270
  return;
296
271
  }
@@ -302,40 +277,25 @@ export async function handleInvoke(frame, client, skillBins) {
302
277
  }
303
278
  const env = sanitizeEnv(undefined);
304
279
  const payload = await handleSystemWhich(params, env);
305
- await sendInvokeResult(client, frame, {
306
- ok: true,
307
- payloadJSON: JSON.stringify(payload),
308
- });
280
+ await sendJsonPayloadResult(client, frame, payload);
309
281
  }
310
282
  catch (err) {
311
- await sendInvokeResult(client, frame, {
312
- ok: false,
313
- error: { code: "INVALID_REQUEST", message: String(err) },
314
- });
283
+ await sendInvalidRequestResult(client, frame, err);
315
284
  }
316
285
  return;
317
286
  }
318
287
  if (command === "browser.proxy") {
319
288
  try {
320
289
  const payload = await runBrowserProxyCommand(frame.paramsJSON);
321
- await sendInvokeResult(client, frame, {
322
- ok: true,
323
- payloadJSON: payload,
324
- });
290
+ await sendRawPayloadResult(client, frame, payload);
325
291
  }
326
292
  catch (err) {
327
- await sendInvokeResult(client, frame, {
328
- ok: false,
329
- error: { code: "INVALID_REQUEST", message: String(err) },
330
- });
293
+ await sendInvalidRequestResult(client, frame, err);
331
294
  }
332
295
  return;
333
296
  }
334
297
  if (command !== "system.run") {
335
- await sendInvokeResult(client, frame, {
336
- ok: false,
337
- error: { code: "UNAVAILABLE", message: "command not supported" },
338
- });
298
+ await sendErrorResult(client, frame, "UNAVAILABLE", "command not supported");
339
299
  return;
340
300
  }
341
301
  let params;
@@ -343,275 +303,33 @@ export async function handleInvoke(frame, client, skillBins) {
343
303
  params = decodeParams(frame.paramsJSON);
344
304
  }
345
305
  catch (err) {
346
- await sendInvokeResult(client, frame, {
347
- ok: false,
348
- error: { code: "INVALID_REQUEST", message: String(err) },
349
- });
306
+ await sendInvalidRequestResult(client, frame, err);
350
307
  return;
351
308
  }
352
309
  if (!Array.isArray(params.command) || params.command.length === 0) {
353
- await sendInvokeResult(client, frame, {
354
- ok: false,
355
- error: { code: "INVALID_REQUEST", message: "command required" },
356
- });
310
+ await sendErrorResult(client, frame, "INVALID_REQUEST", "command required");
357
311
  return;
358
312
  }
359
- const argv = params.command.map((item) => String(item));
360
- const rawCommand = typeof params.rawCommand === "string" ? params.rawCommand.trim() : "";
361
- const consistency = validateSystemRunCommandConsistency({
362
- argv,
363
- rawCommand: rawCommand || null,
364
- });
365
- if (!consistency.ok) {
366
- await sendInvokeResult(client, frame, {
367
- ok: false,
368
- error: { code: "INVALID_REQUEST", message: consistency.message },
369
- });
370
- return;
371
- }
372
- const shellCommand = consistency.shellCommand;
373
- const cmdText = consistency.cmdText;
374
- const agentId = params.agentId?.trim() || undefined;
375
- const cfg = loadConfig();
376
- const agentExec = agentId ? resolveAgentConfig(cfg, agentId)?.tools?.exec : undefined;
377
- const configuredSecurity = resolveExecSecurity(agentExec?.security ?? cfg.tools?.exec?.security);
378
- const configuredAsk = resolveExecAsk(agentExec?.ask ?? cfg.tools?.exec?.ask);
379
- const approvals = resolveExecApprovals(agentId, {
380
- security: configuredSecurity,
381
- ask: configuredAsk,
382
- });
383
- const security = approvals.agent.security;
384
- const ask = approvals.agent.ask;
385
- const autoAllowSkills = approvals.agent.autoAllowSkills;
386
- const sessionKey = params.sessionKey?.trim() || "node";
387
- const runId = params.runId?.trim() || crypto.randomUUID();
388
- const env = sanitizeEnv(params.env ?? undefined);
389
- const safeBins = resolveSafeBins(agentExec?.safeBins ?? cfg.tools?.exec?.safeBins);
390
- const bins = autoAllowSkills ? await skillBins.current() : new Set();
391
- let analysisOk = false;
392
- let allowlistMatches = [];
393
- let allowlistSatisfied = false;
394
- let segments = [];
395
- if (shellCommand) {
396
- const allowlistEval = evaluateShellAllowlist({
397
- command: shellCommand,
398
- allowlist: approvals.allowlist,
399
- safeBins,
400
- cwd: params.cwd ?? undefined,
401
- env,
402
- skillBins: bins,
403
- autoAllowSkills,
404
- platform: process.platform,
405
- });
406
- analysisOk = allowlistEval.analysisOk;
407
- allowlistMatches = allowlistEval.allowlistMatches;
408
- allowlistSatisfied =
409
- security === "allowlist" && analysisOk ? allowlistEval.allowlistSatisfied : false;
410
- segments = allowlistEval.segments;
411
- }
412
- else {
413
- const analysis = analyzeArgvCommand({ argv, cwd: params.cwd ?? undefined, env });
414
- const allowlistEval = evaluateExecAllowlist({
415
- analysis,
416
- allowlist: approvals.allowlist,
417
- safeBins,
418
- cwd: params.cwd ?? undefined,
419
- skillBins: bins,
420
- autoAllowSkills,
421
- });
422
- analysisOk = analysis.ok;
423
- allowlistMatches = allowlistEval.allowlistMatches;
424
- allowlistSatisfied =
425
- security === "allowlist" && analysisOk ? allowlistEval.allowlistSatisfied : false;
426
- segments = analysis.segments;
427
- }
428
- const isWindows = process.platform === "win32";
429
- const cmdInvocation = shellCommand
430
- ? isCmdExeInvocation(segments[0]?.argv ?? [])
431
- : isCmdExeInvocation(argv);
432
- if (security === "allowlist" && isWindows && cmdInvocation) {
433
- analysisOk = false;
434
- allowlistSatisfied = false;
435
- }
436
- const useMacAppExec = process.platform === "darwin";
437
- if (useMacAppExec) {
438
- const approvalDecision = params.approvalDecision === "allow-once" || params.approvalDecision === "allow-always"
439
- ? params.approvalDecision
440
- : null;
441
- const execRequest = {
442
- command: argv,
443
- rawCommand: rawCommand || shellCommand || null,
444
- cwd: params.cwd ?? null,
445
- env: params.env ?? null,
446
- timeoutMs: params.timeoutMs ?? null,
447
- needsScreenRecording: params.needsScreenRecording ?? null,
448
- agentId: agentId ?? null,
449
- sessionKey: sessionKey ?? null,
450
- approvalDecision,
451
- };
452
- const response = await runViaMacAppExecHost({ approvals, request: execRequest });
453
- if (!response) {
454
- if (execHostEnforced || !execHostFallbackAllowed) {
455
- await sendNodeEvent(client, "exec.denied", buildExecEventPayload({
456
- sessionKey,
457
- runId,
458
- host: "node",
459
- command: cmdText,
460
- reason: "companion-unavailable",
461
- }));
462
- await sendInvokeResult(client, frame, {
463
- ok: false,
464
- error: {
465
- code: "UNAVAILABLE",
466
- message: "COMPANION_APP_UNAVAILABLE: macOS app exec host unreachable",
467
- },
468
- });
469
- return;
470
- }
471
- }
472
- else if (!response.ok) {
473
- const reason = response.error.reason ?? "approval-required";
474
- await sendNodeEvent(client, "exec.denied", buildExecEventPayload({
475
- sessionKey,
476
- runId,
477
- host: "node",
478
- command: cmdText,
479
- reason,
480
- }));
481
- await sendInvokeResult(client, frame, {
482
- ok: false,
483
- error: { code: "UNAVAILABLE", message: response.error.message },
484
- });
485
- return;
486
- }
487
- else {
488
- const result = response.payload;
313
+ await handleSystemRunInvoke({
314
+ client,
315
+ params,
316
+ skillBins,
317
+ execHostEnforced,
318
+ execHostFallbackAllowed,
319
+ resolveExecSecurity,
320
+ resolveExecAsk,
321
+ isCmdExeInvocation,
322
+ sanitizeEnv,
323
+ runCommand,
324
+ runViaMacAppExecHost,
325
+ sendNodeEvent,
326
+ buildExecEventPayload,
327
+ sendInvokeResult: async (result) => {
328
+ await sendInvokeResult(client, frame, result);
329
+ },
330
+ sendExecFinishedEvent: async ({ sessionKey, runId, cmdText, result }) => {
489
331
  await sendExecFinishedEvent({ client, sessionKey, runId, cmdText, result });
490
- await sendInvokeResult(client, frame, {
491
- ok: true,
492
- payloadJSON: JSON.stringify(result),
493
- });
494
- return;
495
- }
496
- }
497
- if (security === "deny") {
498
- await sendNodeEvent(client, "exec.denied", buildExecEventPayload({
499
- sessionKey,
500
- runId,
501
- host: "node",
502
- command: cmdText,
503
- reason: "security=deny",
504
- }));
505
- await sendInvokeResult(client, frame, {
506
- ok: false,
507
- error: { code: "UNAVAILABLE", message: "SYSTEM_RUN_DISABLED: security=deny" },
508
- });
509
- return;
510
- }
511
- const requiresAsk = requiresExecApproval({
512
- ask,
513
- security,
514
- analysisOk,
515
- allowlistSatisfied,
516
- });
517
- const approvalDecision = params.approvalDecision === "allow-once" || params.approvalDecision === "allow-always"
518
- ? params.approvalDecision
519
- : null;
520
- const approvedByAsk = approvalDecision !== null || params.approved === true;
521
- if (requiresAsk && !approvedByAsk) {
522
- await sendNodeEvent(client, "exec.denied", buildExecEventPayload({
523
- sessionKey,
524
- runId,
525
- host: "node",
526
- command: cmdText,
527
- reason: "approval-required",
528
- }));
529
- await sendInvokeResult(client, frame, {
530
- ok: false,
531
- error: { code: "UNAVAILABLE", message: "SYSTEM_RUN_DENIED: approval required" },
532
- });
533
- return;
534
- }
535
- if (approvalDecision === "allow-always" && security === "allowlist") {
536
- if (analysisOk) {
537
- for (const segment of segments) {
538
- const pattern = segment.resolution?.resolvedPath ?? "";
539
- if (pattern) {
540
- addAllowlistEntry(approvals.file, agentId, pattern);
541
- }
542
- }
543
- }
544
- }
545
- if (security === "allowlist" && (!analysisOk || !allowlistSatisfied) && !approvedByAsk) {
546
- await sendNodeEvent(client, "exec.denied", buildExecEventPayload({
547
- sessionKey,
548
- runId,
549
- host: "node",
550
- command: cmdText,
551
- reason: "allowlist-miss",
552
- }));
553
- await sendInvokeResult(client, frame, {
554
- ok: false,
555
- error: { code: "UNAVAILABLE", message: "SYSTEM_RUN_DENIED: allowlist miss" },
556
- });
557
- return;
558
- }
559
- if (allowlistMatches.length > 0) {
560
- const seen = new Set();
561
- for (const match of allowlistMatches) {
562
- if (!match?.pattern || seen.has(match.pattern)) {
563
- continue;
564
- }
565
- seen.add(match.pattern);
566
- recordAllowlistUse(approvals.file, agentId, match, cmdText, segments[0]?.resolution?.resolvedPath);
567
- }
568
- }
569
- if (params.needsScreenRecording === true) {
570
- await sendNodeEvent(client, "exec.denied", buildExecEventPayload({
571
- sessionKey,
572
- runId,
573
- host: "node",
574
- command: cmdText,
575
- reason: "permission:screenRecording",
576
- }));
577
- await sendInvokeResult(client, frame, {
578
- ok: false,
579
- error: { code: "UNAVAILABLE", message: "PERMISSION_MISSING: screenRecording" },
580
- });
581
- return;
582
- }
583
- let execArgv = argv;
584
- if (security === "allowlist" &&
585
- isWindows &&
586
- !approvedByAsk &&
587
- shellCommand &&
588
- analysisOk &&
589
- allowlistSatisfied &&
590
- segments.length === 1 &&
591
- segments[0]?.argv.length > 0) {
592
- execArgv = segments[0].argv;
593
- }
594
- const result = await runCommand(execArgv, params.cwd?.trim() || undefined, env, params.timeoutMs ?? undefined);
595
- if (result.truncated) {
596
- const suffix = "... (truncated)";
597
- if (result.stderr.trim().length > 0) {
598
- result.stderr = `${result.stderr}\n${suffix}`;
599
- }
600
- else {
601
- result.stdout = `${result.stdout}\n${suffix}`;
602
- }
603
- }
604
- await sendExecFinishedEvent({ client, sessionKey, runId, cmdText, result });
605
- await sendInvokeResult(client, frame, {
606
- ok: true,
607
- payloadJSON: JSON.stringify({
608
- exitCode: result.exitCode,
609
- timedOut: result.timedOut,
610
- success: result.success,
611
- stdout: result.stdout,
612
- stderr: result.stderr,
613
- error: result.error ?? null,
614
- }),
332
+ },
615
333
  });
616
334
  }
617
335
  function decodeParams(raw) {
@@ -199,6 +199,16 @@ async function readAllowFromStateForPath(channel, filePath) {
199
199
  });
200
200
  return normalizeAllowFromList(channel, value);
201
201
  }
202
+ function readAllowFromStateForPathSync(channel, filePath) {
203
+ try {
204
+ const raw = fs.readFileSync(filePath, "utf8");
205
+ const parsed = JSON.parse(raw);
206
+ return normalizeAllowFromList(channel, parsed);
207
+ }
208
+ catch {
209
+ return [];
210
+ }
211
+ }
202
212
  async function readAllowFromState(params) {
203
213
  const { value } = await readJsonFile(params.filePath, {
204
214
  version: 1,
@@ -248,6 +258,18 @@ export async function readChannelAllowFromStore(channel, env = process.env, acco
248
258
  const legacyEntries = await readAllowFromStateForPath(channel, legacyPath);
249
259
  return dedupePreserveOrder([...scopedEntries, ...legacyEntries]);
250
260
  }
261
+ export function readChannelAllowFromStoreSync(channel, env = process.env, accountId) {
262
+ const normalizedAccountId = accountId?.trim().toLowerCase() ?? "";
263
+ if (!normalizedAccountId) {
264
+ const filePath = resolveAllowFromPath(channel, env);
265
+ return readAllowFromStateForPathSync(channel, filePath);
266
+ }
267
+ const scopedPath = resolveAllowFromPath(channel, env, accountId);
268
+ const scopedEntries = readAllowFromStateForPathSync(channel, scopedPath);
269
+ const legacyPath = resolveAllowFromPath(channel, env);
270
+ const legacyEntries = readAllowFromStateForPathSync(channel, legacyPath);
271
+ return dedupePreserveOrder([...scopedEntries, ...legacyEntries]);
272
+ }
251
273
  async function updateChannelAllowFromStore(params) {
252
274
  return await updateAllowFromStoreEntry({
253
275
  channel: params.channel,
@@ -8,7 +8,7 @@ export function formatAllowFromLowercase(params) {
8
8
  export function isAllowedParsedChatSender(params) {
9
9
  const allowFrom = params.allowFrom.map((entry) => String(entry).trim());
10
10
  if (allowFrom.length === 0) {
11
- return true;
11
+ return false;
12
12
  }
13
13
  if (allowFrom.includes("*")) {
14
14
  return true;
@@ -1,6 +1,8 @@
1
1
  export async function resolveSenderCommandAuthorization(params) {
2
2
  const shouldComputeAuth = params.shouldComputeCommandAuthorized(params.rawBody, params.cfg);
3
- const storeAllowFrom = !params.isGroup && (params.dmPolicy !== "open" || shouldComputeAuth)
3
+ const storeAllowFrom = !params.isGroup &&
4
+ params.dmPolicy !== "allowlist" &&
5
+ (params.dmPolicy !== "open" || shouldComputeAuth)
4
6
  ? await params.readAllowFromStore().catch(() => [])
5
7
  : [];
6
8
  const effectiveAllowFrom = [...params.configuredAllowFrom, ...storeAllowFrom];
@@ -1,12 +1,13 @@
1
1
  export { createAccountListHelpers } from "../channels/plugins/account-helpers.js";
2
2
  export { CHANNEL_MESSAGE_ACTION_NAMES } from "../channels/plugins/message-action-names.js";
3
3
  export { BLUEBUBBLES_ACTIONS, BLUEBUBBLES_ACTION_NAMES, BLUEBUBBLES_GROUP_ACTIONS, } from "../channels/plugins/bluebubbles-actions.js";
4
+ export { autoBindSpawnedDiscordSubagent, listThreadBindingsBySessionKey, unbindThreadBindingsBySessionKey, } from "../discord/monitor/thread-bindings.js";
4
5
  export { normalizePluginHttpPath } from "../plugins/http-path.js";
5
6
  export { registerPluginHttpRoute } from "../plugins/http-registry.js";
6
7
  export { emptyPluginConfigSchema } from "../plugins/config-schema.js";
7
8
  export { acquireFileLock, withFileLock } from "./file-lock.js";
8
9
  export { normalizeWebhookPath, resolveWebhookPath } from "./webhook-path.js";
9
- export { registerWebhookTarget, rejectNonPostWebhookRequest, resolveWebhookTargets, } from "./webhook-targets.js";
10
+ export { registerWebhookTarget, rejectNonPostWebhookRequest, resolveSingleWebhookTarget, resolveSingleWebhookTargetAsync, resolveWebhookTargets, } from "./webhook-targets.js";
10
11
  export { buildAgentMediaPayload } from "./agent-media-payload.js";
11
12
  export { buildBaseChannelStatusSummary, collectStatusIssuesFromLastError, createDefaultChannelRuntimeState, } from "./status-helpers.js";
12
13
  export { buildOauthProviderAuthResult } from "./provider-auth-result.js";
@@ -23,6 +24,7 @@ export { extractToolSend } from "./tool-send.js";
23
24
  export { resolveChannelAccountConfigBasePath } from "./config-paths.js";
24
25
  export { chunkTextForOutbound } from "./text-chunking.js";
25
26
  export { readJsonFileWithFallback, writeJsonFileAtomically } from "./json-store.js";
27
+ export { buildRandomTempFilePath, withTempDownloadPath } from "./temp-path.js";
26
28
  export { resolveAckReaction } from "../agents/identity.js";
27
29
  export { SILENT_REPLY_TOKEN, isSilentReplyText } from "../auto-reply/tokens.js";
28
30
  export { approveDevicePairing, listDevicePairing, rejectDevicePairing, } from "../infra/device-pairing.js";
@@ -30,12 +32,12 @@ export { createDedupeCache } from "../infra/dedupe.js";
30
32
  export { formatErrorMessage } from "../infra/errors.js";
31
33
  export { DEFAULT_WEBHOOK_BODY_TIMEOUT_MS, DEFAULT_WEBHOOK_MAX_BODY_BYTES, RequestBodyLimitError, installRequestBodyLimitGuard, isRequestBodyLimitError, readJsonBodyWithLimit, readRequestBodyWithLimit, requestBodyErrorToText, } from "../infra/http-body.js";
32
34
  export { fetchWithSsrFGuard } from "../infra/net/fetch-guard.js";
33
- export { SsrFBlockedError, isBlockedHostname, isPrivateIpAddress } from "../infra/net/ssrf.js";
35
+ export { SsrFBlockedError, isBlockedHostname, isBlockedHostnameOrIp, isPrivateIpAddress, } from "../infra/net/ssrf.js";
34
36
  export { rawDataToString } from "../infra/ws.js";
35
37
  export { isWSLSync, isWSL2Sync, isWSLEnv } from "../infra/wsl.js";
36
38
  export { isTruthyEnvValue } from "../infra/env.js";
37
39
  export { resolveToolsBySender } from "../config/group-policy.js";
38
- export { buildPendingHistoryContextFromMap, clearHistoryEntries, clearHistoryEntriesIfEnabled, DEFAULT_GROUP_HISTORY_LIMIT, recordPendingHistoryEntry, recordPendingHistoryEntryIfEnabled, } from "../auto-reply/reply/history.js";
40
+ export { buildPendingHistoryContextFromMap, clearHistoryEntries, clearHistoryEntriesIfEnabled, DEFAULT_GROUP_HISTORY_LIMIT, evictOldHistoryKeys, recordPendingHistoryEntry, recordPendingHistoryEntryIfEnabled, } from "../auto-reply/reply/history.js";
39
41
  export { mergeAllowlist, summarizeMapping } from "../channels/allowlists/resolve-utils.js";
40
42
  export { resolveMentionGating, resolveMentionGatingWithBypass, } from "../channels/mention-gating.js";
41
43
  export { removeAckReactionAfterReply, shouldAckReaction, shouldAckReactionForWhatsApp, } from "../channels/ack-reactions.js";
@@ -60,6 +62,7 @@ export { addWildcardAllowFrom, mergeAllowFromEntries, promptAccountId, } from ".
60
62
  export { promptChannelAccessConfig } from "../channels/plugins/onboarding/channel-access.js";
61
63
  export { createActionGate, jsonResult, readNumberParam, readReactionParams, readStringParam, } from "../agents/tools/common.js";
62
64
  export { formatDocsLink } from "../terminal/links.js";
65
+ export { resolveDmAllowState, resolveDmGroupAccessDecision, resolveEffectiveAllowFromLists, } from "../security/dm-policy-shared.js";
63
66
  export { clamp, escapeRegExp, normalizeE164, safeParseJson, sleep } from "../utils.js";
64
67
  export { stripAnsi } from "../terminal/ansi.js";
65
68
  export { missingTargetError } from "../infra/outbound/target-errors.js";
@@ -23,6 +23,38 @@ export function resolveWebhookTargets(req, targetsByPath) {
23
23
  }
24
24
  return { path, targets };
25
25
  }
26
+ export function resolveSingleWebhookTarget(targets, isMatch) {
27
+ let matched;
28
+ for (const target of targets) {
29
+ if (!isMatch(target)) {
30
+ continue;
31
+ }
32
+ if (matched) {
33
+ return { kind: "ambiguous" };
34
+ }
35
+ matched = target;
36
+ }
37
+ if (!matched) {
38
+ return { kind: "none" };
39
+ }
40
+ return { kind: "single", target: matched };
41
+ }
42
+ export async function resolveSingleWebhookTargetAsync(targets, isMatch) {
43
+ let matched;
44
+ for (const target of targets) {
45
+ if (!(await isMatch(target))) {
46
+ continue;
47
+ }
48
+ if (matched) {
49
+ return { kind: "ambiguous" };
50
+ }
51
+ matched = target;
52
+ }
53
+ if (!matched) {
54
+ return { kind: "none" };
55
+ }
56
+ return { kind: "single", target: matched };
57
+ }
26
58
  export function rejectNonPostWebhookRequest(req, res) {
27
59
  if (req.method === "POST") {
28
60
  return false;
@@ -2,16 +2,17 @@ import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
4
  export function resolveBundledPluginsDir() {
5
- const override = process.env.POOLBOT_BUNDLED_PLUGINS_DIR?.trim() ||
6
- process.env.CLAWDBOT_BUNDLED_PLUGINS_DIR?.trim();
7
- if (override)
5
+ const override = process.env.POOLBOT_BUNDLED_PLUGINS_DIR?.trim();
6
+ if (override) {
8
7
  return override;
8
+ }
9
9
  // bun --compile: ship a sibling `extensions/` next to the executable.
10
10
  try {
11
11
  const execDir = path.dirname(process.execPath);
12
12
  const sibling = path.join(execDir, "extensions");
13
- if (fs.existsSync(sibling))
13
+ if (fs.existsSync(sibling)) {
14
14
  return sibling;
15
+ }
15
16
  }
16
17
  catch {
17
18
  // ignore
@@ -21,11 +22,13 @@ export function resolveBundledPluginsDir() {
21
22
  let cursor = path.dirname(fileURLToPath(import.meta.url));
22
23
  for (let i = 0; i < 6; i += 1) {
23
24
  const candidate = path.join(cursor, "extensions");
24
- if (fs.existsSync(candidate))
25
+ if (fs.existsSync(candidate)) {
25
26
  return candidate;
27
+ }
26
28
  const parent = path.dirname(cursor);
27
- if (parent === cursor)
29
+ if (parent === cursor) {
28
30
  break;
31
+ }
29
32
  cursor = parent;
30
33
  }
31
34
  }