@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
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"tools": [
|
|
4
|
+
{
|
|
5
|
+
"name": "gmail_archive",
|
|
6
|
+
"description": "Archive Gmail messages (remove from inbox). Accepts a single message_id, an array of message_ids, scan_id + sender_ids from a prior scan, or a query to archive all matches. Include a confidence score (0-1).",
|
|
7
|
+
"category": "gmail",
|
|
8
|
+
"risk": "medium",
|
|
9
|
+
"input_schema": {
|
|
10
|
+
"type": "object",
|
|
11
|
+
"properties": {
|
|
12
|
+
"message_id": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"description": "Gmail message ID to archive"
|
|
15
|
+
},
|
|
16
|
+
"message_ids": {
|
|
17
|
+
"type": "array",
|
|
18
|
+
"items": {
|
|
19
|
+
"type": "string"
|
|
20
|
+
},
|
|
21
|
+
"description": "Gmail message IDs to archive (for batch operations)"
|
|
22
|
+
},
|
|
23
|
+
"scan_id": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"description": "Scan result ID from a prior gmail_sender_digest or gmail_outreach_scan call"
|
|
26
|
+
},
|
|
27
|
+
"sender_ids": {
|
|
28
|
+
"type": "array",
|
|
29
|
+
"items": {
|
|
30
|
+
"type": "string"
|
|
31
|
+
},
|
|
32
|
+
"description": "Sender IDs to archive (used with scan_id)"
|
|
33
|
+
},
|
|
34
|
+
"query": {
|
|
35
|
+
"type": "string",
|
|
36
|
+
"description": "Gmail search query to archive all matching messages"
|
|
37
|
+
},
|
|
38
|
+
"confidence": {
|
|
39
|
+
"type": "number",
|
|
40
|
+
"description": "Confidence score (0-1) for this action"
|
|
41
|
+
},
|
|
42
|
+
"reason": {
|
|
43
|
+
"type": "string",
|
|
44
|
+
"description": "Brief non-technical explanation of why this tool is being called"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"required": ["confidence"]
|
|
48
|
+
},
|
|
49
|
+
"executor": "tools/gmail-archive.ts",
|
|
50
|
+
"execution_target": "host"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "gmail_label",
|
|
54
|
+
"description": "Add or remove labels on one or more Gmail messages. Accepts a single message_id or an array of message_ids. Include a confidence score (0-1).",
|
|
55
|
+
"category": "gmail",
|
|
56
|
+
"risk": "medium",
|
|
57
|
+
"input_schema": {
|
|
58
|
+
"type": "object",
|
|
59
|
+
"properties": {
|
|
60
|
+
"message_id": {
|
|
61
|
+
"type": "string",
|
|
62
|
+
"description": "Gmail message ID"
|
|
63
|
+
},
|
|
64
|
+
"message_ids": {
|
|
65
|
+
"type": "array",
|
|
66
|
+
"items": {
|
|
67
|
+
"type": "string"
|
|
68
|
+
},
|
|
69
|
+
"description": "Gmail message IDs for batch label operations"
|
|
70
|
+
},
|
|
71
|
+
"add_label_ids": {
|
|
72
|
+
"type": "array",
|
|
73
|
+
"items": {
|
|
74
|
+
"type": "string"
|
|
75
|
+
},
|
|
76
|
+
"description": "Label IDs to add"
|
|
77
|
+
},
|
|
78
|
+
"remove_label_ids": {
|
|
79
|
+
"type": "array",
|
|
80
|
+
"items": {
|
|
81
|
+
"type": "string"
|
|
82
|
+
},
|
|
83
|
+
"description": "Label IDs to remove"
|
|
84
|
+
},
|
|
85
|
+
"confidence": {
|
|
86
|
+
"type": "number",
|
|
87
|
+
"description": "Confidence score (0-1) for this action"
|
|
88
|
+
},
|
|
89
|
+
"reason": {
|
|
90
|
+
"type": "string",
|
|
91
|
+
"description": "Brief non-technical explanation of why this tool is being called"
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
"required": ["confidence"]
|
|
95
|
+
},
|
|
96
|
+
"executor": "tools/gmail-label.ts",
|
|
97
|
+
"execution_target": "host"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"name": "gmail_trash",
|
|
101
|
+
"description": "Move a Gmail message to trash. Include a confidence score (0-1).",
|
|
102
|
+
"category": "gmail",
|
|
103
|
+
"risk": "medium",
|
|
104
|
+
"input_schema": {
|
|
105
|
+
"type": "object",
|
|
106
|
+
"properties": {
|
|
107
|
+
"message_id": {
|
|
108
|
+
"type": "string",
|
|
109
|
+
"description": "Gmail message ID to trash"
|
|
110
|
+
},
|
|
111
|
+
"confidence": {
|
|
112
|
+
"type": "number",
|
|
113
|
+
"description": "Confidence score (0-1) for this action"
|
|
114
|
+
},
|
|
115
|
+
"reason": {
|
|
116
|
+
"type": "string",
|
|
117
|
+
"description": "Brief non-technical explanation of why this tool is being called"
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
"required": ["message_id", "confidence"]
|
|
121
|
+
},
|
|
122
|
+
"executor": "tools/gmail-trash.ts",
|
|
123
|
+
"execution_target": "host"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"name": "gmail_unsubscribe",
|
|
127
|
+
"description": "Unsubscribe from a mailing list by following the List-Unsubscribe header. Include a confidence score (0-1).",
|
|
128
|
+
"category": "gmail",
|
|
129
|
+
"risk": "medium",
|
|
130
|
+
"input_schema": {
|
|
131
|
+
"type": "object",
|
|
132
|
+
"properties": {
|
|
133
|
+
"message_id": {
|
|
134
|
+
"type": "string",
|
|
135
|
+
"description": "A Gmail message ID from the mailing list to unsubscribe from"
|
|
136
|
+
},
|
|
137
|
+
"confidence": {
|
|
138
|
+
"type": "number",
|
|
139
|
+
"description": "Confidence score (0-1) for this action"
|
|
140
|
+
},
|
|
141
|
+
"reason": {
|
|
142
|
+
"type": "string",
|
|
143
|
+
"description": "Brief non-technical explanation of why this tool is being called"
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
"required": ["message_id", "confidence"]
|
|
147
|
+
},
|
|
148
|
+
"executor": "tools/gmail-unsubscribe.ts",
|
|
149
|
+
"execution_target": "host"
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"name": "gmail_draft",
|
|
153
|
+
"description": "Create a draft email in Gmail. The draft will appear in Gmail Drafts for user review.",
|
|
154
|
+
"category": "gmail",
|
|
155
|
+
"risk": "low",
|
|
156
|
+
"input_schema": {
|
|
157
|
+
"type": "object",
|
|
158
|
+
"properties": {
|
|
159
|
+
"to": {
|
|
160
|
+
"type": "string",
|
|
161
|
+
"description": "Recipient email address"
|
|
162
|
+
},
|
|
163
|
+
"subject": {
|
|
164
|
+
"type": "string",
|
|
165
|
+
"description": "Email subject line"
|
|
166
|
+
},
|
|
167
|
+
"body": {
|
|
168
|
+
"type": "string",
|
|
169
|
+
"description": "Email body (plain text)"
|
|
170
|
+
},
|
|
171
|
+
"in_reply_to": {
|
|
172
|
+
"type": "string",
|
|
173
|
+
"description": "RFC 822 Message-ID header value (e.g. `<CABx...@mail.gmail.com>`), NOT the Gmail message ID. Look up the original message's Message-ID header."
|
|
174
|
+
},
|
|
175
|
+
"cc": {
|
|
176
|
+
"type": "string",
|
|
177
|
+
"description": "CC recipients (comma-separated email addresses)"
|
|
178
|
+
},
|
|
179
|
+
"bcc": {
|
|
180
|
+
"type": "string",
|
|
181
|
+
"description": "BCC recipients (comma-separated email addresses)"
|
|
182
|
+
},
|
|
183
|
+
"reason": {
|
|
184
|
+
"type": "string",
|
|
185
|
+
"description": "Brief non-technical explanation of why this tool is being called"
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
"required": ["to", "subject", "body"]
|
|
189
|
+
},
|
|
190
|
+
"executor": "tools/gmail-draft.ts",
|
|
191
|
+
"execution_target": "host"
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"name": "gmail_send_draft",
|
|
195
|
+
"description": "Send an existing Gmail draft. Only use when the user has reviewed and explicitly approved sending.",
|
|
196
|
+
"category": "gmail",
|
|
197
|
+
"risk": "high",
|
|
198
|
+
"input_schema": {
|
|
199
|
+
"type": "object",
|
|
200
|
+
"properties": {
|
|
201
|
+
"draft_id": {
|
|
202
|
+
"type": "string",
|
|
203
|
+
"description": "Gmail draft ID to send"
|
|
204
|
+
},
|
|
205
|
+
"confidence": {
|
|
206
|
+
"type": "number",
|
|
207
|
+
"description": "Confidence score (0-1) for this action"
|
|
208
|
+
},
|
|
209
|
+
"reason": {
|
|
210
|
+
"type": "string",
|
|
211
|
+
"description": "Brief non-technical explanation of why this tool is being called"
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
"required": ["draft_id", "confidence"]
|
|
215
|
+
},
|
|
216
|
+
"executor": "tools/gmail-send-draft.ts",
|
|
217
|
+
"execution_target": "host"
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
"name": "gmail_attachments",
|
|
221
|
+
"description": "List or download Gmail attachments. Use action 'list' to enumerate attachments on a message, then 'download' to save a specific attachment to disk.",
|
|
222
|
+
"category": "gmail",
|
|
223
|
+
"risk": "low",
|
|
224
|
+
"input_schema": {
|
|
225
|
+
"type": "object",
|
|
226
|
+
"properties": {
|
|
227
|
+
"action": {
|
|
228
|
+
"type": "string",
|
|
229
|
+
"enum": ["list", "download"],
|
|
230
|
+
"description": "List attachments on a message, or download a specific attachment"
|
|
231
|
+
},
|
|
232
|
+
"message_id": {
|
|
233
|
+
"type": "string",
|
|
234
|
+
"description": "Gmail message ID"
|
|
235
|
+
},
|
|
236
|
+
"attachment_id": {
|
|
237
|
+
"type": "string",
|
|
238
|
+
"description": "Attachment ID (required for download, from a prior list call)"
|
|
239
|
+
},
|
|
240
|
+
"filename": {
|
|
241
|
+
"type": "string",
|
|
242
|
+
"description": "Filename to save as (required for download)"
|
|
243
|
+
},
|
|
244
|
+
"reason": {
|
|
245
|
+
"type": "string",
|
|
246
|
+
"description": "Brief non-technical explanation of why this tool is being called"
|
|
247
|
+
}
|
|
248
|
+
},
|
|
249
|
+
"required": ["action", "message_id"]
|
|
250
|
+
},
|
|
251
|
+
"executor": "tools/gmail-attachments.ts",
|
|
252
|
+
"execution_target": "host"
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
"name": "gmail_forward",
|
|
256
|
+
"description": "Create a draft forwarding a Gmail message to another recipient, preserving attachments. Include a confidence score (0-1).",
|
|
257
|
+
"category": "gmail",
|
|
258
|
+
"risk": "high",
|
|
259
|
+
"input_schema": {
|
|
260
|
+
"type": "object",
|
|
261
|
+
"properties": {
|
|
262
|
+
"message_id": {
|
|
263
|
+
"type": "string",
|
|
264
|
+
"description": "Gmail message ID to forward"
|
|
265
|
+
},
|
|
266
|
+
"to": {
|
|
267
|
+
"type": "string",
|
|
268
|
+
"description": "Recipient email address"
|
|
269
|
+
},
|
|
270
|
+
"text": {
|
|
271
|
+
"type": "string",
|
|
272
|
+
"description": "Optional text to prepend to the forwarded message"
|
|
273
|
+
},
|
|
274
|
+
"confidence": {
|
|
275
|
+
"type": "number",
|
|
276
|
+
"description": "Confidence score (0-1) for this action"
|
|
277
|
+
},
|
|
278
|
+
"reason": {
|
|
279
|
+
"type": "string",
|
|
280
|
+
"description": "Brief non-technical explanation of why this tool is being called"
|
|
281
|
+
}
|
|
282
|
+
},
|
|
283
|
+
"required": ["message_id", "to", "confidence"]
|
|
284
|
+
},
|
|
285
|
+
"executor": "tools/gmail-forward.ts",
|
|
286
|
+
"execution_target": "host"
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
"name": "gmail_follow_up",
|
|
290
|
+
"description": "Track, list, or untrack Gmail messages for follow-up using a dedicated label. Include a confidence score (0-1).",
|
|
291
|
+
"category": "gmail",
|
|
292
|
+
"risk": "medium",
|
|
293
|
+
"input_schema": {
|
|
294
|
+
"type": "object",
|
|
295
|
+
"properties": {
|
|
296
|
+
"action": {
|
|
297
|
+
"type": "string",
|
|
298
|
+
"enum": ["track", "list", "untrack"],
|
|
299
|
+
"description": "Follow-up action"
|
|
300
|
+
},
|
|
301
|
+
"message_id": {
|
|
302
|
+
"type": "string",
|
|
303
|
+
"description": "Gmail message ID (required for track/untrack)"
|
|
304
|
+
},
|
|
305
|
+
"confidence": {
|
|
306
|
+
"type": "number",
|
|
307
|
+
"description": "Confidence score (0-1) for this action"
|
|
308
|
+
},
|
|
309
|
+
"reason": {
|
|
310
|
+
"type": "string",
|
|
311
|
+
"description": "Brief non-technical explanation of why this tool is being called"
|
|
312
|
+
}
|
|
313
|
+
},
|
|
314
|
+
"required": ["action", "confidence"]
|
|
315
|
+
},
|
|
316
|
+
"executor": "tools/gmail-follow-up.ts",
|
|
317
|
+
"execution_target": "host"
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
"name": "gmail_filters",
|
|
321
|
+
"description": "List, create, or delete Gmail filters for inbox automation. Include a confidence score (0-1).",
|
|
322
|
+
"category": "gmail",
|
|
323
|
+
"risk": "medium",
|
|
324
|
+
"input_schema": {
|
|
325
|
+
"type": "object",
|
|
326
|
+
"properties": {
|
|
327
|
+
"action": {
|
|
328
|
+
"type": "string",
|
|
329
|
+
"enum": ["list", "create", "delete"],
|
|
330
|
+
"description": "Filter action"
|
|
331
|
+
},
|
|
332
|
+
"from": {
|
|
333
|
+
"type": "string",
|
|
334
|
+
"description": "Filter criteria: sender (for create)"
|
|
335
|
+
},
|
|
336
|
+
"to": {
|
|
337
|
+
"type": "string",
|
|
338
|
+
"description": "Filter criteria: recipient (for create)"
|
|
339
|
+
},
|
|
340
|
+
"subject": {
|
|
341
|
+
"type": "string",
|
|
342
|
+
"description": "Filter criteria: subject contains (for create)"
|
|
343
|
+
},
|
|
344
|
+
"query": {
|
|
345
|
+
"type": "string",
|
|
346
|
+
"description": "Filter criteria: Gmail query (for create)"
|
|
347
|
+
},
|
|
348
|
+
"has_attachment": {
|
|
349
|
+
"type": "boolean",
|
|
350
|
+
"description": "Filter criteria: has attachment (for create)"
|
|
351
|
+
},
|
|
352
|
+
"add_label_ids": {
|
|
353
|
+
"type": "array",
|
|
354
|
+
"items": {
|
|
355
|
+
"type": "string"
|
|
356
|
+
},
|
|
357
|
+
"description": "Filter action: label IDs to add (for create)"
|
|
358
|
+
},
|
|
359
|
+
"remove_label_ids": {
|
|
360
|
+
"type": "array",
|
|
361
|
+
"items": {
|
|
362
|
+
"type": "string"
|
|
363
|
+
},
|
|
364
|
+
"description": "Filter action: label IDs to remove (for create)"
|
|
365
|
+
},
|
|
366
|
+
"forward": {
|
|
367
|
+
"type": "string",
|
|
368
|
+
"description": "Filter action: forward to email (for create)"
|
|
369
|
+
},
|
|
370
|
+
"filter_id": {
|
|
371
|
+
"type": "string",
|
|
372
|
+
"description": "Filter ID (for delete)"
|
|
373
|
+
},
|
|
374
|
+
"confidence": {
|
|
375
|
+
"type": "number",
|
|
376
|
+
"description": "Confidence score (0-1) for this action"
|
|
377
|
+
},
|
|
378
|
+
"reason": {
|
|
379
|
+
"type": "string",
|
|
380
|
+
"description": "Brief non-technical explanation of why this tool is being called"
|
|
381
|
+
}
|
|
382
|
+
},
|
|
383
|
+
"required": ["action", "confidence"]
|
|
384
|
+
},
|
|
385
|
+
"executor": "tools/gmail-filters.ts",
|
|
386
|
+
"execution_target": "host"
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
"name": "gmail_vacation",
|
|
390
|
+
"description": "Get, enable, or disable Gmail vacation auto-responder. Include a confidence score (0-1).",
|
|
391
|
+
"category": "gmail",
|
|
392
|
+
"risk": "medium",
|
|
393
|
+
"input_schema": {
|
|
394
|
+
"type": "object",
|
|
395
|
+
"properties": {
|
|
396
|
+
"action": {
|
|
397
|
+
"type": "string",
|
|
398
|
+
"enum": ["get", "enable", "disable"],
|
|
399
|
+
"description": "Vacation action"
|
|
400
|
+
},
|
|
401
|
+
"message": {
|
|
402
|
+
"type": "string",
|
|
403
|
+
"description": "Auto-reply message body (required for enable)"
|
|
404
|
+
},
|
|
405
|
+
"subject": {
|
|
406
|
+
"type": "string",
|
|
407
|
+
"description": "Auto-reply subject (default 'Out of Office')"
|
|
408
|
+
},
|
|
409
|
+
"start_time": {
|
|
410
|
+
"type": "number",
|
|
411
|
+
"description": "Start time in epoch milliseconds"
|
|
412
|
+
},
|
|
413
|
+
"end_time": {
|
|
414
|
+
"type": "number",
|
|
415
|
+
"description": "End time in epoch milliseconds"
|
|
416
|
+
},
|
|
417
|
+
"restrict_to_contacts": {
|
|
418
|
+
"type": "boolean",
|
|
419
|
+
"description": "Only auto-reply to contacts (default false)"
|
|
420
|
+
},
|
|
421
|
+
"restrict_to_domain": {
|
|
422
|
+
"type": "boolean",
|
|
423
|
+
"description": "Only auto-reply to same domain (default false)"
|
|
424
|
+
},
|
|
425
|
+
"confidence": {
|
|
426
|
+
"type": "number",
|
|
427
|
+
"description": "Confidence score (0-1) for this action"
|
|
428
|
+
},
|
|
429
|
+
"reason": {
|
|
430
|
+
"type": "string",
|
|
431
|
+
"description": "Brief non-technical explanation of why this tool is being called"
|
|
432
|
+
}
|
|
433
|
+
},
|
|
434
|
+
"required": ["action", "confidence"]
|
|
435
|
+
},
|
|
436
|
+
"executor": "tools/gmail-vacation.ts",
|
|
437
|
+
"execution_target": "host"
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
"name": "gmail_sender_digest",
|
|
441
|
+
"description": "Scan Gmail and group messages by sender to identify high-volume senders (e.g. newsletters). Returns top senders sorted by message count with metadata for bulk cleanup.",
|
|
442
|
+
"category": "gmail",
|
|
443
|
+
"risk": "low",
|
|
444
|
+
"input_schema": {
|
|
445
|
+
"type": "object",
|
|
446
|
+
"properties": {
|
|
447
|
+
"query": {
|
|
448
|
+
"type": "string",
|
|
449
|
+
"description": "Gmail search query (default 'category:promotions newer_than:90d')"
|
|
450
|
+
},
|
|
451
|
+
"max_messages": {
|
|
452
|
+
"type": "number",
|
|
453
|
+
"description": "Maximum messages to scan (default 5000, cap 10000)"
|
|
454
|
+
},
|
|
455
|
+
"max_senders": {
|
|
456
|
+
"type": "number",
|
|
457
|
+
"description": "Maximum senders to return (default 50)"
|
|
458
|
+
},
|
|
459
|
+
"page_token": {
|
|
460
|
+
"type": "string",
|
|
461
|
+
"description": "Resume token from a previous scan (rarely needed — scans now cover up to 10,000 messages in a single call)"
|
|
462
|
+
},
|
|
463
|
+
"reason": {
|
|
464
|
+
"type": "string",
|
|
465
|
+
"description": "Brief non-technical explanation of why this tool is being called"
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
},
|
|
469
|
+
"executor": "tools/gmail-sender-digest.ts",
|
|
470
|
+
"execution_target": "host"
|
|
471
|
+
},
|
|
472
|
+
{
|
|
473
|
+
"name": "gmail_outreach_scan",
|
|
474
|
+
"description": "Scan Gmail inbox for senders without List-Unsubscribe headers (potential cold outreach). Returns top senders with message counts and sample subjects. Read-only — use gmail_archive and gmail_filters for cleanup.",
|
|
475
|
+
"category": "gmail",
|
|
476
|
+
"risk": "low",
|
|
477
|
+
"input_schema": {
|
|
478
|
+
"type": "object",
|
|
479
|
+
"properties": {
|
|
480
|
+
"max_messages": {
|
|
481
|
+
"type": "number",
|
|
482
|
+
"description": "Maximum messages to scan (default 2000, cap 5000)"
|
|
483
|
+
},
|
|
484
|
+
"max_senders": {
|
|
485
|
+
"type": "number",
|
|
486
|
+
"description": "Maximum senders to return (default 30)"
|
|
487
|
+
},
|
|
488
|
+
"time_range": {
|
|
489
|
+
"type": "string",
|
|
490
|
+
"description": "Gmail time range filter (default '90d')"
|
|
491
|
+
},
|
|
492
|
+
"page_token": {
|
|
493
|
+
"type": "string",
|
|
494
|
+
"description": "Resume token from a previous scan (rarely needed — scans now cover up to 5,000 messages in a single call)"
|
|
495
|
+
},
|
|
496
|
+
"reason": {
|
|
497
|
+
"type": "string",
|
|
498
|
+
"description": "Brief non-technical explanation of why this tool is being called"
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
},
|
|
502
|
+
"executor": "tools/gmail-outreach-scan.ts",
|
|
503
|
+
"execution_target": "host"
|
|
504
|
+
}
|
|
505
|
+
]
|
|
506
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import {
|
|
2
|
+
batchModifyMessages,
|
|
3
|
+
listMessages,
|
|
4
|
+
modifyMessage,
|
|
5
|
+
} from "../../../../messaging/providers/gmail/client.js";
|
|
6
|
+
import { getMessagingProvider } from "../../../../messaging/registry.js";
|
|
7
|
+
import { withValidToken } from "../../../../security/token-manager.js";
|
|
8
|
+
import type {
|
|
9
|
+
ToolContext,
|
|
10
|
+
ToolExecutionResult,
|
|
11
|
+
} from "../../../../tools/types.js";
|
|
12
|
+
import { getSenderMessageIds } from "./scan-result-store.js";
|
|
13
|
+
import { err, ok } from "./shared.js";
|
|
14
|
+
|
|
15
|
+
const BATCH_MODIFY_LIMIT = 1000;
|
|
16
|
+
const MAX_MESSAGES = 5000;
|
|
17
|
+
|
|
18
|
+
export async function run(
|
|
19
|
+
input: Record<string, unknown>,
|
|
20
|
+
context: ToolContext,
|
|
21
|
+
): Promise<ToolExecutionResult> {
|
|
22
|
+
const query = input.query as string | undefined;
|
|
23
|
+
const scanId = input.scan_id as string | undefined;
|
|
24
|
+
const senderIds = input.sender_ids as string[] | undefined;
|
|
25
|
+
let messageIds = input.message_ids as string[] | undefined;
|
|
26
|
+
const messageId = input.message_id as string | undefined;
|
|
27
|
+
|
|
28
|
+
// Resolve message IDs via priority: query → scan_id+sender_ids → message_ids → message_id
|
|
29
|
+
if (query) {
|
|
30
|
+
// Query path requires surface action confirmation
|
|
31
|
+
if (!context.triggeredBySurfaceAction) {
|
|
32
|
+
return err(
|
|
33
|
+
"This tool requires user confirmation via a surface action. Present results in a selection table with action buttons and wait for the user to click before proceeding.",
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
const provider = getMessagingProvider("gmail");
|
|
39
|
+
return await withValidToken(provider.credentialService, async (token) => {
|
|
40
|
+
const allMessageIds: string[] = [];
|
|
41
|
+
let pageToken: string | undefined;
|
|
42
|
+
let truncated = false;
|
|
43
|
+
|
|
44
|
+
while (allMessageIds.length < MAX_MESSAGES) {
|
|
45
|
+
const listResp = await listMessages(
|
|
46
|
+
token,
|
|
47
|
+
query,
|
|
48
|
+
Math.min(500, MAX_MESSAGES - allMessageIds.length),
|
|
49
|
+
pageToken,
|
|
50
|
+
);
|
|
51
|
+
const ids = (listResp.messages ?? []).map((m) => m.id);
|
|
52
|
+
if (ids.length === 0) break;
|
|
53
|
+
allMessageIds.push(...ids);
|
|
54
|
+
pageToken = listResp.nextPageToken ?? undefined;
|
|
55
|
+
if (!pageToken) break;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (allMessageIds.length >= MAX_MESSAGES && pageToken) {
|
|
59
|
+
truncated = true;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (allMessageIds.length === 0) {
|
|
63
|
+
return ok("No messages matched the query. Nothing archived.");
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
for (let i = 0; i < allMessageIds.length; i += BATCH_MODIFY_LIMIT) {
|
|
67
|
+
const chunk = allMessageIds.slice(i, i + BATCH_MODIFY_LIMIT);
|
|
68
|
+
await batchModifyMessages(token, chunk, {
|
|
69
|
+
removeLabelIds: ["INBOX"],
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const summary = `Archived ${allMessageIds.length} message(s) matching query: ${query}`;
|
|
74
|
+
if (truncated) {
|
|
75
|
+
return ok(
|
|
76
|
+
`${summary}\n\nNote: this operation was capped at ${MAX_MESSAGES} messages. Additional messages matching the query may remain in the inbox. Run the command again to archive more.`,
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
return ok(summary);
|
|
80
|
+
});
|
|
81
|
+
} catch (e) {
|
|
82
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
83
|
+
}
|
|
84
|
+
} else if (scanId && senderIds?.length) {
|
|
85
|
+
// Scan path requires surface action confirmation
|
|
86
|
+
if (!context.triggeredBySurfaceAction) {
|
|
87
|
+
return err(
|
|
88
|
+
"This tool requires user confirmation via a surface action. Present results in a selection table with action buttons and wait for the user to click before proceeding.",
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const resolved = getSenderMessageIds(scanId, senderIds);
|
|
93
|
+
if (!resolved) {
|
|
94
|
+
return err(
|
|
95
|
+
"Scan results have expired (30-minute window). Please re-run the scan to get fresh results.",
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
messageIds = resolved;
|
|
99
|
+
} else if (messageIds?.length) {
|
|
100
|
+
// Batch message_ids path requires surface action confirmation
|
|
101
|
+
if (!context.triggeredBySurfaceAction) {
|
|
102
|
+
return err(
|
|
103
|
+
"This tool requires user confirmation via a surface action. Present results in a selection table with action buttons and wait for the user to click before proceeding.",
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
} else if (messageId) {
|
|
107
|
+
// Single message path
|
|
108
|
+
try {
|
|
109
|
+
const provider = getMessagingProvider("gmail");
|
|
110
|
+
return await withValidToken(provider.credentialService, async (token) => {
|
|
111
|
+
await modifyMessage(token, messageId, { removeLabelIds: ["INBOX"] });
|
|
112
|
+
return ok("Message archived.");
|
|
113
|
+
});
|
|
114
|
+
} catch (e) {
|
|
115
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
116
|
+
}
|
|
117
|
+
} else {
|
|
118
|
+
return err(
|
|
119
|
+
"Provide message_id, message_ids, scan_id + sender_ids, or query.",
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Batch path for scan_id+sender_ids and message_ids
|
|
124
|
+
if (!messageIds?.length) {
|
|
125
|
+
return err("Resolved message list is empty — no messages to archive.");
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
try {
|
|
129
|
+
const provider = getMessagingProvider("gmail");
|
|
130
|
+
return await withValidToken(provider.credentialService, async (token) => {
|
|
131
|
+
if (messageIds.length === 1) {
|
|
132
|
+
await modifyMessage(token, messageIds[0], {
|
|
133
|
+
removeLabelIds: ["INBOX"],
|
|
134
|
+
});
|
|
135
|
+
return ok("Message archived.");
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
for (let i = 0; i < messageIds.length; i += BATCH_MODIFY_LIMIT) {
|
|
139
|
+
const chunk = messageIds.slice(i, i + BATCH_MODIFY_LIMIT);
|
|
140
|
+
await batchModifyMessages(token, chunk, {
|
|
141
|
+
removeLabelIds: ["INBOX"],
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
return ok(`Archived ${messageIds.length} message(s).`);
|
|
145
|
+
});
|
|
146
|
+
} catch (e) {
|
|
147
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
148
|
+
}
|
|
149
|
+
}
|