@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,32 +1,122 @@
1
1
  import fs from "node:fs";
2
2
  import { loadConfig } from "../../config/config.js";
3
- import { resolveSessionFilePath } from "../../config/sessions/paths.js";
3
+ import { resolveSessionFilePath, resolveSessionFilePathOptions, } from "../../config/sessions/paths.js";
4
4
  import { loadProviderUsageSummary } from "../../infra/provider-usage.js";
5
5
  import { loadCostUsageSummary, loadSessionCostSummary, loadSessionUsageTimeSeries, discoverAllSessions, } from "../../infra/session-cost-usage.js";
6
6
  import { parseAgentSessionKey } from "../../routing/session-key.js";
7
+ import { buildUsageAggregateTail } from "../../shared/usage-aggregates.js";
7
8
  import { ErrorCodes, errorShape, formatValidationErrors, validateSessionsUsageParams, } from "../protocol/index.js";
8
9
  import { listAgentsForGateway, loadCombinedSessionStoreForGateway, loadSessionEntry, } from "../session-utils.js";
9
10
  const COST_USAGE_CACHE_TTL_MS = 30_000;
11
+ const DAY_MS = 24 * 60 * 60 * 1000;
10
12
  const costUsageCache = new Map();
13
+ function resolveSessionUsageFileOrRespond(key, respond) {
14
+ const config = loadConfig();
15
+ const { entry, storePath } = loadSessionEntry(key);
16
+ // For discovered sessions (not in store), try using key as sessionId directly
17
+ const parsed = parseAgentSessionKey(key);
18
+ const agentId = parsed?.agentId;
19
+ const rawSessionId = parsed?.rest ?? key;
20
+ const sessionId = entry?.sessionId ?? rawSessionId;
21
+ let sessionFile;
22
+ try {
23
+ const pathOpts = resolveSessionFilePathOptions({ storePath, agentId });
24
+ sessionFile = resolveSessionFilePath(sessionId, entry, pathOpts);
25
+ }
26
+ catch {
27
+ respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, `Invalid session key: ${key}`));
28
+ return null;
29
+ }
30
+ return { config, entry, agentId, sessionId, sessionFile };
31
+ }
32
+ const parseDateParts = (raw) => {
33
+ if (typeof raw !== "string" || !raw.trim()) {
34
+ return undefined;
35
+ }
36
+ const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(raw.trim());
37
+ if (!match) {
38
+ return undefined;
39
+ }
40
+ const [, yearStr, monthStr, dayStr] = match;
41
+ const year = Number(yearStr);
42
+ const monthIndex = Number(monthStr) - 1;
43
+ const day = Number(dayStr);
44
+ if (!Number.isFinite(year) || !Number.isFinite(monthIndex) || !Number.isFinite(day)) {
45
+ return undefined;
46
+ }
47
+ return { year, monthIndex, day };
48
+ };
11
49
  /**
12
- * Parse a date string (YYYY-MM-DD) to start of day timestamp in UTC.
13
- * Returns undefined if invalid.
50
+ * Parse a UTC offset string in the format UTC+H, UTC-H, UTC+HH, UTC-HH, UTC+H:MM, UTC-HH:MM.
51
+ * Returns the UTC offset in minutes (east-positive), or undefined if invalid.
14
52
  */
15
- const parseDateToMs = (raw) => {
53
+ const parseUtcOffsetToMinutes = (raw) => {
16
54
  if (typeof raw !== "string" || !raw.trim()) {
17
55
  return undefined;
18
56
  }
19
- const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(raw.trim());
57
+ const match = /^UTC([+-])(\d{1,2})(?::([0-5]\d))?$/.exec(raw.trim());
20
58
  if (!match) {
21
59
  return undefined;
22
60
  }
23
- const [, year, month, day] = match;
24
- // Use UTC to ensure consistent behavior across timezones
25
- const ms = Date.UTC(parseInt(year), parseInt(month) - 1, parseInt(day));
26
- if (Number.isNaN(ms)) {
61
+ const sign = match[1] === "+" ? 1 : -1;
62
+ const hours = Number(match[2]);
63
+ const minutes = Number(match[3] ?? "0");
64
+ if (!Number.isInteger(hours) || !Number.isInteger(minutes)) {
65
+ return undefined;
66
+ }
67
+ if (hours > 14 || (hours === 14 && minutes !== 0)) {
68
+ return undefined;
69
+ }
70
+ const totalMinutes = sign * (hours * 60 + minutes);
71
+ if (totalMinutes < -12 * 60 || totalMinutes > 14 * 60) {
72
+ return undefined;
73
+ }
74
+ return totalMinutes;
75
+ };
76
+ const resolveDateInterpretation = (params) => {
77
+ if (params.mode === "gateway") {
78
+ return { mode: "gateway" };
79
+ }
80
+ if (params.mode === "specific") {
81
+ const utcOffsetMinutes = parseUtcOffsetToMinutes(params.utcOffset);
82
+ if (utcOffsetMinutes !== undefined) {
83
+ return { mode: "specific", utcOffsetMinutes };
84
+ }
85
+ }
86
+ // Backward compatibility: when mode is missing (or invalid), keep current UTC interpretation.
87
+ return { mode: "utc" };
88
+ };
89
+ /**
90
+ * Parse a date string (YYYY-MM-DD) to start-of-day timestamp based on interpretation mode.
91
+ * Returns undefined if invalid.
92
+ */
93
+ const parseDateToMs = (raw, interpretation = { mode: "utc" }) => {
94
+ const parts = parseDateParts(raw);
95
+ if (!parts) {
27
96
  return undefined;
28
97
  }
29
- return ms;
98
+ const { year, monthIndex, day } = parts;
99
+ if (interpretation.mode === "gateway") {
100
+ const ms = new Date(year, monthIndex, day).getTime();
101
+ return Number.isNaN(ms) ? undefined : ms;
102
+ }
103
+ if (interpretation.mode === "specific") {
104
+ const ms = Date.UTC(year, monthIndex, day) - interpretation.utcOffsetMinutes * 60 * 1000;
105
+ return Number.isNaN(ms) ? undefined : ms;
106
+ }
107
+ const ms = Date.UTC(year, monthIndex, day);
108
+ return Number.isNaN(ms) ? undefined : ms;
109
+ };
110
+ const getTodayStartMs = (now, interpretation) => {
111
+ if (interpretation.mode === "gateway") {
112
+ return new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
113
+ }
114
+ if (interpretation.mode === "specific") {
115
+ const shifted = new Date(now.getTime() + interpretation.utcOffsetMinutes * 60 * 1000);
116
+ return (Date.UTC(shifted.getUTCFullYear(), shifted.getUTCMonth(), shifted.getUTCDate()) -
117
+ interpretation.utcOffsetMinutes * 60 * 1000);
118
+ }
119
+ return Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate());
30
120
  };
31
121
  const parseDays = (raw) => {
32
122
  if (typeof raw === "number" && Number.isFinite(raw)) {
@@ -46,25 +136,34 @@ const parseDays = (raw) => {
46
136
  */
47
137
  const parseDateRange = (params) => {
48
138
  const now = new Date();
49
- // Use UTC for consistent date handling
50
- const todayStartMs = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate());
51
- const todayEndMs = todayStartMs + 24 * 60 * 60 * 1000 - 1;
52
- const startMs = parseDateToMs(params.startDate);
53
- const endMs = parseDateToMs(params.endDate);
139
+ const interpretation = resolveDateInterpretation(params);
140
+ const todayStartMs = getTodayStartMs(now, interpretation);
141
+ const todayEndMs = todayStartMs + DAY_MS - 1;
142
+ const startMs = parseDateToMs(params.startDate, interpretation);
143
+ const endMs = parseDateToMs(params.endDate, interpretation);
54
144
  if (startMs !== undefined && endMs !== undefined) {
55
145
  // endMs should be end of day
56
- return { startMs, endMs: endMs + 24 * 60 * 60 * 1000 - 1 };
146
+ return { startMs, endMs: endMs + DAY_MS - 1 };
57
147
  }
58
148
  const days = parseDays(params.days);
59
149
  if (days !== undefined) {
60
150
  const clampedDays = Math.max(1, days);
61
- const start = todayStartMs - (clampedDays - 1) * 24 * 60 * 60 * 1000;
151
+ const start = todayStartMs - (clampedDays - 1) * DAY_MS;
62
152
  return { startMs: start, endMs: todayEndMs };
63
153
  }
64
154
  // Default to last 30 days
65
- const defaultStartMs = todayStartMs - 29 * 24 * 60 * 60 * 1000;
155
+ const defaultStartMs = todayStartMs - 29 * DAY_MS;
66
156
  return { startMs: defaultStartMs, endMs: todayEndMs };
67
157
  };
158
+ function buildStoreBySessionId(store) {
159
+ const storeBySessionId = new Map();
160
+ for (const [key, entry] of Object.entries(store)) {
161
+ if (entry?.sessionId) {
162
+ storeBySessionId.set(entry.sessionId, { key, entry });
163
+ }
164
+ }
165
+ return storeBySessionId;
166
+ }
68
167
  async function discoverAllSessionsForUsage(params) {
69
168
  const agents = listAgentsForGateway(params.config).agents;
70
169
  const results = await Promise.all(agents.map(async (agent) => {
@@ -122,7 +221,11 @@ async function loadCostUsageSummaryCached(params) {
122
221
  }
123
222
  // Exposed for unit tests (kept as a single export to avoid widening the public API surface).
124
223
  export const __test = {
224
+ parseDateParts,
225
+ parseUtcOffsetToMinutes,
226
+ resolveDateInterpretation,
125
227
  parseDateToMs,
228
+ getTodayStartMs,
126
229
  parseDays,
127
230
  parseDateRange,
128
231
  discoverAllSessionsForUsage,
@@ -140,6 +243,8 @@ export const usageHandlers = {
140
243
  startDate: params?.startDate,
141
244
  endDate: params?.endDate,
142
245
  days: params?.days,
246
+ mode: params?.mode,
247
+ utcOffset: params?.utcOffset,
143
248
  });
144
249
  const summary = await loadCostUsageSummaryCached({ startMs, endMs, config });
145
250
  respond(true, summary, undefined);
@@ -154,12 +259,14 @@ export const usageHandlers = {
154
259
  const { startMs, endMs } = parseDateRange({
155
260
  startDate: p.startDate,
156
261
  endDate: p.endDate,
262
+ mode: p.mode,
263
+ utcOffset: p.utcOffset,
157
264
  });
158
265
  const limit = typeof p.limit === "number" && Number.isFinite(p.limit) ? p.limit : 50;
159
266
  const includeContextWeight = p.includeContextWeight ?? false;
160
267
  const specificKey = typeof p.key === "string" ? p.key.trim() : null;
161
268
  // Load session store for named sessions
162
- const { store } = loadCombinedSessionStoreForGateway(config);
269
+ const { storePath, store } = loadCombinedSessionStoreForGateway(config);
163
270
  const now = Date.now();
164
271
  const mergedEntries = [];
165
272
  // Optimization: If a specific key is requested, skip full directory scan
@@ -169,12 +276,7 @@ export const usageHandlers = {
169
276
  const keyRest = parsed?.rest ?? specificKey;
170
277
  // Prefer the store entry when available, even if the caller provides a discovered key
171
278
  // (`agent:<id>:<sessionId>`) for a session that now has a canonical store key.
172
- const storeBySessionId = new Map();
173
- for (const [key, entry] of Object.entries(store)) {
174
- if (entry?.sessionId) {
175
- storeBySessionId.set(entry.sessionId, { key, entry });
176
- }
177
- }
279
+ const storeBySessionId = buildStoreBySessionId(store);
178
280
  const storeMatch = store[specificKey]
179
281
  ? { key: specificKey, entry: store[specificKey] }
180
282
  : null;
@@ -183,9 +285,18 @@ export const usageHandlers = {
183
285
  const storeEntry = storeMatch?.entry ?? storeByIdMatch?.entry;
184
286
  const sessionId = storeEntry?.sessionId ?? keyRest;
185
287
  // Resolve the session file path
186
- const sessionFile = resolveSessionFilePath(sessionId, storeEntry, {
187
- agentId: agentIdFromKey,
188
- });
288
+ let sessionFile;
289
+ try {
290
+ const pathOpts = resolveSessionFilePathOptions({
291
+ storePath: storePath !== "(multiple)" ? storePath : undefined,
292
+ agentId: agentIdFromKey,
293
+ });
294
+ sessionFile = resolveSessionFilePath(sessionId, storeEntry, pathOpts);
295
+ }
296
+ catch {
297
+ respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, `Invalid session reference: ${specificKey}`));
298
+ return;
299
+ }
189
300
  try {
190
301
  const stats = fs.statSync(sessionFile);
191
302
  if (stats.isFile()) {
@@ -211,12 +322,7 @@ export const usageHandlers = {
211
322
  endMs,
212
323
  });
213
324
  // Build a map of sessionId -> store entry for quick lookup
214
- const storeBySessionId = new Map();
215
- for (const [key, entry] of Object.entries(store)) {
216
- if (entry?.sessionId) {
217
- storeBySessionId.set(entry.sessionId, { key, entry });
218
- }
219
- }
325
+ const storeBySessionId = buildStoreBySessionId(store);
220
326
  for (const discovered of discoveredSessions) {
221
327
  const storeMatch = storeBySessionId.get(discovered.sessionId);
222
328
  if (storeMatch) {
@@ -312,11 +418,13 @@ export const usageHandlers = {
312
418
  target.missingCostEntries += source.missingCostEntries;
313
419
  };
314
420
  for (const merged of limitedEntries) {
421
+ const agentId = parseAgentSessionKey(merged.key)?.agentId;
315
422
  const usage = await loadSessionCostSummary({
316
423
  sessionId: merged.sessionId,
317
424
  sessionEntry: merged.storeEntry,
318
425
  sessionFile: merged.sessionFile,
319
426
  config,
427
+ agentId,
320
428
  startMs,
321
429
  endMs,
322
430
  });
@@ -333,7 +441,6 @@ export const usageHandlers = {
333
441
  aggregateTotals.cacheWriteCost += usage.cacheWriteCost;
334
442
  aggregateTotals.missingCostEntries += usage.missingCostEntries;
335
443
  }
336
- const agentId = parseAgentSessionKey(merged.key)?.agentId;
337
444
  const channel = merged.storeEntry?.channel ?? merged.storeEntry?.origin?.provider;
338
445
  const chatType = merged.storeEntry?.chatType ?? merged.storeEntry?.origin?.chatType;
339
446
  if (usage) {
@@ -488,6 +595,13 @@ export const usageHandlers = {
488
595
  const d = new Date(ms);
489
596
  return `${d.getUTCFullYear()}-${String(d.getUTCMonth() + 1).padStart(2, "0")}-${String(d.getUTCDate()).padStart(2, "0")}`;
490
597
  };
598
+ const tail = buildUsageAggregateTail({
599
+ byChannelMap: byChannelMap,
600
+ latencyTotals,
601
+ dailyLatencyMap,
602
+ modelDailyMap,
603
+ dailyMap: dailyAggregateMap,
604
+ });
491
605
  const aggregates = {
492
606
  messages: aggregateMessages,
493
607
  tools: {
@@ -514,30 +628,7 @@ export const usageHandlers = {
514
628
  byAgent: Array.from(byAgentMap.entries())
515
629
  .map(([id, totals]) => ({ agentId: id, totals }))
516
630
  .toSorted((a, b) => b.totals.totalCost - a.totals.totalCost),
517
- byChannel: Array.from(byChannelMap.entries())
518
- .map(([name, totals]) => ({ channel: name, totals }))
519
- .toSorted((a, b) => b.totals.totalCost - a.totals.totalCost),
520
- latency: latencyTotals.count > 0
521
- ? {
522
- count: latencyTotals.count,
523
- avgMs: latencyTotals.sum / latencyTotals.count,
524
- minMs: latencyTotals.min === Number.POSITIVE_INFINITY ? 0 : latencyTotals.min,
525
- maxMs: latencyTotals.max,
526
- p95Ms: latencyTotals.p95Max,
527
- }
528
- : undefined,
529
- dailyLatency: Array.from(dailyLatencyMap.values())
530
- .map((entry) => ({
531
- date: entry.date,
532
- count: entry.count,
533
- avgMs: entry.count ? entry.sum / entry.count : 0,
534
- minMs: entry.min === Number.POSITIVE_INFINITY ? 0 : entry.min,
535
- maxMs: entry.max,
536
- p95Ms: entry.p95Max,
537
- }))
538
- .toSorted((a, b) => a.date.localeCompare(b.date)),
539
- modelDaily: Array.from(modelDailyMap.values()).toSorted((a, b) => a.date.localeCompare(b.date) || b.cost - a.cost),
540
- daily: Array.from(dailyAggregateMap.values()).toSorted((a, b) => a.date.localeCompare(b.date)),
631
+ ...tail,
541
632
  };
542
633
  const result = {
543
634
  updatedAt: now,
@@ -555,19 +646,17 @@ export const usageHandlers = {
555
646
  respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, "key is required for timeseries"));
556
647
  return;
557
648
  }
558
- const config = loadConfig();
559
- const { entry } = loadSessionEntry(key);
560
- // For discovered sessions (not in store), try using key as sessionId directly
561
- const parsed = parseAgentSessionKey(key);
562
- const agentId = parsed?.agentId;
563
- const rawSessionId = parsed?.rest ?? key;
564
- const sessionId = entry?.sessionId ?? rawSessionId;
565
- const sessionFile = entry?.sessionFile ?? resolveSessionFilePath(rawSessionId, entry, { agentId });
649
+ const resolved = resolveSessionUsageFileOrRespond(key, respond);
650
+ if (!resolved) {
651
+ return;
652
+ }
653
+ const { config, entry, agentId, sessionId, sessionFile } = resolved;
566
654
  const timeseries = await loadSessionUsageTimeSeries({
567
655
  sessionId,
568
656
  sessionEntry: entry,
569
657
  sessionFile,
570
658
  config,
659
+ agentId,
571
660
  maxPoints: 200,
572
661
  });
573
662
  if (!timeseries) {
@@ -585,20 +674,18 @@ export const usageHandlers = {
585
674
  const limit = typeof params?.limit === "number" && Number.isFinite(params.limit)
586
675
  ? Math.min(params.limit, 1000)
587
676
  : 200;
588
- const config = loadConfig();
589
- const { entry } = loadSessionEntry(key);
590
- // For discovered sessions (not in store), try using key as sessionId directly
591
- const parsed = parseAgentSessionKey(key);
592
- const agentId = parsed?.agentId;
593
- const rawSessionId = parsed?.rest ?? key;
594
- const sessionId = entry?.sessionId ?? rawSessionId;
595
- const sessionFile = entry?.sessionFile ?? resolveSessionFilePath(rawSessionId, entry, { agentId });
677
+ const resolved = resolveSessionUsageFileOrRespond(key, respond);
678
+ if (!resolved) {
679
+ return;
680
+ }
681
+ const { config, entry, agentId, sessionId, sessionFile } = resolved;
596
682
  const { loadSessionLogs } = await import("../../infra/session-cost-usage.js");
597
683
  const logs = await loadSessionLogs({
598
684
  sessionId,
599
685
  sessionEntry: entry,
600
686
  sessionFile,
601
687
  config,
688
+ agentId,
602
689
  limit,
603
690
  });
604
691
  respond(true, { logs: logs ?? [] }, undefined);
@@ -8,6 +8,7 @@ import { updateSessionStore } from "../config/sessions.js";
8
8
  import { requestHeartbeatNow } from "../infra/heartbeat-wake.js";
9
9
  import { deliverOutboundPayloads } from "../infra/outbound/deliver.js";
10
10
  import { resolveOutboundTarget } from "../infra/outbound/targets.js";
11
+ import { registerApnsToken } from "../infra/push-apns.js";
11
12
  import { enqueueSystemEvent } from "../infra/system-events.js";
12
13
  import { normalizeMainKey } from "../routing/session-key.js";
13
14
  import { defaultRuntime } from "../runtime.js";
@@ -410,6 +411,34 @@ export const handleNodeEvent = async (ctx, nodeId, evt) => {
410
411
  requestHeartbeatNow({ reason: "exec-event" });
411
412
  return;
412
413
  }
414
+ case "push.apns.register": {
415
+ if (!evt.payloadJSON) {
416
+ return;
417
+ }
418
+ let payload;
419
+ try {
420
+ payload = JSON.parse(evt.payloadJSON);
421
+ }
422
+ catch {
423
+ return;
424
+ }
425
+ const obj = typeof payload === "object" && payload !== null ? payload : {};
426
+ const token = typeof obj.token === "string" ? obj.token : "";
427
+ const topic = typeof obj.topic === "string" ? obj.topic : "";
428
+ const environment = obj.environment;
429
+ try {
430
+ await registerApnsToken({
431
+ nodeId,
432
+ token,
433
+ topic,
434
+ environment,
435
+ });
436
+ }
437
+ catch (err) {
438
+ ctx.logGateway.warn(`push apns register failed node=${nodeId}: ${formatForLog(err)}`);
439
+ }
440
+ return;
441
+ }
413
442
  default:
414
443
  return;
415
444
  }
@@ -1,6 +1,6 @@
1
1
  import { startGmailWatcher, stopGmailWatcher } from "../hooks/gmail-watcher.js";
2
2
  import { resetDirectoryCache } from "../infra/outbound/target-resolver.js";
3
- import { authorizeGatewaySigusr1Restart, setGatewaySigusr1RestartPolicy, } from "../infra/restart.js";
3
+ import { emitGatewayRestart, setGatewaySigusr1RestartPolicy } from "../infra/restart.js";
4
4
  import { setCommandLaneConcurrency } from "../process/command-queue.js";
5
5
  import { resolveAgentMaxConcurrent, resolveSubagentMaxConcurrent } from "../config/agent-limits.js";
6
6
  import { isTruthyEnvValue } from "../infra/env.js";
@@ -105,8 +105,7 @@ export function createGatewayReloadHandlers(params) {
105
105
  params.logReload.warn("no SIGUSR1 listener found; restart skipped");
106
106
  return;
107
107
  }
108
- authorizeGatewaySigusr1Restart();
109
- process.emit("SIGUSR1");
108
+ emitGatewayRestart();
110
109
  };
111
110
  return { applyHotReload, requestGatewayRestart };
112
111
  }
@@ -1,11 +1,27 @@
1
1
  import { assertGatewayAuthConfigured, resolveGatewayAuth, } from "./auth.js";
2
2
  import { normalizeControlUiBasePath } from "./control-ui-shared.js";
3
3
  import { resolveHooksConfig } from "./hooks.js";
4
- import { isLoopbackHost, resolveGatewayBindHost } from "./net.js";
4
+ import { isLoopbackHost, isTrustedProxyAddress, isValidIPv4, resolveGatewayBindHost, } from "./net.js";
5
+ import { mergeGatewayTailscaleConfig } from "./startup-auth.js";
5
6
  export async function resolveGatewayRuntimeConfig(params) {
6
7
  const bindMode = params.bind ?? params.cfg.gateway?.bind ?? "loopback";
7
8
  const customBindHost = params.cfg.gateway?.customBindHost;
8
9
  const bindHost = params.host ?? (await resolveGatewayBindHost(bindMode, customBindHost));
10
+ if (bindMode === "loopback" && !isLoopbackHost(bindHost)) {
11
+ throw new Error(`gateway bind=loopback resolved to non-loopback host ${bindHost}; refusing fallback to a network bind`);
12
+ }
13
+ if (bindMode === "custom") {
14
+ const configuredCustomBindHost = customBindHost?.trim();
15
+ if (!configuredCustomBindHost) {
16
+ throw new Error("gateway.bind=custom requires gateway.customBindHost");
17
+ }
18
+ if (!isValidIPv4(configuredCustomBindHost)) {
19
+ throw new Error(`gateway.bind=custom requires a valid IPv4 customBindHost (got ${configuredCustomBindHost})`);
20
+ }
21
+ if (bindHost !== configuredCustomBindHost) {
22
+ throw new Error(`gateway bind=custom requested ${configuredCustomBindHost} but resolved ${bindHost}; refusing fallback`);
23
+ }
24
+ }
9
25
  const controlUiEnabled = params.controlUiEnabled ?? params.cfg.gateway?.controlUi?.enabled ?? true;
10
26
  const openAiChatCompletionsEnabled = params.openAiChatCompletionsEnabled ??
11
27
  params.cfg.gateway?.http?.endpoints?.chatCompletions?.enabled ??
@@ -13,21 +29,17 @@ export async function resolveGatewayRuntimeConfig(params) {
13
29
  const openResponsesConfig = params.cfg.gateway?.http?.endpoints?.responses;
14
30
  const openResponsesEnabled = params.openResponsesEnabled ?? openResponsesConfig?.enabled ?? false;
15
31
  const controlUiBasePath = normalizeControlUiBasePath(params.cfg.gateway?.controlUi?.basePath);
16
- const authBase = params.cfg.gateway?.auth ?? {};
17
- const authOverrides = params.auth ?? {};
18
- const authConfig = {
19
- ...authBase,
20
- ...authOverrides,
21
- };
32
+ const controlUiRootRaw = params.cfg.gateway?.controlUi?.root;
33
+ const controlUiRoot = typeof controlUiRootRaw === "string" && controlUiRootRaw.trim().length > 0
34
+ ? controlUiRootRaw.trim()
35
+ : undefined;
22
36
  const tailscaleBase = params.cfg.gateway?.tailscale ?? {};
23
37
  const tailscaleOverrides = params.tailscale ?? {};
24
- const tailscaleConfig = {
25
- ...tailscaleBase,
26
- ...tailscaleOverrides,
27
- };
38
+ const tailscaleConfig = mergeGatewayTailscaleConfig(tailscaleBase, tailscaleOverrides);
28
39
  const tailscaleMode = tailscaleConfig.mode ?? "off";
29
40
  const resolvedAuth = resolveGatewayAuth({
30
- authConfig,
41
+ authConfig: params.cfg.gateway?.auth,
42
+ authOverride: params.auth,
31
43
  env: process.env,
32
44
  tailscaleMode,
33
45
  });
@@ -37,6 +49,7 @@ export async function resolveGatewayRuntimeConfig(params) {
37
49
  const hasSharedSecret = (authMode === "token" && hasToken) || (authMode === "password" && hasPassword);
38
50
  const hooksConfig = resolveHooksConfig(params.cfg);
39
51
  const canvasHostEnabled = process.env.CLAWDBOT_SKIP_CANVAS_HOST !== "1" && params.cfg.canvasHost?.enabled !== false;
52
+ const trustedProxies = params.cfg.gateway?.trustedProxies ?? [];
40
53
  assertGatewayAuthConfigured(resolvedAuth);
41
54
  if (tailscaleMode === "funnel" && authMode !== "password") {
42
55
  throw new Error("tailscale funnel requires gateway auth mode=password (set gateway.auth.password or POOLBOT_GATEWAY_PASSWORD)");
@@ -44,9 +57,21 @@ export async function resolveGatewayRuntimeConfig(params) {
44
57
  if (tailscaleMode !== "off" && !isLoopbackHost(bindHost)) {
45
58
  throw new Error("tailscale serve/funnel requires gateway bind=loopback (127.0.0.1)");
46
59
  }
47
- if (!isLoopbackHost(bindHost) && !hasSharedSecret) {
60
+ if (!isLoopbackHost(bindHost) && !hasSharedSecret && authMode !== "trusted-proxy") {
48
61
  throw new Error(`refusing to bind gateway to ${bindHost}:${params.port} without auth (set gateway.auth.token/password, or set POOLBOT_GATEWAY_TOKEN/POOLBOT_GATEWAY_PASSWORD)`);
49
62
  }
63
+ if (authMode === "trusted-proxy") {
64
+ if (trustedProxies.length === 0) {
65
+ throw new Error("gateway auth mode=trusted-proxy requires gateway.trustedProxies to be configured with at least one proxy IP");
66
+ }
67
+ if (isLoopbackHost(bindHost)) {
68
+ const hasLoopbackTrustedProxy = isTrustedProxyAddress("127.0.0.1", trustedProxies) ||
69
+ isTrustedProxyAddress("::1", trustedProxies);
70
+ if (!hasLoopbackTrustedProxy) {
71
+ throw new Error("gateway auth mode=trusted-proxy with bind=loopback requires gateway.trustedProxies to include 127.0.0.1, ::1, or a loopback CIDR");
72
+ }
73
+ }
74
+ }
50
75
  return {
51
76
  bindHost,
52
77
  controlUiEnabled,
@@ -56,6 +81,7 @@ export async function resolveGatewayRuntimeConfig(params) {
56
81
  ? { ...openResponsesConfig, enabled: openResponsesEnabled }
57
82
  : undefined,
58
83
  controlUiBasePath,
84
+ controlUiRoot,
59
85
  resolvedAuth,
60
86
  authMode,
61
87
  tailscaleConfig,
@@ -60,6 +60,7 @@ export async function createGatewayRuntimeState(params) {
60
60
  handleHooksRequest,
61
61
  handlePluginRequest,
62
62
  resolvedAuth: params.resolvedAuth,
63
+ rateLimiter: params.rateLimiter,
63
64
  tlsOptions: params.gatewayTls?.enabled ? params.gatewayTls.tlsOptions : undefined,
64
65
  });
65
66
  try {
@@ -93,6 +94,7 @@ export async function createGatewayRuntimeState(params) {
93
94
  canvasHost,
94
95
  clients,
95
96
  resolvedAuth: params.resolvedAuth,
97
+ rateLimiter: params.rateLimiter,
96
98
  });
97
99
  }
98
100
  const agentRunSeq = new Map();
@@ -1,16 +1,22 @@
1
- import { resolveDefaultAgentId } from "../agents/agent-scope.js";
1
+ import { listAgentIds } from "../agents/agent-scope.js";
2
+ import { resolveMemorySearchConfig } from "../agents/memory-search.js";
2
3
  import { resolveMemoryBackendConfig } from "../memory/backend-config.js";
3
4
  import { getMemorySearchManager } from "../memory/index.js";
4
5
  export async function startGatewayMemoryBackend(params) {
5
- const agentId = resolveDefaultAgentId(params.cfg);
6
- const resolved = resolveMemoryBackendConfig({ cfg: params.cfg, agentId });
7
- if (resolved.backend !== "qmd" || !resolved.qmd) {
8
- return;
6
+ const agentIds = listAgentIds(params.cfg);
7
+ for (const agentId of agentIds) {
8
+ if (!resolveMemorySearchConfig(params.cfg, agentId)) {
9
+ continue;
10
+ }
11
+ const resolved = resolveMemoryBackendConfig({ cfg: params.cfg, agentId });
12
+ if (resolved.backend !== "qmd" || !resolved.qmd) {
13
+ continue;
14
+ }
15
+ const { manager, error } = await getMemorySearchManager({ cfg: params.cfg, agentId });
16
+ if (!manager) {
17
+ params.log.warn(`qmd memory startup initialization failed for agent "${agentId}": ${error ?? "unknown error"}`);
18
+ continue;
19
+ }
20
+ params.log.info?.(`qmd memory startup initialization armed for agent "${agentId}"`);
9
21
  }
10
- const { manager, error } = await getMemorySearchManager({ cfg: params.cfg, agentId });
11
- if (!manager) {
12
- params.log.warn(`qmd memory startup initialization failed for agent "${agentId}": ${error ?? "unknown error"}`);
13
- return;
14
- }
15
- params.log.info?.(`qmd memory startup initialization armed for agent "${agentId}"`);
16
22
  }
@@ -8,6 +8,7 @@ export function attachGatewayWsHandlers(params) {
8
8
  canvasHostEnabled: params.canvasHostEnabled,
9
9
  canvasHostServerPort: params.canvasHostServerPort,
10
10
  resolvedAuth: params.resolvedAuth,
11
+ rateLimiter: params.rateLimiter,
11
12
  gatewayMethods: params.gatewayMethods,
12
13
  events: params.events,
13
14
  logGateway: params.logGateway,