@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
@@ -15,16 +15,18 @@ const hookPresetMappings = {
15
15
  ],
16
16
  };
17
17
  const transformCache = new Map();
18
- export function resolveHookMappings(hooks) {
18
+ export function resolveHookMappings(hooks, opts) {
19
19
  const presets = hooks?.presets ?? [];
20
20
  const gmailAllowUnsafe = hooks?.gmail?.allowUnsafeExternalContent;
21
21
  const mappings = [];
22
- if (hooks?.mappings)
22
+ if (hooks?.mappings) {
23
23
  mappings.push(...hooks.mappings);
24
+ }
24
25
  for (const preset of presets) {
25
26
  const presetMappings = hookPresetMappings[preset];
26
- if (!presetMappings)
27
+ if (!presetMappings) {
27
28
  continue;
29
+ }
28
30
  if (preset === "gmail" && typeof gmailAllowUnsafe === "boolean") {
29
31
  mappings.push(...presetMappings.map((mapping) => ({
30
32
  ...mapping,
@@ -34,23 +36,26 @@ export function resolveHookMappings(hooks) {
34
36
  }
35
37
  mappings.push(...presetMappings);
36
38
  }
37
- if (mappings.length === 0)
39
+ if (mappings.length === 0) {
38
40
  return [];
39
- const configDir = path.dirname(CONFIG_PATH);
40
- const transformsDir = hooks?.transformsDir
41
- ? resolvePath(configDir, hooks.transformsDir)
42
- : configDir;
41
+ }
42
+ const configDir = path.resolve(opts?.configDir ?? path.dirname(CONFIG_PATH));
43
+ const transformsRootDir = path.join(configDir, "hooks", "transforms");
44
+ const transformsDir = resolveOptionalContainedPath(transformsRootDir, hooks?.transformsDir, "Hook transformsDir");
43
45
  return mappings.map((mapping, index) => normalizeHookMapping(mapping, index, transformsDir));
44
46
  }
45
47
  export async function applyHookMappings(mappings, ctx) {
46
- if (mappings.length === 0)
48
+ if (mappings.length === 0) {
47
49
  return null;
50
+ }
48
51
  for (const mapping of mappings) {
49
- if (!mappingMatches(mapping, ctx))
52
+ if (!mappingMatches(mapping, ctx)) {
50
53
  continue;
54
+ }
51
55
  const base = buildActionFromMapping(mapping, ctx);
52
- if (!base.ok)
56
+ if (!base.ok) {
53
57
  return base;
58
+ }
54
59
  let override = null;
55
60
  if (mapping.transform) {
56
61
  const transform = await loadTransform(mapping.transform);
@@ -59,11 +64,13 @@ export async function applyHookMappings(mappings, ctx) {
59
64
  return { ok: true, action: null, skipped: true };
60
65
  }
61
66
  }
62
- if (!base.action)
67
+ if (!base.action) {
63
68
  return { ok: true, action: null, skipped: true };
69
+ }
64
70
  const merged = mergeAction(base.action, override, mapping.action);
65
- if (!merged.ok)
71
+ if (!merged.ok) {
66
72
  return merged;
73
+ }
67
74
  return merged;
68
75
  }
69
76
  return null;
@@ -76,7 +83,7 @@ function normalizeHookMapping(mapping, index, transformsDir) {
76
83
  const wakeMode = mapping.wakeMode ?? "now";
77
84
  const transform = mapping.transform
78
85
  ? {
79
- modulePath: resolvePath(transformsDir, mapping.transform.module),
86
+ modulePath: resolveContainedPath(transformsDir, mapping.transform.module, "Hook transform"),
80
87
  exportName: mapping.transform.export?.trim() || undefined,
81
88
  }
82
89
  : undefined;
@@ -103,13 +110,15 @@ function normalizeHookMapping(mapping, index, transformsDir) {
103
110
  }
104
111
  function mappingMatches(mapping, ctx) {
105
112
  if (mapping.matchPath) {
106
- if (mapping.matchPath !== normalizeMatchPath(ctx.path))
113
+ if (mapping.matchPath !== normalizeMatchPath(ctx.path)) {
107
114
  return false;
115
+ }
108
116
  }
109
117
  if (mapping.matchSource) {
110
118
  const source = typeof ctx.payload.source === "string" ? ctx.payload.source : undefined;
111
- if (!source || source !== mapping.matchSource)
119
+ if (!source || source !== mapping.matchSource) {
112
120
  return false;
121
+ }
113
122
  }
114
123
  return true;
115
124
  }
@@ -149,7 +158,7 @@ function mergeAction(base, override, defaultAction) {
149
158
  if (!override) {
150
159
  return validateAction(base);
151
160
  }
152
- const kind = (override.kind ?? base.kind ?? defaultAction);
161
+ const kind = override.kind ?? base.kind ?? defaultAction;
153
162
  if (kind === "wake") {
154
163
  const baseWake = base.kind === "wake" ? base : undefined;
155
164
  const text = typeof override.text === "string" ? override.text : (baseWake?.text ?? "");
@@ -190,13 +199,15 @@ function validateAction(action) {
190
199
  return { ok: true, action };
191
200
  }
192
201
  async function loadTransform(transform) {
193
- const cached = transformCache.get(transform.modulePath);
194
- if (cached)
202
+ const cacheKey = `${transform.modulePath}::${transform.exportName ?? "default"}`;
203
+ const cached = transformCache.get(cacheKey);
204
+ if (cached) {
195
205
  return cached;
206
+ }
196
207
  const url = pathToFileURL(transform.modulePath).href;
197
208
  const mod = (await import(url));
198
209
  const fn = resolveTransformFn(mod, transform.exportName);
199
- transformCache.set(transform.modulePath, fn);
210
+ transformCache.set(cacheKey, fn);
200
211
  return fn;
201
212
  }
202
213
  function resolveTransformFn(mod, exportName) {
@@ -207,45 +218,73 @@ function resolveTransformFn(mod, exportName) {
207
218
  return candidate;
208
219
  }
209
220
  function resolvePath(baseDir, target) {
210
- if (!target)
211
- return baseDir;
212
- if (path.isAbsolute(target))
213
- return target;
214
- return path.join(baseDir, target);
221
+ if (!target) {
222
+ return path.resolve(baseDir);
223
+ }
224
+ return path.isAbsolute(target) ? path.resolve(target) : path.resolve(baseDir, target);
225
+ }
226
+ function resolveContainedPath(baseDir, target, label) {
227
+ const base = path.resolve(baseDir);
228
+ const trimmed = target?.trim();
229
+ if (!trimmed) {
230
+ throw new Error(`${label} module path is required`);
231
+ }
232
+ const resolved = resolvePath(base, trimmed);
233
+ const relative = path.relative(base, resolved);
234
+ if (relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
235
+ throw new Error(`${label} module path must be within ${base}: ${target}`);
236
+ }
237
+ return resolved;
238
+ }
239
+ function resolveOptionalContainedPath(baseDir, target, label) {
240
+ const trimmed = target?.trim();
241
+ if (!trimmed) {
242
+ return path.resolve(baseDir);
243
+ }
244
+ return resolveContainedPath(baseDir, trimmed, label);
215
245
  }
216
246
  function normalizeMatchPath(raw) {
217
- if (!raw)
247
+ if (!raw) {
218
248
  return undefined;
249
+ }
219
250
  const trimmed = raw.trim();
220
- if (!trimmed)
251
+ if (!trimmed) {
221
252
  return undefined;
253
+ }
222
254
  return trimmed.replace(/^\/+/, "").replace(/\/+$/, "");
223
255
  }
224
256
  function renderOptional(value, ctx) {
225
- if (!value)
257
+ if (!value) {
226
258
  return undefined;
259
+ }
227
260
  const rendered = renderTemplate(value, ctx).trim();
228
261
  return rendered ? rendered : undefined;
229
262
  }
230
263
  function renderTemplate(template, ctx) {
231
- if (!template)
264
+ if (!template) {
232
265
  return "";
266
+ }
233
267
  return template.replace(/\{\{\s*([^}]+)\s*\}\}/g, (_, expr) => {
234
268
  const value = resolveTemplateExpr(expr.trim(), ctx);
235
- if (value === undefined || value === null)
269
+ if (value === undefined || value === null) {
236
270
  return "";
237
- if (typeof value === "string")
271
+ }
272
+ if (typeof value === "string") {
238
273
  return value;
239
- if (typeof value === "number" || typeof value === "boolean")
274
+ }
275
+ if (typeof value === "number" || typeof value === "boolean") {
240
276
  return String(value);
277
+ }
241
278
  return JSON.stringify(value);
242
279
  });
243
280
  }
244
281
  function resolveTemplateExpr(expr, ctx) {
245
- if (expr === "path")
282
+ if (expr === "path") {
246
283
  return ctx.path;
247
- if (expr === "now")
284
+ }
285
+ if (expr === "now") {
248
286
  return new Date().toISOString();
287
+ }
249
288
  if (expr.startsWith("headers.")) {
250
289
  return getByPath(ctx.headers, expr.slice("headers.".length));
251
290
  }
@@ -257,9 +296,14 @@ function resolveTemplateExpr(expr, ctx) {
257
296
  }
258
297
  return getByPath(ctx.payload, expr);
259
298
  }
299
+ // Block traversal into prototype-chain properties on attacker-controlled
300
+ // webhook payloads. Mirrors the same blocklist used by config-paths.ts
301
+ // for config path traversal.
302
+ const BLOCKED_PATH_KEYS = new Set(["__proto__", "prototype", "constructor"]);
260
303
  function getByPath(input, pathExpr) {
261
- if (!pathExpr)
304
+ if (!pathExpr) {
262
305
  return undefined;
306
+ }
263
307
  const parts = [];
264
308
  const re = /([^.[\]]+)|(\[(\d+)\])/g;
265
309
  let match = re.exec(pathExpr);
@@ -274,16 +318,22 @@ function getByPath(input, pathExpr) {
274
318
  }
275
319
  let current = input;
276
320
  for (const part of parts) {
277
- if (current === null || current === undefined)
321
+ if (current === null || current === undefined) {
278
322
  return undefined;
323
+ }
279
324
  if (typeof part === "number") {
280
- if (!Array.isArray(current))
325
+ if (!Array.isArray(current)) {
281
326
  return undefined;
327
+ }
282
328
  current = current[part];
283
329
  continue;
284
330
  }
285
- if (typeof current !== "object")
331
+ if (BLOCKED_PATH_KEYS.has(part)) {
332
+ return undefined;
333
+ }
334
+ if (typeof current !== "object") {
286
335
  return undefined;
336
+ }
287
337
  current = current[part];
288
338
  }
289
339
  return current;
@@ -1,13 +1,14 @@
1
- import { authorizeGatewayConnect } from "./auth.js";
1
+ import { authorizeHttpGatewayConnect } from "./auth.js";
2
2
  import { sendGatewayAuthFailure } from "./http-common.js";
3
3
  import { getBearerToken } from "./http-utils.js";
4
4
  export async function authorizeGatewayBearerRequestOrReply(params) {
5
5
  const token = getBearerToken(params.req);
6
- const authResult = await authorizeGatewayConnect({
6
+ const authResult = await authorizeHttpGatewayConnect({
7
7
  auth: params.auth,
8
8
  connectAuth: token ? { token, password: token } : null,
9
9
  req: params.req,
10
10
  trustedProxies: params.trustedProxies,
11
+ allowRealIpFallback: params.allowRealIpFallback,
11
12
  rateLimiter: params.rateLimiter,
12
13
  });
13
14
  if (!authResult.ok) {
@@ -14,6 +14,7 @@ export async function handleGatewayPostJsonEndpoint(req, res, opts) {
14
14
  res,
15
15
  auth: opts.auth,
16
16
  trustedProxies: opts.trustedProxies,
17
+ allowRealIpFallback: opts.allowRealIpFallback,
17
18
  rateLimiter: opts.rateLimiter,
18
19
  });
19
20
  if (!authorized) {
@@ -135,19 +135,44 @@ function stripOptionalPort(ip) {
135
135
  }
136
136
  return ip;
137
137
  }
138
- export function parseForwardedForClientIp(forwardedFor) {
139
- const raw = forwardedFor?.split(",")[0]?.trim();
140
- if (!raw) {
138
+ function parseIpLiteral(raw) {
139
+ const trimmed = raw?.trim();
140
+ if (!trimmed) {
141
+ return undefined;
142
+ }
143
+ const stripped = stripOptionalPort(trimmed);
144
+ const normalized = normalizeIp(stripped);
145
+ if (!normalized || net.isIP(normalized) === 0) {
141
146
  return undefined;
142
147
  }
143
- return normalizeIp(stripOptionalPort(raw));
148
+ return normalized;
144
149
  }
145
150
  function parseRealIp(realIp) {
146
- const raw = realIp?.trim();
147
- if (!raw) {
151
+ return parseIpLiteral(realIp);
152
+ }
153
+ function resolveForwardedClientIp(params) {
154
+ const { forwardedFor, trustedProxies } = params;
155
+ if (!trustedProxies?.length) {
148
156
  return undefined;
149
157
  }
150
- return normalizeIp(stripOptionalPort(raw));
158
+ const forwardedChain = [];
159
+ for (const entry of forwardedFor?.split(",") ?? []) {
160
+ const normalized = parseIpLiteral(entry);
161
+ if (normalized) {
162
+ forwardedChain.push(normalized);
163
+ }
164
+ }
165
+ if (forwardedChain.length === 0) {
166
+ return undefined;
167
+ }
168
+ // Walk right-to-left and return the first untrusted hop.
169
+ for (let index = forwardedChain.length - 1; index >= 0; index -= 1) {
170
+ const hop = forwardedChain[index];
171
+ if (!isTrustedProxyAddress(hop, trustedProxies)) {
172
+ return hop;
173
+ }
174
+ }
175
+ return undefined;
151
176
  }
152
177
  /**
153
178
  * Check if an IP address matches a CIDR block.
@@ -202,7 +227,7 @@ export function isTrustedProxyAddress(ip, trustedProxies) {
202
227
  return normalizeIp(candidate) === normalized;
203
228
  });
204
229
  }
205
- export function resolveGatewayClientIp(params) {
230
+ export function resolveClientIp(params) {
206
231
  const remote = normalizeIp(params.remoteAddr);
207
232
  if (!remote) {
208
233
  return undefined;
@@ -210,7 +235,20 @@ export function resolveGatewayClientIp(params) {
210
235
  if (!isTrustedProxyAddress(remote, params.trustedProxies)) {
211
236
  return remote;
212
237
  }
213
- return parseForwardedForClientIp(params.forwardedFor) ?? parseRealIp(params.realIp) ?? remote;
238
+ // Fail closed when traffic comes from a trusted proxy but client-origin headers
239
+ // are missing or invalid. Falling back to the proxy's own IP can accidentally
240
+ // treat unrelated requests as local/trusted.
241
+ const forwardedIp = resolveForwardedClientIp({
242
+ forwardedFor: params.forwardedFor,
243
+ trustedProxies: params.trustedProxies,
244
+ });
245
+ if (forwardedIp) {
246
+ return forwardedIp;
247
+ }
248
+ if (params.allowRealIpFallback) {
249
+ return parseRealIp(params.realIp);
250
+ }
251
+ return undefined;
214
252
  }
215
253
  export function isLocalGatewayAddress(ip) {
216
254
  if (isLoopbackAddress(ip)) {
@@ -348,9 +386,13 @@ export function isLoopbackHost(host) {
348
386
  return isLoopbackAddress(unbracket);
349
387
  }
350
388
  /**
351
- * Returns true if the URL uses wss:// (encrypted) OR ws:// to a loopback address.
352
- * Plaintext ws:// to non-loopback addresses is insecure (CWE-319, CVSS 9.8):
353
- * both credentials (gateway token/password) and chat/conversation data
389
+ * Security check for WebSocket URLs (CWE-319: Cleartext Transmission of Sensitive Information).
390
+ *
391
+ * Returns true if the URL is secure for transmitting data:
392
+ * - wss:// (TLS) is always secure
393
+ * - ws:// is only secure for loopback addresses (localhost, 127.x.x.x, ::1)
394
+ *
395
+ * All other ws:// URLs are considered insecure because both credentials
354
396
  * AND chat/conversation data would be exposed to network interception.
355
397
  */
356
398
  export function isSecureWebSocketUrl(url) {
@@ -1,4 +1,4 @@
1
- import { formatExecCommand, validateSystemRunCommandConsistency, } from "../infra/system-run-command.js";
1
+ import { resolveSystemRunCommand } from "../infra/system-run-command.js";
2
2
  function asRecord(value) {
3
3
  if (!value || typeof value !== "object" || Array.isArray(value)) {
4
4
  return null;
@@ -20,24 +20,10 @@ function clientHasApprovals(client) {
20
20
  const scopes = Array.isArray(client?.connect?.scopes) ? client?.connect?.scopes : [];
21
21
  return scopes.includes("operator.admin") || scopes.includes("operator.approvals");
22
22
  }
23
- function getCmdText(params) {
24
- const raw = normalizeString(params.rawCommand);
25
- if (raw) {
26
- return raw;
27
- }
28
- if (Array.isArray(params.command)) {
29
- const parts = params.command.map((v) => String(v));
30
- if (parts.length > 0) {
31
- return formatExecCommand(parts);
32
- }
33
- }
34
- return "";
35
- }
36
- function approvalMatchesRequest(params, record) {
23
+ function approvalMatchesRequest(cmdText, params, record) {
37
24
  if (record.request.host !== "node") {
38
25
  return false;
39
26
  }
40
- const cmdText = getCmdText(params);
41
27
  if (!cmdText || record.request.command !== cmdText) {
42
28
  return false;
43
29
  }
@@ -90,25 +76,18 @@ export function sanitizeSystemRunParamsForForwarding(opts) {
90
76
  return { ok: true, params: opts.rawParams };
91
77
  }
92
78
  const p = obj;
93
- const argv = Array.isArray(p.command) ? p.command.map((v) => String(v)) : [];
94
- const raw = normalizeString(p.rawCommand);
95
- if (raw) {
96
- if (!Array.isArray(p.command) || argv.length === 0) {
97
- return {
98
- ok: false,
99
- message: "rawCommand requires params.command",
100
- details: { code: "MISSING_COMMAND" },
101
- };
102
- }
103
- const validation = validateSystemRunCommandConsistency({ argv, rawCommand: raw });
104
- if (!validation.ok) {
105
- return {
106
- ok: false,
107
- message: validation.message,
108
- details: validation.details ?? { code: "RAW_COMMAND_MISMATCH" },
109
- };
110
- }
79
+ const cmdTextResolution = resolveSystemRunCommand({
80
+ command: p.command,
81
+ rawCommand: p.rawCommand,
82
+ });
83
+ if (!cmdTextResolution.ok) {
84
+ return {
85
+ ok: false,
86
+ message: cmdTextResolution.message,
87
+ details: cmdTextResolution.details,
88
+ };
111
89
  }
90
+ const cmdText = cmdTextResolution.cmdText;
112
91
  const approved = p.approved === true;
113
92
  const requestedDecision = normalizeApprovalDecision(p.approvalDecision);
114
93
  const wantsApprovalOverride = approved || requestedDecision !== null;
@@ -171,7 +150,7 @@ export function sanitizeSystemRunParamsForForwarding(opts) {
171
150
  details: { code: "APPROVAL_CLIENT_MISMATCH", runId },
172
151
  };
173
152
  }
174
- if (!approvalMatchesRequest(p, snapshot)) {
153
+ if (!approvalMatchesRequest(cmdText, p, snapshot)) {
175
154
  return {
176
155
  ok: false,
177
156
  message: "approval id does not match request",
@@ -40,13 +40,15 @@ export class NodeRegistry {
40
40
  }
41
41
  unregister(connId) {
42
42
  const nodeId = this.nodesByConn.get(connId);
43
- if (!nodeId)
43
+ if (!nodeId) {
44
44
  return null;
45
+ }
45
46
  this.nodesByConn.delete(connId);
46
47
  this.nodesById.delete(nodeId);
47
48
  for (const [id, pending] of this.pendingInvokes.entries()) {
48
- if (pending.nodeId !== nodeId)
49
+ if (pending.nodeId !== nodeId) {
49
50
  continue;
51
+ }
50
52
  clearTimeout(pending.timer);
51
53
  pending.reject(new Error(`node disconnected (${pending.command})`));
52
54
  this.pendingInvokes.delete(id);
@@ -103,10 +105,12 @@ export class NodeRegistry {
103
105
  }
104
106
  handleInvokeResult(params) {
105
107
  const pending = this.pendingInvokes.get(params.id);
106
- if (!pending)
108
+ if (!pending) {
107
109
  return false;
108
- if (pending.nodeId !== params.nodeId)
110
+ }
111
+ if (pending.nodeId !== params.nodeId) {
109
112
  return false;
113
+ }
110
114
  clearTimeout(pending.timer);
111
115
  this.pendingInvokes.delete(params.id);
112
116
  pending.resolve({
@@ -119,8 +123,9 @@ export class NodeRegistry {
119
123
  }
120
124
  sendEvent(nodeId, event, payload) {
121
125
  const node = this.nodesById.get(nodeId);
122
- if (!node)
126
+ if (!node) {
123
127
  return false;
128
+ }
124
129
  return this.sendEventToSession(node, event, payload);
125
130
  }
126
131
  sendEventInternal(node, event, payload) {
@@ -124,6 +124,7 @@ export async function handleOpenAiHttpRequest(req, res, opts) {
124
124
  connectAuth: { token, password: token },
125
125
  req,
126
126
  trustedProxies: opts.trustedProxies,
127
+ allowRealIpFallback: opts.allowRealIpFallback,
127
128
  });
128
129
  if (!authResult.ok) {
129
130
  sendUnauthorized(res);
@@ -215,6 +215,7 @@ export async function handleOpenResponsesHttpRequest(req, res, opts) {
215
215
  pathname: "/v1/responses",
216
216
  auth: opts.auth,
217
217
  trustedProxies: opts.trustedProxies,
218
+ allowRealIpFallback: opts.allowRealIpFallback,
218
219
  rateLimiter: opts.rateLimiter,
219
220
  maxBodyBytes,
220
221
  });
@@ -1,21 +1,4 @@
1
- import { isLoopbackHost } from "./net.js";
2
- function normalizeHostHeader(hostHeader) {
3
- return (hostHeader ?? "").trim().toLowerCase();
4
- }
5
- function resolveHostName(hostHeader) {
6
- const host = normalizeHostHeader(hostHeader);
7
- if (!host) {
8
- return "";
9
- }
10
- if (host.startsWith("[")) {
11
- const end = host.indexOf("]");
12
- if (end !== -1) {
13
- return host.slice(1, end);
14
- }
15
- }
16
- const [name] = host.split(":");
17
- return name ?? "";
18
- }
1
+ import { isLoopbackHost, normalizeHostHeader, resolveHostName } from "./net.js";
19
2
  function parseOrigin(originRaw) {
20
3
  const trimmed = (originRaw ?? "").trim();
21
4
  if (!trimmed || trimmed === "null") {
@@ -1,5 +1,5 @@
1
1
  import AjvPkg from "ajv";
2
- import { AgentEventSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, AgentParamsSchema, AgentSummarySchema, AgentsFileEntrySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema, AgentsUpdateParamsSchema, AgentsUpdateResultSchema, AgentsDeleteParamsSchema, AgentsDeleteResultSchema, AgentsFilesGetParamsSchema, AgentsFilesGetResultSchema, AgentsFilesListParamsSchema, AgentsFilesListResultSchema, AgentsFilesSetParamsSchema, AgentsFilesSetResultSchema, AgentsListParamsSchema, AgentsListResultSchema, AgentWaitParamsSchema, ChannelsLogoutParamsSchema, TalkConfigParamsSchema, TalkConfigResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChatAbortParamsSchema, ChatEventSchema, ChatHistoryParamsSchema, ChatInjectParamsSchema, ChatSendParamsSchema, ConfigApplyParamsSchema, ConfigGetParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, ConfigSetParamsSchema, ConnectParamsSchema, CronAddParamsSchema, CronJobSchema, CronListParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, CronStatusParamsSchema, CronUpdateParamsSchema, DevicePairApproveParamsSchema, DevicePairListParamsSchema, DevicePairRejectParamsSchema, DeviceTokenRevokeParamsSchema, DeviceTokenRotateParamsSchema, ExecApprovalsGetParamsSchema, ExecApprovalsNodeGetParamsSchema, ExecApprovalsNodeSetParamsSchema, ExecApprovalsSetParamsSchema, ExecApprovalRequestParamsSchema, ExecApprovalResolveParamsSchema, ErrorCodes, ErrorShapeSchema, EventFrameSchema, errorShape, GatewayFrameSchema, HelloOkSchema, LogsTailParamsSchema, LogsTailResultSchema, ModelsListParamsSchema, NodeDescribeParamsSchema, NodeEventParamsSchema, NodeInvokeParamsSchema, NodeInvokeResultParamsSchema, NodeListParamsSchema, NodePairApproveParamsSchema, NodePairListParamsSchema, NodePairRejectParamsSchema, NodePairRequestParamsSchema, NodePairVerifyParamsSchema, NodeRenameParamsSchema, PollParamsSchema, PROTOCOL_VERSION, PresenceEntrySchema, ProtocolSchemas, PushTestParamsSchema, RequestFrameSchema, ResponseFrameSchema, SendParamsSchema, SessionsCompactParamsSchema, SessionsDeleteParamsSchema, SessionsListParamsSchema, SessionsPatchParamsSchema, SessionsPreviewParamsSchema, SessionsResetParamsSchema, SessionsResolveParamsSchema, SessionsUsageParamsSchema, ShutdownEventSchema, SkillsBinsParamsSchema, SkillsInstallParamsSchema, SkillsStatusParamsSchema, SkillsUpdateParamsSchema, SnapshotSchema, StateVersionSchema, TalkModeParamsSchema, TickEventSchema, UpdateRunParamsSchema, WakeParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, WizardCancelParamsSchema, WizardNextParamsSchema, WizardNextResultSchema, WizardStartParamsSchema, WizardStartResultSchema, WizardStatusParamsSchema, WizardStatusResultSchema, WizardStepSchema, } from "./schema.js";
2
+ import { AgentEventSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, AgentParamsSchema, AgentSummarySchema, AgentsFileEntrySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema, AgentsUpdateParamsSchema, AgentsUpdateResultSchema, AgentsDeleteParamsSchema, AgentsDeleteResultSchema, AgentsFilesGetParamsSchema, AgentsFilesGetResultSchema, AgentsFilesListParamsSchema, AgentsFilesListResultSchema, AgentsFilesSetParamsSchema, AgentsFilesSetResultSchema, AgentsListParamsSchema, AgentsListResultSchema, AgentWaitParamsSchema, ChannelsLogoutParamsSchema, TalkConfigParamsSchema, TalkConfigResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChatAbortParamsSchema, ChatEventSchema, ChatHistoryParamsSchema, ChatInjectParamsSchema, ChatSendParamsSchema, ConfigApplyParamsSchema, ConfigGetParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, ConfigSetParamsSchema, ConnectParamsSchema, CronAddParamsSchema, CronJobSchema, CronListParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, CronStatusParamsSchema, CronUpdateParamsSchema, DevicePairApproveParamsSchema, DevicePairListParamsSchema, DevicePairRemoveParamsSchema, DevicePairRejectParamsSchema, DeviceTokenRevokeParamsSchema, DeviceTokenRotateParamsSchema, ExecApprovalsGetParamsSchema, ExecApprovalsNodeGetParamsSchema, ExecApprovalsNodeSetParamsSchema, ExecApprovalsSetParamsSchema, ExecApprovalRequestParamsSchema, ExecApprovalResolveParamsSchema, ErrorCodes, ErrorShapeSchema, EventFrameSchema, errorShape, GatewayFrameSchema, HelloOkSchema, LogsTailParamsSchema, LogsTailResultSchema, ModelsListParamsSchema, NodeDescribeParamsSchema, NodeEventParamsSchema, NodeInvokeParamsSchema, NodeInvokeResultParamsSchema, NodeListParamsSchema, NodePairApproveParamsSchema, NodePairListParamsSchema, NodePairRejectParamsSchema, NodePairRequestParamsSchema, NodePairVerifyParamsSchema, NodeRenameParamsSchema, PollParamsSchema, PROTOCOL_VERSION, PushTestParamsSchema, PushTestResultSchema, PresenceEntrySchema, ProtocolSchemas, RequestFrameSchema, ResponseFrameSchema, SendParamsSchema, SessionsCompactParamsSchema, SessionsDeleteParamsSchema, SessionsListParamsSchema, SessionsPatchParamsSchema, SessionsPreviewParamsSchema, SessionsResetParamsSchema, SessionsResolveParamsSchema, SessionsUsageParamsSchema, ShutdownEventSchema, SkillsBinsParamsSchema, SkillsInstallParamsSchema, SkillsStatusParamsSchema, SkillsUpdateParamsSchema, SnapshotSchema, StateVersionSchema, TalkModeParamsSchema, TickEventSchema, UpdateRunParamsSchema, WakeParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, WizardCancelParamsSchema, WizardNextParamsSchema, WizardNextResultSchema, WizardStartParamsSchema, WizardStartResultSchema, WizardStatusParamsSchema, WizardStatusResultSchema, WizardStepSchema, } from "./schema.js";
3
3
  const ajv = new AjvPkg({
4
4
  allErrors: true,
5
5
  strict: false,
@@ -33,6 +33,7 @@ export const validateNodeDescribeParams = ajv.compile(NodeDescribeParamsSchema);
33
33
  export const validateNodeInvokeParams = ajv.compile(NodeInvokeParamsSchema);
34
34
  export const validateNodeInvokeResultParams = ajv.compile(NodeInvokeResultParamsSchema);
35
35
  export const validateNodeEventParams = ajv.compile(NodeEventParamsSchema);
36
+ export const validatePushTestParams = ajv.compile(PushTestParamsSchema);
36
37
  export const validateSessionsListParams = ajv.compile(SessionsListParamsSchema);
37
38
  export const validateSessionsPreviewParams = ajv.compile(SessionsPreviewParamsSchema);
38
39
  export const validateSessionsResolveParams = ajv.compile(SessionsResolveParamsSchema);
@@ -69,6 +70,7 @@ export const validateCronRunsParams = ajv.compile(CronRunsParamsSchema);
69
70
  export const validateDevicePairListParams = ajv.compile(DevicePairListParamsSchema);
70
71
  export const validateDevicePairApproveParams = ajv.compile(DevicePairApproveParamsSchema);
71
72
  export const validateDevicePairRejectParams = ajv.compile(DevicePairRejectParamsSchema);
73
+ export const validateDevicePairRemoveParams = ajv.compile(DevicePairRemoveParamsSchema);
72
74
  export const validateDeviceTokenRotateParams = ajv.compile(DeviceTokenRotateParamsSchema);
73
75
  export const validateDeviceTokenRevokeParams = ajv.compile(DeviceTokenRevokeParamsSchema);
74
76
  export const validateExecApprovalsGetParams = ajv.compile(ExecApprovalsGetParamsSchema);
@@ -84,7 +86,6 @@ export const validateChatAbortParams = ajv.compile(ChatAbortParamsSchema);
84
86
  export const validateChatInjectParams = ajv.compile(ChatInjectParamsSchema);
85
87
  export const validateChatEvent = ajv.compile(ChatEventSchema);
86
88
  export const validateUpdateRunParams = ajv.compile(UpdateRunParamsSchema);
87
- export const validatePushTestParams = ajv.compile(PushTestParamsSchema);
88
89
  export const validateWebLoginStartParams = ajv.compile(WebLoginStartParamsSchema);
89
90
  export const validateWebLoginWaitParams = ajv.compile(WebLoginWaitParamsSchema);
90
91
  export function formatValidationErrors(errors) {
@@ -116,4 +117,4 @@ export function formatValidationErrors(errors) {
116
117
  }
117
118
  return unique.join("; ");
118
119
  }
119
- export { ConnectParamsSchema, HelloOkSchema, RequestFrameSchema, ResponseFrameSchema, EventFrameSchema, GatewayFrameSchema, PresenceEntrySchema, SnapshotSchema, ErrorShapeSchema, StateVersionSchema, AgentEventSchema, ChatEventSchema, SendParamsSchema, PollParamsSchema, AgentParamsSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, WakeParamsSchema, NodePairRequestParamsSchema, NodePairListParamsSchema, NodePairApproveParamsSchema, NodePairRejectParamsSchema, NodePairVerifyParamsSchema, NodeListParamsSchema, NodeInvokeParamsSchema, SessionsListParamsSchema, SessionsPreviewParamsSchema, SessionsPatchParamsSchema, SessionsResetParamsSchema, SessionsDeleteParamsSchema, SessionsCompactParamsSchema, SessionsUsageParamsSchema, ConfigGetParamsSchema, ConfigSetParamsSchema, ConfigApplyParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, WizardStartParamsSchema, WizardNextParamsSchema, WizardCancelParamsSchema, WizardStatusParamsSchema, WizardStepSchema, WizardNextResultSchema, WizardStartResultSchema, WizardStatusResultSchema, TalkConfigParamsSchema, TalkConfigResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChannelsLogoutParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, AgentSummarySchema, AgentsFileEntrySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema, AgentsUpdateParamsSchema, AgentsUpdateResultSchema, AgentsDeleteParamsSchema, AgentsDeleteResultSchema, AgentsFilesListParamsSchema, AgentsFilesListResultSchema, AgentsFilesGetParamsSchema, AgentsFilesGetResultSchema, AgentsFilesSetParamsSchema, AgentsFilesSetResultSchema, AgentsListParamsSchema, AgentsListResultSchema, ModelsListParamsSchema, SkillsStatusParamsSchema, SkillsInstallParamsSchema, SkillsUpdateParamsSchema, CronJobSchema, CronListParamsSchema, CronStatusParamsSchema, CronAddParamsSchema, CronUpdateParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, LogsTailParamsSchema, LogsTailResultSchema, ChatHistoryParamsSchema, ChatSendParamsSchema, ChatInjectParamsSchema, UpdateRunParamsSchema, PushTestParamsSchema, TickEventSchema, ShutdownEventSchema, ProtocolSchemas, PROTOCOL_VERSION, ErrorCodes, errorShape, };
120
+ export { ConnectParamsSchema, HelloOkSchema, RequestFrameSchema, ResponseFrameSchema, EventFrameSchema, GatewayFrameSchema, PresenceEntrySchema, SnapshotSchema, ErrorShapeSchema, StateVersionSchema, AgentEventSchema, ChatEventSchema, SendParamsSchema, PollParamsSchema, AgentParamsSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, WakeParamsSchema, PushTestParamsSchema, PushTestResultSchema, NodePairRequestParamsSchema, NodePairListParamsSchema, NodePairApproveParamsSchema, NodePairRejectParamsSchema, NodePairVerifyParamsSchema, NodeListParamsSchema, NodeInvokeParamsSchema, SessionsListParamsSchema, SessionsPreviewParamsSchema, SessionsPatchParamsSchema, SessionsResetParamsSchema, SessionsDeleteParamsSchema, SessionsCompactParamsSchema, SessionsUsageParamsSchema, ConfigGetParamsSchema, ConfigSetParamsSchema, ConfigApplyParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, WizardStartParamsSchema, WizardNextParamsSchema, WizardCancelParamsSchema, WizardStatusParamsSchema, WizardStepSchema, WizardNextResultSchema, WizardStartResultSchema, WizardStatusResultSchema, TalkConfigParamsSchema, TalkConfigResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChannelsLogoutParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, AgentSummarySchema, AgentsFileEntrySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema, AgentsUpdateParamsSchema, AgentsUpdateResultSchema, AgentsDeleteParamsSchema, AgentsDeleteResultSchema, AgentsFilesListParamsSchema, AgentsFilesListResultSchema, AgentsFilesGetParamsSchema, AgentsFilesGetResultSchema, AgentsFilesSetParamsSchema, AgentsFilesSetResultSchema, AgentsListParamsSchema, AgentsListResultSchema, ModelsListParamsSchema, SkillsStatusParamsSchema, SkillsInstallParamsSchema, SkillsUpdateParamsSchema, CronJobSchema, CronListParamsSchema, CronStatusParamsSchema, CronAddParamsSchema, CronUpdateParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, LogsTailParamsSchema, LogsTailResultSchema, ChatHistoryParamsSchema, ChatSendParamsSchema, ChatInjectParamsSchema, UpdateRunParamsSchema, TickEventSchema, ShutdownEventSchema, ProtocolSchemas, PROTOCOL_VERSION, ErrorCodes, errorShape, };
@@ -82,6 +82,7 @@ export const CronJobStateSchema = Type.Object({
82
82
  lastError: Type.Optional(Type.String()),
83
83
  lastDurationMs: Type.Optional(Type.Integer({ minimum: 0 })),
84
84
  consecutiveErrors: Type.Optional(Type.Integer({ minimum: 0 })),
85
+ lastDelivered: Type.Optional(Type.Boolean()),
85
86
  }, { additionalProperties: false });
86
87
  export const CronJobSchema = Type.Object({
87
88
  id: NonEmptyString,
@@ -3,6 +3,7 @@ import { NonEmptyString } from "./primitives.js";
3
3
  export const DevicePairListParamsSchema = Type.Object({}, { additionalProperties: false });
4
4
  export const DevicePairApproveParamsSchema = Type.Object({ requestId: NonEmptyString }, { additionalProperties: false });
5
5
  export const DevicePairRejectParamsSchema = Type.Object({ requestId: NonEmptyString }, { additionalProperties: false });
6
+ export const DevicePairRemoveParamsSchema = Type.Object({ deviceId: NonEmptyString }, { additionalProperties: false });
6
7
  export const DeviceTokenRotateParamsSchema = Type.Object({
7
8
  deviceId: NonEmptyString,
8
9
  role: NonEmptyString,
@@ -3,7 +3,7 @@ import { AgentSummarySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema,
3
3
  import { ChannelsLogoutParamsSchema, TalkConfigParamsSchema, TalkConfigResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, TalkModeParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, } from "./channels.js";
4
4
  import { ConfigApplyParamsSchema, ConfigGetParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, ConfigSetParamsSchema, UpdateRunParamsSchema, } from "./config.js";
5
5
  import { CronAddParamsSchema, CronJobSchema, CronListParamsSchema, CronRemoveParamsSchema, CronRunLogEntrySchema, CronRunParamsSchema, CronRunsParamsSchema, CronStatusParamsSchema, CronUpdateParamsSchema, } from "./cron.js";
6
- import { DevicePairApproveParamsSchema, DevicePairListParamsSchema, DevicePairRejectParamsSchema, DevicePairRequestedEventSchema, DevicePairResolvedEventSchema, DeviceTokenRevokeParamsSchema, DeviceTokenRotateParamsSchema, } from "./devices.js";
6
+ import { DevicePairApproveParamsSchema, DevicePairListParamsSchema, DevicePairRejectParamsSchema, DevicePairRemoveParamsSchema, DevicePairRequestedEventSchema, DevicePairResolvedEventSchema, DeviceTokenRevokeParamsSchema, DeviceTokenRotateParamsSchema, } from "./devices.js";
7
7
  import { ExecApprovalsGetParamsSchema, ExecApprovalsNodeGetParamsSchema, ExecApprovalsNodeSetParamsSchema, ExecApprovalsSetParamsSchema, ExecApprovalsSnapshotSchema, ExecApprovalRequestParamsSchema, ExecApprovalResolveParamsSchema, } from "./exec-approvals.js";
8
8
  import { ConnectParamsSchema, ErrorShapeSchema, EventFrameSchema, GatewayFrameSchema, HelloOkSchema, RequestFrameSchema, ResponseFrameSchema, ShutdownEventSchema, TickEventSchema, } from "./frames.js";
9
9
  import { ChatAbortParamsSchema, ChatEventSchema, ChatHistoryParamsSchema, ChatInjectParamsSchema, ChatSendParamsSchema, LogsTailParamsSchema, LogsTailResultSchema, } from "./logs-chat.js";
@@ -118,6 +118,7 @@ export const ProtocolSchemas = {
118
118
  DevicePairListParams: DevicePairListParamsSchema,
119
119
  DevicePairApproveParams: DevicePairApproveParamsSchema,
120
120
  DevicePairRejectParams: DevicePairRejectParamsSchema,
121
+ DevicePairRemoveParams: DevicePairRemoveParamsSchema,
121
122
  DeviceTokenRotateParams: DeviceTokenRotateParamsSchema,
122
123
  DeviceTokenRevokeParams: DeviceTokenRevokeParamsSchema,
123
124
  DevicePairRequestedEvent: DevicePairRequestedEventSchema,
@@ -66,6 +66,8 @@ export const SessionsResetParamsSchema = Type.Object({
66
66
  export const SessionsDeleteParamsSchema = Type.Object({
67
67
  key: NonEmptyString,
68
68
  deleteTranscript: Type.Optional(Type.Boolean()),
69
+ // Internal control: when false, still unbind thread bindings but skip hook emission.
70
+ emitLifecycleHooks: Type.Optional(Type.Boolean()),
69
71
  }, { additionalProperties: false });
70
72
  export const SessionsCompactParamsSchema = Type.Object({
71
73
  key: NonEmptyString,
@@ -78,6 +80,10 @@ export const SessionsUsageParamsSchema = Type.Object({
78
80
  startDate: Type.Optional(Type.String({ pattern: "^\\d{4}-\\d{2}-\\d{2}$" })),
79
81
  /** End date for range filter (YYYY-MM-DD). */
80
82
  endDate: Type.Optional(Type.String({ pattern: "^\\d{4}-\\d{2}-\\d{2}$" })),
83
+ /** How start/end dates should be interpreted. Defaults to UTC when omitted. */
84
+ mode: Type.Optional(Type.Union([Type.Literal("utc"), Type.Literal("gateway"), Type.Literal("specific")])),
85
+ /** UTC offset to use when mode is `specific` (for example, UTC-4 or UTC+5:30). */
86
+ utcOffset: Type.Optional(Type.String({ pattern: "^UTC[+-]\\d{1,2}(?::[0-5]\\d)?$" })),
81
87
  /** Maximum sessions to return (default 50). */
82
88
  limit: Type.Optional(Type.Integer({ minimum: 1 })),
83
89
  /** Include context weight breakdown (systemPromptReport). */