@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
@@ -1,4 +1,33 @@
1
+ import path from "node:path";
1
2
  import { z } from "zod";
3
+ import { InstallRecordShape } from "./zod-schema.installs.js";
4
+ import { sensitive } from "./zod-schema.sensitive.js";
5
+ function isSafeRelativeModulePath(raw) {
6
+ const value = raw.trim();
7
+ if (!value) {
8
+ return false;
9
+ }
10
+ // Hook modules are loaded via file-path resolution + dynamic import().
11
+ // Keep this strictly relative to a configured base dir to avoid path traversal and surprises.
12
+ if (path.isAbsolute(value)) {
13
+ return false;
14
+ }
15
+ if (value.startsWith("~")) {
16
+ return false;
17
+ }
18
+ // Disallow URL-ish and drive-relative forms (e.g. "file:...", "C:foo").
19
+ if (value.includes(":")) {
20
+ return false;
21
+ }
22
+ const parts = value.split(/[\\/]+/g);
23
+ if (parts.some((part) => part === "..")) {
24
+ return false;
25
+ }
26
+ return true;
27
+ }
28
+ const SafeRelativeModulePathSchema = z
29
+ .string()
30
+ .refine(isSafeRelativeModulePath, "module must be a safe relative path (no absolute paths)");
2
31
  export const HookMappingSchema = z
3
32
  .object({
4
33
  id: z.string().optional(),
@@ -11,7 +40,8 @@ export const HookMappingSchema = z
11
40
  action: z.union([z.literal("wake"), z.literal("agent")]).optional(),
12
41
  wakeMode: z.union([z.literal("now"), z.literal("next-heartbeat")]).optional(),
13
42
  name: z.string().optional(),
14
- sessionKey: z.string().optional(),
43
+ agentId: z.string().optional(),
44
+ sessionKey: z.string().optional().register(sensitive),
15
45
  messageTemplate: z.string().optional(),
16
46
  textTemplate: z.string().optional(),
17
47
  deliver: z.boolean().optional(),
@@ -22,6 +52,7 @@ export const HookMappingSchema = z
22
52
  z.literal("whatsapp"),
23
53
  z.literal("telegram"),
24
54
  z.literal("discord"),
55
+ z.literal("irc"),
25
56
  z.literal("slack"),
26
57
  z.literal("signal"),
27
58
  z.literal("imessage"),
@@ -34,7 +65,7 @@ export const HookMappingSchema = z
34
65
  timeoutSeconds: z.number().int().positive().optional(),
35
66
  transform: z
36
67
  .object({
37
- module: z.string(),
68
+ module: SafeRelativeModulePathSchema,
38
69
  export: z.string().optional(),
39
70
  })
40
71
  .strict()
@@ -45,7 +76,7 @@ export const HookMappingSchema = z
45
76
  export const InternalHookHandlerSchema = z
46
77
  .object({
47
78
  event: z.string(),
48
- module: z.string(),
79
+ module: SafeRelativeModulePathSchema,
49
80
  export: z.string().optional(),
50
81
  })
51
82
  .strict();
@@ -54,15 +85,13 @@ const HookConfigSchema = z
54
85
  enabled: z.boolean().optional(),
55
86
  env: z.record(z.string(), z.string()).optional(),
56
87
  })
57
- .strict();
88
+ // Hook configs are intentionally open-ended (handlers can define their own keys).
89
+ // Keep enabled/env typed, but allow additional per-hook keys without marking the
90
+ // whole config invalid (which triggers doctor/best-effort loads).
91
+ .passthrough();
58
92
  const HookInstallRecordSchema = z
59
93
  .object({
60
- source: z.union([z.literal("npm"), z.literal("archive"), z.literal("path")]),
61
- spec: z.string().optional(),
62
- sourcePath: z.string().optional(),
63
- installPath: z.string().optional(),
64
- version: z.string().optional(),
65
- installedAt: z.string().optional(),
94
+ ...InstallRecordShape,
66
95
  hooks: z.array(z.string()).optional(),
67
96
  })
68
97
  .strict();
@@ -87,7 +116,7 @@ export const HooksGmailSchema = z
87
116
  label: z.string().optional(),
88
117
  topic: z.string().optional(),
89
118
  subscription: z.string().optional(),
90
- pushToken: z.string().optional(),
119
+ pushToken: z.string().optional().register(sensitive),
91
120
  hookUrl: z.string().optional(),
92
121
  includeBody: z.boolean().optional(),
93
122
  maxBytes: z.number().int().positive().optional(),
@@ -0,0 +1,20 @@
1
+ import { z } from "zod";
2
+ export const InstallSourceSchema = z.union([
3
+ z.literal("npm"),
4
+ z.literal("archive"),
5
+ z.literal("path"),
6
+ ]);
7
+ export const InstallRecordShape = {
8
+ source: InstallSourceSchema,
9
+ spec: z.string().optional(),
10
+ sourcePath: z.string().optional(),
11
+ installPath: z.string().optional(),
12
+ version: z.string().optional(),
13
+ resolvedName: z.string().optional(),
14
+ resolvedVersion: z.string().optional(),
15
+ resolvedSpec: z.string().optional(),
16
+ integrity: z.string().optional(),
17
+ shasum: z.string().optional(),
18
+ resolvedAt: z.string().optional(),
19
+ installedAt: z.string().optional(),
20
+ };
@@ -1,11 +1,13 @@
1
1
  import { z } from "zod";
2
2
  import { ToolsSchema } from "./zod-schema.agent-runtime.js";
3
- import { ApprovalsSchema } from "./zod-schema.approvals.js";
4
3
  import { AgentsSchema, AudioSchema, BindingsSchema, BroadcastSchema } from "./zod-schema.agents.js";
4
+ import { ApprovalsSchema } from "./zod-schema.approvals.js";
5
5
  import { HexColorSchema, ModelsConfigSchema } from "./zod-schema.core.js";
6
6
  import { HookMappingSchema, HooksGmailSchema, InternalHooksSchema } from "./zod-schema.hooks.js";
7
+ import { InstallRecordShape } from "./zod-schema.installs.js";
7
8
  import { ChannelsSchema } from "./zod-schema.providers.js";
8
- import { CommandsSchema, MessagesSchema, SessionSchema } from "./zod-schema.session.js";
9
+ import { sensitive } from "./zod-schema.sensitive.js";
10
+ import { CommandsSchema, MessagesSchema, SessionSchema, SessionSendPolicySchema, } from "./zod-schema.session.js";
9
11
  const BrowserSnapshotDefaultsSchema = z
10
12
  .object({
11
13
  mode: z.literal("efficient").optional(),
@@ -24,8 +26,78 @@ const NodeHostSchema = z
24
26
  })
25
27
  .strict()
26
28
  .optional();
29
+ const MemoryQmdPathSchema = z
30
+ .object({
31
+ path: z.string(),
32
+ name: z.string().optional(),
33
+ pattern: z.string().optional(),
34
+ })
35
+ .strict();
36
+ const MemoryQmdSessionSchema = z
37
+ .object({
38
+ enabled: z.boolean().optional(),
39
+ exportDir: z.string().optional(),
40
+ retentionDays: z.number().int().nonnegative().optional(),
41
+ })
42
+ .strict();
43
+ const MemoryQmdUpdateSchema = z
44
+ .object({
45
+ interval: z.string().optional(),
46
+ debounceMs: z.number().int().nonnegative().optional(),
47
+ onBoot: z.boolean().optional(),
48
+ waitForBootSync: z.boolean().optional(),
49
+ embedInterval: z.string().optional(),
50
+ commandTimeoutMs: z.number().int().nonnegative().optional(),
51
+ updateTimeoutMs: z.number().int().nonnegative().optional(),
52
+ embedTimeoutMs: z.number().int().nonnegative().optional(),
53
+ })
54
+ .strict();
55
+ const MemoryQmdLimitsSchema = z
56
+ .object({
57
+ maxResults: z.number().int().positive().optional(),
58
+ maxSnippetChars: z.number().int().positive().optional(),
59
+ maxInjectedChars: z.number().int().positive().optional(),
60
+ timeoutMs: z.number().int().nonnegative().optional(),
61
+ })
62
+ .strict();
63
+ const MemoryQmdMcporterSchema = z
64
+ .object({
65
+ enabled: z.boolean().optional(),
66
+ serverName: z.string().optional(),
67
+ startDaemon: z.boolean().optional(),
68
+ })
69
+ .strict();
70
+ const MemoryQmdSchema = z
71
+ .object({
72
+ command: z.string().optional(),
73
+ mcporter: MemoryQmdMcporterSchema.optional(),
74
+ searchMode: z.union([z.literal("query"), z.literal("search"), z.literal("vsearch")]).optional(),
75
+ includeDefaultMemory: z.boolean().optional(),
76
+ paths: z.array(MemoryQmdPathSchema).optional(),
77
+ sessions: MemoryQmdSessionSchema.optional(),
78
+ update: MemoryQmdUpdateSchema.optional(),
79
+ limits: MemoryQmdLimitsSchema.optional(),
80
+ scope: SessionSendPolicySchema.optional(),
81
+ })
82
+ .strict();
83
+ const MemorySchema = z
84
+ .object({
85
+ backend: z.union([z.literal("builtin"), z.literal("qmd")]).optional(),
86
+ citations: z.union([z.literal("auto"), z.literal("on"), z.literal("off")]).optional(),
87
+ qmd: MemoryQmdSchema.optional(),
88
+ })
89
+ .strict()
90
+ .optional();
91
+ const HttpUrlSchema = z
92
+ .string()
93
+ .url()
94
+ .refine((value) => {
95
+ const protocol = new URL(value).protocol;
96
+ return protocol === "http:" || protocol === "https:";
97
+ }, "Expected http:// or https:// URL");
27
98
  export const PoolBotSchema = z
28
99
  .object({
100
+ $schema: z.string().optional(),
29
101
  meta: z
30
102
  .object({
31
103
  lastTouchedVersion: z.string().optional(),
@@ -142,6 +214,14 @@ export const PoolBotSchema = z
142
214
  attachOnly: z.boolean().optional(),
143
215
  defaultProfile: z.string().optional(),
144
216
  snapshotDefaults: BrowserSnapshotDefaultsSchema,
217
+ ssrfPolicy: z
218
+ .object({
219
+ allowPrivateNetwork: z.boolean().optional(),
220
+ allowedHostnames: z.array(z.string()).optional(),
221
+ hostnameAllowlist: z.array(z.string()).optional(),
222
+ })
223
+ .strict()
224
+ .optional(),
145
225
  profiles: z
146
226
  .record(z
147
227
  .string()
@@ -219,6 +299,9 @@ export const PoolBotSchema = z
219
299
  enabled: z.boolean().optional(),
220
300
  store: z.string().optional(),
221
301
  maxConcurrentRuns: z.number().int().positive().optional(),
302
+ webhook: HttpUrlSchema.optional(),
303
+ webhookToken: z.string().optional().register(sensitive),
304
+ sessionRetention: z.union([z.string(), z.literal(false)]).optional(),
222
305
  })
223
306
  .strict()
224
307
  .optional(),
@@ -226,7 +309,11 @@ export const PoolBotSchema = z
226
309
  .object({
227
310
  enabled: z.boolean().optional(),
228
311
  path: z.string().optional(),
229
- token: z.string().optional(),
312
+ token: z.string().optional().register(sensitive),
313
+ defaultSessionKey: z.string().optional(),
314
+ allowRequestSessionKey: z.boolean().optional(),
315
+ allowedSessionKeyPrefixes: z.array(z.string()).optional(),
316
+ allowedAgentIds: z.array(z.string()).optional(),
230
317
  maxBodyBytes: z.number().int().positive().optional(),
231
318
  presets: z.array(z.string()).optional(),
232
319
  transformsDir: z.string().optional(),
@@ -286,7 +373,7 @@ export const PoolBotSchema = z
286
373
  voiceAliases: z.record(z.string(), z.string()).optional(),
287
374
  modelId: z.string().optional(),
288
375
  outputFormat: z.string().optional(),
289
- apiKey: z.string().optional(),
376
+ apiKey: z.string().optional().register(sensitive),
290
377
  interruptOnSpeech: z.boolean().optional(),
291
378
  })
292
379
  .strict()
@@ -304,10 +391,13 @@ export const PoolBotSchema = z
304
391
  z.literal("tailnet"),
305
392
  ])
306
393
  .optional(),
394
+ customBindHost: z.string().optional(),
307
395
  controlUi: z
308
396
  .object({
309
397
  enabled: z.boolean().optional(),
310
398
  basePath: z.string().optional(),
399
+ root: z.string().optional(),
400
+ allowedOrigins: z.array(z.string()).optional(),
311
401
  allowInsecureAuth: z.boolean().optional(),
312
402
  dangerouslyDisableDeviceAuth: z.boolean().optional(),
313
403
  })
@@ -315,14 +405,47 @@ export const PoolBotSchema = z
315
405
  .optional(),
316
406
  auth: z
317
407
  .object({
318
- mode: z.union([z.literal("token"), z.literal("password")]).optional(),
319
- token: z.string().optional(),
320
- password: z.string().optional(),
408
+ mode: z
409
+ .union([
410
+ z.literal("none"),
411
+ z.literal("token"),
412
+ z.literal("password"),
413
+ z.literal("trusted-proxy"),
414
+ ])
415
+ .optional(),
416
+ token: z.string().optional().register(sensitive),
417
+ password: z.string().optional().register(sensitive),
321
418
  allowTailscale: z.boolean().optional(),
419
+ rateLimit: z
420
+ .object({
421
+ maxAttempts: z.number().optional(),
422
+ windowMs: z.number().optional(),
423
+ lockoutMs: z.number().optional(),
424
+ exemptLoopback: z.boolean().optional(),
425
+ })
426
+ .strict()
427
+ .optional(),
428
+ trustedProxy: z
429
+ .object({
430
+ userHeader: z.string().min(1, "userHeader is required for trusted-proxy mode"),
431
+ requiredHeaders: z.array(z.string()).optional(),
432
+ allowUsers: z.array(z.string()).optional(),
433
+ })
434
+ .strict()
435
+ .optional(),
322
436
  })
323
437
  .strict()
324
438
  .optional(),
325
439
  trustedProxies: z.array(z.string()).optional(),
440
+ allowRealIpFallback: z.boolean().optional(),
441
+ tools: z
442
+ .object({
443
+ deny: z.array(z.string()).optional(),
444
+ allow: z.array(z.string()).optional(),
445
+ })
446
+ .strict()
447
+ .optional(),
448
+ channelHealthCheckMinutes: z.number().int().min(0).optional(),
326
449
  tailscale: z
327
450
  .object({
328
451
  mode: z.union([z.literal("off"), z.literal("serve"), z.literal("funnel")]).optional(),
@@ -334,8 +457,8 @@ export const PoolBotSchema = z
334
457
  .object({
335
458
  url: z.string().optional(),
336
459
  transport: z.union([z.literal("ssh"), z.literal("direct")]).optional(),
337
- token: z.string().optional(),
338
- password: z.string().optional(),
460
+ token: z.string().optional().register(sensitive),
461
+ password: z.string().optional().register(sensitive),
339
462
  tlsFingerprint: z.string().optional(),
340
463
  sshTarget: z.string().optional(),
341
464
  sshIdentity: z.string().optional(),
@@ -379,9 +502,11 @@ export const PoolBotSchema = z
379
502
  .object({
380
503
  enabled: z.boolean().optional(),
381
504
  maxBodyBytes: z.number().int().positive().optional(),
505
+ maxUrlParts: z.number().int().nonnegative().optional(),
382
506
  files: z
383
507
  .object({
384
508
  allowUrl: z.boolean().optional(),
509
+ urlAllowlist: z.array(z.string()).optional(),
385
510
  allowedMimes: z.array(z.string()).optional(),
386
511
  maxBytes: z.number().int().positive().optional(),
387
512
  maxChars: z.number().int().positive().optional(),
@@ -401,6 +526,7 @@ export const PoolBotSchema = z
401
526
  images: z
402
527
  .object({
403
528
  allowUrl: z.boolean().optional(),
529
+ urlAllowlist: z.array(z.string()).optional(),
404
530
  allowedMimes: z.array(z.string()).optional(),
405
531
  maxBytes: z.number().int().positive().optional(),
406
532
  maxRedirects: z.number().int().nonnegative().optional(),
@@ -436,6 +562,7 @@ export const PoolBotSchema = z
436
562
  })
437
563
  .strict()
438
564
  .optional(),
565
+ memory: MemorySchema,
439
566
  skills: z
440
567
  .object({
441
568
  allowBundled: z.array(z.string()).optional(),
@@ -456,11 +583,21 @@ export const PoolBotSchema = z
456
583
  })
457
584
  .strict()
458
585
  .optional(),
586
+ limits: z
587
+ .object({
588
+ maxCandidatesPerRoot: z.number().int().min(1).optional(),
589
+ maxSkillsLoadedPerSource: z.number().int().min(1).optional(),
590
+ maxSkillsInPrompt: z.number().int().min(0).optional(),
591
+ maxSkillsPromptChars: z.number().int().min(0).optional(),
592
+ maxSkillFileBytes: z.number().int().min(0).optional(),
593
+ })
594
+ .strict()
595
+ .optional(),
459
596
  entries: z
460
597
  .record(z.string(), z
461
598
  .object({
462
599
  enabled: z.boolean().optional(),
463
- apiKey: z.string().optional(),
600
+ apiKey: z.string().optional().register(sensitive),
464
601
  env: z.record(z.string(), z.string()).optional(),
465
602
  config: z.record(z.string(), z.unknown()).optional(),
466
603
  })
@@ -497,12 +634,7 @@ export const PoolBotSchema = z
497
634
  installs: z
498
635
  .record(z.string(), z
499
636
  .object({
500
- source: z.union([z.literal("npm"), z.literal("archive"), z.literal("path")]),
501
- spec: z.string().optional(),
502
- sourcePath: z.string().optional(),
503
- installPath: z.string().optional(),
504
- version: z.string().optional(),
505
- installedAt: z.string().optional(),
637
+ ...InstallRecordShape,
506
638
  })
507
639
  .strict())
508
640
  .optional(),
@@ -513,17 +645,21 @@ export const PoolBotSchema = z
513
645
  .strict()
514
646
  .superRefine((cfg, ctx) => {
515
647
  const agents = cfg.agents?.list ?? [];
516
- if (agents.length === 0)
648
+ if (agents.length === 0) {
517
649
  return;
650
+ }
518
651
  const agentIds = new Set(agents.map((agent) => agent.id));
519
652
  const broadcast = cfg.broadcast;
520
- if (!broadcast)
653
+ if (!broadcast) {
521
654
  return;
655
+ }
522
656
  for (const [peerId, ids] of Object.entries(broadcast)) {
523
- if (peerId === "strategy")
657
+ if (peerId === "strategy") {
524
658
  continue;
525
- if (!Array.isArray(ids))
659
+ }
660
+ if (!Array.isArray(ids)) {
526
661
  continue;
662
+ }
527
663
  for (let idx = 0; idx < ids.length; idx += 1) {
528
664
  const agentId = ids[idx];
529
665
  if (!agentIds.has(agentId)) {
@@ -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(),