@vellumai/assistant 0.8.1 → 0.8.2
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/ARCHITECTURE.md +2 -7
- package/Dockerfile +75 -1
- package/bun.lock +11 -1
- package/docker-entrypoint.sh +5 -0
- package/docker-init-apt-root.sh +94 -0
- package/docker-kata-apt-env.sh +39 -0
- package/docs/plugins.md +88 -47
- package/docs/skills.md +9 -7
- package/examples/plugins/echo/README.md +27 -27
- package/examples/plugins/echo/package.json +3 -0
- package/examples/plugins/echo/register.ts +31 -31
- package/node_modules/@vellumai/slack-text/src/index.test.ts +114 -14
- package/node_modules/@vellumai/slack-text/src/index.ts +82 -18
- package/openapi.yaml +325 -3
- package/package.json +3 -1
- package/scripts/generate-openapi.ts +83 -10
- package/scripts/sync-llm-catalog.ts +2 -2
- package/scripts/sync-web-search-catalog.ts +47 -25
- package/src/__tests__/agent-image-optimize.test.ts +11 -3
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +131 -0
- package/src/__tests__/anthropic-provider.test.ts +45 -0
- package/src/__tests__/app-builder-tool-scripts.test.ts +9 -3
- package/src/__tests__/app-executors.test.ts +220 -4
- package/src/__tests__/auto-analysis-end-to-end.test.ts +35 -0
- package/src/__tests__/bundled-asset.test.ts +6 -6
- package/src/__tests__/channel-availability-routes.test.ts +206 -0
- package/src/__tests__/channel-delivery-store.test.ts +289 -1
- package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -1
- package/src/__tests__/clawhub.test.ts +75 -16
- package/src/__tests__/compactor-tail-resolution.test.ts +41 -0
- package/src/__tests__/config-schema.test.ts +21 -0
- package/src/__tests__/config-set-route.test.ts +80 -0
- package/src/__tests__/config-sounds-sync.test.ts +97 -0
- package/src/__tests__/config-watcher-skill-reseed.test.ts +453 -0
- package/src/__tests__/context-search-conversations-source.test.ts +117 -2
- package/src/__tests__/context-search-memory-v2-source.test.ts +0 -1
- package/src/__tests__/context-search-workspace-source.test.ts +7 -0
- package/src/__tests__/context-token-estimator.test.ts +1 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +4 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +92 -92
- package/src/__tests__/conversation-agent-loop.test.ts +2 -0
- package/src/__tests__/conversation-error.test.ts +42 -3
- package/src/__tests__/conversation-fork-crud.test.ts +82 -0
- package/src/__tests__/conversation-inference-profile-route.test.ts +40 -4
- package/src/__tests__/conversation-lifecycle.test.ts +173 -0
- package/src/__tests__/conversation-message-sync-tags.test.ts +97 -0
- package/src/__tests__/conversation-pairing.test.ts +54 -0
- package/src/__tests__/conversation-process-callsite.test.ts +4 -1
- package/src/__tests__/conversation-provider-retry-repair.test.ts +5 -1
- package/src/__tests__/conversation-queue.test.ts +4 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +76 -9
- package/src/__tests__/conversation-slash-queue.test.ts +59 -1
- package/src/__tests__/conversation-slash-unknown.test.ts +4 -1
- package/src/__tests__/conversation-surfaces-table-action.test.ts +360 -0
- package/src/__tests__/conversation-sync-tags.test.ts +235 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -1
- package/src/__tests__/credential-security-invariants.test.ts +3 -2
- package/src/__tests__/db-slack-external-content-normalization.test.ts +301 -0
- package/src/__tests__/delete-managed-skill-tool.test.ts +55 -13
- package/src/__tests__/disk-pressure-tools.test.ts +1 -0
- package/src/__tests__/dm-backfill.test.ts +121 -10
- package/src/__tests__/document-tool-security.test.ts +258 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/edit-propagation.test.ts +33 -0
- package/src/__tests__/empty-response-pipeline.test.ts +0 -4
- package/src/__tests__/external-plugin-loader.test.ts +60 -36
- package/src/__tests__/filing-service.test.ts +140 -0
- package/src/__tests__/get-skill-detail-audit.test.ts +0 -4
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +43 -62
- package/src/__tests__/helpers/tar-fixtures.ts +39 -0
- package/src/__tests__/helpers/wait-for.ts +21 -0
- package/src/__tests__/history-repair-pipeline.test.ts +0 -3
- package/src/__tests__/history-repair.test.ts +73 -0
- package/src/__tests__/host-app-control-proxy.test.ts +266 -10
- package/src/__tests__/image-credentials.test.ts +1 -1
- package/src/__tests__/inbound-slack-persistence.test.ts +2 -0
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +1 -1
- package/src/__tests__/inference-profile-reaper.test.ts +4 -2
- package/src/__tests__/inference-profile-session-handler.test.ts +18 -6
- package/src/__tests__/inference-profile-session-ipc.test.ts +17 -5
- package/src/__tests__/injector-chain.test.ts +10 -8
- package/src/__tests__/install-skill-routing.test.ts +155 -37
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +92 -3
- package/src/__tests__/list-messages-page-latest.test.ts +55 -0
- package/src/__tests__/llm-call-pipeline.test.ts +0 -3
- package/src/__tests__/llm-catalog-parity.test.ts +55 -13
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +34 -0
- package/src/__tests__/llm-request-log-source-factory.test.ts +29 -53
- package/src/__tests__/llm-usage-store.test.ts +114 -0
- package/src/__tests__/managed-profile-guard.test.ts +31 -29
- package/src/__tests__/managed-skill-lifecycle.test.ts +109 -18
- package/src/__tests__/managed-store.test.ts +84 -192
- package/src/__tests__/media-generate-image.test.ts +1 -1
- package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -2
- package/src/__tests__/messages-after-tiebreaker.test.ts +122 -0
- package/src/__tests__/oauth-commands-routes.test.ts +168 -16
- package/src/__tests__/oauth-provider-profiles.test.ts +9 -0
- package/src/__tests__/openai-provider.test.ts +24 -0
- package/src/__tests__/openai-responses-cutover-guard.test.ts +17 -9
- package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -2
- package/src/__tests__/persistence-pipeline.test.ts +0 -2
- package/src/__tests__/{managed-proxy-context.test.ts → platform-proxy-context.test.ts} +1 -1
- package/src/__tests__/platform.test.ts +2 -0
- package/src/__tests__/plugin-api-shim.test.ts +125 -0
- package/src/__tests__/plugin-bootstrap.test.ts +10 -36
- package/src/__tests__/plugin-external-api.test.ts +68 -0
- package/src/__tests__/plugin-registry.test.ts +0 -77
- package/src/__tests__/plugin-route-contribution.test.ts +0 -1
- package/src/__tests__/plugin-skill-contribution.test.ts +0 -2
- package/src/__tests__/plugin-tool-contribution.test.ts +16 -15
- package/src/__tests__/plugin-types.test.ts +3 -13
- package/src/__tests__/process-message-background-slack.test.ts +8 -1
- package/src/__tests__/process-message-display-content.test.ts +421 -0
- package/src/__tests__/provider-catalog-visibility.test.ts +142 -0
- package/src/__tests__/provider-error-scenarios.test.ts +111 -0
- package/src/__tests__/{provider-managed-proxy-integration.test.ts → provider-platform-proxy-integration.test.ts} +8 -8
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +65 -13
- package/src/__tests__/schedule-routes.test.ts +50 -3
- package/src/__tests__/schedule-store.test.ts +94 -0
- package/src/__tests__/scheduler-reuse-conversation.test.ts +54 -7
- package/src/__tests__/schema-transforms.test.ts +20 -0
- package/src/__tests__/search-skills-unified.test.ts +0 -5
- package/src/__tests__/server-history-render.test.ts +43 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +0 -12
- package/src/__tests__/skill-load-tool.test.ts +27 -89
- package/src/__tests__/skill-memory.test.ts +23 -3
- package/src/__tests__/skills-file-content-endpoint.test.ts +9 -38
- package/src/__tests__/skills-files-catalog-fallback.test.ts +0 -3
- package/src/__tests__/skills-install-extract.test.ts +49 -38
- package/src/__tests__/skills-install-staging.test.ts +159 -0
- package/src/__tests__/skills-uninstall.test.ts +9 -41
- package/src/__tests__/skills.test.ts +51 -58
- package/src/__tests__/slack-channel-config.test.ts +9 -0
- package/src/__tests__/subagent-tool-filtering.test.ts +50 -0
- package/src/__tests__/system-prompt.test.ts +737 -63
- package/src/__tests__/terminal-tools.test.ts +28 -1
- package/src/__tests__/thread-backfill.test.ts +557 -27
- package/src/__tests__/title-generate-pipeline.test.ts +0 -13
- package/src/__tests__/token-estimate-pipeline.test.ts +0 -3
- package/src/__tests__/tool-error-pipeline.test.ts +0 -3
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
- package/src/__tests__/tool-executor.test.ts +16 -4
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -12
- package/src/__tests__/turn-events-store.test.ts +256 -0
- package/src/__tests__/twilio-routes.test.ts +4 -0
- package/src/__tests__/user-plugin-loader.test.ts +0 -7
- package/src/__tests__/voice-session-bridge.test.ts +198 -0
- package/src/__tests__/web-search-catalog-parity.test.ts +32 -10
- package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +115 -3
- package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +50 -0
- package/src/__tests__/workspace-migration-073-repair-recall-callsite-empty-profile.test.ts +153 -0
- package/src/__tests__/workspace-migration-085-memory-v2-bm25-b-reembed-disabled-v2-pages.test.ts +220 -0
- package/src/__tests__/workspace-migration-086-revert-stale-gemini-mis-rewrites.test.ts +269 -0
- package/src/__tests__/workspace-migration-remove-legacy-skills-index.test.ts +309 -0
- package/src/__tests__/workspace-migrations-runner.test.ts +111 -3
- package/src/acp/resolve-agent.ts +1 -1
- package/src/agent/image-optimize.ts +13 -5
- package/src/calls/voice-session-bridge.ts +61 -42
- package/src/channels/types.ts +108 -0
- package/src/cli/__tests__/unknown-command.test.ts +24 -0
- package/src/cli/commands/__tests__/changelog.test.ts +304 -319
- package/src/cli/commands/__tests__/schedules.test.ts +491 -0
- package/src/cli/commands/changelog.ts +106 -42
- package/src/cli/commands/conversations.ts +102 -17
- package/src/cli/commands/default-action.ts +10 -53
- package/src/cli/commands/notifications.ts +329 -317
- package/src/cli/commands/plugins.ts +185 -0
- package/src/cli/commands/schedules.ts +391 -0
- package/src/cli/commands/telemetry.ts +40 -0
- package/src/cli/lib/__tests__/cli-colors.test.ts +48 -0
- package/src/cli/lib/__tests__/confirm-prompt.test.ts +159 -0
- package/src/cli/lib/__tests__/install-from-github.test.ts +355 -0
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +154 -0
- package/src/cli/lib/__tests__/uninstall-plugin.test.ts +124 -0
- package/src/cli/lib/__tests__/unknown-command.test.ts +106 -0
- package/src/cli/lib/cli-colors.ts +12 -0
- package/src/cli/lib/confirm-prompt.ts +79 -0
- package/src/cli/lib/install-from-github.ts +304 -0
- package/src/cli/lib/list-installed-plugins.ts +137 -0
- package/src/cli/lib/uninstall-plugin.ts +82 -0
- package/src/cli/lib/unknown-command.ts +111 -0
- package/src/cli/program.ts +38 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +23 -21
- package/src/config/bundled-skills/app-builder/TOOLS.json +7 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +15 -52
- package/src/config/bundled-skills/document/SKILL.md +23 -3
- package/src/config/bundled-skills/document/TOOLS.json +53 -0
- package/src/config/bundled-skills/document/tools/document-delete.ts +12 -0
- package/src/config/bundled-skills/document/tools/document-list.ts +12 -0
- package/src/config/bundled-skills/document/tools/document-read.ts +12 -0
- package/src/config/bundled-skills/skill-management/SKILL.md +2 -2
- package/src/config/bundled-skills/skill-management/TOOLS.json +7 -7
- package/src/config/bundled-tool-registry.ts +6 -0
- package/src/config/feature-flag-registry.json +41 -1
- package/src/config/loader.ts +64 -38
- package/src/config/schema.ts +7 -10
- package/src/config/schemas/__tests__/llm-request-logs.test.ts +36 -0
- package/src/config/schemas/channels.ts +8 -0
- package/src/config/schemas/compaction.ts +28 -0
- package/src/config/schemas/heartbeat.ts +9 -0
- package/src/config/schemas/llm-request-logs.ts +31 -7
- package/src/config/schemas/llm.ts +3 -0
- package/src/config/schemas/memory-retrieval.ts +18 -0
- package/src/config/schemas/tools.ts +14 -0
- package/src/config/skills.ts +3 -96
- package/src/context/compactor.ts +1047 -0
- package/src/context/token-estimator.ts +2 -2
- package/src/context/window-manager.ts +197 -1520
- package/src/credential-execution/managed-catalog.ts +37 -0
- package/src/credential-health/credential-health-service.ts +280 -19
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +34 -0
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +138 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +74 -0
- package/src/daemon/approval-generators.ts +8 -6
- package/src/daemon/config-watcher.ts +94 -31
- package/src/daemon/conversation-agent-loop.ts +169 -9
- package/src/daemon/conversation-error.ts +171 -37
- package/src/daemon/conversation-lifecycle.ts +53 -40
- package/src/daemon/conversation-messaging.ts +25 -6
- package/src/daemon/conversation-process.ts +49 -12
- package/src/daemon/conversation-runtime-assembly.ts +16 -1
- package/src/daemon/conversation-slash.ts +12 -5
- package/src/daemon/conversation-store.ts +11 -4
- package/src/daemon/conversation-tool-setup.ts +39 -7
- package/src/daemon/conversation.ts +33 -1
- package/src/daemon/external-plugins-bootstrap.ts +217 -181
- package/src/daemon/first-greeting.ts +22 -2
- package/src/daemon/handlers/config-model.ts +6 -5
- package/src/daemon/handlers/config-slack-channel.ts +15 -3
- package/src/daemon/handlers/shared.ts +14 -5
- package/src/daemon/handlers/skills.ts +111 -108
- package/src/daemon/history-repair.ts +28 -1
- package/src/daemon/host-app-control-proxy.ts +98 -23
- package/src/daemon/lifecycle.ts +45 -35
- package/src/daemon/meet-host-supervisor.ts +5 -4
- package/src/daemon/memory-v2-startup.ts +49 -0
- package/src/daemon/message-protocol.ts +1 -0
- package/src/daemon/message-types/conversations.ts +25 -0
- package/src/daemon/message-types/messages.ts +61 -0
- package/src/daemon/message-types/subagents.ts +1 -0
- package/src/daemon/message-types/sync.ts +1 -0
- package/src/daemon/pkb-reminder-builder.test.ts +1 -1
- package/src/daemon/pkb-reminder-builder.ts +1 -1
- package/src/daemon/plugin-source-watcher.ts +146 -0
- package/src/daemon/process-message.ts +21 -3
- package/src/daemon/server.ts +11 -2
- package/src/daemon/skill-memory-refresh.ts +29 -0
- package/src/documents/document-store.ts +221 -3
- package/src/embedded/plugin-api.ts +40 -0
- package/src/filing/filing-service.ts +39 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +91 -6
- package/src/heartbeat/heartbeat-run-store.ts +2 -1
- package/src/heartbeat/heartbeat-service.ts +41 -0
- package/src/home/__tests__/feed-types.test.ts +40 -0
- package/src/home/feed-types.ts +22 -0
- package/src/home/post-connect-feed.ts +1 -0
- package/src/index.ts +18 -1
- package/src/live-voice/__tests__/live-voice-stt.test.ts +57 -0
- package/src/mcp/client.ts +20 -4
- package/src/media/image-credentials.ts +3 -3
- package/src/memory/__tests__/bookmark-crud.test.ts +33 -27
- package/src/memory/__tests__/conversation-queries.test.ts +263 -0
- package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +113 -0
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +119 -14
- package/src/memory/__tests__/message-content.test.ts +35 -0
- package/src/memory/bookmark-crud.ts +42 -10
- package/src/memory/context-search/sources/conversations.ts +62 -2
- package/src/memory/context-search/sources/workspace.ts +4 -0
- package/src/memory/conversation-crud.ts +63 -19
- package/src/memory/conversation-queries.ts +110 -10
- package/src/memory/db-init.ts +6 -0
- package/src/memory/delivery-crud.ts +152 -5
- package/src/memory/embedding-backend.ts +4 -4
- package/src/memory/external-conversation-store.ts +66 -5
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +66 -9
- package/src/memory/graph/conversation-graph-memory.ts +31 -15
- package/src/memory/graph/tools.ts +3 -3
- package/src/memory/indexer.ts +34 -29
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +73 -0
- package/src/memory/jobs/embed-concept-page.ts +20 -11
- package/src/memory/jobs-worker.ts +6 -1
- package/src/memory/llm-request-log-source-clickhouse.ts +17 -10
- package/src/memory/llm-request-log-source.ts +19 -52
- package/src/memory/llm-usage-store.ts +125 -5
- package/src/memory/memory-retrospective-startup-cleanup.ts +72 -5
- package/src/memory/message-content.ts +1 -1
- package/src/memory/migrations/109-external-conversation-bindings.ts +15 -4
- package/src/memory/migrations/229-delete-private-conversations.test.ts +38 -1
- package/src/memory/migrations/229-delete-private-conversations.ts +7 -0
- package/src/memory/migrations/247-external-conversation-binding-thread-id.ts +78 -0
- package/src/memory/migrations/248-create-onboarding-events.ts +21 -0
- package/src/memory/migrations/249-normalize-slack-external-content.ts +240 -0
- package/src/memory/migrations/index.ts +6 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/onboarding-events-store.ts +106 -0
- package/src/memory/schema/bookmarks.ts +0 -2
- package/src/memory/schema/calls.ts +1 -0
- package/src/memory/schema/inference.ts +1 -3
- package/src/memory/schema/infrastructure.ts +12 -0
- package/src/memory/turn-events-store.ts +127 -2
- package/src/memory/v2/__tests__/activation.test.ts +0 -8
- package/src/memory/v2/__tests__/injection.test.ts +98 -8
- package/src/memory/v2/__tests__/migration.test.ts +87 -0
- package/src/memory/v2/__tests__/page-index.test.ts +83 -0
- package/src/memory/v2/__tests__/prompts-router.test.ts +58 -6
- package/src/memory/v2/__tests__/qdrant.test.ts +66 -3
- package/src/memory/v2/__tests__/router.test.ts +15 -0
- package/src/memory/v2/__tests__/skill-store.test.ts +387 -8
- package/src/memory/v2/injection.ts +32 -6
- package/src/memory/v2/migration.ts +49 -19
- package/src/memory/v2/page-index.ts +35 -5
- package/src/memory/v2/prompts/router.ts +11 -8
- package/src/memory/v2/prompts/sweep.ts +2 -2
- package/src/memory/v2/qdrant.ts +135 -7
- package/src/memory/v2/router.ts +9 -8
- package/src/memory/v2/skill-store.ts +120 -35
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +45 -5
- package/src/messaging/providers/slack/__tests__/download.test.ts +231 -0
- package/src/messaging/providers/slack/adapter.ts +43 -5
- package/src/messaging/providers/slack/client.ts +27 -0
- package/src/messaging/providers/slack/deep-link.ts +65 -0
- package/src/messaging/providers/slack/download.ts +104 -0
- package/src/messaging/providers/slack/message-metadata.test.ts +32 -0
- package/src/messaging/providers/slack/message-metadata.ts +27 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +134 -0
- package/src/messaging/providers/slack/render-transcript.ts +69 -5
- package/src/messaging/providers/slack/types.ts +20 -1
- package/src/notifications/conversation-pairing.ts +2 -1
- package/src/notifications/decision-engine.ts +2 -1
- package/src/notifications/emit-signal.ts +20 -1
- package/src/notifications/home-feed-side-effect.ts +54 -0
- package/src/notifications/signal.ts +3 -1
- package/src/oauth/connection-resolver.ts +8 -4
- package/src/oauth/platform-connection.ts +6 -2
- package/src/oauth/seed-providers.ts +10 -1
- package/src/permissions/checker.ts +2 -0
- package/src/permissions/ipc-risk-types.ts +1 -0
- package/src/permissions/question-prompter.test.ts +416 -0
- package/src/permissions/question-prompter.ts +294 -0
- package/src/platform/client.test.ts +1 -1
- package/src/platform/client.ts +1 -1
- package/src/plugin-api/constants.ts +26 -0
- package/src/plugin-api/index.ts +34 -1
- package/src/plugin-api/types.ts +104 -22
- package/src/plugins/defaults/circuit-breaker.ts +0 -5
- package/src/plugins/defaults/compaction.ts +0 -4
- package/src/plugins/defaults/empty-response.ts +0 -2
- package/src/plugins/defaults/history-repair.ts +0 -2
- package/src/plugins/defaults/injectors.ts +36 -3
- package/src/plugins/defaults/llm-call.ts +0 -2
- package/src/plugins/defaults/memory-retrieval.ts +0 -1
- package/src/plugins/defaults/overflow-reduce.ts +0 -1
- package/src/plugins/defaults/persistence.ts +0 -2
- package/src/plugins/defaults/title-generate.ts +0 -5
- package/src/plugins/defaults/token-estimate.ts +0 -2
- package/src/plugins/defaults/tool-error.ts +0 -7
- package/src/plugins/defaults/tool-execute.ts +0 -2
- package/src/plugins/defaults/tool-result-truncate.ts +0 -4
- package/src/plugins/ensure-plugin-api-shim.ts +96 -0
- package/src/plugins/external-api.ts +104 -0
- package/src/plugins/external-plugin-loader.ts +105 -32
- package/src/plugins/feature-gate.ts +22 -0
- package/src/plugins/pipeline.ts +37 -0
- package/src/plugins/registry.ts +48 -80
- package/src/plugins/types.ts +31 -26
- package/src/plugins/user-loader.ts +21 -2
- package/src/proactive-artifact/aux-message-injector.ts +11 -0
- package/src/proactive-artifact/job.test.ts +37 -5
- package/src/prompts/__tests__/system-prompt.test.ts +12 -0
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +99 -0
- package/src/prompts/normalize-onboarding.ts +27 -0
- package/src/prompts/sections.ts +302 -0
- package/src/prompts/system-prompt.ts +63 -166
- package/src/prompts/templates/BOOTSTRAP.md +17 -1
- package/src/prompts/templates/system-sections.ts +173 -0
- package/src/providers/__tests__/inference.test.ts +22 -7
- package/src/providers/anthropic/client.ts +28 -28
- package/src/providers/connection-resolution.ts +7 -0
- package/src/providers/inference/adapter-factory.ts +41 -4
- package/src/providers/inference/connections.ts +74 -29
- package/src/providers/inference/resolve-auth.ts +12 -4
- package/src/providers/model-catalog.ts +294 -12
- package/src/providers/openai/chat-completions-provider.ts +10 -2
- package/src/providers/openrouter/client.ts +7 -0
- package/src/providers/{managed-proxy → platform-proxy}/constants.ts +4 -1
- package/src/providers/{managed-proxy → platform-proxy}/context.ts +3 -3
- package/src/providers/provider-availability.ts +17 -2
- package/src/providers/provider-catalog-visibility.ts +36 -0
- package/src/providers/registry.ts +22 -14
- package/src/providers/retry.ts +47 -1
- package/src/runtime/__tests__/agent-wake.test.ts +152 -0
- package/src/runtime/agent-wake.ts +42 -14
- package/src/runtime/auth/route-policy.ts +8 -1
- package/src/runtime/btw-sidechain.ts +2 -0
- package/src/runtime/http-types.ts +19 -0
- package/src/runtime/migrations/origin-mode.ts +1 -1
- package/src/runtime/pending-interactions.ts +1 -0
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +17 -0
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +5 -1
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +107 -20
- package/src/runtime/routes/__tests__/question-routes.test.ts +395 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +64 -1
- package/src/runtime/routes/acp-routes-list.test.ts +143 -0
- package/src/runtime/routes/acp-routes.ts +5 -3
- package/src/runtime/routes/auth-routes.ts +1 -1
- package/src/runtime/routes/bookmark-routes.ts +5 -3
- package/src/runtime/routes/btw-routes.ts +5 -1
- package/src/runtime/routes/channel-availability-routes.ts +121 -0
- package/src/runtime/routes/conversation-cli-routes.ts +44 -3
- package/src/runtime/routes/conversation-list-routes.ts +3 -20
- package/src/runtime/routes/conversation-management-routes.ts +17 -42
- package/src/runtime/routes/conversation-query-routes.ts +40 -35
- package/src/runtime/routes/conversation-routes.ts +90 -11
- package/src/runtime/routes/documents-routes.ts +25 -86
- package/src/runtime/routes/group-routes.ts +5 -0
- package/src/runtime/routes/inbound-conversation.ts +28 -8
- package/src/runtime/routes/inbound-message-handler.ts +236 -41
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +111 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +32 -1
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +17 -4
- package/src/runtime/routes/index.ts +6 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +17 -44
- package/src/runtime/routes/inference-profile-session-reaper.ts +7 -21
- package/src/runtime/routes/inference-provider-connection-routes.ts +65 -21
- package/src/runtime/routes/integrations/slack/share.ts +4 -52
- package/src/runtime/routes/integrations/slack/token.ts +43 -0
- package/src/runtime/routes/integrations/twilio.ts +6 -13
- package/src/runtime/routes/notification-routes.ts +1 -1
- package/src/runtime/routes/oauth-commands-routes.ts +105 -15
- package/src/runtime/routes/oauth-lifecycle-routes.ts +43 -0
- package/src/runtime/routes/question-routes.ts +259 -0
- package/src/runtime/routes/rename-conversation-routes.ts +2 -33
- package/src/runtime/routes/schedule-routes.ts +4 -7
- package/src/runtime/routes/subagents-routes.ts +57 -18
- package/src/runtime/routes/telemetry-routes.ts +27 -0
- package/src/runtime/routes/tts-routes.ts +27 -2
- package/src/runtime/routes/workspace-routes.test.ts +43 -0
- package/src/runtime/routes/workspace-routes.ts +28 -0
- package/src/runtime/services/conversation-serializer.ts +39 -7
- package/src/runtime/sync/resource-sync-events.ts +93 -1
- package/src/schedule/schedule-store.ts +27 -2
- package/src/schedule/scheduler.ts +9 -1
- package/src/security/__tests__/untrusted-content.test.ts +86 -0
- package/src/security/untrusted-content.ts +93 -8
- package/src/skills/catalog-files.ts +1 -1
- package/src/skills/catalog-install.ts +233 -116
- package/src/skills/clawhub.ts +70 -13
- package/src/skills/managed-store.ts +4 -119
- package/src/skills/skillssh-registry.ts +27 -48
- package/src/subagent/manager.ts +15 -7
- package/src/telemetry/types.ts +113 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +312 -5
- package/src/telemetry/usage-telemetry-reporter.ts +113 -7
- package/src/tools/apps/executors.ts +58 -7
- package/src/tools/ask-question/ask-question-tool.test.ts +509 -0
- package/src/tools/ask-question/ask-question-tool.ts +304 -0
- package/src/tools/browser/browser-execution.ts +15 -11
- package/src/tools/computer-use/definitions.ts +3 -3
- package/src/tools/credentials/vault.ts +1 -1
- package/src/tools/document/document-tool.ts +124 -1
- package/src/tools/filesystem/edit.ts +1 -1
- package/src/tools/filesystem/list.ts +1 -1
- package/src/tools/filesystem/read.ts +1 -1
- package/src/tools/filesystem/write.ts +5 -2
- package/src/tools/host-filesystem/transfer.ts +1 -1
- package/src/tools/host-terminal/host-shell.ts +1 -1
- package/src/tools/permission-checker.ts +1 -1
- package/src/tools/registry.ts +17 -7
- package/src/tools/schedule/create.ts +2 -2
- package/src/tools/schema-transforms.ts +7 -2
- package/src/tools/side-effects.ts +1 -0
- package/src/tools/skills/delete-managed.ts +4 -4
- package/src/tools/skills/execute.ts +1 -1
- package/src/tools/skills/scaffold-managed.ts +3 -2
- package/src/tools/subagent/notify-parent.ts +1 -1
- package/src/tools/system/request-permission.ts +2 -2
- package/src/tools/terminal/safe-env.ts +60 -1
- package/src/tools/tool-manifest.ts +2 -0
- package/src/tools/types.ts +72 -21
- package/src/tools/ui-surface/definitions.ts +6 -5
- package/src/tts/__tests__/provider-adapters.test.ts +76 -2
- package/src/tts/providers/elevenlabs-provider.ts +75 -1
- package/src/types/onboarding-context.ts +2 -0
- package/src/util/errors.ts +17 -0
- package/src/util/platform.ts +10 -0
- package/src/watcher/__tests__/engine.test.ts +22 -0
- package/src/watcher/engine.ts +6 -2
- package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +80 -15
- package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +35 -22
- package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +3 -1
- package/src/workspace/migrations/083-system-prompt-prefix-to-file.ts +191 -0
- package/src/workspace/migrations/084-remove-legacy-skills-index.ts +276 -0
- package/src/workspace/migrations/085-memory-v2-bm25-b-reembed-disabled-v2-pages.ts +137 -0
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +198 -0
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/workspace/migrations/runner.ts +39 -9
- package/src/workspace/migrations/types.ts +4 -0
- package/examples/plugins/echo/bun.lock +0 -25
- package/src/__tests__/context-window-manager.test.ts +0 -2481
- package/src/context/__tests__/compact-prompt.test.ts +0 -63
- package/src/context/prompts/compact.md +0 -26
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +0 -37
- /package/src/__tests__/{secret-routes-managed-proxy.test.ts → secret-routes-platform-proxy.test.ts} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PLATFORM_PROVIDER_META } from "./platform-proxy/constants.js";
|
|
2
2
|
|
|
3
3
|
export type LongContextMode =
|
|
4
4
|
| "native-model"
|
|
@@ -45,6 +45,8 @@ export interface CatalogModel {
|
|
|
45
45
|
supportsVision?: boolean;
|
|
46
46
|
supportsToolUse?: boolean;
|
|
47
47
|
pricing?: CatalogModelPricing;
|
|
48
|
+
/** When set, this model is only visible when the named feature flag is enabled. */
|
|
49
|
+
featureFlag?: string;
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
const DEFAULT_CONTEXT_WINDOW_TOKENS = 200000;
|
|
@@ -91,12 +93,14 @@ export interface ProviderCatalogEntry {
|
|
|
91
93
|
/**
|
|
92
94
|
* Whether this provider supports the `platform` auth type (Vellum-managed
|
|
93
95
|
* keys routed through the platform proxy). Derived from
|
|
94
|
-
* `
|
|
96
|
+
* `PLATFORM_PROVIDER_META` at catalog build time so the two stay in lock
|
|
95
97
|
* step. Clients use this field to hide the "Platform (managed by Vellum)"
|
|
96
98
|
* option from the auth-type dropdown for providers like Fireworks or
|
|
97
99
|
* OpenRouter where managed keys are not available.
|
|
98
100
|
*/
|
|
99
|
-
|
|
101
|
+
supportsPlatformAuth?: boolean;
|
|
102
|
+
/** When set, this provider is only visible when the named feature flag is enabled. */
|
|
103
|
+
featureFlag?: string;
|
|
100
104
|
}
|
|
101
105
|
|
|
102
106
|
/**
|
|
@@ -236,8 +240,7 @@ const RAW_PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
236
240
|
cacheReadPer1mTokens: 0.5,
|
|
237
241
|
tiers: [
|
|
238
242
|
{
|
|
239
|
-
inputTokenThreshold:
|
|
240
|
-
OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS,
|
|
243
|
+
inputTokenThreshold: OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS,
|
|
241
244
|
inputPer1mTokens: 10,
|
|
242
245
|
outputPer1mTokens: 45,
|
|
243
246
|
cacheReadPer1mTokens: 1,
|
|
@@ -261,8 +264,7 @@ const RAW_PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
261
264
|
outputPer1mTokens: 180.0,
|
|
262
265
|
tiers: [
|
|
263
266
|
{
|
|
264
|
-
inputTokenThreshold:
|
|
265
|
-
OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS,
|
|
267
|
+
inputTokenThreshold: OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS,
|
|
266
268
|
inputPer1mTokens: 60,
|
|
267
269
|
outputPer1mTokens: 270,
|
|
268
270
|
},
|
|
@@ -286,8 +288,7 @@ const RAW_PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
286
288
|
cacheReadPer1mTokens: 0.25,
|
|
287
289
|
tiers: [
|
|
288
290
|
{
|
|
289
|
-
inputTokenThreshold:
|
|
290
|
-
OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS,
|
|
291
|
+
inputTokenThreshold: OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS,
|
|
291
292
|
inputPer1mTokens: 5,
|
|
292
293
|
outputPer1mTokens: 22.5,
|
|
293
294
|
cacheReadPer1mTokens: 0.5,
|
|
@@ -696,6 +697,39 @@ const RAW_PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
696
697
|
supportsToolUse: true,
|
|
697
698
|
pricing: { inputPer1mTokens: 0.27, outputPer1mTokens: 1.1 },
|
|
698
699
|
},
|
|
700
|
+
{
|
|
701
|
+
id: "deepseek/deepseek-v4-pro",
|
|
702
|
+
displayName: "DeepSeek V4 Pro",
|
|
703
|
+
contextWindowTokens: 1048576,
|
|
704
|
+
maxOutputTokens: 384000,
|
|
705
|
+
supportsThinking: true,
|
|
706
|
+
supportsCaching: false,
|
|
707
|
+
supportsVision: false,
|
|
708
|
+
supportsToolUse: true,
|
|
709
|
+
pricing: { inputPer1mTokens: 0.435, outputPer1mTokens: 0.87 },
|
|
710
|
+
},
|
|
711
|
+
{
|
|
712
|
+
id: "deepseek/deepseek-v4-flash",
|
|
713
|
+
displayName: "DeepSeek V4 Flash",
|
|
714
|
+
contextWindowTokens: 1048576,
|
|
715
|
+
maxOutputTokens: 384000,
|
|
716
|
+
supportsThinking: true,
|
|
717
|
+
supportsCaching: false,
|
|
718
|
+
supportsVision: false,
|
|
719
|
+
supportsToolUse: true,
|
|
720
|
+
pricing: { inputPer1mTokens: 0.14, outputPer1mTokens: 0.28 },
|
|
721
|
+
},
|
|
722
|
+
{
|
|
723
|
+
id: "deepseek/deepseek-v3.2-speciale",
|
|
724
|
+
displayName: "DeepSeek V3.2 Speciale",
|
|
725
|
+
contextWindowTokens: 163840,
|
|
726
|
+
maxOutputTokens: 163840,
|
|
727
|
+
supportsThinking: true,
|
|
728
|
+
supportsCaching: false,
|
|
729
|
+
supportsVision: false,
|
|
730
|
+
supportsToolUse: false,
|
|
731
|
+
pricing: { inputPer1mTokens: 0.287, outputPer1mTokens: 0.431 },
|
|
732
|
+
},
|
|
699
733
|
// Qwen
|
|
700
734
|
{
|
|
701
735
|
id: "qwen/qwen3.5-plus-02-15",
|
|
@@ -838,17 +872,265 @@ const RAW_PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
838
872
|
apiKeyUrl: "https://openrouter.ai/keys",
|
|
839
873
|
apiKeyPlaceholder: "sk-or-v1-...",
|
|
840
874
|
},
|
|
875
|
+
{
|
|
876
|
+
id: "zai",
|
|
877
|
+
displayName: "z.ai",
|
|
878
|
+
featureFlag: "provider-zai",
|
|
879
|
+
subtitle: "GLM models from z.ai (Zhipu AI). Requires a z.ai API key.",
|
|
880
|
+
setupMode: "api-key",
|
|
881
|
+
setupHint: "Enter your z.ai API key to enable GLM models.",
|
|
882
|
+
envVar: "ZAI_API_KEY",
|
|
883
|
+
credentialsGuide: {
|
|
884
|
+
description:
|
|
885
|
+
"Sign in to the z.ai open platform, navigate to API Keys, and create a new key.",
|
|
886
|
+
url: "https://open.z.ai/open/api/paas/v4/apiKey",
|
|
887
|
+
linkLabel: "Open z.ai Platform",
|
|
888
|
+
},
|
|
889
|
+
models: [
|
|
890
|
+
{
|
|
891
|
+
id: "glm-5.1",
|
|
892
|
+
displayName: "GLM-5.1",
|
|
893
|
+
contextWindowTokens: 200000,
|
|
894
|
+
maxOutputTokens: 128000,
|
|
895
|
+
supportsThinking: false,
|
|
896
|
+
supportsCaching: false,
|
|
897
|
+
supportsVision: true,
|
|
898
|
+
supportsToolUse: true,
|
|
899
|
+
},
|
|
900
|
+
{
|
|
901
|
+
id: "glm-5",
|
|
902
|
+
displayName: "GLM-5",
|
|
903
|
+
contextWindowTokens: 200000,
|
|
904
|
+
maxOutputTokens: 128000,
|
|
905
|
+
supportsThinking: false,
|
|
906
|
+
supportsCaching: false,
|
|
907
|
+
supportsVision: true,
|
|
908
|
+
supportsToolUse: true,
|
|
909
|
+
},
|
|
910
|
+
{
|
|
911
|
+
id: "glm-5-turbo",
|
|
912
|
+
displayName: "GLM-5 Turbo",
|
|
913
|
+
contextWindowTokens: 200000,
|
|
914
|
+
maxOutputTokens: 128000,
|
|
915
|
+
supportsThinking: false,
|
|
916
|
+
supportsCaching: false,
|
|
917
|
+
supportsVision: true,
|
|
918
|
+
supportsToolUse: true,
|
|
919
|
+
},
|
|
920
|
+
{
|
|
921
|
+
id: "glm-4.7",
|
|
922
|
+
displayName: "GLM-4.7",
|
|
923
|
+
contextWindowTokens: 200000,
|
|
924
|
+
maxOutputTokens: 128000,
|
|
925
|
+
supportsThinking: false,
|
|
926
|
+
supportsCaching: false,
|
|
927
|
+
supportsVision: true,
|
|
928
|
+
supportsToolUse: true,
|
|
929
|
+
},
|
|
930
|
+
{
|
|
931
|
+
id: "glm-4.7-flash",
|
|
932
|
+
displayName: "GLM-4.7 Flash",
|
|
933
|
+
contextWindowTokens: 200000,
|
|
934
|
+
maxOutputTokens: 128000,
|
|
935
|
+
supportsThinking: false,
|
|
936
|
+
supportsCaching: false,
|
|
937
|
+
supportsVision: true,
|
|
938
|
+
supportsToolUse: true,
|
|
939
|
+
},
|
|
940
|
+
],
|
|
941
|
+
defaultModel: "glm-5.1",
|
|
942
|
+
apiKeyPlaceholder: "your-api-key",
|
|
943
|
+
},
|
|
944
|
+
{
|
|
945
|
+
id: "deepseek",
|
|
946
|
+
displayName: "DeepSeek",
|
|
947
|
+
subtitle:
|
|
948
|
+
"DeepSeek reasoning and chat models. Requires a DeepSeek API key.",
|
|
949
|
+
setupMode: "api-key",
|
|
950
|
+
setupHint: "Enter your DeepSeek API key to enable DeepSeek models.",
|
|
951
|
+
envVar: "DEEPSEEK_API_KEY",
|
|
952
|
+
featureFlag: "provider-deepseek",
|
|
953
|
+
credentialsGuide: {
|
|
954
|
+
description:
|
|
955
|
+
"Sign in to the DeepSeek platform, navigate to API Keys, and create a new key.",
|
|
956
|
+
url: "https://platform.deepseek.com/api_keys",
|
|
957
|
+
linkLabel: "Open DeepSeek Platform",
|
|
958
|
+
},
|
|
959
|
+
models: [
|
|
960
|
+
{
|
|
961
|
+
id: "deepseek-v4-pro",
|
|
962
|
+
displayName: "DeepSeek V4 Pro",
|
|
963
|
+
contextWindowTokens: 1000000,
|
|
964
|
+
maxOutputTokens: 384000,
|
|
965
|
+
supportsThinking: true,
|
|
966
|
+
supportsCaching: false,
|
|
967
|
+
supportsVision: false,
|
|
968
|
+
supportsToolUse: true,
|
|
969
|
+
pricing: {
|
|
970
|
+
inputPer1mTokens: 1.74,
|
|
971
|
+
outputPer1mTokens: 3.48,
|
|
972
|
+
},
|
|
973
|
+
},
|
|
974
|
+
{
|
|
975
|
+
id: "deepseek-v4-flash",
|
|
976
|
+
displayName: "DeepSeek V4 Flash",
|
|
977
|
+
contextWindowTokens: 1000000,
|
|
978
|
+
maxOutputTokens: 384000,
|
|
979
|
+
supportsThinking: true,
|
|
980
|
+
supportsCaching: false,
|
|
981
|
+
supportsVision: false,
|
|
982
|
+
supportsToolUse: true,
|
|
983
|
+
pricing: {
|
|
984
|
+
inputPer1mTokens: 0.14,
|
|
985
|
+
outputPer1mTokens: 0.28,
|
|
986
|
+
},
|
|
987
|
+
},
|
|
988
|
+
],
|
|
989
|
+
defaultModel: "deepseek-v4-pro",
|
|
990
|
+
apiKeyPlaceholder: "sk-...",
|
|
991
|
+
},
|
|
992
|
+
{
|
|
993
|
+
id: "minimax",
|
|
994
|
+
displayName: "MiniMax",
|
|
995
|
+
subtitle: "MiniMax models. Requires a MiniMax API key.",
|
|
996
|
+
featureFlag: "provider-minimax",
|
|
997
|
+
setupMode: "api-key",
|
|
998
|
+
setupHint: "Enter your MiniMax API key to enable MiniMax models.",
|
|
999
|
+
envVar: "MINIMAX_API_KEY",
|
|
1000
|
+
credentialsGuide: {
|
|
1001
|
+
description:
|
|
1002
|
+
"Sign in to the MiniMax platform, navigate to API Keys, and create a new key.",
|
|
1003
|
+
url: "https://platform.minimax.io/user-center/basic-information/interface-key",
|
|
1004
|
+
linkLabel: "Open MiniMax Platform",
|
|
1005
|
+
},
|
|
1006
|
+
models: [
|
|
1007
|
+
{
|
|
1008
|
+
id: "MiniMax-M2.7",
|
|
1009
|
+
displayName: "MiniMax M2.7",
|
|
1010
|
+
contextWindowTokens: 204800,
|
|
1011
|
+
maxOutputTokens: 131072,
|
|
1012
|
+
supportsThinking: true,
|
|
1013
|
+
supportsCaching: true,
|
|
1014
|
+
supportsVision: false,
|
|
1015
|
+
supportsToolUse: true,
|
|
1016
|
+
pricing: {
|
|
1017
|
+
inputPer1mTokens: 0.3,
|
|
1018
|
+
outputPer1mTokens: 1.2,
|
|
1019
|
+
cacheReadPer1mTokens: 0.06,
|
|
1020
|
+
cacheWritePer1mTokens: 0.375,
|
|
1021
|
+
},
|
|
1022
|
+
},
|
|
1023
|
+
{
|
|
1024
|
+
id: "MiniMax-M2.7-highspeed",
|
|
1025
|
+
displayName: "MiniMax M2.7 Highspeed",
|
|
1026
|
+
contextWindowTokens: 204800,
|
|
1027
|
+
maxOutputTokens: 131072,
|
|
1028
|
+
supportsThinking: true,
|
|
1029
|
+
supportsCaching: true,
|
|
1030
|
+
supportsVision: false,
|
|
1031
|
+
supportsToolUse: true,
|
|
1032
|
+
pricing: {
|
|
1033
|
+
inputPer1mTokens: 0.6,
|
|
1034
|
+
outputPer1mTokens: 2.4,
|
|
1035
|
+
cacheReadPer1mTokens: 0.06,
|
|
1036
|
+
cacheWritePer1mTokens: 0.375,
|
|
1037
|
+
},
|
|
1038
|
+
},
|
|
1039
|
+
{
|
|
1040
|
+
id: "MiniMax-M2.5",
|
|
1041
|
+
displayName: "MiniMax M2.5",
|
|
1042
|
+
contextWindowTokens: 204800,
|
|
1043
|
+
maxOutputTokens: 196608,
|
|
1044
|
+
supportsThinking: true,
|
|
1045
|
+
supportsCaching: true,
|
|
1046
|
+
supportsVision: false,
|
|
1047
|
+
supportsToolUse: true,
|
|
1048
|
+
pricing: {
|
|
1049
|
+
inputPer1mTokens: 0.3,
|
|
1050
|
+
outputPer1mTokens: 1.2,
|
|
1051
|
+
cacheReadPer1mTokens: 0.03,
|
|
1052
|
+
cacheWritePer1mTokens: 0.375,
|
|
1053
|
+
},
|
|
1054
|
+
},
|
|
1055
|
+
{
|
|
1056
|
+
id: "MiniMax-M2.5-highspeed",
|
|
1057
|
+
displayName: "MiniMax M2.5 Highspeed",
|
|
1058
|
+
contextWindowTokens: 204800,
|
|
1059
|
+
maxOutputTokens: 196608,
|
|
1060
|
+
supportsThinking: true,
|
|
1061
|
+
supportsCaching: true,
|
|
1062
|
+
supportsVision: false,
|
|
1063
|
+
supportsToolUse: true,
|
|
1064
|
+
pricing: {
|
|
1065
|
+
inputPer1mTokens: 0.6,
|
|
1066
|
+
outputPer1mTokens: 2.4,
|
|
1067
|
+
cacheReadPer1mTokens: 0.03,
|
|
1068
|
+
cacheWritePer1mTokens: 0.375,
|
|
1069
|
+
},
|
|
1070
|
+
},
|
|
1071
|
+
{
|
|
1072
|
+
id: "MiniMax-M2.1",
|
|
1073
|
+
displayName: "MiniMax M2.1",
|
|
1074
|
+
contextWindowTokens: 204800,
|
|
1075
|
+
maxOutputTokens: 131072,
|
|
1076
|
+
supportsThinking: true,
|
|
1077
|
+
supportsCaching: true,
|
|
1078
|
+
supportsVision: false,
|
|
1079
|
+
supportsToolUse: true,
|
|
1080
|
+
pricing: {
|
|
1081
|
+
inputPer1mTokens: 0.3,
|
|
1082
|
+
outputPer1mTokens: 1.2,
|
|
1083
|
+
cacheReadPer1mTokens: 0.03,
|
|
1084
|
+
cacheWritePer1mTokens: 0.375,
|
|
1085
|
+
},
|
|
1086
|
+
},
|
|
1087
|
+
{
|
|
1088
|
+
id: "MiniMax-M2.1-highspeed",
|
|
1089
|
+
displayName: "MiniMax M2.1 Highspeed",
|
|
1090
|
+
contextWindowTokens: 204800,
|
|
1091
|
+
maxOutputTokens: 131072,
|
|
1092
|
+
supportsThinking: true,
|
|
1093
|
+
supportsCaching: true,
|
|
1094
|
+
supportsVision: false,
|
|
1095
|
+
supportsToolUse: true,
|
|
1096
|
+
pricing: {
|
|
1097
|
+
inputPer1mTokens: 0.6,
|
|
1098
|
+
outputPer1mTokens: 2.4,
|
|
1099
|
+
cacheReadPer1mTokens: 0.03,
|
|
1100
|
+
cacheWritePer1mTokens: 0.375,
|
|
1101
|
+
},
|
|
1102
|
+
},
|
|
1103
|
+
{
|
|
1104
|
+
id: "MiniMax-M2",
|
|
1105
|
+
displayName: "MiniMax M2",
|
|
1106
|
+
contextWindowTokens: 204800,
|
|
1107
|
+
maxOutputTokens: 131072,
|
|
1108
|
+
supportsThinking: true,
|
|
1109
|
+
supportsCaching: true,
|
|
1110
|
+
supportsVision: false,
|
|
1111
|
+
supportsToolUse: true,
|
|
1112
|
+
pricing: {
|
|
1113
|
+
inputPer1mTokens: 0.3,
|
|
1114
|
+
outputPer1mTokens: 1.2,
|
|
1115
|
+
cacheReadPer1mTokens: 0.03,
|
|
1116
|
+
cacheWritePer1mTokens: 0.375,
|
|
1117
|
+
},
|
|
1118
|
+
},
|
|
1119
|
+
],
|
|
1120
|
+
defaultModel: "MiniMax-M2.7",
|
|
1121
|
+
apiKeyPlaceholder: "eyJ...",
|
|
1122
|
+
},
|
|
841
1123
|
];
|
|
842
1124
|
|
|
843
1125
|
export const PROVIDER_CATALOG: ProviderCatalogEntry[] =
|
|
844
1126
|
RAW_PROVIDER_CATALOG.map((entry) => ({
|
|
845
1127
|
...entry,
|
|
846
1128
|
models: entry.models.map(catalogModel),
|
|
847
|
-
// Derive
|
|
1129
|
+
// Derive supportsPlatformAuth from PLATFORM_PROVIDER_META so the catalog
|
|
848
1130
|
// and the proxy routing table can never drift. Adding a provider to
|
|
849
|
-
//
|
|
1131
|
+
// PLATFORM_PROVIDER_META with `managed: true` automatically opts it into
|
|
850
1132
|
// the Platform auth-type dropdown in the clients.
|
|
851
|
-
|
|
1133
|
+
supportsPlatformAuth: PLATFORM_PROVIDER_META[entry.id]?.managed === true,
|
|
852
1134
|
}));
|
|
853
1135
|
|
|
854
1136
|
/** Check if a model ID is in the catalog for a given provider. */
|
|
@@ -60,6 +60,8 @@ export interface OpenAIChatCompletionsProviderOptions {
|
|
|
60
60
|
providerName?: string;
|
|
61
61
|
providerLabel?: string;
|
|
62
62
|
streamTimeoutMs?: number;
|
|
63
|
+
/** Provider-level request headers merged into every API request. */
|
|
64
|
+
requestHeaders?: Record<string, string>;
|
|
63
65
|
/** Extra params spread into every chat.completions.create call (e.g. reasoning). */
|
|
64
66
|
extraCreateParams?: Record<string, unknown>;
|
|
65
67
|
/** Upper bound for `reasoning_effort` sent on the wire. Defaults to "xhigh"
|
|
@@ -110,6 +112,7 @@ export class OpenAIChatCompletionsProvider implements Provider {
|
|
|
110
112
|
private streamTimeoutMs: number;
|
|
111
113
|
private extraCreateParams: Record<string, unknown>;
|
|
112
114
|
private maxReasoningEffort: "high" | "xhigh";
|
|
115
|
+
private requestHeaders: Record<string, string>;
|
|
113
116
|
|
|
114
117
|
constructor(
|
|
115
118
|
apiKey: string,
|
|
@@ -126,6 +129,7 @@ export class OpenAIChatCompletionsProvider implements Provider {
|
|
|
126
129
|
this.streamTimeoutMs = options.streamTimeoutMs ?? 1_800_000;
|
|
127
130
|
this.extraCreateParams = options.extraCreateParams ?? {};
|
|
128
131
|
this.maxReasoningEffort = options.maxReasoningEffort ?? "xhigh";
|
|
132
|
+
this.requestHeaders = options.requestHeaders ?? {};
|
|
129
133
|
}
|
|
130
134
|
|
|
131
135
|
async sendMessage(
|
|
@@ -197,10 +201,14 @@ export class OpenAIChatCompletionsProvider implements Provider {
|
|
|
197
201
|
let cachedPromptTokens = 0;
|
|
198
202
|
|
|
199
203
|
try {
|
|
204
|
+
const requestHeaders = {
|
|
205
|
+
...this.requestHeaders,
|
|
206
|
+
...(usageAttributionHeaders ?? {}),
|
|
207
|
+
};
|
|
200
208
|
const stream = await this.client.chat.completions.create(params, {
|
|
201
209
|
signal: timeoutSignal,
|
|
202
|
-
...(
|
|
203
|
-
? { headers:
|
|
210
|
+
...(Object.keys(requestHeaders).length > 0
|
|
211
|
+
? { headers: requestHeaders }
|
|
204
212
|
: {}),
|
|
205
213
|
});
|
|
206
214
|
|
|
@@ -18,6 +18,11 @@ export interface OpenRouterProviderOptions {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
const DEFAULT_OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1";
|
|
21
|
+
const OPENROUTER_APP_ATTRIBUTION_HEADERS = {
|
|
22
|
+
"HTTP-Referer": "https://www.vellum.ai",
|
|
23
|
+
"X-OpenRouter-Title": "Vellum Assistant",
|
|
24
|
+
"X-OpenRouter-Categories": "personal-agent,cli-agent",
|
|
25
|
+
};
|
|
21
26
|
|
|
22
27
|
// Models on OpenRouter prefixed `anthropic/` are routed through OpenRouter's
|
|
23
28
|
// Anthropic-compatible Messages API at `<root>/v1/messages` (where `<root>` is
|
|
@@ -93,6 +98,7 @@ export class OpenRouterProvider extends OpenAIChatCompletionsProvider {
|
|
|
93
98
|
providerName: "openrouter",
|
|
94
99
|
providerLabel: "OpenRouter",
|
|
95
100
|
streamTimeoutMs: options.streamTimeoutMs,
|
|
101
|
+
requestHeaders: OPENROUTER_APP_ATTRIBUTION_HEADERS,
|
|
96
102
|
});
|
|
97
103
|
this.openRouterApiKey = apiKey;
|
|
98
104
|
this.defaultModel = model;
|
|
@@ -192,6 +198,7 @@ export class OpenRouterProvider extends OpenAIChatCompletionsProvider {
|
|
|
192
198
|
streamTimeoutMs: this.providerStreamTimeoutMs,
|
|
193
199
|
authToken: this.openRouterApiKey,
|
|
194
200
|
useNativeWebSearch: this.useNativeWebSearch,
|
|
201
|
+
requestHeaders: OPENROUTER_APP_ATTRIBUTION_HEADERS,
|
|
195
202
|
},
|
|
196
203
|
);
|
|
197
204
|
}
|
|
@@ -25,7 +25,7 @@ export interface ManagedProviderMeta {
|
|
|
25
25
|
* managed credentials are present; that policy lives in the registry/context
|
|
26
26
|
* fallback allowlists.
|
|
27
27
|
*/
|
|
28
|
-
export const
|
|
28
|
+
export const PLATFORM_PROVIDER_META: Record<string, ManagedProviderMeta> = {
|
|
29
29
|
openai: {
|
|
30
30
|
name: "openai",
|
|
31
31
|
managed: true,
|
|
@@ -50,4 +50,7 @@ export const MANAGED_PROVIDER_META: Record<string, ManagedProviderMeta> = {
|
|
|
50
50
|
managed: false,
|
|
51
51
|
},
|
|
52
52
|
ollama: { name: "ollama", managed: false },
|
|
53
|
+
zai: { name: "zai", managed: false },
|
|
54
|
+
deepseek: { name: "deepseek", managed: false },
|
|
55
|
+
minimax: { name: "minimax", managed: false },
|
|
53
56
|
};
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
import { getPlatformBaseUrl } from "../../config/env.js";
|
|
13
13
|
import { credentialKey } from "../../security/credential-key.js";
|
|
14
14
|
import { getSecureKeyAsync } from "../../security/secure-keys.js";
|
|
15
|
-
import {
|
|
15
|
+
import { PLATFORM_PROVIDER_META } from "./constants.js";
|
|
16
16
|
|
|
17
17
|
/** Storage key for the assistant API key credential. */
|
|
18
18
|
const ASSISTANT_API_KEY_STORAGE_KEY = credentialKey(
|
|
@@ -70,7 +70,7 @@ export async function hasManagedProxyPrereqs(): Promise<boolean> {
|
|
|
70
70
|
export async function buildManagedBaseUrl(
|
|
71
71
|
provider: string,
|
|
72
72
|
): Promise<string | undefined> {
|
|
73
|
-
const meta =
|
|
73
|
+
const meta = PLATFORM_PROVIDER_META[provider];
|
|
74
74
|
if (!meta?.managed || !meta.proxyPath) return undefined;
|
|
75
75
|
|
|
76
76
|
const ctx = await resolveManagedProxyContext();
|
|
@@ -88,7 +88,7 @@ export async function buildManagedBaseUrl(
|
|
|
88
88
|
export async function managedFallbackEnabledFor(
|
|
89
89
|
provider: string,
|
|
90
90
|
): Promise<boolean> {
|
|
91
|
-
const meta =
|
|
91
|
+
const meta = PLATFORM_PROVIDER_META[provider];
|
|
92
92
|
if (!meta?.managed) return false;
|
|
93
93
|
return await hasManagedProxyPrereqs();
|
|
94
94
|
}
|
|
@@ -5,9 +5,11 @@
|
|
|
5
5
|
* environment variable fallbacks, and managed proxy availability.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { API_KEY_PROVIDERS } from "../config/loader.js";
|
|
8
|
+
import { API_KEY_PROVIDERS, getConfig } from "../config/loader.js";
|
|
9
9
|
import { getProviderKeyAsync } from "../security/secure-keys.js";
|
|
10
|
-
import {
|
|
10
|
+
import { PROVIDER_CATALOG } from "./model-catalog.js";
|
|
11
|
+
import { managedFallbackEnabledFor } from "./platform-proxy/context.js";
|
|
12
|
+
import { getVisibleProviderCatalog } from "./provider-catalog-visibility.js";
|
|
11
13
|
|
|
12
14
|
/**
|
|
13
15
|
* Check whether a single provider is usable — via a user-provided key
|
|
@@ -25,11 +27,24 @@ export async function isProviderAvailable(provider: string): Promise<boolean> {
|
|
|
25
27
|
/**
|
|
26
28
|
* Build the list of providers that are usable — via a user-provided key
|
|
27
29
|
* (secure storage or env var) or via the managed proxy fallback.
|
|
30
|
+
* Feature-flagged LLM providers that are currently disabled are excluded.
|
|
28
31
|
* Ollama is always included because it does not require an API key.
|
|
29
32
|
*/
|
|
30
33
|
export async function getConfiguredProviders(): Promise<string[]> {
|
|
34
|
+
// Build the set of LLM providers hidden by feature flags so we can
|
|
35
|
+
// exclude them while leaving non-LLM providers (search, STT, TTS)
|
|
36
|
+
// in API_KEY_PROVIDERS unchanged.
|
|
37
|
+
const allLlmIds = new Set(PROVIDER_CATALOG.map((p) => p.id));
|
|
38
|
+
const visibleLlmIds = new Set(
|
|
39
|
+
getVisibleProviderCatalog(getConfig()).map((p) => p.id),
|
|
40
|
+
);
|
|
41
|
+
const hiddenLlmIds = new Set(
|
|
42
|
+
[...allLlmIds].filter((id) => !visibleLlmIds.has(id)),
|
|
43
|
+
);
|
|
44
|
+
|
|
31
45
|
const configured: string[] = [];
|
|
32
46
|
for (const p of API_KEY_PROVIDERS) {
|
|
47
|
+
if (hiddenLlmIds.has(p)) continue;
|
|
33
48
|
if (await isProviderAvailable(p)) {
|
|
34
49
|
configured.push(p);
|
|
35
50
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature-flag-aware provider catalog filtering.
|
|
3
|
+
*
|
|
4
|
+
* User-facing catalog consumers (model info, slash commands, provider
|
|
5
|
+
* availability) use `getVisibleProviderCatalog()` to hide providers and
|
|
6
|
+
* models gated behind disabled feature flags. Internal consumers
|
|
7
|
+
* (adapter-factory, pricing, auth) continue using the unfiltered
|
|
8
|
+
* `PROVIDER_CATALOG` directly.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
|
|
12
|
+
import type { AssistantConfig } from "../config/schema.js";
|
|
13
|
+
import {
|
|
14
|
+
PROVIDER_CATALOG,
|
|
15
|
+
type ProviderCatalogEntry,
|
|
16
|
+
} from "./model-catalog.js";
|
|
17
|
+
|
|
18
|
+
export function getVisibleProviderCatalog(
|
|
19
|
+
config: AssistantConfig,
|
|
20
|
+
): ProviderCatalogEntry[] {
|
|
21
|
+
return PROVIDER_CATALOG.filter(
|
|
22
|
+
(entry) =>
|
|
23
|
+
!entry.featureFlag ||
|
|
24
|
+
isAssistantFeatureFlagEnabled(entry.featureFlag, config),
|
|
25
|
+
)
|
|
26
|
+
.map((entry) => {
|
|
27
|
+
const visibleModels = entry.models.filter(
|
|
28
|
+
(m) =>
|
|
29
|
+
!m.featureFlag ||
|
|
30
|
+
isAssistantFeatureFlagEnabled(m.featureFlag, config),
|
|
31
|
+
);
|
|
32
|
+
if (visibleModels.length === entry.models.length) return entry;
|
|
33
|
+
return { ...entry, models: visibleModels };
|
|
34
|
+
})
|
|
35
|
+
.filter((entry) => entry.models.length > 0);
|
|
36
|
+
}
|
|
@@ -12,12 +12,12 @@ import {
|
|
|
12
12
|
// ---------------------------------------------------------------------------
|
|
13
13
|
import type { ProviderConnection } from "./inference/auth.js";
|
|
14
14
|
import { resolveAuth } from "./inference/resolve-auth.js";
|
|
15
|
+
import { isModelInCatalog, PROVIDER_CATALOG } from "./model-catalog.js";
|
|
16
|
+
import { getProviderDefaultModel } from "./model-intents.js";
|
|
15
17
|
import {
|
|
16
18
|
buildManagedBaseUrl,
|
|
17
19
|
resolveManagedProxyContext,
|
|
18
|
-
} from "./
|
|
19
|
-
import { isModelInCatalog, PROVIDER_CATALOG } from "./model-catalog.js";
|
|
20
|
-
import { getProviderDefaultModel } from "./model-intents.js";
|
|
20
|
+
} from "./platform-proxy/context.js";
|
|
21
21
|
import { RetryProvider } from "./retry.js";
|
|
22
22
|
import type { Provider } from "./types.js";
|
|
23
23
|
import { UsageTrackingProvider } from "./usage-tracking.js";
|
|
@@ -92,9 +92,7 @@ function resolveModel(config: ProvidersConfig, providerName: string): string {
|
|
|
92
92
|
* The routing decision is now derived from credential availability rather than
|
|
93
93
|
* the removed `services.inference.mode` config field.
|
|
94
94
|
*/
|
|
95
|
-
async function resolveProviderCredentials(
|
|
96
|
-
providerName: string,
|
|
97
|
-
): Promise<{
|
|
95
|
+
async function resolveProviderCredentials(providerName: string): Promise<{
|
|
98
96
|
apiKey: string;
|
|
99
97
|
baseURL?: string;
|
|
100
98
|
source: "user-key" | "managed-proxy";
|
|
@@ -106,7 +104,11 @@ async function resolveProviderCredentials(
|
|
|
106
104
|
const managedBaseUrl = await buildManagedBaseUrl(providerName);
|
|
107
105
|
if (managedBaseUrl) {
|
|
108
106
|
const ctx = await resolveManagedProxyContext();
|
|
109
|
-
return {
|
|
107
|
+
return {
|
|
108
|
+
apiKey: ctx.assistantApiKey,
|
|
109
|
+
baseURL: managedBaseUrl,
|
|
110
|
+
source: "managed-proxy",
|
|
111
|
+
};
|
|
110
112
|
}
|
|
111
113
|
return null;
|
|
112
114
|
}
|
|
@@ -122,8 +124,10 @@ export async function initializeProviders(
|
|
|
122
124
|
(config.timeouts?.providerStreamTimeoutSec ?? 1800) * 1000;
|
|
123
125
|
const useNativeWebSearch =
|
|
124
126
|
config.services["web-search"].provider === "inference-provider-native";
|
|
125
|
-
const mainAgentProvider = resolveCallSiteConfig(
|
|
126
|
-
|
|
127
|
+
const mainAgentProvider = resolveCallSiteConfig(
|
|
128
|
+
"mainAgent",
|
|
129
|
+
config.llm,
|
|
130
|
+
).provider;
|
|
127
131
|
|
|
128
132
|
for (const entry of PROVIDER_CATALOG) {
|
|
129
133
|
const isKeyless = entry.setupMode === "keyless";
|
|
@@ -230,11 +234,15 @@ export async function resolveProviderFromConnection(
|
|
|
230
234
|
config.services["web-search"].provider === "inference-provider-native";
|
|
231
235
|
const model = resolveModel(config, connection.provider);
|
|
232
236
|
|
|
233
|
-
const provider = createAdapterFromConnection(
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
237
|
+
const provider = createAdapterFromConnection(
|
|
238
|
+
connection,
|
|
239
|
+
authResult.resolved,
|
|
240
|
+
{
|
|
241
|
+
model,
|
|
242
|
+
streamTimeoutMs,
|
|
243
|
+
useNativeWebSearch,
|
|
244
|
+
},
|
|
245
|
+
);
|
|
238
246
|
|
|
239
247
|
if (provider) {
|
|
240
248
|
connectionProviders.set(connection.name, provider);
|