@vellumai/assistant 0.4.46 → 0.4.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +7 -7
- package/README.md +2 -23
- package/docs/architecture/integrations.md +45 -41
- package/docs/architecture/keychain-broker.md +3 -3
- package/docs/architecture/security.md +5 -5
- package/docs/runbook-trusted-contacts.md +3 -8
- package/hook-templates/debug-prompt-logger/hook.json +1 -1
- package/hook-templates/debug-prompt-logger/run.sh +1 -3
- package/package.json +1 -1
- package/src/__tests__/actor-token-service.test.ts +0 -1
- package/src/__tests__/anthropic-provider.test.ts +156 -0
- package/src/__tests__/approval-cascade.test.ts +810 -0
- package/src/__tests__/approval-primitive.test.ts +0 -1
- package/src/__tests__/approval-routes-http.test.ts +2 -0
- package/src/__tests__/assistant-attachments.test.ts +12 -34
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +76 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +0 -1
- package/src/__tests__/browser-fill-credential.test.ts +5 -2
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +2 -2
- package/src/__tests__/bundled-skill-retrieval-guard.test.ts +2 -1
- package/src/__tests__/channel-guardian.test.ts +0 -2
- package/src/__tests__/channel-readiness-routes.test.ts +35 -25
- package/src/__tests__/channel-readiness-service.test.ts +10 -9
- package/src/__tests__/checker.test.ts +9 -29
- package/src/__tests__/cli.test.ts +23 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +1 -1
- package/src/__tests__/computer-use-tools.test.ts +2 -19
- package/src/__tests__/config-watcher.test.ts +0 -1
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/context-image-dimensions.test.ts +332 -0
- package/src/__tests__/context-token-estimator.test.ts +196 -13
- package/src/__tests__/conversation-attention-store.test.ts +0 -1
- package/src/__tests__/conversation-attention-telegram.test.ts +0 -1
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +144 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
- package/src/__tests__/credential-broker-browser-fill.test.ts +23 -22
- package/src/__tests__/credential-broker-server-use.test.ts +22 -21
- package/src/__tests__/credential-broker.test.ts +2 -1
- package/src/__tests__/credential-metadata-store.test.ts +239 -26
- package/src/__tests__/credential-resolve.test.ts +5 -4
- package/src/__tests__/credential-security-e2e.test.ts +8 -8
- package/src/__tests__/credential-security-invariants.test.ts +111 -7
- package/src/__tests__/credential-vault-unit.test.ts +287 -54
- package/src/__tests__/credential-vault.test.ts +406 -12
- package/src/__tests__/credentials-cli.test.ts +82 -6
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/ephemeral-permissions.test.ts +3 -3
- package/src/__tests__/gateway-only-enforcement.test.ts +4 -2
- package/src/__tests__/gateway-only-guard.test.ts +0 -1
- package/src/__tests__/gemini-image-service.test.ts +75 -45
- package/src/__tests__/gemini-provider.test.ts +9 -6
- package/src/__tests__/guardian-action-conversation-turn.test.ts +1 -33
- package/src/__tests__/guardian-action-copy-generator.test.ts +0 -20
- package/src/__tests__/guardian-action-followup-executor.test.ts +1 -28
- package/src/__tests__/guardian-action-followup-store.test.ts +1 -1
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
- package/src/__tests__/guardian-grant-minting.test.ts +35 -0
- package/src/__tests__/guardian-routing-invariants.test.ts +0 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -39
- package/src/__tests__/heartbeat-service.test.ts +0 -1
- package/src/__tests__/host-cu-proxy.test.ts +629 -0
- package/src/__tests__/host-shell-tool.test.ts +27 -15
- package/src/__tests__/http-user-message-parity.test.ts +1 -0
- package/src/__tests__/ingress-url-consistency.test.ts +14 -21
- package/src/__tests__/integration-status.test.ts +38 -25
- package/src/__tests__/intent-routing.test.ts +0 -1
- package/src/__tests__/invite-routes-http.test.ts +10 -9
- package/src/__tests__/keychain-broker-client.test.ts +11 -43
- package/src/__tests__/managed-proxy-context.test.ts +5 -3
- package/src/__tests__/media-generate-image.test.ts +63 -2
- package/src/__tests__/media-reuse-story.e2e.test.ts +7 -3
- package/src/__tests__/messaging-send-tool.test.ts +4 -6
- package/src/__tests__/notification-routing-intent.test.ts +0 -1
- package/src/__tests__/oauth-cli.test.ts +373 -14
- package/src/__tests__/oauth-provider-profiles.test.ts +9 -9
- package/src/__tests__/oauth-scope-policy.test.ts +4 -6
- package/src/__tests__/oauth-store.test.ts +756 -0
- package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
- package/src/__tests__/provider-error-scenarios.test.ts +0 -1
- package/src/__tests__/provider-fail-open-selection.test.ts +3 -1
- package/src/__tests__/provider-managed-proxy-integration.test.ts +70 -6
- package/src/__tests__/provider-streaming.benchmark.test.ts +0 -1
- package/src/__tests__/public-ingress-urls.test.ts +15 -21
- package/src/__tests__/recording-handler.test.ts +3 -4
- package/src/__tests__/registry.test.ts +2 -2
- package/src/__tests__/runtime-events-sse.test.ts +55 -7
- package/src/__tests__/schedule-store.test.ts +0 -1
- package/src/__tests__/scheduler-recurrence.test.ts +0 -1
- package/src/__tests__/schema-transforms.test.ts +226 -0
- package/src/__tests__/scoped-approval-grants.test.ts +0 -1
- package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
- package/src/__tests__/script-proxy-injection-runtime.test.ts +23 -13
- package/src/__tests__/script-proxy-policy-runtime.test.ts +1 -1
- package/src/__tests__/script-proxy-session-manager.test.ts +1 -1
- package/src/__tests__/secret-ingress-handler.test.ts +0 -1
- package/src/__tests__/secret-onetime-send.test.ts +5 -3
- package/src/__tests__/send-endpoint-busy.test.ts +21 -6
- package/src/__tests__/sequence-store.test.ts +0 -1
- package/src/__tests__/session-init.benchmark.test.ts +4 -5
- package/src/__tests__/session-messaging-secret-redirect.test.ts +5 -4
- package/src/__tests__/skill-include-graph.test.ts +66 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +0 -1
- package/src/__tests__/skill-load-tool.test.ts +149 -1
- package/src/__tests__/skill-projection-feature-flag.test.ts +0 -1
- package/src/__tests__/skills-uninstall.test.ts +3 -3
- package/src/__tests__/skills.test.ts +3 -12
- package/src/__tests__/slack-channel-config.test.ts +76 -11
- package/src/__tests__/slack-share-routes.test.ts +17 -14
- package/src/__tests__/system-prompt.test.ts +0 -1
- package/src/__tests__/telegram-bot-username-resolution.test.ts +3 -0
- package/src/__tests__/telegram-invite-adapter.test.ts +18 -22
- package/src/__tests__/terminal-tools.test.ts +4 -3
- package/src/__tests__/test-support/computer-use-skill-harness.ts +3 -2
- package/src/__tests__/tool-approval-handler.test.ts +0 -1
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
- package/src/__tests__/tool-executor-shell-integration.test.ts +0 -1
- package/src/__tests__/tool-executor.test.ts +0 -1
- package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
- package/src/__tests__/trust-store-pattern-matches.test.ts +29 -0
- package/src/__tests__/trust-store.test.ts +1 -22
- 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__/twilio-config.test.ts +2 -1
- package/src/__tests__/twilio-provider.test.ts +4 -2
- package/src/__tests__/twilio-routes.test.ts +5 -20
- package/src/__tests__/verification-control-plane-policy.test.ts +0 -1
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
- package/src/agent/ax-tree-compaction.test.ts +235 -0
- package/src/agent/loop.ts +76 -130
- package/src/calls/call-domain.ts +8 -10
- package/src/calls/relay-server.ts +9 -13
- package/src/calls/twilio-config.ts +4 -8
- package/src/calls/twilio-provider.ts +2 -1
- package/src/calls/twilio-rest.ts +2 -1
- package/src/calls/twilio-routes.ts +1 -2
- package/src/calls/voice-ingress-preflight.ts +1 -1
- package/src/cli/commands/browser-relay.ts +46 -15
- package/src/cli/commands/completions.ts +0 -3
- package/src/cli/commands/credentials.ts +110 -23
- package/src/cli/commands/oauth/apps.ts +255 -0
- package/src/cli/commands/oauth/connections.ts +299 -0
- package/src/cli/commands/oauth/index.ts +52 -0
- package/src/cli/commands/oauth/providers.ts +242 -0
- package/src/cli/commands/skills.ts +4 -338
- package/src/cli/program.ts +1 -5
- package/src/cli/reference.ts +1 -3
- package/src/cli.ts +3 -2
- package/src/config/assistant-feature-flags.ts +0 -3
- package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +1 -1
- package/src/config/bundled-skills/claude-code/TOOLS.json +0 -4
- package/src/config/bundled-skills/computer-use/SKILL.md +3 -6
- package/src/config/bundled-skills/computer-use/TOOLS.json +22 -4
- package/src/config/bundled-skills/contacts/tools/google-contacts.ts +29 -32
- package/src/config/bundled-skills/gmail/SKILL.md +4 -4
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +54 -61
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +25 -28
- package/src/config/bundled-skills/gmail/tools/gmail-draft.ts +14 -17
- package/src/config/bundled-skills/gmail/tools/gmail-filters.ts +39 -44
- package/src/config/bundled-skills/gmail/tools/gmail-follow-up.ts +61 -58
- package/src/config/bundled-skills/gmail/tools/gmail-forward.ts +50 -49
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +11 -13
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +148 -146
- package/src/config/bundled-skills/gmail/tools/gmail-send-draft.ts +4 -7
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +175 -173
- package/src/config/bundled-skills/gmail/tools/gmail-trash.ts +4 -7
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +71 -76
- package/src/config/bundled-skills/gmail/tools/gmail-vacation.ts +32 -38
- package/src/config/bundled-skills/google-calendar/SKILL.md +2 -2
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +90 -44
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +9 -10
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +5 -6
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +4 -5
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +14 -15
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +37 -37
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +4 -9
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +24 -3
- package/src/config/bundled-skills/messaging/SKILL.md +6 -6
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +62 -63
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +15 -16
- package/src/config/bundled-skills/messaging/tools/messaging-auth-test.ts +4 -5
- package/src/config/bundled-skills/messaging/tools/messaging-list-conversations.ts +6 -7
- package/src/config/bundled-skills/messaging/tools/messaging-mark-read.ts +4 -5
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +14 -15
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +4 -5
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +128 -128
- package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +33 -34
- package/src/config/bundled-skills/messaging/tools/shared.ts +12 -15
- package/src/config/bundled-skills/settings/SKILL.md +1 -1
- package/src/config/bundled-skills/settings/TOOLS.json +2 -8
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +5 -33
- package/src/config/bundled-skills/slack/tools/shared.ts +4 -10
- package/src/config/bundled-skills/slack/tools/slack-add-reaction.ts +4 -5
- package/src/config/bundled-skills/slack/tools/slack-channel-details.ts +15 -16
- package/src/config/bundled-skills/slack/tools/slack-delete-message.ts +4 -5
- package/src/config/bundled-skills/slack/tools/slack-edit-message.ts +4 -5
- package/src/config/bundled-skills/slack/tools/slack-leave-channel.ts +4 -5
- package/src/config/bundled-skills/slack/tools/slack-scan-digest.ts +95 -92
- package/src/config/env-registry.ts +14 -83
- package/src/config/env.ts +11 -50
- package/src/config/feature-flag-registry.json +16 -16
- package/src/config/schema.ts +3 -1
- package/src/config/skills.ts +21 -2
- package/src/context/image-dimensions.ts +229 -0
- package/src/context/token-estimator.ts +75 -12
- package/src/context/window-manager.ts +49 -10
- package/src/daemon/assistant-attachments.ts +1 -13
- package/src/daemon/guardian-action-generators.ts +4 -5
- package/src/daemon/handlers/config-ingress.ts +8 -33
- package/src/daemon/handlers/config-slack-channel.ts +76 -56
- package/src/daemon/handlers/config-telegram.ts +53 -24
- package/src/daemon/handlers/sessions.ts +10 -24
- package/src/daemon/handlers/shared.ts +0 -130
- package/src/daemon/host-cu-proxy.ts +401 -0
- package/src/daemon/lifecycle.ts +39 -63
- package/src/daemon/message-protocol.ts +3 -0
- package/src/daemon/message-types/computer-use.ts +2 -119
- package/src/daemon/message-types/host-cu.ts +19 -0
- package/src/daemon/message-types/integrations.ts +1 -0
- package/src/daemon/message-types/messages.ts +3 -0
- package/src/daemon/server.ts +14 -21
- package/src/daemon/session-agent-loop-handlers.ts +2 -0
- package/src/daemon/session-attachments.ts +1 -2
- package/src/daemon/session-messaging.ts +3 -1
- package/src/daemon/session-slash.ts +1 -1
- package/src/daemon/session-surfaces.ts +40 -28
- package/src/daemon/session-tool-setup.ts +20 -11
- package/src/daemon/session.ts +139 -16
- package/src/daemon/tool-side-effects.ts +2 -8
- package/src/daemon/watch-handler.ts +2 -2
- package/src/email/providers/index.ts +2 -1
- package/src/events/tool-metrics-listener.ts +2 -2
- package/src/hooks/manager.ts +1 -4
- package/src/inbound/public-ingress-urls.ts +7 -7
- package/src/instrument.ts +15 -1
- package/src/logfire.ts +16 -5
- package/src/media/app-icon-generator.ts +30 -4
- package/src/media/avatar-router.ts +26 -3
- package/src/media/gemini-image-service.ts +28 -2
- package/src/memory/conversation-key-store.ts +21 -0
- package/src/memory/db-init.ts +4 -0
- package/src/memory/guardian-action-store.ts +1 -1
- package/src/memory/migrations/149-oauth-tables.ts +60 -0
- package/src/memory/migrations/index.ts +1 -0
- package/src/memory/schema/guardian.ts +1 -1
- package/src/memory/schema/index.ts +1 -0
- package/src/memory/schema/oauth.ts +65 -0
- package/src/messaging/provider.ts +19 -13
- package/src/messaging/providers/gmail/adapter.ts +40 -23
- package/src/messaging/providers/gmail/client.ts +283 -122
- package/src/messaging/providers/gmail/people-client.ts +32 -24
- package/src/messaging/providers/slack/adapter.ts +29 -19
- package/src/messaging/providers/slack/client.ts +265 -78
- package/src/messaging/providers/telegram-bot/adapter.ts +19 -18
- package/src/messaging/providers/whatsapp/adapter.ts +17 -11
- package/src/messaging/registry.ts +2 -31
- package/src/notifications/copy-composer.ts +0 -5
- package/src/notifications/signal.ts +4 -5
- package/src/oauth/byo-connection.test.ts +537 -0
- package/src/oauth/byo-connection.ts +128 -0
- package/src/oauth/connect-orchestrator.ts +139 -56
- package/src/oauth/connect-types.ts +17 -23
- package/src/oauth/connection-resolver.ts +58 -0
- package/src/oauth/connection.ts +38 -0
- package/src/oauth/manual-token-connection.ts +104 -0
- package/src/oauth/oauth-store.ts +496 -0
- package/src/oauth/platform-connection.test.ts +192 -0
- package/src/oauth/platform-connection.ts +111 -0
- package/src/oauth/provider-behaviors.ts +124 -0
- package/src/oauth/scope-policy.ts +9 -2
- package/src/oauth/seed-providers.ts +161 -0
- package/src/oauth/token-persistence.ts +74 -78
- package/src/permissions/checker.ts +8 -4
- package/src/permissions/defaults.ts +0 -1
- package/src/permissions/prompter.ts +10 -1
- package/src/permissions/trust-store.ts +13 -0
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +3 -1
- package/src/prompts/system-prompt.ts +70 -45
- package/src/providers/anthropic/client.ts +133 -24
- package/src/providers/gemini/client.ts +15 -6
- package/src/providers/managed-proxy/constants.ts +2 -2
- package/src/providers/managed-proxy/context.ts +5 -1
- package/src/providers/ratelimit.ts +17 -0
- package/src/providers/registry.ts +2 -2
- package/src/providers/retry.ts +1 -27
- package/src/runtime/AGENTS.md +17 -0
- package/src/runtime/auth/route-policy.ts +0 -3
- package/src/runtime/channel-invite-transports/telegram.ts +2 -1
- package/src/runtime/channel-readiness-service.ts +168 -195
- package/src/runtime/channel-readiness-types.ts +4 -0
- package/src/runtime/channel-reply-delivery.ts +0 -40
- package/src/runtime/gateway-client.ts +0 -7
- package/src/runtime/guardian-action-conversation-turn.ts +1 -3
- package/src/runtime/guardian-action-followup-executor.ts +1 -1
- package/src/runtime/guardian-action-message-composer.ts +3 -23
- package/src/runtime/http-server.ts +17 -10
- package/src/runtime/http-types.ts +2 -3
- package/src/runtime/middleware/rate-limiter.ts +74 -20
- package/src/runtime/middleware/twilio-validation.ts +1 -11
- package/src/runtime/pending-interactions.ts +14 -12
- package/src/runtime/routes/channel-delivery-routes.ts +0 -1
- package/src/runtime/routes/channel-readiness-routes.ts +2 -0
- package/src/runtime/routes/conversation-routes.ts +73 -19
- package/src/runtime/routes/diagnostics-routes.ts +11 -9
- package/src/runtime/routes/events-routes.ts +21 -11
- package/src/runtime/routes/guardian-approval-interception.ts +20 -5
- package/src/runtime/routes/host-cu-routes.ts +97 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +12 -111
- package/src/runtime/routes/integrations/slack/share.ts +6 -6
- package/src/runtime/routes/integrations/twilio.ts +6 -5
- package/src/runtime/routes/log-export-routes.ts +126 -8
- package/src/runtime/routes/secret-routes.ts +3 -2
- package/src/runtime/routes/settings-routes.ts +113 -48
- package/src/runtime/routes/surface-action-routes.ts +1 -1
- package/src/runtime/routes/watch-routes.ts +128 -0
- package/src/schedule/integration-status.ts +10 -8
- package/src/security/credential-key.ts +14 -0
- package/src/security/keychain-broker-client.ts +5 -6
- package/src/security/oauth2.ts +1 -1
- package/src/security/token-manager.ts +145 -43
- package/src/skills/catalog-install.ts +358 -0
- package/src/skills/include-graph.ts +32 -0
- package/src/telegram/bot-username.ts +2 -3
- package/src/tools/apps/definitions.ts +0 -5
- package/src/tools/assets/materialize.ts +0 -5
- package/src/tools/assets/search.ts +0 -5
- package/src/tools/browser/headless-browser.ts +1 -67
- package/src/tools/browser/network-recorder.ts +1 -1
- package/src/tools/browser/network-recording-types.ts +1 -1
- package/src/tools/claude-code/claude-code.ts +0 -5
- package/src/tools/computer-use/definitions.ts +46 -11
- package/src/tools/computer-use/registry.ts +4 -5
- package/src/tools/credentials/broker.ts +5 -4
- package/src/tools/credentials/metadata-store.ts +22 -74
- package/src/tools/credentials/resolve.ts +2 -1
- package/src/tools/credentials/vault.ts +139 -151
- package/src/tools/filesystem/edit.ts +1 -6
- package/src/tools/filesystem/read.ts +0 -5
- package/src/tools/filesystem/write.ts +1 -6
- package/src/tools/host-filesystem/edit.ts +1 -6
- package/src/tools/host-filesystem/read.ts +1 -6
- package/src/tools/host-filesystem/write.ts +1 -6
- package/src/tools/mcp/mcp-tool-factory.ts +18 -1
- package/src/tools/memory/definitions.ts +0 -5
- package/src/tools/network/web-fetch.ts +0 -5
- package/src/tools/network/web-search.ts +0 -5
- package/src/tools/registry.ts +2 -7
- package/src/tools/schema-transforms.ts +99 -0
- package/src/tools/skills/load.ts +62 -8
- package/src/tools/swarm/delegate.ts +0 -5
- package/src/tools/system/avatar-generator.ts +0 -5
- package/src/tools/ui-surface/definitions.ts +0 -15
- package/src/tools/watch/screen-watch.ts +0 -5
- package/src/tools/watch/watch-state.ts +0 -12
- package/src/util/logger.ts +7 -41
- package/src/util/platform.ts +9 -28
- package/src/version.ts +10 -0
- package/src/watcher/providers/github.ts +51 -52
- package/src/watcher/providers/gmail.ts +88 -80
- package/src/watcher/providers/google-calendar.ts +94 -86
- package/src/watcher/providers/linear.ts +87 -93
- package/src/__tests__/computer-use-session-compaction.test.ts +0 -143
- package/src/__tests__/computer-use-session-lifecycle.test.ts +0 -322
- package/src/__tests__/computer-use-session-working-dir.test.ts +0 -166
- package/src/__tests__/computer-use-skill-baseline.test.ts +0 -78
- package/src/__tests__/computer-use-skill-endstate.test.ts +0 -105
- package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +0 -249
- package/src/__tests__/ride-shotgun-handler.test.ts +0 -452
- package/src/cli/commands/dev.ts +0 -129
- package/src/cli/commands/map.ts +0 -391
- package/src/cli/commands/oauth.ts +0 -77
- package/src/config/bundled-skills/computer-use/tools/computer-use-request-control.ts +0 -16
- package/src/daemon/computer-use-session.ts +0 -1020
- package/src/daemon/ride-shotgun-handler.ts +0 -567
- package/src/oauth/provider-profiles.ts +0 -192
- package/src/prompts/computer-use-prompt.ts +0 -98
- package/src/runtime/routes/computer-use-routes.ts +0 -641
- package/src/runtime/telegram-streaming-delivery.test.ts +0 -597
- package/src/runtime/telegram-streaming-delivery.ts +0 -383
- package/src/tools/computer-use/request-computer-control.ts +0 -61
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { DrizzleDb } from "../db-connection.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* OAuth provider, app, and connection tables.
|
|
5
|
+
* Creates tables in FK-dependency order: providers → apps → connections.
|
|
6
|
+
*/
|
|
7
|
+
export function createOAuthTables(database: DrizzleDb): void {
|
|
8
|
+
database.run(/*sql*/ `
|
|
9
|
+
CREATE TABLE IF NOT EXISTS oauth_providers (
|
|
10
|
+
provider_key TEXT PRIMARY KEY,
|
|
11
|
+
auth_url TEXT NOT NULL,
|
|
12
|
+
token_url TEXT NOT NULL,
|
|
13
|
+
token_endpoint_auth_method TEXT,
|
|
14
|
+
userinfo_url TEXT,
|
|
15
|
+
base_url TEXT,
|
|
16
|
+
default_scopes TEXT NOT NULL DEFAULT '[]',
|
|
17
|
+
scope_policy TEXT NOT NULL DEFAULT '{}',
|
|
18
|
+
extra_params TEXT,
|
|
19
|
+
callback_transport TEXT,
|
|
20
|
+
loopback_port INTEGER,
|
|
21
|
+
created_at INTEGER NOT NULL,
|
|
22
|
+
updated_at INTEGER NOT NULL
|
|
23
|
+
)
|
|
24
|
+
`);
|
|
25
|
+
|
|
26
|
+
database.run(/*sql*/ `
|
|
27
|
+
CREATE TABLE IF NOT EXISTS oauth_apps (
|
|
28
|
+
id TEXT PRIMARY KEY,
|
|
29
|
+
provider_key TEXT NOT NULL REFERENCES oauth_providers(provider_key),
|
|
30
|
+
client_id TEXT NOT NULL,
|
|
31
|
+
created_at INTEGER NOT NULL,
|
|
32
|
+
updated_at INTEGER NOT NULL
|
|
33
|
+
)
|
|
34
|
+
`);
|
|
35
|
+
|
|
36
|
+
database.run(/*sql*/ `
|
|
37
|
+
CREATE TABLE IF NOT EXISTS oauth_connections (
|
|
38
|
+
id TEXT PRIMARY KEY,
|
|
39
|
+
oauth_app_id TEXT NOT NULL REFERENCES oauth_apps(id),
|
|
40
|
+
provider_key TEXT NOT NULL,
|
|
41
|
+
account_info TEXT,
|
|
42
|
+
granted_scopes TEXT NOT NULL DEFAULT '[]',
|
|
43
|
+
expires_at INTEGER,
|
|
44
|
+
has_refresh_token INTEGER NOT NULL DEFAULT 0,
|
|
45
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
46
|
+
label TEXT,
|
|
47
|
+
metadata TEXT,
|
|
48
|
+
created_at INTEGER NOT NULL,
|
|
49
|
+
updated_at INTEGER NOT NULL
|
|
50
|
+
)
|
|
51
|
+
`);
|
|
52
|
+
|
|
53
|
+
database.run(
|
|
54
|
+
/*sql*/ `CREATE UNIQUE INDEX IF NOT EXISTS idx_oauth_apps_provider_client ON oauth_apps(provider_key, client_id)`,
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
database.run(
|
|
58
|
+
/*sql*/ `CREATE INDEX IF NOT EXISTS idx_oauth_connections_provider_key ON oauth_connections(provider_key)`,
|
|
59
|
+
);
|
|
60
|
+
}
|
|
@@ -90,6 +90,7 @@ export { migrateDropAccountsTable } from "./145-drop-accounts-table.js";
|
|
|
90
90
|
export { migrateScheduleOneShotRouting } from "./146-schedule-oneshot-routing.js";
|
|
91
91
|
export { migrateRemindersToSchedules } from "./147-migrate-reminders-to-schedules.js";
|
|
92
92
|
export { migrateDropRemindersTable } from "./148-drop-reminders-table.js";
|
|
93
|
+
export { createOAuthTables } from "./149-oauth-tables.js";
|
|
93
94
|
export {
|
|
94
95
|
MIGRATION_REGISTRY,
|
|
95
96
|
type MigrationRegistryEntry,
|
|
@@ -27,7 +27,7 @@ export const guardianActionRequests = sqliteTable(
|
|
|
27
27
|
followupState: text("followup_state").notNull().default("none"), // none | awaiting_guardian_choice | dispatching | completed | declined | failed
|
|
28
28
|
lateAnswerText: text("late_answer_text"),
|
|
29
29
|
lateAnsweredAt: integer("late_answered_at"),
|
|
30
|
-
followupAction: text("followup_action"), // call_back |
|
|
30
|
+
followupAction: text("followup_action"), // call_back | decline
|
|
31
31
|
followupCompletedAt: integer("followup_completed_at"),
|
|
32
32
|
toolName: text("tool_name"), // tool identity for tool-approval requests
|
|
33
33
|
inputDigest: text("input_digest"), // canonical SHA-256 digest of tool input
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import {
|
|
2
|
+
index,
|
|
3
|
+
integer,
|
|
4
|
+
sqliteTable,
|
|
5
|
+
text,
|
|
6
|
+
uniqueIndex,
|
|
7
|
+
} from "drizzle-orm/sqlite-core";
|
|
8
|
+
|
|
9
|
+
export const oauthProviders = sqliteTable("oauth_providers", {
|
|
10
|
+
providerKey: text("provider_key").primaryKey(),
|
|
11
|
+
authUrl: text("auth_url").notNull(),
|
|
12
|
+
tokenUrl: text("token_url").notNull(),
|
|
13
|
+
tokenEndpointAuthMethod: text("token_endpoint_auth_method"),
|
|
14
|
+
userinfoUrl: text("userinfo_url"),
|
|
15
|
+
baseUrl: text("base_url"),
|
|
16
|
+
defaultScopes: text("default_scopes").notNull().default("[]"),
|
|
17
|
+
scopePolicy: text("scope_policy").notNull().default("{}"),
|
|
18
|
+
extraParams: text("extra_params"),
|
|
19
|
+
callbackTransport: text("callback_transport"),
|
|
20
|
+
loopbackPort: integer("loopback_port"),
|
|
21
|
+
createdAt: integer("created_at").notNull(),
|
|
22
|
+
updatedAt: integer("updated_at").notNull(),
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
export const oauthApps = sqliteTable(
|
|
26
|
+
"oauth_apps",
|
|
27
|
+
{
|
|
28
|
+
id: text("id").primaryKey(),
|
|
29
|
+
providerKey: text("provider_key")
|
|
30
|
+
.notNull()
|
|
31
|
+
.references(() => oauthProviders.providerKey),
|
|
32
|
+
clientId: text("client_id").notNull(),
|
|
33
|
+
createdAt: integer("created_at").notNull(),
|
|
34
|
+
updatedAt: integer("updated_at").notNull(),
|
|
35
|
+
},
|
|
36
|
+
(table) => [
|
|
37
|
+
uniqueIndex("idx_oauth_apps_provider_client").on(
|
|
38
|
+
table.providerKey,
|
|
39
|
+
table.clientId,
|
|
40
|
+
),
|
|
41
|
+
],
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
export const oauthConnections = sqliteTable(
|
|
45
|
+
"oauth_connections",
|
|
46
|
+
{
|
|
47
|
+
id: text("id").primaryKey(),
|
|
48
|
+
oauthAppId: text("oauth_app_id")
|
|
49
|
+
.notNull()
|
|
50
|
+
.references(() => oauthApps.id),
|
|
51
|
+
providerKey: text("provider_key").notNull(),
|
|
52
|
+
accountInfo: text("account_info"),
|
|
53
|
+
grantedScopes: text("granted_scopes").notNull().default("[]"),
|
|
54
|
+
expiresAt: integer("expires_at"),
|
|
55
|
+
hasRefreshToken: integer("has_refresh_token").notNull().default(0),
|
|
56
|
+
status: text("status").notNull().default("active"),
|
|
57
|
+
label: text("label"),
|
|
58
|
+
metadata: text("metadata"),
|
|
59
|
+
createdAt: integer("created_at").notNull(),
|
|
60
|
+
updatedAt: integer("updated_at").notNull(),
|
|
61
|
+
},
|
|
62
|
+
(table) => [
|
|
63
|
+
index("idx_oauth_connections_provider_key").on(table.providerKey),
|
|
64
|
+
],
|
|
65
|
+
);
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* implementing one adapter file + an OAuth setup skill.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import type { OAuthConnection } from "../oauth/connection.js";
|
|
8
9
|
import type {
|
|
9
10
|
ArchiveResult,
|
|
10
11
|
ConnectionInfo,
|
|
@@ -29,23 +30,25 @@ export interface MessagingProvider {
|
|
|
29
30
|
|
|
30
31
|
// ── Universal operations (every platform must implement) ──────────
|
|
31
32
|
|
|
32
|
-
testConnection(
|
|
33
|
+
testConnection(
|
|
34
|
+
connectionOrToken: OAuthConnection | string,
|
|
35
|
+
): Promise<ConnectionInfo>;
|
|
33
36
|
listConversations(
|
|
34
|
-
|
|
37
|
+
connectionOrToken: OAuthConnection | string,
|
|
35
38
|
options?: ListOptions,
|
|
36
39
|
): Promise<Conversation[]>;
|
|
37
40
|
getHistory(
|
|
38
|
-
|
|
41
|
+
connectionOrToken: OAuthConnection | string,
|
|
39
42
|
conversationId: string,
|
|
40
43
|
options?: HistoryOptions,
|
|
41
44
|
): Promise<Message[]>;
|
|
42
45
|
search(
|
|
43
|
-
|
|
46
|
+
connectionOrToken: OAuthConnection | string,
|
|
44
47
|
query: string,
|
|
45
48
|
options?: SearchOptions,
|
|
46
49
|
): Promise<SearchResult>;
|
|
47
50
|
sendMessage(
|
|
48
|
-
|
|
51
|
+
connectionOrToken: OAuthConnection | string,
|
|
49
52
|
conversationId: string,
|
|
50
53
|
text: string,
|
|
51
54
|
options?: SendOptions,
|
|
@@ -54,32 +57,35 @@ export interface MessagingProvider {
|
|
|
54
57
|
// ── Optional operations (platforms implement what they support) ───
|
|
55
58
|
|
|
56
59
|
getThreadReplies?(
|
|
57
|
-
|
|
60
|
+
connectionOrToken: OAuthConnection | string,
|
|
58
61
|
conversationId: string,
|
|
59
62
|
threadId: string,
|
|
60
63
|
options?: HistoryOptions,
|
|
61
64
|
): Promise<Message[]>;
|
|
62
65
|
markRead?(
|
|
63
|
-
|
|
66
|
+
connectionOrToken: OAuthConnection | string,
|
|
64
67
|
conversationId: string,
|
|
65
68
|
messageId?: string,
|
|
66
69
|
): Promise<void>;
|
|
67
70
|
|
|
68
71
|
/** Scan messages and group by sender for bulk cleanup (e.g. newsletter decluttering). */
|
|
69
72
|
senderDigest?(
|
|
70
|
-
|
|
73
|
+
connectionOrToken: OAuthConnection | string,
|
|
71
74
|
query: string,
|
|
72
75
|
options?: { maxMessages?: number; maxSenders?: number; pageToken?: string },
|
|
73
76
|
): Promise<SenderDigestResult>;
|
|
74
77
|
/** Archive messages matching a search query. */
|
|
75
|
-
archiveByQuery?(
|
|
78
|
+
archiveByQuery?(
|
|
79
|
+
connectionOrToken: OAuthConnection | string,
|
|
80
|
+
query: string,
|
|
81
|
+
): Promise<ArchiveResult>;
|
|
76
82
|
|
|
77
83
|
/**
|
|
78
84
|
* Override the default credential check used by getConnectedProviders().
|
|
79
|
-
* When present, the registry calls this instead of
|
|
80
|
-
*
|
|
81
|
-
* that don't use OAuth (e.g. Telegram bot tokens stored
|
|
82
|
-
* non-standard key).
|
|
85
|
+
* When present, the registry calls this instead of checking for an
|
|
86
|
+
* active oauth-store connection via isProviderConnected(). Useful
|
|
87
|
+
* for providers that don't use OAuth (e.g. Telegram bot tokens stored
|
|
88
|
+
* under a non-standard key).
|
|
83
89
|
*/
|
|
84
90
|
isConnected?(): boolean;
|
|
85
91
|
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* and implements the MessagingProvider interface.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import type { OAuthConnection } from "../../../oauth/connection.js";
|
|
8
9
|
import type { MessagingProvider } from "../../provider.js";
|
|
9
10
|
import type {
|
|
10
11
|
ArchiveResult,
|
|
@@ -94,8 +95,11 @@ export const gmailMessagingProvider: MessagingProvider = {
|
|
|
94
95
|
"unsubscribe",
|
|
95
96
|
]),
|
|
96
97
|
|
|
97
|
-
async testConnection(
|
|
98
|
-
|
|
98
|
+
async testConnection(
|
|
99
|
+
connectionOrToken: OAuthConnection | string,
|
|
100
|
+
): Promise<ConnectionInfo> {
|
|
101
|
+
const connection = connectionOrToken as OAuthConnection;
|
|
102
|
+
const profile = await gmail.getProfile(connection);
|
|
99
103
|
return {
|
|
100
104
|
connected: true,
|
|
101
105
|
user: profile.emailAddress,
|
|
@@ -108,11 +112,12 @@ export const gmailMessagingProvider: MessagingProvider = {
|
|
|
108
112
|
},
|
|
109
113
|
|
|
110
114
|
async listConversations(
|
|
111
|
-
|
|
115
|
+
connectionOrToken: OAuthConnection | string,
|
|
112
116
|
_options?: ListOptions,
|
|
113
117
|
): Promise<Conversation[]> {
|
|
118
|
+
const connection = connectionOrToken as OAuthConnection;
|
|
114
119
|
// Gmail "conversations" are modeled as labels with unread counts
|
|
115
|
-
const labels = await gmail.listLabels(
|
|
120
|
+
const labels = await gmail.listLabels(connection);
|
|
116
121
|
const conversations: Conversation[] = [];
|
|
117
122
|
|
|
118
123
|
for (const label of labels) {
|
|
@@ -151,14 +156,15 @@ export const gmailMessagingProvider: MessagingProvider = {
|
|
|
151
156
|
},
|
|
152
157
|
|
|
153
158
|
async getHistory(
|
|
154
|
-
|
|
159
|
+
connectionOrToken: OAuthConnection | string,
|
|
155
160
|
conversationId: string,
|
|
156
161
|
options?: HistoryOptions,
|
|
157
162
|
): Promise<Message[]> {
|
|
163
|
+
const connection = connectionOrToken as OAuthConnection;
|
|
158
164
|
// conversationId is a label ID — list messages in that label
|
|
159
165
|
const limit = options?.limit ?? 50;
|
|
160
166
|
const listResult = await gmail.listMessages(
|
|
161
|
-
|
|
167
|
+
connection,
|
|
162
168
|
undefined,
|
|
163
169
|
limit,
|
|
164
170
|
undefined,
|
|
@@ -168,7 +174,7 @@ export const gmailMessagingProvider: MessagingProvider = {
|
|
|
168
174
|
if (!listResult.messages?.length) return [];
|
|
169
175
|
|
|
170
176
|
const messages = await gmail.batchGetMessages(
|
|
171
|
-
|
|
177
|
+
connection,
|
|
172
178
|
listResult.messages.map((m) => m.id),
|
|
173
179
|
"full",
|
|
174
180
|
);
|
|
@@ -177,19 +183,20 @@ export const gmailMessagingProvider: MessagingProvider = {
|
|
|
177
183
|
},
|
|
178
184
|
|
|
179
185
|
async search(
|
|
180
|
-
|
|
186
|
+
connectionOrToken: OAuthConnection | string,
|
|
181
187
|
query: string,
|
|
182
188
|
options?: SearchOptions,
|
|
183
189
|
): Promise<SearchResult> {
|
|
190
|
+
const connection = connectionOrToken as OAuthConnection;
|
|
184
191
|
const count = options?.count ?? 20;
|
|
185
|
-
const listResult = await gmail.listMessages(
|
|
192
|
+
const listResult = await gmail.listMessages(connection, query, count);
|
|
186
193
|
|
|
187
194
|
if (!listResult.messages?.length) {
|
|
188
195
|
return { total: 0, messages: [], hasMore: false };
|
|
189
196
|
}
|
|
190
197
|
|
|
191
198
|
const messages = await gmail.batchGetMessages(
|
|
192
|
-
|
|
199
|
+
connection,
|
|
193
200
|
listResult.messages.map((m) => m.id),
|
|
194
201
|
"full",
|
|
195
202
|
);
|
|
@@ -203,16 +210,17 @@ export const gmailMessagingProvider: MessagingProvider = {
|
|
|
203
210
|
},
|
|
204
211
|
|
|
205
212
|
async sendMessage(
|
|
206
|
-
|
|
213
|
+
connectionOrToken: OAuthConnection | string,
|
|
207
214
|
conversationId: string,
|
|
208
215
|
text: string,
|
|
209
216
|
options?: SendOptions,
|
|
210
217
|
): Promise<SendResult> {
|
|
218
|
+
const connection = connectionOrToken as OAuthConnection;
|
|
211
219
|
// conversationId is the recipient email for Gmail
|
|
212
220
|
const to = conversationId;
|
|
213
221
|
const subject = options?.subject ?? "";
|
|
214
222
|
const msg = await gmail.sendMessage(
|
|
215
|
-
|
|
223
|
+
connection,
|
|
216
224
|
to,
|
|
217
225
|
subject,
|
|
218
226
|
text,
|
|
@@ -228,15 +236,16 @@ export const gmailMessagingProvider: MessagingProvider = {
|
|
|
228
236
|
},
|
|
229
237
|
|
|
230
238
|
async getThreadReplies(
|
|
231
|
-
|
|
239
|
+
connectionOrToken: OAuthConnection | string,
|
|
232
240
|
_conversationId: string,
|
|
233
241
|
threadId: string,
|
|
234
242
|
options?: HistoryOptions,
|
|
235
243
|
): Promise<Message[]> {
|
|
244
|
+
const connection = connectionOrToken as OAuthConnection;
|
|
236
245
|
// Get all messages in a Gmail thread
|
|
237
246
|
const limit = options?.limit ?? 50;
|
|
238
247
|
const listResult = await gmail.listMessages(
|
|
239
|
-
|
|
248
|
+
connection,
|
|
240
249
|
`thread:${threadId}`,
|
|
241
250
|
limit,
|
|
242
251
|
);
|
|
@@ -244,7 +253,7 @@ export const gmailMessagingProvider: MessagingProvider = {
|
|
|
244
253
|
if (!listResult.messages?.length) return [];
|
|
245
254
|
|
|
246
255
|
const messages = await gmail.batchGetMessages(
|
|
247
|
-
|
|
256
|
+
connection,
|
|
248
257
|
listResult.messages.map((m) => m.id),
|
|
249
258
|
"full",
|
|
250
259
|
);
|
|
@@ -253,19 +262,23 @@ export const gmailMessagingProvider: MessagingProvider = {
|
|
|
253
262
|
},
|
|
254
263
|
|
|
255
264
|
async markRead(
|
|
256
|
-
|
|
265
|
+
connectionOrToken: OAuthConnection | string,
|
|
257
266
|
_conversationId: string,
|
|
258
267
|
messageId?: string,
|
|
259
268
|
): Promise<void> {
|
|
269
|
+
const connection = connectionOrToken as OAuthConnection;
|
|
260
270
|
if (!messageId) return;
|
|
261
|
-
await gmail.modifyMessage(
|
|
271
|
+
await gmail.modifyMessage(connection, messageId, {
|
|
272
|
+
removeLabelIds: ["UNREAD"],
|
|
273
|
+
});
|
|
262
274
|
},
|
|
263
275
|
|
|
264
276
|
async senderDigest(
|
|
265
|
-
|
|
277
|
+
connectionOrToken: OAuthConnection | string,
|
|
266
278
|
query: string,
|
|
267
279
|
options?: { maxMessages?: number; maxSenders?: number; pageToken?: string },
|
|
268
280
|
): Promise<SenderDigestResult> {
|
|
281
|
+
const connection = connectionOrToken as OAuthConnection;
|
|
269
282
|
const maxMessages = Math.min(options?.maxMessages ?? 5000, 5000);
|
|
270
283
|
const maxSenders = options?.maxSenders ?? 30;
|
|
271
284
|
const maxIdsPerSender = 5000;
|
|
@@ -285,7 +298,7 @@ export const gmailMessagingProvider: MessagingProvider = {
|
|
|
285
298
|
}
|
|
286
299
|
const pageSize = Math.min(100, maxMessages - allMessageIds.length);
|
|
287
300
|
const listResp = await gmail.listMessages(
|
|
288
|
-
|
|
301
|
+
connection,
|
|
289
302
|
query,
|
|
290
303
|
pageSize,
|
|
291
304
|
pageToken,
|
|
@@ -295,7 +308,7 @@ export const gmailMessagingProvider: MessagingProvider = {
|
|
|
295
308
|
allMessageIds.push(...ids);
|
|
296
309
|
fetchPromises.push(
|
|
297
310
|
gmail.batchGetMessages(
|
|
298
|
-
|
|
311
|
+
connection,
|
|
299
312
|
ids,
|
|
300
313
|
"metadata",
|
|
301
314
|
metadataHeaders,
|
|
@@ -409,7 +422,11 @@ export const gmailMessagingProvider: MessagingProvider = {
|
|
|
409
422
|
};
|
|
410
423
|
},
|
|
411
424
|
|
|
412
|
-
async archiveByQuery(
|
|
425
|
+
async archiveByQuery(
|
|
426
|
+
connectionOrToken: OAuthConnection | string,
|
|
427
|
+
query: string,
|
|
428
|
+
): Promise<ArchiveResult> {
|
|
429
|
+
const connection = connectionOrToken as OAuthConnection;
|
|
413
430
|
const maxMessages = 5000;
|
|
414
431
|
const batchModifyLimit = 1000;
|
|
415
432
|
|
|
@@ -419,7 +436,7 @@ export const gmailMessagingProvider: MessagingProvider = {
|
|
|
419
436
|
|
|
420
437
|
while (allMessageIds.length < maxMessages) {
|
|
421
438
|
const listResp = await gmail.listMessages(
|
|
422
|
-
|
|
439
|
+
connection,
|
|
423
440
|
query,
|
|
424
441
|
Math.min(500, maxMessages - allMessageIds.length),
|
|
425
442
|
pageToken,
|
|
@@ -441,7 +458,7 @@ export const gmailMessagingProvider: MessagingProvider = {
|
|
|
441
458
|
|
|
442
459
|
for (let i = 0; i < allMessageIds.length; i += batchModifyLimit) {
|
|
443
460
|
const chunk = allMessageIds.slice(i, i + batchModifyLimit);
|
|
444
|
-
await gmail.batchModifyMessages(
|
|
461
|
+
await gmail.batchModifyMessages(connection, chunk, {
|
|
445
462
|
removeLabelIds: ["INBOX"],
|
|
446
463
|
});
|
|
447
464
|
}
|