@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
@@ -113,7 +113,7 @@ export const FIELD_LABELS = {
113
113
  "gateway.controlUi.basePath": "Control UI Base Path",
114
114
  "gateway.controlUi.root": "Control UI Assets Root",
115
115
  "gateway.controlUi.allowedOrigins": "Control UI Allowed Origins",
116
- "gateway.controlUi.allowInsecureAuth": "Allow Insecure Control UI Auth",
116
+ "gateway.controlUi.allowInsecureAuth": "Insecure Control UI Auth Toggle",
117
117
  "gateway.controlUi.dangerouslyDisableDeviceAuth": "Dangerously Disable Control UI Device Auth",
118
118
  "gateway.http.endpoints.chatCompletions.enabled": "OpenAI Chat Completions Endpoint",
119
119
  "gateway.reload.mode": "Config Reload Mode",
@@ -163,6 +163,10 @@ export const FIELD_LABELS = {
163
163
  "agents.defaults.memorySearch.query.hybrid.vectorWeight": "Memory Search Vector Weight",
164
164
  "agents.defaults.memorySearch.query.hybrid.textWeight": "Memory Search Text Weight",
165
165
  "agents.defaults.memorySearch.query.hybrid.candidateMultiplier": "Memory Search Hybrid Candidate Multiplier",
166
+ "agents.defaults.memorySearch.query.hybrid.mmr.enabled": "Memory Search MMR Re-ranking",
167
+ "agents.defaults.memorySearch.query.hybrid.mmr.lambda": "Memory Search MMR Lambda",
168
+ "agents.defaults.memorySearch.query.hybrid.temporalDecay.enabled": "Memory Search Temporal Decay",
169
+ "agents.defaults.memorySearch.query.hybrid.temporalDecay.halfLifeDays": "Memory Search Temporal Decay Half-life (Days)",
166
170
  "agents.defaults.memorySearch.cache.enabled": "Memory Search Embedding Cache",
167
171
  "agents.defaults.memorySearch.cache.maxEntries": "Memory Search Embedding Cache Max Entries",
168
172
  memory: "Memory",
@@ -216,19 +220,31 @@ export const FIELD_LABELS = {
216
220
  "commands.restart": "Allow Restart",
217
221
  "commands.useAccessGroups": "Use Access Groups",
218
222
  "commands.ownerAllowFrom": "Command Owners",
223
+ "commands.ownerDisplay": "Owner ID Display",
224
+ "commands.ownerDisplaySecret": "Owner ID Hash Secret",
219
225
  "ui.seamColor": "Accent Color",
220
226
  "ui.assistant.name": "Assistant Name",
221
227
  "ui.assistant.avatar": "Assistant Avatar",
222
228
  "browser.evaluateEnabled": "Browser Evaluate Enabled",
223
229
  "browser.snapshotDefaults": "Browser Snapshot Defaults",
224
230
  "browser.snapshotDefaults.mode": "Browser Snapshot Mode",
231
+ "browser.ssrfPolicy": "Browser SSRF Policy",
232
+ "browser.ssrfPolicy.allowPrivateNetwork": "Browser Allow Private Network",
233
+ "browser.ssrfPolicy.allowedHostnames": "Browser Allowed Hostnames",
234
+ "browser.ssrfPolicy.hostnameAllowlist": "Browser Hostname Allowlist",
225
235
  "browser.remoteCdpTimeoutMs": "Remote CDP Timeout (ms)",
226
236
  "browser.remoteCdpHandshakeTimeoutMs": "Remote CDP Handshake Timeout (ms)",
227
237
  "session.dmScope": "DM Session Scope",
238
+ "session.threadBindings.enabled": "Thread Binding Enabled",
239
+ "session.threadBindings.ttlHours": "Thread Binding TTL (hours)",
228
240
  "session.agentToAgent.maxPingPongTurns": "Agent-to-Agent Ping-Pong Turns",
229
241
  "messages.suppressToolErrors": "Suppress Tool Error Warnings",
230
242
  "messages.ackReaction": "Ack Reaction Emoji",
231
243
  "messages.ackReactionScope": "Ack Reaction Scope",
244
+ "messages.statusReactions": "Status Reactions",
245
+ "messages.statusReactions.enabled": "Enable Status Reactions",
246
+ "messages.statusReactions.emojis": "Status Reaction Emojis",
247
+ "messages.statusReactions.timing": "Status Reaction Timing",
232
248
  "messages.inbound.debounceMs": "Inbound Message Debounce (ms)",
233
249
  "talk.apiKey": "Talk API Key",
234
250
  "channels.whatsapp": "WhatsApp",
@@ -241,13 +257,11 @@ export const FIELD_LABELS = {
241
257
  "channels.imessage": "iMessage",
242
258
  "channels.bluebubbles": "BlueBubbles",
243
259
  "channels.msteams": "MS Teams",
260
+ "channels.modelByChannel": "Channel Model Overrides",
244
261
  ...IRC_FIELD_LABELS,
245
262
  "channels.telegram.botToken": "Telegram Bot Token",
246
263
  "channels.telegram.dmPolicy": "Telegram DM Policy",
247
- "channels.telegram.streamMode": "Telegram Stream Mode",
248
- "channels.telegram.draftChunk.minChars": "Telegram Draft Chunk Min Chars",
249
- "channels.telegram.draftChunk.maxChars": "Telegram Draft Chunk Max Chars",
250
- "channels.telegram.draftChunk.breakPreference": "Telegram Draft Chunk Break Preference",
264
+ "channels.telegram.streaming": "Telegram Streaming Mode",
251
265
  "channels.telegram.retry.attempts": "Telegram Retry Attempts",
252
266
  "channels.telegram.retry.minDelayMs": "Telegram Retry Min Delay (ms)",
253
267
  "channels.telegram.retry.maxDelayMs": "Telegram Retry Max Delay (ms)",
@@ -263,14 +277,24 @@ export const FIELD_LABELS = {
263
277
  "channels.bluebubbles.dmPolicy": "BlueBubbles DM Policy",
264
278
  "channels.discord.dmPolicy": "Discord DM Policy",
265
279
  "channels.discord.dm.policy": "Discord DM Policy",
280
+ "channels.discord.streaming": "Discord Streaming Mode",
281
+ "channels.discord.streamMode": "Discord Stream Mode (Legacy)",
282
+ "channels.discord.draftChunk.minChars": "Discord Draft Chunk Min Chars",
283
+ "channels.discord.draftChunk.maxChars": "Discord Draft Chunk Max Chars",
284
+ "channels.discord.draftChunk.breakPreference": "Discord Draft Chunk Break Preference",
266
285
  "channels.discord.retry.attempts": "Discord Retry Attempts",
267
286
  "channels.discord.retry.minDelayMs": "Discord Retry Min Delay (ms)",
268
287
  "channels.discord.retry.maxDelayMs": "Discord Retry Max Delay (ms)",
269
288
  "channels.discord.retry.jitter": "Discord Retry Jitter",
270
289
  "channels.discord.maxLinesPerMessage": "Discord Max Lines Per Message",
290
+ "channels.discord.threadBindings.enabled": "Discord Thread Binding Enabled",
291
+ "channels.discord.threadBindings.ttlHours": "Discord Thread Binding TTL (hours)",
292
+ "channels.discord.threadBindings.spawnSubagentSessions": "Discord Thread-Bound Subagent Spawn",
271
293
  "channels.discord.ui.components.accentColor": "Discord Component Accent Color",
272
294
  "channels.discord.intents.presence": "Discord Presence Intent",
273
295
  "channels.discord.intents.guildMembers": "Discord Guild Members Intent",
296
+ "channels.discord.voice.enabled": "Discord Voice Enabled",
297
+ "channels.discord.voice.autoJoin": "Discord Voice Auto-Join",
274
298
  "channels.discord.pluralkit.enabled": "Discord PluralKit Enabled",
275
299
  "channels.discord.pluralkit.token": "Discord PluralKit Token",
276
300
  "channels.discord.activity": "Discord Presence Activity",
@@ -285,7 +309,9 @@ export const FIELD_LABELS = {
285
309
  "channels.slack.appToken": "Slack App Token",
286
310
  "channels.slack.userToken": "Slack User Token",
287
311
  "channels.slack.userTokenReadOnly": "Slack User Token Read Only",
288
- "channels.slack.streamMode": "Slack Stream Mode",
312
+ "channels.slack.streaming": "Slack Streaming Mode",
313
+ "channels.slack.nativeStreaming": "Slack Native Streaming",
314
+ "channels.slack.streamMode": "Slack Stream Mode (Legacy)",
289
315
  "channels.slack.thread.historyScope": "Slack Thread History Scope",
290
316
  "channels.slack.thread.inheritParent": "Slack Thread Parent Inheritance",
291
317
  "channels.slack.thread.initialHistoryLimit": "Slack Thread Initial History Limit",
@@ -314,5 +340,11 @@ export const FIELD_LABELS = {
314
340
  "plugins.installs.*.sourcePath": "Plugin Install Source Path",
315
341
  "plugins.installs.*.installPath": "Plugin Install Path",
316
342
  "plugins.installs.*.version": "Plugin Install Version",
343
+ "plugins.installs.*.resolvedName": "Plugin Resolved Package Name",
344
+ "plugins.installs.*.resolvedVersion": "Plugin Resolved Package Version",
345
+ "plugins.installs.*.resolvedSpec": "Plugin Resolved Package Spec",
346
+ "plugins.installs.*.integrity": "Plugin Resolved Integrity",
347
+ "plugins.installs.*.shasum": "Plugin Resolved Shasum",
348
+ "plugins.installs.*.resolvedAt": "Plugin Resolution Time",
317
349
  "plugins.installs.*.installedAt": "Plugin Install Time",
318
350
  };
@@ -5,9 +5,9 @@ import { loadSessionStore } from "./store.js";
5
5
  * Extract deliveryContext and threadId from a sessionKey.
6
6
  * Supports both :thread: (most channels) and :topic: (Telegram).
7
7
  */
8
- export function extractDeliveryInfo(sessionKey) {
8
+ export function parseSessionThreadInfo(sessionKey) {
9
9
  if (!sessionKey) {
10
- return { deliveryContext: undefined, threadId: undefined };
10
+ return { baseSessionKey: undefined, threadId: undefined };
11
11
  }
12
12
  const topicIndex = sessionKey.lastIndexOf(":topic:");
13
13
  const threadIndex = sessionKey.lastIndexOf(":thread:");
@@ -16,13 +16,20 @@ export function extractDeliveryInfo(sessionKey) {
16
16
  const baseSessionKey = markerIndex === -1 ? sessionKey : sessionKey.slice(0, markerIndex);
17
17
  const threadIdRaw = markerIndex === -1 ? undefined : sessionKey.slice(markerIndex + marker.length);
18
18
  const threadId = threadIdRaw?.trim() || undefined;
19
+ return { baseSessionKey, threadId };
20
+ }
21
+ export function extractDeliveryInfo(sessionKey) {
22
+ const { baseSessionKey, threadId } = parseSessionThreadInfo(sessionKey);
23
+ if (!sessionKey || !baseSessionKey) {
24
+ return { deliveryContext: undefined, threadId };
25
+ }
19
26
  let deliveryContext;
20
27
  try {
21
28
  const cfg = loadConfig();
22
29
  const storePath = resolveStorePath(cfg.session?.store);
23
30
  const store = loadSessionStore(storePath);
24
31
  let entry = store[sessionKey];
25
- if (!entry?.deliveryContext && markerIndex !== -1 && baseSessionKey) {
32
+ if (!entry?.deliveryContext && baseSessionKey !== sessionKey) {
26
33
  entry = store[baseSessionKey];
27
34
  }
28
35
  if (entry?.deliveryContext) {
@@ -1,8 +1,9 @@
1
1
  import { buildAgentMainSessionKey, DEFAULT_AGENT_ID, normalizeAgentId, normalizeMainKey, resolveAgentIdFromSessionKey, } from "../../routing/session-key.js";
2
2
  import { loadConfig } from "../config.js";
3
3
  export function resolveMainSessionKey(cfg) {
4
- if (cfg?.session?.scope === "global")
4
+ if (cfg?.session?.scope === "global") {
5
5
  return "global";
6
+ }
6
7
  const agents = cfg?.agents?.list ?? [];
7
8
  const defaultAgentId = agents.find((agent) => agent?.default)?.id ?? agents[0]?.id ?? DEFAULT_AGENT_ID;
8
9
  const agentId = normalizeAgentId(defaultAgentId);
@@ -19,14 +20,16 @@ export function resolveAgentMainSessionKey(params) {
19
20
  }
20
21
  export function resolveExplicitAgentSessionKey(params) {
21
22
  const agentId = params.agentId?.trim();
22
- if (!agentId)
23
+ if (!agentId) {
23
24
  return undefined;
25
+ }
24
26
  return resolveAgentMainSessionKey({ cfg: params.cfg, agentId });
25
27
  }
26
28
  export function canonicalizeMainSessionAlias(params) {
27
29
  const raw = params.sessionKey.trim();
28
- if (!raw)
30
+ if (!raw) {
29
31
  return raw;
32
+ }
30
33
  const agentId = normalizeAgentId(params.agentId);
31
34
  const mainKey = normalizeMainKey(params.cfg?.session?.mainKey);
32
35
  const agentMainSessionKey = buildAgentMainSessionKey({ agentId, mainKey });
@@ -35,9 +38,11 @@ export function canonicalizeMainSessionAlias(params) {
35
38
  mainKey: "main",
36
39
  });
37
40
  const isMainAlias = raw === "main" || raw === mainKey || raw === agentMainSessionKey || raw === agentMainAliasKey;
38
- if (params.cfg?.session?.scope === "global" && isMainAlias)
41
+ if (params.cfg?.session?.scope === "global" && isMainAlias) {
39
42
  return "global";
40
- if (isMainAlias)
43
+ }
44
+ if (isMainAlias) {
41
45
  return agentMainSessionKey;
46
+ }
42
47
  return raw;
43
48
  }
@@ -0,0 +1,33 @@
1
+ import { resolveSessionFilePath } from "./paths.js";
2
+ import { updateSessionStore } from "./store.js";
3
+ export async function resolveAndPersistSessionFile(params) {
4
+ const { sessionId, sessionKey, sessionStore, storePath } = params;
5
+ const baseEntry = params.sessionEntry ??
6
+ sessionStore[sessionKey] ?? { sessionId, updatedAt: Date.now() };
7
+ const fallbackSessionFile = params.fallbackSessionFile?.trim();
8
+ const entryForResolve = !baseEntry.sessionFile && fallbackSessionFile
9
+ ? { ...baseEntry, sessionFile: fallbackSessionFile }
10
+ : baseEntry;
11
+ const sessionFile = resolveSessionFilePath(sessionId, entryForResolve, {
12
+ agentId: params.agentId,
13
+ sessionsDir: params.sessionsDir,
14
+ });
15
+ const persistedEntry = {
16
+ ...baseEntry,
17
+ sessionId,
18
+ updatedAt: Date.now(),
19
+ sessionFile,
20
+ };
21
+ if (baseEntry.sessionId !== sessionId || baseEntry.sessionFile !== sessionFile) {
22
+ sessionStore[sessionKey] = persistedEntry;
23
+ await updateSessionStore(storePath, (store) => {
24
+ store[sessionKey] = {
25
+ ...store[sessionKey],
26
+ ...persistedEntry,
27
+ };
28
+ }, params.activeSessionKey ? { activeSessionKey: params.activeSessionKey } : undefined);
29
+ return { sessionFile, sessionEntry: persistedEntry };
30
+ }
31
+ sessionStore[sessionKey] = persistedEntry;
32
+ return { sessionFile, sessionEntry: persistedEntry };
33
+ }
@@ -3,11 +3,13 @@ import { normalizeE164 } from "../../utils.js";
3
3
  import { resolveGroupSessionKey } from "./group.js";
4
4
  // Decide which session bucket to use (per-sender vs global).
5
5
  export function deriveSessionKey(scope, ctx) {
6
- if (scope === "global")
6
+ if (scope === "global") {
7
7
  return "global";
8
+ }
8
9
  const resolvedGroup = resolveGroupSessionKey(ctx);
9
- if (resolvedGroup)
10
+ if (resolvedGroup) {
10
11
  return resolvedGroup.key;
12
+ }
11
13
  const from = ctx.From ? normalizeE164(ctx.From) : "";
12
14
  return from || "unknown";
13
15
  }
@@ -17,18 +19,21 @@ export function deriveSessionKey(scope, ctx) {
17
19
  */
18
20
  export function resolveSessionKey(scope, ctx, mainKey) {
19
21
  const explicit = ctx.SessionKey?.trim();
20
- if (explicit)
22
+ if (explicit) {
21
23
  return explicit.toLowerCase();
24
+ }
22
25
  const raw = deriveSessionKey(scope, ctx);
23
- if (scope === "global")
26
+ if (scope === "global") {
24
27
  return raw;
28
+ }
25
29
  const canonicalMainKey = normalizeMainKey(mainKey);
26
30
  const canonical = buildAgentMainSessionKey({
27
31
  agentId: DEFAULT_AGENT_ID,
28
32
  mainKey: canonicalMainKey,
29
33
  });
30
34
  const isGroup = raw.includes(":group:") || raw.includes(":channel:");
31
- if (!isGroup)
35
+ if (!isGroup) {
32
36
  return canonical;
37
+ }
33
38
  return `agent:${DEFAULT_AGENT_ID}:${raw}`;
34
39
  }
@@ -472,7 +472,7 @@ async function saveSessionStoreUnlocked(storePath, store, opts) {
472
472
  // Final attempt failed — skip this save. The write lock ensures
473
473
  // the next save will retry with fresh data. Log for diagnostics.
474
474
  if (i === 4) {
475
- console.warn(`[session-store] rename failed after 5 attempts: ${storePath}`);
475
+ log.warn(`rename failed after 5 attempts: ${storePath}`);
476
476
  }
477
477
  }
478
478
  }
@@ -7,4 +7,5 @@ export * from "./sessions/session-key.js";
7
7
  export * from "./sessions/store.js";
8
8
  export * from "./sessions/types.js";
9
9
  export * from "./sessions/transcript.js";
10
+ export * from "./sessions/session-file.js";
10
11
  export * from "./sessions/delivery-info.js";
@@ -168,7 +168,9 @@ export const SandboxBrowserSchema = z
168
168
  enabled: z.boolean().optional(),
169
169
  image: z.string().optional(),
170
170
  containerPrefix: z.string().optional(),
171
+ network: z.string().optional(),
171
172
  cdpPort: z.number().int().positive().optional(),
173
+ cdpSourceRange: z.string().optional(),
172
174
  vncPort: z.number().int().positive().optional(),
173
175
  noVncPort: z.number().int().positive().optional(),
174
176
  headless: z.boolean().optional(),
@@ -177,6 +179,15 @@ export const SandboxBrowserSchema = z
177
179
  autoStart: z.boolean().optional(),
178
180
  autoStartTimeoutMs: z.number().int().positive().optional(),
179
181
  binds: z.array(z.string()).optional(),
182
+ })
183
+ .superRefine((data, ctx) => {
184
+ if (data.network?.trim().toLowerCase() === "host") {
185
+ ctx.addIssue({
186
+ code: z.ZodIssueCode.custom,
187
+ path: ["network"],
188
+ message: 'Sandbox security: browser network mode "host" is blocked. Use "bridge" or a custom bridge network instead.',
189
+ });
190
+ }
180
191
  })
181
192
  .strict()
182
193
  .optional();
@@ -1,12 +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
9
  import { sensitive } from "./zod-schema.sensitive.js";
10
+ import { CommandsSchema, MessagesSchema, SessionSchema, SessionSendPolicySchema, } from "./zod-schema.session.js";
10
11
  const BrowserSnapshotDefaultsSchema = z
11
12
  .object({
12
13
  mode: z.literal("efficient").optional(),
@@ -25,8 +26,78 @@ const NodeHostSchema = z
25
26
  })
26
27
  .strict()
27
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");
28
98
  export const PoolBotSchema = z
29
99
  .object({
100
+ $schema: z.string().optional(),
30
101
  meta: z
31
102
  .object({
32
103
  lastTouchedVersion: z.string().optional(),
@@ -143,6 +214,14 @@ export const PoolBotSchema = z
143
214
  attachOnly: z.boolean().optional(),
144
215
  defaultProfile: z.string().optional(),
145
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(),
146
225
  profiles: z
147
226
  .record(z
148
227
  .string()
@@ -220,6 +299,9 @@ export const PoolBotSchema = z
220
299
  enabled: z.boolean().optional(),
221
300
  store: z.string().optional(),
222
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(),
223
305
  })
224
306
  .strict()
225
307
  .optional(),
@@ -228,6 +310,10 @@ export const PoolBotSchema = z
228
310
  enabled: z.boolean().optional(),
229
311
  path: z.string().optional(),
230
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(),
231
317
  maxBodyBytes: z.number().int().positive().optional(),
232
318
  presets: z.array(z.string()).optional(),
233
319
  transformsDir: z.string().optional(),
@@ -305,10 +391,13 @@ export const PoolBotSchema = z
305
391
  z.literal("tailnet"),
306
392
  ])
307
393
  .optional(),
394
+ customBindHost: z.string().optional(),
308
395
  controlUi: z
309
396
  .object({
310
397
  enabled: z.boolean().optional(),
311
398
  basePath: z.string().optional(),
399
+ root: z.string().optional(),
400
+ allowedOrigins: z.array(z.string()).optional(),
312
401
  allowInsecureAuth: z.boolean().optional(),
313
402
  dangerouslyDisableDeviceAuth: z.boolean().optional(),
314
403
  })
@@ -316,14 +405,47 @@ export const PoolBotSchema = z
316
405
  .optional(),
317
406
  auth: z
318
407
  .object({
319
- mode: z.union([z.literal("token"), z.literal("password")]).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(),
320
416
  token: z.string().optional().register(sensitive),
321
417
  password: z.string().optional().register(sensitive),
322
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(),
323
436
  })
324
437
  .strict()
325
438
  .optional(),
326
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(),
327
449
  tailscale: z
328
450
  .object({
329
451
  mode: z.union([z.literal("off"), z.literal("serve"), z.literal("funnel")]).optional(),
@@ -380,9 +502,11 @@ export const PoolBotSchema = z
380
502
  .object({
381
503
  enabled: z.boolean().optional(),
382
504
  maxBodyBytes: z.number().int().positive().optional(),
505
+ maxUrlParts: z.number().int().nonnegative().optional(),
383
506
  files: z
384
507
  .object({
385
508
  allowUrl: z.boolean().optional(),
509
+ urlAllowlist: z.array(z.string()).optional(),
386
510
  allowedMimes: z.array(z.string()).optional(),
387
511
  maxBytes: z.number().int().positive().optional(),
388
512
  maxChars: z.number().int().positive().optional(),
@@ -402,6 +526,7 @@ export const PoolBotSchema = z
402
526
  images: z
403
527
  .object({
404
528
  allowUrl: z.boolean().optional(),
529
+ urlAllowlist: z.array(z.string()).optional(),
405
530
  allowedMimes: z.array(z.string()).optional(),
406
531
  maxBytes: z.number().int().positive().optional(),
407
532
  maxRedirects: z.number().int().nonnegative().optional(),
@@ -437,6 +562,7 @@ export const PoolBotSchema = z
437
562
  })
438
563
  .strict()
439
564
  .optional(),
565
+ memory: MemorySchema,
440
566
  skills: z
441
567
  .object({
442
568
  allowBundled: z.array(z.string()).optional(),
@@ -457,6 +583,16 @@ export const PoolBotSchema = z
457
583
  })
458
584
  .strict()
459
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(),
460
596
  entries: z
461
597
  .record(z.string(), z
462
598
  .object({
@@ -498,12 +634,7 @@ export const PoolBotSchema = z
498
634
  installs: z
499
635
  .record(z.string(), z
500
636
  .object({
501
- source: z.union([z.literal("npm"), z.literal("archive"), z.literal("path")]),
502
- spec: z.string().optional(),
503
- sourcePath: z.string().optional(),
504
- installPath: z.string().optional(),
505
- version: z.string().optional(),
506
- installedAt: z.string().optional(),
637
+ ...InstallRecordShape,
507
638
  })
508
639
  .strict())
509
640
  .optional(),
@@ -514,17 +645,21 @@ export const PoolBotSchema = z
514
645
  .strict()
515
646
  .superRefine((cfg, ctx) => {
516
647
  const agents = cfg.agents?.list ?? [];
517
- if (agents.length === 0)
648
+ if (agents.length === 0) {
518
649
  return;
650
+ }
519
651
  const agentIds = new Set(agents.map((agent) => agent.id));
520
652
  const broadcast = cfg.broadcast;
521
- if (!broadcast)
653
+ if (!broadcast) {
522
654
  return;
655
+ }
523
656
  for (const [peerId, ids] of Object.entries(broadcast)) {
524
- if (peerId === "strategy")
657
+ if (peerId === "strategy") {
525
658
  continue;
526
- if (!Array.isArray(ids))
659
+ }
660
+ if (!Array.isArray(ids)) {
527
661
  continue;
662
+ }
528
663
  for (let idx = 0; idx < ids.length; idx += 1) {
529
664
  const agentId = ids[idx];
530
665
  if (!agentIds.has(agentId)) {