@vellumai/assistant 0.8.0 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +11 -0
- package/Dockerfile +5 -4
- package/README.md +2 -2
- package/docker-entrypoint.sh +16 -0
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +420 -0
- package/eslint-rules/cli-no-daemon-internals.js +283 -0
- package/eslint.config.mjs +12 -0
- package/knip.json +2 -1
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -1
- package/openapi.yaml +4847 -1698
- package/package.json +3 -1
- package/scripts/generate-openapi.ts +52 -4
- package/scripts/sync-llm-catalog.ts +165 -0
- package/scripts/sync-web-search-catalog.ts +107 -0
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +169 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +26 -1
- package/src/__tests__/anthropic-provider.test.ts +92 -2
- package/src/__tests__/app-control-flow.test.ts +7 -0
- package/src/__tests__/assistant-events-sse-shed.test.ts +232 -0
- package/src/__tests__/avatar-identity-sync.test.ts +87 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +11 -22
- package/src/__tests__/btw-routes.test.ts +1 -0
- package/src/__tests__/call-site-routing-provider.test.ts +172 -45
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +44 -3
- package/src/__tests__/channel-policy.test.ts +12 -0
- package/src/__tests__/checker.test.ts +89 -0
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +35 -7
- package/src/__tests__/compact-event-conversation-id-guard.test.ts +33 -5
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +26 -1
- package/src/__tests__/config-loader-backfill.test.ts +526 -102
- package/src/__tests__/config-loader-corrupt.test.ts +68 -0
- package/src/__tests__/config-loader-platform-defaults.test.ts +77 -23
- package/src/__tests__/config-schema-cmd.test.ts +63 -29
- package/src/__tests__/config-schema.test.ts +14 -3
- package/src/__tests__/config-set-platform-guard.test.ts +75 -152
- package/src/__tests__/config-set-route.test.ts +198 -0
- package/src/__tests__/config-watcher.test.ts +6 -0
- package/src/__tests__/contacts-tools.test.ts +51 -199
- package/src/__tests__/context-search-agent-protocol.test.ts +21 -2
- package/src/__tests__/context-search-agent-runner.test.ts +22 -138
- package/src/__tests__/context-search-conversations-source.test.ts +42 -16
- package/src/__tests__/context-search-fanout.test.ts +20 -157
- package/src/__tests__/context-search-memory-v2-source.test.ts +3 -3
- package/src/__tests__/context-search-types.test.ts +7 -2
- package/src/__tests__/context-window-manager.test.ts +389 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +1 -0
- package/src/__tests__/conversation-crud-inference-profile.test.ts +100 -0
- package/src/__tests__/conversation-error.test.ts +38 -0
- package/src/__tests__/conversation-fork-crud.test.ts +241 -1
- package/src/__tests__/conversation-inference-profile-route.test.ts +14 -14
- package/src/__tests__/conversation-init.benchmark.test.ts +1 -0
- package/src/__tests__/conversation-lifecycle.test.ts +124 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +100 -1
- package/src/__tests__/conversation-process-callsite.test.ts +21 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +4 -4
- package/src/__tests__/conversation-slash-commands.test.ts +194 -2
- package/src/__tests__/conversation-surfaces-app-control.test.ts +323 -3
- package/src/__tests__/credential-security-invariants.test.ts +5 -6
- package/src/__tests__/daemon-credential-client.test.ts +56 -1
- package/src/__tests__/db-activation-state-fk-cascade.test.ts +132 -0
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +37 -0
- package/src/__tests__/db-memory-graph-event-date-repair.test.ts +43 -20
- package/src/__tests__/db-proxy-transaction.test.ts +206 -0
- package/src/__tests__/external-plugin-loader.test.ts +458 -0
- package/src/__tests__/filing-service.test.ts +23 -3
- package/src/__tests__/fixtures/mock-chrome-extension.ts +5 -0
- package/src/__tests__/gateway-only-guard.test.ts +0 -1
- package/src/__tests__/graph-extraction-event-date.test.ts +34 -0
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -8
- package/src/__tests__/heartbeat-disk-pressure.test.ts +21 -8
- package/src/__tests__/heartbeat-service.test.ts +50 -233
- package/src/__tests__/history-repair.test.ts +89 -0
- package/src/__tests__/host-app-control-proxy.test.ts +109 -1
- package/src/__tests__/host-app-control-routes.test.ts +247 -1
- package/src/__tests__/host-browser-proxy.test.ts +416 -20
- package/src/__tests__/host-browser-routes.test.ts +325 -33
- package/src/__tests__/host-proxy-preactivation.test.ts +211 -0
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +246 -0
- package/src/__tests__/inference-profile-reaper.test.ts +154 -0
- package/src/__tests__/inference-profile-session-handler.test.ts +398 -0
- package/src/__tests__/inference-profile-session-ipc.test.ts +236 -0
- package/src/__tests__/inline-skill-load-permissions.test.ts +6 -1
- package/src/__tests__/install-skill-routing.test.ts +2 -2
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +15 -0
- package/src/__tests__/llm-callsite-catalog.test.ts +20 -1
- package/src/__tests__/llm-catalog-parity.test.ts +146 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +188 -0
- package/src/__tests__/llm-request-log-source-factory.test.ts +124 -0
- package/src/__tests__/llm-resolver.test.ts +46 -0
- package/src/__tests__/managed-profile-guard.test.ts +131 -2
- package/src/__tests__/mcp-auth-routes.test.ts +1 -0
- package/src/__tests__/mcp-cli.test.ts +182 -220
- package/src/__tests__/mcp-health-check.test.ts +56 -27
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +18 -11
- package/src/__tests__/message-complete-display-id.test.ts +175 -0
- package/src/__tests__/notification-platform-adapter.test.ts +229 -0
- package/src/__tests__/oauth-cli.test.ts +38 -2009
- package/src/__tests__/oauth-commands-routes.test.ts +711 -0
- package/src/__tests__/oauth-connect-routes.test.ts +174 -11
- package/src/__tests__/oauth-providers-routes.test.ts +14 -10
- package/src/__tests__/openai-responses-cutover-guard.test.ts +33 -12
- package/src/__tests__/openai-responses-provider.test.ts +17 -0
- package/src/__tests__/plugin-bootstrap.test.ts +31 -2
- package/src/__tests__/plugin-route-contribution.test.ts +31 -3
- package/src/__tests__/plugin-tool-contribution.test.ts +31 -3
- package/src/__tests__/plugin-types.test.ts +13 -11
- package/src/__tests__/process-message-background-slack.test.ts +46 -0
- package/src/__tests__/profile-entry-status.test.ts +43 -0
- package/src/__tests__/provider-managed-proxy-integration.test.ts +12 -4
- package/src/__tests__/provider-registry-ollama.test.ts +12 -4
- package/src/__tests__/provider-send-message-override-profile.test.ts +10 -4
- package/src/__tests__/relay-server.test.ts +118 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +15 -0
- package/src/__tests__/schedule-retry.test.ts +56 -4
- package/src/__tests__/schedule-routes.test.ts +104 -0
- package/src/__tests__/scheduler-disk-pressure.test.ts +0 -4
- package/src/__tests__/scheduler-recurrence.test.ts +87 -34
- package/src/__tests__/scheduler-reuse-conversation.test.ts +161 -5
- package/src/__tests__/scheduler-wake.test.ts +0 -63
- package/src/__tests__/secret-allowlist.test.ts +1 -0
- package/src/__tests__/secret-routes-managed-proxy.test.ts +12 -4
- package/src/__tests__/shell-credential-ref.test.ts +95 -3
- package/src/__tests__/shell-tool-proxy-mode.test.ts +14 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
- package/src/__tests__/skill-load-tool.test.ts +2 -4
- package/src/__tests__/subagent-call-site-routing.test.ts +78 -16
- package/src/__tests__/suggestion-routes.test.ts +3 -3
- package/src/__tests__/sync-message-contract.test.ts +63 -0
- package/src/__tests__/task-scheduler.test.ts +88 -23
- package/src/__tests__/update-bulletin-job.test.ts +96 -193
- package/src/__tests__/usage-cli.test.ts +11 -73
- package/src/__tests__/user-plugin-loader.test.ts +145 -0
- package/src/__tests__/vercel-config.test.ts +168 -0
- package/src/__tests__/web-search-catalog-parity.test.ts +86 -0
- package/src/__tests__/web-search.test.ts +303 -2
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +1 -21
- package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +58 -0
- package/src/__tests__/workspace-migration-069-seed-onboarding-threads.test.ts +53 -20
- package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +191 -0
- package/src/__tests__/workspace-migration-076-drop-services-inference-mode.test.ts +211 -0
- package/src/__tests__/workspace-migration-077-seed-memory-router-callsite.test.ts +174 -0
- package/src/__tests__/workspace-migration-079-home-feed-notification-only.test.ts +323 -0
- package/src/__tests__/workspace-migration-080-restrict-vercel-api-token-metadata.test.ts +299 -0
- package/src/__tests__/workspace-migration-081-backfill-bash-allowed-tools.test.ts +410 -0
- package/src/__tests__/workspace-migration-082-backfill-managed-profile-labels.test.ts +268 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +3 -3
- package/src/__tests__/workspace-release-notes-feature-flag-guard.test.ts +115 -0
- package/src/acp/__tests__/helpers/which-stub.ts +4 -2
- package/src/acp/resolve-agent.test.ts +25 -0
- package/src/acp/resolve-agent.ts +13 -2
- package/src/acp/session-manager.ts +14 -0
- package/src/approvals/guardian-request-resolvers.ts +32 -87
- package/src/calls/relay-server.ts +35 -0
- package/src/calls/relay-setup-router.ts +36 -0
- package/src/calls/types.ts +1 -0
- package/src/calls/voice-session-bridge.ts +23 -4
- package/src/channels/config.ts +14 -1
- package/src/channels/types.ts +1 -0
- package/src/cli/AGENTS.md +164 -4
- package/src/cli/__tests__/notifications.test.ts +54 -0
- package/src/cli/commands/__tests__/avatar.test.ts +540 -0
- package/src/cli/commands/__tests__/backup.test.ts +236 -776
- package/src/cli/commands/__tests__/cache.test.ts +1 -1
- package/src/cli/commands/__tests__/changelog.test.ts +593 -0
- package/src/cli/commands/__tests__/channel-verification-sessions.test.ts +503 -0
- package/src/cli/commands/__tests__/conversations-import.test.ts +515 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +140 -167
- package/src/cli/commands/__tests__/domain-status.test.ts +137 -76
- package/src/cli/commands/__tests__/email-attachment.test.ts +314 -337
- package/src/cli/commands/__tests__/email-core.test.ts +579 -0
- package/src/cli/commands/__tests__/image-generation.test.ts +87 -824
- package/src/cli/commands/__tests__/inference-send.test.ts +30 -266
- package/src/cli/commands/__tests__/inference-session.test.ts +423 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +81 -110
- package/src/cli/commands/__tests__/skills.test.ts +563 -0
- package/src/cli/commands/__tests__/status.test.ts +249 -0
- package/src/cli/commands/__tests__/stt.test.ts +320 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +4 -603
- package/src/cli/commands/__tests__/tts.test.ts +321 -0
- package/src/cli/commands/__tests__/webhooks.test.ts +86 -511
- package/src/cli/commands/attachment.ts +8 -3
- package/src/cli/commands/audit.ts +95 -64
- package/src/cli/commands/auth.ts +61 -58
- package/src/cli/commands/avatar.ts +276 -390
- package/src/cli/commands/backup.ts +409 -505
- package/src/cli/commands/bash.ts +9 -5
- package/src/cli/commands/browser.ts +28 -9
- package/src/cli/commands/cache.ts +9 -4
- package/src/cli/commands/changelog.ts +414 -0
- package/src/cli/commands/channel-verification-sessions.ts +238 -317
- package/src/cli/commands/clients.ts +8 -3
- package/src/cli/commands/completions.ts +9 -9
- package/src/cli/commands/config.ts +102 -72
- package/src/cli/commands/contacts.ts +575 -696
- package/src/cli/commands/conversations-defer.ts +17 -69
- package/src/cli/commands/conversations-import.ts +90 -253
- package/src/cli/commands/conversations.ts +346 -436
- package/src/cli/commands/credential-execution.ts +9 -6
- package/src/cli/commands/credentials.ts +456 -736
- package/src/cli/commands/domain.ts +128 -206
- package/src/cli/commands/email.ts +606 -794
- package/src/cli/commands/gateway.ts +8 -1
- package/src/cli/commands/image-generation.ts +157 -205
- package/src/cli/commands/inference-providers.ts +352 -0
- package/src/cli/commands/inference-session.ts +415 -0
- package/src/cli/commands/inference.ts +87 -65
- package/src/cli/commands/keys.ts +8 -3
- package/src/cli/commands/mcp.ts +103 -287
- package/src/cli/commands/memory-v2.ts +162 -516
- package/src/cli/commands/notifications.ts +33 -7
- package/src/cli/commands/oauth/apps.ts +292 -261
- package/src/cli/commands/oauth/connect.ts +176 -297
- package/src/cli/commands/oauth/disconnect.ts +16 -215
- package/src/cli/commands/oauth/index.ts +49 -45
- package/src/cli/commands/oauth/mode.ts +43 -199
- package/src/cli/commands/oauth/ping.ts +17 -125
- package/src/cli/commands/oauth/providers.ts +732 -921
- package/src/cli/commands/oauth/request.ts +60 -350
- package/src/cli/commands/oauth/shared.ts +11 -121
- package/src/cli/commands/oauth/status.ts +31 -121
- package/src/cli/commands/oauth/token.ts +13 -55
- package/src/cli/commands/pending.ts +19 -10
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +133 -183
- package/src/cli/commands/platform/__tests__/connect.test.ts +66 -181
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +71 -227
- package/src/cli/commands/platform/__tests__/status.test.ts +169 -287
- package/src/cli/commands/platform/connect.ts +16 -80
- package/src/cli/commands/platform/disconnect.ts +14 -112
- package/src/cli/commands/platform/index.ts +177 -246
- package/src/cli/commands/routes.ts +153 -336
- package/src/cli/commands/sequence.ts +316 -360
- package/src/cli/commands/skills.ts +449 -671
- package/src/cli/commands/status.ts +58 -37
- package/src/cli/commands/stt.ts +94 -262
- package/src/cli/commands/task.ts +14 -40
- package/src/cli/commands/trust.ts +8 -3
- package/src/cli/commands/tts.ts +162 -167
- package/src/cli/commands/ui.ts +35 -42
- package/src/cli/commands/usage.ts +188 -126
- package/src/cli/commands/watchers.ts +8 -3
- package/src/cli/commands/webhooks.ts +99 -193
- package/src/cli/lib/__tests__/register-command.test.ts +85 -0
- package/src/cli/lib/daemon-credential-client.ts +4 -5
- package/src/cli/lib/nested-value.ts +44 -0
- package/src/cli/lib/open-browser.ts +36 -0
- package/src/cli/lib/register-command.ts +19 -0
- package/src/cli/lib/time-ago.ts +34 -0
- package/src/cli/program.ts +2 -4
- package/src/cli/utils/__tests__/conversation-id.test.ts +66 -0
- package/src/cli/utils/__tests__/parse-duration.test.ts +49 -0
- package/src/cli/utils/conversation-id.ts +30 -0
- package/src/cli/utils/parse-duration.ts +41 -0
- package/src/config/acp-defaults.test.ts +5 -1
- package/src/config/acp-defaults.ts +11 -4
- package/src/config/bundled-skills/acp/TOOLS.json +2 -2
- package/src/config/bundled-skills/app-control/TOOLS.json +32 -0
- package/src/config/bundled-skills/contacts/SKILL.md +12 -45
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -57
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +0 -12
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -58
- package/src/config/bundled-tool-registry.ts +0 -2
- package/src/config/feature-flag-registry.json +16 -0
- package/src/config/llm-resolver.ts +16 -1
- package/src/config/loader.ts +76 -14
- package/src/config/raw-config-utils.ts +2 -30
- package/src/config/schema.ts +4 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +49 -0
- package/src/config/schemas/call-site-catalog.ts +29 -7
- package/src/config/schemas/llm-request-logs.ts +57 -0
- package/src/config/schemas/llm.ts +52 -2
- package/src/config/schemas/memory-retrospective.ts +48 -0
- package/src/config/schemas/memory-v2.ts +32 -1
- package/src/config/schemas/memory.ts +4 -0
- package/src/config/schemas/services.ts +15 -12
- package/src/config/seed-inference-profiles.ts +195 -134
- package/src/contacts/contact-store.ts +0 -61
- package/src/context/window-manager.ts +191 -5
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +79 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +109 -4
- package/src/daemon/__tests__/daemon-skill-host.test.ts +10 -4
- package/src/daemon/approval-generators.ts +23 -29
- package/src/daemon/config-watcher.ts +2 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +24 -0
- package/src/daemon/conversation-agent-loop.ts +127 -97
- package/src/daemon/conversation-error.ts +21 -0
- package/src/daemon/conversation-lifecycle.ts +46 -5
- package/src/daemon/conversation-process.ts +36 -19
- package/src/daemon/conversation-runtime-assembly.ts +14 -5
- package/src/daemon/conversation-slash.ts +175 -23
- package/src/daemon/conversation-store.ts +17 -10
- package/src/daemon/conversation-surfaces.ts +76 -12
- package/src/daemon/conversation-tool-setup.ts +24 -14
- package/src/daemon/conversation.ts +48 -9
- package/src/daemon/external-plugins-bootstrap.ts +18 -8
- package/src/daemon/guardian-action-generators.ts +7 -22
- package/src/daemon/handlers/config-model.ts +8 -126
- package/src/daemon/handlers/config-slack-channel.ts +10 -7
- package/src/daemon/handlers/config-vercel.ts +3 -1
- package/src/daemon/handlers/skills.ts +84 -5
- package/src/daemon/history-repair.ts +33 -6
- package/src/daemon/host-app-control-proxy.ts +44 -19
- package/src/daemon/host-bash-proxy.ts +85 -158
- package/src/daemon/host-browser-proxy.ts +96 -35
- package/src/daemon/host-proxy-base.ts +13 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -1
- package/src/daemon/identity-helpers.ts +19 -0
- package/src/daemon/lifecycle.ts +42 -43
- package/src/daemon/meet-host-supervisor.ts +15 -15
- package/src/daemon/memory-v2-startup.ts +9 -2
- package/src/daemon/message-protocol.ts +6 -0
- package/src/daemon/message-types/bookmarks.ts +18 -0
- package/src/daemon/message-types/conversations.ts +12 -9
- package/src/daemon/message-types/messages.ts +9 -1
- package/src/daemon/message-types/sync.ts +60 -0
- package/src/daemon/pkb-reminder-builder.test.ts +54 -13
- package/src/daemon/pkb-reminder-builder.ts +21 -7
- package/src/daemon/process-message.ts +56 -23
- package/src/daemon/server.ts +23 -18
- package/src/daemon/shutdown-handlers.ts +0 -2
- package/src/daemon/tool-setup-types.ts +9 -0
- package/src/daemon/tool-side-effects.ts +6 -4
- package/src/daemon/wake-target-adapter.ts +11 -0
- package/src/export/transcript-formatter.ts +61 -2
- package/src/filing/filing-service.ts +40 -53
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +359 -0
- package/src/heartbeat/heartbeat-run-store.ts +2 -1
- package/src/heartbeat/heartbeat-service.ts +148 -127
- package/src/home/__tests__/feed-types.test.ts +63 -131
- package/src/home/__tests__/feed-writer.test.ts +77 -278
- package/src/home/__tests__/post-connect-feed.test.ts +9 -12
- package/src/home/feed-types.ts +19 -73
- package/src/home/feed-writer.ts +25 -156
- package/src/home/post-connect-feed.ts +1 -3
- package/src/ipc/__tests__/cli-ipc.test.ts +2 -0
- package/src/ipc/__tests__/email-ipc.test.ts +506 -0
- package/src/ipc/__tests__/exit-helper.test.ts +104 -0
- package/src/ipc/__tests__/streaming-client.test.ts +237 -0
- package/src/ipc/__tests__/streaming-framing.test.ts +142 -0
- package/src/ipc/assistant-server.ts +55 -6
- package/src/ipc/cli-client.ts +370 -50
- package/src/ipc/routes/db-proxy-transaction.ts +151 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +60 -0
- package/src/ipc/skill-routes/events.ts +30 -3
- package/src/live-voice/__tests__/live-voice-session-manager.test.ts +46 -0
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +1 -0
- package/src/live-voice/live-voice-session-manager.ts +11 -4
- package/src/live-voice/live-voice-session.ts +14 -6
- package/src/memory/__tests__/bookmark-crud.test.ts +258 -0
- package/src/memory/__tests__/bookmark-schema.test.ts +181 -0
- package/src/memory/__tests__/conversation-types.test.ts +36 -0
- package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +130 -0
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +177 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +328 -0
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +213 -0
- package/src/memory/__tests__/memory-retrospective-trigger-check.test.ts +90 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +69 -0
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -0
- package/src/memory/bookmark-crud.ts +179 -0
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +31 -9
- package/src/memory/context-search/agent-protocol.ts +5 -1
- package/src/memory/context-search/agent-runner.ts +60 -85
- package/src/memory/context-search/limits.ts +1 -4
- package/src/memory/context-search/search.ts +23 -113
- package/src/memory/context-search/sources/conversations.ts +18 -6
- package/src/memory/context-search/sources/memory-v2.ts +39 -14
- package/src/memory/context-search/sources/memory.ts +7 -0
- package/src/memory/context-search/sources/workspace.ts +13 -10
- package/src/memory/context-search/types.ts +1 -1
- package/src/memory/conversation-bootstrap.ts +11 -0
- package/src/memory/conversation-crud.ts +312 -10
- package/src/memory/conversation-queries.ts +9 -5
- package/src/memory/conversation-title-service.ts +1 -0
- package/src/memory/conversation-types.ts +16 -0
- package/src/memory/db-init.ts +14 -0
- package/src/memory/embedding-backend.ts +2 -1
- package/src/memory/embedding-runtime-manager.ts +1 -2
- package/src/memory/graph/__tests__/remember-description.test.ts +55 -0
- package/src/memory/graph/conversation-graph-memory.ts +76 -5
- package/src/memory/graph/extraction.ts +4 -0
- package/src/memory/graph/graph-memory-state-store.ts +16 -3
- package/src/memory/graph/tool-handlers.ts +17 -7
- package/src/memory/graph/tools.ts +44 -5
- package/src/memory/indexer.ts +17 -0
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +13 -15
- package/src/memory/jobs/embed-concept-page.ts +45 -9
- package/src/memory/jobs-store.ts +51 -1
- package/src/memory/jobs-worker.ts +52 -3
- package/src/memory/llm-request-log-source-clickhouse.ts +317 -0
- package/src/memory/llm-request-log-source-local.ts +26 -0
- package/src/memory/llm-request-log-source.ts +97 -0
- package/src/memory/llm-request-log-store.ts +1 -1
- package/src/memory/memory-retrospective-constants.ts +13 -0
- package/src/memory/memory-retrospective-enqueue.ts +114 -0
- package/src/memory/memory-retrospective-job.ts +351 -0
- package/src/memory/memory-retrospective-startup-cleanup.ts +108 -0
- package/src/memory/memory-retrospective-state.ts +162 -0
- package/src/memory/memory-retrospective-trigger-check.ts +91 -0
- package/src/memory/memory-v2-activation-log-store.ts +49 -5
- package/src/memory/memory-v2-concept-frequency.ts +4 -0
- package/src/memory/message-content.ts +38 -1
- package/src/memory/migrations/227-add-conversation-inference-profile.ts +6 -1
- package/src/memory/migrations/228-rename-inference-profile-snake-case.ts +20 -7
- package/src/memory/migrations/229-delete-private-conversations.test.ts +70 -1
- package/src/memory/migrations/229-delete-private-conversations.ts +12 -0
- package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +16 -2
- package/src/memory/migrations/240-conversation-inference-profile-session.ts +25 -0
- package/src/memory/migrations/241-activation-state-fk-cascade.ts +50 -0
- package/src/memory/migrations/242-message-bookmarks.ts +38 -0
- package/src/memory/migrations/243-provider-connections.ts +68 -0
- package/src/memory/migrations/244-provider-connection-status-label.ts +23 -0
- package/src/memory/migrations/245-memory-retrospective-state.ts +36 -0
- package/src/memory/migrations/246-backfill-provider-connection-label.ts +81 -0
- package/src/memory/migrations/__tests__/244-provider-connection-status-label.test.ts +84 -0
- package/src/memory/migrations/__tests__/245-memory-retrospective-state.test.ts +125 -0
- package/src/memory/migrations/__tests__/246-backfill-provider-connection-label.test.ts +192 -0
- package/src/memory/migrations/index.ts +7 -0
- package/src/memory/published-pages-store.ts +16 -0
- package/src/memory/schema/bookmarks.ts +38 -0
- package/src/memory/schema/conversations.ts +2 -0
- package/src/memory/schema/index.ts +2 -0
- package/src/memory/schema/inference.ts +29 -0
- package/src/memory/schema/memory-core.ts +9 -0
- package/src/memory/search/semantic.ts +1 -4
- package/src/memory/v2/__tests__/__snapshots__/prompts-router.test.ts.snap +27 -0
- package/src/memory/v2/__tests__/activation-store.test.ts +5 -5
- package/src/memory/v2/__tests__/activation.test.ts +11 -4
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +38 -21
- package/src/memory/v2/__tests__/consolidation-job.test.ts +123 -135
- package/src/memory/v2/__tests__/edge-index.test.ts +1 -1
- package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +111 -0
- package/src/memory/v2/__tests__/injection.test.ts +628 -10
- package/src/memory/v2/__tests__/migration.test.ts +7 -3
- package/src/memory/v2/__tests__/page-index.test.ts +277 -0
- package/src/memory/v2/__tests__/page-store.test.ts +14 -1
- package/src/memory/v2/__tests__/prompts-router.test.ts +257 -0
- package/src/memory/v2/__tests__/qdrant.test.ts +72 -0
- package/src/memory/v2/__tests__/reranker.test.ts +4 -4
- package/src/memory/v2/__tests__/router.test.ts +516 -0
- package/src/memory/v2/__tests__/sim.test.ts +45 -1
- package/src/memory/v2/__tests__/skill-store.test.ts +58 -3
- package/src/memory/v2/__tests__/static-context.test.ts +7 -22
- package/src/memory/v2/__tests__/sweep-job.test.ts +95 -0
- package/src/memory/v2/activation-store.ts +34 -5
- package/src/memory/v2/activation.ts +40 -27
- package/src/memory/v2/backfill-jobs.ts +17 -84
- package/src/memory/v2/consolidation-job.ts +85 -78
- package/src/memory/v2/frontmatter-sweep.ts +91 -0
- package/src/memory/v2/injection.ts +440 -109
- package/src/memory/v2/migration.ts +117 -20
- package/src/memory/v2/page-index.ts +191 -0
- package/src/memory/v2/page-store.ts +3 -0
- package/src/memory/v2/prompts/consolidation.ts +9 -7
- package/src/memory/v2/prompts/router.ts +192 -0
- package/src/memory/v2/qdrant.ts +100 -87
- package/src/memory/v2/reranker.ts +14 -7
- package/src/memory/v2/router.ts +322 -0
- package/src/memory/v2/sim.ts +25 -12
- package/src/memory/v2/skill-store.ts +118 -29
- package/src/memory/v2/static-context.ts +16 -9
- package/src/memory/v2/sweep-job.ts +122 -96
- package/src/memory/v2/types.ts +10 -6
- package/src/memory/validation.ts +13 -0
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +182 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +199 -0
- package/src/notifications/__tests__/signal-registry.test.ts +17 -0
- package/src/notifications/adapters/platform.ts +171 -0
- package/src/notifications/conversation-pairing.ts +2 -2
- package/src/notifications/copy-composer.ts +15 -0
- package/src/notifications/destination-resolver.ts +21 -0
- package/src/notifications/emit-signal.ts +28 -1
- package/src/notifications/home-feed-side-effect.ts +111 -0
- package/src/notifications/signal.ts +5 -0
- package/src/permissions/checker.ts +12 -0
- package/src/permissions/ipc-risk-types.ts +2 -0
- package/src/plugin-api/index.ts +13 -0
- package/src/plugin-api/package.json +12 -0
- package/src/plugin-api/types.ts +62 -0
- package/src/plugins/defaults/injectors.ts +19 -3
- package/src/plugins/external-plugin-loader.ts +294 -0
- package/src/plugins/types.ts +46 -30
- package/src/plugins/user-loader.ts +64 -41
- package/src/proactive-artifact/job.test.ts +12 -4
- package/src/proactive-artifact/job.ts +4 -0
- package/src/proactive-artifact/trigger-state.test.ts +9 -0
- package/src/proactive-artifact/trigger-state.ts +4 -0
- package/src/prompts/__tests__/system-prompt.test.ts +105 -0
- package/src/prompts/system-prompt.ts +22 -1
- package/src/prompts/update-bulletin-job.ts +61 -73
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +279 -0
- package/src/providers/__tests__/inference.test.ts +288 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
- package/src/providers/__tests__/provider-secret-catalog.test.ts +6 -0
- package/src/providers/__tests__/retry-callsite.test.ts +14 -32
- package/src/providers/__tests__/satellite-connection-routing.test.ts +510 -0
- package/src/providers/__tests__/search-provider-catalog.test.ts +80 -0
- package/src/providers/anthropic/client.ts +95 -26
- package/src/providers/call-site-routing.ts +94 -16
- package/src/providers/connection-resolution.ts +163 -0
- package/src/providers/inference/__tests__/connections-status-label.test.ts +250 -0
- package/src/providers/inference/adapter-factory.ts +173 -0
- package/src/providers/inference/auth.ts +112 -0
- package/src/providers/inference/backfill.ts +196 -0
- package/src/providers/inference/connections.ts +356 -0
- package/src/providers/inference/resolve-auth.ts +65 -0
- package/src/providers/model-catalog.ts +104 -6
- package/src/providers/openai/responses-provider.ts +4 -2
- package/src/providers/provider-env-vars.ts +17 -7
- package/src/providers/provider-secret-catalog.ts +49 -30
- package/src/providers/provider-send-message.ts +41 -20
- package/src/providers/registry.ts +143 -159
- package/src/providers/retry.ts +18 -10
- package/src/providers/search-provider-catalog.ts +121 -0
- package/src/runtime/AGENTS.md +18 -5
- package/src/runtime/__tests__/background-job-runner.test.ts +357 -0
- package/src/runtime/__tests__/pre-first-message-gate.test.ts +82 -0
- package/src/runtime/actor-trust-resolver.ts +32 -10
- package/src/runtime/agent-wake.ts +35 -6
- package/src/runtime/assistant-event-hub.ts +3 -85
- package/src/runtime/auth/route-policy.ts +303 -8
- package/src/runtime/auth/same-actor.ts +2 -0
- package/src/runtime/background-job-runner.ts +339 -0
- package/src/runtime/btw-sidechain.ts +1 -0
- package/src/runtime/http-router.ts +36 -1
- package/src/runtime/http-server.ts +31 -5
- package/src/runtime/http-types.ts +2 -0
- package/src/runtime/middleware/__tests__/request-logger.test.ts +162 -0
- package/src/runtime/middleware/request-logger.ts +62 -1
- package/src/runtime/pre-first-message-gate.ts +83 -0
- package/src/runtime/routes/__tests__/backup-routes.test.ts +8 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +251 -0
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +142 -0
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +315 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +189 -0
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +15 -136
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +736 -0
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/stt-routes.test.ts +5 -1
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +384 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +6 -2
- package/src/runtime/routes/acp-routes.ts +10 -8
- package/src/runtime/routes/app-management-routes.ts +228 -3
- package/src/runtime/routes/approval-routes.ts +0 -18
- package/src/runtime/routes/audit-routes.ts +43 -0
- package/src/runtime/routes/auth-routes.ts +72 -0
- package/src/runtime/routes/avatar-routes.ts +273 -20
- package/src/runtime/routes/backup-routes.ts +406 -2
- package/src/runtime/routes/bookmark-routes.ts +154 -0
- package/src/runtime/routes/channel-verification-routes.ts +2 -1
- package/src/runtime/routes/contact-routes.ts +0 -160
- package/src/runtime/routes/conversation-cli-routes.ts +192 -0
- package/src/runtime/routes/conversation-management-routes.ts +30 -43
- package/src/runtime/routes/conversation-query-routes.ts +334 -86
- package/src/runtime/routes/conversation-routes.ts +31 -10
- package/src/runtime/routes/conversations-import-routes.ts +229 -0
- package/src/runtime/routes/credential-routes.ts +540 -0
- package/src/runtime/routes/debug-routes.ts +2 -2
- package/src/runtime/routes/document-pdf-renderer.ts +5 -1
- package/src/runtime/routes/domain-routes.ts +167 -0
- package/src/runtime/routes/email-routes.ts +603 -0
- package/src/runtime/routes/errors.ts +2 -2
- package/src/runtime/routes/events-routes.ts +192 -0
- package/src/runtime/routes/home-feed-routes.ts +6 -78
- package/src/runtime/routes/host-app-control-routes.ts +44 -2
- package/src/runtime/routes/host-browser-routes.ts +103 -22
- package/src/runtime/routes/http-adapter.ts +2 -0
- package/src/runtime/routes/identity-routes.ts +5 -0
- package/src/runtime/routes/image-generation-routes.ts +99 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +137 -1
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +87 -7
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +156 -0
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +22 -4
- package/src/runtime/routes/index.ts +36 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +312 -0
- package/src/runtime/routes/inference-profile-session-reaper.ts +98 -0
- package/src/runtime/routes/inference-profile-session-routes.ts +146 -0
- package/src/runtime/routes/inference-provider-connection-routes.ts +317 -0
- package/src/runtime/routes/inference-send-routes.ts +115 -0
- package/src/runtime/routes/integrations/twilio.ts +1 -0
- package/src/runtime/routes/mcp-auth-routes.ts +283 -9
- package/src/runtime/routes/memory-v2-routes.ts +13 -398
- package/src/runtime/routes/notification-routes.ts +2 -0
- package/src/runtime/routes/oauth-apps.ts +112 -7
- package/src/runtime/routes/oauth-commands-routes.ts +1007 -0
- package/src/runtime/routes/oauth-connect-routes.ts +67 -5
- package/src/runtime/routes/oauth-providers.ts +298 -8
- package/src/runtime/routes/platform-routes.ts +336 -0
- package/src/runtime/routes/playground/inject-failures.ts +2 -1
- package/src/runtime/routes/playground/reset-circuit.ts +2 -1
- package/src/runtime/routes/playground/state.ts +2 -1
- package/src/runtime/routes/publish-routes.ts +221 -0
- package/src/runtime/routes/schedule-routes.ts +82 -0
- package/src/runtime/routes/sequence-routes.ts +291 -0
- package/src/runtime/routes/settings-routes.ts +2 -10
- package/src/runtime/routes/skills-routes.ts +31 -1
- package/src/runtime/routes/stt-routes.ts +240 -3
- package/src/runtime/routes/surface-action-routes.ts +43 -7
- package/src/runtime/routes/tts-routes.ts +67 -0
- package/src/runtime/routes/types.ts +32 -0
- package/src/runtime/routes/user-routes-cli.ts +243 -0
- package/src/runtime/routes/webhook-routes.ts +165 -0
- package/src/runtime/sync/resource-sync-events.ts +25 -0
- package/src/runtime/sync/sync-publisher.test.ts +105 -0
- package/src/runtime/sync/sync-publisher.ts +21 -0
- package/src/schedule/scheduler.ts +200 -123
- package/src/security/__tests__/provider-key-env-fallback.test.ts +12 -6
- package/src/security/secret-patterns.ts +3 -0
- package/src/sequence/engine.ts +38 -40
- package/src/subagent/manager.ts +20 -15
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +206 -0
- package/src/tools/browser/browser-execution.ts +15 -4
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +174 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +16 -13
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +24 -1
- package/src/tools/browser/cdp-client/factory.ts +66 -5
- package/src/tools/browser/runtime-check.ts +77 -0
- package/src/tools/memory/register.test.ts +3 -3
- package/src/tools/memory/register.ts +9 -1
- package/src/tools/network/__tests__/web-search.test.ts +156 -0
- package/src/tools/network/web-search.ts +280 -37
- package/src/tools/permission-checker.ts +13 -5
- package/src/tools/subagent/spawn.ts +3 -3
- package/src/tools/terminal/shell.ts +44 -0
- package/src/usage/attribution.ts +3 -2
- package/src/util/pricing.ts +86 -160
- package/src/watcher/__tests__/engine.test.ts +301 -0
- package/src/watcher/constants.ts +7 -0
- package/src/watcher/engine.ts +90 -90
- package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +6 -9
- package/src/workspace/migrations/054-seed-recall-callsite.ts +10 -1
- package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +28 -4
- package/src/workspace/migrations/069-seed-onboarding-threads.ts +8 -2
- package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +104 -0
- package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +93 -0
- package/src/workspace/migrations/074-drop-deprecated-secret-detection-keys.ts +117 -0
- package/src/workspace/migrations/075-memory-v2-bm25-b-default-reembed.ts +61 -0
- package/src/workspace/migrations/076-drop-services-inference-mode.ts +62 -0
- package/src/workspace/migrations/077-seed-memory-router-callsite.ts +89 -0
- package/src/workspace/migrations/078-release-notes-tavily-web-search.ts +66 -0
- package/src/workspace/migrations/079-home-feed-notification-only.ts +197 -0
- package/src/workspace/migrations/080-restrict-vercel-api-token-metadata.ts +182 -0
- package/src/workspace/migrations/081-backfill-bash-allowed-tools-for-injection-credentials.ts +160 -0
- package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +154 -0
- package/src/workspace/migrations/registry.ts +22 -0
- package/src/workspace/migrations/runner.ts +13 -2
- package/src/workspace/migrations/types.ts +13 -3
- package/src/workspace/provider-commit-message-generator.ts +3 -2
- package/src/__tests__/context-search-pkb-source.test.ts +0 -498
- package/src/__tests__/credentials-cli.test.ts +0 -1225
- package/src/__tests__/memory-admin-recall.test.ts +0 -213
- package/src/approvals/__tests__/guardian-feed-event.test.ts +0 -303
- package/src/cli/commands/__tests__/email-download.test.ts +0 -260
- package/src/cli/commands/__tests__/email-list.test.ts +0 -216
- package/src/cli/commands/__tests__/email-register.test.ts +0 -186
- package/src/cli/commands/__tests__/email-send.test.ts +0 -416
- package/src/cli/commands/__tests__/email-status.test.ts +0 -185
- package/src/cli/commands/__tests__/email-unregister.test.ts +0 -168
- package/src/cli/commands/__tests__/routes.test.ts +0 -562
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +0 -454
- package/src/cli/commands/autonomy.ts +0 -365
- package/src/cli/commands/memory.ts +0 -424
- package/src/cli/commands/oauth/__tests__/connect.test.ts +0 -947
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +0 -686
- package/src/cli/commands/oauth/__tests__/mode.test.ts +0 -632
- package/src/cli/commands/oauth/__tests__/ping.test.ts +0 -631
- package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +0 -573
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +0 -330
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +0 -521
- package/src/cli/commands/oauth/__tests__/status.test.ts +0 -551
- package/src/cli/commands/oauth/__tests__/token.test.ts +0 -420
- package/src/cli/lib/daemon-avatar-client.ts +0 -37
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -87
- package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +0 -207
- package/src/daemon/__tests__/conversation-feed-event.test.ts +0 -304
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +0 -233
- package/src/home/__tests__/assistant-feed-authoring.test.ts +0 -156
- package/src/home/__tests__/emit-feed-event.test.ts +0 -169
- package/src/home/__tests__/feed-population-integration.test.ts +0 -312
- package/src/home/__tests__/feed-scheduler.test.ts +0 -222
- package/src/home/__tests__/phase5-exit-criteria.test.ts +0 -229
- package/src/home/__tests__/platform-gmail-digest.test.ts +0 -222
- package/src/home/__tests__/rollup-producer.test.ts +0 -507
- package/src/home/assistant-feed-authoring.ts +0 -135
- package/src/home/emit-feed-event.ts +0 -169
- package/src/home/feed-scheduler.ts +0 -281
- package/src/home/platform-gmail-digest.ts +0 -163
- package/src/home/rewrite-command-preview.ts +0 -66
- package/src/home/rewrite-feed-title.ts +0 -58
- package/src/home/rollup-producer.ts +0 -426
- package/src/memory/admin.ts +0 -326
- package/src/memory/context-search/sources/pkb.ts +0 -476
- package/src/memory/graph/compaction.ts +0 -299
- /package/src/cli/{commands → lib}/cache-fs.ts +0 -0
|
@@ -2,19 +2,8 @@ import { readFileSync, writeFileSync } from "node:fs";
|
|
|
2
2
|
|
|
3
3
|
import type { Command } from "commander";
|
|
4
4
|
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
resolveOAuthConnection,
|
|
8
|
-
type ResolveOAuthConnectionOptions,
|
|
9
|
-
} from "../../../oauth/connection-resolver.js";
|
|
10
|
-
import {
|
|
11
|
-
getActiveConnection,
|
|
12
|
-
getAppByProviderAndClientId,
|
|
13
|
-
getProvider,
|
|
14
|
-
} from "../../../oauth/oauth-store.js";
|
|
15
|
-
import { VellumPlatformClient } from "../../../platform/client.js";
|
|
5
|
+
import { cliIpcCall, exitFromIpcResult } from "../../../ipc/cli-client.js";
|
|
16
6
|
import { shouldOutputJson, writeOutput } from "../../output.js";
|
|
17
|
-
import { isManagedMode } from "./shared.js";
|
|
18
7
|
|
|
19
8
|
// ---------------------------------------------------------------------------
|
|
20
9
|
// Helpers
|
|
@@ -60,11 +49,12 @@ function tryJsonParse(raw: string): unknown {
|
|
|
60
49
|
* - `@<path>` reads a file
|
|
61
50
|
* - Otherwise treats as inline data
|
|
62
51
|
*
|
|
63
|
-
*
|
|
52
|
+
* File/stdin reading must happen on the CLI side (not the daemon)
|
|
53
|
+
* since stdin is attached to the CLI process and file paths are
|
|
54
|
+
* relative to the user's cwd.
|
|
64
55
|
*/
|
|
65
56
|
function readBodyData(data: string): unknown {
|
|
66
57
|
if (data === "@-") {
|
|
67
|
-
// Read stdin synchronously. Bun supports readFileSync("/dev/stdin").
|
|
68
58
|
const raw = readFileSync("/dev/stdin", "utf-8");
|
|
69
59
|
return tryJsonParse(raw);
|
|
70
60
|
}
|
|
@@ -174,348 +164,95 @@ Examples:
|
|
|
174
164
|
};
|
|
175
165
|
|
|
176
166
|
try {
|
|
177
|
-
//
|
|
178
|
-
|
|
179
|
-
// -----------------------------------------------------------------
|
|
180
|
-
const providerRow = getProvider(opts.provider);
|
|
181
|
-
if (!providerRow) {
|
|
182
|
-
writeError(
|
|
183
|
-
`Error: Unknown provider "${opts.provider}".\n\n` +
|
|
184
|
-
`Run 'assistant oauth providers list' to see available providers.\n` +
|
|
185
|
-
`If this is a custom provider, register it first with 'assistant oauth providers register --help'.`,
|
|
186
|
-
);
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
// -----------------------------------------------------------------
|
|
191
|
-
// Pre-flight check 2: Determine managed vs BYO mode
|
|
192
|
-
// -----------------------------------------------------------------
|
|
193
|
-
const managed = isManagedMode(opts.provider);
|
|
194
|
-
|
|
195
|
-
// -----------------------------------------------------------------
|
|
196
|
-
// Pre-flight check 3: Client ID not found (BYO only)
|
|
197
|
-
// -----------------------------------------------------------------
|
|
198
|
-
if (opts.clientId) {
|
|
199
|
-
if (managed) {
|
|
200
|
-
writeInfo(
|
|
201
|
-
`Warning: --client-id is ignored for platform-managed providers. The platform manages OAuth apps for "${opts.provider}".`,
|
|
202
|
-
);
|
|
203
|
-
} else {
|
|
204
|
-
const app = getAppByProviderAndClientId(
|
|
205
|
-
opts.provider,
|
|
206
|
-
opts.clientId,
|
|
207
|
-
);
|
|
208
|
-
if (!app) {
|
|
209
|
-
writeError(
|
|
210
|
-
`Error: No registered OAuth app found for "${opts.provider}" with client ID "${opts.clientId}".\n\n` +
|
|
211
|
-
`Run 'assistant oauth apps list' to see registered apps for this provider.\n` +
|
|
212
|
-
`To register a new app, run 'assistant oauth apps upsert --help'.`,
|
|
213
|
-
);
|
|
214
|
-
return;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
// -----------------------------------------------------------------
|
|
220
|
-
// Pre-flight check 4: Account not found
|
|
221
|
-
// -----------------------------------------------------------------
|
|
222
|
-
if (opts.account) {
|
|
223
|
-
if (managed) {
|
|
224
|
-
// Query platform connections to validate account
|
|
225
|
-
const client = await VellumPlatformClient.create();
|
|
226
|
-
if (client && client.platformAssistantId) {
|
|
227
|
-
const params = new URLSearchParams();
|
|
228
|
-
params.set("provider", opts.provider);
|
|
229
|
-
params.set("status", "ACTIVE");
|
|
230
|
-
params.set("account_identifier", opts.account);
|
|
231
|
-
|
|
232
|
-
const path = `/v1/assistants/${encodeURIComponent(client.platformAssistantId)}/oauth/connections/?${params.toString()}`;
|
|
233
|
-
const response = await client.fetch(path);
|
|
234
|
-
|
|
235
|
-
if (response.ok) {
|
|
236
|
-
const body = (await response.json()) as unknown;
|
|
237
|
-
const connections = (
|
|
238
|
-
Array.isArray(body)
|
|
239
|
-
? body
|
|
240
|
-
: ((body as Record<string, unknown>).results ?? [])
|
|
241
|
-
) as Array<{ id: string }>;
|
|
242
|
-
|
|
243
|
-
if (connections.length === 0) {
|
|
244
|
-
writeError(
|
|
245
|
-
`Error: No active platform connection found for "${opts.provider}" with account "${opts.account}".\n\n` +
|
|
246
|
-
`Run 'assistant oauth status ${opts.provider}' to see connected accounts for this provider.\n` +
|
|
247
|
-
`To connect a new account, run 'assistant oauth connect --help'.`,
|
|
248
|
-
);
|
|
249
|
-
return;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
} else {
|
|
253
|
-
writeInfo(
|
|
254
|
-
`Warning: Could not validate account "${opts.account}" — platform client not available. Proceeding without account validation.`,
|
|
255
|
-
);
|
|
256
|
-
}
|
|
257
|
-
} else {
|
|
258
|
-
const conn = getActiveConnection(opts.provider, {
|
|
259
|
-
clientId: opts.clientId,
|
|
260
|
-
account: opts.account,
|
|
261
|
-
});
|
|
262
|
-
if (!conn) {
|
|
263
|
-
writeError(
|
|
264
|
-
`Error: No active OAuth connection found for "${opts.provider}" with account "${opts.account}"${opts.clientId ? ` and client ID "${opts.clientId}"` : ""}.\n\n` +
|
|
265
|
-
`Run 'assistant oauth status ${opts.provider}' to see active connections.\n` +
|
|
266
|
-
`To connect a new account, run 'assistant oauth connect --help'.`,
|
|
267
|
-
);
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
// -----------------------------------------------------------------
|
|
274
|
-
// Parse URL
|
|
275
|
-
// -----------------------------------------------------------------
|
|
276
|
-
let baseUrl: string | undefined;
|
|
277
|
-
let requestPath: string;
|
|
278
|
-
const queryFromUrl: Record<string, string | string[]> = {};
|
|
279
|
-
|
|
280
|
-
if (url.startsWith("http://") || url.startsWith("https://")) {
|
|
281
|
-
const parsed = new URL(url);
|
|
282
|
-
baseUrl = `${parsed.protocol}//${parsed.host}`;
|
|
283
|
-
requestPath = parsed.pathname;
|
|
284
|
-
for (const [key, value] of parsed.searchParams.entries()) {
|
|
285
|
-
const existing = queryFromUrl[key];
|
|
286
|
-
if (existing !== undefined) {
|
|
287
|
-
queryFromUrl[key] = Array.isArray(existing)
|
|
288
|
-
? [...existing, value]
|
|
289
|
-
: [existing, value];
|
|
290
|
-
} else {
|
|
291
|
-
queryFromUrl[key] = value;
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
} else {
|
|
295
|
-
// Relative URL — extract embedded query params if present
|
|
296
|
-
const qIdx = url.indexOf("?");
|
|
297
|
-
if (qIdx !== -1) {
|
|
298
|
-
requestPath = url.slice(0, qIdx);
|
|
299
|
-
const embeddedParams = new URLSearchParams(url.slice(qIdx + 1));
|
|
300
|
-
for (const [key, value] of embeddedParams.entries()) {
|
|
301
|
-
const existing = queryFromUrl[key];
|
|
302
|
-
if (existing !== undefined) {
|
|
303
|
-
queryFromUrl[key] = Array.isArray(existing)
|
|
304
|
-
? [...existing, value]
|
|
305
|
-
: [existing, value];
|
|
306
|
-
} else {
|
|
307
|
-
queryFromUrl[key] = value;
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
} else {
|
|
311
|
-
requestPath = url;
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// -----------------------------------------------------------------
|
|
316
|
-
// Parse headers
|
|
317
|
-
// -----------------------------------------------------------------
|
|
318
|
-
const headers: Record<string, string> = {};
|
|
167
|
+
// Parse headers for verbose output (before sending to daemon)
|
|
168
|
+
const parsedHeaders: Record<string, string> = {};
|
|
319
169
|
for (const raw of opts.header) {
|
|
320
170
|
const [key, value] = parseHeader(raw);
|
|
321
|
-
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
// -----------------------------------------------------------------
|
|
325
|
-
// Resolve method
|
|
326
|
-
// -----------------------------------------------------------------
|
|
327
|
-
let method: string;
|
|
328
|
-
if (opts.head) {
|
|
329
|
-
method = "HEAD";
|
|
330
|
-
} else if (opts.request) {
|
|
331
|
-
method = opts.request.toUpperCase();
|
|
332
|
-
} else if (opts.get) {
|
|
333
|
-
method = "GET";
|
|
334
|
-
} else if (opts.data !== undefined) {
|
|
335
|
-
method = "POST";
|
|
336
|
-
} else {
|
|
337
|
-
method = "GET";
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
// -----------------------------------------------------------------
|
|
341
|
-
// Handle body / query params
|
|
342
|
-
// -----------------------------------------------------------------
|
|
343
|
-
let body: unknown = undefined;
|
|
344
|
-
const query: Record<string, string | string[]> = { ...queryFromUrl };
|
|
345
|
-
|
|
346
|
-
if (opts.data !== undefined) {
|
|
347
|
-
const rawBody = readBodyData(opts.data);
|
|
348
|
-
|
|
349
|
-
if (opts.get) {
|
|
350
|
-
// With -G, body data becomes query params
|
|
351
|
-
if (typeof rawBody === "string") {
|
|
352
|
-
// Parse as URL-encoded query params
|
|
353
|
-
const bodyParams = new URLSearchParams(rawBody);
|
|
354
|
-
for (const [key, value] of bodyParams.entries()) {
|
|
355
|
-
const existing = query[key];
|
|
356
|
-
if (existing !== undefined) {
|
|
357
|
-
query[key] = Array.isArray(existing)
|
|
358
|
-
? [...existing, value]
|
|
359
|
-
: [existing, value];
|
|
360
|
-
} else {
|
|
361
|
-
query[key] = value;
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
} else if (
|
|
365
|
-
rawBody !== null &&
|
|
366
|
-
typeof rawBody === "object" &&
|
|
367
|
-
!Array.isArray(rawBody)
|
|
368
|
-
) {
|
|
369
|
-
for (const [key, value] of Object.entries(
|
|
370
|
-
rawBody as Record<string, unknown>,
|
|
371
|
-
)) {
|
|
372
|
-
const existing = query[key];
|
|
373
|
-
const strValue = String(value);
|
|
374
|
-
if (existing !== undefined) {
|
|
375
|
-
query[key] = Array.isArray(existing)
|
|
376
|
-
? [...existing, strValue]
|
|
377
|
-
: [existing, strValue];
|
|
378
|
-
} else {
|
|
379
|
-
query[key] = strValue;
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
} else {
|
|
384
|
-
body = rawBody;
|
|
385
|
-
}
|
|
171
|
+
parsedHeaders[key] = value;
|
|
386
172
|
}
|
|
387
173
|
|
|
388
|
-
// -----------------------------------------------------------------
|
|
389
174
|
// Verbose: show request details
|
|
390
|
-
// -----------------------------------------------------------------
|
|
391
175
|
if (opts.verbose) {
|
|
392
|
-
|
|
393
|
-
|
|
176
|
+
const method = opts.head
|
|
177
|
+
? "HEAD"
|
|
178
|
+
: opts.request
|
|
179
|
+
? opts.request.toUpperCase()
|
|
180
|
+
: opts.get
|
|
181
|
+
? "GET"
|
|
182
|
+
: opts.data !== undefined
|
|
183
|
+
? "POST"
|
|
184
|
+
: "GET";
|
|
185
|
+
writeInfo(`> ${method} ${url}`);
|
|
186
|
+
for (const [key, value] of Object.entries(parsedHeaders)) {
|
|
394
187
|
writeInfo(`> ${key}: ${value}`);
|
|
395
188
|
}
|
|
396
|
-
if (baseUrl) {
|
|
397
|
-
writeInfo(`> Host: ${baseUrl}`);
|
|
398
|
-
}
|
|
399
189
|
writeInfo(`> Authorization: Bearer [REDACTED]`);
|
|
400
190
|
writeInfo(`>`);
|
|
401
191
|
}
|
|
402
192
|
|
|
403
|
-
//
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
if (opts.clientId && !managed) {
|
|
408
|
-
resolveOptions.clientId = opts.clientId;
|
|
409
|
-
}
|
|
410
|
-
if (opts.account) {
|
|
411
|
-
resolveOptions.account = opts.account;
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
let connection;
|
|
415
|
-
try {
|
|
416
|
-
connection = await resolveOAuthConnection(
|
|
417
|
-
opts.provider,
|
|
418
|
-
resolveOptions,
|
|
419
|
-
);
|
|
420
|
-
} catch (resolveErr) {
|
|
421
|
-
// Error case 5: Connection resolution failure — preserve the
|
|
422
|
-
// original error message so callers can see the actual cause
|
|
423
|
-
// (e.g. missing platform login, missing access token, provider
|
|
424
|
-
// misconfiguration) rather than a generic "no connection" hint.
|
|
425
|
-
const resolveMessage =
|
|
426
|
-
resolveErr instanceof Error
|
|
427
|
-
? resolveErr.message
|
|
428
|
-
: String(resolveErr);
|
|
429
|
-
|
|
430
|
-
if (managed) {
|
|
431
|
-
writeError(
|
|
432
|
-
`Error: ${resolveMessage}\n\n` +
|
|
433
|
-
`Run 'assistant oauth status ${opts.provider}' to check connection status.\n` +
|
|
434
|
-
`To connect, run 'assistant oauth connect --help'.`,
|
|
435
|
-
);
|
|
436
|
-
} else {
|
|
437
|
-
writeError(
|
|
438
|
-
`Error: ${resolveMessage}\n\n` +
|
|
439
|
-
`Run 'assistant oauth status ${opts.provider}' to see active connections.\n` +
|
|
440
|
-
`To connect, run 'assistant oauth connect --help'.`,
|
|
441
|
-
);
|
|
442
|
-
}
|
|
443
|
-
return;
|
|
193
|
+
// Read body data on the CLI side (file/stdin reading must happen here)
|
|
194
|
+
let parsedData: unknown;
|
|
195
|
+
if (opts.data !== undefined) {
|
|
196
|
+
parsedData = readBodyData(opts.data);
|
|
444
197
|
}
|
|
445
198
|
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
...(Object.keys(headers).length > 0 ? { headers } : {}),
|
|
451
|
-
...(body !== undefined ? { body } : {}),
|
|
452
|
-
...(baseUrl ? { baseUrl } : {}),
|
|
199
|
+
// Build IPC request body
|
|
200
|
+
const body: Record<string, unknown> = {
|
|
201
|
+
provider: opts.provider,
|
|
202
|
+
url,
|
|
453
203
|
};
|
|
204
|
+
if (opts.request) body.method = opts.request;
|
|
205
|
+
if (Object.keys(parsedHeaders).length > 0)
|
|
206
|
+
body.headers = parsedHeaders;
|
|
207
|
+
if (parsedData !== undefined) body.parsed_data = parsedData;
|
|
208
|
+
if (opts.get) body.force_get = true;
|
|
209
|
+
if (opts.head) body.head = true;
|
|
210
|
+
if (opts.account) body.account = opts.account;
|
|
211
|
+
if (opts.clientId) body.client_id = opts.clientId;
|
|
212
|
+
|
|
213
|
+
const r = await cliIpcCall<{
|
|
214
|
+
ok: boolean;
|
|
215
|
+
status: number;
|
|
216
|
+
headers: Record<string, string>;
|
|
217
|
+
body: unknown;
|
|
218
|
+
hint?: string;
|
|
219
|
+
}>("oauth_request", { body });
|
|
220
|
+
|
|
221
|
+
if (!r.ok) return exitFromIpcResult(r);
|
|
222
|
+
|
|
223
|
+
const result = r.result!;
|
|
454
224
|
|
|
455
|
-
const response = await connection.request(req);
|
|
456
|
-
|
|
457
|
-
// -----------------------------------------------------------------
|
|
458
225
|
// Non-2xx exit code
|
|
459
|
-
|
|
460
|
-
if (response.status < 200 || response.status >= 300) {
|
|
226
|
+
if (result.status < 200 || result.status >= 300) {
|
|
461
227
|
process.exitCode = 1;
|
|
462
228
|
}
|
|
463
229
|
|
|
464
|
-
//
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
let authHint: string | undefined;
|
|
468
|
-
if (response.status === 401 || response.status === 403) {
|
|
469
|
-
if (managed) {
|
|
470
|
-
authHint =
|
|
471
|
-
`Hint: Request returned HTTP ${response.status}. The OAuth token may be expired or revoked.\n\n` +
|
|
472
|
-
`Run 'assistant oauth status ${opts.provider}' to check connection health.\n` +
|
|
473
|
-
`To reconnect, run 'assistant oauth connect --help'.`;
|
|
474
|
-
} else {
|
|
475
|
-
authHint =
|
|
476
|
-
`Hint: Request returned HTTP ${response.status}. The OAuth token may be expired or revoked.\n\n` +
|
|
477
|
-
`Run 'assistant oauth status ${opts.provider}' to check connection status.\n` +
|
|
478
|
-
`To reconnect, run 'assistant oauth connect --help'.`;
|
|
479
|
-
}
|
|
480
|
-
writeInfo(authHint);
|
|
230
|
+
// Auth hint
|
|
231
|
+
if (result.hint) {
|
|
232
|
+
writeInfo(result.hint);
|
|
481
233
|
}
|
|
482
234
|
|
|
483
|
-
//
|
|
484
|
-
// Output: --json mode
|
|
485
|
-
// -----------------------------------------------------------------
|
|
235
|
+
// JSON output mode
|
|
486
236
|
if (jsonMode) {
|
|
487
|
-
|
|
488
|
-
ok: response.status >= 200 && response.status < 300,
|
|
489
|
-
status: response.status,
|
|
490
|
-
headers: response.headers,
|
|
491
|
-
body: response.body,
|
|
492
|
-
};
|
|
493
|
-
if (authHint) {
|
|
494
|
-
payload.hint = authHint;
|
|
495
|
-
}
|
|
496
|
-
writeOutput(cmd, payload);
|
|
237
|
+
writeOutput(cmd, result);
|
|
497
238
|
return;
|
|
498
239
|
}
|
|
499
240
|
|
|
500
|
-
//
|
|
501
|
-
// Output: verbose / include — response headers to stderr
|
|
502
|
-
// -----------------------------------------------------------------
|
|
241
|
+
// Verbose / include — response headers to stderr
|
|
503
242
|
if (opts.verbose || opts.include) {
|
|
504
|
-
writeInfo(`< HTTP ${
|
|
505
|
-
for (const [key, value] of Object.entries(
|
|
243
|
+
writeInfo(`< HTTP ${result.status}`);
|
|
244
|
+
for (const [key, value] of Object.entries(result.headers)) {
|
|
506
245
|
writeInfo(`< ${key}: ${value}`);
|
|
507
246
|
}
|
|
508
247
|
writeInfo(`<`);
|
|
509
248
|
}
|
|
510
249
|
|
|
511
|
-
//
|
|
512
|
-
|
|
513
|
-
// -----------------------------------------------------------------
|
|
514
|
-
if (response.body != null) {
|
|
250
|
+
// Body output (skip for null bodies — HEAD requests, 204, etc.)
|
|
251
|
+
if (result.body != null) {
|
|
515
252
|
const bodyStr =
|
|
516
|
-
typeof
|
|
517
|
-
?
|
|
518
|
-
: JSON.stringify(
|
|
253
|
+
typeof result.body === "string"
|
|
254
|
+
? result.body
|
|
255
|
+
: JSON.stringify(result.body, null, 2);
|
|
519
256
|
|
|
520
257
|
if (opts.output) {
|
|
521
258
|
writeFileSync(opts.output, bodyStr, "utf-8");
|
|
@@ -523,37 +260,10 @@ Examples:
|
|
|
523
260
|
process.stdout.write(bodyStr + "\n");
|
|
524
261
|
}
|
|
525
262
|
} else if (opts.output) {
|
|
526
|
-
// Truncate the output file so stale content from a previous run
|
|
527
|
-
// doesn't persist when the response has no body (HEAD, 204, etc.)
|
|
528
263
|
writeFileSync(opts.output, "", "utf-8");
|
|
529
264
|
}
|
|
530
265
|
} catch (err) {
|
|
531
|
-
// Error case 7: Generic/unexpected errors
|
|
532
266
|
const message = err instanceof Error ? err.message : String(err);
|
|
533
|
-
|
|
534
|
-
// BYO connections throw on persistent 401 (after refresh retry
|
|
535
|
-
// exhaustion) with a `status` property. Detect this and show the
|
|
536
|
-
// same auth hint that the response-level 401/403 check would give.
|
|
537
|
-
const errStatus =
|
|
538
|
-
err && typeof err === "object" && "status" in err
|
|
539
|
-
? (err as { status: unknown }).status
|
|
540
|
-
: undefined;
|
|
541
|
-
|
|
542
|
-
if (errStatus === 401 || errStatus === 403) {
|
|
543
|
-
const managed = isManagedMode(opts.provider);
|
|
544
|
-
const authHint = managed
|
|
545
|
-
? `Hint: Request returned HTTP ${errStatus}. The OAuth token may be expired or revoked.\n\n` +
|
|
546
|
-
`Run 'assistant oauth status ${opts.provider}' to check connection health.\n` +
|
|
547
|
-
`To reconnect, run 'assistant oauth connect --help'.`
|
|
548
|
-
: `Hint: Request returned HTTP ${errStatus}. The OAuth token may be expired or revoked.\n\n` +
|
|
549
|
-
`Run 'assistant oauth status ${opts.provider}' to check connection status.\n` +
|
|
550
|
-
`To reconnect, run 'assistant oauth connect --help'.`;
|
|
551
|
-
|
|
552
|
-
writeError(`Error: ${message}`, authHint);
|
|
553
|
-
writeInfo(authHint);
|
|
554
|
-
return;
|
|
555
|
-
}
|
|
556
|
-
|
|
557
267
|
writeError(
|
|
558
268
|
`Error: ${message}\n\n` +
|
|
559
269
|
`For provider diagnostics, run 'assistant oauth providers get ${opts.provider}'.`,
|
|
@@ -1,92 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types and helpers for OAuth CLI commands.
|
|
3
|
+
*
|
|
4
|
+
* This module provides types used across oauth CLI commands and utility
|
|
5
|
+
* functions consumed by non-oauth commands (e.g. config.ts).
|
|
6
|
+
*/
|
|
7
|
+
|
|
1
8
|
import type { Command } from "commander";
|
|
2
9
|
|
|
3
|
-
import { getConfig } from "../../../config/loader.js";
|
|
4
|
-
import {
|
|
5
|
-
getServiceMode,
|
|
6
|
-
type Services,
|
|
7
|
-
ServicesSchema,
|
|
8
|
-
} from "../../../config/schemas/services.js";
|
|
9
|
-
import { getProvider } from "../../../oauth/oauth-store.js";
|
|
10
10
|
import { VellumPlatformClient } from "../../../platform/client.js";
|
|
11
11
|
import { writeOutput } from "../../output.js";
|
|
12
12
|
|
|
13
13
|
// ---------------------------------------------------------------------------
|
|
14
|
-
//
|
|
14
|
+
// Platform connection helpers
|
|
15
15
|
// ---------------------------------------------------------------------------
|
|
16
16
|
|
|
17
|
-
export interface PlatformConnectionEntry {
|
|
18
|
-
id: string;
|
|
19
|
-
account_label?: string;
|
|
20
|
-
scopes_granted?: string[];
|
|
21
|
-
status?: string;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// ---------------------------------------------------------------------------
|
|
25
|
-
// Shared helpers
|
|
26
|
-
// ---------------------------------------------------------------------------
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Return the provider's `managedServiceConfigKey` if it exists and is a valid
|
|
30
|
-
* key in `ServicesSchema.shape`, or `null` otherwise. This centralises the
|
|
31
|
-
* lookup so that callers (e.g. `isManagedMode`, `mode.ts`) don't duplicate the
|
|
32
|
-
* validation.
|
|
33
|
-
*/
|
|
34
|
-
export function getManagedServiceConfigKey(provider: string): string | null {
|
|
35
|
-
const providerRow = getProvider(provider);
|
|
36
|
-
const managedKey = providerRow?.managedServiceConfigKey;
|
|
37
|
-
if (!managedKey || !(managedKey in ServicesSchema.shape)) return null;
|
|
38
|
-
return managedKey;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Determine whether a provider is running in platform-managed mode.
|
|
43
|
-
* Returns false if config is unavailable (e.g. in test environments).
|
|
44
|
-
*/
|
|
45
|
-
export function isManagedMode(provider: string): boolean {
|
|
46
|
-
const managedKey = getManagedServiceConfigKey(provider);
|
|
47
|
-
if (!managedKey) return false;
|
|
48
|
-
try {
|
|
49
|
-
const services: Services = getConfig().services;
|
|
50
|
-
return getServiceMode(services, managedKey as keyof Services) === "managed";
|
|
51
|
-
} catch {
|
|
52
|
-
return false;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Create an authenticated platform client, or write an error and return null.
|
|
58
|
-
*/
|
|
59
|
-
export async function requirePlatformClient(
|
|
60
|
-
cmd: Command,
|
|
61
|
-
): Promise<VellumPlatformClient | null> {
|
|
62
|
-
const client = await VellumPlatformClient.create();
|
|
63
|
-
if (!client) {
|
|
64
|
-
writeOutput(cmd, {
|
|
65
|
-
ok: false,
|
|
66
|
-
error:
|
|
67
|
-
"Not connected to Vellum platform. Run `vellum platform connect` to connect first.",
|
|
68
|
-
});
|
|
69
|
-
process.exitCode = 1;
|
|
70
|
-
return null;
|
|
71
|
-
}
|
|
72
|
-
if (!client.platformAssistantId) {
|
|
73
|
-
writeOutput(cmd, {
|
|
74
|
-
ok: false,
|
|
75
|
-
error:
|
|
76
|
-
"Connected to Vellum platform but no assistant ID is configured. Ensure the assistant is registered on the platform.",
|
|
77
|
-
});
|
|
78
|
-
process.exitCode = 1;
|
|
79
|
-
return null;
|
|
80
|
-
}
|
|
81
|
-
return client;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
17
|
/**
|
|
85
18
|
* Verify that the user has connected to the Vellum platform (has stored
|
|
86
19
|
* credentials). Unlike `requirePlatformClient`, this does NOT require a
|
|
87
20
|
* platform assistant ID — it only checks that credentials exist.
|
|
88
21
|
*
|
|
89
22
|
* Writes an error and sets exitCode=1 when the user is not connected.
|
|
23
|
+
*
|
|
24
|
+
* NOTE: This is consumed by config.ts (a local-tagged command) for managed
|
|
25
|
+
* mode validation, so it must remain exported here.
|
|
90
26
|
*/
|
|
91
27
|
export async function requirePlatformConnection(
|
|
92
28
|
cmd: Command,
|
|
@@ -103,49 +39,3 @@ export async function requirePlatformConnection(
|
|
|
103
39
|
}
|
|
104
40
|
return true;
|
|
105
41
|
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Fetch active platform connections for a provider. Returns the parsed entries
|
|
109
|
-
* or writes an error and returns null.
|
|
110
|
-
*
|
|
111
|
-
* When `silent` is true the helper returns null on HTTP errors without writing
|
|
112
|
-
* any output — useful inside polling loops where transient failures should be
|
|
113
|
-
* quietly retried rather than emitting multiple error lines.
|
|
114
|
-
*/
|
|
115
|
-
export async function fetchActiveConnections(
|
|
116
|
-
client: VellumPlatformClient,
|
|
117
|
-
provider: string,
|
|
118
|
-
cmd: Command,
|
|
119
|
-
options?: { silent?: boolean },
|
|
120
|
-
): Promise<PlatformConnectionEntry[] | null> {
|
|
121
|
-
const params = new URLSearchParams();
|
|
122
|
-
params.set("provider", provider);
|
|
123
|
-
params.set("status", "ACTIVE");
|
|
124
|
-
|
|
125
|
-
const path = `/v1/assistants/${encodeURIComponent(client.platformAssistantId)}/oauth/connections/?${params.toString()}`;
|
|
126
|
-
const response = await client.fetch(path);
|
|
127
|
-
|
|
128
|
-
if (!response.ok) {
|
|
129
|
-
if (!options?.silent) {
|
|
130
|
-
const hint =
|
|
131
|
-
response.status === 401 || response.status === 403
|
|
132
|
-
? `. Your platform session may have expired. Run \`vellum platform connect\` to reconnect.`
|
|
133
|
-
: "";
|
|
134
|
-
writeOutput(cmd, {
|
|
135
|
-
ok: false,
|
|
136
|
-
error: `Platform returned HTTP ${response.status}${hint}`,
|
|
137
|
-
});
|
|
138
|
-
process.exitCode = 1;
|
|
139
|
-
}
|
|
140
|
-
return null;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const body = (await response.json()) as unknown;
|
|
144
|
-
|
|
145
|
-
// The platform returns either a flat array or a {results: [...]} wrapper.
|
|
146
|
-
return (
|
|
147
|
-
Array.isArray(body)
|
|
148
|
-
? body
|
|
149
|
-
: ((body as Record<string, unknown>).results ?? [])
|
|
150
|
-
) as PlatformConnectionEntry[];
|
|
151
|
-
}
|