@poolzin/pool-bot 2026.1.39 → 2026.2.1
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/bash-tools.exec.js +76 -25
- package/dist/agents/cli-runner/helpers.js +10 -12
- 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/identity.js +47 -7
- package/dist/agents/memory-search.js +25 -8
- 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 +31 -4
- package/dist/agents/models-config.js +3 -3
- package/dist/agents/models-config.providers.js +147 -39
- package/dist/agents/pi-embedded-block-chunker.js +117 -42
- package/dist/agents/pi-embedded-helpers/errors.js +183 -78
- package/dist/agents/pi-embedded-helpers/openai.js +1 -1
- package/dist/agents/pi-embedded-helpers.js +1 -1
- package/dist/agents/pi-embedded-runner/compact.js +9 -8
- package/dist/agents/pi-embedded-runner/model.js +63 -4
- package/dist/agents/pi-embedded-runner/run/attempt.js +27 -17
- package/dist/agents/pi-embedded-runner/run.js +203 -50
- package/dist/agents/pi-embedded-runner/system-prompt.js +10 -2
- 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-embedded-subscribe.js +118 -29
- 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 +20 -10
- package/dist/agents/pi-tools.read.js +2 -2
- package/dist/agents/poolbot-tools.js +15 -10
- package/dist/agents/sandbox-paths.js +31 -0
- package/dist/agents/session-file-repair.js +83 -0
- package/dist/agents/session-tool-result-guard.js +94 -15
- package/dist/agents/session-transcript-repair.js +68 -0
- package/dist/agents/shell-utils.js +51 -0
- package/dist/agents/skills/bundled-context.js +23 -0
- package/dist/agents/skills/bundled-dir.js +41 -7
- package/dist/agents/skills/frontmatter.js +1 -1
- package/dist/agents/skills/workspace.js +2 -2
- package/dist/agents/skills-install.js +60 -23
- package/dist/agents/subagent-announce.js +79 -34
- 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.conformance.js +14 -0
- package/dist/agents/tool-policy.js +25 -1
- package/dist/agents/tools/browser-tool.js +3 -3
- package/dist/agents/tools/cron-tool.js +166 -19
- package/dist/agents/tools/discord-actions-presence.js +78 -0
- package/dist/agents/tools/image-tool.js +2 -2
- package/dist/agents/tools/memory-tool.js +93 -5
- package/dist/agents/tools/message-tool.js +56 -2
- package/dist/agents/tools/sessions-history-tool.js +69 -1
- package/dist/agents/tools/web-search.js +211 -42
- package/dist/agents/usage.js +23 -1
- package/dist/agents/workspace-run.js +67 -0
- package/dist/agents/workspace-templates.js +44 -0
- package/dist/auto-reply/command-auth.js +121 -6
- package/dist/auto-reply/commands-registry.data.js +1 -1
- package/dist/auto-reply/envelope.js +50 -72
- package/dist/auto-reply/reply/commands-compact.js +1 -0
- package/dist/auto-reply/reply/commands-context-report.js +3 -2
- package/dist/auto-reply/reply/commands-context.js +1 -0
- package/dist/auto-reply/reply/commands-models.js +107 -60
- package/dist/auto-reply/reply/commands-ptt.js +171 -0
- package/dist/auto-reply/reply/commands-session.js +2 -2
- package/dist/auto-reply/reply/get-reply-run.js +16 -5
- package/dist/auto-reply/reply/groups.js +1 -1
- package/dist/auto-reply/reply/inbound-context.js +9 -1
- package/dist/auto-reply/reply/inbound-meta.js +130 -0
- package/dist/auto-reply/reply/model-selection.js +3 -3
- package/dist/auto-reply/reply/untrusted-context.js +15 -0
- package/dist/auto-reply/status.js +1 -1
- package/dist/auto-reply/thinking.js +88 -43
- package/dist/browser/bridge-server.js +13 -0
- package/dist/browser/cdp.helpers.js +38 -24
- package/dist/browser/client-fetch.js +51 -8
- package/dist/browser/config.js +2 -11
- package/dist/browser/extension-relay.js +104 -43
- package/dist/browser/pw-ai.js +1 -1
- package/dist/browser/pw-session.js +143 -8
- package/dist/browser/pw-tools-core.interactions.js +125 -27
- package/dist/browser/pw-tools-core.responses.js +1 -1
- package/dist/browser/pw-tools-core.state.js +1 -1
- package/dist/browser/routes/agent.act.js +86 -41
- package/dist/browser/routes/dispatcher.js +4 -4
- package/dist/browser/screenshot.js +1 -1
- package/dist/browser/server-context.js +2 -2
- package/dist/browser/server.js +13 -0
- 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/channels/reply-prefix.js +8 -1
- package/dist/cli/browser-cli-extension.js +2 -2
- package/dist/cli/cron-cli/register.cron-add.js +61 -40
- package/dist/cli/cron-cli/register.cron-edit.js +60 -34
- package/dist/cli/cron-cli/shared.js +56 -41
- package/dist/cli/dns-cli.js +26 -14
- package/dist/cli/docs-cli.js +1 -1
- package/dist/cli/gateway-cli/dev.js +1 -1
- package/dist/cli/gateway-cli/register.js +37 -19
- package/dist/cli/memory-cli.js +30 -20
- package/dist/cli/nodes-cli/register.canvas.js +1 -1
- package/dist/cli/parse-bytes.js +37 -0
- 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 +173 -52
- package/dist/cli/webhooks-cli.js +5 -5
- package/dist/commands/agent.js +1 -0
- 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-config-flow.js +61 -5
- package/dist/commands/doctor-gateway-services.js +3 -3
- package/dist/commands/doctor-state-migrations.js +1 -1
- package/dist/commands/doctor-update.js +3 -3
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/health.js +1 -1
- package/dist/commands/model-allowlist.js +29 -0
- package/dist/commands/model-picker.js +2 -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 +44 -24
- package/dist/commands/models/shared.js +15 -0
- 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-custom.js +384 -0
- package/dist/commands/onboard-non-interactive/local/auth-choice-inference.js +35 -0
- package/dist/commands/onboard-non-interactive/local/auth-choice.js +146 -9
- package/dist/commands/onboard-skills.js +63 -38
- package/dist/commands/openai-model-default.js +41 -0
- 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/defaults.js +3 -2
- package/dist/config/io.js +3 -3
- package/dist/config/paths.js +136 -35
- package/dist/config/plugin-auto-enable.js +21 -5
- package/dist/config/redact-snapshot.js +153 -0
- package/dist/config/schema.field-metadata.js +590 -0
- package/dist/config/schema.js +3 -3
- package/dist/config/sessions/store.js +291 -23
- package/dist/config/types.memory.js +1 -0
- package/dist/config/version.js +4 -4
- package/dist/config/zod-schema.agent-defaults.js +3 -0
- package/dist/config/zod-schema.agent-runtime.js +13 -2
- package/dist/config/zod-schema.providers-core.js +142 -0
- package/dist/config/zod-schema.session.js +3 -0
- package/dist/cron/delivery.js +57 -0
- package/dist/cron/isolated-agent/delivery-target.js +18 -3
- package/dist/cron/isolated-agent/helpers.js +22 -5
- package/dist/cron/isolated-agent/run.js +171 -63
- package/dist/cron/isolated-agent/session.js +2 -0
- package/dist/cron/normalize.js +356 -28
- package/dist/cron/parse.js +10 -5
- package/dist/cron/run-log.js +35 -10
- package/dist/cron/schedule.js +41 -6
- package/dist/cron/service/jobs.js +208 -35
- package/dist/cron/service/ops.js +72 -16
- package/dist/cron/service/state.js +2 -0
- package/dist/cron/service/store.js +386 -14
- package/dist/cron/service/timer.js +390 -147
- package/dist/cron/session-reaper.js +86 -0
- package/dist/cron/store.js +23 -8
- package/dist/cron/validate-timestamp.js +43 -0
- 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/agent-components.js +438 -0
- package/dist/discord/monitor/allow-list.js +28 -5
- package/dist/discord/monitor/gateway-registry.js +29 -0
- package/dist/discord/monitor/native-command.js +44 -23
- package/dist/discord/monitor/sender-identity.js +45 -0
- package/dist/discord/pluralkit.js +27 -0
- package/dist/discord/send.outbound.js +92 -5
- package/dist/discord/send.shared.js +60 -23
- package/dist/discord/targets.js +84 -1
- package/dist/entry.js +15 -9
- package/dist/extensionAPI.js +8 -0
- package/dist/gateway/control-ui.js +8 -1
- package/dist/gateway/hooks-mapping.js +3 -0
- package/dist/gateway/hooks.js +65 -0
- package/dist/gateway/live-image-probe.js +1 -66
- package/dist/gateway/net.js +96 -31
- package/dist/gateway/node-command-policy.js +50 -15
- package/dist/gateway/openai-http.js +2 -2
- package/dist/gateway/openresponses-http.js +4 -4
- package/dist/gateway/origin-check.js +56 -0
- package/dist/gateway/protocol/client-info.js +9 -0
- package/dist/gateway/protocol/index.js +9 -2
- package/dist/gateway/protocol/schema/agents-models-skills.js +71 -1
- package/dist/gateway/protocol/schema/cron.js +22 -10
- package/dist/gateway/protocol/schema/protocol-schemas.js +16 -2
- package/dist/gateway/protocol/schema/sessions.js +12 -0
- package/dist/gateway/server/hooks.js +1 -1
- package/dist/gateway/server-broadcast.js +26 -9
- package/dist/gateway/server-chat.js +112 -23
- package/dist/gateway/server-discovery-runtime.js +10 -2
- package/dist/gateway/server-discovery.js +2 -2
- package/dist/gateway/server-http.js +110 -12
- package/dist/gateway/server-methods/agent-timestamp.js +60 -0
- package/dist/gateway/server-methods/agents.js +321 -2
- package/dist/gateway/server-methods/usage.js +559 -16
- package/dist/gateway/server-runtime-state.js +22 -8
- package/dist/gateway/server-startup-memory.js +16 -0
- package/dist/gateway/server.impl.js +7 -3
- package/dist/gateway/session-utils.fs.js +23 -25
- package/dist/gateway/session-utils.js +20 -10
- package/dist/gateway/sessions-patch.js +7 -22
- package/dist/gateway/test-helpers.server.js +35 -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/imessage/constants.js +2 -0
- package/dist/imessage/monitor/deliver.js +4 -1
- package/dist/imessage/monitor/monitor-provider.js +51 -1
- package/dist/index.js +2 -2
- package/dist/infra/bonjour-discovery.js +131 -70
- package/dist/infra/bonjour.js +3 -3
- package/dist/infra/control-ui-assets.js +134 -12
- package/dist/infra/errors.js +12 -0
- package/dist/infra/exec-approvals.js +266 -57
- package/dist/infra/format-time/format-datetime.js +79 -0
- package/dist/infra/format-time/format-duration.js +81 -0
- package/dist/infra/format-time/format-relative.js +80 -0
- package/dist/infra/heartbeat-runner.js +140 -49
- package/dist/infra/home-dir.js +54 -0
- package/dist/infra/net/fetch-guard.js +122 -0
- package/dist/infra/net/ssrf.js +65 -29
- package/dist/infra/outbound/abort.js +14 -0
- package/dist/infra/outbound/message-action-runner.js +77 -13
- package/dist/infra/outbound/outbound-session.js +143 -37
- package/dist/infra/path-env.js +3 -3
- package/dist/infra/poolbot-root.js +43 -1
- package/dist/infra/provider-usage.fetch.minimax.js +1 -1
- package/dist/infra/restart.js +1 -1
- package/dist/infra/session-cost-usage.js +631 -41
- package/dist/infra/state-migrations.js +317 -47
- package/dist/infra/tailscale.js +1 -1
- package/dist/infra/update-global.js +35 -0
- package/dist/infra/update-runner.js +149 -43
- package/dist/infra/warning-filter.js +65 -0
- package/dist/infra/widearea-dns.js +30 -9
- package/dist/logging/redact-identifier.js +12 -0
- package/dist/macos/relay.js +2 -2
- package/dist/media/fetch.js +81 -58
- 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/apply.js +403 -3
- package/dist/media-understanding/attachments.js +38 -27
- package/dist/media-understanding/defaults.js +16 -0
- package/dist/media-understanding/providers/deepgram/audio.js +22 -14
- package/dist/media-understanding/providers/google/audio.js +24 -17
- package/dist/media-understanding/providers/google/video.js +24 -17
- package/dist/media-understanding/providers/image.js +4 -4
- package/dist/media-understanding/providers/index.js +4 -1
- package/dist/media-understanding/providers/openai/audio.js +22 -14
- package/dist/media-understanding/providers/shared.js +16 -11
- package/dist/media-understanding/providers/zai/index.js +6 -0
- package/dist/media-understanding/runner.js +158 -90
- package/dist/memory/backend-config.js +207 -0
- package/dist/memory/batch-voyage.js +277 -0
- package/dist/memory/embeddings-voyage.js +75 -0
- package/dist/memory/embeddings.js +29 -17
- package/dist/memory/internal.js +101 -18
- package/dist/memory/manager.js +155 -48
- package/dist/memory/search-manager.js +173 -0
- package/dist/memory/session-files.js +9 -3
- package/dist/memory/types.js +1 -0
- package/dist/node-host/runner.js +36 -26
- package/dist/node-host/with-timeout.js +27 -0
- package/dist/pairing/pairing-messages.js +1 -1
- package/dist/plugins/commands.js +5 -1
- package/dist/plugins/config-state.js +86 -7
- package/dist/plugins/discovery.js +1 -1
- package/dist/plugins/install.js +2 -2
- package/dist/plugins/source-display.js +51 -0
- package/dist/plugins/update.js +1 -1
- package/dist/process/exec.js +20 -2
- package/dist/routing/resolve-route.js +12 -0
- package/dist/routing/session-key.js +15 -0
- package/dist/runtime.js +2 -0
- package/dist/security/audit-extra.async.js +601 -0
- package/dist/security/audit-extra.js +2 -830
- package/dist/security/audit-extra.sync.js +505 -0
- package/dist/security/audit.js +2 -2
- package/dist/security/channel-metadata.js +34 -0
- package/dist/security/external-content.js +88 -6
- package/dist/security/skill-scanner.js +330 -0
- package/dist/sessions/session-key-utils.js +7 -0
- package/dist/shared/text/reasoning-tags.js +52 -7
- package/dist/signal/monitor/event-handler.js +80 -1
- package/dist/slack/monitor/media.js +85 -15
- package/dist/tailscale/detect.js +145 -0
- package/dist/telegram/bot/helpers.js +109 -28
- package/dist/telegram/bot-handlers.js +144 -3
- package/dist/telegram/bot-message-context.js +38 -11
- package/dist/telegram/bot-message-dispatch.js +48 -15
- package/dist/telegram/bot-native-commands.js +86 -29
- package/dist/telegram/bot.js +30 -29
- package/dist/telegram/model-buttons.js +163 -0
- package/dist/telegram/monitor.js +110 -85
- package/dist/telegram/send.js +129 -47
- package/dist/terminal/restore.js +45 -0
- package/dist/test-helpers/state-dir-env.js +16 -0
- 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/tts/tts.js +12 -6
- package/dist/tui/tui-session-actions.js +166 -54
- package/dist/utils/fetch-timeout.js +20 -0
- package/dist/utils/normalize-secret-input.js +19 -0
- package/dist/utils/shell-argv.js +61 -0
- package/dist/utils/transcript-tools.js +58 -0
- package/dist/utils.js +55 -14
- package/dist/version.js +42 -5
- 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
package/dist/agents/identity.js
CHANGED
|
@@ -5,15 +5,17 @@ export function resolveAgentIdentity(cfg, agentId) {
|
|
|
5
5
|
}
|
|
6
6
|
export function resolveAckReaction(cfg, agentId) {
|
|
7
7
|
const configured = cfg.messages?.ackReaction;
|
|
8
|
-
if (configured !== undefined)
|
|
8
|
+
if (configured !== undefined) {
|
|
9
9
|
return configured.trim();
|
|
10
|
+
}
|
|
10
11
|
const emoji = resolveAgentIdentity(cfg, agentId)?.emoji?.trim();
|
|
11
12
|
return emoji || DEFAULT_ACK_REACTION;
|
|
12
13
|
}
|
|
13
14
|
export function resolveIdentityNamePrefix(cfg, agentId) {
|
|
14
15
|
const name = resolveAgentIdentity(cfg, agentId)?.name?.trim();
|
|
15
|
-
if (!name)
|
|
16
|
+
if (!name) {
|
|
16
17
|
return undefined;
|
|
18
|
+
}
|
|
17
19
|
return `[${name}]`;
|
|
18
20
|
}
|
|
19
21
|
/** Returns just the identity name (without brackets) for template context. */
|
|
@@ -22,14 +24,48 @@ export function resolveIdentityName(cfg, agentId) {
|
|
|
22
24
|
}
|
|
23
25
|
export function resolveMessagePrefix(cfg, agentId, opts) {
|
|
24
26
|
const configured = opts?.configured ?? cfg.messages?.messagePrefix;
|
|
25
|
-
if (configured !== undefined)
|
|
27
|
+
if (configured !== undefined) {
|
|
26
28
|
return configured;
|
|
29
|
+
}
|
|
27
30
|
const hasAllowFrom = opts?.hasAllowFrom === true;
|
|
28
|
-
if (hasAllowFrom)
|
|
31
|
+
if (hasAllowFrom) {
|
|
29
32
|
return "";
|
|
33
|
+
}
|
|
30
34
|
return resolveIdentityNamePrefix(cfg, agentId) ?? opts?.fallback ?? "[poolbot]";
|
|
31
35
|
}
|
|
32
|
-
|
|
36
|
+
/** Helper to extract a channel config value by dynamic key. */
|
|
37
|
+
function getChannelConfig(cfg, channel) {
|
|
38
|
+
const channels = cfg.channels;
|
|
39
|
+
const value = channels?.[channel];
|
|
40
|
+
return typeof value === "object" && value !== null
|
|
41
|
+
? value
|
|
42
|
+
: undefined;
|
|
43
|
+
}
|
|
44
|
+
export function resolveResponsePrefix(cfg, agentId, opts) {
|
|
45
|
+
// L1: Channel account level
|
|
46
|
+
if (opts?.channel && opts?.accountId) {
|
|
47
|
+
const channelCfg = getChannelConfig(cfg, opts.channel);
|
|
48
|
+
const accounts = channelCfg?.accounts;
|
|
49
|
+
const accountPrefix = accounts?.[opts.accountId]?.responsePrefix;
|
|
50
|
+
if (accountPrefix !== undefined) {
|
|
51
|
+
if (accountPrefix === "auto") {
|
|
52
|
+
return resolveIdentityNamePrefix(cfg, agentId);
|
|
53
|
+
}
|
|
54
|
+
return accountPrefix;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// L2: Channel level
|
|
58
|
+
if (opts?.channel) {
|
|
59
|
+
const channelCfg = getChannelConfig(cfg, opts.channel);
|
|
60
|
+
const channelPrefix = channelCfg?.responsePrefix;
|
|
61
|
+
if (channelPrefix !== undefined) {
|
|
62
|
+
if (channelPrefix === "auto") {
|
|
63
|
+
return resolveIdentityNamePrefix(cfg, agentId);
|
|
64
|
+
}
|
|
65
|
+
return channelPrefix;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// L4: Global level
|
|
33
69
|
const configured = cfg.messages?.responsePrefix;
|
|
34
70
|
if (configured !== undefined) {
|
|
35
71
|
if (configured === "auto") {
|
|
@@ -45,14 +81,18 @@ export function resolveEffectiveMessagesConfig(cfg, agentId, opts) {
|
|
|
45
81
|
hasAllowFrom: opts?.hasAllowFrom,
|
|
46
82
|
fallback: opts?.fallbackMessagePrefix,
|
|
47
83
|
}),
|
|
48
|
-
responsePrefix: resolveResponsePrefix(cfg, agentId
|
|
84
|
+
responsePrefix: resolveResponsePrefix(cfg, agentId, {
|
|
85
|
+
channel: opts?.channel,
|
|
86
|
+
accountId: opts?.accountId,
|
|
87
|
+
}),
|
|
49
88
|
};
|
|
50
89
|
}
|
|
51
90
|
export function resolveHumanDelayConfig(cfg, agentId) {
|
|
52
91
|
const defaults = cfg.agents?.defaults?.humanDelay;
|
|
53
92
|
const overrides = resolveAgentConfig(cfg, agentId)?.humanDelay;
|
|
54
|
-
if (!defaults && !overrides)
|
|
93
|
+
if (!defaults && !overrides) {
|
|
55
94
|
return undefined;
|
|
95
|
+
}
|
|
56
96
|
return {
|
|
57
97
|
mode: overrides?.mode ?? defaults?.mode,
|
|
58
98
|
minMs: overrides?.minMs ?? defaults?.minMs,
|
|
@@ -5,6 +5,7 @@ import { clampInt, clampNumber, resolveUserPath } from "../utils.js";
|
|
|
5
5
|
import { resolveAgentConfig } from "./agent-scope.js";
|
|
6
6
|
const DEFAULT_OPENAI_MODEL = "text-embedding-3-small";
|
|
7
7
|
const DEFAULT_GEMINI_MODEL = "gemini-embedding-001";
|
|
8
|
+
const DEFAULT_VOYAGE_MODEL = "voyage-4-large";
|
|
8
9
|
const DEFAULT_CHUNK_TOKENS = 400;
|
|
9
10
|
const DEFAULT_CHUNK_OVERLAP = 80;
|
|
10
11
|
const DEFAULT_WATCH_DEBOUNCE_MS = 1500;
|
|
@@ -22,20 +23,24 @@ function normalizeSources(sources, sessionMemoryEnabled) {
|
|
|
22
23
|
const normalized = new Set();
|
|
23
24
|
const input = sources?.length ? sources : DEFAULT_SOURCES;
|
|
24
25
|
for (const source of input) {
|
|
25
|
-
if (source === "memory")
|
|
26
|
+
if (source === "memory") {
|
|
26
27
|
normalized.add("memory");
|
|
27
|
-
|
|
28
|
+
}
|
|
29
|
+
if (source === "sessions" && sessionMemoryEnabled) {
|
|
28
30
|
normalized.add("sessions");
|
|
31
|
+
}
|
|
29
32
|
}
|
|
30
|
-
if (normalized.size === 0)
|
|
33
|
+
if (normalized.size === 0) {
|
|
31
34
|
normalized.add("memory");
|
|
35
|
+
}
|
|
32
36
|
return Array.from(normalized);
|
|
33
37
|
}
|
|
34
38
|
function resolveStorePath(agentId, raw) {
|
|
35
39
|
const stateDir = resolveStateDir(process.env, os.homedir);
|
|
36
40
|
const fallback = path.join(stateDir, "memory", `${agentId}.sqlite`);
|
|
37
|
-
if (!raw)
|
|
41
|
+
if (!raw) {
|
|
38
42
|
return fallback;
|
|
43
|
+
}
|
|
39
44
|
const withToken = raw.includes("{agentId}") ? raw.replaceAll("{agentId}", agentId) : raw;
|
|
40
45
|
return resolveUserPath(withToken);
|
|
41
46
|
}
|
|
@@ -51,9 +56,13 @@ function mergeConfig(defaults, overrides, agentId) {
|
|
|
51
56
|
defaultRemote?.baseUrl ||
|
|
52
57
|
defaultRemote?.apiKey ||
|
|
53
58
|
defaultRemote?.headers);
|
|
54
|
-
const includeRemote = hasRemoteConfig ||
|
|
59
|
+
const includeRemote = hasRemoteConfig ||
|
|
60
|
+
provider === "openai" ||
|
|
61
|
+
provider === "gemini" ||
|
|
62
|
+
provider === "voyage" ||
|
|
63
|
+
provider === "auto";
|
|
55
64
|
const batch = {
|
|
56
|
-
enabled: overrideRemote?.batch?.enabled ?? defaultRemote?.batch?.enabled ??
|
|
65
|
+
enabled: overrideRemote?.batch?.enabled ?? defaultRemote?.batch?.enabled ?? false,
|
|
57
66
|
wait: overrideRemote?.batch?.wait ?? defaultRemote?.batch?.wait ?? true,
|
|
58
67
|
concurrency: Math.max(1, overrideRemote?.batch?.concurrency ?? defaultRemote?.batch?.concurrency ?? 2),
|
|
59
68
|
pollIntervalMs: overrideRemote?.batch?.pollIntervalMs ?? defaultRemote?.batch?.pollIntervalMs ?? 2000,
|
|
@@ -72,13 +81,19 @@ function mergeConfig(defaults, overrides, agentId) {
|
|
|
72
81
|
? DEFAULT_GEMINI_MODEL
|
|
73
82
|
: provider === "openai"
|
|
74
83
|
? DEFAULT_OPENAI_MODEL
|
|
75
|
-
:
|
|
84
|
+
: provider === "voyage"
|
|
85
|
+
? DEFAULT_VOYAGE_MODEL
|
|
86
|
+
: undefined;
|
|
76
87
|
const model = overrides?.model ?? defaults?.model ?? modelDefault ?? "";
|
|
77
88
|
const local = {
|
|
78
89
|
modelPath: overrides?.local?.modelPath ?? defaults?.local?.modelPath,
|
|
79
90
|
modelCacheDir: overrides?.local?.modelCacheDir ?? defaults?.local?.modelCacheDir,
|
|
80
91
|
};
|
|
81
92
|
const sources = normalizeSources(overrides?.sources ?? defaults?.sources, sessionMemory);
|
|
93
|
+
const rawPaths = [...(defaults?.extraPaths ?? []), ...(overrides?.extraPaths ?? [])]
|
|
94
|
+
.map((value) => value.trim())
|
|
95
|
+
.filter(Boolean);
|
|
96
|
+
const extraPaths = Array.from(new Set(rawPaths));
|
|
82
97
|
const vector = {
|
|
83
98
|
enabled: overrides?.store?.vector?.enabled ?? defaults?.store?.vector?.enabled ?? true,
|
|
84
99
|
extensionPath: overrides?.store?.vector?.extensionPath ?? defaults?.store?.vector?.extensionPath,
|
|
@@ -144,6 +159,7 @@ function mergeConfig(defaults, overrides, agentId) {
|
|
|
144
159
|
return {
|
|
145
160
|
enabled,
|
|
146
161
|
sources,
|
|
162
|
+
extraPaths,
|
|
147
163
|
provider,
|
|
148
164
|
remote,
|
|
149
165
|
experimental: {
|
|
@@ -183,7 +199,8 @@ export function resolveMemorySearchConfig(cfg, agentId) {
|
|
|
183
199
|
const defaults = cfg.agents?.defaults?.memorySearch;
|
|
184
200
|
const overrides = resolveAgentConfig(cfg, agentId)?.memorySearch;
|
|
185
201
|
const resolved = mergeConfig(defaults, overrides, agentId);
|
|
186
|
-
if (!resolved.enabled)
|
|
202
|
+
if (!resolved.enabled) {
|
|
187
203
|
return null;
|
|
204
|
+
}
|
|
188
205
|
return resolved;
|
|
189
206
|
}
|
|
@@ -199,22 +199,33 @@ export function resolveEnvApiKey(provider) {
|
|
|
199
199
|
if (normalized === "qwen-portal") {
|
|
200
200
|
return pick("QWEN_OAUTH_TOKEN") ?? pick("QWEN_PORTAL_API_KEY");
|
|
201
201
|
}
|
|
202
|
+
if (normalized === "minimax-portal") {
|
|
203
|
+
return pick("MINIMAX_OAUTH_TOKEN") ?? pick("MINIMAX_API_KEY");
|
|
204
|
+
}
|
|
205
|
+
if (normalized === "kimi-coding") {
|
|
206
|
+
return pick("KIMI_API_KEY") ?? pick("KIMICODE_API_KEY");
|
|
207
|
+
}
|
|
202
208
|
const envMap = {
|
|
203
209
|
openai: "OPENAI_API_KEY",
|
|
204
210
|
google: "GEMINI_API_KEY",
|
|
211
|
+
voyage: "VOYAGE_API_KEY",
|
|
205
212
|
groq: "GROQ_API_KEY",
|
|
206
213
|
deepgram: "DEEPGRAM_API_KEY",
|
|
207
214
|
cerebras: "CEREBRAS_API_KEY",
|
|
208
215
|
xai: "XAI_API_KEY",
|
|
209
216
|
openrouter: "OPENROUTER_API_KEY",
|
|
210
217
|
"vercel-ai-gateway": "AI_GATEWAY_API_KEY",
|
|
218
|
+
"cloudflare-ai-gateway": "CLOUDFLARE_AI_GATEWAY_API_KEY",
|
|
211
219
|
moonshot: "MOONSHOT_API_KEY",
|
|
212
|
-
"kimi-code": "KIMICODE_API_KEY",
|
|
213
220
|
minimax: "MINIMAX_API_KEY",
|
|
221
|
+
xiaomi: "XIAOMI_API_KEY",
|
|
214
222
|
synthetic: "SYNTHETIC_API_KEY",
|
|
215
223
|
venice: "VENICE_API_KEY",
|
|
216
224
|
mistral: "MISTRAL_API_KEY",
|
|
217
225
|
opencode: "OPENCODE_API_KEY",
|
|
226
|
+
together: "TOGETHER_API_KEY",
|
|
227
|
+
qianfan: "QIANFAN_API_KEY",
|
|
228
|
+
ollama: "OLLAMA_API_KEY",
|
|
218
229
|
};
|
|
219
230
|
const envVar = envMap[normalized];
|
|
220
231
|
if (!envVar)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { loadConfig } from "../config/config.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { resolvePoolbotAgentDir } from "./agent-paths.js";
|
|
3
|
+
import { ensurePoolbotModelsJson } from "./models-config.js";
|
|
4
4
|
let modelCatalogPromise = null;
|
|
5
5
|
let hasLoggedModelCatalogError = false;
|
|
6
6
|
const defaultImportPiSdk = () => import("@mariozechner/pi-coding-agent");
|
|
@@ -30,13 +30,13 @@ export async function loadModelCatalog(params) {
|
|
|
30
30
|
});
|
|
31
31
|
try {
|
|
32
32
|
const cfg = params?.config ?? loadConfig();
|
|
33
|
-
await
|
|
33
|
+
await ensurePoolbotModelsJson(cfg);
|
|
34
34
|
// IMPORTANT: keep the dynamic import *inside* the try/catch.
|
|
35
35
|
// If this fails once (e.g. during a pnpm install that temporarily swaps node_modules),
|
|
36
36
|
// we must not poison the cache with a rejected promise (otherwise all channel handlers
|
|
37
37
|
// will keep failing until restart).
|
|
38
38
|
const piSdk = await importPiSdk();
|
|
39
|
-
const agentDir =
|
|
39
|
+
const agentDir = resolvePoolbotAgentDir();
|
|
40
40
|
const authStorage = piSdk.discoverAuthStorage(agentDir);
|
|
41
41
|
const registry = piSdk.discoverModels(authStorage, agentDir);
|
|
42
42
|
const entries = Array.isArray(registry) ? registry : registry.getAll();
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { normalizeGoogleModelId } from "./models-config.providers.js";
|
|
2
2
|
import { resolveAgentModelPrimary } from "./agent-scope.js";
|
|
3
3
|
import { DEFAULT_MODEL, DEFAULT_PROVIDER } from "./defaults.js";
|
|
4
|
+
const ANTHROPIC_MODEL_ALIASES = {
|
|
5
|
+
"opus-4.6": "claude-opus-4-6",
|
|
6
|
+
"opus-4.5": "claude-opus-4-5",
|
|
7
|
+
"sonnet-4.5": "claude-sonnet-4-5",
|
|
8
|
+
};
|
|
4
9
|
function normalizeAliasKey(value) {
|
|
5
10
|
return value.trim().toLowerCase();
|
|
6
11
|
}
|
|
@@ -15,6 +20,8 @@ export function normalizeProviderId(provider) {
|
|
|
15
20
|
return "opencode";
|
|
16
21
|
if (normalized === "qwen")
|
|
17
22
|
return "qwen-portal";
|
|
23
|
+
if (normalized === "kimi-code")
|
|
24
|
+
return "kimi-coding";
|
|
18
25
|
return normalized;
|
|
19
26
|
}
|
|
20
27
|
export function isCliProvider(provider, cfg) {
|
|
@@ -31,10 +38,9 @@ function normalizeAnthropicModelId(model) {
|
|
|
31
38
|
if (!trimmed)
|
|
32
39
|
return trimmed;
|
|
33
40
|
const lower = trimmed.toLowerCase();
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
return "claude-sonnet-4-5";
|
|
41
|
+
const aliased = ANTHROPIC_MODEL_ALIASES[lower];
|
|
42
|
+
if (aliased)
|
|
43
|
+
return aliased;
|
|
38
44
|
return trimmed;
|
|
39
45
|
}
|
|
40
46
|
function normalizeProviderModelId(provider, model) {
|
|
@@ -62,6 +68,27 @@ export function parseModelRef(raw, defaultProvider) {
|
|
|
62
68
|
const normalizedModel = normalizeProviderModelId(provider, model);
|
|
63
69
|
return { provider, model: normalizedModel };
|
|
64
70
|
}
|
|
71
|
+
export function resolveAllowlistModelKey(raw, defaultProvider) {
|
|
72
|
+
const parsed = parseModelRef(raw, defaultProvider);
|
|
73
|
+
if (!parsed) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
return modelKey(parsed.provider, parsed.model);
|
|
77
|
+
}
|
|
78
|
+
export function buildConfiguredAllowlistKeys(params) {
|
|
79
|
+
const rawAllowlist = Object.keys(params.cfg?.agents?.defaults?.models ?? {});
|
|
80
|
+
if (rawAllowlist.length === 0) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
const keys = new Set();
|
|
84
|
+
for (const raw of rawAllowlist) {
|
|
85
|
+
const key = resolveAllowlistModelKey(String(raw ?? ""), params.defaultProvider);
|
|
86
|
+
if (key) {
|
|
87
|
+
keys.add(key);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return keys.size > 0 ? keys : null;
|
|
91
|
+
}
|
|
65
92
|
export function buildModelAliasIndex(params) {
|
|
66
93
|
const byAlias = new Map();
|
|
67
94
|
const byKey = new Map();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { loadConfig } from "../config/config.js";
|
|
4
|
-
import {
|
|
4
|
+
import { resolvePoolbotAgentDir } from "./agent-paths.js";
|
|
5
5
|
import { normalizeProviders, resolveImplicitBedrockProvider, resolveImplicitCopilotProvider, resolveImplicitProviders, } from "./models-config.providers.js";
|
|
6
6
|
const DEFAULT_MODE = "merge";
|
|
7
7
|
function isRecord(value) {
|
|
@@ -57,9 +57,9 @@ async function readJson(pathname) {
|
|
|
57
57
|
return null;
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
|
-
export async function
|
|
60
|
+
export async function ensurePoolbotModelsJson(config, agentDirOverride) {
|
|
61
61
|
const cfg = config ?? loadConfig();
|
|
62
|
-
const agentDir = agentDirOverride?.trim() ? agentDirOverride.trim() :
|
|
62
|
+
const agentDir = agentDirOverride?.trim() ? agentDirOverride.trim() : resolvePoolbotAgentDir();
|
|
63
63
|
const explicitProviders = (cfg.models?.providers ?? {});
|
|
64
64
|
const implicitProviders = await resolveImplicitProviders({ agentDir });
|
|
65
65
|
const providers = mergeProviders({
|
|
@@ -2,13 +2,17 @@ import { DEFAULT_COPILOT_API_BASE_URL, resolveCopilotApiToken, } from "../provid
|
|
|
2
2
|
import { ensureAuthProfileStore, listProfilesForProvider } from "./auth-profiles.js";
|
|
3
3
|
import { resolveAwsSdkEnvVarName, resolveEnvApiKey } from "./model-auth.js";
|
|
4
4
|
import { discoverBedrockModels } from "./bedrock-discovery.js";
|
|
5
|
+
import { buildCloudflareAiGatewayModelDefinition, resolveCloudflareAiGatewayBaseUrl, } from "./cloudflare-ai-gateway.js";
|
|
5
6
|
import { buildSyntheticModelDefinition, SYNTHETIC_BASE_URL, SYNTHETIC_MODEL_CATALOG, } from "./synthetic-models.js";
|
|
7
|
+
import { TOGETHER_BASE_URL, TOGETHER_MODEL_CATALOG, buildTogetherModelDefinition, } from "./together-models.js";
|
|
6
8
|
import { discoverVeniceModels, VENICE_BASE_URL } from "./venice-models.js";
|
|
7
|
-
const MINIMAX_API_BASE_URL = "https://api.minimax.
|
|
9
|
+
const MINIMAX_API_BASE_URL = "https://api.minimax.chat/v1";
|
|
10
|
+
const MINIMAX_PORTAL_BASE_URL = "https://api.minimax.io/anthropic";
|
|
8
11
|
const MINIMAX_DEFAULT_MODEL_ID = "MiniMax-M2.1";
|
|
9
12
|
const MINIMAX_DEFAULT_VISION_MODEL_ID = "MiniMax-VL-01";
|
|
10
13
|
const MINIMAX_DEFAULT_CONTEXT_WINDOW = 200000;
|
|
11
14
|
const MINIMAX_DEFAULT_MAX_TOKENS = 8192;
|
|
15
|
+
const MINIMAX_OAUTH_PLACEHOLDER = "minimax-oauth";
|
|
12
16
|
// Pricing: MiniMax doesn't publish public rates. Override in models.json for accurate costs.
|
|
13
17
|
const MINIMAX_API_COST = {
|
|
14
18
|
input: 15,
|
|
@@ -17,7 +21,7 @@ const MINIMAX_API_COST = {
|
|
|
17
21
|
cacheWrite: 10,
|
|
18
22
|
};
|
|
19
23
|
const MOONSHOT_BASE_URL = "https://api.moonshot.ai/v1";
|
|
20
|
-
const MOONSHOT_DEFAULT_MODEL_ID = "kimi-k2
|
|
24
|
+
const MOONSHOT_DEFAULT_MODEL_ID = "kimi-k2.5";
|
|
21
25
|
const MOONSHOT_DEFAULT_CONTEXT_WINDOW = 256000;
|
|
22
26
|
const MOONSHOT_DEFAULT_MAX_TOKENS = 8192;
|
|
23
27
|
const MOONSHOT_DEFAULT_COST = {
|
|
@@ -26,13 +30,11 @@ const MOONSHOT_DEFAULT_COST = {
|
|
|
26
30
|
cacheRead: 0,
|
|
27
31
|
cacheWrite: 0,
|
|
28
32
|
};
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const KIMI_CODE_COMPAT = { supportsDeveloperRole: false };
|
|
35
|
-
const KIMI_CODE_DEFAULT_COST = {
|
|
33
|
+
const XIAOMI_BASE_URL = "https://api.xiaomimimo.com/anthropic";
|
|
34
|
+
export const XIAOMI_DEFAULT_MODEL_ID = "mimo-v2-flash";
|
|
35
|
+
const XIAOMI_DEFAULT_CONTEXT_WINDOW = 262144;
|
|
36
|
+
const XIAOMI_DEFAULT_MAX_TOKENS = 8192;
|
|
37
|
+
const XIAOMI_DEFAULT_COST = {
|
|
36
38
|
input: 0,
|
|
37
39
|
output: 0,
|
|
38
40
|
cacheRead: 0,
|
|
@@ -58,6 +60,16 @@ const OLLAMA_DEFAULT_COST = {
|
|
|
58
60
|
cacheRead: 0,
|
|
59
61
|
cacheWrite: 0,
|
|
60
62
|
};
|
|
63
|
+
export const QIANFAN_BASE_URL = "https://qianfan.baidubce.com/v2";
|
|
64
|
+
export const QIANFAN_DEFAULT_MODEL_ID = "deepseek-v3.2";
|
|
65
|
+
const QIANFAN_DEFAULT_CONTEXT_WINDOW = 98304;
|
|
66
|
+
const QIANFAN_DEFAULT_MAX_TOKENS = 32768;
|
|
67
|
+
const QIANFAN_DEFAULT_COST = {
|
|
68
|
+
input: 0,
|
|
69
|
+
output: 0,
|
|
70
|
+
cacheRead: 0,
|
|
71
|
+
cacheWrite: 0,
|
|
72
|
+
};
|
|
61
73
|
async function discoverOllamaModels() {
|
|
62
74
|
// Skip Ollama discovery in test environments
|
|
63
75
|
if (process.env.VITEST || process.env.NODE_ENV === "test") {
|
|
@@ -87,6 +99,11 @@ async function discoverOllamaModels() {
|
|
|
87
99
|
cost: OLLAMA_DEFAULT_COST,
|
|
88
100
|
contextWindow: OLLAMA_DEFAULT_CONTEXT_WINDOW,
|
|
89
101
|
maxTokens: OLLAMA_DEFAULT_MAX_TOKENS,
|
|
102
|
+
// Disable streaming by default for Ollama to avoid SDK issue #1205
|
|
103
|
+
// See: https://github.com/badlogic/pi-mono/issues/1205
|
|
104
|
+
params: {
|
|
105
|
+
streaming: false,
|
|
106
|
+
},
|
|
90
107
|
};
|
|
91
108
|
});
|
|
92
109
|
}
|
|
@@ -198,7 +215,7 @@ export function normalizeProviders(params) {
|
|
|
198
215
|
function buildMinimaxProvider() {
|
|
199
216
|
return {
|
|
200
217
|
baseUrl: MINIMAX_API_BASE_URL,
|
|
201
|
-
api: "
|
|
218
|
+
api: "openai-completions",
|
|
202
219
|
models: [
|
|
203
220
|
{
|
|
204
221
|
id: MINIMAX_DEFAULT_MODEL_ID,
|
|
@@ -228,7 +245,7 @@ function buildMoonshotProvider() {
|
|
|
228
245
|
models: [
|
|
229
246
|
{
|
|
230
247
|
id: MOONSHOT_DEFAULT_MODEL_ID,
|
|
231
|
-
name: "Kimi K2
|
|
248
|
+
name: "Kimi K2.5",
|
|
232
249
|
reasoning: false,
|
|
233
250
|
input: ["text"],
|
|
234
251
|
cost: MOONSHOT_DEFAULT_COST,
|
|
@@ -238,25 +255,6 @@ function buildMoonshotProvider() {
|
|
|
238
255
|
],
|
|
239
256
|
};
|
|
240
257
|
}
|
|
241
|
-
function buildKimiCodeProvider() {
|
|
242
|
-
return {
|
|
243
|
-
baseUrl: KIMI_CODE_BASE_URL,
|
|
244
|
-
api: "openai-completions",
|
|
245
|
-
models: [
|
|
246
|
-
{
|
|
247
|
-
id: KIMI_CODE_MODEL_ID,
|
|
248
|
-
name: "Kimi For Coding",
|
|
249
|
-
reasoning: true,
|
|
250
|
-
input: ["text"],
|
|
251
|
-
cost: KIMI_CODE_DEFAULT_COST,
|
|
252
|
-
contextWindow: KIMI_CODE_CONTEXT_WINDOW,
|
|
253
|
-
maxTokens: KIMI_CODE_MAX_TOKENS,
|
|
254
|
-
headers: KIMI_CODE_HEADERS,
|
|
255
|
-
compat: KIMI_CODE_COMPAT,
|
|
256
|
-
},
|
|
257
|
-
],
|
|
258
|
-
};
|
|
259
|
-
}
|
|
260
258
|
function buildQwenPortalProvider() {
|
|
261
259
|
return {
|
|
262
260
|
baseUrl: QWEN_PORTAL_BASE_URL,
|
|
@@ -306,6 +304,73 @@ async function buildOllamaProvider() {
|
|
|
306
304
|
models,
|
|
307
305
|
};
|
|
308
306
|
}
|
|
307
|
+
function buildMinimaxPortalProvider() {
|
|
308
|
+
return {
|
|
309
|
+
baseUrl: MINIMAX_PORTAL_BASE_URL,
|
|
310
|
+
api: "anthropic-messages",
|
|
311
|
+
models: [
|
|
312
|
+
{
|
|
313
|
+
id: MINIMAX_DEFAULT_MODEL_ID,
|
|
314
|
+
name: "MiniMax M2.1",
|
|
315
|
+
reasoning: false,
|
|
316
|
+
input: ["text"],
|
|
317
|
+
cost: MINIMAX_API_COST,
|
|
318
|
+
contextWindow: MINIMAX_DEFAULT_CONTEXT_WINDOW,
|
|
319
|
+
maxTokens: MINIMAX_DEFAULT_MAX_TOKENS,
|
|
320
|
+
},
|
|
321
|
+
],
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
export function buildXiaomiProvider() {
|
|
325
|
+
return {
|
|
326
|
+
baseUrl: XIAOMI_BASE_URL,
|
|
327
|
+
api: "anthropic-messages",
|
|
328
|
+
models: [
|
|
329
|
+
{
|
|
330
|
+
id: XIAOMI_DEFAULT_MODEL_ID,
|
|
331
|
+
name: "Xiaomi MiMo V2 Flash",
|
|
332
|
+
reasoning: false,
|
|
333
|
+
input: ["text"],
|
|
334
|
+
cost: XIAOMI_DEFAULT_COST,
|
|
335
|
+
contextWindow: XIAOMI_DEFAULT_CONTEXT_WINDOW,
|
|
336
|
+
maxTokens: XIAOMI_DEFAULT_MAX_TOKENS,
|
|
337
|
+
},
|
|
338
|
+
],
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
function buildTogetherProvider() {
|
|
342
|
+
return {
|
|
343
|
+
baseUrl: TOGETHER_BASE_URL,
|
|
344
|
+
api: "openai-completions",
|
|
345
|
+
models: TOGETHER_MODEL_CATALOG.map(buildTogetherModelDefinition),
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
export function buildQianfanProvider() {
|
|
349
|
+
return {
|
|
350
|
+
baseUrl: QIANFAN_BASE_URL,
|
|
351
|
+
api: "openai-completions",
|
|
352
|
+
models: [
|
|
353
|
+
{
|
|
354
|
+
id: QIANFAN_DEFAULT_MODEL_ID,
|
|
355
|
+
name: "DEEPSEEK V3.2",
|
|
356
|
+
reasoning: true,
|
|
357
|
+
input: ["text"],
|
|
358
|
+
cost: QIANFAN_DEFAULT_COST,
|
|
359
|
+
contextWindow: QIANFAN_DEFAULT_CONTEXT_WINDOW,
|
|
360
|
+
maxTokens: QIANFAN_DEFAULT_MAX_TOKENS,
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
id: "ernie-5.0-thinking-preview",
|
|
364
|
+
name: "ERNIE-5.0-Thinking-Preview",
|
|
365
|
+
reasoning: true,
|
|
366
|
+
input: ["text", "image"],
|
|
367
|
+
cost: QIANFAN_DEFAULT_COST,
|
|
368
|
+
contextWindow: 119000,
|
|
369
|
+
maxTokens: 64000,
|
|
370
|
+
},
|
|
371
|
+
],
|
|
372
|
+
};
|
|
373
|
+
}
|
|
309
374
|
export async function resolveImplicitProviders(params) {
|
|
310
375
|
const providers = {};
|
|
311
376
|
const authStore = ensureAuthProfileStore(params.agentDir, {
|
|
@@ -316,16 +381,18 @@ export async function resolveImplicitProviders(params) {
|
|
|
316
381
|
if (minimaxKey) {
|
|
317
382
|
providers.minimax = { ...buildMinimaxProvider(), apiKey: minimaxKey };
|
|
318
383
|
}
|
|
384
|
+
const minimaxOauthProfile = listProfilesForProvider(authStore, "minimax-portal");
|
|
385
|
+
if (minimaxOauthProfile.length > 0) {
|
|
386
|
+
providers["minimax-portal"] = {
|
|
387
|
+
...buildMinimaxPortalProvider(),
|
|
388
|
+
apiKey: MINIMAX_OAUTH_PLACEHOLDER,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
319
391
|
const moonshotKey = resolveEnvApiKeyVarName("moonshot") ??
|
|
320
392
|
resolveApiKeyFromProfiles({ provider: "moonshot", store: authStore });
|
|
321
393
|
if (moonshotKey) {
|
|
322
394
|
providers.moonshot = { ...buildMoonshotProvider(), apiKey: moonshotKey };
|
|
323
395
|
}
|
|
324
|
-
const kimiCodeKey = resolveEnvApiKeyVarName("kimi-code") ??
|
|
325
|
-
resolveApiKeyFromProfiles({ provider: "kimi-code", store: authStore });
|
|
326
|
-
if (kimiCodeKey) {
|
|
327
|
-
providers["kimi-code"] = { ...buildKimiCodeProvider(), apiKey: kimiCodeKey };
|
|
328
|
-
}
|
|
329
396
|
const syntheticKey = resolveEnvApiKeyVarName("synthetic") ??
|
|
330
397
|
resolveApiKeyFromProfiles({ provider: "synthetic", store: authStore });
|
|
331
398
|
if (syntheticKey) {
|
|
@@ -343,12 +410,53 @@ export async function resolveImplicitProviders(params) {
|
|
|
343
410
|
apiKey: QWEN_PORTAL_OAUTH_PLACEHOLDER,
|
|
344
411
|
};
|
|
345
412
|
}
|
|
413
|
+
const xiaomiKey = resolveEnvApiKeyVarName("xiaomi") ??
|
|
414
|
+
resolveApiKeyFromProfiles({ provider: "xiaomi", store: authStore });
|
|
415
|
+
if (xiaomiKey) {
|
|
416
|
+
providers.xiaomi = { ...buildXiaomiProvider(), apiKey: xiaomiKey };
|
|
417
|
+
}
|
|
418
|
+
const cloudflareProfiles = listProfilesForProvider(authStore, "cloudflare-ai-gateway");
|
|
419
|
+
for (const profileId of cloudflareProfiles) {
|
|
420
|
+
const cred = authStore.profiles[profileId];
|
|
421
|
+
if (cred?.type !== "api_key")
|
|
422
|
+
continue;
|
|
423
|
+
const accountId = cred.metadata?.accountId?.trim();
|
|
424
|
+
const gatewayId = cred.metadata?.gatewayId?.trim();
|
|
425
|
+
if (!accountId || !gatewayId)
|
|
426
|
+
continue;
|
|
427
|
+
const baseUrl = resolveCloudflareAiGatewayBaseUrl({ accountId, gatewayId });
|
|
428
|
+
if (!baseUrl)
|
|
429
|
+
continue;
|
|
430
|
+
const apiKey = resolveEnvApiKeyVarName("cloudflare-ai-gateway") ?? cred.key?.trim() ?? "";
|
|
431
|
+
if (!apiKey)
|
|
432
|
+
continue;
|
|
433
|
+
providers["cloudflare-ai-gateway"] = {
|
|
434
|
+
baseUrl,
|
|
435
|
+
api: "anthropic-messages",
|
|
436
|
+
apiKey,
|
|
437
|
+
models: [buildCloudflareAiGatewayModelDefinition()],
|
|
438
|
+
};
|
|
439
|
+
break;
|
|
440
|
+
}
|
|
346
441
|
// Ollama provider - only add if explicitly configured
|
|
347
442
|
const ollamaKey = resolveEnvApiKeyVarName("ollama") ??
|
|
348
443
|
resolveApiKeyFromProfiles({ provider: "ollama", store: authStore });
|
|
349
444
|
if (ollamaKey) {
|
|
350
445
|
providers.ollama = { ...(await buildOllamaProvider()), apiKey: ollamaKey };
|
|
351
446
|
}
|
|
447
|
+
const togetherKey = resolveEnvApiKeyVarName("together") ??
|
|
448
|
+
resolveApiKeyFromProfiles({ provider: "together", store: authStore });
|
|
449
|
+
if (togetherKey) {
|
|
450
|
+
providers.together = {
|
|
451
|
+
...buildTogetherProvider(),
|
|
452
|
+
apiKey: togetherKey,
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
const qianfanKey = resolveEnvApiKeyVarName("qianfan") ??
|
|
456
|
+
resolveApiKeyFromProfiles({ provider: "qianfan", store: authStore });
|
|
457
|
+
if (qianfanKey) {
|
|
458
|
+
providers.qianfan = { ...buildQianfanProvider(), apiKey: qianfanKey };
|
|
459
|
+
}
|
|
352
460
|
return providers;
|
|
353
461
|
}
|
|
354
462
|
export async function resolveImplicitCopilotProvider(params) {
|
|
@@ -384,15 +492,15 @@ export async function resolveImplicitCopilotProvider(params) {
|
|
|
384
492
|
}
|
|
385
493
|
// pi-coding-agent's ModelRegistry marks a model "available" only if its
|
|
386
494
|
// `AuthStorage` has auth configured for that provider (via auth.json/env/etc).
|
|
387
|
-
// Our Copilot auth lives in
|
|
495
|
+
// Our Copilot auth lives in Poolbot's auth-profiles store instead, so we also
|
|
388
496
|
// write a runtime-only auth.json entry for pi-coding-agent to pick up.
|
|
389
497
|
//
|
|
390
|
-
// This is safe because it's (1) within
|
|
498
|
+
// This is safe because it's (1) within Poolbot's agent dir, (2) contains the
|
|
391
499
|
// GitHub token (not the exchanged Copilot token), and (3) matches existing
|
|
392
500
|
// patterns for OAuth-like providers in pi-coding-agent.
|
|
393
501
|
// Note: we deliberately do not write pi-coding-agent's `auth.json` here.
|
|
394
|
-
//
|
|
395
|
-
// `models list` uses
|
|
502
|
+
// Poolbot uses its own auth store and exchanges tokens at runtime.
|
|
503
|
+
// `models list` uses Poolbot's auth heuristics for availability.
|
|
396
504
|
// We intentionally do NOT define custom models for Copilot in models.json.
|
|
397
505
|
// pi-coding-agent treats providers with models as replacements requiring apiKey.
|
|
398
506
|
// We only override baseUrl; the model list comes from pi-ai built-ins.
|