@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
|
@@ -2,14 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
OAuth, messaging adapters, script proxy, and asset-tool architecture.
|
|
4
4
|
|
|
5
|
-
## Integrations — OAuth2 + Unified Messaging
|
|
5
|
+
## Integrations — OAuth2 + Unified Messaging
|
|
6
6
|
|
|
7
7
|
The integration framework lets Vellum connect to third-party services via OAuth2. The architecture follows these principles:
|
|
8
8
|
|
|
9
9
|
- **Secrets never reach the LLM** — OAuth tokens are stored in the credential vault and accessed exclusively through the `TokenManager`, which provides tokens to tool executors via `withValidToken()`. The LLM never sees raw tokens.
|
|
10
|
-
- **PKCE or client_secret flows** — Desktop apps use PKCE by default (S256). Providers that require a client secret (e.g. Slack) pass it during the OAuth2 flow and store it in credential metadata for autonomous refresh.
|
|
10
|
+
- **PKCE or client_secret flows** — Desktop apps use PKCE by default (S256). Providers that require a client secret (e.g. Slack) pass it during the OAuth2 flow and store it in credential metadata for autonomous refresh.
|
|
11
11
|
- **Unified messaging layer** — All messaging platforms implement the `MessagingProvider` interface. Generic tools delegate to the provider, so adding a new platform is just implementing one adapter + an OAuth setup skill.
|
|
12
|
-
- **Standalone integrations** — Not all integrations fit the messaging model. Twitter has its own OAuth2 flow via the shared connect orchestrator, plus a managed mode that routes through the platform proxy. It sits outside the unified messaging layer.
|
|
13
12
|
- **Provider registry** — Messaging providers register at daemon startup. The registry tracks which providers have stored credentials, enabling auto-selection when only one is connected.
|
|
14
13
|
|
|
15
14
|
### Unified Messaging Architecture
|
|
@@ -17,39 +16,67 @@ The integration framework lets Vellum connect to third-party services via OAuth2
|
|
|
17
16
|
```mermaid
|
|
18
17
|
graph TB
|
|
19
18
|
subgraph "Messaging Skill (bundled-skills/messaging/)"
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
DRAFT["messaging_draft"]
|
|
33
|
-
end
|
|
34
|
-
subgraph "Slack-specific Tools"
|
|
35
|
-
REACT["slack_add_reaction"]
|
|
36
|
-
LEAVE["slack_leave_channel"]
|
|
37
|
-
end
|
|
38
|
-
subgraph "Gmail-specific Tools"
|
|
39
|
-
ARCHIVE["gmail_archive"]
|
|
40
|
-
LABEL["gmail_label"]
|
|
41
|
-
TRASH["gmail_trash"]
|
|
42
|
-
UNSUB["gmail_unsubscribe"]
|
|
43
|
-
GMAIL_DRAFT["gmail_draft"]
|
|
44
|
-
end
|
|
19
|
+
MSG_SKILL_MD["SKILL.md<br/>agent instructions"]
|
|
20
|
+
MSG_TOOLS_JSON["TOOLS.json<br/>tool manifest"]
|
|
21
|
+
AUTH_TEST["messaging_auth_test"]
|
|
22
|
+
LIST["messaging_list_conversations"]
|
|
23
|
+
READ["messaging_read"]
|
|
24
|
+
SEARCH["messaging_search"]
|
|
25
|
+
SEND["messaging_send (+ reply via thread_id)"]
|
|
26
|
+
MARK_READ["messaging_mark_read"]
|
|
27
|
+
STYLE["messaging_analyze_style"]
|
|
28
|
+
DRAFT["messaging_draft"]
|
|
29
|
+
SENDER_DIGEST["messaging_sender_digest"]
|
|
30
|
+
ARCHIVE_BY_SENDER["messaging_archive_by_sender"]
|
|
45
31
|
SHARED["shared.ts<br/>resolveProvider + withProviderToken"]
|
|
46
32
|
end
|
|
47
33
|
|
|
34
|
+
subgraph "Gmail Skill (bundled-skills/gmail/)"
|
|
35
|
+
GMAIL_SKILL_MD["SKILL.md<br/>agent instructions"]
|
|
36
|
+
GMAIL_ARCHIVE["gmail_archive"]
|
|
37
|
+
GMAIL_LABEL["gmail_label"]
|
|
38
|
+
GMAIL_TRASH["gmail_trash"]
|
|
39
|
+
GMAIL_UNSUB["gmail_unsubscribe"]
|
|
40
|
+
GMAIL_DRAFT["gmail_draft"]
|
|
41
|
+
GMAIL_SEND_DRAFT["gmail_send_draft"]
|
|
42
|
+
GMAIL_ATTACHMENTS["gmail_attachments"]
|
|
43
|
+
GMAIL_FORWARD["gmail_forward"]
|
|
44
|
+
GMAIL_FOLLOW_UP["gmail_follow_up"]
|
|
45
|
+
GMAIL_FILTERS["gmail_filters"]
|
|
46
|
+
GMAIL_VACATION["gmail_vacation"]
|
|
47
|
+
GMAIL_SENDER_DIGEST["gmail_sender_digest"]
|
|
48
|
+
GMAIL_OUTREACH["gmail_outreach_scan"]
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
subgraph "Slack Skill (bundled-skills/slack/)"
|
|
52
|
+
SLACK_SKILL_MD["SKILL.md<br/>agent instructions"]
|
|
53
|
+
SLACK_SCAN["slack_scan_digest"]
|
|
54
|
+
SLACK_DETAILS["slack_channel_details"]
|
|
55
|
+
SLACK_CONFIGURE["slack_configure_channels"]
|
|
56
|
+
SLACK_REACT["slack_add_reaction"]
|
|
57
|
+
SLACK_DELETE["slack_delete_message"]
|
|
58
|
+
SLACK_EDIT["slack_edit_message"]
|
|
59
|
+
SLACK_LEAVE["slack_leave_channel"]
|
|
60
|
+
SLACK_PERMS["slack_channel_permissions"]
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
subgraph "Sequences Skill (bundled-skills/sequences/)"
|
|
64
|
+
SEQ_SKILL_MD["SKILL.md<br/>agent instructions"]
|
|
65
|
+
SEQ_CREATE["sequence_create"]
|
|
66
|
+
SEQ_LIST["sequence_list"]
|
|
67
|
+
SEQ_GET["sequence_get"]
|
|
68
|
+
SEQ_UPDATE["sequence_update"]
|
|
69
|
+
SEQ_DELETE["sequence_delete"]
|
|
70
|
+
SEQ_ENROLL["sequence_enroll"]
|
|
71
|
+
SEQ_ENROLLMENT_LIST["sequence_enrollment_list"]
|
|
72
|
+
SEQ_IMPORT["sequence_import"]
|
|
73
|
+
SEQ_ANALYTICS["sequence_analytics"]
|
|
74
|
+
end
|
|
75
|
+
|
|
48
76
|
subgraph "Messaging Layer (messaging/)"
|
|
49
77
|
PROVIDER_IF["MessagingProvider interface"]
|
|
50
78
|
REGISTRY["Provider Registry"]
|
|
51
79
|
TYPES["Platform-agnostic types<br/>Conversation, Message, SearchResult"]
|
|
52
|
-
ACTIVITY_ANALYZER["Activity Analyzer"]
|
|
53
80
|
STYLE_ANALYZER["Style Analyzer"]
|
|
54
81
|
DRAFT_STORE["Draft Store"]
|
|
55
82
|
end
|
|
@@ -78,10 +105,9 @@ graph TB
|
|
|
78
105
|
LIST --> SHARED
|
|
79
106
|
SEARCH --> SHARED
|
|
80
107
|
SEND --> SHARED
|
|
81
|
-
REACT --> SLACK_ADAPTER
|
|
82
|
-
ARCHIVE --> GMAIL_ADAPTER
|
|
83
|
-
ACTIVITY --> ACTIVITY_ANALYZER
|
|
84
108
|
STYLE --> STYLE_ANALYZER
|
|
109
|
+
GMAIL_ARCHIVE --> GMAIL_ADAPTER
|
|
110
|
+
SLACK_REACT --> SLACK_ADAPTER
|
|
85
111
|
```
|
|
86
112
|
|
|
87
113
|
### Data Flow
|
|
@@ -89,7 +115,7 @@ graph TB
|
|
|
89
115
|
```mermaid
|
|
90
116
|
sequenceDiagram
|
|
91
117
|
participant UI as Settings UI (Swift)
|
|
92
|
-
participant
|
|
118
|
+
participant HTTP as HTTP Transport
|
|
93
119
|
participant Handler as Daemon Handlers
|
|
94
120
|
participant Registry as IntegrationRegistry
|
|
95
121
|
participant OAuth as OAuth2 PKCE Flow
|
|
@@ -101,15 +127,15 @@ sequenceDiagram
|
|
|
101
127
|
participant API as Gmail REST API
|
|
102
128
|
|
|
103
129
|
Note over UI,API: Connection Flow
|
|
104
|
-
UI->>
|
|
105
|
-
|
|
130
|
+
UI->>HTTP: integration_connect {integrationId: "gmail"}
|
|
131
|
+
HTTP->>Handler: dispatch
|
|
106
132
|
Handler->>Registry: getIntegration("gmail")
|
|
107
133
|
Registry-->>Handler: IntegrationDefinition
|
|
108
134
|
Handler->>OAuth: startOAuth2Flow(config)
|
|
109
135
|
OAuth->>OAuth: generate code_verifier + code_challenge (S256)
|
|
110
136
|
OAuth->>OAuth: start Bun.serve on random port
|
|
111
|
-
OAuth->>
|
|
112
|
-
|
|
137
|
+
OAuth->>HTTP: open_url (Google consent URL)
|
|
138
|
+
HTTP->>Browser: open URL
|
|
113
139
|
Browser->>Google: user authorizes
|
|
114
140
|
Google->>OAuth: callback with auth code
|
|
115
141
|
OAuth->>Google: exchange code + code_verifier for tokens
|
|
@@ -117,8 +143,8 @@ sequenceDiagram
|
|
|
117
143
|
OAuth->>Vault: setSecureKey (access + refresh)
|
|
118
144
|
OAuth->>Vault: upsertCredentialMetadata (allowedTools, expiresAt)
|
|
119
145
|
OAuth-->>Handler: success + account email
|
|
120
|
-
Handler->>
|
|
121
|
-
|
|
146
|
+
Handler->>HTTP: integration_connect_result {success, accountInfo}
|
|
147
|
+
HTTP->>UI: show connected state
|
|
122
148
|
|
|
123
149
|
Note over UI,API: Tool Execution Flow
|
|
124
150
|
Tool->>TokenMgr: withValidToken("gmail", callback)
|
|
@@ -137,167 +163,46 @@ sequenceDiagram
|
|
|
137
163
|
end
|
|
138
164
|
```
|
|
139
165
|
|
|
140
|
-
### Twitter Integration Architecture
|
|
141
|
-
|
|
142
|
-
Twitter uses a standalone OAuth2 flow separate from the unified messaging layer. It supports a two-mode operation architecture determined by the `twitter.integrationMode` config field: **managed** mode routes all API calls through the Vellum platform proxy (which holds the OAuth credentials), while **OAuth** mode uses locally-stored OAuth2 tokens to call X API v2 directly. A mode router (`router.ts`) selects the appropriate path based on the caller-provided mode.
|
|
143
|
-
|
|
144
|
-
#### Twitter OAuth2 Flow
|
|
145
|
-
|
|
146
|
-
Twitter's OAuth2 flow delegates to the shared **connect orchestrator** (`oauth/connect-orchestrator.ts`). The Twitter provider profile in the registry defines auth/token URLs, default scopes, and an identity verifier. The daemon handler (`daemon/handlers/oauth-connect.ts`) resolves credentials from the keychain using canonical names (`client_id`, `client_secret`), then calls `orchestrateOAuthConnect()`.
|
|
147
|
-
|
|
148
|
-
```mermaid
|
|
149
|
-
sequenceDiagram
|
|
150
|
-
participant UI as Settings UI (Swift)
|
|
151
|
-
participant IPC as IPC Socket
|
|
152
|
-
participant Handler as oauth-connect handler
|
|
153
|
-
participant Orchestrator as ConnectOrchestrator
|
|
154
|
-
participant ScopePolicy as Scope Policy
|
|
155
|
-
participant OAuth as OAuth2 PKCE Flow
|
|
156
|
-
participant Browser as System Browser
|
|
157
|
-
participant Twitter as Twitter OAuth Server
|
|
158
|
-
participant Vault as Credential Vault
|
|
159
|
-
participant API as X API (v2)
|
|
160
|
-
|
|
161
|
-
Note over UI,API: Connection Flow (via generic orchestrator)
|
|
162
|
-
UI->>IPC: oauth_connect_start {service: "twitter"}
|
|
163
|
-
IPC->>Handler: dispatch
|
|
164
|
-
Handler->>Handler: resolve client_id / client_secret from keychain
|
|
165
|
-
Handler->>Orchestrator: orchestrateOAuthConnect(options)
|
|
166
|
-
Orchestrator->>Orchestrator: resolveService("twitter") → "integration:twitter"
|
|
167
|
-
Orchestrator->>Orchestrator: getProviderProfile("integration:twitter")
|
|
168
|
-
Orchestrator->>ScopePolicy: resolveScopes(profile, requestedScopes)
|
|
169
|
-
ScopePolicy-->>Orchestrator: {ok: true, scopes}
|
|
170
|
-
Orchestrator->>OAuth: startOAuth2Flow(config)
|
|
171
|
-
OAuth->>OAuth: generate code_verifier + code_challenge (S256)
|
|
172
|
-
OAuth->>IPC: open_url (twitter.com/i/oauth2/authorize)
|
|
173
|
-
IPC->>Browser: open URL
|
|
174
|
-
Browser->>Twitter: user authorizes
|
|
175
|
-
Twitter->>OAuth: callback with auth code
|
|
176
|
-
OAuth->>Twitter: exchange code + code_verifier at api.x.com/2/oauth2/token
|
|
177
|
-
Twitter-->>OAuth: access + refresh tokens
|
|
178
|
-
OAuth-->>Orchestrator: tokens + grantedScopes
|
|
179
|
-
Orchestrator->>API: identityVerifier → GET /2/users/me
|
|
180
|
-
API-->>Orchestrator: username
|
|
181
|
-
Orchestrator->>Vault: storeOAuth2Tokens (access + refresh + metadata)
|
|
182
|
-
Orchestrator-->>Handler: {success, grantedScopes, accountInfo: "@username"}
|
|
183
|
-
Handler->>IPC: oauth_connect_result {success, accountInfo}
|
|
184
|
-
IPC->>UI: show connected state
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
#### Two-Mode Operation Architecture
|
|
188
|
-
|
|
189
|
-
The mode router (`router.ts`) determines whether to use the managed or OAuth path for each operation. The mode is determined by the `twitter.integrationMode` config field: `"managed"` routes through the platform proxy, everything else uses OAuth directly.
|
|
190
|
-
|
|
191
|
-
```mermaid
|
|
192
|
-
flowchart TD
|
|
193
|
-
CLI["assistant x post / reply / timeline / search"] --> Router["Mode Router (router.ts)"]
|
|
194
|
-
Router --> ModeCheck{Integration mode?}
|
|
195
|
-
|
|
196
|
-
ModeCheck -->|managed| ManagedPath["Platform Proxy Client (platform-proxy-client.ts)"]
|
|
197
|
-
ManagedPath --> PlatformAPI["Platform → X API v2"]
|
|
198
|
-
|
|
199
|
-
ModeCheck -->|oauth| OAuthPath["OAuth Client (oauth-client.ts)"]
|
|
200
|
-
OAuthPath --> XAPI["X API v2 POST /tweets"]
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
- **`managed`**: Routes all API calls through the Vellum platform proxy. The platform holds the OAuth credentials and forwards requests on behalf of the assistant. Supports both write operations (post, reply) and read operations (timeline, tweet detail, search, user lookup). This is the default when the user has a managed assistant.
|
|
204
|
-
- **`oauth`**: Uses locally-stored OAuth2 Bearer tokens to call X API v2 directly. Supports only write operations (post, reply). Read operations throw an error directing the user to use managed mode.
|
|
205
|
-
|
|
206
|
-
#### Twitter OAuth2 Specifics
|
|
207
|
-
|
|
208
|
-
| Aspect | Detail |
|
|
209
|
-
| --------------------- | ------------------------------------------------------------------------------------------ |
|
|
210
|
-
| Auth URL | `https://twitter.com/i/oauth2/authorize` (from provider profile) |
|
|
211
|
-
| Token URL | `https://api.x.com/2/oauth2/token` (from provider profile) |
|
|
212
|
-
| Flow | PKCE (S256), optional client secret, via connect orchestrator |
|
|
213
|
-
| Default scopes | `tweet.read`, `tweet.write`, `users.read`, `offline.access` (from provider profile) |
|
|
214
|
-
| Identity verification | Provider profile `identityVerifier` → `GET https://api.x.com/2/users/me` with Bearer token |
|
|
215
|
-
| Credential names | `client_id`, `client_secret` |
|
|
216
|
-
| HTTP endpoints | `oauth_connect_start` / `oauth_connect_result` (generic) |
|
|
217
|
-
|
|
218
|
-
#### Twitter Credential Metadata Structure
|
|
219
|
-
|
|
220
|
-
When the OAuth2 flow completes, the handler stores credential metadata at `integration:twitter` / `access_token`:
|
|
221
|
-
|
|
222
|
-
```
|
|
223
|
-
{
|
|
224
|
-
accountInfo: "@username",
|
|
225
|
-
allowedTools: ["twitter_post"],
|
|
226
|
-
allowedDomains: [],
|
|
227
|
-
oauth2TokenUrl: "https://api.x.com/2/oauth2/token",
|
|
228
|
-
oauth2ClientId: "<user's client ID>",
|
|
229
|
-
oauth2ClientSecret: "<optional>",
|
|
230
|
-
grantedScopes: ["tweet.read", "tweet.write", "users.read", "offline.access"],
|
|
231
|
-
expiresAt: <epoch ms>
|
|
232
|
-
}
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
#### Twitter Operation Paths
|
|
236
|
-
|
|
237
|
-
**Managed path** (`platform-proxy-client.ts`): Routes API calls through the Vellum platform proxy at `${platformBaseUrl}/api/v1/assistants/${assistantId}/integrations/twitter/proxy/*`. The platform holds the OAuth credentials and forwards requests to X API v2 on behalf of the assistant. Supports all operations: post, reply, user lookup, user tweets, tweet detail, and search. Errors from the proxy surface as `TwitterProxyError` with structured error codes and retryability hints.
|
|
238
|
-
|
|
239
|
-
**OAuth path** (`oauth-client.ts`): The `oauthPostTweet` function calls X API v2 (`POST https://api.x.com/2/tweets`) with a Bearer token provided by the caller. Supports `post` and `reply` (by including `reply.in_reply_to_tweet_id` in the request body). Read operations are not supported via this path and will throw an error directing the user to use managed mode.
|
|
240
|
-
|
|
241
|
-
#### Available Twitter Tools
|
|
242
|
-
|
|
243
|
-
| Tool / Command | Mechanism | Description |
|
|
244
|
-
| ---------------------- | ------------------------------ | ------------------------------------------------------------------------------------------ |
|
|
245
|
-
| `assistant x post` | Mode router (OAuth or managed) | Post a tweet. Defaults to OAuth; pass `--managed` to route through the platform proxy. |
|
|
246
|
-
| `assistant x reply` | Mode router (OAuth or managed) | Reply to a tweet. Defaults to OAuth; pass `--managed` to route through the platform proxy. |
|
|
247
|
-
| `assistant x timeline` | Managed only | Fetch a user's recent tweets. Resolves screen name to user ID, then fetches timeline. |
|
|
248
|
-
| `assistant x tweet` | Managed only | Fetch a single tweet and its reply thread via conversation ID search. |
|
|
249
|
-
| `assistant x search` | Managed only | Search tweets. Supports `Top`, `Latest`, `People`, and `Media` product types. |
|
|
250
|
-
| `assistant x status` | HTTP (daemon) | Check OAuth connection and managed mode availability. |
|
|
251
|
-
|
|
252
|
-
Note: Write operations (post, reply) support both OAuth and managed modes. Read operations (timeline, tweet, search) require managed mode because the OAuth path only supports `post` and `reply`.
|
|
253
|
-
|
|
254
166
|
### Key Design Decisions
|
|
255
167
|
|
|
256
|
-
| Decision
|
|
257
|
-
|
|
|
258
|
-
| PKCE by default, optional client_secret
|
|
259
|
-
| Shared connect orchestrator
|
|
260
|
-
| Canonical credential naming
|
|
261
|
-
| Gateway callback transport
|
|
262
|
-
| Unified `MessagingProvider` interface
|
|
263
|
-
|
|
|
264
|
-
|
|
|
265
|
-
|
|
|
266
|
-
|
|
|
267
|
-
|
|
|
268
|
-
| Platform-specific extension tools | Operations unique to one platform (e.g. Gmail labels, Slack reactions) are separate tools, not forced into the generic interface |
|
|
269
|
-
| Twitter identity verification before token storage | OAuth2 tokens are only persisted after a successful `GET /2/users/me` call, preventing storage of invalid or mismatched credentials |
|
|
168
|
+
| Decision | Rationale |
|
|
169
|
+
| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
170
|
+
| PKCE by default, optional client_secret | Desktop apps prefer PKCE; some providers (Slack) require a secret, which is stored in credential metadata for autonomous refresh |
|
|
171
|
+
| Shared connect orchestrator | All OAuth providers route through `orchestrateOAuthConnect()`, which resolves profiles, enforces scope policy, runs the flow, stores tokens, and verifies identity. Adding a provider is a declarative profile entry, not new orchestration code |
|
|
172
|
+
| Canonical credential naming | All reads and writes use `client_id`/`client_secret` as canonical field names |
|
|
173
|
+
| Gateway callback transport | OAuth callbacks are now routed through the gateway at `${ingress.publicBaseUrl}/webhooks/oauth/callback` instead of a loopback redirect URI. This enables OAuth flows to work in remote and tunneled deployments. |
|
|
174
|
+
| Unified `MessagingProvider` interface | All platforms implement the same contract; generic tools work immediately for new providers |
|
|
175
|
+
| Provider auto-selection | If only one provider is connected, tools skip the `platform` parameter — seamless single-platform UX |
|
|
176
|
+
| Token expiry in credential metadata | Reuses existing `CredentialMetadata` store; `expiresAt` field enables proactive refresh with 5min buffer |
|
|
177
|
+
| Confidence scores on medium-risk tools | LLM self-reports confidence (0-1); enables future trust calibration without blocking execution |
|
|
178
|
+
| Platform-specific extension tools | Operations unique to one platform (e.g. Gmail labels, Slack reactions) are separate tools, not forced into the generic interface |
|
|
179
|
+
| Identity verification before token storage | OAuth2 tokens are only persisted after a successful identity verification call, preventing storage of invalid or mismatched credentials |
|
|
270
180
|
|
|
271
181
|
### Source Files
|
|
272
182
|
|
|
273
|
-
| File
|
|
274
|
-
|
|
|
275
|
-
| `assistant/src/security/oauth2.ts`
|
|
276
|
-
| `assistant/src/security/token-manager.ts`
|
|
277
|
-
| `assistant/src/messaging/provider.ts`
|
|
278
|
-
| `assistant/src/messaging/provider-types.ts`
|
|
279
|
-
| `assistant/src/messaging/registry.ts`
|
|
280
|
-
| `assistant/src/messaging/
|
|
281
|
-
| `assistant/src/messaging/
|
|
282
|
-
| `assistant/src/messaging/
|
|
283
|
-
| `assistant/src/messaging/providers/
|
|
284
|
-
| `assistant/src/
|
|
285
|
-
| `assistant/src/config/bundled-skills/
|
|
286
|
-
| `assistant/src/
|
|
287
|
-
| `assistant/src/watcher/providers/
|
|
288
|
-
| `assistant/src/watcher/providers/
|
|
289
|
-
| `assistant/src/
|
|
290
|
-
| `assistant/src/oauth/
|
|
291
|
-
| `assistant/src/oauth/
|
|
292
|
-
| `assistant/src/oauth/
|
|
293
|
-
| `assistant/src/oauth/
|
|
294
|
-
| `assistant/src/
|
|
295
|
-
| `assistant/src/
|
|
296
|
-
| `assistant/src/cli/commands/twitter/router.ts` | Mode router: selects managed or OAuth path based on caller-provided `TwitterMode` |
|
|
297
|
-
| `assistant/src/cli/commands/twitter/types.ts` | Shared types: `PostTweetResult`, `UserInfo`, `TweetEntry`, `NotificationEntry` |
|
|
298
|
-
| `assistant/src/cli/commands/twitter/index.ts` | `assistant x` CLI command group (post, reply, timeline, tweet, search, status) |
|
|
299
|
-
| `assistant/src/twitter/platform-proxy-client.ts` | Platform-managed Twitter proxy client: routes API calls through the Vellum platform |
|
|
300
|
-
| `assistant/src/config/bundled-skills/twitter/SKILL.md` | X (Twitter) bundled skill instructions |
|
|
183
|
+
| File | Role |
|
|
184
|
+
| ------------------------------------------------ | -------------------------------------------------------------------------------------------------- |
|
|
185
|
+
| `assistant/src/security/oauth2.ts` | OAuth2 flow: PKCE or client_secret, Bun.serve callback, token exchange |
|
|
186
|
+
| `assistant/src/security/token-manager.ts` | `withValidToken()` — auto-refresh, 401 retry, expiry buffer |
|
|
187
|
+
| `assistant/src/messaging/provider.ts` | `MessagingProvider` interface |
|
|
188
|
+
| `assistant/src/messaging/provider-types.ts` | Platform-agnostic types (Conversation, Message, SearchResult) |
|
|
189
|
+
| `assistant/src/messaging/registry.ts` | Provider registry: register, lookup, list connected |
|
|
190
|
+
| `assistant/src/messaging/style-analyzer.ts` | Writing style extraction from message corpus |
|
|
191
|
+
| `assistant/src/messaging/draft-store.ts` | Local draft storage (platform/id JSON files) |
|
|
192
|
+
| `assistant/src/messaging/providers/slack/` | Slack adapter, client, types |
|
|
193
|
+
| `assistant/src/messaging/providers/gmail/` | Gmail adapter, client, types |
|
|
194
|
+
| `assistant/src/config/bundled-skills/messaging/` | Core messaging skill (send, read, search, reply across platforms) |
|
|
195
|
+
| `assistant/src/config/bundled-skills/gmail/` | Gmail management skill (archive, label, triage, declutter) |
|
|
196
|
+
| `assistant/src/config/bundled-skills/sequences/` | Email sequence management skill (drip campaigns, enrollment, analytics) |
|
|
197
|
+
| `assistant/src/watcher/providers/gmail.ts` | Gmail watcher using History API |
|
|
198
|
+
| `assistant/src/watcher/providers/github.ts` | GitHub watcher for PRs, issues, review requests, and mentions |
|
|
199
|
+
| `assistant/src/watcher/providers/linear.ts` | Linear watcher for assigned issues, status changes, and @mentions |
|
|
200
|
+
| `assistant/src/oauth/provider-profiles.ts` | Provider profile registry: auth URLs, token URLs, scopes, policies, identity verifiers |
|
|
201
|
+
| `assistant/src/oauth/connect-orchestrator.ts` | Shared OAuth connect orchestrator: profile resolution, scope policy, flow execution, token storage |
|
|
202
|
+
| `assistant/src/oauth/scope-policy.ts` | Deterministic scope resolution and policy enforcement |
|
|
203
|
+
| `assistant/src/oauth/connect-types.ts` | Shared types: `OAuthProviderProfile`, `OAuthScopePolicy`, `OAuthConnectResult` |
|
|
204
|
+
| `assistant/src/oauth/token-persistence.ts` | Token storage helper: persists tokens, metadata, and runs post-connect hooks |
|
|
205
|
+
| `assistant/src/daemon/handlers/oauth-connect.ts` | Generic OAuth connect handler (`oauth_connect_start` / `oauth_connect_result`) |
|
|
301
206
|
|
|
302
207
|
---
|
|
303
208
|
|
|
@@ -319,7 +224,7 @@ The OAuth extensibility layer makes adding a new OAuth provider a declarative op
|
|
|
319
224
|
| `setup` | Optional metadata for the generic OAuth setup skill (display name, dashboard URL, app type) |
|
|
320
225
|
| `injectionTemplates` | Auto-applied credential injection rules for the script proxy |
|
|
321
226
|
|
|
322
|
-
Registered providers: `integration:gmail`, `integration:slack`, `integration:notion
|
|
227
|
+
Registered providers: `integration:gmail`, `integration:slack`, `integration:notion`. Short aliases (e.g. `gmail`, `slack`) are resolved via `SERVICE_ALIASES`.
|
|
323
228
|
|
|
324
229
|
### Scope Policy Engine
|
|
325
230
|
|
|
@@ -348,7 +253,7 @@ Returns `{ ok: true, scopes }` or `{ ok: false, error, allowedScopes }`.
|
|
|
348
253
|
|
|
349
254
|
Result is a discriminated union: `{ success, deferred, grantedScopes, accountInfo }` or `{ success: false, error }`.
|
|
350
255
|
|
|
351
|
-
### Generic Daemon
|
|
256
|
+
### Generic Daemon HTTP API
|
|
352
257
|
|
|
353
258
|
`assistant/src/daemon/handlers/oauth-connect.ts` handles `oauth_connect_start` messages. The handler:
|
|
354
259
|
|
|
@@ -61,7 +61,7 @@ graph LR
|
|
|
61
61
|
| `assistant/src/security/secure-keys.ts` | Unified API surface. Sync variants use encrypted store only. Async variants (`getSecureKeyAsync`, `setSecureKeyAsync`, `deleteSecureKeyAsync`) try broker first. **Reads** fall back to the encrypted store when the broker is unavailable or key is not found. **Writes** return `false` on broker failure (no encrypted-store fallback). **Deletes** return `"deleted"`, `"not-found"`, or `"error"` to let callers distinguish idempotent no-ops from real failures. |
|
|
62
62
|
| `gateway/src/credential-reader.ts` | Read-only credential reader. Tries broker via native async UDS connection (`node:net`), falls back to encrypted store. All public credential read functions are async. |
|
|
63
63
|
|
|
64
|
-
##
|
|
64
|
+
## Message Contract
|
|
65
65
|
|
|
66
66
|
### Transport
|
|
67
67
|
|
|
@@ -7,7 +7,7 @@ Assistant memory and context-injection architecture details.
|
|
|
7
7
|
```mermaid
|
|
8
8
|
graph TB
|
|
9
9
|
subgraph "Write Path"
|
|
10
|
-
MSG_IN["Incoming Message<br/>(
|
|
10
|
+
MSG_IN["Incoming Message<br/>(HTTP)"]
|
|
11
11
|
STORE["ConversationStore.addMessage()<br/>Drizzle ORM → SQLite"]
|
|
12
12
|
INDEX["Memory Indexer"]
|
|
13
13
|
SEGMENT["Split into segments<br/>→ memory_segments"]
|
|
@@ -242,7 +242,7 @@ Two trust gates enforce trust-class-based access control over the memory pipelin
|
|
|
242
242
|
|
|
243
243
|
- **Read gate** (`session-memory.ts`): When the current session's actor is untrusted, the memory recall pipeline returns a no-op context — no recall injection, no dynamic profile, no conflict resolution. This ensures untrusted actors cannot surface or exploit previously extracted memory.
|
|
244
244
|
|
|
245
|
-
Trust policy is **cross-channel and trust-class-based**: decisions use `trustContext.trustClass`, not the channel string. Desktop
|
|
245
|
+
Trust policy is **cross-channel and trust-class-based**: decisions use `trustContext.trustClass`, not the channel string. Desktop sessions default to `trustClass: 'guardian'`. External channels (Telegram, SMS, WhatsApp, phone) provide explicit trust context via the resolver. Messages without provenance metadata are treated as trusted (guardian); all new messages carry provenance.
|
|
246
246
|
|
|
247
247
|
---
|
|
248
248
|
|
|
@@ -104,7 +104,7 @@ One reminder creates one notification signal. The routing intent on that single
|
|
|
104
104
|
|
|
105
105
|
Channel availability is resolved when the signal is emitted (not when the reminder is created):
|
|
106
106
|
|
|
107
|
-
- **Vellum** — always connected (local
|
|
107
|
+
- **Vellum** — always connected (local HTTP)
|
|
108
108
|
- **Telegram** — connected when an active guardian binding exists
|
|
109
109
|
- **SMS** — connected when an active guardian binding exists
|
|
110
110
|
|
|
@@ -179,7 +179,7 @@ File tool candidates include canonical (symlink-resolved) absolute paths via `no
|
|
|
179
179
|
| `assistant/src/permissions/checker.ts` | `classifyRisk()`, `check()`, `buildCommandCandidates()`, allowlist/scope generation |
|
|
180
180
|
| `assistant/src/permissions/shell-identity.ts` | `analyzeShellCommand()`, `deriveShellActionKeys()`, `buildShellCommandCandidates()`, `buildShellAllowlistOptions()` — parser-based shell command identity and action key derivation |
|
|
181
181
|
| `assistant/src/permissions/trust-store.ts` | Rule persistence, `findHighestPriorityRule()`, execution-target matching, starter bundle |
|
|
182
|
-
| `assistant/src/permissions/prompter.ts` |
|
|
182
|
+
| `assistant/src/permissions/prompter.ts` | HTTP prompt flow: `confirmation_request` → `confirmation_response` |
|
|
183
183
|
| `assistant/src/permissions/defaults.ts` | Default rule templates (system ask rules for host tools, CU, etc.) |
|
|
184
184
|
| `assistant/src/skills/version-hash.ts` | `computeSkillVersionHash()` — deterministic SHA-256 of skill source files |
|
|
185
185
|
| `assistant/src/skills/path-classifier.ts` | `isSkillSourcePath()`, `normalizeFilePath()`, skill root detection |
|
|
@@ -220,30 +220,30 @@ sequenceDiagram
|
|
|
220
220
|
participant Model as LLM
|
|
221
221
|
participant Vault as credential_store tool
|
|
222
222
|
participant Prompter as SecretPrompter
|
|
223
|
-
participant
|
|
223
|
+
participant HTTP as HTTP Transport
|
|
224
224
|
participant UI as SecretPromptManager (Swift)
|
|
225
225
|
participant Keychain as macOS Keychain
|
|
226
226
|
|
|
227
227
|
Model->>Vault: action: "prompt", service, field, label
|
|
228
228
|
Vault->>Prompter: requestSecret(service, field, label, ...)
|
|
229
|
-
Prompter->>
|
|
230
|
-
|
|
229
|
+
Prompter->>HTTP: secret_request {requestId, service, field, label, allowOneTimeSend}
|
|
230
|
+
HTTP->>UI: Show SecretPromptView (floating panel)
|
|
231
231
|
UI->>UI: User enters value in SecureField
|
|
232
232
|
alt Store (default)
|
|
233
|
-
UI->>
|
|
234
|
-
|
|
233
|
+
UI->>HTTP: secret_response {requestId, value, delivery: "store"}
|
|
234
|
+
HTTP->>Prompter: resolve(value, "store")
|
|
235
235
|
Prompter->>Vault: {value, delivery: "store"}
|
|
236
236
|
Vault->>Keychain: setSecureKey("credential:svc:field", value)
|
|
237
237
|
Vault->>Model: "Credential stored securely" (no value in output)
|
|
238
238
|
else One-Time Send (if enabled)
|
|
239
|
-
UI->>
|
|
240
|
-
|
|
239
|
+
UI->>HTTP: secret_response {requestId, value, delivery: "transient_send"}
|
|
240
|
+
HTTP->>Prompter: resolve(value, "transient_send")
|
|
241
241
|
Prompter->>Vault: {value, delivery: "transient_send"}
|
|
242
242
|
Note over Vault: Hands value to CredentialBroker<br/>for single-use consumption
|
|
243
243
|
Vault->>Model: "One-time credential provided" (no value in output)
|
|
244
244
|
else Cancel
|
|
245
|
-
UI->>
|
|
246
|
-
|
|
245
|
+
UI->>HTTP: secret_response {requestId, value: null}
|
|
246
|
+
HTTP->>Prompter: resolve(null)
|
|
247
247
|
Prompter->>Vault: null
|
|
248
248
|
Vault->>Model: "User cancelled"
|
|
249
249
|
end
|
|
@@ -303,7 +303,7 @@ The `allowOneTimeSend` config gate (default: `false`) enables a secondary "Send
|
|
|
303
303
|
| `assistant/src/tools/credentials/metadata-store.ts` | JSON file metadata CRUD for credential records |
|
|
304
304
|
| `assistant/src/tools/credentials/broker.ts` | Brokered credential access with policy enforcement and transient send |
|
|
305
305
|
| `assistant/src/tools/credentials/policy-validate.ts` | Policy input validation (allowedTools, allowedDomains) |
|
|
306
|
-
| `assistant/src/permissions/secret-prompter.ts` |
|
|
306
|
+
| `assistant/src/permissions/secret-prompter.ts` | HTTP secret_request/secret_response flow |
|
|
307
307
|
| `assistant/src/security/secret-scanner.ts` | Regex + entropy-based secret detection |
|
|
308
308
|
| `assistant/src/security/secret-ingress.ts` | Inbound message secret blocking |
|
|
309
309
|
| `clients/macos/.../SecretPromptManager.swift` | Floating panel UI for secure credential entry |
|
package/docs/error-handling.md
CHANGED
|
@@ -21,7 +21,7 @@ throw new ConfigError("Missing required provider configuration");
|
|
|
21
21
|
// Good: subagent manager throws when depth limit is exceeded
|
|
22
22
|
throw new AssistantError(
|
|
23
23
|
"Cannot spawn subagent: parent is itself a subagent",
|
|
24
|
-
ErrorCode.DAEMON_ERROR
|
|
24
|
+
ErrorCode.DAEMON_ERROR,
|
|
25
25
|
);
|
|
26
26
|
```
|
|
27
27
|
|
|
@@ -31,7 +31,7 @@ Design doc defining how unknown users gain access to a Vellum assistant via chan
|
|
|
31
31
|
|
|
32
32
|
This ensures unknown inbound access attempts always trigger guardian notification, even when the requester's source channel has no guardian binding.
|
|
33
33
|
|
|
34
|
-
4. **Guardian approves the request.** The guardian responds to the notification (via Telegram inline button, macOS app, or
|
|
34
|
+
4. **Guardian approves the request.** The guardian responds to the notification (via Telegram inline button, macOS app, or local app). On approval, the assistant creates a verification session via `createOutboundSession()` and generates a 6-digit verification code.
|
|
35
35
|
5. **Guardian receives the verification code.** The assistant delivers the code to the guardian's verified channel (Telegram chat, SMS, etc.).
|
|
36
36
|
6. **Guardian gives the code to the requester out-of-band** (in person, text message, phone call, etc.). This out-of-band transfer is the trust anchor: it proves the requester has a real-world relationship with the guardian.
|
|
37
37
|
7. **Requester enters the code** back to the assistant on the same channel. The inbound message handler intercepts bare 6-digit codes when a pending verification session exists for that channel.
|
|
@@ -162,7 +162,7 @@ sequenceDiagram
|
|
|
162
162
|
Note over G: Guardian sees access request<br/>with requester identity
|
|
163
163
|
|
|
164
164
|
alt Guardian approves
|
|
165
|
-
G->>A: Approve (inline button /
|
|
165
|
+
G->>A: Approve (inline button / HTTP / plain text)
|
|
166
166
|
A->>A: resolveApprovalRequest(id, 'approved')
|
|
167
167
|
A->>A: createOutboundSession(bound to requester identity)
|
|
168
168
|
A-->>G: "Approved. Verification code: 847293.<br/>Give this to the requester."
|
|
@@ -182,7 +182,7 @@ sequenceDiagram
|
|
|
182
182
|
A->>A: Process message normally
|
|
183
183
|
|
|
184
184
|
else Guardian denies
|
|
185
|
-
G->>A: Deny (inline button /
|
|
185
|
+
G->>A: Deny (inline button / HTTP / plain text)
|
|
186
186
|
A->>A: resolveApprovalRequest(id, 'denied')
|
|
187
187
|
A-->>U: (No notification — user only knows<br/>they were denied if they message again)
|
|
188
188
|
|