@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,18 @@
1
+ export async function fetchTelegramChatId(params) {
2
+ const url = `https://api.telegram.org/bot${params.token}/getChat?chat_id=${encodeURIComponent(params.chatId)}`;
3
+ try {
4
+ const res = await fetch(url, params.signal ? { signal: params.signal } : undefined);
5
+ if (!res.ok) {
6
+ return null;
7
+ }
8
+ const data = (await res.json().catch(() => null));
9
+ const id = data?.ok ? data?.result?.id : undefined;
10
+ if (typeof id === "number" || typeof id === "string") {
11
+ return String(id);
12
+ }
13
+ return null;
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
package/dist/cli/argv.js CHANGED
@@ -1,40 +1,85 @@
1
1
  const HELP_FLAGS = new Set(["-h", "--help"]);
2
- const VERSION_FLAGS = new Set(["-v", "-V", "--version"]);
2
+ const VERSION_FLAGS = new Set(["-V", "--version"]);
3
+ const ROOT_VERSION_ALIAS_FLAG = "-v";
4
+ const ROOT_BOOLEAN_FLAGS = new Set(["--dev", "--no-color"]);
5
+ const ROOT_VALUE_FLAGS = new Set(["--profile"]);
3
6
  const FLAG_TERMINATOR = "--";
4
7
  export function hasHelpOrVersion(argv) {
5
- return argv.some((arg) => HELP_FLAGS.has(arg) || VERSION_FLAGS.has(arg));
8
+ return (argv.some((arg) => HELP_FLAGS.has(arg) || VERSION_FLAGS.has(arg)) || hasRootVersionAlias(argv));
6
9
  }
7
10
  function isValueToken(arg) {
8
- if (!arg)
11
+ if (!arg) {
9
12
  return false;
10
- if (arg === FLAG_TERMINATOR)
13
+ }
14
+ if (arg === FLAG_TERMINATOR) {
11
15
  return false;
12
- if (!arg.startsWith("-"))
16
+ }
17
+ if (!arg.startsWith("-")) {
13
18
  return true;
19
+ }
14
20
  return /^-\d+(?:\.\d+)?$/.test(arg);
15
21
  }
16
22
  function parsePositiveInt(value) {
17
23
  const parsed = Number.parseInt(value, 10);
18
- if (Number.isNaN(parsed) || parsed <= 0)
24
+ if (Number.isNaN(parsed) || parsed <= 0) {
19
25
  return undefined;
26
+ }
20
27
  return parsed;
21
28
  }
22
29
  export function hasFlag(argv, name) {
23
30
  const args = argv.slice(2);
24
31
  for (const arg of args) {
25
- if (arg === FLAG_TERMINATOR)
32
+ if (arg === FLAG_TERMINATOR) {
26
33
  break;
27
- if (arg === name)
34
+ }
35
+ if (arg === name) {
28
36
  return true;
37
+ }
29
38
  }
30
39
  return false;
31
40
  }
41
+ export function hasRootVersionAlias(argv) {
42
+ const args = argv.slice(2);
43
+ let hasAlias = false;
44
+ for (let i = 0; i < args.length; i += 1) {
45
+ const arg = args[i];
46
+ if (!arg) {
47
+ continue;
48
+ }
49
+ if (arg === FLAG_TERMINATOR) {
50
+ break;
51
+ }
52
+ if (arg === ROOT_VERSION_ALIAS_FLAG) {
53
+ hasAlias = true;
54
+ continue;
55
+ }
56
+ if (ROOT_BOOLEAN_FLAGS.has(arg)) {
57
+ continue;
58
+ }
59
+ if (arg.startsWith("--profile=")) {
60
+ continue;
61
+ }
62
+ if (ROOT_VALUE_FLAGS.has(arg)) {
63
+ const next = args[i + 1];
64
+ if (isValueToken(next)) {
65
+ i += 1;
66
+ }
67
+ continue;
68
+ }
69
+ if (arg.startsWith("-")) {
70
+ continue;
71
+ }
72
+ return false;
73
+ }
74
+ return hasAlias;
75
+ }
32
76
  export function getFlagValue(argv, name) {
33
77
  const args = argv.slice(2);
34
78
  for (let i = 0; i < args.length; i += 1) {
35
79
  const arg = args[i];
36
- if (arg === FLAG_TERMINATOR)
80
+ if (arg === FLAG_TERMINATOR) {
37
81
  break;
82
+ }
38
83
  if (arg === name) {
39
84
  const next = args[i + 1];
40
85
  return isValueToken(next) ? next : null;
@@ -47,16 +92,19 @@ export function getFlagValue(argv, name) {
47
92
  return undefined;
48
93
  }
49
94
  export function getVerboseFlag(argv, options) {
50
- if (hasFlag(argv, "--verbose"))
95
+ if (hasFlag(argv, "--verbose")) {
51
96
  return true;
52
- if (options?.includeDebug && hasFlag(argv, "--debug"))
97
+ }
98
+ if (options?.includeDebug && hasFlag(argv, "--debug")) {
53
99
  return true;
100
+ }
54
101
  return false;
55
102
  }
56
103
  export function getPositiveIntFlagValue(argv, name) {
57
104
  const raw = getFlagValue(argv, name);
58
- if (raw === null || raw === undefined)
105
+ if (raw === null || raw === undefined) {
59
106
  return raw;
107
+ }
60
108
  return parsePositiveInt(raw);
61
109
  }
62
110
  export function getCommandPath(argv, depth = 2) {
@@ -64,15 +112,19 @@ export function getCommandPath(argv, depth = 2) {
64
112
  const path = [];
65
113
  for (let i = 0; i < args.length; i += 1) {
66
114
  const arg = args[i];
67
- if (!arg)
115
+ if (!arg) {
68
116
  continue;
69
- if (arg === "--")
117
+ }
118
+ if (arg === "--") {
70
119
  break;
71
- if (arg.startsWith("-"))
120
+ }
121
+ if (arg.startsWith("-")) {
72
122
  continue;
123
+ }
73
124
  path.push(arg);
74
- if (path.length >= depth)
125
+ if (path.length >= depth) {
75
126
  break;
127
+ }
76
128
  }
77
129
  return path;
78
130
  }
@@ -94,8 +146,9 @@ export function buildParseArgv(params) {
94
146
  : baseArgv;
95
147
  const executable = (normalizedArgv[0]?.split(/[/\\]/).pop() ?? "").toLowerCase();
96
148
  const looksLikeNode = normalizedArgv.length >= 2 && (isNodeExecutable(executable) || isBunExecutable(executable));
97
- if (looksLikeNode)
149
+ if (looksLikeNode) {
98
150
  return normalizedArgv;
151
+ }
99
152
  return ["node", programName || "poolbot", ...normalizedArgv];
100
153
  }
101
154
  const nodeExecutablePattern = /^node-\d+(?:\.\d+)*(?:\.exe)?$/;
@@ -110,15 +163,25 @@ function isBunExecutable(executable) {
110
163
  return executable === "bun" || executable === "bun.exe";
111
164
  }
112
165
  export function shouldMigrateStateFromPath(path) {
113
- if (path.length === 0)
166
+ if (path.length === 0) {
114
167
  return true;
168
+ }
115
169
  const [primary, secondary] = path;
116
- if (primary === "health" || primary === "status" || primary === "sessions")
170
+ if (primary === "health" || primary === "status" || primary === "sessions") {
117
171
  return false;
118
- if (primary === "memory" && secondary === "status")
172
+ }
173
+ if (primary === "config" && (secondary === "get" || secondary === "unset")) {
119
174
  return false;
120
- if (primary === "agent")
175
+ }
176
+ if (primary === "models" && (secondary === "list" || secondary === "status")) {
121
177
  return false;
178
+ }
179
+ if (primary === "memory" && secondary === "status") {
180
+ return false;
181
+ }
182
+ if (primary === "agent") {
183
+ return false;
184
+ }
122
185
  return true;
123
186
  }
124
187
  export function shouldMigrateState(argv) {
@@ -1,6 +1,7 @@
1
1
  import { resolveCommitHash } from "../infra/git-commit.js";
2
2
  import { visibleWidth } from "../terminal/ansi.js";
3
3
  import { isRich, theme } from "../terminal/theme.js";
4
+ import { hasRootVersionAlias } from "./argv.js";
4
5
  import { pickTagline } from "./tagline.js";
5
6
  import { resolveCliName } from "./cli-name.js";
6
7
  let bannerEmitted = false;
@@ -18,13 +19,13 @@ function splitGraphemes(value) {
18
19
  }
19
20
  }
20
21
  const hasJsonFlag = (argv) => argv.some((arg) => arg === "--json" || arg.startsWith("--json="));
21
- const hasVersionFlag = (argv) => argv.some((arg) => arg === "--version" || arg === "-V" || arg === "-v");
22
+ const hasVersionFlag = (argv) => argv.some((arg) => arg === "--version" || arg === "-V") || hasRootVersionAlias(argv);
22
23
  export function formatCliBannerLine(version, options = {}) {
23
24
  const commit = options.commit ?? resolveCommitHash({ env: options.env });
24
25
  const commitLabel = commit ?? "unknown";
25
26
  const tagline = pickTagline(options);
26
27
  const rich = options.richTty ?? isRich();
27
- const cliName = resolveCliName(options.argv ?? process.argv, options.env);
28
+ const cliName = resolveCliName(options.argv ?? process.argv);
28
29
  const title = cliName === "poolbot" ? "🎱 Pool Bot" : "🎱 Pool Bot";
29
30
  const prefix = "🎱 ";
30
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 });
@@ -1,6 +1,24 @@
1
+ import { loadConfig, resolveGatewayPort } from "../../config/config.js";
1
2
  import { resolveGatewayService } from "../../daemon/service.js";
3
+ import { defaultRuntime } from "../../runtime.js";
4
+ import { theme } from "../../terminal/theme.js";
5
+ import { formatCliCommand } from "../command-format.js";
2
6
  import { runServiceRestart, runServiceStart, runServiceStop, runServiceUninstall, } from "./lifecycle-core.js";
3
- import { renderGatewayServiceStartHints } from "./shared.js";
7
+ import { renderRestartDiagnostics, terminateStaleGatewayPids, waitForGatewayHealthyRestart, } from "./restart-health.js";
8
+ import { parsePortFromArgs, renderGatewayServiceStartHints } from "./shared.js";
9
+ const POST_RESTART_HEALTH_ATTEMPTS = 8;
10
+ const POST_RESTART_HEALTH_DELAY_MS = 450;
11
+ async function resolveGatewayRestartPort() {
12
+ const service = resolveGatewayService();
13
+ const command = await service.readCommand(process.env).catch(() => null);
14
+ const serviceEnv = command?.environment ?? undefined;
15
+ const mergedEnv = {
16
+ ...process.env,
17
+ ...(serviceEnv ?? undefined),
18
+ };
19
+ const portFromArgs = parsePortFromArgs(command?.programArguments);
20
+ return portFromArgs ?? resolveGatewayPort(loadConfig(), mergedEnv);
21
+ }
4
22
  export async function runDaemonUninstall(opts = {}) {
5
23
  return await runServiceUninstall({
6
24
  serviceNoun: "Gateway",
@@ -31,11 +49,55 @@ export async function runDaemonStop(opts = {}) {
31
49
  * Throws/exits on check or restart failures.
32
50
  */
33
51
  export async function runDaemonRestart(opts = {}) {
52
+ const json = Boolean(opts.json);
53
+ const service = resolveGatewayService();
54
+ const restartPort = await resolveGatewayRestartPort().catch(() => resolveGatewayPort(loadConfig(), process.env));
34
55
  return await runServiceRestart({
35
56
  serviceNoun: "Gateway",
36
- service: resolveGatewayService(),
57
+ service,
37
58
  renderStartHints: renderGatewayServiceStartHints,
38
59
  opts,
39
60
  checkTokenDrift: true,
61
+ postRestartCheck: async ({ warnings, fail, stdout }) => {
62
+ let health = await waitForGatewayHealthyRestart({
63
+ service,
64
+ port: restartPort,
65
+ attempts: POST_RESTART_HEALTH_ATTEMPTS,
66
+ delayMs: POST_RESTART_HEALTH_DELAY_MS,
67
+ });
68
+ if (!health.healthy && health.staleGatewayPids.length > 0) {
69
+ const staleMsg = `Found stale gateway process(es): ${health.staleGatewayPids.join(", ")}.`;
70
+ warnings.push(staleMsg);
71
+ if (!json) {
72
+ defaultRuntime.log(theme.warn(staleMsg));
73
+ defaultRuntime.log(theme.muted("Stopping stale process(es) and retrying restart..."));
74
+ }
75
+ await terminateStaleGatewayPids(health.staleGatewayPids);
76
+ await service.restart({ env: process.env, stdout });
77
+ health = await waitForGatewayHealthyRestart({
78
+ service,
79
+ port: restartPort,
80
+ attempts: POST_RESTART_HEALTH_ATTEMPTS,
81
+ delayMs: POST_RESTART_HEALTH_DELAY_MS,
82
+ });
83
+ }
84
+ if (health.healthy) {
85
+ return;
86
+ }
87
+ const diagnostics = renderRestartDiagnostics(health);
88
+ if (!json) {
89
+ defaultRuntime.log(theme.warn("Gateway did not become healthy after restart."));
90
+ for (const line of diagnostics) {
91
+ defaultRuntime.log(theme.muted(line));
92
+ }
93
+ }
94
+ else {
95
+ warnings.push(...diagnostics);
96
+ }
97
+ fail("Gateway restart failed health checks.", [
98
+ formatCliCommand("poolbot gateway status --probe --deep"),
99
+ formatCliCommand("poolbot doctor"),
100
+ ]);
101
+ },
40
102
  });
41
103
  }