@vellumai/assistant 0.4.29 → 0.4.31

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 (237) hide show
  1. package/ARCHITECTURE.md +39 -37
  2. package/Dockerfile +14 -8
  3. package/README.md +7 -8
  4. package/docs/architecture/memory.md +28 -29
  5. package/docs/runbook-trusted-contacts.md +76 -43
  6. package/package.json +1 -1
  7. package/scripts/ipc/check-swift-decoder-drift.ts +2 -3
  8. package/scripts/test.sh +1 -1
  9. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +4 -37
  10. package/src/__tests__/actor-token-service.test.ts +4 -3
  11. package/src/__tests__/app-executors.test.ts +7 -17
  12. package/src/__tests__/assistant-feature-flags-integration.test.ts +18 -10
  13. package/src/__tests__/browser-skill-endstate.test.ts +10 -1
  14. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +1 -0
  15. package/src/__tests__/channel-approval-routes.test.ts +44 -44
  16. package/src/__tests__/channel-approval.test.ts +8 -0
  17. package/src/__tests__/channel-approvals.test.ts +39 -1
  18. package/src/__tests__/channel-guardian.test.ts +15 -5
  19. package/src/__tests__/channel-reply-delivery.test.ts +31 -0
  20. package/src/__tests__/config-schema.test.ts +0 -9
  21. package/src/__tests__/conflict-policy.test.ts +76 -0
  22. package/src/__tests__/conflict-store.test.ts +14 -20
  23. package/src/__tests__/contacts-tools.test.ts +8 -61
  24. package/src/__tests__/contradiction-checker.test.ts +5 -1
  25. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +9 -0
  26. package/src/__tests__/gateway-only-guard.test.ts +1 -0
  27. package/src/__tests__/gemini-image-service.test.ts +2 -2
  28. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +5 -3
  29. package/src/__tests__/guardian-grant-minting.test.ts +6 -6
  30. package/src/__tests__/guardian-routing-invariants.test.ts +40 -15
  31. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +4 -6
  32. package/src/__tests__/inbound-invite-redemption.test.ts +1 -1
  33. package/src/__tests__/integrations-cli.test.ts +3 -27
  34. package/src/__tests__/intent-routing.test.ts +3 -0
  35. package/src/__tests__/invite-redemption-service.test.ts +1 -1
  36. package/src/__tests__/{ingress-routes-http.test.ts → invite-routes-http.test.ts} +40 -320
  37. package/src/__tests__/ipc-snapshot.test.ts +4 -31
  38. package/src/__tests__/memory-lifecycle-e2e.test.ts +11 -10
  39. package/src/__tests__/nl-approval-parser.test.ts +305 -0
  40. package/src/__tests__/oauth-provider-profiles.test.ts +34 -0
  41. package/src/__tests__/provider-error-scenarios.test.ts +68 -0
  42. package/src/__tests__/registry.test.ts +0 -10
  43. package/src/__tests__/relay-server.test.ts +1 -1
  44. package/src/__tests__/retry-after-extraction.test.ts +111 -0
  45. package/src/__tests__/script-proxy-profile-template-fallback.test.ts +127 -0
  46. package/src/__tests__/script-proxy-session-runtime.test.ts +6 -1
  47. package/src/__tests__/session-agent-loop.test.ts +0 -2
  48. package/src/__tests__/session-conflict-gate.test.ts +243 -388
  49. package/src/__tests__/session-media-retry.test.ts +147 -0
  50. package/src/__tests__/session-profile-injection.test.ts +0 -2
  51. package/src/__tests__/session-runtime-assembly.test.ts +2 -3
  52. package/src/__tests__/session-skill-tools.test.ts +0 -49
  53. package/src/__tests__/session-workspace-cache-state.test.ts +0 -1
  54. package/src/__tests__/session-workspace-injection.test.ts +0 -1
  55. package/src/__tests__/session-workspace-tool-tracking.test.ts +0 -1
  56. package/src/__tests__/skill-feature-flags-integration.test.ts +9 -5
  57. package/src/__tests__/skill-feature-flags.test.ts +18 -12
  58. package/src/__tests__/skill-load-feature-flag.test.ts +4 -3
  59. package/src/__tests__/slack-block-formatting.test.ts +100 -0
  60. package/src/__tests__/slack-inbound-verification.test.ts +346 -0
  61. package/src/__tests__/slack-reaction-approvals.test.ts +77 -0
  62. package/src/__tests__/slack-skill.test.ts +3 -2
  63. package/src/__tests__/starter-task-flow.test.ts +0 -1
  64. package/src/__tests__/tool-grant-request-escalation.test.ts +2 -1
  65. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +2 -1
  66. package/src/__tests__/trusted-contact-verification.test.ts +3 -1
  67. package/src/__tests__/voice-invite-redemption.test.ts +1 -1
  68. package/src/amazon/client.ts +7 -24
  69. package/src/approvals/guardian-decision-primitive.ts +11 -7
  70. package/src/approvals/guardian-request-resolvers.ts +5 -3
  71. package/src/calls/relay-server.ts +44 -11
  72. package/src/channels/config.ts +1 -1
  73. package/src/cli/integrations.ts +10 -66
  74. package/src/config/bundled-skills/app-builder/SKILL.md +193 -1500
  75. package/src/config/bundled-skills/app-builder/TOOLS.json +70 -18
  76. package/src/config/bundled-skills/browser/TOOLS.json +59 -2
  77. package/src/config/bundled-skills/chatgpt-import/TOOLS.json +4 -0
  78. package/src/config/bundled-skills/computer-use/TOOLS.json +50 -2
  79. package/src/config/bundled-skills/contacts/SKILL.md +49 -53
  80. package/src/config/bundled-skills/contacts/TOOLS.json +26 -22
  81. package/src/config/bundled-skills/contacts/tools/contact-merge.ts +40 -62
  82. package/src/config/bundled-skills/contacts/tools/contact-search.ts +17 -43
  83. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +18 -57
  84. package/src/config/bundled-skills/document/TOOLS.json +8 -0
  85. package/src/config/bundled-skills/email-setup/SKILL.md +10 -7
  86. package/src/config/bundled-skills/followups/TOOLS.json +12 -0
  87. package/src/config/bundled-skills/google-calendar/TOOLS.json +124 -26
  88. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +54 -21
  89. package/src/config/bundled-skills/image-studio/TOOLS.json +12 -2
  90. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +14 -8
  91. package/src/config/bundled-skills/knowledge-graph/TOOLS.json +13 -3
  92. package/src/config/bundled-skills/media-processing/SKILL.md +1 -1
  93. package/src/config/bundled-skills/media-processing/TOOLS.json +28 -0
  94. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +26 -6
  95. package/src/config/bundled-skills/messaging/TOOLS.json +228 -182
  96. package/src/config/bundled-skills/notifications/SKILL.md +3 -2
  97. package/src/config/bundled-skills/notifications/TOOLS.json +7 -13
  98. package/src/config/bundled-skills/phone-calls/TOOLS.json +13 -1
  99. package/src/config/bundled-skills/playbooks/TOOLS.json +16 -0
  100. package/src/config/bundled-skills/reminder/TOOLS.json +15 -2
  101. package/src/config/bundled-skills/schedule/SKILL.md +33 -15
  102. package/src/config/bundled-skills/schedule/TOOLS.json +17 -1
  103. package/src/config/bundled-skills/slack/SKILL.md +30 -1
  104. package/src/config/bundled-skills/slack/TOOLS.json +89 -2
  105. package/src/config/bundled-skills/slack/tools/slack-channel-permissions.ts +146 -0
  106. package/src/config/bundled-skills/slack/tools/slack-scan-digest.ts +120 -0
  107. package/src/config/bundled-skills/slack-app-setup/SKILL.md +200 -0
  108. package/src/config/bundled-skills/subagent/TOOLS.json +22 -2
  109. package/src/config/bundled-skills/tasks/TOOLS.json +86 -14
  110. package/src/config/bundled-skills/transcribe/TOOLS.json +4 -0
  111. package/src/config/bundled-skills/watcher/TOOLS.json +20 -0
  112. package/src/config/bundled-tool-registry.ts +2 -5
  113. package/src/config/channel-permission-profiles.ts +155 -0
  114. package/src/config/env.ts +4 -1
  115. package/src/config/memory-schema.ts +0 -10
  116. package/src/config/system-prompt.ts +6 -0
  117. package/src/contacts/contact-store.ts +221 -56
  118. package/src/contacts/contacts-write.ts +14 -3
  119. package/src/contacts/types.ts +35 -4
  120. package/src/daemon/assistant-attachments.ts +23 -3
  121. package/src/daemon/guardian-verification-intent.ts +7 -4
  122. package/src/daemon/handlers/apps.ts +1 -2
  123. package/src/daemon/handlers/config-heartbeat.ts +1 -2
  124. package/src/daemon/handlers/config-inbox.ts +16 -134
  125. package/src/daemon/handlers/contacts.ts +2 -2
  126. package/src/daemon/handlers/guardian-actions.ts +21 -88
  127. package/src/daemon/handlers/sessions.ts +2 -2
  128. package/src/daemon/ipc-contract/apps.ts +0 -1
  129. package/src/daemon/ipc-contract/contacts.ts +2 -2
  130. package/src/daemon/ipc-contract/inbox.ts +7 -66
  131. package/src/daemon/ipc-contract/sessions.ts +1 -0
  132. package/src/daemon/ipc-contract/surfaces.ts +0 -1
  133. package/src/daemon/ipc-contract-inventory.json +2 -4
  134. package/src/daemon/lifecycle.ts +14 -2
  135. package/src/daemon/session-agent-loop-handlers.ts +9 -0
  136. package/src/daemon/session-agent-loop.ts +2 -45
  137. package/src/daemon/session-attachments.ts +5 -1
  138. package/src/daemon/session-conflict-gate.ts +21 -82
  139. package/src/daemon/session-error.ts +18 -0
  140. package/src/daemon/session-lifecycle.ts +4 -5
  141. package/src/daemon/session-media-retry.ts +15 -1
  142. package/src/daemon/session-memory.ts +7 -52
  143. package/src/daemon/session-process.ts +3 -1
  144. package/src/daemon/session-runtime-assembly.ts +18 -35
  145. package/src/daemon/session-surfaces.ts +0 -1
  146. package/src/daemon/session-tool-setup.ts +7 -4
  147. package/src/events/domain-events.ts +2 -1
  148. package/src/heartbeat/heartbeat-service.ts +5 -1
  149. package/src/home-base/prebuilt/seed.ts +0 -1
  150. package/src/influencer/client.ts +7 -24
  151. package/src/media/gemini-image-service.ts +48 -3
  152. package/src/memory/app-store.ts +0 -4
  153. package/src/memory/conflict-intent.ts +3 -6
  154. package/src/memory/conflict-policy.ts +34 -0
  155. package/src/memory/conflict-store.ts +10 -18
  156. package/src/memory/contradiction-checker.ts +2 -2
  157. package/src/memory/conversation-attention-store.ts +3 -1
  158. package/src/memory/db-init.ts +8 -0
  159. package/src/memory/job-handlers/conflict.ts +0 -7
  160. package/src/memory/migrations/133-assistant-contact-metadata.ts +21 -0
  161. package/src/memory/migrations/134-contacts-notes-column.ts +51 -0
  162. package/src/memory/migrations/135-backfill-contact-interaction-stats.ts +31 -0
  163. package/src/memory/migrations/index.ts +3 -0
  164. package/src/memory/schema.ts +12 -17
  165. package/src/memory/slack-thread-store.ts +187 -0
  166. package/src/messaging/index.ts +0 -1
  167. package/src/messaging/providers/slack/client.ts +84 -26
  168. package/src/messaging/providers/slack/types.ts +4 -0
  169. package/src/messaging/types.ts +0 -38
  170. package/src/notifications/adapters/slack.ts +90 -0
  171. package/src/notifications/destination-resolver.ts +42 -1
  172. package/src/notifications/emit-signal.ts +17 -1
  173. package/src/oauth/provider-profiles.ts +22 -0
  174. package/src/providers/anthropic/client.ts +3 -0
  175. package/src/providers/openai/client.ts +3 -0
  176. package/src/providers/retry.ts +9 -1
  177. package/src/runtime/actor-trust-resolver.ts +8 -0
  178. package/src/runtime/auth/require-bound-guardian.ts +44 -0
  179. package/src/runtime/auth/route-policy.ts +4 -8
  180. package/src/runtime/channel-approval-types.ts +18 -0
  181. package/src/runtime/channel-approvals.ts +8 -0
  182. package/src/runtime/channel-invite-transport.ts +1 -1
  183. package/src/runtime/channel-reply-delivery.ts +62 -3
  184. package/src/runtime/gateway-client.ts +36 -2
  185. package/src/runtime/gateway-internal-client.ts +86 -0
  186. package/src/runtime/guardian-action-service.ts +128 -0
  187. package/src/runtime/guardian-outbound-actions.ts +3 -3
  188. package/src/runtime/guardian-reply-router.ts +4 -4
  189. package/src/runtime/guardian-verification-templates.ts +16 -1
  190. package/src/runtime/http-server.ts +29 -46
  191. package/src/runtime/invite-redemption-service.ts +1 -1
  192. package/src/runtime/{ingress-service.ts → invite-service.ts} +5 -157
  193. package/src/runtime/nl-approval-parser.ts +138 -0
  194. package/src/runtime/routes/approval-routes.ts +1 -40
  195. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +6 -3
  196. package/src/runtime/routes/channel-route-shared.ts +35 -1
  197. package/src/runtime/routes/contact-routes.ts +494 -47
  198. package/src/runtime/routes/conversation-routes.ts +2 -1
  199. package/src/runtime/routes/global-search-routes.ts +2 -2
  200. package/src/runtime/routes/guardian-action-routes.ts +19 -111
  201. package/src/runtime/routes/guardian-approval-interception.ts +78 -1
  202. package/src/runtime/routes/guardian-bootstrap-routes.ts +6 -1
  203. package/src/runtime/routes/inbound-message-handler.ts +40 -12
  204. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +227 -1
  205. package/src/runtime/routes/inbound-stages/background-dispatch.ts +108 -0
  206. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +2 -1
  207. package/src/runtime/routes/{ingress-routes.ts → invite-routes.ts} +10 -110
  208. package/src/runtime/routes/migration-routes.ts +17 -17
  209. package/src/runtime/slack-block-formatting.ts +176 -0
  210. package/src/schedule/scheduler.ts +11 -2
  211. package/src/tools/apps/executors.ts +16 -15
  212. package/src/tools/calls/call-end.ts +1 -1
  213. package/src/tools/computer-use/definitions.ts +16 -0
  214. package/src/tools/credentials/vault.ts +86 -2
  215. package/src/tools/network/script-proxy/session-manager.ts +28 -3
  216. package/src/tools/permission-checker.ts +18 -0
  217. package/src/tools/terminal/shell.ts +15 -5
  218. package/src/tools/tool-approval-handler.ts +48 -4
  219. package/src/tools/types.ts +38 -1
  220. package/src/util/errors.ts +5 -1
  221. package/src/util/retry.ts +21 -0
  222. package/src/watcher/providers/slack.ts +33 -3
  223. package/src/workspace/git-service.ts +6 -4
  224. package/src/__tests__/get-weather.test.ts +0 -393
  225. package/src/__tests__/weather-skill-regression.test.ts +0 -276
  226. package/src/autonomy/autonomy-resolver.ts +0 -62
  227. package/src/autonomy/autonomy-store.ts +0 -138
  228. package/src/autonomy/disposition-mapper.ts +0 -31
  229. package/src/autonomy/index.ts +0 -11
  230. package/src/autonomy/types.ts +0 -43
  231. package/src/config/bundled-skills/weather/SKILL.md +0 -38
  232. package/src/config/bundled-skills/weather/TOOLS.json +0 -32
  233. package/src/config/bundled-skills/weather/icon.svg +0 -24
  234. package/src/config/bundled-skills/weather/tools/get-weather.ts +0 -12
  235. package/src/messaging/triage-engine.ts +0 -344
  236. package/src/tools/weather/service.ts +0 -712
  237. /package/src/memory/{ingress-invite-store.ts → invite-store.ts} +0 -0
@@ -20,12 +20,13 @@ import {
20
20
  import {
21
21
  createGuardianBinding,
22
22
  revokeGuardianBinding,
23
+ touchContactInteraction,
23
24
  upsertMember,
24
25
  } from "../contacts/contacts-write.js";
25
26
  import { getAssistantName } from "../daemon/identity-helpers.js";
26
27
  import { getCanonicalGuardianRequest } from "../memory/canonical-guardian-store.js";
27
28
  import * as conversationStore from "../memory/conversation-store.js";
28
- import { findActiveVoiceInvites } from "../memory/ingress-invite-store.js";
29
+ import { findActiveVoiceInvites } from "../memory/invite-store.js";
29
30
  import { revokeScopedApprovalGrantsForContext } from "../memory/scoped-approval-grants.js";
30
31
  import { emitNotificationSignal } from "../notifications/emit-signal.js";
31
32
  import { notifyGuardianOfAccessRequest } from "../runtime/access-request-helper.js";
@@ -43,7 +44,7 @@ import {
43
44
  composeVerificationVoice,
44
45
  GUARDIAN_VERIFY_TEMPLATE_KEYS,
45
46
  } from "../runtime/guardian-verification-templates.js";
46
- import { redeemVoiceInviteCode } from "../runtime/ingress-service.js";
47
+ import { redeemVoiceInviteCode } from "../runtime/invite-service.js";
47
48
  import { parseJsonSafe } from "../util/json.js";
48
49
  import { getLogger } from "../util/logger.js";
49
50
  import {
@@ -874,6 +875,10 @@ export class RelayConnection {
874
875
  }
875
876
 
876
877
  // Guardian and trusted-contact callers proceed normally.
878
+ if (actorTrust.memberRecord) {
879
+ touchContactInteraction(actorTrust.memberRecord.contact.id);
880
+ }
881
+
877
882
  // Update the controller's guardian context with the trust-resolved
878
883
  // context so downstream policy gates have accurate actor metadata.
879
884
  if (this.controller && actorTrust.trustClass !== "unknown") {
@@ -1213,15 +1218,43 @@ export class RelayConnection {
1213
1218
 
1214
1219
  // Create the guardian binding now that verification succeeded.
1215
1220
  if (result.verificationType === "guardian") {
1216
- revokeGuardianBinding(this.guardianChallengeAssistantId, "voice");
1217
- createGuardianBinding({
1218
- assistantId: this.guardianChallengeAssistantId,
1219
- channel: "voice",
1220
- guardianExternalUserId: this.guardianVerificationFromNumber,
1221
- guardianDeliveryChatId: this.guardianVerificationFromNumber,
1222
- guardianPrincipalId: this.guardianVerificationFromNumber,
1223
- verifiedVia: "challenge",
1224
- });
1221
+ const existingBinding = getGuardianBinding(
1222
+ this.guardianChallengeAssistantId,
1223
+ "voice",
1224
+ );
1225
+ if (
1226
+ existingBinding &&
1227
+ existingBinding.guardianExternalUserId !==
1228
+ this.guardianVerificationFromNumber
1229
+ ) {
1230
+ log.warn(
1231
+ {
1232
+ callSessionId: this.callSessionId,
1233
+ existingGuardian: existingBinding.guardianExternalUserId,
1234
+ },
1235
+ "Guardian binding conflict: another user already holds the voice binding",
1236
+ );
1237
+ } else {
1238
+ revokeGuardianBinding(this.guardianChallengeAssistantId, "voice");
1239
+
1240
+ // Unify all channel bindings onto the canonical (vellum) principal
1241
+ const vellumBinding = getGuardianBinding(
1242
+ this.guardianChallengeAssistantId,
1243
+ "vellum",
1244
+ );
1245
+ const canonicalPrincipal =
1246
+ vellumBinding?.guardianPrincipalId ??
1247
+ this.guardianVerificationFromNumber;
1248
+
1249
+ createGuardianBinding({
1250
+ assistantId: this.guardianChallengeAssistantId,
1251
+ channel: "voice",
1252
+ guardianExternalUserId: this.guardianVerificationFromNumber,
1253
+ guardianDeliveryChatId: this.guardianVerificationFromNumber,
1254
+ guardianPrincipalId: canonicalPrincipal,
1255
+ verifiedVia: "challenge",
1256
+ });
1257
+ }
1225
1258
  }
1226
1259
 
1227
1260
  if (isOutbound) {
@@ -47,7 +47,7 @@ const CHANNEL_POLICIES = {
47
47
  },
48
48
  slack: {
49
49
  notification: {
50
- deliveryEnabled: false,
50
+ deliveryEnabled: true,
51
51
  conversationStrategy: "continue_existing_conversation",
52
52
  },
53
53
  },
@@ -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