@poolzin/pool-bot 2026.1.39 → 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.
- package/assets/chrome-extension/README.md +3 -3
- package/assets/chrome-extension/background.js +5 -5
- package/assets/chrome-extension/manifest.json +3 -3
- package/assets/chrome-extension/options.html +4 -4
- package/assets/chrome-extension/options.js +1 -1
- package/dist/acp/client.js +3 -3
- package/dist/acp/types.js +1 -1
- package/dist/agents/agent-paths.js +3 -3
- package/dist/agents/auth-profiles/paths.js +3 -3
- package/dist/agents/cli-runner/helpers.js +1 -1
- package/dist/agents/cli-runner.js +2 -2
- package/dist/agents/cloudflare-ai-gateway.js +31 -0
- package/dist/agents/compaction.js +16 -2
- package/dist/agents/context-window-guard.js +13 -10
- package/dist/agents/context.js +4 -4
- package/dist/agents/docs-path.js +1 -1
- package/dist/agents/minimax-vlm.js +1 -1
- package/dist/agents/model-auth.js +12 -1
- package/dist/agents/model-catalog.js +4 -4
- package/dist/agents/model-selection.js +10 -4
- package/dist/agents/models-config.js +3 -3
- package/dist/agents/models-config.providers.js +147 -39
- package/dist/agents/pi-embedded-helpers/openai.js +1 -1
- package/dist/agents/pi-embedded-runner/compact.js +8 -8
- package/dist/agents/pi-embedded-runner/model.js +2 -2
- package/dist/agents/pi-embedded-runner/run/attempt.js +6 -6
- package/dist/agents/pi-embedded-runner/run.js +4 -4
- package/dist/agents/pi-embedded-runner/tool-result-truncation.js +275 -0
- package/dist/agents/pi-embedded-runner/utils.js +1 -1
- package/dist/agents/pi-model-discovery.js +10 -0
- package/dist/agents/pi-tool-definition-adapter.js +50 -9
- package/dist/agents/pi-tools.before-tool-call.js +67 -0
- package/dist/agents/pi-tools.js +10 -5
- package/dist/agents/pi-tools.read.js +2 -2
- package/dist/agents/session-file-repair.js +83 -0
- package/dist/agents/session-transcript-repair.js +68 -0
- package/dist/agents/skills/frontmatter.js +1 -1
- package/dist/agents/skills/workspace.js +2 -2
- package/dist/agents/system-prompt.js +28 -4
- package/dist/agents/together-models.js +127 -0
- package/dist/agents/tool-images.js +1 -1
- package/dist/agents/tool-policy.js +1 -1
- package/dist/agents/tools/browser-tool.js +3 -3
- package/dist/agents/tools/image-tool.js +2 -2
- package/dist/agents/tools/memory-tool.js +93 -5
- package/dist/agents/tools/web-search.js +1 -1
- package/dist/auto-reply/commands-registry.data.js +1 -1
- package/dist/auto-reply/reply/commands-context-report.js +2 -2
- package/dist/auto-reply/reply/commands-session.js +2 -2
- package/dist/auto-reply/reply/get-reply-run.js +14 -4
- package/dist/auto-reply/reply/groups.js +1 -1
- package/dist/auto-reply/reply/inbound-context.js +4 -0
- package/dist/auto-reply/reply/inbound-meta.js +130 -0
- package/dist/auto-reply/reply/untrusted-context.js +15 -0
- package/dist/auto-reply/status.js +1 -1
- package/dist/browser/client-fetch.js +1 -1
- package/dist/browser/config.js +1 -1
- package/dist/browser/extension-relay.js +3 -3
- package/dist/browser/server-context.js +2 -2
- package/dist/build-info.json +3 -3
- package/dist/canvas-host/a2ui.js +3 -3
- package/dist/channels/plugins/catalog.js +2 -2
- package/dist/channels/plugins/onboarding/imessage.js +1 -1
- package/dist/channels/plugins/onboarding/signal.js +1 -1
- package/dist/channels/plugins/onboarding/slack.js +4 -4
- package/dist/channels/plugins/onboarding/whatsapp.js +3 -3
- package/dist/channels/plugins/pairing-message.js +1 -1
- package/dist/cli/browser-cli-extension.js +2 -2
- package/dist/cli/docs-cli.js +1 -1
- package/dist/cli/gateway-cli/dev.js +1 -1
- package/dist/cli/memory-cli.js +25 -15
- package/dist/cli/nodes-cli/register.canvas.js +1 -1
- package/dist/cli/plugins-cli.js +1 -1
- package/dist/cli/run-main.js +2 -2
- package/dist/cli/security-cli.js +1 -1
- package/dist/cli/tagline.js +1 -1
- package/dist/cli/update-cli.js +4 -4
- package/dist/cli/webhooks-cli.js +5 -5
- package/dist/commands/agents.commands.add.js +1 -1
- package/dist/commands/auth-choice.apply.api-providers.js +305 -17
- package/dist/commands/auth-choice.apply.js +4 -1
- package/dist/commands/auth-choice.apply.plugin-provider.js +2 -2
- package/dist/commands/auth-choice.apply.xai.js +63 -0
- package/dist/commands/auth-choice.preferred-provider.js +7 -1
- package/dist/commands/configure.wizard.js +1 -1
- package/dist/commands/dashboard.js +1 -1
- package/dist/commands/docs.js +1 -1
- package/dist/commands/doctor-gateway-services.js +3 -3
- package/dist/commands/doctor-update.js +3 -3
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/models/list.probe.js +2 -2
- package/dist/commands/models/list.registry.js +4 -4
- package/dist/commands/models/list.status-command.js +2 -2
- package/dist/commands/onboard-auth.config-core.js +366 -28
- package/dist/commands/onboard-auth.credentials.js +71 -9
- package/dist/commands/onboard-auth.js +3 -3
- package/dist/commands/onboard-auth.models.js +26 -24
- package/dist/commands/onboard-non-interactive/local/auth-choice.js +140 -6
- package/dist/commands/status-all/report-lines.js +1 -1
- package/dist/commands/status.command.js +1 -1
- package/dist/commands/uninstall.js +3 -3
- package/dist/compat/legacy-names.js +1 -1
- package/dist/config/io.js +3 -3
- package/dist/config/schema.js +1 -1
- package/dist/config/types.memory.js +1 -0
- package/dist/config/version.js +4 -4
- package/dist/daemon/constants.js +7 -7
- package/dist/daemon/inspect.js +6 -6
- package/dist/daemon/systemd-unit.js +1 -1
- package/dist/gateway/live-image-probe.js +1 -66
- package/dist/gateway/openai-http.js +2 -2
- package/dist/gateway/openresponses-http.js +4 -4
- package/dist/gateway/server-discovery.js +2 -2
- package/dist/gateway/server-http.js +1 -1
- package/dist/gateway/server.impl.js +2 -2
- package/dist/hooks/frontmatter.js +1 -1
- package/dist/hooks/hooks-status.js +1 -1
- package/dist/hooks/install.js +2 -2
- package/dist/hooks/loader.js +1 -1
- package/dist/hooks/workspace.js +3 -3
- package/dist/index.js +2 -2
- package/dist/infra/bonjour.js +3 -3
- package/dist/infra/path-env.js +3 -3
- package/dist/infra/provider-usage.fetch.minimax.js +1 -1
- package/dist/infra/restart.js +1 -1
- package/dist/infra/tailscale.js +1 -1
- package/dist/macos/relay.js +2 -2
- package/dist/media/input-files.js +1 -1
- package/dist/media/mime.js +4 -0
- package/dist/media/png-encode.js +74 -0
- package/dist/media-understanding/providers/image.js +2 -2
- package/dist/memory/backend-config.js +207 -0
- package/dist/memory/embeddings.js +1 -1
- package/dist/memory/manager.js +1 -0
- package/dist/memory/types.js +1 -0
- package/dist/node-host/runner.js +2 -2
- package/dist/pairing/pairing-messages.js +1 -1
- package/dist/plugins/discovery.js +1 -1
- package/dist/plugins/install.js +2 -2
- package/dist/plugins/update.js +1 -1
- package/dist/security/audit.js +2 -2
- package/dist/shared/text/reasoning-tags.js +52 -7
- package/dist/tailscale/detect.js +146 -0
- package/dist/telegram/bot-message-context.js +1 -1
- package/dist/test-helpers/workspace.js +11 -0
- package/dist/test-utils/channel-plugins.js +82 -0
- package/dist/test-utils/ports.js +73 -0
- package/dist/utils/shell-argv.js +61 -0
- package/dist/utils.js +10 -0
- package/dist/web/qr-image.js +1 -61
- package/dist/wizard/onboarding.finalize.js +7 -7
- package/dist/wizard/onboarding.js +3 -3
- package/docs/RELEASE_WORKFOTS_COMPARISON.md +3 -3
- package/docs/_config.yml +2 -2
- package/docs/_layouts/default.html +9 -9
- package/docs/concepts/typebox.md +1 -1
- package/docs/docs.json +1 -1
- package/docs/northflank.mdx +7 -7
- package/docs/railway.mdx +3 -3
- package/docs/render.mdx +5 -5
- package/docs/start/lore.md +2 -2
- package/extensions/bluebubbles/index.ts +2 -2
- package/extensions/bluebubbles/package.json +1 -1
- package/extensions/bluebubbles/src/accounts.ts +8 -8
- package/extensions/bluebubbles/src/actions.test.ts +22 -22
- package/extensions/bluebubbles/src/actions.ts +5 -5
- package/extensions/bluebubbles/src/attachments.ts +2 -2
- package/extensions/bluebubbles/src/channel.ts +16 -16
- package/extensions/bluebubbles/src/chat.ts +2 -2
- package/extensions/bluebubbles/src/media-send.ts +2 -2
- package/extensions/bluebubbles/src/monitor.test.ts +46 -46
- package/extensions/bluebubbles/src/monitor.ts +5 -5
- package/extensions/bluebubbles/src/onboarding.ts +7 -7
- package/extensions/bluebubbles/src/reactions.ts +2 -2
- package/extensions/bluebubbles/src/send.ts +2 -2
- package/extensions/copilot-proxy/README.md +1 -1
- package/extensions/copilot-proxy/package.json +1 -1
- package/extensions/diagnostics-otel/index.ts +2 -2
- package/extensions/diagnostics-otel/package.json +1 -1
- package/extensions/diagnostics-otel/src/service.ts +3 -3
- package/extensions/discord/index.ts +2 -2
- package/extensions/discord/package.json +1 -1
- package/extensions/google-antigravity-auth/README.md +1 -1
- package/extensions/google-antigravity-auth/index.ts +1 -1
- package/extensions/google-antigravity-auth/package.json +1 -1
- package/extensions/google-gemini-cli-auth/README.md +1 -1
- package/extensions/google-gemini-cli-auth/oauth.ts +1 -1
- package/extensions/google-gemini-cli-auth/package.json +1 -1
- package/extensions/googlechat/index.ts +3 -3
- package/extensions/googlechat/package.json +1 -1
- package/extensions/googlechat/src/accounts.ts +8 -8
- package/extensions/googlechat/src/actions.ts +6 -6
- package/extensions/googlechat/src/channel.ts +21 -21
- package/extensions/googlechat/src/monitor.ts +8 -8
- package/extensions/googlechat/src/onboarding.ts +10 -10
- package/extensions/imessage/index.ts +2 -2
- package/extensions/imessage/package.json +1 -1
- package/extensions/line/index.ts +2 -2
- package/extensions/line/package.json +1 -1
- package/extensions/line/src/card-command.ts +2 -2
- package/extensions/line/src/channel.logout.test.ts +4 -4
- package/extensions/line/src/channel.sendPayload.test.ts +8 -8
- package/extensions/line/src/channel.ts +3 -3
- package/extensions/llm-task/README.md +3 -3
- package/extensions/llm-task/index.ts +2 -2
- package/extensions/llm-task/package.json +1 -1
- package/extensions/llm-task/src/llm-task-tool.ts +4 -4
- package/extensions/lobster/README.md +6 -6
- package/extensions/lobster/index.ts +2 -2
- package/extensions/lobster/src/lobster-tool.test.ts +4 -4
- package/extensions/lobster/src/lobster-tool.ts +2 -2
- package/extensions/matrix/index.ts +2 -2
- package/extensions/matrix/package.json +1 -1
- package/extensions/matrix/src/matrix/client/config.ts +1 -1
- package/extensions/matrix/src/matrix/monitor/handler.ts +1 -1
- package/extensions/matrix/src/onboarding.ts +1 -1
- package/extensions/mattermost/index.ts +2 -2
- package/extensions/mattermost/package.json +1 -1
- package/extensions/mattermost/src/mattermost/accounts.ts +8 -8
- package/extensions/mattermost/src/mattermost/monitor-helpers.ts +5 -5
- package/extensions/mattermost/src/mattermost/monitor.ts +2 -2
- package/extensions/mattermost/src/onboarding-helpers.ts +3 -3
- package/extensions/mattermost/src/onboarding.ts +2 -2
- package/extensions/memory-core/index.ts +2 -2
- package/extensions/memory-core/package.json +1 -1
- package/extensions/memory-lancedb/index.ts +3 -3
- package/extensions/memory-lancedb/package.json +1 -1
- package/extensions/msteams/index.ts +2 -2
- package/extensions/msteams/package.json +1 -1
- package/extensions/msteams/src/channel.directory.test.ts +2 -2
- package/extensions/msteams/src/channel.ts +2 -2
- package/extensions/msteams/src/graph-upload.ts +4 -4
- package/extensions/msteams/src/monitor-handler.ts +2 -2
- package/extensions/msteams/src/monitor.ts +2 -2
- package/extensions/msteams/src/onboarding.ts +9 -9
- package/extensions/msteams/src/reply-dispatcher.ts +2 -2
- package/extensions/msteams/src/send-context.ts +2 -2
- package/extensions/msteams/src/send.ts +4 -4
- package/extensions/nextcloud-talk/index.ts +2 -2
- package/extensions/nextcloud-talk/package.json +1 -1
- package/extensions/nextcloud-talk/src/channel.ts +7 -7
- package/extensions/nextcloud-talk/src/inbound.ts +7 -7
- package/extensions/nextcloud-talk/src/onboarding.ts +1 -1
- package/extensions/nostr/README.md +2 -2
- package/extensions/nostr/index.ts +5 -5
- package/extensions/nostr/package.json +1 -1
- package/extensions/nostr/src/types.ts +4 -4
- package/extensions/open-prose/index.ts +2 -2
- package/extensions/qwen-portal-auth/README.md +1 -1
- package/extensions/signal/index.ts +2 -2
- package/extensions/signal/package.json +1 -1
- package/extensions/slack/index.ts +2 -2
- package/extensions/slack/package.json +1 -1
- package/extensions/telegram/index.ts +2 -2
- package/extensions/telegram/package.json +1 -1
- package/extensions/telegram/src/channel.ts +2 -2
- package/extensions/tlon/README.md +2 -2
- package/extensions/tlon/index.ts +2 -2
- package/extensions/tlon/package.json +1 -1
- package/extensions/tlon/src/channel.ts +13 -13
- package/extensions/tlon/src/monitor/index.ts +3 -3
- package/extensions/tlon/src/onboarding.ts +3 -3
- package/extensions/tlon/src/types.ts +3 -3
- package/extensions/twitch/README.md +1 -1
- package/extensions/twitch/index.ts +2 -2
- package/extensions/twitch/package.json +1 -1
- package/extensions/twitch/src/config.ts +3 -3
- package/extensions/twitch/src/monitor.ts +3 -3
- package/extensions/twitch/src/onboarding.ts +9 -9
- package/extensions/twitch/src/outbound.test.ts +2 -2
- package/extensions/twitch/src/plugin.test.ts +2 -2
- package/extensions/twitch/src/plugin.ts +8 -8
- package/extensions/twitch/src/send.test.ts +2 -2
- package/extensions/twitch/src/send.ts +4 -4
- package/extensions/twitch/src/token.test.ts +8 -8
- package/extensions/twitch/src/token.ts +3 -3
- package/extensions/twitch/src/twitch-client.ts +3 -3
- package/extensions/twitch/src/types.ts +3 -3
- package/extensions/twitch/src/utils/markdown.ts +1 -1
- package/extensions/voice-call/README.md +3 -3
- package/extensions/voice-call/package.json +1 -1
- package/extensions/voice-call/src/core-bridge.ts +2 -2
- package/extensions/voice-call/src/response-generator.ts +1 -1
- package/extensions/whatsapp/index.ts +2 -2
- package/extensions/whatsapp/package.json +1 -1
- package/extensions/zalo/README.md +1 -1
- package/extensions/zalo/index.ts +2 -2
- package/extensions/zalo/package.json +1 -1
- package/extensions/zalo/src/accounts.ts +8 -8
- package/extensions/zalo/src/actions.ts +4 -4
- package/extensions/zalo/src/channel.directory.test.ts +2 -2
- package/extensions/zalo/src/channel.ts +18 -18
- package/extensions/zalo/src/monitor.ts +9 -9
- package/extensions/zalo/src/monitor.webhook.test.ts +2 -2
- package/extensions/zalo/src/onboarding.ts +24 -24
- package/extensions/zalo/src/send.ts +2 -2
- package/extensions/zalouser/README.md +2 -2
- package/extensions/zalouser/index.ts +2 -2
- package/extensions/zalouser/package.json +1 -1
- package/extensions/zalouser/src/accounts.ts +9 -9
- package/extensions/zalouser/src/channel.ts +24 -24
- package/extensions/zalouser/src/monitor.ts +4 -4
- package/extensions/zalouser/src/onboarding.ts +28 -28
- package/package.json +13 -251
- package/skills/nano-banana-pro/scripts/generate_image.py +1 -1
- package/skills/tmux/scripts/find-sessions.sh +1 -1
- package/CHANGELOG.md +0 -102
- package/README-header.png +0 -0
- package/git-hooks/pre-commit +0 -4
- package/scripts/format-staged.js +0 -148
- package/scripts/postinstall.js +0 -300
- package/scripts/setup-git-hooks.js +0 -96
|
@@ -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,
|
|
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
|
-
|
|
215
|
-
|
|
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
|
|
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
|
|
363
|
+
].join("\n"), "Kimi Coding");
|
|
223
364
|
}
|
|
224
|
-
const envKey = resolveEnvApiKey("kimi-
|
|
365
|
+
const envKey = resolveEnvApiKey("kimi-coding");
|
|
225
366
|
if (envKey) {
|
|
226
367
|
const useExisting = await params.prompter.confirm({
|
|
227
|
-
message: `Use existing
|
|
368
|
+
message: `Use existing KIMI_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
|
|
228
369
|
initialValue: true,
|
|
229
370
|
});
|
|
230
371
|
if (useExisting) {
|
|
231
|
-
await
|
|
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
|
|
378
|
+
message: "Enter Kimi Coding API key",
|
|
238
379
|
validate: validateApiKeyInput,
|
|
239
380
|
});
|
|
240
|
-
await
|
|
381
|
+
await setKimiCodingApiKey(normalizeApiKeyInput(String(key)), params.agentDir);
|
|
241
382
|
}
|
|
242
383
|
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
243
|
-
profileId: "kimi-
|
|
244
|
-
provider: "kimi-
|
|
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:
|
|
392
|
+
defaultModel: KIMI_CODING_MODEL_REF,
|
|
252
393
|
applyDefaultConfig: applyKimiCodeConfig,
|
|
253
394
|
applyProviderConfig: applyKimiCodeProviderConfig,
|
|
254
|
-
noteDefault:
|
|
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
|
-
"
|
|
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 {
|
|
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 ?
|
|
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
|
-
"
|
|
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" ? "
|
|
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
|
|
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);
|
package/dist/commands/docs.js
CHANGED
|
@@ -3,7 +3,7 @@ import { runCommandWithTimeout } from "../process/exec.js";
|
|
|
3
3
|
import { formatDocsLink } from "../terminal/links.js";
|
|
4
4
|
import { isRich, theme } from "../terminal/theme.js";
|
|
5
5
|
import { formatCliCommand } from "../cli/command-format.js";
|
|
6
|
-
const SEARCH_TOOL = "https://docs.molt.bot/mcp.
|
|
6
|
+
const SEARCH_TOOL = "https://docs.molt.bot/mcp.SearchPoolbot";
|
|
7
7
|
const SEARCH_TIMEOUT_MS = 30_000;
|
|
8
8
|
const DEFAULT_SNIPPET_MAX = 220;
|
|
9
9
|
function resolveNodeRunner() {
|
|
@@ -36,7 +36,7 @@ export async function maybeMigrateLegacyGatewayService(cfg, mode, runtime, promp
|
|
|
36
36
|
return;
|
|
37
37
|
note(legacyServices.map((svc) => `- ${svc.label} (${svc.platform}, ${svc.detail})`).join("\n"), "Legacy gateway services detected");
|
|
38
38
|
const migrate = await prompter.confirmSkipInNonInteractive({
|
|
39
|
-
message: "Migrate legacy gateway services to
|
|
39
|
+
message: "Migrate legacy gateway services to Poolbot now?",
|
|
40
40
|
initialValue: true,
|
|
41
41
|
});
|
|
42
42
|
if (!migrate)
|
|
@@ -62,11 +62,11 @@ export async function maybeMigrateLegacyGatewayService(cfg, mode, runtime, promp
|
|
|
62
62
|
const service = resolveGatewayService();
|
|
63
63
|
const loaded = await service.isLoaded({ env: process.env });
|
|
64
64
|
if (loaded) {
|
|
65
|
-
note(`
|
|
65
|
+
note(`Poolbot ${service.label} already ${service.loadedText}.`, "Gateway");
|
|
66
66
|
return;
|
|
67
67
|
}
|
|
68
68
|
const install = await prompter.confirmSkipInNonInteractive({
|
|
69
|
-
message: "Install
|
|
69
|
+
message: "Install Poolbot gateway service now?",
|
|
70
70
|
initialValue: true,
|
|
71
71
|
});
|
|
72
72
|
if (!install)
|
|
@@ -3,7 +3,7 @@ import { isTruthyEnvValue } from "../infra/env.js";
|
|
|
3
3
|
import { runCommandWithTimeout } from "../process/exec.js";
|
|
4
4
|
import { note } from "../terminal/note.js";
|
|
5
5
|
import { formatCliCommand } from "../cli/command-format.js";
|
|
6
|
-
async function
|
|
6
|
+
async function detectPoolbotGitCheckout(root) {
|
|
7
7
|
const res = await runCommandWithTimeout(["git", "-C", root, "rev-parse", "--show-toplevel"], {
|
|
8
8
|
timeoutMs: 5000,
|
|
9
9
|
}).catch(() => null);
|
|
@@ -28,10 +28,10 @@ export async function maybeOfferUpdateBeforeDoctor(params) {
|
|
|
28
28
|
Boolean(process.stdin.isTTY);
|
|
29
29
|
if (!canOfferUpdate || !params.root)
|
|
30
30
|
return { updated: false };
|
|
31
|
-
const git = await
|
|
31
|
+
const git = await detectPoolbotGitCheckout(params.root);
|
|
32
32
|
if (git === "git") {
|
|
33
33
|
const shouldUpdate = await params.confirm({
|
|
34
|
-
message: "Update
|
|
34
|
+
message: "Update Poolbot from git before running doctor?",
|
|
35
35
|
initialValue: true,
|
|
36
36
|
});
|
|
37
37
|
if (!shouldUpdate)
|
package/dist/commands/doctor.js
CHANGED
|
@@ -41,7 +41,7 @@ function resolveMode(cfg) {
|
|
|
41
41
|
export async function doctorCommand(runtime = defaultRuntime, options = {}) {
|
|
42
42
|
const prompter = createDoctorPrompter({ runtime, options });
|
|
43
43
|
printWizardHeader(runtime);
|
|
44
|
-
intro("
|
|
44
|
+
intro("Poolbot doctor");
|
|
45
45
|
const root = await resolvePoolBotPackageRoot({
|
|
46
46
|
moduleUrl: import.meta.url,
|
|
47
47
|
argv1: process.argv[1],
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import crypto from "node:crypto";
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
|
-
import {
|
|
3
|
+
import { resolvePoolbotAgentDir } from "../../agents/agent-paths.js";
|
|
4
4
|
import { ensureAuthProfileStore, listProfilesForProvider, resolveAuthProfileDisplayLabel, resolveAuthProfileOrder, } from "../../agents/auth-profiles.js";
|
|
5
5
|
import { runEmbeddedPiAgent } from "../../agents/pi-embedded.js";
|
|
6
6
|
import { describeFailoverError } from "../../agents/failover-error.js";
|
|
@@ -250,7 +250,7 @@ async function runTargetsWithConcurrency(params) {
|
|
|
250
250
|
const { cfg, targets, timeoutMs, maxTokens, onProgress } = params;
|
|
251
251
|
const concurrency = Math.max(1, Math.min(targets.length || 1, params.concurrency));
|
|
252
252
|
const agentId = resolveDefaultAgentId(cfg);
|
|
253
|
-
const agentDir =
|
|
253
|
+
const agentDir = resolvePoolbotAgentDir();
|
|
254
254
|
const workspaceDir = resolveAgentWorkspaceDir(cfg, agentId) ?? resolveDefaultAgentWorkspaceDir();
|
|
255
255
|
const sessionDir = resolveSessionTranscriptsDirForAgent(agentId);
|
|
256
256
|
await fs.mkdir(workspaceDir, { recursive: true });
|