@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.
Files changed (713) hide show
  1. package/.prettierignore +4 -0
  2. package/ARCHITECTURE.md +46 -44
  3. package/README.md +15 -16
  4. package/bun.lock +10 -35
  5. package/docs/architecture/integrations.md +102 -215
  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 -3
  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-asset.test.ts +1 -1
  40. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +23 -9
  41. package/src/__tests__/call-controller.test.ts +0 -1
  42. package/src/__tests__/call-conversation-messages.test.ts +0 -1
  43. package/src/__tests__/call-domain.test.ts +0 -1
  44. package/src/__tests__/call-pointer-messages.test.ts +0 -1
  45. package/src/__tests__/call-recovery.test.ts +0 -1
  46. package/src/__tests__/call-routes-http.test.ts +0 -1
  47. package/src/__tests__/call-store.test.ts +0 -1
  48. package/src/__tests__/canonical-guardian-store.test.ts +0 -1
  49. package/src/__tests__/channel-approval-routes.test.ts +1 -1
  50. package/src/__tests__/channel-approvals.test.ts +1 -1
  51. package/src/__tests__/channel-delivery-store.test.ts +0 -1
  52. package/src/__tests__/channel-guardian.test.ts +5 -7
  53. package/src/__tests__/channel-retry-sweep.test.ts +0 -1
  54. package/src/__tests__/checker.test.ts +32 -36
  55. package/src/__tests__/compaction.benchmark.test.ts +16 -14
  56. package/src/__tests__/computer-use-session-lifecycle.test.ts +10 -11
  57. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  58. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +2 -5
  59. package/src/__tests__/computer-use-tools.test.ts +35 -31
  60. package/src/__tests__/config-schema.test.ts +11 -15
  61. package/src/__tests__/config-watcher.test.ts +0 -1
  62. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  63. package/src/__tests__/conflict-store.test.ts +0 -1
  64. package/src/__tests__/connection-policy.test.ts +4 -7
  65. package/src/__tests__/contacts-tools.test.ts +0 -1
  66. package/src/__tests__/context-memory-e2e.test.ts +2 -4
  67. package/src/__tests__/context-overflow-reducer.test.ts +2 -4
  68. package/src/__tests__/context-window-manager.test.ts +147 -60
  69. package/src/__tests__/contradiction-checker.test.ts +0 -1
  70. package/src/__tests__/conversation-attention-store.test.ts +0 -1
  71. package/src/__tests__/conversation-attention-telegram.test.ts +1 -1
  72. package/src/__tests__/conversation-pairing.test.ts +2 -2
  73. package/src/__tests__/conversation-routes-guardian-reply.test.ts +31 -7
  74. package/src/__tests__/conversation-routes-slash-commands.test.ts +381 -0
  75. package/src/__tests__/conversation-store.test.ts +0 -1
  76. package/src/__tests__/conversation-unread-route.test.ts +1 -2
  77. package/src/__tests__/credential-security-invariants.test.ts +8 -8
  78. package/src/__tests__/cross-provider-web-search.test.ts +353 -0
  79. package/src/__tests__/daemon-assistant-events.test.ts +6 -7
  80. package/src/__tests__/db-schedule-syntax-migration.test.ts +15 -3
  81. package/src/__tests__/delete-managed-skill-tool.test.ts +5 -9
  82. package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -1
  83. package/src/__tests__/diagnostics-export.test.ts +189 -0
  84. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  85. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
  86. package/src/__tests__/entity-extractor.test.ts +0 -1
  87. package/src/__tests__/entity-search.test.ts +0 -1
  88. package/src/__tests__/ephemeral-permissions.test.ts +2 -4
  89. package/src/__tests__/error-handler-friendly-messages.test.ts +46 -0
  90. package/src/__tests__/file-read-tool.test.ts +86 -0
  91. package/src/__tests__/followup-tools.test.ts +0 -1
  92. package/src/__tests__/frontmatter.test.ts +77 -34
  93. package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
  94. package/src/__tests__/gateway-only-guard.test.ts +1 -1
  95. package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -1
  96. package/src/__tests__/guardian-action-followup-executor.test.ts +0 -1
  97. package/src/__tests__/guardian-action-followup-store.test.ts +0 -1
  98. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
  99. package/src/__tests__/guardian-action-late-reply.test.ts +0 -1
  100. package/src/__tests__/guardian-action-store.test.ts +0 -1
  101. package/src/__tests__/guardian-action-sweep.test.ts +0 -1
  102. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
  103. package/src/__tests__/guardian-dispatch.test.ts +1 -2
  104. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  105. package/src/__tests__/guardian-outbound-http.test.ts +0 -1
  106. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -1
  107. package/src/__tests__/guardian-routing-invariants.test.ts +1 -1
  108. package/src/__tests__/guardian-routing-state.test.ts +0 -1
  109. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
  110. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +3 -5
  111. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +28 -426
  112. package/src/__tests__/host-bash-proxy.test.ts +335 -0
  113. package/src/__tests__/host-file-proxy.test.ts +374 -0
  114. package/src/__tests__/host-shell-tool.test.ts +147 -1
  115. package/src/__tests__/http-user-message-parity.test.ts +361 -0
  116. package/src/__tests__/inbound-invite-redemption.test.ts +0 -1
  117. package/src/__tests__/integration-status.test.ts +3 -8
  118. package/src/__tests__/intent-routing.test.ts +7 -46
  119. package/src/__tests__/invite-redemption-service.test.ts +0 -1
  120. package/src/__tests__/invite-routes-http.test.ts +0 -1
  121. package/src/__tests__/llm-usage-store.test.ts +0 -1
  122. package/src/__tests__/managed-avatar-client.test.ts +101 -55
  123. package/src/__tests__/managed-skill-lifecycle.test.ts +9 -18
  124. package/src/__tests__/managed-store.test.ts +94 -21
  125. package/src/__tests__/media-reuse-story.e2e.test.ts +0 -1
  126. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +2 -4
  127. package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -1
  128. package/src/__tests__/memory-recall-quality.test.ts +0 -1
  129. package/src/__tests__/memory-regressions.experimental.test.ts +0 -1
  130. package/src/__tests__/memory-regressions.test.ts +0 -1
  131. package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -1
  132. package/src/__tests__/memory-upsert-concurrency.test.ts +0 -1
  133. package/src/__tests__/messaging-send-tool.test.ts +35 -0
  134. package/src/__tests__/messaging-skill-split.test.ts +138 -0
  135. package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -1
  136. package/src/__tests__/migration-export-http.test.ts +2 -3
  137. package/src/__tests__/migration-import-commit-http.test.ts +1 -2
  138. package/src/__tests__/migration-import-preflight-http.test.ts +1 -2
  139. package/src/__tests__/migration-validate-http.test.ts +1 -2
  140. package/src/__tests__/native-web-search.test.ts +475 -0
  141. package/src/__tests__/navigate-settings-tab.test.ts +84 -0
  142. package/src/__tests__/non-member-access-request.test.ts +0 -1
  143. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  144. package/src/__tests__/notification-decision-strategy.test.ts +6 -6
  145. package/src/__tests__/notification-deep-link.test.ts +7 -7
  146. package/src/__tests__/notification-guardian-path.test.ts +2 -3
  147. package/src/__tests__/notification-telegram-adapter.test.ts +1 -1
  148. package/src/__tests__/notification-thread-candidates.test.ts +4 -4
  149. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
  150. package/src/__tests__/onboarding-template-contract.test.ts +0 -10
  151. package/src/__tests__/playbook-execution.test.ts +0 -1
  152. package/src/__tests__/playbook-tools.test.ts +0 -1
  153. package/src/__tests__/profile-compiler.test.ts +0 -1
  154. package/src/__tests__/provider-fail-open-selection.test.ts +12 -2
  155. package/src/__tests__/provider-managed-proxy-integration.test.ts +25 -0
  156. package/src/__tests__/qdrant-collection-migration.test.ts +223 -0
  157. package/src/__tests__/recording-handler.test.ts +30 -94
  158. package/src/__tests__/registry.test.ts +28 -35
  159. package/src/__tests__/relay-server.test.ts +0 -1
  160. package/src/__tests__/ride-shotgun-handler.test.ts +4 -20
  161. package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
  162. package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
  163. package/src/__tests__/runtime-events-sse.test.ts +0 -1
  164. package/src/__tests__/sandbox-diagnostics.test.ts +0 -1
  165. package/src/__tests__/scaffold-managed-skill-tool.test.ts +30 -28
  166. package/src/__tests__/schedule-store.test.ts +441 -1
  167. package/src/__tests__/schedule-tools.test.ts +468 -7
  168. package/src/__tests__/scheduler-recurrence.test.ts +196 -23
  169. package/src/__tests__/scoped-approval-grants.test.ts +0 -1
  170. package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
  171. package/src/__tests__/secret-prompt-log-hygiene.test.ts +6 -3
  172. package/src/__tests__/secret-response-routing.test.ts +4 -1
  173. package/src/__tests__/send-endpoint-busy.test.ts +14 -5
  174. package/src/__tests__/send-notification-tool.test.ts +0 -7
  175. package/src/__tests__/sequence-store.test.ts +0 -1
  176. package/src/__tests__/server-history-render.test.ts +1 -2
  177. package/src/__tests__/session-abort-tool-results.test.ts +0 -1
  178. package/src/__tests__/session-agent-loop.test.ts +46 -6
  179. package/src/__tests__/session-confirmation-signals.test.ts +7 -46
  180. package/src/__tests__/session-conflict-gate.test.ts +2 -6
  181. package/src/__tests__/session-error.test.ts +5 -14
  182. package/src/__tests__/session-init.benchmark.test.ts +3 -5
  183. package/src/__tests__/session-load-history-repair.test.ts +0 -1
  184. package/src/__tests__/session-media-retry.test.ts +12 -74
  185. package/src/__tests__/session-pre-run-repair.test.ts +0 -1
  186. package/src/__tests__/session-profile-injection.test.ts +2 -6
  187. package/src/__tests__/session-provider-retry-repair.test.ts +2 -6
  188. package/src/__tests__/session-queue.test.ts +94 -139
  189. package/src/__tests__/session-skill-tools.test.ts +115 -115
  190. package/src/__tests__/session-slash-known.test.ts +0 -1
  191. package/src/__tests__/session-slash-queue.test.ts +0 -1
  192. package/src/__tests__/session-slash-unknown.test.ts +0 -1
  193. package/src/__tests__/session-surfaces-task-progress.test.ts +34 -0
  194. package/src/__tests__/session-usage.test.ts +0 -1
  195. package/src/__tests__/session-workspace-cache-state.test.ts +2 -6
  196. package/src/__tests__/session-workspace-injection.test.ts +2 -6
  197. package/src/__tests__/session-workspace-tool-tracking.test.ts +2 -6
  198. package/src/__tests__/skill-feature-flags-integration.test.ts +180 -184
  199. package/src/__tests__/skill-feature-flags.test.ts +125 -18
  200. package/src/__tests__/skill-load-feature-flag.test.ts +1 -2
  201. package/src/__tests__/skill-load-tool.test.ts +194 -2
  202. package/src/__tests__/skill-projection-feature-flag.test.ts +27 -16
  203. package/src/__tests__/skill-projection.benchmark.test.ts +15 -14
  204. package/src/__tests__/skills.test.ts +14 -53
  205. package/src/__tests__/slack-channel-config.test.ts +0 -1
  206. package/src/__tests__/slack-inbound-verification.test.ts +0 -1
  207. package/src/__tests__/slack-skill.test.ts +1 -1
  208. package/src/__tests__/starter-task-flow.test.ts +9 -19
  209. package/src/__tests__/subagent-tools.test.ts +2 -2
  210. package/src/__tests__/system-prompt.test.ts +7 -7
  211. package/src/__tests__/task-compiler.test.ts +0 -1
  212. package/src/__tests__/task-management-tools.test.ts +0 -1
  213. package/src/__tests__/task-memory-cleanup.test.ts +0 -1
  214. package/src/__tests__/task-runner.test.ts +0 -1
  215. package/src/__tests__/task-scheduler.test.ts +0 -1
  216. package/src/__tests__/terminal-tools.test.ts +0 -1
  217. package/src/__tests__/test-support/computer-use-skill-harness.ts +2 -4
  218. package/src/__tests__/thread-seed-composer.test.ts +5 -5
  219. package/src/__tests__/tool-approval-handler.test.ts +0 -1
  220. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
  221. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
  222. package/src/__tests__/tool-executor.test.ts +8 -86
  223. package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
  224. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  225. package/src/__tests__/tool-preview-lifecycle.test.ts +416 -0
  226. package/src/__tests__/trust-store.test.ts +84 -8
  227. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  228. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
  229. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -1
  230. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  231. package/src/__tests__/trusted-contact-verification.test.ts +0 -1
  232. package/src/__tests__/twilio-provider.test.ts +0 -1
  233. package/src/__tests__/twilio-routes.test.ts +0 -1
  234. package/src/__tests__/{request-file-tool.test.ts → ui-file-upload-surface.test.ts} +11 -72
  235. package/src/__tests__/update-bulletin.test.ts +0 -1
  236. package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -1
  237. package/src/__tests__/usage-routes.test.ts +0 -1
  238. package/src/__tests__/verification-control-plane-policy.test.ts +4 -4
  239. package/src/__tests__/voice-invite-redemption.test.ts +0 -1
  240. package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
  241. package/src/__tests__/voice-session-bridge.test.ts +9 -1
  242. package/src/__tests__/web-fetch.test.ts +57 -0
  243. package/src/__tests__/workspace-git-service.test.ts +5 -14
  244. package/src/__tests__/workspace-policy.test.ts +0 -1
  245. package/src/agent/loop.ts +22 -34
  246. package/src/bundler/bundle-signer.ts +4 -4
  247. package/src/calls/call-controller.ts +1 -1
  248. package/src/calls/relay-server.ts +1 -1
  249. package/src/calls/twilio-rest.ts +1 -1
  250. package/src/calls/voice-session-bridge.ts +3 -1
  251. package/src/cli/__tests__/notifications.test.ts +3 -4
  252. package/src/cli/commands/map.ts +2 -6
  253. package/src/cli/commands/mcp.ts +73 -15
  254. package/src/cli/commands/notifications.ts +4 -4
  255. package/src/cli/commands/sessions.ts +9 -1
  256. package/src/cli/commands/skills.ts +6 -10
  257. package/src/cli/http-client.ts +2 -3
  258. package/src/cli/main-screen.tsx +10 -10
  259. package/src/cli/program.ts +0 -4
  260. package/src/cli/reference.ts +0 -2
  261. package/src/cli.ts +15 -9
  262. package/src/config/__tests__/bundled-tool-registry-guard.test.ts +120 -0
  263. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +11 -0
  264. package/src/config/bundled-skills/app-builder/SKILL.md +6 -7
  265. package/src/config/bundled-skills/app-builder/TOOLS.json +0 -4
  266. package/src/config/bundled-skills/browser/SKILL.md +6 -1
  267. package/src/config/bundled-skills/chatgpt-import/SKILL.md +5 -1
  268. package/src/config/bundled-skills/claude-code/SKILL.md +5 -1
  269. package/src/config/bundled-skills/computer-use/SKILL.md +6 -1
  270. package/src/config/bundled-skills/computer-use/TOOLS.json +6 -69
  271. package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +10 -1
  272. package/src/config/bundled-skills/contacts/SKILL.md +10 -1
  273. package/src/config/bundled-skills/contacts/TOOLS.json +35 -0
  274. package/src/config/bundled-skills/{messaging → contacts}/tools/google-contacts.ts +9 -2
  275. package/src/config/bundled-skills/document/SKILL.md +4 -1
  276. package/src/config/bundled-skills/doordash/SKILL.md +8 -2
  277. package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +1 -82
  278. package/src/config/bundled-skills/doordash/doordash-cli.ts +17 -28
  279. package/src/config/bundled-skills/doordash/lib/session.ts +21 -17
  280. package/src/config/bundled-skills/doordash/lib/shared/platform.ts +4 -1
  281. package/src/config/bundled-skills/followups/SKILL.md +4 -1
  282. package/src/config/bundled-skills/gmail/SKILL.md +180 -0
  283. package/src/config/bundled-skills/gmail/TOOLS.json +506 -0
  284. package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +149 -0
  285. package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +110 -0
  286. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-draft.ts +1 -1
  287. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-filters.ts +1 -1
  288. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-follow-up.ts +1 -1
  289. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-forward.ts +1 -1
  290. package/src/config/bundled-skills/gmail/tools/gmail-label.ts +50 -0
  291. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-outreach-scan.ts +8 -90
  292. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-send-draft.ts +1 -1
  293. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-sender-digest.ts +2 -2
  294. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-trash.ts +1 -1
  295. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-unsubscribe.ts +1 -1
  296. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-vacation.ts +1 -1
  297. package/src/config/bundled-skills/gmail/tools/shared.ts +47 -0
  298. package/src/config/bundled-skills/google-calendar/SKILL.md +5 -1
  299. package/src/config/bundled-skills/image-studio/SKILL.md +5 -1
  300. package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -1
  301. package/src/config/bundled-skills/media-processing/SKILL.md +7 -13
  302. package/src/config/bundled-skills/media-processing/TOOLS.json +0 -22
  303. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +12 -1
  304. package/src/config/bundled-skills/messaging/SKILL.md +23 -139
  305. package/src/config/bundled-skills/messaging/TOOLS.json +33 -1215
  306. package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +42 -0
  307. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +165 -2
  308. package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +1 -13
  309. package/src/config/bundled-skills/messaging/tools/shared.ts +81 -34
  310. package/src/config/bundled-skills/notifications/SKILL.md +5 -1
  311. package/src/config/bundled-skills/orchestration/SKILL.md +30 -0
  312. package/src/config/bundled-skills/orchestration/TOOLS.json +35 -0
  313. package/src/config/bundled-skills/{reminder/tools/reminder-cancel.ts → orchestration/tools/swarm-delegate.ts} +3 -3
  314. package/src/config/bundled-skills/phone-calls/SKILL.md +9 -1
  315. package/src/config/bundled-skills/playbooks/SKILL.md +4 -1
  316. package/src/config/bundled-skills/schedule/SKILL.md +70 -9
  317. package/src/config/bundled-skills/schedule/TOOLS.json +38 -6
  318. package/src/config/bundled-skills/screen-watch/SKILL.md +28 -0
  319. package/src/config/bundled-skills/screen-watch/TOOLS.json +35 -0
  320. package/src/config/bundled-skills/{reminder/tools/reminder-create.ts → screen-watch/tools/start-screen-watch.ts} +3 -3
  321. package/src/config/bundled-skills/sequences/SKILL.md +47 -0
  322. package/src/config/bundled-skills/sequences/TOOLS.json +340 -0
  323. package/src/config/bundled-skills/sequences/tools/sequence-update.ts +128 -0
  324. package/src/config/bundled-skills/sequences/tools/shared.ts +9 -0
  325. package/src/config/bundled-skills/settings/SKILL.md +12 -0
  326. package/src/config/bundled-skills/settings/TOOLS.json +112 -0
  327. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +43 -0
  328. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +52 -0
  329. package/src/config/bundled-skills/{computer-use/tools/computer-use-right-click.ts → settings/tools/set-avatar.ts} +2 -6
  330. package/src/{tools/system/voice-config.ts → config/bundled-skills/settings/tools/voice-config-update.ts} +59 -96
  331. package/src/config/bundled-skills/skill-management/SKILL.md +18 -0
  332. package/src/config/bundled-skills/skill-management/TOOLS.json +90 -0
  333. package/src/config/bundled-skills/{computer-use/tools/computer-use-double-click.ts → skill-management/tools/delete-managed.ts} +2 -6
  334. package/src/config/bundled-skills/skill-management/tools/scaffold-managed.ts +12 -0
  335. package/src/config/bundled-skills/slack/SKILL.md +5 -1
  336. package/src/config/bundled-skills/subagent/SKILL.md +4 -1
  337. package/src/config/bundled-skills/tasks/SKILL.md +5 -2
  338. package/src/config/bundled-skills/transcribe/SKILL.md +4 -1
  339. package/src/config/bundled-skills/watcher/SKILL.md +4 -1
  340. package/src/config/bundled-tool-registry.ts +118 -107
  341. package/src/config/env.ts +5 -2
  342. package/src/config/feature-flag-registry.json +33 -9
  343. package/src/config/loader.ts +10 -2
  344. package/src/config/schema.ts +19 -16
  345. package/src/config/schemas/inference.ts +12 -22
  346. package/src/config/schemas/memory-storage.ts +19 -1
  347. package/src/config/schemas/platform.ts +0 -16
  348. package/src/config/skill-state.ts +11 -8
  349. package/src/config/skills.ts +83 -32
  350. package/src/context/token-estimator.ts +11 -0
  351. package/src/context/window-manager.ts +180 -151
  352. package/src/daemon/computer-use-session.ts +11 -43
  353. package/src/daemon/daemon-control.ts +4 -1
  354. package/src/daemon/handlers/config-channels.ts +5 -9
  355. package/src/daemon/handlers/config-ingress.ts +0 -4
  356. package/src/daemon/handlers/config-model.ts +7 -13
  357. package/src/daemon/handlers/config-telegram.ts +4 -8
  358. package/src/daemon/handlers/config-voice.ts +2 -5
  359. package/src/daemon/handlers/dictation.ts +2 -12
  360. package/src/daemon/handlers/identity.ts +0 -105
  361. package/src/daemon/handlers/recording.ts +3 -23
  362. package/src/daemon/handlers/session-history.ts +42 -10
  363. package/src/daemon/handlers/sessions.ts +53 -72
  364. package/src/daemon/handlers/shared.ts +7 -28
  365. package/src/daemon/handlers/skills.ts +31 -27
  366. package/src/daemon/host-bash-proxy.ts +148 -0
  367. package/src/daemon/host-file-proxy.ts +135 -0
  368. package/src/daemon/lifecycle.ts +53 -41
  369. package/src/daemon/mcp-reload-service.ts +123 -0
  370. package/src/daemon/message-protocol.ts +6 -0
  371. package/src/daemon/message-types/apps.ts +0 -25
  372. package/src/daemon/message-types/browser.ts +1 -1
  373. package/src/daemon/message-types/computer-use.ts +1 -4
  374. package/src/daemon/message-types/guardian-actions.ts +1 -1
  375. package/src/daemon/message-types/host-bash.ts +18 -0
  376. package/src/daemon/message-types/host-file.ts +44 -0
  377. package/src/daemon/message-types/integrations.ts +1 -73
  378. package/src/daemon/message-types/messages.ts +15 -0
  379. package/src/daemon/message-types/schedules.ts +11 -27
  380. package/src/daemon/message-types/sessions.ts +8 -2
  381. package/src/daemon/message-types/settings.ts +1 -1
  382. package/src/daemon/message-types/shared.ts +1 -1
  383. package/src/daemon/message-types/surfaces.ts +2 -0
  384. package/src/daemon/ride-shotgun-handler.ts +35 -43
  385. package/src/daemon/seed-files.ts +3 -27
  386. package/src/daemon/server.ts +45 -28
  387. package/src/daemon/session-agent-loop-handlers.ts +72 -9
  388. package/src/daemon/session-agent-loop.ts +97 -66
  389. package/src/daemon/session-attachments.ts +1 -1
  390. package/src/daemon/session-error.ts +17 -16
  391. package/src/daemon/session-lifecycle.ts +20 -1
  392. package/src/daemon/session-media-retry.ts +1 -15
  393. package/src/daemon/session-messaging.ts +14 -6
  394. package/src/daemon/session-process.ts +36 -7
  395. package/src/daemon/session-queue-manager.ts +62 -103
  396. package/src/daemon/session-runtime-assembly.ts +27 -7
  397. package/src/daemon/session-skill-tools.ts +12 -11
  398. package/src/daemon/session-slash.ts +7 -0
  399. package/src/daemon/session-surfaces.ts +192 -118
  400. package/src/daemon/session-tool-setup.ts +146 -6
  401. package/src/daemon/session.ts +75 -37
  402. package/src/errors.ts +0 -2
  403. package/src/export/formatter.ts +6 -0
  404. package/src/mcp/mcp-oauth-provider.ts +1 -3
  405. package/src/media/avatar-router.ts +20 -28
  406. package/src/media/avatar-types.ts +7 -14
  407. package/src/media/managed-avatar-client.ts +70 -34
  408. package/src/memory/app-store.ts +0 -18
  409. package/src/memory/conversation-title-service.ts +1 -2
  410. package/src/memory/db-init.ts +16 -0
  411. package/src/memory/embedding-backend.ts +129 -27
  412. package/src/memory/embedding-gemini.test.ts +256 -0
  413. package/src/memory/embedding-gemini.ts +47 -13
  414. package/src/memory/embedding-local.ts +14 -2
  415. package/src/memory/embedding-ollama.ts +15 -2
  416. package/src/memory/embedding-openai.ts +15 -2
  417. package/src/memory/embedding-types.test.ts +116 -0
  418. package/src/memory/embedding-types.ts +61 -0
  419. package/src/memory/fingerprint.ts +1 -1
  420. package/src/memory/indexer.ts +25 -1
  421. package/src/memory/job-handlers/embedding.test.ts +258 -0
  422. package/src/memory/job-handlers/embedding.ts +81 -1
  423. package/src/memory/job-handlers/index-maintenance.ts +35 -1
  424. package/src/memory/job-handlers/media-processing.ts +11 -1
  425. package/src/memory/job-utils.ts +21 -6
  426. package/src/memory/jobs-store.ts +5 -1
  427. package/src/memory/jobs-worker.ts +8 -0
  428. package/src/memory/message-content.ts +66 -0
  429. package/src/memory/migrations/100-core-tables.ts +1 -31
  430. package/src/memory/migrations/104-core-indexes.ts +0 -11
  431. package/src/memory/migrations/145-drop-accounts-table.ts +19 -0
  432. package/src/memory/migrations/146-schedule-oneshot-routing.ts +94 -0
  433. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +129 -0
  434. package/src/memory/migrations/148-drop-reminders-table.ts +18 -0
  435. package/src/memory/migrations/index.ts +4 -0
  436. package/src/memory/migrations/registry.ts +19 -0
  437. package/src/memory/qdrant-client.ts +158 -43
  438. package/src/memory/retriever.test.ts +0 -1
  439. package/src/memory/retriever.ts +12 -2
  440. package/src/memory/schema/infrastructure.ts +5 -37
  441. package/src/memory/search/formatting.ts +34 -9
  442. package/src/memory/search/semantic.ts +57 -2
  443. package/src/memory/search/types.ts +2 -1
  444. package/src/notifications/AGENTS.md +2 -2
  445. package/src/notifications/README.md +59 -58
  446. package/src/notifications/adapters/macos.ts +1 -1
  447. package/src/notifications/broadcaster.ts +5 -5
  448. package/src/notifications/copy-composer.ts +1 -1
  449. package/src/notifications/decision-engine.ts +2 -2
  450. package/src/notifications/destination-resolver.ts +2 -2
  451. package/src/notifications/emit-signal.ts +8 -8
  452. package/src/notifications/signal.ts +1 -1
  453. package/src/notifications/thread-seed-composer.ts +1 -1
  454. package/src/oauth/connect-orchestrator.ts +1 -1
  455. package/src/oauth/token-persistence.ts +1 -1
  456. package/src/permissions/checker.ts +12 -1
  457. package/src/permissions/defaults.ts +13 -17
  458. package/src/permissions/trust-store.ts +37 -0
  459. package/src/permissions/workspace-policy.ts +0 -1
  460. package/src/prompts/__tests__/build-cli-reference-section.test.ts +11 -0
  461. package/src/prompts/computer-use-prompt.ts +1 -1
  462. package/src/prompts/system-prompt.ts +33 -35
  463. package/src/prompts/templates/BOOTSTRAP.md +0 -3
  464. package/src/prompts/templates/SOUL.md +1 -2
  465. package/src/prompts/templates/UPDATES.md +16 -7
  466. package/src/providers/anthropic/client.ts +87 -33
  467. package/src/providers/gemini/client.ts +6 -0
  468. package/src/providers/managed-proxy/constants.ts +5 -0
  469. package/src/providers/openai/client.ts +15 -0
  470. package/src/providers/registry.ts +4 -6
  471. package/src/providers/types.ts +24 -2
  472. package/src/runtime/AGENTS.md +18 -0
  473. package/src/runtime/assistant-event-hub.ts +2 -3
  474. package/src/runtime/assistant-event.ts +4 -4
  475. package/src/runtime/auth/__tests__/context.test.ts +5 -5
  476. package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
  477. package/src/runtime/auth/__tests__/guard-tests.test.ts +3 -2
  478. package/src/runtime/auth/__tests__/{ipc-auth-context.test.ts → local-auth-context.test.ts} +21 -21
  479. package/src/runtime/auth/__tests__/route-policy.test.ts +2 -2
  480. package/src/runtime/auth/__tests__/scopes.test.ts +9 -8
  481. package/src/runtime/auth/__tests__/subject.test.ts +8 -8
  482. package/src/runtime/auth/__tests__/token-service.test.ts +0 -1
  483. package/src/runtime/auth/route-policy.ts +8 -8
  484. package/src/runtime/auth/scopes.ts +2 -1
  485. package/src/runtime/auth/subject.ts +4 -4
  486. package/src/runtime/auth/token-service.ts +1 -24
  487. package/src/runtime/auth/types.ts +3 -3
  488. package/src/runtime/guardian-action-followup-executor.ts +1 -1
  489. package/src/runtime/guardian-action-grant-minter.ts +1 -1
  490. package/src/runtime/guardian-action-service.ts +3 -3
  491. package/src/runtime/http-server.ts +15 -2
  492. package/src/runtime/http-types.ts +10 -0
  493. package/src/runtime/invite-service.ts +3 -3
  494. package/src/runtime/local-actor-identity.ts +17 -22
  495. package/src/runtime/middleware/error-handler.ts +14 -1
  496. package/src/runtime/pending-interactions.ts +21 -9
  497. package/src/runtime/routes/app-management-routes.ts +63 -67
  498. package/src/runtime/routes/approval-routes.ts +1 -3
  499. package/src/runtime/routes/brain-graph/brain-graph.html +1845 -0
  500. package/src/runtime/routes/brain-graph-routes.ts +4 -42
  501. package/src/runtime/routes/btw-routes.ts +155 -0
  502. package/src/runtime/routes/computer-use-routes.ts +77 -31
  503. package/src/runtime/routes/conversation-routes.ts +234 -47
  504. package/src/runtime/routes/diagnostics-routes.ts +154 -43
  505. package/src/runtime/routes/documents-routes.ts +2 -2
  506. package/src/runtime/routes/global-search-routes.ts +1 -1
  507. package/src/runtime/routes/host-bash-routes.ts +83 -0
  508. package/src/runtime/routes/host-file-routes.ts +79 -0
  509. package/src/runtime/routes/integrations/slack/share.ts +1 -1
  510. package/src/runtime/routes/log-export-routes.ts +120 -0
  511. package/src/runtime/routes/mcp-routes.ts +20 -0
  512. package/src/runtime/routes/migration-routes.ts +3 -3
  513. package/src/runtime/routes/pairing-routes.ts +1 -1
  514. package/src/runtime/routes/recording-routes.ts +6 -4
  515. package/src/runtime/routes/schedule-routes.ts +31 -5
  516. package/src/runtime/routes/session-management-routes.ts +2 -6
  517. package/src/runtime/routes/session-query-routes.ts +18 -15
  518. package/src/runtime/routes/settings-routes.ts +7 -351
  519. package/src/runtime/routes/skills-routes.ts +7 -6
  520. package/src/runtime/routes/subagents-routes.ts +4 -10
  521. package/src/runtime/routes/surface-action-routes.ts +3 -14
  522. package/src/runtime/routes/surface-content-routes.ts +22 -5
  523. package/src/runtime/routes/work-items-routes.ts +21 -25
  524. package/src/runtime/routes/workspace-routes.test.ts +3 -3
  525. package/src/runtime/routes/workspace-utils.ts +1 -1
  526. package/src/runtime/telegram-streaming-delivery.ts +3 -0
  527. package/src/runtime/verification-outbound-actions.ts +2 -2
  528. package/src/schedule/integration-status.ts +0 -6
  529. package/src/schedule/schedule-store.ts +234 -43
  530. package/src/schedule/scheduler.ts +73 -74
  531. package/src/security/oauth2.ts +1 -1
  532. package/src/sequence/store.ts +12 -2
  533. package/src/skills/frontmatter.ts +19 -77
  534. package/src/skills/managed-store.ts +11 -2
  535. package/src/subagent/manager.ts +5 -3
  536. package/src/tasks/ephemeral-permissions.ts +3 -5
  537. package/src/tools/AGENTS.md +37 -0
  538. package/src/tools/apps/executors.ts +0 -6
  539. package/src/tools/browser/browser-manager.ts +17 -11
  540. package/src/tools/browser/jit-auth.ts +4 -1
  541. package/src/tools/claude-code/claude-code.ts +1 -1
  542. package/src/tools/computer-use/definitions.ts +48 -60
  543. package/src/tools/document/document-tool.ts +6 -6
  544. package/src/tools/document/editor-template.ts +10 -8
  545. package/src/tools/filesystem/edit.ts +2 -1
  546. package/src/tools/filesystem/read.ts +20 -2
  547. package/src/tools/filesystem/write.ts +2 -1
  548. package/src/tools/host-filesystem/edit.ts +17 -1
  549. package/src/tools/host-filesystem/read.ts +16 -1
  550. package/src/tools/host-filesystem/write.ts +15 -1
  551. package/src/tools/host-terminal/host-shell.ts +24 -0
  552. package/src/tools/memory/definitions.ts +45 -81
  553. package/src/tools/memory/handlers.test.ts +0 -1
  554. package/src/tools/memory/handlers.ts +1 -1
  555. package/src/tools/memory/register.ts +26 -60
  556. package/src/tools/network/script-proxy/session-manager.ts +6 -8
  557. package/src/tools/network/web-fetch.ts +7 -1
  558. package/src/tools/network/web-search.ts +2 -1
  559. package/src/tools/registry.ts +23 -0
  560. package/src/tools/schedule/create.ts +113 -5
  561. package/src/tools/schedule/list.ts +57 -15
  562. package/src/tools/schedule/update.ts +73 -3
  563. package/src/tools/shared/filesystem/image-read.ts +192 -0
  564. package/src/tools/side-effects.ts +1 -7
  565. package/src/tools/skills/delete-managed.ts +27 -64
  566. package/src/tools/skills/execute.ts +54 -0
  567. package/src/tools/skills/load.ts +127 -5
  568. package/src/tools/skills/scaffold-managed.ts +93 -172
  569. package/src/tools/subagent/message.ts +0 -7
  570. package/src/tools/subagent/spawn.ts +1 -1
  571. package/src/tools/swarm/delegate.ts +0 -3
  572. package/src/tools/system/avatar-generator.ts +13 -19
  573. package/src/tools/system/request-permission.ts +2 -1
  574. package/src/tools/terminal/safe-env.ts +1 -0
  575. package/src/tools/tool-manifest.ts +41 -47
  576. package/src/tools/types.ts +6 -2
  577. package/src/tools/ui-surface/definitions.ts +0 -55
  578. package/src/util/errors.ts +12 -10
  579. package/src/workspace/git-service.ts +0 -2
  580. package/src/__tests__/account-registry.test.ts +0 -258
  581. package/src/__tests__/email-classifier.test.ts +0 -25
  582. package/src/__tests__/gmail-integration.test.ts +0 -97
  583. package/src/__tests__/handle-user-message-secret-resume.test.ts +0 -172
  584. package/src/__tests__/home-base-bootstrap.test.ts +0 -84
  585. package/src/__tests__/managed-twitter-guardrails.test.ts +0 -353
  586. package/src/__tests__/prebuilt-home-base-seed.test.ts +0 -79
  587. package/src/__tests__/recording-intent-fallback.test.ts +0 -199
  588. package/src/__tests__/recording-intent.test.ts +0 -985
  589. package/src/__tests__/recording-state-machine.test.ts +0 -1574
  590. package/src/__tests__/reminder-store.test.ts +0 -350
  591. package/src/__tests__/reminder.test.ts +0 -337
  592. package/src/__tests__/scan-result-store.test.ts +0 -121
  593. package/src/__tests__/twitter-platform-proxy-client.test.ts +0 -450
  594. package/src/__tests__/view-image-tool.test.ts +0 -241
  595. package/src/cli/commands/amazon/cart.ts +0 -513
  596. package/src/cli/commands/amazon/checkout.ts +0 -394
  597. package/src/cli/commands/amazon/client.ts +0 -513
  598. package/src/cli/commands/amazon/index.ts +0 -920
  599. package/src/cli/commands/amazon/product-details.ts +0 -145
  600. package/src/cli/commands/amazon/request-extractor.ts +0 -187
  601. package/src/cli/commands/amazon/search.ts +0 -76
  602. package/src/cli/commands/amazon/session.ts +0 -116
  603. package/src/cli/commands/twitter/__tests__/cli-error-shaping.test.ts +0 -265
  604. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -483
  605. package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -412
  606. package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -197
  607. package/src/cli/commands/twitter/client.ts +0 -989
  608. package/src/cli/commands/twitter/index.ts +0 -1160
  609. package/src/cli/commands/twitter/oauth-client.ts +0 -94
  610. package/src/cli/commands/twitter/router.ts +0 -396
  611. package/src/cli/commands/twitter/session.ts +0 -121
  612. package/src/config/bundled-skills/agentmail/SKILL.md +0 -132
  613. package/src/config/bundled-skills/agentmail/icon.svg +0 -21
  614. package/src/config/bundled-skills/amazon/SKILL.md +0 -137
  615. package/src/config/bundled-skills/amazon/icon.svg +0 -13
  616. package/src/config/bundled-skills/api-mapping/SKILL.md +0 -78
  617. package/src/config/bundled-skills/api-mapping/icon.svg +0 -18
  618. package/src/config/bundled-skills/cli-discover/SKILL.md +0 -68
  619. package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +0 -179
  620. package/src/config/bundled-skills/document-writer/SKILL.md +0 -195
  621. package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +0 -140
  622. package/src/config/bundled-skills/email-setup/SKILL.md +0 -68
  623. package/src/config/bundled-skills/frontend-design/SKILL.md +0 -44
  624. package/src/config/bundled-skills/frontend-design/icon.svg +0 -16
  625. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +0 -452
  626. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +0 -203
  627. package/src/config/bundled-skills/influencer/SKILL.md +0 -144
  628. package/src/config/bundled-skills/influencer/scripts/client.ts +0 -1269
  629. package/src/config/bundled-skills/influencer/scripts/influencer.ts +0 -267
  630. package/src/config/bundled-skills/macos-automation/SKILL.md +0 -65
  631. package/src/config/bundled-skills/macos-automation/icon.svg +0 -12
  632. package/src/config/bundled-skills/mcp-setup/SKILL.md +0 -75
  633. package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +0 -184
  634. package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +0 -80
  635. package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -29
  636. package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -56
  637. package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -34
  638. package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +0 -47
  639. package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -31
  640. package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +0 -67
  641. package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +0 -97
  642. package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +0 -87
  643. package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +0 -135
  644. package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -24
  645. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -201
  646. package/src/config/bundled-skills/messaging/tools/send-notification.ts +0 -1
  647. package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +0 -27
  648. package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +0 -48
  649. package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +0 -27
  650. package/src/config/bundled-skills/messaging/tools/sequence-update.ts +0 -56
  651. package/src/config/bundled-skills/notion/SKILL.md +0 -240
  652. package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +0 -126
  653. package/src/config/bundled-skills/oauth-setup/SKILL.md +0 -143
  654. package/src/config/bundled-skills/public-ingress/SKILL.md +0 -258
  655. package/src/config/bundled-skills/reminder/SKILL.md +0 -79
  656. package/src/config/bundled-skills/reminder/TOOLS.json +0 -89
  657. package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -12
  658. package/src/config/bundled-skills/restaurant-reservation/SKILL.md +0 -141
  659. package/src/config/bundled-skills/screen-recording/SKILL.md +0 -148
  660. package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -69
  661. package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -78
  662. package/src/config/bundled-skills/slack-app-setup/SKILL.md +0 -178
  663. package/src/config/bundled-skills/slack-digest-setup/SKILL.md +0 -163
  664. package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +0 -157
  665. package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
  666. package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
  667. package/src/config/bundled-skills/telegram-setup/SKILL.md +0 -105
  668. package/src/config/bundled-skills/time-based-actions/SKILL.md +0 -142
  669. package/src/config/bundled-skills/twilio-setup/SKILL.md +0 -232
  670. package/src/config/bundled-skills/twitter/SKILL.md +0 -319
  671. package/src/config/bundled-skills/twitter/icon.svg +0 -14
  672. package/src/config/bundled-skills/typescript-eval/SKILL.md +0 -60
  673. package/src/config/bundled-skills/vercel-token-setup/SKILL.md +0 -214
  674. package/src/config/bundled-skills/voice-setup/SKILL.md +0 -131
  675. package/src/config/bundled-skills/voice-setup/icon.svg +0 -20
  676. package/src/daemon/handlers/pairing.ts +0 -119
  677. package/src/daemon/handlers/session-user-message.ts +0 -961
  678. package/src/daemon/recording-executor.ts +0 -180
  679. package/src/daemon/recording-intent-fallback.ts +0 -162
  680. package/src/daemon/recording-intent.ts +0 -493
  681. package/src/home-base/app-link-store.ts +0 -78
  682. package/src/home-base/bootstrap.ts +0 -74
  683. package/src/home-base/prebuilt/brain-graph.html +0 -1483
  684. package/src/home-base/prebuilt/index.html +0 -702
  685. package/src/home-base/prebuilt/seed-metadata.json +0 -21
  686. package/src/home-base/prebuilt/seed.ts +0 -122
  687. package/src/home-base/prebuilt-home-base-updater.ts +0 -36
  688. package/src/memory/account-store.ts +0 -117
  689. package/src/messaging/activity-analyzer.ts +0 -76
  690. package/src/messaging/email-classifier.ts +0 -208
  691. package/src/messaging/index.ts +0 -2
  692. package/src/messaging/outreach-classifier.ts +0 -185
  693. package/src/messaging/thread-summarizer.ts +0 -346
  694. package/src/messaging/types.ts +0 -17
  695. package/src/tools/browser/x-auto-navigate.ts +0 -254
  696. package/src/tools/credentials/account-registry.ts +0 -144
  697. package/src/tools/filesystem/view-image.ts +0 -244
  698. package/src/tools/reminder/reminder-store.ts +0 -194
  699. package/src/tools/reminder/reminder.ts +0 -158
  700. package/src/tools/system/navigate-settings.ts +0 -74
  701. package/src/tools/system/open-system-settings.ts +0 -85
  702. package/src/tools/system/version.ts +0 -54
  703. package/src/twitter/platform-proxy-client.ts +0 -405
  704. package/src/util/cookie-session.ts +0 -98
  705. /package/src/config/bundled-skills/{messaging → gmail}/tools/scan-result-store.ts +0 -0
  706. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-analytics.ts +0 -0
  707. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-create.ts +0 -0
  708. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-delete.ts +0 -0
  709. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enroll.ts +0 -0
  710. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enrollment-list.ts +0 -0
  711. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-get.ts +0 -0
  712. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-import.ts +0 -0
  713. /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
- }