@vellumai/assistant 0.8.5 → 0.8.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +33 -1
- package/ARCHITECTURE.md +1 -1
- package/bunfig.toml +6 -1
- package/docs/credential-execution-service.md +6 -6
- package/docs/plugins.md +4 -3
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +12 -13
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +4 -1
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +16 -14
- package/openapi.yaml +1900 -166
- package/package.json +1 -1
- package/src/__tests__/actor-token-service.test.ts +3 -2
- package/src/__tests__/agent-loop-exit-reason.test.ts +102 -9
- package/src/__tests__/agent-loop-override-profile.test.ts +2 -1
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +1 -0
- package/src/__tests__/agent-wake-override-profile.test.ts +1 -0
- package/src/__tests__/always-loaded-tools-guard.test.ts +2 -2
- package/src/__tests__/annotate-risk-options.test.ts +1 -0
- package/src/__tests__/approval-cascade.test.ts +1 -0
- package/src/__tests__/approval-routes-http.test.ts +9 -13
- package/src/__tests__/assert-not-live-db.ts +79 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +9 -25
- package/src/__tests__/audit-log-rotation.test.ts +2 -2
- package/src/__tests__/auto-analysis-end-to-end.test.ts +6 -6
- package/src/__tests__/background-workers-disk-pressure.test.ts +5 -8
- package/src/__tests__/browser-skill-endstate.test.ts +3 -3
- package/src/__tests__/btw-routes.test.ts +3 -2
- package/src/__tests__/call-controller.test.ts +3 -2
- package/src/__tests__/channel-approval-routes.test.ts +3 -2
- package/src/__tests__/channel-guardian.test.ts +3 -2
- package/src/__tests__/channel-readiness-slack-remote.test.ts +175 -0
- package/src/__tests__/channel-reply-delivery.test.ts +35 -0
- package/src/__tests__/channel-retry-sweep.test.ts +320 -3
- package/src/__tests__/checker.test.ts +12 -12
- package/src/__tests__/compaction-events.test.ts +1 -0
- package/src/__tests__/compaction-trail-store.test.ts +264 -0
- package/src/__tests__/compactor-call-site-logging.test.ts +1 -0
- package/src/__tests__/compactor-preserved-tail-count.test.ts +1 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +7 -5
- package/src/__tests__/computer-use-tools.test.ts +12 -14
- package/src/__tests__/config-loader-backfill.test.ts +13 -28
- package/src/__tests__/config-loader-corrupt.test.ts +5 -5
- package/src/__tests__/config-loader-platform-defaults.test.ts +93 -26
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +3 -3
- package/src/__tests__/config-managed-gemini-defaults.test.ts +3 -4
- package/src/__tests__/config-schema.test.ts +10 -10
- package/src/__tests__/connection-model-compat.test.ts +83 -0
- package/src/__tests__/contacts-tools.test.ts +3 -2
- package/src/__tests__/context-token-estimator.test.ts +22 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +5 -0
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +55 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +34 -0
- package/src/__tests__/conversation-agent-loop.test.ts +488 -2
- package/src/__tests__/conversation-analysis-routes.test.ts +1 -0
- package/src/__tests__/conversation-app-control-instantiation.test.ts +29 -19
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -0
- package/src/__tests__/conversation-attention-store.test.ts +101 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +3 -2
- package/src/__tests__/conversation-confirmation-signals.test.ts +1 -0
- package/src/__tests__/conversation-error.test.ts +30 -0
- package/src/__tests__/conversation-fork-crud.test.ts +69 -8
- package/src/__tests__/conversation-fork-route.test.ts +3 -2
- package/src/__tests__/conversation-history-web-search.test.ts +1 -0
- package/src/__tests__/conversation-inference-profile-list.test.ts +3 -2
- package/src/__tests__/conversation-inference-profile-route.test.ts +3 -2
- package/src/__tests__/conversation-lifecycle.test.ts +1 -0
- package/src/__tests__/conversation-list-source.test.ts +3 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +2 -1
- package/src/__tests__/conversation-load-history-stripped.test.ts +1 -0
- package/src/__tests__/conversation-pairing.test.ts +53 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +26 -7
- package/src/__tests__/conversation-process-callsite.test.ts +1 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +5 -0
- package/src/__tests__/conversation-queue.test.ts +333 -291
- package/src/__tests__/conversation-routes-disk-view.test.ts +3 -18
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +33 -8
- package/src/__tests__/conversation-routes-slash-commands.test.ts +33 -2
- package/src/__tests__/conversation-runtime-assembly.test.ts +78 -0
- package/src/__tests__/conversation-skill-tools.test.ts +38 -142
- package/src/__tests__/conversation-slash-queue.test.ts +84 -32
- package/src/__tests__/conversation-slash-unknown.test.ts +5 -0
- package/src/__tests__/conversation-speed-override.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +46 -0
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-standalone.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -3
- package/src/__tests__/conversation-surfaces-table-action.test.ts +7 -17
- package/src/__tests__/conversation-sync-tags.test.ts +128 -12
- package/src/__tests__/conversation-title-service.test.ts +1 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +30 -0
- package/src/__tests__/conversation-usage.test.ts +1 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +1 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +5 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -0
- package/src/__tests__/credential-broker-browser-fill.test.ts +3 -3
- package/src/__tests__/credential-broker-server-use.test.ts +5 -5
- package/src/__tests__/credential-execution-client.test.ts +72 -1
- package/src/__tests__/credential-execution-feature-gates.test.ts +10 -12
- package/src/__tests__/credential-health-service.test.ts +252 -3
- package/src/__tests__/credential-security-invariants.test.ts +5 -5
- package/src/__tests__/credential-vault-unit.test.ts +19 -19
- package/src/__tests__/credential-vault.test.ts +5 -5
- package/src/__tests__/cross-provider-web-search.test.ts +56 -2
- package/src/__tests__/db-connection-isolation.test.ts +7 -6
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +8 -10
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +7 -10
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +9 -15
- package/src/__tests__/db-test-helpers.ts +58 -0
- package/src/__tests__/disk-pressure-guard.test.ts +58 -41
- package/src/__tests__/disk-pressure-lifecycle.test.ts +13 -10
- package/src/__tests__/disk-pressure-routes.test.ts +0 -33
- package/src/__tests__/disk-pressure-tools.test.ts +0 -4
- package/src/__tests__/dm-persistence.test.ts +26 -40
- package/src/__tests__/document-create-dedupe.test.ts +189 -0
- package/src/__tests__/document-find-replace.test.ts +3 -2
- package/src/__tests__/document-tool-security.test.ts +81 -2
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +5 -4
- package/src/__tests__/encrypted-store-test-helpers.ts +56 -0
- package/src/__tests__/encrypted-store.test.ts +11 -9
- package/src/__tests__/feature-flag-test-helpers.ts +53 -0
- package/src/__tests__/filing-service.test.ts +1 -0
- package/src/__tests__/first-greeting.test.ts +62 -12
- package/src/__tests__/gateway-flag-listener.test.ts +0 -1
- package/src/__tests__/gemini-provider.test.ts +26 -0
- package/src/__tests__/guardian-action-sweep.test.ts +3 -2
- package/src/__tests__/guardian-outbound-http.test.ts +3 -2
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +48 -3
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -0
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +1 -0
- package/src/__tests__/helpers/mock-logger.ts +26 -0
- package/src/__tests__/host-bash-routes.test.ts +1 -0
- package/src/__tests__/host-cu-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-file-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-shell-tool.test.ts +5 -4
- package/src/__tests__/host-transfer-routes-targeted.test.ts +1 -0
- package/src/__tests__/http-conversation-lineage.test.ts +3 -2
- package/src/__tests__/http-user-message-parity.test.ts +29 -7
- package/src/__tests__/identity-intro-cache.test.ts +133 -22
- package/src/__tests__/inbound-slack-persistence.test.ts +44 -72
- package/src/__tests__/inference-profile-reaper.test.ts +3 -2
- package/src/__tests__/inference-profile-session-ipc.test.ts +3 -2
- package/src/__tests__/injector-disk-pressure.test.ts +3 -17
- package/src/__tests__/inline-skill-load-permissions.test.ts +4 -4
- package/src/__tests__/list-messages-hidden-metadata.test.ts +80 -0
- package/src/__tests__/llm-context-normalization.test.ts +42 -0
- package/src/__tests__/llm-resolver.test.ts +331 -0
- package/src/__tests__/llm-schema.test.ts +1 -1
- package/src/__tests__/manual-token-reconciliation.test.ts +76 -1
- package/src/__tests__/mcp-abort-signal.test.ts +14 -0
- package/src/__tests__/mcp-client-auth.test.ts +14 -0
- package/src/__tests__/messaging-send-tool.test.ts +1 -0
- package/src/__tests__/migration-import-from-url.test.ts +3 -3
- package/src/__tests__/mock-gateway-ipc.ts +18 -2
- package/src/__tests__/model-intents.test.ts +3 -3
- package/src/__tests__/native-web-search.test.ts +30 -2
- package/src/__tests__/notification-deep-link.test.ts +62 -0
- package/src/__tests__/oauth-commands-routes.test.ts +37 -0
- package/src/__tests__/oauth-provider-visibility.test.ts +8 -8
- package/src/__tests__/oauth-store.test.ts +3 -2
- package/src/__tests__/onboarding-template-contract.test.ts +3 -2
- package/src/__tests__/openai-provider.test.ts +8 -9
- package/src/__tests__/openai-responses-provider.test.ts +70 -10
- package/src/__tests__/openrouter-provider-only.test.ts +27 -5
- package/src/__tests__/outbound-slack-persistence.test.ts +46 -1
- package/src/__tests__/persistence-pipeline.test.ts +139 -1
- package/src/__tests__/persistence-secret-redaction.test.ts +83 -12
- package/src/__tests__/plugin-bootstrap.test.ts +9 -11
- package/src/__tests__/plugin-tool-contribution.test.ts +41 -38
- package/src/__tests__/process-message-background-slack.test.ts +21 -16
- package/src/__tests__/process-message-display-content.test.ts +19 -22
- package/src/__tests__/provider-catalog-visibility.test.ts +9 -9
- package/src/__tests__/provider-platform-proxy-integration.test.ts +216 -4
- package/src/__tests__/provider-registry-ollama.test.ts +45 -22
- package/src/__tests__/recording-handler.test.ts +1 -0
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
- package/src/__tests__/registry.test.ts +82 -76
- package/src/__tests__/relay-server.test.ts +10 -10
- package/src/__tests__/runtime-attachment-metadata.test.ts +3 -2
- package/src/__tests__/schedule-store.test.ts +16 -1
- package/src/__tests__/scheduler-reuse-conversation.test.ts +48 -3
- package/src/__tests__/secret-ingress-http.test.ts +5 -1
- package/src/__tests__/secure-keys.test.ts +3 -3
- package/src/__tests__/send-endpoint-busy.test.ts +81 -42
- package/src/__tests__/server-history-render.test.ts +4 -1
- package/src/__tests__/skill-feature-flags-integration.test.ts +8 -10
- package/src/__tests__/skill-feature-flags.test.ts +14 -16
- package/src/__tests__/skill-load-feature-flag.test.ts +5 -5
- package/src/__tests__/skill-projection-feature-flag.test.ts +44 -30
- package/src/__tests__/skill-projection.benchmark.test.ts +5 -7
- package/src/__tests__/skill-tool-factory.test.ts +96 -95
- package/src/__tests__/slack-channel-config.test.ts +3 -3
- package/src/__tests__/subagent-call-site-routing.test.ts +11 -3
- package/src/__tests__/subagent-disposal.test.ts +27 -8
- package/src/__tests__/subagent-fork-notifications.test.ts +24 -9
- package/src/__tests__/subagent-fork-spawn.test.ts +13 -4
- package/src/__tests__/subagent-manager-notify.test.ts +20 -8
- package/src/__tests__/subagent-notify-parent.test.ts +5 -4
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +58 -0
- package/src/__tests__/subagent-tools.test.ts +2 -1
- package/src/__tests__/suggestion-routes.test.ts +1 -0
- package/src/__tests__/system-prompt.test.ts +38 -0
- package/src/__tests__/test-preload-verifier.ts +68 -0
- package/src/__tests__/test-preload.ts +32 -39
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +20 -7
- package/src/__tests__/tool-executor.test.ts +55 -10
- package/src/__tests__/tool-preview-lifecycle.test.ts +1 -0
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
- package/src/__tests__/twilio-routes.test.ts +3 -2
- package/src/__tests__/validate-input.test.ts +381 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +1 -0
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +2 -1
- package/src/__tests__/voice-session-bridge.test.ts +37 -28
- package/src/__tests__/workspace-migration-090-memory-router-cost-optimized-profile.test.ts +326 -0
- package/src/__tests__/workspace-migration-091-retighten-migration-onboarding-thread.test.ts +166 -0
- package/src/acp/session-manager.ts +5 -6
- package/src/agent/loop.ts +80 -0
- package/src/api/README.md +124 -2
- package/src/api/constants/call-sites.ts +27 -0
- package/src/api/events/assistant-outbound-attachment.ts +51 -0
- package/src/api/events/assistant-text-delta.ts +32 -0
- package/src/api/events/assistant-turn-start.ts +33 -0
- package/src/api/events/document-comment-created.ts +48 -0
- package/src/api/events/document-comment-deleted.ts +24 -0
- package/src/api/events/document-comment-reopened.ts +25 -0
- package/src/api/events/document-comment-resolved.ts +27 -0
- package/src/api/events/generation-cancelled.ts +24 -0
- package/src/api/events/generation-handoff.ts +41 -0
- package/src/api/events/message-complete.ts +42 -0
- package/src/api/events/open-url.ts +30 -0
- package/src/{events → api/events}/relationship-state-updated.ts +3 -3
- package/src/api/events/tool-use-start.ts +32 -0
- package/src/api/index.ts +128 -3
- package/src/api/responses/llm-context-response.ts +39 -0
- package/src/api/responses/llm-request-log-entry.ts +93 -0
- package/src/api/responses/memory-recall-log.ts +65 -0
- package/src/api/responses/memory-v2-activation-log.ts +78 -0
- package/src/background-wake/background-wake-routes.test.ts +687 -52
- package/src/background-wake/platform-client.test.ts +308 -0
- package/src/background-wake/platform-client.ts +167 -0
- package/src/background-wake/publisher.ts +91 -0
- package/src/background-wake/runtime-registry.ts +2 -2
- package/src/background-wake/wake-intent-hooks.test.ts +282 -0
- package/src/calls/guardian-dispatch.ts +1 -0
- package/src/calls/voice-session-bridge.ts +4 -4
- package/src/cli/commands/__tests__/conversations-slack.test.ts +16 -0
- package/src/cli/commands/__tests__/notifications.test.ts +184 -40
- package/src/cli/commands/channels/__tests__/channels.test.ts +143 -0
- package/src/cli/commands/channels/index.ts +229 -0
- package/src/cli/commands/memory-v3-render.ts +147 -0
- package/src/cli/commands/memory-v3.ts +255 -4
- package/src/cli/commands/notifications.ts +365 -55
- package/src/cli/lib/open-browser.ts +7 -2
- package/src/cli/program.ts +2 -0
- package/src/config/assistant-feature-flags.ts +23 -42
- package/src/config/bundled-skills/document-editor/SKILL.md +5 -1
- package/src/config/bundled-skills/schedule/SKILL.md +1 -1
- package/src/config/bundled-skills/schedule/TOOLS.json +2 -2
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -0
- package/src/config/call-site-defaults.ts +1 -1
- package/src/config/feature-flag-cache.ts +86 -0
- package/src/config/feature-flag-registry.json +17 -17
- package/src/config/llm-context-resolution.ts +10 -1
- package/src/config/llm-resolver.ts +121 -15
- package/src/config/loader.ts +4 -5
- package/src/config/schemas/__tests__/memory-v2.test.ts +15 -0
- package/src/config/schemas/heartbeat.ts +1 -1
- package/src/config/schemas/llm.ts +90 -1
- package/src/config/schemas/memory-v2.ts +26 -0
- package/src/config/schemas/services.ts +6 -2
- package/src/config/seed-inference-profiles.ts +36 -16
- package/src/context/token-estimator.ts +10 -5
- package/src/credential-execution/executable-discovery.ts +40 -0
- package/src/credential-execution/process-manager.ts +6 -2
- package/src/credential-health/credential-health-service.ts +125 -40
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +3 -6
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +13 -15
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -2
- package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -0
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +25 -12
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +1 -0
- package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +107 -0
- package/src/daemon/__tests__/web-search-status-text.test.ts +1 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +389 -68
- package/src/daemon/conversation-agent-loop.ts +132 -28
- package/src/daemon/conversation-error.ts +33 -5
- package/src/daemon/conversation-messaging.ts +84 -43
- package/src/daemon/conversation-process.ts +74 -37
- package/src/daemon/conversation-runtime-assembly.ts +29 -9
- package/src/daemon/conversation-skill-tools.ts +14 -30
- package/src/daemon/conversation-surfaces.ts +69 -34
- package/src/daemon/conversation-tool-setup.ts +33 -48
- package/src/daemon/conversation.ts +26 -46
- package/src/daemon/daemon-control.ts +1 -1
- package/src/daemon/daemon-skill-host.ts +9 -2
- package/src/daemon/disk-pressure-guard.ts +27 -29
- package/src/daemon/first-greeting.ts +31 -13
- package/src/daemon/handlers/shared.ts +6 -1
- package/src/daemon/lifecycle.ts +12 -12
- package/src/daemon/mcp-reload-service.ts +1 -1
- package/src/daemon/meet-manifest-loader.ts +10 -17
- package/src/daemon/message-types/conversations.ts +20 -22
- package/src/daemon/message-types/document-comments.ts +8 -44
- package/src/daemon/message-types/home.ts +2 -2
- package/src/daemon/message-types/integrations.ts +2 -7
- package/src/daemon/message-types/messages.ts +23 -38
- package/src/daemon/message-types/subagents.ts +6 -0
- package/src/daemon/process-message.ts +9 -9
- package/src/daemon/providers-setup.ts +1 -1
- package/src/daemon/server.ts +16 -0
- package/src/daemon/switch-inference-profile-tool.ts +13 -3
- package/src/daemon/tool-setup-types.ts +0 -6
- package/src/daemon/wake-target-adapter.ts +10 -0
- package/src/documents/document-store.ts +38 -0
- package/src/export/__tests__/transcript-formatter.test.ts +1 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +29 -0
- package/src/heartbeat/heartbeat-service.ts +63 -0
- package/src/home/__tests__/feed-writer.test.ts +161 -0
- package/src/home/__tests__/post-connect-feed.test.ts +1 -0
- package/src/home/__tests__/suggested-prompts.test.ts +55 -59
- package/src/home/feed-writer.ts +146 -7
- package/src/home/suggested-prompts.ts +27 -145
- package/src/ipc/__tests__/cli-ipc.test.ts +1 -0
- package/src/ipc/gateway-client.test.ts +4 -1
- package/src/ipc/skill-routes/__tests__/memory.test.ts +1 -0
- package/src/ipc/skill-routes/__tests__/registries.test.ts +36 -7
- package/src/ipc/skill-routes/memory.ts +4 -3
- package/src/ipc/skill-routes/registries.ts +28 -29
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +1 -0
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +26 -5
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +1 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +1 -0
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +1 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +31 -0
- package/src/memory/conversation-attention-store.ts +17 -3
- package/src/memory/conversation-crud.ts +352 -112
- package/src/memory/db-connection.ts +29 -19
- package/src/memory/db-init.ts +4 -0
- package/src/memory/db-singleton.ts +77 -0
- package/src/memory/delivery-channels.ts +82 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +2 -4
- package/src/memory/graph/retriever.test.ts +3 -3
- package/src/memory/job-handlers/embedding.test.ts +3 -2
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -2
- package/src/memory/jobs-worker.ts +12 -1
- package/src/memory/llm-request-log-source-clickhouse.ts +80 -0
- package/src/memory/llm-request-log-source-local.ts +24 -0
- package/src/memory/llm-request-log-source.ts +31 -0
- package/src/memory/llm-request-log-store.ts +188 -3
- package/src/memory/memory-v2-activation-log-store.ts +95 -1
- package/src/memory/migrations/265-drop-provider-connection-status.ts +26 -0
- package/src/memory/migrations/266-messages-client-message-id.ts +43 -0
- package/src/memory/migrations/index.ts +2 -0
- package/src/memory/schema/conversations.ts +9 -1
- package/src/memory/schema/inference.ts +0 -1
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +5 -2
- package/src/memory/v2/__tests__/harness-metrics.test.ts +9 -0
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +9 -4
- package/src/memory/v2/__tests__/harness-runner.test.ts +26 -0
- package/src/memory/v2/__tests__/sweep-job.test.ts +6 -3
- package/src/memory/v2/harness/metrics.ts +5 -1
- package/src/memory/v2/harness/replay-input.ts +19 -3
- package/src/memory/v2/harness/runner.ts +6 -0
- package/src/memory/v2/harness/trace.ts +6 -0
- package/src/memory/v3/__tests__/consolidation-job.test.ts +2 -4
- package/src/memory/v3/__tests__/coretrieval-seed.test.ts +270 -0
- package/src/memory/v3/__tests__/edges.test.ts +144 -1
- package/src/memory/v3/__tests__/filter.test.ts +48 -0
- package/src/memory/v3/__tests__/gate.test.ts +96 -33
- package/src/memory/v3/__tests__/index-composition.test.ts +58 -0
- package/src/memory/v3/__tests__/loop.test.ts +250 -5
- package/src/memory/v3/__tests__/scouts.test.ts +49 -0
- package/src/memory/v3/__tests__/shadow-diff.test.ts +225 -0
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +88 -2
- package/src/memory/v3/__tests__/traversal.test.ts +39 -0
- package/src/memory/v3/__tests__/tree-walk.test.ts +77 -0
- package/src/memory/v3/__tests__/validate.test.ts +32 -0
- package/src/memory/v3/coretrieval-seed.ts +240 -0
- package/src/memory/v3/edges.ts +58 -21
- package/src/memory/v3/filter.ts +27 -22
- package/src/memory/v3/gate.ts +51 -36
- package/src/memory/v3/index-composition.ts +18 -5
- package/src/memory/v3/loop.ts +65 -17
- package/src/memory/v3/scouts.ts +15 -4
- package/src/memory/v3/shadow-diff.ts +287 -0
- package/src/memory/v3/shadow-middleware.ts +44 -2
- package/src/memory/v3/traversal.ts +6 -1
- package/src/memory/v3/tree-walk.ts +6 -1
- package/src/memory/v3/validate.ts +56 -33
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +1 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +1 -0
- package/src/notifications/adapters/slack.ts +45 -11
- package/src/notifications/broadcaster.ts +114 -63
- package/src/notifications/conversation-pairing.ts +23 -3
- package/src/notifications/decisions-store.ts +32 -1
- package/src/notifications/deliveries-store.ts +45 -0
- package/src/notifications/edit-notification.ts +201 -0
- package/src/notifications/emit-signal.ts +11 -1
- package/src/notifications/signal.ts +10 -0
- package/src/notifications/types.ts +37 -0
- package/src/oauth/byo-connection.test.ts +67 -3
- package/src/oauth/byo-connection.ts +32 -5
- package/src/oauth/connect-orchestrator.ts +9 -0
- package/src/oauth/connection-resolver.test.ts +76 -0
- package/src/oauth/connection-resolver.ts +49 -10
- package/src/oauth/manual-token-connection.ts +51 -3
- package/src/oauth/seed-providers.ts +3 -0
- package/src/permissions/approval-policy.test.ts +19 -5
- package/src/permissions/approval-policy.ts +14 -3
- package/src/permissions/checker.ts +21 -8
- package/src/platform/client.test.ts +24 -1
- package/src/platform/client.ts +8 -0
- package/src/platform/feature-gate.ts +15 -0
- package/src/plugins/defaults/injectors.ts +2 -8
- package/src/plugins/defaults/persistence.ts +25 -6
- package/src/plugins/types.ts +57 -13
- package/src/proactive-artifact/job.test.ts +1 -0
- package/src/prompts/__tests__/system-prompt.test.ts +4 -4
- package/src/prompts/system-prompt.ts +38 -40
- package/src/prompts/template-detection.ts +10 -4
- package/src/prompts/templates/BOOTSTRAP.md +7 -11
- package/src/prompts/templates/IDENTITY.md +0 -2
- package/src/providers/__tests__/connection-model-compat.test.ts +3 -4
- package/src/providers/__tests__/registry-native-web-search.test.ts +122 -0
- package/src/providers/call-site-routing.ts +33 -9
- package/src/providers/connection-model-compat.ts +23 -0
- package/src/providers/connection-resolution.ts +39 -20
- package/src/providers/fireworks/client.ts +1 -0
- package/src/providers/gemini/client.ts +24 -3
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +0 -2
- package/src/providers/inference/__tests__/base-url-security.test.ts +2 -3
- package/src/providers/inference/__tests__/{connections-status-label.test.ts → connections-label.test.ts} +12 -111
- package/src/providers/inference/auth.ts +0 -8
- package/src/providers/inference/connections.ts +3 -66
- package/src/providers/inference/resolve-auth.ts +2 -3
- package/src/providers/model-catalog.ts +35 -1
- package/src/providers/model-intents.ts +3 -3
- package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +157 -5
- package/src/providers/openai/chat-completions-provider.ts +110 -12
- package/src/providers/openai/codex-models.ts +2 -0
- package/src/providers/openai/responses-provider.ts +53 -53
- package/src/providers/openrouter/client.ts +13 -8
- package/src/providers/provider-send-message.ts +18 -9
- package/src/providers/registry.ts +48 -8
- package/src/providers/retry.ts +16 -4
- package/src/providers/search-provider-catalog.ts +17 -9
- package/src/providers/types.ts +9 -0
- package/src/runtime/__tests__/agent-wake.test.ts +1 -0
- package/src/runtime/__tests__/background-job-runner.test.ts +1 -0
- package/src/runtime/access-request-helper.ts +1 -0
- package/src/runtime/auth/route-policy.ts +10 -0
- package/src/runtime/channel-readiness-service.ts +68 -0
- package/src/runtime/channel-reply-delivery.ts +23 -0
- package/src/runtime/channel-retry-sweep.ts +47 -14
- package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
- package/src/runtime/migrations/vbundle-builder.ts +3 -2
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -0
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +406 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -0
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +209 -1
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -50
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +51 -3
- package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +35 -0
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +3 -2
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +294 -0
- package/src/runtime/routes/__tests__/task-routes.test.ts +48 -3
- package/src/runtime/routes/acp-routes-list.test.ts +3 -0
- package/src/runtime/routes/app-management-routes.ts +111 -4
- package/src/runtime/routes/background-wake-routes.ts +188 -20
- package/src/runtime/routes/btw-routes.ts +4 -4
- package/src/runtime/routes/conversation-analysis-routes.ts +6 -0
- package/src/runtime/routes/conversation-compaction-routes.ts +263 -0
- package/src/runtime/routes/conversation-list-routes.ts +147 -0
- package/src/runtime/routes/conversation-management-routes.ts +39 -14
- package/src/runtime/routes/conversation-query-routes.ts +60 -10
- package/src/runtime/routes/conversation-routes.ts +186 -140
- package/src/runtime/routes/conversations-import-routes.ts +19 -6
- package/src/runtime/routes/documents-routes.ts +10 -1
- package/src/runtime/routes/group-routes.ts +11 -0
- package/src/runtime/routes/home-feed-routes.ts +129 -0
- package/src/runtime/routes/identity-intro-cache.ts +61 -16
- package/src/runtime/routes/identity-routes.ts +30 -9
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +530 -6
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +57 -8
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/inference-provider-connection-routes.ts +5 -26
- package/src/runtime/routes/integrations/vercel.ts +15 -0
- package/src/runtime/routes/llm-context-normalization.ts +7 -2
- package/src/runtime/routes/memory-v3-routes.ts +160 -2
- package/src/runtime/routes/migration-routes.ts +20 -13
- package/src/runtime/routes/notification-routes.ts +63 -1
- package/src/runtime/routes/oauth-commands-routes.ts +6 -1
- package/src/runtime/routes/surface-action-routes.ts +1 -38
- package/src/runtime/routes/surface-content-routes.ts +12 -5
- package/src/runtime/routes/surface-conversation-resolver.ts +65 -0
- package/src/runtime/routes/wipe-conversation-routes.ts +3 -0
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -0
- package/src/runtime/slack-dm-text-delivery.ts +177 -0
- package/src/runtime/sync/resource-sync-events.ts +1 -1
- package/src/runtime/tool-grant-request-helper.ts +1 -0
- package/src/schedule/schedule-store.ts +8 -1
- package/src/schedule/scheduler.ts +111 -15
- package/src/security/__tests__/provider-key-env-fallback.test.ts +3 -3
- package/src/security/encrypted-store.ts +7 -16
- package/src/security/store-path-override.ts +61 -0
- package/src/signals/user-message.ts +5 -8
- package/src/skills/validate-input.ts +177 -0
- package/src/subagent/manager.ts +13 -13
- package/src/subagent/types.ts +6 -0
- package/src/tasks/tool-sanitizer.ts +2 -2
- package/src/tools/apps/definitions.ts +35 -21
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +2 -8
- package/src/tools/computer-use/definitions.ts +268 -266
- package/src/tools/document/document-tool.ts +131 -8
- package/src/tools/execution-target.ts +2 -5
- package/src/tools/executor.ts +18 -55
- package/src/tools/host-filesystem/edit.test.ts +1 -0
- package/src/tools/host-filesystem/read.test.ts +1 -0
- package/src/tools/host-filesystem/transfer.test.ts +31 -6
- package/src/tools/host-filesystem/write.test.ts +1 -0
- package/src/tools/mcp/mcp-tool-factory.ts +0 -2
- package/src/tools/network/__tests__/managed-search-proxy.test.ts +282 -0
- package/src/tools/network/__tests__/web-search.test.ts +211 -3
- package/src/tools/network/managed-search-proxy.ts +183 -0
- package/src/tools/network/web-search.ts +199 -44
- package/src/tools/policy-context.ts +3 -1
- package/src/tools/registry.ts +146 -103
- package/src/tools/schedule/create.ts +1 -1
- package/src/tools/skills/skill-tool-factory.ts +17 -36
- package/src/tools/subagent/spawn.ts +3 -0
- package/src/tools/tool-approval-handler.ts +10 -4
- package/src/tools/tool-name-aliases.ts +72 -14
- package/src/tools/types.ts +17 -15
- package/src/tools/ui-surface/definitions.ts +98 -86
- package/src/types/onboarding-context.ts +6 -0
- package/src/usage/attribution.ts +32 -1
- package/src/util/browser.ts +7 -2
- package/src/workspace/migrations/090-memory-router-cost-optimized-profile.ts +109 -0
- package/src/workspace/migrations/091-retighten-migration-onboarding-thread.ts +41 -0
- package/src/workspace/migrations/registry.ts +4 -0
|
@@ -40,11 +40,7 @@ import type { SkillRoute } from "../runtime/skill-route-registry.js";
|
|
|
40
40
|
import { registerSkillRoute } from "../runtime/skill-route-registry.js";
|
|
41
41
|
import { getRepoSkillsDir } from "../skills/catalog-install.js";
|
|
42
42
|
import { registerExternalTools } from "../tools/registry.js";
|
|
43
|
-
import type {
|
|
44
|
-
ExecutionTarget,
|
|
45
|
-
Tool,
|
|
46
|
-
ToolContext,
|
|
47
|
-
} from "../tools/types.js";
|
|
43
|
+
import type { ExecutionTarget, Tool, ToolContext } from "../tools/types.js";
|
|
48
44
|
import { RiskLevel } from "../tools/types.js";
|
|
49
45
|
import { getLogger } from "../util/logger.js";
|
|
50
46
|
import { getSkillRuntimePath } from "../util/platform.js";
|
|
@@ -129,7 +125,6 @@ function serializeToolContext(context: ToolContext): Record<string, unknown> {
|
|
|
129
125
|
function buildProxyTool(
|
|
130
126
|
entry: ManifestToolEntry,
|
|
131
127
|
supervisor: MeetHostSupervisor,
|
|
132
|
-
manifestHash: string,
|
|
133
128
|
): Tool {
|
|
134
129
|
const risk = coerceRiskLevel(entry.risk, entry.name);
|
|
135
130
|
return {
|
|
@@ -138,12 +133,7 @@ function buildProxyTool(
|
|
|
138
133
|
input_schema: (entry.input_schema as object) ?? {},
|
|
139
134
|
category: entry.category,
|
|
140
135
|
defaultRiskLevel: risk,
|
|
141
|
-
executionMode: "proxy",
|
|
142
136
|
executionTarget: "host" as ExecutionTarget,
|
|
143
|
-
origin: "skill",
|
|
144
|
-
ownerSkillId: MEET_SKILL_ID,
|
|
145
|
-
ownerSkillBundled: true,
|
|
146
|
-
ownerSkillVersionHash: manifestHash,
|
|
147
137
|
execute: async (input, context) => {
|
|
148
138
|
// `dispatchTool` ensures the meet-host child is up + connected
|
|
149
139
|
// before sending the frame, so callers don't need a separate
|
|
@@ -318,7 +308,10 @@ export interface MeetManifestLoaderDeps {
|
|
|
318
308
|
/** Override for the manifest path resolver. */
|
|
319
309
|
manifestPath?: string;
|
|
320
310
|
/** Override for {@link registerExternalTools}. */
|
|
321
|
-
registerTools?: (
|
|
311
|
+
registerTools?: (
|
|
312
|
+
owner: { kind: "skill" | "plugin" | "mcp"; id: string },
|
|
313
|
+
provider: () => Tool[],
|
|
314
|
+
) => void;
|
|
322
315
|
/** Override for {@link registerSkillRoute}. */
|
|
323
316
|
registerRoute?: (route: SkillRoute) => unknown;
|
|
324
317
|
/** Override for {@link registerShutdownHook}. */
|
|
@@ -361,11 +354,11 @@ export async function loadMeetManifestProxies(
|
|
|
361
354
|
|
|
362
355
|
// Tool provider resolves the full proxy list lazily so the tool manifest
|
|
363
356
|
// reflects the manifest file at `initializeTools()` time — same timing
|
|
364
|
-
// contract as the in-process skill's provider closure.
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
),
|
|
357
|
+
// contract as the in-process skill's provider closure. Owner is recorded
|
|
358
|
+
// up-front so `getToolOwner(name)` returns the meet-join skill id without
|
|
359
|
+
// the tool object having to carry it.
|
|
360
|
+
registerTools({ kind: "skill", id: MEET_SKILL_ID }, () =>
|
|
361
|
+
manifest.tools.map((entry) => buildProxyTool(entry, supervisor)),
|
|
369
362
|
);
|
|
370
363
|
|
|
371
364
|
for (const entry of manifest.routes) {
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
// Conversation lifecycle, auth, model config, and history types.
|
|
2
2
|
|
|
3
|
+
import type { GenerationCancelledEvent } from "../../api/events/generation-cancelled.js";
|
|
4
|
+
import type { GenerationHandoffEvent } from "../../api/events/generation-handoff.js";
|
|
3
5
|
import type {
|
|
4
6
|
ChannelId,
|
|
5
7
|
HostProxyInterfaceId,
|
|
@@ -309,26 +311,6 @@ export interface AssistantStatusMessage {
|
|
|
309
311
|
keyFingerprint?: string;
|
|
310
312
|
}
|
|
311
313
|
|
|
312
|
-
export interface GenerationCancelled {
|
|
313
|
-
type: "generation_cancelled";
|
|
314
|
-
conversationId?: string;
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
export interface GenerationHandoff {
|
|
318
|
-
type: "generation_handoff";
|
|
319
|
-
conversationId: string;
|
|
320
|
-
requestId?: string;
|
|
321
|
-
queuedCount: number;
|
|
322
|
-
attachments?: UserMessageAttachment[];
|
|
323
|
-
attachmentWarnings?: string[];
|
|
324
|
-
/**
|
|
325
|
-
* Database ID of the completed assistant turn — the id that survives
|
|
326
|
-
* query-time merging when a turn persists multiple assistant rows. Matches
|
|
327
|
-
* the row the messages route returns.
|
|
328
|
-
*/
|
|
329
|
-
messageId?: string;
|
|
330
|
-
}
|
|
331
|
-
|
|
332
314
|
export interface ModelInfo {
|
|
333
315
|
type: "model_info";
|
|
334
316
|
conversationId?: string;
|
|
@@ -456,6 +438,20 @@ export interface UsageUpdate {
|
|
|
456
438
|
contextWindowMaxTokens?: number;
|
|
457
439
|
}
|
|
458
440
|
|
|
441
|
+
/**
|
|
442
|
+
* Emitted after each LLM call with per-call token deltas and estimated cost.
|
|
443
|
+
* Clients accumulate these additively for live-updating usage metrics.
|
|
444
|
+
* This is a UI-only hint — it does not persist to DB or affect billing.
|
|
445
|
+
*/
|
|
446
|
+
export interface UsageProgress {
|
|
447
|
+
type: "usage_progress";
|
|
448
|
+
conversationId: string;
|
|
449
|
+
inputTokens: number;
|
|
450
|
+
outputTokens: number;
|
|
451
|
+
estimatedCost: number;
|
|
452
|
+
model: string;
|
|
453
|
+
}
|
|
454
|
+
|
|
459
455
|
export interface UsageResponse {
|
|
460
456
|
type: "usage_response";
|
|
461
457
|
totalInputTokens: number;
|
|
@@ -553,6 +549,7 @@ export type ConversationErrorCode =
|
|
|
553
549
|
| "MANAGED_KEY_INVALID"
|
|
554
550
|
| "CONTEXT_TOO_LARGE"
|
|
555
551
|
| "BUDGET_YIELD_UNRECOVERED"
|
|
552
|
+
| "MAX_TOKENS_REACHED"
|
|
556
553
|
| "CONVERSATION_ABORTED"
|
|
557
554
|
| "CONVERSATION_PROCESSING_FAILED"
|
|
558
555
|
| "DISK_SPACE_CRITICAL"
|
|
@@ -645,12 +642,13 @@ export type _ConversationsServerMessages =
|
|
|
645
642
|
| AuthResult
|
|
646
643
|
| PongMessage
|
|
647
644
|
| AssistantStatusMessage
|
|
648
|
-
|
|
|
649
|
-
|
|
|
645
|
+
| GenerationCancelledEvent
|
|
646
|
+
| GenerationHandoffEvent
|
|
650
647
|
| ModelInfo
|
|
651
648
|
| HistoryResponse
|
|
652
649
|
| UndoComplete
|
|
653
650
|
| UsageUpdate
|
|
651
|
+
| UsageProgress
|
|
654
652
|
| UsageResponse
|
|
655
653
|
| ContextCompacted
|
|
656
654
|
| CompactionCircuitOpen
|
|
@@ -1,50 +1,14 @@
|
|
|
1
1
|
// Document comment event types (Server → Client).
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
comment: {
|
|
8
|
-
id: string;
|
|
9
|
-
surfaceId: string;
|
|
10
|
-
author: string;
|
|
11
|
-
content: string;
|
|
12
|
-
anchorStart?: number;
|
|
13
|
-
anchorEnd?: number;
|
|
14
|
-
anchorText?: string;
|
|
15
|
-
parentCommentId?: string;
|
|
16
|
-
status: string;
|
|
17
|
-
createdAt: number;
|
|
18
|
-
updatedAt: number;
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface DocumentCommentResolved {
|
|
23
|
-
type: "document_comment_resolved";
|
|
24
|
-
conversationId: string;
|
|
25
|
-
surfaceId: string;
|
|
26
|
-
commentId: string;
|
|
27
|
-
resolvedBy: string;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface DocumentCommentReopened {
|
|
31
|
-
type: "document_comment_reopened";
|
|
32
|
-
conversationId: string;
|
|
33
|
-
surfaceId: string;
|
|
34
|
-
commentId: string;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export interface DocumentCommentDeleted {
|
|
38
|
-
type: "document_comment_deleted";
|
|
39
|
-
conversationId: string;
|
|
40
|
-
surfaceId: string;
|
|
41
|
-
commentId: string;
|
|
42
|
-
}
|
|
3
|
+
import type { DocumentCommentCreatedEvent } from "../../api/events/document-comment-created.js";
|
|
4
|
+
import type { DocumentCommentDeletedEvent } from "../../api/events/document-comment-deleted.js";
|
|
5
|
+
import type { DocumentCommentReopenedEvent } from "../../api/events/document-comment-reopened.js";
|
|
6
|
+
import type { DocumentCommentResolvedEvent } from "../../api/events/document-comment-resolved.js";
|
|
43
7
|
|
|
44
8
|
// --- Domain-level union alias (consumed by the barrel file) ---
|
|
45
9
|
|
|
46
10
|
export type _DocumentCommentsServerMessages =
|
|
47
|
-
|
|
|
48
|
-
|
|
|
49
|
-
|
|
|
50
|
-
|
|
|
11
|
+
| DocumentCommentCreatedEvent
|
|
12
|
+
| DocumentCommentResolvedEvent
|
|
13
|
+
| DocumentCommentReopenedEvent
|
|
14
|
+
| DocumentCommentDeletedEvent;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* just enough metadata to invalidate a cache and trigger a refetch.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import type {
|
|
10
|
+
import type { RelationshipStateUpdatedEvent } from "../../api/events/relationship-state-updated.js";
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* Broadcast after the daemon successfully writes a fresh home activity
|
|
@@ -25,4 +25,4 @@ export interface HomeFeedUpdated {
|
|
|
25
25
|
newItemCount: number;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
export type _HomeServerMessages =
|
|
28
|
+
export type _HomeServerMessages = RelationshipStateUpdatedEvent | HomeFeedUpdated;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// External service integrations: Slack, Telegram, Vercel, ingress, guardian.
|
|
2
2
|
|
|
3
|
+
import type { OpenUrlEvent } from "../../api/events/open-url.js";
|
|
3
4
|
import type { ChannelId } from "../../channels/types.js";
|
|
4
5
|
|
|
5
6
|
// === Client → Server ===
|
|
@@ -206,12 +207,6 @@ export interface OAuthConnectResultResponse {
|
|
|
206
207
|
error?: string;
|
|
207
208
|
}
|
|
208
209
|
|
|
209
|
-
export interface OpenUrl {
|
|
210
|
-
type: "open_url";
|
|
211
|
-
url: string;
|
|
212
|
-
title?: string;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
210
|
export interface NavigateSettings {
|
|
216
211
|
type: "navigate_settings";
|
|
217
212
|
tab: string;
|
|
@@ -250,7 +245,7 @@ export type _IntegrationsServerMessages =
|
|
|
250
245
|
| IntegrationListResponse
|
|
251
246
|
| IntegrationConnectResult
|
|
252
247
|
| OAuthConnectResultResponse
|
|
253
|
-
|
|
|
248
|
+
| OpenUrlEvent
|
|
254
249
|
| NavigateSettings
|
|
255
250
|
| ShowPlatformLogin
|
|
256
251
|
| PlatformDisconnected;
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
// User/assistant messages, tool results, confirmations, secrets, errors, and generation lifecycle.
|
|
2
2
|
|
|
3
|
+
import type { AssistantTextDeltaEvent } from "../../api/events/assistant-text-delta.js";
|
|
4
|
+
import type { AssistantTurnStartEvent } from "../../api/events/assistant-turn-start.js";
|
|
5
|
+
import type { MessageCompleteEvent } from "../../api/events/message-complete.js";
|
|
6
|
+
import type { ToolUseStartEvent } from "../../api/events/tool-use-start.js";
|
|
3
7
|
import type { ChannelId, InterfaceId } from "../../channels/types.js";
|
|
4
8
|
import type { CommandIntent, UserMessageAttachment } from "./shared.js";
|
|
5
9
|
import type { ToolActivityMetadata } from "./web-activity.js";
|
|
@@ -72,25 +76,13 @@ export interface UserMessageEcho {
|
|
|
72
76
|
clientMessageId?: string;
|
|
73
77
|
}
|
|
74
78
|
|
|
75
|
-
export interface AssistantTextDelta {
|
|
76
|
-
type: "assistant_text_delta";
|
|
77
|
-
text: string;
|
|
78
|
-
conversationId?: string;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
79
|
export interface AssistantThinkingDelta {
|
|
82
80
|
type: "assistant_thinking_delta";
|
|
83
81
|
thinking: string;
|
|
84
82
|
conversationId?: string;
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
type: "tool_use_start";
|
|
89
|
-
toolName: string;
|
|
90
|
-
input: Record<string, unknown>;
|
|
91
|
-
conversationId?: string;
|
|
92
|
-
/** The tool_use block ID for client-side correlation. */
|
|
93
|
-
toolUseId?: string;
|
|
83
|
+
/** Database ID of the assistant message this thinking delta belongs to.
|
|
84
|
+
* Same semantics as `AssistantTextDeltaEvent.messageId`. */
|
|
85
|
+
messageId?: string;
|
|
94
86
|
}
|
|
95
87
|
|
|
96
88
|
export interface ToolOutputChunk {
|
|
@@ -103,6 +95,9 @@ export interface ToolOutputChunk {
|
|
|
103
95
|
subToolInput?: string;
|
|
104
96
|
subToolIsError?: boolean;
|
|
105
97
|
subToolId?: string;
|
|
98
|
+
/** Database ID of the assistant message that owns the parent tool_use
|
|
99
|
+
* block. Same semantics as `AssistantTextDeltaEvent.messageId`. */
|
|
100
|
+
messageId?: string;
|
|
106
101
|
}
|
|
107
102
|
|
|
108
103
|
export interface ToolUsePreviewStart {
|
|
@@ -110,6 +105,9 @@ export interface ToolUsePreviewStart {
|
|
|
110
105
|
toolUseId: string;
|
|
111
106
|
toolName: string;
|
|
112
107
|
conversationId?: string;
|
|
108
|
+
/** Database ID of the assistant message that owns this tool_use block.
|
|
109
|
+
* Same semantics as `AssistantTextDeltaEvent.messageId`. */
|
|
110
|
+
messageId?: string;
|
|
113
111
|
}
|
|
114
112
|
|
|
115
113
|
export interface ToolInputDelta {
|
|
@@ -119,6 +117,9 @@ export interface ToolInputDelta {
|
|
|
119
117
|
conversationId?: string;
|
|
120
118
|
/** The tool_use block ID for client-side correlation. */
|
|
121
119
|
toolUseId?: string;
|
|
120
|
+
/** Database ID of the assistant message that owns this tool_use block.
|
|
121
|
+
* Same semantics as `AssistantTextDeltaEvent.messageId`. */
|
|
122
|
+
messageId?: string;
|
|
122
123
|
}
|
|
123
124
|
|
|
124
125
|
export interface ToolResult {
|
|
@@ -140,6 +141,9 @@ export interface ToolResult {
|
|
|
140
141
|
imageDataList?: string[];
|
|
141
142
|
/** The tool_use block ID for client-side correlation. */
|
|
142
143
|
toolUseId?: string;
|
|
144
|
+
/** Database ID of the assistant message that owns the parent tool_use
|
|
145
|
+
* block. Same semantics as `AssistantTextDeltaEvent.messageId`. */
|
|
146
|
+
messageId?: string;
|
|
143
147
|
/** Risk level from the classifier ("low" | "medium" | "high" | "unknown"). */
|
|
144
148
|
riskLevel?: string;
|
|
145
149
|
/** Human-readable reason for the risk classification. */
|
|
@@ -299,26 +303,6 @@ export interface QuestionRequest {
|
|
|
299
303
|
toolUseId?: string;
|
|
300
304
|
}
|
|
301
305
|
|
|
302
|
-
export interface MessageComplete {
|
|
303
|
-
type: "message_complete";
|
|
304
|
-
conversationId?: string;
|
|
305
|
-
attachments?: UserMessageAttachment[];
|
|
306
|
-
attachmentWarnings?: string[];
|
|
307
|
-
/**
|
|
308
|
-
* Database ID of the completed assistant turn — the id that survives
|
|
309
|
-
* query-time merging when a turn persists multiple assistant rows. Matches
|
|
310
|
-
* the row the messages route returns.
|
|
311
|
-
*/
|
|
312
|
-
messageId?: string;
|
|
313
|
-
/**
|
|
314
|
-
* Distinguishes a real main-turn completion from auxiliary events such as
|
|
315
|
-
* call transcripts, call summaries, and watch notifier outputs. Clients
|
|
316
|
-
* gate turn-completion side effects (e.g. the task_complete sound) on
|
|
317
|
-
* `source !== "aux"`. Absent is treated as main for backwards compatibility.
|
|
318
|
-
*/
|
|
319
|
-
source?: "main" | "aux";
|
|
320
|
-
}
|
|
321
|
-
|
|
322
306
|
export interface ErrorMessage {
|
|
323
307
|
type: "error";
|
|
324
308
|
conversationId?: string;
|
|
@@ -537,9 +521,10 @@ export type _MessagesClientMessages =
|
|
|
537
521
|
|
|
538
522
|
export type _MessagesServerMessages =
|
|
539
523
|
| UserMessageEcho
|
|
540
|
-
|
|
|
524
|
+
| AssistantTurnStartEvent
|
|
525
|
+
| AssistantTextDeltaEvent
|
|
541
526
|
| AssistantThinkingDelta
|
|
542
|
-
|
|
|
527
|
+
| ToolUseStartEvent
|
|
543
528
|
| ToolUsePreviewStart
|
|
544
529
|
| ToolOutputChunk
|
|
545
530
|
| ToolInputDelta
|
|
@@ -547,7 +532,7 @@ export type _MessagesServerMessages =
|
|
|
547
532
|
| ConfirmationRequest
|
|
548
533
|
| SecretRequest
|
|
549
534
|
| QuestionRequest
|
|
550
|
-
|
|
|
535
|
+
| MessageCompleteEvent
|
|
551
536
|
| ErrorMessage
|
|
552
537
|
| MessageQueued
|
|
553
538
|
| MessageDequeued
|
|
@@ -12,6 +12,12 @@ export interface SubagentSpawned {
|
|
|
12
12
|
label: string;
|
|
13
13
|
objective: string;
|
|
14
14
|
isFork?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Tool-use id of the `skill_execute` call that spawned this subagent. Lets
|
|
17
|
+
* the client anchor the inline subagent card to the exact spawn tool call,
|
|
18
|
+
* independent of the (reconcile-volatile) parent message id.
|
|
19
|
+
*/
|
|
20
|
+
parentToolUseId?: string;
|
|
15
21
|
}
|
|
16
22
|
|
|
17
23
|
export interface SubagentStatusChanged {
|
|
@@ -508,13 +508,13 @@ export async function processMessage(
|
|
|
508
508
|
const persistMetadata = options?.slackInbound
|
|
509
509
|
? { slackInbound: options.slackInbound }
|
|
510
510
|
: undefined;
|
|
511
|
-
const messageId = await conversation.persistUserMessage(
|
|
512
|
-
resolvedContent,
|
|
511
|
+
const { id: messageId } = await conversation.persistUserMessage({
|
|
512
|
+
content: resolvedContent,
|
|
513
513
|
attachments,
|
|
514
514
|
requestId,
|
|
515
|
-
persistMetadata,
|
|
516
|
-
options?.displayContent,
|
|
517
|
-
);
|
|
515
|
+
metadata: persistMetadata,
|
|
516
|
+
displayContent: options?.displayContent,
|
|
517
|
+
});
|
|
518
518
|
publishConversationMessagesChanged(conversationId);
|
|
519
519
|
|
|
520
520
|
if (options?.isInteractive === true) {
|
|
@@ -571,13 +571,13 @@ export async function processMessageInBackground(
|
|
|
571
571
|
const persistMetadata = options?.slackInbound
|
|
572
572
|
? { slackInbound: options.slackInbound }
|
|
573
573
|
: undefined;
|
|
574
|
-
const messageId = await conversation.persistUserMessage(
|
|
574
|
+
const { id: messageId } = await conversation.persistUserMessage({
|
|
575
575
|
content,
|
|
576
576
|
attachments,
|
|
577
577
|
requestId,
|
|
578
|
-
persistMetadata,
|
|
579
|
-
options?.displayContent,
|
|
580
|
-
);
|
|
578
|
+
metadata: persistMetadata,
|
|
579
|
+
displayContent: options?.displayContent,
|
|
580
|
+
});
|
|
581
581
|
publishConversationMessagesChanged(conversationId);
|
|
582
582
|
|
|
583
583
|
if (options?.isInteractive === true) {
|
package/src/daemon/server.ts
CHANGED
|
@@ -50,6 +50,15 @@ import { refreshSkillCapabilityMemories } from "./skill-memory-refresh.js";
|
|
|
50
50
|
|
|
51
51
|
const log = getLogger("server");
|
|
52
52
|
|
|
53
|
+
function isEaddrInUse(err: unknown): boolean {
|
|
54
|
+
return (
|
|
55
|
+
typeof err === "object" &&
|
|
56
|
+
err !== null &&
|
|
57
|
+
"code" in err &&
|
|
58
|
+
(err as NodeJS.ErrnoException).code === "EADDRINUSE"
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
53
62
|
function readPackageVersion(): string | undefined {
|
|
54
63
|
try {
|
|
55
64
|
const pkgPath = join(import.meta.dir, "../../package.json");
|
|
@@ -259,6 +268,13 @@ export class DaemonServer {
|
|
|
259
268
|
try {
|
|
260
269
|
await this.cliIpc.start();
|
|
261
270
|
} catch (err) {
|
|
271
|
+
if (isEaddrInUse(err)) {
|
|
272
|
+
log.error(
|
|
273
|
+
{ err },
|
|
274
|
+
"CLI IPC socket already in use by another daemon — aborting startup to prevent duplicate processing",
|
|
275
|
+
);
|
|
276
|
+
throw err;
|
|
277
|
+
}
|
|
262
278
|
log.warn(
|
|
263
279
|
{ err },
|
|
264
280
|
"CLI IPC server failed to start — continuing startup with degraded CLI connectivity",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ProfileEntry } from "../config/schemas/llm.js";
|
|
2
|
+
import { AUTO_PROFILE_KEY } from "../config/seed-inference-profiles.js";
|
|
2
3
|
import type { ToolDefinition } from "../providers/types.js";
|
|
3
4
|
|
|
4
5
|
export const SWITCH_INFERENCE_PROFILE_TOOL_NAME = "switch_inference_profile";
|
|
@@ -16,7 +17,13 @@ export function buildSwitchInferenceProfileToolDef(
|
|
|
16
17
|
currentProfile?: string,
|
|
17
18
|
): ToolDefinition | null {
|
|
18
19
|
const entries = Object.entries(profiles).filter(
|
|
19
|
-
([, entry]) =>
|
|
20
|
+
([key, entry]) =>
|
|
21
|
+
entry.status !== "disabled" &&
|
|
22
|
+
key !== AUTO_PROFILE_KEY &&
|
|
23
|
+
// Mix profiles are A/B-routing buckets, not concrete targets the model
|
|
24
|
+
// should self-select into — exclude them so the picker only offers real
|
|
25
|
+
// profiles.
|
|
26
|
+
entry.mix == null,
|
|
20
27
|
);
|
|
21
28
|
if (entries.length < 2) return null;
|
|
22
29
|
|
|
@@ -32,11 +39,14 @@ export function buildSwitchInferenceProfileToolDef(
|
|
|
32
39
|
.join("\n");
|
|
33
40
|
|
|
34
41
|
const currentEntry = currentProfile ? profiles[currentProfile] : undefined;
|
|
35
|
-
const currentLabel =
|
|
42
|
+
const currentLabel =
|
|
43
|
+
currentProfile === AUTO_PROFILE_KEY
|
|
44
|
+
? "Auto (starting on Balanced)"
|
|
45
|
+
: (currentEntry?.label ?? currentProfile ?? "current");
|
|
36
46
|
|
|
37
47
|
return {
|
|
38
48
|
name: SWITCH_INFERENCE_PROFILE_TOOL_NAME,
|
|
39
|
-
description: `Switch to a different inference profile BEFORE answering. You MUST call this tool when the user's query requires capabilities beyond what your current profile ("${currentLabel}") provides
|
|
49
|
+
description: `Switch to a different inference profile BEFORE answering. You MUST call this tool when the user's query requires capabilities beyond what your current profile ("${currentLabel}") provides — AND you MUST also call it when the query is trivially simple and a faster, cheaper profile would handle it equally well.\n\nSwitch UP (to a more capable profile) for: multi-step reasoning or analysis, math proofs or derivations, complex coding tasks, detailed creative writing, or any task requiring deep thought.\n\nSwitch DOWN (to a faster profile) for: simple greetings or chitchat, one-word or single-sentence answers, factual lookups, acknowledgments, or any query that does not benefit from advanced reasoning.\n\nWhen in doubt about whether you can handle the query well, switch UP. When in doubt about whether the query is too simple for your current profile, switch DOWN.\n\nAvailable profiles:\n${profileDescriptions}`,
|
|
40
50
|
input_schema: {
|
|
41
51
|
type: "object" as const,
|
|
42
52
|
properties: {
|
|
@@ -64,10 +64,4 @@ export interface ToolSetupContext extends SurfaceConversationContext {
|
|
|
64
64
|
* turn start.
|
|
65
65
|
*/
|
|
66
66
|
toolRoutedProfile?: string;
|
|
67
|
-
/**
|
|
68
|
-
* True when the user has explicitly selected an inference profile for this
|
|
69
|
-
* conversation (via the composer profile picker). When set, tool-based
|
|
70
|
-
* auto-routing is suppressed — the user's explicit choice takes precedence.
|
|
71
|
-
*/
|
|
72
|
-
hasExplicitProfileOverride?: boolean;
|
|
73
67
|
}
|
|
@@ -136,8 +136,18 @@ function translateAgentEventToServerMessage(
|
|
|
136
136
|
case "usage":
|
|
137
137
|
case "error":
|
|
138
138
|
case "provider_error":
|
|
139
|
+
case "max_tokens_reached":
|
|
139
140
|
case "agent_loop_exit":
|
|
140
141
|
return null;
|
|
142
|
+
case "llm_call_started":
|
|
143
|
+
// The wake path persists its assistant tail via `persistTailMessage`
|
|
144
|
+
// (an `addMessage`-shaped call below) rather than via the main
|
|
145
|
+
// event-handler's `reserve` → `updateContent` pipeline, so there is
|
|
146
|
+
// no row to reserve here. Translation returns null and the wake
|
|
147
|
+
// path's existing end-of-turn persist continues to mint the row.
|
|
148
|
+
// Following up with full wake-path pre-allocation parity is tracked
|
|
149
|
+
// as a B3 follow-up.
|
|
150
|
+
return null;
|
|
141
151
|
}
|
|
142
152
|
}
|
|
143
153
|
|
|
@@ -217,6 +217,44 @@ export function searchDocumentsByTitle(
|
|
|
217
217
|
}
|
|
218
218
|
}
|
|
219
219
|
|
|
220
|
+
/**
|
|
221
|
+
* Return the most recent empty document in the given conversation with the
|
|
222
|
+
* supplied title, created within the last `withinMs` milliseconds.
|
|
223
|
+
*
|
|
224
|
+
* Used to dedupe a duplicate create-then-create flow after a failed update —
|
|
225
|
+
* when the model can't recover a malformed update and retries by creating a
|
|
226
|
+
* second same-title document, we reuse the first (still-empty) draft instead
|
|
227
|
+
* of producing a duplicate row. Returns `null` when no candidate exists.
|
|
228
|
+
*/
|
|
229
|
+
export function findRecentEmptyDocumentByTitle(
|
|
230
|
+
conversationId: string,
|
|
231
|
+
title: string,
|
|
232
|
+
withinMs: number,
|
|
233
|
+
): { surfaceId: string } | null {
|
|
234
|
+
try {
|
|
235
|
+
const threshold = Date.now() - withinMs;
|
|
236
|
+
const row = rawGet<{ surface_id: string }>(
|
|
237
|
+
/*sql*/ `SELECT surface_id FROM documents
|
|
238
|
+
WHERE conversation_id = ?
|
|
239
|
+
AND title = ?
|
|
240
|
+
AND content = ''
|
|
241
|
+
AND created_at >= ?
|
|
242
|
+
ORDER BY created_at DESC
|
|
243
|
+
LIMIT 1`,
|
|
244
|
+
conversationId,
|
|
245
|
+
title,
|
|
246
|
+
threshold,
|
|
247
|
+
);
|
|
248
|
+
return row ? { surfaceId: row.surface_id } : null;
|
|
249
|
+
} catch (error) {
|
|
250
|
+
log.error(
|
|
251
|
+
{ err: error, conversationId, title },
|
|
252
|
+
"Find-recent-empty-document error",
|
|
253
|
+
);
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
220
258
|
/**
|
|
221
259
|
* Delete a document and its conversation associations.
|
|
222
260
|
* Returns `true` if the document existed and was deleted, `false` otherwise.
|
|
@@ -76,6 +76,7 @@ mock.module("../../memory/conversation-crud.js", () => ({
|
|
|
76
76
|
getMessages: (id: string) =>
|
|
77
77
|
id === "child-conv-1" ? childMessages : parentMessages,
|
|
78
78
|
messageMetadataSchema,
|
|
79
|
+
reserveMessage: mock(async () => ({ id: "msg-reserve" })),
|
|
79
80
|
}));
|
|
80
81
|
|
|
81
82
|
mock.module("../../util/truncate.js", () => ({
|
|
@@ -43,6 +43,35 @@ mock.module("../../util/platform.js", () => ({
|
|
|
43
43
|
join(workspaceDir ?? fallbackDir, "avatar/avatar-image.png"),
|
|
44
44
|
|
|
45
45
|
getXdgVellumConfigDirName: () => ".vellum",
|
|
46
|
+
getPidPath: () => join(workspaceDir ?? fallbackDir, "assistant.pid"),
|
|
47
|
+
getDbPath: () => join(workspaceDir ?? fallbackDir, "db/assistant.db"),
|
|
48
|
+
getLogsDir: () => join(workspaceDir ?? fallbackDir, "logs"),
|
|
49
|
+
getHistoryPath: () => join(workspaceDir ?? fallbackDir, "history.json"),
|
|
50
|
+
getProtectedDir: () => join(workspaceDir ?? fallbackDir, "protected"),
|
|
51
|
+
getSignalsDir: () => join(workspaceDir ?? fallbackDir, "signals"),
|
|
52
|
+
getDaemonStderrLogPath: () =>
|
|
53
|
+
join(workspaceDir ?? fallbackDir, "logs/assistant.err.log"),
|
|
54
|
+
getDaemonStartupLockPath: () =>
|
|
55
|
+
join(workspaceDir ?? fallbackDir, "assistant.lock"),
|
|
56
|
+
getExternalDir: () => join(workspaceDir ?? fallbackDir, "external"),
|
|
57
|
+
getBinDir: () => join(workspaceDir ?? fallbackDir, "bin"),
|
|
58
|
+
getDotEnvPath: () => join(workspaceDir ?? fallbackDir, ".env"),
|
|
59
|
+
getEmbedWorkerPidPath: () =>
|
|
60
|
+
join(workspaceDir ?? fallbackDir, "embed-worker.pid"),
|
|
61
|
+
getWorkspaceDirDisplay: () => workspaceDir ?? fallbackDir,
|
|
62
|
+
getWorkspaceConfigPath: () => join(workspaceDir ?? fallbackDir, "config.json"),
|
|
63
|
+
getWorkspaceSkillsDir: () => join(workspaceDir ?? fallbackDir, "skills"),
|
|
64
|
+
getWorkspaceHooksDir: () => join(workspaceDir ?? fallbackDir, ".githooks"),
|
|
65
|
+
getWorkspacePluginsDir: () => join(workspaceDir ?? fallbackDir, "plugins"),
|
|
66
|
+
getWorkspaceRoutesDir: () => join(workspaceDir ?? fallbackDir, "routes"),
|
|
67
|
+
getDeprecatedDir: () => join(workspaceDir ?? fallbackDir, "deprecated"),
|
|
68
|
+
getProfilerRootDir: () => join(workspaceDir ?? fallbackDir, "profiler"),
|
|
69
|
+
getProfilerRunsDir: () => join(workspaceDir ?? fallbackDir, "profiler/runs"),
|
|
70
|
+
getProfilerRunDir: (runId: string) =>
|
|
71
|
+
join(workspaceDir ?? fallbackDir, "profiler/runs", runId),
|
|
72
|
+
getSkillRuntimePath: () => join(workspaceDir ?? fallbackDir, "skill-runtime"),
|
|
73
|
+
getBundledBunPath: () => undefined,
|
|
74
|
+
ensureDataDir: () => {},
|
|
46
75
|
}));
|
|
47
76
|
|
|
48
77
|
// Stub config so heartbeat is enabled. Must export every symbol from
|