@poolzin/pool-bot 2026.1.38 → 2026.2.0

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 (336) hide show
  1. package/assets/chrome-extension/README.md +3 -3
  2. package/assets/chrome-extension/background.js +5 -5
  3. package/assets/chrome-extension/manifest.json +3 -3
  4. package/assets/chrome-extension/options.html +4 -4
  5. package/assets/chrome-extension/options.js +1 -1
  6. package/dist/acp/client.js +3 -3
  7. package/dist/acp/types.js +1 -1
  8. package/dist/agents/agent-paths.js +3 -3
  9. package/dist/agents/auth-profiles/paths.js +3 -3
  10. package/dist/agents/cli-runner/helpers.js +1 -1
  11. package/dist/agents/cli-runner.js +2 -2
  12. package/dist/agents/cloudflare-ai-gateway.js +31 -0
  13. package/dist/agents/compaction.js +16 -2
  14. package/dist/agents/context-window-guard.js +13 -10
  15. package/dist/agents/context.js +4 -4
  16. package/dist/agents/docs-path.js +1 -1
  17. package/dist/agents/minimax-vlm.js +1 -1
  18. package/dist/agents/model-auth.js +12 -1
  19. package/dist/agents/model-catalog.js +4 -4
  20. package/dist/agents/model-selection.js +10 -4
  21. package/dist/agents/models-config.js +3 -3
  22. package/dist/agents/models-config.providers.js +147 -39
  23. package/dist/agents/pi-embedded-helpers/openai.js +1 -1
  24. package/dist/agents/pi-embedded-runner/compact.js +8 -8
  25. package/dist/agents/pi-embedded-runner/model.js +2 -2
  26. package/dist/agents/pi-embedded-runner/run/attempt.js +6 -6
  27. package/dist/agents/pi-embedded-runner/run.js +4 -4
  28. package/dist/agents/pi-embedded-runner/tool-result-truncation.js +275 -0
  29. package/dist/agents/pi-embedded-runner/utils.js +1 -1
  30. package/dist/agents/pi-model-discovery.js +10 -0
  31. package/dist/agents/pi-tool-definition-adapter.js +50 -9
  32. package/dist/agents/pi-tools.before-tool-call.js +67 -0
  33. package/dist/agents/pi-tools.js +10 -5
  34. package/dist/agents/pi-tools.read.js +2 -2
  35. package/dist/agents/session-file-repair.js +83 -0
  36. package/dist/agents/session-transcript-repair.js +68 -0
  37. package/dist/agents/skills/frontmatter.js +1 -1
  38. package/dist/agents/skills/workspace.js +2 -2
  39. package/dist/agents/system-prompt.js +28 -4
  40. package/dist/agents/together-models.js +127 -0
  41. package/dist/agents/tool-images.js +1 -1
  42. package/dist/agents/tool-policy.js +1 -1
  43. package/dist/agents/tools/browser-tool.js +3 -3
  44. package/dist/agents/tools/image-tool.js +2 -2
  45. package/dist/agents/tools/memory-tool.js +94 -7
  46. package/dist/agents/tools/web-search.js +1 -1
  47. package/dist/agents/workspace.js +1 -5
  48. package/dist/auto-reply/commands-registry.data.js +1 -1
  49. package/dist/auto-reply/reply/commands-context-report.js +2 -2
  50. package/dist/auto-reply/reply/commands-session.js +2 -2
  51. package/dist/auto-reply/reply/get-reply-run.js +14 -4
  52. package/dist/auto-reply/reply/groups.js +1 -1
  53. package/dist/auto-reply/reply/inbound-context.js +4 -0
  54. package/dist/auto-reply/reply/inbound-meta.js +130 -0
  55. package/dist/auto-reply/reply/untrusted-context.js +15 -0
  56. package/dist/auto-reply/status.js +1 -1
  57. package/dist/browser/client-fetch.js +1 -1
  58. package/dist/browser/config.js +1 -1
  59. package/dist/browser/extension-relay.js +3 -3
  60. package/dist/browser/server-context.js +2 -2
  61. package/dist/build-info.json +3 -3
  62. package/dist/canvas-host/a2ui.js +3 -3
  63. package/dist/channels/plugins/agent-tools/whatsapp-login.js +1 -17
  64. package/dist/channels/plugins/catalog.js +2 -2
  65. package/dist/channels/plugins/onboarding/imessage.js +1 -1
  66. package/dist/channels/plugins/onboarding/signal.js +1 -1
  67. package/dist/channels/plugins/onboarding/slack.js +4 -4
  68. package/dist/channels/plugins/onboarding/whatsapp.js +3 -3
  69. package/dist/channels/plugins/pairing-message.js +1 -1
  70. package/dist/cli/browser-cli-extension.js +2 -2
  71. package/dist/cli/docs-cli.js +1 -1
  72. package/dist/cli/gateway-cli/dev.js +1 -1
  73. package/dist/cli/memory-cli.js +25 -15
  74. package/dist/cli/nodes-cli/register.canvas.js +1 -1
  75. package/dist/cli/plugins-cli.js +1 -1
  76. package/dist/cli/run-main.js +2 -2
  77. package/dist/cli/security-cli.js +1 -1
  78. package/dist/cli/tagline.js +1 -1
  79. package/dist/cli/update-cli.js +4 -4
  80. package/dist/cli/webhooks-cli.js +5 -5
  81. package/dist/commands/agents.commands.add.js +1 -1
  82. package/dist/commands/auth-choice.apply.api-providers.js +305 -17
  83. package/dist/commands/auth-choice.apply.js +4 -1
  84. package/dist/commands/auth-choice.apply.plugin-provider.js +2 -2
  85. package/dist/commands/auth-choice.apply.xai.js +63 -0
  86. package/dist/commands/auth-choice.preferred-provider.js +7 -1
  87. package/dist/commands/configure.wizard.js +1 -1
  88. package/dist/commands/dashboard.js +1 -1
  89. package/dist/commands/docs.js +1 -1
  90. package/dist/commands/doctor-gateway-services.js +3 -3
  91. package/dist/commands/doctor-state-integrity.js +2 -14
  92. package/dist/commands/doctor-update.js +3 -3
  93. package/dist/commands/doctor.js +1 -1
  94. package/dist/commands/models/list.probe.js +2 -2
  95. package/dist/commands/models/list.registry.js +4 -4
  96. package/dist/commands/models/list.status-command.js +2 -2
  97. package/dist/commands/onboard-auth.config-core.js +366 -28
  98. package/dist/commands/onboard-auth.credentials.js +71 -9
  99. package/dist/commands/onboard-auth.js +3 -3
  100. package/dist/commands/onboard-auth.models.js +26 -24
  101. package/dist/commands/onboard-non-interactive/local/auth-choice.js +140 -6
  102. package/dist/commands/status-all/report-lines.js +1 -1
  103. package/dist/commands/status.command.js +1 -1
  104. package/dist/commands/uninstall.js +3 -3
  105. package/dist/compat/legacy-names.js +1 -1
  106. package/dist/config/io.js +3 -3
  107. package/dist/config/schema.js +1 -1
  108. package/dist/config/types.js +0 -1
  109. package/dist/config/types.memory.js +1 -0
  110. package/dist/config/version.js +4 -4
  111. package/dist/config/zod-schema.js +0 -6
  112. package/dist/daemon/constants.js +7 -7
  113. package/dist/daemon/inspect.js +6 -6
  114. package/dist/daemon/systemd-unit.js +1 -1
  115. package/dist/discord/monitor/message-handler.process.js +6 -4
  116. package/dist/gateway/client.js +0 -14
  117. package/dist/gateway/live-image-probe.js +1 -66
  118. package/dist/gateway/openai-http.js +2 -2
  119. package/dist/gateway/openresponses-http.js +4 -4
  120. package/dist/gateway/server-discovery.js +2 -2
  121. package/dist/gateway/server-http.js +1 -1
  122. package/dist/gateway/server.impl.js +2 -6
  123. package/dist/hooks/frontmatter.js +1 -1
  124. package/dist/hooks/hooks-status.js +1 -1
  125. package/dist/hooks/install.js +2 -2
  126. package/dist/hooks/loader.js +1 -1
  127. package/dist/hooks/workspace.js +3 -3
  128. package/dist/index.js +2 -2
  129. package/dist/infra/bonjour.js +3 -3
  130. package/dist/infra/path-env.js +3 -3
  131. package/dist/infra/provider-usage.fetch.minimax.js +1 -1
  132. package/dist/infra/restart.js +1 -1
  133. package/dist/infra/tailscale.js +1 -1
  134. package/dist/macos/relay.js +2 -2
  135. package/dist/media/input-files.js +1 -1
  136. package/dist/media/mime.js +4 -0
  137. package/dist/media/png-encode.js +74 -0
  138. package/dist/media-understanding/providers/image.js +2 -2
  139. package/dist/memory/backend-config.js +207 -0
  140. package/dist/memory/embeddings.js +1 -1
  141. package/dist/memory/index.js +0 -5
  142. package/dist/memory/manager.js +3 -25
  143. package/dist/memory/types.js +1 -0
  144. package/dist/node-host/runner.js +2 -2
  145. package/dist/pairing/pairing-messages.js +1 -1
  146. package/dist/plugins/discovery.js +1 -1
  147. package/dist/plugins/install.js +2 -2
  148. package/dist/plugins/update.js +1 -1
  149. package/dist/security/audit.js +2 -2
  150. package/dist/shared/text/reasoning-tags.js +52 -7
  151. package/dist/slack/monitor/message-handler/prepare.js +10 -4
  152. package/dist/slack/monitor/slash.js +10 -4
  153. package/dist/tailscale/detect.js +146 -0
  154. package/dist/telegram/bot-message-context.js +1 -1
  155. package/dist/test-helpers/workspace.js +11 -0
  156. package/dist/test-utils/channel-plugins.js +82 -0
  157. package/dist/test-utils/ports.js +73 -0
  158. package/dist/utils/shell-argv.js +61 -0
  159. package/dist/utils.js +10 -0
  160. package/dist/web/qr-image.js +1 -61
  161. package/dist/wizard/onboarding.finalize.js +7 -7
  162. package/dist/wizard/onboarding.js +3 -3
  163. package/docs/RELEASE_WORKFOTS_COMPARISON.md +3 -3
  164. package/docs/_config.yml +2 -2
  165. package/docs/_layouts/default.html +9 -9
  166. package/docs/concepts/typebox.md +1 -1
  167. package/docs/docs.json +1 -1
  168. package/docs/northflank.mdx +7 -7
  169. package/docs/railway.mdx +3 -3
  170. package/docs/render.mdx +5 -5
  171. package/docs/start/lore.md +2 -2
  172. package/extensions/bluebubbles/index.ts +2 -2
  173. package/extensions/bluebubbles/package.json +1 -1
  174. package/extensions/bluebubbles/src/accounts.ts +8 -8
  175. package/extensions/bluebubbles/src/actions.test.ts +22 -22
  176. package/extensions/bluebubbles/src/actions.ts +5 -5
  177. package/extensions/bluebubbles/src/attachments.ts +2 -2
  178. package/extensions/bluebubbles/src/channel.ts +16 -16
  179. package/extensions/bluebubbles/src/chat.ts +2 -2
  180. package/extensions/bluebubbles/src/media-send.ts +2 -2
  181. package/extensions/bluebubbles/src/monitor.test.ts +46 -46
  182. package/extensions/bluebubbles/src/monitor.ts +5 -5
  183. package/extensions/bluebubbles/src/onboarding.ts +7 -7
  184. package/extensions/bluebubbles/src/reactions.ts +2 -2
  185. package/extensions/bluebubbles/src/send.ts +2 -2
  186. package/extensions/copilot-proxy/README.md +1 -1
  187. package/extensions/copilot-proxy/package.json +1 -1
  188. package/extensions/diagnostics-otel/index.ts +2 -2
  189. package/extensions/diagnostics-otel/package.json +1 -1
  190. package/extensions/diagnostics-otel/src/service.ts +3 -3
  191. package/extensions/discord/index.ts +2 -2
  192. package/extensions/discord/package.json +1 -1
  193. package/extensions/google-antigravity-auth/README.md +1 -1
  194. package/extensions/google-antigravity-auth/index.ts +1 -1
  195. package/extensions/google-antigravity-auth/package.json +1 -1
  196. package/extensions/google-gemini-cli-auth/README.md +1 -1
  197. package/extensions/google-gemini-cli-auth/oauth.ts +1 -1
  198. package/extensions/google-gemini-cli-auth/package.json +1 -1
  199. package/extensions/googlechat/index.ts +3 -3
  200. package/extensions/googlechat/package.json +1 -1
  201. package/extensions/googlechat/src/accounts.ts +8 -8
  202. package/extensions/googlechat/src/actions.ts +6 -6
  203. package/extensions/googlechat/src/channel.ts +21 -21
  204. package/extensions/googlechat/src/monitor.ts +8 -8
  205. package/extensions/googlechat/src/onboarding.ts +10 -10
  206. package/extensions/imessage/index.ts +2 -2
  207. package/extensions/imessage/package.json +1 -1
  208. package/extensions/line/index.ts +2 -2
  209. package/extensions/line/package.json +1 -1
  210. package/extensions/line/src/card-command.ts +2 -2
  211. package/extensions/line/src/channel.logout.test.ts +4 -4
  212. package/extensions/line/src/channel.sendPayload.test.ts +8 -8
  213. package/extensions/line/src/channel.ts +3 -3
  214. package/extensions/llm-task/README.md +3 -3
  215. package/extensions/llm-task/index.ts +2 -2
  216. package/extensions/llm-task/package.json +1 -1
  217. package/extensions/llm-task/src/llm-task-tool.ts +4 -4
  218. package/extensions/lobster/README.md +6 -6
  219. package/extensions/lobster/index.ts +2 -2
  220. package/extensions/lobster/src/lobster-tool.test.ts +4 -4
  221. package/extensions/lobster/src/lobster-tool.ts +2 -2
  222. package/extensions/matrix/index.ts +2 -2
  223. package/extensions/matrix/package.json +1 -1
  224. package/extensions/matrix/src/matrix/client/config.ts +1 -1
  225. package/extensions/matrix/src/matrix/monitor/handler.ts +1 -1
  226. package/extensions/matrix/src/onboarding.ts +1 -1
  227. package/extensions/mattermost/index.ts +2 -2
  228. package/extensions/mattermost/package.json +1 -1
  229. package/extensions/mattermost/src/mattermost/accounts.ts +8 -8
  230. package/extensions/mattermost/src/mattermost/monitor-helpers.ts +5 -5
  231. package/extensions/mattermost/src/mattermost/monitor.ts +2 -2
  232. package/extensions/mattermost/src/onboarding-helpers.ts +3 -3
  233. package/extensions/mattermost/src/onboarding.ts +2 -2
  234. package/extensions/memory-core/index.ts +2 -2
  235. package/extensions/memory-core/package.json +1 -4
  236. package/extensions/memory-lancedb/index.ts +3 -3
  237. package/extensions/memory-lancedb/package.json +1 -1
  238. package/extensions/msteams/index.ts +2 -2
  239. package/extensions/msteams/package.json +1 -1
  240. package/extensions/msteams/src/channel.directory.test.ts +2 -2
  241. package/extensions/msteams/src/channel.ts +2 -2
  242. package/extensions/msteams/src/graph-upload.ts +4 -4
  243. package/extensions/msteams/src/monitor-handler.ts +2 -2
  244. package/extensions/msteams/src/monitor.ts +2 -2
  245. package/extensions/msteams/src/onboarding.ts +9 -9
  246. package/extensions/msteams/src/reply-dispatcher.ts +2 -2
  247. package/extensions/msteams/src/send-context.ts +2 -2
  248. package/extensions/msteams/src/send.ts +4 -4
  249. package/extensions/nextcloud-talk/index.ts +2 -2
  250. package/extensions/nextcloud-talk/package.json +1 -1
  251. package/extensions/nextcloud-talk/src/channel.ts +7 -7
  252. package/extensions/nextcloud-talk/src/inbound.ts +7 -7
  253. package/extensions/nextcloud-talk/src/onboarding.ts +1 -1
  254. package/extensions/nostr/README.md +2 -2
  255. package/extensions/nostr/index.ts +5 -5
  256. package/extensions/nostr/package.json +1 -1
  257. package/extensions/nostr/src/types.ts +4 -4
  258. package/extensions/open-prose/index.ts +2 -2
  259. package/extensions/qwen-portal-auth/README.md +1 -1
  260. package/extensions/signal/index.ts +2 -2
  261. package/extensions/signal/package.json +1 -1
  262. package/extensions/slack/index.ts +2 -2
  263. package/extensions/slack/package.json +1 -1
  264. package/extensions/telegram/index.ts +2 -2
  265. package/extensions/telegram/package.json +1 -1
  266. package/extensions/telegram/src/channel.ts +2 -2
  267. package/extensions/tlon/README.md +2 -2
  268. package/extensions/tlon/index.ts +2 -2
  269. package/extensions/tlon/package.json +1 -1
  270. package/extensions/tlon/src/channel.ts +13 -13
  271. package/extensions/tlon/src/monitor/index.ts +3 -3
  272. package/extensions/tlon/src/onboarding.ts +3 -3
  273. package/extensions/tlon/src/types.ts +3 -3
  274. package/extensions/twitch/README.md +1 -1
  275. package/extensions/twitch/index.ts +2 -2
  276. package/extensions/twitch/package.json +1 -1
  277. package/extensions/twitch/src/config.ts +3 -3
  278. package/extensions/twitch/src/monitor.ts +3 -3
  279. package/extensions/twitch/src/onboarding.ts +9 -9
  280. package/extensions/twitch/src/outbound.test.ts +2 -2
  281. package/extensions/twitch/src/plugin.test.ts +2 -2
  282. package/extensions/twitch/src/plugin.ts +8 -8
  283. package/extensions/twitch/src/send.test.ts +2 -2
  284. package/extensions/twitch/src/send.ts +4 -4
  285. package/extensions/twitch/src/token.test.ts +8 -8
  286. package/extensions/twitch/src/token.ts +3 -3
  287. package/extensions/twitch/src/twitch-client.ts +3 -3
  288. package/extensions/twitch/src/types.ts +3 -3
  289. package/extensions/twitch/src/utils/markdown.ts +1 -1
  290. package/extensions/voice-call/README.md +3 -3
  291. package/extensions/voice-call/package.json +1 -1
  292. package/extensions/voice-call/src/core-bridge.ts +2 -2
  293. package/extensions/voice-call/src/response-generator.ts +1 -1
  294. package/extensions/whatsapp/index.ts +2 -2
  295. package/extensions/whatsapp/package.json +1 -1
  296. package/extensions/zalo/README.md +1 -1
  297. package/extensions/zalo/index.ts +2 -2
  298. package/extensions/zalo/package.json +1 -1
  299. package/extensions/zalo/src/accounts.ts +8 -8
  300. package/extensions/zalo/src/actions.ts +4 -4
  301. package/extensions/zalo/src/channel.directory.test.ts +2 -2
  302. package/extensions/zalo/src/channel.ts +18 -18
  303. package/extensions/zalo/src/monitor.ts +9 -9
  304. package/extensions/zalo/src/monitor.webhook.test.ts +2 -2
  305. package/extensions/zalo/src/onboarding.ts +24 -24
  306. package/extensions/zalo/src/send.ts +2 -2
  307. package/extensions/zalouser/README.md +2 -2
  308. package/extensions/zalouser/index.ts +2 -2
  309. package/extensions/zalouser/package.json +1 -1
  310. package/extensions/zalouser/src/accounts.ts +9 -9
  311. package/extensions/zalouser/src/channel.ts +24 -24
  312. package/extensions/zalouser/src/monitor.ts +4 -4
  313. package/extensions/zalouser/src/onboarding.ts +28 -28
  314. package/package.json +13 -250
  315. package/skills/nano-banana-pro/scripts/generate_image.py +1 -1
  316. package/skills/tmux/scripts/find-sessions.sh +1 -1
  317. package/CHANGELOG.md +0 -200
  318. package/README-header.png +0 -0
  319. package/git-hooks/pre-commit +0 -4
  320. package/scripts/format-staged.js +0 -148
  321. package/scripts/postinstall.js +0 -300
  322. package/scripts/setup-git-hooks.js +0 -96
  323. package/skills/webgpu-threejs-tsl/REFERENCE.md +0 -283
  324. package/skills/webgpu-threejs-tsl/SKILL.md +0 -91
  325. package/skills/webgpu-threejs-tsl/docs/compute-shaders.md +0 -404
  326. package/skills/webgpu-threejs-tsl/docs/core-concepts.md +0 -453
  327. package/skills/webgpu-threejs-tsl/docs/materials.md +0 -353
  328. package/skills/webgpu-threejs-tsl/docs/post-processing.md +0 -434
  329. package/skills/webgpu-threejs-tsl/docs/wgsl-integration.md +0 -324
  330. package/skills/webgpu-threejs-tsl/examples/basic-setup.js +0 -87
  331. package/skills/webgpu-threejs-tsl/examples/custom-material.js +0 -170
  332. package/skills/webgpu-threejs-tsl/examples/earth-shader.js +0 -292
  333. package/skills/webgpu-threejs-tsl/examples/particle-system.js +0 -259
  334. package/skills/webgpu-threejs-tsl/examples/post-processing.js +0 -199
  335. package/skills/webgpu-threejs-tsl/templates/compute-shader.js +0 -305
  336. package/skills/webgpu-threejs-tsl/templates/webgpu-project.js +0 -276
@@ -317,7 +317,7 @@ export async function updateStatusCommand(opts) {
317
317
  Value: updateAvailability.available ? theme.warn(`available · ${updateLine}`) : updateLine,
318
318
  },
319
319
  ];
320
- defaultRuntime.log(theme.heading("Moltbot update status"));
320
+ defaultRuntime.log(theme.heading("Poolbot update status"));
321
321
  defaultRuntime.log("");
322
322
  defaultRuntime.log(renderTable({
323
323
  width: tableWidth,
@@ -540,7 +540,7 @@ export async function updateCommand(opts) {
540
540
  }
541
541
  const showProgress = !opts.json && process.stdout.isTTY;
542
542
  if (!opts.json) {
543
- defaultRuntime.log(theme.heading("Updating Moltbot..."));
543
+ defaultRuntime.log(theme.heading("Updating Poolbot..."));
544
544
  defaultRuntime.log("");
545
545
  }
546
546
  const { progress, stop } = createUpdateProgress(showProgress);
@@ -666,7 +666,7 @@ export async function updateCommand(opts) {
666
666
  defaultRuntime.log(theme.warn("Skipped: working directory has uncommitted changes. Commit or stash them first."));
667
667
  }
668
668
  if (result.reason === "not-git-install") {
669
- defaultRuntime.log(theme.warn(`Skipped: this Moltbot install isn't a git checkout, and the package manager couldn't be detected. Update via your package manager, then run \`${replaceCliName(formatCliCommand("poolbot doctor"), CLI_NAME)}\` and \`${replaceCliName(formatCliCommand("poolbot gateway restart"), CLI_NAME)}\`.`));
669
+ defaultRuntime.log(theme.warn(`Skipped: this Poolbot install isn't a git checkout, and the package manager couldn't be detected. Update via your package manager, then run \`${replaceCliName(formatCliCommand("poolbot doctor"), CLI_NAME)}\` and \`${replaceCliName(formatCliCommand("poolbot gateway restart"), CLI_NAME)}\`.`));
670
670
  defaultRuntime.log(theme.muted(`Examples: \`${replaceCliName("npm i -g poolbot@latest", CLI_NAME)}\` or \`${replaceCliName("pnpm add -g poolbot@latest", CLI_NAME)}\``));
671
671
  }
672
672
  defaultRuntime.exit(0);
@@ -911,7 +911,7 @@ export async function updateWizardCommand(opts = {}) {
911
911
  export function registerUpdateCli(program) {
912
912
  const update = program
913
913
  .command("update")
914
- .description("Update Moltbot to the latest version")
914
+ .description("Update Poolbot to the latest version")
915
915
  .option("--json", "Output result as JSON", false)
916
916
  .option("--no-restart", "Skip restarting the gateway service after a successful update")
917
917
  .option("--channel <stable|beta|dev>", "Persist update channel (git + npm)")
@@ -12,14 +12,14 @@ export function registerWebhooksCli(program) {
12
12
  const gmail = webhooks.command("gmail").description("Gmail Pub/Sub hooks (via gogcli)");
13
13
  gmail
14
14
  .command("setup")
15
- .description("Configure Gmail watch + Pub/Sub + Moltbot hooks")
15
+ .description("Configure Gmail watch + Pub/Sub + Poolbot hooks")
16
16
  .requiredOption("--account <email>", "Gmail account to watch")
17
17
  .option("--project <id>", "GCP project id (OAuth client owner)")
18
18
  .option("--topic <name>", "Pub/Sub topic name", DEFAULT_GMAIL_TOPIC)
19
19
  .option("--subscription <name>", "Pub/Sub subscription name", DEFAULT_GMAIL_SUBSCRIPTION)
20
20
  .option("--label <label>", "Gmail label to watch", DEFAULT_GMAIL_LABEL)
21
- .option("--hook-url <url>", "Moltbot hook URL")
22
- .option("--hook-token <token>", "Moltbot hook token")
21
+ .option("--hook-url <url>", "Poolbot hook URL")
22
+ .option("--hook-token <token>", "Poolbot hook token")
23
23
  .option("--push-token <token>", "Push token for gog watch serve")
24
24
  .option("--bind <host>", "gog watch serve bind host", DEFAULT_GMAIL_SERVE_BIND)
25
25
  .option("--port <port>", "gog watch serve port", String(DEFAULT_GMAIL_SERVE_PORT))
@@ -49,8 +49,8 @@ export function registerWebhooksCli(program) {
49
49
  .option("--topic <topic>", "Pub/Sub topic path (projects/.../topics/..)")
50
50
  .option("--subscription <name>", "Pub/Sub subscription name")
51
51
  .option("--label <label>", "Gmail label to watch")
52
- .option("--hook-url <url>", "Moltbot hook URL")
53
- .option("--hook-token <token>", "Moltbot hook token")
52
+ .option("--hook-url <url>", "Poolbot hook URL")
53
+ .option("--hook-token <token>", "Poolbot hook token")
54
54
  .option("--push-token <token>", "Push token for gog watch serve")
55
55
  .option("--bind <host>", "gog watch serve bind host")
56
56
  .option("--port <port>", "gog watch serve port")
@@ -129,7 +129,7 @@ export async function agentsAddCommand(opts, runtime = defaultRuntime, params) {
129
129
  }
130
130
  const prompter = createClackPrompter();
131
131
  try {
132
- await prompter.intro("Add Moltbot agent");
132
+ await prompter.intro("Add Poolbot agent");
133
133
  const name = nameInput ??
134
134
  (await prompter.text({
135
135
  message: "Agent name",
@@ -3,14 +3,15 @@ import { resolveEnvApiKey } from "../agents/model-auth.js";
3
3
  import { formatApiKeyPreview, normalizeApiKeyInput, validateApiKeyInput, } from "./auth-choice.api-key.js";
4
4
  import { applyDefaultModelChoice } from "./auth-choice.default-model.js";
5
5
  import { applyGoogleGeminiModelDefault, GOOGLE_GEMINI_DEFAULT_MODEL, } from "./google-gemini-model-default.js";
6
- import { applyAuthProfileConfig, applyKimiCodeConfig, applyKimiCodeProviderConfig, applyMoonshotConfig, applyMoonshotProviderConfig, applyOpencodeZenConfig, applyOpencodeZenProviderConfig, applyOpenrouterConfig, applyOpenrouterProviderConfig, applySyntheticConfig, applySyntheticProviderConfig, applyVeniceConfig, applyVeniceProviderConfig, applyVercelAiGatewayConfig, applyVercelAiGatewayProviderConfig, applyZaiConfig, KIMI_CODE_MODEL_REF, MOONSHOT_DEFAULT_MODEL_REF, OPENROUTER_DEFAULT_MODEL_REF, SYNTHETIC_DEFAULT_MODEL_REF, VENICE_DEFAULT_MODEL_REF, VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF, setGeminiApiKey, setKimiCodeApiKey, setMoonshotApiKey, setOpencodeZenApiKey, setOpenrouterApiKey, setSyntheticApiKey, setVeniceApiKey, setVercelAiGatewayApiKey, setZaiApiKey, ZAI_DEFAULT_MODEL_REF, } from "./onboard-auth.js";
6
+ import { applyAuthProfileConfig, applyCloudflareAiGatewayConfig, applyCloudflareAiGatewayProviderConfig, applyQianfanConfig, applyQianfanProviderConfig, applyKimiCodeConfig, applyKimiCodeProviderConfig, applyMoonshotConfig, applyMoonshotConfigCn, applyMoonshotProviderConfig, applyMoonshotProviderConfigCn, applyOpencodeZenConfig, applyOpencodeZenProviderConfig, applyOpenrouterConfig, applyOpenrouterProviderConfig, applySyntheticConfig, applySyntheticProviderConfig, applyTogetherConfig, applyTogetherProviderConfig, applyVeniceConfig, applyVeniceProviderConfig, applyVercelAiGatewayConfig, applyVercelAiGatewayProviderConfig, applyXiaomiConfig, applyXiaomiProviderConfig, applyZaiConfig, CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF, QIANFAN_DEFAULT_MODEL_REF, KIMI_CODING_MODEL_REF, MOONSHOT_DEFAULT_MODEL_REF, OPENROUTER_DEFAULT_MODEL_REF, SYNTHETIC_DEFAULT_MODEL_REF, TOGETHER_DEFAULT_MODEL_REF, VENICE_DEFAULT_MODEL_REF, VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF, XIAOMI_DEFAULT_MODEL_REF, setCloudflareAiGatewayConfig, setQianfanApiKey, setGeminiApiKey, setKimiCodingApiKey, setMoonshotApiKey, setOpencodeZenApiKey, setOpenrouterApiKey, setSyntheticApiKey, setTogetherApiKey, setVeniceApiKey, setVercelAiGatewayApiKey, setXiaomiApiKey, setZaiApiKey, ZAI_DEFAULT_MODEL_REF, } from "./onboard-auth.js";
7
7
  import { OPENCODE_ZEN_DEFAULT_MODEL } from "./opencode-zen-model-default.js";
8
8
  export async function applyAuthChoiceApiProviders(params) {
9
9
  let nextConfig = params.config;
10
10
  let agentModelOverride;
11
11
  const noteAgentModel = async (model) => {
12
- if (!params.agentId)
12
+ if (!params.agentId) {
13
13
  return;
14
+ }
14
15
  await params.prompter.note(`Default model set to ${model} for agent "${params.agentId}".`, "Model configured");
15
16
  };
16
17
  let authChoice = params.authChoice;
@@ -24,10 +25,14 @@ export async function applyAuthChoiceApiProviders(params) {
24
25
  else if (params.opts.tokenProvider === "vercel-ai-gateway") {
25
26
  authChoice = "ai-gateway-api-key";
26
27
  }
28
+ else if (params.opts.tokenProvider === "cloudflare-ai-gateway") {
29
+ authChoice = "cloudflare-ai-gateway-api-key";
30
+ }
27
31
  else if (params.opts.tokenProvider === "moonshot") {
28
32
  authChoice = "moonshot-api-key";
29
33
  }
30
- else if (params.opts.tokenProvider === "kimi-code") {
34
+ else if (params.opts.tokenProvider === "kimi-code" ||
35
+ params.opts.tokenProvider === "kimi-coding") {
31
36
  authChoice = "kimi-code-api-key";
32
37
  }
33
38
  else if (params.opts.tokenProvider === "google") {
@@ -36,15 +41,24 @@ export async function applyAuthChoiceApiProviders(params) {
36
41
  else if (params.opts.tokenProvider === "zai") {
37
42
  authChoice = "zai-api-key";
38
43
  }
44
+ else if (params.opts.tokenProvider === "xiaomi") {
45
+ authChoice = "xiaomi-api-key";
46
+ }
39
47
  else if (params.opts.tokenProvider === "synthetic") {
40
48
  authChoice = "synthetic-api-key";
41
49
  }
42
50
  else if (params.opts.tokenProvider === "venice") {
43
51
  authChoice = "venice-api-key";
44
52
  }
53
+ else if (params.opts.tokenProvider === "together") {
54
+ authChoice = "together-api-key";
55
+ }
45
56
  else if (params.opts.tokenProvider === "opencode") {
46
57
  authChoice = "opencode-zen";
47
58
  }
59
+ else if (params.opts.tokenProvider === "qianfan") {
60
+ authChoice = "qianfan-api-key";
61
+ }
48
62
  }
49
63
  if (authChoice === "openrouter-api-key") {
50
64
  const store = ensureAuthProfileStore(params.agentDir, {
@@ -165,6 +179,86 @@ export async function applyAuthChoiceApiProviders(params) {
165
179
  }
166
180
  return { config: nextConfig, agentModelOverride };
167
181
  }
182
+ if (authChoice === "cloudflare-ai-gateway-api-key") {
183
+ let hasCredential = false;
184
+ let accountId = params.opts?.cloudflareAiGatewayAccountId?.trim() ?? "";
185
+ let gatewayId = params.opts?.cloudflareAiGatewayGatewayId?.trim() ?? "";
186
+ const ensureAccountGateway = async () => {
187
+ if (!accountId) {
188
+ const value = await params.prompter.text({
189
+ message: "Enter Cloudflare Account ID",
190
+ validate: (val) => (String(val).trim() ? undefined : "Account ID is required"),
191
+ });
192
+ accountId = String(value).trim();
193
+ }
194
+ if (!gatewayId) {
195
+ const value = await params.prompter.text({
196
+ message: "Enter Cloudflare AI Gateway ID",
197
+ validate: (val) => (String(val).trim() ? undefined : "Gateway ID is required"),
198
+ });
199
+ gatewayId = String(value).trim();
200
+ }
201
+ };
202
+ const optsApiKey = normalizeApiKeyInput(params.opts?.cloudflareAiGatewayApiKey ?? "");
203
+ if (!hasCredential && accountId && gatewayId && optsApiKey) {
204
+ await setCloudflareAiGatewayConfig(accountId, gatewayId, optsApiKey, params.agentDir);
205
+ hasCredential = true;
206
+ }
207
+ const envKey = resolveEnvApiKey("cloudflare-ai-gateway");
208
+ if (!hasCredential && envKey) {
209
+ const useExisting = await params.prompter.confirm({
210
+ message: `Use existing CLOUDFLARE_AI_GATEWAY_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
211
+ initialValue: true,
212
+ });
213
+ if (useExisting) {
214
+ await ensureAccountGateway();
215
+ await setCloudflareAiGatewayConfig(accountId, gatewayId, normalizeApiKeyInput(envKey.apiKey), params.agentDir);
216
+ hasCredential = true;
217
+ }
218
+ }
219
+ if (!hasCredential && optsApiKey) {
220
+ await ensureAccountGateway();
221
+ await setCloudflareAiGatewayConfig(accountId, gatewayId, optsApiKey, params.agentDir);
222
+ hasCredential = true;
223
+ }
224
+ if (!hasCredential) {
225
+ await ensureAccountGateway();
226
+ const key = await params.prompter.text({
227
+ message: "Enter Cloudflare AI Gateway API key",
228
+ validate: validateApiKeyInput,
229
+ });
230
+ await setCloudflareAiGatewayConfig(accountId, gatewayId, normalizeApiKeyInput(String(key)), params.agentDir);
231
+ hasCredential = true;
232
+ }
233
+ if (hasCredential) {
234
+ nextConfig = applyAuthProfileConfig(nextConfig, {
235
+ profileId: "cloudflare-ai-gateway:default",
236
+ provider: "cloudflare-ai-gateway",
237
+ mode: "api_key",
238
+ });
239
+ }
240
+ {
241
+ const applied = await applyDefaultModelChoice({
242
+ config: nextConfig,
243
+ setDefaultModel: params.setDefaultModel,
244
+ defaultModel: CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF,
245
+ applyDefaultConfig: (cfg) => applyCloudflareAiGatewayConfig(cfg, {
246
+ accountId: accountId || params.opts?.cloudflareAiGatewayAccountId,
247
+ gatewayId: gatewayId || params.opts?.cloudflareAiGatewayGatewayId,
248
+ }),
249
+ applyProviderConfig: (cfg) => applyCloudflareAiGatewayProviderConfig(cfg, {
250
+ accountId: accountId || params.opts?.cloudflareAiGatewayAccountId,
251
+ gatewayId: gatewayId || params.opts?.cloudflareAiGatewayGatewayId,
252
+ }),
253
+ noteDefault: CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF,
254
+ noteAgentModel,
255
+ prompter: params.prompter,
256
+ });
257
+ nextConfig = applied.config;
258
+ agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
259
+ }
260
+ return { config: nextConfig, agentModelOverride };
261
+ }
168
262
  if (authChoice === "moonshot-api-key") {
169
263
  let hasCredential = false;
170
264
  if (!hasCredential && params.opts?.token && params.opts?.tokenProvider === "moonshot") {
@@ -209,49 +303,96 @@ export async function applyAuthChoiceApiProviders(params) {
209
303
  }
210
304
  return { config: nextConfig, agentModelOverride };
211
305
  }
306
+ if (authChoice === "moonshot-api-key-cn") {
307
+ let hasCredential = false;
308
+ if (!hasCredential && params.opts?.token && params.opts?.tokenProvider === "moonshot") {
309
+ await setMoonshotApiKey(normalizeApiKeyInput(params.opts.token), params.agentDir);
310
+ hasCredential = true;
311
+ }
312
+ const envKey = resolveEnvApiKey("moonshot");
313
+ if (envKey) {
314
+ const useExisting = await params.prompter.confirm({
315
+ message: `Use existing MOONSHOT_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
316
+ initialValue: true,
317
+ });
318
+ if (useExisting) {
319
+ await setMoonshotApiKey(envKey.apiKey, params.agentDir);
320
+ hasCredential = true;
321
+ }
322
+ }
323
+ if (!hasCredential) {
324
+ const key = await params.prompter.text({
325
+ message: "Enter Moonshot API key (.cn)",
326
+ validate: validateApiKeyInput,
327
+ });
328
+ await setMoonshotApiKey(normalizeApiKeyInput(String(key)), params.agentDir);
329
+ }
330
+ nextConfig = applyAuthProfileConfig(nextConfig, {
331
+ profileId: "moonshot:default",
332
+ provider: "moonshot",
333
+ mode: "api_key",
334
+ });
335
+ {
336
+ const applied = await applyDefaultModelChoice({
337
+ config: nextConfig,
338
+ setDefaultModel: params.setDefaultModel,
339
+ defaultModel: MOONSHOT_DEFAULT_MODEL_REF,
340
+ applyDefaultConfig: applyMoonshotConfigCn,
341
+ applyProviderConfig: applyMoonshotProviderConfigCn,
342
+ noteAgentModel,
343
+ prompter: params.prompter,
344
+ });
345
+ nextConfig = applied.config;
346
+ agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
347
+ }
348
+ return { config: nextConfig, agentModelOverride };
349
+ }
212
350
  if (authChoice === "kimi-code-api-key") {
213
351
  let hasCredential = false;
214
- if (!hasCredential && params.opts?.token && params.opts?.tokenProvider === "kimi-code") {
215
- await setKimiCodeApiKey(normalizeApiKeyInput(params.opts.token), params.agentDir);
352
+ const tokenProvider = params.opts?.tokenProvider?.trim().toLowerCase();
353
+ if (!hasCredential &&
354
+ params.opts?.token &&
355
+ (tokenProvider === "kimi-code" || tokenProvider === "kimi-coding")) {
356
+ await setKimiCodingApiKey(normalizeApiKeyInput(params.opts.token), params.agentDir);
216
357
  hasCredential = true;
217
358
  }
218
359
  if (!hasCredential) {
219
360
  await params.prompter.note([
220
- "Kimi Code uses a dedicated endpoint and API key.",
361
+ "Kimi Coding uses a dedicated endpoint and API key.",
221
362
  "Get your API key at: https://www.kimi.com/code/en",
222
- ].join("\n"), "Kimi Code");
363
+ ].join("\n"), "Kimi Coding");
223
364
  }
224
- const envKey = resolveEnvApiKey("kimi-code");
365
+ const envKey = resolveEnvApiKey("kimi-coding");
225
366
  if (envKey) {
226
367
  const useExisting = await params.prompter.confirm({
227
- message: `Use existing KIMICODE_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
368
+ message: `Use existing KIMI_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
228
369
  initialValue: true,
229
370
  });
230
371
  if (useExisting) {
231
- await setKimiCodeApiKey(envKey.apiKey, params.agentDir);
372
+ await setKimiCodingApiKey(envKey.apiKey, params.agentDir);
232
373
  hasCredential = true;
233
374
  }
234
375
  }
235
376
  if (!hasCredential) {
236
377
  const key = await params.prompter.text({
237
- message: "Enter Kimi Code API key",
378
+ message: "Enter Kimi Coding API key",
238
379
  validate: validateApiKeyInput,
239
380
  });
240
- await setKimiCodeApiKey(normalizeApiKeyInput(String(key)), params.agentDir);
381
+ await setKimiCodingApiKey(normalizeApiKeyInput(String(key)), params.agentDir);
241
382
  }
242
383
  nextConfig = applyAuthProfileConfig(nextConfig, {
243
- profileId: "kimi-code:default",
244
- provider: "kimi-code",
384
+ profileId: "kimi-coding:default",
385
+ provider: "kimi-coding",
245
386
  mode: "api_key",
246
387
  });
247
388
  {
248
389
  const applied = await applyDefaultModelChoice({
249
390
  config: nextConfig,
250
391
  setDefaultModel: params.setDefaultModel,
251
- defaultModel: KIMI_CODE_MODEL_REF,
392
+ defaultModel: KIMI_CODING_MODEL_REF,
252
393
  applyDefaultConfig: applyKimiCodeConfig,
253
394
  applyProviderConfig: applyKimiCodeProviderConfig,
254
- noteDefault: KIMI_CODE_MODEL_REF,
395
+ noteDefault: KIMI_CODING_MODEL_REF,
255
396
  noteAgentModel,
256
397
  prompter: params.prompter,
257
398
  });
@@ -362,6 +503,51 @@ export async function applyAuthChoiceApiProviders(params) {
362
503
  }
363
504
  return { config: nextConfig, agentModelOverride };
364
505
  }
506
+ if (authChoice === "xiaomi-api-key") {
507
+ let hasCredential = false;
508
+ if (!hasCredential && params.opts?.token && params.opts?.tokenProvider === "xiaomi") {
509
+ await setXiaomiApiKey(normalizeApiKeyInput(params.opts.token), params.agentDir);
510
+ hasCredential = true;
511
+ }
512
+ const envKey = resolveEnvApiKey("xiaomi");
513
+ if (envKey) {
514
+ const useExisting = await params.prompter.confirm({
515
+ message: `Use existing XIAOMI_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
516
+ initialValue: true,
517
+ });
518
+ if (useExisting) {
519
+ await setXiaomiApiKey(envKey.apiKey, params.agentDir);
520
+ hasCredential = true;
521
+ }
522
+ }
523
+ if (!hasCredential) {
524
+ const key = await params.prompter.text({
525
+ message: "Enter Xiaomi API key",
526
+ validate: validateApiKeyInput,
527
+ });
528
+ await setXiaomiApiKey(normalizeApiKeyInput(String(key)), params.agentDir);
529
+ }
530
+ nextConfig = applyAuthProfileConfig(nextConfig, {
531
+ profileId: "xiaomi:default",
532
+ provider: "xiaomi",
533
+ mode: "api_key",
534
+ });
535
+ {
536
+ const applied = await applyDefaultModelChoice({
537
+ config: nextConfig,
538
+ setDefaultModel: params.setDefaultModel,
539
+ defaultModel: XIAOMI_DEFAULT_MODEL_REF,
540
+ applyDefaultConfig: applyXiaomiConfig,
541
+ applyProviderConfig: applyXiaomiProviderConfig,
542
+ noteDefault: XIAOMI_DEFAULT_MODEL_REF,
543
+ noteAgentModel,
544
+ prompter: params.prompter,
545
+ });
546
+ nextConfig = applied.config;
547
+ agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
548
+ }
549
+ return { config: nextConfig, agentModelOverride };
550
+ }
365
551
  if (authChoice === "synthetic-api-key") {
366
552
  if (params.opts?.token && params.opts?.tokenProvider === "synthetic") {
367
553
  await setSyntheticApiKey(String(params.opts.token).trim(), params.agentDir);
@@ -456,7 +642,7 @@ export async function applyAuthChoiceApiProviders(params) {
456
642
  await params.prompter.note([
457
643
  "OpenCode Zen provides access to Claude, GPT, Gemini, and more models.",
458
644
  "Get your API key at: https://opencode.ai/auth",
459
- "Requires an active OpenCode Zen subscription.",
645
+ "OpenCode Zen bills per request. Check your OpenCode dashboard for details.",
460
646
  ].join("\n"), "OpenCode Zen");
461
647
  }
462
648
  const envKey = resolveEnvApiKey("opencode");
@@ -498,5 +684,107 @@ export async function applyAuthChoiceApiProviders(params) {
498
684
  }
499
685
  return { config: nextConfig, agentModelOverride };
500
686
  }
687
+ if (authChoice === "together-api-key") {
688
+ let hasCredential = false;
689
+ if (!hasCredential && params.opts?.token && params.opts?.tokenProvider === "together") {
690
+ await setTogetherApiKey(normalizeApiKeyInput(params.opts.token), params.agentDir);
691
+ hasCredential = true;
692
+ }
693
+ if (!hasCredential) {
694
+ await params.prompter.note([
695
+ "Together AI provides access to leading open-source models including Llama, DeepSeek, Qwen, and more.",
696
+ "Get your API key at: https://api.together.xyz/settings/api-keys",
697
+ ].join("\n"), "Together AI");
698
+ }
699
+ const envKey = resolveEnvApiKey("together");
700
+ if (envKey) {
701
+ const useExisting = await params.prompter.confirm({
702
+ message: `Use existing TOGETHER_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
703
+ initialValue: true,
704
+ });
705
+ if (useExisting) {
706
+ await setTogetherApiKey(envKey.apiKey, params.agentDir);
707
+ hasCredential = true;
708
+ }
709
+ }
710
+ if (!hasCredential) {
711
+ const key = await params.prompter.text({
712
+ message: "Enter Together AI API key",
713
+ validate: validateApiKeyInput,
714
+ });
715
+ await setTogetherApiKey(normalizeApiKeyInput(String(key)), params.agentDir);
716
+ }
717
+ nextConfig = applyAuthProfileConfig(nextConfig, {
718
+ profileId: "together:default",
719
+ provider: "together",
720
+ mode: "api_key",
721
+ });
722
+ {
723
+ const applied = await applyDefaultModelChoice({
724
+ config: nextConfig,
725
+ setDefaultModel: params.setDefaultModel,
726
+ defaultModel: TOGETHER_DEFAULT_MODEL_REF,
727
+ applyDefaultConfig: applyTogetherConfig,
728
+ applyProviderConfig: applyTogetherProviderConfig,
729
+ noteDefault: TOGETHER_DEFAULT_MODEL_REF,
730
+ noteAgentModel,
731
+ prompter: params.prompter,
732
+ });
733
+ nextConfig = applied.config;
734
+ agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
735
+ }
736
+ return { config: nextConfig, agentModelOverride };
737
+ }
738
+ if (authChoice === "qianfan-api-key") {
739
+ let hasCredential = false;
740
+ if (!hasCredential && params.opts?.token && params.opts?.tokenProvider === "qianfan") {
741
+ setQianfanApiKey(normalizeApiKeyInput(params.opts.token), params.agentDir);
742
+ hasCredential = true;
743
+ }
744
+ if (!hasCredential) {
745
+ await params.prompter.note([
746
+ "Get your API key at: https://console.bce.baidu.com/qianfan/ais/console/apiKey",
747
+ "API key format: bce-v3/ALTAK-...",
748
+ ].join("\n"), "QIANFAN");
749
+ }
750
+ const envKey = resolveEnvApiKey("qianfan");
751
+ if (envKey) {
752
+ const useExisting = await params.prompter.confirm({
753
+ message: `Use existing QIANFAN_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
754
+ initialValue: true,
755
+ });
756
+ if (useExisting) {
757
+ setQianfanApiKey(envKey.apiKey, params.agentDir);
758
+ hasCredential = true;
759
+ }
760
+ }
761
+ if (!hasCredential) {
762
+ const key = await params.prompter.text({
763
+ message: "Enter QIANFAN API key",
764
+ validate: validateApiKeyInput,
765
+ });
766
+ setQianfanApiKey(normalizeApiKeyInput(String(key)), params.agentDir);
767
+ }
768
+ nextConfig = applyAuthProfileConfig(nextConfig, {
769
+ profileId: "qianfan:default",
770
+ provider: "qianfan",
771
+ mode: "api_key",
772
+ });
773
+ {
774
+ const applied = await applyDefaultModelChoice({
775
+ config: nextConfig,
776
+ setDefaultModel: params.setDefaultModel,
777
+ defaultModel: QIANFAN_DEFAULT_MODEL_REF,
778
+ applyDefaultConfig: applyQianfanConfig,
779
+ applyProviderConfig: applyQianfanProviderConfig,
780
+ noteDefault: QIANFAN_DEFAULT_MODEL_REF,
781
+ noteAgentModel,
782
+ prompter: params.prompter,
783
+ });
784
+ nextConfig = applied.config;
785
+ agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
786
+ }
787
+ return { config: nextConfig, agentModelOverride };
788
+ }
501
789
  return null;
502
790
  }
@@ -8,6 +8,7 @@ import { applyAuthChoiceMiniMax } from "./auth-choice.apply.minimax.js";
8
8
  import { applyAuthChoiceOAuth } from "./auth-choice.apply.oauth.js";
9
9
  import { applyAuthChoiceOpenAI } from "./auth-choice.apply.openai.js";
10
10
  import { applyAuthChoiceQwenPortal } from "./auth-choice.apply.qwen-portal.js";
11
+ import { applyAuthChoiceXAI } from "./auth-choice.apply.xai.js";
11
12
  export async function applyAuthChoice(params) {
12
13
  const handlers = [
13
14
  applyAuthChoiceAnthropic,
@@ -20,11 +21,13 @@ export async function applyAuthChoice(params) {
20
21
  applyAuthChoiceGoogleGeminiCli,
21
22
  applyAuthChoiceCopilotProxy,
22
23
  applyAuthChoiceQwenPortal,
24
+ applyAuthChoiceXAI,
23
25
  ];
24
26
  for (const handler of handlers) {
25
27
  const result = await handler(params);
26
- if (result)
28
+ if (result) {
27
29
  return result;
30
+ }
28
31
  }
29
32
  return { config: params.config };
30
33
  }
@@ -1,4 +1,4 @@
1
- import { resolveMoltbotAgentDir } from "../agents/agent-paths.js";
1
+ import { resolvePoolbotAgentDir } from "../agents/agent-paths.js";
2
2
  import { resolveDefaultAgentId, resolveAgentDir, resolveAgentWorkspaceDir, } from "../agents/agent-scope.js";
3
3
  import { upsertAuthProfile } from "../agents/auth-profiles.js";
4
4
  import { normalizeProviderId } from "../agents/model-selection.js";
@@ -76,7 +76,7 @@ export async function applyAuthChoicePluginProvider(params, options) {
76
76
  const agentId = params.agentId ?? resolveDefaultAgentId(nextConfig);
77
77
  const defaultAgentId = resolveDefaultAgentId(nextConfig);
78
78
  const agentDir = params.agentDir ??
79
- (agentId === defaultAgentId ? resolveMoltbotAgentDir() : resolveAgentDir(nextConfig, agentId));
79
+ (agentId === defaultAgentId ? resolvePoolbotAgentDir() : resolveAgentDir(nextConfig, agentId));
80
80
  const workspaceDir = resolveAgentWorkspaceDir(nextConfig, agentId) ?? resolveDefaultAgentWorkspaceDir();
81
81
  const providers = resolvePluginProviders({ config: nextConfig, workspaceDir });
82
82
  const provider = resolveProviderMatch(providers, options.providerId);
@@ -0,0 +1,63 @@
1
+ import { resolveEnvApiKey } from "../agents/model-auth.js";
2
+ import { formatApiKeyPreview, normalizeApiKeyInput, validateApiKeyInput, } from "./auth-choice.api-key.js";
3
+ import { applyDefaultModelChoice } from "./auth-choice.default-model.js";
4
+ import { applyAuthProfileConfig, applyXaiConfig, applyXaiProviderConfig, setXaiApiKey, XAI_DEFAULT_MODEL_REF, } from "./onboard-auth.js";
5
+ export async function applyAuthChoiceXAI(params) {
6
+ if (params.authChoice !== "xai-api-key") {
7
+ return null;
8
+ }
9
+ let nextConfig = params.config;
10
+ let agentModelOverride;
11
+ const noteAgentModel = async (model) => {
12
+ if (!params.agentId) {
13
+ return;
14
+ }
15
+ await params.prompter.note(`Default model set to ${model} for agent "${params.agentId}".`, "Model configured");
16
+ };
17
+ let hasCredential = false;
18
+ const optsKey = params.opts?.xaiApiKey?.trim();
19
+ if (optsKey) {
20
+ setXaiApiKey(normalizeApiKeyInput(optsKey), params.agentDir);
21
+ hasCredential = true;
22
+ }
23
+ if (!hasCredential) {
24
+ const envKey = resolveEnvApiKey("xai");
25
+ if (envKey) {
26
+ const useExisting = await params.prompter.confirm({
27
+ message: `Use existing XAI_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
28
+ initialValue: true,
29
+ });
30
+ if (useExisting) {
31
+ setXaiApiKey(envKey.apiKey, params.agentDir);
32
+ hasCredential = true;
33
+ }
34
+ }
35
+ }
36
+ if (!hasCredential) {
37
+ const key = await params.prompter.text({
38
+ message: "Enter xAI API key",
39
+ validate: validateApiKeyInput,
40
+ });
41
+ setXaiApiKey(normalizeApiKeyInput(String(key)), params.agentDir);
42
+ }
43
+ nextConfig = applyAuthProfileConfig(nextConfig, {
44
+ profileId: "xai:default",
45
+ provider: "xai",
46
+ mode: "api_key",
47
+ });
48
+ {
49
+ const applied = await applyDefaultModelChoice({
50
+ config: nextConfig,
51
+ setDefaultModel: params.setDefaultModel,
52
+ defaultModel: XAI_DEFAULT_MODEL_REF,
53
+ applyDefaultConfig: applyXaiConfig,
54
+ applyProviderConfig: applyXaiProviderConfig,
55
+ noteDefault: XAI_DEFAULT_MODEL_REF,
56
+ noteAgentModel,
57
+ prompter: params.prompter,
58
+ });
59
+ nextConfig = applied.config;
60
+ agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
61
+ }
62
+ return { config: nextConfig, agentModelOverride };
63
+ }
@@ -10,14 +10,18 @@ const PREFERRED_PROVIDER_BY_AUTH_CHOICE = {
10
10
  "openai-api-key": "openai",
11
11
  "openrouter-api-key": "openrouter",
12
12
  "ai-gateway-api-key": "vercel-ai-gateway",
13
+ "cloudflare-ai-gateway-api-key": "cloudflare-ai-gateway",
13
14
  "moonshot-api-key": "moonshot",
14
- "kimi-code-api-key": "kimi-code",
15
+ "moonshot-api-key-cn": "moonshot",
16
+ "kimi-code-api-key": "kimi-coding",
15
17
  "gemini-api-key": "google",
16
18
  "google-antigravity": "google-antigravity",
17
19
  "google-gemini-cli": "google-gemini-cli",
18
20
  "zai-api-key": "zai",
21
+ "xiaomi-api-key": "xiaomi",
19
22
  "synthetic-api-key": "synthetic",
20
23
  "venice-api-key": "venice",
24
+ "together-api-key": "together",
21
25
  "github-copilot": "github-copilot",
22
26
  "copilot-proxy": "copilot-proxy",
23
27
  "minimax-cloud": "minimax",
@@ -25,7 +29,9 @@ const PREFERRED_PROVIDER_BY_AUTH_CHOICE = {
25
29
  "minimax-api-lightning": "minimax",
26
30
  minimax: "lmstudio",
27
31
  "opencode-zen": "opencode",
32
+ "xai-api-key": "xai",
28
33
  "qwen-portal": "qwen-portal",
34
+ "qianfan-api-key": "qianfan",
29
35
  };
30
36
  export function resolvePreferredProviderForAuthChoice(choice) {
31
37
  return PREFERRED_PROVIDER_BY_AUTH_CHOICE[choice];
@@ -109,7 +109,7 @@ async function promptWebToolsConfig(nextConfig, runtime) {
109
109
  export async function runConfigureWizard(opts, runtime = defaultRuntime) {
110
110
  try {
111
111
  printWizardHeader(runtime);
112
- intro(opts.command === "update" ? "Moltbot update wizard" : "Moltbot configure");
112
+ intro(opts.command === "update" ? "Poolbot update wizard" : "Poolbot configure");
113
113
  const prompter = createClackPrompter();
114
114
  const snapshot = await readConfigFileSnapshot();
115
115
  const baseConfig = snapshot.valid ? snapshot.config : {};
@@ -39,7 +39,7 @@ export async function dashboardCommand(runtime = defaultRuntime, options = {}) {
39
39
  hint = "Browser launch disabled (--no-open). Use the URL above.";
40
40
  }
41
41
  if (opened) {
42
- runtime.log("Opened in your browser. Keep that tab to control Moltbot.");
42
+ runtime.log("Opened in your browser. Keep that tab to control Poolbot.");
43
43
  }
44
44
  else if (hint) {
45
45
  runtime.log(hint);