@vellumai/assistant 0.7.0 → 0.7.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/ARCHITECTURE.md +6 -7
- package/Dockerfile +1 -0
- package/README.md +2 -2
- package/__tests__/permissions/gateway-threshold-reader.test.ts +79 -139
- package/bun.lock +3 -0
- package/docs/architecture/security.md +18 -16
- package/knip.json +1 -0
- package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +1 -5
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +0 -5
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -16
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +1 -9
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +12 -12
- package/node_modules/@vellumai/slack-text/bun.lock +24 -0
- package/node_modules/@vellumai/slack-text/package.json +18 -0
- package/node_modules/@vellumai/slack-text/src/index.test.ts +153 -0
- package/node_modules/@vellumai/slack-text/src/index.ts +235 -0
- package/node_modules/@vellumai/slack-text/tsconfig.json +20 -0
- package/openapi.yaml +294 -107
- package/package.json +4 -2
- package/scripts/generate-openapi.ts +16 -111
- package/src/__tests__/agent-wake-override-profile.test.ts +23 -1
- package/src/__tests__/anthropic-provider.test.ts +56 -13
- package/src/__tests__/app-conversation-ids-backfill.test.ts +278 -0
- package/src/__tests__/app-conversation-ids.test.ts +151 -0
- package/src/__tests__/approval-cascade.test.ts +0 -15
- package/src/__tests__/approval-routes-http.test.ts +6 -17
- package/src/__tests__/assistant-event-hub.test.ts +126 -77
- package/src/__tests__/assistant-event.test.ts +0 -5
- package/src/__tests__/assistant-events-sse-hardening.test.ts +37 -15
- package/src/__tests__/assistant-feature-flags-integration.test.ts +0 -29
- package/src/__tests__/background-shell-host-bash.test.ts +34 -43
- package/src/__tests__/call-controller.test.ts +1 -1
- package/src/__tests__/call-site-routing-provider.test.ts +193 -0
- package/src/__tests__/channel-approval-routes.test.ts +10 -296
- package/src/__tests__/channel-approvals.test.ts +25 -17
- package/src/__tests__/channel-guardian.test.ts +100 -146
- package/src/__tests__/checker.test.ts +20 -34
- package/src/__tests__/compact-event-conversation-id-guard.test.ts +50 -0
- package/src/__tests__/compaction-events.test.ts +2 -0
- package/src/__tests__/config-schema.test.ts +6 -48
- package/src/__tests__/config-watcher.test.ts +12 -0
- package/src/__tests__/connection-policy.test.ts +1 -52
- package/src/__tests__/contacts-write.test.ts +2 -64
- package/src/__tests__/context-image-dimensions.test.ts +1 -1
- package/src/__tests__/context-search-memory-source.test.ts +120 -1
- package/src/__tests__/context-search-memory-v2-source.test.ts +383 -0
- package/src/__tests__/context-search-pkb-source.test.ts +49 -0
- package/src/__tests__/context-search-workspace-source.test.ts +9 -22
- package/src/__tests__/context-window-manager.test.ts +46 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +102 -29
- package/src/__tests__/conversation-agent-loop.test.ts +980 -13
- package/src/__tests__/conversation-analysis-routes.test.ts +12 -10
- package/src/__tests__/conversation-attention-telegram.test.ts +11 -3
- package/src/__tests__/conversation-confirmation-signals.test.ts +0 -291
- package/src/__tests__/conversation-history-web-search.test.ts +4 -3
- package/src/__tests__/conversation-inference-profile-route.test.ts +12 -23
- package/src/__tests__/conversation-lifecycle.test.ts +4 -4
- package/src/__tests__/conversation-process-callsite.test.ts +79 -2
- package/src/__tests__/conversation-queue.test.ts +3 -8
- package/src/__tests__/conversation-routes-disk-view.test.ts +1 -161
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +0 -32
- package/src/__tests__/conversation-routes-slash-commands.test.ts +75 -66
- package/src/__tests__/conversation-runtime-assembly.test.ts +257 -3
- package/src/__tests__/conversation-slash-commands.test.ts +24 -4
- package/src/__tests__/conversation-slash-queue.test.ts +2 -0
- package/src/__tests__/conversation-speed-override.test.ts +0 -3
- package/src/__tests__/conversation-starter-routes.test.ts +79 -2
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +12 -5
- package/src/__tests__/conversation-surfaces-standalone.test.ts +18 -14
- package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -2
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +8 -46
- package/src/__tests__/conversation-usage.test.ts +253 -3
- package/src/__tests__/credential-execution-shell-lockdown.test.ts +0 -39
- package/src/__tests__/credential-health-service.test.ts +68 -0
- package/src/__tests__/credential-security-e2e.test.ts +4 -3
- package/src/__tests__/credential-security-invariants.test.ts +1 -5
- package/src/__tests__/credential-token-resolver.test.ts +180 -0
- package/src/__tests__/cu-unified-flow.test.ts +33 -16
- package/src/__tests__/daemon-assistant-events.test.ts +34 -21
- package/src/__tests__/daemon-credential-client.test.ts +4 -1
- package/src/__tests__/db-connection-isolation.test.ts +125 -0
- package/src/__tests__/db-migration-rollback.test.ts +101 -0
- package/src/__tests__/db-slack-compaction-watermark-migration.test.ts +169 -0
- package/src/__tests__/deterministic-verification-control-plane.test.ts +7 -80
- package/src/__tests__/document-conversations.test.ts +332 -0
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +2 -2
- package/src/__tests__/emit-event-signal.test.ts +4 -6
- package/src/__tests__/events-client-registration.test.ts +193 -49
- package/src/__tests__/filing-service.test.ts +58 -7
- package/src/__tests__/first-greeting.test.ts +156 -150
- package/src/__tests__/fixtures/mock-chrome-extension.ts +108 -66
- package/src/__tests__/get-skill-detail-audit.test.ts +3 -8
- package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -1
- package/src/__tests__/guardian-grant-minting.test.ts +7 -2
- package/src/__tests__/guardian-routing-invariants.test.ts +7 -2
- package/src/__tests__/guardian-routing-state.test.ts +1 -1
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +32 -11
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -83
- package/src/__tests__/headless-browser-mode.test.ts +4 -9
- package/src/__tests__/headless-browser-navigate.test.ts +21 -20
- package/src/__tests__/heartbeat-service.test.ts +289 -7
- package/src/__tests__/helpers/channel-test-adapter.ts +2 -2
- package/src/__tests__/helpers/create-guardian-binding.ts +91 -0
- package/src/__tests__/host-bash-proxy.test.ts +46 -122
- package/src/__tests__/host-browser-e2e-cloud.test.ts +36 -497
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +26 -96
- package/src/__tests__/host-browser-proxy.test.ts +111 -185
- package/src/__tests__/host-browser-routes.test.ts +45 -75
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +26 -30
- package/src/__tests__/host-cu-proxy.test.ts +56 -111
- package/src/__tests__/host-file-proxy.test.ts +44 -98
- package/src/__tests__/host-file-read-tool.test.ts +42 -21
- package/src/__tests__/host-shell-tool.test.ts +33 -68
- package/src/__tests__/host-transfer-pending-interactions.test.ts +2 -18
- package/src/__tests__/host-transfer-proxy.test.ts +43 -53
- package/src/__tests__/http-user-message-parity.test.ts +0 -6
- package/src/__tests__/inbound-slack-persistence.test.ts +31 -0
- package/src/__tests__/injector-chain.test.ts +10 -5
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +124 -0
- package/src/__tests__/inline-command-runner.test.ts +0 -66
- package/src/__tests__/inline-skill-load-permissions.test.ts +0 -2
- package/src/__tests__/install-skill-routing.test.ts +1 -13
- package/src/__tests__/llm-callsite-catalog.test.ts +34 -0
- package/src/__tests__/llm-catalog-parity.test.ts +90 -0
- package/src/__tests__/llm-context-resolution.test.ts +180 -0
- package/src/__tests__/llm-resolver.test.ts +80 -12
- package/src/__tests__/llm-usage-store.test.ts +269 -4
- package/src/__tests__/log-export-routes.test.ts +89 -0
- package/src/__tests__/managed-profile-guard.test.ts +225 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +0 -10
- package/src/__tests__/manual-token-reconciliation.test.ts +334 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +95 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +197 -291
- package/src/__tests__/migration-export-http.test.ts +33 -26
- package/src/__tests__/migration-export-streaming.test.ts +18 -10
- package/src/__tests__/migration-export-to-gcs.test.ts +49 -9
- package/src/__tests__/migration-import-commit-http.test.ts +66 -21
- package/src/__tests__/migration-import-from-gcs.test.ts +50 -9
- package/src/__tests__/migration-import-from-url.test.ts +20 -6
- package/src/__tests__/migration-import-preflight-http.test.ts +95 -95
- package/src/__tests__/migration-parity-persistence.test.ts +62 -25
- package/src/__tests__/migration-transport.test.ts +115 -23
- package/src/__tests__/migration-validate-http.test.ts +105 -80
- package/src/__tests__/migration-wizard.test.ts +133 -27
- package/src/__tests__/non-member-access-request.test.ts +1 -1
- package/src/__tests__/notification-guardian-path.test.ts +1 -1
- package/src/__tests__/oauth-store.test.ts +19 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +21 -12
- package/src/__tests__/prechat-onboarding-contract.test.ts +31 -7
- package/src/__tests__/pricing.test.ts +68 -4
- package/src/__tests__/process-message-background-slack.test.ts +331 -0
- package/src/__tests__/provider-managed-proxy-integration.test.ts +153 -17
- package/src/__tests__/provider-send-message-override-profile.test.ts +50 -0
- package/src/__tests__/provider-usage-tracking.test.ts +208 -0
- package/src/__tests__/reaction-persistence.test.ts +9 -6
- package/src/__tests__/rebind-secrets-screen.test.ts +53 -16
- package/src/__tests__/recording-handler.test.ts +64 -81
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +4 -3
- package/src/__tests__/relay-server.test.ts +18 -13
- package/src/__tests__/require-fresh-approval.test.ts +13 -22
- package/src/__tests__/runtime-attachment-metadata.test.ts +1 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
- package/src/__tests__/runtime-events-sse.test.ts +3 -12
- package/src/__tests__/search-skills-unified.test.ts +9 -15
- package/src/__tests__/secret-ingress-cli.test.ts +2 -5
- package/src/__tests__/secret-ingress-http.test.ts +0 -4
- package/src/__tests__/secret-onetime-send.test.ts +4 -2
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +24 -7
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +42 -47
- package/src/__tests__/secret-response-routing.test.ts +29 -15
- package/src/__tests__/secret-routes-managed-proxy.test.ts +5 -1
- package/src/__tests__/secret-scanner.test.ts +2 -545
- package/src/__tests__/send-endpoint-busy.test.ts +9 -24
- package/src/__tests__/settings-routes.test.ts +1 -1
- package/src/__tests__/shell-credential-ref.test.ts +0 -8
- package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -56
- package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -11
- package/src/__tests__/skill-tool-factory.test.ts +97 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +9 -30
- package/src/__tests__/skills-files-catalog-fallback.test.ts +11 -17
- package/src/__tests__/slack-inbound-verification.test.ts +1 -62
- package/src/__tests__/subagent-fork-notifications.test.ts +57 -47
- package/src/__tests__/subagent-manager-notify.test.ts +70 -70
- package/src/__tests__/subagent-notify-parent.test.ts +80 -83
- package/src/__tests__/system-prompt.test.ts +115 -13
- package/src/__tests__/terminal-tools.test.ts +0 -89
- package/src/__tests__/thread-backfill.test.ts +945 -31
- package/src/__tests__/tool-domain-event-publisher.test.ts +0 -36
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -6
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -16
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +9 -19
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -7
- package/src/__tests__/tool-executor.test.ts +12 -19
- package/src/__tests__/tool-metrics-listener.test.ts +0 -35
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
- package/src/__tests__/tool-trace-listener.test.ts +0 -17
- package/src/__tests__/transfer-progress-screen.test.ts +63 -26
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +2 -149
- package/src/__tests__/trusted-contact-multichannel.test.ts +2 -4
- package/src/__tests__/trusted-contact-verification.test.ts +1 -1
- package/src/__tests__/tts-catalog-parity.test.ts +16 -5
- package/src/__tests__/usage-attribution.test.ts +247 -0
- package/src/__tests__/usage-cli.test.ts +143 -0
- package/src/__tests__/usage-grouped-buckets.test.ts +155 -0
- package/src/__tests__/usage-routes.test.ts +150 -0
- package/src/__tests__/validation-results-screen.test.ts +39 -16
- package/src/__tests__/vbundle-pax-and-symlink.test.ts +12 -3
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +49 -137
- package/src/__tests__/verification-control-plane-policy.test.ts +4 -7
- package/src/__tests__/voice-session-bridge.test.ts +5 -5
- package/src/__tests__/workspace-migration-062-drop-memory-v2-edges-json.test.ts +103 -0
- package/src/__tests__/workspace-migration-063-release-notes-dynamic-model-context.test.ts +77 -0
- package/src/__tests__/workspace-migration-064-unwind-main-agent-opus-seed.test.ts +225 -0
- package/src/__tests__/workspace-migration-memory-v2-init.test.ts +8 -30
- package/src/acp/index.ts +0 -15
- package/src/acp/session-manager.ts +37 -34
- package/src/agent/loop.ts +16 -1
- package/src/approvals/AGENTS.md +4 -0
- package/src/approvals/__tests__/guardian-feed-event.test.ts +10 -3
- package/src/approvals/guardian-request-resolvers.ts +10 -2
- package/src/backup/__tests__/backup-worker.test.ts +36 -8
- package/src/backup/__tests__/paths.test.ts +2 -2
- package/src/backup/__tests__/restore.test.ts +45 -28
- package/src/backup/backup-worker.ts +36 -2
- package/src/backup/paths.ts +9 -6
- package/src/browser-session/events.ts +0 -9
- package/src/calls/call-store.ts +1 -34
- package/src/calls/guardian-question-copy.ts +0 -108
- package/src/calls/relay-server.ts +0 -24
- package/src/calls/twilio-rest.ts +0 -38
- package/src/calls/twilio-routes.ts +1 -1
- package/src/calls/voice-session-bridge.ts +7 -38
- package/src/channels/types.ts +1 -36
- package/src/cli/commands/__tests__/cache.test.ts +152 -5
- package/src/cli/commands/__tests__/memory-v2.test.ts +14 -28
- package/src/cli/commands/__tests__/trust.test.ts +21 -387
- package/src/cli/commands/backup.ts +4 -4
- package/src/cli/commands/cache-fs.ts +8 -0
- package/src/cli/commands/cache.ts +153 -82
- package/src/cli/commands/clients.ts +63 -5
- package/src/cli/commands/completions.ts +3 -3
- package/src/cli/commands/contacts.ts +231 -76
- package/src/cli/commands/keys.ts +4 -1
- package/src/cli/commands/memory-v2.ts +24 -52
- package/src/cli/commands/oauth/shared.ts +2 -29
- package/src/cli/commands/pending.ts +102 -0
- package/src/cli/commands/skills.ts +77 -35
- package/src/cli/commands/trust.ts +70 -430
- package/src/cli/commands/usage.ts +25 -16
- package/src/cli/lib/daemon-credential-client.ts +14 -0
- package/src/cli/program.ts +2 -0
- package/src/cli.ts +0 -21
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/bundled-skills/messaging/TOOLS.json +14 -4
- package/src/config/env-registry.ts +12 -2
- package/src/config/env.ts +3 -14
- package/src/config/feature-flag-registry.json +30 -30
- package/src/config/llm-callsite-catalog.ts +12 -0
- package/src/config/llm-context-resolution.ts +80 -0
- package/src/config/llm-resolver.ts +58 -22
- package/src/config/loader.ts +3 -3
- package/src/config/schema.ts +2 -158
- package/src/config/schemas/__tests__/memory-v2.test.ts +1 -0
- package/src/config/schemas/call-site-catalog.ts +271 -0
- package/src/config/schemas/calls.ts +5 -5
- package/src/config/schemas/inference.ts +1 -1
- package/src/config/schemas/ingress.ts +1 -1
- package/src/config/schemas/llm.ts +31 -3
- package/src/config/schemas/memory-retrieval.ts +2 -2
- package/src/config/schemas/memory-v2.ts +9 -0
- package/src/config/schemas/security.ts +1 -42
- package/src/config/schemas/services.ts +6 -6
- package/src/config/schemas/skills.ts +5 -5
- package/src/config/schemas/tts.ts +1 -1
- package/src/config/seed-inference-profiles.ts +117 -0
- package/src/config/skills.ts +0 -90
- package/src/config/types.ts +3 -6
- package/src/contacts/contact-store.ts +0 -17
- package/src/contacts/contacts-write.ts +1 -105
- package/src/context/window-manager.ts +44 -5
- package/src/credential-execution/process-manager.ts +34 -10
- package/src/credential-health/credential-health-service.ts +21 -16
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +75 -82
- package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -9
- package/src/daemon/connection-policy.ts +1 -26
- package/src/daemon/conversation-agent-loop-handlers.ts +53 -4
- package/src/daemon/conversation-agent-loop.ts +277 -36
- package/src/daemon/conversation-history.ts +8 -8
- package/src/daemon/conversation-launch.ts +20 -135
- package/src/daemon/conversation-lifecycle.ts +1 -1
- package/src/daemon/conversation-messaging.ts +1 -0
- package/src/daemon/conversation-process.ts +83 -163
- package/src/daemon/conversation-runtime-assembly.ts +219 -76
- package/src/daemon/conversation-slash.ts +47 -5
- package/src/daemon/conversation-store.ts +7 -31
- package/src/daemon/conversation-surfaces.ts +22 -28
- package/src/daemon/conversation-tool-setup.ts +3 -33
- package/src/daemon/conversation-usage.ts +36 -0
- package/src/daemon/conversation.ts +117 -233
- package/src/daemon/daemon-control.ts +3 -71
- package/src/daemon/daemon-skill-host.ts +8 -11
- package/src/daemon/dictation-profile-store.ts +2 -26
- package/src/daemon/first-greeting.ts +44 -156
- package/src/daemon/handlers/config-channels.ts +12 -12
- package/src/daemon/handlers/config-ingress.ts +4 -165
- package/src/daemon/handlers/config-model.ts +1 -1
- package/src/daemon/handlers/config-voice.ts +0 -42
- package/src/daemon/handlers/conversations.ts +11 -190
- package/src/daemon/handlers/recording.ts +26 -158
- package/src/daemon/handlers/shared.ts +23 -71
- package/src/daemon/handlers/skills.ts +42 -93
- package/src/daemon/host-bash-proxy.ts +67 -45
- package/src/daemon/host-browser-proxy.ts +65 -27
- package/src/daemon/host-cu-proxy.ts +40 -39
- package/src/daemon/host-file-proxy.ts +58 -37
- package/src/daemon/host-transfer-proxy.ts +84 -46
- package/src/daemon/lifecycle.ts +49 -15
- package/src/daemon/message-types/conversations.ts +7 -0
- package/src/daemon/message-types/host-bash.ts +1 -0
- package/src/daemon/message-types/host-cu.ts +1 -0
- package/src/daemon/message-types/host-file.ts +1 -0
- package/src/daemon/message-types/host-transfer.ts +1 -0
- package/src/daemon/message-types/messages.ts +10 -9
- package/src/daemon/message-types/workspace.ts +1 -1
- package/src/daemon/process-message.ts +102 -239
- package/src/daemon/server.ts +13 -462
- package/src/daemon/shutdown-handlers.ts +2 -2
- package/src/daemon/tool-side-effects.ts +125 -107
- package/src/daemon/trust-context.ts +13 -0
- package/src/daemon/wake-target-adapter.ts +4 -9
- package/src/events/domain-events.ts +0 -8
- package/src/events/tool-audit-listener.ts +3 -1
- package/src/events/tool-domain-event-publisher.ts +0 -10
- package/src/events/tool-metrics-listener.ts +0 -17
- package/src/events/tool-trace-listener.ts +0 -14
- package/src/filing/filing-service.ts +13 -1
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +6 -2
- package/src/heartbeat/heartbeat-service.ts +23 -5
- package/src/home/__tests__/feed-writer.test.ts +0 -4
- package/src/home/__tests__/relationship-state-writer.test.ts +30 -0
- package/src/home/feed-writer.ts +1 -2
- package/src/home/relationship-state-writer.ts +16 -3
- package/src/ipc/__tests__/browser-ipc.test.ts +2 -12
- package/src/ipc/__tests__/skill-server-bidirectional.test.ts +0 -1
- package/src/ipc/assistant-server.ts +3 -10
- package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +39 -20
- package/src/ipc/routes/route-adapter.ts +1 -1
- package/src/ipc/routes/trust-rules.test.ts +0 -95
- package/src/ipc/skill-ipc-types.ts +41 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +13 -27
- package/src/ipc/skill-routes/__tests__/identity.test.ts +4 -23
- package/src/ipc/skill-routes/events.ts +12 -23
- package/src/ipc/skill-routes/identity.ts +4 -17
- package/src/ipc/skill-routes/index.ts +1 -1
- package/src/ipc/skill-server.ts +6 -39
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +0 -8
- package/src/live-voice/protocol.ts +4 -13
- package/src/mcp/manager.ts +0 -5
- package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +55 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +127 -0
- package/src/memory/app-git-service.ts +0 -32
- package/src/memory/app-store.ts +154 -0
- package/src/memory/attachments-store.ts +6 -0
- package/src/memory/context-search/sources/memory-v2.ts +578 -0
- package/src/memory/context-search/sources/memory.ts +5 -0
- package/src/memory/context-search/sources/pkb.ts +10 -1
- package/src/memory/context-search/sources/workspace.ts +3 -2
- package/src/memory/conversation-crud.ts +29 -4
- package/src/memory/conversation-disk-view.ts +1 -5
- package/src/memory/conversation-starter-checkpoints.ts +63 -0
- package/src/memory/db-connection.ts +62 -0
- package/src/memory/db-init.ts +14 -0
- package/src/memory/embedding-backend.ts +3 -21
- package/src/memory/embedding-gemini.ts +0 -2
- package/src/memory/embedding-local.ts +6 -6
- package/src/memory/embedding-ollama.ts +6 -6
- package/src/memory/embedding-openai.ts +6 -6
- package/src/memory/embedding-types.ts +21 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +3 -7
- package/src/memory/graph/conversation-graph-memory.ts +35 -13
- package/src/memory/graph/injection.test.ts +2 -2
- package/src/memory/graph/injection.ts +1 -1
- package/src/memory/guardian-action-store.ts +0 -83
- package/src/memory/guardian-approvals.ts +0 -48
- package/src/memory/indexer.ts +1 -15
- package/src/memory/job-handlers/conversation-starters.ts +36 -53
- package/src/memory/job-utils.ts +0 -6
- package/src/memory/jobs-store.ts +0 -1
- package/src/memory/jobs-worker.ts +2 -16
- package/src/memory/llm-request-log-store.ts +0 -41
- package/src/memory/llm-usage-store.ts +129 -43
- package/src/memory/memory-v2-activation-log-store.ts +115 -0
- package/src/memory/migrations/233-document-conversations.ts +54 -0
- package/src/memory/migrations/234-memory-v2-activation-logs.ts +55 -0
- package/src/memory/migrations/235-llm-usage-attribution.ts +31 -0
- package/src/memory/migrations/235-slack-compaction-watermark.ts +44 -0
- package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +26 -0
- package/src/memory/migrations/__tests__/234-memory-v2-activation-logs.test.ts +182 -0
- package/src/memory/migrations/index.ts +14 -0
- package/src/memory/migrations/registry.ts +24 -0
- package/src/memory/raw-query.ts +2 -68
- package/src/memory/schema/conversations.ts +7 -0
- package/src/memory/schema/infrastructure.ts +25 -0
- package/src/memory/search/semantic.ts +5 -16
- package/src/memory/tool-usage-store.ts +2 -0
- package/src/memory/usage-buckets.ts +40 -1
- package/src/memory/usage-grouped-buckets.ts +127 -0
- package/src/memory/v2/__tests__/activation.test.ts +289 -90
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +2 -129
- package/src/memory/v2/__tests__/consolidation-job.test.ts +28 -11
- package/src/memory/v2/__tests__/edge-index.test.ts +278 -0
- package/src/memory/v2/__tests__/injection.test.ts +384 -15
- package/src/memory/v2/__tests__/migration.test.ts +64 -36
- package/src/memory/v2/__tests__/page-store.test.ts +191 -8
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +181 -0
- package/src/memory/v2/__tests__/skill-store.test.ts +115 -3
- package/src/memory/v2/__tests__/static-context.test.ts +153 -0
- package/src/memory/v2/activation.ts +168 -97
- package/src/memory/v2/backfill-jobs.ts +15 -100
- package/src/memory/v2/consolidation-job.ts +14 -12
- package/src/memory/v2/edge-index.ts +191 -0
- package/src/memory/v2/injection.ts +182 -58
- package/src/memory/v2/migration.ts +57 -64
- package/src/memory/v2/now-text.ts +2 -3
- package/src/memory/v2/page-store.ts +168 -31
- package/src/memory/v2/prompts/consolidation.ts +118 -42
- package/src/memory/v2/prompts/sweep.ts +3 -3
- package/src/memory/v2/skill-store.ts +55 -7
- package/src/memory/v2/static-context.ts +62 -0
- package/src/memory/v2/types.ts +10 -20
- package/src/memory/validation.ts +0 -11
- package/src/messaging/draft-store.ts +0 -6
- package/src/messaging/provider-types.ts +8 -0
- package/src/messaging/provider.ts +7 -0
- package/src/messaging/providers/gmail/client.ts +1 -121
- package/src/messaging/providers/outlook/client.ts +0 -73
- package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +226 -0
- package/src/messaging/providers/slack/adapter.ts +122 -21
- package/src/messaging/providers/slack/backfill.test.ts +95 -6
- package/src/messaging/providers/slack/backfill.ts +89 -11
- package/src/messaging/providers/slack/client.ts +10 -124
- package/src/messaging/providers/slack/message-metadata.ts +12 -2
- package/src/messaging/providers/slack/render-transcript.test.ts +56 -0
- package/src/messaging/providers/slack/render-transcript.ts +126 -25
- package/src/messaging/providers/slack/types.ts +1 -0
- package/src/oauth/connection-resolver.test.ts +8 -0
- package/src/oauth/connection-resolver.ts +8 -16
- package/src/oauth/credential-token-resolver.ts +97 -0
- package/src/oauth/manual-token-connection.ts +30 -34
- package/src/oauth/oauth-store.ts +6 -4
- package/src/outbound-proxy/certs.ts +0 -7
- package/src/outbound-proxy/config.ts +0 -74
- package/src/outbound-proxy/health.ts +0 -44
- package/src/outbound-proxy/index.ts +0 -22
- package/src/permissions/approval-provenance.test.ts +184 -0
- package/src/permissions/approval-provenance.ts +70 -0
- package/src/permissions/checker.ts +4 -1
- package/src/permissions/gateway-threshold-reader.ts +4 -1
- package/src/permissions/prompter.ts +9 -2
- package/src/permissions/secret-prompter.ts +21 -48
- package/src/permissions/types.ts +33 -0
- package/src/permissions/workspace-policy.ts +0 -5
- package/src/platform/sync-identity.ts +0 -8
- package/src/plugins/defaults/injectors.ts +69 -2
- package/src/plugins/defaults/overflow-reduce.ts +3 -2
- package/src/plugins/types.ts +8 -0
- package/src/prompts/system-prompt.ts +34 -70
- package/src/prompts/templates/BOOTSTRAP.md +52 -6
- package/src/prompts/update-bulletin-job.ts +2 -0
- package/src/providers/__tests__/retry-callsite.test.ts +138 -1
- package/src/providers/anthropic/client.ts +72 -33
- package/src/providers/call-site-routing.ts +42 -3
- package/src/providers/gemini/client.ts +18 -2
- package/src/providers/managed-proxy/context.ts +0 -5
- package/src/providers/model-catalog.ts +105 -19
- package/src/providers/openai/chat-completions-provider.ts +6 -0
- package/src/providers/openai/responses-provider.ts +7 -1
- package/src/providers/provider-send-message.ts +45 -2
- package/src/providers/ratelimit.ts +7 -2
- package/src/providers/registry.ts +14 -9
- package/src/providers/retry.ts +96 -8
- package/src/providers/types.ts +13 -0
- package/src/providers/usage-tracking.ts +96 -0
- package/src/runtime/AGENTS.md +10 -6
- package/src/runtime/__tests__/agent-wake.test.ts +89 -0
- package/src/runtime/agent-wake.ts +39 -2
- package/src/runtime/assistant-event-hub.ts +541 -45
- package/src/runtime/assistant-event.ts +1 -6
- package/src/runtime/auth/context.ts +0 -9
- package/src/runtime/auth/middleware.ts +1 -1
- package/src/runtime/auth/route-policy.ts +11 -9
- package/src/runtime/auth/token-service.ts +0 -11
- package/src/runtime/channel-approvals.ts +6 -2
- package/src/runtime/channel-verification-service.ts +3 -5
- package/src/runtime/http-errors.ts +0 -34
- package/src/runtime/http-router.ts +6 -3
- package/src/runtime/http-server.ts +22 -82
- package/src/runtime/http-types.ts +5 -0
- package/src/runtime/interactive-ui.ts +0 -1
- package/src/runtime/middleware/auth.ts +0 -20
- package/src/runtime/migrations/__tests__/v1-test-helpers.ts +112 -0
- package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +11 -4
- package/src/runtime/migrations/__tests__/vbundle-builder-v1-shape.test.ts +253 -0
- package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +19 -6
- package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +71 -27
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +41 -2
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +143 -79
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +143 -23
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +2 -2
- package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +371 -0
- package/src/runtime/migrations/migration-transport.ts +46 -13
- package/src/runtime/migrations/migration-wizard.ts +2 -2
- package/src/runtime/migrations/origin-mode.ts +40 -0
- package/src/runtime/migrations/vbundle-builder.ts +133 -79
- package/src/runtime/migrations/vbundle-import-analyzer.ts +9 -7
- package/src/runtime/migrations/vbundle-importer.ts +7 -7
- package/src/runtime/migrations/vbundle-metadata-merge.ts +1 -1
- package/src/runtime/migrations/vbundle-streaming-importer.ts +3 -3
- package/src/runtime/migrations/vbundle-streaming-validator.ts +48 -26
- package/src/runtime/migrations/vbundle-validator.ts +214 -41
- package/src/runtime/pending-interactions.ts +13 -4
- package/src/runtime/routes/__tests__/acp-routes.test.ts +0 -1
- package/src/runtime/routes/__tests__/backup-routes.test.ts +28 -19
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +235 -0
- package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +58 -0
- package/src/runtime/routes/__tests__/migration-export-secrets-redacted.test.ts +54 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +19 -6
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +7 -7
- package/src/runtime/routes/acp-routes.test.ts +0 -3
- package/src/runtime/routes/acp-routes.ts +3 -7
- package/src/runtime/routes/app-management-routes.ts +18 -9
- package/src/runtime/routes/approval-routes.ts +55 -14
- package/src/runtime/routes/avatar-routes.ts +3 -5
- package/src/runtime/routes/browser-routes.ts +1 -15
- package/src/runtime/routes/channel-guardian-routes.ts +1 -5
- package/src/runtime/routes/channel-readiness-routes.ts +3 -7
- package/src/runtime/routes/channel-route-shared.ts +2 -28
- package/src/runtime/routes/client-routes.ts +45 -12
- package/src/runtime/routes/consolidation-routes.ts +115 -0
- package/src/runtime/routes/conversation-list-routes.ts +12 -29
- package/src/runtime/routes/conversation-management-routes.ts +14 -51
- package/src/runtime/routes/conversation-query-routes.ts +120 -8
- package/src/runtime/routes/conversation-routes.ts +44 -528
- package/src/runtime/routes/conversation-starter-routes.ts +19 -40
- package/src/runtime/routes/documents-routes.ts +53 -18
- package/src/runtime/routes/events-routes.ts +59 -91
- package/src/runtime/routes/filing-routes.ts +18 -1
- package/src/runtime/routes/guardian-action-routes.ts +4 -9
- package/src/runtime/routes/host-bash-routes.ts +3 -2
- package/src/runtime/routes/host-browser-routes.ts +9 -33
- package/src/runtime/routes/host-cu-routes.ts +6 -1
- package/src/runtime/routes/host-file-routes.ts +3 -2
- package/src/runtime/routes/host-transfer-routes.ts +11 -15
- package/src/runtime/routes/identity-routes.ts +78 -6
- package/src/runtime/routes/inbound-message-handler.ts +580 -137
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +2 -88
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +3 -0
- package/src/runtime/routes/index.ts +4 -0
- package/src/runtime/routes/integrations/slack/channel.ts +0 -24
- package/src/runtime/routes/llm-call-sites-routes.ts +22 -0
- package/src/runtime/routes/memory-v2-routes.ts +10 -15
- package/src/runtime/routes/migration-routes.ts +188 -31
- package/src/runtime/routes/playground/guard.ts +1 -1
- package/src/runtime/routes/playground/index.ts +0 -2
- package/src/runtime/routes/recording-routes.ts +4 -24
- package/src/runtime/routes/rename-conversation-routes.ts +2 -6
- package/src/runtime/routes/schedule-routes.ts +3 -6
- package/src/runtime/routes/secret-routes.ts +87 -18
- package/src/runtime/routes/settings-routes.ts +29 -28
- package/src/runtime/routes/skills-routes.ts +12 -31
- package/src/runtime/routes/suggest-trust-rule-routes.ts +32 -1
- package/src/runtime/routes/task-routes.ts +6 -6
- package/src/runtime/routes/trust-rules-routes.ts +3 -94
- package/src/runtime/routes/types.ts +4 -4
- package/src/runtime/routes/upgrade-broadcast-routes.ts +3 -10
- package/src/runtime/routes/usage-routes.ts +87 -10
- package/src/runtime/routes/user-routes.ts +17 -31
- package/src/runtime/routes/work-items-routes.ts +1 -4
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -2
- package/src/runtime/services/analyze-conversation.ts +7 -17
- package/src/runtime/services/conversation-serializer.ts +2 -4
- package/src/runtime/verification-outbound-actions.ts +1 -1
- package/src/runtime/verification-rate-limiter.ts +1 -1
- package/src/schedule/schedule-store.ts +0 -16
- package/src/security/secret-scanner.ts +14 -547
- package/src/security/secure-keys.ts +31 -11
- package/src/security/token-manager.ts +7 -3
- package/src/signals/cancel.ts +16 -25
- package/src/signals/conversation-undo.ts +2 -27
- package/src/signals/emit-event.ts +1 -2
- package/src/signals/user-message.ts +108 -22
- package/src/skills/catalog-install.ts +1 -0
- package/src/skills/clawhub.ts +2 -2
- package/src/skills/inline-command-runner.ts +1 -7
- package/src/subagent/manager.ts +67 -84
- package/src/tasks/task-store.ts +1 -28
- package/src/telemetry/types.ts +6 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +38 -15
- package/src/telemetry/usage-telemetry-reporter.ts +3 -5
- package/src/tools/acp/spawn.test.ts +1 -2
- package/src/tools/acp/steer.test.ts +1 -2
- package/src/tools/browser/__tests__/browser-status.test.ts +44 -127
- package/src/tools/browser/browser-execution.ts +31 -147
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +92 -68
- package/src/tools/browser/cdp-client/factory.ts +48 -76
- package/src/tools/browser/cdp-client/index.ts +1 -14
- package/src/tools/executor.ts +44 -31
- package/src/tools/host-filesystem/edit.ts +3 -2
- package/src/tools/host-filesystem/read.ts +3 -2
- package/src/tools/host-filesystem/transfer.test.ts +45 -42
- package/src/tools/host-filesystem/transfer.ts +4 -3
- package/src/tools/host-filesystem/write.ts +3 -2
- package/src/tools/host-terminal/host-shell.ts +4 -3
- package/src/tools/network/script-proxy/index.ts +1 -10
- package/src/tools/permission-checker.ts +66 -1
- package/src/tools/skills/sandbox-runner.ts +1 -6
- package/src/tools/skills/skill-tool-factory.ts +32 -0
- package/src/tools/terminal/safe-env.ts +1 -0
- package/src/tools/terminal/shell.ts +2 -78
- package/src/tools/types.ts +12 -39
- package/src/tts/__tests__/provider-catalog.test.ts +2 -2
- package/src/tts/provider-catalog.ts +1 -1
- package/src/usage/actors.ts +2 -1
- package/src/usage/attribution.ts +185 -0
- package/src/usage/pricing.ts +166 -0
- package/src/usage/types.ts +14 -0
- package/src/util/json.ts +13 -0
- package/src/util/logger.ts +3 -3
- package/src/util/pricing.ts +50 -3
- package/src/work-items/work-item-runner.ts +15 -42
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +4 -3
- package/src/workspace/migrations/052-seed-default-inference-profiles.ts +3 -3
- package/src/workspace/migrations/060-memory-v2-init.ts +2 -18
- package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +59 -0
- package/src/workspace/migrations/062-drop-memory-v2-edges-json.ts +27 -0
- package/src/workspace/migrations/063-release-notes-dynamic-model-context.ts +70 -0
- package/src/workspace/migrations/064-unwind-main-agent-opus-seed.ts +64 -0
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/workspace/provider-commit-message-generator.ts +3 -3
- package/src/__tests__/sandbox-diagnostics.test.ts +0 -138
- package/src/__tests__/sandbox-host-parity.test.ts +0 -1024
- package/src/__tests__/secret-detection-handler.test.ts +0 -67
- package/src/__tests__/secret-scanner-executor.test.ts +0 -450
- package/src/__tests__/tcc-sandbox-deny.test.ts +0 -198
- package/src/__tests__/terminal-sandbox.test.ts +0 -374
- package/src/__tests__/tool-notification-listener.test.ts +0 -65
- package/src/context/__tests__/microcompact.test.ts +0 -805
- package/src/context/microcompact.ts +0 -443
- package/src/daemon/handlers/slack-channel-oauth-install.ts +0 -197
- package/src/events/tool-notification-listener.ts +0 -17
- package/src/ipc/routes/__tests__/memory-v2-validate.test.ts +0 -219
- package/src/memory/v2/__tests__/edges.test.ts +0 -435
- package/src/memory/v2/edges.ts +0 -217
- package/src/prompts/__tests__/system-prompt-memory-v2.test.ts +0 -197
- package/src/runtime/__tests__/chrome-extension-registry.test.ts +0 -518
- package/src/runtime/__tests__/client-registry.test.ts +0 -271
- package/src/runtime/chrome-extension-registry.ts +0 -368
- package/src/runtime/client-registry.ts +0 -254
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +0 -329
- package/src/tools/secret-detection-handler.ts +0 -269
- package/src/tools/terminal/backends/native.ts +0 -327
- package/src/tools/terminal/backends/types.ts +0 -37
- package/src/tools/terminal/sandbox-diagnostics.ts +0 -87
- package/src/tools/terminal/sandbox.ts +0 -40
|
@@ -11,18 +11,14 @@
|
|
|
11
11
|
* no token refresh or recovery is attempted.
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import {
|
|
15
|
-
isTokenExpired,
|
|
16
|
-
oauthConnectionAccessTokenPath,
|
|
17
|
-
} from "@vellumai/credential-storage";
|
|
14
|
+
import { isTokenExpired } from "@vellumai/credential-storage";
|
|
18
15
|
|
|
19
|
-
import {
|
|
16
|
+
import { getConnectionAccessTokenResult } from "../oauth/credential-token-resolver.js";
|
|
20
17
|
import {
|
|
21
18
|
getProvider,
|
|
22
19
|
listActiveConnectionsByProvider,
|
|
23
20
|
listProviders,
|
|
24
21
|
} from "../oauth/oauth-store.js";
|
|
25
|
-
import { getSecureKeyAsync } from "../security/secure-keys.js";
|
|
26
22
|
import { getLogger } from "../util/logger.js";
|
|
27
23
|
|
|
28
24
|
const log = getLogger("credential-health");
|
|
@@ -40,6 +36,7 @@ export type CredentialHealthStatus =
|
|
|
40
36
|
| "expiring"
|
|
41
37
|
| "expired"
|
|
42
38
|
| "missing_token"
|
|
39
|
+
| "unreachable"
|
|
43
40
|
| "missing_scopes"
|
|
44
41
|
| "revoked"
|
|
45
42
|
| "ping_failed";
|
|
@@ -165,16 +162,23 @@ async function checkConnection(
|
|
|
165
162
|
missingScopes: [] as string[],
|
|
166
163
|
};
|
|
167
164
|
|
|
168
|
-
// 1. Check token presence. Manual-token
|
|
169
|
-
// telegram) store their primary token
|
|
170
|
-
// rather than oauth_connection/<id>/access_token
|
|
171
|
-
//
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
165
|
+
// 1. Check token presence via the centralized resolver. Manual-token
|
|
166
|
+
// providers (e.g. slack_channel, telegram) store their primary token at
|
|
167
|
+
// credential/<provider>/<field> rather than oauth_connection/<id>/access_token;
|
|
168
|
+
// the resolver handles the mapping automatically.
|
|
169
|
+
const tokenResult = await getConnectionAccessTokenResult({
|
|
170
|
+
provider,
|
|
171
|
+
connectionId,
|
|
172
|
+
});
|
|
173
|
+
if (!tokenResult.value) {
|
|
174
|
+
if (tokenResult.unreachable) {
|
|
175
|
+
return {
|
|
176
|
+
...base,
|
|
177
|
+
status: "unreachable",
|
|
178
|
+
details: `Credential backend is temporarily unreachable for ${provider}. Token status unknown.`,
|
|
179
|
+
canAutoRecover: true,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
178
182
|
return {
|
|
179
183
|
...base,
|
|
180
184
|
status: "missing_token",
|
|
@@ -182,6 +186,7 @@ async function checkConnection(
|
|
|
182
186
|
canAutoRecover: false,
|
|
183
187
|
};
|
|
184
188
|
}
|
|
189
|
+
const token = tokenResult.value;
|
|
185
190
|
|
|
186
191
|
// 2. Check token expiry
|
|
187
192
|
if (isTokenExpired(expiresAt)) {
|
|
@@ -45,10 +45,9 @@ mock.module("../../runtime/assistant-event.js", () => ({
|
|
|
45
45
|
// Pass-through so `focus` / `conversationId` can be asserted directly
|
|
46
46
|
// on the captured event's `message` payload.
|
|
47
47
|
buildAssistantEvent: (
|
|
48
|
-
assistantId: string,
|
|
49
48
|
message: unknown,
|
|
50
49
|
conversationId?: string,
|
|
51
|
-
) => ({
|
|
50
|
+
) => ({ message, conversationId }),
|
|
52
51
|
}));
|
|
53
52
|
|
|
54
53
|
// Stub DB helpers so the real `launchConversation` can run without a DB.
|
|
@@ -76,12 +75,55 @@ mock.module("../../memory/conversation-crud.js", () => ({
|
|
|
76
75
|
},
|
|
77
76
|
}));
|
|
78
77
|
|
|
78
|
+
// Stub conversation-store so the real `launchConversation` can hydrate
|
|
79
|
+
// a fake Conversation without touching the real map.
|
|
80
|
+
let trustContextOnConversation: unknown | null = null;
|
|
81
|
+
const fakeConversation = {
|
|
82
|
+
setTrustContext: (c: unknown) => {
|
|
83
|
+
trustContextOnConversation = c;
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
const getOrCreateConversationCalls: string[] = [];
|
|
87
|
+
const realConvStore = await import("../conversation-store.js");
|
|
88
|
+
mock.module("../conversation-store.js", () => ({
|
|
89
|
+
...realConvStore,
|
|
90
|
+
getOrCreateConversation: async (id: string) => {
|
|
91
|
+
getOrCreateConversationCalls.push(id);
|
|
92
|
+
return fakeConversation as never;
|
|
93
|
+
},
|
|
94
|
+
}));
|
|
95
|
+
|
|
96
|
+
// Stub processMessageInBackground so the seed turn is controllable.
|
|
97
|
+
const processMessageCalls: Array<{
|
|
98
|
+
conversationId: string;
|
|
99
|
+
content: string;
|
|
100
|
+
}> = [];
|
|
101
|
+
let resolveProcess = () => {};
|
|
102
|
+
let rejectProcess: (err: Error) => void = () => {};
|
|
103
|
+
let markProcessStarted = () => {};
|
|
104
|
+
let processStartedPromise = new Promise<void>((resolve) => {
|
|
105
|
+
markProcessStarted = resolve;
|
|
106
|
+
});
|
|
107
|
+
const realProcessMessage = await import("../process-message.js");
|
|
108
|
+
mock.module("../process-message.js", () => ({
|
|
109
|
+
...realProcessMessage,
|
|
110
|
+
processMessageInBackground: (
|
|
111
|
+
conversationId: string,
|
|
112
|
+
content: string,
|
|
113
|
+
) => {
|
|
114
|
+
processMessageCalls.push({ conversationId, content });
|
|
115
|
+
markProcessStarted();
|
|
116
|
+
return new Promise((resolve, reject) => {
|
|
117
|
+
resolveProcess = () => resolve({ messageId: "msg-1" });
|
|
118
|
+
rejectProcess = (err) => reject(err);
|
|
119
|
+
});
|
|
120
|
+
},
|
|
121
|
+
}));
|
|
122
|
+
|
|
79
123
|
// Dynamic imports after mock.module calls so the stubs take effect
|
|
80
124
|
// before the modules under test are loaded.
|
|
81
125
|
const { createSurfaceMutex, handleSurfaceAction } =
|
|
82
126
|
await import("../conversation-surfaces.js");
|
|
83
|
-
const { registerLaunchConversationDeps, resetLaunchConversationDeps } =
|
|
84
|
-
await import("../conversation-launch.js");
|
|
85
127
|
type SurfaceConversationContext =
|
|
86
128
|
import("../conversation-surfaces.js").SurfaceConversationContext;
|
|
87
129
|
type TrustContext = import("../trust-context.js").TrustContext;
|
|
@@ -89,60 +131,17 @@ type ServerMessage = import("../message-protocol.js").ServerMessage;
|
|
|
89
131
|
type SurfaceData = import("../message-protocol.js").SurfaceData;
|
|
90
132
|
type SurfaceType = import("../message-protocol.js").SurfaceType;
|
|
91
133
|
|
|
92
|
-
// ──
|
|
134
|
+
// ── Harness reset helper ───────────────────────────────────────────
|
|
93
135
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
resolveProcess
|
|
99
|
-
rejectProcess
|
|
100
|
-
|
|
101
|
-
processStarted: Promise<void>;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
function setupLaunchDeps(): DepsHarness {
|
|
105
|
-
const getOrCreateCalls: Array<string> = [];
|
|
106
|
-
const processCalls: Array<{ conversationId: string; content: string }> = [];
|
|
107
|
-
let trustContextOnConversation: unknown | null = null;
|
|
108
|
-
let resolveProcess = () => {};
|
|
109
|
-
let rejectProcess: (err: Error) => void = () => {};
|
|
110
|
-
let markProcessStarted = () => {};
|
|
111
|
-
const processStarted = new Promise<void>((resolve) => {
|
|
136
|
+
function resetProcessHarness(): void {
|
|
137
|
+
processMessageCalls.length = 0;
|
|
138
|
+
getOrCreateConversationCalls.length = 0;
|
|
139
|
+
trustContextOnConversation = null;
|
|
140
|
+
resolveProcess = () => {};
|
|
141
|
+
rejectProcess = () => {};
|
|
142
|
+
processStartedPromise = new Promise<void>((resolve) => {
|
|
112
143
|
markProcessStarted = resolve;
|
|
113
144
|
});
|
|
114
|
-
|
|
115
|
-
const fakeConversation = {
|
|
116
|
-
setTrustContext: (c: unknown) => {
|
|
117
|
-
trustContextOnConversation = c;
|
|
118
|
-
},
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
registerLaunchConversationDeps({
|
|
122
|
-
getOrCreateConversation: async (id: string) => {
|
|
123
|
-
getOrCreateCalls.push(id);
|
|
124
|
-
return fakeConversation as never;
|
|
125
|
-
},
|
|
126
|
-
persistAndProcessMessage: (conversationId: string, content: string) => {
|
|
127
|
-
processCalls.push({ conversationId, content });
|
|
128
|
-
markProcessStarted();
|
|
129
|
-
return new Promise((resolve, reject) => {
|
|
130
|
-
resolveProcess = () => resolve({ messageId: "msg-1" });
|
|
131
|
-
rejectProcess = (err) => reject(err);
|
|
132
|
-
});
|
|
133
|
-
},
|
|
134
|
-
publishAssistantEvent: () => {},
|
|
135
|
-
getAssistantId: () => "assistant-test-id",
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
return {
|
|
139
|
-
getOrCreateCalls,
|
|
140
|
-
processCalls,
|
|
141
|
-
lastTrustContext: () => trustContextOnConversation,
|
|
142
|
-
resolveProcess: () => resolveProcess(),
|
|
143
|
-
rejectProcess: (err: Error) => rejectProcess(err),
|
|
144
|
-
processStarted,
|
|
145
|
-
};
|
|
146
145
|
}
|
|
147
146
|
|
|
148
147
|
// ── Surface-context harness ────────────────────────────────────────
|
|
@@ -216,7 +215,6 @@ function registerCardSurface(
|
|
|
216
215
|
// Helper: filter captured publish calls down to `open_conversation`
|
|
217
216
|
// events. Typed so assertions can reach the inner `message` payload.
|
|
218
217
|
function openConversationEvents(): Array<{
|
|
219
|
-
assistantId: string;
|
|
220
218
|
conversationId?: string;
|
|
221
219
|
message: {
|
|
222
220
|
type: "open_conversation";
|
|
@@ -234,7 +232,6 @@ function openConversationEvents(): Array<{
|
|
|
234
232
|
.map(
|
|
235
233
|
(e) =>
|
|
236
234
|
e as unknown as {
|
|
237
|
-
assistantId: string;
|
|
238
235
|
conversationId?: string;
|
|
239
236
|
message: {
|
|
240
237
|
type: "open_conversation";
|
|
@@ -254,16 +251,12 @@ describe("handleSurfaceAction — launch_conversation dispatch", () => {
|
|
|
254
251
|
publishCalls.length = 0;
|
|
255
252
|
updateTitleCalls.length = 0;
|
|
256
253
|
nextKeyStoreResult = { conversationId: "conv-new" };
|
|
257
|
-
|
|
258
|
-
// `setupLaunchDeps()` cannot accidentally piggy-back on deps left
|
|
259
|
-
// registered by a previous test. Each test that exercises the launch
|
|
260
|
-
// helper must call `setupLaunchDeps()` explicitly.
|
|
261
|
-
resetLaunchConversationDeps();
|
|
254
|
+
resetProcessHarness();
|
|
262
255
|
});
|
|
263
256
|
|
|
264
257
|
test("launches new conversation with inherited trust context and no chat message", async () => {
|
|
265
258
|
nextKeyStoreResult = { conversationId: "conv-launched-1" };
|
|
266
|
-
|
|
259
|
+
|
|
267
260
|
const originTrustContext: TrustContext = {
|
|
268
261
|
sourceChannel: "vellum",
|
|
269
262
|
trustClass: "guardian",
|
|
@@ -295,14 +288,14 @@ describe("handleSurfaceAction — launch_conversation dispatch", () => {
|
|
|
295
288
|
expect(openEvents[0].message.title).toBe("New Thread");
|
|
296
289
|
|
|
297
290
|
// 3. The spawned conversation inherited the origin's trust context.
|
|
298
|
-
expect(
|
|
291
|
+
expect(trustContextOnConversation).toEqual(originTrustContext);
|
|
299
292
|
|
|
300
293
|
// 4. Seed turn was kicked off fire-and-forget — resolve it to clean
|
|
301
294
|
// up the pending promise the harness stubbed.
|
|
302
|
-
await
|
|
303
|
-
expect(
|
|
304
|
-
expect(
|
|
305
|
-
|
|
295
|
+
await processStartedPromise;
|
|
296
|
+
expect(processMessageCalls).toHaveLength(1);
|
|
297
|
+
expect(processMessageCalls[0].content).toBe("S");
|
|
298
|
+
resolveProcess();
|
|
306
299
|
|
|
307
300
|
// 5. No chat message side effect on the origin conversation — neither
|
|
308
301
|
// the LLM pipeline nor the `[User action on app: ...]` text echo.
|
|
@@ -358,7 +351,7 @@ describe("handleSurfaceAction — launch_conversation dispatch", () => {
|
|
|
358
351
|
|
|
359
352
|
test("omits originTrustContext when origin conversation has none", async () => {
|
|
360
353
|
nextKeyStoreResult = { conversationId: "conv-launched-3" };
|
|
361
|
-
|
|
354
|
+
|
|
362
355
|
// No `trustContext` on the origin context — simulating the
|
|
363
356
|
// no-inherited-guardian path.
|
|
364
357
|
const ctx = makeContext();
|
|
@@ -376,20 +369,20 @@ describe("handleSurfaceAction — launch_conversation dispatch", () => {
|
|
|
376
369
|
});
|
|
377
370
|
|
|
378
371
|
// Trust context was never applied to the spawned conversation.
|
|
379
|
-
expect(
|
|
372
|
+
expect(trustContextOnConversation).toBeNull();
|
|
380
373
|
|
|
381
374
|
// Still exactly one open_conversation event with focus: false.
|
|
382
375
|
const openEvents = openConversationEvents();
|
|
383
376
|
expect(openEvents).toHaveLength(1);
|
|
384
377
|
expect(openEvents[0].message.focus).toBe(false);
|
|
385
378
|
|
|
386
|
-
await
|
|
387
|
-
|
|
379
|
+
await processStartedPromise;
|
|
380
|
+
resolveProcess();
|
|
388
381
|
});
|
|
389
382
|
|
|
390
383
|
test("handler returns before the seed turn resolves (fire-and-forget)", async () => {
|
|
391
384
|
nextKeyStoreResult = { conversationId: "conv-nonblocking" };
|
|
392
|
-
|
|
385
|
+
|
|
393
386
|
const ctx = makeContext();
|
|
394
387
|
registerCardSurface(ctx, "surface-4");
|
|
395
388
|
|
|
@@ -413,14 +406,14 @@ describe("handleSurfaceAction — launch_conversation dispatch", () => {
|
|
|
413
406
|
// Seed turn is in-flight but not yet resolved. Prove the helper
|
|
414
407
|
// actually invoked it (so we know fire-and-forget is wired), then
|
|
415
408
|
// resolve it to clean up.
|
|
416
|
-
await
|
|
417
|
-
expect(
|
|
418
|
-
|
|
409
|
+
await processStartedPromise;
|
|
410
|
+
expect(processMessageCalls).toHaveLength(1);
|
|
411
|
+
resolveProcess();
|
|
419
412
|
});
|
|
420
413
|
|
|
421
414
|
test("seed turn rejection is swallowed by the helper's .catch()", async () => {
|
|
422
415
|
nextKeyStoreResult = { conversationId: "conv-seed-fails" };
|
|
423
|
-
|
|
416
|
+
|
|
424
417
|
const ctx = makeContext();
|
|
425
418
|
registerCardSurface(ctx, "surface-5");
|
|
426
419
|
|
|
@@ -438,8 +431,8 @@ describe("handleSurfaceAction — launch_conversation dispatch", () => {
|
|
|
438
431
|
// Reject the pending seed turn — the helper's `.catch()` handler
|
|
439
432
|
// must swallow it. If it didn't, Bun would surface the unhandled
|
|
440
433
|
// rejection at test-end and this test would fail.
|
|
441
|
-
await
|
|
442
|
-
|
|
434
|
+
await processStartedPromise;
|
|
435
|
+
rejectProcess(new Error("seed-turn-failed"));
|
|
443
436
|
// Give the microtask queue a tick so the `.catch()` runs before
|
|
444
437
|
// the test completes.
|
|
445
438
|
await Promise.resolve();
|
|
@@ -456,7 +449,7 @@ describe("handleSurfaceAction — launch_conversation dispatch", () => {
|
|
|
456
449
|
// message and triggering a full LLM round-trip on every click. The plan
|
|
457
450
|
// claimed to eliminate that round-trip; this test enforces it.
|
|
458
451
|
nextKeyStoreResult = { conversationId: "conv-pending-set" };
|
|
459
|
-
|
|
452
|
+
|
|
460
453
|
const ctx = makeContext();
|
|
461
454
|
registerCardSurface(ctx, "surface-pending");
|
|
462
455
|
// Simulate `ui_show` having stamped a pending entry for this surface
|
|
@@ -491,7 +484,7 @@ describe("handleSurfaceAction — launch_conversation dispatch", () => {
|
|
|
491
484
|
// persistent card aren't blocked behind a stale "owes-an-answer" flag.
|
|
492
485
|
expect(ctx.pendingSurfaceActions.has("surface-pending")).toBe(false);
|
|
493
486
|
|
|
494
|
-
await
|
|
495
|
-
|
|
487
|
+
await processStartedPromise;
|
|
488
|
+
resolveProcess();
|
|
496
489
|
});
|
|
497
490
|
});
|
|
@@ -110,13 +110,8 @@ mock.module("../../runtime/assistant-event-hub.js", () => ({
|
|
|
110
110
|
}));
|
|
111
111
|
|
|
112
112
|
mock.module("../../runtime/assistant-event.js", () => ({
|
|
113
|
-
buildAssistantEvent: (
|
|
114
|
-
assistantId: string,
|
|
115
|
-
message: unknown,
|
|
116
|
-
conversationId?: string,
|
|
117
|
-
) => ({
|
|
113
|
+
buildAssistantEvent: (message: unknown, conversationId?: string) => ({
|
|
118
114
|
id: "evt-1",
|
|
119
|
-
assistantId,
|
|
120
115
|
conversationId,
|
|
121
116
|
emittedAt: "2024-01-01T00:00:00.000Z",
|
|
122
117
|
message,
|
|
@@ -195,7 +190,6 @@ describe("createDaemonSkillHost", () => {
|
|
|
195
190
|
|
|
196
191
|
test("identity normalizes a null assistant name to undefined", () => {
|
|
197
192
|
expect(host.identity.getAssistantName()).toBeUndefined();
|
|
198
|
-
expect(host.identity.internalAssistantId).toBe("self");
|
|
199
193
|
});
|
|
200
194
|
|
|
201
195
|
test("platform methods return the stubbed values", () => {
|
|
@@ -243,11 +237,10 @@ describe("createDaemonSkillHost", () => {
|
|
|
243
237
|
|
|
244
238
|
test("events.publish, subscribe, and buildEvent plumb through the hub", async () => {
|
|
245
239
|
const evt = host.events.buildEvent({ type: "ping" }, "c1");
|
|
246
|
-
expect(evt.assistantId).toBe("self");
|
|
247
240
|
expect(evt.conversationId).toBe("c1");
|
|
248
241
|
await host.events.publish(evt);
|
|
249
242
|
expect(publishSpy).toHaveBeenCalled();
|
|
250
|
-
const sub = host.events.subscribe({
|
|
243
|
+
const sub = host.events.subscribe({}, () => undefined);
|
|
251
244
|
expect(sub.active).toBe(true);
|
|
252
245
|
expect(subscribeSpy).toHaveBeenCalled();
|
|
253
246
|
});
|
|
@@ -1,32 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Connection policy helpers for daemon autostart
|
|
3
|
-
*
|
|
4
|
-
* Token authentication is always required.
|
|
5
|
-
* To explicitly disable auth (e.g. development/testing scenarios),
|
|
6
|
-
* set VELLUM_DAEMON_NOAUTH=1 on both the daemon and the client.
|
|
7
|
-
* This is an intentional opt-in to an unsafe mode — never enable it
|
|
8
|
-
* on connections accessible to untrusted users.
|
|
2
|
+
* Connection policy helpers for daemon autostart behavior.
|
|
9
3
|
*/
|
|
10
4
|
|
|
11
|
-
/**
|
|
12
|
-
* True when the user has explicitly opted into unauthenticated connections
|
|
13
|
-
* via VELLUM_DAEMON_NOAUTH=1.
|
|
14
|
-
*
|
|
15
|
-
* Requires VELLUM_UNSAFE_AUTH_BYPASS=1 as a safety gate to prevent
|
|
16
|
-
* accidental production use.
|
|
17
|
-
*/
|
|
18
|
-
export function hasNoAuthOverride(
|
|
19
|
-
env: Record<string, string | undefined> = process.env,
|
|
20
|
-
): boolean {
|
|
21
|
-
const value = env.VELLUM_DAEMON_NOAUTH?.trim();
|
|
22
|
-
if (value !== "1" && value !== "true") return false;
|
|
23
|
-
|
|
24
|
-
const safetyGate = env.VELLUM_UNSAFE_AUTH_BYPASS?.trim();
|
|
25
|
-
if (safetyGate !== "1") return false;
|
|
26
|
-
|
|
27
|
-
return true;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
5
|
export function shouldAutoStartDaemon(
|
|
31
6
|
env: Record<string, string | undefined> = process.env,
|
|
32
7
|
): boolean {
|
|
@@ -26,6 +26,7 @@ import {
|
|
|
26
26
|
recordRequestLog,
|
|
27
27
|
} from "../memory/llm-request-log-store.js";
|
|
28
28
|
import { backfillMemoryRecallLogMessageId } from "../memory/memory-recall-log-store.js";
|
|
29
|
+
import { backfillMemoryV2ActivationMessageId } from "../memory/memory-v2-activation-log-store.js";
|
|
29
30
|
import { getThreadTs } from "../memory/slack-thread-store.js";
|
|
30
31
|
import {
|
|
31
32
|
type SlackMessageMetadata,
|
|
@@ -158,7 +159,15 @@ export interface EventHandlerState {
|
|
|
158
159
|
/** Stores risk metadata keyed by tool_use_id (populated in handleToolResult). */
|
|
159
160
|
readonly toolRiskOutcomes: Map<
|
|
160
161
|
string,
|
|
161
|
-
{
|
|
162
|
+
{
|
|
163
|
+
riskLevel: string;
|
|
164
|
+
riskReason?: string;
|
|
165
|
+
autoApproved: boolean;
|
|
166
|
+
matchedTrustRuleId?: string;
|
|
167
|
+
approvalMode?: string;
|
|
168
|
+
approvalReason?: string;
|
|
169
|
+
riskThreshold?: string;
|
|
170
|
+
}
|
|
162
171
|
>;
|
|
163
172
|
/** tool_use_ids emitted in the current turn (populated in handleToolUse, cleared after annotation). */
|
|
164
173
|
currentTurnToolUseIds: string[];
|
|
@@ -224,20 +233,31 @@ export function createEventHandlerState(): EventHandlerState {
|
|
|
224
233
|
|
|
225
234
|
// ── Shared Helper ────────────────────────────────────────────────────
|
|
226
235
|
|
|
236
|
+
// providerNameOverride should be supplied when the caller already knows the
|
|
237
|
+
// resolved provider name (e.g. handleUsage, which has event.actualProvider).
|
|
238
|
+
// When called during streaming (text_delta / thinking_delta) the override is
|
|
239
|
+
// omitted and provider.name is used — the CallSiteRoutingProvider getter
|
|
240
|
+
// returns the active transport name during sendMessage, so they agree.
|
|
241
|
+
// Passing the override from handleUsage guarantees started/finished never
|
|
242
|
+
// disagree even for tool-call-only responses where text_delta never fires
|
|
243
|
+
// (and therefore the started event would otherwise fall back here *after*
|
|
244
|
+
// the AsyncLocalStorage context in CallSiteRoutingProvider has already exited).
|
|
227
245
|
function emitLlmCallStartedIfNeeded(
|
|
228
246
|
state: EventHandlerState,
|
|
229
247
|
deps: EventHandlerDeps,
|
|
248
|
+
providerNameOverride?: string,
|
|
230
249
|
): void {
|
|
231
250
|
if (state.llmCallStartedEmitted) return;
|
|
232
251
|
state.llmCallStartedEmitted = true;
|
|
252
|
+
const providerName = providerNameOverride ?? deps.ctx.provider.name;
|
|
233
253
|
deps.ctx.traceEmitter.emit(
|
|
234
254
|
"llm_call_started",
|
|
235
|
-
`LLM call to ${
|
|
255
|
+
`LLM call to ${providerName}`,
|
|
236
256
|
{
|
|
237
257
|
requestId: deps.reqId,
|
|
238
258
|
status: "info",
|
|
239
259
|
attributes: {
|
|
240
|
-
provider:
|
|
260
|
+
provider: providerName,
|
|
241
261
|
model: state.model || "unknown",
|
|
242
262
|
},
|
|
243
263
|
},
|
|
@@ -290,6 +310,7 @@ function handleTextDelta(
|
|
|
290
310
|
"first_text_delta",
|
|
291
311
|
"assistant_turn",
|
|
292
312
|
deps.reqId,
|
|
313
|
+
"Thinking",
|
|
293
314
|
);
|
|
294
315
|
}
|
|
295
316
|
deps.onEvent({
|
|
@@ -522,6 +543,10 @@ export function handleToolResult(
|
|
|
522
543
|
riskLevel: event.riskLevel,
|
|
523
544
|
riskReason: event.riskReason,
|
|
524
545
|
autoApproved: !state.toolConfirmationOutcomes.has(event.toolUseId),
|
|
546
|
+
matchedTrustRuleId: event.matchedTrustRuleId,
|
|
547
|
+
approvalMode: event.approvalMode,
|
|
548
|
+
approvalReason: event.approvalReason,
|
|
549
|
+
riskThreshold: event.riskThreshold,
|
|
525
550
|
});
|
|
526
551
|
}
|
|
527
552
|
|
|
@@ -598,9 +623,13 @@ export function handleToolResult(
|
|
|
598
623
|
toolUseId: event.toolUseId,
|
|
599
624
|
riskLevel: event.riskLevel,
|
|
600
625
|
riskReason: event.riskReason,
|
|
626
|
+
matchedTrustRuleId: event.matchedTrustRuleId,
|
|
601
627
|
isContainerized: event.isContainerized,
|
|
602
628
|
riskScopeOptions: event.riskScopeOptions,
|
|
603
629
|
riskDirectoryScopeOptions: event.riskDirectoryScopeOptions,
|
|
630
|
+
approvalMode: event.approvalMode,
|
|
631
|
+
approvalReason: event.approvalReason,
|
|
632
|
+
riskThreshold: event.riskThreshold,
|
|
604
633
|
});
|
|
605
634
|
}
|
|
606
635
|
|
|
@@ -653,6 +682,11 @@ function annotatePersistedAssistantMessage(
|
|
|
653
682
|
rec._riskLevel = risk.riskLevel;
|
|
654
683
|
if (risk.riskReason) rec._riskReason = risk.riskReason;
|
|
655
684
|
rec._autoApproved = risk.autoApproved;
|
|
685
|
+
if (risk.matchedTrustRuleId)
|
|
686
|
+
rec._matchedTrustRuleId = risk.matchedTrustRuleId;
|
|
687
|
+
if (risk.approvalMode) rec._approvalMode = risk.approvalMode;
|
|
688
|
+
if (risk.approvalReason) rec._approvalReason = risk.approvalReason;
|
|
689
|
+
if (risk.riskThreshold) rec._riskThreshold = risk.riskThreshold;
|
|
656
690
|
modified = true;
|
|
657
691
|
}
|
|
658
692
|
}
|
|
@@ -937,6 +971,18 @@ export async function handleMessageComplete(
|
|
|
937
971
|
);
|
|
938
972
|
}
|
|
939
973
|
|
|
974
|
+
try {
|
|
975
|
+
backfillMemoryV2ActivationMessageId(
|
|
976
|
+
deps.ctx.conversationId,
|
|
977
|
+
assistantMsg.id,
|
|
978
|
+
);
|
|
979
|
+
} catch (err) {
|
|
980
|
+
deps.rlog.warn(
|
|
981
|
+
{ err },
|
|
982
|
+
"Failed to backfill memory v2 activation log messageId (non-fatal)",
|
|
983
|
+
);
|
|
984
|
+
}
|
|
985
|
+
|
|
940
986
|
deps.ctx.currentTurnSurfaces = [];
|
|
941
987
|
|
|
942
988
|
// Emit trace event
|
|
@@ -1018,7 +1064,9 @@ function handleUsage(
|
|
|
1018
1064
|
}
|
|
1019
1065
|
}
|
|
1020
1066
|
|
|
1021
|
-
|
|
1067
|
+
// Pass providerName so that if text_delta never fired (tool-call-only
|
|
1068
|
+
// responses), the started event uses the same resolved name as finished.
|
|
1069
|
+
emitLlmCallStartedIfNeeded(state, deps, providerName);
|
|
1022
1070
|
|
|
1023
1071
|
deps.ctx.traceEmitter.emit(
|
|
1024
1072
|
"llm_call_finished",
|
|
@@ -1096,6 +1144,7 @@ export async function dispatchAgentEvent(
|
|
|
1096
1144
|
"tool_result_received",
|
|
1097
1145
|
"assistant_turn",
|
|
1098
1146
|
deps.reqId,
|
|
1147
|
+
"Thinking",
|
|
1099
1148
|
);
|
|
1100
1149
|
|
|
1101
1150
|
// Format web search results into a human-readable string for the client.
|