@vellumai/assistant 0.4.36 → 0.4.40

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 (170) hide show
  1. package/ARCHITECTURE.md +3 -3
  2. package/README.md +13 -13
  3. package/bun.lock +80 -24
  4. package/docs/architecture/integrations.md +126 -128
  5. package/docs/runbook-trusted-contacts.md +1 -1
  6. package/docs/trusted-contact-access.md +12 -12
  7. package/package.json +4 -2
  8. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +0 -14
  9. package/src/__tests__/app-bundler.test.ts +209 -0
  10. package/src/__tests__/app-compiler.test.ts +279 -0
  11. package/src/__tests__/app-executors.test.ts +293 -483
  12. package/src/__tests__/app-migration.test.ts +148 -0
  13. package/src/__tests__/app-routes-csp.test.ts +202 -0
  14. package/src/__tests__/avatar-e2e.test.ts +452 -0
  15. package/src/__tests__/avatar-generator.test.ts +193 -0
  16. package/src/__tests__/avatar-router.test.ts +186 -0
  17. package/src/__tests__/browser-download-timeout.test.ts +28 -0
  18. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +9 -9
  19. package/src/__tests__/call-domain.test.ts +3 -7
  20. package/src/__tests__/credential-security-e2e.test.ts +19 -12
  21. package/src/__tests__/credentials-cli.test.ts +38 -4
  22. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +1 -1
  23. package/src/__tests__/handlers-slack-config.test.ts +0 -72
  24. package/src/__tests__/handlers-telegram-config.test.ts +19 -12
  25. package/src/__tests__/handlers-twitter-config.test.ts +105 -48
  26. package/src/__tests__/inbound-invite-redemption.test.ts +4 -4
  27. package/src/__tests__/integration-status.test.ts +15 -5
  28. package/src/__tests__/integrations-cli.test.ts +1 -1
  29. package/src/__tests__/invite-redemption-service.test.ts +62 -7
  30. package/src/__tests__/ipc-snapshot.test.ts +0 -8
  31. package/src/__tests__/managed-avatar-client.test.ts +280 -0
  32. package/src/__tests__/mcp-cli.test.ts +3 -3
  33. package/src/__tests__/oauth-cli.test.ts +203 -0
  34. package/src/__tests__/relay-server.test.ts +3 -3
  35. package/src/__tests__/secret-onetime-send.test.ts +19 -12
  36. package/src/__tests__/secure-keys.test.ts +78 -0
  37. package/src/__tests__/session-messaging-secret-redirect.test.ts +3 -0
  38. package/src/__tests__/slack-channel-config.test.ts +23 -16
  39. package/src/__tests__/slack-share-routes.test.ts +263 -0
  40. package/src/__tests__/sms-messaging-provider.test.ts +3 -1
  41. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +7 -7
  42. package/src/__tests__/trusted-contact-multichannel.test.ts +3 -3
  43. package/src/__tests__/trusted-contact-verification.test.ts +10 -10
  44. package/src/__tests__/twilio-config.test.ts +15 -36
  45. package/src/__tests__/twilio-provider.test.ts +4 -0
  46. package/src/__tests__/twitter-auth-handler.test.ts +27 -14
  47. package/src/__tests__/twitter-cli-error-shaping.test.ts +1 -1
  48. package/src/__tests__/twitter-cli-routing.test.ts +38 -53
  49. package/src/__tests__/twitter-oauth-client.test.ts +18 -47
  50. package/src/__tests__/voice-invite-redemption.test.ts +27 -3
  51. package/src/amazon/cart.ts +1 -1
  52. package/src/amazon/client.ts +89 -7
  53. package/src/approvals/guardian-request-resolvers.ts +2 -2
  54. package/src/bundler/app-bundler.ts +77 -32
  55. package/src/bundler/app-compiler.ts +195 -0
  56. package/src/bundler/manifest.ts +1 -1
  57. package/src/bundler/package-resolver.ts +185 -0
  58. package/src/calls/call-domain.ts +4 -14
  59. package/src/calls/relay-server.ts +2 -2
  60. package/src/calls/twilio-config.ts +5 -24
  61. package/src/calls/twilio-rest.ts +19 -5
  62. package/src/cli/AGENTS.md +1 -1
  63. package/src/cli/amazon.ts +74 -249
  64. package/src/cli/audit.ts +2 -2
  65. package/src/cli/autonomy.ts +9 -9
  66. package/src/cli/channels.ts +5 -5
  67. package/src/cli/completions.ts +27 -27
  68. package/src/cli/config.ts +14 -14
  69. package/src/cli/contacts.ts +27 -27
  70. package/src/cli/credentials.ts +29 -29
  71. package/src/cli/dev.ts +2 -2
  72. package/src/cli/doctor.ts +2 -2
  73. package/src/cli/email.ts +86 -83
  74. package/src/cli/influencer.ts +13 -13
  75. package/src/cli/integrations.ts +19 -144
  76. package/src/cli/keys.ts +10 -10
  77. package/src/cli/map.ts +4 -4
  78. package/src/cli/mcp.ts +17 -17
  79. package/src/cli/memory.ts +19 -21
  80. package/src/cli/notifications.ts +13 -13
  81. package/src/cli/oauth.ts +77 -0
  82. package/src/cli/program.ts +2 -0
  83. package/src/cli/sequence.ts +27 -27
  84. package/src/cli/sessions.ts +12 -12
  85. package/src/cli/trust.ts +9 -11
  86. package/src/cli/twitter.ts +124 -70
  87. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +1 -1
  88. package/src/config/bundled-skills/agentmail/SKILL.md +34 -34
  89. package/src/config/bundled-skills/amazon/SKILL.md +54 -54
  90. package/src/config/bundled-skills/app-builder/SKILL.md +137 -3
  91. package/src/config/bundled-skills/app-builder/tools/app-create.ts +10 -4
  92. package/src/config/bundled-skills/configure-settings/SKILL.md +18 -18
  93. package/src/config/bundled-skills/contacts/SKILL.md +12 -12
  94. package/src/config/bundled-skills/doordash/lib/client.ts +7 -9
  95. package/src/config/bundled-skills/email-setup/SKILL.md +4 -4
  96. package/src/config/bundled-skills/frontend-design/icon.svg +16 -0
  97. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +143 -162
  98. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +4 -4
  99. package/src/config/bundled-skills/influencer/SKILL.md +13 -13
  100. package/src/config/bundled-skills/mcp-setup/SKILL.md +11 -11
  101. package/src/config/bundled-skills/phone-calls/SKILL.md +48 -54
  102. package/src/config/bundled-skills/public-ingress/SKILL.md +6 -6
  103. package/src/config/bundled-skills/slack-app-setup/SKILL.md +1 -1
  104. package/src/config/bundled-skills/sms-setup/SKILL.md +3 -3
  105. package/src/config/bundled-skills/telegram-setup/SKILL.md +2 -2
  106. package/src/config/bundled-skills/twilio-setup/SKILL.md +136 -225
  107. package/src/config/bundled-skills/twitter/SKILL.md +68 -44
  108. package/src/config/bundled-skills/voice-setup/SKILL.md +2 -2
  109. package/src/config/core-schema.ts +26 -0
  110. package/src/config/env.ts +4 -0
  111. package/src/config/feature-flag-registry.json +9 -1
  112. package/src/config/schema.ts +8 -0
  113. package/src/config/system-prompt.ts +6 -3
  114. package/src/config/templates/BOOTSTRAP.md +7 -5
  115. package/src/contacts/contacts-write.ts +5 -1
  116. package/src/daemon/handlers/apps.ts +31 -4
  117. package/src/daemon/handlers/config-ingress.ts +3 -3
  118. package/src/daemon/handlers/config-integrations.ts +120 -49
  119. package/src/daemon/handlers/config-slack-channel.ts +26 -7
  120. package/src/daemon/handlers/config-slack.ts +1 -54
  121. package/src/daemon/handlers/config-telegram.ts +28 -10
  122. package/src/daemon/handlers/config.ts +1 -4
  123. package/src/daemon/handlers/twitter-auth.ts +11 -4
  124. package/src/daemon/ipc-contract/apps.ts +0 -13
  125. package/src/daemon/ipc-contract-inventory.json +0 -2
  126. package/src/daemon/lifecycle.ts +8 -1
  127. package/src/daemon/session-messaging.ts +2 -2
  128. package/src/daemon/tool-side-effects.ts +30 -0
  129. package/src/email/providers/agentmail.ts +1 -1
  130. package/src/email/providers/index.ts +1 -1
  131. package/src/email/service.ts +1 -1
  132. package/src/gallery/default-gallery.ts +538 -0
  133. package/src/gallery/gallery-manifest.ts +5 -1
  134. package/src/influencer/client.ts +8 -6
  135. package/src/mcp/client.ts +1 -1
  136. package/src/media/avatar-router.ts +99 -0
  137. package/src/media/avatar-types.ts +60 -0
  138. package/src/media/managed-avatar-client.ts +189 -0
  139. package/src/memory/app-migration.ts +114 -0
  140. package/src/memory/app-store.ts +11 -0
  141. package/src/memory/qdrant-client.ts +1 -1
  142. package/src/messaging/providers/slack/client.ts +12 -2
  143. package/src/messaging/providers/sms/adapter.ts +6 -10
  144. package/src/migrations/data-layout.ts +8 -1
  145. package/src/oauth/token-persistence.ts +9 -6
  146. package/src/runtime/assistant-scope.ts +5 -0
  147. package/src/runtime/auth/route-policy.ts +4 -0
  148. package/src/runtime/channel-readiness-service.ts +9 -4
  149. package/src/runtime/gateway-internal-client.ts +11 -3
  150. package/src/runtime/http-server.ts +2 -0
  151. package/src/runtime/invite-redemption-service.ts +23 -13
  152. package/src/runtime/middleware/twilio-validation.ts +2 -2
  153. package/src/runtime/routes/app-routes.ts +131 -3
  154. package/src/runtime/routes/inbound-stages/verification-intercept.ts +3 -3
  155. package/src/runtime/routes/integration-routes.ts +2 -2
  156. package/src/runtime/routes/slack-share-routes.ts +235 -0
  157. package/src/runtime/routes/twilio-routes.ts +47 -34
  158. package/src/schedule/integration-status.ts +2 -3
  159. package/src/security/token-manager.ts +11 -3
  160. package/src/tools/apps/executors.ts +116 -8
  161. package/src/tools/browser/browser-manager.ts +30 -2
  162. package/src/tools/browser/chrome-cdp.ts +31 -3
  163. package/src/tools/credentials/vault.ts +9 -7
  164. package/src/tools/executor.ts +4 -0
  165. package/src/tools/system/avatar-generator.ts +55 -34
  166. package/src/twitter/client.ts +1 -1
  167. package/src/twitter/oauth-client.ts +31 -43
  168. package/src/twitter/router.ts +25 -23
  169. package/src/util/platform.ts +5 -0
  170. package/src/slack/slack-webhook.ts +0 -66
package/src/cli/email.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * CLI command group: `vellum email`
2
+ * CLI command group: `assistant email`
3
3
  *
4
4
  * Provider-agnostic email operations routed through the service facade.
5
5
  * All commands output JSON to stdout. Use --json for machine-readable output.
@@ -86,11 +86,11 @@ enforced at send time. If a guardrail blocks sending, exit code 2 is returned.
86
86
  Exit codes: 0 = success, 1 = error, 2 = guardrail blocked.
87
87
 
88
88
  Examples:
89
- $ vellum email status
90
- $ vellum email draft create --from hello@example.com --to user@test.com --subject "Hello" --body "Hi there"
91
- $ vellum email draft approve-send --draft-id d_abc123 --confirm
92
- $ vellum email guardrails set --daily-cap 50
93
- $ vellum email setup domain --domain example.com`,
89
+ $ assistant email status
90
+ $ assistant email draft create --from hello@example.com --to user@test.com --subject "Hello" --body "Hi there"
91
+ $ assistant email draft approve-send --draft-id d_abc123 --confirm
92
+ $ assistant email guardrails set --daily-cap 50
93
+ $ assistant email setup domain --domain example.com`,
94
94
  );
95
95
 
96
96
  const svc = getEmailService();
@@ -110,8 +110,8 @@ configuration. The active provider determines which backend handles domain
110
110
  setup, inbox creation, DNS records, and message delivery.
111
111
 
112
112
  Examples:
113
- $ vellum email provider get
114
- $ vellum email provider set agentmail`,
113
+ $ assistant email provider get
114
+ $ assistant email provider set agentmail`,
115
115
  );
116
116
 
117
117
  provider
@@ -125,8 +125,8 @@ resend). Use this to confirm which backend is handling email operations
125
125
  before making changes.
126
126
 
127
127
  Examples:
128
- $ vellum email provider get
129
- $ vellum email provider get --json`,
128
+ $ assistant email provider get
129
+ $ assistant email provider get --json`,
130
130
  )
131
131
  .action((_opts: unknown, cmd: Command) => {
132
132
  output({ ok: true, provider: svc.getProviderName() }, getJson(cmd));
@@ -147,7 +147,7 @@ Persists the provider selection to config. All subsequent email commands
147
147
  (setup, inbox, draft, guardrails) will route through the selected provider.
148
148
 
149
149
  Examples:
150
- $ vellum email provider set agentmail`,
150
+ $ assistant email provider set agentmail`,
151
151
  )
152
152
  .action((name: string, _opts: unknown, cmd: Command) => {
153
153
  if (!SUPPORTED_PROVIDERS.includes(name as SupportedProvider)) {
@@ -176,8 +176,8 @@ status, configured inboxes with their addresses, and current guardrail state
176
176
  Use this to verify the email stack is fully configured before sending.
177
177
 
178
178
  Examples:
179
- $ vellum email status
180
- $ vellum email status --json`,
179
+ $ assistant email status
180
+ $ assistant email status --json`,
181
181
  )
182
182
  .action(async (_opts: unknown, cmd: Command) => {
183
183
  await run(cmd, async () => {
@@ -206,9 +206,9 @@ The setup workflow configures the email stack in order:
206
206
  Run each step in sequence. "verify" will fail until DNS records propagate.
207
207
 
208
208
  Examples:
209
- $ vellum email setup domain --domain example.com
210
- $ vellum email setup dns --domain example.com
211
- $ vellum email setup verify --domain example.com`,
209
+ $ assistant email setup domain --domain example.com
210
+ $ assistant email setup dns --domain example.com
211
+ $ assistant email setup verify --domain example.com`,
212
212
  );
213
213
 
214
214
  setup
@@ -226,8 +226,8 @@ Use --dry-run to preview the registration without creating it. This returns
226
226
  the DNS records that would need to be configured without committing changes.
227
227
 
228
228
  Examples:
229
- $ vellum email setup domain --domain example.com
230
- $ vellum email setup domain --domain example.com --dry-run`,
229
+ $ assistant email setup domain --domain example.com
230
+ $ assistant email setup domain --domain example.com --dry-run`,
231
231
  )
232
232
  .action(
233
233
  async (opts: { domain: string; dryRun?: boolean }, cmd: Command) => {
@@ -252,8 +252,8 @@ behalf of your domain and improve deliverability.
252
252
  Add all returned records to your DNS provider before running "setup verify".
253
253
 
254
254
  Examples:
255
- $ vellum email setup dns --domain example.com
256
- $ vellum email setup dns --domain example.com --json`,
255
+ $ assistant email setup dns --domain example.com
256
+ $ assistant email setup dns --domain example.com --json`,
257
257
  )
258
258
  .action(async (opts: { domain: string }, cmd: Command) => {
259
259
  await run(cmd, async () => {
@@ -277,7 +277,7 @@ Run this after adding all records returned by "setup dns". If verification
277
277
  fails, wait for propagation and retry.
278
278
 
279
279
  Examples:
280
- $ vellum email setup verify --domain example.com`,
280
+ $ assistant email setup verify --domain example.com`,
281
281
  )
282
282
  .action(async (opts: { domain: string }, cmd: Command) => {
283
283
  await run(cmd, async () => {
@@ -299,7 +299,7 @@ specified domain. Idempotent — re-running skips already existing inboxes.
299
299
  The domain must be registered and verified before creating inboxes.
300
300
 
301
301
  Examples:
302
- $ vellum email setup inboxes --domain example.com`,
302
+ $ assistant email setup inboxes --domain example.com`,
303
303
  )
304
304
  .action(async (opts: { domain: string }, cmd: Command) => {
305
305
  await run(cmd, async () => {
@@ -324,8 +324,8 @@ secret so you can verify authenticity. If omitted, the provider may generate
324
324
  one automatically (provider-dependent).
325
325
 
326
326
  Examples:
327
- $ vellum email setup webhook --url https://example.com/api/email/inbound
328
- $ vellum email setup webhook --url https://example.com/api/email/inbound --secret whsec_abc123`,
327
+ $ assistant email setup webhook --url https://example.com/api/email/inbound
328
+ $ assistant email setup webhook --url https://example.com/api/email/inbound --secret whsec_abc123`,
329
329
  )
330
330
  .action(async (opts: { url: string; secret?: string }, cmd: Command) => {
331
331
  await run(cmd, async () => {
@@ -347,8 +347,8 @@ configured provider. Each inbox has a username (local part), domain, and
347
347
  optional display name.
348
348
 
349
349
  Examples:
350
- $ vellum email inbox list
351
- $ vellum email inbox create --username sam --domain example.com --display-name "Samwise"`,
350
+ $ assistant email inbox list
351
+ $ assistant email inbox create --username sam --domain example.com --display-name "Samwise"`,
352
352
  );
353
353
 
354
354
  inbox
@@ -370,9 +370,9 @@ The --display-name sets the friendly name shown in the "From" header
370
370
  (e.g. "Samwise <sam@example.com>").
371
371
 
372
372
  Examples:
373
- $ vellum email inbox create --username sam --domain example.com
374
- $ vellum email inbox create --username support --domain example.com --display-name "Support Team"
375
- $ vellum email inbox create --username hello`,
373
+ $ assistant email inbox create --username sam --domain example.com
374
+ $ assistant email inbox create --username support --domain example.com --display-name "Support Team"
375
+ $ assistant email inbox create --username hello`,
376
376
  )
377
377
  .action(
378
378
  async (
@@ -403,8 +403,8 @@ Use this to verify which inboxes are available before creating drafts or
403
403
  configuring inbound webhooks.
404
404
 
405
405
  Examples:
406
- $ vellum email inbox list
407
- $ vellum email inbox list --json`,
406
+ $ assistant email inbox list
407
+ $ assistant email inbox list --json`,
408
408
  )
409
409
  .action(async (_opts: unknown, cmd: Command) => {
410
410
  await run(cmd, async () => {
@@ -431,9 +431,9 @@ Drafts can also be listed, inspected by ID, or deleted. Use "draft list
431
431
  --status pending" to see drafts awaiting approval.
432
432
 
433
433
  Examples:
434
- $ vellum email draft create --from hello@example.com --to user@test.com --subject "Hi" --body "Hello"
435
- $ vellum email draft list --status pending
436
- $ vellum email draft approve-send --draft-id d_abc123 --confirm`,
434
+ $ assistant email draft create --from hello@example.com --to user@test.com --subject "Hi" --body "Hello"
435
+ $ assistant email draft list --status pending
436
+ $ assistant email draft approve-send --draft-id d_abc123 --confirm`,
437
437
  );
438
438
 
439
439
  draft
@@ -462,9 +462,9 @@ Optional fields:
462
462
  --in-reply-to Message ID of the email being replied to (for threading)
463
463
 
464
464
  Examples:
465
- $ vellum email draft create --from hello@example.com --to user@test.com --subject "Hello" --body "Hi there"
466
- $ vellum email draft create --from hello@example.com --to user@test.com --subject "Re: Question" --body "Sure thing" --in-reply-to msg_abc123
467
- $ vellum email draft create --from hello@example.com --to user@test.com --subject "Update" --body "FYI" --cc manager@test.com`,
465
+ $ assistant email draft create --from hello@example.com --to user@test.com --subject "Hello" --body "Hi there"
466
+ $ assistant email draft create --from hello@example.com --to user@test.com --subject "Re: Question" --body "Sure thing" --in-reply-to msg_abc123
467
+ $ assistant email draft create --from hello@example.com --to user@test.com --subject "Update" --body "FYI" --cc manager@test.com`,
468
468
  )
469
469
  .action(
470
470
  async (
@@ -502,13 +502,16 @@ Use --status to narrow results to a specific lifecycle stage:
502
502
  pending — created but not yet approved
503
503
  approved — approved and queued for sending
504
504
  sent — successfully delivered
505
+ rejected — delivery failed by the provider (e.g. bounce or send error)
505
506
 
506
- Note: rejected drafts are permanently deleted and will not appear here.
507
+ Note: drafts rejected via "draft reject" are permanently deleted and will
508
+ not appear here. The "rejected" status only applies to provider-side
509
+ delivery failures.
507
510
 
508
511
  Examples:
509
- $ vellum email draft list
510
- $ vellum email draft list --status pending
511
- $ vellum email draft list --status sent --json`,
512
+ $ assistant email draft list
513
+ $ assistant email draft list --status pending
514
+ $ assistant email draft list --status sent --json`,
512
515
  )
513
516
  .action(async (opts: { status?: string }, cmd: Command) => {
514
517
  await run(cmd, async () => {
@@ -532,9 +535,9 @@ status, and timestamps. Use --inbox to scope the lookup in multi-inbox
532
535
  setups.
533
536
 
534
537
  Examples:
535
- $ vellum email draft get d_abc123
536
- $ vellum email draft get d_abc123 --inbox inbox_456
537
- $ vellum email draft get d_abc123 --json`,
538
+ $ assistant email draft get d_abc123
539
+ $ assistant email draft get d_abc123 --inbox inbox_456
540
+ $ assistant email draft get d_abc123 --json`,
538
541
  )
539
542
  .action(async (draftId: string, opts: { inbox?: string }, cmd: Command) => {
540
543
  await run(cmd, async () => {
@@ -565,8 +568,8 @@ pending state and can be retried after adjusting guardrails.
565
568
  Aliases: "draft send", "draft approve"
566
569
 
567
570
  Examples:
568
- $ vellum email draft approve-send --draft-id d_abc123 --confirm
569
- $ vellum email draft approve-send --draft-id d_abc123 --confirm --json`,
571
+ $ assistant email draft approve-send --draft-id d_abc123 --confirm
572
+ $ assistant email draft approve-send --draft-id d_abc123 --confirm --json`,
570
573
  )
571
574
  .action(
572
575
  async (
@@ -602,9 +605,9 @@ sent. The --reason flag is accepted for logging but the draft itself is
602
605
  removed from the provider and cannot be recovered.
603
606
 
604
607
  Examples:
605
- $ vellum email draft reject --draft-id d_abc123
606
- $ vellum email draft reject --draft-id d_abc123 --reason "Wrong recipient"
607
- $ vellum email draft reject --draft-id d_abc123 --inbox inbox_456`,
608
+ $ assistant email draft reject --draft-id d_abc123
609
+ $ assistant email draft reject --draft-id d_abc123 --reason "Wrong recipient"
610
+ $ assistant email draft reject --draft-id d_abc123 --inbox inbox_456`,
608
611
  )
609
612
  .action(
610
613
  async (
@@ -633,8 +636,8 @@ result in permanent deletion; use "reject" when you want to log a reason
633
636
  for not sending. Use --inbox to scope the deletion in multi-inbox setups.
634
637
 
635
638
  Examples:
636
- $ vellum email draft delete d_abc123
637
- $ vellum email draft delete d_abc123 --inbox inbox_456`,
639
+ $ assistant email draft delete d_abc123
640
+ $ assistant email draft delete d_abc123 --inbox inbox_456`,
638
641
  )
639
642
  .action(async (draftId: string, opts: { inbox?: string }, cmd: Command) => {
640
643
  await run(cmd, async () => {
@@ -658,9 +661,9 @@ Use "inbound list" to browse received messages and "inbound get" to
658
661
  retrieve the full content of a specific message.
659
662
 
660
663
  Examples:
661
- $ vellum email inbound list
662
- $ vellum email inbound list --thread-id thr_abc123
663
- $ vellum email inbound get msg_def456`,
664
+ $ assistant email inbound list
665
+ $ assistant email inbound list --thread-id thr_abc123
666
+ $ assistant email inbound get msg_def456`,
664
667
  );
665
668
 
666
669
  inbound
@@ -676,10 +679,10 @@ thread ID to see only messages belonging to a specific conversation, or
676
679
  by inbox ID to scope to a particular inbox.
677
680
 
678
681
  Examples:
679
- $ vellum email inbound list
680
- $ vellum email inbound list --thread-id thr_abc123
681
- $ vellum email inbound list --inbox inbox_456
682
- $ vellum email inbound list --json`,
682
+ $ assistant email inbound list
683
+ $ assistant email inbound list --thread-id thr_abc123
684
+ $ assistant email inbound list --inbox inbox_456
685
+ $ assistant email inbound list --json`,
683
686
  )
684
687
  .action(
685
688
  async (opts: { threadId?: string; inbox?: string }, cmd: Command) => {
@@ -703,8 +706,8 @@ Returns the full inbound message including sender, recipients, subject,
703
706
  body, headers, and timestamps.
704
707
 
705
708
  Examples:
706
- $ vellum email inbound get msg_abc123
707
- $ vellum email inbound get msg_abc123 --json`,
709
+ $ assistant email inbound get msg_abc123
710
+ $ assistant email inbound get msg_abc123 --json`,
708
711
  )
709
712
  .action(async (messageId: string, _opts: unknown, cmd: Command) => {
710
713
  await run(cmd, async () => {
@@ -728,8 +731,8 @@ Use "thread list" to browse all threads and "thread get" to retrieve
728
731
  the full conversation history for a specific thread.
729
732
 
730
733
  Examples:
731
- $ vellum email thread list
732
- $ vellum email thread get thr_abc123`,
734
+ $ assistant email thread list
735
+ $ assistant email thread get thr_abc123`,
733
736
  );
734
737
 
735
738
  thread
@@ -742,8 +745,8 @@ Lists all email threads. Each thread entry includes its ID, subject,
742
745
  participant addresses, message count, and timestamps.
743
746
 
744
747
  Examples:
745
- $ vellum email thread list
746
- $ vellum email thread list --json`,
748
+ $ assistant email thread list
749
+ $ assistant email thread list --json`,
747
750
  )
748
751
  .action(async (_opts: unknown, cmd: Command) => {
749
752
  await run(cmd, async () => {
@@ -765,8 +768,8 @@ Returns the full thread including all messages (inbound and outbound),
765
768
  participants, subject, and timestamps. Messages are ordered chronologically.
766
769
 
767
770
  Examples:
768
- $ vellum email thread get thr_abc123
769
- $ vellum email thread get thr_abc123 --json`,
771
+ $ assistant email thread get thr_abc123
772
+ $ assistant email thread get thr_abc123 --json`,
770
773
  )
771
774
  .action(async (threadId: string, _opts: unknown, cmd: Command) => {
772
775
  await run(cmd, async () => {
@@ -796,10 +799,10 @@ When a guardrail blocks a send, exit code 2 is returned with the specific
796
799
  guardrail error in the response.
797
800
 
798
801
  Examples:
799
- $ vellum email guardrails get
800
- $ vellum email guardrails set --paused true
801
- $ vellum email guardrails set --daily-cap 100
802
- $ vellum email guardrails block "*@spam.com"`,
802
+ $ assistant email guardrails get
803
+ $ assistant email guardrails set --paused true
804
+ $ assistant email guardrails set --daily-cap 100
805
+ $ assistant email guardrails block "*@spam.com"`,
803
806
  );
804
807
 
805
808
  guardrails
@@ -814,8 +817,8 @@ daily send cap, today's send count, and a summary of address rules.
814
817
  Use this to verify guardrail settings before sending emails.
815
818
 
816
819
  Examples:
817
- $ vellum email guardrails get
818
- $ vellum email guardrails get --json`,
820
+ $ assistant email guardrails get
821
+ $ assistant email guardrails get --json`,
819
822
  )
820
823
  .action((_opts: unknown, cmd: Command) => {
821
824
  output({ ok: true, ...svc.getGuardrails() }, getJson(cmd));
@@ -838,9 +841,9 @@ value unchanged.
838
841
  calendar day. Set to 0 to disable sending entirely.
839
842
 
840
843
  Examples:
841
- $ vellum email guardrails set --paused true
842
- $ vellum email guardrails set --paused false --daily-cap 50
843
- $ vellum email guardrails set --daily-cap 0`,
844
+ $ assistant email guardrails set --paused true
845
+ $ assistant email guardrails set --paused false --daily-cap 50
846
+ $ assistant email guardrails set --daily-cap 0`,
844
847
  )
845
848
  .action((opts: { paused?: string; dailyCap?: string }, cmd: Command) => {
846
849
  const updates: { paused?: boolean; dailyCap?: number } = {};
@@ -874,8 +877,8 @@ pattern will be rejected with exit code 2. Rules are evaluated in order;
874
877
  block rules take precedence over allow rules for the same address.
875
878
 
876
879
  Examples:
877
- $ vellum email guardrails block "*@spam.com"
878
- $ vellum email guardrails block "marketing@*"`,
880
+ $ assistant email guardrails block "*@spam.com"
881
+ $ assistant email guardrails block "marketing@*"`,
879
882
  )
880
883
  .action((pattern: string, _opts: unknown, cmd: Command) => {
881
884
  const rule = svc.addRule("block", pattern);
@@ -897,8 +900,8 @@ address-rule guardrail check during "approve-send". Note that block rules
897
900
  take precedence over allow rules for the same address.
898
901
 
899
902
  Examples:
900
- $ vellum email guardrails allow "*@partner.com"
901
- $ vellum email guardrails allow "vip@example.com"`,
903
+ $ assistant email guardrails allow "*@partner.com"
904
+ $ assistant email guardrails allow "vip@example.com"`,
902
905
  )
903
906
  .action((pattern: string, _opts: unknown, cmd: Command) => {
904
907
  const rule = svc.addRule("allow", pattern);
@@ -917,8 +920,8 @@ entry includes its ID, type (block or allow), and the glob pattern.
917
920
  Use the rule ID with "guardrails unrule" to remove a specific rule.
918
921
 
919
922
  Examples:
920
- $ vellum email guardrails rules
921
- $ vellum email guardrails rules --json`,
923
+ $ assistant email guardrails rules
924
+ $ assistant email guardrails rules --json`,
922
925
  )
923
926
  .action((_opts: unknown, cmd: Command) => {
924
927
  output({ ok: true, rules: svc.listAddressRules() }, getJson(cmd));
@@ -938,8 +941,8 @@ Permanently removes a block or allow rule. The rule takes effect immediately —
938
941
  subsequent "approve-send" calls will no longer be affected by the removed rule.
939
942
 
940
943
  Examples:
941
- $ vellum email guardrails unrule rule_abc123
942
- $ vellum email guardrails rules # list rules to find the ID first`,
944
+ $ assistant email guardrails unrule rule_abc123
945
+ $ assistant email guardrails rules # list rules to find the ID first`,
943
946
  )
944
947
  .action((ruleId: string, _opts: unknown, cmd: Command) => {
945
948
  if (svc.removeRule(ruleId)) {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * CLI command group: `vellum influencer`
2
+ * CLI command group: `assistant influencer`
3
3
  *
4
4
  * Research influencers on Instagram, TikTok, and X/Twitter via the Chrome extension relay.
5
5
  * All commands output JSON to stdout. Use --json for machine-readable output.
@@ -71,9 +71,9 @@ platform (Instagram, TikTok, X/Twitter) in Chrome for the relay to work.
71
71
  Supported platforms: instagram, tiktok, twitter (X).
72
72
 
73
73
  Examples:
74
- $ vellum influencer search "fitness coach" --platforms instagram,tiktok
75
- $ vellum influencer profile natgeo --platform instagram
76
- $ vellum influencer compare instagram:nike twitter:nike tiktok:nike`,
74
+ $ assistant influencer search "fitness coach" --platforms instagram,tiktok
75
+ $ assistant influencer profile natgeo --platform instagram
76
+ $ assistant influencer compare instagram:nike twitter:nike tiktok:nike`,
77
77
  );
78
78
 
79
79
  // =========================================================================
@@ -120,9 +120,9 @@ Plain integers are also accepted (e.g. 50000).
120
120
  --verified restricts results to verified/blue-check accounts only.
121
121
 
122
122
  Examples:
123
- $ vellum influencer search "vegan food" --min-followers 10k --max-followers 1m
124
- $ vellum influencer search "tech reviewer" --platforms tiktok --limit 5 --verified
125
- $ vellum influencer search "streetwear" --platforms instagram,twitter --min-followers 50k`,
123
+ $ assistant influencer search "vegan food" --min-followers 10k --max-followers 1m
124
+ $ assistant influencer search "tech reviewer" --platforms tiktok --limit 5 --verified
125
+ $ assistant influencer search "streetwear" --platforms instagram,twitter --min-followers 50k`,
126
126
  )
127
127
  .action(
128
128
  async (
@@ -196,9 +196,9 @@ Returns detailed profile data including follower count, bio, engagement
196
196
  metrics, and recent post statistics.
197
197
 
198
198
  Examples:
199
- $ vellum influencer profile natgeo --platform instagram
200
- $ vellum influencer profile charlidamelio --platform tiktok
201
- $ vellum influencer profile elonmusk --platform twitter`,
199
+ $ assistant influencer profile natgeo --platform instagram
200
+ $ assistant influencer profile charlidamelio --platform tiktok
201
+ $ assistant influencer profile elonmusk --platform twitter`,
202
202
  )
203
203
  .action(
204
204
  async (username: string, opts: { platform: string }, cmd: Command) => {
@@ -255,9 +255,9 @@ useful for comparing follower counts, engagement rates, and content
255
255
  metrics across platforms or between competing accounts.
256
256
 
257
257
  Examples:
258
- $ vellum influencer compare instagram:nike twitter:nike tiktok:nike
259
- $ vellum influencer compare instagram:natgeo instagram:discoverearth
260
- $ vellum influencer compare tiktok:charlidamelio tiktok:addisonre`,
258
+ $ assistant influencer compare instagram:nike twitter:nike tiktok:nike
259
+ $ assistant influencer compare instagram:natgeo instagram:discoverearth
260
+ $ assistant influencer compare tiktok:charlidamelio tiktok:addisonre`,
261
261
  )
262
262
  .action(async (influencers: string[], _opts: unknown, cmd: Command) => {
263
263
  await run(cmd, async () => {