@vellumai/assistant 0.5.11 → 0.5.13
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.
- package/Dockerfile +42 -9
- package/docs/architecture/integrations.md +34 -32
- package/node_modules/@vellumai/ces-contracts/src/__tests__/grants.test.ts +7 -7
- package/node_modules/@vellumai/ces-contracts/src/handles.ts +5 -4
- package/node_modules/@vellumai/ces-contracts/src/index.ts +7 -0
- package/node_modules/@vellumai/ces-contracts/src/rpc.ts +5 -0
- package/node_modules/@vellumai/credential-storage/src/index.ts +1 -1
- package/openapi.yaml +87 -9
- package/package.json +1 -1
- package/src/__tests__/catalog-cache.test.ts +164 -0
- package/src/__tests__/catalog-search.test.ts +61 -0
- package/src/__tests__/cli-command-risk-guard.test.ts +181 -6
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +396 -0
- package/src/__tests__/conversation-error.test.ts +3 -2
- package/src/__tests__/credential-security-invariants.test.ts +9 -15
- package/src/__tests__/credential-vault-unit.test.ts +32 -34
- package/src/__tests__/credential-vault.test.ts +25 -33
- package/src/__tests__/credentials-cli.test.ts +3 -3
- package/src/__tests__/daemon-credential-client.test.ts +2 -2
- package/src/__tests__/first-greeting.test.ts +7 -0
- package/src/__tests__/host-bash-proxy.test.ts +79 -0
- package/src/__tests__/host-cu-proxy.test.ts +90 -0
- package/src/__tests__/host-file-proxy.test.ts +89 -0
- package/src/__tests__/integration-status.test.ts +5 -5
- package/src/__tests__/list-messages-attachments.test.ts +171 -0
- package/src/__tests__/mcp-abort-signal.test.ts +205 -0
- package/src/__tests__/messaging-send-tool.test.ts +5 -5
- package/src/__tests__/navigate-settings-tab.test.ts +6 -2
- package/src/__tests__/notification-telegram-adapter.test.ts +125 -0
- package/src/__tests__/oauth-cli.test.ts +126 -119
- package/src/__tests__/oauth-provider-profiles.test.ts +55 -20
- package/src/__tests__/oauth-scope-policy.test.ts +4 -6
- package/src/__tests__/onboarding-template-contract.test.ts +2 -2
- package/src/__tests__/platform.test.ts +3 -168
- package/src/__tests__/secret-routes-managed-proxy.test.ts +78 -0
- package/src/__tests__/secure-keys-managed-failover.test.ts +73 -0
- package/src/__tests__/skill-feature-flags.test.ts +8 -0
- package/src/__tests__/skill-secret-handling-guard.test.ts +212 -0
- package/src/__tests__/skills-uninstall.test.ts +2 -2
- package/src/__tests__/slack-messaging-token-resolution.test.ts +22 -24
- package/src/__tests__/slack-share-routes.test.ts +5 -5
- package/src/__tests__/system-prompt.test.ts +39 -0
- package/src/__tests__/token-estimator-accuracy.benchmark.test.ts +1 -1
- package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +5 -4
- package/src/cli/AGENTS.md +47 -7
- package/src/cli/commands/browser-relay.ts +2 -17
- package/src/cli/commands/contacts.ts +6 -4
- package/src/cli/commands/conversations.ts +13 -1
- package/src/cli/commands/credential-execution.ts +16 -1
- package/src/cli/commands/credentials.ts +2 -8
- package/src/cli/commands/oauth/__tests__/connect.test.ts +29 -108
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +13 -87
- package/src/cli/commands/oauth/__tests__/mode.test.ts +22 -69
- package/src/cli/commands/oauth/__tests__/ping.test.ts +20 -79
- package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +574 -0
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +416 -0
- package/src/cli/commands/oauth/__tests__/status.test.ts +12 -40
- package/src/cli/commands/oauth/__tests__/token.test.ts +3 -50
- package/src/cli/commands/oauth/apps.ts +63 -44
- package/src/cli/commands/oauth/connect.ts +187 -155
- package/src/cli/commands/oauth/disconnect.ts +27 -75
- package/src/cli/commands/oauth/index.ts +36 -46
- package/src/cli/commands/oauth/mode.ts +22 -34
- package/src/cli/commands/oauth/ping.ts +19 -45
- package/src/cli/commands/oauth/providers.ts +569 -62
- package/src/cli/commands/oauth/request.ts +36 -48
- package/src/cli/commands/oauth/shared.ts +1 -19
- package/src/cli/commands/oauth/status.ts +14 -25
- package/src/cli/commands/oauth/token.ts +25 -34
- package/src/cli/commands/platform/__tests__/connect.test.ts +224 -0
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +237 -0
- package/src/cli/commands/platform/__tests__/status.test.ts +246 -0
- package/src/cli/commands/platform/connect.ts +104 -0
- package/src/cli/commands/platform/disconnect.ts +118 -0
- package/src/cli/commands/{platform.ts → platform/index.ts} +108 -38
- package/src/cli/commands/sequence.ts +5 -4
- package/src/cli/commands/shotgun.ts +16 -0
- package/src/cli/commands/skills.ts +173 -41
- package/src/cli/commands/usage.ts +5 -11
- package/src/cli/lib/daemon-credential-client.ts +22 -38
- package/src/cli/program.ts +1 -1
- package/src/config/assistant-feature-flags.ts +3 -7
- package/src/config/bundled-skills/contacts/tools/google-contacts.ts +1 -1
- package/src/config/bundled-skills/conversations/SKILL.md +20 -0
- package/src/config/bundled-skills/conversations/TOOLS.json +23 -0
- package/src/config/bundled-skills/conversations/tools/rename-conversation.ts +66 -0
- package/src/config/bundled-skills/gmail/SKILL.md +13 -13
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +3 -3
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +2 -2
- package/src/config/bundled-skills/gmail/tools/gmail-draft.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/gmail-filters.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/gmail-follow-up.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/gmail-forward.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +2 -2
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/gmail-send-draft.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/gmail-trash.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/gmail-vacation.ts +1 -1
- package/src/config/bundled-skills/google-calendar/SKILL.md +10 -4
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +1 -1
- package/src/config/bundled-skills/messaging/SKILL.md +7 -7
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +5 -2
- package/src/config/bundled-skills/messaging/tools/shared.ts +5 -6
- package/src/config/bundled-skills/settings/TOOLS.json +5 -3
- package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +4 -2
- package/src/config/bundled-tool-registry.ts +5 -0
- package/src/config/feature-flag-registry.json +2 -2
- package/src/credential-execution/client.ts +15 -3
- package/src/daemon/conversation-agent-loop.ts +2 -0
- package/src/daemon/conversation-error.ts +36 -6
- package/src/daemon/conversation-messaging.ts +9 -0
- package/src/daemon/conversation-runtime-assembly.ts +33 -0
- package/src/daemon/conversation-surfaces.ts +120 -14
- package/src/daemon/conversation.ts +5 -0
- package/src/daemon/first-greeting.ts +6 -1
- package/src/daemon/handlers/skills.ts +148 -3
- package/src/daemon/host-bash-proxy.ts +16 -0
- package/src/daemon/host-cu-proxy.ts +16 -0
- package/src/daemon/host-file-proxy.ts +16 -0
- package/src/daemon/lifecycle.ts +56 -5
- package/src/daemon/message-types/conversations.ts +1 -0
- package/src/daemon/message-types/guardian-actions.ts +2 -0
- package/src/daemon/message-types/host-bash.ts +6 -1
- package/src/daemon/message-types/host-cu.ts +6 -1
- package/src/daemon/message-types/host-file.ts +6 -1
- package/src/daemon/message-types/integrations.ts +0 -1
- package/src/daemon/server.ts +29 -2
- package/src/hooks/cli.ts +74 -0
- package/src/inbound/platform-callback-registration.ts +7 -12
- package/src/index.ts +0 -12
- package/src/mcp/client.ts +6 -1
- package/src/mcp/manager.ts +2 -1
- package/src/memory/conversation-crud.ts +92 -3
- package/src/memory/conversation-key-store.ts +26 -0
- package/src/memory/conversation-queries.ts +6 -6
- package/src/memory/db-init.ts +16 -0
- package/src/memory/journal-memory.ts +8 -2
- package/src/memory/migrations/196-messages-conversation-created-at-index.ts +9 -0
- package/src/memory/migrations/196-strip-integration-prefix-from-provider-keys.ts +186 -0
- package/src/memory/migrations/197-oauth-providers-behavior-columns.ts +29 -0
- package/src/memory/migrations/198-drop-setup-skill-id-column.ts +11 -0
- package/src/memory/migrations/index.ts +4 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/schema/oauth.ts +11 -0
- package/src/messaging/provider.ts +13 -12
- package/src/messaging/providers/gmail/adapter.ts +44 -35
- package/src/messaging/providers/slack/adapter.ts +63 -33
- package/src/messaging/providers/telegram-bot/adapter.ts +6 -8
- package/src/messaging/providers/whatsapp/adapter.ts +6 -8
- package/src/notifications/adapters/telegram.ts +78 -2
- package/src/oauth/__tests__/identity-verifier.test.ts +464 -0
- package/src/oauth/byo-connection.test.ts +22 -24
- package/src/oauth/connect-orchestrator.ts +37 -76
- package/src/oauth/connect-types.ts +7 -65
- package/src/oauth/connection-resolver.test.ts +13 -13
- package/src/oauth/connection-resolver.ts +3 -4
- package/src/oauth/identity-verifier.ts +177 -0
- package/src/oauth/oauth-store.ts +228 -3
- package/src/oauth/platform-connection.test.ts +56 -6
- package/src/oauth/platform-connection.ts +8 -1
- package/src/oauth/seed-providers.ts +247 -34
- package/src/permissions/checker.ts +127 -1
- package/src/prompts/journal-context.ts +4 -1
- package/src/prompts/system-prompt.ts +54 -9
- package/src/prompts/templates/BOOTSTRAP.md +16 -5
- package/src/providers/anthropic/client.ts +2 -33
- package/src/runtime/guardian-action-service.ts +7 -2
- package/src/runtime/http-server.ts +12 -18
- package/src/runtime/http-types.ts +8 -1
- package/src/runtime/migrations/rebind-secrets-screen.ts +2 -2
- package/src/runtime/routes/conversation-management-routes.ts +31 -0
- package/src/runtime/routes/conversation-routes.ts +79 -4
- package/src/runtime/routes/guardian-action-routes.ts +15 -2
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +21 -8
- package/src/runtime/routes/integrations/slack/share.ts +1 -1
- package/src/runtime/routes/oauth-apps.ts +2 -1
- package/src/runtime/routes/secret-routes.ts +45 -15
- package/src/runtime/routes/settings-routes.ts +12 -19
- package/src/runtime/routes/skills-routes.ts +45 -4
- package/src/schedule/integration-status.ts +2 -2
- package/src/security/ces-rpc-credential-backend.ts +19 -16
- package/src/security/oauth-completion-page.ts +153 -0
- package/src/security/oauth2.ts +3 -17
- package/src/security/secure-keys.ts +207 -7
- package/src/security/token-manager.ts +3 -6
- package/src/signals/bash.ts +6 -1
- package/src/skills/catalog-cache.ts +44 -0
- package/src/skills/catalog-search.ts +18 -0
- package/src/tools/browser/browser-manager.ts +2 -2
- package/src/tools/credentials/post-connect-hooks.ts +1 -1
- package/src/tools/credentials/vault.ts +34 -45
- package/src/tools/host-terminal/host-shell.ts +16 -3
- package/src/tools/mcp/mcp-tool-factory.ts +2 -1
- package/src/tools/skills/sandbox-runner.ts +16 -3
- package/src/tools/terminal/shell.ts +16 -3
- package/src/util/logger.ts +11 -1
- package/src/util/platform.ts +1 -91
- package/src/util/sentry-log-stream.ts +51 -0
- package/src/watcher/providers/github.ts +2 -2
- package/src/watcher/providers/gmail.ts +1 -1
- package/src/watcher/providers/google-calendar.ts +1 -1
- package/src/watcher/providers/linear.ts +2 -2
- package/src/workspace/migrations/011-backfill-installation-id.ts +5 -3
- package/src/workspace/migrations/020-rename-oauth-skill-dirs.ts +119 -0
- package/src/workspace/migrations/registry.ts +2 -0
- package/src/cli/commands/oauth/connections.ts +0 -255
- package/src/oauth/provider-behaviors.ts +0 -634
|
@@ -6,6 +6,9 @@ const deliveryCalls: Array<{
|
|
|
6
6
|
bearerToken?: string;
|
|
7
7
|
}> = [];
|
|
8
8
|
|
|
9
|
+
/** When true, deliverChannelReply throws if the payload contains an approval field. */
|
|
10
|
+
let rejectRichDelivery = false;
|
|
11
|
+
|
|
9
12
|
mock.module("../config/env.js", () => ({
|
|
10
13
|
isHttpAuthDisabled: () => true,
|
|
11
14
|
getGatewayInternalBaseUrl: () => "http://gateway.internal",
|
|
@@ -17,6 +20,9 @@ mock.module("../runtime/gateway-client.js", () => ({
|
|
|
17
20
|
payload: Record<string, unknown>,
|
|
18
21
|
bearerToken?: string,
|
|
19
22
|
) => {
|
|
23
|
+
if (rejectRichDelivery && payload.approval) {
|
|
24
|
+
throw new Error("Telegram API error: buttons not supported");
|
|
25
|
+
}
|
|
20
26
|
deliveryCalls.push({ url, payload, bearerToken });
|
|
21
27
|
},
|
|
22
28
|
}));
|
|
@@ -60,6 +66,7 @@ function makeDestination(
|
|
|
60
66
|
describe("TelegramAdapter", () => {
|
|
61
67
|
beforeEach(() => {
|
|
62
68
|
deliveryCalls.length = 0;
|
|
69
|
+
rejectRichDelivery = false;
|
|
63
70
|
});
|
|
64
71
|
|
|
65
72
|
test("prefers deliveryText and does not append deterministic label", async () => {
|
|
@@ -156,4 +163,122 @@ describe("TelegramAdapter", () => {
|
|
|
156
163
|
);
|
|
157
164
|
expect(deliveryCalls[2]?.payload.text).toBe("watcher escalation");
|
|
158
165
|
});
|
|
166
|
+
|
|
167
|
+
// ── Access request inline keyboard tests ──────────────────────────────
|
|
168
|
+
|
|
169
|
+
test("includes approval payload with inline buttons for access requests", async () => {
|
|
170
|
+
const adapter = new TelegramAdapter();
|
|
171
|
+
const payload = makePayload({
|
|
172
|
+
sourceEventName: "ingress.access_request",
|
|
173
|
+
copy: {
|
|
174
|
+
title: "Access Request",
|
|
175
|
+
body: "Someone is requesting access.",
|
|
176
|
+
deliveryText: "Someone is requesting access to the assistant.",
|
|
177
|
+
},
|
|
178
|
+
contextPayload: {
|
|
179
|
+
requestId: "req-abc-123",
|
|
180
|
+
requestCode: "XYZW",
|
|
181
|
+
senderIdentifier: "Marina",
|
|
182
|
+
sourceChannel: "telegram",
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
const result = await adapter.send(payload, makeDestination());
|
|
187
|
+
|
|
188
|
+
expect(result.success).toBe(true);
|
|
189
|
+
expect(deliveryCalls).toHaveLength(1);
|
|
190
|
+
|
|
191
|
+
const call = deliveryCalls[0]!;
|
|
192
|
+
expect(call.payload.text).toBe(
|
|
193
|
+
"Someone is requesting access to the assistant.",
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
const approval = call.payload.approval as {
|
|
197
|
+
requestId: string;
|
|
198
|
+
actions: Array<{ id: string; label: string }>;
|
|
199
|
+
plainTextFallback: string;
|
|
200
|
+
};
|
|
201
|
+
expect(approval).toBeDefined();
|
|
202
|
+
expect(approval.requestId).toBe("req-abc-123");
|
|
203
|
+
expect(approval.actions).toHaveLength(2);
|
|
204
|
+
expect(approval.actions[0]).toEqual({
|
|
205
|
+
id: "approve_once",
|
|
206
|
+
label: "Approve once",
|
|
207
|
+
});
|
|
208
|
+
expect(approval.actions[1]).toEqual({ id: "reject", label: "Reject" });
|
|
209
|
+
expect(approval.plainTextFallback).toContain("XYZW");
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
test("sends plain text without approval when contextPayload is missing", async () => {
|
|
213
|
+
const adapter = new TelegramAdapter();
|
|
214
|
+
const payload = makePayload({
|
|
215
|
+
sourceEventName: "ingress.access_request",
|
|
216
|
+
copy: {
|
|
217
|
+
title: "Access Request",
|
|
218
|
+
body: "Someone is requesting access.",
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
const result = await adapter.send(payload, makeDestination());
|
|
223
|
+
|
|
224
|
+
expect(result.success).toBe(true);
|
|
225
|
+
expect(deliveryCalls).toHaveLength(1);
|
|
226
|
+
expect(deliveryCalls[0]?.payload.approval).toBeUndefined();
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
test("sends plain text without approval when requestId is missing from contextPayload", async () => {
|
|
230
|
+
const adapter = new TelegramAdapter();
|
|
231
|
+
const payload = makePayload({
|
|
232
|
+
sourceEventName: "ingress.access_request",
|
|
233
|
+
copy: {
|
|
234
|
+
title: "Access Request",
|
|
235
|
+
body: "Someone is requesting access.",
|
|
236
|
+
},
|
|
237
|
+
contextPayload: {
|
|
238
|
+
senderIdentifier: "Marina",
|
|
239
|
+
sourceChannel: "telegram",
|
|
240
|
+
// no requestId
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
const result = await adapter.send(payload, makeDestination());
|
|
245
|
+
|
|
246
|
+
expect(result.success).toBe(true);
|
|
247
|
+
expect(deliveryCalls).toHaveLength(1);
|
|
248
|
+
expect(deliveryCalls[0]?.payload.approval).toBeUndefined();
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
test("falls back to plain text with instructions when rich delivery fails", async () => {
|
|
252
|
+
rejectRichDelivery = true;
|
|
253
|
+
|
|
254
|
+
const adapter = new TelegramAdapter();
|
|
255
|
+
const payload = makePayload({
|
|
256
|
+
sourceEventName: "ingress.access_request",
|
|
257
|
+
copy: {
|
|
258
|
+
title: "Access Request",
|
|
259
|
+
body: "Someone is requesting access.",
|
|
260
|
+
deliveryText: "Someone is requesting access to the assistant.",
|
|
261
|
+
},
|
|
262
|
+
contextPayload: {
|
|
263
|
+
requestId: "req-abc-123",
|
|
264
|
+
requestCode: "XYZW",
|
|
265
|
+
senderIdentifier: "Marina",
|
|
266
|
+
sourceChannel: "telegram",
|
|
267
|
+
},
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
const result = await adapter.send(payload, makeDestination());
|
|
271
|
+
|
|
272
|
+
expect(result.success).toBe(true);
|
|
273
|
+
// Rich delivery threw, so only the plain-text fallback should be recorded.
|
|
274
|
+
expect(deliveryCalls).toHaveLength(1);
|
|
275
|
+
const call = deliveryCalls[0]!;
|
|
276
|
+
// No approval payload in the fallback delivery.
|
|
277
|
+
expect(call.payload.approval).toBeUndefined();
|
|
278
|
+
// The fallback text should include the original message AND the
|
|
279
|
+
// typed-command instructions from plainTextFallback.
|
|
280
|
+
const text = call.payload.text as string;
|
|
281
|
+
expect(text).toContain("Someone is requesting access to the assistant.");
|
|
282
|
+
expect(text).toContain("XYZW");
|
|
283
|
+
});
|
|
159
284
|
});
|