@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,18 +1,80 @@
1
1
  import { chunkMarkdownTextWithMode, resolveChunkMode, resolveTextChunkLimit, } from "../auto-reply/chunk.js";
2
2
  import { loadConfig } from "../config/config.js";
3
+ import { resolveMarkdownTableMode } from "../config/markdown-tables.js";
3
4
  import { logVerbose } from "../globals.js";
4
5
  import { loadWebMedia } from "../web/media.js";
5
6
  import { resolveSlackAccount } from "./accounts.js";
7
+ import { buildSlackBlocksFallbackText } from "./blocks-fallback.js";
8
+ import { validateSlackBlocksArray } from "./blocks-input.js";
6
9
  import { createSlackWebClient } from "./client.js";
7
10
  import { markdownToSlackMrkdwnChunks } from "./format.js";
8
- import { resolveMarkdownTableMode } from "../config/markdown-tables.js";
9
11
  import { parseSlackTarget } from "./targets.js";
10
12
  import { resolveSlackBotToken } from "./token.js";
11
13
  const SLACK_TEXT_LIMIT = 4000;
14
+ function hasCustomIdentity(identity) {
15
+ return Boolean(identity?.username || identity?.iconUrl || identity?.iconEmoji);
16
+ }
17
+ function isSlackCustomizeScopeError(err) {
18
+ if (!(err instanceof Error)) {
19
+ return false;
20
+ }
21
+ const maybeData = err;
22
+ const code = maybeData.data?.error?.toLowerCase();
23
+ if (code !== "missing_scope") {
24
+ return false;
25
+ }
26
+ const needed = maybeData.data?.needed?.toLowerCase();
27
+ if (needed?.includes("chat:write.customize")) {
28
+ return true;
29
+ }
30
+ const scopes = [
31
+ ...(maybeData.data?.response_metadata?.scopes ?? []),
32
+ ...(maybeData.data?.response_metadata?.acceptedScopes ?? []),
33
+ ].map((scope) => scope.toLowerCase());
34
+ return scopes.includes("chat:write.customize");
35
+ }
36
+ async function postSlackMessageBestEffort(params) {
37
+ const basePayload = {
38
+ channel: params.channelId,
39
+ text: params.text,
40
+ thread_ts: params.threadTs,
41
+ ...(params.blocks?.length ? { blocks: params.blocks } : {}),
42
+ };
43
+ try {
44
+ // Slack Web API types model icon_url and icon_emoji as mutually exclusive.
45
+ // Build payloads in explicit branches so TS and runtime stay aligned.
46
+ if (params.identity?.iconUrl) {
47
+ return await params.client.chat.postMessage({
48
+ ...basePayload,
49
+ ...(params.identity.username ? { username: params.identity.username } : {}),
50
+ icon_url: params.identity.iconUrl,
51
+ });
52
+ }
53
+ if (params.identity?.iconEmoji) {
54
+ return await params.client.chat.postMessage({
55
+ ...basePayload,
56
+ ...(params.identity.username ? { username: params.identity.username } : {}),
57
+ icon_emoji: params.identity.iconEmoji,
58
+ });
59
+ }
60
+ return await params.client.chat.postMessage({
61
+ ...basePayload,
62
+ ...(params.identity?.username ? { username: params.identity.username } : {}),
63
+ });
64
+ }
65
+ catch (err) {
66
+ if (!hasCustomIdentity(params.identity) || !isSlackCustomizeScopeError(err)) {
67
+ throw err;
68
+ }
69
+ logVerbose("slack send: missing chat:write.customize, retrying without custom identity");
70
+ return params.client.chat.postMessage(basePayload);
71
+ }
72
+ }
12
73
  function resolveToken(params) {
13
74
  const explicit = resolveSlackBotToken(params.explicit);
14
- if (explicit)
75
+ if (explicit) {
15
76
  return explicit;
77
+ }
16
78
  const fallback = resolveSlackBotToken(params.fallbackToken);
17
79
  if (!fallback) {
18
80
  logVerbose(`slack send: missing bot token for account=${params.accountId} explicit=${Boolean(params.explicit)} source=${params.fallbackSource ?? "unknown"}`);
@@ -39,7 +101,10 @@ async function resolveChannelId(client, recipient) {
39
101
  return { channelId, isDm: true };
40
102
  }
41
103
  async function uploadSlackFile(params) {
42
- const { buffer, contentType: _contentType, fileName, } = await loadWebMedia(params.mediaUrl, params.maxBytes);
104
+ const { buffer, contentType: _contentType, fileName, } = await loadWebMedia(params.mediaUrl, {
105
+ maxBytes: params.maxBytes,
106
+ localRoots: params.mediaLocalRoots,
107
+ });
43
108
  const basePayload = {
44
109
  channel_id: params.channelId,
45
110
  file: buffer,
@@ -61,8 +126,9 @@ async function uploadSlackFile(params) {
61
126
  }
62
127
  export async function sendMessageSlack(to, message, opts = {}) {
63
128
  const trimmedMessage = message?.trim() ?? "";
64
- if (!trimmedMessage && !opts.mediaUrl) {
65
- throw new Error("Slack send requires text or media");
129
+ const blocks = opts.blocks == null ? undefined : validateSlackBlocksArray(opts.blocks);
130
+ if (!trimmedMessage && !opts.mediaUrl && !blocks) {
131
+ throw new Error("Slack send requires text, blocks, or media");
66
132
  }
67
133
  const cfg = loadConfig();
68
134
  const account = resolveSlackAccount({
@@ -78,6 +144,24 @@ export async function sendMessageSlack(to, message, opts = {}) {
78
144
  const client = opts.client ?? createSlackWebClient(token);
79
145
  const recipient = parseRecipient(to);
80
146
  const { channelId } = await resolveChannelId(client, recipient);
147
+ if (blocks) {
148
+ if (opts.mediaUrl) {
149
+ throw new Error("Slack send does not support blocks with mediaUrl");
150
+ }
151
+ const fallbackText = trimmedMessage || buildSlackBlocksFallbackText(blocks);
152
+ const response = await postSlackMessageBestEffort({
153
+ client,
154
+ channelId,
155
+ text: fallbackText,
156
+ threadTs: opts.threadTs,
157
+ identity: opts.identity,
158
+ blocks,
159
+ });
160
+ return {
161
+ messageId: response.ts ?? "unknown",
162
+ channelId,
163
+ };
164
+ }
81
165
  const textLimit = resolveTextChunkLimit(cfg, "slack", account.accountId);
82
166
  const chunkLimit = Math.min(textLimit, SLACK_TEXT_LIMIT);
83
167
  const tableMode = resolveMarkdownTableMode({
@@ -90,8 +174,9 @@ export async function sendMessageSlack(to, message, opts = {}) {
90
174
  ? chunkMarkdownTextWithMode(trimmedMessage, chunkLimit, chunkMode)
91
175
  : [trimmedMessage];
92
176
  const chunks = markdownChunks.flatMap((markdown) => markdownToSlackMrkdwnChunks(markdown, chunkLimit, { tableMode }));
93
- if (!chunks.length && trimmedMessage)
177
+ if (!chunks.length && trimmedMessage) {
94
178
  chunks.push(trimmedMessage);
179
+ }
95
180
  const mediaMaxBytes = typeof account.config.mediaMaxMb === "number"
96
181
  ? account.config.mediaMaxMb * 1024 * 1024
97
182
  : undefined;
@@ -102,25 +187,30 @@ export async function sendMessageSlack(to, message, opts = {}) {
102
187
  client,
103
188
  channelId,
104
189
  mediaUrl: opts.mediaUrl,
190
+ mediaLocalRoots: opts.mediaLocalRoots,
105
191
  caption: firstChunk,
106
192
  threadTs: opts.threadTs,
107
193
  maxBytes: mediaMaxBytes,
108
194
  });
109
195
  for (const chunk of rest) {
110
- const response = await client.chat.postMessage({
111
- channel: channelId,
196
+ const response = await postSlackMessageBestEffort({
197
+ client,
198
+ channelId,
112
199
  text: chunk,
113
- thread_ts: opts.threadTs,
200
+ threadTs: opts.threadTs,
201
+ identity: opts.identity,
114
202
  });
115
203
  lastMessageId = response.ts ?? lastMessageId;
116
204
  }
117
205
  }
118
206
  else {
119
207
  for (const chunk of chunks.length ? chunks : [""]) {
120
- const response = await client.chat.postMessage({
121
- channel: channelId,
208
+ const response = await postSlackMessageBestEffort({
209
+ client,
210
+ channelId,
122
211
  text: chunk,
123
- thread_ts: opts.threadTs,
212
+ threadTs: opts.threadTs,
213
+ identity: opts.identity,
124
214
  });
125
215
  lastMessageId = response.ts ?? lastMessageId;
126
216
  }
@@ -1,3 +1,4 @@
1
+ import { mapStreamingModeToSlackLegacyDraftStreamMode, resolveSlackNativeStreaming, resolveSlackStreamingMode, } from "../config/discord-preview-streaming.js";
1
2
  const DEFAULT_STREAM_MODE = "replace";
2
3
  export function resolveSlackStreamMode(raw) {
3
4
  if (typeof raw !== "string") {
@@ -9,6 +10,15 @@ export function resolveSlackStreamMode(raw) {
9
10
  }
10
11
  return DEFAULT_STREAM_MODE;
11
12
  }
13
+ export function resolveSlackStreamingConfig(params) {
14
+ const mode = resolveSlackStreamingMode(params);
15
+ const nativeStreaming = resolveSlackNativeStreaming(params);
16
+ return {
17
+ mode,
18
+ nativeStreaming,
19
+ draftMode: mapStreamingModeToSlackLegacyDraftStreamMode(mode),
20
+ };
21
+ }
12
22
  export function applyAppendOnlyStreamUpdate(params) {
13
23
  const incoming = params.incoming.trimEnd();
14
24
  if (!incoming) {
@@ -23,11 +23,13 @@ import { logVerbose } from "../globals.js";
23
23
  * The first chunk of text can optionally be included via `text`.
24
24
  */
25
25
  export async function startSlackStream(params) {
26
- const { client, channel, threadTs, text } = params;
27
- logVerbose(`slack-stream: starting stream in ${channel} thread=${threadTs}`);
26
+ const { client, channel, threadTs, text, teamId, userId } = params;
27
+ logVerbose(`slack-stream: starting stream in ${channel} thread=${threadTs}${teamId ? ` team=${teamId}` : ""}${userId ? ` user=${userId}` : ""}`);
28
28
  const streamer = client.chatStream({
29
29
  channel,
30
30
  thread_ts: threadTs,
31
+ ...(teamId ? { recipient_team_id: teamId } : {}),
32
+ ...(userId ? { recipient_user_id: userId } : {}),
31
33
  });
32
34
  const session = {
33
35
  streamer,
@@ -1,10 +1,24 @@
1
+ import util from "node:util";
2
+ import { createAccountActionGate } from "../channels/plugins/account-action-gate.js";
1
3
  import { isTruthyEnvValue } from "../infra/env.js";
4
+ import { createSubsystemLogger } from "../logging/subsystem.js";
2
5
  import { listBoundAccountIds, resolveDefaultAgentBoundAccountId } from "../routing/bindings.js";
3
6
  import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js";
4
7
  import { resolveTelegramToken } from "./token.js";
8
+ const log = createSubsystemLogger("telegram/accounts");
9
+ function formatDebugArg(value) {
10
+ if (typeof value === "string") {
11
+ return value;
12
+ }
13
+ if (value instanceof Error) {
14
+ return value.stack ?? value.message;
15
+ }
16
+ return util.inspect(value, { colors: false, depth: null, compact: true, breakLength: Infinity });
17
+ }
5
18
  const debugAccounts = (...args) => {
6
19
  if (isTruthyEnvValue(process.env.POOLBOT_DEBUG_TELEGRAM_ACCOUNTS)) {
7
- console.warn("[telegram:accounts]", ...args);
20
+ const parts = args.map((arg) => formatDebugArg(arg));
21
+ log.warn(parts.join(" ").trim());
8
22
  }
9
23
  };
10
24
  function listConfiguredAccountIds(cfg) {
@@ -61,19 +75,10 @@ function mergeTelegramAccountConfig(cfg, accountId) {
61
75
  }
62
76
  export function createTelegramActionGate(params) {
63
77
  const accountId = normalizeAccountId(params.accountId);
64
- const baseActions = params.cfg.channels?.telegram?.actions;
65
- const accountActions = resolveAccountConfig(params.cfg, accountId)?.actions;
66
- return (key, defaultValue = true) => {
67
- const accountValue = accountActions?.[key];
68
- if (accountValue !== undefined) {
69
- return accountValue;
70
- }
71
- const baseValue = baseActions?.[key];
72
- if (baseValue !== undefined) {
73
- return baseValue;
74
- }
75
- return defaultValue;
76
- };
78
+ return createAccountActionGate({
79
+ baseActions: params.cfg.channels?.telegram?.actions,
80
+ accountActions: resolveAccountConfig(params.cfg, accountId)?.actions,
81
+ });
77
82
  }
78
83
  export function resolveTelegramAccount(params) {
79
84
  const hasExplicitAccountId = Boolean(params.accountId?.trim());
@@ -1,4 +1,5 @@
1
1
  import { formatLocationText } from "../../channels/location.js";
2
+ import { resolveTelegramPreviewStreamMode } from "../../config/discord-preview-streaming.js";
2
3
  import { readChannelAllowFromStore } from "../../pairing/pairing-store.js";
3
4
  import { firstDefined, normalizeAllowFromWithStore, } from "../bot-access.js";
4
5
  const TELEGRAM_GENERAL_TOPIC_ID = 1;
@@ -13,6 +14,7 @@ export async function resolveTelegramGroupAllowFromContext(params) {
13
14
  const effectiveGroupAllow = normalizeAllowFromWithStore({
14
15
  allowFrom: groupAllowOverride ?? params.groupAllowFrom,
15
16
  storeAllowFrom,
17
+ dmPolicy: params.dmPolicy,
16
18
  });
17
19
  const hasGroupAllowOverride = typeof groupAllowOverride !== "undefined";
18
20
  return {
@@ -100,11 +102,7 @@ export function buildTypingThreadParams(messageThreadId) {
100
102
  return { message_thread_id: Math.trunc(messageThreadId) };
101
103
  }
102
104
  export function resolveTelegramStreamMode(telegramCfg) {
103
- const raw = telegramCfg?.streamMode?.trim().toLowerCase();
104
- if (raw === "off" || raw === "partial" || raw === "block") {
105
- return raw;
106
- }
107
- return "partial";
105
+ return resolveTelegramPreviewStreamMode(telegramCfg);
108
106
  }
109
107
  export function buildTelegramGroupPeerId(chatId, messageThreadId) {
110
108
  return messageThreadId != null ? `${chatId}:topic:${messageThreadId}` : String(chatId);
@@ -1,59 +1,58 @@
1
+ import { firstDefined, isSenderIdAllowed, mergeAllowFromSources } from "../channels/allow-from.js";
2
+ import { createSubsystemLogger } from "../logging/subsystem.js";
3
+ const warnedInvalidEntries = new Set();
4
+ const log = createSubsystemLogger("telegram/bot-access");
5
+ function warnInvalidAllowFromEntries(entries) {
6
+ if (process.env.VITEST || process.env.NODE_ENV === "test") {
7
+ return;
8
+ }
9
+ for (const entry of entries) {
10
+ if (warnedInvalidEntries.has(entry)) {
11
+ continue;
12
+ }
13
+ warnedInvalidEntries.add(entry);
14
+ log.warn([
15
+ "Invalid allowFrom entry:",
16
+ JSON.stringify(entry),
17
+ "- allowFrom/groupAllowFrom authorization requires numeric Telegram sender IDs only.",
18
+ 'If you had "@username" entries, re-run onboarding (it resolves @username to IDs) or replace them manually.',
19
+ ].join(" "));
20
+ }
21
+ }
1
22
  export const normalizeAllowFrom = (list) => {
2
23
  const entries = (list ?? []).map((value) => String(value).trim()).filter(Boolean);
3
24
  const hasWildcard = entries.includes("*");
4
25
  const normalized = entries
5
26
  .filter((value) => value !== "*")
6
27
  .map((value) => value.replace(/^(telegram|tg):/i, ""));
7
- const normalizedLower = normalized.map((value) => value.toLowerCase());
28
+ const invalidEntries = normalized.filter((value) => !/^\d+$/.test(value));
29
+ if (invalidEntries.length > 0) {
30
+ warnInvalidAllowFromEntries([...new Set(invalidEntries)]);
31
+ }
32
+ const ids = normalized.filter((value) => /^\d+$/.test(value));
8
33
  return {
9
- entries: normalized,
10
- entriesLower: normalizedLower,
34
+ entries: ids,
11
35
  hasWildcard,
12
36
  hasEntries: entries.length > 0,
37
+ invalidEntries,
13
38
  };
14
39
  };
15
- export const normalizeAllowFromWithStore = (params) => {
16
- const combined = [...(params.allowFrom ?? []), ...(params.storeAllowFrom ?? [])]
17
- .map((value) => String(value).trim())
18
- .filter(Boolean);
19
- return normalizeAllowFrom(combined);
20
- };
21
- export const firstDefined = (...values) => {
22
- for (const value of values) {
23
- if (typeof value !== "undefined")
24
- return value;
25
- }
26
- return undefined;
27
- };
40
+ export const normalizeAllowFromWithStore = (params) => normalizeAllowFrom(mergeAllowFromSources(params));
28
41
  export const isSenderAllowed = (params) => {
29
- const { allow, senderId, senderUsername } = params;
30
- if (!allow.hasEntries)
31
- return true;
32
- if (allow.hasWildcard)
33
- return true;
34
- if (senderId && allow.entries.includes(senderId))
35
- return true;
36
- const username = senderUsername?.toLowerCase();
37
- if (!username)
38
- return false;
39
- return allow.entriesLower.some((entry) => entry === username || entry === `@${username}`);
42
+ const { allow, senderId } = params;
43
+ return isSenderIdAllowed(allow, senderId, true);
40
44
  };
45
+ export { firstDefined };
41
46
  export const resolveSenderAllowMatch = (params) => {
42
- const { allow, senderId, senderUsername } = params;
47
+ const { allow, senderId } = params;
43
48
  if (allow.hasWildcard) {
44
49
  return { allowed: true, matchKey: "*", matchSource: "wildcard" };
45
50
  }
46
- if (!allow.hasEntries)
51
+ if (!allow.hasEntries) {
47
52
  return { allowed: false };
53
+ }
48
54
  if (senderId && allow.entries.includes(senderId)) {
49
55
  return { allowed: true, matchKey: senderId, matchSource: "id" };
50
56
  }
51
- const username = senderUsername?.toLowerCase();
52
- if (!username)
53
- return { allowed: false };
54
- const entry = allow.entriesLower.find((candidate) => candidate === username || candidate === `@${username}`);
55
- if (entry) {
56
- return { allowed: true, matchKey: entry, matchSource: "username" };
57
- }
58
57
  return { allowed: false };
59
58
  };