@vellumai/assistant 0.4.29 → 0.4.30

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 (174) hide show
  1. package/ARCHITECTURE.md +39 -37
  2. package/README.md +5 -6
  3. package/docs/runbook-trusted-contacts.md +79 -43
  4. package/package.json +1 -1
  5. package/scripts/ipc/check-swift-decoder-drift.ts +2 -3
  6. package/scripts/test.sh +1 -1
  7. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +4 -37
  8. package/src/__tests__/actor-token-service.test.ts +4 -3
  9. package/src/__tests__/app-executors.test.ts +7 -17
  10. package/src/__tests__/assistant-feature-flags-integration.test.ts +18 -10
  11. package/src/__tests__/browser-skill-endstate.test.ts +10 -1
  12. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +1 -0
  13. package/src/__tests__/channel-approval-routes.test.ts +44 -44
  14. package/src/__tests__/channel-approval.test.ts +8 -0
  15. package/src/__tests__/channel-approvals.test.ts +39 -1
  16. package/src/__tests__/channel-guardian.test.ts +15 -5
  17. package/src/__tests__/channel-reply-delivery.test.ts +31 -0
  18. package/src/__tests__/commit-message-enrichment-service.test.ts +4 -0
  19. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +9 -0
  20. package/src/__tests__/gateway-only-guard.test.ts +1 -0
  21. package/src/__tests__/gemini-image-service.test.ts +2 -2
  22. package/src/__tests__/guardian-grant-minting.test.ts +6 -6
  23. package/src/__tests__/guardian-routing-invariants.test.ts +34 -11
  24. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +4 -6
  25. package/src/__tests__/inbound-invite-redemption.test.ts +1 -1
  26. package/src/__tests__/integrations-cli.test.ts +3 -27
  27. package/src/__tests__/intent-routing.test.ts +3 -0
  28. package/src/__tests__/invite-redemption-service.test.ts +1 -1
  29. package/src/__tests__/{ingress-routes-http.test.ts → invite-routes-http.test.ts} +40 -320
  30. package/src/__tests__/ipc-snapshot.test.ts +4 -31
  31. package/src/__tests__/nl-approval-parser.test.ts +305 -0
  32. package/src/__tests__/oauth-provider-profiles.test.ts +34 -0
  33. package/src/__tests__/provider-error-scenarios.test.ts +68 -0
  34. package/src/__tests__/relay-server.test.ts +1 -1
  35. package/src/__tests__/retry-after-extraction.test.ts +111 -0
  36. package/src/__tests__/script-proxy-profile-template-fallback.test.ts +127 -0
  37. package/src/__tests__/session-media-retry.test.ts +147 -0
  38. package/src/__tests__/skill-feature-flags-integration.test.ts +9 -5
  39. package/src/__tests__/skill-feature-flags.test.ts +18 -12
  40. package/src/__tests__/skill-load-feature-flag.test.ts +4 -3
  41. package/src/__tests__/slack-block-formatting.test.ts +100 -0
  42. package/src/__tests__/slack-inbound-verification.test.ts +346 -0
  43. package/src/__tests__/slack-reaction-approvals.test.ts +77 -0
  44. package/src/__tests__/slack-skill.test.ts +3 -2
  45. package/src/__tests__/starter-task-flow.test.ts +0 -1
  46. package/src/__tests__/trusted-contact-verification.test.ts +3 -1
  47. package/src/__tests__/voice-invite-redemption.test.ts +1 -1
  48. package/src/amazon/client.ts +7 -24
  49. package/src/calls/relay-server.ts +39 -11
  50. package/src/channels/config.ts +1 -1
  51. package/src/cli/integrations.ts +10 -66
  52. package/src/config/bundled-skills/app-builder/SKILL.md +193 -1500
  53. package/src/config/bundled-skills/app-builder/TOOLS.json +70 -18
  54. package/src/config/bundled-skills/browser/TOOLS.json +59 -2
  55. package/src/config/bundled-skills/chatgpt-import/TOOLS.json +4 -0
  56. package/src/config/bundled-skills/computer-use/TOOLS.json +50 -2
  57. package/src/config/bundled-skills/contacts/SKILL.md +42 -35
  58. package/src/config/bundled-skills/contacts/TOOLS.json +22 -2
  59. package/src/config/bundled-skills/contacts/tools/contact-merge.ts +38 -58
  60. package/src/config/bundled-skills/contacts/tools/contact-search.ts +11 -31
  61. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +19 -37
  62. package/src/config/bundled-skills/document/TOOLS.json +8 -0
  63. package/src/config/bundled-skills/email-setup/SKILL.md +10 -7
  64. package/src/config/bundled-skills/followups/TOOLS.json +12 -0
  65. package/src/config/bundled-skills/google-calendar/TOOLS.json +124 -26
  66. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +54 -21
  67. package/src/config/bundled-skills/image-studio/TOOLS.json +12 -2
  68. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +14 -8
  69. package/src/config/bundled-skills/knowledge-graph/TOOLS.json +13 -3
  70. package/src/config/bundled-skills/media-processing/SKILL.md +1 -1
  71. package/src/config/bundled-skills/media-processing/TOOLS.json +28 -0
  72. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +26 -6
  73. package/src/config/bundled-skills/messaging/TOOLS.json +228 -182
  74. package/src/config/bundled-skills/notifications/SKILL.md +3 -2
  75. package/src/config/bundled-skills/notifications/TOOLS.json +7 -13
  76. package/src/config/bundled-skills/phone-calls/TOOLS.json +13 -1
  77. package/src/config/bundled-skills/playbooks/TOOLS.json +16 -0
  78. package/src/config/bundled-skills/reminder/TOOLS.json +15 -2
  79. package/src/config/bundled-skills/schedule/SKILL.md +33 -15
  80. package/src/config/bundled-skills/schedule/TOOLS.json +17 -1
  81. package/src/config/bundled-skills/slack/SKILL.md +30 -1
  82. package/src/config/bundled-skills/slack/TOOLS.json +89 -2
  83. package/src/config/bundled-skills/slack/tools/slack-channel-permissions.ts +146 -0
  84. package/src/config/bundled-skills/slack/tools/slack-scan-digest.ts +120 -0
  85. package/src/config/bundled-skills/slack-app-setup/SKILL.md +200 -0
  86. package/src/config/bundled-skills/subagent/TOOLS.json +22 -2
  87. package/src/config/bundled-skills/tasks/TOOLS.json +86 -14
  88. package/src/config/bundled-skills/transcribe/TOOLS.json +4 -0
  89. package/src/config/bundled-skills/watcher/TOOLS.json +20 -0
  90. package/src/config/bundled-skills/weather/TOOLS.json +4 -0
  91. package/src/config/bundled-tool-registry.ts +2 -0
  92. package/src/config/channel-permission-profiles.ts +155 -0
  93. package/src/config/env.ts +4 -1
  94. package/src/contacts/contact-store.ts +195 -4
  95. package/src/contacts/types.ts +26 -0
  96. package/src/daemon/assistant-attachments.ts +23 -3
  97. package/src/daemon/guardian-verification-intent.ts +7 -4
  98. package/src/daemon/handlers/apps.ts +1 -2
  99. package/src/daemon/handlers/config-inbox.ts +16 -134
  100. package/src/daemon/handlers/guardian-actions.ts +20 -87
  101. package/src/daemon/handlers/sessions.ts +0 -1
  102. package/src/daemon/ipc-contract/apps.ts +0 -1
  103. package/src/daemon/ipc-contract/inbox.ts +7 -66
  104. package/src/daemon/ipc-contract/sessions.ts +1 -0
  105. package/src/daemon/ipc-contract/surfaces.ts +0 -1
  106. package/src/daemon/ipc-contract-inventory.json +2 -4
  107. package/src/daemon/lifecycle.ts +14 -2
  108. package/src/daemon/session-agent-loop-handlers.ts +9 -0
  109. package/src/daemon/session-agent-loop.ts +1 -0
  110. package/src/daemon/session-attachments.ts +5 -1
  111. package/src/daemon/session-error.ts +18 -0
  112. package/src/daemon/session-lifecycle.ts +4 -5
  113. package/src/daemon/session-media-retry.ts +15 -1
  114. package/src/daemon/session-surfaces.ts +0 -1
  115. package/src/daemon/session-tool-setup.ts +7 -4
  116. package/src/events/domain-events.ts +2 -1
  117. package/src/home-base/prebuilt/seed.ts +0 -1
  118. package/src/influencer/client.ts +7 -24
  119. package/src/media/gemini-image-service.ts +48 -3
  120. package/src/memory/app-store.ts +0 -4
  121. package/src/memory/conversation-attention-store.ts +3 -1
  122. package/src/memory/db-init.ts +4 -0
  123. package/src/memory/migrations/133-assistant-contact-metadata.ts +21 -0
  124. package/src/memory/migrations/index.ts +1 -0
  125. package/src/memory/schema.ts +12 -0
  126. package/src/memory/slack-thread-store.ts +187 -0
  127. package/src/messaging/providers/slack/client.ts +84 -26
  128. package/src/messaging/providers/slack/types.ts +4 -0
  129. package/src/notifications/adapters/slack.ts +90 -0
  130. package/src/notifications/destination-resolver.ts +42 -1
  131. package/src/notifications/emit-signal.ts +17 -1
  132. package/src/oauth/provider-profiles.ts +22 -0
  133. package/src/providers/anthropic/client.ts +3 -0
  134. package/src/providers/openai/client.ts +3 -0
  135. package/src/providers/retry.ts +9 -1
  136. package/src/runtime/actor-trust-resolver.ts +8 -0
  137. package/src/runtime/auth/require-bound-guardian.ts +44 -0
  138. package/src/runtime/auth/route-policy.ts +4 -8
  139. package/src/runtime/channel-approval-types.ts +18 -0
  140. package/src/runtime/channel-approvals.ts +8 -0
  141. package/src/runtime/channel-invite-transport.ts +1 -1
  142. package/src/runtime/channel-reply-delivery.ts +62 -3
  143. package/src/runtime/gateway-client.ts +36 -2
  144. package/src/runtime/gateway-internal-client.ts +86 -0
  145. package/src/runtime/guardian-action-service.ts +127 -0
  146. package/src/runtime/guardian-verification-templates.ts +16 -1
  147. package/src/runtime/http-server.ts +20 -49
  148. package/src/runtime/invite-redemption-service.ts +1 -1
  149. package/src/runtime/{ingress-service.ts → invite-service.ts} +5 -157
  150. package/src/runtime/nl-approval-parser.ts +138 -0
  151. package/src/runtime/routes/approval-routes.ts +1 -40
  152. package/src/runtime/routes/channel-route-shared.ts +35 -1
  153. package/src/runtime/routes/contact-routes.ts +196 -28
  154. package/src/runtime/routes/guardian-action-routes.ts +19 -111
  155. package/src/runtime/routes/guardian-approval-interception.ts +76 -0
  156. package/src/runtime/routes/inbound-message-handler.ts +40 -12
  157. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +222 -0
  158. package/src/runtime/routes/inbound-stages/background-dispatch.ts +108 -0
  159. package/src/runtime/routes/{ingress-routes.ts → invite-routes.ts} +10 -110
  160. package/src/runtime/slack-block-formatting.ts +176 -0
  161. package/src/schedule/scheduler.ts +11 -2
  162. package/src/tools/apps/executors.ts +16 -15
  163. package/src/tools/calls/call-end.ts +1 -1
  164. package/src/tools/computer-use/definitions.ts +16 -0
  165. package/src/tools/credentials/vault.ts +86 -2
  166. package/src/tools/network/script-proxy/session-manager.ts +28 -3
  167. package/src/tools/permission-checker.ts +18 -0
  168. package/src/tools/terminal/shell.ts +15 -5
  169. package/src/tools/tool-approval-handler.ts +48 -4
  170. package/src/tools/types.ts +38 -1
  171. package/src/util/errors.ts +5 -1
  172. package/src/util/retry.ts +21 -0
  173. package/src/watcher/providers/slack.ts +33 -3
  174. /package/src/memory/{ingress-invite-store.ts → invite-store.ts} +0 -0
@@ -58,14 +58,6 @@ function toQueryString(params: Record<string, string | undefined>): string {
58
58
  return encoded ? `?${encoded}` : "";
59
59
  }
60
60
 
61
- function resolveGatewayBaseUrl(): string {
62
- const injectedGatewayBase = process.env.INTERNAL_GATEWAY_BASE_URL?.trim();
63
- if (injectedGatewayBase && injectedGatewayBase.length > 0) {
64
- return injectedGatewayBase.replace(/\/+$/, "");
65
- }
66
- return getGatewayInternalBaseUrl();
67
- }
68
-
69
61
  function readIngressConfig(): {
70
62
  success: true;
71
63
  enabled: boolean;
@@ -86,7 +78,7 @@ function readIngressConfig(): {
86
78
  success: true,
87
79
  enabled,
88
80
  publicBaseUrl: configuredUrl || undefined,
89
- localGatewayTarget: resolveGatewayBaseUrl(),
81
+ localGatewayTarget: getGatewayInternalBaseUrl(),
90
82
  };
91
83
  }
92
84
 
@@ -112,8 +104,11 @@ function readVoiceConfig(): {
112
104
  };
113
105
  }
114
106
 
107
+ // CLI-specific gateway helper — uses GATEWAY_AUTH_TOKEN env var for out-of-process
108
+ // access. See runtime/gateway-internal-client.ts for daemon-internal usage which
109
+ // mints fresh tokens.
115
110
  async function gatewayGet(path: string): Promise<unknown> {
116
- const gatewayBase = resolveGatewayBaseUrl();
111
+ const gatewayBase = getGatewayInternalBaseUrl();
117
112
  const token = getGatewayToken();
118
113
 
119
114
  const response = await fetch(`${gatewayBase}${path}`, {
@@ -169,7 +164,7 @@ export function registerContactsCommand(program: Command): void {
169
164
  contacts
170
165
  .command("list")
171
166
  .description("List contacts (calls /v1/contacts)")
172
- .option("--role <role>", "Filter by role")
167
+ .option("--role <role>", "Filter by role (default: contact)", "contact")
173
168
  .option("--limit <limit>", "Maximum number of contacts to return")
174
169
  .option("--query <query>", "Search query to filter contacts")
175
170
  .action(
@@ -192,7 +187,7 @@ export function registerContactsCommand(program: Command): void {
192
187
 
193
188
  contacts
194
189
  .command("invites")
195
- .description("List ingress invites (calls /v1/ingress/invites)")
190
+ .description("List contact invites")
196
191
  .option("--source-channel <sourceChannel>", "Filter by source channel")
197
192
  .option("--status <status>", "Filter by invite status")
198
193
  .action(
@@ -205,7 +200,7 @@ export function registerContactsCommand(program: Command): void {
205
200
  status: opts.status,
206
201
  });
207
202
  await runRead(cmd, async () =>
208
- gatewayGet(`/v1/ingress/invites${query}`),
203
+ gatewayGet(`/v1/contacts/invites${query}`),
209
204
  );
210
205
  },
211
206
  );
@@ -237,9 +232,9 @@ export function registerIntegrationsCommand(program: Command): void {
237
232
  guardian
238
233
  .command("status")
239
234
  .description("Get guardian status for a channel")
240
- .option("--channel <channel>", "Channel: telegram|voice|sms", "voice")
235
+ .option("--channel <channel>", "Channel: telegram|voice|sms", "telegram")
241
236
  .action(async (opts: { channel?: GuardianChannel }, cmd: Command) => {
242
- const channel = opts.channel ?? "voice";
237
+ const channel = opts.channel ?? "telegram";
243
238
  await runRead(cmd, async () =>
244
239
  gatewayGet(
245
240
  `/v1/integrations/guardian/status${toQueryString({ channel })}`,
@@ -300,57 +295,6 @@ export function registerIntegrationsCommand(program: Command): void {
300
295
  await runRead(cmd, async () => readIngressConfig());
301
296
  });
302
297
 
303
- ingress
304
- .command("members")
305
- .description(
306
- "[Deprecated: use 'vellum contacts list'] List trusted contacts",
307
- )
308
- .option("--limit <limit>", "Maximum number of contacts to return")
309
- .option("--role <role>", "Filter by role (default: contact)")
310
- .action(
311
- async (
312
- opts: {
313
- limit?: string;
314
- role?: string;
315
- },
316
- cmd: Command,
317
- ) => {
318
- process.stderr.write(
319
- "⚠️ 'vellum integrations ingress members' is deprecated. Use 'vellum contacts list' instead.\n",
320
- );
321
- const query = toQueryString({
322
- role: opts.role ?? "contact",
323
- limit: opts.limit,
324
- });
325
- await runRead(cmd, async () => gatewayGet(`/v1/contacts${query}`));
326
- },
327
- );
328
-
329
- ingress
330
- .command("invites")
331
- .description(
332
- "[Deprecated: use 'vellum contacts invites'] List trusted ingress invites",
333
- )
334
- .option("--source-channel <sourceChannel>", "Filter by source channel")
335
- .option("--status <status>", "Filter by invite status")
336
- .action(
337
- async (
338
- opts: { sourceChannel?: IngressChannel; status?: string },
339
- cmd: Command,
340
- ) => {
341
- process.stderr.write(
342
- "⚠️ 'vellum integrations ingress invites' is deprecated. Use 'vellum contacts invites' instead.\n",
343
- );
344
- const query = toQueryString({
345
- sourceChannel: opts.sourceChannel,
346
- status: opts.status,
347
- });
348
- await runRead(cmd, async () =>
349
- gatewayGet(`/v1/ingress/invites${query}`),
350
- );
351
- },
352
- );
353
-
354
298
  const voice = integrations.command("voice").description("Voice setup status");
355
299
 
356
300
  voice