@poolzin/pool-bot 2026.2.25 → 2026.2.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/dist/acp/event-mapper.js +87 -22
  2. package/dist/acp/meta.js +12 -6
  3. package/dist/agents/agent-paths.js +8 -9
  4. package/dist/agents/agent-scope.js +7 -5
  5. package/dist/agents/auth-profiles/oauth.js +148 -64
  6. package/dist/agents/auth-profiles/session-override.js +13 -7
  7. package/dist/agents/bash-tools.exec-host-gateway.js +14 -4
  8. package/dist/agents/bash-tools.exec-runtime.js +2 -25
  9. package/dist/agents/bedrock-discovery.js +3 -1
  10. package/dist/agents/byteplus-models.js +97 -0
  11. package/dist/agents/chutes-oauth.js +1 -0
  12. package/dist/agents/cli-runner/helpers.js +4 -0
  13. package/dist/agents/compaction.js +41 -14
  14. package/dist/agents/doubao-models.js +121 -0
  15. package/dist/agents/failover-error.js +2 -0
  16. package/dist/agents/huggingface-models.js +5 -3
  17. package/dist/agents/live-model-filter.js +5 -0
  18. package/dist/agents/minimax-vlm.js +10 -8
  19. package/dist/agents/model-auth.js +6 -0
  20. package/dist/agents/model-catalog.js +3 -1
  21. package/dist/agents/model-selection.js +7 -1
  22. package/dist/agents/models-config.providers.js +93 -11
  23. package/dist/agents/ollama-stream.js +117 -4
  24. package/dist/agents/opencode-zen-models.js +22 -11
  25. package/dist/agents/pi-embedded-helpers/errors.js +55 -33
  26. package/dist/agents/pi-embedded-helpers/messaging-dedupe.js +10 -5
  27. package/dist/agents/pi-embedded-helpers/thinking.js +10 -5
  28. package/dist/agents/pi-embedded-helpers.js +1 -1
  29. package/dist/agents/pi-embedded-runner/compact.js +29 -7
  30. package/dist/agents/pi-embedded-runner/extensions.js +28 -26
  31. package/dist/agents/pi-embedded-runner/google.js +20 -8
  32. package/dist/agents/pi-embedded-runner/run/attempt.js +95 -36
  33. package/dist/agents/pi-embedded-runner/run.js +71 -12
  34. package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +11 -2
  35. package/dist/agents/pi-embedded-runner/session-manager-cache.js +11 -7
  36. package/dist/agents/pi-embedded-runner/system-prompt.js +2 -0
  37. package/dist/agents/pi-embedded-runner/thinking.js +42 -0
  38. package/dist/agents/pi-embedded-runner/tool-name-allowlist.js +19 -0
  39. package/dist/agents/pi-embedded-runner/utils.js +7 -10
  40. package/dist/agents/pi-embedded-subscribe.handlers.lifecycle.js +45 -56
  41. package/dist/agents/pi-embedded-subscribe.handlers.tools.js +2 -2
  42. package/dist/agents/pi-embedded-subscribe.js +9 -4
  43. package/dist/agents/pi-embedded-subscribe.tools.js +68 -14
  44. package/dist/agents/pi-embedded-utils.js +3 -0
  45. package/dist/agents/pi-extensions/compaction-safeguard-runtime.js +4 -20
  46. package/dist/agents/pi-extensions/compaction-safeguard.js +75 -33
  47. package/dist/agents/pi-settings.js +40 -0
  48. package/dist/agents/pi-tools.policy.js +2 -1
  49. package/dist/agents/provider/config-loader.js +1 -1
  50. package/dist/agents/sandbox/browser.js +170 -33
  51. package/dist/agents/sandbox/config-hash.js +14 -27
  52. package/dist/agents/sandbox/config.js +21 -2
  53. package/dist/agents/sandbox/constants.js +2 -0
  54. package/dist/agents/sandbox/docker.js +16 -2
  55. package/dist/agents/sandbox/novnc-auth.js +62 -0
  56. package/dist/agents/sandbox/sanitize-env-vars.js +1 -1
  57. package/dist/agents/sandbox/shared.js +10 -6
  58. package/dist/agents/sandbox-paths.js +24 -11
  59. package/dist/agents/schema/clean-for-gemini.js +132 -85
  60. package/dist/agents/session-slug.js +10 -5
  61. package/dist/agents/session-tool-result-guard-wrapper.js +1 -0
  62. package/dist/agents/session-tool-result-guard.js +3 -1
  63. package/dist/agents/session-transcript-repair.js +40 -6
  64. package/dist/agents/skills/bundled-dir.js +19 -5
  65. package/dist/agents/skills/env-overrides.js +124 -43
  66. package/dist/agents/skills/frontmatter.js +6 -6
  67. package/dist/agents/skills/plugin-skills.js +14 -7
  68. package/dist/agents/skills/workspace.js +1 -0
  69. package/dist/agents/subagent-announce.js +251 -49
  70. package/dist/agents/subagent-lifecycle-events.js +19 -0
  71. package/dist/agents/subagent-registry-cleanup.js +31 -0
  72. package/dist/agents/subagent-registry-completion.js +68 -0
  73. package/dist/agents/subagent-registry-queries.js +117 -0
  74. package/dist/agents/subagent-registry-state.js +46 -0
  75. package/dist/agents/subagent-registry.js +252 -221
  76. package/dist/agents/subagent-registry.store.js +1 -0
  77. package/dist/agents/subagent-registry.types.js +1 -0
  78. package/dist/agents/subagent-spawn.js +195 -7
  79. package/dist/agents/system-prompt.js +22 -6
  80. package/dist/agents/test-helpers/fast-coding-tools.js +1 -18
  81. package/dist/agents/test-helpers/fast-core-tools.js +1 -17
  82. package/dist/agents/timeout.js +18 -6
  83. package/dist/agents/tool-call-id.js +1 -1
  84. package/dist/agents/tool-display-common.js +162 -29
  85. package/dist/agents/tool-images.js +82 -9
  86. package/dist/agents/tool-policy.js +51 -26
  87. package/dist/agents/tools/browser-tool.js +2 -2
  88. package/dist/agents/tools/canvas-tool.js +27 -1
  89. package/dist/agents/tools/common.js +45 -0
  90. package/dist/agents/tools/discord-actions-guild.js +4 -1
  91. package/dist/agents/tools/gateway-tool.js +3 -1
  92. package/dist/agents/tools/nodes-utils.js +1 -10
  93. package/dist/agents/tools/sessions-send-helpers.js +12 -6
  94. package/dist/agents/tools/sessions-spawn-tool.js +8 -2
  95. package/dist/agents/tools/subagents-tool.js +2 -1
  96. package/dist/agents/tools/whatsapp-actions.js +10 -2
  97. package/dist/agents/tools/whatsapp-target-auth.js +18 -0
  98. package/dist/agents/transcript-policy.js +22 -8
  99. package/dist/agents/venice-models.js +11 -3
  100. package/dist/auto-reply/commands-registry.data.js +51 -0
  101. package/dist/auto-reply/commands-registry.js +4 -3
  102. package/dist/auto-reply/group-activation.js +10 -5
  103. package/dist/auto-reply/inbound-debounce.js +10 -5
  104. package/dist/auto-reply/reply/abort.js +1 -1
  105. package/dist/auto-reply/reply/agent-runner-execution.js +4 -1
  106. package/dist/auto-reply/reply/bash-command.js +41 -39
  107. package/dist/auto-reply/reply/command-gates.js +25 -0
  108. package/dist/auto-reply/reply/commands-allowlist.js +111 -72
  109. package/dist/auto-reply/reply/commands-bash.js +6 -5
  110. package/dist/auto-reply/reply/commands-config.js +30 -28
  111. package/dist/auto-reply/reply/commands-core.js +2 -1
  112. package/dist/auto-reply/reply/commands-info.js +1 -0
  113. package/dist/auto-reply/reply/commands-models.js +65 -14
  114. package/dist/auto-reply/reply/commands-session.js +237 -82
  115. package/dist/auto-reply/reply/commands-setunset.js +45 -0
  116. package/dist/auto-reply/reply/commands-subagents/action-agents.js +44 -0
  117. package/dist/auto-reply/reply/commands-subagents/action-focus.js +64 -0
  118. package/dist/auto-reply/reply/commands-subagents/action-help.js +4 -0
  119. package/dist/auto-reply/reply/commands-subagents/action-info.js +45 -0
  120. package/dist/auto-reply/reply/commands-subagents/action-kill.js +60 -0
  121. package/dist/auto-reply/reply/commands-subagents/action-list.js +44 -0
  122. package/dist/auto-reply/reply/commands-subagents/action-log.js +29 -0
  123. package/dist/auto-reply/reply/commands-subagents/action-send.js +119 -0
  124. package/dist/auto-reply/reply/commands-subagents/action-spawn.js +52 -0
  125. package/dist/auto-reply/reply/commands-subagents/action-unfocus.js +30 -0
  126. package/dist/auto-reply/reply/commands-subagents/shared.js +303 -0
  127. package/dist/auto-reply/reply/commands-subagents.js +51 -587
  128. package/dist/auto-reply/reply/commands-tts.js +10 -5
  129. package/dist/auto-reply/reply/config-value.js +10 -5
  130. package/dist/auto-reply/reply/directive-handling.model-picker.js +12 -6
  131. package/dist/auto-reply/reply/directive-handling.persist.js +9 -21
  132. package/dist/auto-reply/reply/directive-handling.shared.js +24 -4
  133. package/dist/auto-reply/reply/followup-runner.js +1 -0
  134. package/dist/auto-reply/reply/get-reply-directives-utils.js +23 -14
  135. package/dist/auto-reply/reply/get-reply-directives.js +17 -28
  136. package/dist/auto-reply/reply/get-reply-inline-actions.js +1 -0
  137. package/dist/auto-reply/reply/get-reply.js +71 -12
  138. package/dist/auto-reply/reply/model-selection.js +80 -39
  139. package/dist/auto-reply/reply/queue/enqueue.js +10 -5
  140. package/dist/auto-reply/reply/queue/state.js +13 -12
  141. package/dist/auto-reply/reply/reply-payloads.js +67 -36
  142. package/dist/auto-reply/reply/reply-reference.js +9 -8
  143. package/dist/auto-reply/reply/route-reply.js +15 -8
  144. package/dist/auto-reply/reply/session-reset-prompt.js +1 -1
  145. package/dist/auto-reply/reply/session.js +22 -6
  146. package/dist/auto-reply/reply/strip-inbound-meta.js +147 -0
  147. package/dist/auto-reply/reply/subagents-utils.js +56 -30
  148. package/dist/auto-reply/reply/typing.js +46 -21
  149. package/dist/auto-reply/send-policy.js +14 -7
  150. package/dist/auto-reply/status.js +140 -16
  151. package/dist/auto-reply/templating.js +10 -5
  152. package/dist/auto-reply/thinking.js +7 -16
  153. package/dist/auto-reply/tokens.js +21 -5
  154. package/dist/browser/bridge-server.js +36 -20
  155. package/dist/browser/cdp.helpers.js +7 -14
  156. package/dist/browser/cdp.js +35 -15
  157. package/dist/browser/chrome.profile-decoration.js +7 -4
  158. package/dist/browser/config.js +4 -0
  159. package/dist/browser/extension-relay-auth.js +55 -0
  160. package/dist/browser/extension-relay.js +74 -29
  161. package/dist/browser/navigation-guard.js +9 -1
  162. package/dist/browser/paths.js +77 -0
  163. package/dist/browser/profiles.js +13 -8
  164. package/dist/browser/pw-ai-module.js +10 -5
  165. package/dist/browser/pw-session.js +76 -39
  166. package/dist/browser/pw-tools-core.interactions.js +14 -7
  167. package/dist/browser/pw-tools-core.state.js +12 -6
  168. package/dist/browser/routes/agent.act.js +2 -2
  169. package/dist/browser/server-context.js +7 -0
  170. package/dist/build-info.json +3 -3
  171. package/dist/channels/allow-from.js +2 -1
  172. package/dist/channels/allowlists/resolve-utils.js +43 -19
  173. package/dist/channels/channel-config.js +14 -7
  174. package/dist/channels/draft-stream-loop.js +7 -0
  175. package/dist/channels/model-overrides.js +82 -0
  176. package/dist/channels/plugins/normalize/imessage.js +14 -7
  177. package/dist/channels/plugins/normalize/slack.js +10 -5
  178. package/dist/channels/plugins/normalize/telegram.js +14 -7
  179. package/dist/channels/plugins/outbound/discord.js +80 -8
  180. package/dist/channels/plugins/outbound/signal.js +11 -11
  181. package/dist/channels/plugins/setup-helpers.js +10 -5
  182. package/dist/channels/sender-label.js +14 -7
  183. package/dist/channels/session.js +4 -2
  184. package/dist/channels/status-reactions.js +297 -0
  185. package/dist/cli/banner.js +1 -1
  186. package/dist/cli/browser-cli-actions-input/register.files-downloads.js +65 -56
  187. package/dist/cli/cli-name.js +11 -11
  188. package/dist/cli/cli-utils.js +13 -3
  189. package/dist/cli/command-format.js +1 -1
  190. package/dist/cli/config-cli.js +1 -1
  191. package/dist/cli/daemon-cli/lifecycle-core.js +31 -19
  192. package/dist/cli/daemon-cli/lifecycle.js +64 -2
  193. package/dist/cli/daemon-cli/restart-health.js +126 -0
  194. package/dist/cli/daemon-cli/status.gather.js +9 -13
  195. package/dist/cli/daemon-cli/status.print.js +2 -10
  196. package/dist/cli/deps.js +27 -22
  197. package/dist/cli/gateway-cli/run-loop.js +23 -5
  198. package/dist/cli/node-cli/register.js +14 -5
  199. package/dist/cli/nodes-media-utils.js +7 -2
  200. package/dist/cli/outbound-send-deps.js +2 -9
  201. package/dist/cli/outbound-send-mapping.js +11 -0
  202. package/dist/cli/pairing-cli.js +40 -14
  203. package/dist/cli/plugins-cli.js +34 -41
  204. package/dist/cli/ports.js +11 -10
  205. package/dist/cli/program/command-registry.js +2 -11
  206. package/dist/cli/program/command-tree.js +16 -0
  207. package/dist/cli/program/preaction.js +13 -9
  208. package/dist/cli/program/register.configure.js +3 -18
  209. package/dist/cli/program/register.maintenance.js +2 -2
  210. package/dist/cli/program/register.onboard.js +2 -0
  211. package/dist/cli/program/register.status-health-sessions.js +16 -17
  212. package/dist/cli/program/register.subclis.js +93 -52
  213. package/dist/cli/route.js +11 -7
  214. package/dist/cli/system-cli.js +36 -46
  215. package/dist/cli/update-cli/shared.js +22 -9
  216. package/dist/cli/update-cli/update-command.js +89 -14
  217. package/dist/cli/update-cli/wizard.js +6 -12
  218. package/dist/commands/agent/run-context.js +18 -5
  219. package/dist/commands/agent/session-store.js +17 -4
  220. package/dist/commands/agent.js +22 -2
  221. package/dist/commands/agents.bindings.js +14 -7
  222. package/dist/commands/agents.commands.add.js +13 -9
  223. package/dist/commands/agents.commands.identity.js +12 -6
  224. package/dist/commands/agents.commands.list.js +11 -6
  225. package/dist/commands/agents.config.js +8 -10
  226. package/dist/commands/agents.providers.js +12 -6
  227. package/dist/commands/auth-choice-options.js +103 -75
  228. package/dist/commands/auth-choice.apply.byteplus.js +55 -0
  229. package/dist/commands/auth-choice.apply.js +4 -0
  230. package/dist/commands/auth-choice.apply.minimax.js +61 -13
  231. package/dist/commands/auth-choice.apply.openai.js +3 -1
  232. package/dist/commands/auth-choice.apply.volcengine.js +55 -0
  233. package/dist/commands/auth-choice.preferred-provider.js +2 -0
  234. package/dist/commands/channels/remove.js +13 -6
  235. package/dist/commands/channels/shared.js +4 -14
  236. package/dist/commands/configure.commands.js +14 -0
  237. package/dist/commands/configure.gateway.js +2 -4
  238. package/dist/commands/configure.js +1 -1
  239. package/dist/commands/configure.shared.js +11 -0
  240. package/dist/commands/daemon-install-helpers.js +2 -2
  241. package/dist/commands/dashboard.js +12 -10
  242. package/dist/commands/docs.js +14 -8
  243. package/dist/commands/doctor-config-flow.js +11 -9
  244. package/dist/commands/doctor-legacy-config.js +281 -0
  245. package/dist/commands/doctor-state-integrity.js +99 -23
  246. package/dist/commands/doctor-update.js +12 -9
  247. package/dist/commands/models/list.list-command.js +7 -5
  248. package/dist/commands/models/set-image.js +2 -21
  249. package/dist/commands/node-daemon-install-helpers.js +10 -8
  250. package/dist/commands/onboard-auth.config-minimax.js +54 -80
  251. package/dist/commands/onboard-auth.config-opencode.js +2 -18
  252. package/dist/commands/onboard-auth.credentials.js +90 -13
  253. package/dist/commands/onboard-auth.js +1 -1
  254. package/dist/commands/onboard-auth.models.js +6 -5
  255. package/dist/commands/onboard-hooks.js +1 -1
  256. package/dist/commands/onboard-non-interactive/api-keys.js +14 -7
  257. package/dist/commands/onboard-non-interactive/local/auth-choice.js +64 -49
  258. package/dist/commands/onboard-provider-auth-flags.js +14 -0
  259. package/dist/commands/onboard-remote.js +14 -7
  260. package/dist/commands/onboard.js +11 -13
  261. package/dist/commands/sandbox-display.js +6 -5
  262. package/dist/commands/status-all/diagnosis.js +14 -10
  263. package/dist/commands/status-all/format.js +1 -0
  264. package/dist/commands/status.gateway-probe.js +1 -16
  265. package/dist/commands/systemd-linger.js +12 -6
  266. package/dist/config/agent-limits.js +2 -0
  267. package/dist/config/commands.js +30 -16
  268. package/dist/config/config-paths.js +9 -11
  269. package/dist/config/defaults.js +22 -2
  270. package/dist/config/discord-preview-streaming.js +104 -0
  271. package/dist/config/env-vars.js +37 -8
  272. package/dist/config/includes.js +4 -0
  273. package/dist/config/io.js +97 -12
  274. package/dist/config/legacy.migrations.part-1.js +189 -78
  275. package/dist/config/legacy.shared.js +3 -1
  276. package/dist/config/merge-patch.js +4 -0
  277. package/dist/config/prototype-keys.js +4 -0
  278. package/dist/config/schema.help.js +44 -7
  279. package/dist/config/schema.labels.js +38 -6
  280. package/dist/config/sessions/delivery-info.js +10 -3
  281. package/dist/config/sessions/main-session.js +10 -5
  282. package/dist/config/sessions/session-file.js +33 -0
  283. package/dist/config/sessions/session-key.js +10 -5
  284. package/dist/config/sessions/store.js +1 -1
  285. package/dist/config/sessions.js +1 -0
  286. package/dist/config/zod-schema.agent-runtime.js +11 -0
  287. package/dist/config/zod-schema.js +148 -13
  288. package/dist/config/zod-schema.providers-core.js +78 -4
  289. package/dist/config/zod-schema.providers.js +6 -1
  290. package/dist/config/zod-schema.session.js +41 -2
  291. package/dist/cron/run-log.js +3 -0
  292. package/dist/cron/schedule.js +21 -10
  293. package/dist/cron/service/ops.js +35 -21
  294. package/dist/cron/service/timer.js +116 -16
  295. package/dist/cron/stagger.js +3 -1
  296. package/dist/discord/api.js +12 -6
  297. package/dist/discord/draft-chunking.js +22 -0
  298. package/dist/discord/draft-stream.js +124 -0
  299. package/dist/discord/monitor/agent-components.js +1 -1
  300. package/dist/discord/monitor/commands.js +5 -0
  301. package/dist/discord/monitor/gateway-plugin.js +2 -1
  302. package/dist/discord/monitor/listeners.js +37 -27
  303. package/dist/discord/monitor/message-handler.js +4 -1
  304. package/dist/discord/monitor/message-handler.preflight.js +65 -8
  305. package/dist/discord/monitor/message-handler.process.js +246 -217
  306. package/dist/discord/monitor/message-utils.js +143 -6
  307. package/dist/discord/monitor/model-picker-preferences.js +143 -0
  308. package/dist/discord/monitor/model-picker.js +651 -0
  309. package/dist/discord/monitor/native-command.js +573 -16
  310. package/dist/discord/monitor/provider.allowlist.js +223 -0
  311. package/dist/discord/monitor/provider.js +275 -347
  312. package/dist/discord/monitor/provider.lifecycle.js +100 -0
  313. package/dist/discord/monitor/reply-delivery.js +123 -16
  314. package/dist/discord/monitor/thread-bindings.discord-api.js +215 -0
  315. package/dist/discord/monitor/thread-bindings.js +4 -0
  316. package/dist/discord/monitor/thread-bindings.lifecycle.js +177 -0
  317. package/dist/discord/monitor/thread-bindings.manager.js +423 -0
  318. package/dist/discord/monitor/thread-bindings.messages.js +55 -0
  319. package/dist/discord/monitor/thread-bindings.state.js +358 -0
  320. package/dist/discord/monitor/thread-bindings.types.js +6 -0
  321. package/dist/discord/resolve-users.js +33 -21
  322. package/dist/discord/send.channels.js +15 -0
  323. package/dist/discord/send.js +3 -2
  324. package/dist/discord/send.outbound.js +82 -26
  325. package/dist/discord/send.permissions.js +83 -30
  326. package/dist/discord/send.reactions.js +8 -4
  327. package/dist/discord/token.js +10 -5
  328. package/dist/discord/voice/command.js +263 -0
  329. package/dist/discord/voice/manager.js +531 -0
  330. package/dist/gateway/auth.js +34 -10
  331. package/dist/gateway/call.js +4 -16
  332. package/dist/gateway/client.js +28 -4
  333. package/dist/gateway/config-reload.js +3 -4
  334. package/dist/gateway/control-ui.js +219 -96
  335. package/dist/gateway/hooks-mapping.js +88 -38
  336. package/dist/gateway/http-auth-helpers.js +3 -2
  337. package/dist/gateway/http-endpoint-helpers.js +1 -0
  338. package/dist/gateway/net.js +54 -12
  339. package/dist/gateway/node-invoke-system-run-approval.js +14 -35
  340. package/dist/gateway/node-registry.js +10 -5
  341. package/dist/gateway/openai-http.js +1 -0
  342. package/dist/gateway/openresponses-http.js +1 -0
  343. package/dist/gateway/origin-check.js +1 -18
  344. package/dist/gateway/protocol/index.js +4 -3
  345. package/dist/gateway/protocol/schema/cron.js +1 -0
  346. package/dist/gateway/protocol/schema/devices.js +1 -0
  347. package/dist/gateway/protocol/schema/protocol-schemas.js +2 -1
  348. package/dist/gateway/protocol/schema/sessions.js +6 -0
  349. package/dist/gateway/role-policy.js +17 -0
  350. package/dist/gateway/server/ws-connection/connect-policy.js +37 -0
  351. package/dist/gateway/server/ws-connection/message-handler.js +175 -148
  352. package/dist/gateway/server-chat.js +83 -25
  353. package/dist/gateway/server-constants.js +10 -9
  354. package/dist/gateway/server-cron.js +1 -0
  355. package/dist/gateway/server-http.js +16 -7
  356. package/dist/gateway/server-maintenance.js +20 -5
  357. package/dist/gateway/server-methods/chat.js +10 -6
  358. package/dist/gateway/server-methods/config.js +12 -14
  359. package/dist/gateway/server-methods/devices.js +17 -3
  360. package/dist/gateway/server-methods/models.js +11 -1
  361. package/dist/gateway/server-methods/sessions.js +64 -8
  362. package/dist/gateway/server-methods/usage.js +162 -75
  363. package/dist/gateway/server-node-events.js +29 -0
  364. package/dist/gateway/server-runtime-config.js +34 -13
  365. package/dist/gateway/server-startup-memory.js +17 -11
  366. package/dist/gateway/session-utils.fs.js +32 -34
  367. package/dist/gateway/sessions-resolve.js +17 -5
  368. package/dist/gateway/test-helpers.openai-mock.js +14 -7
  369. package/dist/gateway/tools-invoke-http.js +21 -10
  370. package/dist/hooks/bundled/bootstrap-extra-files/handler.js +3 -1
  371. package/dist/hooks/bundled/command-logger/handler.js +7 -2
  372. package/dist/hooks/bundled/session-memory/handler.js +6 -5
  373. package/dist/hooks/frontmatter.js +6 -6
  374. package/dist/hooks/gmail-watcher.js +11 -6
  375. package/dist/hooks/internal-hooks.js +11 -1
  376. package/dist/hooks/llm-slug-generator.js +4 -1
  377. package/dist/hooks/workspace.js +47 -17
  378. package/dist/imessage/accounts.js +9 -20
  379. package/dist/imessage/monitor/inbound-processing.js +2 -1
  380. package/dist/infra/archive.js +174 -73
  381. package/dist/infra/control-ui-assets.js +14 -6
  382. package/dist/infra/device-pairing.js +108 -29
  383. package/dist/infra/env.js +10 -5
  384. package/dist/infra/exec-approvals-allowlist.js +122 -0
  385. package/dist/infra/exec-approvals-analysis.js +34 -3
  386. package/dist/infra/exec-approvals.js +5 -17
  387. package/dist/infra/exec-safe-bin-policy.js +53 -45
  388. package/dist/infra/fs-safe.js +71 -39
  389. package/dist/infra/gateway-lock.js +6 -2
  390. package/dist/infra/heartbeat-wake.js +6 -12
  391. package/dist/infra/host-env-security-policy.json +19 -0
  392. package/dist/infra/host-env-security.js +66 -0
  393. package/dist/infra/net/ssrf.js +131 -38
  394. package/dist/infra/outbound/bound-delivery-router.js +88 -0
  395. package/dist/infra/outbound/channel-selection.js +12 -6
  396. package/dist/infra/outbound/envelope.js +1 -1
  397. package/dist/infra/outbound/format.js +12 -6
  398. package/dist/infra/outbound/payloads.js +14 -7
  399. package/dist/infra/outbound/session-binding-service.js +123 -0
  400. package/dist/infra/path-guards.js +25 -0
  401. package/dist/infra/provider-usage.fetch.codex.js +7 -15
  402. package/dist/infra/provider-usage.fetch.gemini.js +14 -11
  403. package/dist/infra/provider-usage.fetch.shared.js +30 -1
  404. package/dist/infra/provider-usage.fetch.zai.js +10 -9
  405. package/dist/infra/retry-policy.js +4 -2
  406. package/dist/infra/retry.js +9 -5
  407. package/dist/infra/session-cost-usage.js +107 -59
  408. package/dist/infra/session-maintenance-warning.js +3 -1
  409. package/dist/infra/shell-env.js +98 -34
  410. package/dist/infra/ssh-config.js +12 -6
  411. package/dist/infra/system-run-command.js +49 -4
  412. package/dist/infra/update-channels.js +10 -5
  413. package/dist/line/accounts.js +5 -7
  414. package/dist/line/bot-access.js +8 -20
  415. package/dist/line/bot-handlers.js +3 -1
  416. package/dist/link-understanding/detect.js +15 -7
  417. package/dist/media/constants.js +15 -6
  418. package/dist/media/image-ops.js +7 -0
  419. package/dist/media/local-roots.js +3 -2
  420. package/dist/media-understanding/apply.js +4 -1
  421. package/dist/media-understanding/concurrency.js +8 -20
  422. package/dist/memory/backend-config.js +45 -6
  423. package/dist/memory/embeddings.js +10 -4
  424. package/dist/memory/fs-utils.js +23 -0
  425. package/dist/memory/manager-search.js +12 -6
  426. package/dist/memory/manager-sync-ops.js +12 -2
  427. package/dist/memory/qmd-manager.js +466 -53
  428. package/dist/memory/query-expansion.js +167 -3
  429. package/dist/memory/status-format.js +10 -5
  430. package/dist/memory/sync-memory-files.js +1 -1
  431. package/dist/node-host/invoke-system-run.js +281 -0
  432. package/dist/node-host/invoke.js +55 -337
  433. package/dist/pairing/pairing-store.js +22 -0
  434. package/dist/plugin-sdk/allow-from.js +1 -1
  435. package/dist/plugin-sdk/command-auth.js +3 -1
  436. package/dist/plugin-sdk/index.js +6 -3
  437. package/dist/plugin-sdk/webhook-targets.js +32 -0
  438. package/dist/plugins/bundled-dir.js +9 -6
  439. package/dist/plugins/hooks.js +50 -0
  440. package/dist/plugins/install.js +28 -16
  441. package/dist/plugins/runtime.js +3 -17
  442. package/dist/plugins/update.js +78 -12
  443. package/dist/process/spawn-utils.js +14 -7
  444. package/dist/providers/github-copilot-token.js +11 -6
  445. package/dist/providers/qwen-portal-oauth.js +14 -6
  446. package/dist/routing/account-id.js +30 -0
  447. package/dist/routing/resolve-route.js +3 -7
  448. package/dist/routing/session-key.js +2 -16
  449. package/dist/security/audit-channel.js +93 -2
  450. package/dist/security/audit-extra.async.js +159 -5
  451. package/dist/security/audit-extra.js +1 -1
  452. package/dist/security/audit-extra.sync.js +85 -6
  453. package/dist/security/audit.js +40 -4
  454. package/dist/security/dm-policy-shared.js +44 -0
  455. package/dist/security/external-content.js +26 -6
  456. package/dist/shared/entry-status.js +6 -0
  457. package/dist/shared/frontmatter.js +5 -5
  458. package/dist/shared/node-match.js +11 -4
  459. package/dist/shared/operator-scope-compat.js +8 -3
  460. package/dist/signal/accounts.js +7 -20
  461. package/dist/signal/monitor/event-handler.js +3 -1
  462. package/dist/slack/accounts.js +6 -19
  463. package/dist/slack/actions.js +11 -3
  464. package/dist/slack/monitor/auth.js +1 -1
  465. package/dist/slack/monitor/message-handler/dispatch.js +50 -29
  466. package/dist/slack/monitor/replies.js +15 -7
  467. package/dist/slack/monitor/slash.js +22 -13
  468. package/dist/slack/resolve-channels.js +10 -5
  469. package/dist/slack/send.js +102 -12
  470. package/dist/slack/stream-mode.js +10 -0
  471. package/dist/slack/streaming.js +4 -2
  472. package/dist/telegram/accounts.js +19 -14
  473. package/dist/telegram/bot/helpers.js +3 -5
  474. package/dist/telegram/bot-access.js +35 -36
  475. package/dist/telegram/bot-handlers.js +120 -148
  476. package/dist/telegram/bot-message-context.js +68 -9
  477. package/dist/telegram/bot-message-dispatch.js +155 -90
  478. package/dist/telegram/bot-native-commands.js +16 -0
  479. package/dist/telegram/draft-stream.js +14 -1
  480. package/dist/telegram/inline-buttons.js +5 -15
  481. package/dist/telegram/monitor.js +11 -7
  482. package/dist/telegram/network-config.js +19 -7
  483. package/dist/telegram/send.js +3 -2
  484. package/dist/telegram/sent-message-cache.js +5 -6
  485. package/dist/telegram/status-reaction-variants.js +208 -0
  486. package/dist/telegram/sticker-cache.js +11 -9
  487. package/dist/terminal/theme.js +12 -12
  488. package/dist/tts/tts.js +80 -567
  489. package/dist/tui/components/chat-log.js +41 -8
  490. package/dist/tui/theme/theme.js +10 -12
  491. package/dist/tui/tui-local-shell.js +16 -6
  492. package/dist/tui/tui.js +58 -6
  493. package/dist/utils/account-id.js +2 -4
  494. package/dist/utils/boolean.js +10 -5
  495. package/dist/utils/directive-tags.js +11 -0
  496. package/dist/utils/queue-helpers.js +67 -12
  497. package/dist/web/auto-reply/deliver-reply.js +8 -4
  498. package/dist/web/auto-reply/mentions.js +10 -5
  499. package/dist/web/auto-reply/monitor/group-members.js +14 -7
  500. package/dist/web/auto-reply/monitor/process-message.js +45 -24
  501. package/dist/web/inbound/access-control.js +5 -2
  502. package/dist/web/login-qr.js +12 -6
  503. package/dist/web/media.js +123 -16
  504. package/extensions/bluebubbles/src/monitor-processing.ts +580 -139
  505. package/extensions/bluebubbles/src/monitor.ts +208 -1950
  506. package/package.json +1 -1
@@ -1,8 +1,11 @@
1
1
  import { z } from "zod";
2
+ import { isSafeScpRemoteHost } from "../infra/scp-host.js";
3
+ import { isValidInboundPathRootPattern } from "../media/inbound-path-policy.js";
4
+ import { resolveDiscordPreviewStreamMode, resolveSlackNativeStreaming, resolveSlackStreamingMode, resolveTelegramPreviewStreamMode, } from "./discord-preview-streaming.js";
2
5
  import { normalizeTelegramCommandDescription, normalizeTelegramCommandName, resolveTelegramCustomCommands, } from "./telegram-custom-commands.js";
3
6
  import { ToolPolicySchema } from "./zod-schema.agent-runtime.js";
4
7
  import { ChannelHeartbeatVisibilitySchema } from "./zod-schema.channels.js";
5
- import { BlockStreamingChunkSchema, BlockStreamingCoalesceSchema, DmConfigSchema, DmPolicySchema, ExecutableTokenSchema, GroupPolicySchema, HexColorSchema, MarkdownConfigSchema, MSTeamsReplyStyleSchema, ProviderCommandsSchema, ReplyToModeSchema, RetryConfigSchema, requireOpenAllowFrom, } from "./zod-schema.core.js";
8
+ import { BlockStreamingChunkSchema, BlockStreamingCoalesceSchema, DmConfigSchema, DmPolicySchema, ExecutableTokenSchema, GroupPolicySchema, HexColorSchema, MarkdownConfigSchema, MSTeamsReplyStyleSchema, ProviderCommandsSchema, ReplyToModeSchema, RetryConfigSchema, TtsConfigSchema, requireOpenAllowFrom, } from "./zod-schema.core.js";
6
9
  import { sensitive } from "./zod-schema.sensitive.js";
7
10
  const ToolPolicyBySenderSchema = z.record(z.string(), ToolPolicySchema).optional();
8
11
  const DiscordIdSchema = z
@@ -66,6 +69,19 @@ const validateTelegramCustomCommands = (value, ctx) => {
66
69
  });
67
70
  }
68
71
  };
72
+ function normalizeTelegramStreamingConfig(value) {
73
+ value.streaming = resolveTelegramPreviewStreamMode(value);
74
+ delete value.streamMode;
75
+ }
76
+ function normalizeDiscordStreamingConfig(value) {
77
+ value.streaming = resolveDiscordPreviewStreamMode(value);
78
+ delete value.streamMode;
79
+ }
80
+ function normalizeSlackStreamingConfig(value) {
81
+ value.nativeStreaming = resolveSlackNativeStreaming(value);
82
+ value.streaming = resolveSlackStreamingMode(value);
83
+ delete value.streamMode;
84
+ }
69
85
  export const TelegramAccountSchemaBase = z
70
86
  .object({
71
87
  name: z.string().optional(),
@@ -81,6 +97,7 @@ export const TelegramAccountSchemaBase = z
81
97
  replyToMode: ReplyToModeSchema.optional(),
82
98
  groups: z.record(z.string(), TelegramGroupSchema.optional()).optional(),
83
99
  allowFrom: z.array(z.union([z.string(), z.number()])).optional(),
100
+ defaultTo: z.union([z.string(), z.number()]).optional(),
84
101
  groupAllowFrom: z.array(z.union([z.string(), z.number()])).optional(),
85
102
  groupPolicy: GroupPolicySchema.optional().default("allowlist"),
86
103
  historyLimit: z.number().int().min(0).optional(),
@@ -88,10 +105,12 @@ export const TelegramAccountSchemaBase = z
88
105
  dms: z.record(z.string(), DmConfigSchema.optional()).optional(),
89
106
  textChunkLimit: z.number().int().positive().optional(),
90
107
  chunkMode: z.enum(["length", "newline"]).optional(),
108
+ streaming: z.union([z.boolean(), z.enum(["off", "partial", "block", "progress"])]).optional(),
91
109
  blockStreaming: z.boolean().optional(),
92
110
  draftChunk: BlockStreamingChunkSchema.optional(),
93
111
  blockStreamingCoalesce: BlockStreamingCoalesceSchema.optional(),
94
- streamMode: z.enum(["off", "partial", "block"]).optional().default("partial"),
112
+ // Legacy key kept for automatic migration to `streaming`.
113
+ streamMode: z.enum(["off", "partial", "block"]).optional(),
95
114
  mediaMaxMb: z.number().positive().optional(),
96
115
  timeoutSeconds: z.number().int().positive().optional(),
97
116
  retry: RetryConfigSchema,
@@ -124,6 +143,7 @@ export const TelegramAccountSchemaBase = z
124
143
  })
125
144
  .strict();
126
145
  export const TelegramAccountSchema = TelegramAccountSchemaBase.superRefine((value, ctx) => {
146
+ normalizeTelegramStreamingConfig(value);
127
147
  requireOpenAllowFrom({
128
148
  policy: value.dmPolicy,
129
149
  allowFrom: value.allowFrom,
@@ -136,6 +156,7 @@ export const TelegramAccountSchema = TelegramAccountSchemaBase.superRefine((valu
136
156
  export const TelegramConfigSchema = TelegramAccountSchemaBase.extend({
137
157
  accounts: z.record(z.string(), TelegramAccountSchema.optional()).optional(),
138
158
  }).superRefine((value, ctx) => {
159
+ normalizeTelegramStreamingConfig(value);
139
160
  requireOpenAllowFrom({
140
161
  policy: value.dmPolicy,
141
162
  allowFrom: value.allowFrom,
@@ -224,6 +245,20 @@ const DiscordUiSchema = z
224
245
  })
225
246
  .strict()
226
247
  .optional();
248
+ const DiscordVoiceAutoJoinSchema = z
249
+ .object({
250
+ guildId: z.string().min(1),
251
+ channelId: z.string().min(1),
252
+ })
253
+ .strict();
254
+ const DiscordVoiceSchema = z
255
+ .object({
256
+ enabled: z.boolean().optional(),
257
+ autoJoin: z.array(DiscordVoiceAutoJoinSchema).optional(),
258
+ tts: TtsConfigSchema.optional(),
259
+ })
260
+ .strict()
261
+ .optional();
227
262
  export const DiscordAccountSchema = z
228
263
  .object({
229
264
  name: z.string().optional(),
@@ -243,6 +278,10 @@ export const DiscordAccountSchema = z
243
278
  chunkMode: z.enum(["length", "newline"]).optional(),
244
279
  blockStreaming: z.boolean().optional(),
245
280
  blockStreamingCoalesce: BlockStreamingCoalesceSchema.optional(),
281
+ // Canonical streaming mode. Legacy aliases (`streamMode`, boolean `streaming`) are auto-mapped.
282
+ streaming: z.union([z.boolean(), z.enum(["off", "partial", "block", "progress"])]).optional(),
283
+ streamMode: z.enum(["partial", "block", "off"]).optional(),
284
+ draftChunk: BlockStreamingChunkSchema.optional(),
246
285
  maxLinesPerMessage: z.number().int().positive().optional(),
247
286
  mediaMaxMb: z.number().positive().optional(),
248
287
  retry: RetryConfigSchema,
@@ -275,6 +314,7 @@ export const DiscordAccountSchema = z
275
314
  // inheritance in multi-account setups (shallow merge works; nested dm object doesn't).
276
315
  dmPolicy: DmPolicySchema.optional(),
277
316
  allowFrom: DiscordIdListSchema.optional(),
317
+ defaultTo: z.string().optional(),
278
318
  dm: DiscordDmSchema.optional(),
279
319
  guilds: z.record(z.string(), DiscordGuildSchema.optional()).optional(),
280
320
  heartbeat: ChannelHeartbeatVisibilitySchema,
@@ -290,6 +330,20 @@ export const DiscordAccountSchema = z
290
330
  .strict()
291
331
  .optional(),
292
332
  ui: DiscordUiSchema,
333
+ slashCommand: z
334
+ .object({
335
+ ephemeral: z.boolean().optional(),
336
+ })
337
+ .strict()
338
+ .optional(),
339
+ threadBindings: z
340
+ .object({
341
+ enabled: z.boolean().optional(),
342
+ ttlHours: z.number().nonnegative().optional(),
343
+ spawnSubagentSessions: z.boolean().optional(),
344
+ })
345
+ .strict()
346
+ .optional(),
293
347
  intents: z
294
348
  .object({
295
349
  presence: z.boolean().optional(),
@@ -297,6 +351,7 @@ export const DiscordAccountSchema = z
297
351
  })
298
352
  .strict()
299
353
  .optional(),
354
+ voice: DiscordVoiceSchema,
300
355
  pluralkit: z
301
356
  .object({
302
357
  enabled: z.boolean().optional(),
@@ -315,6 +370,7 @@ export const DiscordAccountSchema = z
315
370
  })
316
371
  .strict()
317
372
  .superRefine((value, ctx) => {
373
+ normalizeDiscordStreamingConfig(value);
318
374
  const activityText = typeof value.activity === "string" ? value.activity.trim() : "";
319
375
  const hasActivity = Boolean(activityText);
320
376
  const hasActivityType = value.activityType !== undefined;
@@ -391,6 +447,7 @@ export const GoogleChatAccountSchema = z
391
447
  groupPolicy: GroupPolicySchema.optional().default("allowlist"),
392
448
  groupAllowFrom: z.array(z.union([z.string(), z.number()])).optional(),
393
449
  groups: z.record(z.string(), GoogleChatGroupSchema.optional()).optional(),
450
+ defaultTo: z.string().optional(),
394
451
  serviceAccount: z.union([z.string(), z.record(z.string(), z.unknown())]).optional(),
395
452
  serviceAccountFile: z.string().optional(),
396
453
  audienceType: z.enum(["app-url", "project-number"]).optional(),
@@ -485,7 +542,9 @@ export const SlackAccountSchema = z
485
542
  chunkMode: z.enum(["length", "newline"]).optional(),
486
543
  blockStreaming: z.boolean().optional(),
487
544
  blockStreamingCoalesce: BlockStreamingCoalesceSchema.optional(),
488
- streaming: z.boolean().optional(),
545
+ streaming: z.union([z.boolean(), z.enum(["off", "partial", "block", "progress"])]).optional(),
546
+ nativeStreaming: z.boolean().optional(),
547
+ streamMode: z.enum(["replace", "status_final", "append"]).optional(),
489
548
  mediaMaxMb: z.number().positive().optional(),
490
549
  reactionNotifications: z.enum(["off", "own", "all", "allowlist"]).optional(),
491
550
  reactionAllowlist: z.array(z.union([z.string(), z.number()])).optional(),
@@ -518,6 +577,7 @@ export const SlackAccountSchema = z
518
577
  // inheritance in multi-account setups (shallow merge works; nested dm object doesn't).
519
578
  dmPolicy: DmPolicySchema.optional(),
520
579
  allowFrom: z.array(z.union([z.string(), z.number()])).optional(),
580
+ defaultTo: z.string().optional(),
521
581
  dm: SlackDmSchema.optional(),
522
582
  channels: z.record(z.string(), SlackChannelSchema.optional()).optional(),
523
583
  heartbeat: ChannelHeartbeatVisibilitySchema,
@@ -526,6 +586,7 @@ export const SlackAccountSchema = z
526
586
  })
527
587
  .strict()
528
588
  .superRefine((value, ctx) => {
589
+ normalizeSlackStreamingConfig(value);
529
590
  const dmPolicy = value.dmPolicy ?? value.dm?.policy ?? "pairing";
530
591
  const allowFrom = value.allowFrom ?? value.dm?.allowFrom;
531
592
  const allowFromPath = value.allowFrom !== undefined ? ["allowFrom"] : ["dm", "allowFrom"];
@@ -595,6 +656,7 @@ export const SignalAccountSchemaBase = z
595
656
  sendReadReceipts: z.boolean().optional(),
596
657
  dmPolicy: DmPolicySchema.optional().default("pairing"),
597
658
  allowFrom: z.array(z.union([z.string(), z.number()])).optional(),
659
+ defaultTo: z.string().optional(),
598
660
  groupAllowFrom: z.array(z.union([z.string(), z.number()])).optional(),
599
661
  groupPolicy: GroupPolicySchema.optional().default("allowlist"),
600
662
  historyLimit: z.number().int().min(0).optional(),
@@ -678,6 +740,7 @@ export const IrcAccountSchemaBase = z
678
740
  channels: z.array(z.string()).optional(),
679
741
  dmPolicy: DmPolicySchema.optional().default("pairing"),
680
742
  allowFrom: z.array(z.union([z.string(), z.number()])).optional(),
743
+ defaultTo: z.string().optional(),
681
744
  groupAllowFrom: z.array(z.union([z.string(), z.number()])).optional(),
682
745
  groupPolicy: GroupPolicySchema.optional().default("allowlist"),
683
746
  groups: z.record(z.string(), IrcGroupSchema.optional()).optional(),
@@ -727,17 +790,27 @@ export const IMessageAccountSchemaBase = z
727
790
  configWrites: z.boolean().optional(),
728
791
  cliPath: ExecutableTokenSchema.optional(),
729
792
  dbPath: z.string().optional(),
730
- remoteHost: z.string().optional(),
793
+ remoteHost: z
794
+ .string()
795
+ .refine(isSafeScpRemoteHost, "expected SSH host or user@host (no spaces/options)")
796
+ .optional(),
731
797
  service: z.union([z.literal("imessage"), z.literal("sms"), z.literal("auto")]).optional(),
732
798
  region: z.string().optional(),
733
799
  dmPolicy: DmPolicySchema.optional().default("pairing"),
734
800
  allowFrom: z.array(z.union([z.string(), z.number()])).optional(),
801
+ defaultTo: z.string().optional(),
735
802
  groupAllowFrom: z.array(z.union([z.string(), z.number()])).optional(),
736
803
  groupPolicy: GroupPolicySchema.optional().default("allowlist"),
737
804
  historyLimit: z.number().int().min(0).optional(),
738
805
  dmHistoryLimit: z.number().int().min(0).optional(),
739
806
  dms: z.record(z.string(), DmConfigSchema.optional()).optional(),
740
807
  includeAttachments: z.boolean().optional(),
808
+ attachmentRoots: z
809
+ .array(z.string().refine(isValidInboundPathRootPattern, "expected absolute path root"))
810
+ .optional(),
811
+ remoteAttachmentRoots: z
812
+ .array(z.string().refine(isValidInboundPathRootPattern, "expected absolute path root"))
813
+ .optional(),
741
814
  mediaMaxMb: z.number().int().positive().optional(),
742
815
  textChunkLimit: z.number().int().positive().optional(),
743
816
  chunkMode: z.enum(["length", "newline"]).optional(),
@@ -886,6 +959,7 @@ export const MSTeamsConfigSchema = z
886
959
  .optional(),
887
960
  dmPolicy: DmPolicySchema.optional().default("pairing"),
888
961
  allowFrom: z.array(z.string()).optional(),
962
+ defaultTo: z.string().optional(),
889
963
  groupAllowFrom: z.array(z.string()).optional(),
890
964
  groupPolicy: GroupPolicySchema.optional().default("allowlist"),
891
965
  textChunkLimit: z.number().int().positive().optional(),
@@ -1,11 +1,14 @@
1
1
  import { z } from "zod";
2
- import { BlueBubblesConfigSchema, DiscordConfigSchema, GoogleChatConfigSchema, IMessageConfigSchema, MSTeamsConfigSchema, SignalConfigSchema, SlackConfigSchema, TelegramConfigSchema, } from "./zod-schema.providers-core.js";
2
+ import { BlueBubblesConfigSchema, DiscordConfigSchema, GoogleChatConfigSchema, IMessageConfigSchema, IrcConfigSchema, MSTeamsConfigSchema, SignalConfigSchema, SlackConfigSchema, TelegramConfigSchema, } from "./zod-schema.providers-core.js";
3
3
  import { WhatsAppConfigSchema } from "./zod-schema.providers-whatsapp.js";
4
4
  import { GroupPolicySchema } from "./zod-schema.core.js";
5
5
  import { ChannelHeartbeatVisibilitySchema } from "./zod-schema.channels.js";
6
6
  export * from "./zod-schema.providers-core.js";
7
7
  export * from "./zod-schema.providers-whatsapp.js";
8
8
  export { ChannelHeartbeatVisibilitySchema } from "./zod-schema.channels.js";
9
+ const ChannelModelByChannelSchema = z
10
+ .record(z.string(), z.record(z.string(), z.string()))
11
+ .optional();
9
12
  export const ChannelsSchema = z
10
13
  .object({
11
14
  defaults: z
@@ -15,9 +18,11 @@ export const ChannelsSchema = z
15
18
  })
16
19
  .strict()
17
20
  .optional(),
21
+ modelByChannel: ChannelModelByChannelSchema,
18
22
  whatsapp: WhatsAppConfigSchema.optional(),
19
23
  telegram: TelegramConfigSchema.optional(),
20
24
  discord: DiscordConfigSchema.optional(),
25
+ irc: IrcConfigSchema.optional(),
21
26
  googlechat: GoogleChatConfigSchema.optional(),
22
27
  slack: SlackConfigSchema.optional(),
23
28
  signal: SignalConfigSchema.optional(),
@@ -4,6 +4,7 @@ import { parseDurationMs } from "../cli/parse-duration.js";
4
4
  import { ElevatedAllowFromSchema } from "./zod-schema.agent-runtime.js";
5
5
  import { createAllowDenyChannelRulesSchema } from "./zod-schema.allowdeny.js";
6
6
  import { GroupChatSchema, InboundDebounceSchema, NativeCommandsSettingSchema, QueueSchema, TtsConfigSchema, } from "./zod-schema.core.js";
7
+ import { sensitive } from "./zod-schema.sensitive.js";
7
8
  const SessionResetConfigSchema = z
8
9
  .object({
9
10
  mode: z.union([z.literal("daily"), z.literal("idle")]).optional(),
@@ -56,6 +57,13 @@ export const SessionSchema = z
56
57
  })
57
58
  .strict()
58
59
  .optional(),
60
+ threadBindings: z
61
+ .object({
62
+ enabled: z.boolean().optional(),
63
+ ttlHours: z.number().nonnegative().optional(),
64
+ })
65
+ .strict()
66
+ .optional(),
59
67
  maintenance: z
60
68
  .object({
61
69
  mode: z.enum(["enforce", "warn"]).optional(),
@@ -106,6 +114,35 @@ export const MessagesSchema = z
106
114
  ackReaction: z.string().optional(),
107
115
  ackReactionScope: z.enum(["group-mentions", "group-all", "direct", "all"]).optional(),
108
116
  removeAckAfterReply: z.boolean().optional(),
117
+ statusReactions: z
118
+ .object({
119
+ enabled: z.boolean().optional(),
120
+ emojis: z
121
+ .object({
122
+ thinking: z.string().optional(),
123
+ tool: z.string().optional(),
124
+ coding: z.string().optional(),
125
+ web: z.string().optional(),
126
+ done: z.string().optional(),
127
+ error: z.string().optional(),
128
+ stallSoft: z.string().optional(),
129
+ stallHard: z.string().optional(),
130
+ })
131
+ .strict()
132
+ .optional(),
133
+ timing: z
134
+ .object({
135
+ debounceMs: z.number().int().min(0).optional(),
136
+ stallSoftMs: z.number().int().min(0).optional(),
137
+ stallHardMs: z.number().int().min(0).optional(),
138
+ doneHoldMs: z.number().int().min(0).optional(),
139
+ errorHoldMs: z.number().int().min(0).optional(),
140
+ })
141
+ .strict()
142
+ .optional(),
143
+ })
144
+ .strict()
145
+ .optional(),
109
146
  suppressToolErrors: z.boolean().optional(),
110
147
  tts: TtsConfigSchema,
111
148
  })
@@ -120,11 +157,13 @@ export const CommandsSchema = z
120
157
  bashForegroundMs: z.number().int().min(0).max(30_000).optional(),
121
158
  config: z.boolean().optional(),
122
159
  debug: z.boolean().optional(),
123
- restart: z.boolean().optional(),
160
+ restart: z.boolean().optional().default(true),
124
161
  useAccessGroups: z.boolean().optional(),
125
162
  ownerAllowFrom: z.array(z.union([z.string(), z.number()])).optional(),
163
+ ownerDisplay: z.enum(["raw", "hash"]).optional().default("raw"),
164
+ ownerDisplaySecret: z.string().optional().register(sensitive),
126
165
  allowFrom: ElevatedAllowFromSchema.optional(),
127
166
  })
128
167
  .strict()
129
168
  .optional()
130
- .default({ native: "auto", nativeSkills: "auto" });
169
+ .default(() => ({ native: "auto", nativeSkills: "auto", restart: true, ownerDisplay: "raw" }));
@@ -93,6 +93,9 @@ export async function readCronRunLogEntries(filePath, opts) {
93
93
  }
94
94
  : undefined,
95
95
  };
96
+ if (typeof obj.delivered === "boolean") {
97
+ entry.delivered = obj.delivered;
98
+ }
96
99
  if (typeof obj.sessionId === "string" && obj.sessionId.trim().length > 0) {
97
100
  entry.sessionId = obj.sessionId;
98
101
  }
@@ -35,7 +35,11 @@ export function computeNextRunAtMs(schedule, nowMs) {
35
35
  const steps = Math.max(1, Math.floor((elapsed + everyMs - 1) / everyMs));
36
36
  return anchor + steps * everyMs;
37
37
  }
38
- const expr = schedule.expr.trim();
38
+ const exprSource = schedule.expr;
39
+ if (typeof exprSource !== "string") {
40
+ throw new Error("invalid cron schedule: expr is required");
41
+ }
42
+ const expr = exprSource.trim();
39
43
  if (!expr) {
40
44
  return undefined;
41
45
  }
@@ -43,17 +47,24 @@ export function computeNextRunAtMs(schedule, nowMs) {
43
47
  timezone: resolveCronTimezone(schedule.tz),
44
48
  catch: false,
45
49
  });
46
- // Cron operates at second granularity, so floor nowMs to the start of the
47
- // current second. This prevents the lookback from landing inside a matching
48
- // second — if nowMs is e.g. 12:00:00.500 and the pattern fires at second 0,
49
- // a 1ms lookback (12:00:00.499) is still *within* that second, causing
50
- // croner to skip ahead to the next occurrence (e.g. the following day).
51
- // Flooring first ensures the lookback always falls in the *previous* second.
52
- const nowSecondMs = Math.floor(nowMs / 1000) * 1000;
53
- const next = cron.nextRun(new Date(nowSecondMs - 1));
50
+ const next = cron.nextRun(new Date(nowMs));
54
51
  if (!next) {
55
52
  return undefined;
56
53
  }
57
54
  const nextMs = next.getTime();
58
- return Number.isFinite(nextMs) && nextMs >= nowSecondMs ? nextMs : undefined;
55
+ if (!Number.isFinite(nextMs)) {
56
+ return undefined;
57
+ }
58
+ if (nextMs > nowMs) {
59
+ return nextMs;
60
+ }
61
+ // Guard against same-second rescheduling loops: if croner returns
62
+ // "now" (or an earlier instant), retry from the next whole second.
63
+ const nextSecondMs = Math.floor(nowMs / 1000) * 1000 + 1000;
64
+ const retry = cron.nextRun(new Date(nextSecondMs));
65
+ if (!retry) {
66
+ return undefined;
67
+ }
68
+ const retryMs = retry.getTime();
69
+ return Number.isFinite(retryMs) && retryMs > nowMs ? retryMs : undefined;
59
70
  }
@@ -1,22 +1,40 @@
1
- import { applyJobPatch, computeJobNextRunAtMs, createJob, findJobOrThrow, isJobDue, nextWakeAtMs, recomputeNextRuns, } from "./jobs.js";
1
+ import { applyJobPatch, computeJobNextRunAtMs, createJob, findJobOrThrow, isJobDue, nextWakeAtMs, recomputeNextRuns, recomputeNextRunsForMaintenance, } from "./jobs.js";
2
2
  import { locked } from "./locked.js";
3
3
  import { ensureLoaded, persist, warnIfDisabled } from "./store.js";
4
4
  import { armTimer, emit, executeJob, runMissedJobs, stopTimer, wake } from "./timer.js";
5
+ async function ensureLoadedForRead(state) {
6
+ await ensureLoaded(state, { skipRecompute: true });
7
+ if (!state.store) {
8
+ return;
9
+ }
10
+ // Use the maintenance-only version so that read-only operations never
11
+ // advance a past-due nextRunAtMs without executing the job (#16156).
12
+ const changed = recomputeNextRunsForMaintenance(state);
13
+ if (changed) {
14
+ await persist(state);
15
+ }
16
+ }
5
17
  export async function start(state) {
18
+ if (!state.deps.cronEnabled) {
19
+ state.deps.log.info({ enabled: false }, "cron: disabled");
20
+ return;
21
+ }
22
+ const startupInterruptedJobIds = new Set();
6
23
  await locked(state, async () => {
7
- if (!state.deps.cronEnabled) {
8
- state.deps.log.info({ enabled: false }, "cron: disabled");
9
- return;
10
- }
11
24
  await ensureLoaded(state, { skipRecompute: true });
12
25
  const jobs = state.store?.jobs ?? [];
13
26
  for (const job of jobs) {
14
27
  if (typeof job.state.runningAtMs === "number") {
15
28
  state.deps.log.warn({ jobId: job.id, runningAtMs: job.state.runningAtMs }, "cron: clearing stale running marker on startup");
16
29
  job.state.runningAtMs = undefined;
30
+ startupInterruptedJobIds.add(job.id);
17
31
  }
18
32
  }
19
- await runMissedJobs(state);
33
+ await persist(state);
34
+ });
35
+ await runMissedJobs(state, { skipJobIds: startupInterruptedJobIds });
36
+ await locked(state, async () => {
37
+ await ensureLoaded(state, { forceReload: true, skipRecompute: true });
20
38
  recomputeNextRuns(state);
21
39
  await persist(state);
22
40
  armTimer(state);
@@ -32,13 +50,7 @@ export function stop(state) {
32
50
  }
33
51
  export async function status(state) {
34
52
  return await locked(state, async () => {
35
- await ensureLoaded(state, { skipRecompute: true });
36
- if (state.store) {
37
- const changed = recomputeNextRuns(state);
38
- if (changed) {
39
- await persist(state);
40
- }
41
- }
53
+ await ensureLoadedForRead(state);
42
54
  return {
43
55
  enabled: state.deps.cronEnabled,
44
56
  storePath: state.deps.storePath,
@@ -49,13 +61,7 @@ export async function status(state) {
49
61
  }
50
62
  export async function list(state, opts) {
51
63
  return await locked(state, async () => {
52
- await ensureLoaded(state, { skipRecompute: true });
53
- if (state.store) {
54
- const changed = recomputeNextRuns(state);
55
- if (changed) {
56
- await persist(state);
57
- }
58
- }
64
+ await ensureLoadedForRead(state);
59
65
  const includeDisabled = opts?.includeDisabled === true;
60
66
  const jobs = (state.store?.jobs ?? []).filter((j) => includeDisabled || j.enabled);
61
67
  return jobs.toSorted((a, b) => (a.state.nextRunAtMs ?? 0) - (b.state.nextRunAtMs ?? 0));
@@ -90,7 +96,7 @@ export async function add(state, input) {
90
96
  export async function update(state, id, patch) {
91
97
  return await locked(state, async () => {
92
98
  warnIfDisabled(state, "update");
93
- await ensureLoaded(state);
99
+ await ensureLoaded(state, { skipRecompute: true });
94
100
  const job = findJobOrThrow(state, id);
95
101
  const now = state.deps.nowMs();
96
102
  applyJobPatch(job, patch);
@@ -121,6 +127,14 @@ export async function update(state, id, patch) {
121
127
  job.state.runningAtMs = undefined;
122
128
  }
123
129
  }
130
+ else if (job.enabled) {
131
+ // Non-schedule edits should not mutate other jobs, but still repair a
132
+ // missing/corrupt nextRunAtMs for the updated job.
133
+ const nextRun = job.state.nextRunAtMs;
134
+ if (typeof nextRun !== "number" || !Number.isFinite(nextRun)) {
135
+ job.state.nextRunAtMs = computeJobNextRunAtMs(job, now);
136
+ }
137
+ }
124
138
  await persist(state);
125
139
  armTimer(state);
126
140
  emit(state, {