@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.
- 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 +94 -7
- package/dist/agents/tools/web-search.js +1 -1
- package/dist/agents/workspace.js +1 -5
- 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/agent-tools/whatsapp-login.js +1 -17
- 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-state-integrity.js +2 -14
- 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.js +0 -1
- package/dist/config/types.memory.js +1 -0
- package/dist/config/version.js +4 -4
- package/dist/config/zod-schema.js +0 -6
- package/dist/daemon/constants.js +7 -7
- package/dist/daemon/inspect.js +6 -6
- package/dist/daemon/systemd-unit.js +1 -1
- package/dist/discord/monitor/message-handler.process.js +6 -4
- package/dist/gateway/client.js +0 -14
- 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 -6
- 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/index.js +0 -5
- package/dist/memory/manager.js +3 -25
- 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/slack/monitor/message-handler/prepare.js +10 -4
- package/dist/slack/monitor/slash.js +10 -4
- 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 -4
- 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 -250
- package/skills/nano-banana-pro/scripts/generate_image.py +1 -1
- package/skills/tmux/scripts/find-sessions.sh +1 -1
- package/CHANGELOG.md +0 -200
- 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
- package/skills/webgpu-threejs-tsl/REFERENCE.md +0 -283
- package/skills/webgpu-threejs-tsl/SKILL.md +0 -91
- package/skills/webgpu-threejs-tsl/docs/compute-shaders.md +0 -404
- package/skills/webgpu-threejs-tsl/docs/core-concepts.md +0 -453
- package/skills/webgpu-threejs-tsl/docs/materials.md +0 -353
- package/skills/webgpu-threejs-tsl/docs/post-processing.md +0 -434
- package/skills/webgpu-threejs-tsl/docs/wgsl-integration.md +0 -324
- package/skills/webgpu-threejs-tsl/examples/basic-setup.js +0 -87
- package/skills/webgpu-threejs-tsl/examples/custom-material.js +0 -170
- package/skills/webgpu-threejs-tsl/examples/earth-shader.js +0 -292
- package/skills/webgpu-threejs-tsl/examples/particle-system.js +0 -259
- package/skills/webgpu-threejs-tsl/examples/post-processing.js +0 -199
- package/skills/webgpu-threejs-tsl/templates/compute-shader.js +0 -305
- package/skills/webgpu-threejs-tsl/templates/webgpu-project.js +0 -276
package/dist/cli/update-cli.js
CHANGED
|
@@ -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("
|
|
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
|
|
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
|
|
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
|
|
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)")
|
package/dist/cli/webhooks-cli.js
CHANGED
|
@@ -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 +
|
|
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>", "
|
|
22
|
-
.option("--hook-token <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>", "
|
|
53
|
-
.option("--hook-token <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
|
|
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,
|
|
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);
|