@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
@@ -23,3 +23,9 @@ export function evaluateEntryMetadataRequirements(params) {
23
23
  configChecks,
24
24
  };
25
25
  }
26
+ export function evaluateEntryMetadataRequirementsForCurrentPlatform(params) {
27
+ return evaluateEntryMetadataRequirements({
28
+ ...params,
29
+ localPlatform: process.platform,
30
+ });
31
+ }
@@ -24,7 +24,7 @@ export function parseFrontmatterBool(value, fallback) {
24
24
  const parsed = parseBooleanValue(value);
25
25
  return parsed === undefined ? fallback : parsed;
26
26
  }
27
- export function resolvePoolbotManifestBlock(params) {
27
+ export function resolvePoolBotManifestBlock(params) {
28
28
  const raw = getFrontmatterString(params.frontmatter, params.key ?? "metadata");
29
29
  if (!raw) {
30
30
  return undefined;
@@ -47,7 +47,7 @@ export function resolvePoolbotManifestBlock(params) {
47
47
  return undefined;
48
48
  }
49
49
  }
50
- export function resolvePoolbotManifestRequires(metadataObj) {
50
+ export function resolvePoolBotManifestRequires(metadataObj) {
51
51
  const requiresRaw = typeof metadataObj.requires === "object" && metadataObj.requires !== null
52
52
  ? metadataObj.requires
53
53
  : undefined;
@@ -61,16 +61,16 @@ export function resolvePoolbotManifestRequires(metadataObj) {
61
61
  config: normalizeStringList(requiresRaw.config),
62
62
  };
63
63
  }
64
- export function resolvePoolbotManifestInstall(metadataObj, parseInstallSpec) {
64
+ export function resolvePoolBotManifestInstall(metadataObj, parseInstallSpec) {
65
65
  const installRaw = Array.isArray(metadataObj.install) ? metadataObj.install : [];
66
66
  return installRaw
67
67
  .map((entry) => parseInstallSpec(entry))
68
68
  .filter((entry) => Boolean(entry));
69
69
  }
70
- export function resolvePoolbotManifestOs(metadataObj) {
70
+ export function resolvePoolBotManifestOs(metadataObj) {
71
71
  return normalizeStringList(metadataObj.os);
72
72
  }
73
- export function parsePoolbotManifestInstallBase(input, allowedKinds) {
73
+ export function parsePoolBotManifestInstallBase(input, allowedKinds) {
74
74
  if (!input || typeof input !== "object") {
75
75
  return undefined;
76
76
  }
@@ -39,14 +39,21 @@ export function resolveNodeIdFromCandidates(nodes, query) {
39
39
  if (!q) {
40
40
  throw new Error("node required");
41
41
  }
42
- const matches = resolveNodeMatches(nodes, q);
43
- if (matches.length === 1) {
44
- return matches[0]?.nodeId ?? "";
42
+ const rawMatches = resolveNodeMatches(nodes, q);
43
+ if (rawMatches.length === 1) {
44
+ return rawMatches[0]?.nodeId ?? "";
45
45
  }
46
- if (matches.length === 0) {
46
+ if (rawMatches.length === 0) {
47
47
  const known = listKnownNodes(nodes);
48
48
  throw new Error(`unknown node: ${q}${known ? ` (known: ${known})` : ""}`);
49
49
  }
50
+ // Re-pair/reinstall flows can leave multiple nodes with the same display name.
51
+ // Prefer a unique connected match when available.
52
+ const connectedMatches = rawMatches.filter((match) => match.connected === true);
53
+ const matches = connectedMatches.length > 0 ? connectedMatches : rawMatches;
54
+ if (matches.length === 1) {
55
+ return matches[0]?.nodeId ?? "";
56
+ }
50
57
  throw new Error(`ambiguous node: ${q} (matches: ${matches
51
58
  .map((n) => n.displayName || n.remoteIp || n.nodeId)
52
59
  .join(", ")})`);
@@ -2,6 +2,7 @@ const OPERATOR_ROLE = "operator";
2
2
  const OPERATOR_ADMIN_SCOPE = "operator.admin";
3
3
  const OPERATOR_READ_SCOPE = "operator.read";
4
4
  const OPERATOR_WRITE_SCOPE = "operator.write";
5
+ const OPERATOR_SCOPE_PREFIX = "operator.";
5
6
  function normalizeScopeList(scopes) {
6
7
  const out = new Set();
7
8
  for (const scope of scopes) {
@@ -13,10 +14,14 @@ function normalizeScopeList(scopes) {
13
14
  return [...out];
14
15
  }
15
16
  function operatorScopeSatisfied(requestedScope, granted) {
17
+ if (granted.has(OPERATOR_ADMIN_SCOPE) && requestedScope.startsWith(OPERATOR_SCOPE_PREFIX)) {
18
+ return true;
19
+ }
16
20
  if (requestedScope === OPERATOR_READ_SCOPE) {
17
- return (granted.has(OPERATOR_READ_SCOPE) ||
18
- granted.has(OPERATOR_WRITE_SCOPE) ||
19
- granted.has(OPERATOR_ADMIN_SCOPE));
21
+ return granted.has(OPERATOR_READ_SCOPE) || granted.has(OPERATOR_WRITE_SCOPE);
22
+ }
23
+ if (requestedScope === OPERATOR_WRITE_SCOPE) {
24
+ return granted.has(OPERATOR_WRITE_SCOPE);
20
25
  }
21
26
  return granted.has(requestedScope);
22
27
  }
@@ -1,26 +1,13 @@
1
- import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js";
2
- function listConfiguredAccountIds(cfg) {
3
- const accounts = cfg.channels?.signal?.accounts;
4
- if (!accounts || typeof accounts !== "object")
5
- return [];
6
- return Object.keys(accounts).filter(Boolean);
7
- }
8
- export function listSignalAccountIds(cfg) {
9
- const ids = listConfiguredAccountIds(cfg);
10
- if (ids.length === 0)
11
- return [DEFAULT_ACCOUNT_ID];
12
- return ids.sort((a, b) => a.localeCompare(b));
13
- }
14
- export function resolveDefaultSignalAccountId(cfg) {
15
- const ids = listSignalAccountIds(cfg);
16
- if (ids.includes(DEFAULT_ACCOUNT_ID))
17
- return DEFAULT_ACCOUNT_ID;
18
- return ids[0] ?? DEFAULT_ACCOUNT_ID;
19
- }
1
+ import { createAccountListHelpers } from "../channels/plugins/account-helpers.js";
2
+ import { normalizeAccountId } from "../routing/session-key.js";
3
+ const { listAccountIds, resolveDefaultAccountId } = createAccountListHelpers("signal");
4
+ export const listSignalAccountIds = listAccountIds;
5
+ export const resolveDefaultSignalAccountId = resolveDefaultAccountId;
20
6
  function resolveAccountConfig(cfg, accountId) {
21
7
  const accounts = cfg.channels?.signal?.accounts;
22
- if (!accounts || typeof accounts !== "object")
8
+ if (!accounts || typeof accounts !== "object") {
23
9
  return undefined;
10
+ }
24
11
  return accounts[accountId];
25
12
  }
26
13
  function mergeSignalAccountConfig(cfg, accountId) {
@@ -379,7 +379,9 @@ export function createSignalEventHandler(deps) {
379
379
  const groupId = dataMessage.groupInfo?.groupId ?? undefined;
380
380
  const groupName = dataMessage.groupInfo?.groupName ?? undefined;
381
381
  const isGroup = Boolean(groupId);
382
- const storeAllowFrom = await readChannelAllowFromStore("signal").catch(() => []);
382
+ const storeAllowFrom = deps.dmPolicy === "allowlist"
383
+ ? []
384
+ : await readChannelAllowFromStore("signal").catch(() => []);
383
385
  const effectiveDmAllow = [...deps.allowFrom, ...storeAllowFrom];
384
386
  const effectiveGroupAllow = [...deps.groupAllowFrom, ...storeAllowFrom];
385
387
  const dmAllowed = deps.dmPolicy === "open" ? true : isSignalSenderAllowed(sender, effectiveDmAllow);
@@ -1,28 +1,15 @@
1
1
  import { normalizeChatType } from "../channels/chat-type.js";
2
+ import { createAccountListHelpers } from "../channels/plugins/account-helpers.js";
2
3
  import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js";
3
4
  import { resolveSlackAppToken, resolveSlackBotToken } from "./token.js";
4
- function listConfiguredAccountIds(cfg) {
5
- const accounts = cfg.channels?.slack?.accounts;
6
- if (!accounts || typeof accounts !== "object")
7
- return [];
8
- return Object.keys(accounts).filter(Boolean);
9
- }
10
- export function listSlackAccountIds(cfg) {
11
- const ids = listConfiguredAccountIds(cfg);
12
- if (ids.length === 0)
13
- return [DEFAULT_ACCOUNT_ID];
14
- return ids.sort((a, b) => a.localeCompare(b));
15
- }
16
- export function resolveDefaultSlackAccountId(cfg) {
17
- const ids = listSlackAccountIds(cfg);
18
- if (ids.includes(DEFAULT_ACCOUNT_ID))
19
- return DEFAULT_ACCOUNT_ID;
20
- return ids[0] ?? DEFAULT_ACCOUNT_ID;
21
- }
5
+ const { listAccountIds, resolveDefaultAccountId } = createAccountListHelpers("slack");
6
+ export const listSlackAccountIds = listAccountIds;
7
+ export const resolveDefaultSlackAccountId = resolveDefaultAccountId;
22
8
  function resolveAccountConfig(cfg, accountId) {
23
9
  const accounts = cfg.channels?.slack?.accounts;
24
- if (!accounts || typeof accounts !== "object")
10
+ if (!accounts || typeof accounts !== "object") {
25
11
  return undefined;
12
+ }
26
13
  return accounts[accountId];
27
14
  }
28
15
  function mergeSlackAccountConfig(cfg, accountId) {
@@ -1,6 +1,8 @@
1
1
  import { loadConfig } from "../config/config.js";
2
2
  import { logVerbose } from "../globals.js";
3
3
  import { resolveSlackAccount } from "./accounts.js";
4
+ import { buildSlackBlocksFallbackText } from "./blocks-fallback.js";
5
+ import { validateSlackBlocksArray } from "./blocks-input.js";
4
6
  import { createSlackWebClient } from "./client.js";
5
7
  import { sendMessageSlack } from "./send.js";
6
8
  import { resolveSlackBotToken } from "./token.js";
@@ -55,15 +57,17 @@ export async function removeOwnSlackReactions(channelId, messageId, opts = {}) {
55
57
  const toRemove = new Set();
56
58
  for (const reaction of reactions ?? []) {
57
59
  const name = reaction?.name;
58
- if (!name)
60
+ if (!name) {
59
61
  continue;
62
+ }
60
63
  const users = reaction?.users ?? [];
61
64
  if (users.includes(userId)) {
62
65
  toRemove.add(name);
63
66
  }
64
67
  }
65
- if (toRemove.size === 0)
68
+ if (toRemove.size === 0) {
66
69
  return [];
70
+ }
67
71
  await Promise.all(Array.from(toRemove, (name) => client.reactions.remove({
68
72
  channel: channelId,
69
73
  timestamp: messageId,
@@ -88,14 +92,18 @@ export async function sendSlackMessage(to, content, opts = {}) {
88
92
  mediaUrl: opts.mediaUrl,
89
93
  client: opts.client,
90
94
  threadTs: opts.threadTs,
95
+ blocks: opts.blocks,
91
96
  });
92
97
  }
93
98
  export async function editSlackMessage(channelId, messageId, content, opts = {}) {
94
99
  const client = await getClient(opts);
100
+ const blocks = opts.blocks == null ? undefined : validateSlackBlocksArray(opts.blocks);
101
+ const trimmedContent = content.trim();
95
102
  await client.chat.update({
96
103
  channel: channelId,
97
104
  ts: messageId,
98
- text: content,
105
+ text: trimmedContent || (blocks ? buildSlackBlocksFallbackText(blocks) : " "),
106
+ ...(blocks ? { blocks } : {}),
99
107
  });
100
108
  }
101
109
  export async function deleteSlackMessage(channelId, messageId, opts = {}) {
@@ -1,7 +1,7 @@
1
1
  import { readChannelAllowFromStore } from "../../pairing/pairing-store.js";
2
2
  import { allowListMatches, normalizeAllowList, normalizeAllowListLower } from "./allow-list.js";
3
3
  export async function resolveSlackEffectiveAllowFrom(ctx) {
4
- const storeAllowFrom = await readChannelAllowFromStore("slack").catch(() => []);
4
+ const storeAllowFrom = ctx.dmPolicy === "allowlist" ? [] : await readChannelAllowFromStore("slack").catch(() => []);
5
5
  const allowFrom = normalizeAllowList([...ctx.allowFrom, ...storeAllowFrom]);
6
6
  const allowFromLower = normalizeAllowListLower(allowFrom);
7
7
  return { allowFrom, allowFromLower };
@@ -10,15 +10,18 @@ import { resolveStorePath, updateLastRoute } from "../../../config/sessions.js";
10
10
  import { danger, logVerbose, shouldLogVerbose } from "../../../globals.js";
11
11
  import { removeSlackReaction } from "../../actions.js";
12
12
  import { createSlackDraftStream } from "../../draft-stream.js";
13
- import { applyAppendOnlyStreamUpdate, buildStatusFinalPreviewText, resolveSlackStreamMode, } from "../../stream-mode.js";
13
+ import { applyAppendOnlyStreamUpdate, buildStatusFinalPreviewText, resolveSlackStreamingConfig, } from "../../stream-mode.js";
14
14
  import { appendSlackStream, startSlackStream, stopSlackStream } from "../../streaming.js";
15
15
  import { resolveSlackThreadTargets } from "../../threading.js";
16
16
  import { createSlackReplyDeliveryPlan, deliverReplies, resolveSlackThreadTs } from "../replies.js";
17
17
  function hasMedia(payload) {
18
18
  return Boolean(payload.mediaUrl) || (payload.mediaUrls?.length ?? 0) > 0;
19
19
  }
20
- export function isSlackStreamingEnabled(streaming) {
21
- return streaming !== false;
20
+ export function isSlackStreamingEnabled(params) {
21
+ if (params.mode !== "partial") {
22
+ return false;
23
+ }
24
+ return params.nativeStreaming;
22
25
  }
23
26
  export function resolveSlackStreamingThreadHint(params) {
24
27
  return resolveSlackThreadTs({
@@ -120,7 +123,16 @@ export async function dispatchPreparedSlackMessage(prepared) {
120
123
  channel: "slack",
121
124
  accountId: route.accountId,
122
125
  });
123
- const streamingEnabled = isSlackStreamingEnabled(account.config.streaming);
126
+ const slackStreaming = resolveSlackStreamingConfig({
127
+ streaming: account.config.streaming,
128
+ streamMode: account.config.streamMode,
129
+ nativeStreaming: account.config.nativeStreaming,
130
+ });
131
+ const previewStreamingEnabled = slackStreaming.mode !== "off";
132
+ const streamingEnabled = isSlackStreamingEnabled({
133
+ mode: slackStreaming.mode,
134
+ nativeStreaming: slackStreaming.nativeStreaming,
135
+ });
124
136
  const streamThreadHint = resolveSlackStreamingThreadHint({
125
137
  replyToMode: ctx.replyToMode,
126
138
  incomingThreadTs,
@@ -167,6 +179,8 @@ export async function dispatchPreparedSlackMessage(prepared) {
167
179
  channel: message.channel,
168
180
  threadTs: streamThreadTs,
169
181
  text,
182
+ teamId: ctx.teamId,
183
+ userId: message.user,
170
184
  });
171
185
  replyPlan.markSent();
172
186
  return;
@@ -194,7 +208,8 @@ export async function dispatchPreparedSlackMessage(prepared) {
194
208
  const draftMessageId = draftStream?.messageId();
195
209
  const draftChannelId = draftStream?.channelId();
196
210
  const finalText = payload.text;
197
- const canFinalizeViaPreviewEdit = streamMode !== "status_final" &&
211
+ const canFinalizeViaPreviewEdit = previewStreamingEnabled &&
212
+ streamMode !== "status_final" &&
198
213
  mediaCount === 0 &&
199
214
  !payload.isError &&
200
215
  typeof finalText === "string" &&
@@ -216,7 +231,7 @@ export async function dispatchPreparedSlackMessage(prepared) {
216
231
  logVerbose(`slack: preview final edit failed; falling back to standard send (${String(err)})`);
217
232
  }
218
233
  }
219
- else if (streamMode === "status_final" && hasStreamedMessage) {
234
+ else if (previewStreamingEnabled && streamMode === "status_final" && hasStreamedMessage) {
220
235
  try {
221
236
  const statusChannelId = draftStream?.channelId();
222
237
  const statusMessageId = draftStream?.messageId();
@@ -267,7 +282,7 @@ export async function dispatchPreparedSlackMessage(prepared) {
267
282
  warn: logVerbose,
268
283
  });
269
284
  let hasStreamedMessage = false;
270
- const streamMode = resolveSlackStreamMode(account.config.streamMode);
285
+ const streamMode = slackStreaming.draftMode;
271
286
  let appendRenderedText = "";
272
287
  let appendSourceText = "";
273
288
  let statusUpdateCount = 0;
@@ -312,38 +327,44 @@ export async function dispatchPreparedSlackMessage(prepared) {
312
327
  skillFilter: prepared.channelConfig?.skills,
313
328
  hasRepliedRef,
314
329
  disableBlockStreaming: useStreaming
315
- ? false
330
+ ? true
316
331
  : typeof account.config.blockStreaming === "boolean"
317
332
  ? !account.config.blockStreaming
318
333
  : undefined,
319
334
  onModelSelected,
320
335
  onPartialReply: useStreaming
321
336
  ? undefined
322
- : async (payload) => {
323
- updateDraftFromPartial(payload.text);
324
- },
337
+ : !previewStreamingEnabled
338
+ ? undefined
339
+ : async (payload) => {
340
+ updateDraftFromPartial(payload.text);
341
+ },
325
342
  onAssistantMessageStart: useStreaming
326
343
  ? undefined
327
- : async () => {
328
- if (hasStreamedMessage) {
329
- draftStream.forceNewMessage();
330
- hasStreamedMessage = false;
331
- appendRenderedText = "";
332
- appendSourceText = "";
333
- statusUpdateCount = 0;
334
- }
335
- },
344
+ : !previewStreamingEnabled
345
+ ? undefined
346
+ : async () => {
347
+ if (hasStreamedMessage) {
348
+ draftStream.forceNewMessage();
349
+ hasStreamedMessage = false;
350
+ appendRenderedText = "";
351
+ appendSourceText = "";
352
+ statusUpdateCount = 0;
353
+ }
354
+ },
336
355
  onReasoningEnd: useStreaming
337
356
  ? undefined
338
- : async () => {
339
- if (hasStreamedMessage) {
340
- draftStream.forceNewMessage();
341
- hasStreamedMessage = false;
342
- appendRenderedText = "";
343
- appendSourceText = "";
344
- statusUpdateCount = 0;
345
- }
346
- },
357
+ : !previewStreamingEnabled
358
+ ? undefined
359
+ : async () => {
360
+ if (hasStreamedMessage) {
361
+ draftStream.forceNewMessage();
362
+ hasStreamedMessage = false;
363
+ appendRenderedText = "";
364
+ appendSourceText = "";
365
+ statusUpdateCount = 0;
366
+ }
367
+ },
347
368
  },
348
369
  });
349
370
  await draftStream.flush();
@@ -1,6 +1,6 @@
1
+ import { chunkMarkdownTextWithMode } from "../../auto-reply/chunk.js";
1
2
  import { createReplyReferencePlanner } from "../../auto-reply/reply/reply-reference.js";
2
3
  import { isSilentReplyText, SILENT_REPLY_TOKEN } from "../../auto-reply/tokens.js";
3
- import { chunkMarkdownTextWithMode } from "../../auto-reply/chunk.js";
4
4
  import { markdownToSlackMrkdwnChunks } from "../format.js";
5
5
  import { sendMessageSlack } from "../send.js";
6
6
  export async function deliverReplies(params) {
@@ -8,12 +8,14 @@ export async function deliverReplies(params) {
8
8
  const threadTs = payload.replyToId ?? params.replyThreadTs;
9
9
  const mediaList = payload.mediaUrls ?? (payload.mediaUrl ? [payload.mediaUrl] : []);
10
10
  const text = payload.text ?? "";
11
- if (!text && mediaList.length === 0)
11
+ if (!text && mediaList.length === 0) {
12
12
  continue;
13
+ }
13
14
  if (mediaList.length === 0) {
14
15
  const trimmed = text.trim();
15
- if (!trimmed || isSilentReplyText(trimmed, SILENT_REPLY_TOKEN))
16
+ if (!trimmed || isSilentReplyText(trimmed, SILENT_REPLY_TOKEN)) {
16
17
  continue;
18
+ }
17
19
  await sendMessageSlack(params.target, trimmed, {
18
20
  token: params.token,
19
21
  threadTs,
@@ -52,8 +54,11 @@ export function resolveSlackThreadTs(params) {
52
54
  return planner.use();
53
55
  }
54
56
  function createSlackReplyReferencePlanner(params) {
57
+ // When already inside a Slack thread, always stay in it regardless of
58
+ // replyToMode — thread_ts is required to keep messages in the thread.
59
+ const effectiveMode = params.incomingThreadTs ? "all" : params.replyToMode;
55
60
  return createReplyReferencePlanner({
56
- replyToMode: params.replyToMode,
61
+ replyToMode: effectiveMode,
57
62
  existingId: params.incomingThreadTs,
58
63
  startId: params.messageTs,
59
64
  hasReplied: params.hasReplied,
@@ -84,21 +89,24 @@ export async function deliverSlackSlashReplies(params) {
84
89
  const combined = [text ?? "", ...mediaList.map((url) => url.trim()).filter(Boolean)]
85
90
  .filter(Boolean)
86
91
  .join("\n");
87
- if (!combined)
92
+ if (!combined) {
88
93
  continue;
94
+ }
89
95
  const chunkMode = params.chunkMode ?? "length";
90
96
  const markdownChunks = chunkMode === "newline"
91
97
  ? chunkMarkdownTextWithMode(combined, chunkLimit, chunkMode)
92
98
  : [combined];
93
99
  const chunks = markdownChunks.flatMap((markdown) => markdownToSlackMrkdwnChunks(markdown, chunkLimit, { tableMode: params.tableMode }));
94
- if (!chunks.length && combined)
100
+ if (!chunks.length && combined) {
95
101
  chunks.push(combined);
102
+ }
96
103
  for (const chunk of chunks) {
97
104
  messages.push(chunk);
98
105
  }
99
106
  }
100
- if (messages.length === 0)
107
+ if (messages.length === 0) {
101
108
  return;
109
+ }
102
110
  // Slack slash command responses can be multi-part by sending follow-ups via response_url.
103
111
  const responseType = params.ephemeral ? "ephemeral" : "in_channel";
104
112
  for (const text of messages) {
@@ -9,6 +9,7 @@ import { normalizeAllowList, normalizeAllowListLower, resolveSlackAllowListMatch
9
9
  import { resolveSlackChannelConfig } from "./channel-config.js";
10
10
  import { buildSlackSlashCommandMatcher, resolveSlackSlashCommandConfig } from "./commands.js";
11
11
  import { normalizeSlackChannelType } from "./context.js";
12
+ import { escapeSlackMrkdwn } from "./mrkdwn.js";
12
13
  import { isSlackChannelAllowedByPolicy } from "./policy.js";
13
14
  import { resolveSlackRoomContextHints } from "./room-context.js";
14
15
  const SLACK_COMMAND_ARG_ACTION_ID = "poolbot_cmdarg";
@@ -32,14 +33,6 @@ function truncatePlainText(value, max) {
32
33
  }
33
34
  return `${trimmed.slice(0, max - 1)}…`;
34
35
  }
35
- function escapeSlackMrkdwn(value) {
36
- return value
37
- .replaceAll("\\", "\\\\")
38
- .replaceAll("&", "&")
39
- .replaceAll("<", "&lt;")
40
- .replaceAll(">", "&gt;")
41
- .replace(/([*_`~])/g, "\\$1");
42
- }
43
36
  function buildSlackArgMenuConfirm(params) {
44
37
  const command = escapeSlackMrkdwn(params.command);
45
38
  const arg = escapeSlackMrkdwn(params.arg);
@@ -267,7 +260,9 @@ export async function registerSlackMonitorSlashCommands(params) {
267
260
  });
268
261
  return;
269
262
  }
270
- const storeAllowFrom = await readChannelAllowFromStore("slack").catch(() => []);
263
+ const storeAllowFrom = ctx.dmPolicy === "allowlist"
264
+ ? []
265
+ : await readChannelAllowFromStore("slack").catch(() => []);
271
266
  const effectiveAllowFrom = normalizeAllowList([...ctx.allowFrom, ...storeAllowFrom]);
272
267
  const effectiveAllowFromLower = normalizeAllowListLower(effectiveAllowFrom);
273
268
  // Privileged command surface: compute CommandAuthorized, don't assume true.
@@ -435,9 +430,10 @@ export async function registerSlackMonitorSlashCommands(params) {
435
430
  import("../../auto-reply/reply/inbound-context.js"),
436
431
  import("../../auto-reply/reply/provider-dispatcher.js"),
437
432
  ]);
438
- const [{ resolveConversationLabel }, { createReplyPrefixOptions }] = await Promise.all([
433
+ const [{ resolveConversationLabel }, { createReplyPrefixOptions }, { recordSessionMetaFromInbound, resolveStorePath },] = await Promise.all([
439
434
  import("../../channels/conversation-label.js"),
440
435
  import("../../channels/reply-prefix.js"),
436
+ import("../../config/sessions.js"),
441
437
  ]);
442
438
  const route = resolveAgentRoute({
443
439
  cfg,
@@ -495,6 +491,19 @@ export async function registerSlackMonitorSlashCommands(params) {
495
491
  OriginatingChannel: "slack",
496
492
  OriginatingTo: `user:${command.user_id}`,
497
493
  });
494
+ const storePath = resolveStorePath(cfg.session?.store, {
495
+ agentId: route.agentId,
496
+ });
497
+ try {
498
+ await recordSessionMetaFromInbound({
499
+ storePath,
500
+ sessionKey: ctxPayload.SessionKey ?? route.sessionKey,
501
+ ctx: ctxPayload,
502
+ });
503
+ }
504
+ catch (err) {
505
+ runtime.error?.(danger(`slack slash: failed updating session meta: ${String(err)}`));
506
+ }
498
507
  const { onModelSelected, ...prefixOptions } = createReplyPrefixOptions({
499
508
  cfg,
500
509
  agentId: route.agentId,
@@ -613,11 +622,11 @@ export async function registerSlackMonitorSlashCommands(params) {
613
622
  return;
614
623
  }
615
624
  const registerArgOptions = () => {
616
- const optionsHandler = ctx.app.options;
617
- if (typeof optionsHandler !== "function") {
625
+ const appWithOptions = ctx.app;
626
+ if (typeof appWithOptions.options !== "function") {
618
627
  return;
619
628
  }
620
- optionsHandler(SLACK_COMMAND_ARG_ACTION_ID, async ({ ack, body }) => {
629
+ appWithOptions.options(SLACK_COMMAND_ARG_ACTION_ID, async ({ ack, body }) => {
621
630
  const typedBody = body;
622
631
  pruneSlackExternalArgMenuStore();
623
632
  const blockId = typedBody.actions?.[0]?.block_id ?? typedBody.block_id;
@@ -1,8 +1,9 @@
1
1
  import { createSlackWebClient } from "./client.js";
2
2
  function parseSlackChannelMention(raw) {
3
3
  const trimmed = raw.trim();
4
- if (!trimmed)
4
+ if (!trimmed) {
5
5
  return {};
6
+ }
6
7
  const mention = trimmed.match(/^<#([A-Z0-9]+)(?:\|([^>]+))?>$/i);
7
8
  if (mention) {
8
9
  const id = mention[1]?.toUpperCase();
@@ -10,8 +11,9 @@ function parseSlackChannelMention(raw) {
10
11
  return { id, name };
11
12
  }
12
13
  const prefixed = trimmed.replace(/^(slack:|channel:)/i, "");
13
- if (/^[CG][A-Z0-9]+$/i.test(prefixed))
14
+ if (/^[CG][A-Z0-9]+$/i.test(prefixed)) {
14
15
  return { id: prefixed.toUpperCase() };
16
+ }
15
17
  const name = prefixed.replace(/^#/, "").trim();
16
18
  return name ? { name } : {};
17
19
  }
@@ -28,8 +30,9 @@ async function listSlackChannels(client) {
28
30
  for (const channel of res.channels ?? []) {
29
31
  const id = channel.id?.trim();
30
32
  const name = channel.name?.trim();
31
- if (!id || !name)
33
+ if (!id || !name) {
32
34
  continue;
35
+ }
33
36
  channels.push({
34
37
  id,
35
38
  name,
@@ -44,11 +47,13 @@ async function listSlackChannels(client) {
44
47
  }
45
48
  function resolveByName(name, channels) {
46
49
  const target = name.trim().toLowerCase();
47
- if (!target)
50
+ if (!target) {
48
51
  return undefined;
52
+ }
49
53
  const matches = channels.filter((channel) => channel.name.toLowerCase() === target);
50
- if (matches.length === 0)
54
+ if (matches.length === 0) {
51
55
  return undefined;
56
+ }
52
57
  const active = matches.find((channel) => !channel.archived);
53
58
  return active ?? matches[0];
54
59
  }