@vellumai/assistant 0.10.9 → 0.10.10-dev.202607162206.d08e98e
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 +1 -1
- package/Dockerfile +8 -0
- package/docs/activation-funnel-telemetry.md +13 -7
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
- package/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
- package/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
- package/openapi.yaml +530 -107
- package/package.json +1 -1
- package/scripts/generate-openapi.ts +8 -0
- package/src/__tests__/activation-early-marking.test.ts +6 -5
- package/src/__tests__/agent-loop-override-profile.test.ts +22 -25
- package/src/__tests__/agent-wake-override-profile.test.ts +21 -48
- package/src/__tests__/app-builder-tool-scripts.test.ts +0 -1
- package/src/__tests__/app-bundler.test.ts +4 -12
- package/src/__tests__/app-executors.test.ts +2 -49
- package/src/__tests__/app-routes-csp.test.ts +114 -146
- package/src/__tests__/auth-fallback-events-store.test.ts +8 -1
- package/src/__tests__/build-persisted-content.test.ts +96 -0
- package/src/__tests__/bundle-scanner.test.ts +27 -1
- package/src/__tests__/call-controller.test.ts +291 -0
- package/src/__tests__/call-site-routing-connection-auto-resolve.test.ts +165 -0
- package/src/__tests__/chat-credential-redaction.test.ts +1395 -0
- package/src/__tests__/chat-reveal-guard-priming.test.ts +791 -0
- package/src/__tests__/compaction.benchmark.test.ts +2 -1
- package/src/__tests__/compactor-image-manifest-trust.test.ts +50 -0
- package/src/__tests__/config-loader-backfill.test.ts +9 -4
- package/src/__tests__/config-schema-cmd.test.ts +10 -11
- package/src/__tests__/config-schema.test.ts +190 -257
- package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +208 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +5 -19
- package/src/__tests__/conversation-agent-loop.test.ts +22 -9
- package/src/__tests__/conversation-error.test.ts +31 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +110 -0
- package/src/__tests__/conversation-process-callsite.test.ts +12 -19
- package/src/__tests__/conversation-routes-slash-commands.test.ts +7 -21
- package/src/__tests__/conversation-summarize-route.test.ts +36 -44
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +7 -7
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +0 -1
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -1
- package/src/__tests__/conversation-usage.test.ts +4 -12
- package/src/__tests__/credential-routes.test.ts +250 -0
- package/src/__tests__/credential-security-invariants.test.ts +3 -0
- package/src/__tests__/db-migration-rollback.test.ts +22 -0
- package/src/__tests__/empty-response-hook.test.ts +186 -1
- package/src/__tests__/external-plugin-loader.test.ts +11 -5
- package/src/__tests__/heartbeat-service.test.ts +0 -28
- package/src/__tests__/host-shell-tool.test.ts +2 -0
- package/src/__tests__/inactive-tool-error-messages.test.ts +2 -2
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +52 -8
- package/src/__tests__/internal-telemetry-routes.test.ts +23 -4
- package/src/__tests__/invite-routes-http.test.ts +12 -16
- package/src/__tests__/list-all-apps.test.ts +0 -4
- package/src/__tests__/llm-context-resolution.test.ts +32 -56
- package/src/__tests__/llm-request-log-turn-query.test.ts +109 -0
- package/src/__tests__/llm-resolver-override-or-default.test.ts +3 -52
- package/src/__tests__/llm-resolver.test.ts +342 -602
- package/src/__tests__/llm-schema.test.ts +79 -37
- package/src/__tests__/max-tokens-continue-hook.test.ts +19 -0
- package/src/__tests__/media-stream-output.test.ts +259 -3
- package/src/__tests__/media-stream-server-integration.test.ts +22 -1
- package/src/__tests__/media-stream-stt-session.test.ts +47 -0
- package/src/__tests__/memory-jobs-worker-cleanup-cadence.test.ts +33 -0
- package/src/__tests__/memory-recall-log-store.test.ts +47 -13
- package/src/__tests__/mock-gateway-ipc.ts +46 -1
- package/src/__tests__/mtime-cache.test.ts +61 -0
- package/src/__tests__/navigate-settings-tab.test.ts +2 -0
- package/src/__tests__/normalize-onboarding.test.ts +33 -0
- package/src/__tests__/onboarding-persona-write.test.ts +26 -0
- package/src/__tests__/plugin-api-resolve-credential.test.ts +140 -0
- package/src/__tests__/plugin-app-serve-routes.test.ts +166 -14
- package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +2 -0
- package/src/__tests__/post-turn-tool-result-truncation.test.ts +38 -0
- package/src/__tests__/provider-commit-message-generator.test.ts +27 -20
- package/src/__tests__/provider-connections-backfill.test.ts +138 -0
- package/src/__tests__/provider-platform-proxy-integration.test.ts +10 -31
- package/src/__tests__/provider-registry-ollama.test.ts +8 -18
- package/src/__tests__/provider-send-message-override-profile.test.ts +23 -23
- package/src/__tests__/provider-usage-tracking.test.ts +9 -19
- package/src/__tests__/prune-old-conversations-job.test.ts +12 -0
- package/src/__tests__/published-app-updater.test.ts +22 -16
- package/src/__tests__/registry.test.ts +5 -16
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +22 -23
- package/src/__tests__/retry-thinking-adaptive-only.test.ts +43 -48
- package/src/__tests__/retry-thinking-tool-choice.test.ts +57 -66
- package/src/__tests__/retry-verbosity-normalization.test.ts +24 -23
- package/src/__tests__/reveal-success-registry.test.ts +123 -0
- package/src/__tests__/run-conversation-turn-persistence.test.ts +130 -0
- package/src/__tests__/secret-fixtures.ts +9 -0
- package/src/__tests__/server-history-render.test.ts +28 -0
- package/src/__tests__/skills.test.ts +9 -4
- package/src/__tests__/slack-share-routes.test.ts +0 -1
- package/src/__tests__/stt-stream-session.test.ts +6 -5
- package/src/__tests__/subagent-call-site-routing.test.ts +69 -95
- package/src/__tests__/subagent-disposal.test.ts +2 -0
- package/src/__tests__/subagent-fork-notifications.test.ts +2 -0
- package/src/__tests__/subagent-fork-spawn.test.ts +2 -0
- package/src/__tests__/subagent-manager-notify.test.ts +2 -0
- package/src/__tests__/subagent-role-registry.test.ts +37 -0
- package/src/__tests__/subagent-spawn-and-await.test.ts +1 -0
- package/src/__tests__/subagent-terminal-message.test.ts +50 -0
- package/src/__tests__/subagent-tool-gate-mode.test.ts +78 -5
- package/src/__tests__/surface-completion-nudge-hook.test.ts +19 -0
- package/src/__tests__/telemetry-routes.test.ts +99 -19
- package/src/__tests__/tool-audit.test.ts +34 -4
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
- package/src/__tests__/tool-profiler.test.ts +72 -1
- package/src/__tests__/tool-result-spool.test.ts +49 -4
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +0 -1
- package/src/__tests__/ui-channel-variants.test.ts +108 -0
- package/src/__tests__/ui-shape-teaching.test.ts +255 -0
- package/src/__tests__/usage-attribution.test.ts +18 -41
- package/src/__tests__/user-plugin-loader.test.ts +4 -4
- package/src/__tests__/voice-config-update.test.ts +46 -0
- package/src/__tests__/voice-session-bridge.test.ts +216 -84
- package/src/__tests__/workspace-migration-131-drop-web-fetch-mode.test.ts +120 -0
- package/src/agent/loop.ts +4 -3
- package/src/api/events/open-conversation.test.ts +64 -0
- package/src/api/events/open-conversation.ts +33 -0
- package/src/api/index.ts +6 -0
- package/src/api/responses/conversation-message.ts +5 -0
- package/src/apps/app-store.ts +25 -35
- package/src/bundler/app-bundler.ts +34 -48
- package/src/bundler/app-compiler.ts +39 -4
- package/src/bundler/bundle-scanner.ts +13 -0
- package/src/bundler/manifest.ts +1 -1
- package/src/calls/__tests__/voice-session-bridge.test.ts +47 -0
- package/src/calls/call-constants.ts +5 -0
- package/src/calls/call-controller.ts +100 -32
- package/src/calls/call-transport.ts +9 -0
- package/src/calls/media-stream-output.ts +107 -4
- package/src/calls/media-stream-server.ts +29 -9
- package/src/calls/media-stream-stt-session.ts +7 -1
- package/src/calls/media-turn-detector.ts +11 -1
- package/src/calls/voice-session-bridge.ts +84 -63
- package/src/cli/commands/__tests__/inference-providers.test.ts +270 -33
- package/src/cli/commands/__tests__/notifications.test.ts +24 -3
- package/src/cli/commands/config.help.ts +6 -6
- package/src/cli/commands/credentials.help.ts +13 -0
- package/src/cli/commands/credentials.ts +6 -1
- package/src/cli/commands/email.help.ts +7 -0
- package/src/cli/commands/email.ts +35 -1
- package/src/cli/commands/inference-providers.ts +168 -107
- package/src/cli/commands/inference.help.ts +118 -46
- package/src/cli/commands/memory/index.help.ts +23 -0
- package/src/cli/commands/memory/nodes.ts +146 -0
- package/src/cli/commands/notifications.help.ts +10 -10
- package/src/cli/commands/oauth/connect-surface-guidance.test.ts +40 -0
- package/src/cli/commands/oauth/connect-surface-guidance.ts +54 -0
- package/src/cli/commands/oauth/connect.test.ts +126 -0
- package/src/cli/commands/oauth/connect.ts +29 -6
- package/src/cli/commands/oauth/index.help.ts +7 -1
- package/src/cli/commands/oauth/status.test.ts +69 -3
- package/src/cli/commands/oauth/status.ts +50 -12
- package/src/cli/commands/plugins.help.ts +13 -2
- package/src/cli/commands/plugins.ts +61 -7
- package/src/cli/commands/telemetry.help.ts +13 -0
- package/src/cli/commands/telemetry.ts +45 -5
- package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +8 -2
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +213 -9
- package/src/cli/lib/bundled-marketplace.json +93 -36
- package/src/cli/lib/inspect-plugin.ts +5 -1
- package/src/cli/lib/install-from-github.ts +68 -4
- package/src/cli/lib/plugin-catalog-local.ts +6 -2
- package/src/cli/lib/plugin-fingerprint.ts +3 -3
- package/src/cli/lib/upgrade-plugin.ts +236 -35
- package/src/config/__tests__/default-profile-catalog.test.ts +8 -12
- package/src/config/__tests__/plugin-resident-skill-discovery.test.ts +137 -0
- package/src/config/__tests__/profile-materialization.test.ts +1 -88
- package/src/config/bundled-skills/AGENTS.md +3 -30
- package/src/config/bundled-skills/app-builder/SKILL.md +5 -3
- package/src/config/bundled-skills/app-builder/TOOLS.json +23 -0
- package/src/config/bundled-skills/app-builder/tools/app-open.ts +32 -0
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +1 -1
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +7 -7
- package/src/config/bundled-skills/schedule/SKILL.md +1 -1
- package/src/config/bundled-skills/schedule/TOOLS.json +1 -1
- package/src/config/bundled-skills/settings/TOOLS.json +3 -1
- package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +2 -0
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +18 -10
- package/src/config/bundled-skills/subagent/SKILL.md +2 -0
- package/src/config/bundled-skills/subagent/TOOLS.json +1 -1
- package/src/config/call-site-defaults.ts +3 -3
- package/src/config/feature-flag-registry.json +24 -39
- package/src/config/llm-resolver.ts +88 -475
- package/src/config/profile-materialization.ts +11 -11
- package/src/config/schema.ts +93 -127
- package/src/config/schemas/__tests__/live-voice.test.ts +24 -6
- package/src/config/schemas/__tests__/stt.test.ts +31 -3
- package/src/config/schemas/live-voice.ts +10 -4
- package/src/config/schemas/llm.ts +52 -15
- package/src/config/schemas/memory-lifecycle.ts +1 -1
- package/src/config/schemas/memory-retrospective.ts +8 -0
- package/src/config/schemas/memory-v2.ts +2 -2
- package/src/config/schemas/memory-v3.ts +1 -1
- package/src/config/schemas/services.ts +6 -3
- package/src/config/schemas/stt.ts +38 -21
- package/src/config/schemas/tts.ts +13 -18
- package/src/config/skills.ts +31 -21
- package/src/context/compactor.ts +44 -7
- package/src/context/post-turn-tool-result-truncation.ts +4 -2
- package/src/context/tool-result-spool.ts +26 -5
- package/src/conversations/__tests__/message-consolidation.test.ts +48 -0
- package/src/conversations/message-consolidation.ts +22 -2
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +5 -12
- package/src/daemon/app-source-watcher.ts +17 -23
- package/src/daemon/chat-credential-redaction.ts +1365 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +627 -34
- package/src/daemon/conversation-agent-loop.ts +71 -31
- package/src/daemon/conversation-error.ts +36 -14
- package/src/daemon/conversation-process.ts +22 -0
- package/src/daemon/conversation-store.ts +35 -0
- package/src/daemon/conversation-surfaces.ts +25 -25
- package/src/daemon/conversation-tool-setup.ts +33 -7
- package/src/daemon/conversation.ts +55 -5
- package/src/daemon/handlers/shared.ts +33 -2
- package/src/daemon/lifecycle.ts +4 -4
- package/src/daemon/message-types/conversations.ts +6 -17
- package/src/daemon/providers-setup.ts +8 -0
- package/src/daemon/tool-setup-types.ts +7 -1
- package/src/daemon/wake-conversation-ops.ts +10 -1
- package/src/hooks/types.ts +9 -0
- package/src/ipc/__tests__/email-ipc.test.ts +90 -0
- package/src/ipc/gateway-client.test.ts +59 -0
- package/src/ipc/gateway-client.ts +70 -27
- package/src/live-voice/__tests__/live-voice-events.test.ts +14 -2
- package/src/live-voice/__tests__/live-voice-integration.test.ts +116 -2
- package/src/live-voice/__tests__/live-voice-vad.test.ts +804 -13
- package/src/live-voice/__tests__/protocol.test.ts +122 -0
- package/src/live-voice/live-voice-session.ts +443 -40
- package/src/live-voice/protocol.ts +143 -1
- package/src/monitoring/__tests__/plugin-source-watch.test.ts +3 -1
- package/src/monitoring/plugin-source-watch.ts +3 -62
- package/src/notifications/README.md +1 -1
- package/src/permissions/checker.ts +8 -4
- package/src/persistence/__tests__/db-init-migrations-ok.test.ts +26 -0
- package/src/persistence/conversation-crud.ts +104 -2
- package/src/persistence/db-init.ts +14 -3
- package/src/persistence/job-handlers/cleanup.ts +15 -7
- package/src/persistence/llm-request-log-store.ts +88 -52
- package/src/persistence/migrations/298-move-memory-jobs-to-memory-db.ts +7 -31
- package/src/persistence/migrations/305-drop-contact-acl-columns.ts +3 -2
- package/src/persistence/migrations/326-move-injection-events-to-memory-db.ts +8 -34
- package/src/persistence/migrations/336-move-memory-v2-activation-logs-to-memory-db.ts +90 -0
- package/src/persistence/migrations/337-move-memory-recall-logs-to-memory-db.ts +114 -0
- package/src/persistence/migrations/338-move-memory-v3-selections-to-memory-db.ts +84 -0
- package/src/persistence/migrations/339-move-activation-sessions-to-memory-db.ts +52 -0
- package/src/persistence/migrations/__tests__/run-migrations.test.ts +155 -0
- package/src/persistence/migrations/helpers/relocation.ts +44 -1
- package/src/persistence/migrations/run-migrations.ts +25 -1
- package/src/persistence/schema/infrastructure.ts +9 -0
- package/src/persistence/schema/memory-core.ts +3 -0
- package/src/persistence/schema/memory-injection.ts +2 -0
- package/src/persistence/steps.ts +36 -0
- package/src/platform/client.test.ts +1 -44
- package/src/platform/client.ts +10 -20
- package/src/platform/consent-cache.test.ts +89 -23
- package/src/platform/consent-cache.ts +71 -33
- package/src/plugin-api/constants.ts +12 -0
- package/src/plugin-api/conversation-turn.ts +37 -14
- package/src/plugin-api/index.ts +11 -1
- package/src/plugin-api/resolve-credential.ts +75 -0
- package/src/plugin-api/vision-support.test.ts +8 -19
- package/src/plugin-api/vision-support.ts +26 -17
- package/src/plugins/collect-source-versions.ts +77 -0
- package/src/plugins/defaults/compaction/compact.ts +6 -0
- package/src/plugins/defaults/compaction/window-manager.ts +9 -0
- package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +18 -24
- package/src/plugins/defaults/empty-response/hooks/user-prompt-submit.ts +38 -0
- package/src/plugins/defaults/empty-response/refusal-quarantine.ts +99 -0
- package/src/plugins/defaults/image-fallback/__tests__/caption-cache-persistence.test.ts +7 -3
- package/src/plugins/defaults/index.ts +8 -1
- package/src/plugins/defaults/max-tokens-continue/hooks/post-model-call.ts +4 -1
- package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +48 -6
- package/src/plugins/defaults/memory/__tests__/db-memory-attach.test.ts +28 -22
- package/src/plugins/defaults/memory/__tests__/memory-log-stores-degraded.test.ts +148 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +80 -8
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-prompt.test.ts +202 -0
- package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +64 -25
- package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +24 -11
- package/src/plugins/defaults/memory/__tests__/prompt-override.test.ts +70 -6
- package/src/plugins/defaults/memory/__tests__/table-relocation.test.ts +278 -0
- package/src/plugins/defaults/memory/activation-session-store.ts +27 -20
- package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +2 -9
- package/src/plugins/defaults/memory/context-search/sources/workspace.ts +1 -8
- package/src/plugins/defaults/memory/graph/retriever.test.ts +6 -6
- package/src/plugins/defaults/memory/graph/store.ts +114 -0
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +36 -1
- package/src/plugins/defaults/memory/graph/tools.ts +47 -13
- package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +16 -35
- package/src/plugins/defaults/memory/jobs-worker.ts +10 -1
- package/src/plugins/defaults/memory/memory-db.ts +3 -2
- package/src/plugins/defaults/memory/memory-recall-log-store.ts +129 -66
- package/src/plugins/defaults/memory/memory-retrospective-constants.ts +8 -0
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +11 -122
- package/src/plugins/defaults/memory/memory-retrospective-prompt.ts +216 -0
- package/src/plugins/defaults/memory/memory-v2-activation-log-store.ts +84 -46
- package/src/plugins/defaults/memory/memory-v2-concept-frequency.ts +42 -32
- package/src/plugins/defaults/memory/path-containment.ts +21 -0
- package/src/plugins/defaults/memory/prompt-override.ts +51 -13
- package/src/plugins/defaults/memory/tools.test.ts +34 -0
- package/src/plugins/defaults/memory/tools.ts +12 -2
- package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +19 -15
- package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +24 -19
- package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +19 -15
- package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +22 -2
- package/src/plugins/defaults/memory/v2/__tests__/prompts-consolidation.test.ts +5 -3
- package/src/plugins/defaults/memory/v2/harness/oracle.ts +59 -41
- package/src/plugins/defaults/memory/v2/harness/replay-input.ts +29 -25
- package/src/plugins/defaults/memory/v2/migration.ts +46 -16
- package/src/plugins/defaults/memory/v2/prompts/consolidation.ts +4 -0
- package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +17 -15
- package/src/plugins/defaults/memory/v3/__tests__/gate.test.ts +24 -22
- package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +9 -5
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +277 -10
- package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +57 -5
- package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +9 -7
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +38 -7
- package/src/plugins/defaults/memory/v3/hot-set.test.ts +36 -18
- package/src/plugins/defaults/memory/v3/hot-set.ts +12 -14
- package/src/plugins/defaults/memory/v3/learned-edges.test.ts +47 -27
- package/src/plugins/defaults/memory/v3/learned-edges.ts +12 -14
- package/src/plugins/defaults/memory/v3/orchestrate.ts +139 -22
- package/src/plugins/defaults/memory/v3/prune.test.ts +10 -3
- package/src/plugins/defaults/memory/v3/prune.ts +17 -11
- package/src/plugins/defaults/memory/v3/selection-log-store.ts +23 -11
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +70 -53
- package/src/plugins/defaults/surface-completion-nudge/hooks/post-model-call.ts +9 -6
- package/src/plugins/external-plugin-loader.ts +15 -15
- package/src/plugins/mtime-cache.ts +47 -0
- package/src/plugins/pipeline.ts +9 -1
- package/src/plugins/plugin-execution-context.ts +44 -0
- package/src/plugins/plugin-tree-walk.ts +31 -24
- package/src/plugins/source-fingerprint.ts +3 -4
- package/src/prompts/normalize-onboarding.ts +12 -0
- package/src/prompts/persona-resolver.ts +8 -0
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +1 -1
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +6 -9
- package/src/providers/__tests__/registry-native-web-search.test.ts +4 -10
- package/src/providers/__tests__/retry-callsite.test.ts +235 -215
- package/src/providers/__tests__/satellite-connection-routing.test.ts +8 -16
- package/src/providers/atlascloud/client.ts +10 -49
- package/src/providers/baseten/client.ts +43 -0
- package/src/providers/call-site-routing.ts +26 -13
- package/src/providers/connection-resolution.ts +9 -11
- package/src/providers/fetch-provider-catalog.ts +4 -2
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +29 -4
- package/src/providers/inference/__tests__/connection-availability-keyless.test.ts +78 -0
- package/src/providers/inference/adapter-factory.ts +27 -6
- package/src/providers/inference/auth.ts +29 -1
- package/src/providers/inference/backfill.ts +61 -10
- package/src/providers/inference/connection-availability.ts +3 -2
- package/src/providers/inference/resolve-auth.ts +9 -1
- package/src/providers/model-catalog.ts +37 -0
- package/src/providers/openai/__tests__/api-error-normalization.test.ts +24 -2
- package/src/providers/openai/api-key-validation.ts +70 -0
- package/src/providers/retry.ts +2 -0
- package/src/providers/types.ts +11 -4
- package/src/providers/vellum-model-routing.test.ts +26 -0
- package/src/providers/vellum-model-routing.ts +30 -0
- package/src/providers/voice-error-copy.ts +47 -0
- package/src/runtime/agent-wake.ts +40 -24
- package/src/runtime/for-chat-mint-registry.ts +118 -0
- package/src/runtime/reveal-nonce.ts +49 -0
- package/src/runtime/reveal-success-registry.ts +306 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +88 -3
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +161 -30
- package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +7 -0
- package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +15 -0
- package/src/runtime/routes/app-management-routes.ts +152 -45
- package/src/runtime/routes/app-routes.ts +16 -77
- package/src/runtime/routes/canned-message-complete.ts +16 -16
- package/src/runtime/routes/conversation-management-routes.ts +17 -14
- package/src/runtime/routes/conversation-query-routes.ts +54 -6
- package/src/runtime/routes/conversation-routes.ts +48 -2
- package/src/runtime/routes/credential-routes.ts +116 -3
- package/src/runtime/routes/email-routes.ts +17 -1
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +33 -5
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +6 -5
- package/src/runtime/routes/inference-provider-connection-routes.ts +77 -28
- package/src/runtime/routes/inference-send-routes.ts +1 -1
- package/src/runtime/routes/internal-telemetry-routes.ts +7 -6
- package/src/runtime/routes/plugins-routes.ts +37 -6
- package/src/runtime/routes/publish-routes.ts +15 -18
- package/src/runtime/routes/schedule-worker-routes.ts +9 -0
- package/src/runtime/routes/secret-routes.ts +10 -0
- package/src/runtime/routes/telemetry-routes.ts +149 -45
- package/src/schedule/__tests__/schedule-timezone.test.ts +101 -0
- package/src/schedule/__tests__/worker-watchdog.test.ts +209 -0
- package/src/schedule/schedule-store.ts +12 -1
- package/src/schedule/schedule-timezone.ts +63 -0
- package/src/schedule/scheduler.ts +100 -6
- package/src/schedule/worker-control.ts +19 -0
- package/src/security/auth-fallback-events-store.ts +7 -6
- package/src/security/secret-scanner.ts +26 -1
- package/src/services/published-app-updater.ts +6 -11
- package/src/stt/stt-stream-session.ts +36 -16
- package/src/subagent/manager.ts +34 -8
- package/src/telemetry/AGENTS.md +30 -1
- package/src/telemetry/__tests__/config-setting-snapshot.test.ts +18 -0
- package/src/telemetry/__tests__/outbox-test-harness.ts +5 -3
- package/src/telemetry/config-setting-snapshot.ts +44 -10
- package/src/telemetry/telemetry-event-sources.test.ts +124 -30
- package/src/telemetry/telemetry-event-sources.ts +137 -83
- package/src/telemetry/telemetry-events-outbox.test.ts +46 -1
- package/src/telemetry/telemetry-events-outbox.ts +60 -9
- package/src/telemetry/telemetry-wire-source.json +1 -1
- package/src/telemetry/telemetry-wire-validation.ts +39 -2
- package/src/telemetry/telemetry-wire.generated.ts +8 -0
- package/src/telemetry/tool-audit.ts +15 -9
- package/src/telemetry/tool-executed-events-store.test.ts +1 -1
- package/src/telemetry/turn-events-store.ts +20 -0
- package/src/telemetry/types.ts +45 -12
- package/src/telemetry/usage-telemetry-reporter.test.ts +294 -25
- package/src/telemetry/usage-telemetry-reporter.ts +117 -18
- package/src/telemetry/watchdog-direct-emit.test.ts +11 -3
- package/src/telemetry/watchdog-direct-emit.ts +11 -6
- package/src/tools/apps/executors.ts +11 -36
- package/src/tools/executor.ts +14 -1
- package/src/tools/host-terminal/host-shell.ts +6 -2
- package/src/tools/network/__tests__/web-fetch-firecrawl.test.ts +1 -1
- package/src/tools/network/__tests__/web-fetch-metadata.test.ts +25 -0
- package/src/tools/network/web-fetch.ts +6 -2
- package/src/tools/skills/sandbox-runner.ts +5 -2
- package/src/tools/subagent/spawn.ts +7 -11
- package/src/tools/terminal/shell.ts +5 -2
- package/src/tools/tool-manifest.ts +0 -2
- package/src/tools/tool-profiler.ts +37 -6
- package/src/tools/ui-surface/channel-variants.ts +101 -0
- package/src/tools/ui-surface/definitions.ts +23 -67
- package/src/tools/ui-surface/surface-shape-docs.ts +229 -0
- package/src/tts/__tests__/provider-adapters.test.ts +18 -0
- package/src/tts/provider-catalog.ts +2 -4
- package/src/tts/providers/deepgram-provider.ts +10 -1
- package/src/types/onboarding-context.ts +8 -0
- package/src/usage/attribution.ts +18 -112
- package/src/{config/bundled-skills/messaging/tools/gmail-mime-helpers.ts → util/mime-type.ts} +4 -1
- package/src/util/provider-error-patterns.ts +7 -1
- package/src/util/worker-process.ts +105 -0
- package/src/watcher/__tests__/telemetry.test.ts +17 -4
- package/src/watcher/telemetry.ts +5 -5
- package/src/workspace/migrations/131-drop-web-fetch-mode.ts +61 -0
- package/src/workspace/migrations/registry.ts +2 -0
- package/src/workspace/provider-commit-message-generator.ts +6 -4
- package/src/__tests__/app-open-proxy.test.ts +0 -67
- package/src/onboarding/onboarding-research-events-store.test.ts +0 -230
- package/src/onboarding/onboarding-research-events-store.ts +0 -104
- package/src/runtime/routes/assets/vellum-design-system.css +0 -2236
- package/src/tools/apps/definitions.ts +0 -73
- package/src/tools/apps/open-proxy.ts +0 -43
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `assistant inference providers` CLI namespace.
|
|
3
3
|
*
|
|
4
|
-
* Provider-scoped admin commands
|
|
4
|
+
* Provider-scoped admin commands:
|
|
5
5
|
*
|
|
6
|
-
* `assistant inference providers
|
|
7
|
-
* list — list
|
|
8
|
-
* get — show a single
|
|
9
|
-
* create —
|
|
10
|
-
* update — update a
|
|
11
|
-
* delete —
|
|
6
|
+
* `assistant inference providers <verb>`
|
|
7
|
+
* list — list configured providers (optionally filtered by provider)
|
|
8
|
+
* get — show a single provider entry
|
|
9
|
+
* create — add a provider (auth derived from the provider type)
|
|
10
|
+
* update — update a provider entry
|
|
11
|
+
* delete — remove a provider (rejects if profiles reference it)
|
|
12
|
+
*
|
|
13
|
+
* `assistant inference providers connections <verb>` is a deprecated alias
|
|
14
|
+
* of the same verbs, kept for one release.
|
|
12
15
|
*
|
|
13
16
|
* All subcommands delegate to the daemon via IPC using the
|
|
14
17
|
* `inference_provider_connections_*` routes.
|
|
@@ -60,12 +63,97 @@ function formatAuth(auth: AuthInfo): string {
|
|
|
60
63
|
}
|
|
61
64
|
}
|
|
62
65
|
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
// Auth derivation
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Derive the auth object a provider implies via the daemon's shared
|
|
72
|
+
* `deriveAuthForProvider` (one source of truth for the keyless / vellum /
|
|
73
|
+
* openai-compatible rules), mapping its credential-required null to a
|
|
74
|
+
* CLI-flavored error message string.
|
|
75
|
+
*/
|
|
76
|
+
async function deriveAuthInput(
|
|
77
|
+
provider: string,
|
|
78
|
+
credential?: string,
|
|
79
|
+
): Promise<Record<string, unknown> | string> {
|
|
80
|
+
// Deferred: pure module, imported lazily per cli/no-daemon-internals.
|
|
81
|
+
const { deriveAuthForProvider } =
|
|
82
|
+
await import("../../providers/inference/auth.js");
|
|
83
|
+
const derived = deriveAuthForProvider(provider, credential);
|
|
84
|
+
if (!derived) {
|
|
85
|
+
return `Provider "${provider}" authenticates by API key — pass --credential <vault-key> (or an explicit --auth override)`;
|
|
86
|
+
}
|
|
87
|
+
return derived as unknown as Record<string, unknown>;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Build and validate an explicit `--auth` override from CLI flags. Returns
|
|
92
|
+
* the auth object on success, or an error message string on validation
|
|
93
|
+
* failure.
|
|
94
|
+
*/
|
|
95
|
+
function buildAuthInput(
|
|
96
|
+
authType: string,
|
|
97
|
+
credential?: string,
|
|
98
|
+
): Record<string, unknown> | string {
|
|
99
|
+
if (authType === "api_key") {
|
|
100
|
+
if (!credential) {
|
|
101
|
+
return "--credential is required when --auth api_key";
|
|
102
|
+
}
|
|
103
|
+
return { type: "api_key", credential };
|
|
104
|
+
}
|
|
105
|
+
if (authType === "platform") {
|
|
106
|
+
if (credential) {
|
|
107
|
+
return "--credential is not accepted with --auth platform";
|
|
108
|
+
}
|
|
109
|
+
return { type: "platform" };
|
|
110
|
+
}
|
|
111
|
+
if (authType === "none") {
|
|
112
|
+
if (credential) {
|
|
113
|
+
return "--credential is not accepted with --auth none";
|
|
114
|
+
}
|
|
115
|
+
return { type: "none" };
|
|
116
|
+
}
|
|
117
|
+
if (authType === "oauth_subscription") {
|
|
118
|
+
if (!credential) {
|
|
119
|
+
return "--credential is required when --auth oauth_subscription";
|
|
120
|
+
}
|
|
121
|
+
return { type: "oauth_subscription", credential };
|
|
122
|
+
}
|
|
123
|
+
return `Unknown auth type "${authType}". Use: api_key, platform, none, oauth_subscription`;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** Commander collector for a repeatable option (e.g. `--model` multiple times). */
|
|
127
|
+
function collectRepeatable(value: string, previous: string[]): string[] {
|
|
128
|
+
return [...previous, value];
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Build the openai-compatible custom-provider fields (`base_url`, `models`)
|
|
133
|
+
* from CLI flags, forwarded to the connection route under its exact field
|
|
134
|
+
* names. The daemon stays authoritative on whether they are required/allowed;
|
|
135
|
+
* the CLI only shape-forwards what the user passed.
|
|
136
|
+
*/
|
|
137
|
+
function buildCustomProviderFields(opts: {
|
|
138
|
+
baseUrl?: string;
|
|
139
|
+
model?: string[];
|
|
140
|
+
}): Record<string, unknown> {
|
|
141
|
+
const fields: Record<string, unknown> = {};
|
|
142
|
+
if (opts.baseUrl !== undefined) {
|
|
143
|
+
fields.base_url = opts.baseUrl;
|
|
144
|
+
}
|
|
145
|
+
if (opts.model !== undefined && opts.model.length > 0) {
|
|
146
|
+
fields.models = opts.model.map((id) => ({ id }));
|
|
147
|
+
}
|
|
148
|
+
return fields;
|
|
149
|
+
}
|
|
150
|
+
|
|
63
151
|
// ---------------------------------------------------------------------------
|
|
64
152
|
// Subcommand: list
|
|
65
153
|
// ---------------------------------------------------------------------------
|
|
66
154
|
|
|
67
|
-
function attachListSubcommand(
|
|
68
|
-
subcommand(
|
|
155
|
+
function attachListSubcommand(parent: Command): void {
|
|
156
|
+
subcommand(parent, "list").action(
|
|
69
157
|
async (opts: { provider?: string; json?: boolean }) => {
|
|
70
158
|
const ipcResult = await cliIpcCall<{ connections: ProviderConnection[] }>(
|
|
71
159
|
"inference_provider_connections_list",
|
|
@@ -89,14 +177,12 @@ function attachListSubcommand(connections: Command): void {
|
|
|
89
177
|
}
|
|
90
178
|
|
|
91
179
|
if (rows.length === 0) {
|
|
92
|
-
process.stdout.write("No
|
|
180
|
+
process.stdout.write("No providers found.\n");
|
|
93
181
|
return;
|
|
94
182
|
}
|
|
95
183
|
|
|
96
184
|
for (const conn of rows) {
|
|
97
|
-
process.stdout.write(
|
|
98
|
-
`${conn.name} provider=${conn.provider} auth=${formatAuth(conn.auth)}\n`,
|
|
99
|
-
);
|
|
185
|
+
process.stdout.write(`${conn.name} provider=${conn.provider}\n`);
|
|
100
186
|
}
|
|
101
187
|
},
|
|
102
188
|
);
|
|
@@ -106,8 +192,8 @@ function attachListSubcommand(connections: Command): void {
|
|
|
106
192
|
// Subcommand: get
|
|
107
193
|
// ---------------------------------------------------------------------------
|
|
108
194
|
|
|
109
|
-
function attachGetSubcommand(
|
|
110
|
-
subcommand(
|
|
195
|
+
function attachGetSubcommand(parent: Command): void {
|
|
196
|
+
subcommand(parent, "get").action(
|
|
111
197
|
async (name: string, opts: { json?: boolean }) => {
|
|
112
198
|
const ipcResult = await cliIpcCall<ProviderConnection>(
|
|
113
199
|
"inference_provider_connections_get",
|
|
@@ -143,82 +229,18 @@ function attachGetSubcommand(connections: Command): void {
|
|
|
143
229
|
);
|
|
144
230
|
}
|
|
145
231
|
|
|
146
|
-
// ---------------------------------------------------------------------------
|
|
147
|
-
// Auth input builder
|
|
148
|
-
// ---------------------------------------------------------------------------
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Build and validate auth input from CLI flags. Returns the auth object on
|
|
152
|
-
* success, or an error message string on validation failure.
|
|
153
|
-
*/
|
|
154
|
-
function buildAuthInput(
|
|
155
|
-
authType: string,
|
|
156
|
-
credential?: string,
|
|
157
|
-
): Record<string, unknown> | string {
|
|
158
|
-
if (authType === "api_key") {
|
|
159
|
-
if (!credential) {
|
|
160
|
-
return "--credential is required when --auth api_key";
|
|
161
|
-
}
|
|
162
|
-
return { type: "api_key", credential };
|
|
163
|
-
}
|
|
164
|
-
if (authType === "platform") {
|
|
165
|
-
if (credential) {
|
|
166
|
-
return "--credential is not accepted with --auth platform";
|
|
167
|
-
}
|
|
168
|
-
return { type: "platform" };
|
|
169
|
-
}
|
|
170
|
-
if (authType === "none") {
|
|
171
|
-
if (credential) {
|
|
172
|
-
return "--credential is not accepted with --auth none";
|
|
173
|
-
}
|
|
174
|
-
return { type: "none" };
|
|
175
|
-
}
|
|
176
|
-
if (authType === "oauth_subscription") {
|
|
177
|
-
if (!credential) {
|
|
178
|
-
return "--credential is required when --auth oauth_subscription";
|
|
179
|
-
}
|
|
180
|
-
return { type: "oauth_subscription", credential };
|
|
181
|
-
}
|
|
182
|
-
return `Unknown auth type "${authType}". Use: api_key, platform, none, oauth_subscription`;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/** Commander collector for a repeatable option (e.g. `--model` multiple times). */
|
|
186
|
-
function collectRepeatable(value: string, previous: string[]): string[] {
|
|
187
|
-
return [...previous, value];
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Build the openai-compatible custom-provider fields (`base_url`, `models`)
|
|
192
|
-
* from CLI flags, forwarded to the connection route under its exact field
|
|
193
|
-
* names. The daemon stays authoritative on whether they are required/allowed;
|
|
194
|
-
* the CLI only shape-forwards what the user passed.
|
|
195
|
-
*/
|
|
196
|
-
function buildCustomProviderFields(opts: {
|
|
197
|
-
baseUrl?: string;
|
|
198
|
-
model?: string[];
|
|
199
|
-
}): Record<string, unknown> {
|
|
200
|
-
const fields: Record<string, unknown> = {};
|
|
201
|
-
if (opts.baseUrl !== undefined) {
|
|
202
|
-
fields.base_url = opts.baseUrl;
|
|
203
|
-
}
|
|
204
|
-
if (opts.model !== undefined && opts.model.length > 0) {
|
|
205
|
-
fields.models = opts.model.map((id) => ({ id }));
|
|
206
|
-
}
|
|
207
|
-
return fields;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
232
|
// ---------------------------------------------------------------------------
|
|
211
233
|
// Subcommand: create
|
|
212
234
|
// ---------------------------------------------------------------------------
|
|
213
235
|
|
|
214
|
-
function attachCreateSubcommand(
|
|
236
|
+
function attachCreateSubcommand(parent: Command): void {
|
|
215
237
|
// `--model` uses an array-accumulating collector, which the declarative
|
|
216
238
|
// help contract cannot express — it is registered imperatively here (with
|
|
217
239
|
// the trailing `--json` after it, preserving option order).
|
|
218
|
-
subcommand(
|
|
240
|
+
subcommand(parent, "create")
|
|
219
241
|
.option(
|
|
220
242
|
"--model <id>",
|
|
221
|
-
"Model id offered by this
|
|
243
|
+
"Model id offered by this provider (repeatable; required for openai-compatible)",
|
|
222
244
|
collectRepeatable,
|
|
223
245
|
[] as string[],
|
|
224
246
|
)
|
|
@@ -228,14 +250,16 @@ function attachCreateSubcommand(connections: Command): void {
|
|
|
228
250
|
name: string,
|
|
229
251
|
opts: {
|
|
230
252
|
provider: string;
|
|
231
|
-
auth
|
|
253
|
+
auth?: string;
|
|
232
254
|
credential?: string;
|
|
233
255
|
baseUrl?: string;
|
|
234
256
|
model?: string[];
|
|
235
257
|
json?: boolean;
|
|
236
258
|
},
|
|
237
259
|
) => {
|
|
238
|
-
const authInput =
|
|
260
|
+
const authInput = opts.auth
|
|
261
|
+
? buildAuthInput(opts.auth, opts.credential)
|
|
262
|
+
: await deriveAuthInput(opts.provider, opts.credential);
|
|
239
263
|
if (typeof authInput === "string") {
|
|
240
264
|
writeCliError(authInput, opts.json);
|
|
241
265
|
return;
|
|
@@ -274,8 +298,8 @@ function attachCreateSubcommand(connections: Command): void {
|
|
|
274
298
|
);
|
|
275
299
|
} else {
|
|
276
300
|
process.stdout.write(
|
|
277
|
-
`
|
|
278
|
-
`Verify it works: point a profile
|
|
301
|
+
`Added provider "${conn.name}" (provider=${conn.provider})\n` +
|
|
302
|
+
`Verify it works: point a profile at "${conn.name}", then run: assistant inference send --profile <profile> "Reply with OK"\n`,
|
|
279
303
|
);
|
|
280
304
|
}
|
|
281
305
|
},
|
|
@@ -286,12 +310,12 @@ function attachCreateSubcommand(connections: Command): void {
|
|
|
286
310
|
// Subcommand: update
|
|
287
311
|
// ---------------------------------------------------------------------------
|
|
288
312
|
|
|
289
|
-
function attachUpdateSubcommand(
|
|
313
|
+
function attachUpdateSubcommand(parent: Command): void {
|
|
290
314
|
// `--model` collector registered imperatively — see the note on `create`.
|
|
291
|
-
subcommand(
|
|
315
|
+
subcommand(parent, "update")
|
|
292
316
|
.option(
|
|
293
317
|
"--model <id>",
|
|
294
|
-
"Model id offered by this
|
|
318
|
+
"Model id offered by this provider (repeatable; openai-compatible)",
|
|
295
319
|
collectRepeatable,
|
|
296
320
|
[] as string[],
|
|
297
321
|
)
|
|
@@ -300,14 +324,44 @@ function attachUpdateSubcommand(connections: Command): void {
|
|
|
300
324
|
async (
|
|
301
325
|
name: string,
|
|
302
326
|
opts: {
|
|
303
|
-
auth
|
|
327
|
+
auth?: string;
|
|
304
328
|
credential?: string;
|
|
305
329
|
baseUrl?: string;
|
|
306
330
|
model?: string[];
|
|
307
331
|
json?: boolean;
|
|
308
332
|
},
|
|
309
333
|
) => {
|
|
310
|
-
|
|
334
|
+
// Resolve the auth to send: explicit --auth wins; a bare --credential
|
|
335
|
+
// rotates the key via derived api_key auth; with neither, re-send the
|
|
336
|
+
// stored auth verbatim so base-url/model-only updates work.
|
|
337
|
+
let authInput: Record<string, unknown> | string;
|
|
338
|
+
if (opts.auth) {
|
|
339
|
+
authInput = buildAuthInput(opts.auth, opts.credential);
|
|
340
|
+
} else {
|
|
341
|
+
const existing = await cliIpcCall<ProviderConnection>(
|
|
342
|
+
"inference_provider_connections_get",
|
|
343
|
+
{ pathParams: { name } },
|
|
344
|
+
);
|
|
345
|
+
if (!existing.ok) {
|
|
346
|
+
writeCliError(existing.error ?? "Unknown error", opts.json);
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
const storedAuth = existing.result!.auth;
|
|
350
|
+
if (opts.credential) {
|
|
351
|
+
// A bare --credential must never silently flip subscription auth
|
|
352
|
+
// to api_key — subscription tokens rotate via login-chatgpt.
|
|
353
|
+
if (storedAuth.type === "oauth_subscription") {
|
|
354
|
+
writeCliError(
|
|
355
|
+
`Provider "${name}" uses subscription auth, which --credential cannot rotate. Re-run: assistant inference providers login-chatgpt (or pass an explicit --auth to switch auth types)`,
|
|
356
|
+
opts.json,
|
|
357
|
+
);
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
authInput = { type: "api_key", credential: opts.credential };
|
|
361
|
+
} else {
|
|
362
|
+
authInput = storedAuth as unknown as Record<string, unknown>;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
311
365
|
if (typeof authInput === "string") {
|
|
312
366
|
writeCliError(authInput, opts.json);
|
|
313
367
|
return;
|
|
@@ -334,8 +388,8 @@ function attachUpdateSubcommand(connections: Command): void {
|
|
|
334
388
|
);
|
|
335
389
|
} else {
|
|
336
390
|
process.stdout.write(
|
|
337
|
-
`Updated
|
|
338
|
-
`Verify it works: assistant inference send --profile <profile-using-this-
|
|
391
|
+
`Updated provider "${name}" (auth=${formatAuth(conn.auth)})\n` +
|
|
392
|
+
`Verify it works: assistant inference send --profile <profile-using-this-provider> "Reply with OK"\n`,
|
|
339
393
|
);
|
|
340
394
|
}
|
|
341
395
|
},
|
|
@@ -346,8 +400,8 @@ function attachUpdateSubcommand(connections: Command): void {
|
|
|
346
400
|
// Subcommand: delete
|
|
347
401
|
// ---------------------------------------------------------------------------
|
|
348
402
|
|
|
349
|
-
function attachDeleteSubcommand(
|
|
350
|
-
subcommand(
|
|
403
|
+
function attachDeleteSubcommand(parent: Command): void {
|
|
404
|
+
subcommand(parent, "delete").action(
|
|
351
405
|
async (name: string, opts: { json?: boolean }) => {
|
|
352
406
|
const ipcResult = await cliIpcCall<{ ok: true }>(
|
|
353
407
|
"inference_provider_connections_delete",
|
|
@@ -364,7 +418,7 @@ function attachDeleteSubcommand(connections: Command): void {
|
|
|
364
418
|
if (opts.json) {
|
|
365
419
|
process.stdout.write(JSON.stringify({ ok: true }) + "\n");
|
|
366
420
|
} else {
|
|
367
|
-
process.stdout.write(`
|
|
421
|
+
process.stdout.write(`Removed provider "${name}"\n`);
|
|
368
422
|
}
|
|
369
423
|
},
|
|
370
424
|
);
|
|
@@ -442,14 +496,14 @@ function attachLoginChatgptSubcommand(providers: Command): void {
|
|
|
442
496
|
);
|
|
443
497
|
}
|
|
444
498
|
|
|
445
|
-
// Step 3: Create (or update) provider
|
|
499
|
+
// Step 3: Create (or update) the provider entry via IPC
|
|
446
500
|
const connectionName = "chatgpt-subscription";
|
|
447
501
|
const authInput = {
|
|
448
502
|
type: "oauth_subscription",
|
|
449
503
|
credential: "credential/chatgpt/access_token",
|
|
450
504
|
};
|
|
451
505
|
|
|
452
|
-
// Try to update first; if the
|
|
506
|
+
// Try to update first; if the entry doesn't exist, create it.
|
|
453
507
|
const updateResult = await cliIpcCall<ProviderConnection>(
|
|
454
508
|
"inference_provider_connections_update",
|
|
455
509
|
{
|
|
@@ -459,7 +513,7 @@ function attachLoginChatgptSubcommand(providers: Command): void {
|
|
|
459
513
|
);
|
|
460
514
|
|
|
461
515
|
if (!updateResult.ok) {
|
|
462
|
-
//
|
|
516
|
+
// Entry doesn't exist yet — create it
|
|
463
517
|
const createResult = await cliIpcCall<ProviderConnection>(
|
|
464
518
|
"inference_provider_connections_create",
|
|
465
519
|
{
|
|
@@ -473,7 +527,7 @@ function attachLoginChatgptSubcommand(providers: Command): void {
|
|
|
473
527
|
|
|
474
528
|
if (!createResult.ok) {
|
|
475
529
|
writeCliError(
|
|
476
|
-
createResult.error ?? "Failed to
|
|
530
|
+
createResult.error ?? "Failed to add the ChatGPT provider",
|
|
477
531
|
opts.json,
|
|
478
532
|
);
|
|
479
533
|
return;
|
|
@@ -491,7 +545,7 @@ function attachLoginChatgptSubcommand(providers: Command): void {
|
|
|
491
545
|
} else {
|
|
492
546
|
process.stdout.write(
|
|
493
547
|
`ChatGPT subscription auth configured successfully.\n` +
|
|
494
|
-
`
|
|
548
|
+
`Provider "${connectionName}" is ready.\n`,
|
|
495
549
|
);
|
|
496
550
|
}
|
|
497
551
|
} catch (err) {
|
|
@@ -506,15 +560,22 @@ function attachLoginChatgptSubcommand(providers: Command): void {
|
|
|
506
560
|
// Registration
|
|
507
561
|
// ---------------------------------------------------------------------------
|
|
508
562
|
|
|
563
|
+
/** Attach the five CRUD verbs to a parent (`providers` or its alias). */
|
|
564
|
+
function attachCrudVerbs(parent: Command): void {
|
|
565
|
+
attachListSubcommand(parent);
|
|
566
|
+
attachGetSubcommand(parent);
|
|
567
|
+
attachCreateSubcommand(parent);
|
|
568
|
+
attachUpdateSubcommand(parent);
|
|
569
|
+
attachDeleteSubcommand(parent);
|
|
570
|
+
}
|
|
571
|
+
|
|
509
572
|
export function attachProvidersSubcommand(inference: Command): void {
|
|
510
573
|
const providers = subcommand(inference, "providers");
|
|
511
|
-
|
|
574
|
+
attachCrudVerbs(providers);
|
|
512
575
|
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
attachUpdateSubcommand(connections);
|
|
517
|
-
attachDeleteSubcommand(connections);
|
|
576
|
+
// Deprecated alias, kept for one release.
|
|
577
|
+
const connections = subcommand(providers, "connections");
|
|
578
|
+
attachCrudVerbs(connections);
|
|
518
579
|
|
|
519
580
|
attachLoginChatgptSubcommand(providers);
|
|
520
581
|
attachDefaultProviderSubcommand(providers);
|
|
@@ -90,7 +90,7 @@ export const inferenceHelp: CliCommandHelp = {
|
|
|
90
90
|
description: "LLM inference operations",
|
|
91
91
|
helpText: `
|
|
92
92
|
The inference command group sends requests to your configured LLM provider.
|
|
93
|
-
The provider is resolved from your assistant config (llm.
|
|
93
|
+
The provider is resolved from your assistant config (llm.defaultProvider).
|
|
94
94
|
|
|
95
95
|
Examples:
|
|
96
96
|
$ assistant inference send "What is the capital of France?"
|
|
@@ -195,39 +195,116 @@ Examples:
|
|
|
195
195
|
},
|
|
196
196
|
{
|
|
197
197
|
name: "providers",
|
|
198
|
-
description: "
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
helpText: `
|
|
205
|
-
Provider connections map a name to a (provider, auth) pair.
|
|
206
|
-
Profiles reference connections via the 'provider_connection' field.
|
|
198
|
+
description: "Manage the model providers this assistant can use",
|
|
199
|
+
helpText: `
|
|
200
|
+
A provider entry names a model provider plus how to reach it. Auth is
|
|
201
|
+
derived from the provider: keyless providers (ollama) need none, the
|
|
202
|
+
Vellum entry routes through the platform's managed proxy, and everything
|
|
203
|
+
else uses an API key referenced by --credential.
|
|
207
204
|
|
|
208
|
-
Canonical
|
|
209
|
-
|
|
210
|
-
openai-managed → provider=openai, auth=platform
|
|
211
|
-
gemini-managed → provider=gemini, auth=platform
|
|
205
|
+
Canonical entry (seeded on every boot):
|
|
206
|
+
vellum → the platform-managed provider; cannot be deleted
|
|
212
207
|
|
|
213
208
|
Examples:
|
|
214
|
-
$ assistant inference providers
|
|
215
|
-
$ assistant inference providers
|
|
216
|
-
$ assistant inference providers
|
|
217
|
-
--provider anthropic --
|
|
218
|
-
$ assistant inference providers
|
|
219
|
-
--provider openai-compatible
|
|
209
|
+
$ assistant inference providers list
|
|
210
|
+
$ assistant inference providers get vellum
|
|
211
|
+
$ assistant inference providers create anthropic-personal \\
|
|
212
|
+
--provider anthropic --credential credential/anthropic/api_key
|
|
213
|
+
$ assistant inference providers create local-llm \\
|
|
214
|
+
--provider openai-compatible \\
|
|
220
215
|
--base-url http://localhost:1234/v1 --model my-model
|
|
221
|
-
$ assistant inference providers
|
|
222
|
-
|
|
216
|
+
$ assistant inference providers update anthropic-personal \\
|
|
217
|
+
--credential credential/anthropic/api_key
|
|
218
|
+
$ assistant inference providers delete anthropic-personal
|
|
223
219
|
|
|
224
|
-
After creating or updating a
|
|
220
|
+
After creating or updating a provider, validate it with a live call through
|
|
225
221
|
a profile that uses it:
|
|
226
222
|
$ assistant inference send --profile <profile> "Reply with OK"`,
|
|
223
|
+
subcommands: [
|
|
224
|
+
{
|
|
225
|
+
name: "list",
|
|
226
|
+
description: "List configured providers",
|
|
227
|
+
options: [
|
|
228
|
+
{ flags: "--provider <p>", description: "Filter by provider" },
|
|
229
|
+
{ flags: "--json", description: "Output as JSON" },
|
|
230
|
+
],
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
name: "get",
|
|
234
|
+
args: "<name>",
|
|
235
|
+
description: "Show a single provider entry",
|
|
236
|
+
options: [{ flags: "--json", description: "Output as JSON" }],
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
// NOTE: the repeatable `--model` collector option and the
|
|
240
|
+
// trailing `--json` are registered imperatively in
|
|
241
|
+
// `inference-providers.ts` (array-accumulating parser functions
|
|
242
|
+
// are not expressible as plain help data).
|
|
243
|
+
name: "create",
|
|
244
|
+
args: "<name>",
|
|
245
|
+
description: "Add a provider",
|
|
246
|
+
options: [
|
|
247
|
+
{
|
|
248
|
+
flags: "--provider <p>",
|
|
249
|
+
description: "Provider (anthropic|openai|gemini|ollama|...)",
|
|
250
|
+
required: true,
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
flags: "--credential <vault-key>",
|
|
254
|
+
description:
|
|
255
|
+
"Vault credential name (required for API-key providers)",
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
flags: "--auth <type>",
|
|
259
|
+
description:
|
|
260
|
+
"Override the derived auth: api_key|platform|none|oauth_subscription",
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
flags: "--base-url <url>",
|
|
264
|
+
description:
|
|
265
|
+
"Endpoint base URL (required for --provider openai-compatible)",
|
|
266
|
+
},
|
|
267
|
+
],
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
// NOTE: `--model` + `--json` registered imperatively — see `create`.
|
|
271
|
+
name: "update",
|
|
272
|
+
args: "<name>",
|
|
273
|
+
description: "Update a provider entry",
|
|
274
|
+
options: [
|
|
275
|
+
{
|
|
276
|
+
flags: "--credential <vault-key>",
|
|
277
|
+
description:
|
|
278
|
+
"Rotate the API-key credential (derives api_key auth)",
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
flags: "--auth <type>",
|
|
282
|
+
description:
|
|
283
|
+
"Override the auth explicitly: api_key|platform|none|oauth_subscription",
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
flags: "--base-url <url>",
|
|
287
|
+
description: "Endpoint base URL (openai-compatible providers)",
|
|
288
|
+
},
|
|
289
|
+
],
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
name: "delete",
|
|
293
|
+
args: "<name>",
|
|
294
|
+
description: "Remove a provider",
|
|
295
|
+
options: [{ flags: "--json", description: "Output as JSON" }],
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
name: "connections",
|
|
299
|
+
description:
|
|
300
|
+
"(Deprecated) use `assistant inference providers <verb>` instead",
|
|
301
|
+
helpText: `
|
|
302
|
+
Deprecated alias kept for one release: every verb here is the same as the
|
|
303
|
+
matching \`assistant inference providers <verb>\` command.`,
|
|
227
304
|
subcommands: [
|
|
228
305
|
{
|
|
229
306
|
name: "list",
|
|
230
|
-
description: "
|
|
307
|
+
description: "(Deprecated) use `providers list`",
|
|
231
308
|
options: [
|
|
232
309
|
{ flags: "--provider <p>", description: "Filter by provider" },
|
|
233
310
|
{ flags: "--json", description: "Output as JSON" },
|
|
@@ -236,17 +313,13 @@ a profile that uses it:
|
|
|
236
313
|
{
|
|
237
314
|
name: "get",
|
|
238
315
|
args: "<name>",
|
|
239
|
-
description: "
|
|
316
|
+
description: "(Deprecated) use `providers get`",
|
|
240
317
|
options: [{ flags: "--json", description: "Output as JSON" }],
|
|
241
318
|
},
|
|
242
319
|
{
|
|
243
|
-
// NOTE: the repeatable `--model` collector option and the
|
|
244
|
-
// trailing `--json` are registered imperatively in
|
|
245
|
-
// `inference-providers.ts` (array-accumulating parser functions
|
|
246
|
-
// are not expressible as plain help data).
|
|
247
320
|
name: "create",
|
|
248
321
|
args: "<name>",
|
|
249
|
-
description: "
|
|
322
|
+
description: "(Deprecated) use `providers create`",
|
|
250
323
|
options: [
|
|
251
324
|
{
|
|
252
325
|
flags: "--provider <p>",
|
|
@@ -254,14 +327,14 @@ a profile that uses it:
|
|
|
254
327
|
required: true,
|
|
255
328
|
},
|
|
256
329
|
{
|
|
257
|
-
flags: "--
|
|
258
|
-
description:
|
|
259
|
-
|
|
330
|
+
flags: "--credential <vault-key>",
|
|
331
|
+
description:
|
|
332
|
+
"Vault credential name (required for API-key providers)",
|
|
260
333
|
},
|
|
261
334
|
{
|
|
262
|
-
flags: "--
|
|
335
|
+
flags: "--auth <type>",
|
|
263
336
|
description:
|
|
264
|
-
"
|
|
337
|
+
"Override the derived auth: api_key|platform|none|oauth_subscription",
|
|
265
338
|
},
|
|
266
339
|
{
|
|
267
340
|
flags: "--base-url <url>",
|
|
@@ -271,32 +344,31 @@ a profile that uses it:
|
|
|
271
344
|
],
|
|
272
345
|
},
|
|
273
346
|
{
|
|
274
|
-
// NOTE: `--model` + `--json` registered imperatively — see `create`.
|
|
275
347
|
name: "update",
|
|
276
348
|
args: "<name>",
|
|
277
|
-
description: "
|
|
349
|
+
description: "(Deprecated) use `providers update`",
|
|
278
350
|
options: [
|
|
279
351
|
{
|
|
280
|
-
flags: "--
|
|
281
|
-
description:
|
|
282
|
-
|
|
352
|
+
flags: "--credential <vault-key>",
|
|
353
|
+
description:
|
|
354
|
+
"Rotate the API-key credential (derives api_key auth)",
|
|
283
355
|
},
|
|
284
356
|
{
|
|
285
|
-
flags: "--
|
|
357
|
+
flags: "--auth <type>",
|
|
286
358
|
description:
|
|
287
|
-
"
|
|
359
|
+
"Override the auth explicitly: api_key|platform|none|oauth_subscription",
|
|
288
360
|
},
|
|
289
361
|
{
|
|
290
362
|
flags: "--base-url <url>",
|
|
291
363
|
description:
|
|
292
|
-
"Endpoint base URL (openai-compatible
|
|
364
|
+
"Endpoint base URL (openai-compatible providers)",
|
|
293
365
|
},
|
|
294
366
|
],
|
|
295
367
|
},
|
|
296
368
|
{
|
|
297
369
|
name: "delete",
|
|
298
370
|
args: "<name>",
|
|
299
|
-
description: "
|
|
371
|
+
description: "(Deprecated) use `providers delete`",
|
|
300
372
|
options: [{ flags: "--json", description: "Output as JSON" }],
|
|
301
373
|
},
|
|
302
374
|
],
|
|
@@ -313,7 +385,7 @@ a profile that uses it:
|
|
|
313
385
|
options: [
|
|
314
386
|
{
|
|
315
387
|
flags: "--connection <name>",
|
|
316
|
-
description: "Pin a specific
|
|
388
|
+
description: "Pin a specific provider entry when setting",
|
|
317
389
|
},
|
|
318
390
|
{
|
|
319
391
|
flags: "--json",
|
|
@@ -473,7 +545,7 @@ export const llmHelp: CliCommandHelp = {
|
|
|
473
545
|
helpText: `
|
|
474
546
|
The llm command group is a shorthand for 'assistant inference send'. It sends
|
|
475
547
|
requests to your configured LLM provider, resolved from your assistant config
|
|
476
|
-
(llm.
|
|
548
|
+
(llm.defaultProvider). For profile session management, use 'assistant inference session'.
|
|
477
549
|
|
|
478
550
|
Examples:
|
|
479
551
|
$ assistant llm send "What is the capital of France?"
|