@vellumai/assistant 0.7.3 → 0.8.1
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 +11 -0
- package/ARCHITECTURE.md +29 -28
- package/Dockerfile +6 -4
- package/README.md +2 -2
- package/__tests__/permissions/gateway-threshold-reader.test.ts +236 -9
- package/bun.lock +3 -0
- package/docker-entrypoint.sh +16 -0
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +420 -0
- package/eslint-rules/cli-no-daemon-internals.js +283 -0
- package/eslint.config.mjs +12 -0
- package/knip.json +3 -1
- package/node_modules/@vellumai/ipc-server-utils/bun.lock +24 -0
- package/node_modules/@vellumai/ipc-server-utils/package.json +18 -0
- package/node_modules/@vellumai/ipc-server-utils/src/index.ts +6 -0
- package/node_modules/@vellumai/ipc-server-utils/src/socket-watchdog.test.ts +430 -0
- package/node_modules/@vellumai/ipc-server-utils/src/socket-watchdog.ts +221 -0
- package/node_modules/@vellumai/ipc-server-utils/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -1
- package/openapi.yaml +4126 -959
- package/package.json +5 -1
- package/scripts/generate-openapi.ts +52 -4
- package/scripts/sync-llm-catalog.ts +165 -0
- package/scripts/sync-web-search-catalog.ts +107 -0
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +169 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +26 -1
- package/src/__tests__/annotate-risk-options.test.ts +291 -0
- package/src/__tests__/anthropic-provider.test.ts +92 -2
- package/src/__tests__/app-control-flow.test.ts +7 -0
- package/src/__tests__/approval-cascade.test.ts +8 -16
- package/src/__tests__/approval-routes-http.test.ts +6 -0
- package/src/__tests__/assistant-events-sse-shed.test.ts +232 -0
- package/src/__tests__/auto-analysis-end-to-end.test.ts +12 -25
- package/src/__tests__/avatar-identity-sync.test.ts +87 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +11 -22
- package/src/__tests__/btw-routes.test.ts +1 -0
- package/src/__tests__/call-constants.test.ts +10 -1
- package/src/__tests__/call-controller.test.ts +127 -0
- package/src/__tests__/call-site-routing-provider.test.ts +172 -45
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +44 -3
- package/src/__tests__/channel-policy.test.ts +12 -0
- package/src/__tests__/checker.test.ts +89 -0
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +88 -30
- package/src/__tests__/compact-event-conversation-id-guard.test.ts +33 -5
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +26 -1
- package/src/__tests__/config-loader-backfill.test.ts +526 -102
- package/src/__tests__/config-loader-corrupt.test.ts +68 -0
- package/src/__tests__/config-loader-platform-defaults.test.ts +345 -8
- package/src/__tests__/config-schema-cmd.test.ts +63 -29
- package/src/__tests__/config-schema.test.ts +14 -3
- package/src/__tests__/config-set-platform-guard.test.ts +75 -152
- package/src/__tests__/config-set-route.test.ts +198 -0
- package/src/__tests__/config-watcher.test.ts +6 -0
- package/src/__tests__/contacts-tools.test.ts +51 -199
- package/src/__tests__/context-search-agent-protocol.test.ts +21 -2
- package/src/__tests__/context-search-agent-runner.test.ts +22 -138
- package/src/__tests__/context-search-conversations-source.test.ts +42 -16
- package/src/__tests__/context-search-fanout.test.ts +20 -157
- package/src/__tests__/context-search-memory-source.test.ts +3 -26
- package/src/__tests__/context-search-memory-v2-source.test.ts +3 -3
- package/src/__tests__/context-search-types.test.ts +7 -2
- package/src/__tests__/context-window-manager.test.ts +389 -1
- package/src/__tests__/conversation-abort-tool-results.test.ts +1 -6
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -1
- package/src/__tests__/conversation-agent-loop.test.ts +3 -3
- package/src/__tests__/conversation-confirmation-signals.test.ts +5 -13
- package/src/__tests__/conversation-crud-inference-profile.test.ts +100 -0
- package/src/__tests__/conversation-error.test.ts +38 -0
- package/src/__tests__/conversation-fork-crud.test.ts +241 -1
- package/src/__tests__/conversation-inference-profile-route.test.ts +14 -14
- package/src/__tests__/conversation-init.benchmark.test.ts +2 -1
- package/src/__tests__/conversation-lifecycle.test.ts +124 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +100 -1
- package/src/__tests__/conversation-process-callsite.test.ts +22 -7
- package/src/__tests__/conversation-provider-retry-repair.test.ts +1 -6
- package/src/__tests__/conversation-runtime-assembly.test.ts +19 -10
- package/src/__tests__/conversation-slash-commands.test.ts +194 -2
- package/src/__tests__/conversation-slash-unknown.test.ts +1 -6
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +170 -9
- package/src/__tests__/conversation-surfaces-app-control.test.ts +323 -3
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +73 -1
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +59 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +1 -7
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -7
- package/src/__tests__/credential-security-invariants.test.ts +5 -6
- package/src/__tests__/daemon-credential-client.test.ts +56 -1
- package/src/__tests__/db-activation-state-fk-cascade.test.ts +132 -0
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +37 -0
- package/src/__tests__/db-memory-graph-event-date-repair.test.ts +43 -20
- package/src/__tests__/db-proxy-transaction.test.ts +206 -0
- package/src/__tests__/external-plugin-loader.test.ts +458 -0
- package/src/__tests__/filing-service.test.ts +25 -22
- package/src/__tests__/fixtures/mock-chrome-extension.ts +5 -0
- package/src/__tests__/gateway-only-guard.test.ts +0 -1
- package/src/__tests__/graph-extraction-event-date.test.ts +34 -0
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +10 -34
- package/src/__tests__/heartbeat-disk-pressure.test.ts +21 -8
- package/src/__tests__/heartbeat-service.test.ts +50 -233
- package/src/__tests__/history-repair.test.ts +89 -0
- package/src/__tests__/host-app-control-proxy.test.ts +109 -1
- package/src/__tests__/host-app-control-routes.test.ts +247 -1
- package/src/__tests__/host-browser-proxy.test.ts +416 -20
- package/src/__tests__/host-browser-routes.test.ts +325 -33
- package/src/__tests__/host-proxy-preactivation.test.ts +211 -0
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +246 -0
- package/src/__tests__/inference-profile-reaper.test.ts +154 -0
- package/src/__tests__/inference-profile-session-handler.test.ts +398 -0
- package/src/__tests__/inference-profile-session-ipc.test.ts +236 -0
- package/src/__tests__/injector-chain.test.ts +24 -16
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +10 -7
- package/src/__tests__/inline-skill-load-permissions.test.ts +6 -1
- package/src/__tests__/install-skill-routing.test.ts +2 -2
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +169 -67
- package/src/__tests__/llm-callsite-catalog.test.ts +20 -1
- package/src/__tests__/llm-catalog-parity.test.ts +146 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +188 -0
- package/src/__tests__/llm-request-log-source-factory.test.ts +124 -0
- package/src/__tests__/llm-resolver.test.ts +46 -0
- package/src/__tests__/managed-profile-guard.test.ts +131 -2
- package/src/__tests__/mcp-auth-routes.test.ts +1 -0
- package/src/__tests__/mcp-cli.test.ts +182 -220
- package/src/__tests__/mcp-health-check.test.ts +56 -27
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +18 -11
- package/src/__tests__/message-complete-display-id.test.ts +175 -0
- package/src/__tests__/notification-decision-fallback.test.ts +91 -0
- package/src/__tests__/notification-decision-strategy.test.ts +22 -0
- package/src/__tests__/notification-platform-adapter.test.ts +229 -0
- package/src/__tests__/oauth-cli.test.ts +38 -1888
- package/src/__tests__/oauth-commands-routes.test.ts +711 -0
- package/src/__tests__/oauth-connect-routes.test.ts +174 -11
- package/src/__tests__/oauth-providers-routes.test.ts +14 -10
- package/src/__tests__/openai-responses-cutover-guard.test.ts +33 -12
- package/src/__tests__/openai-responses-provider.test.ts +17 -0
- package/src/__tests__/plugin-bootstrap.test.ts +31 -2
- package/src/__tests__/plugin-route-contribution.test.ts +31 -3
- package/src/__tests__/plugin-tool-contribution.test.ts +31 -3
- package/src/__tests__/plugin-types.test.ts +13 -11
- package/src/__tests__/process-message-background-slack.test.ts +46 -0
- package/src/__tests__/profile-entry-status.test.ts +43 -0
- package/src/__tests__/provider-managed-proxy-integration.test.ts +12 -4
- package/src/__tests__/provider-registry-ollama.test.ts +12 -4
- package/src/__tests__/provider-send-message-override-profile.test.ts +10 -4
- package/src/__tests__/relay-server.test.ts +164 -2
- package/src/__tests__/retry-thinking-tool-choice.test.ts +15 -0
- package/src/__tests__/schedule-retry.test.ts +56 -4
- package/src/__tests__/schedule-routes.test.ts +104 -0
- package/src/__tests__/scheduler-disk-pressure.test.ts +0 -4
- package/src/__tests__/scheduler-recurrence.test.ts +87 -34
- package/src/__tests__/scheduler-reuse-conversation.test.ts +161 -5
- package/src/__tests__/scheduler-wake.test.ts +0 -63
- package/src/__tests__/secret-allowlist.test.ts +1 -0
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +7 -5
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +7 -5
- package/src/__tests__/secret-response-routing.test.ts +7 -5
- package/src/__tests__/secret-routes-managed-proxy.test.ts +12 -4
- package/src/__tests__/server-history-render.test.ts +82 -0
- package/src/__tests__/shell-credential-ref.test.ts +95 -3
- package/src/__tests__/shell-tool-proxy-mode.test.ts +14 -0
- package/src/__tests__/skill-include-graph.test.ts +31 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
- package/src/__tests__/skill-load-tool.test.ts +42 -16
- package/src/__tests__/skills.test.ts +39 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +78 -16
- package/src/__tests__/suggestion-routes.test.ts +3 -3
- package/src/__tests__/sync-message-contract.test.ts +63 -0
- package/src/__tests__/task-scheduler.test.ts +88 -23
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -42
- package/src/__tests__/tool-executor.test.ts +155 -0
- package/src/__tests__/update-bulletin-job.test.ts +96 -193
- package/src/__tests__/usage-cli.test.ts +11 -73
- package/src/__tests__/user-plugin-loader.test.ts +145 -0
- package/src/__tests__/vercel-config.test.ts +168 -0
- package/src/__tests__/voice-session-bridge.test.ts +3 -0
- package/src/__tests__/web-search-catalog-parity.test.ts +86 -0
- package/src/__tests__/web-search.test.ts +303 -2
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +1 -21
- package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +58 -0
- package/src/__tests__/workspace-migration-069-seed-onboarding-threads.test.ts +153 -0
- package/src/__tests__/workspace-migration-071-remove-safe-storage-release-note.test.ts +206 -0
- package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +191 -0
- package/src/__tests__/workspace-migration-076-drop-services-inference-mode.test.ts +211 -0
- package/src/__tests__/workspace-migration-077-seed-memory-router-callsite.test.ts +174 -0
- package/src/__tests__/workspace-migration-079-home-feed-notification-only.test.ts +323 -0
- package/src/__tests__/workspace-migration-080-restrict-vercel-api-token-metadata.test.ts +299 -0
- package/src/__tests__/workspace-migration-081-backfill-bash-allowed-tools.test.ts +410 -0
- package/src/__tests__/workspace-migration-082-backfill-managed-profile-labels.test.ts +268 -0
- package/src/__tests__/workspace-migration-safe-storage-limits-release.test.ts +15 -27
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +3 -3
- package/src/__tests__/workspace-release-notes-feature-flag-guard.test.ts +115 -0
- package/src/acp/__tests__/helpers/which-stub.ts +4 -2
- package/src/acp/resolve-agent.test.ts +25 -0
- package/src/acp/resolve-agent.ts +13 -2
- package/src/acp/session-manager.ts +14 -0
- package/src/agent/loop.ts +11 -0
- package/src/approvals/guardian-decision-primitive.ts +0 -13
- package/src/approvals/guardian-request-resolvers.ts +19 -102
- package/src/calls/call-constants.ts +5 -8
- package/src/calls/call-controller.ts +130 -67
- package/src/calls/relay-server.ts +42 -1
- package/src/calls/relay-setup-router.ts +36 -0
- package/src/calls/types.ts +1 -0
- package/src/calls/voice-session-bridge.ts +24 -5
- package/src/channels/config.ts +14 -1
- package/src/channels/types.ts +1 -0
- package/src/cli/AGENTS.md +164 -4
- package/src/cli/__tests__/notifications.test.ts +54 -0
- package/src/cli/commands/__tests__/avatar.test.ts +540 -0
- package/src/cli/commands/__tests__/backup.test.ts +236 -776
- package/src/cli/commands/__tests__/cache.test.ts +1 -1
- package/src/cli/commands/__tests__/changelog.test.ts +593 -0
- package/src/cli/commands/__tests__/channel-verification-sessions.test.ts +503 -0
- package/src/cli/commands/__tests__/conversations-import.test.ts +515 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +140 -167
- package/src/cli/commands/__tests__/domain-status.test.ts +137 -76
- package/src/cli/commands/__tests__/email-attachment.test.ts +314 -337
- package/src/cli/commands/__tests__/email-core.test.ts +579 -0
- package/src/cli/commands/__tests__/image-generation.test.ts +87 -824
- package/src/cli/commands/__tests__/inference-send.test.ts +30 -266
- package/src/cli/commands/__tests__/inference-session.test.ts +423 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +81 -110
- package/src/cli/commands/__tests__/skills.test.ts +563 -0
- package/src/cli/commands/__tests__/status.test.ts +249 -0
- package/src/cli/commands/__tests__/stt.test.ts +320 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +4 -603
- package/src/cli/commands/__tests__/tts.test.ts +321 -0
- package/src/cli/commands/__tests__/webhooks.test.ts +86 -511
- package/src/cli/commands/attachment.ts +8 -3
- package/src/cli/commands/audit.ts +95 -64
- package/src/cli/commands/auth.ts +61 -58
- package/src/cli/commands/avatar.ts +276 -390
- package/src/cli/commands/backup.ts +409 -505
- package/src/cli/commands/bash.ts +9 -5
- package/src/cli/commands/browser.ts +28 -9
- package/src/cli/commands/cache.ts +9 -4
- package/src/cli/commands/changelog.ts +414 -0
- package/src/cli/commands/channel-verification-sessions.ts +238 -317
- package/src/cli/commands/clients.ts +8 -3
- package/src/cli/commands/completions.ts +9 -9
- package/src/cli/commands/config.ts +102 -72
- package/src/cli/commands/contacts.ts +575 -696
- package/src/cli/commands/conversations-defer.ts +17 -69
- package/src/cli/commands/conversations-import.ts +90 -253
- package/src/cli/commands/conversations.ts +346 -436
- package/src/cli/commands/credential-execution.ts +9 -6
- package/src/cli/commands/credentials.ts +456 -736
- package/src/cli/commands/domain.ts +128 -206
- package/src/cli/commands/email.ts +606 -794
- package/src/cli/commands/gateway.ts +8 -1
- package/src/cli/commands/image-generation.ts +157 -205
- package/src/cli/commands/inference-providers.ts +352 -0
- package/src/cli/commands/inference-session.ts +415 -0
- package/src/cli/commands/inference.ts +87 -65
- package/src/cli/commands/keys.ts +8 -3
- package/src/cli/commands/mcp.ts +103 -287
- package/src/cli/commands/memory-v2.ts +163 -517
- package/src/cli/commands/notifications.ts +33 -7
- package/src/cli/commands/oauth/apps.ts +292 -261
- package/src/cli/commands/oauth/connect.ts +182 -345
- package/src/cli/commands/oauth/disconnect.ts +16 -215
- package/src/cli/commands/oauth/index.ts +49 -45
- package/src/cli/commands/oauth/mode.ts +43 -199
- package/src/cli/commands/oauth/ping.ts +17 -125
- package/src/cli/commands/oauth/providers.ts +732 -921
- package/src/cli/commands/oauth/request.ts +60 -350
- package/src/cli/commands/oauth/shared.ts +11 -121
- package/src/cli/commands/oauth/status.ts +31 -121
- package/src/cli/commands/oauth/token.ts +13 -55
- package/src/cli/commands/pending.ts +19 -10
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +133 -183
- package/src/cli/commands/platform/__tests__/connect.test.ts +66 -181
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +71 -227
- package/src/cli/commands/platform/__tests__/status.test.ts +169 -287
- package/src/cli/commands/platform/connect.ts +16 -80
- package/src/cli/commands/platform/disconnect.ts +14 -112
- package/src/cli/commands/platform/index.ts +177 -246
- package/src/cli/commands/routes.ts +153 -336
- package/src/cli/commands/sequence.ts +316 -360
- package/src/cli/commands/skills.ts +449 -671
- package/src/cli/commands/status.ts +58 -37
- package/src/cli/commands/stt.ts +94 -262
- package/src/cli/commands/task.ts +14 -40
- package/src/cli/commands/trust.ts +8 -3
- package/src/cli/commands/tts.ts +162 -167
- package/src/cli/commands/ui.ts +35 -42
- package/src/cli/commands/usage.ts +188 -126
- package/src/cli/commands/watchers.ts +8 -3
- package/src/cli/commands/webhooks.ts +99 -193
- package/src/cli/lib/__tests__/register-command.test.ts +85 -0
- package/src/cli/lib/daemon-credential-client.ts +4 -5
- package/src/cli/lib/nested-value.ts +44 -0
- package/src/cli/lib/open-browser.ts +36 -0
- package/src/cli/lib/register-command.ts +19 -0
- package/src/cli/lib/time-ago.ts +34 -0
- package/src/cli/program.ts +2 -4
- package/src/cli/utils/__tests__/conversation-id.test.ts +66 -0
- package/src/cli/utils/__tests__/parse-duration.test.ts +49 -0
- package/src/cli/utils/conversation-id.ts +30 -0
- package/src/cli/utils/parse-duration.ts +41 -0
- package/src/config/acp-defaults.test.ts +5 -1
- package/src/config/acp-defaults.ts +11 -4
- package/src/config/bundled-skills/acp/TOOLS.json +2 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +1 -3
- package/src/config/bundled-skills/app-control/TOOLS.json +32 -0
- package/src/config/bundled-skills/contacts/SKILL.md +12 -45
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -57
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +0 -12
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -58
- package/src/config/bundled-tool-registry.ts +0 -2
- package/src/config/feature-flag-registry.json +17 -17
- package/src/config/llm-resolver.ts +16 -1
- package/src/config/loader.ts +148 -33
- package/src/config/raw-config-utils.ts +2 -30
- package/src/config/schema.ts +4 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +49 -0
- package/src/config/schemas/call-site-catalog.ts +29 -7
- package/src/config/schemas/llm-request-logs.ts +57 -0
- package/src/config/schemas/llm.ts +52 -2
- package/src/config/schemas/memory-retrospective.ts +48 -0
- package/src/config/schemas/memory-v2.ts +33 -2
- package/src/config/schemas/memory.ts +4 -0
- package/src/config/schemas/services.ts +15 -12
- package/src/config/seed-inference-profiles.ts +195 -134
- package/src/contacts/contact-store.ts +0 -61
- package/src/context/window-manager.ts +191 -5
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +111 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +109 -4
- package/src/daemon/__tests__/daemon-skill-host.test.ts +10 -4
- package/src/daemon/approval-generators.ts +23 -29
- package/src/daemon/config-watcher.ts +2 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +56 -0
- package/src/daemon/conversation-agent-loop.ts +140 -107
- package/src/daemon/conversation-error.ts +21 -0
- package/src/daemon/conversation-lifecycle.ts +68 -13
- package/src/daemon/conversation-process.ts +36 -19
- package/src/daemon/conversation-runtime-assembly.ts +14 -5
- package/src/daemon/conversation-slash.ts +175 -23
- package/src/daemon/conversation-store.ts +17 -10
- package/src/daemon/conversation-surfaces.ts +92 -26
- package/src/daemon/conversation-tool-setup.ts +33 -19
- package/src/daemon/conversation.ts +49 -10
- package/src/daemon/external-plugins-bootstrap.ts +18 -8
- package/src/daemon/guardian-action-generators.ts +7 -22
- package/src/daemon/handlers/config-model.ts +8 -126
- package/src/daemon/handlers/config-slack-channel.ts +10 -7
- package/src/daemon/handlers/config-vercel.ts +3 -1
- package/src/daemon/handlers/shared.ts +26 -0
- package/src/daemon/handlers/skills.ts +84 -5
- package/src/daemon/history-repair.ts +33 -6
- package/src/daemon/host-app-control-proxy.ts +44 -19
- package/src/daemon/host-bash-proxy.ts +85 -158
- package/src/daemon/host-browser-proxy.ts +97 -36
- package/src/daemon/host-cu-proxy.ts +1 -1
- package/src/daemon/host-file-proxy.ts +1 -1
- package/src/daemon/host-proxy-base.ts +13 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -1
- package/src/daemon/host-transfer-proxy.ts +2 -2
- package/src/daemon/identity-helpers.ts +19 -0
- package/src/daemon/lifecycle.ts +128 -114
- package/src/daemon/meet-host-supervisor.ts +15 -15
- package/src/daemon/memory-v2-startup.ts +62 -14
- package/src/daemon/message-protocol.ts +6 -0
- package/src/daemon/message-types/bookmarks.ts +18 -0
- package/src/daemon/message-types/conversations.ts +12 -9
- package/src/daemon/message-types/messages.ts +28 -2
- package/src/daemon/message-types/sync.ts +60 -0
- package/src/daemon/pkb-reminder-builder.test.ts +54 -13
- package/src/daemon/pkb-reminder-builder.ts +21 -7
- package/src/daemon/process-message.ts +56 -23
- package/src/daemon/server.ts +23 -18
- package/src/daemon/shutdown-handlers.ts +0 -2
- package/src/daemon/tool-setup-types.ts +9 -0
- package/src/daemon/tool-side-effects.ts +6 -4
- package/src/daemon/wake-target-adapter.ts +11 -0
- package/src/documents/document-store.ts +35 -1
- package/src/export/transcript-formatter.ts +61 -2
- package/src/filing/filing-service.ts +42 -56
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +359 -0
- package/src/heartbeat/heartbeat-run-store.ts +2 -1
- package/src/heartbeat/heartbeat-service.ts +149 -128
- package/src/home/__tests__/feed-types.test.ts +63 -131
- package/src/home/__tests__/feed-writer.test.ts +77 -278
- package/src/home/__tests__/post-connect-feed.test.ts +9 -12
- package/src/home/feed-types.ts +19 -73
- package/src/home/feed-writer.ts +25 -156
- package/src/home/post-connect-feed.ts +1 -3
- package/src/ipc/__tests__/cli-ipc.test.ts +2 -0
- package/src/ipc/__tests__/email-ipc.test.ts +506 -0
- package/src/ipc/__tests__/exit-helper.test.ts +104 -0
- package/src/ipc/__tests__/streaming-client.test.ts +237 -0
- package/src/ipc/__tests__/streaming-framing.test.ts +142 -0
- package/src/ipc/assistant-server.ts +148 -42
- package/src/ipc/cli-client.ts +370 -50
- package/src/ipc/routes/db-proxy-transaction.ts +151 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +60 -0
- package/src/ipc/skill-routes/events.ts +30 -3
- package/src/ipc/skill-server.ts +99 -42
- package/src/live-voice/__tests__/live-voice-session-manager.test.ts +46 -0
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +1 -0
- package/src/live-voice/live-voice-session-manager.ts +11 -4
- package/src/live-voice/live-voice-session.ts +14 -6
- package/src/memory/__tests__/bookmark-crud.test.ts +258 -0
- package/src/memory/__tests__/bookmark-schema.test.ts +181 -0
- package/src/memory/__tests__/conversation-types.test.ts +36 -0
- package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +130 -0
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +10 -57
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +177 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +328 -0
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +213 -0
- package/src/memory/__tests__/memory-retrospective-trigger-check.test.ts +90 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +69 -0
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -0
- package/src/memory/bookmark-crud.ts +179 -0
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +31 -9
- package/src/memory/context-search/agent-protocol.ts +5 -1
- package/src/memory/context-search/agent-runner.ts +60 -85
- package/src/memory/context-search/limits.ts +1 -4
- package/src/memory/context-search/search.ts +23 -113
- package/src/memory/context-search/sources/conversations.ts +18 -6
- package/src/memory/context-search/sources/memory-v2.ts +40 -31
- package/src/memory/context-search/sources/memory.ts +9 -2
- package/src/memory/context-search/sources/workspace.ts +13 -10
- package/src/memory/context-search/types.ts +1 -1
- package/src/memory/conversation-bootstrap.ts +11 -0
- package/src/memory/conversation-crud.ts +312 -10
- package/src/memory/conversation-queries.ts +9 -5
- package/src/memory/conversation-title-service.ts +1 -0
- package/src/memory/conversation-types.ts +16 -0
- package/src/memory/db-init.ts +14 -0
- package/src/memory/embedding-backend.ts +2 -1
- package/src/memory/embedding-runtime-manager.ts +1 -2
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +104 -61
- package/src/memory/graph/__tests__/handle-remember-v2.test.ts +11 -26
- package/src/memory/graph/__tests__/remember-description.test.ts +55 -0
- package/src/memory/graph/conversation-graph-memory.ts +108 -14
- package/src/memory/graph/extraction.ts +4 -0
- package/src/memory/graph/graph-memory-state-store.ts +16 -3
- package/src/memory/graph/graph-search.test.ts +6 -5
- package/src/memory/graph/graph-search.ts +3 -4
- package/src/memory/graph/retriever.test.ts +12 -7
- package/src/memory/graph/retriever.ts +4 -5
- package/src/memory/graph/tool-handlers.ts +20 -11
- package/src/memory/graph/tools.ts +48 -9
- package/src/memory/indexer.ts +18 -2
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +120 -6
- package/src/memory/jobs/embed-concept-page.ts +261 -89
- package/src/memory/jobs-store.ts +51 -1
- package/src/memory/jobs-worker.ts +60 -7
- package/src/memory/llm-request-log-source-clickhouse.ts +317 -0
- package/src/memory/llm-request-log-source-local.ts +26 -0
- package/src/memory/llm-request-log-source.ts +97 -0
- package/src/memory/llm-request-log-store.ts +1 -1
- package/src/memory/memory-retrospective-constants.ts +13 -0
- package/src/memory/memory-retrospective-enqueue.ts +114 -0
- package/src/memory/memory-retrospective-job.ts +351 -0
- package/src/memory/memory-retrospective-startup-cleanup.ts +108 -0
- package/src/memory/memory-retrospective-state.ts +162 -0
- package/src/memory/memory-retrospective-trigger-check.ts +91 -0
- package/src/memory/memory-v2-activation-log-store.ts +49 -5
- package/src/memory/memory-v2-concept-frequency.ts +4 -0
- package/src/memory/message-content.ts +38 -1
- package/src/memory/migrations/227-add-conversation-inference-profile.ts +6 -1
- package/src/memory/migrations/228-rename-inference-profile-snake-case.ts +20 -7
- package/src/memory/migrations/229-delete-private-conversations.test.ts +70 -1
- package/src/memory/migrations/229-delete-private-conversations.ts +12 -0
- package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +16 -2
- package/src/memory/migrations/240-conversation-inference-profile-session.ts +25 -0
- package/src/memory/migrations/241-activation-state-fk-cascade.ts +50 -0
- package/src/memory/migrations/242-message-bookmarks.ts +38 -0
- package/src/memory/migrations/243-provider-connections.ts +68 -0
- package/src/memory/migrations/244-provider-connection-status-label.ts +23 -0
- package/src/memory/migrations/245-memory-retrospective-state.ts +36 -0
- package/src/memory/migrations/246-backfill-provider-connection-label.ts +81 -0
- package/src/memory/migrations/__tests__/244-provider-connection-status-label.test.ts +84 -0
- package/src/memory/migrations/__tests__/245-memory-retrospective-state.test.ts +125 -0
- package/src/memory/migrations/__tests__/246-backfill-provider-connection-label.test.ts +192 -0
- package/src/memory/migrations/index.ts +7 -0
- package/src/memory/pkb/pkb-search.test.ts +6 -5
- package/src/memory/pkb/pkb-search.ts +4 -5
- package/src/memory/published-pages-store.ts +16 -0
- package/src/memory/qdrant-client.ts +3 -0
- package/src/memory/schema/bookmarks.ts +38 -0
- package/src/memory/schema/conversations.ts +2 -0
- package/src/memory/schema/index.ts +2 -0
- package/src/memory/schema/inference.ts +29 -0
- package/src/memory/schema/memory-core.ts +9 -0
- package/src/memory/search/semantic.ts +5 -9
- package/src/memory/v2/__tests__/__snapshots__/prompts-router.test.ts.snap +27 -0
- package/src/memory/v2/__tests__/activation-store.test.ts +5 -5
- package/src/memory/v2/__tests__/activation.test.ts +46 -9
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +38 -21
- package/src/memory/v2/__tests__/consolidation-job.test.ts +140 -163
- package/src/memory/v2/__tests__/edge-index.test.ts +1 -1
- package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +111 -0
- package/src/memory/v2/__tests__/injection.test.ts +768 -33
- package/src/memory/v2/__tests__/migration.test.ts +7 -3
- package/src/memory/v2/__tests__/page-index.test.ts +277 -0
- package/src/memory/v2/__tests__/page-store.test.ts +14 -1
- package/src/memory/v2/__tests__/prompts-router.test.ts +257 -0
- package/src/memory/v2/__tests__/qdrant.test.ts +382 -9
- package/src/memory/v2/__tests__/reranker.test.ts +4 -4
- package/src/memory/v2/__tests__/router.test.ts +516 -0
- package/src/memory/v2/__tests__/sim.test.ts +163 -8
- package/src/memory/v2/__tests__/skill-store.test.ts +58 -3
- package/src/memory/v2/__tests__/static-context.test.ts +8 -35
- package/src/memory/v2/__tests__/sweep-job.test.ts +114 -33
- package/src/memory/v2/activation-store.ts +34 -5
- package/src/memory/v2/activation.ts +40 -27
- package/src/memory/v2/backfill-jobs.ts +17 -84
- package/src/memory/v2/consolidation-job.ts +92 -86
- package/src/memory/v2/frontmatter-sweep.ts +91 -0
- package/src/memory/v2/injection.ts +466 -115
- package/src/memory/v2/migration.ts +117 -20
- package/src/memory/v2/page-index.ts +191 -0
- package/src/memory/v2/page-store.ts +42 -0
- package/src/memory/v2/prompts/consolidation.ts +14 -7
- package/src/memory/v2/prompts/router.ts +192 -0
- package/src/memory/v2/qdrant.ts +307 -133
- package/src/memory/v2/reranker.ts +14 -7
- package/src/memory/v2/router.ts +322 -0
- package/src/memory/v2/sim.ts +88 -34
- package/src/memory/v2/skill-store.ts +118 -29
- package/src/memory/v2/static-context.ts +20 -17
- package/src/memory/v2/sweep-job.ts +127 -102
- package/src/memory/v2/types.ts +16 -5
- package/src/memory/validation.ts +13 -0
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +182 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +199 -0
- package/src/notifications/__tests__/signal-registry.test.ts +17 -0
- package/src/notifications/adapters/platform.ts +171 -0
- package/src/notifications/conversation-pairing.ts +2 -2
- package/src/notifications/copy-composer.ts +61 -12
- package/src/notifications/decision-engine.ts +46 -0
- package/src/notifications/destination-resolver.ts +21 -0
- package/src/notifications/emit-signal.ts +28 -1
- package/src/notifications/home-feed-side-effect.ts +111 -0
- package/src/notifications/signal.ts +5 -0
- package/src/permissions/checker.ts +12 -0
- package/src/permissions/gateway-threshold-reader.ts +116 -8
- package/src/permissions/ipc-risk-types.ts +2 -0
- package/src/permissions/prompter.ts +86 -96
- package/src/permissions/secret-prompter.ts +31 -31
- package/src/plugin-api/index.ts +13 -0
- package/src/plugin-api/package.json +12 -0
- package/src/plugin-api/types.ts +62 -0
- package/src/plugins/defaults/injectors.ts +20 -5
- package/src/plugins/external-plugin-loader.ts +294 -0
- package/src/plugins/types.ts +46 -30
- package/src/plugins/user-loader.ts +64 -41
- package/src/proactive-artifact/job.test.ts +63 -8
- package/src/proactive-artifact/job.ts +20 -2
- package/src/proactive-artifact/message-copy.ts +18 -1
- package/src/proactive-artifact/trigger-state.test.ts +9 -0
- package/src/proactive-artifact/trigger-state.ts +4 -0
- package/src/prompts/__tests__/system-prompt.test.ts +105 -0
- package/src/prompts/system-prompt.ts +22 -1
- package/src/prompts/templates/SOUL.md +13 -28
- package/src/prompts/update-bulletin-job.ts +61 -73
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +279 -0
- package/src/providers/__tests__/inference.test.ts +288 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
- package/src/providers/__tests__/provider-secret-catalog.test.ts +6 -0
- package/src/providers/__tests__/retry-callsite.test.ts +14 -32
- package/src/providers/__tests__/satellite-connection-routing.test.ts +510 -0
- package/src/providers/__tests__/search-provider-catalog.test.ts +80 -0
- package/src/providers/anthropic/client.ts +95 -26
- package/src/providers/call-site-routing.ts +94 -16
- package/src/providers/connection-resolution.ts +163 -0
- package/src/providers/inference/__tests__/connections-status-label.test.ts +250 -0
- package/src/providers/inference/adapter-factory.ts +173 -0
- package/src/providers/inference/auth.ts +112 -0
- package/src/providers/inference/backfill.ts +196 -0
- package/src/providers/inference/connections.ts +356 -0
- package/src/providers/inference/resolve-auth.ts +65 -0
- package/src/providers/model-catalog.ts +104 -6
- package/src/providers/openai/responses-provider.ts +4 -2
- package/src/providers/provider-env-vars.ts +17 -7
- package/src/providers/provider-secret-catalog.ts +49 -30
- package/src/providers/provider-send-message.ts +41 -20
- package/src/providers/registry.ts +143 -159
- package/src/providers/retry.ts +18 -10
- package/src/providers/search-provider-catalog.ts +121 -0
- package/src/runtime/AGENTS.md +18 -5
- package/src/runtime/__tests__/background-job-runner.test.ts +357 -0
- package/src/runtime/__tests__/pre-first-message-gate.test.ts +82 -0
- package/src/runtime/actor-trust-resolver.ts +32 -10
- package/src/runtime/agent-wake.ts +35 -6
- package/src/runtime/assistant-event-hub.ts +3 -85
- package/src/runtime/auth/route-policy.ts +304 -8
- package/src/runtime/auth/same-actor.ts +2 -0
- package/src/runtime/background-job-runner.ts +339 -0
- package/src/runtime/btw-sidechain.ts +1 -0
- package/src/runtime/channel-approvals.ts +3 -2
- package/src/runtime/guardian-reply-router.ts +0 -10
- package/src/runtime/http-router.ts +36 -1
- package/src/runtime/http-server.ts +31 -5
- package/src/runtime/http-types.ts +2 -0
- package/src/runtime/middleware/__tests__/request-logger.test.ts +162 -0
- package/src/runtime/middleware/request-logger.ts +62 -1
- package/src/runtime/pending-interactions.ts +19 -15
- package/src/runtime/pre-first-message-gate.ts +83 -0
- package/src/runtime/routes/__tests__/backup-routes.test.ts +8 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +251 -0
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +142 -0
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +315 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +189 -0
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +15 -136
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +736 -0
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +147 -0
- package/src/runtime/routes/__tests__/stt-routes.test.ts +5 -1
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +384 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +6 -2
- package/src/runtime/routes/acp-routes.ts +10 -8
- package/src/runtime/routes/app-management-routes.ts +228 -3
- package/src/runtime/routes/approval-routes.ts +7 -21
- package/src/runtime/routes/audit-routes.ts +43 -0
- package/src/runtime/routes/auth-routes.ts +72 -0
- package/src/runtime/routes/avatar-routes.ts +273 -20
- package/src/runtime/routes/backup-routes.ts +406 -2
- package/src/runtime/routes/bookmark-routes.ts +154 -0
- package/src/runtime/routes/channel-verification-routes.ts +2 -1
- package/src/runtime/routes/consolidation-routes.ts +8 -9
- package/src/runtime/routes/contact-routes.ts +0 -160
- package/src/runtime/routes/conversation-cli-routes.ts +192 -0
- package/src/runtime/routes/conversation-management-routes.ts +30 -43
- package/src/runtime/routes/conversation-query-routes.ts +373 -82
- package/src/runtime/routes/conversation-routes.ts +31 -10
- package/src/runtime/routes/conversations-import-routes.ts +229 -0
- package/src/runtime/routes/credential-routes.ts +540 -0
- package/src/runtime/routes/debug-bash-routes.ts +2 -0
- package/src/runtime/routes/debug-routes.ts +2 -2
- package/src/runtime/routes/document-pdf-renderer.ts +5 -1
- package/src/runtime/routes/domain-routes.ts +167 -0
- package/src/runtime/routes/email-routes.ts +603 -0
- package/src/runtime/routes/errors.ts +2 -2
- package/src/runtime/routes/events-routes.ts +192 -0
- package/src/runtime/routes/filing-routes.ts +2 -3
- package/src/runtime/routes/home-feed-routes.ts +6 -78
- package/src/runtime/routes/host-app-control-routes.ts +44 -2
- package/src/runtime/routes/host-browser-routes.ts +103 -22
- package/src/runtime/routes/http-adapter.ts +2 -0
- package/src/runtime/routes/identity-routes.ts +5 -0
- package/src/runtime/routes/image-generation-routes.ts +99 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +137 -1
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +87 -7
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +156 -0
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +22 -7
- package/src/runtime/routes/index.ts +36 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +312 -0
- package/src/runtime/routes/inference-profile-session-reaper.ts +98 -0
- package/src/runtime/routes/inference-profile-session-routes.ts +146 -0
- package/src/runtime/routes/inference-provider-connection-routes.ts +317 -0
- package/src/runtime/routes/inference-send-routes.ts +115 -0
- package/src/runtime/routes/integrations/twilio.ts +1 -0
- package/src/runtime/routes/mcp-auth-routes.ts +283 -9
- package/src/runtime/routes/memory-item-routes.test.ts +3 -9
- package/src/runtime/routes/memory-item-routes.ts +5 -6
- package/src/runtime/routes/memory-v2-routes.ts +105 -404
- package/src/runtime/routes/notification-routes.ts +2 -0
- package/src/runtime/routes/oauth-apps.ts +112 -7
- package/src/runtime/routes/oauth-commands-routes.ts +1007 -0
- package/src/runtime/routes/oauth-connect-routes.ts +67 -5
- package/src/runtime/routes/oauth-providers.ts +298 -8
- package/src/runtime/routes/platform-routes.ts +336 -0
- package/src/runtime/routes/playground/inject-failures.ts +2 -1
- package/src/runtime/routes/playground/reset-circuit.ts +2 -1
- package/src/runtime/routes/playground/state.ts +2 -1
- package/src/runtime/routes/publish-routes.ts +221 -0
- package/src/runtime/routes/schedule-routes.ts +82 -0
- package/src/runtime/routes/sequence-routes.ts +291 -0
- package/src/runtime/routes/settings-routes.ts +2 -10
- package/src/runtime/routes/skills-routes.ts +31 -1
- package/src/runtime/routes/stt-routes.ts +240 -3
- package/src/runtime/routes/surface-action-routes.ts +43 -7
- package/src/runtime/routes/tts-routes.ts +67 -0
- package/src/runtime/routes/types.ts +32 -0
- package/src/runtime/routes/user-routes-cli.ts +243 -0
- package/src/runtime/routes/webhook-routes.ts +165 -0
- package/src/runtime/sync/resource-sync-events.ts +25 -0
- package/src/runtime/sync/sync-publisher.test.ts +105 -0
- package/src/runtime/sync/sync-publisher.ts +21 -0
- package/src/schedule/scheduler.ts +200 -123
- package/src/security/__tests__/provider-key-env-fallback.test.ts +12 -6
- package/src/security/secret-patterns.ts +3 -0
- package/src/sequence/engine.ts +38 -40
- package/src/skills/include-graph.ts +35 -13
- package/src/subagent/manager.ts +20 -15
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +206 -0
- package/src/tools/browser/browser-execution.ts +15 -4
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +174 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +16 -13
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +24 -1
- package/src/tools/browser/cdp-client/factory.ts +66 -5
- package/src/tools/browser/runtime-check.ts +77 -0
- package/src/tools/document/document-tool.ts +20 -0
- package/src/tools/executor.ts +18 -2
- package/src/tools/memory/register.test.ts +10 -8
- package/src/tools/memory/register.ts +9 -1
- package/src/tools/network/__tests__/web-search.test.ts +156 -0
- package/src/tools/network/web-search.ts +280 -37
- package/src/tools/permission-checker.ts +28 -5
- package/src/tools/skills/load.ts +24 -20
- package/src/tools/subagent/spawn.ts +3 -3
- package/src/tools/terminal/shell.ts +44 -0
- package/src/tools/tool-name-aliases.ts +19 -0
- package/src/tools/types.ts +19 -1
- package/src/usage/attribution.ts +3 -2
- package/src/util/pricing.ts +86 -160
- package/src/watcher/__tests__/engine.test.ts +301 -0
- package/src/watcher/constants.ts +7 -0
- package/src/watcher/engine.ts +90 -90
- package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +6 -9
- package/src/workspace/migrations/054-seed-recall-callsite.ts +10 -1
- package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +28 -4
- package/src/workspace/migrations/067-release-notes-safe-storage-limits.ts +4 -62
- package/src/workspace/migrations/069-seed-onboarding-threads.ts +34 -0
- package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +31 -0
- package/src/workspace/migrations/071-remove-safe-storage-release-note.ts +111 -0
- package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +104 -0
- package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +93 -0
- package/src/workspace/migrations/074-drop-deprecated-secret-detection-keys.ts +117 -0
- package/src/workspace/migrations/075-memory-v2-bm25-b-default-reembed.ts +61 -0
- package/src/workspace/migrations/076-drop-services-inference-mode.ts +62 -0
- package/src/workspace/migrations/077-seed-memory-router-callsite.ts +89 -0
- package/src/workspace/migrations/078-release-notes-tavily-web-search.ts +66 -0
- package/src/workspace/migrations/079-home-feed-notification-only.ts +197 -0
- package/src/workspace/migrations/080-restrict-vercel-api-token-metadata.ts +182 -0
- package/src/workspace/migrations/081-backfill-bash-allowed-tools-for-injection-credentials.ts +160 -0
- package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +154 -0
- package/src/workspace/migrations/registry.ts +28 -0
- package/src/workspace/migrations/runner.ts +13 -2
- package/src/workspace/migrations/types.ts +13 -3
- package/src/workspace/provider-commit-message-generator.ts +3 -2
- package/src/__tests__/context-search-pkb-source.test.ts +0 -492
- package/src/__tests__/credentials-cli.test.ts +0 -1225
- package/src/__tests__/memory-admin-recall.test.ts +0 -213
- package/src/approvals/__tests__/guardian-feed-event.test.ts +0 -303
- package/src/cli/commands/__tests__/email-download.test.ts +0 -260
- package/src/cli/commands/__tests__/email-list.test.ts +0 -216
- package/src/cli/commands/__tests__/email-register.test.ts +0 -186
- package/src/cli/commands/__tests__/email-send.test.ts +0 -416
- package/src/cli/commands/__tests__/email-status.test.ts +0 -185
- package/src/cli/commands/__tests__/email-unregister.test.ts +0 -168
- package/src/cli/commands/__tests__/routes.test.ts +0 -562
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +0 -454
- package/src/cli/commands/autonomy.ts +0 -365
- package/src/cli/commands/memory.ts +0 -424
- package/src/cli/commands/oauth/__tests__/connect.test.ts +0 -1201
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +0 -686
- package/src/cli/commands/oauth/__tests__/mode.test.ts +0 -632
- package/src/cli/commands/oauth/__tests__/ping.test.ts +0 -631
- package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +0 -573
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +0 -330
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +0 -521
- package/src/cli/commands/oauth/__tests__/status.test.ts +0 -551
- package/src/cli/commands/oauth/__tests__/token.test.ts +0 -420
- package/src/cli/lib/daemon-avatar-client.ts +0 -37
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -87
- package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +0 -207
- package/src/daemon/__tests__/conversation-feed-event.test.ts +0 -304
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +0 -233
- package/src/home/__tests__/assistant-feed-authoring.test.ts +0 -156
- package/src/home/__tests__/emit-feed-event.test.ts +0 -169
- package/src/home/__tests__/feed-population-integration.test.ts +0 -312
- package/src/home/__tests__/feed-scheduler.test.ts +0 -222
- package/src/home/__tests__/phase5-exit-criteria.test.ts +0 -229
- package/src/home/__tests__/platform-gmail-digest.test.ts +0 -222
- package/src/home/__tests__/rollup-producer.test.ts +0 -507
- package/src/home/assistant-feed-authoring.ts +0 -135
- package/src/home/emit-feed-event.ts +0 -169
- package/src/home/feed-scheduler.ts +0 -281
- package/src/home/platform-gmail-digest.ts +0 -163
- package/src/home/rewrite-command-preview.ts +0 -66
- package/src/home/rewrite-feed-title.ts +0 -58
- package/src/home/rollup-producer.ts +0 -426
- package/src/memory/admin.ts +0 -326
- package/src/memory/context-search/sources/pkb.ts +0 -477
- package/src/memory/graph/compaction.ts +0 -299
- /package/src/cli/{commands → lib}/cache-fs.ts +0 -0
|
@@ -1159,6 +1159,7 @@ export async function handleSurfaceAction(
|
|
|
1159
1159
|
summary,
|
|
1160
1160
|
submittedData: data,
|
|
1161
1161
|
});
|
|
1162
|
+
markSurfaceCompleted(ctx, surfaceId, summary);
|
|
1162
1163
|
|
|
1163
1164
|
// Cleanup and resolve — order matters: cleanup clears the timer
|
|
1164
1165
|
// before resolve() unblocks the caller.
|
|
@@ -1505,20 +1506,6 @@ export async function handleSurfaceAction(
|
|
|
1505
1506
|
surfaceData,
|
|
1506
1507
|
);
|
|
1507
1508
|
|
|
1508
|
-
// Forms are one-shot surfaces — auto-complete immediately so the client
|
|
1509
|
-
// transitions from the "Submitting…" spinner to a completion chip without
|
|
1510
|
-
// requiring the LLM to call ui_dismiss.
|
|
1511
|
-
if (pending.surfaceType === "form") {
|
|
1512
|
-
broadcastMessage({
|
|
1513
|
-
type: "ui_surface_complete",
|
|
1514
|
-
conversationId: ctx.conversationId,
|
|
1515
|
-
surfaceId,
|
|
1516
|
-
summary,
|
|
1517
|
-
submittedData: mergedData,
|
|
1518
|
-
});
|
|
1519
|
-
markSurfaceCompleted(ctx, surfaceId, summary);
|
|
1520
|
-
}
|
|
1521
|
-
|
|
1522
1509
|
// Extract file attachments from action data so they are sent as proper
|
|
1523
1510
|
// image/file content blocks instead of dumping base64 into the text.
|
|
1524
1511
|
let pendingAttachments: UserMessageAttachment[] = [];
|
|
@@ -1648,6 +1635,21 @@ export async function handleSurfaceAction(
|
|
|
1648
1635
|
return;
|
|
1649
1636
|
}
|
|
1650
1637
|
|
|
1638
|
+
// One-shot interactive surfaces — auto-complete now that the message has
|
|
1639
|
+
// been accepted. Deferred until after rejection check so the surface stays
|
|
1640
|
+
// active and retryable if the queue was full.
|
|
1641
|
+
const ONE_SHOT_SURFACE_TYPES = ["form", "confirmation", "file_upload"];
|
|
1642
|
+
if (ONE_SHOT_SURFACE_TYPES.includes(pending.surfaceType)) {
|
|
1643
|
+
broadcastMessage({
|
|
1644
|
+
type: "ui_surface_complete",
|
|
1645
|
+
conversationId: ctx.conversationId,
|
|
1646
|
+
surfaceId,
|
|
1647
|
+
summary,
|
|
1648
|
+
submittedData: mergedDataForText,
|
|
1649
|
+
});
|
|
1650
|
+
markSurfaceCompleted(ctx, surfaceId, summary);
|
|
1651
|
+
}
|
|
1652
|
+
|
|
1651
1653
|
// One-shot: clear accumulated state now that the message has been accepted.
|
|
1652
1654
|
// Deferred until after rejection check so state is preserved for retry on rejection.
|
|
1653
1655
|
if (accumulatedState && Object.keys(accumulatedState).length > 0) {
|
|
@@ -2021,14 +2023,6 @@ export async function surfaceProxyResolver(
|
|
|
2021
2023
|
|
|
2022
2024
|
// Route app-control proxy tools (all app_control_* tool variants)
|
|
2023
2025
|
if (toolName.startsWith("app_control_")) {
|
|
2024
|
-
if (!ctx.hostAppControlProxy || !ctx.hostAppControlProxy.isAvailable()) {
|
|
2025
|
-
return {
|
|
2026
|
-
content:
|
|
2027
|
-
"App control is not available — enable the `app-control` feature flag and connect a macOS client.",
|
|
2028
|
-
isError: true,
|
|
2029
|
-
};
|
|
2030
|
-
}
|
|
2031
|
-
|
|
2032
2026
|
// `app_control_stop` resolves immediately: tear down the proxy without
|
|
2033
2027
|
// a client round-trip. Mirrors CU's terminal-tool short-circuit
|
|
2034
2028
|
// (`computer_use_done` / `computer_use_respond`). Clear the
|
|
@@ -2037,15 +2031,85 @@ export async function surfaceProxyResolver(
|
|
|
2037
2031
|
// instead of dispatching against a torn-down proxy, and so a sibling
|
|
2038
2032
|
// conversation can acquire the released singleton lock without the
|
|
2039
2033
|
// disposed proxy still being addressable.
|
|
2034
|
+
//
|
|
2035
|
+
// Run this BEFORE the isAvailable() gate so a disconnected client
|
|
2036
|
+
// doesn't strand the singleton lock — stop is local-only.
|
|
2040
2037
|
if (toolName === "app_control_stop") {
|
|
2041
|
-
if (ctx.
|
|
2042
|
-
ctx.setHostAppControlProxy
|
|
2043
|
-
|
|
2044
|
-
|
|
2038
|
+
if (ctx.hostAppControlProxy) {
|
|
2039
|
+
if (ctx.setHostAppControlProxy) {
|
|
2040
|
+
ctx.setHostAppControlProxy(undefined);
|
|
2041
|
+
} else {
|
|
2042
|
+
ctx.hostAppControlProxy.dispose();
|
|
2043
|
+
}
|
|
2045
2044
|
}
|
|
2046
2045
|
return { content: "App control stopped.", isError: false };
|
|
2047
2046
|
}
|
|
2048
2047
|
|
|
2048
|
+
if (!ctx.hostAppControlProxy || !ctx.hostAppControlProxy.isAvailable()) {
|
|
2049
|
+
return {
|
|
2050
|
+
content:
|
|
2051
|
+
"App control is not available — enable the `app-control` feature flag and connect a macOS client.",
|
|
2052
|
+
isError: true,
|
|
2053
|
+
};
|
|
2054
|
+
}
|
|
2055
|
+
|
|
2056
|
+
// Resolve target client. Mirrors the host_cu block above: validate
|
|
2057
|
+
// explicit target_client_id (existence, capability, same-actor), then
|
|
2058
|
+
// multi-client guard when no target is supplied. App-control is
|
|
2059
|
+
// single-client-only at the host (one active session per macOS
|
|
2060
|
+
// machine), so a broadcast across multiple capable clients would fire
|
|
2061
|
+
// the same input on every machine.
|
|
2062
|
+
let targetClientId: string | undefined =
|
|
2063
|
+
typeof input.target_client_id === "string" &&
|
|
2064
|
+
input.target_client_id !== ""
|
|
2065
|
+
? input.target_client_id
|
|
2066
|
+
: undefined;
|
|
2067
|
+
|
|
2068
|
+
const sourceActorPrincipalId = ctx.trustContext?.guardianPrincipalId;
|
|
2069
|
+
if (targetClientId != null) {
|
|
2070
|
+
const client = assistantEventHub.getClientById(targetClientId);
|
|
2071
|
+
if (!client) {
|
|
2072
|
+
return {
|
|
2073
|
+
content: `No connected client with id '${targetClientId}'. Run \`assistant clients list --capability host_app_control\` to see available clients.`,
|
|
2074
|
+
isError: true,
|
|
2075
|
+
};
|
|
2076
|
+
}
|
|
2077
|
+
if (!client.capabilities.includes("host_app_control")) {
|
|
2078
|
+
return {
|
|
2079
|
+
content: `Client '${targetClientId}' does not support host_app_control. Run \`assistant clients list --capability host_app_control\` to see available clients.`,
|
|
2080
|
+
isError: true,
|
|
2081
|
+
};
|
|
2082
|
+
}
|
|
2083
|
+
const rejection = enforceSameActorOrErrorResult({
|
|
2084
|
+
hub: assistantEventHub,
|
|
2085
|
+
sourceActorPrincipalId,
|
|
2086
|
+
targetClientId,
|
|
2087
|
+
op: "host_app_control",
|
|
2088
|
+
});
|
|
2089
|
+
if (rejection) return rejection;
|
|
2090
|
+
}
|
|
2091
|
+
|
|
2092
|
+
if (targetClientId == null) {
|
|
2093
|
+
const allAcClients =
|
|
2094
|
+
assistantEventHub.listClientsByCapability("host_app_control");
|
|
2095
|
+
const sameUserAcClients = allAcClients.filter(
|
|
2096
|
+
(c) => c.actorPrincipalId === sourceActorPrincipalId,
|
|
2097
|
+
);
|
|
2098
|
+
if (sameUserAcClients.length > 1) {
|
|
2099
|
+
return {
|
|
2100
|
+
content: `Error: multiple clients support host_app_control. Specify which client to target with \`target_client_id\`. Run \`assistant clients list --capability host_app_control\` to see client IDs and labels.`,
|
|
2101
|
+
isError: true,
|
|
2102
|
+
};
|
|
2103
|
+
}
|
|
2104
|
+
// When cross-user host_app_control clients are connected, auto-
|
|
2105
|
+
// resolve to the unique same-user client. Otherwise the proxy would
|
|
2106
|
+
// dispatch untargeted and the action could reach a cross-user
|
|
2107
|
+
// client. Belt-and-suspenders: the proxy re-checks same-user.
|
|
2108
|
+
if (sameUserAcClients.length === 1 && allAcClients.length > 1) {
|
|
2109
|
+
targetClientId = sameUserAcClients[0].clientId;
|
|
2110
|
+
}
|
|
2111
|
+
}
|
|
2112
|
+
|
|
2049
2113
|
// The TS `HostAppControlInput` (and the Swift mirror) is a discriminated
|
|
2050
2114
|
// union on `tool` ("start" | "observe" | "press" | …). The agent's raw
|
|
2051
2115
|
// tool input only carries the action-specific payload (app, x/y, text,
|
|
@@ -2064,6 +2128,8 @@ export async function surfaceProxyResolver(
|
|
|
2064
2128
|
inputWithTool,
|
|
2065
2129
|
ctx.conversationId,
|
|
2066
2130
|
signal ?? new AbortController().signal,
|
|
2131
|
+
sourceActorPrincipalId,
|
|
2132
|
+
targetClientId,
|
|
2067
2133
|
);
|
|
2068
2134
|
}
|
|
2069
2135
|
|
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
ACTIVITY_SKIP_SET,
|
|
31
31
|
injectActivityField,
|
|
32
32
|
} from "../tools/schema-transforms.js";
|
|
33
|
+
import { resolveToolNameAlias } from "../tools/tool-name-aliases.js";
|
|
33
34
|
import {
|
|
34
35
|
isDiskPressureCleanupToolName,
|
|
35
36
|
type ProxyApprovalCallback,
|
|
@@ -122,7 +123,9 @@ export function createToolExecutor(
|
|
|
122
123
|
toolUseId?: string,
|
|
123
124
|
turnContext?: import("../plugins/types.js").TurnContext,
|
|
124
125
|
) => {
|
|
125
|
-
|
|
126
|
+
const executionName = resolveToolNameAlias(name, ctx.allowedToolNames);
|
|
127
|
+
|
|
128
|
+
if (isDoordashCommand(executionName, input)) {
|
|
126
129
|
markDoordashStepInProgress(ctx, input);
|
|
127
130
|
}
|
|
128
131
|
|
|
@@ -153,6 +156,7 @@ export function createToolExecutor(
|
|
|
153
156
|
onOutput,
|
|
154
157
|
signal: ctx.abortController?.signal,
|
|
155
158
|
allowedToolNames: ctx.allowedToolNames,
|
|
159
|
+
forcePromptSideEffects: ctx.forcePromptSideEffects,
|
|
156
160
|
diskPressureCleanupModeActive: ctx.diskPressureCleanupModeActive,
|
|
157
161
|
toolUseId,
|
|
158
162
|
isPlatformHosted: getIsPlatform(),
|
|
@@ -208,8 +212,9 @@ export function createToolExecutor(
|
|
|
208
212
|
// route through the full executor pipeline so the underlying tool's
|
|
209
213
|
// risk level, permission checks, hooks, and lifecycle events all fire
|
|
210
214
|
// with the real tool name.
|
|
211
|
-
if (
|
|
212
|
-
const
|
|
215
|
+
if (executionName === "skill_execute") {
|
|
216
|
+
const rawToolName = typeof input.tool === "string" ? input.tool : "";
|
|
217
|
+
const toolName = resolveToolNameAlias(rawToolName, ctx.allowedToolNames);
|
|
213
218
|
const rawToolInput =
|
|
214
219
|
input.input != null && typeof input.input === "object"
|
|
215
220
|
? (input.input as Record<string, unknown>)
|
|
@@ -242,7 +247,7 @@ export function createToolExecutor(
|
|
|
242
247
|
}
|
|
243
248
|
|
|
244
249
|
const result = await executor.execute(
|
|
245
|
-
|
|
250
|
+
executionName,
|
|
246
251
|
input,
|
|
247
252
|
toolContext,
|
|
248
253
|
turnContext,
|
|
@@ -251,7 +256,7 @@ export function createToolExecutor(
|
|
|
251
256
|
ctx.approvedViaPromptThisTurn = true;
|
|
252
257
|
}
|
|
253
258
|
|
|
254
|
-
runPostExecutionSideEffects(
|
|
259
|
+
runPostExecutionSideEffects(executionName, input, result, { ctx });
|
|
255
260
|
|
|
256
261
|
return result;
|
|
257
262
|
};
|
|
@@ -357,26 +362,35 @@ export const HOST_TOOL_TO_CAPABILITY = new Map<string, HostProxyCapability>([
|
|
|
357
362
|
export const HOST_TOOL_NAMES = new Set(HOST_TOOL_TO_CAPABILITY.keys());
|
|
358
363
|
/**
|
|
359
364
|
* Capabilities eligible for cross-client exposure on non-host-proxy
|
|
360
|
-
* transports (e.g. web, ios routing to a connected
|
|
365
|
+
* transports (e.g. web, ios routing to a connected capable client).
|
|
361
366
|
* Adding a capability here exposes ALL tools that map to it (per
|
|
362
367
|
* HOST_TOOL_TO_CAPABILITY) on non-host-proxy transports — the daemon then
|
|
363
368
|
* routes the actual invocation to the connected capable client via the
|
|
364
369
|
* proxy's targetClientId path.
|
|
365
370
|
*
|
|
371
|
+
* All members below adopt the same-actor enforcement pattern: the proxy
|
|
372
|
+
* binds the request to a specific client id + actor principal id at
|
|
373
|
+
* dispatch time, and the corresponding result route requires the
|
|
374
|
+
* submitting client to present an `x-vellum-client-id` matching the
|
|
375
|
+
* captured target plus an `x-vellum-actor-principal-id` matching the
|
|
376
|
+
* captured actor (see `enforceSameActorOrThrow` in
|
|
377
|
+
* `runtime/auth/same-actor.ts`).
|
|
378
|
+
*
|
|
366
379
|
* Inclusions:
|
|
367
380
|
* - host_bash (Phase 1, PR #29322)
|
|
368
381
|
* - host_file (Phases 2 & 3, PRs #29398 + #29440)
|
|
382
|
+
* - host_browser (PR #27489 executor parity + PR #29829 cross-client
|
|
383
|
+
* exposure with same-actor guard at proxy dispatch and result route)
|
|
369
384
|
*
|
|
370
385
|
* Exclusions:
|
|
371
|
-
* -
|
|
372
|
-
*
|
|
373
|
-
*
|
|
374
|
-
* - host_app_control, host_cu: not in HOST_TOOL_TO_CAPABILITY
|
|
375
|
-
* (skill-routed).
|
|
386
|
+
* - host_app_control, host_cu: not in HOST_TOOL_TO_CAPABILITY (skill-routed).
|
|
387
|
+
* Their cross-client exposure is handled at the skill preactivation layer
|
|
388
|
+
* via `preactivateHostProxySkills` — see host-proxy-preactivation.ts.
|
|
376
389
|
*/
|
|
377
390
|
const CROSS_CLIENT_EXPOSED_CAPABILITIES = new Set<HostProxyCapability>([
|
|
378
391
|
"host_bash",
|
|
379
392
|
"host_file",
|
|
393
|
+
"host_browser",
|
|
380
394
|
]);
|
|
381
395
|
const CLIENT_CAPABILITY_TOOL_NAMES = new Set(["app_open"]);
|
|
382
396
|
const PLATFORM_TOOL_NAMES = new Set(["request_system_permission"]);
|
|
@@ -413,15 +427,15 @@ export function isToolActiveForContext(
|
|
|
413
427
|
// transport cannot service this capability, the tool is filtered out.
|
|
414
428
|
if (transport && capability && !supportsHostProxy(transport, capability)) {
|
|
415
429
|
// Cross-client exception: allow host tools whose capabilities have
|
|
416
|
-
// cross-client routing infrastructure (Phases 1–3
|
|
417
|
-
// non-host-proxy transports (e.g.
|
|
418
|
-
// capable client is connected via
|
|
419
|
-
//
|
|
420
|
-
//
|
|
421
|
-
// own executor and web turns don't have a CDP target model).
|
|
430
|
+
// cross-client routing infrastructure (Phases 1–3 plus host_browser
|
|
431
|
+
// via PR #27489) to be exposed for non-host-proxy transports (e.g.
|
|
432
|
+
// "web", "ios") when at least one capable client is connected via
|
|
433
|
+
// the event hub. Members of CROSS_CLIENT_EXPOSED_CAPABILITIES
|
|
434
|
+
// (host_bash, host_file, host_browser) qualify.
|
|
422
435
|
// chrome-extension transport is excluded as a security boundary
|
|
423
|
-
// (extension only gets host_browser
|
|
424
|
-
// (no interactive approval UI
|
|
436
|
+
// (extension only gets host_browser via its own executor path);
|
|
437
|
+
// hasNoClient turns are excluded (no interactive approval UI
|
|
438
|
+
// available).
|
|
425
439
|
if (
|
|
426
440
|
capability &&
|
|
427
441
|
CROSS_CLIENT_EXPOSED_CAPABILITIES.has(capability) &&
|
|
@@ -27,6 +27,7 @@ import {
|
|
|
27
27
|
contextWindowConfigFromEffective,
|
|
28
28
|
resolveEffectiveContextWindow,
|
|
29
29
|
} from "../config/llm-context-resolution.js";
|
|
30
|
+
import { resolveCallSiteConfig } from "../config/llm-resolver.js";
|
|
30
31
|
import { getConfig } from "../config/loader.js";
|
|
31
32
|
import type { LLMCallSite, Speed } from "../config/schemas/llm.js";
|
|
32
33
|
import type { ContextWindowConfig } from "../config/types.js";
|
|
@@ -53,6 +54,7 @@ import {
|
|
|
53
54
|
getConversationOriginChannel,
|
|
54
55
|
getConversationOverrideProfileFromRow,
|
|
55
56
|
} from "../memory/conversation-crud.js";
|
|
57
|
+
import { isBackgroundConversationType } from "../memory/conversation-types.js";
|
|
56
58
|
import { ConversationGraphMemory } from "../memory/graph/conversation-graph-memory.js";
|
|
57
59
|
import { PermissionPrompter } from "../permissions/prompter.js";
|
|
58
60
|
import { SecretPrompter } from "../permissions/secret-prompter.js";
|
|
@@ -119,8 +121,9 @@ import {
|
|
|
119
121
|
} from "./conversation-tool-setup.js";
|
|
120
122
|
import { refreshWorkspaceTopLevelContextIfNeeded as refreshWorkspaceImpl } from "./conversation-workspace.js";
|
|
121
123
|
import { canonicalizeTimeZone } from "./date-context.js";
|
|
122
|
-
import
|
|
124
|
+
import { HostAppControlProxy } from "./host-app-control-proxy.js";
|
|
123
125
|
import { HostCuProxy } from "./host-cu-proxy.js";
|
|
126
|
+
import { shouldAttachHostProxyForCapability } from "./host-proxy-preactivation.js";
|
|
124
127
|
import type {
|
|
125
128
|
ServerMessage,
|
|
126
129
|
SurfaceData,
|
|
@@ -233,6 +236,14 @@ export class Conversation {
|
|
|
233
236
|
};
|
|
234
237
|
/** @internal */ surfaceActionRequestIds = new Set<string>();
|
|
235
238
|
/** @internal */ approvedViaPromptThisTurn = false;
|
|
239
|
+
/**
|
|
240
|
+
* When true, side-effect tools must prompt even if a trust/allow rule
|
|
241
|
+
* would auto-allow. Set by non-interactive callers (e.g. non-guardian
|
|
242
|
+
* phone voice) so their auto-deny handler reliably sees a
|
|
243
|
+
* `confirmation_request` event. See ToolSetupContext.forcePromptSideEffects.
|
|
244
|
+
* @internal
|
|
245
|
+
*/
|
|
246
|
+
forcePromptSideEffects = false;
|
|
236
247
|
/** @internal */ pendingSurfaceActions = new Map<
|
|
237
248
|
string,
|
|
238
249
|
{ surfaceType: SurfaceType }
|
|
@@ -424,7 +435,8 @@ export class Conversation {
|
|
|
424
435
|
);
|
|
425
436
|
|
|
426
437
|
const config = getConfig();
|
|
427
|
-
|
|
438
|
+
const resolvedMainAgent = resolveCallSiteConfig("mainAgent", config.llm);
|
|
439
|
+
this.streamThinking = resolvedMainAgent.thinking.streamThinking ?? false;
|
|
428
440
|
|
|
429
441
|
// CES (Credential Execution Service) — use the shared server-level client.
|
|
430
442
|
// The CES sidecar accepts exactly one bootstrap connection, so the
|
|
@@ -463,6 +475,9 @@ export class Conversation {
|
|
|
463
475
|
channelPersona: persona.channelPersona,
|
|
464
476
|
userSlug: persona.userSlug,
|
|
465
477
|
onboardingContext: this.getOnboardingContext(),
|
|
478
|
+
isBackgroundConversation: isBackgroundConversationType(
|
|
479
|
+
getConversation(this.conversationId)?.conversationType,
|
|
480
|
+
),
|
|
466
481
|
});
|
|
467
482
|
})(),
|
|
468
483
|
};
|
|
@@ -476,20 +491,19 @@ export class Conversation {
|
|
|
476
491
|
};
|
|
477
492
|
|
|
478
493
|
const fastModeEnabled = isAssistantFeatureFlagEnabled("fast-mode", config);
|
|
479
|
-
const resolvedSpeed = speedOverride ??
|
|
480
|
-
const llmDefault = config.llm.default;
|
|
494
|
+
const resolvedSpeed = speedOverride ?? resolvedMainAgent.speed;
|
|
481
495
|
const initialContextWindow = resolveEffectiveContextWindow({
|
|
482
496
|
llm: config.llm,
|
|
483
497
|
callSite: "mainAgent",
|
|
484
498
|
});
|
|
485
499
|
const initialContextWindowConfig = contextWindowConfigFromEffective(
|
|
486
|
-
|
|
500
|
+
resolvedMainAgent.contextWindow,
|
|
487
501
|
initialContextWindow,
|
|
488
502
|
);
|
|
489
503
|
|
|
490
504
|
const agentLoopConfig: Partial<AgentLoopConfig> = {
|
|
491
|
-
thinking:
|
|
492
|
-
effort:
|
|
505
|
+
thinking: resolvedMainAgent.thinking,
|
|
506
|
+
effort: resolvedMainAgent.effort,
|
|
493
507
|
...(fastModeEnabled && resolvedSpeed === "fast"
|
|
494
508
|
? { speed: resolvedSpeed }
|
|
495
509
|
: {}),
|
|
@@ -551,6 +565,9 @@ export class Conversation {
|
|
|
551
565
|
channelPersona: persona.channelPersona,
|
|
552
566
|
userSlug: persona.userSlug,
|
|
553
567
|
onboardingContext: this.getOnboardingContext(),
|
|
568
|
+
isBackgroundConversation: isBackgroundConversationType(
|
|
569
|
+
getConversation(this.conversationId)?.conversationType,
|
|
570
|
+
),
|
|
554
571
|
});
|
|
555
572
|
})();
|
|
556
573
|
const tools = buildToolDefinitions();
|
|
@@ -943,6 +960,23 @@ export class Conversation {
|
|
|
943
960
|
this.hostAppControlProxy = proxy;
|
|
944
961
|
}
|
|
945
962
|
|
|
963
|
+
ensureHostProxiesForTurn(
|
|
964
|
+
sourceInterface: import("../channels/types.js").InterfaceId | undefined,
|
|
965
|
+
): void {
|
|
966
|
+
if (
|
|
967
|
+
shouldAttachHostProxyForCapability("host_cu", sourceInterface) &&
|
|
968
|
+
!this.hostCuProxy
|
|
969
|
+
) {
|
|
970
|
+
this.setHostCuProxy(new HostCuProxy());
|
|
971
|
+
}
|
|
972
|
+
if (
|
|
973
|
+
shouldAttachHostProxyForCapability("host_app_control", sourceInterface) &&
|
|
974
|
+
!this.hostAppControlProxy
|
|
975
|
+
) {
|
|
976
|
+
this.setHostAppControlProxy(new HostAppControlProxy(this.conversationId));
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
|
|
946
980
|
// ── Server-authoritative state signals ─────────────────────────────
|
|
947
981
|
|
|
948
982
|
emitConfirmationStateChanged(
|
|
@@ -991,7 +1025,9 @@ export class Conversation {
|
|
|
991
1025
|
}
|
|
992
1026
|
}
|
|
993
1027
|
|
|
994
|
-
async forceCompact(
|
|
1028
|
+
async forceCompact(options?: {
|
|
1029
|
+
targetInputTokensOverride?: number;
|
|
1030
|
+
}): Promise<ContextWindowResult> {
|
|
995
1031
|
const conversationRow = getConversation(this.conversationId);
|
|
996
1032
|
const overrideProfile =
|
|
997
1033
|
getConversationOverrideProfileFromRow(conversationRow) ?? null;
|
|
@@ -1007,7 +1043,9 @@ export class Conversation {
|
|
|
1007
1043
|
}
|
|
1008
1044
|
).updateConfig?.(
|
|
1009
1045
|
contextWindowConfigFromEffective(
|
|
1010
|
-
config.llm
|
|
1046
|
+
resolveCallSiteConfig("mainAgent", config.llm, {
|
|
1047
|
+
overrideProfile: overrideProfile ?? undefined,
|
|
1048
|
+
}).contextWindow,
|
|
1011
1049
|
effectiveContextWindow,
|
|
1012
1050
|
),
|
|
1013
1051
|
);
|
|
@@ -1037,6 +1075,7 @@ export class Conversation {
|
|
|
1037
1075
|
conversationOriginChannel:
|
|
1038
1076
|
getConversationOriginChannel(this.conversationId) ?? undefined,
|
|
1039
1077
|
overrideProfile,
|
|
1078
|
+
targetInputTokensOverride: options?.targetInputTokensOverride,
|
|
1040
1079
|
},
|
|
1041
1080
|
);
|
|
1042
1081
|
// Track circuit-breaker state for user-initiated `/compact` and other
|
|
@@ -1052,7 +1091,7 @@ export class Conversation {
|
|
|
1052
1091
|
);
|
|
1053
1092
|
}
|
|
1054
1093
|
if (result.compacted) {
|
|
1055
|
-
applyCompactionResult(this, result, this.sendToClient, null, {
|
|
1094
|
+
await applyCompactionResult(this, result, this.sendToClient, null, {
|
|
1056
1095
|
slackContextCompactionWatermarkTs: getSlackCompactionWatermarkForPrefix(
|
|
1057
1096
|
slackChronologicalContext,
|
|
1058
1097
|
result.compactedMessages,
|
|
@@ -69,6 +69,7 @@ import {
|
|
|
69
69
|
type Plugin,
|
|
70
70
|
PluginExecutionError,
|
|
71
71
|
type PluginInitContext,
|
|
72
|
+
type PluginShutdownContext,
|
|
72
73
|
type PluginSkillRegistration,
|
|
73
74
|
} from "../plugins/types.js";
|
|
74
75
|
import {
|
|
@@ -218,8 +219,16 @@ export async function bootstrapPlugins(ctx: DaemonContext): Promise<void> {
|
|
|
218
219
|
// server), the latter drops the plugin's entry from the Map (so
|
|
219
220
|
// `getMiddlewaresFor` / `getInjectors` don't re-enter an uninitialized
|
|
220
221
|
// plugin on the next pipeline invocation).
|
|
222
|
+
// Shutdown context is identical for every plugin in this boot — construct
|
|
223
|
+
// once and reuse across the bootstrap-failure rollback and the normal
|
|
224
|
+
// shutdown hook below. Only `assistantVersion` is exposed today; future
|
|
225
|
+
// additions live on {@link PluginShutdownContext}.
|
|
226
|
+
const shutdownContext: PluginShutdownContext = {
|
|
227
|
+
assistantVersion: ctx.assistantVersion,
|
|
228
|
+
};
|
|
229
|
+
|
|
221
230
|
async function rollbackPlugin(active: ActivePlugin): Promise<void> {
|
|
222
|
-
await teardownPlugin(active, "bootstrap-failed");
|
|
231
|
+
await teardownPlugin(active, "bootstrap-failed", shutdownContext);
|
|
223
232
|
unregisterPlugin(active.plugin.manifest.name);
|
|
224
233
|
}
|
|
225
234
|
|
|
@@ -309,9 +318,9 @@ export async function bootstrapPlugins(ctx: DaemonContext): Promise<void> {
|
|
|
309
318
|
apiVersions: ASSISTANT_API_VERSIONS,
|
|
310
319
|
};
|
|
311
320
|
|
|
312
|
-
if (plugin.init) {
|
|
321
|
+
if (plugin.hooks?.init) {
|
|
313
322
|
try {
|
|
314
|
-
await plugin.init(initContext);
|
|
323
|
+
await plugin.hooks.init(initContext);
|
|
315
324
|
} catch (err) {
|
|
316
325
|
throw new PluginExecutionError(
|
|
317
326
|
`plugin ${name} init() failed: ${
|
|
@@ -445,7 +454,7 @@ export async function bootstrapPlugins(ctx: DaemonContext): Promise<void> {
|
|
|
445
454
|
const shutdownSnapshot: ActivePlugin[] = [...activePlugins];
|
|
446
455
|
registerShutdownHook("plugins", async (reason) => {
|
|
447
456
|
for (let i = shutdownSnapshot.length - 1; i >= 0; i--) {
|
|
448
|
-
await teardownPlugin(shutdownSnapshot[i]!, reason);
|
|
457
|
+
await teardownPlugin(shutdownSnapshot[i]!, reason, shutdownContext);
|
|
449
458
|
}
|
|
450
459
|
});
|
|
451
460
|
}
|
|
@@ -473,6 +482,7 @@ interface ActivePlugin {
|
|
|
473
482
|
async function teardownPlugin(
|
|
474
483
|
active: ActivePlugin,
|
|
475
484
|
reason: string,
|
|
485
|
+
shutdownContext: PluginShutdownContext,
|
|
476
486
|
): Promise<void> {
|
|
477
487
|
const { plugin, routeHandles } = active;
|
|
478
488
|
const name = plugin.manifest.name;
|
|
@@ -504,17 +514,17 @@ async function teardownPlugin(
|
|
|
504
514
|
);
|
|
505
515
|
}
|
|
506
516
|
|
|
507
|
-
if (plugin.
|
|
517
|
+
if (plugin.hooks?.shutdown) {
|
|
508
518
|
try {
|
|
509
|
-
await plugin.
|
|
519
|
+
await plugin.hooks.shutdown(shutdownContext);
|
|
510
520
|
} catch (err) {
|
|
511
|
-
// Swallow — we want every plugin's
|
|
521
|
+
// Swallow — we want every plugin's shutdown to get a chance to run
|
|
512
522
|
// even when an earlier one throws. The outer runShutdownHooks already
|
|
513
523
|
// logs at hook level, but the plugin-name attribution here is what
|
|
514
524
|
// operators read first.
|
|
515
525
|
log.warn(
|
|
516
526
|
{ err, plugin: name, reason },
|
|
517
|
-
"plugin
|
|
527
|
+
"plugin shutdown hook failed (continuing with remaining plugins)",
|
|
518
528
|
);
|
|
519
529
|
}
|
|
520
530
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { loadConfig } from "../config/loader.js";
|
|
2
|
+
import { wrapWithCallSiteRouting } from "../providers/call-site-routing.js";
|
|
2
3
|
import { getConfiguredProvider } from "../providers/provider-send-message.js";
|
|
3
|
-
import { getProvider } from "../providers/registry.js";
|
|
4
|
-
import type { Provider } from "../providers/types.js";
|
|
5
4
|
import {
|
|
6
5
|
buildGuardianActionGenerationPrompt,
|
|
7
6
|
getGuardianActionFallbackMessage,
|
|
@@ -32,8 +31,10 @@ export function createGuardianActionCopyGenerator(): GuardianActionCopyGenerator
|
|
|
32
31
|
if (!baseProvider) return null;
|
|
33
32
|
// Wrap so the per-call `callSite` can route to a different provider
|
|
34
33
|
// transport when `llm.callSites.guardianQuestionCopy.provider` overrides
|
|
35
|
-
// the default.
|
|
36
|
-
|
|
34
|
+
// the default. Connection-aware: when the resolved profile names a
|
|
35
|
+
// `provider_connection`, that connection's auth wins over the legacy
|
|
36
|
+
// registry lookup. See `wrapWithCallSiteRouting`.
|
|
37
|
+
const provider = wrapWithCallSiteRouting(baseProvider, loadConfig());
|
|
37
38
|
|
|
38
39
|
const fallbackText =
|
|
39
40
|
options.fallbackText?.trim() || getGuardianActionFallbackMessage(context);
|
|
@@ -135,7 +136,7 @@ export function createGuardianFollowUpConversationGenerator(): GuardianFollowUpC
|
|
|
135
136
|
if (!baseProvider) {
|
|
136
137
|
throw new Error("No configured provider available for follow-up conversation");
|
|
137
138
|
}
|
|
138
|
-
const provider = wrapWithCallSiteRouting(baseProvider);
|
|
139
|
+
const provider = wrapWithCallSiteRouting(baseProvider, loadConfig());
|
|
139
140
|
|
|
140
141
|
const userPrompt = [
|
|
141
142
|
`Original question from the voice call: "${context.questionText}"`,
|
|
@@ -192,19 +193,3 @@ export function createGuardianFollowUpConversationGenerator(): GuardianFollowUpC
|
|
|
192
193
|
return result;
|
|
193
194
|
};
|
|
194
195
|
}
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Wrap a base Provider so per-call `callSite` metadata can route the actual
|
|
198
|
-
* transport to a different provider when `llm.callSites.<id>.provider`
|
|
199
|
-
* differs from the default. Without this wrapper, only request metadata
|
|
200
|
-
* reflects the callSite — the HTTP transport stays bound to the default.
|
|
201
|
-
*/
|
|
202
|
-
function wrapWithCallSiteRouting(base: Provider): Provider {
|
|
203
|
-
return new CallSiteRoutingProvider(base, (name) => {
|
|
204
|
-
try {
|
|
205
|
-
return getProvider(name);
|
|
206
|
-
} catch {
|
|
207
|
-
return undefined;
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
}
|