@vellumai/assistant 0.8.8 → 0.8.9-dev.202606091853.fbaa2ae
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +6 -6
- package/bun.lock +2 -2
- package/docs/activation-funnel-telemetry.md +310 -0
- package/examples/plugins/echo/README.md +61 -60
- package/examples/plugins/echo/hooks/post-tool-use.ts +18 -0
- package/examples/plugins/echo/hooks/stop.ts +16 -0
- package/examples/plugins/echo/hooks/user-prompt-submit.ts +18 -0
- package/examples/plugins/echo/package.json +1 -2
- package/examples/plugins/echo/src/emit.ts +19 -0
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +7 -6
- package/openapi.yaml +263 -121
- package/package.json +2 -2
- package/src/__tests__/activation-early-marking.test.ts +120 -0
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +69 -14
- package/src/__tests__/agent-loop-exit-reason.test.ts +204 -144
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +50 -35
- package/src/__tests__/agent-loop-output-hooks.test.ts +357 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +25 -6
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +41 -21
- package/src/__tests__/agent-loop-thinking.test.ts +36 -20
- package/src/__tests__/agent-loop.test.ts +441 -96
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +14 -14
- package/src/__tests__/agent-wake-override-profile.test.ts +17 -21
- package/src/__tests__/anthropic-provider.test.ts +23 -8
- package/src/__tests__/app-builder-tool-scripts.test.ts +21 -0
- package/src/__tests__/app-control-flow.test.ts +1 -1
- package/src/__tests__/app-dir-path-guard.test.ts +1 -0
- package/src/__tests__/app-executors.test.ts +132 -0
- package/src/__tests__/approval-cascade.test.ts +6 -5
- package/src/__tests__/approval-routes-http.test.ts +4 -1
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -1
- package/src/__tests__/channel-approval-routes.test.ts +1 -1
- package/src/__tests__/channel-approvals.test.ts +1 -1
- package/src/__tests__/compaction-circuit.test.ts +258 -0
- package/src/__tests__/compaction-direct.test.ts +146 -0
- package/src/__tests__/compaction-events.test.ts +7 -7
- package/src/__tests__/compaction.benchmark.test.ts +1 -1
- package/src/__tests__/compactor-web-search-strip.test.ts +213 -0
- package/src/__tests__/context-overflow-reducer.test.ts +265 -125
- package/src/__tests__/context-window-manager-compact-retry.test.ts +121 -15
- package/src/__tests__/conversation-abort-tool-results.test.ts +7 -5
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +7 -10
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +78 -119
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +158 -234
- package/src/__tests__/conversation-agent-loop.test.ts +342 -623
- package/src/__tests__/conversation-clean-command.test.ts +5 -2
- package/src/__tests__/conversation-confirmation-signals.test.ts +6 -5
- package/src/__tests__/conversation-crud-inference-profile.test.ts +7 -9
- package/src/__tests__/conversation-error.test.ts +15 -1
- package/src/__tests__/conversation-history-web-search.test.ts +6 -1
- package/src/__tests__/conversation-media-retry.test.ts +1 -1
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +44 -4
- package/src/__tests__/conversation-process-callsite.test.ts +15 -15
- package/src/__tests__/conversation-provider-retry-repair.test.ts +66 -65
- package/src/__tests__/conversation-queue.test.ts +10 -10
- package/src/__tests__/conversation-runtime-assembly.test.ts +1059 -231
- package/src/__tests__/conversation-runtime-workspace.test.ts +115 -20
- package/src/__tests__/conversation-slash-queue.test.ts +7 -5
- package/src/__tests__/conversation-slash-unknown.test.ts +7 -5
- package/src/__tests__/conversation-speed-override.test.ts +11 -10
- package/src/__tests__/conversation-starter-routes.test.ts +14 -6
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +395 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +48 -1
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +73 -4
- package/src/__tests__/conversation-undo.test.ts +2 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +24 -21
- package/src/__tests__/conversation-workspace-injection.test.ts +69 -7
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +15 -12
- package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
- package/src/__tests__/corrected-target.test.ts +93 -0
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/cu-unified-flow.test.ts +36 -0
- package/src/__tests__/db-acp-history.test.ts +101 -0
- package/src/__tests__/dynamic-page-surface.test.ts +31 -0
- package/src/__tests__/empty-response-hook.test.ts +1 -1
- package/src/__tests__/file-write-tool.test.ts +63 -0
- package/src/__tests__/gateway-only-guard.test.ts +17 -2
- package/src/__tests__/guardian-grant-minting.test.ts +1 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +93 -4
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +1 -0
- package/src/__tests__/history-repair-hook.test.ts +5 -1
- package/src/__tests__/host-app-control-proxy.test.ts +45 -0
- package/src/__tests__/host-app-control-routes.test.ts +1 -1
- package/src/__tests__/host-cu-routes-targeted.test.ts +3 -3
- package/src/__tests__/inference-profile-reaper.test.ts +62 -0
- package/src/__tests__/inference-profile-session-handler.test.ts +86 -0
- package/src/__tests__/injector-background-turn.test.ts +13 -23
- package/src/__tests__/injector-chain.test.ts +268 -44
- package/src/__tests__/injector-disk-pressure.test.ts +210 -52
- package/src/__tests__/injector-document-comments.test.ts +97 -114
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
- package/src/__tests__/injector-v3-suppression.test.ts +4 -4
- package/src/__tests__/list-messages-client-message-id.test.ts +91 -0
- package/src/__tests__/list-messages-hidden-metadata.test.ts +38 -0
- package/src/__tests__/llm-resolver.test.ts +73 -0
- package/src/__tests__/memory-retrieval-hook.test.ts +156 -38
- package/src/__tests__/memory-v2-static-injector.test.ts +86 -8
- package/src/__tests__/notification-decision-strategy.test.ts +3 -3
- package/src/__tests__/parallel-tool.benchmark.test.ts +35 -8
- package/src/__tests__/persist-unsendable-image-downscale.test.ts +145 -0
- package/src/__tests__/persist-unsendable-image.test.ts +97 -1
- package/src/__tests__/plugin-api-shim.test.ts +6 -9
- package/src/__tests__/plugin-bootstrap.test.ts +91 -81
- package/src/__tests__/plugin-registry.test.ts +3 -49
- package/src/__tests__/plugin-skill-contribution.test.ts +15 -14
- package/src/__tests__/plugin-tool-contribution.test.ts +7 -4
- package/src/__tests__/plugin-types.test.ts +0 -70
- package/src/__tests__/post-turn-tool-result-truncation.test.ts +69 -0
- package/src/__tests__/pre-model-call-sanitize.test.ts +109 -0
- package/src/__tests__/published-app-updater.test.ts +138 -0
- package/src/__tests__/reaction-persistence.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +4 -1
- package/src/__tests__/skill-feature-flags-integration.test.ts +31 -0
- package/src/__tests__/steer-tool-repair.test.ts +1 -1
- package/src/__tests__/subagent-call-site-routing.test.ts +1 -1
- package/src/__tests__/subagent-detail.test.ts +25 -7
- package/src/__tests__/subagent-fork-notifications.test.ts +1 -3
- package/src/__tests__/subagent-fork-spawn.test.ts +1 -1
- package/src/__tests__/subagent-manager-notify.test.ts +1 -3
- package/src/__tests__/subagent-notify-parent.test.ts +1 -3
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +1 -1
- package/src/__tests__/title-generate-hook.test.ts +5 -1
- package/src/__tests__/tool-error-hook.test.ts +1 -1
- package/src/__tests__/tool-result-truncate-hook.test.ts +1 -1
- package/src/__tests__/user-plugin-loader.test.ts +54 -286
- package/src/__tests__/web-fetch.test.ts +45 -0
- package/src/acp/__tests__/agent-process.test.ts +161 -0
- package/src/acp/__tests__/client-handler.test.ts +40 -0
- package/src/acp/__tests__/helpers/acp-config-stub.ts +0 -2
- package/src/acp/__tests__/helpers/acp-history-db.ts +82 -0
- package/src/acp/__tests__/helpers/exec-file-stub.ts +106 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +97 -0
- package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
- package/src/acp/__tests__/session-manager-resume.test.ts +888 -0
- package/src/acp/agent-process.ts +61 -1
- package/src/acp/auto-install.test.ts +280 -0
- package/src/acp/auto-install.ts +232 -0
- package/src/acp/client-handler.ts +31 -0
- package/src/acp/prepare-agent-env.ts +80 -27
- package/src/acp/resolve-agent.test.ts +188 -28
- package/src/acp/resolve-agent.ts +119 -42
- package/src/acp/resume-hint.ts +23 -0
- package/src/acp/session-manager.ts +507 -73
- package/src/agent/compaction-circuit.ts +60 -102
- package/src/agent/loop.ts +403 -251
- package/src/api/responses/conversation-message.ts +22 -2
- package/src/api/responses/memory-v3-selection-log.ts +19 -10
- package/src/approvals/guardian-request-resolvers.ts +27 -1
- package/src/background-wake/next-wake.ts +1 -0
- package/src/cli/commands/__tests__/memory-v3.test.ts +191 -210
- package/src/cli/commands/channel-verification-sessions.ts +6 -6
- package/src/cli/commands/db/__tests__/repair.test.ts +3 -1
- package/src/cli/commands/memory-v3.ts +57 -199
- package/src/cli/commands/plugins.ts +43 -37
- package/src/cli/lib/__tests__/install-from-github.test.ts +790 -111
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +196 -0
- package/src/cli/lib/__tests__/plugin-details.test.ts +381 -0
- package/src/cli/lib/__tests__/plugin-marketplace.test.ts +270 -0
- package/src/cli/lib/__tests__/search-plugins.test.ts +233 -32
- package/src/cli/lib/install-from-github.ts +797 -60
- package/src/cli/lib/plugin-catalog-cache.ts +84 -0
- package/src/cli/lib/plugin-details.ts +416 -0
- package/src/cli/lib/plugin-marketplace.ts +215 -0
- package/src/cli/lib/search-plugins.ts +201 -29
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/acp-defaults.test.ts +10 -0
- package/src/config/acp-defaults.ts +9 -3
- package/src/config/acp-schema.ts +1 -7
- package/src/config/bundled-skills/acp/SKILL.md +80 -41
- package/src/config/bundled-skills/acp/TOOLS.json +4 -4
- package/src/config/bundled-skills/app-builder/SKILL.md +224 -381
- package/src/config/bundled-skills/app-builder/TOOLS.json +72 -2
- package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +48 -0
- package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +57 -0
- package/src/config/bundled-skills/app-builder/references/SLIDES.md +38 -0
- package/src/config/bundled-skills/app-builder/tools/app-list.ts +62 -0
- package/src/config/bundled-skills/app-builder/tools/app-update.ts +18 -0
- package/src/config/bundled-skills/document-editor/SKILL.md +28 -23
- package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
- package/src/config/bundled-tool-registry.ts +4 -0
- package/src/config/call-site-defaults.ts +0 -3
- package/src/config/feature-flag-registry.json +10 -16
- package/src/config/llm-resolver.ts +39 -7
- package/src/config/schemas/__tests__/memory-v3.test.ts +25 -9
- package/src/config/schemas/call-site-catalog.ts +0 -21
- package/src/config/schemas/heartbeat.ts +9 -0
- package/src/config/schemas/llm.ts +17 -3
- package/src/config/schemas/memory-v3.ts +58 -8
- package/src/config/seed-inference-profiles.ts +18 -0
- package/src/context/compactor.ts +22 -4
- package/src/context/post-turn-tool-result-truncation.ts +39 -1
- package/src/context/strip-injections.ts +8 -2
- package/src/daemon/conversation-agent-loop-handlers.ts +18 -36
- package/src/daemon/conversation-agent-loop.ts +308 -1297
- package/src/daemon/conversation-error.ts +31 -4
- package/src/daemon/conversation-history.ts +1 -1
- package/src/daemon/conversation-lifecycle.ts +11 -255
- package/src/daemon/conversation-media-retry.ts +19 -6
- package/src/daemon/conversation-messaging.ts +17 -0
- package/src/daemon/conversation-process.ts +22 -141
- package/src/daemon/conversation-queue-manager.ts +8 -0
- package/src/daemon/conversation-registry.ts +159 -0
- package/src/daemon/conversation-runtime-assembly.ts +361 -393
- package/src/daemon/conversation-store.ts +9 -90
- package/src/daemon/conversation-surfaces.ts +165 -11
- package/src/daemon/conversation-workspace.ts +17 -0
- package/src/daemon/conversation.ts +444 -62
- package/src/daemon/disk-pressure-policy.ts +0 -1
- package/src/daemon/external-plugins-bootstrap.ts +36 -46
- package/src/daemon/handlers/config-channels.ts +11 -2
- package/src/daemon/handlers/conversations.ts +3 -1
- package/src/daemon/handlers/skills.ts +4 -1
- package/src/daemon/host-app-control-proxy.ts +72 -57
- package/src/daemon/host-proxy-preactivation.ts +1 -3
- package/src/daemon/lifecycle.ts +21 -7
- package/src/daemon/persist-unsendable-image.ts +62 -25
- package/src/daemon/process-message.ts +1 -1
- package/src/daemon/server.ts +2 -0
- package/src/daemon/tool-side-effects.ts +15 -0
- package/src/daemon/wake-conversation-ops.ts +269 -0
- package/src/embedded/plugin-api.ts +2 -2
- package/src/export/__tests__/transcript-formatter.test.ts +5 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -0
- package/src/heartbeat/heartbeat-run-store.ts +23 -1
- package/src/heartbeat/heartbeat-service.ts +26 -0
- package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
- package/src/ipc/__tests__/ui-request-route.test.ts +3 -3
- package/src/ipc/skill-routes/__tests__/memory.test.ts +15 -0
- package/src/ipc/skill-routes/memory.ts +4 -2
- package/src/memory/__tests__/activation-session-store.test.ts +41 -0
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +87 -0
- package/src/memory/__tests__/onboarding-events-store.test.ts +80 -0
- package/src/memory/activation-session-store.ts +43 -0
- package/src/memory/conversation-crud.ts +29 -19
- package/src/memory/conversation-starter-checkpoints.ts +1 -0
- package/src/memory/db-init.ts +6 -0
- package/src/memory/job-handlers/conversation-starters.ts +13 -2
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -4
- package/src/memory/jobs-worker.ts +25 -1
- package/src/memory/migrations/272-acp-session-history-cwd.ts +36 -0
- package/src/memory/migrations/273-onboarding-events-funnel-columns.ts +46 -0
- package/src/memory/migrations/274-create-activation-sessions.ts +15 -0
- package/src/memory/migrations/index.ts +3 -0
- package/src/memory/onboarding-events-store.ts +66 -18
- package/src/memory/schema/acp.ts +4 -0
- package/src/memory/schema/infrastructure.ts +13 -0
- package/src/memory/v2/__tests__/consolidation-job.test.ts +4 -97
- package/src/memory/v2/__tests__/page-store.test.ts +22 -0
- package/src/memory/v2/consolidation-job.ts +2 -63
- package/src/memory/v2/types.ts +5 -0
- package/src/messaging/providers/telegram-bot/api.ts +14 -5
- package/src/notifications/__tests__/copy-composer.test.ts +244 -0
- package/src/notifications/access-request-copy.ts +298 -0
- package/src/notifications/adapters/slack.ts +3 -3
- package/src/notifications/adapters/telegram.ts +9 -2
- package/src/notifications/copy-composer.ts +49 -267
- package/src/notifications/decision-engine.ts +16 -35
- package/src/notifications/home-feed-side-effect.ts +1 -6
- package/src/plugin-api/constants.ts +4 -0
- package/src/plugin-api/index.ts +40 -11
- package/src/plugin-api/types.ts +108 -0
- package/src/plugins/defaults/compaction/compact.ts +106 -0
- package/src/{daemon → plugins/defaults/compaction}/context-overflow-reducer.ts +250 -42
- package/src/plugins/defaults/compaction/corrected-target.ts +53 -0
- package/src/plugins/defaults/compaction/manager-store.ts +57 -0
- package/src/plugins/defaults/compaction/package.json +1 -2
- package/src/{context → plugins/defaults/compaction}/window-manager.ts +95 -25
- package/src/plugins/defaults/empty-response/package.json +0 -1
- package/src/plugins/defaults/history-repair/package.json +0 -1
- package/src/plugins/defaults/index.ts +156 -26
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +100 -52
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +285 -0
- package/src/plugins/defaults/memory-retrieval/injector-chain.ts +2 -2
- package/src/plugins/defaults/{injectors/register.ts → memory-retrieval/injectors.ts} +148 -73
- package/src/plugins/defaults/memory-retrieval/package.json +14 -0
- package/src/plugins/defaults/memory-retrieval/unified-turn-context.ts +223 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/capabilities.test.ts +71 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/dense.test.ts +181 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/edge.test.ts +247 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/live-integration.test.ts +147 -134
- package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +456 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +662 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +306 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +91 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/section-dense-store.test.ts +402 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/section-needle.test.ts +135 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/sections.test.ts +125 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selection-log-store.test.ts +74 -19
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-integration.test.ts +446 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +592 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/types.test.ts +2 -24
- package/src/plugins/defaults/memory-v3-shadow/capabilities.ts +91 -0
- package/src/plugins/defaults/memory-v3-shadow/dense.ts +97 -0
- package/src/plugins/defaults/memory-v3-shadow/edge.ts +252 -0
- package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +14 -0
- package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +19 -0
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +76 -0
- package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +555 -0
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +266 -0
- package/src/plugins/defaults/memory-v3-shadow/package.json +14 -0
- package/src/plugins/defaults/memory-v3-shadow/page-content.ts +71 -0
- package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +204 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/render-injection.ts +16 -8
- package/src/plugins/defaults/memory-v3-shadow/section-dense-store.ts +236 -0
- package/src/plugins/defaults/memory-v3-shadow/section-needle.ts +200 -0
- package/src/plugins/defaults/memory-v3-shadow/sections.ts +115 -0
- package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +156 -0
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +382 -0
- package/src/plugins/defaults/memory-v3-shadow/types.ts +92 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/working-set.ts +4 -1
- package/src/plugins/defaults/title-generate/package.json +0 -1
- package/src/plugins/defaults/tool-error/package.json +0 -1
- package/src/plugins/defaults/tool-result-truncate/package.json +0 -1
- package/src/plugins/external-api.ts +12 -2
- package/src/plugins/pipeline.ts +6 -293
- package/src/plugins/registry.ts +9 -37
- package/src/plugins/types.ts +76 -381
- package/src/plugins/user-loader.ts +30 -127
- package/src/prompts/__tests__/system-prompt.test.ts +6 -0
- package/src/prompts/system-prompt.ts +61 -10
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +71 -4
- package/src/providers/anthropic/client.ts +9 -10
- package/src/providers/inference/kimi-cjk-token-ids.ts +493 -0
- package/src/providers/inference/logit-bias.ts +55 -0
- package/src/providers/model-catalog.ts +34 -0
- package/src/providers/openai/__tests__/vision-not-supported.test.ts +75 -0
- package/src/providers/openai/chat-completions-provider.ts +44 -1
- package/src/providers/retry.ts +22 -0
- package/src/providers/types.ts +6 -0
- package/src/runtime/__tests__/agent-wake.test.ts +555 -691
- package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
- package/src/runtime/agent-wake.ts +108 -209
- package/src/runtime/assistant-event-hub.ts +1 -1
- package/src/runtime/channel-approvals.ts +1 -1
- package/src/runtime/interactive-ui.ts +1 -1
- package/src/runtime/routes/__tests__/acp-routes.test.ts +466 -55
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +423 -73
- package/src/runtime/routes/__tests__/stt-routes.test.ts +112 -0
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +5 -4
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +4 -1
- package/src/runtime/routes/acp-routes.test.ts +185 -32
- package/src/runtime/routes/acp-routes.ts +328 -30
- package/src/runtime/routes/app-management-routes.ts +3 -0
- package/src/runtime/routes/approval-routes.ts +1 -1
- package/src/runtime/routes/browser-routes.ts +1 -1
- package/src/runtime/routes/browser-tabs-routes.ts +6 -10
- package/src/runtime/routes/channel-verification-routes.ts +14 -5
- package/src/runtime/routes/conversation-cli-routes.ts +1 -1
- package/src/runtime/routes/conversation-list-routes.ts +1 -1
- package/src/runtime/routes/conversation-query-routes.ts +1 -1
- package/src/runtime/routes/conversation-routes.ts +30 -2
- package/src/runtime/routes/conversation-starter-routes.ts +13 -7
- package/src/runtime/routes/conversations-import-routes.ts +24 -7
- package/src/runtime/routes/host-app-control-routes.ts +1 -1
- package/src/runtime/routes/host-cu-routes.ts +1 -1
- package/src/runtime/routes/identity-routes.ts +18 -3
- package/src/runtime/routes/inbound-message-handler.ts +1 -1
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +33 -34
- package/src/runtime/routes/inference-profile-session-handler.ts +11 -0
- package/src/runtime/routes/inference-profile-session-reaper.ts +6 -0
- package/src/runtime/routes/memory-v3-routes.ts +65 -305
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +1 -1
- package/src/runtime/routes/playground/helpers.ts +1 -1
- package/src/runtime/routes/plugins-routes.ts +337 -35
- package/src/runtime/routes/stt-routes.ts +45 -12
- package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
- package/src/runtime/routes/work-items-routes.ts +2 -4
- package/src/runtime/routes/workspace-routes.ts +50 -15
- package/src/runtime/services/conversation-serializer.ts +1 -1
- package/src/runtime/verification-outbound-actions.ts +147 -2
- package/src/runtime/verification-templates.ts +29 -3
- package/src/services/published-app-updater.ts +30 -8
- package/src/signals/cancel.ts +2 -4
- package/src/subagent/manager.ts +21 -5
- package/src/telemetry/__tests__/activation-funnel.test.ts +95 -0
- package/src/telemetry/activation-funnel.ts +167 -0
- package/src/telemetry/types.ts +13 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +154 -0
- package/src/telemetry/usage-telemetry-reporter.ts +26 -1
- package/src/tools/acp/context.ts +20 -0
- package/src/tools/acp/list-agents.test.ts +9 -19
- package/src/tools/acp/list-agents.ts +3 -15
- package/src/tools/acp/spawn.test.ts +173 -202
- package/src/tools/acp/spawn.ts +37 -172
- package/src/tools/acp/steer.test.ts +105 -8
- package/src/tools/acp/steer.ts +48 -17
- package/src/tools/apps/executors.ts +166 -50
- package/src/tools/browser/browser-execution.ts +12 -2
- package/src/tools/filesystem/write.ts +34 -0
- package/src/tools/network/web-fetch.ts +65 -24
- package/src/tools/skills/load.ts +1 -1
- package/src/tools/subagent/spawn.ts +2 -4
- package/src/tools/ui-surface/definitions.ts +32 -5
- package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +4 -5
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +69 -45
- package/docs/plugins.md +0 -832
- package/examples/plugins/echo/register.ts +0 -143
- package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -405
- package/src/__tests__/compaction-pipeline.test.ts +0 -210
- package/src/__tests__/compaction-timeout-recovery.test.ts +0 -251
- package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -667
- package/src/__tests__/pipeline-runner.test.ts +0 -554
- package/src/daemon/wake-target-adapter.ts +0 -253
- package/src/memory/v3/__tests__/assign.test.ts +0 -242
- package/src/memory/v3/__tests__/capabilities.test.ts +0 -118
- package/src/memory/v3/__tests__/core.test.ts +0 -39
- package/src/memory/v3/__tests__/health.test.ts +0 -219
- package/src/memory/v3/__tests__/maintain-job.test.ts +0 -288
- package/src/memory/v3/__tests__/needle.test.ts +0 -107
- package/src/memory/v3/__tests__/orchestrate.test.ts +0 -436
- package/src/memory/v3/__tests__/provider-blocks.test.ts +0 -13
- package/src/memory/v3/__tests__/reconcile.test.ts +0 -274
- package/src/memory/v3/__tests__/render-injection.test.ts +0 -61
- package/src/memory/v3/__tests__/router.test.ts +0 -332
- package/src/memory/v3/__tests__/selector.test.ts +0 -470
- package/src/memory/v3/__tests__/shadow-plugin.test.ts +0 -432
- package/src/memory/v3/__tests__/snapshot.test.ts +0 -168
- package/src/memory/v3/__tests__/tree.test.ts +0 -192
- package/src/memory/v3/assign.ts +0 -268
- package/src/memory/v3/capabilities.ts +0 -124
- package/src/memory/v3/core.ts +0 -26
- package/src/memory/v3/health.ts +0 -0
- package/src/memory/v3/maintain-job.ts +0 -314
- package/src/memory/v3/needle.ts +0 -115
- package/src/memory/v3/orchestrate.ts +0 -126
- package/src/memory/v3/page-content.ts +0 -34
- package/src/memory/v3/provider-blocks.ts +0 -26
- package/src/memory/v3/reconcile.ts +0 -523
- package/src/memory/v3/router.ts +0 -190
- package/src/memory/v3/selection-log-store.ts +0 -84
- package/src/memory/v3/selector.ts +0 -226
- package/src/memory/v3/shadow-plugin.ts +0 -411
- package/src/memory/v3/snapshot.ts +0 -209
- package/src/memory/v3/tree.ts +0 -174
- package/src/memory/v3/types.ts +0 -59
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +0 -187
- package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +0 -93
- package/src/plugins/defaults/circuit-breaker/package.json +0 -15
- package/src/plugins/defaults/circuit-breaker/register.ts +0 -39
- package/src/plugins/defaults/compaction/middlewares/compaction.ts +0 -25
- package/src/plugins/defaults/compaction/register.ts +0 -35
- package/src/plugins/defaults/compaction/terminal.ts +0 -73
- package/src/plugins/defaults/empty-response/register.ts +0 -23
- package/src/plugins/defaults/history-repair/register.ts +0 -24
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +0 -216
- package/src/plugins/defaults/overflow-reduce/middlewares/overflowReduce.ts +0 -126
- package/src/plugins/defaults/overflow-reduce/package.json +0 -15
- package/src/plugins/defaults/overflow-reduce/register.ts +0 -42
- package/src/plugins/defaults/title-generate/register.ts +0 -35
- package/src/plugins/defaults/tool-error/register.ts +0 -23
- package/src/plugins/defaults/tool-result-truncate/register.ts +0 -24
- package/src/proactive-artifact/aux-message-injector.ts +0 -97
- package/src/proactive-artifact/decision.test.ts +0 -226
- package/src/proactive-artifact/decision.ts +0 -165
- package/src/proactive-artifact/index.ts +0 -7
- package/src/proactive-artifact/job.test.ts +0 -962
- package/src/proactive-artifact/job.ts +0 -372
- package/src/proactive-artifact/message-copy.ts +0 -58
- package/src/proactive-artifact/trigger-state.test.ts +0 -286
- package/src/proactive-artifact/trigger-state.ts +0 -123
- package/src/util/map-limit.ts +0 -27
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/eval-turns.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/live-turns.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-eviction.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-skeleton.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/README.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/assignments.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/core.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-x.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-y.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-b/topic-z.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/llm-retry.ts +0 -0
package/ARCHITECTURE.md
CHANGED
|
@@ -1088,12 +1088,12 @@ All overflow recovery settings live under `contextWindow.overflowRecovery` in th
|
|
|
1088
1088
|
|
|
1089
1089
|
### Key Source Files
|
|
1090
1090
|
|
|
1091
|
-
| File
|
|
1092
|
-
|
|
|
1093
|
-
| `src/
|
|
1094
|
-
| `src/daemon/context-overflow-policy.ts`
|
|
1095
|
-
| `src/daemon/conversation-agent-loop.ts`
|
|
1096
|
-
| `src/config/core-schema.ts`
|
|
1091
|
+
| File | Purpose |
|
|
1092
|
+
| ------------------------------------------------------------- | ----------------------------------------------------------------------------- |
|
|
1093
|
+
| `src/plugins/defaults/compaction/context-overflow-reducer.ts` | Tiered reducer: four-tier pipeline with idempotent steps and cumulative state |
|
|
1094
|
+
| `src/daemon/context-overflow-policy.ts` | Overflow policy resolver: maps config + interactivity to concrete action |
|
|
1095
|
+
| `src/daemon/conversation-agent-loop.ts` | Integration: preflight budget check, convergence loop, emergency compaction |
|
|
1096
|
+
| `src/config/core-schema.ts` | `ContextOverflowRecoveryConfigSchema` with defaults and validation |
|
|
1097
1097
|
|
|
1098
1098
|
---
|
|
1099
1099
|
|
package/bun.lock
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"": {
|
|
6
6
|
"name": "@vellumai/assistant",
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@agentclientprotocol/sdk": "0.
|
|
8
|
+
"@agentclientprotocol/sdk": "0.25.0",
|
|
9
9
|
"@anthropic-ai/sdk": "0.78.0",
|
|
10
10
|
"@google/genai": "1.45.0",
|
|
11
11
|
"@modelcontextprotocol/sdk": "1.27.1",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"path-to-regexp": "8.4.2",
|
|
72
72
|
},
|
|
73
73
|
"packages": {
|
|
74
|
-
"@agentclientprotocol/sdk": ["@agentclientprotocol/sdk@0.
|
|
74
|
+
"@agentclientprotocol/sdk": ["@agentclientprotocol/sdk@0.25.0", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-wU1VgXNtMvdVotX49txc3WJUDV+/QbLpsgjMvFhlRmp37osdLbI7L7y+iwAlQATwfjLxcv1r1p3ZxZBcXlGhcQ=="],
|
|
75
75
|
|
|
76
76
|
"@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.78.0", "", { "dependencies": { "json-schema-to-ts": "^3.1.1" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["zod"], "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-PzQhR715td/m1UaaN5hHXjYB8Gl2lF9UVhrrGrZeysiF6Rb74Wc9GCB8hzLdzmQtBd1qe89F9OptgB9Za1Ib5w=="],
|
|
77
77
|
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
# Activation Funnel Telemetry — Runbook + Analytics Handoff
|
|
2
|
+
|
|
3
|
+
> **Linear:** JARVIS-1102 (event emission) — gates JARVIS-1092 (10% rollout) and JARVIS-1093 (dashboard).
|
|
4
|
+
> **Funnel version:** `activation_v1_2026_06`
|
|
5
|
+
> **LD flag:** `experiment-activation-flow-2026-06-03`
|
|
6
|
+
> **Cohort arm tag:** `ab_variant = "variant-a"` (treatment); `control` = the no-rail arm.
|
|
7
|
+
|
|
8
|
+
This doc is the single executable reference for the activation-rail funnel
|
|
9
|
+
telemetry: what it measures, how it flows, the event vocabulary, the dedup
|
|
10
|
+
contract, the local smoke-test runbook, the BigQuery verification query, and the
|
|
11
|
+
canonical handoff blurb for the dashboard work. It is meant to be runnable by
|
|
12
|
+
another engineer without reading the implementation.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 1. Overview — what it measures and how it flows
|
|
17
|
+
|
|
18
|
+
The activation funnel measures how far a new user gets on their first run of the
|
|
19
|
+
**activation rail** (the onboarding experience driven by
|
|
20
|
+
`BOOTSTRAP-ACTIVATION-RAIL.md`). It emits five milestone ("funnel") events per
|
|
21
|
+
session into the **existing onboarding telemetry substrate** — no new event type,
|
|
22
|
+
no new ingest endpoint, no new BigQuery table.
|
|
23
|
+
|
|
24
|
+
The north-star "≥5 user messages within 24h per LD variant" metric is **not** a
|
|
25
|
+
materialized activation event. It is computed downstream by joining the existing
|
|
26
|
+
per-user-message `turn` telemetry events (`turn_index` per conversation) to the
|
|
27
|
+
platform's `flag_assignment_raw` cohort-assignment table — so a dedicated event
|
|
28
|
+
and a custom daemon turn-counting hook are not needed.
|
|
29
|
+
|
|
30
|
+
Flow, end to end:
|
|
31
|
+
|
|
32
|
+
1. **Daemon records** an activation event into the SQLite `onboarding_events`
|
|
33
|
+
table via `recordActivationEvent()` in
|
|
34
|
+
`assistant/src/memory/onboarding-events-store.ts`:
|
|
35
|
+
- emission is **deterministic, tied to a `ui_show` surface** — there is no
|
|
36
|
+
model-facing tool. The model tags the surface it is already rendering for a
|
|
37
|
+
rail move with an optional `activation_moment` parameter on `ui_show`; the
|
|
38
|
+
daemon captures that tag on the surface's server-side state and records the
|
|
39
|
+
milestone (gated on `isActivationSession`). **Timing is per-moment**
|
|
40
|
+
(`ACTIVATION_MOMENT_EMIT_AT` in `activation-funnel.ts`): most moments record
|
|
41
|
+
when the user **commits** the surface (clicks an action / submits /
|
|
42
|
+
selects) via `handleSurfaceAction()`; the one exception is
|
|
43
|
+
`first_wow_executed`, which records at **render time** in
|
|
44
|
+
`surfaceProxyResolver` — the Run result/`work_result` surface is often
|
|
45
|
+
display-only and may never be committed, so a commit-time emit would never
|
|
46
|
+
fire (and deferring it to a later click would conflate "executed" with
|
|
47
|
+
"interacted"). Show-timing tags are recorded immediately and not stored, so
|
|
48
|
+
the commit path never double-emits. The token→step-name map and the
|
|
49
|
+
show/commit timing both live in
|
|
50
|
+
`assistant/src/telemetry/activation-funnel.ts`;
|
|
51
|
+
- emission is best-effort (wrapped in try/catch) and never blocks or alters
|
|
52
|
+
the surface-action flow;
|
|
53
|
+
- `recordActivationEvent` respects the `getConfig().collectUsageData` opt-out
|
|
54
|
+
gate (returns `null` / no row when disabled).
|
|
55
|
+
2. **Reporter flushes** every ~5 min: `usage-telemetry-reporter.ts`
|
|
56
|
+
(`REPORT_INTERVAL_MS = 5 * 60 * 1000`, with a one-time
|
|
57
|
+
`INITIAL_FLUSH_DELAY_MS = 30_000` after startup) POSTs unreported onboarding
|
|
58
|
+
rows to `/v1/telemetry/ingest/` as `type: "onboarding"` events, mapping the
|
|
59
|
+
funnel columns onto the wire shape.
|
|
60
|
+
3. **Platform ingests** the onboarding events and writes GCS NDJSON.
|
|
61
|
+
4. **BigQuery** exposes them via the external table
|
|
62
|
+
`vellum-ai-prod.telemetry.onboarding_raw`, which already carries the
|
|
63
|
+
`session_id / step_name / step_index / completed_at / funnel_version /
|
|
64
|
+
ab_variant` columns. The existing dbt model dedups on `daemon_event_id`
|
|
65
|
+
(earliest-wins).
|
|
66
|
+
|
|
67
|
+
No platform / dbt / terraform change is required — the activation events ride the
|
|
68
|
+
`type: "onboarding"` substrate that already exists end to end.
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 2. Event vocabulary
|
|
73
|
+
|
|
74
|
+
The single source of truth is `assistant/src/telemetry/activation-funnel.ts`
|
|
75
|
+
(`ACTIVATION_STEPS`). `funnel_version = "activation_v1_2026_06"`
|
|
76
|
+
(`ACTIVATION_FUNNEL_VERSION`). `ab_variant = "variant-a"`
|
|
77
|
+
(`ACTIVATION_AB_VARIANT`, the treatment arm).
|
|
78
|
+
|
|
79
|
+
Each step is recorded when the user commits the `ui_show` surface the model
|
|
80
|
+
tagged with the corresponding `activation_moment` token (see §1). The
|
|
81
|
+
token→step-name map is the `moment_*` column below.
|
|
82
|
+
|
|
83
|
+
| step_index | step_name | `activation_moment` token | Recorded on commit of |
|
|
84
|
+
| ---------- | --------------------------------- | ------------------------- | --------------------------------------------------------------- |
|
|
85
|
+
| 1 | `activation_moment_1_complete` | `moment_1` | Port-summary card OR no-port intake `choice` surface |
|
|
86
|
+
| 2 | `activation_moment_2_complete` | `moment_2` | Propose offer surface (the `ui_show` offer card/choice) |
|
|
87
|
+
| 3 | `activation_moment_3_complete` | `moment_3` | task-selection surface |
|
|
88
|
+
| 4 | `activation_first_wow_executed` | `first_wow_executed` | Run result surface (e.g. `work_result`) |
|
|
89
|
+
| 5 | `activation_first_wow_interacted` | `first_wow_interacted` | user clicks an action on the tagged result surface (see §1, §4) |
|
|
90
|
+
|
|
91
|
+
All five steps are recorded deterministically on surface commit. The north star
|
|
92
|
+
(≥5 user messages) is derived downstream from the existing `turn` telemetry, not
|
|
93
|
+
a materialized activation event (see §1).
|
|
94
|
+
|
|
95
|
+
On the wire, each onboarding event also sets `screen = step_name` (to satisfy the
|
|
96
|
+
SQLite `screen TEXT NOT NULL` column and the platform's legacy-path validation),
|
|
97
|
+
and `completed_at` is the ISO-8601 record time.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 3. Dedup contract
|
|
102
|
+
|
|
103
|
+
Activation rows carry a **deterministic** `daemon_event_id`:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
daemon_event_id = `${funnel_version}:${session_id}:${step_name}`
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Built by `buildActivationDaemonEventId()` in
|
|
110
|
+
`assistant/src/telemetry/activation-funnel.ts`. The reporter overrides
|
|
111
|
+
`daemon_event_id` for activation rows (where `session_id && step_name &&
|
|
112
|
+
funnel_version` are all present) and keys it on the **row's stored
|
|
113
|
+
`funnel_version`**, NOT the running binary's current constant. This keeps the id
|
|
114
|
+
stable across a version bump so rows queued offline / flushed after an upgrade
|
|
115
|
+
still collapse with already-ingested rows from the same session.
|
|
116
|
+
|
|
117
|
+
A moment that fires more than once (e.g. a model double-emit) therefore lands
|
|
118
|
+
with the same `daemon_event_id` and is collapsed downstream by the existing dbt
|
|
119
|
+
earliest-wins dedup on `daemon_event_id`. For boolean "moment complete"
|
|
120
|
+
semantics, earliest-wins is correct.
|
|
121
|
+
|
|
122
|
+
**Checkpoint safety:** the SQLite watermark cursor in the reporter advances on the
|
|
123
|
+
row `id` / `createdAt`, NOT on `daemon_event_id`. The deterministic id is a
|
|
124
|
+
wire-only override, so overriding it never affects flush checkpointing.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## 4. Cohort scoping
|
|
129
|
+
|
|
130
|
+
Events only emit for conversations explicitly marked as **activation-rail
|
|
131
|
+
sessions**:
|
|
132
|
+
|
|
133
|
+
- The marker lives in the `activation_sessions` table
|
|
134
|
+
(`assistant/src/memory/activation-session-store.ts`,
|
|
135
|
+
`markActivationSession` / `isActivationSession`).
|
|
136
|
+
- It is set in `assistant/src/prompts/system-prompt.ts` **only when the
|
|
137
|
+
`BOOTSTRAP-ACTIVATION-RAIL.md` template is actually active** (i.e.
|
|
138
|
+
`bootstrapTemplate === ACTIVATION_RAIL_BOOTSTRAP_TEMPLATE`), which the web
|
|
139
|
+
prechat context selects only for users whose
|
|
140
|
+
`experiment-activation-flow-2026-06-03` cohort puts them on the rail. (It is
|
|
141
|
+
also set up-front in `conversation.ts` `setOnboardingContext` so the marker is
|
|
142
|
+
available before the first turn's tool resolution.)
|
|
143
|
+
- Emission is **gated on the marker at commit time**: when a tagged `ui_show`
|
|
144
|
+
surface is committed, the daemon records the milestone only if
|
|
145
|
+
`isActivationSession(conversationId)` is true. A stray `activation_moment` tag
|
|
146
|
+
in a normal chat is therefore ignored and never pollutes the funnel. (`moment_4`
|
|
147
|
+
/ `first_wow_interacted` deduping is handled the same way as any other moment —
|
|
148
|
+
see the dedup contract in §3 — and the per-surface tag is cleared after the
|
|
149
|
+
first record so a single surface commit emits at most once.)
|
|
150
|
+
|
|
151
|
+
The activation **session id is the daemon `conversation_id`** of the rail
|
|
152
|
+
conversation. That same value is `session_id` on every activation event.
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## 5. Local smoke-test runbook
|
|
157
|
+
|
|
158
|
+
Goal: drive one dev session through the activation cohort, emit all five events,
|
|
159
|
+
flush, and verify rows in BigQuery. Executable by another engineer.
|
|
160
|
+
|
|
161
|
+
### 5.1 Put the dev user in the activation cohort
|
|
162
|
+
|
|
163
|
+
The rail is gated by the LD flag `experiment-activation-flow-2026-06-03`. Two
|
|
164
|
+
options:
|
|
165
|
+
|
|
166
|
+
- **In-app feature-flags override (fastest):** open the in-app Feature Flags
|
|
167
|
+
panel and force `experiment-activation-flow-2026-06-03` ON for the dev user.
|
|
168
|
+
- **LaunchDarkly targeting:** target the dev user for the flag in the LD
|
|
169
|
+
dashboard (per the LD-flag-two-repo convention, targeting is dashboard-side).
|
|
170
|
+
|
|
171
|
+
When the flag is ON, the web prechat context selects
|
|
172
|
+
`BOOTSTRAP-ACTIVATION-RAIL.md` as the bootstrap template, and the daemon marks
|
|
173
|
+
the conversation in `activation_sessions` on first build of the system prompt.
|
|
174
|
+
|
|
175
|
+
### 5.2 Confirm usage-data collection is enabled — and do NOT run in dev mode
|
|
176
|
+
|
|
177
|
+
Two gates must both be satisfied or no rows reach BigQuery:
|
|
178
|
+
|
|
179
|
+
1. `recordActivationEvent` no-ops when `config.collectUsageData` is false, so the
|
|
180
|
+
dev build/config must have usage-data collection enabled, or no rows are
|
|
181
|
+
written to SQLite.
|
|
182
|
+
2. **Dev mode disables the flush entirely.** `assistant/src/daemon/lifecycle.ts`
|
|
183
|
+
computes the effective setting as `collectUsageData = !isDevMode &&
|
|
184
|
+
config.collectUsageData`, so when the daemon runs in dev mode (`VELLUM_DEV=1`)
|
|
185
|
+
the `UsageTelemetryReporter` is never started — rows accumulate in SQLite but
|
|
186
|
+
are never POSTed, and the "wait/restart for flush" steps below will never
|
|
187
|
+
reach BigQuery. For an end-to-end smoke test, run the daemon **outside dev
|
|
188
|
+
mode** (so the reporter starts), or explicitly invoke the reporter's
|
|
189
|
+
`flush()` via a dev hook. The SQLite rows can still be inspected directly in
|
|
190
|
+
dev mode, but the BigQuery verification (§6) requires a real flush.
|
|
191
|
+
|
|
192
|
+
### 5.3 Start a fresh activation conversation and capture its id
|
|
193
|
+
|
|
194
|
+
Start a brand-new conversation with the flag ON (it must be the rail bootstrap, so
|
|
195
|
+
start it from the web prechat flow / activation entry, not an existing chat).
|
|
196
|
+
Note its `conversation_id` — this is the `session_id` you will query on.
|
|
197
|
+
|
|
198
|
+
If multiple daemons are running, kill ALL `daemon/main.ts` processes, remove
|
|
199
|
+
`~/.vellum/vellum.sock`, and start fresh, so the conversation is served by a known
|
|
200
|
+
daemon writing to a known SQLite DB.
|
|
201
|
+
|
|
202
|
+
### 5.4 Drive the rail through all five model moments
|
|
203
|
+
|
|
204
|
+
Work the conversation through the rail moves so the model tags each surface and
|
|
205
|
+
you commit it (the model tags surfaces via `ui_show`'s `activation_moment`
|
|
206
|
+
parameter; which surface maps to which moment is documented in
|
|
207
|
+
`BOOTSTRAP-ACTIVATION-RAIL.md` and §2). Each milestone records when YOU commit
|
|
208
|
+
the tagged surface:
|
|
209
|
+
|
|
210
|
+
1. Commit the Port-summary card / no-port intake `choice` → `activation_moment_1_complete`.
|
|
211
|
+
2. Commit the Propose offer surface → `activation_moment_2_complete`.
|
|
212
|
+
3. Commit the task-selection surface → `activation_moment_3_complete`.
|
|
213
|
+
4. Commit the Run result surface → `activation_first_wow_executed`.
|
|
214
|
+
5. Click an action on the result surface → `activation_first_wow_interacted`.
|
|
215
|
+
|
|
216
|
+
### 5.5 Force / await a telemetry flush
|
|
217
|
+
|
|
218
|
+
The reporter flushes on a schedule: a first flush ~30s after startup
|
|
219
|
+
(`INITIAL_FLUSH_DELAY_MS`) and then every ~5 min (`REPORT_INTERVAL_MS`). Either:
|
|
220
|
+
|
|
221
|
+
- **Wait** for the next scheduled flush (≤ ~5 min), or
|
|
222
|
+
- **Restart the daemon** to take the ~30s post-startup flush, or
|
|
223
|
+
- call the reporter's `flush()` path directly if you have a dev hook into the
|
|
224
|
+
running daemon.
|
|
225
|
+
|
|
226
|
+
A successful flush POSTs the unreported onboarding rows to
|
|
227
|
+
`/v1/telemetry/ingest/` as `type: "onboarding"` events.
|
|
228
|
+
|
|
229
|
+
### 5.6 Verify in BigQuery
|
|
230
|
+
|
|
231
|
+
Wait for the platform → GCS NDJSON → BigQuery pipeline to land the events, then
|
|
232
|
+
run the query in §6.
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## 6. BigQuery verification query
|
|
237
|
+
|
|
238
|
+
```sql
|
|
239
|
+
SELECT step_name, step_index, COUNT(*) AS n
|
|
240
|
+
FROM `vellum-ai-prod.telemetry.onboarding_raw`
|
|
241
|
+
WHERE funnel_version = 'activation_v1_2026_06'
|
|
242
|
+
AND session_id = '<dev conversation id>'
|
|
243
|
+
GROUP BY 1, 2
|
|
244
|
+
ORDER BY 2;
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
**Expected:** all five `activation_*` step names for the one session, step_index
|
|
248
|
+
1–5, each with `n = 1`:
|
|
249
|
+
|
|
250
|
+
```
|
|
251
|
+
activation_moment_1_complete | 1 | 1
|
|
252
|
+
activation_moment_2_complete | 2 | 1
|
|
253
|
+
activation_moment_3_complete | 3 | 1
|
|
254
|
+
activation_first_wow_executed | 4 | 1
|
|
255
|
+
activation_first_wow_interacted | 5 | 1
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
A missing row means that milestone never emitted (re-drive that rail move); an
|
|
259
|
+
`n > 1` before dbt dedup is harmless (the deterministic `daemon_event_id`
|
|
260
|
+
collapses it earliest-wins).
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## 7. Canonical handoff blurb (paste-ready for the final JARVIS-1102 PR description)
|
|
265
|
+
|
|
266
|
+
> **Activation funnel telemetry — handoff for JARVIS-1093.** The activation rail
|
|
267
|
+
> now emits five milestone funnel events into the existing onboarding telemetry
|
|
268
|
+
> substrate (`type: "onboarding"` → `/v1/telemetry/ingest/` → GCS NDJSON →
|
|
269
|
+
> `vellum-ai-prod.telemetry.onboarding_raw`), so no new event type, ingest
|
|
270
|
+
> endpoint, or BigQuery table is involved. Cohort is gated by the LaunchDarkly
|
|
271
|
+
> flag **`experiment-activation-flow-2026-06-03`**; only rail (treatment)
|
|
272
|
+
> conversations emit. Every event carries **`funnel_version =
|
|
273
|
+
"activation_v1_2026_06"`** and **`ab_variant`** tagged `"variant-a"` for
|
|
274
|
+
> treatment (`"control"` is the no-rail arm, measured for now from generic `turn`
|
|
275
|
+
> events). The event vocabulary (step_name → step_index): `activation_moment_1_complete`
|
|
276
|
+
> (1), `activation_moment_2_complete` (2), `activation_moment_3_complete` (3),
|
|
277
|
+
> `activation_first_wow_executed` (4), `activation_first_wow_interacted` (5).
|
|
278
|
+
> `session_id` is the rail conversation's id. The **north star** ("≥5 user
|
|
279
|
+
> messages within 24h per LD variant") is **not** a funnel event — compute it
|
|
280
|
+
> downstream by joining the existing `turn` telemetry events (`turn_index` per
|
|
281
|
+
> conversation) to the platform's `flag_assignment_raw` cohort-assignment table.
|
|
282
|
+
> **Dedup contract:** each row's `daemon_event_id` is deterministic,
|
|
283
|
+
> `${funnel_version}:${session_id}:${step_name}`, keyed on the row's stored
|
|
284
|
+
> `funnel_version`; the existing dbt earliest-wins dedup on `daemon_event_id`
|
|
285
|
+
> collapses any repeated moment to a single row. Build funnel conversion as a
|
|
286
|
+
> step_index 1→5 progression per `session_id`, filtered to `funnel_version =
|
|
287
|
+
'activation_v1_2026_06'`.
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## 8. Notes
|
|
292
|
+
|
|
293
|
+
- **JARVIS-1102 "naming check" (resolved).** Events fire **deterministically on
|
|
294
|
+
the real user commit of a `ui_show` surface, not every text turn**. The model
|
|
295
|
+
passively tags the surface for a rail move with `activation_moment`; the daemon
|
|
296
|
+
records the milestone in `handleSurfaceAction` when the user commits that
|
|
297
|
+
surface (firing conditions / surface→moment mapping documented in
|
|
298
|
+
`BOOTSTRAP-ACTIVATION-RAIL.md`). This removes the standalone
|
|
299
|
+
`emit_activation_event` tool (and its cohort preactivation) entirely and ties
|
|
300
|
+
emission to a genuine user action, resolving the naming-check open
|
|
301
|
+
interpretation.
|
|
302
|
+
- **Stream B (multivariate cohort flag conversion) is NOT in this work.** It is
|
|
303
|
+
gated on the platform team's in-flight string-flag serving — until the platform
|
|
304
|
+
can serve string/multivariate flags, flipping
|
|
305
|
+
`experiment-activation-flow-2026-06-03` boolean→multivariate client-side would
|
|
306
|
+
silently disable the live allowlisted rail. Until then, `ab_variant` is the
|
|
307
|
+
constant `"variant-a"` (only treatment runs the rail), and the **control side**
|
|
308
|
+
of the comparison is measured from generic `turn` events split by the
|
|
309
|
+
platform's experiment exposure mapping. Once Stream B lands, the daemon tags the
|
|
310
|
+
real assigned arm and the cross-cohort comparison works with zero rework.
|
|
@@ -1,43 +1,59 @@
|
|
|
1
1
|
# Echo plugin
|
|
2
2
|
|
|
3
|
-
Minimal example plugin. Observes
|
|
4
|
-
line per invocation to `stderr`:
|
|
3
|
+
Minimal example plugin. Observes the assistant's turn-lifecycle hooks and logs
|
|
4
|
+
one JSON line per hook invocation to `stderr`:
|
|
5
5
|
|
|
6
6
|
```json
|
|
7
|
-
{
|
|
8
|
-
|
|
7
|
+
{
|
|
8
|
+
"plugin": "echo",
|
|
9
|
+
"hook": "post-tool-use",
|
|
10
|
+
"conversationId": "conv_abc123"
|
|
11
|
+
}
|
|
9
12
|
```
|
|
10
13
|
|
|
11
14
|
Use this as a starting point for writing your own plugin, or as a quick way
|
|
12
|
-
to eyeball which
|
|
13
|
-
take.
|
|
15
|
+
to eyeball which hooks fire during a conversation.
|
|
14
16
|
|
|
15
|
-
For the full plugin authoring guide,
|
|
16
|
-
|
|
17
|
+
For the full plugin authoring guide — manifest shape, every contribution
|
|
18
|
+
surface, hook patterns, and conventions — see
|
|
19
|
+
[`experimental/plugins/README.md`](../../../../experimental/plugins/README.md).
|
|
20
|
+
[`simple-memory`](../../../../experimental/plugins/simple-memory/) is the
|
|
21
|
+
canonical reference implementation that exercises every wired surface.
|
|
17
22
|
|
|
18
23
|
## What it does
|
|
19
24
|
|
|
20
|
-
-
|
|
21
|
-
`
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
- Contributes one observer hook per turn-lifecycle event:
|
|
26
|
+
`user-prompt-submit`, `post-tool-use`, and `stop`.
|
|
27
|
+
- Each hook emits one line to `stderr` and returns `void`, so the threaded
|
|
28
|
+
context flows through unchanged.
|
|
29
|
+
- Never modifies the turn's messages, tool results, or stop decision. It is
|
|
30
|
+
purely observational — safe to stack alongside any other plugin.
|
|
31
|
+
|
|
32
|
+
## Directory layout
|
|
33
|
+
|
|
34
|
+
The assistant discovers a plugin by its `package.json` manifest and builds the
|
|
35
|
+
`Plugin` from the interface directories — `hooks/<name>.ts` files whose default
|
|
36
|
+
export is the hook function. Files under `src/` are internal helpers and are
|
|
37
|
+
not walked by the loader.
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
echo/
|
|
41
|
+
├── package.json # Manifest (name + @vellumai/plugin-api range)
|
|
42
|
+
├── README.md
|
|
43
|
+
├── hooks/
|
|
44
|
+
│ ├── user-prompt-submit.ts # default export = hook function
|
|
45
|
+
│ ├── post-tool-use.ts
|
|
46
|
+
│ └── stop.ts
|
|
47
|
+
└── src/
|
|
48
|
+
└── emit.ts # shared stderr emitter (not a surface)
|
|
49
|
+
```
|
|
28
50
|
|
|
29
51
|
## Install locally
|
|
30
52
|
|
|
31
53
|
The assistant scans `<workspaceDir>/plugins/*` (e.g.
|
|
32
|
-
`~/.vellum/workspace/plugins/`) for subdirectories containing a
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
enable it.
|
|
36
|
-
|
|
37
|
-
The plugin reads `registerPlugin` from `globalThis.__vellumPluginRuntime`,
|
|
38
|
-
which the daemon attaches before scanning plugins. This works against both
|
|
39
|
-
the `bun --compile`-bundled daemon binary AND a daemon running from
|
|
40
|
-
source — no special install procedure required either way.
|
|
54
|
+
`~/.vellum/workspace/plugins/`) for subdirectories containing a `package.json`
|
|
55
|
+
and loads each one during assistant startup. Dropping (or symlinking) this
|
|
56
|
+
directory in place is enough to enable it.
|
|
41
57
|
|
|
42
58
|
### Option 1 — symlink from the repo (simplest in-repo dev)
|
|
43
59
|
|
|
@@ -54,23 +70,10 @@ pick up changes.
|
|
|
54
70
|
### Option 2 — standalone copy
|
|
55
71
|
|
|
56
72
|
A plain `cp -R` of this directory into `~/.vellum/workspace/plugins/echo/`
|
|
57
|
-
works
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
at an absolute path inside any checkout — they're erased at compile time
|
|
62
|
-
and have no module-identity effect at runtime:
|
|
63
|
-
|
|
64
|
-
```ts
|
|
65
|
-
// before (repo-local):
|
|
66
|
-
import type { VellumPluginRuntime } from "../../../src/plugins/external-api.js";
|
|
67
|
-
import type { Plugin } from "../../../src/plugins/types.js";
|
|
68
|
-
// after (standalone, edit to your checkout path):
|
|
69
|
-
import type { VellumPluginRuntime } from "/path/to/vellum-assistant/assistant/src/plugins/external-api.js";
|
|
70
|
-
import type { Plugin } from "/path/to/vellum-assistant/assistant/src/plugins/types.js";
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
No runtime-import rewriting is needed — the bridge already handles that.
|
|
73
|
+
works as-is. The hooks import their types from the public `@vellumai/plugin-api`
|
|
74
|
+
specifier, which the daemon materializes as a workspace-level shim before it
|
|
75
|
+
loads any plugin — so the copied directory resolves it without any path
|
|
76
|
+
rewriting, in or out of a vellum-assistant checkout.
|
|
74
77
|
|
|
75
78
|
### Restart the assistant
|
|
76
79
|
|
|
@@ -84,24 +87,23 @@ vellum restart
|
|
|
84
87
|
## Verify it works
|
|
85
88
|
|
|
86
89
|
With the plugin installed and the assistant restarted, send any message
|
|
87
|
-
that exercises a
|
|
88
|
-
|
|
90
|
+
that exercises a turn — a conversation reply, a tool call — and tail the
|
|
91
|
+
assistant's stderr log:
|
|
89
92
|
|
|
90
93
|
```bash
|
|
91
94
|
tail -f ~/.vellum/daemon.log
|
|
92
95
|
```
|
|
93
96
|
|
|
94
|
-
You should see one line per
|
|
97
|
+
You should see one line per hook invocation, similar to:
|
|
95
98
|
|
|
96
99
|
```json
|
|
97
|
-
{
|
|
98
|
-
|
|
100
|
+
{
|
|
101
|
+
"plugin": "echo",
|
|
102
|
+
"hook": "post-tool-use",
|
|
103
|
+
"conversationId": "conv_abc123"
|
|
104
|
+
}
|
|
99
105
|
```
|
|
100
106
|
|
|
101
|
-
If a pipeline throws (for example, a tool that errors out), you'll see a
|
|
102
|
-
line with `"outcome":"error"` — the plugin rethrows after logging so the
|
|
103
|
-
original error still propagates.
|
|
104
|
-
|
|
105
107
|
## Uninstall
|
|
106
108
|
|
|
107
109
|
Remove the symlink (or the copied directory) and restart the assistant:
|
|
@@ -113,14 +115,13 @@ vellum restart
|
|
|
113
115
|
|
|
114
116
|
## Next steps
|
|
115
117
|
|
|
116
|
-
- Read [`
|
|
117
|
-
plugin authoring guide: manifest shape,
|
|
118
|
-
(observe / transform
|
|
119
|
-
|
|
120
|
-
troubleshooting.
|
|
118
|
+
- Read [`experimental/plugins/README.md`](../../../../experimental/plugins/README.md)
|
|
119
|
+
for the full plugin authoring guide: manifest shape, every contribution
|
|
120
|
+
surface, hook patterns (observe / transform), tool contributions, and
|
|
121
|
+
conventions.
|
|
121
122
|
- Look at the first-party default plugins under
|
|
122
|
-
`assistant/src/plugins/defaults/` for examples of
|
|
123
|
-
|
|
123
|
+
`assistant/src/plugins/defaults/` for examples of hooks that transform a
|
|
124
|
+
turn rather than just observing it.
|
|
124
125
|
- Build your own plugin by copying this directory, renaming the manifest
|
|
125
|
-
`name`, and replacing the observer with
|
|
126
|
-
|
|
126
|
+
`name`, and replacing the observer hooks with ones that do whatever you
|
|
127
|
+
need.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `post-tool-use` hook for the echo plugin.
|
|
3
|
+
*
|
|
4
|
+
* Purely observational — logs one structured line to stderr and returns
|
|
5
|
+
* `void`, leaving the tool result untouched.
|
|
6
|
+
*
|
|
7
|
+
* Convention: the default export is the function the harness invokes.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { PostToolUseContext } from "@vellumai/plugin-api";
|
|
11
|
+
|
|
12
|
+
import { emit } from "../src/emit.js";
|
|
13
|
+
|
|
14
|
+
export default async function postToolUse(
|
|
15
|
+
ctx: PostToolUseContext,
|
|
16
|
+
): Promise<void> {
|
|
17
|
+
emit("post-tool-use", ctx.conversationId);
|
|
18
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `stop` hook for the echo plugin.
|
|
3
|
+
*
|
|
4
|
+
* Purely observational — logs one structured line to stderr and returns
|
|
5
|
+
* `void`, leaving the stop decision untouched.
|
|
6
|
+
*
|
|
7
|
+
* Convention: the default export is the function the harness invokes.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { StopContext } from "@vellumai/plugin-api";
|
|
11
|
+
|
|
12
|
+
import { emit } from "../src/emit.js";
|
|
13
|
+
|
|
14
|
+
export default async function stop(ctx: StopContext): Promise<void> {
|
|
15
|
+
emit("stop", ctx.conversationId);
|
|
16
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `user-prompt-submit` hook for the echo plugin.
|
|
3
|
+
*
|
|
4
|
+
* Purely observational — logs one structured line to stderr and returns
|
|
5
|
+
* `void`, leaving the threaded context (message list, injections) untouched.
|
|
6
|
+
*
|
|
7
|
+
* Convention: the default export is the function the harness invokes.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { UserPromptSubmitContext } from "@vellumai/plugin-api";
|
|
11
|
+
|
|
12
|
+
import { emit } from "../src/emit.js";
|
|
13
|
+
|
|
14
|
+
export default async function userPromptSubmit(
|
|
15
|
+
ctx: UserPromptSubmitContext,
|
|
16
|
+
): Promise<void> {
|
|
17
|
+
emit("user-prompt-submit", ctx.conversationId);
|
|
18
|
+
}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vellumai/plugin-echo-example",
|
|
3
3
|
"version": "0.1.0",
|
|
4
|
-
"description": "Example plugin that observes every assistant
|
|
4
|
+
"description": "Example plugin that observes every assistant turn-lifecycle hook and logs one structured line per invocation to stderr. Meant as an authoring reference — not shipped with the assistant runtime.",
|
|
5
5
|
"private": true,
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
8
|
-
"main": "./register.ts",
|
|
9
8
|
"engines": {
|
|
10
9
|
"node": ">=20.12.0"
|
|
11
10
|
},
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared stderr emitter for the echo plugin's hooks.
|
|
3
|
+
*
|
|
4
|
+
* Files under `src/` are internal helpers — the external-plugin loader does
|
|
5
|
+
* not walk this directory, so it contributes no surface of its own. The
|
|
6
|
+
* `hooks/` files import from here.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export const PLUGIN_NAME = "echo";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* One line written to stderr per hook invocation. Kept intentionally compact —
|
|
13
|
+
* pino-style JSON so operators can pipe the assistant's stderr through `jq`
|
|
14
|
+
* without reshaping.
|
|
15
|
+
*/
|
|
16
|
+
export function emit(hook: string, conversationId: string): void {
|
|
17
|
+
const record = { plugin: PLUGIN_NAME, hook, conversationId };
|
|
18
|
+
process.stderr.write(`${JSON.stringify(record)}\n`);
|
|
19
|
+
}
|
|
@@ -194,8 +194,12 @@ export interface ProvidersFacet {
|
|
|
194
194
|
// Memory
|
|
195
195
|
// ---------------------------------------------------------------------------
|
|
196
196
|
|
|
197
|
-
/**
|
|
198
|
-
|
|
197
|
+
/**
|
|
198
|
+
* Valid message roles for `memory.addMessage`. The messages store is
|
|
199
|
+
* UI-facing (`ConversationMessage`), so only renderable turns are accepted —
|
|
200
|
+
* agent-context `system` rows are not persisted via this facet.
|
|
201
|
+
*/
|
|
202
|
+
export type MessageRole = "user" | "assistant";
|
|
199
203
|
|
|
200
204
|
/**
|
|
201
205
|
* Callable signature for `memory.addMessage`. Mirrors the daemon's
|
|
@@ -247,10 +251,7 @@ export interface Subscription {
|
|
|
247
251
|
export interface EventsFacet {
|
|
248
252
|
publish(event: AssistantEvent): Promise<void>;
|
|
249
253
|
subscribe(filter: Filter, cb: AssistantEventCallback): Subscription;
|
|
250
|
-
buildEvent(
|
|
251
|
-
message: ServerMessage,
|
|
252
|
-
conversationId?: string,
|
|
253
|
-
): AssistantEvent;
|
|
254
|
+
buildEvent(message: ServerMessage, conversationId?: string): AssistantEvent;
|
|
254
255
|
}
|
|
255
256
|
|
|
256
257
|
// ---------------------------------------------------------------------------
|