@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
@@ -1,19 +1,93 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
1
3
  import { resolvePoolbotAgentDir } from "../agents/agent-paths.js";
2
4
  import { upsertAuthProfile } from "../agents/auth-profiles.js";
5
+ import { resolveStateDir } from "../config/paths.js";
3
6
  export { CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF } from "../agents/cloudflare-ai-gateway.js";
4
- export { XAI_DEFAULT_MODEL_REF, NVIDIA_DEFAULT_MODEL_REF } from "./onboard-auth.models.js";
7
+ export { XAI_DEFAULT_MODEL_REF } from "./onboard-auth.models.js";
5
8
  const resolveAuthAgentDir = (agentDir) => agentDir ?? resolvePoolbotAgentDir();
6
- export async function writeOAuthCredentials(provider, creds, agentDir) {
9
+ /** Resolve real path, returning null if the target doesn't exist. */
10
+ function safeRealpathSync(dir) {
11
+ try {
12
+ return fs.realpathSync(path.resolve(dir));
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ }
18
+ function resolveSiblingAgentDirs(primaryAgentDir) {
19
+ const normalized = path.resolve(primaryAgentDir);
20
+ // Derive agentsRoot from primaryAgentDir when it matches the standard
21
+ // layout (.../agents/<name>/agent). Falls back to global state dir.
22
+ const parentOfAgent = path.dirname(normalized);
23
+ const candidateAgentsRoot = path.dirname(parentOfAgent);
24
+ const looksLikeStandardLayout = path.basename(normalized) === "agent" && path.basename(candidateAgentsRoot) === "agents";
25
+ const agentsRoot = looksLikeStandardLayout
26
+ ? candidateAgentsRoot
27
+ : path.join(resolveStateDir(), "agents");
28
+ const entries = (() => {
29
+ try {
30
+ return fs.readdirSync(agentsRoot, { withFileTypes: true });
31
+ }
32
+ catch {
33
+ return [];
34
+ }
35
+ })();
36
+ // Include both directories and symlinks-to-directories.
37
+ const discovered = entries
38
+ .filter((entry) => entry.isDirectory() || entry.isSymbolicLink())
39
+ .map((entry) => path.join(agentsRoot, entry.name, "agent"));
40
+ // Deduplicate via realpath to handle symlinks and path normalization.
41
+ const seen = new Set();
42
+ const result = [];
43
+ for (const dir of [normalized, ...discovered]) {
44
+ const real = safeRealpathSync(dir);
45
+ if (real && !seen.has(real)) {
46
+ seen.add(real);
47
+ result.push(real);
48
+ }
49
+ }
50
+ return result;
51
+ }
52
+ export async function writeOAuthCredentials(provider, creds, agentDir, options) {
7
53
  const email = typeof creds.email === "string" && creds.email.trim() ? creds.email.trim() : "default";
54
+ const profileId = `${provider}:${email}`;
55
+ const resolvedAgentDir = path.resolve(resolveAuthAgentDir(agentDir));
56
+ const targetAgentDirs = options?.syncSiblingAgents
57
+ ? resolveSiblingAgentDirs(resolvedAgentDir)
58
+ : [resolvedAgentDir];
59
+ const credential = {
60
+ type: "oauth",
61
+ provider,
62
+ ...creds,
63
+ };
64
+ // Primary write must succeed — let it throw on failure.
8
65
  upsertAuthProfile({
9
- profileId: `${provider}:${email}`,
10
- credential: {
11
- type: "oauth",
12
- provider,
13
- ...creds,
14
- },
15
- agentDir: resolveAuthAgentDir(agentDir),
66
+ profileId,
67
+ credential,
68
+ agentDir: resolvedAgentDir,
16
69
  });
70
+ // Sibling sync is best-effort — log and ignore individual failures.
71
+ if (options?.syncSiblingAgents) {
72
+ const primaryReal = safeRealpathSync(resolvedAgentDir);
73
+ for (const targetAgentDir of targetAgentDirs) {
74
+ const targetReal = safeRealpathSync(targetAgentDir);
75
+ if (targetReal && primaryReal && targetReal === primaryReal) {
76
+ continue;
77
+ }
78
+ try {
79
+ upsertAuthProfile({
80
+ profileId,
81
+ credential,
82
+ agentDir: targetAgentDir,
83
+ });
84
+ }
85
+ catch {
86
+ // Best-effort: sibling sync failure must not block primary onboarding.
87
+ }
88
+ }
89
+ }
90
+ return profileId;
17
91
  }
18
92
  export async function setAnthropicApiKey(key, agentDir) {
19
93
  // Write to resolved agent dir so gateway finds credentials on startup.
@@ -39,13 +113,14 @@ export async function setGeminiApiKey(key, agentDir) {
39
113
  agentDir: resolveAuthAgentDir(agentDir),
40
114
  });
41
115
  }
42
- export async function setMinimaxApiKey(key, agentDir) {
116
+ export async function setMinimaxApiKey(key, agentDir, profileId = "minimax:default") {
117
+ const provider = profileId.split(":")[0] ?? "minimax";
43
118
  // Write to resolved agent dir so gateway finds credentials on startup.
44
119
  upsertAuthProfile({
45
- profileId: "minimax:default",
120
+ profileId,
46
121
  credential: {
47
122
  type: "api_key",
48
- provider: "minimax",
123
+ provider,
49
124
  key,
50
125
  },
51
126
  agentDir: resolveAuthAgentDir(agentDir),
@@ -237,7 +312,9 @@ export function setXaiApiKey(key, agentDir) {
237
312
  agentDir: resolveAuthAgentDir(agentDir),
238
313
  });
239
314
  }
240
- export function setNvidiaApiKey(key, agentDir) {
315
+ // PB-specific: nvidia support
316
+ export const NVIDIA_DEFAULT_MODEL_REF = "nvidia/llama-3.3-nemotron-super-49b-v1";
317
+ export async function setNvidiaApiKey(key, agentDir) {
241
318
  upsertAuthProfile({
242
319
  profileId: "nvidia:default",
243
320
  credential: {
@@ -1,7 +1,7 @@
1
1
  export { SYNTHETIC_DEFAULT_MODEL_ID, SYNTHETIC_DEFAULT_MODEL_REF, } from "../agents/synthetic-models.js";
2
2
  export { VENICE_DEFAULT_MODEL_ID, VENICE_DEFAULT_MODEL_REF } from "../agents/venice-models.js";
3
3
  export { applyAuthProfileConfig, applyCloudflareAiGatewayConfig, applyCloudflareAiGatewayProviderConfig, applyHuggingfaceConfig, applyHuggingfaceProviderConfig, applyQianfanConfig, applyQianfanProviderConfig, applyKimiCodeConfig, applyKimiCodeProviderConfig, applyLitellmConfig, applyLitellmProviderConfig, LITELLM_BASE_URL, LITELLM_DEFAULT_MODEL_ID, applyMoonshotConfig, applyMoonshotConfigCn, applyMoonshotProviderConfig, applyMoonshotProviderConfigCn, applyOpenrouterConfig, applyOpenrouterProviderConfig, applySyntheticConfig, applySyntheticProviderConfig, applyTogetherConfig, applyTogetherProviderConfig, applyVeniceConfig, applyVeniceProviderConfig, applyVercelAiGatewayConfig, applyVercelAiGatewayProviderConfig, applyNvidiaConfig, applyNvidiaProviderConfig, applyXaiConfig, applyXaiProviderConfig, applyXiaomiConfig, applyXiaomiProviderConfig, applyZaiConfig, applyZaiProviderConfig, } from "./onboard-auth.config-core.js";
4
- export { applyMinimaxApiConfig, applyMinimaxApiProviderConfig, applyMinimaxConfig, applyMinimaxHostedConfig, applyMinimaxHostedProviderConfig, applyMinimaxProviderConfig, } from "./onboard-auth.config-minimax.js";
4
+ export { applyMinimaxApiConfig, applyMinimaxApiConfigCn, applyMinimaxApiProviderConfig, applyMinimaxApiProviderConfigCn, applyMinimaxConfig, applyMinimaxHostedConfig, applyMinimaxHostedProviderConfig, applyMinimaxProviderConfig, } from "./onboard-auth.config-minimax.js";
5
5
  export { applyOpencodeZenConfig, applyOpencodeZenProviderConfig, } from "./onboard-auth.config-opencode.js";
6
6
  export { CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF, HUGGINGFACE_DEFAULT_MODEL_REF, LITELLM_DEFAULT_MODEL_REF, OPENROUTER_DEFAULT_MODEL_REF, setAnthropicApiKey, setCloudflareAiGatewayConfig, setQianfanApiKey, setGeminiApiKey, setHuggingfaceApiKey, setKimiCodingApiKey, setLitellmApiKey, setMinimaxApiKey, setMoonshotApiKey, setOpencodeZenApiKey, setOpenrouterApiKey, setSyntheticApiKey, setTogetherApiKey, setVeniceApiKey, setVercelAiGatewayApiKey, setXiaomiApiKey, setZaiApiKey, setNvidiaApiKey, setXaiApiKey, writeOAuthCredentials, VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF, NVIDIA_DEFAULT_MODEL_REF, XIAOMI_DEFAULT_MODEL_REF, ZAI_DEFAULT_MODEL_REF, TOGETHER_DEFAULT_MODEL_REF, XAI_DEFAULT_MODEL_REF, } from "./onboard-auth.credentials.js";
7
7
  export { buildMinimaxApiModelDefinition, buildMinimaxModelDefinition, buildMoonshotModelDefinition, buildZaiModelDefinition, DEFAULT_MINIMAX_BASE_URL, MOONSHOT_CN_BASE_URL, QIANFAN_BASE_URL, QIANFAN_DEFAULT_MODEL_ID, QIANFAN_DEFAULT_MODEL_REF, KIMI_CODING_MODEL_ID, KIMI_CODING_MODEL_REF, MINIMAX_API_BASE_URL, MINIMAX_HOSTED_MODEL_ID, MINIMAX_HOSTED_MODEL_REF, MOONSHOT_BASE_URL, MOONSHOT_DEFAULT_MODEL_ID, MOONSHOT_DEFAULT_MODEL_REF, buildNvidiaModelDefinition, NVIDIA_BASE_URL, NVIDIA_DEFAULT_MODEL_ID, resolveZaiBaseUrl, ZAI_CODING_CN_BASE_URL, ZAI_DEFAULT_MODEL_ID, ZAI_CODING_GLOBAL_BASE_URL, ZAI_CN_BASE_URL, ZAI_GLOBAL_BASE_URL, } from "./onboard-auth.models.js";
@@ -1,6 +1,7 @@
1
1
  import { QIANFAN_BASE_URL, QIANFAN_DEFAULT_MODEL_ID } from "../agents/models-config.providers.js";
2
2
  export const DEFAULT_MINIMAX_BASE_URL = "https://api.minimax.io/v1";
3
3
  export const MINIMAX_API_BASE_URL = "https://api.minimax.io/anthropic";
4
+ export const MINIMAX_CN_API_BASE_URL = "https://api.minimaxi.com/anthropic";
4
5
  export const MINIMAX_HOSTED_MODEL_ID = "MiniMax-M2.1";
5
6
  export const MINIMAX_HOSTED_MODEL_REF = `minimax/${MINIMAX_HOSTED_MODEL_ID}`;
6
7
  export const DEFAULT_MINIMAX_CONTEXT_WINDOW = 200000;
@@ -34,12 +35,12 @@ export function resolveZaiBaseUrl(endpoint) {
34
35
  return ZAI_GLOBAL_BASE_URL;
35
36
  }
36
37
  }
37
- // Pricing: MiniMax doesn't publish public rates. Override in models.json for accurate costs.
38
+ // Pricing per 1M tokens (USD) \u2014 https://platform.minimaxi.com/document/Price
38
39
  export const MINIMAX_API_COST = {
39
- input: 15,
40
- output: 60,
41
- cacheRead: 2,
42
- cacheWrite: 10,
40
+ input: 0.3,
41
+ output: 1.2,
42
+ cacheRead: 0.03,
43
+ cacheWrite: 0.12,
43
44
  };
44
45
  export const MINIMAX_HOSTED_COST = {
45
46
  input: 0,
@@ -4,7 +4,7 @@ import { formatCliCommand } from "../cli/command-format.js";
4
4
  export async function setupInternalHooks(cfg, runtime, prompter) {
5
5
  await prompter.note([
6
6
  "Hooks let you automate actions when agent commands are issued.",
7
- "Example: Save session context to memory when you issue /new.",
7
+ "Example: Save session context to memory when you issue /new or /reset.",
8
8
  "",
9
9
  "Learn more: https://docs.molt.bot/hooks",
10
10
  ].join("\n"), "Hooks");
@@ -10,31 +10,36 @@ async function resolveApiKeyFromProfiles(params) {
10
10
  });
11
11
  for (const profileId of order) {
12
12
  const cred = store.profiles[profileId];
13
- if (cred?.type !== "api_key")
13
+ if (cred?.type !== "api_key") {
14
14
  continue;
15
+ }
15
16
  const resolved = await resolveApiKeyForProfile({
16
17
  cfg: params.cfg,
17
18
  store,
18
19
  profileId,
19
20
  agentDir: params.agentDir,
20
21
  });
21
- if (resolved?.apiKey)
22
+ if (resolved?.apiKey) {
22
23
  return resolved.apiKey;
24
+ }
23
25
  }
24
26
  return null;
25
27
  }
26
28
  export async function resolveNonInteractiveApiKey(params) {
27
29
  const flagKey = normalizeOptionalSecretInput(params.flagValue);
28
- if (flagKey)
30
+ if (flagKey) {
29
31
  return { key: flagKey, source: "flag" };
32
+ }
30
33
  const envResolved = resolveEnvApiKey(params.provider);
31
- if (envResolved?.apiKey)
34
+ if (envResolved?.apiKey) {
32
35
  return { key: envResolved.apiKey, source: "env" };
36
+ }
33
37
  const explicitEnvVar = params.envVarName?.trim();
34
38
  if (explicitEnvVar) {
35
39
  const explicitEnvKey = normalizeOptionalSecretInput(process.env[explicitEnvVar]);
36
- if (explicitEnvKey)
40
+ if (explicitEnvKey) {
37
41
  return { key: explicitEnvKey, source: "env" };
42
+ }
38
43
  }
39
44
  if (params.allowProfile ?? true) {
40
45
  const profileKey = await resolveApiKeyFromProfiles({
@@ -42,11 +47,13 @@ export async function resolveNonInteractiveApiKey(params) {
42
47
  cfg: params.cfg,
43
48
  agentDir: params.agentDir,
44
49
  });
45
- if (profileKey)
50
+ if (profileKey) {
46
51
  return { key: profileKey, source: "profile" };
52
+ }
47
53
  }
48
- if (params.required === false)
54
+ if (params.required === false) {
49
55
  return null;
56
+ }
50
57
  const profileHint = params.allowProfile === false ? "" : `, or existing ${params.provider} API-key profile`;
51
58
  params.runtime.error(`Missing ${params.flagName} (or ${params.envVar} in env${profileHint}).`);
52
59
  params.runtime.exit(1);
@@ -6,7 +6,8 @@ import { shortenHomePath } from "../../../utils.js";
6
6
  import { normalizeSecretInput } from "../../../utils/normalize-secret-input.js";
7
7
  import { buildTokenProfileId, validateAnthropicSetupToken } from "../../auth-token.js";
8
8
  import { applyGoogleGeminiModelDefault } from "../../google-gemini-model-default.js";
9
- import { applyAuthProfileConfig, applyCloudflareAiGatewayConfig, applyHuggingfaceConfig, applyKimiCodeConfig, applyLitellmConfig, applyMinimaxApiConfig, applyMinimaxConfig, applyMoonshotConfig, applyMoonshotConfigCn, applyNvidiaConfig, applyOpencodeZenConfig, applyOpenrouterConfig, applyQianfanConfig, applySyntheticConfig, applyTogetherConfig, applyVeniceConfig, applyVercelAiGatewayConfig, applyXaiConfig, applyXiaomiConfig, applyZaiConfig, setAnthropicApiKey, setCloudflareAiGatewayConfig, setGeminiApiKey, setHuggingfaceApiKey, setKimiCodingApiKey, setLitellmApiKey, setMinimaxApiKey, setMoonshotApiKey, setNvidiaApiKey, setOpencodeZenApiKey, setOpenrouterApiKey, setQianfanApiKey, setSyntheticApiKey, setTogetherApiKey, setVeniceApiKey, setVercelAiGatewayApiKey, setXaiApiKey, setXiaomiApiKey, setZaiApiKey, } from "../../onboard-auth.js";
9
+ import { applyPrimaryModel } from "../../model-picker.js";
10
+ import { applyAuthProfileConfig, applyCloudflareAiGatewayConfig, applyQianfanConfig, applyKimiCodeConfig, applyMinimaxApiConfig, applyMinimaxApiConfigCn, applyMinimaxConfig, applyMoonshotConfig, applyMoonshotConfigCn, applyOpencodeZenConfig, applyOpenrouterConfig, applySyntheticConfig, applyVeniceConfig, applyTogetherConfig, applyHuggingfaceConfig, applyVercelAiGatewayConfig, applyLitellmConfig, applyXaiConfig, applyXiaomiConfig, applyZaiConfig, setAnthropicApiKey, setCloudflareAiGatewayConfig, setQianfanApiKey, setGeminiApiKey, setKimiCodingApiKey, setLitellmApiKey, setMinimaxApiKey, setMoonshotApiKey, setOpencodeZenApiKey, setOpenrouterApiKey, setSyntheticApiKey, setXaiApiKey, setVeniceApiKey, setTogetherApiKey, setHuggingfaceApiKey, setVercelAiGatewayApiKey, setXiaomiApiKey, setZaiApiKey, } from "../../onboard-auth.js";
10
11
  import { applyCustomApiConfig, CustomApiError, parseNonInteractiveCustomApiFlags, resolveCustomProviderId, } from "../../onboard-custom.js";
11
12
  import { applyOpenAIConfig } from "../../openai-model-default.js";
12
13
  import { detectZaiEndpoint } from "../../zai-endpoint-detect.js";
@@ -232,6 +233,50 @@ export async function applyNonInteractiveAuthChoice(params) {
232
233
  });
233
234
  return applyXaiConfig(nextConfig);
234
235
  }
236
+ if (authChoice === "volcengine-api-key") {
237
+ const resolved = await resolveNonInteractiveApiKey({
238
+ provider: "volcengine",
239
+ cfg: baseConfig,
240
+ flagValue: opts.volcengineApiKey,
241
+ flagName: "--volcengine-api-key",
242
+ envVar: "VOLCANO_ENGINE_API_KEY",
243
+ runtime,
244
+ });
245
+ if (!resolved) {
246
+ return null;
247
+ }
248
+ if (resolved.source !== "profile") {
249
+ const result = upsertSharedEnvVar({
250
+ key: "VOLCANO_ENGINE_API_KEY",
251
+ value: resolved.key,
252
+ });
253
+ process.env.VOLCANO_ENGINE_API_KEY = resolved.key;
254
+ runtime.log(`Saved VOLCANO_ENGINE_API_KEY to ${shortenHomePath(result.path)}`);
255
+ }
256
+ return applyPrimaryModel(nextConfig, "volcengine-plan/ark-code-latest");
257
+ }
258
+ if (authChoice === "byteplus-api-key") {
259
+ const resolved = await resolveNonInteractiveApiKey({
260
+ provider: "byteplus",
261
+ cfg: baseConfig,
262
+ flagValue: opts.byteplusApiKey,
263
+ flagName: "--byteplus-api-key",
264
+ envVar: "BYTEPLUS_API_KEY",
265
+ runtime,
266
+ });
267
+ if (!resolved) {
268
+ return null;
269
+ }
270
+ if (resolved.source !== "profile") {
271
+ const result = upsertSharedEnvVar({
272
+ key: "BYTEPLUS_API_KEY",
273
+ value: resolved.key,
274
+ });
275
+ process.env.BYTEPLUS_API_KEY = resolved.key;
276
+ runtime.log(`Saved BYTEPLUS_API_KEY to ${shortenHomePath(result.path)}`);
277
+ }
278
+ return applyPrimaryModel(nextConfig, "byteplus-plan/ark-code-latest");
279
+ }
235
280
  if (authChoice === "qianfan-api-key") {
236
281
  const resolved = await resolveNonInteractiveApiKey({
237
282
  provider: "qianfan",
@@ -374,7 +419,7 @@ export async function applyNonInteractiveAuthChoice(params) {
374
419
  gatewayId,
375
420
  });
376
421
  }
377
- if (authChoice === "moonshot-api-key") {
422
+ const applyMoonshotApiKeyChoice = async (applyConfig) => {
378
423
  const resolved = await resolveNonInteractiveApiKey({
379
424
  provider: "moonshot",
380
425
  cfg: baseConfig,
@@ -394,29 +439,13 @@ export async function applyNonInteractiveAuthChoice(params) {
394
439
  provider: "moonshot",
395
440
  mode: "api_key",
396
441
  });
397
- return applyMoonshotConfig(nextConfig);
442
+ return applyConfig(nextConfig);
443
+ };
444
+ if (authChoice === "moonshot-api-key") {
445
+ return await applyMoonshotApiKeyChoice(applyMoonshotConfig);
398
446
  }
399
447
  if (authChoice === "moonshot-api-key-cn") {
400
- const resolved = await resolveNonInteractiveApiKey({
401
- provider: "moonshot",
402
- cfg: baseConfig,
403
- flagValue: opts.moonshotApiKey,
404
- flagName: "--moonshot-api-key",
405
- envVar: "MOONSHOT_API_KEY",
406
- runtime,
407
- });
408
- if (!resolved) {
409
- return null;
410
- }
411
- if (resolved.source !== "profile") {
412
- await setMoonshotApiKey(resolved.key);
413
- }
414
- nextConfig = applyAuthProfileConfig(nextConfig, {
415
- profileId: "moonshot:default",
416
- provider: "moonshot",
417
- mode: "api_key",
418
- });
419
- return applyMoonshotConfigCn(nextConfig);
448
+ return await applyMoonshotApiKeyChoice(applyMoonshotConfigCn);
420
449
  }
421
450
  if (authChoice === "kimi-code-api-key") {
422
451
  const resolved = await resolveNonInteractiveApiKey({
@@ -486,9 +515,13 @@ export async function applyNonInteractiveAuthChoice(params) {
486
515
  }
487
516
  if (authChoice === "minimax-cloud" ||
488
517
  authChoice === "minimax-api" ||
518
+ authChoice === "minimax-api-key-cn" ||
489
519
  authChoice === "minimax-api-lightning") {
520
+ const isCn = authChoice === "minimax-api-key-cn";
521
+ const providerId = isCn ? "minimax-cn" : "minimax";
522
+ const profileId = `${providerId}:default`;
490
523
  const resolved = await resolveNonInteractiveApiKey({
491
- provider: "minimax",
524
+ provider: providerId,
492
525
  cfg: baseConfig,
493
526
  flagValue: opts.minimaxApiKey,
494
527
  flagName: "--minimax-api-key",
@@ -499,15 +532,17 @@ export async function applyNonInteractiveAuthChoice(params) {
499
532
  return null;
500
533
  }
501
534
  if (resolved.source !== "profile") {
502
- await setMinimaxApiKey(resolved.key);
535
+ await setMinimaxApiKey(resolved.key, undefined, profileId);
503
536
  }
504
537
  nextConfig = applyAuthProfileConfig(nextConfig, {
505
- profileId: "minimax:default",
506
- provider: "minimax",
538
+ profileId,
539
+ provider: providerId,
507
540
  mode: "api_key",
508
541
  });
509
- const modelId = authChoice === "minimax-api-lightning" ? "MiniMax-M2.1-lightning" : "MiniMax-M2.1";
510
- return applyMinimaxApiConfig(nextConfig, modelId);
542
+ const modelId = authChoice === "minimax-api-lightning" ? "MiniMax-M2.5-Lightning" : "MiniMax-M2.5";
543
+ return isCn
544
+ ? applyMinimaxApiConfigCn(nextConfig, modelId)
545
+ : applyMinimaxApiConfig(nextConfig, modelId);
511
546
  }
512
547
  if (authChoice === "minimax") {
513
548
  return applyMinimaxConfig(nextConfig);
@@ -578,26 +613,6 @@ export async function applyNonInteractiveAuthChoice(params) {
578
613
  });
579
614
  return applyHuggingfaceConfig(nextConfig);
580
615
  }
581
- if (authChoice === "nvidia-api-key") {
582
- const resolved = await resolveNonInteractiveApiKey({
583
- provider: "nvidia",
584
- cfg: baseConfig,
585
- flagValue: opts.nvidiaApiKey,
586
- flagName: "--nvidia-api-key",
587
- envVar: "NVIDIA_API_KEY",
588
- runtime,
589
- });
590
- if (!resolved)
591
- return null;
592
- if (resolved.source !== "profile")
593
- setNvidiaApiKey(resolved.key);
594
- nextConfig = applyAuthProfileConfig(nextConfig, {
595
- profileId: "nvidia:default",
596
- provider: "nvidia",
597
- mode: "api_key",
598
- });
599
- return applyNvidiaConfig(nextConfig);
600
- }
601
616
  if (authChoice === "custom-api-key") {
602
617
  try {
603
618
  const customAuth = parseNonInteractiveCustomApiFlags({
@@ -133,4 +133,18 @@ export const ONBOARD_PROVIDER_AUTH_FLAGS = [
133
133
  cliOption: "--qianfan-api-key <key>",
134
134
  description: "QIANFAN API key",
135
135
  },
136
+ {
137
+ optionKey: "volcengineApiKey",
138
+ authChoice: "volcengine-api-key",
139
+ cliFlag: "--volcengine-api-key",
140
+ cliOption: "--volcengine-api-key <key>",
141
+ description: "Volcano Engine API key",
142
+ },
143
+ {
144
+ optionKey: "byteplusApiKey",
145
+ authChoice: "byteplus-api-key",
146
+ cliFlag: "--byteplus-api-key",
147
+ cliOption: "--byteplus-api-key <key>",
148
+ description: "BytePlus API key",
149
+ },
136
150
  ];
@@ -1,20 +1,24 @@
1
1
  import { discoverGatewayBeacons } from "../infra/bonjour-discovery.js";
2
+ import { resolveWideAreaDiscoveryDomain } from "../infra/widearea-dns.js";
2
3
  import { detectBinary } from "./onboard-helpers.js";
3
4
  const DEFAULT_GATEWAY_URL = "ws://127.0.0.1:18789";
4
5
  function pickHost(beacon) {
5
- return beacon.tailnetDns || beacon.lanHost || beacon.host;
6
+ // Security: TXT is unauthenticated. Prefer the resolved service endpoint host.
7
+ return beacon.host || beacon.tailnetDns || beacon.lanHost;
6
8
  }
7
9
  function buildLabel(beacon) {
8
10
  const host = pickHost(beacon);
9
- const port = beacon.gatewayPort ?? beacon.port ?? 18789;
11
+ // Security: Prefer the resolved service endpoint port.
12
+ const port = beacon.port ?? beacon.gatewayPort ?? 18789;
10
13
  const title = beacon.displayName ?? beacon.instanceName;
11
14
  const hint = host ? `${host}:${port}` : "host unknown";
12
15
  return `${title} (${hint})`;
13
16
  }
14
17
  function ensureWsUrl(value) {
15
18
  const trimmed = value.trim();
16
- if (!trimmed)
19
+ if (!trimmed) {
17
20
  return DEFAULT_GATEWAY_URL;
21
+ }
18
22
  return trimmed;
19
23
  }
20
24
  export async function promptRemoteGatewayConfig(cfg, prompter) {
@@ -34,8 +38,11 @@ export async function promptRemoteGatewayConfig(cfg, prompter) {
34
38
  ].join("\n"), "Discovery");
35
39
  }
36
40
  if (wantsDiscover) {
41
+ const wideAreaDomain = resolveWideAreaDiscoveryDomain({
42
+ configDomain: cfg.discovery?.wideArea?.domain,
43
+ });
37
44
  const spin = prompter.progress("Searching for gateways…");
38
- const beacons = await discoverGatewayBeacons({ timeoutMs: 2000 });
45
+ const beacons = await discoverGatewayBeacons({ timeoutMs: 2000, wideAreaDomain });
39
46
  spin.stop(beacons.length > 0 ? `Found ${beacons.length} gateway(s)` : "No gateways found");
40
47
  if (beacons.length > 0) {
41
48
  const selection = await prompter.select({
@@ -56,7 +63,7 @@ export async function promptRemoteGatewayConfig(cfg, prompter) {
56
63
  }
57
64
  if (selectedBeacon) {
58
65
  const host = pickHost(selectedBeacon);
59
- const port = selectedBeacon.gatewayPort ?? 18789;
66
+ const port = selectedBeacon.port ?? selectedBeacon.gatewayPort ?? 18789;
60
67
  if (host) {
61
68
  const mode = await prompter.select({
62
69
  message: "Connection method",
@@ -89,13 +96,13 @@ export async function promptRemoteGatewayConfig(cfg, prompter) {
89
96
  : "URL must start with ws:// or wss://",
90
97
  });
91
98
  const url = ensureWsUrl(String(urlInput));
92
- const authChoice = (await prompter.select({
99
+ const authChoice = await prompter.select({
93
100
  message: "Gateway auth",
94
101
  options: [
95
102
  { value: "token", label: "Token (recommended)" },
96
103
  { value: "off", label: "No auth" },
97
104
  ],
98
- }));
105
+ });
99
106
  let token = cfg.gateway?.remote?.token ?? "";
100
107
  if (authChoice === "token") {
101
108
  token = String(await prompter.text({
@@ -1,31 +1,28 @@
1
+ import { formatCliCommand } from "../cli/command-format.js";
1
2
  import { readConfigFileSnapshot } from "../config/config.js";
2
3
  import { assertSupportedRuntime } from "../infra/runtime-guard.js";
3
4
  import { defaultRuntime } from "../runtime.js";
4
5
  import { resolveUserPath } from "../utils.js";
6
+ import { isDeprecatedAuthChoice, normalizeLegacyOnboardAuthChoice } from "./auth-choice-legacy.js";
5
7
  import { DEFAULT_WORKSPACE, handleReset } from "./onboard-helpers.js";
6
8
  import { runInteractiveOnboarding } from "./onboard-interactive.js";
7
9
  import { runNonInteractiveOnboarding } from "./onboard-non-interactive.js";
8
- import { formatCliCommand } from "../cli/command-format.js";
9
10
  export async function onboardCommand(opts, runtime = defaultRuntime) {
10
11
  assertSupportedRuntime(runtime);
11
- const authChoice = opts.authChoice === "oauth" ? "setup-token" : opts.authChoice;
12
- const normalizedAuthChoice = authChoice === "claude-cli"
13
- ? "setup-token"
14
- : authChoice === "codex-cli"
15
- ? "openai-codex"
16
- : authChoice;
17
- if (opts.nonInteractive && (authChoice === "claude-cli" || authChoice === "codex-cli")) {
12
+ const originalAuthChoice = opts.authChoice;
13
+ const normalizedAuthChoice = normalizeLegacyOnboardAuthChoice(originalAuthChoice);
14
+ if (opts.nonInteractive && isDeprecatedAuthChoice(originalAuthChoice)) {
18
15
  runtime.error([
19
- `Auth choice "${authChoice}" is deprecated.`,
16
+ `Auth choice "${String(originalAuthChoice)}" is deprecated.`,
20
17
  'Use "--auth-choice token" (Anthropic setup-token) or "--auth-choice openai-codex".',
21
18
  ].join("\n"));
22
19
  runtime.exit(1);
23
20
  return;
24
21
  }
25
- if (authChoice === "claude-cli") {
22
+ if (originalAuthChoice === "claude-cli") {
26
23
  runtime.log('Auth choice "claude-cli" is deprecated; using setup-token flow instead.');
27
24
  }
28
- if (authChoice === "codex-cli") {
25
+ if (originalAuthChoice === "codex-cli") {
29
26
  runtime.log('Auth choice "codex-cli" is deprecated; using OpenAI Codex OAuth instead.');
30
27
  }
31
28
  const flow = opts.flow === "manual" ? "advanced" : opts.flow;
@@ -49,8 +46,9 @@ export async function onboardCommand(opts, runtime = defaultRuntime) {
49
46
  }
50
47
  if (process.platform === "win32") {
51
48
  runtime.log([
52
- "Windows detected.",
53
- "WSL2 is strongly recommended; native Windows is untested and more problematic.",
49
+ "Windows detected — Pool Bot runs great on WSL2!",
50
+ "Native Windows might be trickier.",
51
+ "Quick setup: wsl --install (one command, one reboot)",
54
52
  "Guide: https://docs.molt.bot/windows",
55
53
  ].join("\n"));
56
54
  }
@@ -2,7 +2,8 @@
2
2
  * Display utilities for sandbox CLI
3
3
  */
4
4
  import { formatCliCommand } from "../cli/command-format.js";
5
- import { formatAge, formatImageMatch, formatSimpleStatus, formatStatus, } from "./sandbox-formatters.js";
5
+ import { formatDurationCompact } from "../infra/format-time/format-duration.js";
6
+ import { formatImageMatch, formatSimpleStatus, formatStatus } from "./sandbox-formatters.js";
6
7
  function displayItems(items, config, runtime) {
7
8
  if (items.length === 0) {
8
9
  runtime.log(config.emptyMessage);
@@ -21,8 +22,8 @@ export function displayContainers(containers, runtime) {
21
22
  rt.log(` ${container.containerName}`);
22
23
  rt.log(` Status: ${formatStatus(container.running)}`);
23
24
  rt.log(` Image: ${container.image} ${formatImageMatch(container.imageMatch)}`);
24
- rt.log(` Age: ${formatAge(Date.now() - container.createdAtMs)}`);
25
- rt.log(` Idle: ${formatAge(Date.now() - container.lastUsedAtMs)}`);
25
+ rt.log(` Age: ${formatDurationCompact(Date.now() - container.createdAtMs, { spaced: true }) ?? "0s"}`);
26
+ rt.log(` Idle: ${formatDurationCompact(Date.now() - container.lastUsedAtMs, { spaced: true }) ?? "0s"}`);
26
27
  rt.log(` Session: ${container.sessionKey}`);
27
28
  rt.log("");
28
29
  },
@@ -40,8 +41,8 @@ export function displayBrowsers(browsers, runtime) {
40
41
  if (browser.noVncPort) {
41
42
  rt.log(` noVNC: ${browser.noVncPort}`);
42
43
  }
43
- rt.log(` Age: ${formatAge(Date.now() - browser.createdAtMs)}`);
44
- rt.log(` Idle: ${formatAge(Date.now() - browser.lastUsedAtMs)}`);
44
+ rt.log(` Age: ${formatDurationCompact(Date.now() - browser.createdAtMs, { spaced: true }) ?? "0s"}`);
45
+ rt.log(` Idle: ${formatDurationCompact(Date.now() - browser.lastUsedAtMs, { spaced: true }) ?? "0s"}`);
45
46
  rt.log(` Session: ${browser.sessionKey}`);
46
47
  rt.log("");
47
48
  },
@@ -1,7 +1,7 @@
1
1
  import { resolveGatewayLogPaths } from "../../daemon/launchd.js";
2
2
  import { formatPortDiagnostics } from "../../infra/ports.js";
3
3
  import { summarizeRestartSentinel, } from "../../infra/restart-sentinel.js";
4
- import { formatAge, redactSecrets } from "./format.js";
4
+ import { formatTimeAgo, redactSecrets } from "./format.js";
5
5
  import { readFileTailLines, summarizeLogTail } from "./gateway.js";
6
6
  export async function appendStatusAllDiagnosis(params) {
7
7
  const { lines, muted, ok, warn, fail } = params;
@@ -11,7 +11,7 @@ export async function appendStatusAllDiagnosis(params) {
11
11
  lines.push(`${icon} ${colored}`);
12
12
  };
13
13
  lines.push("");
14
- lines.push(`${muted("Gateway connection details:")}`);
14
+ lines.push(muted("Gateway connection details:"));
15
15
  for (const line of redactSecrets(params.connectionDetailsForReport)
16
16
  .split("\n")
17
17
  .map((l) => l.trimEnd())) {
@@ -40,7 +40,7 @@ export async function appendStatusAllDiagnosis(params) {
40
40
  }
41
41
  if (params.sentinel?.payload) {
42
42
  emitCheck("Restart sentinel present", "warn");
43
- lines.push(` ${muted(`${summarizeRestartSentinel(params.sentinel.payload)} · ${formatAge(Date.now() - params.sentinel.payload.ts)}`)}`);
43
+ lines.push(` ${muted(`${summarizeRestartSentinel(params.sentinel.payload)} · ${formatTimeAgo(Date.now() - params.sentinel.payload.ts)}`)}`);
44
44
  }
45
45
  else {
46
46
  emitCheck("Restart sentinel: none", "ok");
@@ -49,7 +49,7 @@ export async function appendStatusAllDiagnosis(params) {
49
49
  const isTrivialLastErr = lastErrClean.length < 8 || lastErrClean === "}" || lastErrClean === "{";
50
50
  if (lastErrClean && !isTrivialLastErr) {
51
51
  lines.push("");
52
- lines.push(`${muted("Gateway last log line:")}`);
52
+ lines.push(muted("Gateway last log line:"));
53
53
  lines.push(` ${muted(redactSecrets(lastErrClean))}`);
54
54
  }
55
55
  if (params.portUsage) {
@@ -101,7 +101,7 @@ export async function appendStatusAllDiagnosis(params) {
101
101
  ]);
102
102
  if (stderrTail.length > 0 || stdoutTail.length > 0) {
103
103
  lines.push("");
104
- lines.push(`${muted(`Gateway logs (tail, summarized): ${logPaths.logDir}`)}`);
104
+ lines.push(muted(`Gateway logs (tail, summarized): ${logPaths.logDir}`));
105
105
  lines.push(` ${muted(`# stderr: ${logPaths.stderrPath}`)}`);
106
106
  for (const line of summarizeLogTail(stderrTail, { maxLines: 22 }).map(redactSecrets)) {
107
107
  lines.push(` ${muted(line)}`);
@@ -127,16 +127,20 @@ export async function appendStatusAllDiagnosis(params) {
127
127
  emitCheck(`Channel issues skipped (gateway ${params.gatewayReachable ? "query failed" : "unreachable"})`, "warn");
128
128
  }
129
129
  const healthErr = (() => {
130
- if (!params.health || typeof params.health !== "object")
130
+ if (!params.health || typeof params.health !== "object") {
131
131
  return "";
132
+ }
132
133
  const record = params.health;
133
- if (!("error" in record))
134
+ if (!("error" in record)) {
134
135
  return "";
136
+ }
135
137
  const value = record.error;
136
- if (!value)
138
+ if (!value) {
137
139
  return "";
138
- if (typeof value === "string")
140
+ }
141
+ if (typeof value === "string") {
139
142
  return value;
143
+ }
140
144
  try {
141
145
  return JSON.stringify(value, null, 2);
142
146
  }
@@ -146,7 +150,7 @@ export async function appendStatusAllDiagnosis(params) {
146
150
  })();
147
151
  if (healthErr) {
148
152
  lines.push("");
149
- lines.push(`${muted("Gateway health:")}`);
153
+ lines.push(muted("Gateway health:"));
150
154
  lines.push(` ${muted(redactSecrets(healthErr))}`);
151
155
  }
152
156
  lines.push("");