@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
|
@@ -1,351 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mode router for Twitter operations.
|
|
3
|
-
* Selects managed proxy or OAuth path based on the caller-provided integration mode.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
getTweet as managedGetTweet,
|
|
8
|
-
getUserByUsername as managedGetUserByUsername,
|
|
9
|
-
getUserTweets as managedGetUserTweets,
|
|
10
|
-
postTweet as managedPostTweet,
|
|
11
|
-
searchRecentTweets as managedSearchRecentTweets,
|
|
12
|
-
TwitterProxyError,
|
|
13
|
-
} from "../../../twitter/platform-proxy-client.js";
|
|
14
|
-
import { oauthIsAvailable, oauthPostTweet } from "./oauth-client.js";
|
|
15
|
-
import type { PostTweetResult, TweetEntry, UserInfo } from "./types.js";
|
|
16
|
-
|
|
17
|
-
export type TwitterMode = "oauth" | "managed";
|
|
18
|
-
|
|
19
|
-
export interface RoutedResult<T> {
|
|
20
|
-
result: T;
|
|
21
|
-
pathUsed: TwitterMode;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export async function routedPostTweet(
|
|
25
|
-
text: string,
|
|
26
|
-
opts: {
|
|
27
|
-
inReplyToTweetId?: string;
|
|
28
|
-
mode: TwitterMode;
|
|
29
|
-
oauthToken?: string;
|
|
30
|
-
},
|
|
31
|
-
): Promise<RoutedResult<PostTweetResult>> {
|
|
32
|
-
const mode = opts.mode;
|
|
33
|
-
|
|
34
|
-
if (mode === "managed") {
|
|
35
|
-
// Route through platform proxy — the platform holds the OAuth credentials
|
|
36
|
-
try {
|
|
37
|
-
const response = await managedPostTweet(text, {
|
|
38
|
-
replyToId: opts.inReplyToTweetId,
|
|
39
|
-
});
|
|
40
|
-
const data = response.data as Record<string, unknown>;
|
|
41
|
-
const tweetData = (data?.data ?? data) as Record<string, unknown>;
|
|
42
|
-
const tweetId = String(tweetData.id ?? "");
|
|
43
|
-
if (!tweetId) {
|
|
44
|
-
throw Object.assign(
|
|
45
|
-
new Error(
|
|
46
|
-
"Managed post succeeded but the proxy response did not include a tweet ID",
|
|
47
|
-
),
|
|
48
|
-
{
|
|
49
|
-
pathUsed: "managed" as const,
|
|
50
|
-
},
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
return {
|
|
54
|
-
result: {
|
|
55
|
-
tweetId,
|
|
56
|
-
text,
|
|
57
|
-
url: `https://x.com/i/status/${tweetId}`,
|
|
58
|
-
},
|
|
59
|
-
pathUsed: "managed",
|
|
60
|
-
};
|
|
61
|
-
} catch (err) {
|
|
62
|
-
if (err instanceof TwitterProxyError) {
|
|
63
|
-
// Surface actionable error messages from the proxy
|
|
64
|
-
throw Object.assign(new Error(err.message), {
|
|
65
|
-
pathUsed: "managed" as const,
|
|
66
|
-
proxyErrorCode: err.code,
|
|
67
|
-
retryable: err.retryable,
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
throw err;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
if (mode === "oauth") {
|
|
75
|
-
// User explicitly wants OAuth
|
|
76
|
-
if (!oauthIsAvailable(opts.oauthToken)) {
|
|
77
|
-
throw Object.assign(
|
|
78
|
-
new Error(
|
|
79
|
-
"OAuth is not configured. Connect your X developer credentials to set up OAuth.",
|
|
80
|
-
),
|
|
81
|
-
{
|
|
82
|
-
pathUsed: "oauth" as const,
|
|
83
|
-
},
|
|
84
|
-
);
|
|
85
|
-
}
|
|
86
|
-
const result = await oauthPostTweet(text, {
|
|
87
|
-
inReplyToTweetId: opts.inReplyToTweetId,
|
|
88
|
-
oauthToken: opts.oauthToken!,
|
|
89
|
-
});
|
|
90
|
-
return {
|
|
91
|
-
result: {
|
|
92
|
-
tweetId: result.tweetId,
|
|
93
|
-
text: result.text,
|
|
94
|
-
url: result.url ?? `https://x.com/i/status/${result.tweetId}`,
|
|
95
|
-
},
|
|
96
|
-
pathUsed: "oauth",
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Exhaustive check — should never reach here
|
|
101
|
-
const _exhaustive: never = mode;
|
|
102
|
-
throw new Error(`Unknown mode: ${_exhaustive}`);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// ---------------------------------------------------------------------------
|
|
106
|
-
// Routed read operations
|
|
107
|
-
// ---------------------------------------------------------------------------
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Look up a user by screen name.
|
|
111
|
-
* Managed mode uses GET /2/users/by/username/:username.
|
|
112
|
-
*/
|
|
113
|
-
export async function routedGetUserByScreenName(
|
|
114
|
-
screenName: string,
|
|
115
|
-
opts: { mode: TwitterMode },
|
|
116
|
-
): Promise<RoutedResult<UserInfo>> {
|
|
117
|
-
if (opts.mode === "managed") {
|
|
118
|
-
try {
|
|
119
|
-
const response = await managedGetUserByUsername(screenName, {
|
|
120
|
-
"user.fields": "id,name,username",
|
|
121
|
-
});
|
|
122
|
-
const data = response.data as Record<string, unknown>;
|
|
123
|
-
const userData = (data?.data ?? data) as Record<string, unknown>;
|
|
124
|
-
if (!userData.id) {
|
|
125
|
-
throw Object.assign(new Error(`User not found: @${screenName}`), {
|
|
126
|
-
pathUsed: "managed" as const,
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
return {
|
|
130
|
-
result: {
|
|
131
|
-
userId: String(userData.id),
|
|
132
|
-
screenName: String(
|
|
133
|
-
userData.username ?? userData.screen_name ?? screenName,
|
|
134
|
-
),
|
|
135
|
-
name: String(userData.name ?? screenName),
|
|
136
|
-
},
|
|
137
|
-
pathUsed: "managed",
|
|
138
|
-
};
|
|
139
|
-
} catch (err) {
|
|
140
|
-
if (err instanceof TwitterProxyError) {
|
|
141
|
-
throw Object.assign(new Error(err.message), {
|
|
142
|
-
pathUsed: "managed" as const,
|
|
143
|
-
proxyErrorCode: err.code,
|
|
144
|
-
retryable: err.retryable,
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
throw err;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
if (opts.mode === "oauth") {
|
|
152
|
-
throw Object.assign(
|
|
153
|
-
new Error(
|
|
154
|
-
"Read operations are not supported via OAuth. Use managed mode for read access.",
|
|
155
|
-
),
|
|
156
|
-
{ pathUsed: "oauth" as const },
|
|
157
|
-
);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
const _exhaustive: never = opts.mode;
|
|
161
|
-
throw new Error(`Unknown mode: ${_exhaustive}`);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Fetch a user's recent tweets.
|
|
166
|
-
* Managed mode uses GET /2/users/:id/tweets.
|
|
167
|
-
*/
|
|
168
|
-
export async function routedGetUserTweets(
|
|
169
|
-
userId: string,
|
|
170
|
-
count: number,
|
|
171
|
-
opts: { mode: TwitterMode },
|
|
172
|
-
): Promise<RoutedResult<TweetEntry[]>> {
|
|
173
|
-
if (opts.mode === "managed") {
|
|
174
|
-
try {
|
|
175
|
-
const response = await managedGetUserTweets(userId, {
|
|
176
|
-
max_results: String(Math.min(count, 100)),
|
|
177
|
-
"tweet.fields": "id,text,created_at,author_id",
|
|
178
|
-
});
|
|
179
|
-
const data = response.data as Record<string, unknown>;
|
|
180
|
-
const tweetsArray = (data?.data ?? []) as Array<Record<string, unknown>>;
|
|
181
|
-
const tweets: TweetEntry[] = tweetsArray.map((t) => ({
|
|
182
|
-
tweetId: String(t.id ?? ""),
|
|
183
|
-
text: String(t.text ?? ""),
|
|
184
|
-
url: `https://x.com/i/status/${t.id}`,
|
|
185
|
-
createdAt: String(t.created_at ?? ""),
|
|
186
|
-
}));
|
|
187
|
-
return { result: tweets, pathUsed: "managed" };
|
|
188
|
-
} catch (err) {
|
|
189
|
-
if (err instanceof TwitterProxyError) {
|
|
190
|
-
throw Object.assign(new Error(err.message), {
|
|
191
|
-
pathUsed: "managed" as const,
|
|
192
|
-
proxyErrorCode: err.code,
|
|
193
|
-
retryable: err.retryable,
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
throw err;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
if (opts.mode === "oauth") {
|
|
201
|
-
throw Object.assign(
|
|
202
|
-
new Error(
|
|
203
|
-
"Read operations are not supported via OAuth. Use managed mode for read access.",
|
|
204
|
-
),
|
|
205
|
-
{ pathUsed: "oauth" as const },
|
|
206
|
-
);
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
const _exhaustive: never = opts.mode;
|
|
210
|
-
throw new Error(`Unknown mode: ${_exhaustive}`);
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Fetch a single tweet by ID.
|
|
215
|
-
* Managed mode uses GET /2/tweets/:id.
|
|
216
|
-
*/
|
|
217
|
-
export async function routedGetTweetDetail(
|
|
218
|
-
tweetId: string,
|
|
219
|
-
opts: { mode: TwitterMode },
|
|
220
|
-
): Promise<RoutedResult<TweetEntry[]>> {
|
|
221
|
-
if (opts.mode === "managed") {
|
|
222
|
-
try {
|
|
223
|
-
const response = await managedGetTweet(tweetId, {
|
|
224
|
-
"tweet.fields": "id,text,created_at,author_id,conversation_id",
|
|
225
|
-
});
|
|
226
|
-
const data = response.data as Record<string, unknown>;
|
|
227
|
-
const tweetData = (data?.data ?? data) as Record<string, unknown>;
|
|
228
|
-
const primaryTweet: TweetEntry = {
|
|
229
|
-
tweetId: String(tweetData.id ?? ""),
|
|
230
|
-
text: String(tweetData.text ?? ""),
|
|
231
|
-
url: `https://x.com/i/status/${tweetData.id}`,
|
|
232
|
-
createdAt: String(tweetData.created_at ?? ""),
|
|
233
|
-
};
|
|
234
|
-
|
|
235
|
-
// If the tweet has a conversation_id, fetch the thread via search
|
|
236
|
-
const conversationId = tweetData.conversation_id as string | undefined;
|
|
237
|
-
if (conversationId) {
|
|
238
|
-
try {
|
|
239
|
-
const threadResponse = await managedSearchRecentTweets(
|
|
240
|
-
`conversation_id:${conversationId}`,
|
|
241
|
-
{
|
|
242
|
-
"tweet.fields": "id,text,created_at,author_id",
|
|
243
|
-
max_results: "100",
|
|
244
|
-
},
|
|
245
|
-
);
|
|
246
|
-
const threadData = threadResponse.data as Record<string, unknown>;
|
|
247
|
-
const threadArray = (threadData?.data ?? []) as Array<
|
|
248
|
-
Record<string, unknown>
|
|
249
|
-
>;
|
|
250
|
-
const threadTweets: TweetEntry[] = threadArray.map((t) => ({
|
|
251
|
-
tweetId: String(t.id ?? ""),
|
|
252
|
-
text: String(t.text ?? ""),
|
|
253
|
-
url: `https://x.com/i/status/${t.id}`,
|
|
254
|
-
createdAt: String(t.created_at ?? ""),
|
|
255
|
-
}));
|
|
256
|
-
// Deduplicate: the primary tweet may already be in the search results
|
|
257
|
-
const seen = new Set(threadTweets.map((t) => t.tweetId));
|
|
258
|
-
if (!seen.has(primaryTweet.tweetId)) {
|
|
259
|
-
threadTweets.unshift(primaryTweet);
|
|
260
|
-
}
|
|
261
|
-
return { result: threadTweets, pathUsed: "managed" };
|
|
262
|
-
} catch {
|
|
263
|
-
// If thread search fails, fall back to returning just the single tweet
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
return { result: [primaryTweet], pathUsed: "managed" };
|
|
268
|
-
} catch (err) {
|
|
269
|
-
if (err instanceof TwitterProxyError) {
|
|
270
|
-
throw Object.assign(new Error(err.message), {
|
|
271
|
-
pathUsed: "managed" as const,
|
|
272
|
-
proxyErrorCode: err.code,
|
|
273
|
-
retryable: err.retryable,
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
throw err;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
if (opts.mode === "oauth") {
|
|
281
|
-
throw Object.assign(
|
|
282
|
-
new Error(
|
|
283
|
-
"Read operations are not supported via OAuth. Use managed mode for read access.",
|
|
284
|
-
),
|
|
285
|
-
{ pathUsed: "oauth" as const },
|
|
286
|
-
);
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
const _exhaustive: never = opts.mode;
|
|
290
|
-
throw new Error(`Unknown mode: ${_exhaustive}`);
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* Search tweets.
|
|
295
|
-
* Managed mode uses GET /2/tweets/search/recent.
|
|
296
|
-
*/
|
|
297
|
-
export async function routedSearchTweets(
|
|
298
|
-
query: string,
|
|
299
|
-
product: "Top" | "Latest" | "People" | "Media",
|
|
300
|
-
opts: { mode: TwitterMode },
|
|
301
|
-
): Promise<RoutedResult<TweetEntry[]>> {
|
|
302
|
-
if (opts.mode === "managed") {
|
|
303
|
-
if (product === "People" || product === "Media") {
|
|
304
|
-
throw Object.assign(
|
|
305
|
-
new Error(
|
|
306
|
-
`Product type "${product}" is not supported in managed mode. Only "Top" and "Latest" are supported.`,
|
|
307
|
-
),
|
|
308
|
-
{ pathUsed: "managed" as const },
|
|
309
|
-
);
|
|
310
|
-
}
|
|
311
|
-
try {
|
|
312
|
-
const queryParams: Record<string, string> = {
|
|
313
|
-
"tweet.fields": "id,text,created_at,author_id",
|
|
314
|
-
};
|
|
315
|
-
if (product === "Latest") {
|
|
316
|
-
queryParams.sort_order = "recency";
|
|
317
|
-
}
|
|
318
|
-
const response = await managedSearchRecentTweets(query, queryParams);
|
|
319
|
-
const data = response.data as Record<string, unknown>;
|
|
320
|
-
const tweetsArray = (data?.data ?? []) as Array<Record<string, unknown>>;
|
|
321
|
-
const tweets: TweetEntry[] = tweetsArray.map((t) => ({
|
|
322
|
-
tweetId: String(t.id ?? ""),
|
|
323
|
-
text: String(t.text ?? ""),
|
|
324
|
-
url: `https://x.com/i/status/${t.id}`,
|
|
325
|
-
createdAt: String(t.created_at ?? ""),
|
|
326
|
-
}));
|
|
327
|
-
return { result: tweets, pathUsed: "managed" };
|
|
328
|
-
} catch (err) {
|
|
329
|
-
if (err instanceof TwitterProxyError) {
|
|
330
|
-
throw Object.assign(new Error(err.message), {
|
|
331
|
-
pathUsed: "managed" as const,
|
|
332
|
-
proxyErrorCode: err.code,
|
|
333
|
-
retryable: err.retryable,
|
|
334
|
-
});
|
|
335
|
-
}
|
|
336
|
-
throw err;
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
if (opts.mode === "oauth") {
|
|
341
|
-
throw Object.assign(
|
|
342
|
-
new Error(
|
|
343
|
-
"Read operations are not supported via OAuth. Use managed mode for read access.",
|
|
344
|
-
),
|
|
345
|
-
{ pathUsed: "oauth" as const },
|
|
346
|
-
);
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
const _exhaustive: never = opts.mode;
|
|
350
|
-
throw new Error(`Unknown mode: ${_exhaustive}`);
|
|
351
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Public types shared across the Twitter CLI module.
|
|
3
|
-
* Extracted from the former browser CDP client.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
export interface PostTweetResult {
|
|
7
|
-
tweetId: string;
|
|
8
|
-
text: string;
|
|
9
|
-
url: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export interface UserInfo {
|
|
13
|
-
userId: string;
|
|
14
|
-
screenName: string;
|
|
15
|
-
name: string;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface TweetEntry {
|
|
19
|
-
tweetId: string;
|
|
20
|
-
text: string;
|
|
21
|
-
url: string;
|
|
22
|
-
createdAt: string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface NotificationEntry {
|
|
26
|
-
id: string;
|
|
27
|
-
message: string;
|
|
28
|
-
timestamp: string;
|
|
29
|
-
url?: string;
|
|
30
|
-
}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: agentmail
|
|
3
|
-
description: Run email operations through a provider-agnostic CLI wrapper
|
|
4
|
-
compatibility: "Designed for Vellum personal assistants"
|
|
5
|
-
metadata: {"emoji":"📬","vellum":{"display-name":"Email CLI Ops","user-invocable":true}}
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## How to run
|
|
9
|
-
|
|
10
|
-
`vellum` is your own CLI binary — it is already installed and available on the PATH.
|
|
11
|
-
Run all commands via `bash`. Do NOT attempt to install, build, or locate the CLI — just execute it directly.
|
|
12
|
-
|
|
13
|
-
Example: `bash("assistant email status --json")`
|
|
14
|
-
|
|
15
|
-
Never use browser/computer-use unless user explicitly approves fallback.
|
|
16
|
-
|
|
17
|
-
## When to Use This Skill
|
|
18
|
-
|
|
19
|
-
This skill manages the **assistant's own** AgentMail address (`@agentmail.to`) — not the user's personal email. Only use this skill when the user explicitly asks the assistant to send email **from the assistant's own address**, manage the assistant's inbox, or perform operations on the assistant's AgentMail account. Generic email requests ("send an email", "check my email", "draft a reply") are about the **user's Gmail** and should be handled by the Messaging skill instead.
|
|
20
|
-
|
|
21
|
-
## Rules
|
|
22
|
-
|
|
23
|
-
- Always run `assistant email` commands via `bash` and parse JSON output.
|
|
24
|
-
- Always do `assistant email status --json` preflight first.
|
|
25
|
-
- Prefer `draft create` before any send — never bypass draft flow.
|
|
26
|
-
- Require explicit user confirmation before `draft approve-send --confirm`.
|
|
27
|
-
- When uncertain, draft to ops@ inbox and notify user.
|
|
28
|
-
- Never send cold outreach without explicit user authorization.
|
|
29
|
-
|
|
30
|
-
## API Key Setup
|
|
31
|
-
|
|
32
|
-
If `assistant email status --json` returns an error about a missing API key, prompt the user for their AgentMail API key using the secure credential prompt. **Never ask the user to paste the key in chat.**
|
|
33
|
-
|
|
34
|
-
Use `credential_store` with:
|
|
35
|
-
- action: `prompt`
|
|
36
|
-
- service: `agentmail`
|
|
37
|
-
- field: `api_key`
|
|
38
|
-
- label: `AgentMail API Key`
|
|
39
|
-
- description: `Get your API key from console.agentmail.to`
|
|
40
|
-
- placeholder: `am_us_...`
|
|
41
|
-
- allowed_tools: `["bash"]`
|
|
42
|
-
- usage_description: `AgentMail email operations via vellum CLI`
|
|
43
|
-
|
|
44
|
-
After the credential is stored, retry `assistant email status --json` to confirm it works.
|
|
45
|
-
|
|
46
|
-
## Workflow
|
|
47
|
-
|
|
48
|
-
1. **Preflight:** `assistant email status --json` (if API key error, run API Key Setup above)
|
|
49
|
-
2. **Quick inbox:** `assistant email inbox create --username <name>` (creates e.g. sam@agentmail.to — no custom domain needed)
|
|
50
|
-
3. **Custom domain setup (optional):** domain -> dns -> verify -> inboxes -> webhook
|
|
51
|
-
4. **Draft path:** `assistant email draft create ...` — always draft first
|
|
52
|
-
5. **Send path:** show draft -> user confirms -> `draft approve-send --draft-id <id> --confirm`
|
|
53
|
-
6. **Inbound triage:** list -> get -> summarize -> propose reply draft
|
|
54
|
-
7. **Guardrails:** check with `guardrails get`, use `guardrails set` to change
|
|
55
|
-
|
|
56
|
-
## Command Reference
|
|
57
|
-
|
|
58
|
-
### Provider
|
|
59
|
-
|
|
60
|
-
```
|
|
61
|
-
assistant email provider get [--json] # Show active provider
|
|
62
|
-
assistant email provider set <provider> [--json] # Switch provider
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### Status
|
|
66
|
-
|
|
67
|
-
```
|
|
68
|
-
assistant email status [--json] # Provider health + guardrails
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Inbox Management
|
|
72
|
-
|
|
73
|
-
```
|
|
74
|
-
assistant email inbox create --username <name> [--domain <d>] [--display-name <n>] [--json] # Create a new inbox (e.g. --username sam)
|
|
75
|
-
assistant email inbox list [--json] # List all inboxes
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
### Setup
|
|
79
|
-
|
|
80
|
-
```
|
|
81
|
-
assistant email setup domain --domain <d> [--dry-run] [--json]
|
|
82
|
-
assistant email setup dns --domain <d> [--json]
|
|
83
|
-
assistant email setup verify --domain <d> [--json]
|
|
84
|
-
assistant email setup inboxes --domain <d> [--json] # Creates standard hello@/support@/ops@ inboxes
|
|
85
|
-
assistant email setup webhook --url <u> [--secret <s>] [--json]
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
### Drafts
|
|
89
|
-
|
|
90
|
-
```
|
|
91
|
-
assistant email draft create --from <addr> --to <addr> --subject <s> --body <b> [--cc <addr>] [--in-reply-to <msg-id>] [--json]
|
|
92
|
-
assistant email draft list [--status pending|approved|sent|rejected] [--json]
|
|
93
|
-
assistant email draft get <draft-id> [--json]
|
|
94
|
-
assistant email draft approve-send --draft-id <id> --confirm [--json]
|
|
95
|
-
assistant email draft reject --draft-id <id> [--reason <text>] [--json]
|
|
96
|
-
assistant email draft delete <draft-id> [--json]
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### Inbound
|
|
100
|
-
|
|
101
|
-
```
|
|
102
|
-
assistant email inbound list [--thread-id <id>] [--json]
|
|
103
|
-
assistant email inbound get <message-id> [--json]
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
### Threads
|
|
107
|
-
|
|
108
|
-
```
|
|
109
|
-
assistant email thread list [--json]
|
|
110
|
-
assistant email thread get <thread-id> [--json]
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
### Guardrails
|
|
114
|
-
|
|
115
|
-
```
|
|
116
|
-
assistant email guardrails get [--json]
|
|
117
|
-
assistant email guardrails set --paused <true|false> --daily-cap <n> [--json]
|
|
118
|
-
assistant email guardrails block <pattern> [--json]
|
|
119
|
-
assistant email guardrails allow <pattern> [--json]
|
|
120
|
-
assistant email guardrails rules [--json]
|
|
121
|
-
assistant email guardrails unrule <rule-id> [--json]
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
## Output Format
|
|
125
|
-
|
|
126
|
-
All commands output JSON (pretty-printed by default, compact with `--json`).
|
|
127
|
-
Every response includes `ok: true|false`.
|
|
128
|
-
|
|
129
|
-
Exit codes:
|
|
130
|
-
- `0` = success (`ok: true`)
|
|
131
|
-
- `1` = error (`ok: false, error: "..."`)
|
|
132
|
-
- `2` = guardrail blocked (`ok: false, error: "outbound_paused|daily_cap_reached|address_blocked"`)
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
-
<rect width="16" height="16" fill="#0a0e27"/>
|
|
3
|
-
<rect x="2" y="3" width="12" height="8" fill="#1e40af" stroke="#60a5fa" stroke-width="1"/>
|
|
4
|
-
<rect x="2" y="3" width="12" height="2" fill="#3b82f6"/>
|
|
5
|
-
<rect x="3" y="4" width="10" height="1" fill="#0a0e27"/>
|
|
6
|
-
<rect x="3" y="5" width="5" height="1" fill="#93c5fd"/>
|
|
7
|
-
<rect x="3" y="6" width="5" height="1" fill="#bfdbfe"/>
|
|
8
|
-
<rect x="9" y="5" width="3" height="1" fill="#bfdbfe"/>
|
|
9
|
-
<rect x="9" y="6" width="3" height="1" fill="#93c5fd"/>
|
|
10
|
-
<rect x="2" y="12" width="3" height="1" fill="#059669"/>
|
|
11
|
-
<rect x="3" y="13" width="2" height="1" fill="#10b981"/>
|
|
12
|
-
<rect x="2" y="14" width="1" height="1" fill="#10b981"/>
|
|
13
|
-
<rect x="3" y="14" width="1" height="1" fill="#34d399"/>
|
|
14
|
-
<rect x="6" y="12" width="8" height="1" fill="#1f2937"/>
|
|
15
|
-
<rect x="6" y="13" width="8" height="1" fill="#374151"/>
|
|
16
|
-
<rect x="6" y="14" width="8" height="1" fill="#1f2937"/>
|
|
17
|
-
<rect x="7" y="13" width="1" height="1" fill="#60a5fa"/>
|
|
18
|
-
<rect x="9" y="13" width="1" height="1" fill="#60a5fa"/>
|
|
19
|
-
<rect x="11" y="13" width="1" height="1" fill="#60a5fa"/>
|
|
20
|
-
<rect x="13" y="13" width="1" height="1" fill="#60a5fa"/>
|
|
21
|
-
</svg>
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: amazon
|
|
3
|
-
description: Shop on Amazon and Amazon Fresh using the built-in CLI integration
|
|
4
|
-
compatibility: "Designed for Vellum personal assistants"
|
|
5
|
-
metadata: {"emoji":"📦","vellum":{"display-name":"Amazon","user-invocable":true}}
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
You can shop on Amazon (and Amazon Fresh for groceries) for the user using the `assistant amazon` CLI.
|
|
9
|
-
|
|
10
|
-
## CLI Setup
|
|
11
|
-
|
|
12
|
-
**IMPORTANT: Always use `host_bash` (not `bash`) for all `assistant amazon` commands.** The Amazon CLI needs host access for session cookies and the `vellum` binary — neither of which are available inside the sandbox.
|
|
13
|
-
|
|
14
|
-
`assistant amazon` is a built-in subcommand of the Vellum assistant CLI — it is NOT a separate tool you need to find or install. It should already be on your PATH. If `vellum` is not found, prepend `PATH="$HOME/.local/bin:$PATH"` to the command. Do NOT search for the binary, inspect wrapper scripts, or try to discover how the CLI works. Just run the commands as documented below.
|
|
15
|
-
|
|
16
|
-
## Typical Flow — Regular Amazon Shopping
|
|
17
|
-
|
|
18
|
-
When the user asks you to order something from Amazon:
|
|
19
|
-
|
|
20
|
-
1. **Check session** — run `assistant amazon status --json`. If `loggedIn` is false or the session is expired, tell the user: "A Chrome window will open to the Amazon login page. Please sign in there — I'll detect your login automatically and minimize the window." Then run `assistant amazon refresh --json`. This starts a Ride Shotgun learn session that records your login and auto-stops once it detects you've signed in. The session is imported automatically. **This command blocks until login is complete — just wait for it.**
|
|
21
|
-
|
|
22
|
-
2. **Search** — run `assistant amazon search "<query>" --json` to find matching products. Present the top results with ASIN, title, price, and Prime status. If the user named a specific product, pick the best match. If ambiguous, ask.
|
|
23
|
-
|
|
24
|
-
3. **Product details** (if needed) — run `assistant amazon product <asin> --json` to get full details including price and variations. For products with variants (size, color, etc.), see the Variations section below.
|
|
25
|
-
|
|
26
|
-
4. **Add to cart** — run `assistant amazon cart add --asin <asin> [--quantity <n>] --json`. The response includes the updated cart with all items.
|
|
27
|
-
|
|
28
|
-
5. **Review cart** — run `assistant amazon cart view --json` and show the user what's in their cart with prices. Ask if they want to add anything else or proceed.
|
|
29
|
-
|
|
30
|
-
6. **Payment methods** — run `assistant amazon payment-methods --json` to see saved cards.
|
|
31
|
-
|
|
32
|
-
7. **Checkout summary** — run `assistant amazon checkout --json` to get order totals (subtotal, shipping, tax, total).
|
|
33
|
-
|
|
34
|
-
8. **Place order** — after the user explicitly confirms, run `assistant amazon order place [--payment-method-id <id>] --json`. The response contains `orderId` on success.
|
|
35
|
-
|
|
36
|
-
## Typical Flow — Amazon Fresh Groceries
|
|
37
|
-
|
|
38
|
-
Amazon Fresh delivers groceries. The flow is the same as regular Amazon, with these additions:
|
|
39
|
-
|
|
40
|
-
1. **Search Fresh** — use the `--fresh` flag: `assistant amazon search "<query>" --fresh --json`
|
|
41
|
-
|
|
42
|
-
2. **Add Fresh items** — use the `--fresh` flag: `assistant amazon cart add --asin <asin> --fresh --json`
|
|
43
|
-
|
|
44
|
-
3. **Select delivery slot** — Fresh orders require a delivery window:
|
|
45
|
-
- `assistant amazon fresh delivery-slots --json` — list available slots
|
|
46
|
-
- `assistant amazon fresh select-slot --slot-id <id> --json` — select a slot
|
|
47
|
-
- Do this BEFORE checkout.
|
|
48
|
-
|
|
49
|
-
4. **Checkout and order** — same as regular Amazon.
|
|
50
|
-
|
|
51
|
-
## Handling Variations
|
|
52
|
-
|
|
53
|
-
Many Amazon products (clothing, electronics) have variations (size, color, style):
|
|
54
|
-
|
|
55
|
-
1. Run `assistant amazon product <asin> --json` to get the product and its `variations[]` array
|
|
56
|
-
2. Each variation has: `dimensionName` (e.g. "size"), `value` (e.g. "Large"), `asin` (child ASIN), `isAvailable`, `priceValue`
|
|
57
|
-
3. Use the child ASIN when adding to cart: `assistant amazon cart add --asin <child-asin> --json`
|
|
58
|
-
|
|
59
|
-
Alternatively, run `assistant amazon variations <asin> --json` to list just the variations.
|
|
60
|
-
|
|
61
|
-
## Session Storage
|
|
62
|
-
|
|
63
|
-
Session cookies are stored in the encrypted credential store under the key `amazon:session:cookies`. You can inspect the stored session with:
|
|
64
|
-
|
|
65
|
-
```bash
|
|
66
|
-
assistant credentials inspect amazon:session:cookies
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
Session capture (`assistant amazon refresh`) and session checks (`assistant amazon status`) use the credential store automatically — no manual file management is needed.
|
|
70
|
-
|
|
71
|
-
## Important Behavior
|
|
72
|
-
|
|
73
|
-
- **Chrome extension relay required.** The Amazon CLI uses `assistant browser chrome relay` internally for browser automation. The Chrome extension must be connected before Amazon commands will work. If a command fails with a connection error, tell the user: "Please open Chrome, click the Vellum extension icon, and click Connect — then I'll retry."
|
|
74
|
-
- **Always confirm before placing order.** Never call `order place` without explicit user approval. Show the cart and total first.
|
|
75
|
-
- **Be proactive.** If the user says "order AA batteries", don't ask clarifying questions upfront — search, find the product, and suggest it. Only ask when you need a choice the user hasn't specified.
|
|
76
|
-
- **Handle expired sessions gracefully.** If any command returns `"error": "session_expired"`, run `assistant amazon refresh --json` to re-capture the session.
|
|
77
|
-
- **Show prices.** Always show prices when presenting products or the cart summary.
|
|
78
|
-
- **Use `--json` flag** on all commands for reliable parsing.
|
|
79
|
-
- **Do NOT use the browser skill.** All Amazon interaction goes through the CLI, not browser automation.
|
|
80
|
-
- **Rate limiting.** Amazon may rate-limit rapid sequential requests. Wait 8–10 seconds between cart operations. If you get a 403 error, wait 15–20 seconds and retry.
|
|
81
|
-
- **Always-allow tip.** At the start of an ordering flow, suggest the user enable "always allow" for `assistant amazon` commands: "Tip: You can type 'a' to always allow `assistant amazon` commands for this session so you won't be prompted each time."
|
|
82
|
-
- **Fresh slot required.** Amazon Fresh orders require a delivery slot to be selected before checkout. If the user skips this step, remind them to run `assistant amazon fresh delivery-slots --json` and select a slot.
|
|
83
|
-
|
|
84
|
-
## Command Reference
|
|
85
|
-
|
|
86
|
-
```
|
|
87
|
-
assistant amazon status --json # Check if logged in
|
|
88
|
-
assistant amazon refresh --json # Capture fresh session via Ride Shotgun
|
|
89
|
-
assistant amazon logout # Clear session
|
|
90
|
-
|
|
91
|
-
assistant amazon search "<query>" [--fresh] [--limit <n>] --json
|
|
92
|
-
assistant amazon product <asin> [--fresh] --json
|
|
93
|
-
assistant amazon variations <asin> --json
|
|
94
|
-
|
|
95
|
-
assistant amazon cart view --json
|
|
96
|
-
assistant amazon cart add --asin <asin> [--quantity <n>] [--fresh] --json
|
|
97
|
-
assistant amazon cart remove --cart-item-id <id> --json
|
|
98
|
-
|
|
99
|
-
assistant amazon fresh delivery-slots --json
|
|
100
|
-
assistant amazon fresh select-slot --slot-id <id> --json
|
|
101
|
-
|
|
102
|
-
assistant amazon payment-methods --json
|
|
103
|
-
assistant amazon checkout --json
|
|
104
|
-
assistant amazon order place [--payment-method-id <id>] --json
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## Example Interactions
|
|
108
|
-
|
|
109
|
-
**User**: "Order a pack of AA batteries from Amazon"
|
|
110
|
-
|
|
111
|
-
1. `assistant amazon status --json` → logged in
|
|
112
|
-
2. `assistant amazon search "AA batteries" --json` → finds products
|
|
113
|
-
3. Show top results: "Duracell AA 20-pack ($12.99, Prime), Amazon Basics AA 48-pack ($14.49, Prime)..."
|
|
114
|
-
4. User picks Duracell → `assistant amazon cart add --asin B00000J1ER --json`
|
|
115
|
-
5. `assistant amazon cart view --json` → show cart summary
|
|
116
|
-
6. `assistant amazon checkout --json` → show total
|
|
117
|
-
7. "Your cart has 1x Duracell AA Batteries 20-pack ($12.99), total $12.99 with free Prime shipping. Ready to order?"
|
|
118
|
-
8. User confirms → `assistant amazon order place --json`
|
|
119
|
-
|
|
120
|
-
**User**: "Order a large blue t-shirt from Amazon"
|
|
121
|
-
|
|
122
|
-
1. `assistant amazon search "blue t-shirt" --json` → finds products
|
|
123
|
-
2. User picks a shirt → `assistant amazon variations <parentAsin> --json` → shows Size + Color combinations
|
|
124
|
-
3. Find the child ASIN for Large + Blue → `assistant amazon cart add --asin <childAsin> --json`
|
|
125
|
-
|
|
126
|
-
**User**: "Order milk and eggs from Amazon Fresh"
|
|
127
|
-
|
|
128
|
-
1. `assistant amazon status --json` → logged in
|
|
129
|
-
2. `assistant amazon search "whole milk" --fresh --json` → Fresh results
|
|
130
|
-
3. `assistant amazon cart add --asin <milkAsin> --fresh --json`
|
|
131
|
-
4. `assistant amazon search "eggs" --fresh --json` → Fresh results
|
|
132
|
-
5. `assistant amazon cart add --asin <eggsAsin> --fresh --json`
|
|
133
|
-
6. `assistant amazon fresh delivery-slots --json` → show available slots
|
|
134
|
-
7. User picks a slot → `assistant amazon fresh select-slot --slot-id <id> --json`
|
|
135
|
-
8. `assistant amazon checkout --json` → show totals
|
|
136
|
-
9. User confirms → `assistant amazon order place --json`
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
-
<rect width="16" height="16" fill="#ffffff"/>
|
|
3
|
-
<rect x="2" y="3" width="12" height="9" fill="#FF9900" stroke="#232F3E" stroke-width="1"/>
|
|
4
|
-
<rect x="3" y="4" width="10" height="7" fill="#FF9900"/>
|
|
5
|
-
<rect x="4" y="5" width="2" height="2" fill="#232F3E"/>
|
|
6
|
-
<rect x="7" y="5" width="2" height="2" fill="#232F3E"/>
|
|
7
|
-
<rect x="10" y="5" width="2" height="2" fill="#232F3E"/>
|
|
8
|
-
<rect x="4" y="8" width="2" height="2" fill="#232F3E"/>
|
|
9
|
-
<rect x="7" y="8" width="2" height="2" fill="#232F3E"/>
|
|
10
|
-
<rect x="10" y="8" width="2" height="2" fill="#232F3E"/>
|
|
11
|
-
<path d="M 3 13 Q 8 14 13 13" stroke="#232F3E" stroke-width="1" fill="none"/>
|
|
12
|
-
<rect x="2" y="13" width="12" height="1" fill="#232F3E"/>
|
|
13
|
-
</svg>
|