@vellumai/assistant 0.4.44 → 0.4.45
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/.prettierignore +4 -0
- package/ARCHITECTURE.md +34 -31
- package/README.md +4 -4
- package/bun.lock +10 -35
- package/docs/architecture/integrations.md +102 -197
- package/docs/architecture/keychain-broker.md +1 -1
- package/docs/architecture/memory.md +2 -2
- package/docs/architecture/scheduling.md +1 -1
- package/docs/architecture/security.md +11 -11
- package/docs/error-handling.md +1 -1
- package/docs/trusted-contact-access.md +3 -3
- package/drizzle/meta/0000_snapshot.json +34 -100
- package/drizzle/meta/_journal.json +1 -1
- package/drizzle.config.ts +4 -4
- package/package.json +3 -2
- package/scripts/capture-x-graphql.ts +237 -141
- package/scripts/generate-bundled-tool-registry.ts +223 -0
- package/src/__tests__/access-request-decision.test.ts +0 -1
- package/src/__tests__/actor-token-service.test.ts +23 -24
- package/src/__tests__/agent-loop.test.ts +0 -131
- package/src/__tests__/always-loaded-tools-guard.test.ts +71 -0
- package/src/__tests__/amazon-cdp-integration.test.ts +11 -9
- package/src/__tests__/approval-primitive.test.ts +0 -1
- package/src/__tests__/approval-routes-http.test.ts +11 -1
- package/src/__tests__/asset-materialize-tool.test.ts +0 -1
- package/src/__tests__/asset-search-tool.test.ts +0 -1
- package/src/__tests__/assistant-attachment-directive.test.ts +1 -1
- package/src/__tests__/assistant-events-sse-hardening.test.ts +0 -1
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +0 -2
- package/src/__tests__/assistant-feature-flags-integration.test.ts +70 -18
- package/src/__tests__/assistant-id-boundary-guard.test.ts +6 -6
- package/src/__tests__/attachments-store.test.ts +0 -1
- package/src/__tests__/avatar-e2e.test.ts +74 -115
- package/src/__tests__/avatar-router.test.ts +25 -62
- package/src/__tests__/browser-manager.test.ts +24 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +4 -3
- package/src/__tests__/browser-skill-endstate.test.ts +8 -11
- package/src/__tests__/btw-routes.test.ts +326 -0
- package/src/__tests__/bundled-skill-retrieval-guard.test.ts +23 -9
- package/src/__tests__/call-controller.test.ts +0 -1
- package/src/__tests__/call-conversation-messages.test.ts +0 -1
- package/src/__tests__/call-domain.test.ts +0 -1
- package/src/__tests__/call-pointer-messages.test.ts +0 -1
- package/src/__tests__/call-recovery.test.ts +0 -1
- package/src/__tests__/call-routes-http.test.ts +0 -1
- package/src/__tests__/call-store.test.ts +0 -1
- package/src/__tests__/canonical-guardian-store.test.ts +0 -1
- package/src/__tests__/channel-approval-routes.test.ts +1 -1
- package/src/__tests__/channel-approvals.test.ts +1 -1
- package/src/__tests__/channel-delivery-store.test.ts +0 -1
- package/src/__tests__/channel-guardian.test.ts +5 -7
- package/src/__tests__/channel-retry-sweep.test.ts +0 -1
- package/src/__tests__/checker.test.ts +4 -11
- package/src/__tests__/compaction.benchmark.test.ts +16 -14
- package/src/__tests__/computer-use-session-lifecycle.test.ts +10 -11
- package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
- package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +2 -5
- package/src/__tests__/computer-use-tools.test.ts +35 -31
- package/src/__tests__/config-schema.test.ts +11 -15
- package/src/__tests__/config-watcher.test.ts +0 -1
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/conflict-store.test.ts +0 -1
- package/src/__tests__/connection-policy.test.ts +4 -7
- package/src/__tests__/contacts-tools.test.ts +0 -1
- package/src/__tests__/context-memory-e2e.test.ts +2 -4
- package/src/__tests__/context-overflow-reducer.test.ts +2 -4
- package/src/__tests__/context-window-manager.test.ts +147 -60
- package/src/__tests__/contradiction-checker.test.ts +0 -1
- package/src/__tests__/conversation-attention-store.test.ts +0 -1
- package/src/__tests__/conversation-attention-telegram.test.ts +1 -1
- package/src/__tests__/conversation-pairing.test.ts +2 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +25 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +381 -0
- package/src/__tests__/conversation-store.test.ts +0 -1
- package/src/__tests__/conversation-unread-route.test.ts +1 -2
- package/src/__tests__/credential-security-invariants.test.ts +7 -8
- package/src/__tests__/cross-provider-web-search.test.ts +353 -0
- package/src/__tests__/daemon-assistant-events.test.ts +6 -7
- package/src/__tests__/db-schedule-syntax-migration.test.ts +15 -3
- package/src/__tests__/delete-managed-skill-tool.test.ts +5 -9
- package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -1
- package/src/__tests__/diagnostics-export.test.ts +189 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
- package/src/__tests__/entity-extractor.test.ts +0 -1
- package/src/__tests__/entity-search.test.ts +0 -1
- package/src/__tests__/ephemeral-permissions.test.ts +2 -4
- package/src/__tests__/file-read-tool.test.ts +86 -0
- package/src/__tests__/followup-tools.test.ts +0 -1
- package/src/__tests__/frontmatter.test.ts +77 -34
- package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
- package/src/__tests__/gateway-only-guard.test.ts +1 -1
- package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -1
- package/src/__tests__/guardian-action-followup-executor.test.ts +0 -1
- package/src/__tests__/guardian-action-followup-store.test.ts +0 -1
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
- package/src/__tests__/guardian-action-late-reply.test.ts +0 -1
- package/src/__tests__/guardian-action-store.test.ts +0 -1
- package/src/__tests__/guardian-action-sweep.test.ts +0 -1
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -2
- package/src/__tests__/guardian-grant-minting.test.ts +1 -1
- package/src/__tests__/guardian-outbound-http.test.ts +0 -1
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +1 -1
- package/src/__tests__/guardian-routing-state.test.ts +0 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
- package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +3 -5
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +28 -426
- package/src/__tests__/host-bash-proxy.test.ts +335 -0
- package/src/__tests__/host-file-proxy.test.ts +374 -0
- package/src/__tests__/host-shell-tool.test.ts +147 -1
- package/src/__tests__/http-user-message-parity.test.ts +361 -0
- package/src/__tests__/inbound-invite-redemption.test.ts +0 -1
- package/src/__tests__/integration-status.test.ts +3 -8
- package/src/__tests__/intent-routing.test.ts +7 -46
- package/src/__tests__/invite-redemption-service.test.ts +0 -1
- package/src/__tests__/invite-routes-http.test.ts +0 -1
- package/src/__tests__/llm-usage-store.test.ts +0 -1
- package/src/__tests__/managed-avatar-client.test.ts +101 -55
- package/src/__tests__/managed-skill-lifecycle.test.ts +9 -18
- package/src/__tests__/managed-store.test.ts +94 -21
- package/src/__tests__/media-reuse-story.e2e.test.ts +0 -1
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +2 -4
- package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -1
- package/src/__tests__/memory-recall-quality.test.ts +0 -1
- package/src/__tests__/memory-regressions.experimental.test.ts +0 -1
- package/src/__tests__/memory-regressions.test.ts +0 -1
- package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -1
- package/src/__tests__/memory-upsert-concurrency.test.ts +0 -1
- package/src/__tests__/messaging-send-tool.test.ts +35 -0
- package/src/__tests__/messaging-skill-split.test.ts +138 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -1
- package/src/__tests__/migration-export-http.test.ts +2 -3
- package/src/__tests__/migration-import-commit-http.test.ts +1 -2
- package/src/__tests__/migration-import-preflight-http.test.ts +1 -2
- package/src/__tests__/migration-validate-http.test.ts +1 -2
- package/src/__tests__/native-web-search.test.ts +475 -0
- package/src/__tests__/navigate-settings-tab.test.ts +84 -0
- package/src/__tests__/non-member-access-request.test.ts +0 -1
- package/src/__tests__/notification-broadcaster.test.ts +15 -15
- package/src/__tests__/notification-decision-strategy.test.ts +6 -6
- package/src/__tests__/notification-deep-link.test.ts +7 -7
- package/src/__tests__/notification-guardian-path.test.ts +2 -3
- package/src/__tests__/notification-telegram-adapter.test.ts +1 -1
- package/src/__tests__/notification-thread-candidates.test.ts +4 -4
- package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
- package/src/__tests__/playbook-execution.test.ts +0 -1
- package/src/__tests__/playbook-tools.test.ts +0 -1
- package/src/__tests__/profile-compiler.test.ts +0 -1
- package/src/__tests__/provider-managed-proxy-integration.test.ts +25 -0
- package/src/__tests__/qdrant-collection-migration.test.ts +223 -0
- package/src/__tests__/recording-handler.test.ts +30 -94
- package/src/__tests__/registry.test.ts +28 -35
- package/src/__tests__/relay-server.test.ts +0 -1
- package/src/__tests__/ride-shotgun-handler.test.ts +4 -20
- package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
- package/src/__tests__/runtime-events-sse.test.ts +0 -1
- package/src/__tests__/sandbox-diagnostics.test.ts +0 -1
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +30 -28
- package/src/__tests__/schedule-store.test.ts +441 -1
- package/src/__tests__/schedule-tools.test.ts +468 -7
- package/src/__tests__/scheduler-recurrence.test.ts +196 -23
- package/src/__tests__/scoped-approval-grants.test.ts +0 -1
- package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +6 -3
- package/src/__tests__/secret-response-routing.test.ts +4 -1
- package/src/__tests__/send-endpoint-busy.test.ts +14 -2
- package/src/__tests__/send-notification-tool.test.ts +0 -7
- package/src/__tests__/sequence-store.test.ts +0 -1
- package/src/__tests__/server-history-render.test.ts +1 -2
- package/src/__tests__/session-abort-tool-results.test.ts +0 -1
- package/src/__tests__/session-agent-loop.test.ts +46 -6
- package/src/__tests__/session-confirmation-signals.test.ts +0 -1
- package/src/__tests__/session-conflict-gate.test.ts +2 -6
- package/src/__tests__/session-error.test.ts +5 -14
- package/src/__tests__/session-init.benchmark.test.ts +3 -5
- package/src/__tests__/session-load-history-repair.test.ts +0 -1
- package/src/__tests__/session-media-retry.test.ts +12 -74
- package/src/__tests__/session-pre-run-repair.test.ts +0 -1
- package/src/__tests__/session-profile-injection.test.ts +2 -6
- package/src/__tests__/session-provider-retry-repair.test.ts +2 -6
- package/src/__tests__/session-queue.test.ts +94 -139
- package/src/__tests__/session-skill-tools.test.ts +115 -115
- package/src/__tests__/session-slash-known.test.ts +0 -1
- package/src/__tests__/session-slash-queue.test.ts +0 -1
- package/src/__tests__/session-slash-unknown.test.ts +0 -1
- package/src/__tests__/session-surfaces-task-progress.test.ts +34 -0
- package/src/__tests__/session-usage.test.ts +0 -1
- package/src/__tests__/session-workspace-cache-state.test.ts +2 -6
- package/src/__tests__/session-workspace-injection.test.ts +2 -6
- package/src/__tests__/session-workspace-tool-tracking.test.ts +2 -6
- package/src/__tests__/skill-feature-flags-integration.test.ts +180 -184
- package/src/__tests__/skill-feature-flags.test.ts +125 -18
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -2
- package/src/__tests__/skill-load-tool.test.ts +194 -2
- package/src/__tests__/skill-projection-feature-flag.test.ts +27 -16
- package/src/__tests__/skill-projection.benchmark.test.ts +15 -14
- package/src/__tests__/skills.test.ts +14 -53
- package/src/__tests__/slack-channel-config.test.ts +0 -1
- package/src/__tests__/slack-inbound-verification.test.ts +0 -1
- package/src/__tests__/slack-skill.test.ts +1 -1
- package/src/__tests__/subagent-tools.test.ts +2 -2
- package/src/__tests__/system-prompt.test.ts +4 -3
- package/src/__tests__/task-compiler.test.ts +0 -1
- package/src/__tests__/task-management-tools.test.ts +0 -1
- package/src/__tests__/task-memory-cleanup.test.ts +0 -1
- package/src/__tests__/task-runner.test.ts +0 -1
- package/src/__tests__/task-scheduler.test.ts +0 -1
- package/src/__tests__/terminal-tools.test.ts +0 -1
- package/src/__tests__/test-support/computer-use-skill-harness.ts +2 -4
- package/src/__tests__/thread-seed-composer.test.ts +5 -5
- package/src/__tests__/tool-approval-handler.test.ts +0 -1
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
- package/src/__tests__/tool-executor.test.ts +8 -86
- package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
- package/src/__tests__/tool-notification-listener.test.ts +1 -1
- package/src/__tests__/tool-preview-lifecycle.test.ts +416 -0
- package/src/__tests__/trust-store.test.ts +80 -4
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -1
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
- package/src/__tests__/trusted-contact-verification.test.ts +0 -1
- package/src/__tests__/twilio-provider.test.ts +0 -1
- package/src/__tests__/twilio-routes.test.ts +0 -1
- package/src/__tests__/{request-file-tool.test.ts → ui-file-upload-surface.test.ts} +11 -72
- package/src/__tests__/update-bulletin.test.ts +0 -1
- package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -1
- package/src/__tests__/usage-routes.test.ts +0 -1
- package/src/__tests__/verification-control-plane-policy.test.ts +4 -4
- package/src/__tests__/voice-invite-redemption.test.ts +0 -1
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
- package/src/__tests__/voice-session-bridge.test.ts +9 -1
- package/src/__tests__/web-fetch.test.ts +57 -0
- package/src/__tests__/workspace-git-service.test.ts +5 -14
- package/src/__tests__/workspace-policy.test.ts +0 -1
- package/src/agent/loop.ts +22 -34
- package/src/bundler/bundle-signer.ts +4 -4
- package/src/calls/call-controller.ts +1 -1
- package/src/calls/relay-server.ts +1 -1
- package/src/calls/twilio-rest.ts +1 -1
- package/src/calls/voice-session-bridge.ts +3 -1
- package/src/cli/__tests__/notifications.test.ts +3 -4
- package/src/cli/commands/map.ts +2 -6
- package/src/cli/commands/mcp.ts +73 -15
- package/src/cli/commands/notifications.ts +4 -4
- package/src/cli/commands/sessions.ts +9 -1
- package/src/cli/commands/skills.ts +6 -10
- package/src/cli/http-client.ts +2 -3
- package/src/cli/main-screen.tsx +10 -10
- package/src/cli/program.ts +0 -4
- package/src/cli/reference.ts +0 -2
- package/src/cli.ts +15 -9
- package/src/config/__tests__/bundled-tool-registry-guard.test.ts +120 -0
- package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +11 -0
- package/src/config/bundled-skills/app-builder/SKILL.md +6 -1
- package/src/config/bundled-skills/browser/SKILL.md +6 -1
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +5 -1
- package/src/config/bundled-skills/claude-code/SKILL.md +5 -1
- package/src/config/bundled-skills/computer-use/SKILL.md +6 -1
- package/src/config/bundled-skills/computer-use/TOOLS.json +6 -69
- package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +10 -1
- package/src/config/bundled-skills/contacts/SKILL.md +10 -1
- package/src/config/bundled-skills/contacts/TOOLS.json +35 -0
- package/src/config/bundled-skills/{messaging → contacts}/tools/google-contacts.ts +9 -2
- package/src/config/bundled-skills/document/SKILL.md +4 -1
- package/src/config/bundled-skills/doordash/SKILL.md +8 -1
- package/src/config/bundled-skills/doordash/lib/shared/platform.ts +4 -1
- package/src/config/bundled-skills/followups/SKILL.md +4 -1
- package/src/config/bundled-skills/gmail/SKILL.md +180 -0
- package/src/config/bundled-skills/gmail/TOOLS.json +506 -0
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +149 -0
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +110 -0
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-draft.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-filters.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-follow-up.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-forward.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +50 -0
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-outreach-scan.ts +8 -90
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-send-draft.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-sender-digest.ts +2 -2
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-trash.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-unsubscribe.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-vacation.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/shared.ts +47 -0
- package/src/config/bundled-skills/google-calendar/SKILL.md +5 -1
- package/src/config/bundled-skills/image-studio/SKILL.md +5 -1
- package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -1
- package/src/config/bundled-skills/media-processing/SKILL.md +7 -13
- package/src/config/bundled-skills/media-processing/TOOLS.json +0 -22
- package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +12 -1
- package/src/config/bundled-skills/messaging/SKILL.md +23 -139
- package/src/config/bundled-skills/messaging/TOOLS.json +33 -1215
- package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +42 -0
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +165 -2
- package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +1 -13
- package/src/config/bundled-skills/messaging/tools/shared.ts +81 -34
- package/src/config/bundled-skills/notifications/SKILL.md +5 -1
- package/src/config/bundled-skills/orchestration/SKILL.md +30 -0
- package/src/config/bundled-skills/orchestration/TOOLS.json +35 -0
- package/src/config/bundled-skills/{reminder/tools/reminder-create.ts → orchestration/tools/swarm-delegate.ts} +3 -3
- package/src/config/bundled-skills/phone-calls/SKILL.md +9 -1
- package/src/config/bundled-skills/playbooks/SKILL.md +4 -1
- package/src/config/bundled-skills/schedule/SKILL.md +70 -9
- package/src/config/bundled-skills/schedule/TOOLS.json +38 -6
- package/src/config/bundled-skills/screen-watch/SKILL.md +28 -0
- package/src/config/bundled-skills/screen-watch/TOOLS.json +35 -0
- package/src/config/bundled-skills/{reminder/tools/reminder-cancel.ts → screen-watch/tools/start-screen-watch.ts} +3 -3
- package/src/config/bundled-skills/sequences/SKILL.md +47 -0
- package/src/config/bundled-skills/sequences/TOOLS.json +340 -0
- package/src/config/bundled-skills/sequences/tools/sequence-update.ts +128 -0
- package/src/config/bundled-skills/sequences/tools/shared.ts +9 -0
- package/src/config/bundled-skills/settings/SKILL.md +12 -0
- package/src/config/bundled-skills/settings/TOOLS.json +112 -0
- package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +43 -0
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +52 -0
- package/src/config/bundled-skills/{computer-use/tools/computer-use-right-click.ts → settings/tools/set-avatar.ts} +2 -6
- package/src/{tools/system/voice-config.ts → config/bundled-skills/settings/tools/voice-config-update.ts} +59 -96
- package/src/config/bundled-skills/skill-management/SKILL.md +18 -0
- package/src/config/bundled-skills/skill-management/TOOLS.json +90 -0
- package/src/config/bundled-skills/{computer-use/tools/computer-use-double-click.ts → skill-management/tools/delete-managed.ts} +2 -6
- package/src/config/bundled-skills/skill-management/tools/scaffold-managed.ts +12 -0
- package/src/config/bundled-skills/slack/SKILL.md +5 -1
- package/src/config/bundled-skills/subagent/SKILL.md +4 -1
- package/src/config/bundled-skills/tasks/SKILL.md +5 -2
- package/src/config/bundled-skills/transcribe/SKILL.md +4 -1
- package/src/config/bundled-skills/watcher/SKILL.md +4 -1
- package/src/config/bundled-tool-registry.ts +118 -107
- package/src/config/env.ts +5 -2
- package/src/config/feature-flag-registry.json +25 -9
- package/src/config/loader.ts +10 -2
- package/src/config/schema.ts +19 -16
- package/src/config/schemas/inference.ts +12 -22
- package/src/config/schemas/memory-storage.ts +19 -1
- package/src/config/schemas/platform.ts +0 -16
- package/src/config/skill-state.ts +11 -8
- package/src/config/skills.ts +83 -32
- package/src/context/token-estimator.ts +11 -0
- package/src/context/window-manager.ts +180 -151
- package/src/daemon/computer-use-session.ts +11 -43
- package/src/daemon/daemon-control.ts +4 -1
- package/src/daemon/handlers/config-channels.ts +5 -9
- package/src/daemon/handlers/config-ingress.ts +0 -4
- package/src/daemon/handlers/config-model.ts +7 -13
- package/src/daemon/handlers/config-telegram.ts +4 -8
- package/src/daemon/handlers/config-voice.ts +2 -5
- package/src/daemon/handlers/dictation.ts +2 -12
- package/src/daemon/handlers/identity.ts +0 -105
- package/src/daemon/handlers/recording.ts +3 -23
- package/src/daemon/handlers/session-history.ts +1 -1
- package/src/daemon/handlers/sessions.ts +53 -72
- package/src/daemon/handlers/shared.ts +7 -28
- package/src/daemon/handlers/skills.ts +31 -27
- package/src/daemon/host-bash-proxy.ts +148 -0
- package/src/daemon/host-file-proxy.ts +135 -0
- package/src/daemon/lifecycle.ts +49 -24
- package/src/daemon/mcp-reload-service.ts +123 -0
- package/src/daemon/message-protocol.ts +6 -0
- package/src/daemon/message-types/browser.ts +1 -1
- package/src/daemon/message-types/computer-use.ts +1 -4
- package/src/daemon/message-types/guardian-actions.ts +1 -1
- package/src/daemon/message-types/host-bash.ts +18 -0
- package/src/daemon/message-types/host-file.ts +44 -0
- package/src/daemon/message-types/integrations.ts +1 -67
- package/src/daemon/message-types/messages.ts +15 -0
- package/src/daemon/message-types/schedules.ts +11 -27
- package/src/daemon/message-types/sessions.ts +2 -1
- package/src/daemon/message-types/settings.ts +1 -1
- package/src/daemon/message-types/shared.ts +1 -1
- package/src/daemon/ride-shotgun-handler.ts +2 -42
- package/src/daemon/server.ts +43 -10
- package/src/daemon/session-agent-loop-handlers.ts +48 -7
- package/src/daemon/session-agent-loop.ts +97 -66
- package/src/daemon/session-attachments.ts +1 -1
- package/src/daemon/session-error.ts +17 -16
- package/src/daemon/session-lifecycle.ts +20 -1
- package/src/daemon/session-media-retry.ts +1 -15
- package/src/daemon/session-messaging.ts +14 -6
- package/src/daemon/session-process.ts +36 -7
- package/src/daemon/session-queue-manager.ts +62 -103
- package/src/daemon/session-runtime-assembly.ts +27 -0
- package/src/daemon/session-skill-tools.ts +12 -11
- package/src/daemon/session-slash.ts +7 -0
- package/src/daemon/session-surfaces.ts +19 -97
- package/src/daemon/session-tool-setup.ts +146 -6
- package/src/daemon/session.ts +77 -13
- package/src/errors.ts +0 -2
- package/src/export/formatter.ts +6 -0
- package/src/mcp/mcp-oauth-provider.ts +1 -3
- package/src/media/avatar-router.ts +20 -28
- package/src/media/avatar-types.ts +7 -14
- package/src/media/managed-avatar-client.ts +70 -34
- package/src/memory/conversation-title-service.ts +1 -2
- package/src/memory/db-init.ts +16 -0
- package/src/memory/embedding-backend.ts +129 -27
- package/src/memory/embedding-gemini.test.ts +256 -0
- package/src/memory/embedding-gemini.ts +47 -13
- package/src/memory/embedding-local.ts +14 -2
- package/src/memory/embedding-ollama.ts +15 -2
- package/src/memory/embedding-openai.ts +15 -2
- package/src/memory/embedding-types.test.ts +116 -0
- package/src/memory/embedding-types.ts +61 -0
- package/src/memory/fingerprint.ts +1 -1
- package/src/memory/indexer.ts +25 -1
- package/src/memory/job-handlers/embedding.test.ts +258 -0
- package/src/memory/job-handlers/embedding.ts +81 -1
- package/src/memory/job-handlers/index-maintenance.ts +35 -1
- package/src/memory/job-handlers/media-processing.ts +11 -1
- package/src/memory/job-utils.ts +21 -6
- package/src/memory/jobs-store.ts +5 -1
- package/src/memory/jobs-worker.ts +8 -0
- package/src/memory/message-content.ts +66 -0
- package/src/memory/migrations/100-core-tables.ts +1 -31
- package/src/memory/migrations/104-core-indexes.ts +0 -11
- package/src/memory/migrations/145-drop-accounts-table.ts +19 -0
- package/src/memory/migrations/146-schedule-oneshot-routing.ts +94 -0
- package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +129 -0
- package/src/memory/migrations/148-drop-reminders-table.ts +18 -0
- package/src/memory/migrations/index.ts +4 -0
- package/src/memory/migrations/registry.ts +19 -0
- package/src/memory/qdrant-client.ts +158 -43
- package/src/memory/retriever.test.ts +0 -1
- package/src/memory/retriever.ts +12 -2
- package/src/memory/schema/infrastructure.ts +5 -29
- package/src/memory/search/formatting.ts +34 -9
- package/src/memory/search/semantic.ts +57 -2
- package/src/memory/search/types.ts +2 -1
- package/src/notifications/AGENTS.md +2 -2
- package/src/notifications/README.md +59 -58
- package/src/notifications/adapters/macos.ts +1 -1
- package/src/notifications/broadcaster.ts +5 -5
- package/src/notifications/copy-composer.ts +1 -1
- package/src/notifications/decision-engine.ts +2 -2
- package/src/notifications/destination-resolver.ts +2 -2
- package/src/notifications/emit-signal.ts +8 -8
- package/src/notifications/signal.ts +1 -1
- package/src/notifications/thread-seed-composer.ts +1 -1
- package/src/oauth/connect-orchestrator.ts +1 -1
- package/src/oauth/token-persistence.ts +1 -1
- package/src/permissions/checker.ts +12 -1
- package/src/permissions/defaults.ts +10 -14
- package/src/permissions/trust-store.ts +37 -0
- package/src/permissions/workspace-policy.ts +0 -1
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +11 -0
- package/src/prompts/computer-use-prompt.ts +1 -1
- package/src/prompts/system-prompt.ts +29 -30
- package/src/prompts/templates/SOUL.md +1 -2
- package/src/prompts/templates/UPDATES.md +16 -7
- package/src/providers/anthropic/client.ts +87 -33
- package/src/providers/gemini/client.ts +6 -0
- package/src/providers/managed-proxy/constants.ts +5 -0
- package/src/providers/openai/client.ts +15 -0
- package/src/providers/registry.ts +2 -2
- package/src/providers/types.ts +24 -2
- package/src/runtime/AGENTS.md +18 -0
- package/src/runtime/assistant-event-hub.ts +2 -3
- package/src/runtime/assistant-event.ts +4 -4
- package/src/runtime/auth/__tests__/context.test.ts +5 -5
- package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
- package/src/runtime/auth/__tests__/guard-tests.test.ts +2 -2
- package/src/runtime/auth/__tests__/{ipc-auth-context.test.ts → local-auth-context.test.ts} +21 -21
- package/src/runtime/auth/__tests__/route-policy.test.ts +2 -2
- package/src/runtime/auth/__tests__/scopes.test.ts +7 -7
- package/src/runtime/auth/__tests__/subject.test.ts +8 -8
- package/src/runtime/auth/__tests__/token-service.test.ts +0 -1
- package/src/runtime/auth/route-policy.ts +8 -4
- package/src/runtime/auth/scopes.ts +1 -1
- package/src/runtime/auth/subject.ts +4 -4
- package/src/runtime/auth/token-service.ts +0 -23
- package/src/runtime/auth/types.ts +3 -3
- package/src/runtime/guardian-action-followup-executor.ts +1 -1
- package/src/runtime/guardian-action-grant-minter.ts +1 -1
- package/src/runtime/guardian-action-service.ts +3 -3
- package/src/runtime/http-server.ts +15 -2
- package/src/runtime/invite-service.ts +3 -3
- package/src/runtime/local-actor-identity.ts +17 -22
- package/src/runtime/pending-interactions.ts +21 -9
- package/src/runtime/routes/app-management-routes.ts +2 -3
- package/src/runtime/routes/approval-routes.ts +1 -3
- package/src/runtime/routes/btw-routes.ts +155 -0
- package/src/runtime/routes/computer-use-routes.ts +77 -31
- package/src/runtime/routes/conversation-routes.ts +230 -46
- package/src/runtime/routes/diagnostics-routes.ts +63 -29
- package/src/runtime/routes/documents-routes.ts +2 -2
- package/src/runtime/routes/global-search-routes.ts +1 -1
- package/src/runtime/routes/host-bash-routes.ts +83 -0
- package/src/runtime/routes/host-file-routes.ts +79 -0
- package/src/runtime/routes/integrations/slack/share.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +120 -0
- package/src/runtime/routes/mcp-routes.ts +20 -0
- package/src/runtime/routes/migration-routes.ts +3 -3
- package/src/runtime/routes/pairing-routes.ts +1 -1
- package/src/runtime/routes/recording-routes.ts +6 -4
- package/src/runtime/routes/schedule-routes.ts +31 -5
- package/src/runtime/routes/session-management-routes.ts +2 -6
- package/src/runtime/routes/session-query-routes.ts +18 -15
- package/src/runtime/routes/settings-routes.ts +7 -261
- package/src/runtime/routes/skills-routes.ts +7 -6
- package/src/runtime/routes/subagents-routes.ts +4 -10
- package/src/runtime/routes/surface-action-routes.ts +3 -14
- package/src/runtime/routes/surface-content-routes.ts +22 -5
- package/src/runtime/routes/work-items-routes.ts +21 -25
- package/src/runtime/routes/workspace-routes.test.ts +3 -3
- package/src/runtime/routes/workspace-utils.ts +1 -1
- package/src/runtime/telegram-streaming-delivery.ts +3 -0
- package/src/runtime/verification-outbound-actions.ts +2 -2
- package/src/schedule/integration-status.ts +0 -6
- package/src/schedule/schedule-store.ts +234 -43
- package/src/schedule/scheduler.ts +73 -74
- package/src/security/oauth2.ts +1 -1
- package/src/sequence/store.ts +12 -2
- package/src/skills/frontmatter.ts +19 -77
- package/src/skills/managed-store.ts +11 -2
- package/src/subagent/manager.ts +5 -3
- package/src/tasks/ephemeral-permissions.ts +3 -5
- package/src/tools/AGENTS.md +0 -1
- package/src/tools/browser/browser-manager.ts +17 -11
- package/src/tools/browser/jit-auth.ts +4 -1
- package/src/tools/claude-code/claude-code.ts +1 -1
- package/src/tools/computer-use/definitions.ts +48 -60
- package/src/tools/document/document-tool.ts +6 -6
- package/src/tools/filesystem/edit.ts +2 -1
- package/src/tools/filesystem/read.ts +20 -2
- package/src/tools/filesystem/write.ts +2 -1
- package/src/tools/host-filesystem/edit.ts +17 -1
- package/src/tools/host-filesystem/read.ts +16 -1
- package/src/tools/host-filesystem/write.ts +15 -1
- package/src/tools/host-terminal/host-shell.ts +24 -0
- package/src/tools/memory/definitions.ts +45 -81
- package/src/tools/memory/handlers.test.ts +0 -1
- package/src/tools/memory/handlers.ts +1 -1
- package/src/tools/memory/register.ts +26 -60
- package/src/tools/network/script-proxy/session-manager.ts +6 -8
- package/src/tools/network/web-fetch.ts +7 -1
- package/src/tools/network/web-search.ts +2 -1
- package/src/tools/registry.ts +23 -0
- package/src/tools/schedule/create.ts +113 -5
- package/src/tools/schedule/list.ts +57 -15
- package/src/tools/schedule/update.ts +73 -3
- package/src/tools/shared/filesystem/image-read.ts +192 -0
- package/src/tools/side-effects.ts +1 -7
- package/src/tools/skills/delete-managed.ts +27 -64
- package/src/tools/skills/execute.ts +54 -0
- package/src/tools/skills/load.ts +127 -5
- package/src/tools/skills/scaffold-managed.ts +93 -172
- package/src/tools/subagent/message.ts +0 -7
- package/src/tools/subagent/spawn.ts +1 -1
- package/src/tools/swarm/delegate.ts +0 -3
- package/src/tools/system/avatar-generator.ts +13 -19
- package/src/tools/system/request-permission.ts +2 -1
- package/src/tools/terminal/safe-env.ts +1 -0
- package/src/tools/tool-manifest.ts +41 -47
- package/src/tools/types.ts +6 -2
- package/src/tools/ui-surface/definitions.ts +0 -55
- package/src/util/errors.ts +0 -10
- package/src/workspace/git-service.ts +0 -2
- package/src/__tests__/account-registry.test.ts +0 -258
- package/src/__tests__/email-classifier.test.ts +0 -25
- package/src/__tests__/gmail-integration.test.ts +0 -97
- package/src/__tests__/handle-user-message-secret-resume.test.ts +0 -172
- package/src/__tests__/managed-twitter-guardrails.test.ts +0 -357
- package/src/__tests__/recording-intent-fallback.test.ts +0 -199
- package/src/__tests__/recording-intent.test.ts +0 -985
- package/src/__tests__/recording-state-machine.test.ts +0 -1574
- package/src/__tests__/reminder-store.test.ts +0 -350
- package/src/__tests__/reminder.test.ts +0 -337
- package/src/__tests__/scan-result-store.test.ts +0 -121
- package/src/__tests__/twitter-platform-proxy-client.test.ts +0 -475
- package/src/__tests__/view-image-tool.test.ts +0 -241
- package/src/cli/commands/amazon/cart.ts +0 -513
- package/src/cli/commands/amazon/checkout.ts +0 -394
- package/src/cli/commands/amazon/client.ts +0 -513
- package/src/cli/commands/amazon/index.ts +0 -885
- package/src/cli/commands/amazon/product-details.ts +0 -145
- package/src/cli/commands/amazon/request-extractor.ts +0 -187
- package/src/cli/commands/amazon/search.ts +0 -76
- package/src/cli/commands/amazon/session.ts +0 -108
- package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -345
- package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -252
- package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -151
- package/src/cli/commands/twitter/index.ts +0 -420
- package/src/cli/commands/twitter/oauth-client.ts +0 -60
- package/src/cli/commands/twitter/router.ts +0 -351
- package/src/cli/commands/twitter/types.ts +0 -30
- package/src/config/bundled-skills/agentmail/SKILL.md +0 -132
- package/src/config/bundled-skills/agentmail/icon.svg +0 -21
- package/src/config/bundled-skills/amazon/SKILL.md +0 -136
- package/src/config/bundled-skills/amazon/icon.svg +0 -13
- package/src/config/bundled-skills/api-mapping/SKILL.md +0 -78
- package/src/config/bundled-skills/api-mapping/icon.svg +0 -18
- package/src/config/bundled-skills/cli-discover/SKILL.md +0 -68
- package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +0 -179
- package/src/config/bundled-skills/document-writer/SKILL.md +0 -195
- package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +0 -140
- package/src/config/bundled-skills/email-setup/SKILL.md +0 -68
- package/src/config/bundled-skills/frontend-design/SKILL.md +0 -44
- package/src/config/bundled-skills/frontend-design/icon.svg +0 -16
- package/src/config/bundled-skills/google-oauth-setup/SKILL.md +0 -452
- package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +0 -203
- package/src/config/bundled-skills/influencer/SKILL.md +0 -144
- package/src/config/bundled-skills/influencer/scripts/client.ts +0 -1269
- package/src/config/bundled-skills/influencer/scripts/influencer.ts +0 -267
- package/src/config/bundled-skills/macos-automation/SKILL.md +0 -65
- package/src/config/bundled-skills/macos-automation/icon.svg +0 -12
- package/src/config/bundled-skills/mcp-setup/SKILL.md +0 -75
- package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +0 -184
- package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +0 -80
- package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -29
- package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -56
- package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -34
- package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +0 -47
- package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -31
- package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +0 -67
- package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +0 -97
- package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +0 -87
- package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +0 -135
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -24
- package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -201
- package/src/config/bundled-skills/messaging/tools/send-notification.ts +0 -1
- package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +0 -27
- package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +0 -48
- package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +0 -27
- package/src/config/bundled-skills/messaging/tools/sequence-update.ts +0 -56
- package/src/config/bundled-skills/notion/SKILL.md +0 -240
- package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +0 -126
- package/src/config/bundled-skills/oauth-setup/SKILL.md +0 -143
- package/src/config/bundled-skills/public-ingress/SKILL.md +0 -258
- package/src/config/bundled-skills/reminder/SKILL.md +0 -79
- package/src/config/bundled-skills/reminder/TOOLS.json +0 -89
- package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -12
- package/src/config/bundled-skills/restaurant-reservation/SKILL.md +0 -141
- package/src/config/bundled-skills/screen-recording/SKILL.md +0 -148
- package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -69
- package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -78
- package/src/config/bundled-skills/slack-app-setup/SKILL.md +0 -178
- package/src/config/bundled-skills/slack-digest-setup/SKILL.md +0 -163
- package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +0 -157
- package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
- package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
- package/src/config/bundled-skills/telegram-setup/SKILL.md +0 -105
- package/src/config/bundled-skills/time-based-actions/SKILL.md +0 -142
- package/src/config/bundled-skills/twilio-setup/SKILL.md +0 -232
- package/src/config/bundled-skills/twitter/SKILL.md +0 -206
- package/src/config/bundled-skills/twitter/icon.svg +0 -14
- package/src/config/bundled-skills/typescript-eval/SKILL.md +0 -60
- package/src/config/bundled-skills/vercel-token-setup/SKILL.md +0 -214
- package/src/config/bundled-skills/voice-setup/SKILL.md +0 -131
- package/src/config/bundled-skills/voice-setup/icon.svg +0 -20
- package/src/daemon/handlers/pairing.ts +0 -119
- package/src/daemon/handlers/session-user-message.ts +0 -961
- package/src/daemon/recording-executor.ts +0 -180
- package/src/daemon/recording-intent-fallback.ts +0 -162
- package/src/daemon/recording-intent.ts +0 -493
- package/src/memory/account-store.ts +0 -117
- package/src/messaging/activity-analyzer.ts +0 -76
- package/src/messaging/email-classifier.ts +0 -208
- package/src/messaging/index.ts +0 -2
- package/src/messaging/outreach-classifier.ts +0 -185
- package/src/messaging/thread-summarizer.ts +0 -346
- package/src/messaging/types.ts +0 -17
- package/src/tools/browser/x-auto-navigate.ts +0 -254
- package/src/tools/credentials/account-registry.ts +0 -144
- package/src/tools/filesystem/view-image.ts +0 -244
- package/src/tools/reminder/reminder-store.ts +0 -194
- package/src/tools/reminder/reminder.ts +0 -158
- package/src/tools/system/navigate-settings.ts +0 -74
- package/src/tools/system/open-system-settings.ts +0 -85
- package/src/tools/system/version.ts +0 -54
- package/src/twitter/platform-proxy-client.ts +0 -408
- /package/src/config/bundled-skills/{messaging → gmail}/tools/scan-result-store.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-analytics.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-create.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-delete.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enroll.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enrollment-list.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-get.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-import.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-list.ts +0 -0
|
@@ -27,10 +27,14 @@ import { coreAppProxyTools } from "../tools/apps/definitions.js";
|
|
|
27
27
|
import { registerSessionSender } from "../tools/browser/browser-screencast.js";
|
|
28
28
|
import { requestComputerControlTool } from "../tools/computer-use/request-computer-control.js";
|
|
29
29
|
import type { ToolExecutor } from "../tools/executor.js";
|
|
30
|
-
import {
|
|
30
|
+
import {
|
|
31
|
+
getAllToolDefinitions,
|
|
32
|
+
getMcpToolDefinitions,
|
|
33
|
+
} from "../tools/registry.js";
|
|
31
34
|
import type {
|
|
32
35
|
ProxyApprovalCallback,
|
|
33
36
|
ProxyApprovalRequest,
|
|
37
|
+
ToolContext,
|
|
34
38
|
ToolExecutionResult,
|
|
35
39
|
ToolLifecycleEventHandler,
|
|
36
40
|
} from "../tools/types.js";
|
|
@@ -87,7 +91,7 @@ export interface ToolSetupContext extends SurfaceSessionContext {
|
|
|
87
91
|
allowedToolNames?: Set<string>;
|
|
88
92
|
/** Session memory policy — used to propagate scopeId and strictSideEffects into ToolContext. */
|
|
89
93
|
memoryPolicy: { scopeId: string; strictSideEffects: boolean };
|
|
90
|
-
/** True when the session has no connected
|
|
94
|
+
/** True when the session has no connected client (HTTP-only path). */
|
|
91
95
|
hasNoClient?: boolean;
|
|
92
96
|
/** When true, the session is executing a task run and must not become interactive. */
|
|
93
97
|
headlessLock?: boolean;
|
|
@@ -97,6 +101,10 @@ export interface ToolSetupContext extends SurfaceSessionContext {
|
|
|
97
101
|
trustContext?: TrustContext;
|
|
98
102
|
/** Voice/call session ID, if the session originates from a call. Propagated into ToolContext for scoped grant consumption. */
|
|
99
103
|
callSessionId?: string;
|
|
104
|
+
/** Optional proxy for delegating host_bash execution to a connected client. */
|
|
105
|
+
hostBashProxy?: import("./host-bash-proxy.js").HostBashProxy;
|
|
106
|
+
/** Optional proxy for delegating host_file_read/write/edit execution to a connected client. */
|
|
107
|
+
hostFileProxy?: import("./host-file-proxy.js").HostFileProxy;
|
|
100
108
|
}
|
|
101
109
|
|
|
102
110
|
// ── buildToolDefinitions ─────────────────────────────────────────────
|
|
@@ -150,7 +158,9 @@ export function createToolExecutor(
|
|
|
150
158
|
markDoordashStepInProgress(ctx, input);
|
|
151
159
|
}
|
|
152
160
|
|
|
153
|
-
|
|
161
|
+
// Build the context object shared by both the skill_execute interception
|
|
162
|
+
// path and the regular executor path.
|
|
163
|
+
const toolContext: ToolContext = {
|
|
154
164
|
workingDir: ctx.workingDir,
|
|
155
165
|
sessionId: ctx.conversationId,
|
|
156
166
|
conversationId: ctx.conversationId,
|
|
@@ -175,6 +185,8 @@ export function createToolExecutor(
|
|
|
175
185
|
memoryScopeId: ctx.memoryPolicy.scopeId,
|
|
176
186
|
forcePromptSideEffects: ctx.memoryPolicy.strictSideEffects,
|
|
177
187
|
toolUseId,
|
|
188
|
+
hostBashProxy: ctx.hostBashProxy,
|
|
189
|
+
hostFileProxy: ctx.hostFileProxy,
|
|
178
190
|
onToolLifecycleEvent: handleToolLifecycleEvent,
|
|
179
191
|
sendToClient: (msg) => {
|
|
180
192
|
// Tool context's sendToClient uses a loose { type: string; [key: string]: unknown }
|
|
@@ -315,7 +327,38 @@ export function createToolExecutor(
|
|
|
315
327
|
: ("deny" as const),
|
|
316
328
|
};
|
|
317
329
|
},
|
|
318
|
-
}
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
// Intercept skill_execute: extract the real tool name and input, then
|
|
333
|
+
// route through the full executor pipeline so the underlying tool's
|
|
334
|
+
// risk level, permission checks, hooks, and lifecycle events all fire
|
|
335
|
+
// with the real tool name.
|
|
336
|
+
if (name === "skill_execute") {
|
|
337
|
+
const toolName = typeof input.tool === "string" ? input.tool : "";
|
|
338
|
+
const toolInput =
|
|
339
|
+
input.input != null && typeof input.input === "object"
|
|
340
|
+
? (input.input as Record<string, unknown>)
|
|
341
|
+
: {};
|
|
342
|
+
|
|
343
|
+
if (!toolName) {
|
|
344
|
+
return {
|
|
345
|
+
content:
|
|
346
|
+
'Error: skill_execute requires a "tool" parameter with the tool name',
|
|
347
|
+
isError: true,
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
const result = await executor.execute(toolName, toolInput, toolContext);
|
|
352
|
+
|
|
353
|
+
runPostExecutionSideEffects(toolName, toolInput, result, {
|
|
354
|
+
ctx,
|
|
355
|
+
broadcastToAllClients,
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
return result;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
const result = await executor.execute(name, input, toolContext);
|
|
319
362
|
|
|
320
363
|
runPostExecutionSideEffects(name, input, result, {
|
|
321
364
|
ctx,
|
|
@@ -486,6 +529,63 @@ export interface SkillProjectionContext {
|
|
|
486
529
|
allowedToolNames?: Set<string>;
|
|
487
530
|
/** When > 0, the resolveTools callback returns no tools at all. */
|
|
488
531
|
toolsDisabledDepth: number;
|
|
532
|
+
/** Channel capabilities — read lazily per turn for conditional tool filtering. */
|
|
533
|
+
readonly channelCapabilities?: {
|
|
534
|
+
channel: string;
|
|
535
|
+
supportsDynamicUi: boolean;
|
|
536
|
+
};
|
|
537
|
+
/** True when no client is connected (HTTP-only). */
|
|
538
|
+
readonly hasNoClient?: boolean;
|
|
539
|
+
/** True when the conversation has user-uploaded attachments. */
|
|
540
|
+
hasAttachments?: boolean;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// ── Conditional tool sets ────────────────────────────────────────────
|
|
544
|
+
|
|
545
|
+
const UI_SURFACE_TOOL_NAMES = new Set(["ui_show", "ui_update", "ui_dismiss"]);
|
|
546
|
+
const HOST_TOOL_NAMES = new Set([
|
|
547
|
+
"host_file_read",
|
|
548
|
+
"host_file_write",
|
|
549
|
+
"host_file_edit",
|
|
550
|
+
"host_bash",
|
|
551
|
+
]);
|
|
552
|
+
const ASSET_TOOL_NAMES = new Set(["asset_search", "asset_materialize"]);
|
|
553
|
+
const CLIENT_CAPABILITY_TOOL_NAMES = new Set([
|
|
554
|
+
"app_open",
|
|
555
|
+
"computer_use_request_control",
|
|
556
|
+
]);
|
|
557
|
+
const PLATFORM_TOOL_NAMES = new Set(["request_system_permission"]);
|
|
558
|
+
|
|
559
|
+
/**
|
|
560
|
+
* Determine whether a tool should be included in the LLM tool definitions
|
|
561
|
+
* for the current turn based on session context. Tools not active for the
|
|
562
|
+
* current context are omitted from the definitions sent to the provider,
|
|
563
|
+
* reducing noise and preventing the model from attempting calls that would
|
|
564
|
+
* fail.
|
|
565
|
+
*/
|
|
566
|
+
export function isToolActiveForContext(
|
|
567
|
+
name: string,
|
|
568
|
+
ctx: SkillProjectionContext,
|
|
569
|
+
): boolean {
|
|
570
|
+
if (UI_SURFACE_TOOL_NAMES.has(name)) {
|
|
571
|
+
return ctx.channelCapabilities?.supportsDynamicUi ?? !ctx.hasNoClient;
|
|
572
|
+
}
|
|
573
|
+
if (HOST_TOOL_NAMES.has(name)) {
|
|
574
|
+
// Host tools require a connected client — without one, there is no human
|
|
575
|
+
// to approve execution and the guardian auto-approve path would allow
|
|
576
|
+
// unchecked host command execution on the daemon host.
|
|
577
|
+
return !ctx.hasNoClient;
|
|
578
|
+
}
|
|
579
|
+
if (ASSET_TOOL_NAMES.has(name)) {
|
|
580
|
+
return ctx.hasAttachments ?? false;
|
|
581
|
+
}
|
|
582
|
+
if (CLIENT_CAPABILITY_TOOL_NAMES.has(name)) {
|
|
583
|
+
return !ctx.hasNoClient;
|
|
584
|
+
}
|
|
585
|
+
if (PLATFORM_TOOL_NAMES.has(name)) {
|
|
586
|
+
return process.platform === "darwin" && !ctx.hasNoClient;
|
|
587
|
+
}
|
|
588
|
+
return true;
|
|
489
589
|
}
|
|
490
590
|
|
|
491
591
|
/**
|
|
@@ -493,6 +593,12 @@ export interface SkillProjectionContext {
|
|
|
493
593
|
* dynamically projected skill tools on each agent turn. Also updates
|
|
494
594
|
* allowedToolNames so newly-activated skill tools aren't blocked by
|
|
495
595
|
* the executor's stale gate.
|
|
596
|
+
*
|
|
597
|
+
* Core (non-MCP) tool definitions are captured at session creation and
|
|
598
|
+
* reused on each turn. MCP tool definitions are re-read from the global
|
|
599
|
+
* registry on each turn so that tools registered after session creation
|
|
600
|
+
* (e.g. via `vellum mcp reload`) are automatically picked up without
|
|
601
|
+
* requiring session disposal or app restart.
|
|
496
602
|
*/
|
|
497
603
|
export function createResolveToolsCallback(
|
|
498
604
|
toolDefs: ToolDefinition[],
|
|
@@ -500,6 +606,20 @@ export function createResolveToolsCallback(
|
|
|
500
606
|
): ((history: Message[]) => ToolDefinition[]) | undefined {
|
|
501
607
|
if (toolDefs.length === 0) return undefined;
|
|
502
608
|
|
|
609
|
+
// Separate the initial tool defs into core (stable) and MCP (dynamic).
|
|
610
|
+
// We keep core tools from the snapshot and re-read MCP tools each turn.
|
|
611
|
+
const initialMcpDefs = getMcpToolDefinitions();
|
|
612
|
+
const initialMcpNames = new Set(initialMcpDefs.map((d) => d.name));
|
|
613
|
+
const coreToolDefs = toolDefs.filter((d) => !initialMcpNames.has(d.name));
|
|
614
|
+
log.debug(
|
|
615
|
+
{
|
|
616
|
+
coreCount: coreToolDefs.length,
|
|
617
|
+
mcpCount: initialMcpDefs.length,
|
|
618
|
+
mcpTools: initialMcpDefs.map((d) => d.name),
|
|
619
|
+
},
|
|
620
|
+
"Session tool resolver initialized",
|
|
621
|
+
);
|
|
622
|
+
|
|
503
623
|
return (history: Message[]) => {
|
|
504
624
|
// When tools are explicitly disabled (e.g. during pointer generation),
|
|
505
625
|
// return an empty tool list so the LLM never sees tool definitions and
|
|
@@ -509,6 +629,26 @@ export function createResolveToolsCallback(
|
|
|
509
629
|
return [];
|
|
510
630
|
}
|
|
511
631
|
|
|
632
|
+
// Filter core tools based on current session context so that tools
|
|
633
|
+
// irrelevant to this turn (e.g. UI tools when no client is connected)
|
|
634
|
+
// are omitted from the definitions sent to the provider.
|
|
635
|
+
const filteredCoreDefs = coreToolDefs.filter((d) =>
|
|
636
|
+
isToolActiveForContext(d.name, ctx),
|
|
637
|
+
);
|
|
638
|
+
|
|
639
|
+
// Re-read MCP tool definitions from the registry each turn so sessions
|
|
640
|
+
// automatically pick up tools added/removed by `vellum mcp reload`.
|
|
641
|
+
const currentMcpDefs = getMcpToolDefinitions();
|
|
642
|
+
log.debug(
|
|
643
|
+
{
|
|
644
|
+
coreCount: filteredCoreDefs.length,
|
|
645
|
+
mcpCount: currentMcpDefs.length,
|
|
646
|
+
mcpTools: currentMcpDefs.map((d) => d.name),
|
|
647
|
+
},
|
|
648
|
+
"MCP tools resolved for turn",
|
|
649
|
+
);
|
|
650
|
+
const allBaseDefs = [...filteredCoreDefs, ...currentMcpDefs];
|
|
651
|
+
|
|
512
652
|
const effectivePreactivated = [
|
|
513
653
|
...DEFAULT_PREACTIVATED_SKILL_IDS,
|
|
514
654
|
...(ctx.preactivatedSkillIds ?? []),
|
|
@@ -518,11 +658,11 @@ export function createResolveToolsCallback(
|
|
|
518
658
|
previouslyActiveSkillIds: ctx.skillProjectionState,
|
|
519
659
|
cache: ctx.skillProjectionCache,
|
|
520
660
|
});
|
|
521
|
-
const turnAllowed = new Set(
|
|
661
|
+
const turnAllowed = new Set(allBaseDefs.map((d) => d.name));
|
|
522
662
|
for (const name of projection.allowedToolNames) {
|
|
523
663
|
turnAllowed.add(name);
|
|
524
664
|
}
|
|
525
665
|
ctx.allowedToolNames = turnAllowed;
|
|
526
|
-
return
|
|
666
|
+
return allBaseDefs;
|
|
527
667
|
};
|
|
528
668
|
}
|
package/src/daemon/session.ts
CHANGED
|
@@ -46,6 +46,8 @@ import type { AuthContext } from "../runtime/auth/types.js";
|
|
|
46
46
|
import * as approvalOverrides from "../runtime/session-approval-overrides.js";
|
|
47
47
|
import { ToolExecutor } from "../tools/executor.js";
|
|
48
48
|
import type { AssistantAttachmentDraft } from "./assistant-attachments.js";
|
|
49
|
+
import { HostBashProxy } from "./host-bash-proxy.js";
|
|
50
|
+
import { HostFileProxy } from "./host-file-proxy.js";
|
|
49
51
|
import type {
|
|
50
52
|
ServerMessage,
|
|
51
53
|
SurfaceData,
|
|
@@ -82,15 +84,13 @@ import {
|
|
|
82
84
|
drainQueue as drainQueueImpl,
|
|
83
85
|
processMessage as processMessageImpl,
|
|
84
86
|
} from "./session-process.js";
|
|
85
|
-
import type {
|
|
86
|
-
QueueDrainReason,
|
|
87
|
-
QueueMetrics,
|
|
88
|
-
} from "./session-queue-manager.js";
|
|
87
|
+
import type { QueueDrainReason } from "./session-queue-manager.js";
|
|
89
88
|
import { MessageQueue } from "./session-queue-manager.js";
|
|
90
89
|
import type {
|
|
91
90
|
ChannelCapabilities,
|
|
92
91
|
TrustContext,
|
|
93
92
|
} from "./session-runtime-assembly.js";
|
|
93
|
+
import { messagesContainAttachments } from "./session-runtime-assembly.js";
|
|
94
94
|
import type { SkillProjectionCache } from "./session-skill-tools.js";
|
|
95
95
|
import {
|
|
96
96
|
createSurfaceMutex,
|
|
@@ -121,7 +121,6 @@ export const DEFAULT_MEMORY_POLICY: Readonly<SessionMemoryPolicy> =
|
|
|
121
121
|
|
|
122
122
|
export { findLastUndoableUserMessageIndex } from "./session-history.js";
|
|
123
123
|
export type { QueueDrainReason, QueuePolicy } from "./session-queue-manager.js";
|
|
124
|
-
export { MAX_QUEUE_DEPTH } from "./session-queue-manager.js";
|
|
125
124
|
|
|
126
125
|
export class Session {
|
|
127
126
|
public readonly conversationId: string;
|
|
@@ -157,9 +156,12 @@ export class Session {
|
|
|
157
156
|
/** @internal */ currentRequestId?: string;
|
|
158
157
|
/** @internal */ conflictGate = new ConflictGate();
|
|
159
158
|
/** @internal */ hasNoClient = false;
|
|
159
|
+
/** @internal */ hasAttachments = false;
|
|
160
160
|
/** @internal */ headlessLock = false;
|
|
161
161
|
/** @internal */ taskRunId?: string;
|
|
162
162
|
/** @internal */ callSessionId?: string;
|
|
163
|
+
/** @internal */ hostBashProxy?: HostBashProxy;
|
|
164
|
+
/** @internal */ hostFileProxy?: HostFileProxy;
|
|
163
165
|
/** @internal */ readonly queue = new MessageQueue();
|
|
164
166
|
/** @internal */ currentActiveSurfaceId?: string;
|
|
165
167
|
/** @internal */ currentPage?: string;
|
|
@@ -336,7 +338,6 @@ export class Session {
|
|
|
336
338
|
maxInputTokens: config.contextWindow.maxInputTokens,
|
|
337
339
|
thinking: config.thinking,
|
|
338
340
|
effort: config.effort,
|
|
339
|
-
maxToolUseTurns: config.maxToolUseTurns,
|
|
340
341
|
},
|
|
341
342
|
toolDefs.length > 0 ? toolDefs : undefined,
|
|
342
343
|
toolDefs.length > 0 ? toolExecutor : undefined,
|
|
@@ -358,7 +359,15 @@ export class Session {
|
|
|
358
359
|
// ── Lifecycle ────────────────────────────────────────────────────
|
|
359
360
|
|
|
360
361
|
async loadFromDb(): Promise<void> {
|
|
361
|
-
|
|
362
|
+
await loadFromDbImpl(this);
|
|
363
|
+
// Scan loaded history for attachment content blocks so that asset
|
|
364
|
+
// tools are available when resuming a conversation that already had
|
|
365
|
+
// attachments. One-way: once true it stays true for the session.
|
|
366
|
+
// Also picks up the hasAttachments flag set by loadFromDbImpl which
|
|
367
|
+
// scans compacted (sliced-off) messages that aren't in this.messages.
|
|
368
|
+
if (!this.hasAttachments && messagesContainAttachments(this.messages)) {
|
|
369
|
+
this.hasAttachments = true;
|
|
370
|
+
}
|
|
362
371
|
}
|
|
363
372
|
|
|
364
373
|
async ensureActorScopedHistory(): Promise<void> {
|
|
@@ -370,12 +379,17 @@ export class Session {
|
|
|
370
379
|
updateClient(
|
|
371
380
|
sendToClient: (msg: ServerMessage) => void,
|
|
372
381
|
hasNoClient = false,
|
|
382
|
+
opts?: { skipProxySenderUpdate?: boolean },
|
|
373
383
|
): void {
|
|
374
384
|
this.sendToClient = sendToClient;
|
|
375
385
|
this.hasNoClient = hasNoClient;
|
|
376
386
|
this.prompter.updateSender(sendToClient);
|
|
377
387
|
this.secretPrompter.updateSender(sendToClient);
|
|
378
388
|
this.traceEmitter.updateSender(sendToClient);
|
|
389
|
+
if (!opts?.skipProxySenderUpdate) {
|
|
390
|
+
this.hostBashProxy?.updateSender(sendToClient, !hasNoClient);
|
|
391
|
+
this.hostFileProxy?.updateSender(sendToClient, !hasNoClient);
|
|
392
|
+
}
|
|
379
393
|
}
|
|
380
394
|
|
|
381
395
|
/** Returns the current sendToClient reference for identity comparison. */
|
|
@@ -383,6 +397,20 @@ export class Session {
|
|
|
383
397
|
return this.sendToClient;
|
|
384
398
|
}
|
|
385
399
|
|
|
400
|
+
/** Mark host proxies as unavailable so tool execution uses local fallback. */
|
|
401
|
+
clearProxyAvailability(): void {
|
|
402
|
+
this.hostBashProxy?.updateSender(this.sendToClient, false);
|
|
403
|
+
this.hostFileProxy?.updateSender(this.sendToClient, false);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/** Restore host proxy availability based on whether a real client is connected. */
|
|
407
|
+
restoreProxyAvailability(): void {
|
|
408
|
+
if (!this.hasNoClient) {
|
|
409
|
+
this.hostBashProxy?.updateSender(this.sendToClient, true);
|
|
410
|
+
this.hostFileProxy?.updateSender(this.sendToClient, true);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
386
414
|
setSandboxOverride(enabled: boolean | undefined): void {
|
|
387
415
|
this.sandboxOverride = enabled;
|
|
388
416
|
}
|
|
@@ -418,6 +446,8 @@ export class Session {
|
|
|
418
446
|
|
|
419
447
|
dispose(): void {
|
|
420
448
|
approvalOverrides.clearMode(this.conversationId);
|
|
449
|
+
this.hostBashProxy?.dispose();
|
|
450
|
+
this.hostFileProxy?.dispose();
|
|
421
451
|
disposeSession(this);
|
|
422
452
|
}
|
|
423
453
|
|
|
@@ -445,7 +475,7 @@ export class Session {
|
|
|
445
475
|
metadata?: Record<string, unknown>,
|
|
446
476
|
options?: { isInteractive?: boolean },
|
|
447
477
|
displayContent?: string,
|
|
448
|
-
): { queued: boolean; rejected?: boolean
|
|
478
|
+
): { queued: boolean; requestId: string; rejected?: boolean } {
|
|
449
479
|
return enqueueMessageImpl(
|
|
450
480
|
this,
|
|
451
481
|
content,
|
|
@@ -464,10 +494,6 @@ export class Session {
|
|
|
464
494
|
return this.queue.length;
|
|
465
495
|
}
|
|
466
496
|
|
|
467
|
-
getQueueMetrics(): QueueMetrics {
|
|
468
|
-
return this.queue.getMetrics();
|
|
469
|
-
}
|
|
470
|
-
|
|
471
497
|
hasQueuedMessages(): boolean {
|
|
472
498
|
return !this.queue.isEmpty;
|
|
473
499
|
}
|
|
@@ -530,7 +556,7 @@ export class Session {
|
|
|
530
556
|
// guardian trust-class and conversation context are available.
|
|
531
557
|
|
|
532
558
|
// Emit authoritative confirmation state and activity transition centrally
|
|
533
|
-
// so ALL callers (
|
|
559
|
+
// so ALL callers (HTTP handlers, /v1/confirm, channel bridges) get
|
|
534
560
|
// consistent events without duplicating emission logic.
|
|
535
561
|
const resolvedState =
|
|
536
562
|
decision === "deny" || decision === "always_deny"
|
|
@@ -573,6 +599,39 @@ export class Session {
|
|
|
573
599
|
this.secretPrompter.resolveSecret(requestId, value, delivery);
|
|
574
600
|
}
|
|
575
601
|
|
|
602
|
+
resolveHostBash(
|
|
603
|
+
requestId: string,
|
|
604
|
+
response: {
|
|
605
|
+
stdout: string;
|
|
606
|
+
stderr: string;
|
|
607
|
+
exitCode: number | null;
|
|
608
|
+
timedOut: boolean;
|
|
609
|
+
},
|
|
610
|
+
): void {
|
|
611
|
+
this.hostBashProxy?.resolve(requestId, response);
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
setHostBashProxy(proxy: HostBashProxy | undefined): void {
|
|
615
|
+
if (this.hostBashProxy && this.hostBashProxy !== proxy) {
|
|
616
|
+
this.hostBashProxy.dispose();
|
|
617
|
+
}
|
|
618
|
+
this.hostBashProxy = proxy;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
resolveHostFile(
|
|
622
|
+
requestId: string,
|
|
623
|
+
response: { content: string; isError: boolean },
|
|
624
|
+
): void {
|
|
625
|
+
this.hostFileProxy?.resolve(requestId, response);
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
setHostFileProxy(proxy: HostFileProxy | undefined): void {
|
|
629
|
+
if (this.hostFileProxy && this.hostFileProxy !== proxy) {
|
|
630
|
+
this.hostFileProxy.dispose();
|
|
631
|
+
}
|
|
632
|
+
this.hostFileProxy = proxy;
|
|
633
|
+
}
|
|
634
|
+
|
|
576
635
|
// ── Server-authoritative state signals ─────────────────────────────
|
|
577
636
|
|
|
578
637
|
emitConfirmationStateChanged(
|
|
@@ -666,6 +725,11 @@ export class Session {
|
|
|
666
725
|
if (!this.processing) {
|
|
667
726
|
await this.ensureActorScopedHistory();
|
|
668
727
|
}
|
|
728
|
+
// One-way flag: once an attachment arrives, asset tools stay available
|
|
729
|
+
// for the remainder of the session.
|
|
730
|
+
if (!this.hasAttachments && attachments.length > 0) {
|
|
731
|
+
this.hasAttachments = true;
|
|
732
|
+
}
|
|
669
733
|
return persistUserMessageImpl(
|
|
670
734
|
this,
|
|
671
735
|
content,
|
package/src/errors.ts
CHANGED
|
@@ -18,7 +18,6 @@
|
|
|
18
18
|
* ├─ PermissionDeniedError
|
|
19
19
|
* ├─ ConfigError
|
|
20
20
|
* ├─ DaemonError
|
|
21
|
-
* ├─ IpcError
|
|
22
21
|
* ├─ PlatformError
|
|
23
22
|
* ├─ IntegrityError
|
|
24
23
|
* └─ IngressBlockedError
|
|
@@ -32,7 +31,6 @@ export {
|
|
|
32
31
|
ErrorCode,
|
|
33
32
|
IngressBlockedError,
|
|
34
33
|
IntegrityError,
|
|
35
|
-
IpcError,
|
|
36
34
|
PermissionDeniedError,
|
|
37
35
|
PlatformError,
|
|
38
36
|
ProviderError,
|
package/src/export/formatter.ts
CHANGED
|
@@ -51,6 +51,12 @@ function extractText(blocks: ContentBlock[]): string {
|
|
|
51
51
|
parts.push(`[Result: ${truncate(block.content ?? "", 500)}]`);
|
|
52
52
|
}
|
|
53
53
|
break;
|
|
54
|
+
case "server_tool_use":
|
|
55
|
+
parts.push(`[Web search: ${block.name ?? "web_search"}]`);
|
|
56
|
+
break;
|
|
57
|
+
case "web_search_tool_result":
|
|
58
|
+
parts.push("[Web search results]");
|
|
59
|
+
break;
|
|
54
60
|
}
|
|
55
61
|
}
|
|
56
62
|
return parts.join("\n");
|
|
@@ -445,9 +445,7 @@ export async function deleteMcpOAuthCredentials(
|
|
|
445
445
|
{ key: "client_info", result: clientResult },
|
|
446
446
|
{ key: "discovery", result: discoveryResult },
|
|
447
447
|
];
|
|
448
|
-
const errors = results
|
|
449
|
-
.filter((r) => r.result === "error")
|
|
450
|
-
.map((r) => r.key);
|
|
448
|
+
const errors = results.filter((r) => r.result === "error").map((r) => r.key);
|
|
451
449
|
if (errors.length > 0) {
|
|
452
450
|
log.warn(
|
|
453
451
|
{ serverId, failedKeys: errors },
|
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Avatar generation router.
|
|
3
|
+
* Tries managed platform path if available, falls back to local Gemini.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { getConfig } from "../config/loader.js";
|
|
7
7
|
import { ConfigError, ProviderError } from "../util/errors.js";
|
|
8
8
|
import { getLogger } from "../util/logger.js";
|
|
9
|
-
import type {
|
|
10
|
-
AvatarGenerationResult,
|
|
11
|
-
AvatarGenerationStrategy,
|
|
12
|
-
} from "./avatar-types.js";
|
|
9
|
+
import type { AvatarGenerationResult } from "./avatar-types.js";
|
|
13
10
|
import { generateImage } from "./gemini-image-service.js";
|
|
14
11
|
import {
|
|
15
12
|
generateManagedAvatar,
|
|
@@ -18,10 +15,6 @@ import {
|
|
|
18
15
|
|
|
19
16
|
const log = getLogger("avatar-router");
|
|
20
17
|
|
|
21
|
-
export function getAvatarStrategy(): AvatarGenerationStrategy {
|
|
22
|
-
return getConfig().avatar.generationStrategy;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
18
|
async function generateLocal(
|
|
26
19
|
prompt: string,
|
|
27
20
|
correlationId?: string,
|
|
@@ -58,36 +51,35 @@ async function generateLocal(
|
|
|
58
51
|
|
|
59
52
|
export async function routedGenerateAvatar(
|
|
60
53
|
prompt: string,
|
|
61
|
-
options?: { correlationId?: string },
|
|
54
|
+
options?: { correlationId?: string; model?: string },
|
|
62
55
|
): Promise<AvatarGenerationResult> {
|
|
63
|
-
const strategy = getAvatarStrategy();
|
|
64
56
|
const correlationId = options?.correlationId;
|
|
57
|
+
const model = options?.model;
|
|
65
58
|
|
|
66
|
-
if
|
|
67
|
-
const managed = await generateManagedAvatar(prompt, { correlationId });
|
|
68
|
-
return {
|
|
69
|
-
imageBase64: managed.image.data_base64,
|
|
70
|
-
mimeType: managed.image.mime_type,
|
|
71
|
-
pathUsed: "managed",
|
|
72
|
-
correlationId: managed.correlation_id,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
if (strategy === "local_only") {
|
|
77
|
-
return generateLocal(prompt, correlationId);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// managed_prefer: try managed first if available, fall back to local
|
|
59
|
+
// Try managed platform path if available, fall back to local Gemini
|
|
81
60
|
if (isManagedAvailable()) {
|
|
82
61
|
try {
|
|
83
|
-
const managed = await generateManagedAvatar(prompt, {
|
|
62
|
+
const managed = await generateManagedAvatar(prompt, {
|
|
63
|
+
correlationId,
|
|
64
|
+
model,
|
|
65
|
+
});
|
|
84
66
|
return {
|
|
85
67
|
imageBase64: managed.image.data_base64,
|
|
86
68
|
mimeType: managed.image.mime_type,
|
|
87
69
|
pathUsed: "managed",
|
|
88
70
|
correlationId: managed.correlation_id,
|
|
71
|
+
model,
|
|
89
72
|
};
|
|
90
73
|
} catch (err) {
|
|
74
|
+
const config = getConfig();
|
|
75
|
+
const geminiKey = config.apiKeys.gemini ?? process.env.GEMINI_API_KEY;
|
|
76
|
+
if (!geminiKey) {
|
|
77
|
+
log.warn(
|
|
78
|
+
{ err: err instanceof Error ? err.message : String(err) },
|
|
79
|
+
"Managed avatar generation failed and no local Gemini key configured; re-throwing",
|
|
80
|
+
);
|
|
81
|
+
throw err;
|
|
82
|
+
}
|
|
91
83
|
log.warn(
|
|
92
84
|
{ err: err instanceof Error ? err.message : String(err) },
|
|
93
85
|
"Managed avatar generation failed, falling back to local Gemini",
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
export type AvatarGenerationStrategy = "managed_required" | "managed_prefer" | "local_only";
|
|
2
|
-
|
|
3
1
|
export interface ManagedAvatarImagePayload {
|
|
4
2
|
mime_type: string;
|
|
5
3
|
data_base64: string;
|
|
@@ -9,17 +7,6 @@ export interface ManagedAvatarImagePayload {
|
|
|
9
7
|
|
|
10
8
|
export interface ManagedAvatarResponse {
|
|
11
9
|
image: ManagedAvatarImagePayload;
|
|
12
|
-
usage: { billable: boolean; class_name: string };
|
|
13
|
-
generation_source: string;
|
|
14
|
-
profile: string;
|
|
15
|
-
correlation_id: string;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface ManagedAvatarErrorResponse {
|
|
19
|
-
code: string;
|
|
20
|
-
subcode: string;
|
|
21
|
-
detail: string;
|
|
22
|
-
retryable: boolean;
|
|
23
10
|
correlation_id: string;
|
|
24
11
|
}
|
|
25
12
|
|
|
@@ -53,8 +40,14 @@ export interface AvatarGenerationResult {
|
|
|
53
40
|
mimeType: string;
|
|
54
41
|
pathUsed: "managed" | "local";
|
|
55
42
|
correlationId?: string;
|
|
43
|
+
model?: string;
|
|
56
44
|
}
|
|
57
45
|
|
|
58
|
-
export const AVATAR_MIME_ALLOWLIST = new Set([
|
|
46
|
+
export const AVATAR_MIME_ALLOWLIST = new Set([
|
|
47
|
+
"image/png",
|
|
48
|
+
"image/jpeg",
|
|
49
|
+
"image/webp",
|
|
50
|
+
]);
|
|
59
51
|
export const AVATAR_MAX_DECODED_BYTES = 10 * 1024 * 1024;
|
|
60
52
|
export const AVATAR_PROMPT_MAX_LENGTH = 2000;
|
|
53
|
+
export const VERTEX_IMAGE_DEFAULT_MODEL = "imagen-3.0-generate-002";
|