@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
@@ -0,0 +1,297 @@
1
+ /**
2
+ * Channel-agnostic status reaction controller.
3
+ * Provides a unified interface for displaying agent status via message reactions.
4
+ */
5
+ // ─────────────────────────────────────────────────────────────────────────────
6
+ // Constants
7
+ // ─────────────────────────────────────────────────────────────────────────────
8
+ export const DEFAULT_EMOJIS = {
9
+ queued: "👀",
10
+ thinking: "🤔",
11
+ tool: "🔥",
12
+ coding: "👨‍💻",
13
+ web: "⚡",
14
+ done: "👍",
15
+ error: "😱",
16
+ stallSoft: "🥱",
17
+ stallHard: "😨",
18
+ };
19
+ export const DEFAULT_TIMING = {
20
+ debounceMs: 700,
21
+ stallSoftMs: 10_000,
22
+ stallHardMs: 30_000,
23
+ doneHoldMs: 1500,
24
+ errorHoldMs: 2500,
25
+ };
26
+ export const CODING_TOOL_TOKENS = [
27
+ "exec",
28
+ "process",
29
+ "read",
30
+ "write",
31
+ "edit",
32
+ "session_status",
33
+ "bash",
34
+ ];
35
+ export const WEB_TOOL_TOKENS = [
36
+ "web_search",
37
+ "web-search",
38
+ "web_fetch",
39
+ "web-fetch",
40
+ "browser",
41
+ ];
42
+ // ─────────────────────────────────────────────────────────────────────────────
43
+ // Functions
44
+ // ─────────────────────────────────────────────────────────────────────────────
45
+ /**
46
+ * Resolve the appropriate emoji for a tool invocation.
47
+ */
48
+ export function resolveToolEmoji(toolName, emojis) {
49
+ const normalized = toolName?.trim().toLowerCase() ?? "";
50
+ if (!normalized) {
51
+ return emojis.tool;
52
+ }
53
+ if (WEB_TOOL_TOKENS.some((token) => normalized.includes(token))) {
54
+ return emojis.web;
55
+ }
56
+ if (CODING_TOOL_TOKENS.some((token) => normalized.includes(token))) {
57
+ return emojis.coding;
58
+ }
59
+ return emojis.tool;
60
+ }
61
+ /**
62
+ * Create a status reaction controller.
63
+ *
64
+ * Features:
65
+ * - Promise chain serialization (prevents concurrent API calls)
66
+ * - Debouncing (intermediate states debounce, terminal states are immediate)
67
+ * - Stall timers (soft/hard warnings on inactivity)
68
+ * - Terminal state protection (done/error mark finished, subsequent updates ignored)
69
+ */
70
+ export function createStatusReactionController(params) {
71
+ const { enabled, adapter, initialEmoji, onError } = params;
72
+ // Merge user-provided overrides with defaults
73
+ const emojis = {
74
+ ...DEFAULT_EMOJIS,
75
+ queued: params.emojis?.queued ?? initialEmoji,
76
+ ...params.emojis,
77
+ };
78
+ const timing = {
79
+ ...DEFAULT_TIMING,
80
+ ...params.timing,
81
+ };
82
+ // State
83
+ let currentEmoji = "";
84
+ let pendingEmoji = "";
85
+ let debounceTimer = null;
86
+ let stallSoftTimer = null;
87
+ let stallHardTimer = null;
88
+ let finished = false;
89
+ let chainPromise = Promise.resolve();
90
+ // Known emojis for clear operation
91
+ const knownEmojis = new Set([
92
+ initialEmoji,
93
+ emojis.queued,
94
+ emojis.thinking,
95
+ emojis.tool,
96
+ emojis.coding,
97
+ emojis.web,
98
+ emojis.done,
99
+ emojis.error,
100
+ emojis.stallSoft,
101
+ emojis.stallHard,
102
+ ]);
103
+ /**
104
+ * Serialize async operations to prevent race conditions.
105
+ */
106
+ function enqueue(fn) {
107
+ chainPromise = chainPromise.then(fn, fn);
108
+ return chainPromise;
109
+ }
110
+ /**
111
+ * Clear all timers.
112
+ */
113
+ function clearAllTimers() {
114
+ if (debounceTimer) {
115
+ clearTimeout(debounceTimer);
116
+ debounceTimer = null;
117
+ }
118
+ if (stallSoftTimer) {
119
+ clearTimeout(stallSoftTimer);
120
+ stallSoftTimer = null;
121
+ }
122
+ if (stallHardTimer) {
123
+ clearTimeout(stallHardTimer);
124
+ stallHardTimer = null;
125
+ }
126
+ }
127
+ /**
128
+ * Clear debounce timer only (used during phase transitions).
129
+ */
130
+ function clearDebounceTimer() {
131
+ if (debounceTimer) {
132
+ clearTimeout(debounceTimer);
133
+ debounceTimer = null;
134
+ }
135
+ }
136
+ /**
137
+ * Reset stall timers (called on each phase change).
138
+ */
139
+ function resetStallTimers() {
140
+ if (stallSoftTimer) {
141
+ clearTimeout(stallSoftTimer);
142
+ }
143
+ if (stallHardTimer) {
144
+ clearTimeout(stallHardTimer);
145
+ }
146
+ stallSoftTimer = setTimeout(() => {
147
+ scheduleEmoji(emojis.stallSoft, { immediate: true, skipStallReset: true });
148
+ }, timing.stallSoftMs);
149
+ stallHardTimer = setTimeout(() => {
150
+ scheduleEmoji(emojis.stallHard, { immediate: true, skipStallReset: true });
151
+ }, timing.stallHardMs);
152
+ }
153
+ /**
154
+ * Apply an emoji: set new reaction and optionally remove old one.
155
+ */
156
+ async function applyEmoji(newEmoji) {
157
+ if (!enabled) {
158
+ return;
159
+ }
160
+ try {
161
+ const previousEmoji = currentEmoji;
162
+ await adapter.setReaction(newEmoji);
163
+ // If adapter supports removeReaction and there's a different previous emoji, remove it
164
+ if (adapter.removeReaction && previousEmoji && previousEmoji !== newEmoji) {
165
+ await adapter.removeReaction(previousEmoji);
166
+ }
167
+ currentEmoji = newEmoji;
168
+ }
169
+ catch (err) {
170
+ if (onError) {
171
+ onError(err);
172
+ }
173
+ }
174
+ }
175
+ /**
176
+ * Schedule an emoji change (debounced or immediate).
177
+ */
178
+ function scheduleEmoji(emoji, options = {}) {
179
+ if (!enabled || finished) {
180
+ return;
181
+ }
182
+ // Deduplicate: if already scheduled/current, skip send but keep stall timers fresh
183
+ if (emoji === currentEmoji || emoji === pendingEmoji) {
184
+ if (!options.skipStallReset) {
185
+ resetStallTimers();
186
+ }
187
+ return;
188
+ }
189
+ pendingEmoji = emoji;
190
+ clearDebounceTimer();
191
+ if (options.immediate) {
192
+ // Immediate execution for terminal states
193
+ void enqueue(async () => {
194
+ await applyEmoji(emoji);
195
+ pendingEmoji = "";
196
+ });
197
+ }
198
+ else {
199
+ // Debounced execution for intermediate states
200
+ debounceTimer = setTimeout(() => {
201
+ void enqueue(async () => {
202
+ await applyEmoji(emoji);
203
+ pendingEmoji = "";
204
+ });
205
+ }, timing.debounceMs);
206
+ }
207
+ // Reset stall timers on phase change (unless triggered by stall timer itself)
208
+ if (!options.skipStallReset) {
209
+ resetStallTimers();
210
+ }
211
+ }
212
+ // ───────────────────────────────────────────────────────────────────────────
213
+ // Controller API
214
+ // ───────────────────────────────────────────────────────────────────────────
215
+ function setQueued() {
216
+ scheduleEmoji(emojis.queued, { immediate: true });
217
+ }
218
+ function setThinking() {
219
+ scheduleEmoji(emojis.thinking);
220
+ }
221
+ function setTool(toolName) {
222
+ const emoji = resolveToolEmoji(toolName, emojis);
223
+ scheduleEmoji(emoji);
224
+ }
225
+ function setDone() {
226
+ if (!enabled) {
227
+ return Promise.resolve();
228
+ }
229
+ finished = true;
230
+ clearAllTimers();
231
+ // Directly enqueue to ensure we return the updated promise
232
+ return enqueue(async () => {
233
+ await applyEmoji(emojis.done);
234
+ pendingEmoji = "";
235
+ });
236
+ }
237
+ function setError() {
238
+ if (!enabled) {
239
+ return Promise.resolve();
240
+ }
241
+ finished = true;
242
+ clearAllTimers();
243
+ // Directly enqueue to ensure we return the updated promise
244
+ return enqueue(async () => {
245
+ await applyEmoji(emojis.error);
246
+ pendingEmoji = "";
247
+ });
248
+ }
249
+ async function clear() {
250
+ if (!enabled) {
251
+ return;
252
+ }
253
+ clearAllTimers();
254
+ finished = true;
255
+ await enqueue(async () => {
256
+ if (adapter.removeReaction) {
257
+ // Remove all known emojis (Discord-style)
258
+ const emojisToRemove = Array.from(knownEmojis);
259
+ for (const emoji of emojisToRemove) {
260
+ try {
261
+ await adapter.removeReaction(emoji);
262
+ }
263
+ catch (err) {
264
+ if (onError) {
265
+ onError(err);
266
+ }
267
+ }
268
+ }
269
+ }
270
+ else {
271
+ // For platforms without removeReaction, set empty or just skip
272
+ // (Telegram handles this atomically on the next setReaction)
273
+ }
274
+ currentEmoji = "";
275
+ pendingEmoji = "";
276
+ });
277
+ }
278
+ async function restoreInitial() {
279
+ if (!enabled) {
280
+ return;
281
+ }
282
+ clearAllTimers();
283
+ await enqueue(async () => {
284
+ await applyEmoji(initialEmoji);
285
+ pendingEmoji = "";
286
+ });
287
+ }
288
+ return {
289
+ setQueued,
290
+ setThinking,
291
+ setTool,
292
+ setDone,
293
+ setError,
294
+ clear,
295
+ restoreInitial,
296
+ };
297
+ }
@@ -25,7 +25,7 @@ export function formatCliBannerLine(version, options = {}) {
25
25
  const commitLabel = commit ?? "unknown";
26
26
  const tagline = pickTagline(options);
27
27
  const rich = options.richTty ?? isRich();
28
- const cliName = resolveCliName(options.argv ?? process.argv, options.env);
28
+ const cliName = resolveCliName(options.argv ?? process.argv);
29
29
  const title = cliName === "poolbot" ? "🎱 Pool Bot" : "🎱 Pool Bot";
30
30
  const prefix = "🎱 ";
31
31
  const columns = options.columns ?? process.stdout.columns ?? 120;
@@ -1,13 +1,55 @@
1
+ import { DEFAULT_UPLOAD_DIR, resolveExistingPathsWithinRoot } from "../../browser/paths.js";
1
2
  import { danger } from "../../globals.js";
2
3
  import { defaultRuntime } from "../../runtime.js";
4
+ import { shortenHomePath } from "../../utils.js";
3
5
  import { callBrowserRequest } from "../browser-cli-shared.js";
4
6
  import { resolveBrowserActionContext } from "./shared.js";
5
- import { shortenHomePath } from "../../utils.js";
7
+ async function normalizeUploadPaths(paths) {
8
+ const result = await resolveExistingPathsWithinRoot({
9
+ rootDir: DEFAULT_UPLOAD_DIR,
10
+ requestedPaths: paths,
11
+ scopeLabel: `uploads directory (${DEFAULT_UPLOAD_DIR})`,
12
+ });
13
+ if (!result.ok) {
14
+ throw new Error(result.error);
15
+ }
16
+ return result.paths;
17
+ }
6
18
  export function registerBrowserFilesAndDownloadsCommands(browser, parentOpts) {
19
+ const resolveTimeoutAndTarget = (opts) => {
20
+ const timeoutMs = Number.isFinite(opts.timeoutMs) ? Number(opts.timeoutMs) : undefined;
21
+ const targetId = typeof opts.targetId === "string" ? opts.targetId.trim() || undefined : undefined;
22
+ return { timeoutMs, targetId };
23
+ };
24
+ const runDownloadCommand = async (cmd, opts, request) => {
25
+ const { parent, profile } = resolveBrowserActionContext(cmd, parentOpts);
26
+ try {
27
+ const { timeoutMs, targetId } = resolveTimeoutAndTarget(opts);
28
+ const result = await callBrowserRequest(parent, {
29
+ method: "POST",
30
+ path: request.path,
31
+ query: profile ? { profile } : undefined,
32
+ body: {
33
+ ...request.body,
34
+ targetId,
35
+ timeoutMs,
36
+ },
37
+ }, { timeoutMs: timeoutMs ?? 20000 });
38
+ if (parent?.json) {
39
+ defaultRuntime.log(JSON.stringify(result, null, 2));
40
+ return;
41
+ }
42
+ defaultRuntime.log(`downloaded: ${shortenHomePath(result.download.path)}`);
43
+ }
44
+ catch (err) {
45
+ defaultRuntime.error(danger(String(err)));
46
+ defaultRuntime.exit(1);
47
+ }
48
+ };
7
49
  browser
8
50
  .command("upload")
9
51
  .description("Arm file upload for the next file chooser")
10
- .argument("<paths...>", "File paths to upload")
52
+ .argument("<paths...>", "File paths to upload (must be within Pool Bot temp uploads dir, e.g. /tmp/poolbot/uploads/file.pdf)")
11
53
  .option("--ref <ref>", "Ref id from snapshot to click after arming")
12
54
  .option("--input-ref <ref>", "Ref id for <input type=file> to set directly")
13
55
  .option("--element <selector>", "CSS selector for <input type=file>")
@@ -16,17 +58,18 @@ export function registerBrowserFilesAndDownloadsCommands(browser, parentOpts) {
16
58
  .action(async (paths, opts, cmd) => {
17
59
  const { parent, profile } = resolveBrowserActionContext(cmd, parentOpts);
18
60
  try {
19
- const timeoutMs = Number.isFinite(opts.timeoutMs) ? opts.timeoutMs : undefined;
61
+ const normalizedPaths = await normalizeUploadPaths(paths);
62
+ const { timeoutMs, targetId } = resolveTimeoutAndTarget(opts);
20
63
  const result = await callBrowserRequest(parent, {
21
64
  method: "POST",
22
65
  path: "/hooks/file-chooser",
23
66
  query: profile ? { profile } : undefined,
24
67
  body: {
25
- paths,
68
+ paths: normalizedPaths,
26
69
  ref: opts.ref?.trim() || undefined,
27
70
  inputRef: opts.inputRef?.trim() || undefined,
28
71
  element: opts.element?.trim() || undefined,
29
- targetId: opts.targetId?.trim() || undefined,
72
+ targetId,
30
73
  timeoutMs,
31
74
  },
32
75
  }, { timeoutMs: timeoutMs ?? 20000 });
@@ -44,66 +87,32 @@ export function registerBrowserFilesAndDownloadsCommands(browser, parentOpts) {
44
87
  browser
45
88
  .command("waitfordownload")
46
89
  .description("Wait for the next download (and save it)")
47
- .argument("[path]", "Save path (default: /tmp/poolbot/downloads/...)")
90
+ .argument("[path]", "Save path within poolbot temp downloads dir (default: /tmp/poolbot/downloads/...; fallback: os.tmpdir()/poolbot/downloads/...)")
48
91
  .option("--target-id <id>", "CDP target id (or unique prefix)")
49
92
  .option("--timeout-ms <ms>", "How long to wait for the next download (default: 120000)", (v) => Number(v))
50
93
  .action(async (outPath, opts, cmd) => {
51
- const { parent, profile } = resolveBrowserActionContext(cmd, parentOpts);
52
- try {
53
- const timeoutMs = Number.isFinite(opts.timeoutMs) ? opts.timeoutMs : undefined;
54
- const result = await callBrowserRequest(parent, {
55
- method: "POST",
56
- path: "/wait/download",
57
- query: profile ? { profile } : undefined,
58
- body: {
59
- path: outPath?.trim() || undefined,
60
- targetId: opts.targetId?.trim() || undefined,
61
- timeoutMs,
62
- },
63
- }, { timeoutMs: timeoutMs ?? 20000 });
64
- if (parent?.json) {
65
- defaultRuntime.log(JSON.stringify(result, null, 2));
66
- return;
67
- }
68
- defaultRuntime.log(`downloaded: ${shortenHomePath(result.download.path)}`);
69
- }
70
- catch (err) {
71
- defaultRuntime.error(danger(String(err)));
72
- defaultRuntime.exit(1);
73
- }
94
+ await runDownloadCommand(cmd, opts, {
95
+ path: "/wait/download",
96
+ body: {
97
+ path: outPath?.trim() || undefined,
98
+ },
99
+ });
74
100
  });
75
101
  browser
76
102
  .command("download")
77
103
  .description("Click a ref and save the resulting download")
78
104
  .argument("<ref>", "Ref id from snapshot to click")
79
- .argument("<path>", "Save path")
105
+ .argument("<path>", "Save path within poolbot temp downloads dir (e.g. report.pdf or /tmp/poolbot/downloads/report.pdf)")
80
106
  .option("--target-id <id>", "CDP target id (or unique prefix)")
81
107
  .option("--timeout-ms <ms>", "How long to wait for the download to start (default: 120000)", (v) => Number(v))
82
108
  .action(async (ref, outPath, opts, cmd) => {
83
- const { parent, profile } = resolveBrowserActionContext(cmd, parentOpts);
84
- try {
85
- const timeoutMs = Number.isFinite(opts.timeoutMs) ? opts.timeoutMs : undefined;
86
- const result = await callBrowserRequest(parent, {
87
- method: "POST",
88
- path: "/download",
89
- query: profile ? { profile } : undefined,
90
- body: {
91
- ref,
92
- path: outPath,
93
- targetId: opts.targetId?.trim() || undefined,
94
- timeoutMs,
95
- },
96
- }, { timeoutMs: timeoutMs ?? 20000 });
97
- if (parent?.json) {
98
- defaultRuntime.log(JSON.stringify(result, null, 2));
99
- return;
100
- }
101
- defaultRuntime.log(`downloaded: ${shortenHomePath(result.download.path)}`);
102
- }
103
- catch (err) {
104
- defaultRuntime.error(danger(String(err)));
105
- defaultRuntime.exit(1);
106
- }
109
+ await runDownloadCommand(cmd, opts, {
110
+ path: "/download",
111
+ body: {
112
+ ref,
113
+ path: outPath,
114
+ },
115
+ });
107
116
  });
108
117
  browser
109
118
  .command("dialog")
@@ -122,7 +131,7 @@ export function registerBrowserFilesAndDownloadsCommands(browser, parentOpts) {
122
131
  return;
123
132
  }
124
133
  try {
125
- const timeoutMs = Number.isFinite(opts.timeoutMs) ? opts.timeoutMs : undefined;
134
+ const { timeoutMs, targetId } = resolveTimeoutAndTarget(opts);
126
135
  const result = await callBrowserRequest(parent, {
127
136
  method: "POST",
128
137
  path: "/hooks/dialog",
@@ -130,7 +139,7 @@ export function registerBrowserFilesAndDownloadsCommands(browser, parentOpts) {
130
139
  body: {
131
140
  accept,
132
141
  promptText: opts.prompt?.trim() || undefined,
133
- targetId: opts.targetId?.trim() || undefined,
142
+ targetId,
134
143
  timeoutMs,
135
144
  },
136
145
  }, { timeoutMs: timeoutMs ?? 20000 });
@@ -1,25 +1,25 @@
1
1
  import path from "node:path";
2
2
  export const DEFAULT_CLI_NAME = "poolbot";
3
- export const LEGACY_CLI_NAME = "poolbot";
4
- const KNOWN_CLI_NAMES = new Set([DEFAULT_CLI_NAME, LEGACY_CLI_NAME]);
5
- const CLI_PREFIX_RE = /^(?:((?:pnpm|npm|bunx|npx)\s+))?(poolbot|poolbot)\b/;
6
- export function resolveCliName(argv = process.argv, env = process.env) {
7
- const override = env.POOLBOT_CLI_NAME?.trim() || env.MOLTBOT_CLI_NAME?.trim() || env.CLAWDBOT_CLI_NAME?.trim();
8
- if (override)
9
- return override;
3
+ const KNOWN_CLI_NAMES = new Set([DEFAULT_CLI_NAME]);
4
+ const CLI_PREFIX_RE = /^(?:((?:pnpm|npm|bunx|npx)\s+))?(poolbot)\b/;
5
+ export function resolveCliName(argv = process.argv) {
10
6
  const argv1 = argv[1];
11
- if (!argv1)
7
+ if (!argv1) {
12
8
  return DEFAULT_CLI_NAME;
9
+ }
13
10
  const base = path.basename(argv1).trim();
14
- if (KNOWN_CLI_NAMES.has(base))
11
+ if (KNOWN_CLI_NAMES.has(base)) {
15
12
  return base;
13
+ }
16
14
  return DEFAULT_CLI_NAME;
17
15
  }
18
16
  export function replaceCliName(command, cliName = resolveCliName()) {
19
- if (!command.trim())
17
+ if (!command.trim()) {
20
18
  return command;
21
- if (!CLI_PREFIX_RE.test(command))
19
+ }
20
+ if (!CLI_PREFIX_RE.test(command)) {
22
21
  return command;
22
+ }
23
23
  return command.replace(CLI_PREFIX_RE, (_match, runner) => {
24
24
  return `${runner ?? ""}${cliName}`;
25
25
  });
@@ -1,6 +1,5 @@
1
- export function formatErrorMessage(err) {
2
- return err instanceof Error ? err.message : String(err);
3
- }
1
+ import { formatErrorMessage } from "../infra/errors.js";
2
+ export { formatErrorMessage };
4
3
  export async function withManager(params) {
5
4
  const { manager, error } = await params.getManager();
6
5
  if (!manager) {
@@ -32,3 +31,14 @@ export async function runCommandWithRuntime(runtime, action, onError) {
32
31
  runtime.exit(1);
33
32
  }
34
33
  }
34
+ export function resolveOptionFromCommand(command, key) {
35
+ let current = command;
36
+ while (current) {
37
+ const opts = current.opts?.() ?? {};
38
+ if (opts[key] !== undefined) {
39
+ return opts[key];
40
+ }
41
+ current = current.parent ?? undefined;
42
+ }
43
+ return undefined;
44
+ }
@@ -4,7 +4,7 @@ const CLI_PREFIX_RE = /^(?:pnpm|npm|bunx|npx)\s+(?:poolbot|poolbot)\b|^(?:poolbo
4
4
  const PROFILE_FLAG_RE = /(?:^|\s)--profile(?:\s|=|$)/;
5
5
  const DEV_FLAG_RE = /(?:^|\s)--dev(?:\s|$)/;
6
6
  export function formatCliCommand(command, env = process.env) {
7
- const cliName = resolveCliName(undefined, env);
7
+ const cliName = resolveCliName();
8
8
  const normalizedCommand = replaceCliName(command, cliName);
9
9
  const profile = normalizeProfileName(env.POOLBOT_PROFILE || env.CLAWDBOT_PROFILE);
10
10
  if (!profile)
@@ -234,7 +234,7 @@ export async function runConfigUnset(opts) {
234
234
  runtime.exit(1);
235
235
  return;
236
236
  }
237
- await writeConfigFile(next);
237
+ await writeConfigFile(next, { unsetPaths: [parsedPath] });
238
238
  runtime.log(info(`Removed ${opts.path}. Restart the gateway to apply.`));
239
239
  }
240
240
  catch (err) {
@@ -51,6 +51,15 @@ async function handleServiceNotLoaded(params) {
51
51
  }
52
52
  }
53
53
  }
54
+ async function resolveServiceLoadedOrFail(params) {
55
+ try {
56
+ return await params.service.isLoaded({ env: process.env });
57
+ }
58
+ catch (err) {
59
+ params.fail(`${params.serviceNoun} service check failed: ${String(err)}`);
60
+ return null;
61
+ }
62
+ }
54
63
  export async function runServiceUninstall(params) {
55
64
  const json = Boolean(params.opts?.json);
56
65
  const { stdout, emit, fail } = createActionIO({ action: "uninstall", json });
@@ -100,12 +109,12 @@ export async function runServiceUninstall(params) {
100
109
  export async function runServiceStart(params) {
101
110
  const json = Boolean(params.opts?.json);
102
111
  const { stdout, emit, fail } = createActionIO({ action: "start", json });
103
- let loaded = false;
104
- try {
105
- loaded = await params.service.isLoaded({ env: process.env });
106
- }
107
- catch (err) {
108
- fail(`${params.serviceNoun} service check failed: ${String(err)}`);
112
+ const loaded = await resolveServiceLoadedOrFail({
113
+ serviceNoun: params.serviceNoun,
114
+ service: params.service,
115
+ fail,
116
+ });
117
+ if (loaded === null) {
109
118
  return;
110
119
  }
111
120
  if (!loaded) {
@@ -143,12 +152,12 @@ export async function runServiceStart(params) {
143
152
  export async function runServiceStop(params) {
144
153
  const json = Boolean(params.opts?.json);
145
154
  const { stdout, emit, fail } = createActionIO({ action: "stop", json });
146
- let loaded = false;
147
- try {
148
- loaded = await params.service.isLoaded({ env: process.env });
149
- }
150
- catch (err) {
151
- fail(`${params.serviceNoun} service check failed: ${String(err)}`);
155
+ const loaded = await resolveServiceLoadedOrFail({
156
+ serviceNoun: params.serviceNoun,
157
+ service: params.service,
158
+ fail,
159
+ });
160
+ if (loaded === null) {
152
161
  return;
153
162
  }
154
163
  if (!loaded) {
@@ -186,12 +195,12 @@ export async function runServiceStop(params) {
186
195
  export async function runServiceRestart(params) {
187
196
  const json = Boolean(params.opts?.json);
188
197
  const { stdout, emit, fail } = createActionIO({ action: "restart", json });
189
- let loaded = false;
190
- try {
191
- loaded = await params.service.isLoaded({ env: process.env });
192
- }
193
- catch (err) {
194
- fail(`${params.serviceNoun} service check failed: ${String(err)}`);
198
+ const loaded = await resolveServiceLoadedOrFail({
199
+ serviceNoun: params.serviceNoun,
200
+ service: params.service,
201
+ fail,
202
+ });
203
+ if (loaded === null) {
195
204
  return false;
196
205
  }
197
206
  if (!loaded) {
@@ -222,7 +231,7 @@ export async function runServiceRestart(params) {
222
231
  : driftIssue.message;
223
232
  warnings.push(warning);
224
233
  if (!json) {
225
- defaultRuntime.log(`\n⚠️ ${driftIssue.message}`);
234
+ defaultRuntime.log(`\n\u26a0\ufe0f ${driftIssue.message}`);
226
235
  if (driftIssue.detail) {
227
236
  defaultRuntime.log(` ${driftIssue.detail}\n`);
228
237
  }
@@ -235,6 +244,9 @@ export async function runServiceRestart(params) {
235
244
  }
236
245
  try {
237
246
  await params.service.restart({ env: process.env, stdout });
247
+ if (params.postRestartCheck) {
248
+ await params.postRestartCheck({ json, stdout, warnings, fail });
249
+ }
238
250
  let restarted = true;
239
251
  try {
240
252
  restarted = await params.service.isLoaded({ env: process.env });