Commit f1607bc
authored
fix: restore connected app discovery and mentions (#280)
## Summary
- Include active connected apps alongside custom skills in the composer
`@` catalog.
- Add a small database-backed composer capability endpoint so opening
`@` never waits on Composio.
- Recover from over-specific Composio tool searches with one bounded
toolkit fetch and deterministic local ranking.
- Preserve the existing `/v1/skills` contract for safe, independent
Worker and Vercel rollouts.
## Context
Direct production bug report; no separate Linear issue or plan document
exists.
## Architecture
The gateway projects tenant-scoped custom skills and distinct active
integration slugs from Postgres in one signed user transaction. The web
composer validates and caches this bounded catalog. At execution time,
the agent still uses the generic, version-aware Composio list/execute
boundary; only an exact zero-result query triggers a bounded broad
lookup and local rank.
## Decisions Made
| Decision | Choice | Alternatives considered | Reasoning |
|---|---|---|---|
| Composer catalog | Dedicated `/v1/composer/skills` endpoint | Change
`/v1/skills`; call integration catalog separately | Avoids a rollout
contract mismatch and removes a second client/provider-dependent
request. |
| Connected-app representation | Active toolkit slugs from Postgres |
Import one skill per connector | The existing generic runtime remains
tenant-scoped and supports the full open toolkit catalog without bundled
vendor sprawl. |
| Search recovery | Exact query, then one bounded broad fetch and local
rank | Guess action slugs; always fetch all actions | Preserves the fast
path, handles Composio phrase-search misses, and keeps response/runtime
bounds explicit. |
## Edge Cases Handled
| Scenario | Handling |
|---|---|
| Worker deploy precedes web deploy | Existing `/v1/skills` response
remains unchanged. |
| Web deploy precedes Worker deploy | React Query surfaces a transient
catalog error; no incompatible parsing of the old route. |
| Duplicate active accounts for one toolkit | Database projection
returns distinct toolkit slugs. |
| Unknown valid toolkit slug | UI derives a safe title-cased display
name. |
| Natural-language action phrase returns zero | Runtime broadens once
and ranks non-deprecated tools deterministically. |
| Broad list exceeds returned candidates | `toolsTruncated` remains true
so the model can refine with a shorter keyword. |
## How to Review
1. Start with
`packages/agent-core/src/mastra/tool-defs/composio-tool.ts` for
discovery semantics.
2. Review `apps/gateway-worker/src/skills-routes.ts` and
`packages/db/src/integrations.ts` for the catalog boundary.
3. Review `apps/web/src/components/composer/use-composer-menu.ts` and
`mention-skill-source.ts` for `@` behavior.
4. The README and skill text changes document those contracts.
## Verification
- [x] `pnpm lint`
- [x] `pnpm typecheck`
- [x] `pnpm turbo build --force`
- [x] `pnpm deadcode`
- [x] `pnpm architecture:check`
- [x] `pnpm turbo skills:build`
- [ ] Production `@` catalog shows active Gmail and Notion connections
after merge/deploy.
- [ ] Ordinary Gmail read prompt discovers and executes the correct
action after merge/deploy.
- [ ] Ordinary Notion read prompt discovers and executes the correct
action after merge/deploy.1 parent 21a9830 commit f1607bc
19 files changed
Lines changed: 241 additions & 71 deletions
File tree
- apps
- gateway-worker
- src
- web
- src
- components
- chat
- composer
- lib/api
- packages
- agent-core
- src/mastra/tool-defs
- db
- src
- types
- src
- skills/connected-apps
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
92 | 92 | | |
93 | 93 | | |
94 | 94 | | |
| 95 | + | |
| 96 | + | |
95 | 97 | | |
96 | 98 | | |
97 | 99 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
9 | | - | |
| 9 | + | |
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
| |||
82 | 82 | | |
83 | 83 | | |
84 | 84 | | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
85 | 90 | | |
86 | 91 | | |
87 | 92 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
3 | 4 | | |
4 | 5 | | |
5 | 6 | | |
6 | 7 | | |
7 | | - | |
8 | | - | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
9 | 16 | | |
10 | 17 | | |
11 | 18 | | |
| |||
29 | 36 | | |
30 | 37 | | |
31 | 38 | | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
37 | 37 | | |
38 | 38 | | |
39 | 39 | | |
40 | | - | |
| 40 | + | |
| 41 | + | |
41 | 42 | | |
42 | 43 | | |
43 | 44 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
33 | 33 | | |
34 | 34 | | |
35 | 35 | | |
36 | | - | |
| 36 | + | |
37 | 37 | | |
38 | 38 | | |
39 | 39 | | |
| |||
402 | 402 | | |
403 | 403 | | |
404 | 404 | | |
| 405 | + | |
405 | 406 | | |
406 | 407 | | |
407 | 408 | | |
| |||
Lines changed: 2 additions & 22 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
8 | | - | |
9 | | - | |
10 | | - | |
11 | | - | |
12 | | - | |
13 | | - | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | | - | |
18 | | - | |
19 | | - | |
20 | | - | |
21 | | - | |
22 | | - | |
23 | | - | |
24 | | - | |
25 | | - | |
26 | | - | |
27 | | - | |
28 | 8 | | |
29 | 9 | | |
30 | 10 | | |
| |||
49 | 29 | | |
50 | 30 | | |
51 | 31 | | |
52 | | - | |
| 32 | + | |
53 | 33 | | |
54 | 34 | | |
55 | 35 | | |
| |||
Lines changed: 13 additions & 17 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
| 1 | + | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
| 4 | + | |
5 | 5 | | |
6 | 6 | | |
7 | | - | |
8 | | - | |
9 | | - | |
| 7 | + | |
10 | 8 | | |
11 | | - | |
| 9 | + | |
12 | 10 | | |
13 | 11 | | |
14 | | - | |
| 12 | + | |
15 | 13 | | |
16 | 14 | | |
17 | 15 | | |
18 | 16 | | |
19 | | - | |
| 17 | + | |
20 | 18 | | |
21 | 19 | | |
22 | 20 | | |
| |||
27 | 25 | | |
28 | 26 | | |
29 | 27 | | |
30 | | - | |
31 | | - | |
32 | | - | |
33 | | - | |
34 | | - | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
35 | 31 | | |
36 | | - | |
37 | | - | |
| 32 | + | |
| 33 | + | |
38 | 34 | | |
39 | | - | |
40 | | - | |
| 35 | + | |
| 36 | + | |
41 | 37 | | |
42 | 38 | | |
43 | 39 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| 7 | + | |
7 | 8 | | |
8 | | - | |
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
| 14 | + | |
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| |||
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
42 | | - | |
43 | | - | |
44 | | - | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
45 | 45 | | |
46 | 46 | | |
47 | 47 | | |
| |||
67 | 67 | | |
68 | 68 | | |
69 | 69 | | |
70 | | - | |
| 70 | + | |
71 | 71 | | |
72 | 72 | | |
73 | 73 | | |
| |||
91 | 91 | | |
92 | 92 | | |
93 | 93 | | |
94 | | - | |
| 94 | + | |
95 | 95 | | |
96 | 96 | | |
97 | | - | |
| 97 | + | |
98 | 98 | | |
99 | 99 | | |
100 | 100 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
| 4 | + | |
| 5 | + | |
4 | 6 | | |
5 | 7 | | |
6 | 8 | | |
| |||
13 | 15 | | |
14 | 16 | | |
15 | 17 | | |
| 18 | + | |
16 | 19 | | |
17 | 20 | | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
18 | 32 | | |
19 | 33 | | |
20 | 34 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
179 | 179 | | |
180 | 180 | | |
181 | 181 | | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
182 | 187 | | |
183 | 188 | | |
0 commit comments