@poolzin/pool-bot 2026.2.24 → 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 (646) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/acp/client.js +207 -18
  3. package/dist/acp/event-mapper.js +87 -22
  4. package/dist/acp/meta.js +12 -6
  5. package/dist/acp/secret-file.js +22 -0
  6. package/dist/agents/agent-paths.js +8 -9
  7. package/dist/agents/agent-scope.js +17 -5
  8. package/dist/agents/auth-profiles/oauth.js +148 -64
  9. package/dist/agents/auth-profiles/session-override.js +13 -7
  10. package/dist/agents/bash-process-registry.test-helpers.js +29 -0
  11. package/dist/agents/bash-tools.exec-approval-request.js +20 -0
  12. package/dist/agents/bash-tools.exec-host-gateway.js +240 -0
  13. package/dist/agents/bash-tools.exec-host-node.js +235 -0
  14. package/dist/agents/bash-tools.exec-runtime.js +2 -25
  15. package/dist/agents/bash-tools.exec-types.js +1 -0
  16. package/dist/agents/bash-tools.process.js +224 -218
  17. package/dist/agents/bedrock-discovery.js +3 -1
  18. package/dist/agents/byteplus-models.js +97 -0
  19. package/dist/agents/chutes-oauth.js +1 -0
  20. package/dist/agents/cli-runner/helpers.js +4 -0
  21. package/dist/agents/compaction.js +41 -14
  22. package/dist/agents/content-blocks.js +16 -0
  23. package/dist/agents/doubao-models.js +121 -0
  24. package/dist/agents/failover-error.js +2 -0
  25. package/dist/agents/huggingface-models.js +5 -3
  26. package/dist/agents/live-model-filter.js +5 -0
  27. package/dist/agents/minimax-vlm.js +10 -8
  28. package/dist/agents/model-auth.js +6 -0
  29. package/dist/agents/model-catalog.js +3 -1
  30. package/dist/agents/model-fallback.js +96 -101
  31. package/dist/agents/model-selection.js +7 -1
  32. package/dist/agents/models-config.providers.js +364 -165
  33. package/dist/agents/ollama-stream.js +117 -4
  34. package/dist/agents/opencode-zen-models.js +22 -11
  35. package/dist/agents/pi-embedded-helpers/errors.js +55 -33
  36. package/dist/agents/pi-embedded-helpers/messaging-dedupe.js +10 -5
  37. package/dist/agents/pi-embedded-helpers/thinking.js +10 -5
  38. package/dist/agents/pi-embedded-helpers.js +1 -1
  39. package/dist/agents/pi-embedded-payloads.js +1 -0
  40. package/dist/agents/pi-embedded-runner/compact.js +29 -7
  41. package/dist/agents/pi-embedded-runner/extensions.js +28 -26
  42. package/dist/agents/pi-embedded-runner/google.js +20 -8
  43. package/dist/agents/pi-embedded-runner/run/attempt.js +95 -36
  44. package/dist/agents/pi-embedded-runner/run.js +71 -12
  45. package/dist/agents/pi-embedded-runner/run.overflow-compaction.fixture.js +34 -0
  46. package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +11 -2
  47. package/dist/agents/pi-embedded-runner/session-manager-cache.js +11 -7
  48. package/dist/agents/pi-embedded-runner/system-prompt.js +2 -0
  49. package/dist/agents/pi-embedded-runner/thinking.js +42 -0
  50. package/dist/agents/pi-embedded-runner/tool-name-allowlist.js +19 -0
  51. package/dist/agents/pi-embedded-runner/utils.js +7 -10
  52. package/dist/agents/pi-embedded-subscribe.handlers.lifecycle.js +45 -56
  53. package/dist/agents/pi-embedded-subscribe.handlers.tools.js +2 -2
  54. package/dist/agents/pi-embedded-subscribe.js +9 -4
  55. package/dist/agents/pi-embedded-subscribe.tools.js +68 -14
  56. package/dist/agents/pi-embedded-utils.js +3 -0
  57. package/dist/agents/pi-extensions/compaction-safeguard-runtime.js +4 -20
  58. package/dist/agents/pi-extensions/compaction-safeguard.js +75 -33
  59. package/dist/agents/pi-settings.js +40 -0
  60. package/dist/agents/pi-tools.policy.js +2 -1
  61. package/dist/agents/provider/config-loader.js +1 -1
  62. package/dist/agents/sandbox/browser.js +170 -33
  63. package/dist/agents/sandbox/config-hash.js +14 -27
  64. package/dist/agents/sandbox/config.js +21 -2
  65. package/dist/agents/sandbox/constants.js +2 -0
  66. package/dist/agents/sandbox/docker.js +16 -2
  67. package/dist/agents/sandbox/novnc-auth.js +62 -0
  68. package/dist/agents/sandbox/sanitize-env-vars.js +1 -1
  69. package/dist/agents/sandbox/shared.js +10 -6
  70. package/dist/agents/sandbox-paths.js +24 -11
  71. package/dist/agents/schema/clean-for-gemini.js +132 -85
  72. package/dist/agents/session-slug.js +10 -5
  73. package/dist/agents/session-tool-result-guard-wrapper.js +1 -0
  74. package/dist/agents/session-tool-result-guard.js +3 -1
  75. package/dist/agents/session-transcript-repair.js +40 -6
  76. package/dist/agents/skills/bundled-dir.js +19 -5
  77. package/dist/agents/skills/env-overrides.js +124 -43
  78. package/dist/agents/skills/frontmatter.js +6 -6
  79. package/dist/agents/skills/plugin-skills.js +14 -7
  80. package/dist/agents/skills/workspace.js +1 -0
  81. package/dist/agents/skills.test-helpers.js +13 -0
  82. package/dist/agents/stable-stringify.js +12 -0
  83. package/dist/agents/subagent-announce.js +251 -49
  84. package/dist/agents/subagent-lifecycle-events.js +19 -0
  85. package/dist/agents/subagent-registry-cleanup.js +31 -0
  86. package/dist/agents/subagent-registry-completion.js +68 -0
  87. package/dist/agents/subagent-registry-queries.js +117 -0
  88. package/dist/agents/subagent-registry-state.js +46 -0
  89. package/dist/agents/subagent-registry.js +252 -221
  90. package/dist/agents/subagent-registry.mocks.shared.js +12 -0
  91. package/dist/agents/subagent-registry.store.js +1 -0
  92. package/dist/agents/subagent-registry.types.js +1 -0
  93. package/dist/agents/subagent-spawn.js +195 -7
  94. package/dist/agents/system-prompt.js +22 -6
  95. package/dist/agents/test-helpers/assistant-message-fixtures.js +29 -0
  96. package/dist/agents/test-helpers/fast-coding-tools.js +1 -18
  97. package/dist/agents/test-helpers/fast-core-tools.js +1 -17
  98. package/dist/agents/test-helpers/pi-tools-sandbox-context.js +27 -0
  99. package/dist/agents/timeout.js +18 -6
  100. package/dist/agents/tool-call-id.js +1 -1
  101. package/dist/agents/tool-display-common.js +162 -29
  102. package/dist/agents/tool-images.js +82 -9
  103. package/dist/agents/tool-policy-shared.js +108 -0
  104. package/dist/agents/tool-policy.js +51 -26
  105. package/dist/agents/tools/browser-tool.js +160 -54
  106. package/dist/agents/tools/canvas-tool.js +27 -1
  107. package/dist/agents/tools/common.js +45 -0
  108. package/dist/agents/tools/cron-tool.test-helpers.js +12 -0
  109. package/dist/agents/tools/discord-actions-guild.js +4 -1
  110. package/dist/agents/tools/discord-actions-moderation-shared.js +27 -0
  111. package/dist/agents/tools/gateway-tool.js +3 -1
  112. package/dist/agents/tools/image-tool.js +214 -99
  113. package/dist/agents/tools/nodes-utils.js +1 -10
  114. package/dist/agents/tools/sessions-history-tool.js +140 -108
  115. package/dist/agents/tools/sessions-send-helpers.js +12 -6
  116. package/dist/agents/tools/sessions-spawn-tool.js +8 -2
  117. package/dist/agents/tools/subagents-tool.js +2 -1
  118. package/dist/agents/tools/whatsapp-actions.js +10 -2
  119. package/dist/agents/tools/whatsapp-target-auth.js +18 -0
  120. package/dist/agents/transcript-policy.js +22 -8
  121. package/dist/agents/venice-models.js +11 -3
  122. package/dist/agents/workspace.js +222 -46
  123. package/dist/auto-reply/commands-registry.data.js +51 -0
  124. package/dist/auto-reply/commands-registry.js +19 -21
  125. package/dist/auto-reply/fallback-state.js +114 -0
  126. package/dist/auto-reply/group-activation.js +10 -5
  127. package/dist/auto-reply/inbound-debounce.js +10 -5
  128. package/dist/auto-reply/model-runtime.js +68 -0
  129. package/dist/auto-reply/reply/abort.js +1 -1
  130. package/dist/auto-reply/reply/agent-runner-execution.js +40 -5
  131. package/dist/auto-reply/reply/agent-runner.js +165 -39
  132. package/dist/auto-reply/reply/bash-command.js +41 -39
  133. package/dist/auto-reply/reply/command-gates.js +25 -0
  134. package/dist/auto-reply/reply/commands-allowlist.js +111 -72
  135. package/dist/auto-reply/reply/commands-bash.js +6 -5
  136. package/dist/auto-reply/reply/commands-config.js +30 -28
  137. package/dist/auto-reply/reply/commands-core.js +2 -1
  138. package/dist/auto-reply/reply/commands-info.js +1 -0
  139. package/dist/auto-reply/reply/commands-models.js +65 -14
  140. package/dist/auto-reply/reply/commands-session.js +237 -82
  141. package/dist/auto-reply/reply/commands-setunset-standard.js +13 -0
  142. package/dist/auto-reply/reply/commands-setunset.js +45 -0
  143. package/dist/auto-reply/reply/commands-subagents/action-agents.js +44 -0
  144. package/dist/auto-reply/reply/commands-subagents/action-focus.js +64 -0
  145. package/dist/auto-reply/reply/commands-subagents/action-help.js +4 -0
  146. package/dist/auto-reply/reply/commands-subagents/action-info.js +45 -0
  147. package/dist/auto-reply/reply/commands-subagents/action-kill.js +60 -0
  148. package/dist/auto-reply/reply/commands-subagents/action-list.js +44 -0
  149. package/dist/auto-reply/reply/commands-subagents/action-log.js +29 -0
  150. package/dist/auto-reply/reply/commands-subagents/action-send.js +119 -0
  151. package/dist/auto-reply/reply/commands-subagents/action-spawn.js +52 -0
  152. package/dist/auto-reply/reply/commands-subagents/action-unfocus.js +30 -0
  153. package/dist/auto-reply/reply/commands-subagents/shared.js +303 -0
  154. package/dist/auto-reply/reply/commands-subagents.js +51 -587
  155. package/dist/auto-reply/reply/commands-tts.js +10 -5
  156. package/dist/auto-reply/reply/config-value.js +10 -5
  157. package/dist/auto-reply/reply/directive-handling.model-picker.js +12 -6
  158. package/dist/auto-reply/reply/directive-handling.persist.js +9 -21
  159. package/dist/auto-reply/reply/directive-handling.shared.js +24 -4
  160. package/dist/auto-reply/reply/followup-runner.js +1 -0
  161. package/dist/auto-reply/reply/get-reply-directives-utils.js +23 -14
  162. package/dist/auto-reply/reply/get-reply-directives.js +17 -28
  163. package/dist/auto-reply/reply/get-reply-inline-actions.js +1 -0
  164. package/dist/auto-reply/reply/get-reply.js +71 -12
  165. package/dist/auto-reply/reply/model-selection.js +80 -39
  166. package/dist/auto-reply/reply/queue/enqueue.js +10 -5
  167. package/dist/auto-reply/reply/queue/state.js +13 -12
  168. package/dist/auto-reply/reply/reply-payloads.js +67 -36
  169. package/dist/auto-reply/reply/reply-reference.js +9 -8
  170. package/dist/auto-reply/reply/route-reply.js +15 -8
  171. package/dist/auto-reply/reply/session-reset-prompt.js +1 -1
  172. package/dist/auto-reply/reply/session.js +22 -6
  173. package/dist/auto-reply/reply/strip-inbound-meta.js +147 -0
  174. package/dist/auto-reply/reply/subagents-utils.js +56 -30
  175. package/dist/auto-reply/reply/typing.js +46 -21
  176. package/dist/auto-reply/send-policy.js +14 -7
  177. package/dist/auto-reply/status.js +140 -16
  178. package/dist/auto-reply/templating.js +10 -5
  179. package/dist/auto-reply/thinking.js +7 -16
  180. package/dist/auto-reply/tokens.js +21 -5
  181. package/dist/browser/bridge-server.js +36 -20
  182. package/dist/browser/cdp.helpers.js +7 -14
  183. package/dist/browser/cdp.js +35 -15
  184. package/dist/browser/chrome.profile-decoration.js +7 -4
  185. package/dist/browser/config.js +30 -0
  186. package/dist/browser/extension-relay-auth.js +55 -0
  187. package/dist/browser/extension-relay.js +74 -29
  188. package/dist/browser/navigation-guard.js +39 -0
  189. package/dist/browser/paths.js +77 -0
  190. package/dist/browser/profiles.js +13 -8
  191. package/dist/browser/pw-ai-module.js +10 -5
  192. package/dist/browser/pw-session.js +76 -39
  193. package/dist/browser/pw-tools-core.interactions.js +14 -7
  194. package/dist/browser/pw-tools-core.state.js +12 -6
  195. package/dist/browser/routes/agent.act.js +431 -424
  196. package/dist/browser/routes/agent.shared.js +47 -3
  197. package/dist/browser/routes/agent.snapshot.js +122 -116
  198. package/dist/browser/routes/agent.storage.js +303 -297
  199. package/dist/browser/routes/tabs.js +154 -100
  200. package/dist/browser/server-context.js +7 -0
  201. package/dist/browser/server-lifecycle.js +37 -0
  202. package/dist/build-info.json +3 -3
  203. package/dist/channels/allow-from.js +26 -0
  204. package/dist/channels/allowlists/resolve-utils.js +43 -19
  205. package/dist/channels/channel-config.js +14 -7
  206. package/dist/channels/draft-stream-loop.js +7 -0
  207. package/dist/channels/model-overrides.js +82 -0
  208. package/dist/channels/plugins/account-action-gate.js +13 -0
  209. package/dist/channels/plugins/message-actions.js +10 -0
  210. package/dist/channels/plugins/normalize/imessage.js +14 -7
  211. package/dist/channels/plugins/normalize/slack.js +10 -5
  212. package/dist/channels/plugins/normalize/telegram.js +14 -7
  213. package/dist/channels/plugins/outbound/discord.js +80 -8
  214. package/dist/channels/plugins/outbound/signal.js +11 -11
  215. package/dist/channels/plugins/setup-helpers.js +10 -5
  216. package/dist/channels/sender-label.js +14 -7
  217. package/dist/channels/session.js +4 -2
  218. package/dist/channels/status-reactions.js +297 -0
  219. package/dist/channels/telegram/api.js +18 -0
  220. package/dist/cli/argv.js +84 -21
  221. package/dist/cli/banner.js +3 -2
  222. package/dist/cli/browser-cli-actions-input/register.files-downloads.js +65 -56
  223. package/dist/cli/cli-name.js +11 -11
  224. package/dist/cli/cli-utils.js +13 -3
  225. package/dist/cli/command-format.js +1 -1
  226. package/dist/cli/config-cli.js +1 -1
  227. package/dist/cli/daemon-cli/lifecycle-core.js +31 -19
  228. package/dist/cli/daemon-cli/lifecycle.js +64 -2
  229. package/dist/cli/daemon-cli/restart-health.js +126 -0
  230. package/dist/cli/daemon-cli/status.gather.js +9 -13
  231. package/dist/cli/daemon-cli/status.print.js +2 -10
  232. package/dist/cli/deps.js +27 -22
  233. package/dist/cli/exec-approvals-cli.js +92 -124
  234. package/dist/cli/gateway-cli/run-loop.js +23 -5
  235. package/dist/cli/memory-cli.js +158 -61
  236. package/dist/cli/node-cli/register.js +14 -5
  237. package/dist/cli/nodes-cli/register.push.js +63 -0
  238. package/dist/cli/nodes-media-utils.js +26 -0
  239. package/dist/cli/outbound-send-deps.js +2 -9
  240. package/dist/cli/outbound-send-mapping.js +11 -0
  241. package/dist/cli/pairing-cli.js +40 -14
  242. package/dist/cli/plugins-cli.js +250 -73
  243. package/dist/cli/ports.js +11 -10
  244. package/dist/cli/program/build-program.js +3 -1
  245. package/dist/cli/program/command-registry.js +214 -136
  246. package/dist/cli/program/command-tree.js +16 -0
  247. package/dist/cli/program/help.js +43 -12
  248. package/dist/cli/program/preaction.js +13 -9
  249. package/dist/cli/program/register.configure.js +3 -18
  250. package/dist/cli/program/register.maintenance.js +2 -2
  251. package/dist/cli/program/register.onboard.js +2 -0
  252. package/dist/cli/program/register.status-health-sessions.js +16 -17
  253. package/dist/cli/program/register.subclis.js +93 -52
  254. package/dist/cli/route.js +12 -8
  255. package/dist/cli/system-cli.js +36 -46
  256. package/dist/cli/test-runtime-capture.js +24 -0
  257. package/dist/cli/update-cli/shared.js +22 -9
  258. package/dist/cli/update-cli/update-command.js +89 -14
  259. package/dist/cli/update-cli/wizard.js +6 -12
  260. package/dist/commands/agent/run-context.js +18 -5
  261. package/dist/commands/agent/session-store.js +17 -4
  262. package/dist/commands/agent.js +185 -89
  263. package/dist/commands/agents.bindings.js +14 -7
  264. package/dist/commands/agents.commands.add.js +13 -9
  265. package/dist/commands/agents.commands.identity.js +12 -6
  266. package/dist/commands/agents.commands.list.js +11 -6
  267. package/dist/commands/agents.config.js +8 -10
  268. package/dist/commands/agents.providers.js +12 -6
  269. package/dist/commands/auth-choice-options.js +103 -75
  270. package/dist/commands/auth-choice.apply.byteplus.js +55 -0
  271. package/dist/commands/auth-choice.apply.js +4 -0
  272. package/dist/commands/auth-choice.apply.minimax.js +61 -13
  273. package/dist/commands/auth-choice.apply.openai.js +3 -1
  274. package/dist/commands/auth-choice.apply.volcengine.js +55 -0
  275. package/dist/commands/auth-choice.preferred-provider.js +2 -0
  276. package/dist/commands/channels/remove.js +13 -6
  277. package/dist/commands/channels/shared.js +4 -14
  278. package/dist/commands/channels.mock-harness.js +23 -0
  279. package/dist/commands/configure.commands.js +14 -0
  280. package/dist/commands/configure.gateway.js +2 -4
  281. package/dist/commands/configure.js +1 -1
  282. package/dist/commands/configure.shared.js +11 -0
  283. package/dist/commands/daemon-install-helpers.js +2 -2
  284. package/dist/commands/daemon-install-runtime-warning.js +11 -0
  285. package/dist/commands/dashboard.js +12 -10
  286. package/dist/commands/docs.js +14 -8
  287. package/dist/commands/doctor-config-flow.js +11 -9
  288. package/dist/commands/doctor-legacy-config.js +281 -0
  289. package/dist/commands/doctor-state-integrity.js +99 -23
  290. package/dist/commands/doctor-update.js +12 -9
  291. package/dist/commands/models/list.list-command.js +7 -5
  292. package/dist/commands/models/set-image.js +2 -21
  293. package/dist/commands/node-daemon-install-helpers.js +10 -8
  294. package/dist/commands/onboard-auth.config-minimax.js +54 -80
  295. package/dist/commands/onboard-auth.config-opencode.js +2 -18
  296. package/dist/commands/onboard-auth.credentials.js +90 -13
  297. package/dist/commands/onboard-auth.js +1 -1
  298. package/dist/commands/onboard-auth.models.js +6 -5
  299. package/dist/commands/onboard-hooks.js +1 -1
  300. package/dist/commands/onboard-non-interactive/api-keys.js +14 -7
  301. package/dist/commands/onboard-non-interactive/local/auth-choice.js +64 -49
  302. package/dist/commands/onboard-provider-auth-flags.js +14 -0
  303. package/dist/commands/onboard-remote.js +14 -7
  304. package/dist/commands/onboard.js +11 -13
  305. package/dist/commands/sandbox-display.js +6 -5
  306. package/dist/commands/sessions.test-helpers.js +61 -0
  307. package/dist/commands/status-all/diagnosis.js +14 -10
  308. package/dist/commands/status-all/format.js +1 -0
  309. package/dist/commands/status.gateway-probe.js +1 -16
  310. package/dist/commands/systemd-linger.js +12 -6
  311. package/dist/config/agent-limits.js +2 -0
  312. package/dist/config/commands.js +32 -15
  313. package/dist/config/config-paths.js +9 -11
  314. package/dist/config/config.js +1 -1
  315. package/dist/config/defaults.js +22 -2
  316. package/dist/config/discord-preview-streaming.js +104 -0
  317. package/dist/config/env-substitution.js +62 -34
  318. package/dist/config/env-vars.js +45 -7
  319. package/dist/config/includes.js +4 -0
  320. package/dist/config/io.js +656 -171
  321. package/dist/config/legacy.migrations.part-1.js +189 -78
  322. package/dist/config/legacy.shared.js +3 -1
  323. package/dist/config/merge-patch.js +54 -4
  324. package/dist/config/prototype-keys.js +4 -0
  325. package/dist/config/redact-snapshot.js +404 -76
  326. package/dist/config/schema.help.js +44 -7
  327. package/dist/config/schema.js +58 -570
  328. package/dist/config/schema.labels.js +38 -6
  329. package/dist/config/sessions/delivery-info.js +10 -3
  330. package/dist/config/sessions/main-session.js +10 -5
  331. package/dist/config/sessions/session-file.js +33 -0
  332. package/dist/config/sessions/session-key.js +10 -5
  333. package/dist/config/sessions/store.js +1 -1
  334. package/dist/config/sessions.js +1 -0
  335. package/dist/config/validation.js +140 -85
  336. package/dist/config/zod-schema.agent-runtime.js +11 -0
  337. package/dist/config/zod-schema.hooks.js +40 -11
  338. package/dist/config/zod-schema.installs.js +20 -0
  339. package/dist/config/zod-schema.js +156 -20
  340. package/dist/config/zod-schema.providers-core.js +78 -4
  341. package/dist/config/zod-schema.providers.js +6 -1
  342. package/dist/config/zod-schema.session.js +41 -2
  343. package/dist/cron/run-log.js +3 -0
  344. package/dist/cron/schedule.js +21 -10
  345. package/dist/cron/service/ops.js +35 -21
  346. package/dist/cron/service/timer.js +116 -16
  347. package/dist/cron/stagger.js +3 -1
  348. package/dist/daemon/cmd-argv.js +21 -0
  349. package/dist/daemon/cmd-set.js +58 -0
  350. package/dist/daemon/service-types.js +1 -0
  351. package/dist/discord/api.js +12 -6
  352. package/dist/discord/draft-chunking.js +22 -0
  353. package/dist/discord/draft-stream.js +124 -0
  354. package/dist/discord/monitor/agent-components.js +1 -1
  355. package/dist/discord/monitor/commands.js +5 -0
  356. package/dist/discord/monitor/exec-approvals.js +357 -162
  357. package/dist/discord/monitor/gateway-plugin.js +2 -1
  358. package/dist/discord/monitor/listeners.js +37 -27
  359. package/dist/discord/monitor/message-handler.js +4 -1
  360. package/dist/discord/monitor/message-handler.preflight.js +65 -8
  361. package/dist/discord/monitor/message-handler.process.js +246 -217
  362. package/dist/discord/monitor/message-utils.js +143 -6
  363. package/dist/discord/monitor/model-picker-preferences.js +143 -0
  364. package/dist/discord/monitor/model-picker.js +651 -0
  365. package/dist/discord/monitor/native-command.js +573 -16
  366. package/dist/discord/monitor/provider.allowlist.js +223 -0
  367. package/dist/discord/monitor/provider.js +275 -347
  368. package/dist/discord/monitor/provider.lifecycle.js +100 -0
  369. package/dist/discord/monitor/reply-delivery.js +123 -16
  370. package/dist/discord/monitor/thread-bindings.discord-api.js +215 -0
  371. package/dist/discord/monitor/thread-bindings.js +4 -0
  372. package/dist/discord/monitor/thread-bindings.lifecycle.js +177 -0
  373. package/dist/discord/monitor/thread-bindings.manager.js +423 -0
  374. package/dist/discord/monitor/thread-bindings.messages.js +55 -0
  375. package/dist/discord/monitor/thread-bindings.state.js +358 -0
  376. package/dist/discord/monitor/thread-bindings.types.js +6 -0
  377. package/dist/discord/resolve-users.js +33 -21
  378. package/dist/discord/send.channels.js +15 -0
  379. package/dist/discord/send.js +3 -2
  380. package/dist/discord/send.outbound.js +82 -26
  381. package/dist/discord/send.permissions.js +83 -30
  382. package/dist/discord/send.reactions.js +8 -4
  383. package/dist/discord/token.js +10 -5
  384. package/dist/discord/voice/command.js +263 -0
  385. package/dist/discord/voice/manager.js +531 -0
  386. package/dist/gateway/auth.js +72 -13
  387. package/dist/gateway/call.js +152 -83
  388. package/dist/gateway/canvas-capability.js +75 -0
  389. package/dist/gateway/client.js +28 -4
  390. package/dist/gateway/config-reload.js +3 -4
  391. package/dist/gateway/control-plane-audit.js +28 -0
  392. package/dist/gateway/control-plane-rate-limit.js +53 -0
  393. package/dist/gateway/control-ui.js +219 -96
  394. package/dist/gateway/events.js +1 -0
  395. package/dist/gateway/hooks-mapping.js +88 -38
  396. package/dist/gateway/hooks.js +109 -54
  397. package/dist/gateway/http-auth-helpers.js +3 -2
  398. package/dist/gateway/http-common.js +22 -0
  399. package/dist/gateway/http-endpoint-helpers.js +1 -0
  400. package/dist/gateway/method-scopes.js +169 -0
  401. package/dist/gateway/net.js +74 -9
  402. package/dist/gateway/node-invoke-system-run-approval.js +14 -35
  403. package/dist/gateway/node-registry.js +10 -5
  404. package/dist/gateway/openai-http.js +1 -0
  405. package/dist/gateway/openresponses-http.js +121 -110
  406. package/dist/gateway/origin-check.js +1 -18
  407. package/dist/gateway/probe-auth.js +2 -0
  408. package/dist/gateway/protocol/index.js +4 -2
  409. package/dist/gateway/protocol/schema/cron.js +1 -0
  410. package/dist/gateway/protocol/schema/devices.js +1 -0
  411. package/dist/gateway/protocol/schema/protocol-schemas.js +4 -1
  412. package/dist/gateway/protocol/schema/push.js +18 -0
  413. package/dist/gateway/protocol/schema/sessions.js +6 -0
  414. package/dist/gateway/protocol/schema.js +1 -0
  415. package/dist/gateway/role-policy.js +17 -0
  416. package/dist/gateway/server/ws-connection/connect-policy.js +37 -0
  417. package/dist/gateway/server/ws-connection/message-handler.js +175 -148
  418. package/dist/gateway/server-chat.js +83 -25
  419. package/dist/gateway/server-constants.js +10 -9
  420. package/dist/gateway/server-cron.js +1 -0
  421. package/dist/gateway/server-http.js +247 -54
  422. package/dist/gateway/server-maintenance.js +20 -5
  423. package/dist/gateway/server-methods/agent.js +162 -24
  424. package/dist/gateway/server-methods/chat.js +465 -130
  425. package/dist/gateway/server-methods/config.js +193 -152
  426. package/dist/gateway/server-methods/devices.js +17 -3
  427. package/dist/gateway/server-methods/models.js +11 -1
  428. package/dist/gateway/server-methods/nodes.helpers.js +12 -0
  429. package/dist/gateway/server-methods/nodes.js +251 -69
  430. package/dist/gateway/server-methods/push.js +53 -0
  431. package/dist/gateway/server-methods/sessions.js +64 -8
  432. package/dist/gateway/server-methods/usage.js +162 -75
  433. package/dist/gateway/server-node-events.js +29 -0
  434. package/dist/gateway/server-reload-handlers.js +2 -3
  435. package/dist/gateway/server-runtime-config.js +39 -13
  436. package/dist/gateway/server-runtime-state.js +2 -0
  437. package/dist/gateway/server-startup-memory.js +17 -11
  438. package/dist/gateway/server-ws-runtime.js +1 -0
  439. package/dist/gateway/server.impl.js +296 -139
  440. package/dist/gateway/session-preview.test-helpers.js +11 -0
  441. package/dist/gateway/session-utils.fs.js +32 -34
  442. package/dist/gateway/sessions-resolve.js +17 -5
  443. package/dist/gateway/startup-auth.js +126 -0
  444. package/dist/gateway/test-helpers.agent-results.js +15 -0
  445. package/dist/gateway/test-helpers.mocks.js +37 -14
  446. package/dist/gateway/test-helpers.openai-mock.js +14 -7
  447. package/dist/gateway/test-helpers.server.js +161 -77
  448. package/dist/gateway/tools-invoke-http.js +21 -10
  449. package/dist/hooks/bundled/bootstrap-extra-files/handler.js +3 -1
  450. package/dist/hooks/bundled/command-logger/handler.js +7 -2
  451. package/dist/hooks/bundled/session-memory/handler.js +170 -38
  452. package/dist/hooks/frontmatter.js +6 -6
  453. package/dist/hooks/gmail-watcher-lifecycle.js +23 -0
  454. package/dist/hooks/gmail-watcher.js +11 -6
  455. package/dist/hooks/internal-hooks.js +11 -1
  456. package/dist/hooks/llm-slug-generator.js +4 -1
  457. package/dist/hooks/workspace.js +47 -17
  458. package/dist/imessage/accounts.js +9 -20
  459. package/dist/imessage/monitor/inbound-processing.js +2 -1
  460. package/dist/infra/archive-path.js +49 -0
  461. package/dist/infra/archive.js +174 -73
  462. package/dist/infra/control-ui-assets.js +14 -6
  463. package/dist/infra/device-pairing.js +204 -144
  464. package/dist/infra/env.js +10 -5
  465. package/dist/infra/exec-approvals-allowlist.js +141 -70
  466. package/dist/infra/exec-approvals-analysis.js +78 -20
  467. package/dist/infra/exec-approvals.js +5 -17
  468. package/dist/infra/exec-safe-bin-policy.js +277 -0
  469. package/dist/infra/fixed-window-rate-limit.js +33 -0
  470. package/dist/infra/fs-safe.js +71 -39
  471. package/dist/infra/gateway-lock.js +6 -2
  472. package/dist/infra/git-root.js +61 -0
  473. package/dist/infra/heartbeat-active-hours.js +2 -2
  474. package/dist/infra/heartbeat-reason.js +40 -0
  475. package/dist/infra/heartbeat-runner.js +72 -32
  476. package/dist/infra/heartbeat-wake.js +6 -12
  477. package/dist/infra/host-env-security-policy.json +19 -0
  478. package/dist/infra/host-env-security.js +66 -0
  479. package/dist/infra/install-source-utils.js +91 -7
  480. package/dist/infra/net/ssrf.js +131 -38
  481. package/dist/infra/node-pairing.js +50 -105
  482. package/dist/infra/npm-integrity.js +45 -0
  483. package/dist/infra/npm-pack-install.js +40 -0
  484. package/dist/infra/outbound/bound-delivery-router.js +88 -0
  485. package/dist/infra/outbound/channel-adapters.js +20 -7
  486. package/dist/infra/outbound/channel-selection.js +12 -6
  487. package/dist/infra/outbound/envelope.js +1 -1
  488. package/dist/infra/outbound/format.js +12 -6
  489. package/dist/infra/outbound/message-action-runner.js +107 -327
  490. package/dist/infra/outbound/message.js +59 -36
  491. package/dist/infra/outbound/outbound-policy.js +52 -25
  492. package/dist/infra/outbound/outbound-send-service.js +58 -71
  493. package/dist/infra/outbound/payloads.js +14 -7
  494. package/dist/infra/outbound/session-binding-service.js +123 -0
  495. package/dist/infra/pairing-files.js +10 -0
  496. package/dist/infra/path-guards.js +25 -0
  497. package/dist/infra/plain-object.js +9 -0
  498. package/dist/infra/provider-usage.fetch.codex.js +7 -15
  499. package/dist/infra/provider-usage.fetch.gemini.js +14 -11
  500. package/dist/infra/provider-usage.fetch.shared.js +30 -1
  501. package/dist/infra/provider-usage.fetch.zai.js +10 -9
  502. package/dist/infra/push-apns.js +365 -0
  503. package/dist/infra/restart-sentinel.js +16 -1
  504. package/dist/infra/restart.js +229 -26
  505. package/dist/infra/retry-policy.js +4 -2
  506. package/dist/infra/retry.js +9 -5
  507. package/dist/infra/scp-host.js +54 -0
  508. package/dist/infra/session-cost-usage.js +107 -59
  509. package/dist/infra/session-maintenance-warning.js +3 -1
  510. package/dist/infra/shell-env.js +98 -34
  511. package/dist/infra/ssh-config.js +12 -6
  512. package/dist/infra/system-run-command.js +49 -4
  513. package/dist/infra/update-channels.js +10 -5
  514. package/dist/infra/update-startup.js +86 -9
  515. package/dist/line/accounts.js +5 -7
  516. package/dist/line/bot-access.js +8 -20
  517. package/dist/line/bot-handlers.js +3 -1
  518. package/dist/link-understanding/detect.js +15 -7
  519. package/dist/media/constants.js +15 -6
  520. package/dist/media/image-ops.js +7 -0
  521. package/dist/media/inbound-path-policy.js +114 -0
  522. package/dist/media/input-files.js +16 -0
  523. package/dist/media/local-roots.js +3 -2
  524. package/dist/media-understanding/apply.js +4 -1
  525. package/dist/media-understanding/concurrency.js +8 -20
  526. package/dist/memory/backend-config.js +45 -6
  527. package/dist/memory/embeddings.js +10 -4
  528. package/dist/memory/fs-utils.js +23 -0
  529. package/dist/memory/manager-search.js +12 -6
  530. package/dist/memory/manager-sync-ops.js +12 -2
  531. package/dist/memory/qmd-manager.js +466 -53
  532. package/dist/memory/query-expansion.js +167 -3
  533. package/dist/memory/status-format.js +10 -5
  534. package/dist/memory/sync-memory-files.js +1 -1
  535. package/dist/memory/test-manager.js +8 -0
  536. package/dist/node-host/invoke-system-run.js +281 -0
  537. package/dist/node-host/invoke.js +55 -337
  538. package/dist/pairing/pairing-store.js +22 -0
  539. package/dist/plugin-sdk/allow-from.js +1 -1
  540. package/dist/plugin-sdk/command-auth.js +3 -1
  541. package/dist/plugin-sdk/index.js +6 -3
  542. package/dist/plugin-sdk/temp-path.js +47 -0
  543. package/dist/plugin-sdk/webhook-targets.js +32 -0
  544. package/dist/plugins/bundled-dir.js +9 -6
  545. package/dist/plugins/discovery.js +217 -23
  546. package/dist/plugins/hook-runner-global.js +16 -0
  547. package/dist/plugins/hooks.js +50 -0
  548. package/dist/plugins/install.js +28 -16
  549. package/dist/plugins/loader.js +192 -26
  550. package/dist/plugins/logger.js +8 -0
  551. package/dist/plugins/manifest-registry.js +3 -0
  552. package/dist/plugins/path-safety.js +34 -0
  553. package/dist/plugins/registry.js +5 -2
  554. package/dist/plugins/runtime/index.js +271 -206
  555. package/dist/plugins/runtime.js +3 -17
  556. package/dist/plugins/update.js +78 -12
  557. package/dist/process/spawn-utils.js +14 -7
  558. package/dist/providers/github-copilot-models.js +4 -1
  559. package/dist/providers/github-copilot-token.js +11 -6
  560. package/dist/providers/qwen-portal-oauth.js +14 -6
  561. package/dist/routing/account-id.js +30 -0
  562. package/dist/routing/resolve-route.js +3 -7
  563. package/dist/routing/session-key.js +2 -16
  564. package/dist/security/audit-channel.js +100 -20
  565. package/dist/security/audit-extra.async.js +505 -179
  566. package/dist/security/audit-extra.js +12 -2
  567. package/dist/security/audit-extra.sync.js +421 -35
  568. package/dist/security/audit-fs.js +31 -13
  569. package/dist/security/audit.js +180 -370
  570. package/dist/security/dm-policy-shared.js +68 -0
  571. package/dist/security/external-content.js +46 -14
  572. package/dist/security/fix.js +49 -85
  573. package/dist/security/scan-paths.js +20 -0
  574. package/dist/security/secret-equal.js +3 -7
  575. package/dist/security/windows-acl.js +30 -15
  576. package/dist/shared/entry-status.js +6 -0
  577. package/dist/shared/frontmatter.js +5 -5
  578. package/dist/shared/node-list-parse.js +13 -0
  579. package/dist/shared/node-match.js +11 -4
  580. package/dist/shared/operator-scope-compat.js +42 -0
  581. package/dist/shared/text-chunking.js +29 -0
  582. package/dist/signal/accounts.js +7 -20
  583. package/dist/signal/monitor/event-handler.js +3 -1
  584. package/dist/slack/accounts.js +6 -19
  585. package/dist/slack/actions.js +11 -3
  586. package/dist/slack/blocks.test-helpers.js +31 -0
  587. package/dist/slack/monitor/auth.js +1 -1
  588. package/dist/slack/monitor/message-handler/dispatch.js +50 -29
  589. package/dist/slack/monitor/mrkdwn.js +8 -0
  590. package/dist/slack/monitor/replies.js +15 -7
  591. package/dist/slack/monitor/slash.js +22 -13
  592. package/dist/slack/resolve-channels.js +10 -5
  593. package/dist/slack/send.js +102 -12
  594. package/dist/slack/stream-mode.js +10 -0
  595. package/dist/slack/streaming.js +4 -2
  596. package/dist/telegram/accounts.js +19 -14
  597. package/dist/telegram/bot/helpers.js +3 -5
  598. package/dist/telegram/bot-access.js +35 -36
  599. package/dist/telegram/bot-handlers.js +120 -148
  600. package/dist/telegram/bot-message-context.js +68 -9
  601. package/dist/telegram/bot-message-dispatch.js +477 -210
  602. package/dist/telegram/bot-native-commands.js +16 -0
  603. package/dist/telegram/draft-stream.js +44 -8
  604. package/dist/telegram/inline-buttons.js +5 -15
  605. package/dist/telegram/monitor.js +11 -7
  606. package/dist/telegram/network-config.js +19 -7
  607. package/dist/telegram/reasoning-lane-coordinator.js +128 -0
  608. package/dist/telegram/send.js +3 -2
  609. package/dist/telegram/sent-message-cache.js +5 -6
  610. package/dist/telegram/status-reaction-variants.js +208 -0
  611. package/dist/telegram/sticker-cache.js +11 -9
  612. package/dist/terminal/prompt-select-styled.js +9 -0
  613. package/dist/terminal/theme.js +12 -12
  614. package/dist/test-utils/command-runner.js +6 -0
  615. package/dist/test-utils/internal-hook-event-payload.js +10 -0
  616. package/dist/test-utils/model-auth-mock.js +12 -0
  617. package/dist/test-utils/provider-usage-fetch.js +14 -0
  618. package/dist/test-utils/temp-home.js +33 -0
  619. package/dist/tts/tts.js +80 -567
  620. package/dist/tui/components/chat-log.js +50 -8
  621. package/dist/tui/theme/theme.js +10 -12
  622. package/dist/tui/tui-command-handlers.js +36 -27
  623. package/dist/tui/tui-event-handlers.js +122 -32
  624. package/dist/tui/tui-local-shell.js +16 -6
  625. package/dist/tui/tui.js +236 -48
  626. package/dist/utils/account-id.js +2 -4
  627. package/dist/utils/boolean.js +10 -5
  628. package/dist/utils/directive-tags.js +11 -0
  629. package/dist/utils/mask-api-key.js +10 -0
  630. package/dist/utils/queue-helpers.js +67 -12
  631. package/dist/utils/run-with-concurrency.js +39 -0
  632. package/dist/web/auto-reply/deliver-reply.js +8 -4
  633. package/dist/web/auto-reply/mentions.js +10 -5
  634. package/dist/web/auto-reply/monitor/group-members.js +14 -7
  635. package/dist/web/auto-reply/monitor/process-message.js +45 -24
  636. package/dist/web/inbound/access-control.js +5 -2
  637. package/dist/web/login-qr.js +12 -6
  638. package/dist/web/media.js +126 -15
  639. package/docs/tools/slash-commands.md +5 -1
  640. package/extensions/bluebubbles/src/monitor-processing.ts +580 -139
  641. package/extensions/bluebubbles/src/monitor.ts +208 -1950
  642. package/extensions/feishu/src/external-keys.ts +19 -0
  643. package/extensions/lobster/src/windows-spawn.ts +193 -0
  644. package/extensions/matrix/src/matrix/actions/limits.ts +6 -0
  645. package/extensions/mattermost/src/mattermost/reactions.test-helpers.ts +83 -0
  646. package/package.json +1 -1
@@ -6,6 +6,7 @@ import { listSkillCommandsForAgents } from "../auto-reply/skill-commands.js";
6
6
  import { resolveCommandAuthorizedFromAuthorizers } from "../channels/command-gating.js";
7
7
  import { createReplyPrefixOptions } from "../channels/reply-prefix.js";
8
8
  import { resolveMarkdownTableMode } from "../config/markdown-tables.js";
9
+ import { recordSessionMetaFromInbound, resolveStorePath } from "../config/sessions.js";
9
10
  import { normalizeTelegramCommandName, resolveTelegramCustomCommands, TELEGRAM_COMMAND_NAME_PATTERN, } from "../config/telegram-custom-commands.js";
10
11
  import { danger, logVerbose } from "../globals.js";
11
12
  import { getAgentScopedMediaLocalRoots } from "../media/local-roots.js";
@@ -29,6 +30,7 @@ async function resolveTelegramCommandAuth(params) {
29
30
  const groupAllowContext = await resolveTelegramGroupAllowFromContext({
30
31
  chatId,
31
32
  accountId,
33
+ dmPolicy: telegramCfg.dmPolicy ?? "pairing",
32
34
  isForum,
33
35
  messageThreadId,
34
36
  groupAllowFrom,
@@ -100,6 +102,7 @@ async function resolveTelegramCommandAuth(params) {
100
102
  const dmAllow = normalizeAllowFromWithStore({
101
103
  allowFrom: allowFrom,
102
104
  storeAllowFrom,
105
+ dmPolicy: telegramCfg.dmPolicy ?? "pairing",
103
106
  });
104
107
  const senderAllowed = isSenderAllowed({
105
108
  allow: dmAllow,
@@ -377,6 +380,19 @@ export const registerTelegramNativeCommands = ({ bot, cfg, runtime, accountId, t
377
380
  OriginatingChannel: "telegram",
378
381
  OriginatingTo: `telegram:${chatId}`,
379
382
  });
383
+ const storePath = resolveStorePath(cfg.session?.store, {
384
+ agentId: route.agentId,
385
+ });
386
+ try {
387
+ await recordSessionMetaFromInbound({
388
+ storePath,
389
+ sessionKey: ctxPayload.SessionKey ?? route.sessionKey,
390
+ ctx: ctxPayload,
391
+ });
392
+ }
393
+ catch (err) {
394
+ runtime.error?.(danger(`telegram slash: failed updating session meta: ${String(err)}`));
395
+ }
380
396
  const disableBlockStreaming = typeof telegramCfg.blockStreaming === "boolean"
381
397
  ? !telegramCfg.blockStreaming
382
398
  : undefined;
@@ -13,8 +13,10 @@ export function createTelegramDraftStream(params) {
13
13
  : threadParams;
14
14
  let streamMessageId;
15
15
  let lastSentText = "";
16
+ let lastSentParseMode;
16
17
  let stopped = false;
17
18
  let isFinal = false;
19
+ let generation = 0;
18
20
  const sendOrEditStreamMessage = async (text) => {
19
21
  // Allow final flush even if stopped (e.g., after clear()).
20
22
  if (stopped && !isFinal) {
@@ -24,36 +26,66 @@ export function createTelegramDraftStream(params) {
24
26
  if (!trimmed) {
25
27
  return false;
26
28
  }
27
- if (trimmed.length > maxChars) {
29
+ const rendered = params.renderText?.(trimmed) ?? { text: trimmed };
30
+ const renderedText = rendered.text.trimEnd();
31
+ const renderedParseMode = rendered.parseMode;
32
+ if (!renderedText) {
33
+ return false;
34
+ }
35
+ if (renderedText.length > maxChars) {
28
36
  // Telegram text messages/edits cap at 4096 chars.
29
37
  // Stop streaming once we exceed the cap to avoid repeated API failures.
30
38
  stopped = true;
31
- params.warn?.(`telegram stream preview stopped (text length ${trimmed.length} > ${maxChars})`);
39
+ params.warn?.(`telegram stream preview stopped (text length ${renderedText.length} > ${maxChars})`);
32
40
  return false;
33
41
  }
34
- if (trimmed === lastSentText) {
42
+ if (renderedText === lastSentText && renderedParseMode === lastSentParseMode) {
35
43
  return true;
36
44
  }
45
+ const sendGeneration = generation;
37
46
  // Debounce first preview send for better push notification quality.
38
47
  if (typeof streamMessageId !== "number" && minInitialChars != null && !isFinal) {
39
- if (trimmed.length < minInitialChars) {
48
+ if (renderedText.length < minInitialChars) {
40
49
  return false;
41
50
  }
42
51
  }
43
- lastSentText = trimmed;
52
+ lastSentText = renderedText;
53
+ lastSentParseMode = renderedParseMode;
44
54
  try {
45
55
  if (typeof streamMessageId === "number") {
46
- await params.api.editMessageText(chatId, streamMessageId, trimmed);
56
+ if (renderedParseMode) {
57
+ await params.api.editMessageText(chatId, streamMessageId, renderedText, {
58
+ parse_mode: renderedParseMode,
59
+ });
60
+ }
61
+ else {
62
+ await params.api.editMessageText(chatId, streamMessageId, renderedText);
63
+ }
47
64
  return true;
48
65
  }
49
- const sent = await params.api.sendMessage(chatId, trimmed, replyParams);
66
+ const sendParams = renderedParseMode
67
+ ? {
68
+ ...replyParams,
69
+ parse_mode: renderedParseMode,
70
+ }
71
+ : replyParams;
72
+ const sent = await params.api.sendMessage(chatId, renderedText, sendParams);
50
73
  const sentMessageId = sent?.message_id;
51
74
  if (typeof sentMessageId !== "number" || !Number.isFinite(sentMessageId)) {
52
75
  stopped = true;
53
76
  params.warn?.("telegram stream preview stopped (missing message id from sendMessage)");
54
77
  return false;
55
78
  }
56
- streamMessageId = Math.trunc(sentMessageId);
79
+ const normalizedMessageId = Math.trunc(sentMessageId);
80
+ if (sendGeneration !== generation) {
81
+ params.onSupersededPreview?.({
82
+ messageId: normalizedMessageId,
83
+ textSnapshot: renderedText,
84
+ parseMode: renderedParseMode,
85
+ });
86
+ return true;
87
+ }
88
+ streamMessageId = normalizedMessageId;
57
89
  return true;
58
90
  }
59
91
  catch (err) {
@@ -88,15 +120,19 @@ export function createTelegramDraftStream(params) {
88
120
  }
89
121
  try {
90
122
  await params.api.deleteMessage(chatId, messageId);
123
+ params.log?.(`telegram stream preview deleted (chat=${chatId}, message=${messageId})`);
91
124
  }
92
125
  catch (err) {
93
126
  params.warn?.(`telegram stream preview cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
94
127
  }
95
128
  };
96
129
  const forceNewMessage = () => {
130
+ generation += 1;
97
131
  streamMessageId = undefined;
98
132
  lastSentText = "";
133
+ lastSentParseMode = undefined;
99
134
  loop.resetPending();
135
+ loop.resetThrottleWindow();
100
136
  };
101
137
  params.log?.(`telegram stream preview ready (maxChars=${maxChars}, throttleMs=${throttleMs})`);
102
138
  return {
@@ -1,9 +1,9 @@
1
1
  import { listTelegramAccountIds, resolveTelegramAccount } from "./accounts.js";
2
- import { parseTelegramTarget } from "./targets.js";
3
2
  const DEFAULT_INLINE_BUTTONS_SCOPE = "allowlist";
4
3
  function normalizeInlineButtonsScope(value) {
5
- if (typeof value !== "string")
4
+ if (typeof value !== "string") {
6
5
  return undefined;
6
+ }
7
7
  const trimmed = value.trim().toLowerCase();
8
8
  if (trimmed === "off" ||
9
9
  trimmed === "dm" ||
@@ -15,8 +15,9 @@ function normalizeInlineButtonsScope(value) {
15
15
  return undefined;
16
16
  }
17
17
  function resolveInlineButtonsScopeFromCapabilities(capabilities) {
18
- if (!capabilities)
18
+ if (!capabilities) {
19
19
  return DEFAULT_INLINE_BUTTONS_SCOPE;
20
+ }
20
21
  if (Array.isArray(capabilities)) {
21
22
  const enabled = capabilities.some((entry) => String(entry).trim().toLowerCase() === "inlinebuttons");
22
23
  return enabled ? "all" : "off";
@@ -41,15 +42,4 @@ export function isTelegramInlineButtonsEnabled(params) {
41
42
  }
42
43
  return accountIds.some((accountId) => resolveTelegramInlineButtonsScope({ cfg: params.cfg, accountId }) !== "off");
43
44
  }
44
- export function resolveTelegramTargetChatType(target) {
45
- if (!target.trim())
46
- return "unknown";
47
- const parsed = parseTelegramTarget(target);
48
- const chatId = parsed.chatId.trim();
49
- if (!chatId)
50
- return "unknown";
51
- if (/^-?\d+$/.test(chatId)) {
52
- return chatId.startsWith("-") ? "group" : "direct";
53
- }
54
- return "unknown";
55
- }
45
+ export { resolveTelegramTargetChatType } from "./targets.js";
@@ -39,12 +39,14 @@ const TELEGRAM_POLL_RESTART_POLICY = {
39
39
  jitter: 0.25,
40
40
  };
41
41
  const isGetUpdatesConflict = (err) => {
42
- if (!err || typeof err !== "object")
42
+ if (!err || typeof err !== "object") {
43
43
  return false;
44
+ }
44
45
  const typed = err;
45
46
  const errorCode = typed.error_code ?? typed.errorCode;
46
- if (errorCode !== 409)
47
+ if (errorCode !== 409) {
47
48
  return false;
49
+ }
48
50
  const haystack = [typed.method, typed.description, typed.message]
49
51
  .filter((value) => typeof value === "string")
50
52
  .join(" ")
@@ -81,14 +83,14 @@ export async function monitorTelegramProvider(opts = {}) {
81
83
  if (!token) {
82
84
  throw new Error(`Telegram bot token missing for account "${account.accountId}" (set channels.telegram.accounts.${account.accountId}.botToken/tokenFile or TELEGRAM_BOT_TOKEN for default).`);
83
85
  }
84
- const proxyFetch = opts.proxyFetch ??
85
- (account.config.proxy ? makeProxyFetch(account.config.proxy) : undefined);
86
+ const proxyFetch = opts.proxyFetch ?? (account.config.proxy ? makeProxyFetch(account.config.proxy) : undefined);
86
87
  let lastUpdateId = await readTelegramUpdateOffset({
87
88
  accountId: account.accountId,
88
89
  });
89
90
  const persistUpdateId = async (updateId) => {
90
- if (lastUpdateId !== null && updateId <= lastUpdateId)
91
+ if (lastUpdateId !== null && updateId <= lastUpdateId) {
91
92
  return;
93
+ }
92
94
  lastUpdateId = updateId;
93
95
  try {
94
96
  await writeTelegramUpdateOffset({
@@ -118,7 +120,8 @@ export async function monitorTelegramProvider(opts = {}) {
118
120
  config: cfg,
119
121
  path: opts.webhookPath,
120
122
  port: opts.webhookPort,
121
- secret: opts.webhookSecret,
123
+ secret: opts.webhookSecret ?? account.config.webhookSecret,
124
+ host: opts.webhookHost ?? account.config.webhookHost,
122
125
  runtime: opts.runtime,
123
126
  fetch: proxyFetch,
124
127
  abortSignal: opts.abortSignal,
@@ -159,8 +162,9 @@ export async function monitorTelegramProvider(opts = {}) {
159
162
  await sleepWithAbort(delayMs, opts.abortSignal);
160
163
  }
161
164
  catch (sleepErr) {
162
- if (opts.abortSignal?.aborted)
165
+ if (opts.abortSignal?.aborted) {
163
166
  return;
167
+ }
164
168
  throw sleepErr;
165
169
  }
166
170
  }
@@ -1,27 +1,39 @@
1
1
  import process from "node:process";
2
2
  import { isTruthyEnvValue } from "../infra/env.js";
3
+ import { isWSL2Sync } from "../infra/wsl.js";
3
4
  export const TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV = "POOLBOT_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY";
4
5
  export const TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV = "POOLBOT_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY";
5
- const TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV_LEGACY = "CLAWDBOT_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY";
6
- const TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV_LEGACY = "CLAWDBOT_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY";
6
+ let wsl2SyncCache;
7
+ function isWSL2SyncCached() {
8
+ if (typeof wsl2SyncCache === "boolean") {
9
+ return wsl2SyncCache;
10
+ }
11
+ wsl2SyncCache = isWSL2Sync();
12
+ return wsl2SyncCache;
13
+ }
7
14
  export function resolveTelegramAutoSelectFamilyDecision(params) {
8
15
  const env = params?.env ?? process.env;
9
16
  const nodeMajor = typeof params?.nodeMajor === "number"
10
17
  ? params.nodeMajor
11
18
  : Number(process.versions.node.split(".")[0]);
12
- if (isTruthyEnvValue(env[TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV]) ||
13
- isTruthyEnvValue(env[TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV_LEGACY])) {
19
+ if (isTruthyEnvValue(env[TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV])) {
14
20
  return { value: true, source: `env:${TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV}` };
15
21
  }
16
- if (isTruthyEnvValue(env[TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV]) ||
17
- isTruthyEnvValue(env[TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV_LEGACY])) {
22
+ if (isTruthyEnvValue(env[TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV])) {
18
23
  return { value: false, source: `env:${TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV}` };
19
24
  }
20
25
  if (typeof params?.network?.autoSelectFamily === "boolean") {
21
26
  return { value: params.network.autoSelectFamily, source: "config" };
22
27
  }
28
+ // WSL2 has unstable IPv6 connectivity; disable autoSelectFamily to use IPv4 directly
29
+ if (isWSL2SyncCached()) {
30
+ return { value: false, source: "default-wsl2" };
31
+ }
23
32
  if (Number.isFinite(nodeMajor) && nodeMajor >= 22) {
24
- return { value: false, source: "default-node22" };
33
+ return { value: true, source: "default-node22" };
25
34
  }
26
35
  return { value: null };
27
36
  }
37
+ export function resetTelegramNetworkConfigStateForTests() {
38
+ wsl2SyncCache = undefined;
39
+ }
@@ -0,0 +1,128 @@
1
+ import { formatReasoningMessage } from "../agents/pi-embedded-utils.js";
2
+ import { stripReasoningTagsFromText } from "../shared/text/reasoning-tags.js";
3
+ const REASONING_MESSAGE_PREFIX = "Reasoning:\n";
4
+ const REASONING_TAG_PREFIXES = [
5
+ "<think",
6
+ "<thinking",
7
+ "<thought",
8
+ "<antthinking",
9
+ "</think",
10
+ "</thinking",
11
+ "</thought",
12
+ "</antthinking",
13
+ ];
14
+ const THINKING_TAG_RE = /<\s*(\/?)\s*(?:think(?:ing)?|thought|antthinking)\b[^<>]*>/gi;
15
+ function findCodeRegions(text) {
16
+ const regions = [];
17
+ const fencedRe = /(^|\n)(```|~~~)[^\n]*\n[\s\S]*?(?:\n\2(?:\n|$)|$)/g;
18
+ for (const match of text.matchAll(fencedRe)) {
19
+ const start = (match.index ?? 0) + match[1].length;
20
+ regions.push({ start, end: start + match[0].length - match[1].length });
21
+ }
22
+ const inlineRe = /`+[^`]+`+/g;
23
+ for (const match of text.matchAll(inlineRe)) {
24
+ const start = match.index ?? 0;
25
+ const end = start + match[0].length;
26
+ const insideFenced = regions.some((r) => start >= r.start && end <= r.end);
27
+ if (!insideFenced) {
28
+ regions.push({ start, end });
29
+ }
30
+ }
31
+ regions.sort((a, b) => a.start - b.start);
32
+ return regions;
33
+ }
34
+ function isInsideCode(pos, regions) {
35
+ return regions.some((r) => pos >= r.start && pos < r.end);
36
+ }
37
+ function extractThinkingFromTaggedStreamOutsideCode(text) {
38
+ if (!text) {
39
+ return "";
40
+ }
41
+ const codeRegions = findCodeRegions(text);
42
+ let result = "";
43
+ let lastIndex = 0;
44
+ let inThinking = false;
45
+ THINKING_TAG_RE.lastIndex = 0;
46
+ for (const match of text.matchAll(THINKING_TAG_RE)) {
47
+ const idx = match.index ?? 0;
48
+ if (isInsideCode(idx, codeRegions)) {
49
+ continue;
50
+ }
51
+ if (inThinking) {
52
+ result += text.slice(lastIndex, idx);
53
+ }
54
+ const isClose = match[1] === "/";
55
+ inThinking = !isClose;
56
+ lastIndex = idx + match[0].length;
57
+ }
58
+ if (inThinking) {
59
+ result += text.slice(lastIndex);
60
+ }
61
+ return result.trim();
62
+ }
63
+ function isPartialReasoningTagPrefix(text) {
64
+ const trimmed = text.trimStart().toLowerCase();
65
+ if (!trimmed.startsWith("<")) {
66
+ return false;
67
+ }
68
+ if (trimmed.includes(">")) {
69
+ return false;
70
+ }
71
+ return REASONING_TAG_PREFIXES.some((prefix) => prefix.startsWith(trimmed));
72
+ }
73
+ export function splitTelegramReasoningText(text) {
74
+ if (typeof text !== "string") {
75
+ return {};
76
+ }
77
+ const trimmed = text.trim();
78
+ if (isPartialReasoningTagPrefix(trimmed)) {
79
+ return {};
80
+ }
81
+ if (trimmed.startsWith(REASONING_MESSAGE_PREFIX) &&
82
+ trimmed.length > REASONING_MESSAGE_PREFIX.length) {
83
+ return { reasoningText: trimmed };
84
+ }
85
+ const taggedReasoning = extractThinkingFromTaggedStreamOutsideCode(text);
86
+ const strippedAnswer = stripReasoningTagsFromText(text, { mode: "strict", trim: "both" });
87
+ if (!taggedReasoning && strippedAnswer === text) {
88
+ return { answerText: text };
89
+ }
90
+ const reasoningText = taggedReasoning ? formatReasoningMessage(taggedReasoning) : undefined;
91
+ const answerText = strippedAnswer || undefined;
92
+ return { reasoningText, answerText };
93
+ }
94
+ export function createTelegramReasoningStepState() {
95
+ let reasoningStatus = "none";
96
+ let bufferedFinalAnswer;
97
+ const noteReasoningHint = () => {
98
+ if (reasoningStatus === "none") {
99
+ reasoningStatus = "hinted";
100
+ }
101
+ };
102
+ const noteReasoningDelivered = () => {
103
+ reasoningStatus = "delivered";
104
+ };
105
+ const shouldBufferFinalAnswer = () => {
106
+ return reasoningStatus === "hinted" && !bufferedFinalAnswer;
107
+ };
108
+ const bufferFinalAnswer = (value) => {
109
+ bufferedFinalAnswer = value;
110
+ };
111
+ const takeBufferedFinalAnswer = () => {
112
+ const value = bufferedFinalAnswer;
113
+ bufferedFinalAnswer = undefined;
114
+ return value;
115
+ };
116
+ const resetForNextStep = () => {
117
+ reasoningStatus = "none";
118
+ bufferedFinalAnswer = undefined;
119
+ };
120
+ return {
121
+ noteReasoningHint,
122
+ noteReasoningDelivered,
123
+ shouldBufferFinalAnswer,
124
+ bufferFinalAnswer,
125
+ takeBufferedFinalAnswer,
126
+ resetForNextStep,
127
+ };
128
+ }
@@ -27,6 +27,7 @@ const PARSE_ERR_RE = /can't parse entities|parse entities|find end of the entity
27
27
  const THREAD_NOT_FOUND_RE = /400:\s*Bad Request:\s*message thread not found/i;
28
28
  const MESSAGE_NOT_MODIFIED_RE = /400:\s*Bad Request:\s*message is not modified|MESSAGE_NOT_MODIFIED/i;
29
29
  const CHAT_NOT_FOUND_RE = /400: Bad Request: chat not found/i;
30
+ const sendLogger = createSubsystemLogger("telegram/send");
30
31
  const diagLogger = createSubsystemLogger("telegram/diagnostic");
31
32
  function createTelegramHttpLogger(cfg) {
32
33
  const enabled = isDiagnosticFlagEnabled("telegram.http", cfg);
@@ -176,7 +177,7 @@ async function withTelegramHtmlParseFallback(params) {
176
177
  throw err;
177
178
  }
178
179
  if (params.verbose) {
179
- console.warn(`telegram ${params.label} failed with HTML parse error, retrying as plain text: ${formatErrorMessage(err)}`);
180
+ sendLogger.warn(`telegram ${params.label} failed with HTML parse error, retrying as plain text: ${formatErrorMessage(err)}`);
180
181
  }
181
182
  return await params.requestPlain(`${params.label}-plain`);
182
183
  }
@@ -236,7 +237,7 @@ async function withTelegramThreadFallback(params, label, verbose, attempt) {
236
237
  throw err;
237
238
  }
238
239
  if (verbose) {
239
- console.warn(`telegram ${label} failed with message_thread_id, retrying without thread: ${formatErrorMessage(err)}`);
240
+ sendLogger.warn(`telegram ${label} failed with message_thread_id, retrying without thread: ${formatErrorMessage(err)}`);
240
241
  }
241
242
  const retriedParams = removeMessageThreadIdParam(params);
242
243
  return await attempt(retriedParams, `${label}-threadless`);
@@ -11,7 +11,6 @@ function cleanupExpired(entry) {
11
11
  const now = Date.now();
12
12
  for (const [msgId, timestamp] of entry.timestamps) {
13
13
  if (now - timestamp > TTL_MS) {
14
- entry.messageIds.delete(msgId);
15
14
  entry.timestamps.delete(msgId);
16
15
  }
17
16
  }
@@ -23,13 +22,12 @@ export function recordSentMessage(chatId, messageId) {
23
22
  const key = getChatKey(chatId);
24
23
  let entry = sentMessages.get(key);
25
24
  if (!entry) {
26
- entry = { messageIds: new Set(), timestamps: new Map() };
25
+ entry = { timestamps: new Map() };
27
26
  sentMessages.set(key, entry);
28
27
  }
29
- entry.messageIds.add(messageId);
30
28
  entry.timestamps.set(messageId, Date.now());
31
29
  // Periodic cleanup
32
- if (entry.messageIds.size > 100) {
30
+ if (entry.timestamps.size > 100) {
33
31
  cleanupExpired(entry);
34
32
  }
35
33
  }
@@ -39,11 +37,12 @@ export function recordSentMessage(chatId, messageId) {
39
37
  export function wasSentByBot(chatId, messageId) {
40
38
  const key = getChatKey(chatId);
41
39
  const entry = sentMessages.get(key);
42
- if (!entry)
40
+ if (!entry) {
43
41
  return false;
42
+ }
44
43
  // Clean up expired entries on read
45
44
  cleanupExpired(entry);
46
- return entry.messageIds.has(messageId);
45
+ return entry.timestamps.has(messageId);
47
46
  }
48
47
  /**
49
48
  * Clear all cached entries (for testing).