@vellumai/assistant 0.8.4 → 0.8.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +33 -1
- package/ARCHITECTURE.md +3 -3
- package/bunfig.toml +6 -1
- package/docs/browser-use-architecture-phase2.md +1 -1
- package/docs/credential-execution-service.md +6 -6
- package/docs/plugins.md +4 -3
- package/knip.json +2 -1
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +12 -13
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +4 -1
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +16 -14
- package/openapi.yaml +2748 -216
- package/package.json +1 -1
- package/src/__tests__/actor-token-service.test.ts +3 -2
- package/src/__tests__/agent-loop-exit-reason.test.ts +102 -9
- package/src/__tests__/agent-loop-override-profile.test.ts +2 -1
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +1 -0
- package/src/__tests__/agent-wake-override-profile.test.ts +1 -0
- package/src/__tests__/always-loaded-tools-guard.test.ts +2 -2
- package/src/__tests__/annotate-risk-options.test.ts +1 -0
- package/src/__tests__/anthropic-provider.test.ts +34 -37
- package/src/__tests__/approval-cascade.test.ts +1 -0
- package/src/__tests__/approval-routes-http.test.ts +9 -13
- package/src/__tests__/assert-not-live-db.ts +79 -0
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +12 -28
- package/src/__tests__/audit-log-rotation.test.ts +72 -18
- package/src/__tests__/auto-analysis-end-to-end.test.ts +6 -6
- package/src/__tests__/background-workers-disk-pressure.test.ts +8 -11
- package/src/__tests__/browser-skill-endstate.test.ts +3 -3
- package/src/__tests__/btw-routes.test.ts +5 -5
- package/src/__tests__/call-controller.test.ts +3 -3
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
- package/src/__tests__/channel-approval-routes.test.ts +3 -2
- package/src/__tests__/channel-guardian.test.ts +6 -5
- package/src/__tests__/channel-readiness-slack-remote.test.ts +175 -0
- package/src/__tests__/channel-reply-delivery.test.ts +35 -0
- package/src/__tests__/channel-retry-sweep.test.ts +320 -3
- package/src/__tests__/checker.test.ts +18 -27
- package/src/__tests__/compaction-events.test.ts +2 -0
- package/src/__tests__/compaction-trail-store.test.ts +264 -0
- package/src/__tests__/compactor-call-site-logging.test.ts +215 -0
- package/src/__tests__/compactor-preserved-tail-count.test.ts +1 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +12 -16
- package/src/__tests__/computer-use-tools.test.ts +14 -18
- package/src/__tests__/config-loader-backfill.test.ts +13 -28
- package/src/__tests__/config-loader-corrupt.test.ts +5 -5
- package/src/__tests__/config-loader-platform-defaults.test.ts +93 -26
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +3 -3
- package/src/__tests__/config-managed-gemini-defaults.test.ts +3 -4
- package/src/__tests__/config-schema.test.ts +10 -10
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/connection-model-compat.test.ts +83 -0
- package/src/__tests__/contacts-tools.test.ts +3 -2
- package/src/__tests__/context-token-estimator.test.ts +22 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +5 -0
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +2 -1
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +55 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +231 -2
- package/src/__tests__/conversation-agent-loop.test.ts +581 -54
- package/src/__tests__/conversation-analysis-routes.test.ts +1 -0
- package/src/__tests__/conversation-app-control-instantiation.test.ts +31 -24
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -0
- package/src/__tests__/conversation-attention-store.test.ts +101 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +3 -2
- package/src/__tests__/conversation-clear-safety.test.ts +25 -25
- package/src/__tests__/conversation-confirmation-signals.test.ts +1 -0
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-error.test.ts +61 -0
- package/src/__tests__/conversation-fork-crud.test.ts +239 -15
- package/src/__tests__/conversation-fork-route.test.ts +3 -2
- package/src/__tests__/conversation-history-web-search.test.ts +1 -0
- package/src/__tests__/conversation-inference-profile-list.test.ts +3 -2
- package/src/__tests__/conversation-inference-profile-route.test.ts +3 -2
- package/src/__tests__/conversation-lifecycle.test.ts +53 -11
- package/src/__tests__/conversation-list-source.test.ts +3 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +2 -1
- package/src/__tests__/{conversation-load-cleaned-at.test.ts → conversation-load-history-stripped.test.ts} +14 -13
- package/src/__tests__/conversation-pairing.test.ts +53 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +26 -7
- package/src/__tests__/conversation-process-callsite.test.ts +1 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
- package/src/__tests__/conversation-queue.test.ts +333 -291
- package/src/__tests__/conversation-routes-disk-view.test.ts +112 -18
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +33 -8
- package/src/__tests__/conversation-routes-slash-commands.test.ts +68 -2
- package/src/__tests__/conversation-runtime-assembly.test.ts +78 -0
- package/src/__tests__/conversation-skill-tools.test.ts +40 -147
- package/src/__tests__/conversation-slash-queue.test.ts +84 -32
- package/src/__tests__/conversation-slash-unknown.test.ts +5 -0
- package/src/__tests__/conversation-speed-override.test.ts +1 -0
- package/src/__tests__/conversation-store.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +46 -0
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-standalone.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -3
- package/src/__tests__/conversation-surfaces-table-action.test.ts +7 -17
- package/src/__tests__/conversation-sync-tags.test.ts +218 -35
- package/src/__tests__/conversation-title-service.test.ts +1 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +30 -0
- package/src/__tests__/conversation-usage.test.ts +1 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +6 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -1
- package/src/__tests__/credential-broker-browser-fill.test.ts +3 -3
- package/src/__tests__/credential-broker-server-use.test.ts +5 -5
- package/src/__tests__/credential-execution-client.test.ts +72 -1
- package/src/__tests__/credential-execution-feature-gates.test.ts +19 -19
- package/src/__tests__/credential-execution-tools.test.ts +6 -6
- package/src/__tests__/credential-health-service.test.ts +252 -3
- package/src/__tests__/credential-security-invariants.test.ts +6 -5
- package/src/__tests__/credential-vault-unit.test.ts +21 -21
- package/src/__tests__/credential-vault.test.ts +5 -5
- package/src/__tests__/cross-provider-web-search.test.ts +56 -2
- package/src/__tests__/db-connection-isolation.test.ts +7 -6
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +8 -10
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +7 -10
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +9 -15
- package/src/__tests__/db-test-helpers.ts +58 -0
- package/src/__tests__/disk-pressure-guard.test.ts +58 -41
- package/src/__tests__/disk-pressure-lifecycle.test.ts +13 -10
- package/src/__tests__/disk-pressure-routes.test.ts +0 -33
- package/src/__tests__/disk-pressure-tools.test.ts +0 -4
- package/src/__tests__/dm-persistence.test.ts +26 -40
- package/src/__tests__/document-create-dedupe.test.ts +189 -0
- package/src/__tests__/document-find-replace.test.ts +3 -2
- package/src/__tests__/document-tool-security.test.ts +81 -2
- package/src/__tests__/dynamic-page-surface.test.ts +2 -2
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +5 -4
- package/src/__tests__/email-html-renderer.test.ts +12 -0
- package/src/__tests__/encrypted-store-test-helpers.ts +56 -0
- package/src/__tests__/encrypted-store.test.ts +11 -9
- package/src/__tests__/feature-flag-test-helpers.ts +53 -0
- package/src/__tests__/filing-service.test.ts +1 -0
- package/src/__tests__/first-greeting.test.ts +62 -12
- package/src/__tests__/gateway-flag-listener.test.ts +236 -0
- package/src/__tests__/gemini-provider.test.ts +104 -0
- package/src/__tests__/guardian-action-sweep.test.ts +3 -2
- package/src/__tests__/guardian-dispatch.test.ts +0 -1
- package/src/__tests__/guardian-outbound-http.test.ts +10 -7
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +48 -3
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -1
- package/src/__tests__/heartbeat-disk-pressure.test.ts +5 -0
- package/src/__tests__/heartbeat-service.test.ts +5 -0
- package/src/__tests__/helpers/mock-logger.ts +26 -0
- package/src/__tests__/host-bash-routes.test.ts +1 -0
- package/src/__tests__/host-cu-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-file-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-shell-tool.test.ts +6 -5
- package/src/__tests__/host-transfer-routes-targeted.test.ts +1 -0
- package/src/__tests__/http-conversation-lineage.test.ts +3 -2
- package/src/__tests__/http-user-message-parity.test.ts +29 -7
- package/src/__tests__/identity-intro-cache.test.ts +133 -22
- package/src/__tests__/inbound-slack-persistence.test.ts +44 -72
- package/src/__tests__/inference-profile-reaper.test.ts +3 -2
- package/src/__tests__/inference-profile-session-ipc.test.ts +3 -2
- package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
- package/src/__tests__/injector-disk-pressure.test.ts +3 -17
- package/src/__tests__/inline-skill-load-permissions.test.ts +4 -4
- package/src/__tests__/list-messages-hidden-metadata.test.ts +80 -0
- package/src/__tests__/list-messages-tool-merge.test.ts +70 -11
- package/src/__tests__/llm-context-normalization.test.ts +42 -0
- package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
- package/src/__tests__/llm-resolver.test.ts +408 -9
- package/src/__tests__/llm-schema.test.ts +1 -1
- package/src/__tests__/llm-usage-store.test.ts +66 -0
- package/src/__tests__/logger.test.ts +89 -0
- package/src/__tests__/manual-token-reconciliation.test.ts +76 -1
- package/src/__tests__/mcp-abort-signal.test.ts +16 -2
- package/src/__tests__/mcp-client-auth.test.ts +14 -0
- package/src/__tests__/media-generate-image.test.ts +31 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
- package/src/__tests__/messaging-send-tool.test.ts +1 -0
- package/src/__tests__/migration-import-from-url.test.ts +3 -3
- package/src/__tests__/mock-gateway-ipc.ts +18 -2
- package/src/__tests__/model-intents.test.ts +4 -6
- package/src/__tests__/native-web-search.test.ts +30 -2
- package/src/__tests__/notification-deep-link.test.ts +62 -0
- package/src/__tests__/notification-guardian-path.test.ts +0 -1
- package/src/__tests__/oauth-commands-routes.test.ts +37 -0
- package/src/__tests__/oauth-provider-visibility.test.ts +8 -8
- package/src/__tests__/oauth-store.test.ts +3 -2
- package/src/__tests__/onboarding-template-contract.test.ts +4 -3
- package/src/__tests__/openai-provider.test.ts +54 -9
- package/src/__tests__/openai-responses-provider.test.ts +176 -14
- package/src/__tests__/openrouter-provider-only.test.ts +27 -5
- package/src/__tests__/outbound-slack-persistence.test.ts +46 -1
- package/src/__tests__/pending-interactions-resolved-event.test.ts +0 -1
- package/src/__tests__/persistence-pipeline.test.ts +139 -1
- package/src/__tests__/persistence-secret-redaction.test.ts +83 -12
- package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
- package/src/__tests__/platform.test.ts +2 -2
- package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
- package/src/__tests__/plugin-bootstrap.test.ts +11 -13
- package/src/__tests__/plugin-tool-contribution.test.ts +50 -40
- package/src/__tests__/plugin-types.test.ts +3 -2
- package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
- package/src/__tests__/pricing.test.ts +12 -0
- package/src/__tests__/process-message-background-slack.test.ts +21 -16
- package/src/__tests__/process-message-display-content.test.ts +19 -22
- package/src/__tests__/provider-catalog-visibility.test.ts +9 -9
- package/src/__tests__/provider-platform-proxy-integration.test.ts +216 -4
- package/src/__tests__/provider-registry-ollama.test.ts +45 -22
- package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
- package/src/__tests__/recording-handler.test.ts +1 -0
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
- package/src/__tests__/registry.test.ts +84 -84
- package/src/__tests__/relay-server.test.ts +10 -10
- package/src/__tests__/require-fresh-approval.test.ts +2 -2
- package/src/__tests__/runtime-attachment-metadata.test.ts +3 -2
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
- package/src/__tests__/schedule-store.test.ts +16 -1
- package/src/__tests__/scheduler-reuse-conversation.test.ts +48 -3
- package/src/__tests__/secret-ingress-http.test.ts +5 -1
- package/src/__tests__/secure-keys.test.ts +3 -3
- package/src/__tests__/send-endpoint-busy.test.ts +81 -42
- package/src/__tests__/server-history-render.test.ts +4 -1
- package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
- package/src/__tests__/skill-feature-flags-integration.test.ts +8 -10
- package/src/__tests__/skill-feature-flags.test.ts +16 -18
- package/src/__tests__/skill-load-feature-flag.test.ts +5 -5
- package/src/__tests__/skill-projection-feature-flag.test.ts +48 -37
- package/src/__tests__/skill-projection.benchmark.test.ts +7 -13
- package/src/__tests__/skill-tool-factory.test.ts +97 -96
- package/src/__tests__/slack-channel-config.test.ts +3 -3
- package/src/__tests__/subagent-call-site-routing.test.ts +11 -3
- package/src/__tests__/subagent-disposal.test.ts +27 -8
- package/src/__tests__/subagent-fork-notifications.test.ts +24 -9
- package/src/__tests__/subagent-fork-spawn.test.ts +13 -4
- package/src/__tests__/subagent-manager-notify.test.ts +20 -8
- package/src/__tests__/subagent-notify-parent.test.ts +6 -5
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +58 -0
- package/src/__tests__/subagent-tools.test.ts +2 -1
- package/src/__tests__/suggestion-routes.test.ts +2 -0
- package/src/__tests__/sync-message-contract.test.ts +59 -0
- package/src/__tests__/system-prompt.test.ts +183 -131
- package/src/__tests__/terminal-tools.test.ts +1 -1
- package/src/__tests__/test-preload-verifier.ts +68 -0
- package/src/__tests__/test-preload.ts +32 -39
- package/src/__tests__/tool-approval-handler.test.ts +1 -5
- package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +35 -12
- package/src/__tests__/tool-executor.test.ts +64 -72
- package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
- package/src/__tests__/tool-preview-lifecycle.test.ts +1 -0
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
- package/src/__tests__/twilio-routes.test.ts +3 -2
- package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
- package/src/__tests__/usage-routes.test.ts +3 -0
- package/src/__tests__/validate-input.test.ts +381 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +3 -2
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +2 -1
- package/src/__tests__/voice-session-bridge.test.ts +37 -28
- package/src/__tests__/workspace-git-service.test.ts +6 -5
- package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
- package/src/__tests__/workspace-migration-090-memory-router-cost-optimized-profile.test.ts +326 -0
- package/src/__tests__/workspace-migration-091-retighten-migration-onboarding-thread.test.ts +166 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
- package/src/acp/prepare-agent-env.ts +78 -0
- package/src/acp/session-manager.ts +6 -7
- package/src/agent/loop.ts +88 -0
- package/src/api/README.md +127 -0
- package/src/api/constants/call-sites.ts +27 -0
- package/src/api/events/assistant-outbound-attachment.ts +51 -0
- package/src/api/events/assistant-text-delta.ts +32 -0
- package/src/api/events/assistant-turn-start.ts +33 -0
- package/src/api/events/document-comment-created.ts +48 -0
- package/src/api/events/document-comment-deleted.ts +24 -0
- package/src/api/events/document-comment-reopened.ts +25 -0
- package/src/api/events/document-comment-resolved.ts +27 -0
- package/src/api/events/generation-cancelled.ts +24 -0
- package/src/api/events/generation-handoff.ts +41 -0
- package/src/api/events/message-complete.ts +42 -0
- package/src/api/events/open-url.ts +30 -0
- package/src/api/events/relationship-state-updated.ts +25 -0
- package/src/api/events/tool-use-start.ts +32 -0
- package/src/api/index.ts +129 -0
- package/src/api/package.json +10 -0
- package/src/api/responses/llm-context-response.ts +39 -0
- package/src/api/responses/llm-request-log-entry.ts +93 -0
- package/src/api/responses/memory-recall-log.ts +65 -0
- package/src/api/responses/memory-v2-activation-log.ts +78 -0
- package/src/background-wake/background-wake-routes.test.ts +868 -0
- package/src/background-wake/platform-client.test.ts +308 -0
- package/src/background-wake/platform-client.ts +167 -0
- package/src/background-wake/publisher.ts +91 -0
- package/src/background-wake/runtime-registry.ts +24 -0
- package/src/background-wake/wake-intent-hooks.test.ts +282 -0
- package/src/calls/guardian-dispatch.ts +1 -0
- package/src/calls/voice-session-bridge.ts +4 -4
- package/src/cli/commands/__tests__/browser.test.ts +23 -5
- package/src/cli/commands/__tests__/conversations-slack.test.ts +16 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
- package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
- package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
- package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +1 -0
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
- package/src/cli/commands/__tests__/notifications.test.ts +184 -40
- package/src/cli/commands/browser.ts +247 -0
- package/src/cli/commands/channels/__tests__/channels.test.ts +143 -0
- package/src/cli/commands/channels/index.ts +229 -0
- package/src/cli/commands/domain.ts +91 -41
- package/src/cli/commands/inference.ts +93 -40
- package/src/cli/commands/memory-v2-compare-render.ts +115 -0
- package/src/cli/commands/memory-v2.ts +176 -1
- package/src/cli/commands/memory-v3-render.ts +491 -0
- package/src/cli/commands/memory-v3.ts +567 -0
- package/src/cli/commands/notifications.ts +365 -55
- package/src/cli/lib/open-browser.ts +7 -2
- package/src/cli/program.ts +4 -0
- package/src/config/assistant-feature-flags.ts +39 -46
- package/src/config/bundled-skills/document-editor/SKILL.md +16 -3
- package/src/config/bundled-skills/document-editor/TOOLS.json +18 -0
- package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
- package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
- package/src/config/bundled-skills/schedule/SKILL.md +1 -1
- package/src/config/bundled-skills/schedule/TOOLS.json +2 -2
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -0
- package/src/config/bundled-tool-registry.ts +2 -0
- package/src/config/call-site-defaults.ts +8 -7
- package/src/config/feature-flag-cache.ts +86 -0
- package/src/config/feature-flag-registry.json +33 -17
- package/src/config/llm-context-resolution.ts +10 -1
- package/src/config/llm-resolver.ts +121 -15
- package/src/config/loader.ts +4 -5
- package/src/config/schemas/__tests__/memory-v2.test.ts +228 -1
- package/src/config/schemas/call-site-catalog.ts +21 -7
- package/src/config/schemas/heartbeat.ts +1 -1
- package/src/config/schemas/llm.ts +102 -2
- package/src/config/schemas/memory-v2.ts +272 -0
- package/src/config/schemas/memory.ts +2 -1
- package/src/config/schemas/services.ts +6 -2
- package/src/config/seed-inference-profiles.ts +36 -16
- package/src/context/compactor.ts +52 -0
- package/src/context/token-estimator.ts +10 -5
- package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
- package/src/conversations/message-consolidation.ts +404 -0
- package/src/credential-execution/executable-discovery.ts +40 -0
- package/src/credential-execution/process-manager.ts +6 -2
- package/src/credential-health/credential-health-service.ts +125 -40
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +3 -6
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +13 -15
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +2 -3
- package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -0
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +25 -12
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +1 -0
- package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +107 -0
- package/src/daemon/__tests__/web-search-status-text.test.ts +1 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +390 -80
- package/src/daemon/conversation-agent-loop.ts +244 -90
- package/src/daemon/conversation-error.ts +64 -6
- package/src/daemon/conversation-lifecycle.ts +27 -22
- package/src/daemon/conversation-messaging.ts +84 -43
- package/src/daemon/conversation-process.ts +74 -37
- package/src/daemon/conversation-runtime-assembly.ts +38 -17
- package/src/daemon/conversation-skill-tools.ts +14 -30
- package/src/daemon/conversation-surfaces.ts +69 -34
- package/src/daemon/conversation-tool-setup.ts +77 -32
- package/src/daemon/conversation-usage.ts +2 -0
- package/src/daemon/conversation.ts +40 -75
- package/src/daemon/daemon-control.ts +1 -1
- package/src/daemon/daemon-skill-host.ts +9 -2
- package/src/daemon/disk-pressure-guard.ts +39 -29
- package/src/daemon/first-greeting.ts +31 -13
- package/src/daemon/handlers/config-model.test.ts +1 -0
- package/src/daemon/handlers/conversations.ts +11 -3
- package/src/daemon/handlers/shared.ts +6 -1
- package/src/daemon/host-browser-proxy.ts +5 -5
- package/src/daemon/host-cu-proxy.ts +4 -4
- package/src/daemon/host-file-proxy.ts +4 -4
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/host-transfer-proxy.ts +10 -10
- package/src/daemon/lifecycle.ts +29 -26
- package/src/daemon/mcp-reload-service.ts +1 -1
- package/src/daemon/meet-manifest-loader.ts +11 -24
- package/src/daemon/message-types/conversations.ts +22 -27
- package/src/daemon/message-types/document-comments.ts +8 -44
- package/src/daemon/message-types/home.ts +2 -14
- package/src/daemon/message-types/integrations.ts +2 -7
- package/src/daemon/message-types/messages.ts +25 -48
- package/src/daemon/message-types/subagents.ts +6 -0
- package/src/daemon/message-types/sync.ts +14 -0
- package/src/daemon/process-message.ts +9 -9
- package/src/daemon/providers-setup.ts +1 -1
- package/src/daemon/server.ts +16 -0
- package/src/daemon/shutdown-handlers.ts +24 -5
- package/src/daemon/switch-inference-profile-tool.ts +62 -0
- package/src/daemon/tool-setup-types.ts +7 -0
- package/src/daemon/wake-target-adapter.ts +10 -0
- package/src/documents/document-store.ts +38 -0
- package/src/export/__tests__/transcript-formatter.test.ts +1 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +30 -1
- package/src/heartbeat/heartbeat-service.ts +63 -0
- package/src/home/__tests__/feed-writer.test.ts +161 -0
- package/src/home/__tests__/post-connect-feed.test.ts +1 -0
- package/src/home/__tests__/suggested-prompts.test.ts +55 -59
- package/src/home/feed-writer.ts +146 -7
- package/src/home/home-greeting.ts +0 -9
- package/src/home/suggested-prompts.ts +27 -154
- package/src/ipc/__tests__/cli-ipc.test.ts +1 -0
- package/src/ipc/gateway-client.test.ts +4 -1
- package/src/ipc/gateway-flag-listener.ts +123 -0
- package/src/ipc/skill-routes/__tests__/memory.test.ts +1 -0
- package/src/ipc/skill-routes/__tests__/registries.test.ts +36 -7
- package/src/ipc/skill-routes/memory.ts +4 -3
- package/src/ipc/skill-routes/registries.ts +35 -40
- package/src/memory/__tests__/db-async-query.test.ts +165 -0
- package/src/memory/__tests__/db-maintenance.test.ts +115 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +242 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +26 -5
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +1 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +8 -0
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +1 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +31 -0
- package/src/memory/auto-analysis-enqueue.ts +5 -1
- package/src/memory/conversation-attention-store.ts +17 -3
- package/src/memory/conversation-crud.ts +423 -182
- package/src/memory/conversation-starters-cadence.ts +3 -1
- package/src/memory/conversation-title-service.ts +19 -3
- package/src/memory/db-async-query.ts +214 -0
- package/src/memory/db-connection.ts +29 -19
- package/src/memory/db-init.ts +14 -0
- package/src/memory/db-maintenance.ts +30 -21
- package/src/memory/db-singleton.ts +77 -0
- package/src/memory/delivery-channels.ts +82 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +2 -4
- package/src/memory/graph/bootstrap.ts +8 -1
- package/src/memory/graph/capability-seed.ts +7 -3
- package/src/memory/graph/conversation-graph-memory.ts +100 -17
- package/src/memory/graph/extraction.ts +1 -5
- package/src/memory/graph/graph-search.ts +7 -1
- package/src/memory/graph/retriever.test.ts +3 -3
- package/src/memory/indexer.ts +28 -18
- package/src/memory/job-handlers/cleanup.ts +76 -18
- package/src/memory/job-handlers/conversation-starters.ts +1 -4
- package/src/memory/job-handlers/embedding.test.ts +3 -2
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -2
- package/src/memory/jobs/embed-pkb-file.ts +6 -1
- package/src/memory/jobs-store.ts +14 -0
- package/src/memory/jobs-worker.ts +66 -22
- package/src/memory/llm-request-log-source-clickhouse.ts +122 -2
- package/src/memory/llm-request-log-source-local.ts +31 -0
- package/src/memory/llm-request-log-source.ts +40 -2
- package/src/memory/llm-request-log-store.ts +228 -1
- package/src/memory/llm-usage-store.ts +24 -0
- package/src/memory/memory-retrospective-enqueue.ts +8 -1
- package/src/memory/memory-retrospective-job.ts +5 -0
- package/src/memory/memory-v2-activation-log-store.ts +110 -7
- package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
- package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
- package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
- package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
- package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
- package/src/memory/migrations/265-drop-provider-connection-status.ts +26 -0
- package/src/memory/migrations/266-messages-client-message-id.ts +43 -0
- package/src/memory/migrations/index.ts +19 -0
- package/src/memory/migrations/registry.ts +33 -0
- package/src/memory/schema/conversations.ts +10 -2
- package/src/memory/schema/inference.ts +0 -1
- package/src/memory/schema/infrastructure.ts +21 -0
- package/src/memory/tool-usage-store.ts +36 -8
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +5 -2
- package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
- package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
- package/src/memory/v2/__tests__/harness-metrics.test.ts +83 -0
- package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +230 -0
- package/src/memory/v2/__tests__/harness-runner.test.ts +135 -0
- package/src/memory/v2/__tests__/injection.test.ts +127 -98
- package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
- package/src/memory/v2/__tests__/router.test.ts +171 -3
- package/src/memory/v2/__tests__/sweep-job.test.ts +6 -3
- package/src/memory/v2/harness/compare.ts +57 -0
- package/src/memory/v2/harness/metrics.ts +128 -0
- package/src/memory/v2/harness/oracle.ts +145 -0
- package/src/memory/v2/harness/replay-input.ts +240 -0
- package/src/memory/v2/harness/retriever.ts +74 -0
- package/src/memory/v2/harness/router-retriever.ts +43 -0
- package/src/memory/v2/harness/runner.ts +112 -0
- package/src/memory/v2/harness/trace.ts +64 -0
- package/src/memory/v2/injection.ts +21 -15
- package/src/memory/v2/prompts/router.ts +26 -1
- package/src/memory/v2/qdrant.ts +14 -2
- package/src/memory/v2/router.ts +171 -18
- package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
- package/src/memory/v3/__tests__/consolidation-job.test.ts +466 -0
- package/src/memory/v3/__tests__/coretrieval-seed.test.ts +270 -0
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
- package/src/memory/v3/__tests__/edges.test.ts +706 -0
- package/src/memory/v3/__tests__/filter.test.ts +560 -0
- package/src/memory/v3/__tests__/gate.test.ts +637 -0
- package/src/memory/v3/__tests__/index-composition.test.ts +291 -0
- package/src/memory/v3/__tests__/loop.test.ts +775 -0
- package/src/memory/v3/__tests__/retriever.test.ts +226 -0
- package/src/memory/v3/__tests__/scouts.test.ts +489 -0
- package/src/memory/v3/__tests__/shadow-diff.test.ts +225 -0
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +398 -0
- package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
- package/src/memory/v3/__tests__/traversal.test.ts +508 -0
- package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
- package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
- package/src/memory/v3/__tests__/tree-walk.test.ts +784 -0
- package/src/memory/v3/__tests__/validate.test.ts +277 -0
- package/src/memory/v3/auto-edges.ts +223 -0
- package/src/memory/v3/coactivation-store.ts +124 -0
- package/src/memory/v3/consolidation-job.ts +323 -0
- package/src/memory/v3/coretrieval-seed.ts +240 -0
- package/src/memory/v3/edge-learning-job.ts +160 -0
- package/src/memory/v3/edges.ts +286 -0
- package/src/memory/v3/filter.ts +286 -0
- package/src/memory/v3/gate.ts +349 -0
- package/src/memory/v3/index-composition.ts +126 -0
- package/src/memory/v3/llm-capture.ts +46 -0
- package/src/memory/v3/loop.ts +430 -0
- package/src/memory/v3/maintenance.ts +144 -0
- package/src/memory/v3/prompt-context.ts +33 -0
- package/src/memory/v3/prompts/consolidation.ts +458 -0
- package/src/memory/v3/prompts/system-prompts.ts +196 -0
- package/src/memory/v3/retriever.ts +33 -0
- package/src/memory/v3/scouts.ts +431 -0
- package/src/memory/v3/shadow-diff.ts +287 -0
- package/src/memory/v3/shadow-middleware.ts +347 -0
- package/src/memory/v3/traversal.ts +211 -0
- package/src/memory/v3/tree-index.ts +237 -0
- package/src/memory/v3/tree-store.ts +394 -0
- package/src/memory/v3/tree-walk.ts +356 -0
- package/src/memory/v3/types.ts +65 -0
- package/src/memory/v3/validate.ts +323 -0
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +1 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +1 -0
- package/src/notifications/adapters/macos.ts +18 -1
- package/src/notifications/adapters/platform.ts +1 -1
- package/src/notifications/adapters/slack.ts +45 -11
- package/src/notifications/broadcaster.ts +114 -63
- package/src/notifications/conversation-pairing.ts +23 -3
- package/src/notifications/decision-engine.ts +1 -4
- package/src/notifications/decisions-store.ts +32 -1
- package/src/notifications/deliveries-store.ts +45 -0
- package/src/notifications/edit-notification.ts +201 -0
- package/src/notifications/emit-signal.ts +40 -50
- package/src/notifications/signal.ts +10 -0
- package/src/notifications/types.ts +37 -0
- package/src/oauth/byo-connection.test.ts +67 -3
- package/src/oauth/byo-connection.ts +32 -5
- package/src/oauth/connect-orchestrator.ts +9 -0
- package/src/oauth/connection-resolver.test.ts +76 -0
- package/src/oauth/connection-resolver.ts +49 -10
- package/src/oauth/manual-token-connection.ts +51 -3
- package/src/oauth/seed-providers.ts +3 -0
- package/src/permissions/approval-policy.test.ts +19 -5
- package/src/permissions/approval-policy.ts +14 -3
- package/src/permissions/checker.ts +21 -8
- package/src/permissions/prompter.ts +3 -3
- package/src/permissions/question-prompter.ts +5 -2
- package/src/permissions/secret-prompter.ts +2 -2
- package/src/platform/client.test.ts +24 -1
- package/src/platform/client.ts +8 -0
- package/src/platform/feature-gate.ts +15 -0
- package/src/plugin-api/index.ts +4 -0
- package/src/plugin-api/types.ts +7 -33
- package/src/plugins/defaults/index.ts +6 -0
- package/src/plugins/defaults/injectors.ts +20 -19
- package/src/plugins/defaults/persistence.ts +25 -6
- package/src/plugins/external-plugin-loader.ts +5 -68
- package/src/plugins/types.ts +68 -29
- package/src/proactive-artifact/aux-message-injector.ts +17 -4
- package/src/proactive-artifact/job.test.ts +1 -0
- package/src/prompts/__tests__/system-prompt.test.ts +4 -4
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
- package/src/prompts/persona-resolver.ts +36 -21
- package/src/prompts/sections.ts +39 -7
- package/src/prompts/system-prompt.ts +84 -221
- package/src/prompts/template-detection.ts +10 -4
- package/src/prompts/templates/BOOTSTRAP.md +9 -13
- package/src/prompts/templates/IDENTITY.md +0 -2
- package/src/prompts/templates/system-sections.ts +230 -8
- package/src/providers/__tests__/connection-model-compat.test.ts +233 -0
- package/src/providers/__tests__/registry-native-web-search.test.ts +122 -0
- package/src/providers/__tests__/retry-callsite.test.ts +85 -5
- package/src/providers/anthropic/client.ts +32 -66
- package/src/providers/call-site-routing.ts +42 -6
- package/src/providers/connection-model-compat.ts +61 -0
- package/src/providers/connection-resolution.ts +47 -14
- package/src/providers/fireworks/client.ts +1 -0
- package/src/providers/gemini/client.ts +70 -6
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +0 -2
- package/src/providers/inference/__tests__/base-url-security.test.ts +2 -3
- package/src/providers/inference/__tests__/{connections-status-label.test.ts → connections-label.test.ts} +12 -111
- package/src/providers/inference/adapter-factory.ts +3 -0
- package/src/providers/inference/auth.ts +0 -8
- package/src/providers/inference/connections.ts +3 -66
- package/src/providers/inference/resolve-auth.ts +2 -3
- package/src/providers/minimax/client.ts +106 -0
- package/src/providers/model-catalog.ts +78 -1
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +157 -5
- package/src/providers/openai/chat-completions-provider.ts +116 -15
- package/src/providers/openai/codex-models.ts +20 -0
- package/src/providers/openai/responses-provider.ts +87 -30
- package/src/providers/openrouter/client.ts +13 -8
- package/src/providers/provider-send-message.ts +20 -5
- package/src/providers/registry.ts +48 -8
- package/src/providers/retry.ts +50 -7
- package/src/providers/search-provider-catalog.ts +17 -9
- package/src/providers/thinking-config.ts +26 -1
- package/src/providers/types.ts +9 -0
- package/src/providers/usage-tracking.ts +2 -0
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/__tests__/agent-wake.test.ts +1 -0
- package/src/runtime/__tests__/background-job-runner.test.ts +1 -0
- package/src/runtime/access-request-helper.ts +1 -0
- package/src/runtime/agent-wake.ts +1 -0
- package/src/runtime/assistant-event-hub.ts +76 -6
- package/src/runtime/auth/route-policy.ts +46 -0
- package/src/runtime/btw-sidechain.ts +0 -6
- package/src/runtime/channel-readiness-service.ts +68 -0
- package/src/runtime/channel-reply-delivery.ts +23 -0
- package/src/runtime/channel-retry-sweep.ts +47 -14
- package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
- package/src/runtime/http-types.ts +0 -2
- package/src/runtime/migrations/vbundle-builder.ts +12 -4
- package/src/runtime/pending-interactions.ts +0 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -0
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +406 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +204 -0
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +209 -1
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -50
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +76 -9
- package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +35 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +3 -2
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +294 -0
- package/src/runtime/routes/__tests__/task-routes.test.ts +48 -3
- package/src/runtime/routes/acp-routes-list.test.ts +3 -0
- package/src/runtime/routes/acp-routes.test.ts +255 -6
- package/src/runtime/routes/acp-routes.ts +8 -1
- package/src/runtime/routes/app-management-routes.ts +111 -4
- package/src/runtime/routes/avatar-routes.ts +10 -10
- package/src/runtime/routes/background-wake-routes.ts +356 -0
- package/src/runtime/routes/browser-tabs-routes.ts +200 -0
- package/src/runtime/routes/btw-routes.ts +4 -10
- package/src/runtime/routes/conversation-analysis-routes.ts +6 -0
- package/src/runtime/routes/conversation-cli-routes.ts +1 -1
- package/src/runtime/routes/conversation-compaction-routes.ts +263 -0
- package/src/runtime/routes/conversation-list-routes.ts +159 -4
- package/src/runtime/routes/conversation-management-routes.ts +108 -26
- package/src/runtime/routes/conversation-query-routes.ts +200 -44
- package/src/runtime/routes/conversation-routes.ts +409 -521
- package/src/runtime/routes/conversation-starter-routes.ts +6 -3
- package/src/runtime/routes/conversations-import-routes.ts +19 -6
- package/src/runtime/routes/disk-pressure-routes.ts +1 -1
- package/src/runtime/routes/documents-routes.ts +10 -1
- package/src/runtime/routes/domain-routes.ts +60 -10
- package/src/runtime/routes/email-routes.ts +5 -2
- package/src/runtime/routes/events-routes.ts +54 -10
- package/src/runtime/routes/group-routes.ts +35 -8
- package/src/runtime/routes/home-feed-routes.ts +129 -0
- package/src/runtime/routes/host-browser-routes.ts +10 -2
- package/src/runtime/routes/host-cu-routes.ts +2 -2
- package/src/runtime/routes/identity-intro-cache.ts +61 -16
- package/src/runtime/routes/identity-routes.ts +30 -9
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +530 -6
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +57 -8
- package/src/runtime/routes/index.ts +10 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
- package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
- package/src/runtime/routes/inference-provider-connection-routes.ts +5 -26
- package/src/runtime/routes/integrations/vercel.ts +15 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
- package/src/runtime/routes/llm-context-normalization.ts +7 -2
- package/src/runtime/routes/memory-item-routes.ts +8 -3
- package/src/runtime/routes/memory-v2-routes.ts +215 -5
- package/src/runtime/routes/memory-v3-routes.ts +474 -0
- package/src/runtime/routes/migration-routes.ts +32 -28
- package/src/runtime/routes/notification-routes.ts +63 -1
- package/src/runtime/routes/oauth-commands-routes.ts +6 -1
- package/src/runtime/routes/plugins-routes.ts +337 -0
- package/src/runtime/routes/rename-conversation-routes.ts +6 -2
- package/src/runtime/routes/secret-routes.ts +25 -5
- package/src/runtime/routes/settings-routes.ts +12 -11
- package/src/runtime/routes/slack-channel-routes.ts +5 -4
- package/src/runtime/routes/surface-action-routes.ts +1 -38
- package/src/runtime/routes/surface-content-routes.ts +12 -5
- package/src/runtime/routes/surface-conversation-resolver.ts +65 -0
- package/src/runtime/routes/wipe-conversation-routes.ts +3 -0
- package/src/runtime/routes/workspace-routes.ts +25 -10
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -0
- package/src/runtime/slack-dm-text-delivery.ts +177 -0
- package/src/runtime/sync/resource-sync-events.ts +106 -38
- package/src/runtime/sync/sync-publisher.test.ts +49 -0
- package/src/runtime/sync/sync-publisher.ts +2 -1
- package/src/runtime/tool-grant-request-helper.ts +1 -0
- package/src/runtime/verification-outbound-actions.ts +73 -1
- package/src/schedule/schedule-store.ts +8 -1
- package/src/schedule/scheduler.ts +111 -15
- package/src/security/__tests__/provider-key-env-fallback.test.ts +3 -3
- package/src/security/encrypted-store.ts +7 -16
- package/src/security/store-path-override.ts +61 -0
- package/src/signals/user-message.ts +5 -8
- package/src/skills/validate-input.ts +177 -0
- package/src/subagent/manager.ts +13 -13
- package/src/subagent/types.ts +6 -0
- package/src/tasks/tool-sanitizer.ts +2 -2
- package/src/telemetry/types.ts +12 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
- package/src/telemetry/usage-telemetry-reporter.ts +1 -0
- package/src/tools/acp/spawn.test.ts +119 -0
- package/src/tools/acp/spawn.ts +15 -2
- package/src/tools/apps/definitions.ts +36 -28
- package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
- package/src/tools/ask-question/ask-question-tool.ts +38 -45
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +2 -8
- package/src/tools/browser/__tests__/pinned-tabs.test.ts +70 -0
- package/src/tools/browser/browser-execution.ts +16 -3
- package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +3 -0
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +12 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +27 -1
- package/src/tools/browser/cdp-client/factory.ts +100 -17
- package/src/tools/browser/cdp-client/local-cdp-client.ts +12 -0
- package/src/tools/browser/cdp-client/types.ts +65 -0
- package/src/tools/browser/pinned-tabs.ts +96 -40
- package/src/tools/computer-use/definitions.ts +282 -336
- package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
- package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
- package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
- package/src/tools/credentials/vault.ts +3 -9
- package/src/tools/document/document-tool.ts +189 -7
- package/src/tools/execution-target.ts +18 -23
- package/src/tools/executor.ts +24 -56
- package/src/tools/filesystem/edit.ts +3 -9
- package/src/tools/filesystem/list.ts +3 -9
- package/src/tools/filesystem/read.ts +3 -9
- package/src/tools/filesystem/write.ts +3 -9
- package/src/tools/host-filesystem/edit.test.ts +1 -0
- package/src/tools/host-filesystem/edit.ts +3 -9
- package/src/tools/host-filesystem/read.test.ts +1 -0
- package/src/tools/host-filesystem/read.ts +3 -9
- package/src/tools/host-filesystem/transfer.test.ts +31 -6
- package/src/tools/host-filesystem/transfer.ts +3 -9
- package/src/tools/host-filesystem/write.test.ts +1 -0
- package/src/tools/host-filesystem/write.ts +3 -9
- package/src/tools/host-terminal/host-shell.ts +3 -9
- package/src/tools/mcp/mcp-tool-factory.ts +1 -10
- package/src/tools/memory/register.test.ts +1 -1
- package/src/tools/memory/register.ts +4 -9
- package/src/tools/network/__tests__/managed-search-proxy.test.ts +282 -0
- package/src/tools/network/__tests__/web-search.test.ts +211 -3
- package/src/tools/network/managed-search-proxy.ts +183 -0
- package/src/tools/network/web-fetch.ts +3 -9
- package/src/tools/network/web-search.ts +224 -76
- package/src/tools/policy-context.ts +3 -1
- package/src/tools/registry.ts +150 -123
- package/src/tools/schedule/create.ts +1 -1
- package/src/tools/schema-transforms.ts +1 -1
- package/src/tools/skills/execute.ts +3 -9
- package/src/tools/skills/load.ts +3 -9
- package/src/tools/skills/skill-tool-factory.ts +18 -44
- package/src/tools/subagent/notify-parent.ts +3 -9
- package/src/tools/subagent/spawn.ts +3 -0
- package/src/tools/system/request-permission.ts +3 -9
- package/src/tools/terminal/shell.ts +3 -9
- package/src/tools/tool-approval-handler.ts +10 -4
- package/src/tools/tool-defaults.ts +94 -0
- package/src/tools/tool-name-aliases.ts +72 -14
- package/src/tools/types.ts +32 -101
- package/src/tools/ui-surface/definitions.ts +104 -108
- package/src/types/onboarding-context.ts +6 -0
- package/src/usage/attribution.ts +32 -1
- package/src/usage/pricing.ts +23 -0
- package/src/usage/types.ts +12 -0
- package/src/util/browser.ts +7 -2
- package/src/util/logger.ts +16 -7
- package/src/util/platform.ts +7 -2
- package/src/util/sqlite3-runtime.ts +65 -0
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
- package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
- package/src/workspace/migrations/090-memory-router-cost-optimized-profile.ts +109 -0
- package/src/workspace/migrations/091-retighten-migration-onboarding-thread.ts +41 -0
- package/src/workspace/migrations/registry.ts +6 -0
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
- package/src/__tests__/message-complete-display-id.test.ts +0 -175
- package/src/daemon/query-complexity-router.ts +0 -75
- package/src/prompts/cache-boundary.ts +0 -8
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inject required env vars for an ACP agent and preflight that they're set.
|
|
3
|
+
*
|
|
4
|
+
* Called by every code path that hands an `AcpAgentConfig` to
|
|
5
|
+
* `AcpSessionManager.spawn`. There are TWO such paths today — the HTTP
|
|
6
|
+
* route `/v1/acp/spawn` (`runtime/routes/acp-routes.ts:spawnSession`) and
|
|
7
|
+
* the skill tool `acp_spawn` (`tools/acp/spawn.ts:executeAcpSpawn`) — and
|
|
8
|
+
* before this helper existed the env-injection logic lived inline in the
|
|
9
|
+
* route only. The skill-tool path bypassed it entirely, so spawns landed
|
|
10
|
+
* with no `CLAUDE_CODE_OAUTH_TOKEN`, the SDK rejected the first prompt
|
|
11
|
+
* with "Authentication required", and the subprocess died as a zombie
|
|
12
|
+
* with no completion notification.
|
|
13
|
+
*
|
|
14
|
+
* The fix: have this single helper own injection + preflight, and have
|
|
15
|
+
* every caller route through it before calling `manager.spawn`.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { basename } from "node:path";
|
|
19
|
+
|
|
20
|
+
import { FailedDependencyError } from "../runtime/routes/errors.js";
|
|
21
|
+
import { credentialKey } from "../security/credential-key.js";
|
|
22
|
+
import { getSecureKeyAsync } from "../security/secure-keys.js";
|
|
23
|
+
import type { AcpAgentConfig } from "./types.js";
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Returns a NEW config with any required credentials merged into `env`.
|
|
27
|
+
* Does NOT mutate the input. Throws `FailedDependencyError` if a required
|
|
28
|
+
* credential is missing from both the user-supplied env override and the
|
|
29
|
+
* secure store.
|
|
30
|
+
*
|
|
31
|
+
* Gating is keyed off the resolved agent COMMAND (basename), not the
|
|
32
|
+
* user-facing agent id, so a custom `acp.agents.my-claude = { command:
|
|
33
|
+
* "claude-agent-acp", ... }` alias still gets the env it needs.
|
|
34
|
+
*
|
|
35
|
+
* For `claude-agent-acp` the only required env var is
|
|
36
|
+
* `CLAUDE_CODE_OAUTH_TOKEN`. Two provisioning routes converge on it, with
|
|
37
|
+
* config.json winning over the vault so explicit user overrides
|
|
38
|
+
* (per-workspace, rotated, etc.) are never silently clobbered:
|
|
39
|
+
* 1. `acp.agents.<id>.env.CLAUDE_CODE_OAUTH_TOKEN` in `config.json` —
|
|
40
|
+
* the user-supplied env override on the resolved agent config.
|
|
41
|
+
* 2. Secure store via CLI: `assistant credentials set --service acp \
|
|
42
|
+
* --field claude_oauth_token <token>` — written to the canonical
|
|
43
|
+
* `credential/{service}/{field}` key built by `credentialKey()`,
|
|
44
|
+
* used as fallback when (1) is unset.
|
|
45
|
+
* After resolution, this asserts the token is present (from either route)
|
|
46
|
+
* before spawning. The "fail-fast" throw is symmetric with the existing
|
|
47
|
+
* `binary_not_found` preflight in `resolveAcpAgent` and strictly better
|
|
48
|
+
* than a `warn` + zombie subprocess 10 seconds later.
|
|
49
|
+
*/
|
|
50
|
+
export async function prepareAgentEnv(
|
|
51
|
+
agentConfig: AcpAgentConfig,
|
|
52
|
+
): Promise<AcpAgentConfig> {
|
|
53
|
+
// Clone caller's config + env so we never mutate the resolver's cached
|
|
54
|
+
// agent reference. The local `env` binding sidesteps TS narrowing
|
|
55
|
+
// limitations on the optional `AcpAgentConfig.env` field.
|
|
56
|
+
const env: Record<string, string> = { ...(agentConfig.env ?? {}) };
|
|
57
|
+
const commandBasename = basename(agentConfig.command);
|
|
58
|
+
|
|
59
|
+
if (commandBasename === "claude-agent-acp") {
|
|
60
|
+
if (!env.CLAUDE_CODE_OAUTH_TOKEN) {
|
|
61
|
+
const claudeToken = await getSecureKeyAsync(
|
|
62
|
+
credentialKey("acp", "claude_oauth_token"),
|
|
63
|
+
);
|
|
64
|
+
if (claudeToken) {
|
|
65
|
+
env.CLAUDE_CODE_OAUTH_TOKEN = claudeToken;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (!env.CLAUDE_CODE_OAUTH_TOKEN) {
|
|
69
|
+
throw new FailedDependencyError(
|
|
70
|
+
"claude-agent-acp requires CLAUDE_CODE_OAUTH_TOKEN. " +
|
|
71
|
+
"Run: assistant credentials set --service acp --field claude_oauth_token <token> " +
|
|
72
|
+
"(or set it under acp.agents.<id>.env in config.json).",
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return { ...agentConfig, env };
|
|
78
|
+
}
|
|
@@ -306,7 +306,7 @@ export class AcpSessionManager {
|
|
|
306
306
|
*/
|
|
307
307
|
private teardownSession(acpSessionId: string, entry: SessionEntry): void {
|
|
308
308
|
for (const requestId of entry.clientHandler.pendingRequestIds) {
|
|
309
|
-
const interaction = pendingInteractions.resolve(requestId);
|
|
309
|
+
const interaction = pendingInteractions.resolve(requestId, "cancelled");
|
|
310
310
|
if (interaction?.directResolve) {
|
|
311
311
|
interaction.directResolve("deny");
|
|
312
312
|
}
|
|
@@ -460,14 +460,13 @@ export class AcpSessionManager {
|
|
|
460
460
|
current.parentConversationId,
|
|
461
461
|
);
|
|
462
462
|
if (parentConversation) {
|
|
463
|
-
const enqueueResult = parentConversation.enqueueMessage(
|
|
464
|
-
notifyMessage,
|
|
465
|
-
|
|
466
|
-
);
|
|
463
|
+
const enqueueResult = parentConversation.enqueueMessage({
|
|
464
|
+
content: notifyMessage,
|
|
465
|
+
});
|
|
467
466
|
if (!enqueueResult.queued && !enqueueResult.rejected) {
|
|
468
467
|
parentConversation
|
|
469
|
-
.persistUserMessage(notifyMessage
|
|
470
|
-
.then((messageId) =>
|
|
468
|
+
.persistUserMessage({ content: notifyMessage })
|
|
469
|
+
.then(({ id: messageId }) =>
|
|
471
470
|
parentConversation.runAgentLoop(notifyMessage, messageId),
|
|
472
471
|
)
|
|
473
472
|
.catch((err) => {
|
package/src/agent/loop.ts
CHANGED
|
@@ -103,6 +103,16 @@ export type AgentLoopExitReason =
|
|
|
103
103
|
| "checkpoint_handoff"
|
|
104
104
|
/** Context-window recovery exhausted and the turn ended with an error. */
|
|
105
105
|
| "context_too_large"
|
|
106
|
+
/**
|
|
107
|
+
* Auto-compress rerun (post-emergency-compaction, post-tier reducer)
|
|
108
|
+
* still yielded at the mid-loop budget checkpoint — the turn silently
|
|
109
|
+
* terminated with no further recovery layer to re-enter. Pure
|
|
110
|
+
* observability signal so the silent stall is attributable instead of
|
|
111
|
+
* leaving `agent_loop_exit_reason` NULL.
|
|
112
|
+
*/
|
|
113
|
+
| "budget_yield_unrecovered"
|
|
114
|
+
/** Provider stopped because the configured output-token limit was reached. */
|
|
115
|
+
| "max_tokens_reached"
|
|
106
116
|
/** User cancellation landed after a non-terminal checkpoint yield. */
|
|
107
117
|
| "aborted_after_checkpoint"
|
|
108
118
|
/** Signal aborted while the catch handler was synthesizing an error turn. */
|
|
@@ -111,9 +121,19 @@ export type AgentLoopExitReason =
|
|
|
111
121
|
| "error";
|
|
112
122
|
|
|
113
123
|
export type AgentEvent =
|
|
124
|
+
/**
|
|
125
|
+
* Emitted once per LLM call inside the loop, immediately before the
|
|
126
|
+
* `provider.sendMessage` invocation. Carries the optional `callSite` tag so
|
|
127
|
+
* downstream handlers (the daemon's persistence pipeline) can decide
|
|
128
|
+
* whether to reserve a row for this call. One `llm_call_started` precedes
|
|
129
|
+
* every `message_complete` for the same call; multi-call agent turns emit
|
|
130
|
+
* one pair per call.
|
|
131
|
+
*/
|
|
132
|
+
| { type: "llm_call_started"; callSite?: LLMCallSite }
|
|
114
133
|
| { type: "text_delta"; text: string }
|
|
115
134
|
| { type: "thinking_delta"; thinking: string }
|
|
116
135
|
| { type: "message_complete"; message: Message }
|
|
136
|
+
| { type: "max_tokens_reached"; stopReason: string }
|
|
117
137
|
| {
|
|
118
138
|
type: "tool_use";
|
|
119
139
|
id: string;
|
|
@@ -248,6 +268,18 @@ const DEFAULT_CONFIG: AgentLoopConfig = {
|
|
|
248
268
|
|
|
249
269
|
const MAX_CONSECUTIVE_ERROR_NUDGES = 3;
|
|
250
270
|
const MAX_EMPTY_RESPONSE_RETRIES = 1;
|
|
271
|
+
const MAX_TOKENS_STOP_REASONS = new Set([
|
|
272
|
+
"length",
|
|
273
|
+
"max_output_tokens",
|
|
274
|
+
"max_tokens",
|
|
275
|
+
]);
|
|
276
|
+
|
|
277
|
+
export function isMaxTokensStopReason(
|
|
278
|
+
stopReason: string | null | undefined,
|
|
279
|
+
): boolean {
|
|
280
|
+
if (!stopReason) return false;
|
|
281
|
+
return MAX_TOKENS_STOP_REASONS.has(stopReason.trim().toLowerCase());
|
|
282
|
+
}
|
|
251
283
|
|
|
252
284
|
/**
|
|
253
285
|
* Build a minimal {@link TurnContext} for pipeline invocations inside the
|
|
@@ -595,6 +627,16 @@ export class AgentLoop {
|
|
|
595
627
|
if (callSite) {
|
|
596
628
|
providerConfig.callSite = callSite;
|
|
597
629
|
providerConfig.usageTracking = "manual";
|
|
630
|
+
// Per-conversation seed for deterministic `mix`-profile expansion.
|
|
631
|
+
// Sourced from the orchestrator-supplied turn context's
|
|
632
|
+
// conversationId so every LLM call in a conversation resolves the
|
|
633
|
+
// same mix arm (stable across turns and retries, and across daemon
|
|
634
|
+
// restarts since the seed is the durable conversation id). Absent
|
|
635
|
+
// for standalone `AgentLoop` instances (unit tests / no turnContext)
|
|
636
|
+
// — those fall back to per-call random mix selection.
|
|
637
|
+
if (turnContext?.conversationId) {
|
|
638
|
+
providerConfig.selectionSeed = turnContext.conversationId;
|
|
639
|
+
}
|
|
598
640
|
}
|
|
599
641
|
|
|
600
642
|
// Per-call inference-profile override. The resolver layers
|
|
@@ -743,6 +785,18 @@ export class AgentLoop {
|
|
|
743
785
|
toolUseTurns,
|
|
744
786
|
);
|
|
745
787
|
|
|
788
|
+
// Announce the LLM-call boundary so downstream handlers (the
|
|
789
|
+
// daemon's persistence pipeline) can reserve an empty assistant row
|
|
790
|
+
// and stamp the resulting `messageId` onto every streaming event the
|
|
791
|
+
// call emits. Emit as late as possible — after history stripping,
|
|
792
|
+
// arg construction, and turn-context resolution — so the gap
|
|
793
|
+
// between "we said the call started" and the actual provider HTTP
|
|
794
|
+
// call is minimized. Awaited so the row is created and the
|
|
795
|
+
// `assistant_turn_start` wire event reaches the client BEFORE the
|
|
796
|
+
// provider starts streaming deltas — the deltas downstream will
|
|
797
|
+
// carry the freshly-reserved id.
|
|
798
|
+
await onEvent({ type: "llm_call_started", callSite });
|
|
799
|
+
|
|
746
800
|
// Inner try/catch narrows error-recording scope to the provider
|
|
747
801
|
// call itself. The outer agent-loop catch (below) wraps the entire
|
|
748
802
|
// turn body (tool execution, plugin pipelines, checkpoints), so
|
|
@@ -854,6 +908,40 @@ export class AgentLoop {
|
|
|
854
908
|
"LLM call complete",
|
|
855
909
|
);
|
|
856
910
|
|
|
911
|
+
if (isMaxTokensStopReason(response.stopReason)) {
|
|
912
|
+
const safeContent = response.content.filter(
|
|
913
|
+
(block) =>
|
|
914
|
+
block.type !== "tool_use" &&
|
|
915
|
+
block.type !== "server_tool_use" &&
|
|
916
|
+
block.type !== "web_search_tool_result",
|
|
917
|
+
);
|
|
918
|
+
const safeAssistantMessage: Message = {
|
|
919
|
+
role: "assistant",
|
|
920
|
+
content: safeContent,
|
|
921
|
+
};
|
|
922
|
+
rlog.warn(
|
|
923
|
+
{
|
|
924
|
+
turn: toolUseTurns,
|
|
925
|
+
stopReason: response.stopReason,
|
|
926
|
+
contentBlocks: response.content.length,
|
|
927
|
+
safeContentBlocks: safeContent.length,
|
|
928
|
+
toolUseCount: toolUseBlocks.length,
|
|
929
|
+
},
|
|
930
|
+
"LLM response reached output token limit",
|
|
931
|
+
);
|
|
932
|
+
history.push(safeAssistantMessage);
|
|
933
|
+
await onEvent({
|
|
934
|
+
type: "max_tokens_reached",
|
|
935
|
+
stopReason: response.stopReason,
|
|
936
|
+
});
|
|
937
|
+
await onEvent({
|
|
938
|
+
type: "message_complete",
|
|
939
|
+
message: safeAssistantMessage,
|
|
940
|
+
});
|
|
941
|
+
await emitExit("max_tokens_reached");
|
|
942
|
+
break;
|
|
943
|
+
}
|
|
944
|
+
|
|
857
945
|
// Detect empty responses: no user-visible text and no tool calls.
|
|
858
946
|
// This can happen when the model fails to produce output after
|
|
859
947
|
// receiving a large tool result. Retry once with a nudge before
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# @vellumai/assistant-api
|
|
2
|
+
|
|
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
|
+
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
|
+
>;
|