@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
@@ -0,0 +1,126 @@
1
+ import { classifyPortListener, formatPortDiagnostics, inspectPortUsage, } from "../../infra/ports.js";
2
+ import { sleep } from "../../utils.js";
3
+ export const DEFAULT_RESTART_HEALTH_ATTEMPTS = 8;
4
+ export const DEFAULT_RESTART_HEALTH_DELAY_MS = 450;
5
+ export async function inspectGatewayRestart(params) {
6
+ const env = params.env ?? process.env;
7
+ let runtime = { status: "unknown" };
8
+ try {
9
+ runtime = await params.service.readRuntime(env);
10
+ }
11
+ catch (err) {
12
+ runtime = { status: "unknown", detail: String(err) };
13
+ }
14
+ let portUsage;
15
+ try {
16
+ portUsage = await inspectPortUsage(params.port);
17
+ }
18
+ catch (err) {
19
+ portUsage = {
20
+ port: params.port,
21
+ status: "unknown",
22
+ listeners: [],
23
+ hints: [],
24
+ errors: [String(err)],
25
+ };
26
+ }
27
+ const gatewayListeners = portUsage.status === "busy"
28
+ ? portUsage.listeners.filter((listener) => classifyPortListener(listener, params.port) === "gateway")
29
+ : [];
30
+ const running = runtime.status === "running";
31
+ const ownsPort = runtime.pid != null
32
+ ? portUsage.listeners.some((listener) => listener.pid === runtime.pid)
33
+ : gatewayListeners.length > 0 ||
34
+ (portUsage.status === "busy" && portUsage.listeners.length === 0);
35
+ const healthy = running && ownsPort;
36
+ const staleGatewayPids = Array.from(new Set(gatewayListeners
37
+ .map((listener) => listener.pid)
38
+ .filter((pid) => Number.isFinite(pid))
39
+ .filter((pid) => runtime.pid == null || pid !== runtime.pid || !running)));
40
+ return {
41
+ runtime,
42
+ portUsage,
43
+ healthy,
44
+ staleGatewayPids,
45
+ };
46
+ }
47
+ export async function waitForGatewayHealthyRestart(params) {
48
+ const attempts = params.attempts ?? DEFAULT_RESTART_HEALTH_ATTEMPTS;
49
+ const delayMs = params.delayMs ?? DEFAULT_RESTART_HEALTH_DELAY_MS;
50
+ let snapshot = await inspectGatewayRestart({
51
+ service: params.service,
52
+ port: params.port,
53
+ env: params.env,
54
+ });
55
+ for (let attempt = 0; attempt < attempts; attempt += 1) {
56
+ if (snapshot.healthy) {
57
+ return snapshot;
58
+ }
59
+ if (snapshot.staleGatewayPids.length > 0 && snapshot.runtime.status !== "running") {
60
+ return snapshot;
61
+ }
62
+ await sleep(delayMs);
63
+ snapshot = await inspectGatewayRestart({
64
+ service: params.service,
65
+ port: params.port,
66
+ env: params.env,
67
+ });
68
+ }
69
+ return snapshot;
70
+ }
71
+ export function renderRestartDiagnostics(snapshot) {
72
+ const lines = [];
73
+ const runtimeSummary = [
74
+ snapshot.runtime.status ? `status=${snapshot.runtime.status}` : null,
75
+ snapshot.runtime.state ? `state=${snapshot.runtime.state}` : null,
76
+ snapshot.runtime.pid != null ? `pid=${snapshot.runtime.pid}` : null,
77
+ snapshot.runtime.lastExitStatus != null ? `lastExit=${snapshot.runtime.lastExitStatus}` : null,
78
+ ]
79
+ .filter(Boolean)
80
+ .join(", ");
81
+ if (runtimeSummary) {
82
+ lines.push(`Service runtime: ${runtimeSummary}`);
83
+ }
84
+ if (snapshot.portUsage.status === "busy") {
85
+ lines.push(...formatPortDiagnostics(snapshot.portUsage));
86
+ }
87
+ else {
88
+ lines.push(`Gateway port ${snapshot.portUsage.port} status: ${snapshot.portUsage.status}.`);
89
+ }
90
+ if (snapshot.portUsage.errors?.length) {
91
+ lines.push(`Port diagnostics errors: ${snapshot.portUsage.errors.join("; ")}`);
92
+ }
93
+ return lines;
94
+ }
95
+ export async function terminateStaleGatewayPids(pids) {
96
+ const killed = [];
97
+ for (const pid of pids) {
98
+ try {
99
+ process.kill(pid, "SIGTERM");
100
+ killed.push(pid);
101
+ }
102
+ catch (err) {
103
+ const code = err?.code;
104
+ if (code !== "ESRCH") {
105
+ throw err;
106
+ }
107
+ }
108
+ }
109
+ if (killed.length === 0) {
110
+ return killed;
111
+ }
112
+ await sleep(400);
113
+ for (const pid of killed) {
114
+ try {
115
+ process.kill(pid, 0);
116
+ process.kill(pid, "SIGKILL");
117
+ }
118
+ catch (err) {
119
+ const code = err?.code;
120
+ if (code !== "ESRCH") {
121
+ throw err;
122
+ }
123
+ }
124
+ }
125
+ return killed;
126
+ }
@@ -1,19 +1,20 @@
1
1
  import { createConfigIO, resolveConfigPath, resolveGatewayPort, resolveStateDir, } from "../../config/config.js";
2
2
  import { readLastGatewayErrorLine } from "../../daemon/diagnostics.js";
3
3
  import { findExtraGatewayServices } from "../../daemon/inspect.js";
4
- import { findLegacyGatewayServices } from "../../daemon/legacy.js";
5
- import { resolveGatewayService } from "../../daemon/service.js";
6
4
  import { auditGatewayServiceConfig } from "../../daemon/service-audit.js";
5
+ import { resolveGatewayService } from "../../daemon/service.js";
7
6
  import { resolveGatewayBindHost } from "../../gateway/net.js";
8
7
  import { formatPortDiagnostics, inspectPortUsage, } from "../../infra/ports.js";
9
8
  import { pickPrimaryTailnetIPv4 } from "../../infra/tailnet.js";
10
9
  import { probeGatewayStatus } from "./probe.js";
11
10
  import { normalizeListenerAddress, parsePortFromArgs, pickProbeHostForBind } from "./shared.js";
12
11
  function shouldReportPortUsage(status, rpcOk) {
13
- if (status !== "busy")
12
+ if (status !== "busy") {
14
13
  return false;
15
- if (rpcOk === true)
14
+ }
15
+ if (rpcOk === true) {
16
16
  return false;
17
+ }
17
18
  return true;
18
19
  }
19
20
  export async function gatherDaemonStatus(opts) {
@@ -73,7 +74,7 @@ export async function gatherDaemonStatus(opts) {
73
74
  const probeUrlOverride = typeof opts.rpc.url === "string" && opts.rpc.url.trim().length > 0 ? opts.rpc.url.trim() : null;
74
75
  const probeUrl = probeUrlOverride ?? `ws://${probeHost}:${daemonPort}`;
75
76
  const probeNote = !probeUrlOverride && bindMode === "lan"
76
- ? "Local probe uses loopback (127.0.0.1). bind=lan listens on 0.0.0.0 (all interfaces); use a LAN IP for remote clients."
77
+ ? `bind=lan listens on 0.0.0.0 (all interfaces); probing via ${probeHost}.`
77
78
  : !probeUrlOverride && bindMode === "loopback"
78
79
  ? "Loopback-only gateway; only local clients can connect."
79
80
  : undefined;
@@ -98,20 +99,15 @@ export async function gatherDaemonStatus(opts) {
98
99
  hints: portCliDiagnostics.hints,
99
100
  }
100
101
  : undefined;
101
- const legacyServices = await findLegacyGatewayServices(process.env).catch(() => []);
102
102
  const extraServices = await findExtraGatewayServices(process.env, { deep: Boolean(opts.deep) }).catch(() => []);
103
103
  const timeoutMsRaw = Number.parseInt(String(opts.rpc.timeout ?? "10000"), 10);
104
104
  const timeoutMs = Number.isFinite(timeoutMsRaw) && timeoutMsRaw > 0 ? timeoutMsRaw : 10_000;
105
105
  const rpc = opts.probe
106
106
  ? await probeGatewayStatus({
107
107
  url: probeUrl,
108
- token: opts.rpc.token ||
109
- mergedDaemonEnv.POOLBOT_GATEWAY_TOKEN ||
110
- mergedDaemonEnv.CLAWDBOT_GATEWAY_TOKEN ||
111
- daemonCfg.gateway?.auth?.token,
108
+ token: opts.rpc.token || mergedDaemonEnv.POOLBOT_GATEWAY_TOKEN || daemonCfg.gateway?.auth?.token,
112
109
  password: opts.rpc.password ||
113
110
  mergedDaemonEnv.POOLBOT_GATEWAY_PASSWORD ||
114
- mergedDaemonEnv.CLAWDBOT_GATEWAY_PASSWORD ||
115
111
  daemonCfg.gateway?.auth?.password,
116
112
  timeoutMs,
117
113
  json: opts.rpc.json,
@@ -150,13 +146,13 @@ export async function gatherDaemonStatus(opts) {
150
146
  ...(portCliStatus ? { portCli: portCliStatus } : {}),
151
147
  lastError,
152
148
  ...(rpc ? { rpc: { ...rpc, url: probeUrl } } : {}),
153
- legacyServices,
154
149
  extraServices,
155
150
  };
156
151
  }
157
152
  export function renderPortDiagnosticsForCli(status, rpcOk) {
158
- if (!status.port || !shouldReportPortUsage(status.port.status, rpcOk))
153
+ if (!status.port || !shouldReportPortUsage(status.port.status, rpcOk)) {
159
154
  return [];
155
+ }
160
156
  return formatPortDiagnostics({
161
157
  port: status.port.port,
162
158
  status: status.port.status,
@@ -42,7 +42,7 @@ export function printDaemonStatus(status, opts) {
42
42
  const warnText = (value) => colorize(rich, theme.warn, value);
43
43
  const errorText = (value) => colorize(rich, theme.error, value);
44
44
  const spacer = () => defaultRuntime.log("");
45
- const { service, rpc, legacyServices, extraServices } = status;
45
+ const { service, rpc, extraServices } = status;
46
46
  const serviceStatus = service.loaded
47
47
  ? okText(service.loadedText)
48
48
  : warnText(service.notLoadedText);
@@ -213,14 +213,6 @@ export function printDaemonStatus(status, opts) {
213
213
  }
214
214
  spacer();
215
215
  }
216
- if (legacyServices.length > 0) {
217
- defaultRuntime.error(errorText("Legacy gateway services detected:"));
218
- for (const svc of legacyServices) {
219
- defaultRuntime.error(`- ${errorText(svc.label)} (${svc.detail})`);
220
- }
221
- defaultRuntime.error(errorText(`Cleanup: ${formatCliCommand("poolbot doctor")}`));
222
- spacer();
223
- }
224
216
  if (extraServices.length > 0) {
225
217
  defaultRuntime.error(errorText("Other gateway-like services detected (best effort):"));
226
218
  for (const svc of extraServices) {
@@ -231,7 +223,7 @@ export function printDaemonStatus(status, opts) {
231
223
  }
232
224
  spacer();
233
225
  }
234
- if (legacyServices.length > 0 || extraServices.length > 0) {
226
+ if (extraServices.length > 0) {
235
227
  defaultRuntime.error(errorText("Recommendation: run a single gateway per machine for most setups. One gateway supports multiple agents (see docs: /gateway#multiple-gateways-same-host)."));
236
228
  defaultRuntime.error(errorText("If you need multiple gateways (e.g., a rescue bot on the same host), isolate ports + config/state (see docs: /gateway#multiple-gateways-same-host)."));
237
229
  spacer();
package/dist/cli/deps.js CHANGED
@@ -1,28 +1,33 @@
1
- import { logWebSelfId, sendMessageWhatsApp } from "../channels/web/index.js";
2
- import { sendMessageDiscord } from "../discord/send.js";
3
- import { sendMessageIMessage } from "../imessage/send.js";
4
- import { sendMessageSignal } from "../signal/send.js";
5
- import { sendMessageSlack } from "../slack/send.js";
6
- import { sendMessageTelegram } from "../telegram/send.js";
1
+ import { createOutboundSendDepsFromCliSource } from "./outbound-send-mapping.js";
7
2
  export function createDefaultDeps() {
8
3
  return {
9
- sendMessageWhatsApp,
10
- sendMessageTelegram,
11
- sendMessageDiscord,
12
- sendMessageSlack,
13
- sendMessageSignal,
14
- sendMessageIMessage,
4
+ sendMessageWhatsApp: async (...args) => {
5
+ const { sendMessageWhatsApp } = await import("../channels/web/index.js");
6
+ return await sendMessageWhatsApp(...args);
7
+ },
8
+ sendMessageTelegram: async (...args) => {
9
+ const { sendMessageTelegram } = await import("../telegram/send.js");
10
+ return await sendMessageTelegram(...args);
11
+ },
12
+ sendMessageDiscord: async (...args) => {
13
+ const { sendMessageDiscord } = await import("../discord/send.js");
14
+ return await sendMessageDiscord(...args);
15
+ },
16
+ sendMessageSlack: async (...args) => {
17
+ const { sendMessageSlack } = await import("../slack/send.js");
18
+ return await sendMessageSlack(...args);
19
+ },
20
+ sendMessageSignal: async (...args) => {
21
+ const { sendMessageSignal } = await import("../signal/send.js");
22
+ return await sendMessageSignal(...args);
23
+ },
24
+ sendMessageIMessage: async (...args) => {
25
+ const { sendMessageIMessage } = await import("../imessage/send.js");
26
+ return await sendMessageIMessage(...args);
27
+ },
15
28
  };
16
29
  }
17
- // Provider docking: extend this mapping when adding new outbound send deps.
18
30
  export function createOutboundSendDeps(deps) {
19
- return {
20
- sendWhatsApp: deps.sendMessageWhatsApp,
21
- sendTelegram: deps.sendMessageTelegram,
22
- sendDiscord: deps.sendMessageDiscord,
23
- sendSlack: deps.sendMessageSlack,
24
- sendSignal: deps.sendMessageSignal,
25
- sendIMessage: deps.sendMessageIMessage,
26
- };
31
+ return createOutboundSendDepsFromCliSource(deps);
27
32
  }
28
- export { logWebSelfId };
33
+ export { logWebSelfId } from "../web/auth-store.js";
@@ -1,26 +1,14 @@
1
1
  import fs from "node:fs/promises";
2
2
  import JSON5 from "json5";
3
3
  import { readExecApprovalsSnapshot, saveExecApprovals, } from "../infra/exec-approvals.js";
4
+ import { formatTimeAgo } from "../infra/format-time/format-relative.js";
4
5
  import { defaultRuntime } from "../runtime.js";
5
6
  import { formatDocsLink } from "../terminal/links.js";
6
- import { isRich, theme } from "../terminal/theme.js";
7
7
  import { renderTable } from "../terminal/table.js";
8
- import { callGatewayFromCli } from "./gateway-rpc.js";
8
+ import { isRich, theme } from "../terminal/theme.js";
9
9
  import { describeUnknownError } from "./gateway-cli/shared.js";
10
+ import { callGatewayFromCli } from "./gateway-rpc.js";
10
11
  import { nodesCallOpts, resolveNodeId } from "./nodes-cli/rpc.js";
11
- function formatAge(msAgo) {
12
- const s = Math.max(0, Math.floor(msAgo / 1000));
13
- if (s < 60)
14
- return `${s}s`;
15
- const m = Math.floor(s / 60);
16
- if (m < 60)
17
- return `${m}m`;
18
- const h = Math.floor(m / 60);
19
- if (h < 24)
20
- return `${h}h`;
21
- const d = Math.floor(h / 24);
22
- return `${d}d`;
23
- }
24
12
  async function readStdin() {
25
13
  const chunks = [];
26
14
  for await (const chunk of process.stdin) {
@@ -29,11 +17,13 @@ async function readStdin() {
29
17
  return Buffer.concat(chunks).toString("utf8");
30
18
  }
31
19
  async function resolveTargetNodeId(opts) {
32
- if (opts.gateway)
20
+ if (opts.gateway) {
33
21
  return null;
22
+ }
34
23
  const raw = opts.node?.trim() ?? "";
35
- if (!raw)
24
+ if (!raw) {
36
25
  return null;
26
+ }
37
27
  return await resolveNodeId(opts, raw);
38
28
  }
39
29
  async function loadSnapshot(opts, nodeId) {
@@ -63,6 +53,41 @@ async function loadSnapshotTarget(opts) {
63
53
  const snapshot = await loadSnapshot(opts, nodeId);
64
54
  return { snapshot, nodeId, source: nodeId ? "node" : "gateway" };
65
55
  }
56
+ function exitWithError(message) {
57
+ defaultRuntime.error(message);
58
+ defaultRuntime.exit(1);
59
+ throw new Error(message);
60
+ }
61
+ function requireTrimmedNonEmpty(value, message) {
62
+ const trimmed = value.trim();
63
+ if (!trimmed) {
64
+ exitWithError(message);
65
+ }
66
+ return trimmed;
67
+ }
68
+ async function loadWritableSnapshotTarget(opts) {
69
+ const { snapshot, nodeId, source } = await loadSnapshotTarget(opts);
70
+ if (source === "local") {
71
+ defaultRuntime.log(theme.muted("Writing local approvals."));
72
+ }
73
+ const targetLabel = source === "local" ? "local" : nodeId ? `node:${nodeId}` : "gateway";
74
+ const baseHash = snapshot.hash;
75
+ if (!baseHash) {
76
+ exitWithError("Exec approvals hash missing; reload and retry.");
77
+ }
78
+ return { snapshot, nodeId, source, targetLabel, baseHash };
79
+ }
80
+ async function saveSnapshotTargeted(params) {
81
+ const next = params.source === "local"
82
+ ? saveSnapshotLocal(params.file)
83
+ : await saveSnapshot(params.opts, params.nodeId, params.file, params.baseHash);
84
+ if (params.opts.json) {
85
+ defaultRuntime.log(JSON.stringify(next));
86
+ return;
87
+ }
88
+ defaultRuntime.log(theme.muted(`Target: ${params.targetLabel}`));
89
+ renderApprovalsSnapshot(next, params.targetLabel);
90
+ }
66
91
  function formatCliError(err) {
67
92
  const msg = describeUnknownError(err);
68
93
  return msg.includes("\n") ? msg.split("\n")[0] : msg;
@@ -89,14 +114,15 @@ function renderApprovalsSnapshot(snapshot, targetLabel) {
89
114
  const allowlist = Array.isArray(agent.allowlist) ? agent.allowlist : [];
90
115
  for (const entry of allowlist) {
91
116
  const pattern = entry?.pattern?.trim() ?? "";
92
- if (!pattern)
117
+ if (!pattern) {
93
118
  continue;
119
+ }
94
120
  const lastUsedAt = typeof entry.lastUsedAt === "number" ? entry.lastUsedAt : null;
95
121
  allowlistRows.push({
96
122
  Target: targetLabel,
97
123
  Agent: agentId,
98
124
  Pattern: pattern,
99
- LastUsed: lastUsedAt ? `${formatAge(Math.max(0, now - lastUsedAt))} ago` : muted("unknown"),
125
+ LastUsed: lastUsedAt ? formatTimeAgo(Math.max(0, now - lastUsedAt)) : muted("unknown"),
100
126
  });
101
127
  }
102
128
  }
@@ -166,6 +192,37 @@ function isEmptyAgent(agent) {
166
192
  agent.autoAllowSkills === undefined &&
167
193
  allowlist.length === 0);
168
194
  }
195
+ async function loadWritableAllowlistAgent(opts) {
196
+ const { snapshot, nodeId, source, targetLabel, baseHash } = await loadWritableSnapshotTarget(opts);
197
+ const file = snapshot.file ?? { version: 1 };
198
+ file.version = 1;
199
+ const agentKey = resolveAgentKey(opts.agent);
200
+ const agent = ensureAgent(file, agentKey);
201
+ const allowlistEntries = Array.isArray(agent.allowlist) ? agent.allowlist : [];
202
+ return { nodeId, source, targetLabel, baseHash, file, agentKey, agent, allowlistEntries };
203
+ }
204
+ async function runAllowlistMutation(pattern, opts, mutate) {
205
+ try {
206
+ const trimmedPattern = requireTrimmedNonEmpty(pattern, "Pattern required.");
207
+ const context = await loadWritableAllowlistAgent(opts);
208
+ const shouldSave = await mutate({ ...context, trimmedPattern });
209
+ if (!shouldSave) {
210
+ return;
211
+ }
212
+ await saveSnapshotTargeted({
213
+ opts,
214
+ source: context.source,
215
+ nodeId: context.nodeId,
216
+ file: context.file,
217
+ baseHash: context.baseHash,
218
+ targetLabel: context.targetLabel,
219
+ });
220
+ }
221
+ catch (err) {
222
+ defaultRuntime.error(formatCliError(err));
223
+ defaultRuntime.exit(1);
224
+ }
225
+ }
169
226
  export function registerExecApprovalsCli(program) {
170
227
  const formatExample = (cmd, desc) => ` ${theme.command(cmd)}\n ${theme.muted(desc)}`;
171
228
  const approvals = program
@@ -209,45 +266,22 @@ export function registerExecApprovalsCli(program) {
209
266
  .action(async (opts) => {
210
267
  try {
211
268
  if (!opts.file && !opts.stdin) {
212
- defaultRuntime.error("Provide --file or --stdin.");
213
- defaultRuntime.exit(1);
214
- return;
269
+ exitWithError("Provide --file or --stdin.");
215
270
  }
216
271
  if (opts.file && opts.stdin) {
217
- defaultRuntime.error("Use either --file or --stdin (not both).");
218
- defaultRuntime.exit(1);
219
- return;
220
- }
221
- const { snapshot, nodeId, source } = await loadSnapshotTarget(opts);
222
- if (source === "local") {
223
- defaultRuntime.log(theme.muted("Writing local approvals."));
224
- }
225
- const targetLabel = source === "local" ? "local" : nodeId ? `node:${nodeId}` : "gateway";
226
- if (!snapshot.hash) {
227
- defaultRuntime.error("Exec approvals hash missing; reload and retry.");
228
- defaultRuntime.exit(1);
229
- return;
272
+ exitWithError("Use either --file or --stdin (not both).");
230
273
  }
274
+ const { source, nodeId, targetLabel, baseHash } = await loadWritableSnapshotTarget(opts);
231
275
  const raw = opts.stdin ? await readStdin() : await fs.readFile(String(opts.file), "utf8");
232
276
  let file;
233
277
  try {
234
278
  file = JSON5.parse(raw);
235
279
  }
236
280
  catch (err) {
237
- defaultRuntime.error(`Failed to parse approvals JSON: ${String(err)}`);
238
- defaultRuntime.exit(1);
239
- return;
281
+ exitWithError(`Failed to parse approvals JSON: ${String(err)}`);
240
282
  }
241
283
  file.version = 1;
242
- const next = source === "local"
243
- ? saveSnapshotLocal(file)
244
- : await saveSnapshot(opts, nodeId, file, snapshot.hash);
245
- if (opts.json) {
246
- defaultRuntime.log(JSON.stringify(next));
247
- return;
248
- }
249
- defaultRuntime.log(theme.muted(`Target: ${targetLabel}`));
250
- renderApprovalsSnapshot(next, targetLabel);
284
+ await saveSnapshotTargeted({ opts, source, nodeId, file, baseHash, targetLabel });
251
285
  }
252
286
  catch (err) {
253
287
  defaultRuntime.error(formatCliError(err));
@@ -266,49 +300,16 @@ export function registerExecApprovalsCli(program) {
266
300
  .option("--gateway", "Force gateway approvals", false)
267
301
  .option("--agent <id>", 'Agent id (defaults to "*")')
268
302
  .action(async (pattern, opts) => {
269
- try {
270
- const trimmed = pattern.trim();
271
- if (!trimmed) {
272
- defaultRuntime.error("Pattern required.");
273
- defaultRuntime.exit(1);
274
- return;
275
- }
276
- const { snapshot, nodeId, source } = await loadSnapshotTarget(opts);
277
- if (source === "local") {
278
- defaultRuntime.log(theme.muted("Writing local approvals."));
279
- }
280
- const targetLabel = source === "local" ? "local" : nodeId ? `node:${nodeId}` : "gateway";
281
- if (!snapshot.hash) {
282
- defaultRuntime.error("Exec approvals hash missing; reload and retry.");
283
- defaultRuntime.exit(1);
284
- return;
285
- }
286
- const file = snapshot.file ?? { version: 1 };
287
- file.version = 1;
288
- const agentKey = resolveAgentKey(opts.agent);
289
- const agent = ensureAgent(file, agentKey);
290
- const allowlistEntries = Array.isArray(agent.allowlist) ? agent.allowlist : [];
291
- if (allowlistEntries.some((entry) => normalizeAllowlistEntry(entry) === trimmed)) {
303
+ await runAllowlistMutation(pattern, opts, ({ trimmedPattern, file, agent, agentKey, allowlistEntries }) => {
304
+ if (allowlistEntries.some((entry) => normalizeAllowlistEntry(entry) === trimmedPattern)) {
292
305
  defaultRuntime.log("Already allowlisted.");
293
- return;
306
+ return false;
294
307
  }
295
- allowlistEntries.push({ pattern: trimmed, lastUsedAt: Date.now() });
308
+ allowlistEntries.push({ pattern: trimmedPattern, lastUsedAt: Date.now() });
296
309
  agent.allowlist = allowlistEntries;
297
310
  file.agents = { ...file.agents, [agentKey]: agent };
298
- const next = source === "local"
299
- ? saveSnapshotLocal(file)
300
- : await saveSnapshot(opts, nodeId, file, snapshot.hash);
301
- if (opts.json) {
302
- defaultRuntime.log(JSON.stringify(next));
303
- return;
304
- }
305
- defaultRuntime.log(theme.muted(`Target: ${targetLabel}`));
306
- renderApprovalsSnapshot(next, targetLabel);
307
- }
308
- catch (err) {
309
- defaultRuntime.error(formatCliError(err));
310
- defaultRuntime.exit(1);
311
- }
311
+ return true;
312
+ });
312
313
  });
313
314
  nodesCallOpts(allowlistAdd);
314
315
  const allowlistRemove = allowlist
@@ -318,32 +319,11 @@ export function registerExecApprovalsCli(program) {
318
319
  .option("--gateway", "Force gateway approvals", false)
319
320
  .option("--agent <id>", 'Agent id (defaults to "*")')
320
321
  .action(async (pattern, opts) => {
321
- try {
322
- const trimmed = pattern.trim();
323
- if (!trimmed) {
324
- defaultRuntime.error("Pattern required.");
325
- defaultRuntime.exit(1);
326
- return;
327
- }
328
- const { snapshot, nodeId, source } = await loadSnapshotTarget(opts);
329
- if (source === "local") {
330
- defaultRuntime.log(theme.muted("Writing local approvals."));
331
- }
332
- const targetLabel = source === "local" ? "local" : nodeId ? `node:${nodeId}` : "gateway";
333
- if (!snapshot.hash) {
334
- defaultRuntime.error("Exec approvals hash missing; reload and retry.");
335
- defaultRuntime.exit(1);
336
- return;
337
- }
338
- const file = snapshot.file ?? { version: 1 };
339
- file.version = 1;
340
- const agentKey = resolveAgentKey(opts.agent);
341
- const agent = ensureAgent(file, agentKey);
342
- const allowlistEntries = Array.isArray(agent.allowlist) ? agent.allowlist : [];
343
- const nextEntries = allowlistEntries.filter((entry) => normalizeAllowlistEntry(entry) !== trimmed);
322
+ await runAllowlistMutation(pattern, opts, ({ trimmedPattern, file, agent, agentKey, allowlistEntries }) => {
323
+ const nextEntries = allowlistEntries.filter((entry) => normalizeAllowlistEntry(entry) !== trimmedPattern);
344
324
  if (nextEntries.length === allowlistEntries.length) {
345
325
  defaultRuntime.log("Pattern not found.");
346
- return;
326
+ return false;
347
327
  }
348
328
  if (nextEntries.length === 0) {
349
329
  delete agent.allowlist;
@@ -359,20 +339,8 @@ export function registerExecApprovalsCli(program) {
359
339
  else {
360
340
  file.agents = { ...file.agents, [agentKey]: agent };
361
341
  }
362
- const next = source === "local"
363
- ? saveSnapshotLocal(file)
364
- : await saveSnapshot(opts, nodeId, file, snapshot.hash);
365
- if (opts.json) {
366
- defaultRuntime.log(JSON.stringify(next));
367
- return;
368
- }
369
- defaultRuntime.log(theme.muted(`Target: ${targetLabel}`));
370
- renderApprovalsSnapshot(next, targetLabel);
371
- }
372
- catch (err) {
373
- defaultRuntime.error(formatCliError(err));
374
- defaultRuntime.exit(1);
375
- }
342
+ return true;
343
+ });
376
344
  });
377
345
  nodesCallOpts(allowlistRemove);
378
346
  }
@@ -1,5 +1,6 @@
1
1
  import { acquireGatewayLock } from "../../infra/gateway-lock.js";
2
- import { consumeGatewaySigusr1RestartAuthorization, isGatewaySigusr1RestartExternallyAllowed, } from "../../infra/restart.js";
2
+ import { restartGatewayProcessWithFreshPid } from "../../infra/process-respawn.js";
3
+ import { consumeGatewaySigusr1RestartAuthorization, isGatewaySigusr1RestartExternallyAllowed, markGatewaySigusr1RestartHandled, } from "../../infra/restart.js";
3
4
  import { createSubsystemLogger } from "../../logging/subsystem.js";
4
5
  import { getActiveTaskCount, resetAllLanes, waitForActiveTasks, } from "../../process/command-queue.js";
5
6
  import { createRestartIterationHook } from "../../process/restart-recovery.js";
@@ -60,9 +61,25 @@ export async function runGatewayLoop(params) {
60
61
  clearTimeout(forceExitTimer);
61
62
  server = null;
62
63
  if (isRestart) {
63
- // In-process restart (no process-respawn in pool-bot).
64
- shuttingDown = false;
65
- restartResolver?.();
64
+ const respawn = restartGatewayProcessWithFreshPid();
65
+ if (respawn.mode === "spawned" || respawn.mode === "supervised") {
66
+ const modeLabel = respawn.mode === "spawned"
67
+ ? `spawned pid ${respawn.pid ?? "unknown"}`
68
+ : "supervisor restart";
69
+ gatewayLog.info(`restart mode: full process restart (${modeLabel})`);
70
+ cleanupSignals();
71
+ params.runtime.exit(0);
72
+ }
73
+ else {
74
+ if (respawn.mode === "failed") {
75
+ gatewayLog.warn(`full process restart failed (${respawn.detail ?? "unknown error"}); falling back to in-process restart`);
76
+ }
77
+ else {
78
+ gatewayLog.info("restart mode: in-process restart (POOLBOT_NO_RESPAWN)");
79
+ }
80
+ shuttingDown = false;
81
+ restartResolver?.();
82
+ }
66
83
  }
67
84
  else {
68
85
  cleanupSignals();
@@ -83,9 +100,10 @@ export async function runGatewayLoop(params) {
83
100
  gatewayLog.info("signal SIGUSR1 received");
84
101
  const authorized = consumeGatewaySigusr1RestartAuthorization();
85
102
  if (!authorized && !isGatewaySigusr1RestartExternallyAllowed()) {
86
- gatewayLog.warn("SIGUSR1 restart ignored (not authorized; enable commands.restart or use gateway tool).");
103
+ gatewayLog.warn("SIGUSR1 restart ignored (not authorized; commands.restart=false or use gateway tool).");
87
104
  return;
88
105
  }
106
+ markGatewaySigusr1RestartHandled();
89
107
  request("restart", "SIGUSR1");
90
108
  };
91
109
  process.on("SIGTERM", onSigterm);