@vellumai/assistant 0.8.4 → 0.8.6
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 +33 -1
- package/ARCHITECTURE.md +3 -3
- package/bunfig.toml +6 -1
- package/docs/browser-use-architecture-phase2.md +1 -1
- package/docs/credential-execution-service.md +6 -6
- package/docs/plugins.md +4 -3
- package/knip.json +2 -1
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +12 -13
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +4 -1
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +16 -14
- package/openapi.yaml +2748 -216
- package/package.json +1 -1
- package/src/__tests__/actor-token-service.test.ts +3 -2
- package/src/__tests__/agent-loop-exit-reason.test.ts +102 -9
- package/src/__tests__/agent-loop-override-profile.test.ts +2 -1
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +1 -0
- package/src/__tests__/agent-wake-override-profile.test.ts +1 -0
- package/src/__tests__/always-loaded-tools-guard.test.ts +2 -2
- package/src/__tests__/annotate-risk-options.test.ts +1 -0
- package/src/__tests__/anthropic-provider.test.ts +34 -37
- package/src/__tests__/approval-cascade.test.ts +1 -0
- package/src/__tests__/approval-routes-http.test.ts +9 -13
- package/src/__tests__/assert-not-live-db.ts +79 -0
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +12 -28
- package/src/__tests__/audit-log-rotation.test.ts +72 -18
- package/src/__tests__/auto-analysis-end-to-end.test.ts +6 -6
- package/src/__tests__/background-workers-disk-pressure.test.ts +8 -11
- package/src/__tests__/browser-skill-endstate.test.ts +3 -3
- package/src/__tests__/btw-routes.test.ts +5 -5
- package/src/__tests__/call-controller.test.ts +3 -3
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
- package/src/__tests__/channel-approval-routes.test.ts +3 -2
- package/src/__tests__/channel-guardian.test.ts +6 -5
- package/src/__tests__/channel-readiness-slack-remote.test.ts +175 -0
- package/src/__tests__/channel-reply-delivery.test.ts +35 -0
- package/src/__tests__/channel-retry-sweep.test.ts +320 -3
- package/src/__tests__/checker.test.ts +18 -27
- package/src/__tests__/compaction-events.test.ts +2 -0
- package/src/__tests__/compaction-trail-store.test.ts +264 -0
- package/src/__tests__/compactor-call-site-logging.test.ts +215 -0
- package/src/__tests__/compactor-preserved-tail-count.test.ts +1 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +12 -16
- package/src/__tests__/computer-use-tools.test.ts +14 -18
- package/src/__tests__/config-loader-backfill.test.ts +13 -28
- package/src/__tests__/config-loader-corrupt.test.ts +5 -5
- package/src/__tests__/config-loader-platform-defaults.test.ts +93 -26
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +3 -3
- package/src/__tests__/config-managed-gemini-defaults.test.ts +3 -4
- package/src/__tests__/config-schema.test.ts +10 -10
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/connection-model-compat.test.ts +83 -0
- package/src/__tests__/contacts-tools.test.ts +3 -2
- package/src/__tests__/context-token-estimator.test.ts +22 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +5 -0
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +2 -1
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +55 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +231 -2
- package/src/__tests__/conversation-agent-loop.test.ts +581 -54
- package/src/__tests__/conversation-analysis-routes.test.ts +1 -0
- package/src/__tests__/conversation-app-control-instantiation.test.ts +31 -24
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -0
- package/src/__tests__/conversation-attention-store.test.ts +101 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +3 -2
- package/src/__tests__/conversation-clear-safety.test.ts +25 -25
- package/src/__tests__/conversation-confirmation-signals.test.ts +1 -0
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-error.test.ts +61 -0
- package/src/__tests__/conversation-fork-crud.test.ts +239 -15
- package/src/__tests__/conversation-fork-route.test.ts +3 -2
- package/src/__tests__/conversation-history-web-search.test.ts +1 -0
- package/src/__tests__/conversation-inference-profile-list.test.ts +3 -2
- package/src/__tests__/conversation-inference-profile-route.test.ts +3 -2
- package/src/__tests__/conversation-lifecycle.test.ts +53 -11
- package/src/__tests__/conversation-list-source.test.ts +3 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +2 -1
- package/src/__tests__/{conversation-load-cleaned-at.test.ts → conversation-load-history-stripped.test.ts} +14 -13
- package/src/__tests__/conversation-pairing.test.ts +53 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +26 -7
- package/src/__tests__/conversation-process-callsite.test.ts +1 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
- package/src/__tests__/conversation-queue.test.ts +333 -291
- package/src/__tests__/conversation-routes-disk-view.test.ts +112 -18
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +33 -8
- package/src/__tests__/conversation-routes-slash-commands.test.ts +68 -2
- package/src/__tests__/conversation-runtime-assembly.test.ts +78 -0
- package/src/__tests__/conversation-skill-tools.test.ts +40 -147
- package/src/__tests__/conversation-slash-queue.test.ts +84 -32
- package/src/__tests__/conversation-slash-unknown.test.ts +5 -0
- package/src/__tests__/conversation-speed-override.test.ts +1 -0
- package/src/__tests__/conversation-store.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +46 -0
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-standalone.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -3
- package/src/__tests__/conversation-surfaces-table-action.test.ts +7 -17
- package/src/__tests__/conversation-sync-tags.test.ts +218 -35
- package/src/__tests__/conversation-title-service.test.ts +1 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +30 -0
- package/src/__tests__/conversation-usage.test.ts +1 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +6 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -1
- package/src/__tests__/credential-broker-browser-fill.test.ts +3 -3
- package/src/__tests__/credential-broker-server-use.test.ts +5 -5
- package/src/__tests__/credential-execution-client.test.ts +72 -1
- package/src/__tests__/credential-execution-feature-gates.test.ts +19 -19
- package/src/__tests__/credential-execution-tools.test.ts +6 -6
- package/src/__tests__/credential-health-service.test.ts +252 -3
- package/src/__tests__/credential-security-invariants.test.ts +6 -5
- package/src/__tests__/credential-vault-unit.test.ts +21 -21
- package/src/__tests__/credential-vault.test.ts +5 -5
- package/src/__tests__/cross-provider-web-search.test.ts +56 -2
- package/src/__tests__/db-connection-isolation.test.ts +7 -6
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +8 -10
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +7 -10
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +9 -15
- package/src/__tests__/db-test-helpers.ts +58 -0
- package/src/__tests__/disk-pressure-guard.test.ts +58 -41
- package/src/__tests__/disk-pressure-lifecycle.test.ts +13 -10
- package/src/__tests__/disk-pressure-routes.test.ts +0 -33
- package/src/__tests__/disk-pressure-tools.test.ts +0 -4
- package/src/__tests__/dm-persistence.test.ts +26 -40
- package/src/__tests__/document-create-dedupe.test.ts +189 -0
- package/src/__tests__/document-find-replace.test.ts +3 -2
- package/src/__tests__/document-tool-security.test.ts +81 -2
- package/src/__tests__/dynamic-page-surface.test.ts +2 -2
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +5 -4
- package/src/__tests__/email-html-renderer.test.ts +12 -0
- package/src/__tests__/encrypted-store-test-helpers.ts +56 -0
- package/src/__tests__/encrypted-store.test.ts +11 -9
- package/src/__tests__/feature-flag-test-helpers.ts +53 -0
- package/src/__tests__/filing-service.test.ts +1 -0
- package/src/__tests__/first-greeting.test.ts +62 -12
- package/src/__tests__/gateway-flag-listener.test.ts +236 -0
- package/src/__tests__/gemini-provider.test.ts +104 -0
- package/src/__tests__/guardian-action-sweep.test.ts +3 -2
- package/src/__tests__/guardian-dispatch.test.ts +0 -1
- package/src/__tests__/guardian-outbound-http.test.ts +10 -7
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +48 -3
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -1
- package/src/__tests__/heartbeat-disk-pressure.test.ts +5 -0
- package/src/__tests__/heartbeat-service.test.ts +5 -0
- package/src/__tests__/helpers/mock-logger.ts +26 -0
- package/src/__tests__/host-bash-routes.test.ts +1 -0
- package/src/__tests__/host-cu-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-file-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-shell-tool.test.ts +6 -5
- package/src/__tests__/host-transfer-routes-targeted.test.ts +1 -0
- package/src/__tests__/http-conversation-lineage.test.ts +3 -2
- package/src/__tests__/http-user-message-parity.test.ts +29 -7
- package/src/__tests__/identity-intro-cache.test.ts +133 -22
- package/src/__tests__/inbound-slack-persistence.test.ts +44 -72
- package/src/__tests__/inference-profile-reaper.test.ts +3 -2
- package/src/__tests__/inference-profile-session-ipc.test.ts +3 -2
- package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
- package/src/__tests__/injector-disk-pressure.test.ts +3 -17
- package/src/__tests__/inline-skill-load-permissions.test.ts +4 -4
- package/src/__tests__/list-messages-hidden-metadata.test.ts +80 -0
- package/src/__tests__/list-messages-tool-merge.test.ts +70 -11
- package/src/__tests__/llm-context-normalization.test.ts +42 -0
- package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
- package/src/__tests__/llm-resolver.test.ts +408 -9
- package/src/__tests__/llm-schema.test.ts +1 -1
- package/src/__tests__/llm-usage-store.test.ts +66 -0
- package/src/__tests__/logger.test.ts +89 -0
- package/src/__tests__/manual-token-reconciliation.test.ts +76 -1
- package/src/__tests__/mcp-abort-signal.test.ts +16 -2
- package/src/__tests__/mcp-client-auth.test.ts +14 -0
- package/src/__tests__/media-generate-image.test.ts +31 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
- package/src/__tests__/messaging-send-tool.test.ts +1 -0
- package/src/__tests__/migration-import-from-url.test.ts +3 -3
- package/src/__tests__/mock-gateway-ipc.ts +18 -2
- package/src/__tests__/model-intents.test.ts +4 -6
- package/src/__tests__/native-web-search.test.ts +30 -2
- package/src/__tests__/notification-deep-link.test.ts +62 -0
- package/src/__tests__/notification-guardian-path.test.ts +0 -1
- package/src/__tests__/oauth-commands-routes.test.ts +37 -0
- package/src/__tests__/oauth-provider-visibility.test.ts +8 -8
- package/src/__tests__/oauth-store.test.ts +3 -2
- package/src/__tests__/onboarding-template-contract.test.ts +4 -3
- package/src/__tests__/openai-provider.test.ts +54 -9
- package/src/__tests__/openai-responses-provider.test.ts +176 -14
- package/src/__tests__/openrouter-provider-only.test.ts +27 -5
- package/src/__tests__/outbound-slack-persistence.test.ts +46 -1
- package/src/__tests__/pending-interactions-resolved-event.test.ts +0 -1
- package/src/__tests__/persistence-pipeline.test.ts +139 -1
- package/src/__tests__/persistence-secret-redaction.test.ts +83 -12
- package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
- package/src/__tests__/platform.test.ts +2 -2
- package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
- package/src/__tests__/plugin-bootstrap.test.ts +11 -13
- package/src/__tests__/plugin-tool-contribution.test.ts +50 -40
- package/src/__tests__/plugin-types.test.ts +3 -2
- package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
- package/src/__tests__/pricing.test.ts +12 -0
- package/src/__tests__/process-message-background-slack.test.ts +21 -16
- package/src/__tests__/process-message-display-content.test.ts +19 -22
- package/src/__tests__/provider-catalog-visibility.test.ts +9 -9
- package/src/__tests__/provider-platform-proxy-integration.test.ts +216 -4
- package/src/__tests__/provider-registry-ollama.test.ts +45 -22
- package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
- package/src/__tests__/recording-handler.test.ts +1 -0
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
- package/src/__tests__/registry.test.ts +84 -84
- package/src/__tests__/relay-server.test.ts +10 -10
- package/src/__tests__/require-fresh-approval.test.ts +2 -2
- package/src/__tests__/runtime-attachment-metadata.test.ts +3 -2
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
- package/src/__tests__/schedule-store.test.ts +16 -1
- package/src/__tests__/scheduler-reuse-conversation.test.ts +48 -3
- package/src/__tests__/secret-ingress-http.test.ts +5 -1
- package/src/__tests__/secure-keys.test.ts +3 -3
- package/src/__tests__/send-endpoint-busy.test.ts +81 -42
- package/src/__tests__/server-history-render.test.ts +4 -1
- package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
- package/src/__tests__/skill-feature-flags-integration.test.ts +8 -10
- package/src/__tests__/skill-feature-flags.test.ts +16 -18
- package/src/__tests__/skill-load-feature-flag.test.ts +5 -5
- package/src/__tests__/skill-projection-feature-flag.test.ts +48 -37
- package/src/__tests__/skill-projection.benchmark.test.ts +7 -13
- package/src/__tests__/skill-tool-factory.test.ts +97 -96
- package/src/__tests__/slack-channel-config.test.ts +3 -3
- package/src/__tests__/subagent-call-site-routing.test.ts +11 -3
- package/src/__tests__/subagent-disposal.test.ts +27 -8
- package/src/__tests__/subagent-fork-notifications.test.ts +24 -9
- package/src/__tests__/subagent-fork-spawn.test.ts +13 -4
- package/src/__tests__/subagent-manager-notify.test.ts +20 -8
- package/src/__tests__/subagent-notify-parent.test.ts +6 -5
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +58 -0
- package/src/__tests__/subagent-tools.test.ts +2 -1
- package/src/__tests__/suggestion-routes.test.ts +2 -0
- package/src/__tests__/sync-message-contract.test.ts +59 -0
- package/src/__tests__/system-prompt.test.ts +183 -131
- package/src/__tests__/terminal-tools.test.ts +1 -1
- package/src/__tests__/test-preload-verifier.ts +68 -0
- package/src/__tests__/test-preload.ts +32 -39
- package/src/__tests__/tool-approval-handler.test.ts +1 -5
- package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +35 -12
- package/src/__tests__/tool-executor.test.ts +64 -72
- package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
- package/src/__tests__/tool-preview-lifecycle.test.ts +1 -0
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
- package/src/__tests__/twilio-routes.test.ts +3 -2
- package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
- package/src/__tests__/usage-routes.test.ts +3 -0
- package/src/__tests__/validate-input.test.ts +381 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +3 -2
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +2 -1
- package/src/__tests__/voice-session-bridge.test.ts +37 -28
- package/src/__tests__/workspace-git-service.test.ts +6 -5
- package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
- package/src/__tests__/workspace-migration-090-memory-router-cost-optimized-profile.test.ts +326 -0
- package/src/__tests__/workspace-migration-091-retighten-migration-onboarding-thread.test.ts +166 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
- package/src/acp/prepare-agent-env.ts +78 -0
- package/src/acp/session-manager.ts +6 -7
- package/src/agent/loop.ts +88 -0
- package/src/api/README.md +127 -0
- package/src/api/constants/call-sites.ts +27 -0
- package/src/api/events/assistant-outbound-attachment.ts +51 -0
- package/src/api/events/assistant-text-delta.ts +32 -0
- package/src/api/events/assistant-turn-start.ts +33 -0
- package/src/api/events/document-comment-created.ts +48 -0
- package/src/api/events/document-comment-deleted.ts +24 -0
- package/src/api/events/document-comment-reopened.ts +25 -0
- package/src/api/events/document-comment-resolved.ts +27 -0
- package/src/api/events/generation-cancelled.ts +24 -0
- package/src/api/events/generation-handoff.ts +41 -0
- package/src/api/events/message-complete.ts +42 -0
- package/src/api/events/open-url.ts +30 -0
- package/src/api/events/relationship-state-updated.ts +25 -0
- package/src/api/events/tool-use-start.ts +32 -0
- package/src/api/index.ts +129 -0
- package/src/api/package.json +10 -0
- package/src/api/responses/llm-context-response.ts +39 -0
- package/src/api/responses/llm-request-log-entry.ts +93 -0
- package/src/api/responses/memory-recall-log.ts +65 -0
- package/src/api/responses/memory-v2-activation-log.ts +78 -0
- package/src/background-wake/background-wake-routes.test.ts +868 -0
- package/src/background-wake/platform-client.test.ts +308 -0
- package/src/background-wake/platform-client.ts +167 -0
- package/src/background-wake/publisher.ts +91 -0
- package/src/background-wake/runtime-registry.ts +24 -0
- package/src/background-wake/wake-intent-hooks.test.ts +282 -0
- package/src/calls/guardian-dispatch.ts +1 -0
- package/src/calls/voice-session-bridge.ts +4 -4
- package/src/cli/commands/__tests__/browser.test.ts +23 -5
- package/src/cli/commands/__tests__/conversations-slack.test.ts +16 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
- package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
- package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
- package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +1 -0
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
- package/src/cli/commands/__tests__/notifications.test.ts +184 -40
- package/src/cli/commands/browser.ts +247 -0
- package/src/cli/commands/channels/__tests__/channels.test.ts +143 -0
- package/src/cli/commands/channels/index.ts +229 -0
- package/src/cli/commands/domain.ts +91 -41
- package/src/cli/commands/inference.ts +93 -40
- package/src/cli/commands/memory-v2-compare-render.ts +115 -0
- package/src/cli/commands/memory-v2.ts +176 -1
- package/src/cli/commands/memory-v3-render.ts +491 -0
- package/src/cli/commands/memory-v3.ts +567 -0
- package/src/cli/commands/notifications.ts +365 -55
- package/src/cli/lib/open-browser.ts +7 -2
- package/src/cli/program.ts +4 -0
- package/src/config/assistant-feature-flags.ts +39 -46
- package/src/config/bundled-skills/document-editor/SKILL.md +16 -3
- package/src/config/bundled-skills/document-editor/TOOLS.json +18 -0
- package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
- package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
- package/src/config/bundled-skills/schedule/SKILL.md +1 -1
- package/src/config/bundled-skills/schedule/TOOLS.json +2 -2
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -0
- package/src/config/bundled-tool-registry.ts +2 -0
- package/src/config/call-site-defaults.ts +8 -7
- package/src/config/feature-flag-cache.ts +86 -0
- package/src/config/feature-flag-registry.json +33 -17
- package/src/config/llm-context-resolution.ts +10 -1
- package/src/config/llm-resolver.ts +121 -15
- package/src/config/loader.ts +4 -5
- package/src/config/schemas/__tests__/memory-v2.test.ts +228 -1
- package/src/config/schemas/call-site-catalog.ts +21 -7
- package/src/config/schemas/heartbeat.ts +1 -1
- package/src/config/schemas/llm.ts +102 -2
- package/src/config/schemas/memory-v2.ts +272 -0
- package/src/config/schemas/memory.ts +2 -1
- package/src/config/schemas/services.ts +6 -2
- package/src/config/seed-inference-profiles.ts +36 -16
- package/src/context/compactor.ts +52 -0
- package/src/context/token-estimator.ts +10 -5
- package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
- package/src/conversations/message-consolidation.ts +404 -0
- package/src/credential-execution/executable-discovery.ts +40 -0
- package/src/credential-execution/process-manager.ts +6 -2
- package/src/credential-health/credential-health-service.ts +125 -40
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +3 -6
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +13 -15
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +2 -3
- package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -0
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +25 -12
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +1 -0
- package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +107 -0
- package/src/daemon/__tests__/web-search-status-text.test.ts +1 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +390 -80
- package/src/daemon/conversation-agent-loop.ts +244 -90
- package/src/daemon/conversation-error.ts +64 -6
- package/src/daemon/conversation-lifecycle.ts +27 -22
- package/src/daemon/conversation-messaging.ts +84 -43
- package/src/daemon/conversation-process.ts +74 -37
- package/src/daemon/conversation-runtime-assembly.ts +38 -17
- package/src/daemon/conversation-skill-tools.ts +14 -30
- package/src/daemon/conversation-surfaces.ts +69 -34
- package/src/daemon/conversation-tool-setup.ts +77 -32
- package/src/daemon/conversation-usage.ts +2 -0
- package/src/daemon/conversation.ts +40 -75
- package/src/daemon/daemon-control.ts +1 -1
- package/src/daemon/daemon-skill-host.ts +9 -2
- package/src/daemon/disk-pressure-guard.ts +39 -29
- package/src/daemon/first-greeting.ts +31 -13
- package/src/daemon/handlers/config-model.test.ts +1 -0
- package/src/daemon/handlers/conversations.ts +11 -3
- package/src/daemon/handlers/shared.ts +6 -1
- package/src/daemon/host-browser-proxy.ts +5 -5
- package/src/daemon/host-cu-proxy.ts +4 -4
- package/src/daemon/host-file-proxy.ts +4 -4
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/host-transfer-proxy.ts +10 -10
- package/src/daemon/lifecycle.ts +29 -26
- package/src/daemon/mcp-reload-service.ts +1 -1
- package/src/daemon/meet-manifest-loader.ts +11 -24
- package/src/daemon/message-types/conversations.ts +22 -27
- package/src/daemon/message-types/document-comments.ts +8 -44
- package/src/daemon/message-types/home.ts +2 -14
- package/src/daemon/message-types/integrations.ts +2 -7
- package/src/daemon/message-types/messages.ts +25 -48
- package/src/daemon/message-types/subagents.ts +6 -0
- package/src/daemon/message-types/sync.ts +14 -0
- package/src/daemon/process-message.ts +9 -9
- package/src/daemon/providers-setup.ts +1 -1
- package/src/daemon/server.ts +16 -0
- package/src/daemon/shutdown-handlers.ts +24 -5
- package/src/daemon/switch-inference-profile-tool.ts +62 -0
- package/src/daemon/tool-setup-types.ts +7 -0
- package/src/daemon/wake-target-adapter.ts +10 -0
- package/src/documents/document-store.ts +38 -0
- package/src/export/__tests__/transcript-formatter.test.ts +1 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +30 -1
- package/src/heartbeat/heartbeat-service.ts +63 -0
- package/src/home/__tests__/feed-writer.test.ts +161 -0
- package/src/home/__tests__/post-connect-feed.test.ts +1 -0
- package/src/home/__tests__/suggested-prompts.test.ts +55 -59
- package/src/home/feed-writer.ts +146 -7
- package/src/home/home-greeting.ts +0 -9
- package/src/home/suggested-prompts.ts +27 -154
- package/src/ipc/__tests__/cli-ipc.test.ts +1 -0
- package/src/ipc/gateway-client.test.ts +4 -1
- package/src/ipc/gateway-flag-listener.ts +123 -0
- package/src/ipc/skill-routes/__tests__/memory.test.ts +1 -0
- package/src/ipc/skill-routes/__tests__/registries.test.ts +36 -7
- package/src/ipc/skill-routes/memory.ts +4 -3
- package/src/ipc/skill-routes/registries.ts +35 -40
- package/src/memory/__tests__/db-async-query.test.ts +165 -0
- package/src/memory/__tests__/db-maintenance.test.ts +115 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +242 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +26 -5
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +1 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +8 -0
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +1 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +31 -0
- package/src/memory/auto-analysis-enqueue.ts +5 -1
- package/src/memory/conversation-attention-store.ts +17 -3
- package/src/memory/conversation-crud.ts +423 -182
- package/src/memory/conversation-starters-cadence.ts +3 -1
- package/src/memory/conversation-title-service.ts +19 -3
- package/src/memory/db-async-query.ts +214 -0
- package/src/memory/db-connection.ts +29 -19
- package/src/memory/db-init.ts +14 -0
- package/src/memory/db-maintenance.ts +30 -21
- package/src/memory/db-singleton.ts +77 -0
- package/src/memory/delivery-channels.ts +82 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +2 -4
- package/src/memory/graph/bootstrap.ts +8 -1
- package/src/memory/graph/capability-seed.ts +7 -3
- package/src/memory/graph/conversation-graph-memory.ts +100 -17
- package/src/memory/graph/extraction.ts +1 -5
- package/src/memory/graph/graph-search.ts +7 -1
- package/src/memory/graph/retriever.test.ts +3 -3
- package/src/memory/indexer.ts +28 -18
- package/src/memory/job-handlers/cleanup.ts +76 -18
- package/src/memory/job-handlers/conversation-starters.ts +1 -4
- package/src/memory/job-handlers/embedding.test.ts +3 -2
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -2
- package/src/memory/jobs/embed-pkb-file.ts +6 -1
- package/src/memory/jobs-store.ts +14 -0
- package/src/memory/jobs-worker.ts +66 -22
- package/src/memory/llm-request-log-source-clickhouse.ts +122 -2
- package/src/memory/llm-request-log-source-local.ts +31 -0
- package/src/memory/llm-request-log-source.ts +40 -2
- package/src/memory/llm-request-log-store.ts +228 -1
- package/src/memory/llm-usage-store.ts +24 -0
- package/src/memory/memory-retrospective-enqueue.ts +8 -1
- package/src/memory/memory-retrospective-job.ts +5 -0
- package/src/memory/memory-v2-activation-log-store.ts +110 -7
- package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
- package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
- package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
- package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
- package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
- package/src/memory/migrations/265-drop-provider-connection-status.ts +26 -0
- package/src/memory/migrations/266-messages-client-message-id.ts +43 -0
- package/src/memory/migrations/index.ts +19 -0
- package/src/memory/migrations/registry.ts +33 -0
- package/src/memory/schema/conversations.ts +10 -2
- package/src/memory/schema/inference.ts +0 -1
- package/src/memory/schema/infrastructure.ts +21 -0
- package/src/memory/tool-usage-store.ts +36 -8
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +5 -2
- package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
- package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
- package/src/memory/v2/__tests__/harness-metrics.test.ts +83 -0
- package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +230 -0
- package/src/memory/v2/__tests__/harness-runner.test.ts +135 -0
- package/src/memory/v2/__tests__/injection.test.ts +127 -98
- package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
- package/src/memory/v2/__tests__/router.test.ts +171 -3
- package/src/memory/v2/__tests__/sweep-job.test.ts +6 -3
- package/src/memory/v2/harness/compare.ts +57 -0
- package/src/memory/v2/harness/metrics.ts +128 -0
- package/src/memory/v2/harness/oracle.ts +145 -0
- package/src/memory/v2/harness/replay-input.ts +240 -0
- package/src/memory/v2/harness/retriever.ts +74 -0
- package/src/memory/v2/harness/router-retriever.ts +43 -0
- package/src/memory/v2/harness/runner.ts +112 -0
- package/src/memory/v2/harness/trace.ts +64 -0
- package/src/memory/v2/injection.ts +21 -15
- package/src/memory/v2/prompts/router.ts +26 -1
- package/src/memory/v2/qdrant.ts +14 -2
- package/src/memory/v2/router.ts +171 -18
- package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
- package/src/memory/v3/__tests__/consolidation-job.test.ts +466 -0
- package/src/memory/v3/__tests__/coretrieval-seed.test.ts +270 -0
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
- package/src/memory/v3/__tests__/edges.test.ts +706 -0
- package/src/memory/v3/__tests__/filter.test.ts +560 -0
- package/src/memory/v3/__tests__/gate.test.ts +637 -0
- package/src/memory/v3/__tests__/index-composition.test.ts +291 -0
- package/src/memory/v3/__tests__/loop.test.ts +775 -0
- package/src/memory/v3/__tests__/retriever.test.ts +226 -0
- package/src/memory/v3/__tests__/scouts.test.ts +489 -0
- package/src/memory/v3/__tests__/shadow-diff.test.ts +225 -0
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +398 -0
- package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
- package/src/memory/v3/__tests__/traversal.test.ts +508 -0
- package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
- package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
- package/src/memory/v3/__tests__/tree-walk.test.ts +784 -0
- package/src/memory/v3/__tests__/validate.test.ts +277 -0
- package/src/memory/v3/auto-edges.ts +223 -0
- package/src/memory/v3/coactivation-store.ts +124 -0
- package/src/memory/v3/consolidation-job.ts +323 -0
- package/src/memory/v3/coretrieval-seed.ts +240 -0
- package/src/memory/v3/edge-learning-job.ts +160 -0
- package/src/memory/v3/edges.ts +286 -0
- package/src/memory/v3/filter.ts +286 -0
- package/src/memory/v3/gate.ts +349 -0
- package/src/memory/v3/index-composition.ts +126 -0
- package/src/memory/v3/llm-capture.ts +46 -0
- package/src/memory/v3/loop.ts +430 -0
- package/src/memory/v3/maintenance.ts +144 -0
- package/src/memory/v3/prompt-context.ts +33 -0
- package/src/memory/v3/prompts/consolidation.ts +458 -0
- package/src/memory/v3/prompts/system-prompts.ts +196 -0
- package/src/memory/v3/retriever.ts +33 -0
- package/src/memory/v3/scouts.ts +431 -0
- package/src/memory/v3/shadow-diff.ts +287 -0
- package/src/memory/v3/shadow-middleware.ts +347 -0
- package/src/memory/v3/traversal.ts +211 -0
- package/src/memory/v3/tree-index.ts +237 -0
- package/src/memory/v3/tree-store.ts +394 -0
- package/src/memory/v3/tree-walk.ts +356 -0
- package/src/memory/v3/types.ts +65 -0
- package/src/memory/v3/validate.ts +323 -0
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +1 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +1 -0
- package/src/notifications/adapters/macos.ts +18 -1
- package/src/notifications/adapters/platform.ts +1 -1
- package/src/notifications/adapters/slack.ts +45 -11
- package/src/notifications/broadcaster.ts +114 -63
- package/src/notifications/conversation-pairing.ts +23 -3
- package/src/notifications/decision-engine.ts +1 -4
- package/src/notifications/decisions-store.ts +32 -1
- package/src/notifications/deliveries-store.ts +45 -0
- package/src/notifications/edit-notification.ts +201 -0
- package/src/notifications/emit-signal.ts +40 -50
- package/src/notifications/signal.ts +10 -0
- package/src/notifications/types.ts +37 -0
- package/src/oauth/byo-connection.test.ts +67 -3
- package/src/oauth/byo-connection.ts +32 -5
- package/src/oauth/connect-orchestrator.ts +9 -0
- package/src/oauth/connection-resolver.test.ts +76 -0
- package/src/oauth/connection-resolver.ts +49 -10
- package/src/oauth/manual-token-connection.ts +51 -3
- package/src/oauth/seed-providers.ts +3 -0
- package/src/permissions/approval-policy.test.ts +19 -5
- package/src/permissions/approval-policy.ts +14 -3
- package/src/permissions/checker.ts +21 -8
- package/src/permissions/prompter.ts +3 -3
- package/src/permissions/question-prompter.ts +5 -2
- package/src/permissions/secret-prompter.ts +2 -2
- package/src/platform/client.test.ts +24 -1
- package/src/platform/client.ts +8 -0
- package/src/platform/feature-gate.ts +15 -0
- package/src/plugin-api/index.ts +4 -0
- package/src/plugin-api/types.ts +7 -33
- package/src/plugins/defaults/index.ts +6 -0
- package/src/plugins/defaults/injectors.ts +20 -19
- package/src/plugins/defaults/persistence.ts +25 -6
- package/src/plugins/external-plugin-loader.ts +5 -68
- package/src/plugins/types.ts +68 -29
- package/src/proactive-artifact/aux-message-injector.ts +17 -4
- package/src/proactive-artifact/job.test.ts +1 -0
- package/src/prompts/__tests__/system-prompt.test.ts +4 -4
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
- package/src/prompts/persona-resolver.ts +36 -21
- package/src/prompts/sections.ts +39 -7
- package/src/prompts/system-prompt.ts +84 -221
- package/src/prompts/template-detection.ts +10 -4
- package/src/prompts/templates/BOOTSTRAP.md +9 -13
- package/src/prompts/templates/IDENTITY.md +0 -2
- package/src/prompts/templates/system-sections.ts +230 -8
- package/src/providers/__tests__/connection-model-compat.test.ts +233 -0
- package/src/providers/__tests__/registry-native-web-search.test.ts +122 -0
- package/src/providers/__tests__/retry-callsite.test.ts +85 -5
- package/src/providers/anthropic/client.ts +32 -66
- package/src/providers/call-site-routing.ts +42 -6
- package/src/providers/connection-model-compat.ts +61 -0
- package/src/providers/connection-resolution.ts +47 -14
- package/src/providers/fireworks/client.ts +1 -0
- package/src/providers/gemini/client.ts +70 -6
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +0 -2
- package/src/providers/inference/__tests__/base-url-security.test.ts +2 -3
- package/src/providers/inference/__tests__/{connections-status-label.test.ts → connections-label.test.ts} +12 -111
- package/src/providers/inference/adapter-factory.ts +3 -0
- package/src/providers/inference/auth.ts +0 -8
- package/src/providers/inference/connections.ts +3 -66
- package/src/providers/inference/resolve-auth.ts +2 -3
- package/src/providers/minimax/client.ts +106 -0
- package/src/providers/model-catalog.ts +78 -1
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +157 -5
- package/src/providers/openai/chat-completions-provider.ts +116 -15
- package/src/providers/openai/codex-models.ts +20 -0
- package/src/providers/openai/responses-provider.ts +87 -30
- package/src/providers/openrouter/client.ts +13 -8
- package/src/providers/provider-send-message.ts +20 -5
- package/src/providers/registry.ts +48 -8
- package/src/providers/retry.ts +50 -7
- package/src/providers/search-provider-catalog.ts +17 -9
- package/src/providers/thinking-config.ts +26 -1
- package/src/providers/types.ts +9 -0
- package/src/providers/usage-tracking.ts +2 -0
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/__tests__/agent-wake.test.ts +1 -0
- package/src/runtime/__tests__/background-job-runner.test.ts +1 -0
- package/src/runtime/access-request-helper.ts +1 -0
- package/src/runtime/agent-wake.ts +1 -0
- package/src/runtime/assistant-event-hub.ts +76 -6
- package/src/runtime/auth/route-policy.ts +46 -0
- package/src/runtime/btw-sidechain.ts +0 -6
- package/src/runtime/channel-readiness-service.ts +68 -0
- package/src/runtime/channel-reply-delivery.ts +23 -0
- package/src/runtime/channel-retry-sweep.ts +47 -14
- package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
- package/src/runtime/http-types.ts +0 -2
- package/src/runtime/migrations/vbundle-builder.ts +12 -4
- package/src/runtime/pending-interactions.ts +0 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -0
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +406 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +204 -0
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +209 -1
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -50
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +76 -9
- package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +35 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +3 -2
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +294 -0
- package/src/runtime/routes/__tests__/task-routes.test.ts +48 -3
- package/src/runtime/routes/acp-routes-list.test.ts +3 -0
- package/src/runtime/routes/acp-routes.test.ts +255 -6
- package/src/runtime/routes/acp-routes.ts +8 -1
- package/src/runtime/routes/app-management-routes.ts +111 -4
- package/src/runtime/routes/avatar-routes.ts +10 -10
- package/src/runtime/routes/background-wake-routes.ts +356 -0
- package/src/runtime/routes/browser-tabs-routes.ts +200 -0
- package/src/runtime/routes/btw-routes.ts +4 -10
- package/src/runtime/routes/conversation-analysis-routes.ts +6 -0
- package/src/runtime/routes/conversation-cli-routes.ts +1 -1
- package/src/runtime/routes/conversation-compaction-routes.ts +263 -0
- package/src/runtime/routes/conversation-list-routes.ts +159 -4
- package/src/runtime/routes/conversation-management-routes.ts +108 -26
- package/src/runtime/routes/conversation-query-routes.ts +200 -44
- package/src/runtime/routes/conversation-routes.ts +409 -521
- package/src/runtime/routes/conversation-starter-routes.ts +6 -3
- package/src/runtime/routes/conversations-import-routes.ts +19 -6
- package/src/runtime/routes/disk-pressure-routes.ts +1 -1
- package/src/runtime/routes/documents-routes.ts +10 -1
- package/src/runtime/routes/domain-routes.ts +60 -10
- package/src/runtime/routes/email-routes.ts +5 -2
- package/src/runtime/routes/events-routes.ts +54 -10
- package/src/runtime/routes/group-routes.ts +35 -8
- package/src/runtime/routes/home-feed-routes.ts +129 -0
- package/src/runtime/routes/host-browser-routes.ts +10 -2
- package/src/runtime/routes/host-cu-routes.ts +2 -2
- package/src/runtime/routes/identity-intro-cache.ts +61 -16
- package/src/runtime/routes/identity-routes.ts +30 -9
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +530 -6
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +57 -8
- package/src/runtime/routes/index.ts +10 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
- package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
- package/src/runtime/routes/inference-provider-connection-routes.ts +5 -26
- package/src/runtime/routes/integrations/vercel.ts +15 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
- package/src/runtime/routes/llm-context-normalization.ts +7 -2
- package/src/runtime/routes/memory-item-routes.ts +8 -3
- package/src/runtime/routes/memory-v2-routes.ts +215 -5
- package/src/runtime/routes/memory-v3-routes.ts +474 -0
- package/src/runtime/routes/migration-routes.ts +32 -28
- package/src/runtime/routes/notification-routes.ts +63 -1
- package/src/runtime/routes/oauth-commands-routes.ts +6 -1
- package/src/runtime/routes/plugins-routes.ts +337 -0
- package/src/runtime/routes/rename-conversation-routes.ts +6 -2
- package/src/runtime/routes/secret-routes.ts +25 -5
- package/src/runtime/routes/settings-routes.ts +12 -11
- package/src/runtime/routes/slack-channel-routes.ts +5 -4
- package/src/runtime/routes/surface-action-routes.ts +1 -38
- package/src/runtime/routes/surface-content-routes.ts +12 -5
- package/src/runtime/routes/surface-conversation-resolver.ts +65 -0
- package/src/runtime/routes/wipe-conversation-routes.ts +3 -0
- package/src/runtime/routes/workspace-routes.ts +25 -10
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -0
- package/src/runtime/slack-dm-text-delivery.ts +177 -0
- package/src/runtime/sync/resource-sync-events.ts +106 -38
- package/src/runtime/sync/sync-publisher.test.ts +49 -0
- package/src/runtime/sync/sync-publisher.ts +2 -1
- package/src/runtime/tool-grant-request-helper.ts +1 -0
- package/src/runtime/verification-outbound-actions.ts +73 -1
- package/src/schedule/schedule-store.ts +8 -1
- package/src/schedule/scheduler.ts +111 -15
- package/src/security/__tests__/provider-key-env-fallback.test.ts +3 -3
- package/src/security/encrypted-store.ts +7 -16
- package/src/security/store-path-override.ts +61 -0
- package/src/signals/user-message.ts +5 -8
- package/src/skills/validate-input.ts +177 -0
- package/src/subagent/manager.ts +13 -13
- package/src/subagent/types.ts +6 -0
- package/src/tasks/tool-sanitizer.ts +2 -2
- package/src/telemetry/types.ts +12 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
- package/src/telemetry/usage-telemetry-reporter.ts +1 -0
- package/src/tools/acp/spawn.test.ts +119 -0
- package/src/tools/acp/spawn.ts +15 -2
- package/src/tools/apps/definitions.ts +36 -28
- package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
- package/src/tools/ask-question/ask-question-tool.ts +38 -45
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +2 -8
- package/src/tools/browser/__tests__/pinned-tabs.test.ts +70 -0
- package/src/tools/browser/browser-execution.ts +16 -3
- package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +3 -0
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +12 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +27 -1
- package/src/tools/browser/cdp-client/factory.ts +100 -17
- package/src/tools/browser/cdp-client/local-cdp-client.ts +12 -0
- package/src/tools/browser/cdp-client/types.ts +65 -0
- package/src/tools/browser/pinned-tabs.ts +96 -40
- package/src/tools/computer-use/definitions.ts +282 -336
- package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
- package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
- package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
- package/src/tools/credentials/vault.ts +3 -9
- package/src/tools/document/document-tool.ts +189 -7
- package/src/tools/execution-target.ts +18 -23
- package/src/tools/executor.ts +24 -56
- package/src/tools/filesystem/edit.ts +3 -9
- package/src/tools/filesystem/list.ts +3 -9
- package/src/tools/filesystem/read.ts +3 -9
- package/src/tools/filesystem/write.ts +3 -9
- package/src/tools/host-filesystem/edit.test.ts +1 -0
- package/src/tools/host-filesystem/edit.ts +3 -9
- package/src/tools/host-filesystem/read.test.ts +1 -0
- package/src/tools/host-filesystem/read.ts +3 -9
- package/src/tools/host-filesystem/transfer.test.ts +31 -6
- package/src/tools/host-filesystem/transfer.ts +3 -9
- package/src/tools/host-filesystem/write.test.ts +1 -0
- package/src/tools/host-filesystem/write.ts +3 -9
- package/src/tools/host-terminal/host-shell.ts +3 -9
- package/src/tools/mcp/mcp-tool-factory.ts +1 -10
- package/src/tools/memory/register.test.ts +1 -1
- package/src/tools/memory/register.ts +4 -9
- package/src/tools/network/__tests__/managed-search-proxy.test.ts +282 -0
- package/src/tools/network/__tests__/web-search.test.ts +211 -3
- package/src/tools/network/managed-search-proxy.ts +183 -0
- package/src/tools/network/web-fetch.ts +3 -9
- package/src/tools/network/web-search.ts +224 -76
- package/src/tools/policy-context.ts +3 -1
- package/src/tools/registry.ts +150 -123
- package/src/tools/schedule/create.ts +1 -1
- package/src/tools/schema-transforms.ts +1 -1
- package/src/tools/skills/execute.ts +3 -9
- package/src/tools/skills/load.ts +3 -9
- package/src/tools/skills/skill-tool-factory.ts +18 -44
- package/src/tools/subagent/notify-parent.ts +3 -9
- package/src/tools/subagent/spawn.ts +3 -0
- package/src/tools/system/request-permission.ts +3 -9
- package/src/tools/terminal/shell.ts +3 -9
- package/src/tools/tool-approval-handler.ts +10 -4
- package/src/tools/tool-defaults.ts +94 -0
- package/src/tools/tool-name-aliases.ts +72 -14
- package/src/tools/types.ts +32 -101
- package/src/tools/ui-surface/definitions.ts +104 -108
- package/src/types/onboarding-context.ts +6 -0
- package/src/usage/attribution.ts +32 -1
- package/src/usage/pricing.ts +23 -0
- package/src/usage/types.ts +12 -0
- package/src/util/browser.ts +7 -2
- package/src/util/logger.ts +16 -7
- package/src/util/platform.ts +7 -2
- package/src/util/sqlite3-runtime.ts +65 -0
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
- package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
- package/src/workspace/migrations/090-memory-router-cost-optimized-profile.ts +109 -0
- package/src/workspace/migrations/091-retighten-migration-onboarding-thread.ts +41 -0
- package/src/workspace/migrations/registry.ts +6 -0
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
- package/src/__tests__/message-complete-display-id.test.ts +0 -175
- package/src/daemon/query-complexity-router.ts +0 -75
- package/src/prompts/cache-boundary.ts +0 -8
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
resolveOAuthConnection,
|
|
24
24
|
type ResolveOAuthConnectionOptions,
|
|
25
25
|
} from "../../oauth/connection-resolver.js";
|
|
26
|
+
import { syncManualTokenConnection } from "../../oauth/manual-token-connection.js";
|
|
26
27
|
import {
|
|
27
28
|
disconnectOAuthProvider,
|
|
28
29
|
getActiveConnection,
|
|
@@ -516,6 +517,10 @@ async function handleStatus({ queryParams = {} }: RouteHandlerArgs) {
|
|
|
516
517
|
}
|
|
517
518
|
|
|
518
519
|
// BYO path
|
|
520
|
+
if (providerRow.authorizeUrl === "urn:manual-token") {
|
|
521
|
+
await syncManualTokenConnection(provider);
|
|
522
|
+
}
|
|
523
|
+
|
|
519
524
|
const allConnections = listConnections(provider);
|
|
520
525
|
const activeRows = allConnections.filter((r) => r.status === "active");
|
|
521
526
|
|
|
@@ -914,7 +919,7 @@ async function handleManagedConnect({ body = {} }: RouteHandlerArgs) {
|
|
|
914
919
|
reqBody.requested_scopes = b.scopes;
|
|
915
920
|
}
|
|
916
921
|
reqBody.redirect_after_connect =
|
|
917
|
-
b.redirect_after_connect ?? "/account/oauth/
|
|
922
|
+
b.redirect_after_connect ?? "/account/oauth/complete";
|
|
918
923
|
|
|
919
924
|
const response = await client.fetch(startPath, {
|
|
920
925
|
method: "POST",
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route handlers for the assistant plugins surface.
|
|
3
|
+
*
|
|
4
|
+
* GET /v1/plugins — list installed plugins under `<workspaceDir>/plugins/`.
|
|
5
|
+
* GET /v1/plugins/search — search the canonical GitHub catalog of installable plugins.
|
|
6
|
+
* DELETE /v1/plugins/:name — uninstall a plugin from `<workspaceDir>/plugins/<name>/`.
|
|
7
|
+
*
|
|
8
|
+
* The read-only routes are projections over the same library functions
|
|
9
|
+
* the CLI uses (`assistant plugins list`, `assistant plugins search`).
|
|
10
|
+
* The DELETE route is symmetric to `assistant plugins uninstall` and
|
|
11
|
+
* delegates to the same `uninstallPlugin` lib function. CLI / daemon /
|
|
12
|
+
* web stay aligned on what an installed or available plugin looks like.
|
|
13
|
+
*
|
|
14
|
+
* Install is intentionally not exposed here. The CLI remains the
|
|
15
|
+
* install surface because installation fetches from GitHub, applies
|
|
16
|
+
* sanitization, and writes to disk — a heavier flow than a single
|
|
17
|
+
* JSON request justifies right now.
|
|
18
|
+
*
|
|
19
|
+
* # Policy gating
|
|
20
|
+
*
|
|
21
|
+
* Every route declares `policyKey: "plugins"` + `requirePolicyEnforcement:
|
|
22
|
+
* true`. The HTTP router enforces via `enforcePolicy()` against the
|
|
23
|
+
* `plugins:GET` / `plugins/search:GET` / `plugins:DELETE` registry
|
|
24
|
+
* entries in `runtime/auth/route-policy.ts`. The IPC adapter exposes
|
|
25
|
+
* the same policies to the gateway IPC proxy, whose own policy table
|
|
26
|
+
* (`gateway/src/auth/ipc-route-policy.ts`) holds the matching entries
|
|
27
|
+
* for `plugins_list` / `plugins_search` / `plugins_uninstall`. Reads
|
|
28
|
+
* require `settings.read`; uninstall requires `settings.write`.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import { z } from "zod";
|
|
32
|
+
|
|
33
|
+
import { InvalidPluginNameError } from "../../cli/lib/install-from-github.js";
|
|
34
|
+
import {
|
|
35
|
+
type InstalledPluginInfo,
|
|
36
|
+
listInstalledPlugins,
|
|
37
|
+
} from "../../cli/lib/list-installed-plugins.js";
|
|
38
|
+
import {
|
|
39
|
+
InvalidSearchPatternError,
|
|
40
|
+
type PluginSearchMatch,
|
|
41
|
+
searchPlugins,
|
|
42
|
+
} from "../../cli/lib/search-plugins.js";
|
|
43
|
+
import {
|
|
44
|
+
PluginNotInstalledError,
|
|
45
|
+
uninstallPlugin,
|
|
46
|
+
} from "../../cli/lib/uninstall-plugin.js";
|
|
47
|
+
import {
|
|
48
|
+
BadRequestError,
|
|
49
|
+
InternalError,
|
|
50
|
+
NotFoundError,
|
|
51
|
+
} from "./errors.js";
|
|
52
|
+
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
53
|
+
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
// Schema
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
|
|
58
|
+
const pluginInfoSchema = z.object({
|
|
59
|
+
id: z
|
|
60
|
+
.string()
|
|
61
|
+
.describe(
|
|
62
|
+
"Plugin's directory name (kebab-case). Matches `assistant plugins install <id>`.",
|
|
63
|
+
),
|
|
64
|
+
name: z.string().describe("Display name. Equal to `id` today."),
|
|
65
|
+
description: z
|
|
66
|
+
.string()
|
|
67
|
+
.nullable()
|
|
68
|
+
.describe("From `package.json#description`; `null` when unknown."),
|
|
69
|
+
version: z
|
|
70
|
+
.string()
|
|
71
|
+
.nullable()
|
|
72
|
+
.describe("From `package.json#version`; `null` when unknown."),
|
|
73
|
+
path: z
|
|
74
|
+
.string()
|
|
75
|
+
.optional()
|
|
76
|
+
.describe("Absolute path to the plugin directory on the assistant host."),
|
|
77
|
+
issues: z
|
|
78
|
+
.array(z.string())
|
|
79
|
+
.optional()
|
|
80
|
+
.describe(
|
|
81
|
+
"Non-fatal issues with this entry (missing `package.json`, malformed JSON, ...). Omitted when clean.",
|
|
82
|
+
),
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
const pluginsListResponseSchema = z.object({
|
|
86
|
+
plugins: z.array(pluginInfoSchema),
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
const pluginSearchMatchSchema = z.object({
|
|
90
|
+
name: z
|
|
91
|
+
.string()
|
|
92
|
+
.describe(
|
|
93
|
+
"Directory name under `experimental/plugins/`. Matches `assistant plugins install <name>`.",
|
|
94
|
+
),
|
|
95
|
+
path: z
|
|
96
|
+
.string()
|
|
97
|
+
.describe(
|
|
98
|
+
"Repo-relative path of the match (e.g. `experimental/plugins/<name>`).",
|
|
99
|
+
),
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const pluginsSearchResponseSchema = z.object({
|
|
103
|
+
query: z
|
|
104
|
+
.string()
|
|
105
|
+
.describe("Echo of the requested query (ECMAScript regex source)."),
|
|
106
|
+
ref: z.string().describe("Git ref the catalog was listed at."),
|
|
107
|
+
matches: z
|
|
108
|
+
.array(pluginSearchMatchSchema)
|
|
109
|
+
.describe("Directory matches, sorted alphabetically by name."),
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
const pluginUninstallResponseSchema = z.object({
|
|
113
|
+
name: z
|
|
114
|
+
.string()
|
|
115
|
+
.describe(
|
|
116
|
+
"Directory name that was removed. Echoes the request's `:name` path parameter after sanitization.",
|
|
117
|
+
),
|
|
118
|
+
target: z
|
|
119
|
+
.string()
|
|
120
|
+
.describe(
|
|
121
|
+
"Absolute path that was removed on the assistant host. Useful for audit logs and confirmation toasts.",
|
|
122
|
+
),
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
// Helpers
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
|
|
129
|
+
interface PluginView {
|
|
130
|
+
id: string;
|
|
131
|
+
name: string;
|
|
132
|
+
description: string | null;
|
|
133
|
+
version: string | null;
|
|
134
|
+
path: string;
|
|
135
|
+
issues?: string[];
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function projectPlugin(entry: InstalledPluginInfo): PluginView {
|
|
139
|
+
// `id` and `name` both track the directory name. `package.json#name` can
|
|
140
|
+
// be scoped (e.g. `@vendor/plugin-name`) which is fine for npm but not
|
|
141
|
+
// what the CLI uses to install — so we don't surface it as `name`.
|
|
142
|
+
const view: PluginView = {
|
|
143
|
+
id: entry.name,
|
|
144
|
+
name: entry.name,
|
|
145
|
+
description: entry.packageJson?.description ?? null,
|
|
146
|
+
version: entry.packageJson?.version ?? null,
|
|
147
|
+
path: entry.target,
|
|
148
|
+
};
|
|
149
|
+
if (entry.issues.length > 0) {
|
|
150
|
+
view.issues = [...entry.issues];
|
|
151
|
+
}
|
|
152
|
+
return view;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function matchesQuery(plugin: PluginView, needle: string): boolean {
|
|
156
|
+
const q = needle.toLowerCase();
|
|
157
|
+
if (plugin.id.toLowerCase().includes(q)) return true;
|
|
158
|
+
if (plugin.name.toLowerCase().includes(q)) return true;
|
|
159
|
+
if (plugin.description && plugin.description.toLowerCase().includes(q)) {
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// ---------------------------------------------------------------------------
|
|
166
|
+
// Handler — list installed
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
|
|
169
|
+
function handleListPlugins({
|
|
170
|
+
queryParams = {},
|
|
171
|
+
}: RouteHandlerArgs): { plugins: PluginView[] } {
|
|
172
|
+
const q = queryParams.q?.trim();
|
|
173
|
+
const installed = listInstalledPlugins();
|
|
174
|
+
const projected = installed.map(projectPlugin);
|
|
175
|
+
const filtered = q ? projected.filter((p) => matchesQuery(p, q)) : projected;
|
|
176
|
+
return { plugins: filtered };
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
// Handler — search catalog
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
|
|
183
|
+
interface PluginsSearchResponse {
|
|
184
|
+
query: string;
|
|
185
|
+
ref: string;
|
|
186
|
+
matches: PluginSearchMatch[];
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
async function handleSearchPlugins({
|
|
190
|
+
queryParams = {},
|
|
191
|
+
}: RouteHandlerArgs): Promise<PluginsSearchResponse> {
|
|
192
|
+
// Empty string is a legitimate "match everything" query per the lib's
|
|
193
|
+
// contract — accept it without forcing the caller to pick a sentinel.
|
|
194
|
+
const query = queryParams.q ?? "";
|
|
195
|
+
const ref = queryParams.ref?.trim() || undefined;
|
|
196
|
+
|
|
197
|
+
try {
|
|
198
|
+
const result = await searchPlugins(
|
|
199
|
+
{ query, ref },
|
|
200
|
+
{ fetch: globalThis.fetch.bind(globalThis) },
|
|
201
|
+
);
|
|
202
|
+
// Re-pack `readonly` lib types into mutable copies so the route
|
|
203
|
+
// serializer's `Record<string, unknown>` contract holds. The wire
|
|
204
|
+
// shape is identical.
|
|
205
|
+
return {
|
|
206
|
+
query: result.query,
|
|
207
|
+
ref: result.ref,
|
|
208
|
+
matches: result.matches.map((m) => ({ name: m.name, path: m.path })),
|
|
209
|
+
};
|
|
210
|
+
} catch (err) {
|
|
211
|
+
if (err instanceof InvalidSearchPatternError) {
|
|
212
|
+
throw new BadRequestError(err.message);
|
|
213
|
+
}
|
|
214
|
+
throw new InternalError(
|
|
215
|
+
err instanceof Error ? err.message : "plugin catalog search failed",
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// ---------------------------------------------------------------------------
|
|
221
|
+
// Handler — uninstall
|
|
222
|
+
// ---------------------------------------------------------------------------
|
|
223
|
+
|
|
224
|
+
interface PluginUninstallResponse {
|
|
225
|
+
name: string;
|
|
226
|
+
target: string;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function handleUninstallPlugin({
|
|
230
|
+
pathParams = {},
|
|
231
|
+
}: RouteHandlerArgs): PluginUninstallResponse {
|
|
232
|
+
// The HTTP router has already URL-decoded `:name` for us; pass it
|
|
233
|
+
// through verbatim — `uninstallPlugin` runs the same
|
|
234
|
+
// `sanitizePluginName` check the CLI uses, so attacker-supplied
|
|
235
|
+
// `../escape` style names get rejected before `rmSync` is reached.
|
|
236
|
+
const rawName = pathParams.name ?? "";
|
|
237
|
+
|
|
238
|
+
try {
|
|
239
|
+
const result = uninstallPlugin({ name: rawName });
|
|
240
|
+
return { name: result.name, target: result.target };
|
|
241
|
+
} catch (err) {
|
|
242
|
+
if (err instanceof InvalidPluginNameError) {
|
|
243
|
+
throw new BadRequestError(err.message);
|
|
244
|
+
}
|
|
245
|
+
if (err instanceof PluginNotInstalledError) {
|
|
246
|
+
throw new NotFoundError(err.message);
|
|
247
|
+
}
|
|
248
|
+
throw new InternalError(
|
|
249
|
+
err instanceof Error ? err.message : "plugin uninstall failed",
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// ---------------------------------------------------------------------------
|
|
255
|
+
// Route definitions
|
|
256
|
+
// ---------------------------------------------------------------------------
|
|
257
|
+
|
|
258
|
+
export const ROUTES: RouteDefinition[] = [
|
|
259
|
+
{
|
|
260
|
+
operationId: "plugins_list",
|
|
261
|
+
endpoint: "plugins",
|
|
262
|
+
method: "GET",
|
|
263
|
+
policyKey: "plugins",
|
|
264
|
+
requirePolicyEnforcement: true,
|
|
265
|
+
summary: "List installed plugins",
|
|
266
|
+
description:
|
|
267
|
+
"Return one entry per directory under `<workspaceDir>/plugins/`, sorted alphabetically. Matches the CLI's `assistant plugins list`. Supports `?q=<text>` for case-insensitive substring matching across plugin id, name, and description.",
|
|
268
|
+
tags: ["plugins"],
|
|
269
|
+
queryParams: [
|
|
270
|
+
{
|
|
271
|
+
name: "q",
|
|
272
|
+
schema: { type: "string" },
|
|
273
|
+
description:
|
|
274
|
+
"Optional substring filter applied to plugin id, name, and description.",
|
|
275
|
+
},
|
|
276
|
+
],
|
|
277
|
+
responseBody: pluginsListResponseSchema,
|
|
278
|
+
handler: handleListPlugins,
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
operationId: "plugins_search",
|
|
282
|
+
endpoint: "plugins/search",
|
|
283
|
+
method: "GET",
|
|
284
|
+
policyKey: "plugins",
|
|
285
|
+
requirePolicyEnforcement: true,
|
|
286
|
+
summary: "Search the plugin catalog",
|
|
287
|
+
description:
|
|
288
|
+
"List installable plugins from the canonical `vellum-ai/vellum-assistant` catalog at `experimental/plugins/`. The query is an ECMAScript regex matched case-insensitively against the directory name (e.g. `memory`, `^simple`). Empty query returns every entry. Mirrors the CLI's `assistant plugins search`.",
|
|
289
|
+
tags: ["plugins"],
|
|
290
|
+
queryParams: [
|
|
291
|
+
{
|
|
292
|
+
name: "q",
|
|
293
|
+
schema: { type: "string" },
|
|
294
|
+
description:
|
|
295
|
+
"ECMAScript regex pattern matched case-insensitively against catalog directory names. Empty/missing matches everything.",
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
name: "ref",
|
|
299
|
+
schema: { type: "string" },
|
|
300
|
+
description:
|
|
301
|
+
"Optional git ref to list the catalog at. Defaults to the CLI's `DEFAULT_PLUGIN_REF` (typically `main`).",
|
|
302
|
+
},
|
|
303
|
+
],
|
|
304
|
+
responseBody: pluginsSearchResponseSchema,
|
|
305
|
+
handler: handleSearchPlugins,
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
operationId: "plugins_uninstall",
|
|
309
|
+
endpoint: "plugins/:name",
|
|
310
|
+
method: "DELETE",
|
|
311
|
+
policyKey: "plugins",
|
|
312
|
+
requirePolicyEnforcement: true,
|
|
313
|
+
summary: "Uninstall a plugin",
|
|
314
|
+
description:
|
|
315
|
+
"Remove the directory at `<workspaceDir>/plugins/<name>/`. Mirrors the CLI's `assistant plugins uninstall <name>` (without the interactive confirmation — the API caller is responsible for any prompt). The plugin name is sanitized by the same regex the CLI uses; `../escape`-style values, hidden names, and absolute paths return 400. Missing plugins return 404. The assistant must be restarted to drop the plugin from the running runtime.",
|
|
316
|
+
tags: ["plugins"],
|
|
317
|
+
pathParams: [
|
|
318
|
+
{
|
|
319
|
+
name: "name",
|
|
320
|
+
type: "string",
|
|
321
|
+
description:
|
|
322
|
+
"Directory name under `<workspaceDir>/plugins/`. Must match the kebab-case name accepted by `assistant plugins install`.",
|
|
323
|
+
},
|
|
324
|
+
],
|
|
325
|
+
responseBody: pluginUninstallResponseSchema,
|
|
326
|
+
additionalResponses: {
|
|
327
|
+
"400": {
|
|
328
|
+
description:
|
|
329
|
+
"The plugin name failed sanitization (e.g. contained slashes, dots, or uppercase letters).",
|
|
330
|
+
},
|
|
331
|
+
"404": {
|
|
332
|
+
description: "No plugin directory exists with the given name.",
|
|
333
|
+
},
|
|
334
|
+
},
|
|
335
|
+
handler: handleUninstallPlugin,
|
|
336
|
+
},
|
|
337
|
+
];
|
|
@@ -31,7 +31,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
31
31
|
description: "Update the display title of a conversation.",
|
|
32
32
|
tags: ["conversations"],
|
|
33
33
|
requestBody: RenameConversationBody,
|
|
34
|
-
handler: ({ body }) => {
|
|
34
|
+
handler: ({ body, headers }) => {
|
|
35
35
|
const parsed = RenameConversationBody.safeParse(body);
|
|
36
36
|
if (!parsed.success) {
|
|
37
37
|
throw new BadRequestError("conversationId and title are required");
|
|
@@ -46,7 +46,11 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
46
46
|
|
|
47
47
|
updateConversationTitle(conversationId, title, 0);
|
|
48
48
|
|
|
49
|
-
publishConversationTitleChanged(
|
|
49
|
+
publishConversationTitleChanged(
|
|
50
|
+
conversationId,
|
|
51
|
+
title,
|
|
52
|
+
headers?.["x-vellum-client-id"]?.trim() || undefined,
|
|
53
|
+
);
|
|
50
54
|
|
|
51
55
|
return { ok: true };
|
|
52
56
|
},
|
|
@@ -27,6 +27,7 @@ import { clearEmbeddingBackendCache } from "../../memory/embedding-backend.js";
|
|
|
27
27
|
import { syncManualTokenConnection } from "../../oauth/manual-token-connection.js";
|
|
28
28
|
import { validateAnthropicApiKey } from "../../providers/anthropic/client.js";
|
|
29
29
|
import { validateGeminiApiKey } from "../../providers/gemini/client.js";
|
|
30
|
+
import { validateMinimaxApiKey } from "../../providers/minimax/client.js";
|
|
30
31
|
import { validateOpenAIApiKey } from "../../providers/openai/client.js";
|
|
31
32
|
import { initializeProviders } from "../../providers/registry.js";
|
|
32
33
|
import { credentialKey } from "../../security/credential-key.js";
|
|
@@ -195,9 +196,21 @@ async function handleAddSecret({ body }: RouteHandlerArgs) {
|
|
|
195
196
|
);
|
|
196
197
|
return { success: false, error: validation.reason };
|
|
197
198
|
}
|
|
199
|
+
} else if (name === "minimax") {
|
|
200
|
+
const validation = await validateMinimaxApiKey(value);
|
|
201
|
+
if (!validation.valid) {
|
|
202
|
+
log.warn(
|
|
203
|
+
{ provider: name, reason: validation.reason },
|
|
204
|
+
"API key validation failed",
|
|
205
|
+
);
|
|
206
|
+
return { success: false, error: validation.reason };
|
|
207
|
+
}
|
|
198
208
|
}
|
|
199
209
|
|
|
200
|
-
const stored = await setSecureKeyAsync(
|
|
210
|
+
const stored = await setSecureKeyAsync(
|
|
211
|
+
credentialKey(name, "api_key"),
|
|
212
|
+
value,
|
|
213
|
+
);
|
|
201
214
|
if (!stored) {
|
|
202
215
|
throw new InternalError(
|
|
203
216
|
`Failed to store API key in secure storage (backend: ${getActiveBackendName()})`,
|
|
@@ -339,7 +352,9 @@ async function handleReadSecret({ body }: RouteHandlerArgs) {
|
|
|
339
352
|
|
|
340
353
|
try {
|
|
341
354
|
let accountKey: string;
|
|
342
|
-
let prefetchedResult:
|
|
355
|
+
let prefetchedResult:
|
|
356
|
+
| Awaited<ReturnType<typeof getSecureKeyResultAsync>>
|
|
357
|
+
| undefined;
|
|
343
358
|
|
|
344
359
|
if (type === "api_key") {
|
|
345
360
|
if (
|
|
@@ -350,7 +365,9 @@ async function handleReadSecret({ body }: RouteHandlerArgs) {
|
|
|
350
365
|
);
|
|
351
366
|
}
|
|
352
367
|
// Check credential namespace first; fall back to bare key only if not found and store is reachable.
|
|
353
|
-
const credResult = await getSecureKeyResultAsync(
|
|
368
|
+
const credResult = await getSecureKeyResultAsync(
|
|
369
|
+
credentialKey(name, "api_key"),
|
|
370
|
+
);
|
|
354
371
|
if (credResult.value === undefined && !credResult.unreachable) {
|
|
355
372
|
accountKey = name;
|
|
356
373
|
} else {
|
|
@@ -373,7 +390,8 @@ async function handleReadSecret({ body }: RouteHandlerArgs) {
|
|
|
373
390
|
);
|
|
374
391
|
}
|
|
375
392
|
|
|
376
|
-
const { value, unreachable } =
|
|
393
|
+
const { value, unreachable } =
|
|
394
|
+
prefetchedResult ?? (await getSecureKeyResultAsync(accountKey));
|
|
377
395
|
if (value === undefined) {
|
|
378
396
|
return { found: false, unreachable };
|
|
379
397
|
}
|
|
@@ -543,7 +561,9 @@ async function handleListSecrets() {
|
|
|
543
561
|
const field = rest.slice(slashIdx + 1);
|
|
544
562
|
if (
|
|
545
563
|
field === "api_key" &&
|
|
546
|
-
API_KEY_PROVIDERS.includes(
|
|
564
|
+
API_KEY_PROVIDERS.includes(
|
|
565
|
+
service as (typeof API_KEY_PROVIDERS)[number],
|
|
566
|
+
)
|
|
547
567
|
) {
|
|
548
568
|
return [service];
|
|
549
569
|
}
|
|
@@ -78,7 +78,10 @@ function handleVoiceConfigUpdate({ body = {} }: RouteHandlerArgs) {
|
|
|
78
78
|
// Avatar generation
|
|
79
79
|
// ---------------------------------------------------------------------------
|
|
80
80
|
|
|
81
|
-
async function handleGenerateAvatar({
|
|
81
|
+
async function handleGenerateAvatar({
|
|
82
|
+
body = {},
|
|
83
|
+
headers,
|
|
84
|
+
}: RouteHandlerArgs) {
|
|
82
85
|
const { description } = body as { description?: string };
|
|
83
86
|
if (!description?.trim()) {
|
|
84
87
|
throw new BadRequestError("Description is required.");
|
|
@@ -95,7 +98,7 @@ async function handleGenerateAvatar({ body = {} }: RouteHandlerArgs) {
|
|
|
95
98
|
|
|
96
99
|
const avatarPath = getAvatarImagePath();
|
|
97
100
|
|
|
98
|
-
publishAvatarChanged();
|
|
101
|
+
publishAvatarChanged(headers?.["x-vellum-client-id"]?.trim() || undefined);
|
|
99
102
|
|
|
100
103
|
return { ok: true, avatarPath };
|
|
101
104
|
} catch (err) {
|
|
@@ -381,14 +384,7 @@ function handleToolNamesList() {
|
|
|
381
384
|
};
|
|
382
385
|
const schemas: Record<string, SchemaShape> = {};
|
|
383
386
|
|
|
384
|
-
const rawDefs: ToolDefinition[] =
|
|
385
|
-
for (const tool of tools) {
|
|
386
|
-
try {
|
|
387
|
-
rawDefs.push(tool.getDefinition());
|
|
388
|
-
} catch {
|
|
389
|
-
// Skip tools whose definitions can't be resolved
|
|
390
|
-
}
|
|
391
|
-
}
|
|
387
|
+
const rawDefs: ToolDefinition[] = tools;
|
|
392
388
|
|
|
393
389
|
const transformedDefs = injectActivityField(rawDefs, ACTIVITY_SKIP_SET);
|
|
394
390
|
for (const def of transformedDefs) {
|
|
@@ -444,7 +440,12 @@ async function handleToolPermissionSimulate({ body = {} }: RouteHandlerArgs) {
|
|
|
444
440
|
|
|
445
441
|
try {
|
|
446
442
|
const manifestOverride = resolveManifestOverride(toolName);
|
|
447
|
-
|
|
443
|
+
// Permission Simulator path: registered tool wins, then explicit
|
|
444
|
+
// manifest override, then the standard inference rules.
|
|
445
|
+
const executionTarget =
|
|
446
|
+
getTool(toolName)?.executionTarget ??
|
|
447
|
+
manifestOverride?.execution_target ??
|
|
448
|
+
resolveExecutionTarget({ name: toolName });
|
|
448
449
|
const executionContext =
|
|
449
450
|
isInteractive === false ? "headless" : "conversation";
|
|
450
451
|
const policyContext = { executionTarget, executionContext } as const;
|
|
@@ -93,6 +93,7 @@ function reasonForSlackError(err: unknown): ResolveReason {
|
|
|
93
93
|
|
|
94
94
|
async function handleSlackChannelNameResolve({
|
|
95
95
|
pathParams = {},
|
|
96
|
+
headers,
|
|
96
97
|
}: RouteHandlerArgs): Promise<SlackChannelResolveResponse> {
|
|
97
98
|
const conversationId = pathParams.conversationId?.trim();
|
|
98
99
|
if (!conversationId) {
|
|
@@ -152,10 +153,10 @@ async function handleSlackChannelNameResolve({
|
|
|
152
153
|
}
|
|
153
154
|
|
|
154
155
|
updateExternalChatName(conversationId, channelName);
|
|
155
|
-
await publishSyncInvalidation(
|
|
156
|
-
SYNC_TAGS.conversationsList,
|
|
157
|
-
|
|
158
|
-
|
|
156
|
+
await publishSyncInvalidation(
|
|
157
|
+
[SYNC_TAGS.conversationsList, conversationMetadataSyncTag(conversationId)],
|
|
158
|
+
headers?.["x-vellum-client-id"]?.trim() || undefined,
|
|
159
|
+
);
|
|
159
160
|
|
|
160
161
|
return {
|
|
161
162
|
channelId,
|
|
@@ -11,13 +11,6 @@ import { z } from "zod";
|
|
|
11
11
|
|
|
12
12
|
import type { ChannelId } from "../../channels/types.js";
|
|
13
13
|
import { isHttpAuthDisabled } from "../../config/env.js";
|
|
14
|
-
import type { Conversation } from "../../daemon/conversation.js";
|
|
15
|
-
import {
|
|
16
|
-
findConversation,
|
|
17
|
-
findConversationBySurfaceId,
|
|
18
|
-
getOrCreateConversation,
|
|
19
|
-
} from "../../daemon/conversation-store.js";
|
|
20
|
-
import { rawGet } from "../../memory/raw-query.js";
|
|
21
14
|
import { getLogger } from "../../util/logger.js";
|
|
22
15
|
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
|
|
23
16
|
import { healGuardianBindingDrift } from "../guardian-vellum-migration.js";
|
|
@@ -27,6 +20,7 @@ import {
|
|
|
27
20
|
withSourceChannel,
|
|
28
21
|
} from "../trust-context-resolver.js";
|
|
29
22
|
import { BadRequestError, InternalError, NotFoundError, RouteError } from "./errors.js";
|
|
23
|
+
import { resolveSurfaceConversation } from "./surface-conversation-resolver.js";
|
|
30
24
|
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
31
25
|
|
|
32
26
|
const log = getLogger("surface-action-routes");
|
|
@@ -90,37 +84,6 @@ function applyTrustContext(
|
|
|
90
84
|
}
|
|
91
85
|
}
|
|
92
86
|
|
|
93
|
-
/**
|
|
94
|
-
* Resolve the conversation owning a surface, rehydrating from the DB when
|
|
95
|
-
* the in-memory lookup misses (daemon restart or LRU eviction). The DB scan
|
|
96
|
-
* is also the source of truth that the surface exists — without it,
|
|
97
|
-
* `getOrCreateConversation` would silently create a phantom conversation
|
|
98
|
-
* for any caller-supplied id.
|
|
99
|
-
*/
|
|
100
|
-
async function resolveSurfaceConversation(
|
|
101
|
-
conversationId: string | null | undefined,
|
|
102
|
-
surfaceId: string,
|
|
103
|
-
): Promise<Conversation | undefined> {
|
|
104
|
-
const found = conversationId
|
|
105
|
-
? findConversation(conversationId)
|
|
106
|
-
: findConversationBySurfaceId(surfaceId);
|
|
107
|
-
if (found) return found;
|
|
108
|
-
|
|
109
|
-
// Escape LIKE wildcards so a `surfaceId` like "%" or "_" can't match
|
|
110
|
-
// unrelated rows.
|
|
111
|
-
const escaped = surfaceId.replace(/[\\%_]/g, "\\$&");
|
|
112
|
-
const row = rawGet<{ conversation_id: string }>(
|
|
113
|
-
`SELECT conversation_id FROM messages
|
|
114
|
-
WHERE content LIKE ? ESCAPE '\\'
|
|
115
|
-
ORDER BY created_at DESC
|
|
116
|
-
LIMIT 1`,
|
|
117
|
-
`%"surfaceId":"${escaped}"%`,
|
|
118
|
-
);
|
|
119
|
-
if (!row) return undefined;
|
|
120
|
-
if (conversationId && conversationId !== row.conversation_id) return undefined;
|
|
121
|
-
return await getOrCreateConversation(row.conversation_id);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
87
|
// ---------------------------------------------------------------------------
|
|
125
88
|
// Handlers
|
|
126
89
|
// ---------------------------------------------------------------------------
|
|
@@ -2,14 +2,16 @@
|
|
|
2
2
|
* Route handler for fetching surface content by ID.
|
|
3
3
|
*
|
|
4
4
|
* GET /v1/surfaces/:surfaceId — return the full surface payload from the
|
|
5
|
-
* conversation's in-memory surface state. Used by clients to re-hydrate
|
|
6
|
-
* whose data was stripped during memory compaction
|
|
5
|
+
* conversation's in-memory surface state. Used by clients to re-hydrate
|
|
6
|
+
* surfaces whose data was stripped during memory compaction, or whose
|
|
7
|
+
* owning conversation has been evicted from the daemon's in-memory map
|
|
8
|
+
* (daemon restart, LRU eviction).
|
|
7
9
|
*/
|
|
8
10
|
import { z } from "zod";
|
|
9
11
|
|
|
10
|
-
import { findConversation } from "../../daemon/conversation-store.js";
|
|
11
12
|
import { getLogger } from "../../util/logger.js";
|
|
12
13
|
import { BadRequestError, NotFoundError } from "./errors.js";
|
|
14
|
+
import { resolveSurfaceConversation } from "./surface-conversation-resolver.js";
|
|
13
15
|
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
14
16
|
|
|
15
17
|
const log = getLogger("surface-content-routes");
|
|
@@ -18,7 +20,7 @@ const log = getLogger("surface-content-routes");
|
|
|
18
20
|
// GET /v1/surfaces/:surfaceId?conversationId=...
|
|
19
21
|
// ---------------------------------------------------------------------------
|
|
20
22
|
|
|
21
|
-
function handleGetSurfaceContent({
|
|
23
|
+
async function handleGetSurfaceContent({
|
|
22
24
|
pathParams = {},
|
|
23
25
|
queryParams = {},
|
|
24
26
|
}: RouteHandlerArgs) {
|
|
@@ -32,7 +34,12 @@ function handleGetSurfaceContent({
|
|
|
32
34
|
throw new BadRequestError("surfaceId path parameter is required");
|
|
33
35
|
}
|
|
34
36
|
|
|
35
|
-
|
|
37
|
+
// Resolve via the shared surface→conversation helper: in-memory first,
|
|
38
|
+
// falling back to a DB scan that rehydrates the conversation when the
|
|
39
|
+
// owning Conversation has been evicted or the daemon was restarted. The
|
|
40
|
+
// DB scan uses the surfaceId itself as the existence check so a stale
|
|
41
|
+
// or made-up conversationId can't materialize a phantom conversation.
|
|
42
|
+
const conversation = await resolveSurfaceConversation(conversationId, surfaceId);
|
|
36
43
|
if (!conversation) {
|
|
37
44
|
throw new NotFoundError(
|
|
38
45
|
"No active conversation found for this conversationId",
|