@vellumai/assistant 0.10.2-dev.202606242135.63f618e → 0.10.2-dev.202606242332.3fa9b2b

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 (36) hide show
  1. package/bun.lock +20 -0
  2. package/node_modules/@vellumai/service-contracts/package.json +1 -0
  3. package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +28 -0
  4. package/node_modules/@vellumai/service-contracts/src/channels.ts +41 -0
  5. package/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
  6. package/openapi.yaml +34 -0
  7. package/package.json +4 -1
  8. package/src/__tests__/code-search-tool.test.ts +585 -0
  9. package/src/__tests__/conversation-surfaces-task-progress.test.ts +29 -0
  10. package/src/__tests__/exploration-drift-hook.test.ts +3 -2
  11. package/src/__tests__/guardian-expiry-notifier.test.ts +282 -0
  12. package/src/__tests__/mcp-health-check.test.ts +2 -1
  13. package/src/__tests__/registry.test.ts +1 -1
  14. package/src/__tests__/subagent-role-registry.test.ts +7 -2
  15. package/src/__tests__/ui-file-upload-surface.test.ts +86 -0
  16. package/src/api/index.ts +6 -1
  17. package/src/api/surfaces.ts +39 -3
  18. package/src/approvals/guardian-channel-delivery.ts +30 -0
  19. package/src/approvals/guardian-expiry-notifier.ts +148 -0
  20. package/src/approvals/guardian-request-resolvers.ts +1 -11
  21. package/src/channels/types.ts +10 -20
  22. package/src/config/bundled-skills/subagent/SKILL.md +1 -1
  23. package/src/config/bundled-skills/subagent/TOOLS.json +1 -1
  24. package/src/daemon/conversation-surfaces.ts +26 -2
  25. package/src/daemon/conversation-tool-setup.ts +1 -0
  26. package/src/daemon/message-types/surfaces.ts +12 -12
  27. package/src/mcp/mcp-oauth-provider.ts +19 -8
  28. package/src/plugins/defaults/exploration-drift/hooks/post-tool-use.ts +2 -1
  29. package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +13 -5
  30. package/src/runtime/routes/mcp-auth-routes.ts +65 -3
  31. package/src/subagent/types.ts +3 -3
  32. package/src/tools/filesystem/search.ts +543 -0
  33. package/src/tools/shared/filesystem/path-policy.ts +12 -5
  34. package/src/tools/tool-manifest.ts +3 -0
  35. package/src/workflows/library.test.ts +140 -0
  36. package/src/workflows/library.ts +82 -28
package/bun.lock CHANGED
@@ -38,6 +38,7 @@
38
38
  "playwright": "1.58.2",
39
39
  "postgres": "3.4.8",
40
40
  "quickjs-emscripten": "0.32.0",
41
+ "re2js": "2.8.3",
41
42
  "rrule": "2.8.1",
42
43
  "semver": "7.8.0",
43
44
  "stemmer": "2.0.1",
@@ -54,6 +55,7 @@
54
55
  "@types/node": "25.5.0",
55
56
  "@types/semver": "7.5.8",
56
57
  "@types/uuid": "10.0.0",
58
+ "@typescript/native-preview": "7.0.0-dev.20260624.1",
57
59
  "ajv": "8.18.0",
58
60
  "drizzle-kit": "0.31.10",
59
61
  "eslint": "10.0.3",
@@ -454,6 +456,22 @@
454
456
 
455
457
  "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.57.0", "", { "dependencies": { "@typescript-eslint/types": "8.57.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg=="],
456
458
 
459
+ "@typescript/native-preview": ["@typescript/native-preview@7.0.0-dev.20260624.1", "", { "optionalDependencies": { "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20260624.1", "@typescript/native-preview-darwin-x64": "7.0.0-dev.20260624.1", "@typescript/native-preview-linux-arm": "7.0.0-dev.20260624.1", "@typescript/native-preview-linux-arm64": "7.0.0-dev.20260624.1", "@typescript/native-preview-linux-x64": "7.0.0-dev.20260624.1", "@typescript/native-preview-win32-arm64": "7.0.0-dev.20260624.1", "@typescript/native-preview-win32-x64": "7.0.0-dev.20260624.1" }, "bin": { "tsgo": "bin/tsgo.js" } }, "sha512-ogwfNo1xuAutOF8RbTCo3Ut0q/65u2ucOeHizi6O14q+3vnelNS+u8qVC2QWXubMcwtuN5E9cbfPslvGC4kdwA=="],
460
+
461
+ "@typescript/native-preview-darwin-arm64": ["@typescript/native-preview-darwin-arm64@7.0.0-dev.20260624.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-g8CqDkYCHTCYdhBHXs5cMraBurOS+KrcMFxE0SsaKZoI6Tnp+le1aWvxUBbzNKJYyThHJqb/1mLopzEJxJCuKA=="],
462
+
463
+ "@typescript/native-preview-darwin-x64": ["@typescript/native-preview-darwin-x64@7.0.0-dev.20260624.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-P00JVvSV90eioYDuINAKmOSA8yhFTWLq6RvS5lrCfUuDlcgr2kSOgZAfFHIksHBVz6ZXpAXpa0dHPmc5SJ3Ymw=="],
464
+
465
+ "@typescript/native-preview-linux-arm": ["@typescript/native-preview-linux-arm@7.0.0-dev.20260624.1", "", { "os": "linux", "cpu": "arm" }, "sha512-eWHELvfQMkVRjafMd+3ATgM9p9yAergJaM4AOY8AekCNWnHFwUrp/ohh+ryyMUIqque5jjb/kuTiOiGj728I2Q=="],
466
+
467
+ "@typescript/native-preview-linux-arm64": ["@typescript/native-preview-linux-arm64@7.0.0-dev.20260624.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-cppM2yTZ/Gd1hOXy8NEJcUBxJ0O0zl9CU3OU1ZWZ/OHWWX/ukEzCCr94SUwJhjIWOylBCpIYkrvYoTwxNa94XQ=="],
468
+
469
+ "@typescript/native-preview-linux-x64": ["@typescript/native-preview-linux-x64@7.0.0-dev.20260624.1", "", { "os": "linux", "cpu": "x64" }, "sha512-FaB8rS+rKYz4nDrEsHsF3b4cn7eCKCYroMJReA375OuQ6PHcmCNQ6QlVetA0dfFBxTTgejmoKyfw9xgAA5P4Yw=="],
470
+
471
+ "@typescript/native-preview-win32-arm64": ["@typescript/native-preview-win32-arm64@7.0.0-dev.20260624.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-BgkqbCmSHDb5UxqWaFlFFJ/DHNT3lEUO4W8627ap6+QthJZuXk2imiHAX3PgYXC6en9fLLyR6jjcseAa4CCshg=="],
472
+
473
+ "@typescript/native-preview-win32-x64": ["@typescript/native-preview-win32-x64@7.0.0-dev.20260624.1", "", { "os": "win32", "cpu": "x64" }, "sha512-WaZ+ue63NgB2j/lqjirfevh/TqcsCxSqnKhGGiRnlxHyYIBcoq+x7KngyEnyGIaywJE1PcFeXA+2EMSIPlSEiQ=="],
474
+
457
475
  "@vellumai/ces-client": ["@vellumai/ces-client@file:../packages/ces-client", { "dependencies": { "@vellumai/service-contracts": "file:../service-contracts" }, "devDependencies": { "@types/bun": "1.2.4", "typescript": "5.7.3" } }],
458
476
 
459
477
  "@vellumai/credential-storage": ["@vellumai/credential-storage@file:../packages/credential-storage", { "devDependencies": { "@types/bun": "1.3.10", "typescript": "5.9.3" } }],
@@ -1040,6 +1058,8 @@
1040
1058
 
1041
1059
  "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="],
1042
1060
 
1061
+ "re2js": ["re2js@2.8.3", "", {}, "sha512-lUKeXVwMqU302DM/WaOm33XF2hhzjGUZ8CbLg4zSAMpW2PPkJ2+is25AROevNiw+DytFmKU5gsQ92cB1Kxy+fA=="],
1062
+
1043
1063
  "readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="],
1044
1064
 
1045
1065
  "real-require": ["real-require@0.2.0", "", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="],
@@ -6,6 +6,7 @@
6
6
  "type": "module",
7
7
  "exports": {
8
8
  ".": "./src/index.ts",
9
+ "./channels": "./src/channels.ts",
9
10
  "./credential-rpc": "./src/credential-rpc.ts",
10
11
  "./ingress": "./src/ingress.ts",
11
12
  "./twilio-ingress": "./src/twilio-ingress.ts",
@@ -0,0 +1,28 @@
1
+ import { describe, expect, test } from "bun:test";
2
+
3
+ import { CHANNEL_IDS, isChannelId } from "../channels.js";
4
+
5
+ describe("isChannelId", () => {
6
+ test("accepts every canonical channel id", () => {
7
+ for (const id of CHANNEL_IDS) {
8
+ expect(isChannelId(id)).toBe(true);
9
+ }
10
+ });
11
+
12
+ test("includes the internal channels no external surface ingresses", () => {
13
+ // `platform` (control plane) and `vellum` (native app) are part of the
14
+ // canonical vocabulary even though the gateway never ingresses them. The
15
+ // gateway's narrower list is a compile-time-asserted subset of this set,
16
+ // so these must remain canonical for that assertion to mean anything.
17
+ expect(isChannelId("platform")).toBe(true);
18
+ expect(isChannelId("vellum")).toBe(true);
19
+ });
20
+
21
+ test("rejects unknown strings and non-string values", () => {
22
+ expect(isChannelId("discord")).toBe(false);
23
+ expect(isChannelId("")).toBe(false);
24
+ expect(isChannelId(undefined)).toBe(false);
25
+ expect(isChannelId(null)).toBe(false);
26
+ expect(isChannelId(42)).toBe(false);
27
+ });
28
+ });
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Canonical channel-id vocabulary shared between the assistant daemon and the
3
+ * gateway.
4
+ *
5
+ * A "channel" is an external messaging surface an actor can reach the
6
+ * assistant through (Slack, Telegram, WhatsApp, phone, …) plus a couple of
7
+ * internal ids (`vellum` for native app conversations, `platform` for the
8
+ * internal control plane). This is the single source of truth for that set:
9
+ * the assistant adopts it wholesale as its `ChannelId`, and the gateway
10
+ * asserts its own (narrower) inbound list is a subset of it so the two sides
11
+ * cannot silently drift.
12
+ *
13
+ * Both packages depend on `@vellumai/service-contracts`, so hoisting the set
14
+ * here (rather than maintaining a copy on each side) means adding or renaming
15
+ * a channel happens in exactly one place.
16
+ *
17
+ * Note that a consumer may legitimately handle only a *subset* of these — the
18
+ * gateway, for example, never ingresses `platform`. Use a local list guarded
19
+ * by `satisfies readonly ChannelId[]` for those cases rather than redefining
20
+ * the union.
21
+ */
22
+
23
+ export const CHANNEL_IDS = [
24
+ "telegram",
25
+ "phone",
26
+ "vellum",
27
+ "whatsapp",
28
+ "slack",
29
+ "email",
30
+ "platform",
31
+ "a2a",
32
+ ] as const;
33
+
34
+ export type ChannelId = (typeof CHANNEL_IDS)[number];
35
+
36
+ export function isChannelId(value: unknown): value is ChannelId {
37
+ return (
38
+ typeof value === "string" &&
39
+ (CHANNEL_IDS as readonly string[]).includes(value)
40
+ );
41
+ }
@@ -18,6 +18,7 @@
18
18
  * module so that both sides can depend on it without circular references.
19
19
  */
20
20
 
21
+ export * from "./channels.js";
21
22
  export * from "./transport.js";
22
23
  export * from "./error.js";
23
24
  export * from "./handles.js";
package/openapi.yaml CHANGED
@@ -14739,6 +14739,37 @@ paths:
14739
14739
  responses:
14740
14740
  "200":
14741
14741
  description: Successful response
14742
+ /v1/internal/mcp/auth/revoke:
14743
+ post:
14744
+ operationId: internal_mcp_auth_revoke_post
14745
+ summary: Revoke MCP OAuth credentials
14746
+ description: Deletes stored OAuth tokens for an MCP server and triggers a reload.
14747
+ tags:
14748
+ - internal
14749
+ requestBody:
14750
+ required: true
14751
+ content:
14752
+ application/json:
14753
+ schema:
14754
+ type: object
14755
+ properties:
14756
+ serverId:
14757
+ type: string
14758
+ required:
14759
+ - serverId
14760
+ responses:
14761
+ "200":
14762
+ description: Successful response
14763
+ content:
14764
+ application/json:
14765
+ schema:
14766
+ type: object
14767
+ properties:
14768
+ revoked:
14769
+ type: boolean
14770
+ required:
14771
+ - revoked
14772
+ additionalProperties: false
14742
14773
  /v1/internal/mcp/auth/start:
14743
14774
  post:
14744
14775
  operationId: internal_mcp_auth_start_post
@@ -14818,6 +14849,8 @@ paths:
14818
14849
  type: boolean
14819
14850
  defaultRiskLevel:
14820
14851
  type: string
14852
+ hasOAuth:
14853
+ type: boolean
14821
14854
  allowedTools:
14822
14855
  type: array
14823
14856
  items:
@@ -14832,6 +14865,7 @@ paths:
14832
14865
  - transport
14833
14866
  - enabled
14834
14867
  - defaultRiskLevel
14868
+ - hasOAuth
14835
14869
  additionalProperties: false
14836
14870
  required:
14837
14871
  - servers
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vellumai/assistant",
3
- "version": "0.10.2-dev.202606242135.63f618e",
3
+ "version": "0.10.2-dev.202606242332.3fa9b2b",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "exports": {
@@ -24,6 +24,7 @@
24
24
  "lint:circular": "bun run scripts/check-circular-deps.ts",
25
25
  "lint:unused:production": "knip --production --include exports",
26
26
  "typecheck": "bunx tsc --noEmit",
27
+ "typecheck:fast": "bunx tsgo --noEmit",
27
28
  "test": "bash scripts/test.sh",
28
29
  "test:coverage": "COVERAGE=true bash scripts/test.sh",
29
30
  "test:stable": "EXCLUDE_EXPERIMENTAL=true bash scripts/test.sh",
@@ -66,6 +67,7 @@
66
67
  "playwright": "1.58.2",
67
68
  "postgres": "3.4.8",
68
69
  "quickjs-emscripten": "0.32.0",
70
+ "re2js": "2.8.3",
69
71
  "rrule": "2.8.1",
70
72
  "semver": "7.8.0",
71
73
  "stemmer": "2.0.1",
@@ -105,6 +107,7 @@
105
107
  "@types/node": "25.5.0",
106
108
  "@types/semver": "7.5.8",
107
109
  "@types/uuid": "10.0.0",
110
+ "@typescript/native-preview": "7.0.0-dev.20260624.1",
108
111
  "ajv": "8.18.0",
109
112
  "drizzle-kit": "0.31.10",
110
113
  "eslint": "10.0.3",