@vellumai/assistant 0.4.43 → 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 +46 -44
- package/README.md +15 -16
- package/bun.lock +10 -35
- package/docs/architecture/integrations.md +102 -215
- 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 -3
- 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-asset.test.ts +1 -1
- 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 +32 -36
- 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 +31 -7
- 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 +8 -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__/error-handler-friendly-messages.test.ts +46 -0
- 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__/onboarding-template-contract.test.ts +0 -10
- 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-fail-open-selection.test.ts +12 -2
- 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 -5
- 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 +7 -46
- 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__/starter-task-flow.test.ts +9 -19
- package/src/__tests__/subagent-tools.test.ts +2 -2
- package/src/__tests__/system-prompt.test.ts +7 -7
- 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 +84 -8
- 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 -7
- package/src/config/bundled-skills/app-builder/TOOLS.json +0 -4
- 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 -2
- package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +1 -82
- package/src/config/bundled-skills/doordash/doordash-cli.ts +17 -28
- package/src/config/bundled-skills/doordash/lib/session.ts +21 -17
- 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-cancel.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-create.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 +33 -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 +42 -10
- 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 +53 -41
- package/src/daemon/mcp-reload-service.ts +123 -0
- package/src/daemon/message-protocol.ts +6 -0
- package/src/daemon/message-types/apps.ts +0 -25
- 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 -73
- 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 +8 -2
- package/src/daemon/message-types/settings.ts +1 -1
- package/src/daemon/message-types/shared.ts +1 -1
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/ride-shotgun-handler.ts +35 -43
- package/src/daemon/seed-files.ts +3 -27
- package/src/daemon/server.ts +45 -28
- package/src/daemon/session-agent-loop-handlers.ts +72 -9
- 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 -7
- package/src/daemon/session-skill-tools.ts +12 -11
- package/src/daemon/session-slash.ts +7 -0
- package/src/daemon/session-surfaces.ts +192 -118
- package/src/daemon/session-tool-setup.ts +146 -6
- package/src/daemon/session.ts +75 -37
- 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/app-store.ts +0 -18
- 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 -37
- 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 +13 -17
- 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 +33 -35
- package/src/prompts/templates/BOOTSTRAP.md +0 -3
- 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 +4 -6
- 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 +3 -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 +9 -8
- 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 -8
- package/src/runtime/auth/scopes.ts +2 -1
- package/src/runtime/auth/subject.ts +4 -4
- package/src/runtime/auth/token-service.ts +1 -24
- 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/http-types.ts +10 -0
- package/src/runtime/invite-service.ts +3 -3
- package/src/runtime/local-actor-identity.ts +17 -22
- package/src/runtime/middleware/error-handler.ts +14 -1
- package/src/runtime/pending-interactions.ts +21 -9
- package/src/runtime/routes/app-management-routes.ts +63 -67
- package/src/runtime/routes/approval-routes.ts +1 -3
- package/src/runtime/routes/brain-graph/brain-graph.html +1845 -0
- package/src/runtime/routes/brain-graph-routes.ts +4 -42
- 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 +234 -47
- package/src/runtime/routes/diagnostics-routes.ts +154 -43
- 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 -351
- 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 +37 -0
- package/src/tools/apps/executors.ts +0 -6
- 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/document/editor-template.ts +10 -8
- 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 +12 -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__/home-base-bootstrap.test.ts +0 -84
- package/src/__tests__/managed-twitter-guardrails.test.ts +0 -353
- package/src/__tests__/prebuilt-home-base-seed.test.ts +0 -79
- 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 -450
- 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 -920
- 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 -116
- package/src/cli/commands/twitter/__tests__/cli-error-shaping.test.ts +0 -265
- package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -483
- package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -412
- package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -197
- package/src/cli/commands/twitter/client.ts +0 -989
- package/src/cli/commands/twitter/index.ts +0 -1160
- package/src/cli/commands/twitter/oauth-client.ts +0 -94
- package/src/cli/commands/twitter/router.ts +0 -396
- package/src/cli/commands/twitter/session.ts +0 -121
- 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 -137
- 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 -319
- 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/home-base/app-link-store.ts +0 -78
- package/src/home-base/bootstrap.ts +0 -74
- package/src/home-base/prebuilt/brain-graph.html +0 -1483
- package/src/home-base/prebuilt/index.html +0 -702
- package/src/home-base/prebuilt/seed-metadata.json +0 -21
- package/src/home-base/prebuilt/seed.ts +0 -122
- package/src/home-base/prebuilt-home-base-updater.ts +0 -36
- 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 -405
- package/src/util/cookie-session.ts +0 -98
- /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,920 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI command group: `assistant amazon`
|
|
3
|
-
*
|
|
4
|
-
* Shop on Amazon and Amazon Fresh via the command line.
|
|
5
|
-
* All commands output JSON to stdout. Use --json for machine-readable output.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { Command } from "commander";
|
|
9
|
-
|
|
10
|
-
import {
|
|
11
|
-
addToCart,
|
|
12
|
-
type ExtractedCredential,
|
|
13
|
-
getCheckoutSummary,
|
|
14
|
-
getFreshDeliverySlots,
|
|
15
|
-
getPaymentMethods,
|
|
16
|
-
getProductDetails,
|
|
17
|
-
placeOrder,
|
|
18
|
-
refreshSessionFromExtension,
|
|
19
|
-
removeFromCart,
|
|
20
|
-
search,
|
|
21
|
-
selectFreshDeliverySlot,
|
|
22
|
-
SessionExpiredError,
|
|
23
|
-
viewCart,
|
|
24
|
-
} from "./client.js";
|
|
25
|
-
import {
|
|
26
|
-
clearSession,
|
|
27
|
-
importFromRecording,
|
|
28
|
-
loadSession,
|
|
29
|
-
saveSession,
|
|
30
|
-
} from "./session.js";
|
|
31
|
-
|
|
32
|
-
// ---------------------------------------------------------------------------
|
|
33
|
-
// Helpers
|
|
34
|
-
// ---------------------------------------------------------------------------
|
|
35
|
-
|
|
36
|
-
function output(data: unknown, json: boolean): void {
|
|
37
|
-
process.stdout.write(
|
|
38
|
-
json ? JSON.stringify(data) + "\n" : JSON.stringify(data, null, 2) + "\n",
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function outputError(message: string, code = 1): void {
|
|
43
|
-
output({ ok: false, error: message }, true);
|
|
44
|
-
process.exitCode = code;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function getJson(cmd: Command): boolean {
|
|
48
|
-
let c: Command | null = cmd;
|
|
49
|
-
while (c) {
|
|
50
|
-
if ((c.opts() as { json?: boolean }).json) return true;
|
|
51
|
-
c = c.parent;
|
|
52
|
-
}
|
|
53
|
-
return false;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const SESSION_EXPIRED_MSG =
|
|
57
|
-
"Your Amazon session has expired. Please sign in to Amazon in Chrome — " +
|
|
58
|
-
"the assistant will use Ride Shotgun to capture your session automatically.";
|
|
59
|
-
|
|
60
|
-
async function run(cmd: Command, fn: () => Promise<unknown>): Promise<void> {
|
|
61
|
-
try {
|
|
62
|
-
const result = await fn();
|
|
63
|
-
output({ ok: true, ...(result as Record<string, unknown>) }, getJson(cmd));
|
|
64
|
-
} catch (err) {
|
|
65
|
-
if (err instanceof SessionExpiredError) {
|
|
66
|
-
output(
|
|
67
|
-
{ ok: false, error: "session_expired", message: SESSION_EXPIRED_MSG },
|
|
68
|
-
getJson(cmd),
|
|
69
|
-
);
|
|
70
|
-
process.exitCode = 1;
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
outputError(err instanceof Error ? err.message : String(err));
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// ---------------------------------------------------------------------------
|
|
78
|
-
// Command registration
|
|
79
|
-
// ---------------------------------------------------------------------------
|
|
80
|
-
|
|
81
|
-
export function registerAmazonCommand(program: Command): void {
|
|
82
|
-
const amz = program
|
|
83
|
-
.command("amazon")
|
|
84
|
-
.description(
|
|
85
|
-
"Shop on Amazon and Amazon Fresh. Requires a session imported from a Ride Shotgun recording.",
|
|
86
|
-
)
|
|
87
|
-
.option("--json", "Machine-readable JSON output");
|
|
88
|
-
|
|
89
|
-
amz.addHelpText(
|
|
90
|
-
"after",
|
|
91
|
-
`
|
|
92
|
-
Amazon shopping is powered by session cookies captured via Ride Shotgun.
|
|
93
|
-
A valid session must be established before any shopping commands will work.
|
|
94
|
-
|
|
95
|
-
Session lifecycle:
|
|
96
|
-
1. "refresh" opens Chrome and captures cookies via a Ride Shotgun learn session.
|
|
97
|
-
The user must sign into Amazon when prompted. Existing Chrome tabs are unaffected.
|
|
98
|
-
2. "refresh-headless" reads cookies directly from Chrome's local SQLite database.
|
|
99
|
-
No visible browser window is needed, but Chrome must already be signed into Amazon.
|
|
100
|
-
3. "status" checks whether a valid session exists.
|
|
101
|
-
4. "login" imports a session from a previously saved Ride Shotgun recording file.
|
|
102
|
-
5. "logout" clears the saved session.
|
|
103
|
-
|
|
104
|
-
Product workflow: search for products, view details/variations by ASIN, then add
|
|
105
|
-
to cart. Use --fresh flag for Amazon Fresh grocery items throughout the workflow.
|
|
106
|
-
|
|
107
|
-
Cart and checkout: add/remove items, view cart, get checkout summary, list payment
|
|
108
|
-
methods, and place an order. For Amazon Fresh orders, select a delivery slot first.
|
|
109
|
-
|
|
110
|
-
WARNING: "order place" is IRREVERSIBLE — it charges the user's payment method and
|
|
111
|
-
places a real Amazon order. Always confirm with the user before running it.
|
|
112
|
-
|
|
113
|
-
Examples:
|
|
114
|
-
$ assistant amazon status
|
|
115
|
-
$ assistant amazon refresh
|
|
116
|
-
$ assistant amazon search "AA batteries" --limit 5
|
|
117
|
-
$ assistant amazon cart add --asin B07XXXXX --quantity 2
|
|
118
|
-
$ assistant amazon order place --payment-method-id pm_abc123`,
|
|
119
|
-
);
|
|
120
|
-
|
|
121
|
-
// =========================================================================
|
|
122
|
-
// login — import session from a recording
|
|
123
|
-
// =========================================================================
|
|
124
|
-
amz
|
|
125
|
-
.command("login")
|
|
126
|
-
.description("Import an Amazon session from a Ride Shotgun recording")
|
|
127
|
-
.requiredOption("--recording <path>", "Path to the recording JSON file")
|
|
128
|
-
.addHelpText(
|
|
129
|
-
"after",
|
|
130
|
-
`
|
|
131
|
-
Imports Amazon session cookies from a previously saved Ride Shotgun recording
|
|
132
|
-
file. The recording must contain captured cookies from an authenticated Amazon
|
|
133
|
-
session. Typically used to restore a session from a saved recording rather than
|
|
134
|
-
re-authenticating via "refresh".
|
|
135
|
-
|
|
136
|
-
Examples:
|
|
137
|
-
$ assistant amazon login --recording /path/to/recording.json
|
|
138
|
-
$ assistant amazon login --recording ~/recordings/amazon-2024-01-15.json`,
|
|
139
|
-
)
|
|
140
|
-
.action(async (opts: { recording: string }, cmd: Command) => {
|
|
141
|
-
await run(cmd, async () => {
|
|
142
|
-
const session = await importFromRecording(opts.recording);
|
|
143
|
-
return {
|
|
144
|
-
message: "Session imported successfully",
|
|
145
|
-
cookieCount: session.cookies.length,
|
|
146
|
-
};
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
// =========================================================================
|
|
151
|
-
// logout — clear saved session
|
|
152
|
-
// =========================================================================
|
|
153
|
-
amz
|
|
154
|
-
.command("logout")
|
|
155
|
-
.description("Clear the saved Amazon session")
|
|
156
|
-
.addHelpText(
|
|
157
|
-
"after",
|
|
158
|
-
`
|
|
159
|
-
Removes all saved Amazon session cookies from local storage. After logout,
|
|
160
|
-
all shopping commands will fail until a new session is established via
|
|
161
|
-
"refresh", "refresh-headless", or "login".
|
|
162
|
-
|
|
163
|
-
Examples:
|
|
164
|
-
$ assistant amazon logout`,
|
|
165
|
-
)
|
|
166
|
-
.action(async (_opts: unknown, cmd: Command) => {
|
|
167
|
-
await clearSession();
|
|
168
|
-
output({ ok: true, message: "Session cleared" }, getJson(cmd));
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
// =========================================================================
|
|
172
|
-
// refresh — grab Amazon cookies from Chrome via browser extension
|
|
173
|
-
// =========================================================================
|
|
174
|
-
amz
|
|
175
|
-
.command("refresh")
|
|
176
|
-
.description(
|
|
177
|
-
"Refresh Amazon session by grabbing cookies from Chrome via the browser extension. " +
|
|
178
|
-
"Requires the Vellum Chrome extension to be loaded and connected.",
|
|
179
|
-
)
|
|
180
|
-
.addHelpText(
|
|
181
|
-
"after",
|
|
182
|
-
`
|
|
183
|
-
Grabs Amazon session cookies directly from Chrome via the browser extension
|
|
184
|
-
relay. Much faster than the old Ride Shotgun approach — no separate Chrome
|
|
185
|
-
instance is launched. Requires the Vellum Chrome extension to be loaded
|
|
186
|
-
and connected.
|
|
187
|
-
|
|
188
|
-
If this fails, try "refresh-headless" which reads cookies from Chrome's
|
|
189
|
-
local SQLite database instead.
|
|
190
|
-
|
|
191
|
-
Examples:
|
|
192
|
-
$ assistant amazon refresh
|
|
193
|
-
$ assistant amazon refresh --json`,
|
|
194
|
-
)
|
|
195
|
-
.action(async (_opts: unknown, cmd: Command) => {
|
|
196
|
-
const json = getJson(cmd);
|
|
197
|
-
try {
|
|
198
|
-
const session = await refreshSessionFromExtension();
|
|
199
|
-
output(
|
|
200
|
-
{
|
|
201
|
-
ok: true,
|
|
202
|
-
message: "Session refreshed from Chrome via browser extension",
|
|
203
|
-
cookieCount: session.cookies.length,
|
|
204
|
-
},
|
|
205
|
-
json,
|
|
206
|
-
);
|
|
207
|
-
} catch (err) {
|
|
208
|
-
outputError(err instanceof Error ? err.message : String(err));
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
// =========================================================================
|
|
213
|
-
// refresh-headless — refresh session from Chrome's cookie database
|
|
214
|
-
// =========================================================================
|
|
215
|
-
amz
|
|
216
|
-
.command("refresh-headless")
|
|
217
|
-
.description(
|
|
218
|
-
"Refresh Amazon session by reading cookies directly from Chrome's local database. " +
|
|
219
|
-
"No visible Chrome window needed. Requires Chrome to be signed into Amazon.",
|
|
220
|
-
)
|
|
221
|
-
.addHelpText(
|
|
222
|
-
"after",
|
|
223
|
-
`
|
|
224
|
-
Reads Amazon session cookies directly from Chrome's local SQLite cookie
|
|
225
|
-
database (~/Library/Application Support/Google/Chrome/Default/Cookies).
|
|
226
|
-
No visible Chrome window or user interaction is required.
|
|
227
|
-
|
|
228
|
-
Requirements:
|
|
229
|
-
- Chrome must be installed with a Default profile
|
|
230
|
-
- The user must already be signed into Amazon in Chrome
|
|
231
|
-
- macOS Keychain access for "Chrome Safe Storage" (may prompt once)
|
|
232
|
-
|
|
233
|
-
The cookie database is copied to a temp file before reading to avoid
|
|
234
|
-
interfering with Chrome's WAL journaling. Required cookies (session-id,
|
|
235
|
-
ubid-main, and at-main or x-main) are validated after extraction.
|
|
236
|
-
|
|
237
|
-
Examples:
|
|
238
|
-
$ assistant amazon refresh-headless
|
|
239
|
-
$ assistant amazon refresh-headless --json`,
|
|
240
|
-
)
|
|
241
|
-
.action(async (_opts: unknown, cmd: Command) => {
|
|
242
|
-
const json = getJson(cmd);
|
|
243
|
-
try {
|
|
244
|
-
const session = await extractSessionFromChromeCookies();
|
|
245
|
-
await saveSession(session);
|
|
246
|
-
output(
|
|
247
|
-
{
|
|
248
|
-
ok: true,
|
|
249
|
-
message: "Session refreshed from Chrome cookie database (headless)",
|
|
250
|
-
cookieCount: session.cookies.length,
|
|
251
|
-
},
|
|
252
|
-
json,
|
|
253
|
-
);
|
|
254
|
-
} catch (err) {
|
|
255
|
-
outputError(err instanceof Error ? err.message : String(err));
|
|
256
|
-
}
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
// =========================================================================
|
|
260
|
-
// status — check session status
|
|
261
|
-
// =========================================================================
|
|
262
|
-
amz
|
|
263
|
-
.command("status")
|
|
264
|
-
.description("Check if an Amazon session is active")
|
|
265
|
-
.addHelpText(
|
|
266
|
-
"after",
|
|
267
|
-
`
|
|
268
|
-
Reports whether an Amazon session is currently stored locally. If a session
|
|
269
|
-
exists, returns the cookie count. If no session exists, returns loggedIn: false.
|
|
270
|
-
|
|
271
|
-
Use this to verify session health before running shopping commands.
|
|
272
|
-
|
|
273
|
-
Examples:
|
|
274
|
-
$ assistant amazon status
|
|
275
|
-
$ assistant amazon status --json`,
|
|
276
|
-
)
|
|
277
|
-
.action(async (_opts: unknown, cmd: Command) => {
|
|
278
|
-
const session = await loadSession();
|
|
279
|
-
if (session) {
|
|
280
|
-
output(
|
|
281
|
-
{
|
|
282
|
-
ok: true,
|
|
283
|
-
loggedIn: true,
|
|
284
|
-
cookieCount: session.cookies.length,
|
|
285
|
-
},
|
|
286
|
-
getJson(cmd),
|
|
287
|
-
);
|
|
288
|
-
} else {
|
|
289
|
-
output({ ok: true, loggedIn: false }, getJson(cmd));
|
|
290
|
-
}
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
// =========================================================================
|
|
294
|
-
// search — search for products
|
|
295
|
-
// =========================================================================
|
|
296
|
-
amz
|
|
297
|
-
.command("search")
|
|
298
|
-
.description("Search for products on Amazon")
|
|
299
|
-
.argument("<query>", 'Search query (e.g. "AA batteries", "milk")')
|
|
300
|
-
.option("--fresh", "Search Amazon Fresh grocery items")
|
|
301
|
-
.option("--limit <n>", "Max results", "20")
|
|
302
|
-
.addHelpText(
|
|
303
|
-
"after",
|
|
304
|
-
`
|
|
305
|
-
Arguments:
|
|
306
|
-
query Free-text search query (e.g. "AA batteries", "organic milk").
|
|
307
|
-
Wrap multi-word queries in quotes.
|
|
308
|
-
|
|
309
|
-
Searches Amazon product listings and returns matching results with ASINs,
|
|
310
|
-
titles, prices, and ratings. Use the returned ASINs with "product" or
|
|
311
|
-
"cart add" commands.
|
|
312
|
-
|
|
313
|
-
The --fresh flag restricts results to Amazon Fresh grocery items. The
|
|
314
|
-
--limit flag controls the maximum number of results returned (default: 20).
|
|
315
|
-
|
|
316
|
-
Examples:
|
|
317
|
-
$ assistant amazon search "AA batteries"
|
|
318
|
-
$ assistant amazon search "whole milk" --fresh --limit 10
|
|
319
|
-
$ assistant amazon search "USB-C cable" --limit 5 --json`,
|
|
320
|
-
)
|
|
321
|
-
.action(
|
|
322
|
-
async (
|
|
323
|
-
query: string,
|
|
324
|
-
opts: { fresh?: boolean; limit: string },
|
|
325
|
-
cmd: Command,
|
|
326
|
-
) => {
|
|
327
|
-
await run(cmd, async () => {
|
|
328
|
-
const results = await search(query, {
|
|
329
|
-
isFresh: opts.fresh,
|
|
330
|
-
limit: parseInt(opts.limit, 10),
|
|
331
|
-
});
|
|
332
|
-
return { results, count: results.length };
|
|
333
|
-
});
|
|
334
|
-
},
|
|
335
|
-
);
|
|
336
|
-
|
|
337
|
-
// =========================================================================
|
|
338
|
-
// product — get product details
|
|
339
|
-
// =========================================================================
|
|
340
|
-
amz
|
|
341
|
-
.command("product")
|
|
342
|
-
.description("Get product details for an ASIN")
|
|
343
|
-
.argument("<asin>", "Amazon ASIN (e.g. B07XXXXX)")
|
|
344
|
-
.option("--fresh", "Product is an Amazon Fresh item")
|
|
345
|
-
.addHelpText(
|
|
346
|
-
"after",
|
|
347
|
-
`
|
|
348
|
-
Arguments:
|
|
349
|
-
asin Amazon Standard Identification Number (e.g. B07XXXXX). Obtain
|
|
350
|
-
ASINs from search results or product URLs.
|
|
351
|
-
|
|
352
|
-
Returns detailed product information including title, price, availability,
|
|
353
|
-
description, images, and available variations. Use --fresh if the product
|
|
354
|
-
is an Amazon Fresh grocery item.
|
|
355
|
-
|
|
356
|
-
Examples:
|
|
357
|
-
$ assistant amazon product B07XXXXX
|
|
358
|
-
$ assistant amazon product B08YYYYY --fresh
|
|
359
|
-
$ assistant amazon product B07XXXXX --json`,
|
|
360
|
-
)
|
|
361
|
-
.action(async (asin: string, opts: { fresh?: boolean }, cmd: Command) => {
|
|
362
|
-
await run(cmd, async () => {
|
|
363
|
-
const product = await getProductDetails(asin, { isFresh: opts.fresh });
|
|
364
|
-
return { product };
|
|
365
|
-
});
|
|
366
|
-
});
|
|
367
|
-
|
|
368
|
-
// =========================================================================
|
|
369
|
-
// variations — list product variations (child ASINs)
|
|
370
|
-
// =========================================================================
|
|
371
|
-
amz
|
|
372
|
-
.command("variations")
|
|
373
|
-
.description(
|
|
374
|
-
"List available variations (sizes, colors, etc.) for a product",
|
|
375
|
-
)
|
|
376
|
-
.argument("<asin>", "Parent ASIN")
|
|
377
|
-
.addHelpText(
|
|
378
|
-
"after",
|
|
379
|
-
`
|
|
380
|
-
Arguments:
|
|
381
|
-
asin Parent ASIN to list variations for. Returns child ASINs
|
|
382
|
-
representing different sizes, colors, styles, or configurations.
|
|
383
|
-
|
|
384
|
-
Fetches the product and returns its available variations (child ASINs).
|
|
385
|
-
Each variation includes dimension labels (e.g. "Size: Large", "Color: Blue")
|
|
386
|
-
and its own ASIN for use with "product" or "cart add".
|
|
387
|
-
|
|
388
|
-
Examples:
|
|
389
|
-
$ assistant amazon variations B07XXXXX
|
|
390
|
-
$ assistant amazon variations B07XXXXX --json`,
|
|
391
|
-
)
|
|
392
|
-
.action(async (asin: string, _opts: unknown, cmd: Command) => {
|
|
393
|
-
await run(cmd, async () => {
|
|
394
|
-
const product = await getProductDetails(asin);
|
|
395
|
-
return {
|
|
396
|
-
asin,
|
|
397
|
-
title: product.title,
|
|
398
|
-
variations: product.variations,
|
|
399
|
-
count: product.variations.length,
|
|
400
|
-
};
|
|
401
|
-
});
|
|
402
|
-
});
|
|
403
|
-
|
|
404
|
-
// =========================================================================
|
|
405
|
-
// cart — cart operations (subcommand group)
|
|
406
|
-
// =========================================================================
|
|
407
|
-
const cart = amz.command("cart").description("Cart operations");
|
|
408
|
-
|
|
409
|
-
cart.addHelpText(
|
|
410
|
-
"after",
|
|
411
|
-
`
|
|
412
|
-
Manage the Amazon shopping cart. Items are identified by ASIN when adding
|
|
413
|
-
and by cart-item-id when removing (cart-item-id is returned by "cart view").
|
|
414
|
-
|
|
415
|
-
The cart is shared between regular Amazon and Amazon Fresh items. Use
|
|
416
|
-
--fresh when adding grocery items to route them through the Fresh workflow.
|
|
417
|
-
|
|
418
|
-
Examples:
|
|
419
|
-
$ assistant amazon cart view
|
|
420
|
-
$ assistant amazon cart add --asin B07XXXXX --quantity 2
|
|
421
|
-
$ assistant amazon cart remove --cart-item-id CXYZ123`,
|
|
422
|
-
);
|
|
423
|
-
|
|
424
|
-
// cart view
|
|
425
|
-
cart
|
|
426
|
-
.command("view")
|
|
427
|
-
.description("View cart contents")
|
|
428
|
-
.addHelpText(
|
|
429
|
-
"after",
|
|
430
|
-
`
|
|
431
|
-
Returns all items currently in the cart, including ASIN, title, quantity,
|
|
432
|
-
price, and cart-item-id. Use the cart-item-id with "cart remove" to delete
|
|
433
|
-
individual items.
|
|
434
|
-
|
|
435
|
-
Examples:
|
|
436
|
-
$ assistant amazon cart view
|
|
437
|
-
$ assistant amazon cart view --json`,
|
|
438
|
-
)
|
|
439
|
-
.action(async (_opts: unknown, cmd: Command) => {
|
|
440
|
-
await run(cmd, async () => {
|
|
441
|
-
const result = await viewCart();
|
|
442
|
-
return { cart: result };
|
|
443
|
-
});
|
|
444
|
-
});
|
|
445
|
-
|
|
446
|
-
// cart add
|
|
447
|
-
cart
|
|
448
|
-
.command("add")
|
|
449
|
-
.description("Add a product to the cart")
|
|
450
|
-
.requiredOption("--asin <asin>", "Product ASIN")
|
|
451
|
-
.option("--quantity <n>", "Quantity", "1")
|
|
452
|
-
.option("--fresh", "Amazon Fresh item")
|
|
453
|
-
.option("--verbose", "Show detailed diagnostics for debugging")
|
|
454
|
-
.addHelpText(
|
|
455
|
-
"after",
|
|
456
|
-
`
|
|
457
|
-
Adds a product to the Amazon cart by ASIN.
|
|
458
|
-
|
|
459
|
-
Options:
|
|
460
|
-
--asin <asin> Required. The product ASIN to add (from search or product details).
|
|
461
|
-
--quantity <n> Number of units to add (default: 1).
|
|
462
|
-
--fresh Flag the item as an Amazon Fresh grocery product. Required for
|
|
463
|
-
Fresh items to route through the correct add-to-cart workflow.
|
|
464
|
-
--verbose Print detailed diagnostics to stderr for debugging add-to-cart
|
|
465
|
-
failures. Includes raw Amazon API response data.
|
|
466
|
-
|
|
467
|
-
Examples:
|
|
468
|
-
$ assistant amazon cart add --asin B07XXXXX
|
|
469
|
-
$ assistant amazon cart add --asin B08YYYYY --quantity 3 --fresh
|
|
470
|
-
$ assistant amazon cart add --asin B07XXXXX --verbose`,
|
|
471
|
-
)
|
|
472
|
-
.action(
|
|
473
|
-
async (
|
|
474
|
-
opts: {
|
|
475
|
-
asin: string;
|
|
476
|
-
quantity: string;
|
|
477
|
-
fresh?: boolean;
|
|
478
|
-
verbose?: boolean;
|
|
479
|
-
},
|
|
480
|
-
cmd: Command,
|
|
481
|
-
) => {
|
|
482
|
-
await run(cmd, async () => {
|
|
483
|
-
const result = await addToCart({
|
|
484
|
-
asin: opts.asin,
|
|
485
|
-
quantity: parseInt(opts.quantity, 10),
|
|
486
|
-
isFresh: opts.fresh,
|
|
487
|
-
verbose: opts.verbose,
|
|
488
|
-
});
|
|
489
|
-
// Dump verbose diagnostics to stderr so they don't pollute JSON output
|
|
490
|
-
if (opts.verbose) {
|
|
491
|
-
const v = (result as unknown as Record<string, unknown>).__verbose;
|
|
492
|
-
if (v) {
|
|
493
|
-
process.stderr.write(
|
|
494
|
-
"\n[amazon:verbose] ── Cart Add Diagnostics ──\n",
|
|
495
|
-
);
|
|
496
|
-
for (const [k, val] of Object.entries(
|
|
497
|
-
v as Record<string, unknown>,
|
|
498
|
-
)) {
|
|
499
|
-
const icon = String(val) === "EMPTY" ? "❌" : "✅";
|
|
500
|
-
process.stderr.write(
|
|
501
|
-
`[amazon:verbose] ${icon} ${k}: ${val}\n`,
|
|
502
|
-
);
|
|
503
|
-
}
|
|
504
|
-
process.stderr.write(
|
|
505
|
-
"[amazon:verbose] ──────────────────────────\n\n",
|
|
506
|
-
);
|
|
507
|
-
}
|
|
508
|
-
const d = (result as unknown as Record<string, unknown>).__debug as
|
|
509
|
-
| Record<string, unknown>
|
|
510
|
-
| undefined;
|
|
511
|
-
if (d?.addCartJson) {
|
|
512
|
-
process.stderr.write(
|
|
513
|
-
`[amazon:verbose] Raw Amazon response: ${d.addCartJson}\n\n`,
|
|
514
|
-
);
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
// Strip internal debug fields from JSON output unless verbose
|
|
518
|
-
if (!opts.verbose) {
|
|
519
|
-
delete (result as unknown as Record<string, unknown>).__verbose;
|
|
520
|
-
delete (result as unknown as Record<string, unknown>).__debug;
|
|
521
|
-
}
|
|
522
|
-
return { cart: result };
|
|
523
|
-
});
|
|
524
|
-
},
|
|
525
|
-
);
|
|
526
|
-
|
|
527
|
-
// cart remove
|
|
528
|
-
cart
|
|
529
|
-
.command("remove")
|
|
530
|
-
.description("Remove an item from the cart")
|
|
531
|
-
.requiredOption("--cart-item-id <id>", "Cart item ID (from cart view)")
|
|
532
|
-
.addHelpText(
|
|
533
|
-
"after",
|
|
534
|
-
`
|
|
535
|
-
Removes a single item from the cart by its cart-item-id.
|
|
536
|
-
|
|
537
|
-
Options:
|
|
538
|
-
--cart-item-id <id> Required. The cart item identifier returned by "cart view".
|
|
539
|
-
This is NOT the product ASIN — it is Amazon's internal cart
|
|
540
|
-
line-item ID.
|
|
541
|
-
|
|
542
|
-
Examples:
|
|
543
|
-
$ assistant amazon cart remove --cart-item-id CXYZ123
|
|
544
|
-
$ assistant amazon cart remove --cart-item-id CXYZ123 --json`,
|
|
545
|
-
)
|
|
546
|
-
.action(async (opts: { cartItemId: string }, cmd: Command) => {
|
|
547
|
-
await run(cmd, async () => {
|
|
548
|
-
const result = await removeFromCart({ cartItemId: opts.cartItemId });
|
|
549
|
-
return { cart: result };
|
|
550
|
-
});
|
|
551
|
-
});
|
|
552
|
-
|
|
553
|
-
// =========================================================================
|
|
554
|
-
// fresh — Amazon Fresh operations (subcommand group)
|
|
555
|
-
// =========================================================================
|
|
556
|
-
const fresh = amz
|
|
557
|
-
.command("fresh")
|
|
558
|
-
.description("Amazon Fresh grocery delivery operations");
|
|
559
|
-
|
|
560
|
-
fresh.addHelpText(
|
|
561
|
-
"after",
|
|
562
|
-
`
|
|
563
|
-
Amazon Fresh grocery delivery management. Before placing a Fresh order, a
|
|
564
|
-
delivery slot must be selected. Use "delivery-slots" to list available time
|
|
565
|
-
windows, then "select-slot" to reserve one.
|
|
566
|
-
|
|
567
|
-
Fresh items must also be added to cart with the --fresh flag:
|
|
568
|
-
$ assistant amazon cart add --asin B08YYYYY --fresh
|
|
569
|
-
|
|
570
|
-
Examples:
|
|
571
|
-
$ assistant amazon fresh delivery-slots
|
|
572
|
-
$ assistant amazon fresh select-slot --slot-id slot_abc123`,
|
|
573
|
-
);
|
|
574
|
-
|
|
575
|
-
// fresh delivery-slots
|
|
576
|
-
fresh
|
|
577
|
-
.command("delivery-slots")
|
|
578
|
-
.description("Get available Amazon Fresh delivery slots")
|
|
579
|
-
.addHelpText(
|
|
580
|
-
"after",
|
|
581
|
-
`
|
|
582
|
-
Lists available Amazon Fresh delivery time windows. Each slot includes a
|
|
583
|
-
slot ID, date, time range, and availability status. Use the slot ID with
|
|
584
|
-
"fresh select-slot" to reserve a delivery window before placing an order.
|
|
585
|
-
|
|
586
|
-
Slot availability changes frequently. Re-check before placing an order if
|
|
587
|
-
significant time has passed since the last query.
|
|
588
|
-
|
|
589
|
-
Examples:
|
|
590
|
-
$ assistant amazon fresh delivery-slots
|
|
591
|
-
$ assistant amazon fresh delivery-slots --json`,
|
|
592
|
-
)
|
|
593
|
-
.action(async (_opts: unknown, cmd: Command) => {
|
|
594
|
-
await run(cmd, async () => {
|
|
595
|
-
const slots = await getFreshDeliverySlots();
|
|
596
|
-
return { slots, count: slots.length };
|
|
597
|
-
});
|
|
598
|
-
});
|
|
599
|
-
|
|
600
|
-
// fresh select-slot
|
|
601
|
-
fresh
|
|
602
|
-
.command("select-slot")
|
|
603
|
-
.description("Select an Amazon Fresh delivery slot")
|
|
604
|
-
.requiredOption(
|
|
605
|
-
"--slot-id <id>",
|
|
606
|
-
"Delivery slot ID (from delivery-slots command)",
|
|
607
|
-
)
|
|
608
|
-
.addHelpText(
|
|
609
|
-
"after",
|
|
610
|
-
`
|
|
611
|
-
Reserves an Amazon Fresh delivery slot for the current order. The slot ID
|
|
612
|
-
must be obtained from "fresh delivery-slots". A slot must be selected before
|
|
613
|
-
placing an Amazon Fresh order via "order place".
|
|
614
|
-
|
|
615
|
-
Examples:
|
|
616
|
-
$ assistant amazon fresh select-slot --slot-id slot_abc123
|
|
617
|
-
$ assistant amazon fresh select-slot --slot-id slot_abc123 --json`,
|
|
618
|
-
)
|
|
619
|
-
.action(async (opts: { slotId: string }, cmd: Command) => {
|
|
620
|
-
await run(cmd, async () => {
|
|
621
|
-
const result = await selectFreshDeliverySlot(opts.slotId);
|
|
622
|
-
return result;
|
|
623
|
-
});
|
|
624
|
-
});
|
|
625
|
-
|
|
626
|
-
// =========================================================================
|
|
627
|
-
// payment-methods — list saved payment methods
|
|
628
|
-
// =========================================================================
|
|
629
|
-
amz
|
|
630
|
-
.command("payment-methods")
|
|
631
|
-
.description("List saved payment methods")
|
|
632
|
-
.addHelpText(
|
|
633
|
-
"after",
|
|
634
|
-
`
|
|
635
|
-
Lists all payment methods saved on the user's Amazon account. Each method
|
|
636
|
-
includes a payment-method-id, type (credit card, debit, etc.), and a
|
|
637
|
-
masked description. Use the payment-method-id with "order place" to select
|
|
638
|
-
a specific payment method.
|
|
639
|
-
|
|
640
|
-
If no --payment-method-id is passed to "order place", Amazon uses the
|
|
641
|
-
account's default payment method.
|
|
642
|
-
|
|
643
|
-
Examples:
|
|
644
|
-
$ assistant amazon payment-methods
|
|
645
|
-
$ assistant amazon payment-methods --json`,
|
|
646
|
-
)
|
|
647
|
-
.action(async (_opts: unknown, cmd: Command) => {
|
|
648
|
-
await run(cmd, async () => {
|
|
649
|
-
const methods = await getPaymentMethods();
|
|
650
|
-
return { methods, count: methods.length };
|
|
651
|
-
});
|
|
652
|
-
});
|
|
653
|
-
|
|
654
|
-
// =========================================================================
|
|
655
|
-
// checkout — get checkout summary
|
|
656
|
-
// =========================================================================
|
|
657
|
-
amz
|
|
658
|
-
.command("checkout")
|
|
659
|
-
.description("Get checkout summary (totals, shipping, payment options)")
|
|
660
|
-
.addHelpText(
|
|
661
|
-
"after",
|
|
662
|
-
`
|
|
663
|
-
Retrieves the checkout summary without placing an order. Returns item
|
|
664
|
-
totals, shipping cost, tax, estimated delivery dates, selected payment
|
|
665
|
-
method, and shipping address.
|
|
666
|
-
|
|
667
|
-
Use this to review the order before committing with "order place". This
|
|
668
|
-
command is read-only and does not charge or modify the cart.
|
|
669
|
-
|
|
670
|
-
Examples:
|
|
671
|
-
$ assistant amazon checkout
|
|
672
|
-
$ assistant amazon checkout --json`,
|
|
673
|
-
)
|
|
674
|
-
.action(async (_opts: unknown, cmd: Command) => {
|
|
675
|
-
await run(cmd, async () => {
|
|
676
|
-
const summary = await getCheckoutSummary();
|
|
677
|
-
return { summary };
|
|
678
|
-
});
|
|
679
|
-
});
|
|
680
|
-
|
|
681
|
-
// =========================================================================
|
|
682
|
-
// order — order operations (subcommand group)
|
|
683
|
-
// =========================================================================
|
|
684
|
-
const order = amz.command("order").description("Order operations");
|
|
685
|
-
|
|
686
|
-
order.addHelpText(
|
|
687
|
-
"after",
|
|
688
|
-
`
|
|
689
|
-
Order management commands. Currently supports placing orders.
|
|
690
|
-
|
|
691
|
-
WARNING: "order place" is IRREVERSIBLE. It charges the user's payment
|
|
692
|
-
method and submits a real Amazon order that cannot be undone via this CLI.
|
|
693
|
-
Always confirm with the user and review checkout summary first.
|
|
694
|
-
|
|
695
|
-
Examples:
|
|
696
|
-
$ assistant amazon checkout
|
|
697
|
-
$ assistant amazon order place`,
|
|
698
|
-
);
|
|
699
|
-
|
|
700
|
-
// order place
|
|
701
|
-
order
|
|
702
|
-
.command("place")
|
|
703
|
-
.description(
|
|
704
|
-
"Place an Amazon order (IRREVERSIBLE — always confirm with user first)",
|
|
705
|
-
)
|
|
706
|
-
.option(
|
|
707
|
-
"--payment-method-id <id>",
|
|
708
|
-
"Payment method ID (uses default if omitted)",
|
|
709
|
-
)
|
|
710
|
-
.addHelpText(
|
|
711
|
-
"after",
|
|
712
|
-
`
|
|
713
|
-
*** IRREVERSIBLE *** This command places a real Amazon order. It charges the
|
|
714
|
-
user's payment method and cannot be cancelled or undone through this CLI.
|
|
715
|
-
Always review "checkout" output and get explicit user confirmation first.
|
|
716
|
-
|
|
717
|
-
Options:
|
|
718
|
-
--payment-method-id <id> Payment method to charge. Obtain IDs from
|
|
719
|
-
"payment-methods". If omitted, Amazon uses the
|
|
720
|
-
account's default payment method.
|
|
721
|
-
|
|
722
|
-
For Amazon Fresh orders, select a delivery slot before placing the order:
|
|
723
|
-
$ assistant amazon fresh select-slot --slot-id slot_abc123
|
|
724
|
-
|
|
725
|
-
Recommended workflow before placing an order:
|
|
726
|
-
1. assistant amazon cart view (verify cart contents)
|
|
727
|
-
2. assistant amazon checkout (review totals and shipping)
|
|
728
|
-
3. Confirm with the user
|
|
729
|
-
4. assistant amazon order place
|
|
730
|
-
|
|
731
|
-
Examples:
|
|
732
|
-
$ assistant amazon order place
|
|
733
|
-
$ assistant amazon order place --payment-method-id pm_abc123
|
|
734
|
-
$ assistant amazon order place --json`,
|
|
735
|
-
)
|
|
736
|
-
.action(async (opts: { paymentMethodId?: string }, cmd: Command) => {
|
|
737
|
-
await run(cmd, async () => {
|
|
738
|
-
const result = await placeOrder({
|
|
739
|
-
paymentMethodId: opts.paymentMethodId,
|
|
740
|
-
});
|
|
741
|
-
return { order: result };
|
|
742
|
-
});
|
|
743
|
-
});
|
|
744
|
-
}
|
|
745
|
-
|
|
746
|
-
// ---------------------------------------------------------------------------
|
|
747
|
-
// Headless cookie extraction from Chrome's SQLite database
|
|
748
|
-
// ---------------------------------------------------------------------------
|
|
749
|
-
|
|
750
|
-
import { execSync } from "node:child_process";
|
|
751
|
-
import * as crypto from "node:crypto";
|
|
752
|
-
import {
|
|
753
|
-
copyFileSync,
|
|
754
|
-
existsSync as fileExists,
|
|
755
|
-
unlinkSync as unlinkFileSync,
|
|
756
|
-
} from "node:fs";
|
|
757
|
-
import { homedir, tmpdir } from "node:os";
|
|
758
|
-
import { join as pathJoin } from "node:path";
|
|
759
|
-
|
|
760
|
-
const CHROME_COOKIES_DB = pathJoin(
|
|
761
|
-
homedir(),
|
|
762
|
-
"Library/Application Support/Google/Chrome/Default/Cookies",
|
|
763
|
-
);
|
|
764
|
-
|
|
765
|
-
/**
|
|
766
|
-
* Decrypt a Chrome cookie encrypted_value blob on macOS.
|
|
767
|
-
* Chrome uses AES-128-CBC with a key derived from the Keychain password via PBKDF2.
|
|
768
|
-
* The encrypted blob is prefixed with 'v10' (3 bytes).
|
|
769
|
-
*/
|
|
770
|
-
function decryptChromeCookie(
|
|
771
|
-
encHex: string,
|
|
772
|
-
derivedKey: Buffer,
|
|
773
|
-
): string | null {
|
|
774
|
-
const buf = Buffer.from(encHex, "hex");
|
|
775
|
-
if (buf.length < 4 || buf.slice(0, 3).toString() !== "v10") return null;
|
|
776
|
-
try {
|
|
777
|
-
const iv = Buffer.alloc(16, 0x20); // Chrome uses 16 space characters as IV
|
|
778
|
-
const decipher = crypto.createDecipheriv("aes-128-cbc", derivedKey, iv);
|
|
779
|
-
const decrypted = Buffer.concat([
|
|
780
|
-
decipher.update(buf.slice(3)),
|
|
781
|
-
decipher.final(),
|
|
782
|
-
]);
|
|
783
|
-
// Strip leading non-printable bytes (padding artifacts)
|
|
784
|
-
const str = decrypted.toString("utf-8");
|
|
785
|
-
const match = str.match(/[\x20-\x7e]+/);
|
|
786
|
-
return match ? match[0] : null;
|
|
787
|
-
} catch {
|
|
788
|
-
return null;
|
|
789
|
-
}
|
|
790
|
-
}
|
|
791
|
-
|
|
792
|
-
/**
|
|
793
|
-
* Extract Amazon session cookies directly from Chrome's local SQLite cookie database.
|
|
794
|
-
* No visible Chrome window or user interaction required.
|
|
795
|
-
*
|
|
796
|
-
* Requirements:
|
|
797
|
-
* - Chrome must be installed with a Default profile
|
|
798
|
-
* - The user must be signed into Amazon in Chrome
|
|
799
|
-
* - macOS Keychain access for 'Chrome Safe Storage' (will prompt once)
|
|
800
|
-
*/
|
|
801
|
-
async function extractSessionFromChromeCookies(): Promise<
|
|
802
|
-
import("./session.js").AmazonSession
|
|
803
|
-
> {
|
|
804
|
-
// 1. Get Chrome Safe Storage key from macOS Keychain
|
|
805
|
-
let keychainPassword: string;
|
|
806
|
-
try {
|
|
807
|
-
keychainPassword = execSync(
|
|
808
|
-
'security find-generic-password -w -s "Chrome Safe Storage" -a "Chrome"',
|
|
809
|
-
{ encoding: "utf-8" },
|
|
810
|
-
).trim();
|
|
811
|
-
} catch {
|
|
812
|
-
throw new Error(
|
|
813
|
-
"Could not read Chrome Safe Storage key from macOS Keychain. " +
|
|
814
|
-
"Make sure Chrome is installed and has been opened at least once.",
|
|
815
|
-
);
|
|
816
|
-
}
|
|
817
|
-
|
|
818
|
-
// 2. Derive the AES key using PBKDF2 (same as Chrome's implementation)
|
|
819
|
-
const derivedKey = crypto.pbkdf2Sync(
|
|
820
|
-
keychainPassword,
|
|
821
|
-
"saltysalt",
|
|
822
|
-
1003,
|
|
823
|
-
16,
|
|
824
|
-
"sha1",
|
|
825
|
-
);
|
|
826
|
-
|
|
827
|
-
// 3. Copy the Cookies DB to a temp file, then query the copy.
|
|
828
|
-
// Reading Chrome's live SQLite DB directly can interfere with Chrome's
|
|
829
|
-
// WAL journaling and cause session logouts. Copying first is safe.
|
|
830
|
-
const tmpCookiesDb = pathJoin(
|
|
831
|
-
tmpdir(),
|
|
832
|
-
`vellum-chrome-cookies-${Date.now()}.db`,
|
|
833
|
-
);
|
|
834
|
-
let rawOutput: string;
|
|
835
|
-
try {
|
|
836
|
-
copyFileSync(CHROME_COOKIES_DB, tmpCookiesDb);
|
|
837
|
-
// Also copy WAL and SHM files if they exist, so the copy is consistent
|
|
838
|
-
const walPath = CHROME_COOKIES_DB + "-wal";
|
|
839
|
-
const shmPath = CHROME_COOKIES_DB + "-shm";
|
|
840
|
-
if (fileExists(walPath)) copyFileSync(walPath, tmpCookiesDb + "-wal");
|
|
841
|
-
if (fileExists(shmPath)) copyFileSync(shmPath, tmpCookiesDb + "-shm");
|
|
842
|
-
|
|
843
|
-
rawOutput = execSync(
|
|
844
|
-
`sqlite3 "${tmpCookiesDb}" "SELECT name, hex(encrypted_value), host_key, path, is_httponly, is_secure, expires_utc FROM cookies WHERE host_key LIKE '%amazon.com%'"`,
|
|
845
|
-
{ encoding: "utf-8" },
|
|
846
|
-
).trim();
|
|
847
|
-
} catch {
|
|
848
|
-
throw new Error(
|
|
849
|
-
"Could not read Chrome Cookies database. " +
|
|
850
|
-
"Make sure Chrome is installed and the Cookies file exists.",
|
|
851
|
-
);
|
|
852
|
-
} finally {
|
|
853
|
-
// Clean up temp files
|
|
854
|
-
try {
|
|
855
|
-
unlinkFileSync(tmpCookiesDb);
|
|
856
|
-
} catch {}
|
|
857
|
-
try {
|
|
858
|
-
unlinkFileSync(tmpCookiesDb + "-wal");
|
|
859
|
-
} catch {}
|
|
860
|
-
try {
|
|
861
|
-
unlinkFileSync(tmpCookiesDb + "-shm");
|
|
862
|
-
} catch {}
|
|
863
|
-
}
|
|
864
|
-
|
|
865
|
-
if (!rawOutput) {
|
|
866
|
-
throw new Error(
|
|
867
|
-
"No Amazon cookies found in Chrome. " +
|
|
868
|
-
"Make sure you are signed into Amazon in Chrome.",
|
|
869
|
-
);
|
|
870
|
-
}
|
|
871
|
-
|
|
872
|
-
// 4. Decrypt each cookie
|
|
873
|
-
const cookies: ExtractedCredential[] = [];
|
|
874
|
-
for (const line of rawOutput.split("\n")) {
|
|
875
|
-
const parts = line.split("|");
|
|
876
|
-
if (parts.length < 7) continue;
|
|
877
|
-
const [name, encHex, domain, path, httpOnly, secure, expiresUtc] = parts;
|
|
878
|
-
if (!encHex) continue;
|
|
879
|
-
|
|
880
|
-
const value = decryptChromeCookie(encHex, derivedKey);
|
|
881
|
-
if (!value) continue;
|
|
882
|
-
|
|
883
|
-
cookies.push({
|
|
884
|
-
name,
|
|
885
|
-
value,
|
|
886
|
-
domain,
|
|
887
|
-
path: path || "/",
|
|
888
|
-
httpOnly: httpOnly === "1",
|
|
889
|
-
secure: secure === "1",
|
|
890
|
-
expires: expiresUtc
|
|
891
|
-
? Math.floor(parseInt(expiresUtc, 10) / 1000000 - 11644473600)
|
|
892
|
-
: undefined,
|
|
893
|
-
});
|
|
894
|
-
}
|
|
895
|
-
|
|
896
|
-
// 5. Validate required cookies are present
|
|
897
|
-
const cookieNames = new Set(cookies.map((c) => c.name));
|
|
898
|
-
if (!cookieNames.has("session-id")) {
|
|
899
|
-
throw new Error(
|
|
900
|
-
"Chrome cookies are missing required Amazon cookie: session-id. " +
|
|
901
|
-
"Make sure you are signed into Amazon in Chrome.",
|
|
902
|
-
);
|
|
903
|
-
}
|
|
904
|
-
if (!cookieNames.has("ubid-main")) {
|
|
905
|
-
throw new Error(
|
|
906
|
-
"Chrome cookies are missing required Amazon cookie: ubid-main. " +
|
|
907
|
-
"Make sure you are signed into Amazon in Chrome.",
|
|
908
|
-
);
|
|
909
|
-
}
|
|
910
|
-
if (!cookieNames.has("at-main") && !cookieNames.has("x-main")) {
|
|
911
|
-
throw new Error(
|
|
912
|
-
"Chrome cookies are missing required Amazon auth cookie (at-main or x-main). " +
|
|
913
|
-
"Make sure you are fully signed into Amazon in Chrome.",
|
|
914
|
-
);
|
|
915
|
-
}
|
|
916
|
-
|
|
917
|
-
return {
|
|
918
|
-
cookies,
|
|
919
|
-
};
|
|
920
|
-
}
|