@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
@@ -4,6 +4,7 @@ import path from "node:path";
4
4
  import { resolveDefaultAgentId } from "../agents/agent-scope.js";
5
5
  import { resolveOAuthDir, resolveStateDir } from "../config/paths.js";
6
6
  import { loadSessionStore, resolveMainSessionKey, resolveSessionFilePath, resolveSessionTranscriptsDirForAgent, resolveStorePath, } from "../config/sessions.js";
7
+ import { resolveRequiredHomeDir } from "../infra/home-dir.js";
7
8
  import { note } from "../terminal/note.js";
8
9
  import { shortenHomePath } from "../utils.js";
9
10
  function existsDir(dir) {
@@ -64,15 +65,18 @@ function addUserRwx(mode) {
64
65
  function countJsonlLines(filePath) {
65
66
  try {
66
67
  const raw = fs.readFileSync(filePath, "utf-8");
67
- if (!raw)
68
+ if (!raw) {
68
69
  return 0;
70
+ }
69
71
  let count = 0;
70
72
  for (let i = 0; i < raw.length; i += 1) {
71
- if (raw[i] === "\n")
73
+ if (raw[i] === "\n") {
72
74
  count += 1;
75
+ }
73
76
  }
74
- if (!raw.endsWith("\n"))
77
+ if (!raw.endsWith("\n")) {
75
78
  count += 1;
79
+ }
76
80
  return count;
77
81
  }
78
82
  catch {
@@ -92,24 +96,79 @@ function findOtherStateDirs(stateDir) {
92
96
  continue;
93
97
  }
94
98
  for (const entry of entries) {
95
- if (!entry.isDirectory())
99
+ if (!entry.isDirectory()) {
96
100
  continue;
97
- if (entry.name.startsWith("."))
98
- continue;
99
- const candidate = path.resolve(root, entry.name, ".poolbot");
100
- if (candidate === resolvedState)
101
+ }
102
+ if (entry.name.startsWith(".")) {
101
103
  continue;
102
- if (existsDir(candidate))
103
- found.push(candidate);
104
+ }
105
+ const candidates = [".poolbot"].map((dir) => path.resolve(root, entry.name, dir));
106
+ for (const candidate of candidates) {
107
+ if (candidate === resolvedState) {
108
+ continue;
109
+ }
110
+ if (existsDir(candidate)) {
111
+ found.push(candidate);
112
+ }
113
+ }
104
114
  }
105
115
  }
106
116
  return found;
107
117
  }
118
+ function isRecord(value) {
119
+ return typeof value === "object" && value !== null;
120
+ }
121
+ function isPairingPolicy(value) {
122
+ return typeof value === "string" && value.trim().toLowerCase() === "pairing";
123
+ }
124
+ function hasPairingPolicy(value) {
125
+ if (!isRecord(value)) {
126
+ return false;
127
+ }
128
+ if (isPairingPolicy(value.dmPolicy)) {
129
+ return true;
130
+ }
131
+ if (isRecord(value.dm) && isPairingPolicy(value.dm.policy)) {
132
+ return true;
133
+ }
134
+ if (!isRecord(value.accounts)) {
135
+ return false;
136
+ }
137
+ for (const accountCfg of Object.values(value.accounts)) {
138
+ if (hasPairingPolicy(accountCfg)) {
139
+ return true;
140
+ }
141
+ }
142
+ return false;
143
+ }
144
+ function shouldRequireOAuthDir(cfg, env) {
145
+ if (env.POOLBOT_OAUTH_DIR?.trim()) {
146
+ return true;
147
+ }
148
+ const channels = cfg.channels;
149
+ if (!isRecord(channels)) {
150
+ return false;
151
+ }
152
+ // WhatsApp auth always uses the credentials tree.
153
+ if (isRecord(channels.whatsapp)) {
154
+ return true;
155
+ }
156
+ // Pairing allowlists are persisted under credentials/<channel>-allowFrom.json.
157
+ for (const [channelId, channelCfg] of Object.entries(channels)) {
158
+ if (channelId === "defaults" || channelId === "modelByChannel") {
159
+ continue;
160
+ }
161
+ if (hasPairingPolicy(channelCfg)) {
162
+ return true;
163
+ }
164
+ }
165
+ return false;
166
+ }
108
167
  export async function noteStateIntegrity(cfg, prompter, configPath) {
109
168
  const warnings = [];
110
169
  const changes = [];
111
170
  const env = process.env;
112
- const homedir = os.homedir;
171
+ const homedir = () => resolveRequiredHomeDir(env, os.homedir);
113
172
  const stateDir = resolveStateDir(env, homedir);
114
173
  const defaultStateDir = path.join(homedir(), ".poolbot");
115
174
  const oauthDir = resolveOAuthDir(env, stateDir);
@@ -122,6 +181,7 @@ export async function noteStateIntegrity(cfg, prompter, configPath) {
122
181
  const displaySessionsDir = shortenHomePath(sessionsDir);
123
182
  const displayStoreDir = shortenHomePath(storeDir);
124
183
  const displayConfigPath = configPath ? shortenHomePath(configPath) : undefined;
184
+ const requireOAuthDir = shouldRequireOAuthDir(cfg, env);
125
185
  let stateDirExists = existsDir(stateDir);
126
186
  if (!stateDirExists) {
127
187
  warnings.push(`- CRITICAL: state directory missing (${displayStateDir}). Sessions, credentials, logs, and config are stored there.`);
@@ -146,8 +206,9 @@ export async function noteStateIntegrity(cfg, prompter, configPath) {
146
206
  if (stateDirExists && !canWriteDir(stateDir)) {
147
207
  warnings.push(`- State directory not writable (${displayStateDir}).`);
148
208
  const hint = dirPermissionHint(stateDir);
149
- if (hint)
209
+ if (hint) {
150
210
  warnings.push(` ${hint}`);
211
+ }
151
212
  const repair = await prompter.confirmSkipInNonInteractive({
152
213
  message: `Repair permissions on ${displayStateDir}?`,
153
214
  initialValue: true,
@@ -185,8 +246,10 @@ export async function noteStateIntegrity(cfg, prompter, configPath) {
185
246
  }
186
247
  if (configPath && existsFile(configPath) && process.platform !== "win32") {
187
248
  try {
249
+ const linkStat = fs.lstatSync(configPath);
188
250
  const stat = fs.statSync(configPath);
189
- if ((stat.mode & 0o077) !== 0) {
251
+ const isSymlink = linkStat.isSymbolicLink();
252
+ if (!isSymlink && (stat.mode & 0o077) !== 0) {
190
253
  warnings.push(`- Config file is group/world readable (${displayConfigPath ?? configPath}). Recommend chmod 600.`);
191
254
  const tighten = await prompter.confirmSkipInNonInteractive({
192
255
  message: `Tighten permissions on ${displayConfigPath ?? configPath} to 600?`,
@@ -206,14 +269,22 @@ export async function noteStateIntegrity(cfg, prompter, configPath) {
206
269
  const dirCandidates = new Map();
207
270
  dirCandidates.set(sessionsDir, "Sessions dir");
208
271
  dirCandidates.set(storeDir, "Session store dir");
209
- dirCandidates.set(oauthDir, "OAuth dir");
272
+ if (requireOAuthDir) {
273
+ dirCandidates.set(oauthDir, "OAuth dir");
274
+ }
275
+ else if (!existsDir(oauthDir)) {
276
+ warnings.push(`- OAuth dir not present (${displayOauthDir}). Skipping create because no WhatsApp/pairing channel config is active.`);
277
+ }
210
278
  const displayDirFor = (dir) => {
211
- if (dir === sessionsDir)
279
+ if (dir === sessionsDir) {
212
280
  return displaySessionsDir;
213
- if (dir === storeDir)
281
+ }
282
+ if (dir === storeDir) {
214
283
  return displayStoreDir;
215
- if (dir === oauthDir)
284
+ }
285
+ if (dir === oauthDir) {
216
286
  return displayOauthDir;
287
+ }
217
288
  return shortenHomePath(dir);
218
289
  };
219
290
  for (const [dir, label] of dirCandidates) {
@@ -238,8 +309,9 @@ export async function noteStateIntegrity(cfg, prompter, configPath) {
238
309
  if (!canWriteDir(dir)) {
239
310
  warnings.push(`- ${label} not writable (${displayDir}).`);
240
311
  const hint = dirPermissionHint(dir);
241
- if (hint)
312
+ if (hint) {
242
313
  warnings.push(` ${hint}`);
314
+ }
243
315
  const repair = await prompter.confirmSkipInNonInteractive({
244
316
  message: `Repair permissions on ${label}?`,
245
317
  initialValue: true,
@@ -260,8 +332,9 @@ export async function noteStateIntegrity(cfg, prompter, configPath) {
260
332
  }
261
333
  const extraStateDirs = new Set();
262
334
  if (path.resolve(stateDir) !== path.resolve(defaultStateDir)) {
263
- if (existsDir(defaultStateDir))
335
+ if (existsDir(defaultStateDir)) {
264
336
  extraStateDirs.add(defaultStateDir);
337
+ }
265
338
  }
266
339
  for (const other of findOtherStateDirs(stateDir)) {
267
340
  extraStateDirs.add(other);
@@ -278,7 +351,7 @@ export async function noteStateIntegrity(cfg, prompter, configPath) {
278
351
  if (entries.length > 0) {
279
352
  const recent = entries
280
353
  .slice()
281
- .sort((a, b) => {
354
+ .toSorted((a, b) => {
282
355
  const aUpdated = typeof a[1].updatedAt === "number" ? a[1].updatedAt : 0;
283
356
  const bUpdated = typeof b[1].updatedAt === "number" ? b[1].updatedAt : 0;
284
357
  return bUpdated - aUpdated;
@@ -286,8 +359,9 @@ export async function noteStateIntegrity(cfg, prompter, configPath) {
286
359
  .slice(0, 5);
287
360
  const missing = recent.filter(([, entry]) => {
288
361
  const sessionId = entry.sessionId;
289
- if (!sessionId)
362
+ if (!sessionId) {
290
363
  return false;
364
+ }
291
365
  const transcriptPath = resolveSessionFilePath(sessionId, entry, {
292
366
  agentId,
293
367
  });
@@ -319,11 +393,13 @@ export async function noteStateIntegrity(cfg, prompter, configPath) {
319
393
  }
320
394
  }
321
395
  export function noteWorkspaceBackupTip(workspaceDir) {
322
- if (!existsDir(workspaceDir))
396
+ if (!existsDir(workspaceDir)) {
323
397
  return;
398
+ }
324
399
  const gitMarker = path.join(workspaceDir, ".git");
325
- if (fs.existsSync(gitMarker))
400
+ if (fs.existsSync(gitMarker)) {
326
401
  return;
402
+ }
327
403
  note([
328
404
  "- Tip: back up the workspace in a private git repo (GitHub or GitLab).",
329
405
  "- Keep ~/.poolbot out of git; it contains credentials and session history.",
@@ -1,14 +1,15 @@
1
- import { runGatewayUpdate } from "../infra/update-runner.js";
1
+ import { formatCliCommand } from "../cli/command-format.js";
2
2
  import { isTruthyEnvValue } from "../infra/env.js";
3
+ import { runGatewayUpdate } from "../infra/update-runner.js";
3
4
  import { runCommandWithTimeout } from "../process/exec.js";
4
5
  import { note } from "../terminal/note.js";
5
- import { formatCliCommand } from "../cli/command-format.js";
6
- async function detectPoolbotGitCheckout(root) {
6
+ async function detectPoolBotGitCheckout(root) {
7
7
  const res = await runCommandWithTimeout(["git", "-C", root, "rev-parse", "--show-toplevel"], {
8
8
  timeoutMs: 5000,
9
9
  }).catch(() => null);
10
- if (!res)
10
+ if (!res) {
11
11
  return "unknown";
12
+ }
12
13
  if (res.code !== 0) {
13
14
  // Avoid noisy "Update via package manager" notes when git is missing/broken,
14
15
  // but do show it when this is clearly not a git checkout.
@@ -20,22 +21,24 @@ async function detectPoolbotGitCheckout(root) {
20
21
  return res.stdout.trim() === root ? "git" : "not-git";
21
22
  }
22
23
  export async function maybeOfferUpdateBeforeDoctor(params) {
23
- const updateInProgress = isTruthyEnvValue(process.env.POOLBOT_UPDATE_IN_PROGRESS || process.env.CLAWDBOT_UPDATE_IN_PROGRESS);
24
+ const updateInProgress = isTruthyEnvValue(process.env.POOLBOT_UPDATE_IN_PROGRESS);
24
25
  const canOfferUpdate = !updateInProgress &&
25
26
  params.options.nonInteractive !== true &&
26
27
  params.options.yes !== true &&
27
28
  params.options.repair !== true &&
28
29
  Boolean(process.stdin.isTTY);
29
- if (!canOfferUpdate || !params.root)
30
+ if (!canOfferUpdate || !params.root) {
30
31
  return { updated: false };
31
- const git = await detectPoolbotGitCheckout(params.root);
32
+ }
33
+ const git = await detectPoolBotGitCheckout(params.root);
32
34
  if (git === "git") {
33
35
  const shouldUpdate = await params.confirm({
34
- message: "Update Poolbot from git before running doctor?",
36
+ message: "Update Pool Bot from git before running doctor?",
35
37
  initialValue: true,
36
38
  });
37
- if (!shouldUpdate)
39
+ if (!shouldUpdate) {
38
40
  return { updated: false };
41
+ }
39
42
  note("Running update (fetch/rebase/build/ui:build/doctor)…", "Update");
40
43
  const result = await runGatewayUpdate({
41
44
  cwd: params.root,
@@ -1,8 +1,5 @@
1
- import { ensureAuthProfileStore } from "../../agents/auth-profiles.js";
2
1
  import { resolveForwardCompatModel } from "../../agents/model-forward-compat.js";
3
2
  import { parseModelRef } from "../../agents/model-selection.js";
4
- import { resolveModel } from "../../agents/pi-embedded-runner/model.js";
5
- import { loadConfig } from "../../config/config.js";
6
3
  import { resolveConfiguredEntries } from "./list.configured.js";
7
4
  import { formatErrorWithStack } from "./list.errors.js";
8
5
  import { loadModelRegistry, toModelRow } from "./list.registry.js";
@@ -10,12 +7,15 @@ import { printModelTable } from "./list.table.js";
10
7
  import { DEFAULT_PROVIDER, ensureFlagCompatibility, isLocalBaseUrl, modelKey } from "./shared.js";
11
8
  export async function modelsListCommand(opts, runtime) {
12
9
  ensureFlagCompatibility(opts);
10
+ const { loadConfig } = await import("../../config/config.js");
11
+ const { ensureAuthProfileStore } = await import("../../agents/auth-profiles.js");
13
12
  const cfg = loadConfig();
14
13
  const authStore = ensureAuthProfileStore();
15
14
  const providerFilter = (() => {
16
15
  const raw = opts.provider?.trim();
17
- if (!raw)
16
+ if (!raw) {
18
17
  return undefined;
18
+ }
19
19
  const parsed = parseModelRef(`${raw}/_`, DEFAULT_PROVIDER);
20
20
  return parsed?.provider ?? raw.toLowerCase();
21
21
  })();
@@ -45,8 +45,9 @@ export async function modelsListCommand(opts, runtime) {
45
45
  if (opts.all) {
46
46
  const sorted = [...models].toSorted((a, b) => {
47
47
  const p = a.provider.localeCompare(b.provider);
48
- if (p !== 0)
48
+ if (p !== 0) {
49
49
  return p;
50
+ }
50
51
  return a.id.localeCompare(b.id);
51
52
  });
52
53
  for (const model of sorted) {
@@ -83,6 +84,7 @@ export async function modelsListCommand(opts, runtime) {
83
84
  }
84
85
  }
85
86
  if (!model) {
87
+ const { resolveModel } = await import("../../agents/pi-embedded-runner/model.js");
86
88
  model = resolveModel(entry.ref.provider, entry.ref.model, undefined, cfg).model;
87
89
  }
88
90
  if (opts.local && model && !isLocalBaseUrl(model.baseUrl)) {
@@ -1,27 +1,8 @@
1
1
  import { logConfigUpdated } from "../../config/logging.js";
2
- import { resolveModelTarget, updateConfig } from "./shared.js";
2
+ import { applyDefaultModelPrimaryUpdate, updateConfig } from "./shared.js";
3
3
  export async function modelsSetImageCommand(modelRaw, runtime) {
4
4
  const updated = await updateConfig((cfg) => {
5
- const resolved = resolveModelTarget({ raw: modelRaw, cfg });
6
- const key = `${resolved.provider}/${resolved.model}`;
7
- const nextModels = { ...cfg.agents?.defaults?.models };
8
- if (!nextModels[key])
9
- nextModels[key] = {};
10
- const existingModel = cfg.agents?.defaults?.imageModel;
11
- return {
12
- ...cfg,
13
- agents: {
14
- ...cfg.agents,
15
- defaults: {
16
- ...cfg.agents?.defaults,
17
- imageModel: {
18
- ...(existingModel?.fallbacks ? { fallbacks: existingModel.fallbacks } : undefined),
19
- primary: key,
20
- },
21
- models: nextModels,
22
- },
23
- },
24
- };
5
+ return applyDefaultModelPrimaryUpdate({ cfg, modelRaw, field: "imageModel" });
25
6
  });
26
7
  logConfigUpdated(runtime);
27
8
  runtime.log(`Image model: ${updated.agents?.defaults?.imageModel?.primary ?? modelRaw}`);
@@ -1,8 +1,9 @@
1
1
  import { formatNodeServiceDescription } from "../daemon/constants.js";
2
2
  import { resolveNodeProgramArguments } from "../daemon/program-args.js";
3
- import { renderSystemNodeWarning, resolvePreferredNodePath, resolveSystemNodeInfo, } from "../daemon/runtime-paths.js";
3
+ import { resolvePreferredNodePath } from "../daemon/runtime-paths.js";
4
4
  import { buildNodeServiceEnvironment } from "../daemon/service-env.js";
5
5
  import { resolveGatewayDevMode } from "./daemon-install-helpers.js";
6
+ import { emitNodeRuntimeWarning, } from "./daemon-install-runtime-warning.js";
6
7
  export async function buildNodeInstallPlan(params) {
7
8
  const devMode = params.devMode ?? resolveGatewayDevMode();
8
9
  const nodePath = params.nodePath ??
@@ -21,15 +22,16 @@ export async function buildNodeInstallPlan(params) {
21
22
  runtime: params.runtime,
22
23
  nodePath,
23
24
  });
24
- if (params.runtime === "node") {
25
- const systemNode = await resolveSystemNodeInfo({ env: params.env });
26
- const warning = renderSystemNodeWarning(systemNode, programArguments[0]);
27
- if (warning)
28
- params.warn?.(warning, "Node daemon runtime");
29
- }
25
+ await emitNodeRuntimeWarning({
26
+ env: params.env,
27
+ runtime: params.runtime,
28
+ nodeProgram: programArguments[0],
29
+ warn: params.warn,
30
+ title: "Node daemon runtime",
31
+ });
30
32
  const environment = buildNodeServiceEnvironment({ env: params.env });
31
33
  const description = formatNodeServiceDescription({
32
- version: environment.POOLBOT_SERVICE_VERSION || environment.CLAWDBOT_SERVICE_VERSION,
34
+ version: environment.POOLBOT_SERVICE_VERSION,
33
35
  });
34
36
  return { programArguments, workingDirectory, environment, description };
35
37
  }
@@ -1,9 +1,10 @@
1
- import { buildMinimaxApiModelDefinition, buildMinimaxModelDefinition, DEFAULT_MINIMAX_BASE_URL, DEFAULT_MINIMAX_CONTEXT_WINDOW, DEFAULT_MINIMAX_MAX_TOKENS, MINIMAX_API_BASE_URL, MINIMAX_HOSTED_COST, MINIMAX_HOSTED_MODEL_ID, MINIMAX_HOSTED_MODEL_REF, MINIMAX_LM_STUDIO_COST, } from "./onboard-auth.models.js";
1
+ import { applyAgentDefaultModelPrimary, applyOnboardAuthAgentModelsAndProviders, } from "./onboard-auth.config-shared.js";
2
+ import { buildMinimaxApiModelDefinition, buildMinimaxModelDefinition, DEFAULT_MINIMAX_BASE_URL, DEFAULT_MINIMAX_CONTEXT_WINDOW, DEFAULT_MINIMAX_MAX_TOKENS, MINIMAX_API_BASE_URL, MINIMAX_CN_API_BASE_URL, MINIMAX_HOSTED_COST, MINIMAX_HOSTED_MODEL_ID, MINIMAX_HOSTED_MODEL_REF, MINIMAX_LM_STUDIO_COST, } from "./onboard-auth.models.js";
2
3
  export function applyMinimaxProviderConfig(cfg) {
3
4
  const models = { ...cfg.agents?.defaults?.models };
4
- models["anthropic/claude-opus-4-5"] = {
5
- ...models["anthropic/claude-opus-4-5"],
6
- alias: models["anthropic/claude-opus-4-5"]?.alias ?? "Opus",
5
+ models["anthropic/claude-opus-4-6"] = {
6
+ ...models["anthropic/claude-opus-4-6"],
7
+ alias: models["anthropic/claude-opus-4-6"]?.alias ?? "Opus",
7
8
  };
8
9
  models["lmstudio/minimax-m2.1-gs32"] = {
9
10
  ...models["lmstudio/minimax-m2.1-gs32"],
@@ -27,20 +28,7 @@ export function applyMinimaxProviderConfig(cfg) {
27
28
  ],
28
29
  };
29
30
  }
30
- return {
31
- ...cfg,
32
- agents: {
33
- ...cfg.agents,
34
- defaults: {
35
- ...cfg.agents?.defaults,
36
- models,
37
- },
38
- },
39
- models: {
40
- mode: cfg.models?.mode ?? "merge",
41
- providers,
42
- },
43
- };
31
+ return applyOnboardAuthAgentModelsAndProviders(cfg, { agentModels: models, providers });
44
32
  }
45
33
  export function applyMinimaxHostedProviderConfig(cfg, params) {
46
34
  const models = { ...cfg.agents?.defaults?.models };
@@ -66,41 +54,11 @@ export function applyMinimaxHostedProviderConfig(cfg, params) {
66
54
  api: "openai-completions",
67
55
  models: mergedModels.length > 0 ? mergedModels : [hostedModel],
68
56
  };
69
- return {
70
- ...cfg,
71
- agents: {
72
- ...cfg.agents,
73
- defaults: {
74
- ...cfg.agents?.defaults,
75
- models,
76
- },
77
- },
78
- models: {
79
- mode: cfg.models?.mode ?? "merge",
80
- providers,
81
- },
82
- };
57
+ return applyOnboardAuthAgentModelsAndProviders(cfg, { agentModels: models, providers });
83
58
  }
84
59
  export function applyMinimaxConfig(cfg) {
85
60
  const next = applyMinimaxProviderConfig(cfg);
86
- return {
87
- ...next,
88
- agents: {
89
- ...next.agents,
90
- defaults: {
91
- ...next.agents?.defaults,
92
- model: {
93
- ...(next.agents?.defaults?.model &&
94
- "fallbacks" in next.agents.defaults.model
95
- ? {
96
- fallbacks: next.agents.defaults.model.fallbacks,
97
- }
98
- : undefined),
99
- primary: "lmstudio/minimax-m2.1-gs32",
100
- },
101
- },
102
- },
103
- };
61
+ return applyAgentDefaultModelPrimary(next, "lmstudio/minimax-m2.1-gs32");
104
62
  }
105
63
  export function applyMinimaxHostedConfig(cfg, params) {
106
64
  const next = applyMinimaxHostedProviderConfig(cfg, params);
@@ -119,26 +77,59 @@ export function applyMinimaxHostedConfig(cfg, params) {
119
77
  };
120
78
  }
121
79
  // MiniMax Anthropic-compatible API (platform.minimax.io/anthropic)
122
- export function applyMinimaxApiProviderConfig(cfg, modelId = "MiniMax-M2.1") {
80
+ export function applyMinimaxApiProviderConfig(cfg, modelId = "MiniMax-M2.5") {
81
+ return applyMinimaxApiProviderConfigWithBaseUrl(cfg, {
82
+ providerId: "minimax",
83
+ modelId,
84
+ baseUrl: MINIMAX_API_BASE_URL,
85
+ });
86
+ }
87
+ export function applyMinimaxApiConfig(cfg, modelId = "MiniMax-M2.5") {
88
+ return applyMinimaxApiConfigWithBaseUrl(cfg, {
89
+ providerId: "minimax",
90
+ modelId,
91
+ baseUrl: MINIMAX_API_BASE_URL,
92
+ });
93
+ }
94
+ // MiniMax China API (api.minimaxi.com)
95
+ export function applyMinimaxApiProviderConfigCn(cfg, modelId = "MiniMax-M2.5") {
96
+ return applyMinimaxApiProviderConfigWithBaseUrl(cfg, {
97
+ providerId: "minimax-cn",
98
+ modelId,
99
+ baseUrl: MINIMAX_CN_API_BASE_URL,
100
+ });
101
+ }
102
+ export function applyMinimaxApiConfigCn(cfg, modelId = "MiniMax-M2.5") {
103
+ return applyMinimaxApiConfigWithBaseUrl(cfg, {
104
+ providerId: "minimax-cn",
105
+ modelId,
106
+ baseUrl: MINIMAX_CN_API_BASE_URL,
107
+ });
108
+ }
109
+ function applyMinimaxApiProviderConfigWithBaseUrl(cfg, params) {
123
110
  const providers = { ...cfg.models?.providers };
124
- const existingProvider = providers.minimax;
125
- const existingModels = Array.isArray(existingProvider?.models) ? existingProvider.models : [];
126
- const apiModel = buildMinimaxApiModelDefinition(modelId);
127
- const hasApiModel = existingModels.some((model) => model.id === modelId);
111
+ const existingProvider = providers[params.providerId];
112
+ const existingModels = existingProvider?.models ?? [];
113
+ const apiModel = buildMinimaxApiModelDefinition(params.modelId);
114
+ const hasApiModel = existingModels.some((model) => model.id === params.modelId);
128
115
  const mergedModels = hasApiModel ? existingModels : [...existingModels, apiModel];
129
- const { apiKey: existingApiKey, ...existingProviderRest } = (existingProvider ?? {});
116
+ const { apiKey: existingApiKey, ...existingProviderRest } = existingProvider ?? {
117
+ baseUrl: params.baseUrl,
118
+ models: [],
119
+ };
130
120
  const resolvedApiKey = typeof existingApiKey === "string" ? existingApiKey : undefined;
131
121
  const normalizedApiKey = resolvedApiKey?.trim() === "minimax" ? "" : resolvedApiKey;
132
- providers.minimax = {
122
+ providers[params.providerId] = {
133
123
  ...existingProviderRest,
134
- baseUrl: MINIMAX_API_BASE_URL,
124
+ baseUrl: params.baseUrl,
135
125
  api: "anthropic-messages",
136
126
  ...(normalizedApiKey?.trim() ? { apiKey: normalizedApiKey } : {}),
137
127
  models: mergedModels.length > 0 ? mergedModels : [apiModel],
138
128
  };
139
129
  const models = { ...cfg.agents?.defaults?.models };
140
- models[`minimax/${modelId}`] = {
141
- ...models[`minimax/${modelId}`],
130
+ const modelRef = `${params.providerId}/${params.modelId}`;
131
+ models[modelRef] = {
132
+ ...models[modelRef],
142
133
  alias: "Minimax",
143
134
  };
144
135
  return {
@@ -153,24 +144,7 @@ export function applyMinimaxApiProviderConfig(cfg, modelId = "MiniMax-M2.1") {
153
144
  models: { mode: cfg.models?.mode ?? "merge", providers },
154
145
  };
155
146
  }
156
- export function applyMinimaxApiConfig(cfg, modelId = "MiniMax-M2.1") {
157
- const next = applyMinimaxApiProviderConfig(cfg, modelId);
158
- return {
159
- ...next,
160
- agents: {
161
- ...next.agents,
162
- defaults: {
163
- ...next.agents?.defaults,
164
- model: {
165
- ...(next.agents?.defaults?.model &&
166
- "fallbacks" in next.agents.defaults.model
167
- ? {
168
- fallbacks: next.agents.defaults.model.fallbacks,
169
- }
170
- : undefined),
171
- primary: `minimax/${modelId}`,
172
- },
173
- },
174
- },
175
- };
147
+ function applyMinimaxApiConfigWithBaseUrl(cfg, params) {
148
+ const next = applyMinimaxApiProviderConfigWithBaseUrl(cfg, params);
149
+ return applyAgentDefaultModelPrimary(next, `${params.providerId}/${params.modelId}`);
176
150
  }
@@ -1,4 +1,5 @@
1
1
  import { OPENCODE_ZEN_DEFAULT_MODEL_REF } from "../agents/opencode-zen-models.js";
2
+ import { applyAgentDefaultModelPrimary } from "./onboard-auth.config-shared.js";
2
3
  export function applyOpencodeZenProviderConfig(cfg) {
3
4
  // Use the built-in opencode provider from pi-ai; only seed the allowlist alias.
4
5
  const models = { ...cfg.agents?.defaults?.models };
@@ -19,22 +20,5 @@ export function applyOpencodeZenProviderConfig(cfg) {
19
20
  }
20
21
  export function applyOpencodeZenConfig(cfg) {
21
22
  const next = applyOpencodeZenProviderConfig(cfg);
22
- return {
23
- ...next,
24
- agents: {
25
- ...next.agents,
26
- defaults: {
27
- ...next.agents?.defaults,
28
- model: {
29
- ...(next.agents?.defaults?.model &&
30
- "fallbacks" in next.agents.defaults.model
31
- ? {
32
- fallbacks: next.agents.defaults.model.fallbacks,
33
- }
34
- : undefined),
35
- primary: OPENCODE_ZEN_DEFAULT_MODEL_REF,
36
- },
37
- },
38
- },
39
- };
23
+ return applyAgentDefaultModelPrimary(next, OPENCODE_ZEN_DEFAULT_MODEL_REF);
40
24
  }