@vellumai/assistant 0.8.5 → 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 +1 -1
- package/bunfig.toml +6 -1
- package/docs/credential-execution-service.md +6 -6
- package/docs/plugins.md +4 -3
- 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 +1900 -166
- 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__/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-feature-flags-integration.test.ts +9 -25
- package/src/__tests__/audit-log-rotation.test.ts +2 -2
- package/src/__tests__/auto-analysis-end-to-end.test.ts +6 -6
- package/src/__tests__/background-workers-disk-pressure.test.ts +5 -8
- package/src/__tests__/browser-skill-endstate.test.ts +3 -3
- package/src/__tests__/btw-routes.test.ts +3 -2
- package/src/__tests__/call-controller.test.ts +3 -2
- package/src/__tests__/channel-approval-routes.test.ts +3 -2
- package/src/__tests__/channel-guardian.test.ts +3 -2
- 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 +12 -12
- package/src/__tests__/compaction-events.test.ts +1 -0
- package/src/__tests__/compaction-trail-store.test.ts +264 -0
- package/src/__tests__/compactor-call-site-logging.test.ts +1 -0
- package/src/__tests__/compactor-preserved-tail-count.test.ts +1 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +7 -5
- package/src/__tests__/computer-use-tools.test.ts +12 -14
- 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__/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 +1 -0
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +55 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +34 -0
- package/src/__tests__/conversation-agent-loop.test.ts +488 -2
- package/src/__tests__/conversation-analysis-routes.test.ts +1 -0
- package/src/__tests__/conversation-app-control-instantiation.test.ts +29 -19
- 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-confirmation-signals.test.ts +1 -0
- package/src/__tests__/conversation-error.test.ts +30 -0
- package/src/__tests__/conversation-fork-crud.test.ts +69 -8
- 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 +1 -0
- 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-history-stripped.test.ts +1 -0
- 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 +5 -0
- package/src/__tests__/conversation-queue.test.ts +333 -291
- package/src/__tests__/conversation-routes-disk-view.test.ts +3 -18
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +33 -8
- package/src/__tests__/conversation-routes-slash-commands.test.ts +33 -2
- package/src/__tests__/conversation-runtime-assembly.test.ts +78 -0
- package/src/__tests__/conversation-skill-tools.test.ts +38 -142
- 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-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 +128 -12
- 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 +1 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +5 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -0
- 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 +10 -12
- package/src/__tests__/credential-health-service.test.ts +252 -3
- package/src/__tests__/credential-security-invariants.test.ts +5 -5
- package/src/__tests__/credential-vault-unit.test.ts +19 -19
- 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-skill-workflow-prompt.test.ts +5 -4
- 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 +0 -1
- package/src/__tests__/gemini-provider.test.ts +26 -0
- package/src/__tests__/guardian-action-sweep.test.ts +3 -2
- package/src/__tests__/guardian-outbound-http.test.ts +3 -2
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +48 -3
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -0
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +1 -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 +5 -4
- 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__/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__/llm-context-normalization.test.ts +42 -0
- package/src/__tests__/llm-resolver.test.ts +331 -0
- package/src/__tests__/llm-schema.test.ts +1 -1
- package/src/__tests__/manual-token-reconciliation.test.ts +76 -1
- package/src/__tests__/mcp-abort-signal.test.ts +14 -0
- package/src/__tests__/mcp-client-auth.test.ts +14 -0
- 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 +3 -3
- package/src/__tests__/native-web-search.test.ts +30 -2
- package/src/__tests__/notification-deep-link.test.ts +62 -0
- 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 +3 -2
- package/src/__tests__/openai-provider.test.ts +8 -9
- package/src/__tests__/openai-responses-provider.test.ts +70 -10
- package/src/__tests__/openrouter-provider-only.test.ts +27 -5
- package/src/__tests__/outbound-slack-persistence.test.ts +46 -1
- package/src/__tests__/persistence-pipeline.test.ts +139 -1
- package/src/__tests__/persistence-secret-redaction.test.ts +83 -12
- package/src/__tests__/plugin-bootstrap.test.ts +9 -11
- package/src/__tests__/plugin-tool-contribution.test.ts +41 -38
- 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__/recording-handler.test.ts +1 -0
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
- package/src/__tests__/registry.test.ts +82 -76
- package/src/__tests__/relay-server.test.ts +10 -10
- package/src/__tests__/runtime-attachment-metadata.test.ts +3 -2
- 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__/skill-feature-flags-integration.test.ts +8 -10
- package/src/__tests__/skill-feature-flags.test.ts +14 -16
- package/src/__tests__/skill-load-feature-flag.test.ts +5 -5
- package/src/__tests__/skill-projection-feature-flag.test.ts +44 -30
- package/src/__tests__/skill-projection.benchmark.test.ts +5 -7
- package/src/__tests__/skill-tool-factory.test.ts +96 -95
- 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 +5 -4
- 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 +1 -0
- package/src/__tests__/system-prompt.test.ts +38 -0
- package/src/__tests__/test-preload-verifier.ts +68 -0
- package/src/__tests__/test-preload.ts +32 -39
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +20 -7
- package/src/__tests__/tool-executor.test.ts +55 -10
- package/src/__tests__/tool-preview-lifecycle.test.ts +1 -0
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
- package/src/__tests__/twilio-routes.test.ts +3 -2
- package/src/__tests__/validate-input.test.ts +381 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +1 -0
- 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-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/session-manager.ts +5 -6
- package/src/agent/loop.ts +80 -0
- package/src/api/README.md +124 -2
- 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/{events → api/events}/relationship-state-updated.ts +3 -3
- package/src/api/events/tool-use-start.ts +32 -0
- package/src/api/index.ts +128 -3
- 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 +687 -52
- 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 +2 -2
- 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__/conversations-slack.test.ts +16 -0
- package/src/cli/commands/__tests__/notifications.test.ts +184 -40
- package/src/cli/commands/channels/__tests__/channels.test.ts +143 -0
- package/src/cli/commands/channels/index.ts +229 -0
- package/src/cli/commands/memory-v3-render.ts +147 -0
- package/src/cli/commands/memory-v3.ts +255 -4
- package/src/cli/commands/notifications.ts +365 -55
- package/src/cli/lib/open-browser.ts +7 -2
- package/src/cli/program.ts +2 -0
- package/src/config/assistant-feature-flags.ts +23 -42
- package/src/config/bundled-skills/document-editor/SKILL.md +5 -1
- 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/call-site-defaults.ts +1 -1
- package/src/config/feature-flag-cache.ts +86 -0
- package/src/config/feature-flag-registry.json +17 -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 +15 -0
- package/src/config/schemas/heartbeat.ts +1 -1
- package/src/config/schemas/llm.ts +90 -1
- package/src/config/schemas/memory-v2.ts +26 -0
- package/src/config/schemas/services.ts +6 -2
- package/src/config/seed-inference-profiles.ts +36 -16
- package/src/context/token-estimator.ts +10 -5
- 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 +1 -2
- 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 +389 -68
- package/src/daemon/conversation-agent-loop.ts +132 -28
- package/src/daemon/conversation-error.ts +33 -5
- package/src/daemon/conversation-messaging.ts +84 -43
- package/src/daemon/conversation-process.ts +74 -37
- package/src/daemon/conversation-runtime-assembly.ts +29 -9
- package/src/daemon/conversation-skill-tools.ts +14 -30
- package/src/daemon/conversation-surfaces.ts +69 -34
- package/src/daemon/conversation-tool-setup.ts +33 -48
- package/src/daemon/conversation.ts +26 -46
- package/src/daemon/daemon-control.ts +1 -1
- package/src/daemon/daemon-skill-host.ts +9 -2
- package/src/daemon/disk-pressure-guard.ts +27 -29
- package/src/daemon/first-greeting.ts +31 -13
- package/src/daemon/handlers/shared.ts +6 -1
- package/src/daemon/lifecycle.ts +12 -12
- package/src/daemon/mcp-reload-service.ts +1 -1
- package/src/daemon/meet-manifest-loader.ts +10 -17
- package/src/daemon/message-types/conversations.ts +20 -22
- package/src/daemon/message-types/document-comments.ts +8 -44
- package/src/daemon/message-types/home.ts +2 -2
- package/src/daemon/message-types/integrations.ts +2 -7
- package/src/daemon/message-types/messages.ts +23 -38
- package/src/daemon/message-types/subagents.ts +6 -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/switch-inference-profile-tool.ts +13 -3
- package/src/daemon/tool-setup-types.ts +0 -6
- 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 +29 -0
- 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/suggested-prompts.ts +27 -145
- package/src/ipc/__tests__/cli-ipc.test.ts +1 -0
- package/src/ipc/gateway-client.test.ts +4 -1
- 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 +28 -29
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +1 -0
- 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 +1 -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/conversation-attention-store.ts +17 -3
- package/src/memory/conversation-crud.ts +352 -112
- package/src/memory/db-connection.ts +29 -19
- package/src/memory/db-init.ts +4 -0
- 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/retriever.test.ts +3 -3
- 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-worker.ts +12 -1
- package/src/memory/llm-request-log-source-clickhouse.ts +80 -0
- package/src/memory/llm-request-log-source-local.ts +24 -0
- package/src/memory/llm-request-log-source.ts +31 -0
- package/src/memory/llm-request-log-store.ts +188 -3
- package/src/memory/memory-v2-activation-log-store.ts +95 -1
- 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 +2 -0
- package/src/memory/schema/conversations.ts +9 -1
- package/src/memory/schema/inference.ts +0 -1
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +5 -2
- package/src/memory/v2/__tests__/harness-metrics.test.ts +9 -0
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +9 -4
- package/src/memory/v2/__tests__/harness-runner.test.ts +26 -0
- package/src/memory/v2/__tests__/sweep-job.test.ts +6 -3
- package/src/memory/v2/harness/metrics.ts +5 -1
- package/src/memory/v2/harness/replay-input.ts +19 -3
- package/src/memory/v2/harness/runner.ts +6 -0
- package/src/memory/v2/harness/trace.ts +6 -0
- package/src/memory/v3/__tests__/consolidation-job.test.ts +2 -4
- package/src/memory/v3/__tests__/coretrieval-seed.test.ts +270 -0
- package/src/memory/v3/__tests__/edges.test.ts +144 -1
- package/src/memory/v3/__tests__/filter.test.ts +48 -0
- package/src/memory/v3/__tests__/gate.test.ts +96 -33
- package/src/memory/v3/__tests__/index-composition.test.ts +58 -0
- package/src/memory/v3/__tests__/loop.test.ts +250 -5
- package/src/memory/v3/__tests__/scouts.test.ts +49 -0
- package/src/memory/v3/__tests__/shadow-diff.test.ts +225 -0
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +88 -2
- package/src/memory/v3/__tests__/traversal.test.ts +39 -0
- package/src/memory/v3/__tests__/tree-walk.test.ts +77 -0
- package/src/memory/v3/__tests__/validate.test.ts +32 -0
- package/src/memory/v3/coretrieval-seed.ts +240 -0
- package/src/memory/v3/edges.ts +58 -21
- package/src/memory/v3/filter.ts +27 -22
- package/src/memory/v3/gate.ts +51 -36
- package/src/memory/v3/index-composition.ts +18 -5
- package/src/memory/v3/loop.ts +65 -17
- package/src/memory/v3/scouts.ts +15 -4
- package/src/memory/v3/shadow-diff.ts +287 -0
- package/src/memory/v3/shadow-middleware.ts +44 -2
- package/src/memory/v3/traversal.ts +6 -1
- package/src/memory/v3/tree-walk.ts +6 -1
- package/src/memory/v3/validate.ts +56 -33
- 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/slack.ts +45 -11
- package/src/notifications/broadcaster.ts +114 -63
- package/src/notifications/conversation-pairing.ts +23 -3
- 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 +11 -1
- 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/platform/client.test.ts +24 -1
- package/src/platform/client.ts +8 -0
- package/src/platform/feature-gate.ts +15 -0
- package/src/plugins/defaults/injectors.ts +2 -8
- package/src/plugins/defaults/persistence.ts +25 -6
- package/src/plugins/types.ts +57 -13
- package/src/proactive-artifact/job.test.ts +1 -0
- package/src/prompts/__tests__/system-prompt.test.ts +4 -4
- package/src/prompts/system-prompt.ts +38 -40
- package/src/prompts/template-detection.ts +10 -4
- package/src/prompts/templates/BOOTSTRAP.md +7 -11
- package/src/prompts/templates/IDENTITY.md +0 -2
- package/src/providers/__tests__/connection-model-compat.test.ts +3 -4
- package/src/providers/__tests__/registry-native-web-search.test.ts +122 -0
- package/src/providers/call-site-routing.ts +33 -9
- package/src/providers/connection-model-compat.ts +23 -0
- package/src/providers/connection-resolution.ts +39 -20
- package/src/providers/fireworks/client.ts +1 -0
- package/src/providers/gemini/client.ts +24 -3
- 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/auth.ts +0 -8
- package/src/providers/inference/connections.ts +3 -66
- package/src/providers/inference/resolve-auth.ts +2 -3
- package/src/providers/model-catalog.ts +35 -1
- package/src/providers/model-intents.ts +3 -3
- 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 +110 -12
- package/src/providers/openai/codex-models.ts +2 -0
- package/src/providers/openai/responses-provider.ts +53 -53
- package/src/providers/openrouter/client.ts +13 -8
- package/src/providers/provider-send-message.ts +18 -9
- package/src/providers/registry.ts +48 -8
- package/src/providers/retry.ts +16 -4
- package/src/providers/search-provider-catalog.ts +17 -9
- package/src/providers/types.ts +9 -0
- 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/auth/route-policy.ts +10 -0
- 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/migrations/vbundle-builder.ts +3 -2
- 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 +98 -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 +51 -3
- package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +35 -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/app-management-routes.ts +111 -4
- package/src/runtime/routes/background-wake-routes.ts +188 -20
- package/src/runtime/routes/btw-routes.ts +4 -4
- package/src/runtime/routes/conversation-analysis-routes.ts +6 -0
- package/src/runtime/routes/conversation-compaction-routes.ts +263 -0
- package/src/runtime/routes/conversation-list-routes.ts +147 -0
- package/src/runtime/routes/conversation-management-routes.ts +39 -14
- package/src/runtime/routes/conversation-query-routes.ts +60 -10
- package/src/runtime/routes/conversation-routes.ts +186 -140
- package/src/runtime/routes/conversations-import-routes.ts +19 -6
- package/src/runtime/routes/documents-routes.ts +10 -1
- package/src/runtime/routes/group-routes.ts +11 -0
- package/src/runtime/routes/home-feed-routes.ts +129 -0
- 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/background-dispatch.test.ts +530 -6
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +57 -8
- package/src/runtime/routes/index.ts +2 -0
- 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-context-normalization.ts +7 -2
- package/src/runtime/routes/memory-v3-routes.ts +160 -2
- package/src/runtime/routes/migration-routes.ts +20 -13
- package/src/runtime/routes/notification-routes.ts +63 -1
- package/src/runtime/routes/oauth-commands-routes.ts +6 -1
- 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/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 +1 -1
- package/src/runtime/tool-grant-request-helper.ts +1 -0
- 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/tools/apps/definitions.ts +35 -21
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +2 -8
- package/src/tools/computer-use/definitions.ts +268 -266
- package/src/tools/document/document-tool.ts +131 -8
- package/src/tools/execution-target.ts +2 -5
- package/src/tools/executor.ts +18 -55
- package/src/tools/host-filesystem/edit.test.ts +1 -0
- package/src/tools/host-filesystem/read.test.ts +1 -0
- package/src/tools/host-filesystem/transfer.test.ts +31 -6
- package/src/tools/host-filesystem/write.test.ts +1 -0
- package/src/tools/mcp/mcp-tool-factory.ts +0 -2
- 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-search.ts +199 -44
- package/src/tools/policy-context.ts +3 -1
- package/src/tools/registry.ts +146 -103
- package/src/tools/schedule/create.ts +1 -1
- package/src/tools/skills/skill-tool-factory.ts +17 -36
- package/src/tools/subagent/spawn.ts +3 -0
- package/src/tools/tool-approval-handler.ts +10 -4
- package/src/tools/tool-name-aliases.ts +72 -14
- package/src/tools/types.ts +17 -15
- package/src/tools/ui-surface/definitions.ts +98 -86
- package/src/types/onboarding-context.ts +6 -0
- package/src/usage/attribution.ts +32 -1
- package/src/util/browser.ts +7 -2
- 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 +4 -0
package/src/api/README.md
CHANGED
|
@@ -1,5 +1,127 @@
|
|
|
1
1
|
# @vellumai/assistant-api
|
|
2
2
|
|
|
3
|
-
Public API surface for consumers of the assistant
|
|
4
|
-
evals, future external clients
|
|
3
|
+
Public API surface for consumers of the assistant runtime — web client, gateway,
|
|
4
|
+
evals, future external clients. This directory is the **source of truth** for
|
|
5
5
|
the wire contracts the assistant exposes: schemas, types, and pure helpers.
|
|
6
|
+
|
|
7
|
+
Internal assistant code imports the files in this directory via relative paths
|
|
8
|
+
(e.g. `../../api/events/open-url.js`). External consumers import the
|
|
9
|
+
materialized npm-style package `@vellumai/assistant-api`, regenerated into
|
|
10
|
+
`apps/web/node_modules/` by `apps/web/scripts/postinstall.ts`.
|
|
11
|
+
|
|
12
|
+
## Architecture
|
|
13
|
+
|
|
14
|
+
A single discriminated-union schema, `AssistantEventSchema`, covers every event
|
|
15
|
+
type whose wire contract is canonical. The web parser (`event-parser.ts`) tries
|
|
16
|
+
this schema first; events not yet covered fall through to a hand-rolled legacy
|
|
17
|
+
switch. The migration goal is to drain the switch — each event moved here
|
|
18
|
+
shrinks the legacy surface and makes wire-shape drift a compile error.
|
|
19
|
+
|
|
20
|
+
`AssistantEvent` (re-exported alongside the schema) is `z.infer<typeof
|
|
21
|
+
AssistantEventSchema>`. Consumers reference this single type rather than
|
|
22
|
+
re-listing the individual member types: as new events migrate in, they appear
|
|
23
|
+
in `AssistantEvent` automatically.
|
|
24
|
+
|
|
25
|
+
## Migration recipe
|
|
26
|
+
|
|
27
|
+
Each batch follows the same shape. Group cohesive event families (lifecycle,
|
|
28
|
+
streaming, document-comment, ui-surface, etc.) rather than migrating events
|
|
29
|
+
one at a time — the per-batch overhead is the same regardless of count.
|
|
30
|
+
|
|
31
|
+
### 1. Add the canonical schema
|
|
32
|
+
|
|
33
|
+
One file per event under `./events/`. Each schema is `.strict()` so unknown
|
|
34
|
+
fields surface as `UnknownEvent` rather than silently passing through.
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
// assistant/src/api/events/my-event.ts
|
|
38
|
+
import { z } from "zod";
|
|
39
|
+
|
|
40
|
+
export const MyEventSchema = z
|
|
41
|
+
.object({
|
|
42
|
+
type: z.literal("my_event"),
|
|
43
|
+
conversationId: z.string(),
|
|
44
|
+
// …
|
|
45
|
+
})
|
|
46
|
+
.strict();
|
|
47
|
+
|
|
48
|
+
export type MyEvent = z.infer<typeof MyEventSchema>;
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Add the type/schema re-export pair to `./index.ts`, alphabetically, and append
|
|
52
|
+
the schema to the `AssistantEventSchema` discriminated union. No other changes
|
|
53
|
+
to the canonical package are needed — `AssistantEvent` picks the new member
|
|
54
|
+
up automatically.
|
|
55
|
+
|
|
56
|
+
### 2. Adopt the canonical type in daemon code
|
|
57
|
+
|
|
58
|
+
In `assistant/src/daemon/message-types/<domain>.ts`, delete the local
|
|
59
|
+
`interface MyEvent { … }` declaration and import the canonical `MyEvent`
|
|
60
|
+
type from `../../api/events/my-event.js`. The domain-level
|
|
61
|
+
`_<Domain>ServerMessages` union alias (consumed by `message-protocol.ts`)
|
|
62
|
+
keeps its existing shape — it just references the canonical types now.
|
|
63
|
+
|
|
64
|
+
### 3. Cut over web consumers
|
|
65
|
+
|
|
66
|
+
`apps/web/src/domains/chat/api/event-types.ts` no longer needs to list the
|
|
67
|
+
migrated event in its `AssistantEvent` union — `APIAssistantEvent` covers it.
|
|
68
|
+
Drop the per-event member, leaving the union to peel off legacy entries one
|
|
69
|
+
at a time as each event migrates.
|
|
70
|
+
|
|
71
|
+
Local handler modules (e.g. `document-comment-events.ts`) keep their handler
|
|
72
|
+
functions but import the wire types directly from `@vellumai/assistant-api`.
|
|
73
|
+
Do **not** re-export the canonical types from intermediate modules — consumers
|
|
74
|
+
import them straight from the canonical package.
|
|
75
|
+
|
|
76
|
+
### 4. Delete the legacy parser cases
|
|
77
|
+
|
|
78
|
+
Remove the matching `case "my_event":` blocks from
|
|
79
|
+
`apps/web/src/domains/chat/api/event-parser.ts`. Any per-event helper
|
|
80
|
+
(`parseFooBase`, etc.) goes with them.
|
|
81
|
+
|
|
82
|
+
### 5. Tests
|
|
83
|
+
|
|
84
|
+
Add parser tests for each migrated event covering:
|
|
85
|
+
|
|
86
|
+
- happy path with all fields
|
|
87
|
+
- minimal required only
|
|
88
|
+
- missing required field → `UnknownEvent`
|
|
89
|
+
- strict mode rejects an unknown extra field → `UnknownEvent`
|
|
90
|
+
|
|
91
|
+
For happy-path tests, inline the discriminator literal in both the input and
|
|
92
|
+
the expected object. `const data = { type: "my_event", … }` widens
|
|
93
|
+
`data.type` to `string`, breaking the discriminated-union match when the
|
|
94
|
+
result is compared with `toEqual(data)`.
|
|
95
|
+
|
|
96
|
+
Handler-level tests in the consuming domain modules typically need no change
|
|
97
|
+
— the canonical types are wire-compatible with the previous local interfaces.
|
|
98
|
+
|
|
99
|
+
### 6. Local greenlight gate
|
|
100
|
+
|
|
101
|
+
Run before push, in order:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
# In apps/web — regenerate the @vellumai/assistant-api bundle
|
|
105
|
+
bun run scripts/postinstall.ts
|
|
106
|
+
|
|
107
|
+
# Type-check both packages
|
|
108
|
+
( cd assistant && bunx tsc --noEmit )
|
|
109
|
+
( cd apps/web && bunx tsc --noEmit )
|
|
110
|
+
|
|
111
|
+
# Targeted tests
|
|
112
|
+
( cd apps/web && bun test src/domains/chat/api/event-parser.test.ts )
|
|
113
|
+
|
|
114
|
+
# Lint + format the touched files
|
|
115
|
+
bunx eslint <files>
|
|
116
|
+
bunx prettier --write <files>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
`format:check` is a distinct CI gate from `lint`; format the touched files
|
|
120
|
+
before push.
|
|
121
|
+
|
|
122
|
+
## Status
|
|
123
|
+
|
|
124
|
+
The remaining legacy parser cases are tracked in the **Solve Chat SSE**
|
|
125
|
+
workstream (record `282e972a` in `workspace/data/apps/workstream-command-center/records/`).
|
|
126
|
+
Each batch lands as its own PR under the `API Events Canonical Schemas`
|
|
127
|
+
stream.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logical call-site identifiers stamped onto every `llm_request_log` row
|
|
3
|
+
* (column `call_site` — migration 264). The inspector branches on this
|
|
4
|
+
* value alone to distinguish real LLM calls (`mainAgent`,
|
|
5
|
+
* `compactionAgent`, …) from synthetic agent-error-message rows.
|
|
6
|
+
*
|
|
7
|
+
* The constants below are the wire contract; both backend (when writing
|
|
8
|
+
* a row) and frontend (when rendering one) must reference the same
|
|
9
|
+
* literal. Add new call sites here as new emit sites appear.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Marks a synthetic assistant error-message row — one the agent loop
|
|
14
|
+
* emitted because something went wrong (budget yield, out of funds, …)
|
|
15
|
+
* with no underlying LLM call. All such events cause the loop to exit,
|
|
16
|
+
* so a single generic bucket plus the existing `agent_loop_exit_reason`
|
|
17
|
+
* column is enough to discriminate which kind of error fired
|
|
18
|
+
* (`budget_yield_unrecovered`, future out-of-funds, etc.).
|
|
19
|
+
*
|
|
20
|
+
* Intentionally *not* a member of the backend's `LLMCallSite` enum:
|
|
21
|
+
* that enum binds config lookup, not the shape of the `call_site`
|
|
22
|
+
* column. Compaction-route filters that match
|
|
23
|
+
* `call_site = 'compactionAgent'` already treat this value as a
|
|
24
|
+
* non-compaction call, which is the desired floor-lookup behavior.
|
|
25
|
+
*/
|
|
26
|
+
export const CALL_SITE_SYNTHETIC_AGENT_ERROR_MESSAGE =
|
|
27
|
+
"syntheticAgentErrorMessage";
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Outbound assistant attachment — the wire shape attached to
|
|
3
|
+
* `message_complete` and `generation_handoff` SSE events when the
|
|
4
|
+
* assistant turn produced files (sandbox writes, host transfers, tool
|
|
5
|
+
* blocks that returned binary content).
|
|
6
|
+
*
|
|
7
|
+
* Shape is the daemon's emit-time projection of `UserMessageAttachment`
|
|
8
|
+
* (see `assistant/src/daemon/message-types/shared.ts`): only the fields
|
|
9
|
+
* built in `conversation-attachments.ts::buildEmittedAttachments` plus
|
|
10
|
+
* fields the daemon explicitly emits to clients (`filePath` for
|
|
11
|
+
* recordings, per #9744) make it onto the wire. Daemon-internal fields
|
|
12
|
+
* not intended for clients (`extractedText`) stay on the daemon side
|
|
13
|
+
* and do not appear here.
|
|
14
|
+
*
|
|
15
|
+
* Canonical wire-contract source. Daemon code imports the type directly
|
|
16
|
+
* from this file; external consumers import via `@vellumai/assistant-api`.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { z } from "zod";
|
|
20
|
+
|
|
21
|
+
export const AssistantOutboundAttachmentSchema = z
|
|
22
|
+
.object({
|
|
23
|
+
/** Storage id assigned by the daemon's attachment store; absent on
|
|
24
|
+
* in-memory drafts not backed by a stored row. */
|
|
25
|
+
id: z.string().optional(),
|
|
26
|
+
filename: z.string(),
|
|
27
|
+
mimeType: z.string(),
|
|
28
|
+
/** Base64-encoded file bytes. May be empty when `fileBacked` is
|
|
29
|
+
* true and the client should hydrate via the /content endpoint. */
|
|
30
|
+
data: z.string(),
|
|
31
|
+
sourceType: z.enum(["sandbox_file", "host_file", "tool_block"]).optional(),
|
|
32
|
+
/** Original file size in bytes. Present when `data` was omitted to
|
|
33
|
+
* keep payloads small. */
|
|
34
|
+
sizeBytes: z.number().optional(),
|
|
35
|
+
/** Base64-encoded JPEG thumbnail. Generated server-side for video
|
|
36
|
+
* attachments. */
|
|
37
|
+
thumbnailData: z.string().optional(),
|
|
38
|
+
/** True when the attachment is stored on disk and clients should
|
|
39
|
+
* hydrate via the /content endpoint instead of relying on `data`. */
|
|
40
|
+
fileBacked: z.boolean().optional(),
|
|
41
|
+
/** Local on-disk path for file-backed attachments. Used by the
|
|
42
|
+
* macOS client to play recordings and render thumbnails directly
|
|
43
|
+
* from the local file (see #9744 — eliminates the HTTP fetch +
|
|
44
|
+
* ffmpeg dep for video). Web clients ignore this field. */
|
|
45
|
+
filePath: z.string().optional(),
|
|
46
|
+
})
|
|
47
|
+
.strict();
|
|
48
|
+
|
|
49
|
+
export type AssistantOutboundAttachment = z.infer<
|
|
50
|
+
typeof AssistantOutboundAttachmentSchema
|
|
51
|
+
>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `assistant_text_delta` SSE event.
|
|
3
|
+
*
|
|
4
|
+
* Streaming text chunk emitted by the daemon as the model produces
|
|
5
|
+
* assistant output. Multiple deltas accumulate into a single assistant
|
|
6
|
+
* message; the matching `message_complete` event marks the turn done.
|
|
7
|
+
*
|
|
8
|
+
* `messageId` is the database row id of the assistant message this
|
|
9
|
+
* delta belongs to — stamped from the pre-allocated turn anchor (see
|
|
10
|
+
* `reserveMessage` / `AssistantTurnStartEvent`). Absent on streams
|
|
11
|
+
* produced by older daemons that pre-date the anchor protocol, or on
|
|
12
|
+
* synthetic deltas (canned greetings, slash-command echoes, live-voice
|
|
13
|
+
* transcript injections) that don't bind to a row.
|
|
14
|
+
*
|
|
15
|
+
* Canonical wire-contract source. Daemon code imports the type directly
|
|
16
|
+
* from this file; external consumers import via `@vellumai/assistant-api`.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { z } from "zod";
|
|
20
|
+
|
|
21
|
+
export const AssistantTextDeltaEventSchema = z
|
|
22
|
+
.object({
|
|
23
|
+
type: z.literal("assistant_text_delta"),
|
|
24
|
+
text: z.string(),
|
|
25
|
+
messageId: z.string().optional(),
|
|
26
|
+
conversationId: z.string().optional(),
|
|
27
|
+
})
|
|
28
|
+
.strict();
|
|
29
|
+
|
|
30
|
+
export type AssistantTextDeltaEvent = z.infer<
|
|
31
|
+
typeof AssistantTextDeltaEventSchema
|
|
32
|
+
>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `assistant_turn_start` SSE event.
|
|
3
|
+
*
|
|
4
|
+
* Marks the start of an assistant turn — emitted once by the daemon
|
|
5
|
+
* *before* any `assistant_text_delta`, `tool_use_start`, or
|
|
6
|
+
* `assistant_thinking_delta` event for that turn. The `messageId` is the
|
|
7
|
+
* pre-allocated database row id (see `reserveMessage` in
|
|
8
|
+
* `assistant/src/memory/conversation-crud.ts`) that subsequent streaming
|
|
9
|
+
* events stamp on their `messageId` field. Clients use this id to
|
|
10
|
+
* anchor a UI bubble at turn-start instead of waiting for
|
|
11
|
+
* `message_complete`.
|
|
12
|
+
*
|
|
13
|
+
* Types-only addition at introduction — no daemon emit sites yet. The
|
|
14
|
+
* agent loop will adopt pre-allocation in a follow-up.
|
|
15
|
+
*
|
|
16
|
+
* Canonical wire-contract source. Daemon code imports the type
|
|
17
|
+
* directly from this file; external consumers import via
|
|
18
|
+
* `@vellumai/assistant-api`.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { z } from "zod";
|
|
22
|
+
|
|
23
|
+
export const AssistantTurnStartEventSchema = z
|
|
24
|
+
.object({
|
|
25
|
+
type: z.literal("assistant_turn_start"),
|
|
26
|
+
messageId: z.string(),
|
|
27
|
+
conversationId: z.string().optional(),
|
|
28
|
+
})
|
|
29
|
+
.strict();
|
|
30
|
+
|
|
31
|
+
export type AssistantTurnStartEvent = z.infer<
|
|
32
|
+
typeof AssistantTurnStartEventSchema
|
|
33
|
+
>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `document_comment_created` SSE event.
|
|
3
|
+
*
|
|
4
|
+
* Emitted when a new comment is added to a document surface — either
|
|
5
|
+
* authored by the user or by the assistant during a tool run. Carries
|
|
6
|
+
* the full comment payload so the client can render it without a
|
|
7
|
+
* separate fetch. Subsequent lifecycle transitions (resolve / reopen /
|
|
8
|
+
* delete) reference the comment by id only.
|
|
9
|
+
*
|
|
10
|
+
* Canonical wire-contract source. Daemon code imports the type directly
|
|
11
|
+
* from this file; external consumers import via `@vellumai/assistant-api`.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { z } from "zod";
|
|
15
|
+
|
|
16
|
+
const DocumentCommentSchema = z
|
|
17
|
+
.object({
|
|
18
|
+
id: z.string(),
|
|
19
|
+
surfaceId: z.string(),
|
|
20
|
+
/** Author label — typically `"user"` or `"assistant"`. Wire is permissive `string`; clients narrow at the boundary. */
|
|
21
|
+
author: z.string(),
|
|
22
|
+
content: z.string(),
|
|
23
|
+
/** Character offsets into the rendered document text when the comment is anchored to a selection. */
|
|
24
|
+
anchorStart: z.number().optional(),
|
|
25
|
+
anchorEnd: z.number().optional(),
|
|
26
|
+
/** The selected text the comment was anchored to, for resilience to document edits. */
|
|
27
|
+
anchorText: z.string().optional(),
|
|
28
|
+
/** Set when the comment is a reply in a thread. */
|
|
29
|
+
parentCommentId: z.string().optional(),
|
|
30
|
+
/** Lifecycle state — `"open"` or `"resolved"`. Wire is permissive `string`; clients narrow at the boundary. */
|
|
31
|
+
status: z.string(),
|
|
32
|
+
createdAt: z.number(),
|
|
33
|
+
updatedAt: z.number(),
|
|
34
|
+
})
|
|
35
|
+
.strict();
|
|
36
|
+
|
|
37
|
+
export const DocumentCommentCreatedEventSchema = z
|
|
38
|
+
.object({
|
|
39
|
+
type: z.literal("document_comment_created"),
|
|
40
|
+
conversationId: z.string(),
|
|
41
|
+
surfaceId: z.string(),
|
|
42
|
+
comment: DocumentCommentSchema,
|
|
43
|
+
})
|
|
44
|
+
.strict();
|
|
45
|
+
|
|
46
|
+
export type DocumentCommentCreatedEvent = z.infer<
|
|
47
|
+
typeof DocumentCommentCreatedEventSchema
|
|
48
|
+
>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `document_comment_deleted` SSE event.
|
|
3
|
+
*
|
|
4
|
+
* Emitted when a document comment is removed. The client drops the
|
|
5
|
+
* comment from local state.
|
|
6
|
+
*
|
|
7
|
+
* Canonical wire-contract source. Daemon code imports the type directly
|
|
8
|
+
* from this file; external consumers import via `@vellumai/assistant-api`.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
|
|
13
|
+
export const DocumentCommentDeletedEventSchema = z
|
|
14
|
+
.object({
|
|
15
|
+
type: z.literal("document_comment_deleted"),
|
|
16
|
+
conversationId: z.string(),
|
|
17
|
+
surfaceId: z.string(),
|
|
18
|
+
commentId: z.string(),
|
|
19
|
+
})
|
|
20
|
+
.strict();
|
|
21
|
+
|
|
22
|
+
export type DocumentCommentDeletedEvent = z.infer<
|
|
23
|
+
typeof DocumentCommentDeletedEventSchema
|
|
24
|
+
>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `document_comment_reopened` SSE event.
|
|
3
|
+
*
|
|
4
|
+
* Emitted when a previously-resolved document comment is reopened.
|
|
5
|
+
* The client clears the comment's resolved state and transitions it
|
|
6
|
+
* back to `"open"`.
|
|
7
|
+
*
|
|
8
|
+
* Canonical wire-contract source. Daemon code imports the type directly
|
|
9
|
+
* from this file; external consumers import via `@vellumai/assistant-api`.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
|
|
14
|
+
export const DocumentCommentReopenedEventSchema = z
|
|
15
|
+
.object({
|
|
16
|
+
type: z.literal("document_comment_reopened"),
|
|
17
|
+
conversationId: z.string(),
|
|
18
|
+
surfaceId: z.string(),
|
|
19
|
+
commentId: z.string(),
|
|
20
|
+
})
|
|
21
|
+
.strict();
|
|
22
|
+
|
|
23
|
+
export type DocumentCommentReopenedEvent = z.infer<
|
|
24
|
+
typeof DocumentCommentReopenedEventSchema
|
|
25
|
+
>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `document_comment_resolved` SSE event.
|
|
3
|
+
*
|
|
4
|
+
* Emitted when an existing document comment is marked resolved. The
|
|
5
|
+
* client transitions the comment's status to `"resolved"` and stamps
|
|
6
|
+
* `resolvedBy` from the wire value.
|
|
7
|
+
*
|
|
8
|
+
* Canonical wire-contract source. Daemon code imports the type directly
|
|
9
|
+
* from this file; external consumers import via `@vellumai/assistant-api`.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
|
|
14
|
+
export const DocumentCommentResolvedEventSchema = z
|
|
15
|
+
.object({
|
|
16
|
+
type: z.literal("document_comment_resolved"),
|
|
17
|
+
conversationId: z.string(),
|
|
18
|
+
surfaceId: z.string(),
|
|
19
|
+
commentId: z.string(),
|
|
20
|
+
/** User or actor label that resolved the comment. */
|
|
21
|
+
resolvedBy: z.string(),
|
|
22
|
+
})
|
|
23
|
+
.strict();
|
|
24
|
+
|
|
25
|
+
export type DocumentCommentResolvedEvent = z.infer<
|
|
26
|
+
typeof DocumentCommentResolvedEventSchema
|
|
27
|
+
>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `generation_cancelled` SSE event.
|
|
3
|
+
*
|
|
4
|
+
* Emitted when an assistant turn is cancelled before completion —
|
|
5
|
+
* user-initiated abort, queue-drain interruption, or daemon-side
|
|
6
|
+
* lifecycle exit. Terminal event for the turn: no further deltas or
|
|
7
|
+
* `message_complete` follow.
|
|
8
|
+
*
|
|
9
|
+
* Canonical wire-contract source. Daemon code imports the type directly
|
|
10
|
+
* from this file; external consumers import via `@vellumai/assistant-api`.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
|
|
15
|
+
export const GenerationCancelledEventSchema = z
|
|
16
|
+
.object({
|
|
17
|
+
type: z.literal("generation_cancelled"),
|
|
18
|
+
conversationId: z.string().optional(),
|
|
19
|
+
})
|
|
20
|
+
.strict();
|
|
21
|
+
|
|
22
|
+
export type GenerationCancelledEvent = z.infer<
|
|
23
|
+
typeof GenerationCancelledEventSchema
|
|
24
|
+
>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `generation_handoff` SSE event.
|
|
3
|
+
*
|
|
4
|
+
* Emitted when an assistant turn finishes and the daemon's agent loop
|
|
5
|
+
* yields control to the next queued user message in the same
|
|
6
|
+
* conversation. Functionally similar to `message_complete` — same
|
|
7
|
+
* attachment payload, same `messageId` semantics — but tells the
|
|
8
|
+
* client that another turn is about to begin without an intervening
|
|
9
|
+
* idle state, so the UI can keep the activity indicator on.
|
|
10
|
+
*
|
|
11
|
+
* `queuedCount` is the depth of the conversation's pending-message
|
|
12
|
+
* queue at handoff time (not including the just-finished turn). Used
|
|
13
|
+
* by the client to size queued-message UI affordances.
|
|
14
|
+
*
|
|
15
|
+
* Canonical wire-contract source. Daemon code imports the type directly
|
|
16
|
+
* from this file; external consumers import via `@vellumai/assistant-api`.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { z } from "zod";
|
|
20
|
+
|
|
21
|
+
import { AssistantOutboundAttachmentSchema } from "./assistant-outbound-attachment.js";
|
|
22
|
+
|
|
23
|
+
export const GenerationHandoffEventSchema = z
|
|
24
|
+
.object({
|
|
25
|
+
type: z.literal("generation_handoff"),
|
|
26
|
+
conversationId: z.string().optional(),
|
|
27
|
+
/** Daemon request id of the just-finished turn — correlates with
|
|
28
|
+
* the request id surfaced by the inbound user message. */
|
|
29
|
+
requestId: z.string().optional(),
|
|
30
|
+
/** Depth of the pending-message queue at handoff time. */
|
|
31
|
+
queuedCount: z.number(),
|
|
32
|
+
/** Database row id of the just-finished assistant turn. */
|
|
33
|
+
messageId: z.string().optional(),
|
|
34
|
+
attachments: z.array(AssistantOutboundAttachmentSchema).optional(),
|
|
35
|
+
attachmentWarnings: z.array(z.string()).optional(),
|
|
36
|
+
})
|
|
37
|
+
.strict();
|
|
38
|
+
|
|
39
|
+
export type GenerationHandoffEvent = z.infer<
|
|
40
|
+
typeof GenerationHandoffEventSchema
|
|
41
|
+
>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `message_complete` SSE event.
|
|
3
|
+
*
|
|
4
|
+
* Marks the end of an assistant turn — emitted once per turn after the
|
|
5
|
+
* final `assistant_text_delta` (or as the sole turn event for canned
|
|
6
|
+
* one-shot messages, recording-handler echoes, slash-command outputs,
|
|
7
|
+
* and aux notifier injections that don't stream text). Clients gate
|
|
8
|
+
* task-completion side effects on this event.
|
|
9
|
+
*
|
|
10
|
+
* `messageId` is the database row id of the completed assistant turn;
|
|
11
|
+
* shared with the `assistant_text_delta` chunks that streamed it. May
|
|
12
|
+
* be absent on synthetic completions that don't bind to a persisted
|
|
13
|
+
* row.
|
|
14
|
+
*
|
|
15
|
+
* `source` distinguishes a real main-turn completion from auxiliary
|
|
16
|
+
* notifier injections (call transcripts, call summaries, watch
|
|
17
|
+
* notifier outputs). Clients gate the task-complete sound and similar
|
|
18
|
+
* side effects on `source !== "aux"`. Absent is treated as `"main"`
|
|
19
|
+
* for backwards compatibility.
|
|
20
|
+
*
|
|
21
|
+
* Canonical wire-contract source. Daemon code imports the type directly
|
|
22
|
+
* from this file; external consumers import via `@vellumai/assistant-api`.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import { z } from "zod";
|
|
26
|
+
|
|
27
|
+
import { AssistantOutboundAttachmentSchema } from "./assistant-outbound-attachment.js";
|
|
28
|
+
|
|
29
|
+
export const MessageCompleteEventSchema = z
|
|
30
|
+
.object({
|
|
31
|
+
type: z.literal("message_complete"),
|
|
32
|
+
messageId: z.string().optional(),
|
|
33
|
+
conversationId: z.string().optional(),
|
|
34
|
+
source: z.enum(["main", "aux"]).optional(),
|
|
35
|
+
attachments: z.array(AssistantOutboundAttachmentSchema).optional(),
|
|
36
|
+
/** Soft warnings produced while resolving attachments (e.g. format
|
|
37
|
+
* conversions, size truncations). Display-only — not blocking. */
|
|
38
|
+
attachmentWarnings: z.array(z.string()).optional(),
|
|
39
|
+
})
|
|
40
|
+
.strict();
|
|
41
|
+
|
|
42
|
+
export type MessageCompleteEvent = z.infer<typeof MessageCompleteEventSchema>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `open_url` SSE event.
|
|
3
|
+
*
|
|
4
|
+
* Sent by the assistant when it wants the client to open a URL — OAuth
|
|
5
|
+
* authorization popups, system-settings deep links, and browser hand-offs
|
|
6
|
+
* from tool execution. The web client routes the URL through same-origin
|
|
7
|
+
* detection, an OAuth popup, or `window.open`, depending on the URL shape.
|
|
8
|
+
*
|
|
9
|
+
* Canonical wire-contract source. Assistant code imports the type directly
|
|
10
|
+
* from this file; external consumers import via `@vellumai/assistant-api`.
|
|
11
|
+
*
|
|
12
|
+
* `conversationId` is optional: emit sites with a conversation context
|
|
13
|
+
* (OAuth orchestrator, conversation-scoped tools) should set it on the
|
|
14
|
+
* inner message; CLI signal-file broadcasts and other global flows omit
|
|
15
|
+
* it. The parser never grafts the envelope-level routing key onto the
|
|
16
|
+
* typed event — the schema is the contract.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { z } from "zod";
|
|
20
|
+
|
|
21
|
+
export const OpenUrlEventSchema = z
|
|
22
|
+
.object({
|
|
23
|
+
type: z.literal("open_url"),
|
|
24
|
+
url: z.string().min(1),
|
|
25
|
+
title: z.string().optional(),
|
|
26
|
+
conversationId: z.string().optional(),
|
|
27
|
+
})
|
|
28
|
+
.strict();
|
|
29
|
+
|
|
30
|
+
export type OpenUrlEvent = z.infer<typeof OpenUrlEventSchema>;
|
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
|
|
14
14
|
import { z } from "zod";
|
|
15
15
|
|
|
16
|
-
export const
|
|
16
|
+
export const RelationshipStateUpdatedEventSchema = z
|
|
17
17
|
.object({
|
|
18
18
|
type: z.literal("relationship_state_updated"),
|
|
19
19
|
updatedAt: z.string(),
|
|
20
20
|
})
|
|
21
21
|
.strict();
|
|
22
22
|
|
|
23
|
-
export type
|
|
24
|
-
typeof
|
|
23
|
+
export type RelationshipStateUpdatedEvent = z.infer<
|
|
24
|
+
typeof RelationshipStateUpdatedEventSchema
|
|
25
25
|
>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `tool_use_start` SSE event.
|
|
3
|
+
*
|
|
4
|
+
* Emitted by the daemon's agent loop when a tool invocation begins —
|
|
5
|
+
* carries the tool name, the structured input the model produced, and
|
|
6
|
+
* correlation ids for the conversation, the message, and the tool_use
|
|
7
|
+
* block itself.
|
|
8
|
+
*
|
|
9
|
+
* `messageId` is the database row id of the assistant message that owns
|
|
10
|
+
* this tool_use block; absent on streams produced by older daemons that
|
|
11
|
+
* pre-date the anchor protocol. Same semantics as
|
|
12
|
+
* `AssistantTextDeltaEvent.messageId`.
|
|
13
|
+
*
|
|
14
|
+
* Canonical wire-contract source. Daemon code imports the type
|
|
15
|
+
* directly from this file; external consumers import via
|
|
16
|
+
* `@vellumai/assistant-api`.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { z } from "zod";
|
|
20
|
+
|
|
21
|
+
export const ToolUseStartEventSchema = z
|
|
22
|
+
.object({
|
|
23
|
+
type: z.literal("tool_use_start"),
|
|
24
|
+
toolName: z.string(),
|
|
25
|
+
input: z.record(z.string(), z.unknown()),
|
|
26
|
+
toolUseId: z.string().optional(),
|
|
27
|
+
messageId: z.string().optional(),
|
|
28
|
+
conversationId: z.string().optional(),
|
|
29
|
+
})
|
|
30
|
+
.strict();
|
|
31
|
+
|
|
32
|
+
export type ToolUseStartEvent = z.infer<typeof ToolUseStartEventSchema>;
|