@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.
Files changed (681) hide show
  1. package/.prettierignore +4 -0
  2. package/ARCHITECTURE.md +34 -31
  3. package/README.md +4 -4
  4. package/bun.lock +10 -35
  5. package/docs/architecture/integrations.md +102 -197
  6. package/docs/architecture/keychain-broker.md +1 -1
  7. package/docs/architecture/memory.md +2 -2
  8. package/docs/architecture/scheduling.md +1 -1
  9. package/docs/architecture/security.md +11 -11
  10. package/docs/error-handling.md +1 -1
  11. package/docs/trusted-contact-access.md +3 -3
  12. package/drizzle/meta/0000_snapshot.json +34 -100
  13. package/drizzle/meta/_journal.json +1 -1
  14. package/drizzle.config.ts +4 -4
  15. package/package.json +3 -2
  16. package/scripts/capture-x-graphql.ts +237 -141
  17. package/scripts/generate-bundled-tool-registry.ts +223 -0
  18. package/src/__tests__/access-request-decision.test.ts +0 -1
  19. package/src/__tests__/actor-token-service.test.ts +23 -24
  20. package/src/__tests__/agent-loop.test.ts +0 -131
  21. package/src/__tests__/always-loaded-tools-guard.test.ts +71 -0
  22. package/src/__tests__/amazon-cdp-integration.test.ts +11 -9
  23. package/src/__tests__/approval-primitive.test.ts +0 -1
  24. package/src/__tests__/approval-routes-http.test.ts +11 -1
  25. package/src/__tests__/asset-materialize-tool.test.ts +0 -1
  26. package/src/__tests__/asset-search-tool.test.ts +0 -1
  27. package/src/__tests__/assistant-attachment-directive.test.ts +1 -1
  28. package/src/__tests__/assistant-events-sse-hardening.test.ts +0 -1
  29. package/src/__tests__/assistant-feature-flag-guardrails.test.ts +0 -2
  30. package/src/__tests__/assistant-feature-flags-integration.test.ts +70 -18
  31. package/src/__tests__/assistant-id-boundary-guard.test.ts +6 -6
  32. package/src/__tests__/attachments-store.test.ts +0 -1
  33. package/src/__tests__/avatar-e2e.test.ts +74 -115
  34. package/src/__tests__/avatar-router.test.ts +25 -62
  35. package/src/__tests__/browser-manager.test.ts +24 -0
  36. package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +4 -3
  37. package/src/__tests__/browser-skill-endstate.test.ts +8 -11
  38. package/src/__tests__/btw-routes.test.ts +326 -0
  39. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +23 -9
  40. package/src/__tests__/call-controller.test.ts +0 -1
  41. package/src/__tests__/call-conversation-messages.test.ts +0 -1
  42. package/src/__tests__/call-domain.test.ts +0 -1
  43. package/src/__tests__/call-pointer-messages.test.ts +0 -1
  44. package/src/__tests__/call-recovery.test.ts +0 -1
  45. package/src/__tests__/call-routes-http.test.ts +0 -1
  46. package/src/__tests__/call-store.test.ts +0 -1
  47. package/src/__tests__/canonical-guardian-store.test.ts +0 -1
  48. package/src/__tests__/channel-approval-routes.test.ts +1 -1
  49. package/src/__tests__/channel-approvals.test.ts +1 -1
  50. package/src/__tests__/channel-delivery-store.test.ts +0 -1
  51. package/src/__tests__/channel-guardian.test.ts +5 -7
  52. package/src/__tests__/channel-retry-sweep.test.ts +0 -1
  53. package/src/__tests__/checker.test.ts +4 -11
  54. package/src/__tests__/compaction.benchmark.test.ts +16 -14
  55. package/src/__tests__/computer-use-session-lifecycle.test.ts +10 -11
  56. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  57. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +2 -5
  58. package/src/__tests__/computer-use-tools.test.ts +35 -31
  59. package/src/__tests__/config-schema.test.ts +11 -15
  60. package/src/__tests__/config-watcher.test.ts +0 -1
  61. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  62. package/src/__tests__/conflict-store.test.ts +0 -1
  63. package/src/__tests__/connection-policy.test.ts +4 -7
  64. package/src/__tests__/contacts-tools.test.ts +0 -1
  65. package/src/__tests__/context-memory-e2e.test.ts +2 -4
  66. package/src/__tests__/context-overflow-reducer.test.ts +2 -4
  67. package/src/__tests__/context-window-manager.test.ts +147 -60
  68. package/src/__tests__/contradiction-checker.test.ts +0 -1
  69. package/src/__tests__/conversation-attention-store.test.ts +0 -1
  70. package/src/__tests__/conversation-attention-telegram.test.ts +1 -1
  71. package/src/__tests__/conversation-pairing.test.ts +2 -2
  72. package/src/__tests__/conversation-routes-guardian-reply.test.ts +25 -1
  73. package/src/__tests__/conversation-routes-slash-commands.test.ts +381 -0
  74. package/src/__tests__/conversation-store.test.ts +0 -1
  75. package/src/__tests__/conversation-unread-route.test.ts +1 -2
  76. package/src/__tests__/credential-security-invariants.test.ts +7 -8
  77. package/src/__tests__/cross-provider-web-search.test.ts +353 -0
  78. package/src/__tests__/daemon-assistant-events.test.ts +6 -7
  79. package/src/__tests__/db-schedule-syntax-migration.test.ts +15 -3
  80. package/src/__tests__/delete-managed-skill-tool.test.ts +5 -9
  81. package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -1
  82. package/src/__tests__/diagnostics-export.test.ts +189 -0
  83. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  84. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
  85. package/src/__tests__/entity-extractor.test.ts +0 -1
  86. package/src/__tests__/entity-search.test.ts +0 -1
  87. package/src/__tests__/ephemeral-permissions.test.ts +2 -4
  88. package/src/__tests__/file-read-tool.test.ts +86 -0
  89. package/src/__tests__/followup-tools.test.ts +0 -1
  90. package/src/__tests__/frontmatter.test.ts +77 -34
  91. package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
  92. package/src/__tests__/gateway-only-guard.test.ts +1 -1
  93. package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -1
  94. package/src/__tests__/guardian-action-followup-executor.test.ts +0 -1
  95. package/src/__tests__/guardian-action-followup-store.test.ts +0 -1
  96. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
  97. package/src/__tests__/guardian-action-late-reply.test.ts +0 -1
  98. package/src/__tests__/guardian-action-store.test.ts +0 -1
  99. package/src/__tests__/guardian-action-sweep.test.ts +0 -1
  100. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
  101. package/src/__tests__/guardian-dispatch.test.ts +1 -2
  102. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  103. package/src/__tests__/guardian-outbound-http.test.ts +0 -1
  104. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -1
  105. package/src/__tests__/guardian-routing-invariants.test.ts +1 -1
  106. package/src/__tests__/guardian-routing-state.test.ts +0 -1
  107. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
  108. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +3 -5
  109. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +28 -426
  110. package/src/__tests__/host-bash-proxy.test.ts +335 -0
  111. package/src/__tests__/host-file-proxy.test.ts +374 -0
  112. package/src/__tests__/host-shell-tool.test.ts +147 -1
  113. package/src/__tests__/http-user-message-parity.test.ts +361 -0
  114. package/src/__tests__/inbound-invite-redemption.test.ts +0 -1
  115. package/src/__tests__/integration-status.test.ts +3 -8
  116. package/src/__tests__/intent-routing.test.ts +7 -46
  117. package/src/__tests__/invite-redemption-service.test.ts +0 -1
  118. package/src/__tests__/invite-routes-http.test.ts +0 -1
  119. package/src/__tests__/llm-usage-store.test.ts +0 -1
  120. package/src/__tests__/managed-avatar-client.test.ts +101 -55
  121. package/src/__tests__/managed-skill-lifecycle.test.ts +9 -18
  122. package/src/__tests__/managed-store.test.ts +94 -21
  123. package/src/__tests__/media-reuse-story.e2e.test.ts +0 -1
  124. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +2 -4
  125. package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -1
  126. package/src/__tests__/memory-recall-quality.test.ts +0 -1
  127. package/src/__tests__/memory-regressions.experimental.test.ts +0 -1
  128. package/src/__tests__/memory-regressions.test.ts +0 -1
  129. package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -1
  130. package/src/__tests__/memory-upsert-concurrency.test.ts +0 -1
  131. package/src/__tests__/messaging-send-tool.test.ts +35 -0
  132. package/src/__tests__/messaging-skill-split.test.ts +138 -0
  133. package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -1
  134. package/src/__tests__/migration-export-http.test.ts +2 -3
  135. package/src/__tests__/migration-import-commit-http.test.ts +1 -2
  136. package/src/__tests__/migration-import-preflight-http.test.ts +1 -2
  137. package/src/__tests__/migration-validate-http.test.ts +1 -2
  138. package/src/__tests__/native-web-search.test.ts +475 -0
  139. package/src/__tests__/navigate-settings-tab.test.ts +84 -0
  140. package/src/__tests__/non-member-access-request.test.ts +0 -1
  141. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  142. package/src/__tests__/notification-decision-strategy.test.ts +6 -6
  143. package/src/__tests__/notification-deep-link.test.ts +7 -7
  144. package/src/__tests__/notification-guardian-path.test.ts +2 -3
  145. package/src/__tests__/notification-telegram-adapter.test.ts +1 -1
  146. package/src/__tests__/notification-thread-candidates.test.ts +4 -4
  147. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
  148. package/src/__tests__/playbook-execution.test.ts +0 -1
  149. package/src/__tests__/playbook-tools.test.ts +0 -1
  150. package/src/__tests__/profile-compiler.test.ts +0 -1
  151. package/src/__tests__/provider-managed-proxy-integration.test.ts +25 -0
  152. package/src/__tests__/qdrant-collection-migration.test.ts +223 -0
  153. package/src/__tests__/recording-handler.test.ts +30 -94
  154. package/src/__tests__/registry.test.ts +28 -35
  155. package/src/__tests__/relay-server.test.ts +0 -1
  156. package/src/__tests__/ride-shotgun-handler.test.ts +4 -20
  157. package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
  158. package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
  159. package/src/__tests__/runtime-events-sse.test.ts +0 -1
  160. package/src/__tests__/sandbox-diagnostics.test.ts +0 -1
  161. package/src/__tests__/scaffold-managed-skill-tool.test.ts +30 -28
  162. package/src/__tests__/schedule-store.test.ts +441 -1
  163. package/src/__tests__/schedule-tools.test.ts +468 -7
  164. package/src/__tests__/scheduler-recurrence.test.ts +196 -23
  165. package/src/__tests__/scoped-approval-grants.test.ts +0 -1
  166. package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
  167. package/src/__tests__/secret-prompt-log-hygiene.test.ts +6 -3
  168. package/src/__tests__/secret-response-routing.test.ts +4 -1
  169. package/src/__tests__/send-endpoint-busy.test.ts +14 -2
  170. package/src/__tests__/send-notification-tool.test.ts +0 -7
  171. package/src/__tests__/sequence-store.test.ts +0 -1
  172. package/src/__tests__/server-history-render.test.ts +1 -2
  173. package/src/__tests__/session-abort-tool-results.test.ts +0 -1
  174. package/src/__tests__/session-agent-loop.test.ts +46 -6
  175. package/src/__tests__/session-confirmation-signals.test.ts +0 -1
  176. package/src/__tests__/session-conflict-gate.test.ts +2 -6
  177. package/src/__tests__/session-error.test.ts +5 -14
  178. package/src/__tests__/session-init.benchmark.test.ts +3 -5
  179. package/src/__tests__/session-load-history-repair.test.ts +0 -1
  180. package/src/__tests__/session-media-retry.test.ts +12 -74
  181. package/src/__tests__/session-pre-run-repair.test.ts +0 -1
  182. package/src/__tests__/session-profile-injection.test.ts +2 -6
  183. package/src/__tests__/session-provider-retry-repair.test.ts +2 -6
  184. package/src/__tests__/session-queue.test.ts +94 -139
  185. package/src/__tests__/session-skill-tools.test.ts +115 -115
  186. package/src/__tests__/session-slash-known.test.ts +0 -1
  187. package/src/__tests__/session-slash-queue.test.ts +0 -1
  188. package/src/__tests__/session-slash-unknown.test.ts +0 -1
  189. package/src/__tests__/session-surfaces-task-progress.test.ts +34 -0
  190. package/src/__tests__/session-usage.test.ts +0 -1
  191. package/src/__tests__/session-workspace-cache-state.test.ts +2 -6
  192. package/src/__tests__/session-workspace-injection.test.ts +2 -6
  193. package/src/__tests__/session-workspace-tool-tracking.test.ts +2 -6
  194. package/src/__tests__/skill-feature-flags-integration.test.ts +180 -184
  195. package/src/__tests__/skill-feature-flags.test.ts +125 -18
  196. package/src/__tests__/skill-load-feature-flag.test.ts +1 -2
  197. package/src/__tests__/skill-load-tool.test.ts +194 -2
  198. package/src/__tests__/skill-projection-feature-flag.test.ts +27 -16
  199. package/src/__tests__/skill-projection.benchmark.test.ts +15 -14
  200. package/src/__tests__/skills.test.ts +14 -53
  201. package/src/__tests__/slack-channel-config.test.ts +0 -1
  202. package/src/__tests__/slack-inbound-verification.test.ts +0 -1
  203. package/src/__tests__/slack-skill.test.ts +1 -1
  204. package/src/__tests__/subagent-tools.test.ts +2 -2
  205. package/src/__tests__/system-prompt.test.ts +4 -3
  206. package/src/__tests__/task-compiler.test.ts +0 -1
  207. package/src/__tests__/task-management-tools.test.ts +0 -1
  208. package/src/__tests__/task-memory-cleanup.test.ts +0 -1
  209. package/src/__tests__/task-runner.test.ts +0 -1
  210. package/src/__tests__/task-scheduler.test.ts +0 -1
  211. package/src/__tests__/terminal-tools.test.ts +0 -1
  212. package/src/__tests__/test-support/computer-use-skill-harness.ts +2 -4
  213. package/src/__tests__/thread-seed-composer.test.ts +5 -5
  214. package/src/__tests__/tool-approval-handler.test.ts +0 -1
  215. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
  216. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
  217. package/src/__tests__/tool-executor.test.ts +8 -86
  218. package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
  219. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  220. package/src/__tests__/tool-preview-lifecycle.test.ts +416 -0
  221. package/src/__tests__/trust-store.test.ts +80 -4
  222. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  223. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
  224. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -1
  225. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  226. package/src/__tests__/trusted-contact-verification.test.ts +0 -1
  227. package/src/__tests__/twilio-provider.test.ts +0 -1
  228. package/src/__tests__/twilio-routes.test.ts +0 -1
  229. package/src/__tests__/{request-file-tool.test.ts → ui-file-upload-surface.test.ts} +11 -72
  230. package/src/__tests__/update-bulletin.test.ts +0 -1
  231. package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -1
  232. package/src/__tests__/usage-routes.test.ts +0 -1
  233. package/src/__tests__/verification-control-plane-policy.test.ts +4 -4
  234. package/src/__tests__/voice-invite-redemption.test.ts +0 -1
  235. package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
  236. package/src/__tests__/voice-session-bridge.test.ts +9 -1
  237. package/src/__tests__/web-fetch.test.ts +57 -0
  238. package/src/__tests__/workspace-git-service.test.ts +5 -14
  239. package/src/__tests__/workspace-policy.test.ts +0 -1
  240. package/src/agent/loop.ts +22 -34
  241. package/src/bundler/bundle-signer.ts +4 -4
  242. package/src/calls/call-controller.ts +1 -1
  243. package/src/calls/relay-server.ts +1 -1
  244. package/src/calls/twilio-rest.ts +1 -1
  245. package/src/calls/voice-session-bridge.ts +3 -1
  246. package/src/cli/__tests__/notifications.test.ts +3 -4
  247. package/src/cli/commands/map.ts +2 -6
  248. package/src/cli/commands/mcp.ts +73 -15
  249. package/src/cli/commands/notifications.ts +4 -4
  250. package/src/cli/commands/sessions.ts +9 -1
  251. package/src/cli/commands/skills.ts +6 -10
  252. package/src/cli/http-client.ts +2 -3
  253. package/src/cli/main-screen.tsx +10 -10
  254. package/src/cli/program.ts +0 -4
  255. package/src/cli/reference.ts +0 -2
  256. package/src/cli.ts +15 -9
  257. package/src/config/__tests__/bundled-tool-registry-guard.test.ts +120 -0
  258. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +11 -0
  259. package/src/config/bundled-skills/app-builder/SKILL.md +6 -1
  260. package/src/config/bundled-skills/browser/SKILL.md +6 -1
  261. package/src/config/bundled-skills/chatgpt-import/SKILL.md +5 -1
  262. package/src/config/bundled-skills/claude-code/SKILL.md +5 -1
  263. package/src/config/bundled-skills/computer-use/SKILL.md +6 -1
  264. package/src/config/bundled-skills/computer-use/TOOLS.json +6 -69
  265. package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +10 -1
  266. package/src/config/bundled-skills/contacts/SKILL.md +10 -1
  267. package/src/config/bundled-skills/contacts/TOOLS.json +35 -0
  268. package/src/config/bundled-skills/{messaging → contacts}/tools/google-contacts.ts +9 -2
  269. package/src/config/bundled-skills/document/SKILL.md +4 -1
  270. package/src/config/bundled-skills/doordash/SKILL.md +8 -1
  271. package/src/config/bundled-skills/doordash/lib/shared/platform.ts +4 -1
  272. package/src/config/bundled-skills/followups/SKILL.md +4 -1
  273. package/src/config/bundled-skills/gmail/SKILL.md +180 -0
  274. package/src/config/bundled-skills/gmail/TOOLS.json +506 -0
  275. package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +149 -0
  276. package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +110 -0
  277. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-draft.ts +1 -1
  278. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-filters.ts +1 -1
  279. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-follow-up.ts +1 -1
  280. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-forward.ts +1 -1
  281. package/src/config/bundled-skills/gmail/tools/gmail-label.ts +50 -0
  282. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-outreach-scan.ts +8 -90
  283. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-send-draft.ts +1 -1
  284. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-sender-digest.ts +2 -2
  285. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-trash.ts +1 -1
  286. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-unsubscribe.ts +1 -1
  287. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-vacation.ts +1 -1
  288. package/src/config/bundled-skills/gmail/tools/shared.ts +47 -0
  289. package/src/config/bundled-skills/google-calendar/SKILL.md +5 -1
  290. package/src/config/bundled-skills/image-studio/SKILL.md +5 -1
  291. package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -1
  292. package/src/config/bundled-skills/media-processing/SKILL.md +7 -13
  293. package/src/config/bundled-skills/media-processing/TOOLS.json +0 -22
  294. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +12 -1
  295. package/src/config/bundled-skills/messaging/SKILL.md +23 -139
  296. package/src/config/bundled-skills/messaging/TOOLS.json +33 -1215
  297. package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +42 -0
  298. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +165 -2
  299. package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +1 -13
  300. package/src/config/bundled-skills/messaging/tools/shared.ts +81 -34
  301. package/src/config/bundled-skills/notifications/SKILL.md +5 -1
  302. package/src/config/bundled-skills/orchestration/SKILL.md +30 -0
  303. package/src/config/bundled-skills/orchestration/TOOLS.json +35 -0
  304. package/src/config/bundled-skills/{reminder/tools/reminder-create.ts → orchestration/tools/swarm-delegate.ts} +3 -3
  305. package/src/config/bundled-skills/phone-calls/SKILL.md +9 -1
  306. package/src/config/bundled-skills/playbooks/SKILL.md +4 -1
  307. package/src/config/bundled-skills/schedule/SKILL.md +70 -9
  308. package/src/config/bundled-skills/schedule/TOOLS.json +38 -6
  309. package/src/config/bundled-skills/screen-watch/SKILL.md +28 -0
  310. package/src/config/bundled-skills/screen-watch/TOOLS.json +35 -0
  311. package/src/config/bundled-skills/{reminder/tools/reminder-cancel.ts → screen-watch/tools/start-screen-watch.ts} +3 -3
  312. package/src/config/bundled-skills/sequences/SKILL.md +47 -0
  313. package/src/config/bundled-skills/sequences/TOOLS.json +340 -0
  314. package/src/config/bundled-skills/sequences/tools/sequence-update.ts +128 -0
  315. package/src/config/bundled-skills/sequences/tools/shared.ts +9 -0
  316. package/src/config/bundled-skills/settings/SKILL.md +12 -0
  317. package/src/config/bundled-skills/settings/TOOLS.json +112 -0
  318. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +43 -0
  319. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +52 -0
  320. package/src/config/bundled-skills/{computer-use/tools/computer-use-right-click.ts → settings/tools/set-avatar.ts} +2 -6
  321. package/src/{tools/system/voice-config.ts → config/bundled-skills/settings/tools/voice-config-update.ts} +59 -96
  322. package/src/config/bundled-skills/skill-management/SKILL.md +18 -0
  323. package/src/config/bundled-skills/skill-management/TOOLS.json +90 -0
  324. package/src/config/bundled-skills/{computer-use/tools/computer-use-double-click.ts → skill-management/tools/delete-managed.ts} +2 -6
  325. package/src/config/bundled-skills/skill-management/tools/scaffold-managed.ts +12 -0
  326. package/src/config/bundled-skills/slack/SKILL.md +5 -1
  327. package/src/config/bundled-skills/subagent/SKILL.md +4 -1
  328. package/src/config/bundled-skills/tasks/SKILL.md +5 -2
  329. package/src/config/bundled-skills/transcribe/SKILL.md +4 -1
  330. package/src/config/bundled-skills/watcher/SKILL.md +4 -1
  331. package/src/config/bundled-tool-registry.ts +118 -107
  332. package/src/config/env.ts +5 -2
  333. package/src/config/feature-flag-registry.json +25 -9
  334. package/src/config/loader.ts +10 -2
  335. package/src/config/schema.ts +19 -16
  336. package/src/config/schemas/inference.ts +12 -22
  337. package/src/config/schemas/memory-storage.ts +19 -1
  338. package/src/config/schemas/platform.ts +0 -16
  339. package/src/config/skill-state.ts +11 -8
  340. package/src/config/skills.ts +83 -32
  341. package/src/context/token-estimator.ts +11 -0
  342. package/src/context/window-manager.ts +180 -151
  343. package/src/daemon/computer-use-session.ts +11 -43
  344. package/src/daemon/daemon-control.ts +4 -1
  345. package/src/daemon/handlers/config-channels.ts +5 -9
  346. package/src/daemon/handlers/config-ingress.ts +0 -4
  347. package/src/daemon/handlers/config-model.ts +7 -13
  348. package/src/daemon/handlers/config-telegram.ts +4 -8
  349. package/src/daemon/handlers/config-voice.ts +2 -5
  350. package/src/daemon/handlers/dictation.ts +2 -12
  351. package/src/daemon/handlers/identity.ts +0 -105
  352. package/src/daemon/handlers/recording.ts +3 -23
  353. package/src/daemon/handlers/session-history.ts +1 -1
  354. package/src/daemon/handlers/sessions.ts +53 -72
  355. package/src/daemon/handlers/shared.ts +7 -28
  356. package/src/daemon/handlers/skills.ts +31 -27
  357. package/src/daemon/host-bash-proxy.ts +148 -0
  358. package/src/daemon/host-file-proxy.ts +135 -0
  359. package/src/daemon/lifecycle.ts +49 -24
  360. package/src/daemon/mcp-reload-service.ts +123 -0
  361. package/src/daemon/message-protocol.ts +6 -0
  362. package/src/daemon/message-types/browser.ts +1 -1
  363. package/src/daemon/message-types/computer-use.ts +1 -4
  364. package/src/daemon/message-types/guardian-actions.ts +1 -1
  365. package/src/daemon/message-types/host-bash.ts +18 -0
  366. package/src/daemon/message-types/host-file.ts +44 -0
  367. package/src/daemon/message-types/integrations.ts +1 -67
  368. package/src/daemon/message-types/messages.ts +15 -0
  369. package/src/daemon/message-types/schedules.ts +11 -27
  370. package/src/daemon/message-types/sessions.ts +2 -1
  371. package/src/daemon/message-types/settings.ts +1 -1
  372. package/src/daemon/message-types/shared.ts +1 -1
  373. package/src/daemon/ride-shotgun-handler.ts +2 -42
  374. package/src/daemon/server.ts +43 -10
  375. package/src/daemon/session-agent-loop-handlers.ts +48 -7
  376. package/src/daemon/session-agent-loop.ts +97 -66
  377. package/src/daemon/session-attachments.ts +1 -1
  378. package/src/daemon/session-error.ts +17 -16
  379. package/src/daemon/session-lifecycle.ts +20 -1
  380. package/src/daemon/session-media-retry.ts +1 -15
  381. package/src/daemon/session-messaging.ts +14 -6
  382. package/src/daemon/session-process.ts +36 -7
  383. package/src/daemon/session-queue-manager.ts +62 -103
  384. package/src/daemon/session-runtime-assembly.ts +27 -0
  385. package/src/daemon/session-skill-tools.ts +12 -11
  386. package/src/daemon/session-slash.ts +7 -0
  387. package/src/daemon/session-surfaces.ts +19 -97
  388. package/src/daemon/session-tool-setup.ts +146 -6
  389. package/src/daemon/session.ts +77 -13
  390. package/src/errors.ts +0 -2
  391. package/src/export/formatter.ts +6 -0
  392. package/src/mcp/mcp-oauth-provider.ts +1 -3
  393. package/src/media/avatar-router.ts +20 -28
  394. package/src/media/avatar-types.ts +7 -14
  395. package/src/media/managed-avatar-client.ts +70 -34
  396. package/src/memory/conversation-title-service.ts +1 -2
  397. package/src/memory/db-init.ts +16 -0
  398. package/src/memory/embedding-backend.ts +129 -27
  399. package/src/memory/embedding-gemini.test.ts +256 -0
  400. package/src/memory/embedding-gemini.ts +47 -13
  401. package/src/memory/embedding-local.ts +14 -2
  402. package/src/memory/embedding-ollama.ts +15 -2
  403. package/src/memory/embedding-openai.ts +15 -2
  404. package/src/memory/embedding-types.test.ts +116 -0
  405. package/src/memory/embedding-types.ts +61 -0
  406. package/src/memory/fingerprint.ts +1 -1
  407. package/src/memory/indexer.ts +25 -1
  408. package/src/memory/job-handlers/embedding.test.ts +258 -0
  409. package/src/memory/job-handlers/embedding.ts +81 -1
  410. package/src/memory/job-handlers/index-maintenance.ts +35 -1
  411. package/src/memory/job-handlers/media-processing.ts +11 -1
  412. package/src/memory/job-utils.ts +21 -6
  413. package/src/memory/jobs-store.ts +5 -1
  414. package/src/memory/jobs-worker.ts +8 -0
  415. package/src/memory/message-content.ts +66 -0
  416. package/src/memory/migrations/100-core-tables.ts +1 -31
  417. package/src/memory/migrations/104-core-indexes.ts +0 -11
  418. package/src/memory/migrations/145-drop-accounts-table.ts +19 -0
  419. package/src/memory/migrations/146-schedule-oneshot-routing.ts +94 -0
  420. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +129 -0
  421. package/src/memory/migrations/148-drop-reminders-table.ts +18 -0
  422. package/src/memory/migrations/index.ts +4 -0
  423. package/src/memory/migrations/registry.ts +19 -0
  424. package/src/memory/qdrant-client.ts +158 -43
  425. package/src/memory/retriever.test.ts +0 -1
  426. package/src/memory/retriever.ts +12 -2
  427. package/src/memory/schema/infrastructure.ts +5 -29
  428. package/src/memory/search/formatting.ts +34 -9
  429. package/src/memory/search/semantic.ts +57 -2
  430. package/src/memory/search/types.ts +2 -1
  431. package/src/notifications/AGENTS.md +2 -2
  432. package/src/notifications/README.md +59 -58
  433. package/src/notifications/adapters/macos.ts +1 -1
  434. package/src/notifications/broadcaster.ts +5 -5
  435. package/src/notifications/copy-composer.ts +1 -1
  436. package/src/notifications/decision-engine.ts +2 -2
  437. package/src/notifications/destination-resolver.ts +2 -2
  438. package/src/notifications/emit-signal.ts +8 -8
  439. package/src/notifications/signal.ts +1 -1
  440. package/src/notifications/thread-seed-composer.ts +1 -1
  441. package/src/oauth/connect-orchestrator.ts +1 -1
  442. package/src/oauth/token-persistence.ts +1 -1
  443. package/src/permissions/checker.ts +12 -1
  444. package/src/permissions/defaults.ts +10 -14
  445. package/src/permissions/trust-store.ts +37 -0
  446. package/src/permissions/workspace-policy.ts +0 -1
  447. package/src/prompts/__tests__/build-cli-reference-section.test.ts +11 -0
  448. package/src/prompts/computer-use-prompt.ts +1 -1
  449. package/src/prompts/system-prompt.ts +29 -30
  450. package/src/prompts/templates/SOUL.md +1 -2
  451. package/src/prompts/templates/UPDATES.md +16 -7
  452. package/src/providers/anthropic/client.ts +87 -33
  453. package/src/providers/gemini/client.ts +6 -0
  454. package/src/providers/managed-proxy/constants.ts +5 -0
  455. package/src/providers/openai/client.ts +15 -0
  456. package/src/providers/registry.ts +2 -2
  457. package/src/providers/types.ts +24 -2
  458. package/src/runtime/AGENTS.md +18 -0
  459. package/src/runtime/assistant-event-hub.ts +2 -3
  460. package/src/runtime/assistant-event.ts +4 -4
  461. package/src/runtime/auth/__tests__/context.test.ts +5 -5
  462. package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
  463. package/src/runtime/auth/__tests__/guard-tests.test.ts +2 -2
  464. package/src/runtime/auth/__tests__/{ipc-auth-context.test.ts → local-auth-context.test.ts} +21 -21
  465. package/src/runtime/auth/__tests__/route-policy.test.ts +2 -2
  466. package/src/runtime/auth/__tests__/scopes.test.ts +7 -7
  467. package/src/runtime/auth/__tests__/subject.test.ts +8 -8
  468. package/src/runtime/auth/__tests__/token-service.test.ts +0 -1
  469. package/src/runtime/auth/route-policy.ts +8 -4
  470. package/src/runtime/auth/scopes.ts +1 -1
  471. package/src/runtime/auth/subject.ts +4 -4
  472. package/src/runtime/auth/token-service.ts +0 -23
  473. package/src/runtime/auth/types.ts +3 -3
  474. package/src/runtime/guardian-action-followup-executor.ts +1 -1
  475. package/src/runtime/guardian-action-grant-minter.ts +1 -1
  476. package/src/runtime/guardian-action-service.ts +3 -3
  477. package/src/runtime/http-server.ts +15 -2
  478. package/src/runtime/invite-service.ts +3 -3
  479. package/src/runtime/local-actor-identity.ts +17 -22
  480. package/src/runtime/pending-interactions.ts +21 -9
  481. package/src/runtime/routes/app-management-routes.ts +2 -3
  482. package/src/runtime/routes/approval-routes.ts +1 -3
  483. package/src/runtime/routes/btw-routes.ts +155 -0
  484. package/src/runtime/routes/computer-use-routes.ts +77 -31
  485. package/src/runtime/routes/conversation-routes.ts +230 -46
  486. package/src/runtime/routes/diagnostics-routes.ts +63 -29
  487. package/src/runtime/routes/documents-routes.ts +2 -2
  488. package/src/runtime/routes/global-search-routes.ts +1 -1
  489. package/src/runtime/routes/host-bash-routes.ts +83 -0
  490. package/src/runtime/routes/host-file-routes.ts +79 -0
  491. package/src/runtime/routes/integrations/slack/share.ts +1 -1
  492. package/src/runtime/routes/log-export-routes.ts +120 -0
  493. package/src/runtime/routes/mcp-routes.ts +20 -0
  494. package/src/runtime/routes/migration-routes.ts +3 -3
  495. package/src/runtime/routes/pairing-routes.ts +1 -1
  496. package/src/runtime/routes/recording-routes.ts +6 -4
  497. package/src/runtime/routes/schedule-routes.ts +31 -5
  498. package/src/runtime/routes/session-management-routes.ts +2 -6
  499. package/src/runtime/routes/session-query-routes.ts +18 -15
  500. package/src/runtime/routes/settings-routes.ts +7 -261
  501. package/src/runtime/routes/skills-routes.ts +7 -6
  502. package/src/runtime/routes/subagents-routes.ts +4 -10
  503. package/src/runtime/routes/surface-action-routes.ts +3 -14
  504. package/src/runtime/routes/surface-content-routes.ts +22 -5
  505. package/src/runtime/routes/work-items-routes.ts +21 -25
  506. package/src/runtime/routes/workspace-routes.test.ts +3 -3
  507. package/src/runtime/routes/workspace-utils.ts +1 -1
  508. package/src/runtime/telegram-streaming-delivery.ts +3 -0
  509. package/src/runtime/verification-outbound-actions.ts +2 -2
  510. package/src/schedule/integration-status.ts +0 -6
  511. package/src/schedule/schedule-store.ts +234 -43
  512. package/src/schedule/scheduler.ts +73 -74
  513. package/src/security/oauth2.ts +1 -1
  514. package/src/sequence/store.ts +12 -2
  515. package/src/skills/frontmatter.ts +19 -77
  516. package/src/skills/managed-store.ts +11 -2
  517. package/src/subagent/manager.ts +5 -3
  518. package/src/tasks/ephemeral-permissions.ts +3 -5
  519. package/src/tools/AGENTS.md +0 -1
  520. package/src/tools/browser/browser-manager.ts +17 -11
  521. package/src/tools/browser/jit-auth.ts +4 -1
  522. package/src/tools/claude-code/claude-code.ts +1 -1
  523. package/src/tools/computer-use/definitions.ts +48 -60
  524. package/src/tools/document/document-tool.ts +6 -6
  525. package/src/tools/filesystem/edit.ts +2 -1
  526. package/src/tools/filesystem/read.ts +20 -2
  527. package/src/tools/filesystem/write.ts +2 -1
  528. package/src/tools/host-filesystem/edit.ts +17 -1
  529. package/src/tools/host-filesystem/read.ts +16 -1
  530. package/src/tools/host-filesystem/write.ts +15 -1
  531. package/src/tools/host-terminal/host-shell.ts +24 -0
  532. package/src/tools/memory/definitions.ts +45 -81
  533. package/src/tools/memory/handlers.test.ts +0 -1
  534. package/src/tools/memory/handlers.ts +1 -1
  535. package/src/tools/memory/register.ts +26 -60
  536. package/src/tools/network/script-proxy/session-manager.ts +6 -8
  537. package/src/tools/network/web-fetch.ts +7 -1
  538. package/src/tools/network/web-search.ts +2 -1
  539. package/src/tools/registry.ts +23 -0
  540. package/src/tools/schedule/create.ts +113 -5
  541. package/src/tools/schedule/list.ts +57 -15
  542. package/src/tools/schedule/update.ts +73 -3
  543. package/src/tools/shared/filesystem/image-read.ts +192 -0
  544. package/src/tools/side-effects.ts +1 -7
  545. package/src/tools/skills/delete-managed.ts +27 -64
  546. package/src/tools/skills/execute.ts +54 -0
  547. package/src/tools/skills/load.ts +127 -5
  548. package/src/tools/skills/scaffold-managed.ts +93 -172
  549. package/src/tools/subagent/message.ts +0 -7
  550. package/src/tools/subagent/spawn.ts +1 -1
  551. package/src/tools/swarm/delegate.ts +0 -3
  552. package/src/tools/system/avatar-generator.ts +13 -19
  553. package/src/tools/system/request-permission.ts +2 -1
  554. package/src/tools/terminal/safe-env.ts +1 -0
  555. package/src/tools/tool-manifest.ts +41 -47
  556. package/src/tools/types.ts +6 -2
  557. package/src/tools/ui-surface/definitions.ts +0 -55
  558. package/src/util/errors.ts +0 -10
  559. package/src/workspace/git-service.ts +0 -2
  560. package/src/__tests__/account-registry.test.ts +0 -258
  561. package/src/__tests__/email-classifier.test.ts +0 -25
  562. package/src/__tests__/gmail-integration.test.ts +0 -97
  563. package/src/__tests__/handle-user-message-secret-resume.test.ts +0 -172
  564. package/src/__tests__/managed-twitter-guardrails.test.ts +0 -357
  565. package/src/__tests__/recording-intent-fallback.test.ts +0 -199
  566. package/src/__tests__/recording-intent.test.ts +0 -985
  567. package/src/__tests__/recording-state-machine.test.ts +0 -1574
  568. package/src/__tests__/reminder-store.test.ts +0 -350
  569. package/src/__tests__/reminder.test.ts +0 -337
  570. package/src/__tests__/scan-result-store.test.ts +0 -121
  571. package/src/__tests__/twitter-platform-proxy-client.test.ts +0 -475
  572. package/src/__tests__/view-image-tool.test.ts +0 -241
  573. package/src/cli/commands/amazon/cart.ts +0 -513
  574. package/src/cli/commands/amazon/checkout.ts +0 -394
  575. package/src/cli/commands/amazon/client.ts +0 -513
  576. package/src/cli/commands/amazon/index.ts +0 -885
  577. package/src/cli/commands/amazon/product-details.ts +0 -145
  578. package/src/cli/commands/amazon/request-extractor.ts +0 -187
  579. package/src/cli/commands/amazon/search.ts +0 -76
  580. package/src/cli/commands/amazon/session.ts +0 -108
  581. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -345
  582. package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -252
  583. package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -151
  584. package/src/cli/commands/twitter/index.ts +0 -420
  585. package/src/cli/commands/twitter/oauth-client.ts +0 -60
  586. package/src/cli/commands/twitter/router.ts +0 -351
  587. package/src/cli/commands/twitter/types.ts +0 -30
  588. package/src/config/bundled-skills/agentmail/SKILL.md +0 -132
  589. package/src/config/bundled-skills/agentmail/icon.svg +0 -21
  590. package/src/config/bundled-skills/amazon/SKILL.md +0 -136
  591. package/src/config/bundled-skills/amazon/icon.svg +0 -13
  592. package/src/config/bundled-skills/api-mapping/SKILL.md +0 -78
  593. package/src/config/bundled-skills/api-mapping/icon.svg +0 -18
  594. package/src/config/bundled-skills/cli-discover/SKILL.md +0 -68
  595. package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +0 -179
  596. package/src/config/bundled-skills/document-writer/SKILL.md +0 -195
  597. package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +0 -140
  598. package/src/config/bundled-skills/email-setup/SKILL.md +0 -68
  599. package/src/config/bundled-skills/frontend-design/SKILL.md +0 -44
  600. package/src/config/bundled-skills/frontend-design/icon.svg +0 -16
  601. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +0 -452
  602. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +0 -203
  603. package/src/config/bundled-skills/influencer/SKILL.md +0 -144
  604. package/src/config/bundled-skills/influencer/scripts/client.ts +0 -1269
  605. package/src/config/bundled-skills/influencer/scripts/influencer.ts +0 -267
  606. package/src/config/bundled-skills/macos-automation/SKILL.md +0 -65
  607. package/src/config/bundled-skills/macos-automation/icon.svg +0 -12
  608. package/src/config/bundled-skills/mcp-setup/SKILL.md +0 -75
  609. package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +0 -184
  610. package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +0 -80
  611. package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -29
  612. package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -56
  613. package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -34
  614. package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +0 -47
  615. package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -31
  616. package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +0 -67
  617. package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +0 -97
  618. package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +0 -87
  619. package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +0 -135
  620. package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -24
  621. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -201
  622. package/src/config/bundled-skills/messaging/tools/send-notification.ts +0 -1
  623. package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +0 -27
  624. package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +0 -48
  625. package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +0 -27
  626. package/src/config/bundled-skills/messaging/tools/sequence-update.ts +0 -56
  627. package/src/config/bundled-skills/notion/SKILL.md +0 -240
  628. package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +0 -126
  629. package/src/config/bundled-skills/oauth-setup/SKILL.md +0 -143
  630. package/src/config/bundled-skills/public-ingress/SKILL.md +0 -258
  631. package/src/config/bundled-skills/reminder/SKILL.md +0 -79
  632. package/src/config/bundled-skills/reminder/TOOLS.json +0 -89
  633. package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -12
  634. package/src/config/bundled-skills/restaurant-reservation/SKILL.md +0 -141
  635. package/src/config/bundled-skills/screen-recording/SKILL.md +0 -148
  636. package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -69
  637. package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -78
  638. package/src/config/bundled-skills/slack-app-setup/SKILL.md +0 -178
  639. package/src/config/bundled-skills/slack-digest-setup/SKILL.md +0 -163
  640. package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +0 -157
  641. package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
  642. package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
  643. package/src/config/bundled-skills/telegram-setup/SKILL.md +0 -105
  644. package/src/config/bundled-skills/time-based-actions/SKILL.md +0 -142
  645. package/src/config/bundled-skills/twilio-setup/SKILL.md +0 -232
  646. package/src/config/bundled-skills/twitter/SKILL.md +0 -206
  647. package/src/config/bundled-skills/twitter/icon.svg +0 -14
  648. package/src/config/bundled-skills/typescript-eval/SKILL.md +0 -60
  649. package/src/config/bundled-skills/vercel-token-setup/SKILL.md +0 -214
  650. package/src/config/bundled-skills/voice-setup/SKILL.md +0 -131
  651. package/src/config/bundled-skills/voice-setup/icon.svg +0 -20
  652. package/src/daemon/handlers/pairing.ts +0 -119
  653. package/src/daemon/handlers/session-user-message.ts +0 -961
  654. package/src/daemon/recording-executor.ts +0 -180
  655. package/src/daemon/recording-intent-fallback.ts +0 -162
  656. package/src/daemon/recording-intent.ts +0 -493
  657. package/src/memory/account-store.ts +0 -117
  658. package/src/messaging/activity-analyzer.ts +0 -76
  659. package/src/messaging/email-classifier.ts +0 -208
  660. package/src/messaging/index.ts +0 -2
  661. package/src/messaging/outreach-classifier.ts +0 -185
  662. package/src/messaging/thread-summarizer.ts +0 -346
  663. package/src/messaging/types.ts +0 -17
  664. package/src/tools/browser/x-auto-navigate.ts +0 -254
  665. package/src/tools/credentials/account-registry.ts +0 -144
  666. package/src/tools/filesystem/view-image.ts +0 -244
  667. package/src/tools/reminder/reminder-store.ts +0 -194
  668. package/src/tools/reminder/reminder.ts +0 -158
  669. package/src/tools/system/navigate-settings.ts +0 -74
  670. package/src/tools/system/open-system-settings.ts +0 -85
  671. package/src/tools/system/version.ts +0 -54
  672. package/src/twitter/platform-proxy-client.ts +0 -408
  673. /package/src/config/bundled-skills/{messaging → gmail}/tools/scan-result-store.ts +0 -0
  674. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-analytics.ts +0 -0
  675. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-create.ts +0 -0
  676. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-delete.ts +0 -0
  677. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enroll.ts +0 -0
  678. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enrollment-list.ts +0 -0
  679. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-get.ts +0 -0
  680. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-import.ts +0 -0
  681. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-list.ts +0 -0
@@ -1,885 +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 { clearSession, loadSession, saveSession } from "./session.js";
26
-
27
- // ---------------------------------------------------------------------------
28
- // Helpers
29
- // ---------------------------------------------------------------------------
30
-
31
- function output(data: unknown, json: boolean): void {
32
- process.stdout.write(
33
- json ? JSON.stringify(data) + "\n" : JSON.stringify(data, null, 2) + "\n",
34
- );
35
- }
36
-
37
- function outputError(message: string, code = 1): void {
38
- output({ ok: false, error: message }, true);
39
- process.exitCode = code;
40
- }
41
-
42
- function getJson(cmd: Command): boolean {
43
- let c: Command | null = cmd;
44
- while (c) {
45
- if ((c.opts() as { json?: boolean }).json) return true;
46
- c = c.parent;
47
- }
48
- return false;
49
- }
50
-
51
- const SESSION_EXPIRED_MSG =
52
- "Your Amazon session has expired. Please sign in to Amazon in Chrome — " +
53
- "the assistant will use Ride Shotgun to capture your session automatically.";
54
-
55
- async function run(cmd: Command, fn: () => Promise<unknown>): Promise<void> {
56
- try {
57
- const result = await fn();
58
- output({ ok: true, ...(result as Record<string, unknown>) }, getJson(cmd));
59
- } catch (err) {
60
- if (err instanceof SessionExpiredError) {
61
- output(
62
- { ok: false, error: "session_expired", message: SESSION_EXPIRED_MSG },
63
- getJson(cmd),
64
- );
65
- process.exitCode = 1;
66
- return;
67
- }
68
- outputError(err instanceof Error ? err.message : String(err));
69
- }
70
- }
71
-
72
- // ---------------------------------------------------------------------------
73
- // Command registration
74
- // ---------------------------------------------------------------------------
75
-
76
- export function registerAmazonCommand(program: Command): void {
77
- const amz = program
78
- .command("amazon")
79
- .description(
80
- 'Shop on Amazon and Amazon Fresh. Requires an active session (use "refresh" to authenticate).',
81
- )
82
- .option("--json", "Machine-readable JSON output");
83
-
84
- amz.addHelpText(
85
- "after",
86
- `
87
- Amazon shopping is powered by session cookies captured via Ride Shotgun.
88
- A valid session must be established before any shopping commands will work.
89
-
90
- Session lifecycle:
91
- 1. "refresh" opens Chrome and captures cookies via a Ride Shotgun learn session.
92
- The user must sign into Amazon when prompted. Existing Chrome tabs are unaffected.
93
- 2. "refresh-headless" reads cookies directly from Chrome's local SQLite database.
94
- No visible browser window is needed, but Chrome must already be signed into Amazon.
95
- 3. "status" checks whether a valid session exists.
96
- 4. "logout" clears the saved session.
97
-
98
- Product workflow: search for products, view details/variations by ASIN, then add
99
- to cart. Use --fresh flag for Amazon Fresh grocery items throughout the workflow.
100
-
101
- Cart and checkout: add/remove items, view cart, get checkout summary, list payment
102
- methods, and place an order. For Amazon Fresh orders, select a delivery slot first.
103
-
104
- WARNING: "order place" is IRREVERSIBLE — it charges the user's payment method and
105
- places a real Amazon order. Always confirm with the user before running it.
106
-
107
- Examples:
108
- $ assistant amazon status
109
- $ assistant amazon refresh
110
- $ assistant amazon search "AA batteries" --limit 5
111
- $ assistant amazon cart add --asin B07XXXXX --quantity 2
112
- $ assistant amazon order place --payment-method-id pm_abc123`,
113
- );
114
-
115
- // =========================================================================
116
- // logout — clear saved session
117
- // =========================================================================
118
- amz
119
- .command("logout")
120
- .description("Clear the saved Amazon session")
121
- .addHelpText(
122
- "after",
123
- `
124
- Removes all saved Amazon session cookies from local storage. After logout,
125
- all shopping commands will fail until a new session is established via
126
- "refresh" or "refresh-headless".
127
-
128
- Examples:
129
- $ assistant amazon logout`,
130
- )
131
- .action(async (_opts: unknown, cmd: Command) => {
132
- await clearSession();
133
- output({ ok: true, message: "Session cleared" }, getJson(cmd));
134
- });
135
-
136
- // =========================================================================
137
- // refresh — grab Amazon cookies from Chrome via browser extension
138
- // =========================================================================
139
- amz
140
- .command("refresh")
141
- .description(
142
- "Refresh Amazon session by grabbing cookies from Chrome via the browser extension. " +
143
- "Requires the Vellum Chrome extension to be loaded and connected.",
144
- )
145
- .addHelpText(
146
- "after",
147
- `
148
- Grabs Amazon session cookies directly from Chrome via the browser extension
149
- relay. Much faster than the old Ride Shotgun approach — no separate Chrome
150
- instance is launched. Requires the Vellum Chrome extension to be loaded
151
- and connected.
152
-
153
- If this fails, try "refresh-headless" which reads cookies from Chrome's
154
- local SQLite database instead.
155
-
156
- Examples:
157
- $ assistant amazon refresh
158
- $ assistant amazon refresh --json`,
159
- )
160
- .action(async (_opts: unknown, cmd: Command) => {
161
- const json = getJson(cmd);
162
- try {
163
- const session = await refreshSessionFromExtension();
164
- output(
165
- {
166
- ok: true,
167
- message: "Session refreshed from Chrome via browser extension",
168
- cookieCount: session.cookies.length,
169
- },
170
- json,
171
- );
172
- } catch (err) {
173
- outputError(err instanceof Error ? err.message : String(err));
174
- }
175
- });
176
-
177
- // =========================================================================
178
- // refresh-headless — refresh session from Chrome's cookie database
179
- // =========================================================================
180
- amz
181
- .command("refresh-headless")
182
- .description(
183
- "Refresh Amazon session by reading cookies directly from Chrome's local database. " +
184
- "No visible Chrome window needed. Requires Chrome to be signed into Amazon.",
185
- )
186
- .addHelpText(
187
- "after",
188
- `
189
- Reads Amazon session cookies directly from Chrome's local SQLite cookie
190
- database (~/Library/Application Support/Google/Chrome/Default/Cookies).
191
- No visible Chrome window or user interaction is required.
192
-
193
- Requirements:
194
- - Chrome must be installed with a Default profile
195
- - The user must already be signed into Amazon in Chrome
196
- - macOS Keychain access for "Chrome Safe Storage" (may prompt once)
197
-
198
- The cookie database is copied to a temp file before reading to avoid
199
- interfering with Chrome's WAL journaling. Required cookies (session-id,
200
- ubid-main, and at-main or x-main) are validated after extraction.
201
-
202
- Examples:
203
- $ assistant amazon refresh-headless
204
- $ assistant amazon refresh-headless --json`,
205
- )
206
- .action(async (_opts: unknown, cmd: Command) => {
207
- const json = getJson(cmd);
208
- try {
209
- const session = await extractSessionFromChromeCookies();
210
- await saveSession(session);
211
- output(
212
- {
213
- ok: true,
214
- message: "Session refreshed from Chrome cookie database (headless)",
215
- cookieCount: session.cookies.length,
216
- },
217
- json,
218
- );
219
- } catch (err) {
220
- outputError(err instanceof Error ? err.message : String(err));
221
- }
222
- });
223
-
224
- // =========================================================================
225
- // status — check session status
226
- // =========================================================================
227
- amz
228
- .command("status")
229
- .description("Check if an Amazon session is active")
230
- .addHelpText(
231
- "after",
232
- `
233
- Reports whether an Amazon session is currently stored locally. If a session
234
- exists, returns the cookie count. If no session exists, returns loggedIn: false.
235
-
236
- Use this to verify session health before running shopping commands.
237
-
238
- Examples:
239
- $ assistant amazon status
240
- $ assistant amazon status --json`,
241
- )
242
- .action(async (_opts: unknown, cmd: Command) => {
243
- const session = await loadSession();
244
- if (session) {
245
- output(
246
- {
247
- ok: true,
248
- loggedIn: true,
249
- cookieCount: session.cookies.length,
250
- },
251
- getJson(cmd),
252
- );
253
- } else {
254
- output({ ok: true, loggedIn: false }, getJson(cmd));
255
- }
256
- });
257
-
258
- // =========================================================================
259
- // search — search for products
260
- // =========================================================================
261
- amz
262
- .command("search")
263
- .description("Search for products on Amazon")
264
- .argument("<query>", 'Search query (e.g. "AA batteries", "milk")')
265
- .option("--fresh", "Search Amazon Fresh grocery items")
266
- .option("--limit <n>", "Max results", "20")
267
- .addHelpText(
268
- "after",
269
- `
270
- Arguments:
271
- query Free-text search query (e.g. "AA batteries", "organic milk").
272
- Wrap multi-word queries in quotes.
273
-
274
- Searches Amazon product listings and returns matching results with ASINs,
275
- titles, prices, and ratings. Use the returned ASINs with "product" or
276
- "cart add" commands.
277
-
278
- The --fresh flag restricts results to Amazon Fresh grocery items. The
279
- --limit flag controls the maximum number of results returned (default: 20).
280
-
281
- Examples:
282
- $ assistant amazon search "AA batteries"
283
- $ assistant amazon search "whole milk" --fresh --limit 10
284
- $ assistant amazon search "USB-C cable" --limit 5 --json`,
285
- )
286
- .action(
287
- async (
288
- query: string,
289
- opts: { fresh?: boolean; limit: string },
290
- cmd: Command,
291
- ) => {
292
- await run(cmd, async () => {
293
- const results = await search(query, {
294
- isFresh: opts.fresh,
295
- limit: parseInt(opts.limit, 10),
296
- });
297
- return { results, count: results.length };
298
- });
299
- },
300
- );
301
-
302
- // =========================================================================
303
- // product — get product details
304
- // =========================================================================
305
- amz
306
- .command("product")
307
- .description("Get product details for an ASIN")
308
- .argument("<asin>", "Amazon ASIN (e.g. B07XXXXX)")
309
- .option("--fresh", "Product is an Amazon Fresh item")
310
- .addHelpText(
311
- "after",
312
- `
313
- Arguments:
314
- asin Amazon Standard Identification Number (e.g. B07XXXXX). Obtain
315
- ASINs from search results or product URLs.
316
-
317
- Returns detailed product information including title, price, availability,
318
- description, images, and available variations. Use --fresh if the product
319
- is an Amazon Fresh grocery item.
320
-
321
- Examples:
322
- $ assistant amazon product B07XXXXX
323
- $ assistant amazon product B08YYYYY --fresh
324
- $ assistant amazon product B07XXXXX --json`,
325
- )
326
- .action(async (asin: string, opts: { fresh?: boolean }, cmd: Command) => {
327
- await run(cmd, async () => {
328
- const product = await getProductDetails(asin, { isFresh: opts.fresh });
329
- return { product };
330
- });
331
- });
332
-
333
- // =========================================================================
334
- // variations — list product variations (child ASINs)
335
- // =========================================================================
336
- amz
337
- .command("variations")
338
- .description(
339
- "List available variations (sizes, colors, etc.) for a product",
340
- )
341
- .argument("<asin>", "Parent ASIN")
342
- .addHelpText(
343
- "after",
344
- `
345
- Arguments:
346
- asin Parent ASIN to list variations for. Returns child ASINs
347
- representing different sizes, colors, styles, or configurations.
348
-
349
- Fetches the product and returns its available variations (child ASINs).
350
- Each variation includes dimension labels (e.g. "Size: Large", "Color: Blue")
351
- and its own ASIN for use with "product" or "cart add".
352
-
353
- Examples:
354
- $ assistant amazon variations B07XXXXX
355
- $ assistant amazon variations B07XXXXX --json`,
356
- )
357
- .action(async (asin: string, _opts: unknown, cmd: Command) => {
358
- await run(cmd, async () => {
359
- const product = await getProductDetails(asin);
360
- return {
361
- asin,
362
- title: product.title,
363
- variations: product.variations,
364
- count: product.variations.length,
365
- };
366
- });
367
- });
368
-
369
- // =========================================================================
370
- // cart — cart operations (subcommand group)
371
- // =========================================================================
372
- const cart = amz.command("cart").description("Cart operations");
373
-
374
- cart.addHelpText(
375
- "after",
376
- `
377
- Manage the Amazon shopping cart. Items are identified by ASIN when adding
378
- and by cart-item-id when removing (cart-item-id is returned by "cart view").
379
-
380
- The cart is shared between regular Amazon and Amazon Fresh items. Use
381
- --fresh when adding grocery items to route them through the Fresh workflow.
382
-
383
- Examples:
384
- $ assistant amazon cart view
385
- $ assistant amazon cart add --asin B07XXXXX --quantity 2
386
- $ assistant amazon cart remove --cart-item-id CXYZ123`,
387
- );
388
-
389
- // cart view
390
- cart
391
- .command("view")
392
- .description("View cart contents")
393
- .addHelpText(
394
- "after",
395
- `
396
- Returns all items currently in the cart, including ASIN, title, quantity,
397
- price, and cart-item-id. Use the cart-item-id with "cart remove" to delete
398
- individual items.
399
-
400
- Examples:
401
- $ assistant amazon cart view
402
- $ assistant amazon cart view --json`,
403
- )
404
- .action(async (_opts: unknown, cmd: Command) => {
405
- await run(cmd, async () => {
406
- const result = await viewCart();
407
- return { cart: result };
408
- });
409
- });
410
-
411
- // cart add
412
- cart
413
- .command("add")
414
- .description("Add a product to the cart")
415
- .requiredOption("--asin <asin>", "Product ASIN")
416
- .option("--quantity <n>", "Quantity", "1")
417
- .option("--fresh", "Amazon Fresh item")
418
- .option("--verbose", "Show detailed diagnostics for debugging")
419
- .addHelpText(
420
- "after",
421
- `
422
- Adds a product to the Amazon cart by ASIN.
423
-
424
- Options:
425
- --asin <asin> Required. The product ASIN to add (from search or product details).
426
- --quantity <n> Number of units to add (default: 1).
427
- --fresh Flag the item as an Amazon Fresh grocery product. Required for
428
- Fresh items to route through the correct add-to-cart workflow.
429
- --verbose Print detailed diagnostics to stderr for debugging add-to-cart
430
- failures. Includes raw Amazon API response data.
431
-
432
- Examples:
433
- $ assistant amazon cart add --asin B07XXXXX
434
- $ assistant amazon cart add --asin B08YYYYY --quantity 3 --fresh
435
- $ assistant amazon cart add --asin B07XXXXX --verbose`,
436
- )
437
- .action(
438
- async (
439
- opts: {
440
- asin: string;
441
- quantity: string;
442
- fresh?: boolean;
443
- verbose?: boolean;
444
- },
445
- cmd: Command,
446
- ) => {
447
- await run(cmd, async () => {
448
- const result = await addToCart({
449
- asin: opts.asin,
450
- quantity: parseInt(opts.quantity, 10),
451
- isFresh: opts.fresh,
452
- verbose: opts.verbose,
453
- });
454
- // Dump verbose diagnostics to stderr so they don't pollute JSON output
455
- if (opts.verbose) {
456
- const v = (result as unknown as Record<string, unknown>).__verbose;
457
- if (v) {
458
- process.stderr.write(
459
- "\n[amazon:verbose] ── Cart Add Diagnostics ──\n",
460
- );
461
- for (const [k, val] of Object.entries(
462
- v as Record<string, unknown>,
463
- )) {
464
- const icon = String(val) === "EMPTY" ? "❌" : "✅";
465
- process.stderr.write(
466
- `[amazon:verbose] ${icon} ${k}: ${val}\n`,
467
- );
468
- }
469
- process.stderr.write(
470
- "[amazon:verbose] ──────────────────────────\n\n",
471
- );
472
- }
473
- const d = (result as unknown as Record<string, unknown>).__debug as
474
- | Record<string, unknown>
475
- | undefined;
476
- if (d?.addCartJson) {
477
- process.stderr.write(
478
- `[amazon:verbose] Raw Amazon response: ${d.addCartJson}\n\n`,
479
- );
480
- }
481
- }
482
- // Strip internal debug fields from JSON output unless verbose
483
- if (!opts.verbose) {
484
- delete (result as unknown as Record<string, unknown>).__verbose;
485
- delete (result as unknown as Record<string, unknown>).__debug;
486
- }
487
- return { cart: result };
488
- });
489
- },
490
- );
491
-
492
- // cart remove
493
- cart
494
- .command("remove")
495
- .description("Remove an item from the cart")
496
- .requiredOption("--cart-item-id <id>", "Cart item ID (from cart view)")
497
- .addHelpText(
498
- "after",
499
- `
500
- Removes a single item from the cart by its cart-item-id.
501
-
502
- Options:
503
- --cart-item-id <id> Required. The cart item identifier returned by "cart view".
504
- This is NOT the product ASIN — it is Amazon's internal cart
505
- line-item ID.
506
-
507
- Examples:
508
- $ assistant amazon cart remove --cart-item-id CXYZ123
509
- $ assistant amazon cart remove --cart-item-id CXYZ123 --json`,
510
- )
511
- .action(async (opts: { cartItemId: string }, cmd: Command) => {
512
- await run(cmd, async () => {
513
- const result = await removeFromCart({ cartItemId: opts.cartItemId });
514
- return { cart: result };
515
- });
516
- });
517
-
518
- // =========================================================================
519
- // fresh — Amazon Fresh operations (subcommand group)
520
- // =========================================================================
521
- const fresh = amz
522
- .command("fresh")
523
- .description("Amazon Fresh grocery delivery operations");
524
-
525
- fresh.addHelpText(
526
- "after",
527
- `
528
- Amazon Fresh grocery delivery management. Before placing a Fresh order, a
529
- delivery slot must be selected. Use "delivery-slots" to list available time
530
- windows, then "select-slot" to reserve one.
531
-
532
- Fresh items must also be added to cart with the --fresh flag:
533
- $ assistant amazon cart add --asin B08YYYYY --fresh
534
-
535
- Examples:
536
- $ assistant amazon fresh delivery-slots
537
- $ assistant amazon fresh select-slot --slot-id slot_abc123`,
538
- );
539
-
540
- // fresh delivery-slots
541
- fresh
542
- .command("delivery-slots")
543
- .description("Get available Amazon Fresh delivery slots")
544
- .addHelpText(
545
- "after",
546
- `
547
- Lists available Amazon Fresh delivery time windows. Each slot includes a
548
- slot ID, date, time range, and availability status. Use the slot ID with
549
- "fresh select-slot" to reserve a delivery window before placing an order.
550
-
551
- Slot availability changes frequently. Re-check before placing an order if
552
- significant time has passed since the last query.
553
-
554
- Examples:
555
- $ assistant amazon fresh delivery-slots
556
- $ assistant amazon fresh delivery-slots --json`,
557
- )
558
- .action(async (_opts: unknown, cmd: Command) => {
559
- await run(cmd, async () => {
560
- const slots = await getFreshDeliverySlots();
561
- return { slots, count: slots.length };
562
- });
563
- });
564
-
565
- // fresh select-slot
566
- fresh
567
- .command("select-slot")
568
- .description("Select an Amazon Fresh delivery slot")
569
- .requiredOption(
570
- "--slot-id <id>",
571
- "Delivery slot ID (from delivery-slots command)",
572
- )
573
- .addHelpText(
574
- "after",
575
- `
576
- Reserves an Amazon Fresh delivery slot for the current order. The slot ID
577
- must be obtained from "fresh delivery-slots". A slot must be selected before
578
- placing an Amazon Fresh order via "order place".
579
-
580
- Examples:
581
- $ assistant amazon fresh select-slot --slot-id slot_abc123
582
- $ assistant amazon fresh select-slot --slot-id slot_abc123 --json`,
583
- )
584
- .action(async (opts: { slotId: string }, cmd: Command) => {
585
- await run(cmd, async () => {
586
- const result = await selectFreshDeliverySlot(opts.slotId);
587
- return result;
588
- });
589
- });
590
-
591
- // =========================================================================
592
- // payment-methods — list saved payment methods
593
- // =========================================================================
594
- amz
595
- .command("payment-methods")
596
- .description("List saved payment methods")
597
- .addHelpText(
598
- "after",
599
- `
600
- Lists all payment methods saved on the user's Amazon account. Each method
601
- includes a payment-method-id, type (credit card, debit, etc.), and a
602
- masked description. Use the payment-method-id with "order place" to select
603
- a specific payment method.
604
-
605
- If no --payment-method-id is passed to "order place", Amazon uses the
606
- account's default payment method.
607
-
608
- Examples:
609
- $ assistant amazon payment-methods
610
- $ assistant amazon payment-methods --json`,
611
- )
612
- .action(async (_opts: unknown, cmd: Command) => {
613
- await run(cmd, async () => {
614
- const methods = await getPaymentMethods();
615
- return { methods, count: methods.length };
616
- });
617
- });
618
-
619
- // =========================================================================
620
- // checkout — get checkout summary
621
- // =========================================================================
622
- amz
623
- .command("checkout")
624
- .description("Get checkout summary (totals, shipping, payment options)")
625
- .addHelpText(
626
- "after",
627
- `
628
- Retrieves the checkout summary without placing an order. Returns item
629
- totals, shipping cost, tax, estimated delivery dates, selected payment
630
- method, and shipping address.
631
-
632
- Use this to review the order before committing with "order place". This
633
- command is read-only and does not charge or modify the cart.
634
-
635
- Examples:
636
- $ assistant amazon checkout
637
- $ assistant amazon checkout --json`,
638
- )
639
- .action(async (_opts: unknown, cmd: Command) => {
640
- await run(cmd, async () => {
641
- const summary = await getCheckoutSummary();
642
- return { summary };
643
- });
644
- });
645
-
646
- // =========================================================================
647
- // order — order operations (subcommand group)
648
- // =========================================================================
649
- const order = amz.command("order").description("Order operations");
650
-
651
- order.addHelpText(
652
- "after",
653
- `
654
- Order management commands. Currently supports placing orders.
655
-
656
- WARNING: "order place" is IRREVERSIBLE. It charges the user's payment
657
- method and submits a real Amazon order that cannot be undone via this CLI.
658
- Always confirm with the user and review checkout summary first.
659
-
660
- Examples:
661
- $ assistant amazon checkout
662
- $ assistant amazon order place`,
663
- );
664
-
665
- // order place
666
- order
667
- .command("place")
668
- .description(
669
- "Place an Amazon order (IRREVERSIBLE — always confirm with user first)",
670
- )
671
- .option(
672
- "--payment-method-id <id>",
673
- "Payment method ID (uses default if omitted)",
674
- )
675
- .addHelpText(
676
- "after",
677
- `
678
- *** IRREVERSIBLE *** This command places a real Amazon order. It charges the
679
- user's payment method and cannot be cancelled or undone through this CLI.
680
- Always review "checkout" output and get explicit user confirmation first.
681
-
682
- Options:
683
- --payment-method-id <id> Payment method to charge. Obtain IDs from
684
- "payment-methods". If omitted, Amazon uses the
685
- account's default payment method.
686
-
687
- For Amazon Fresh orders, select a delivery slot before placing the order:
688
- $ assistant amazon fresh select-slot --slot-id slot_abc123
689
-
690
- Recommended workflow before placing an order:
691
- 1. assistant amazon cart view (verify cart contents)
692
- 2. assistant amazon checkout (review totals and shipping)
693
- 3. Confirm with the user
694
- 4. assistant amazon order place
695
-
696
- Examples:
697
- $ assistant amazon order place
698
- $ assistant amazon order place --payment-method-id pm_abc123
699
- $ assistant amazon order place --json`,
700
- )
701
- .action(async (opts: { paymentMethodId?: string }, cmd: Command) => {
702
- await run(cmd, async () => {
703
- const result = await placeOrder({
704
- paymentMethodId: opts.paymentMethodId,
705
- });
706
- return { order: result };
707
- });
708
- });
709
- }
710
-
711
- // ---------------------------------------------------------------------------
712
- // Headless cookie extraction from Chrome's SQLite database
713
- // ---------------------------------------------------------------------------
714
-
715
- import { execSync } from "node:child_process";
716
- import * as crypto from "node:crypto";
717
- import {
718
- copyFileSync,
719
- existsSync as fileExists,
720
- unlinkSync as unlinkFileSync,
721
- } from "node:fs";
722
- import { homedir, tmpdir } from "node:os";
723
- import { join as pathJoin } from "node:path";
724
-
725
- const CHROME_COOKIES_DB = pathJoin(
726
- homedir(),
727
- "Library/Application Support/Google/Chrome/Default/Cookies",
728
- );
729
-
730
- /**
731
- * Decrypt a Chrome cookie encrypted_value blob on macOS.
732
- * Chrome uses AES-128-CBC with a key derived from the Keychain password via PBKDF2.
733
- * The encrypted blob is prefixed with 'v10' (3 bytes).
734
- */
735
- function decryptChromeCookie(
736
- encHex: string,
737
- derivedKey: Buffer,
738
- ): string | null {
739
- const buf = Buffer.from(encHex, "hex");
740
- if (buf.length < 4 || buf.slice(0, 3).toString() !== "v10") return null;
741
- try {
742
- const iv = Buffer.alloc(16, 0x20); // Chrome uses 16 space characters as IV
743
- const decipher = crypto.createDecipheriv("aes-128-cbc", derivedKey, iv);
744
- const decrypted = Buffer.concat([
745
- decipher.update(buf.slice(3)),
746
- decipher.final(),
747
- ]);
748
- // Strip leading non-printable bytes (padding artifacts)
749
- const str = decrypted.toString("utf-8");
750
- const match = str.match(/[\x20-\x7e]+/);
751
- return match ? match[0] : null;
752
- } catch {
753
- return null;
754
- }
755
- }
756
-
757
- /**
758
- * Extract Amazon session cookies directly from Chrome's local SQLite cookie database.
759
- * No visible Chrome window or user interaction required.
760
- *
761
- * Requirements:
762
- * - Chrome must be installed with a Default profile
763
- * - The user must be signed into Amazon in Chrome
764
- * - macOS Keychain access for 'Chrome Safe Storage' (will prompt once)
765
- */
766
- async function extractSessionFromChromeCookies(): Promise<
767
- import("./session.js").AmazonSession
768
- > {
769
- // 1. Get Chrome Safe Storage key from macOS Keychain
770
- let keychainPassword: string;
771
- try {
772
- keychainPassword = execSync(
773
- 'security find-generic-password -w -s "Chrome Safe Storage" -a "Chrome"',
774
- { encoding: "utf-8" },
775
- ).trim();
776
- } catch {
777
- throw new Error(
778
- "Could not read Chrome Safe Storage key from macOS Keychain. " +
779
- "Make sure Chrome is installed and has been opened at least once.",
780
- );
781
- }
782
-
783
- // 2. Derive the AES key using PBKDF2 (same as Chrome's implementation)
784
- const derivedKey = crypto.pbkdf2Sync(
785
- keychainPassword,
786
- "saltysalt",
787
- 1003,
788
- 16,
789
- "sha1",
790
- );
791
-
792
- // 3. Copy the Cookies DB to a temp file, then query the copy.
793
- // Reading Chrome's live SQLite DB directly can interfere with Chrome's
794
- // WAL journaling and cause session logouts. Copying first is safe.
795
- const tmpCookiesDb = pathJoin(
796
- tmpdir(),
797
- `vellum-chrome-cookies-${Date.now()}.db`,
798
- );
799
- let rawOutput: string;
800
- try {
801
- copyFileSync(CHROME_COOKIES_DB, tmpCookiesDb);
802
- // Also copy WAL and SHM files if they exist, so the copy is consistent
803
- const walPath = CHROME_COOKIES_DB + "-wal";
804
- const shmPath = CHROME_COOKIES_DB + "-shm";
805
- if (fileExists(walPath)) copyFileSync(walPath, tmpCookiesDb + "-wal");
806
- if (fileExists(shmPath)) copyFileSync(shmPath, tmpCookiesDb + "-shm");
807
-
808
- rawOutput = execSync(
809
- `sqlite3 "${tmpCookiesDb}" "SELECT name, hex(encrypted_value), host_key, path, is_httponly, is_secure, expires_utc FROM cookies WHERE host_key LIKE '%amazon.com%'"`,
810
- { encoding: "utf-8" },
811
- ).trim();
812
- } catch {
813
- throw new Error(
814
- "Could not read Chrome Cookies database. " +
815
- "Make sure Chrome is installed and the Cookies file exists.",
816
- );
817
- } finally {
818
- // Clean up temp files
819
- try {
820
- unlinkFileSync(tmpCookiesDb);
821
- } catch {}
822
- try {
823
- unlinkFileSync(tmpCookiesDb + "-wal");
824
- } catch {}
825
- try {
826
- unlinkFileSync(tmpCookiesDb + "-shm");
827
- } catch {}
828
- }
829
-
830
- if (!rawOutput) {
831
- throw new Error(
832
- "No Amazon cookies found in Chrome. " +
833
- "Make sure you are signed into Amazon in Chrome.",
834
- );
835
- }
836
-
837
- // 4. Decrypt each cookie
838
- const cookies: ExtractedCredential[] = [];
839
- for (const line of rawOutput.split("\n")) {
840
- const parts = line.split("|");
841
- if (parts.length < 7) continue;
842
- const [name, encHex, domain, path, httpOnly, secure, expiresUtc] = parts;
843
- if (!encHex) continue;
844
-
845
- const value = decryptChromeCookie(encHex, derivedKey);
846
- if (!value) continue;
847
-
848
- cookies.push({
849
- name,
850
- value,
851
- domain,
852
- path: path || "/",
853
- httpOnly: httpOnly === "1",
854
- secure: secure === "1",
855
- expires: expiresUtc
856
- ? Math.floor(parseInt(expiresUtc, 10) / 1000000 - 11644473600)
857
- : undefined,
858
- });
859
- }
860
-
861
- // 5. Validate required cookies are present
862
- const cookieNames = new Set(cookies.map((c) => c.name));
863
- if (!cookieNames.has("session-id")) {
864
- throw new Error(
865
- "Chrome cookies are missing required Amazon cookie: session-id. " +
866
- "Make sure you are signed into Amazon in Chrome.",
867
- );
868
- }
869
- if (!cookieNames.has("ubid-main")) {
870
- throw new Error(
871
- "Chrome cookies are missing required Amazon cookie: ubid-main. " +
872
- "Make sure you are signed into Amazon in Chrome.",
873
- );
874
- }
875
- if (!cookieNames.has("at-main") && !cookieNames.has("x-main")) {
876
- throw new Error(
877
- "Chrome cookies are missing required Amazon auth cookie (at-main or x-main). " +
878
- "Make sure you are fully signed into Amazon in Chrome.",
879
- );
880
- }
881
-
882
- return {
883
- cookies,
884
- };
885
- }