@tickernelz/paperclip-pro-shared 2026.1006.0 → 2026.1006.2
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/dist/.paperclip-build-complete +1 -1
- package/dist/aggregator-app-catalog.d.ts +26 -0
- package/dist/aggregator-app-catalog.d.ts.map +1 -0
- package/dist/aggregator-app-catalog.js +72 -0
- package/dist/aggregator-app-catalog.js.map +1 -0
- package/dist/aggregator-app-catalog.test.d.ts +2 -0
- package/dist/aggregator-app-catalog.test.d.ts.map +1 -0
- package/dist/aggregator-app-catalog.test.js +45 -0
- package/dist/aggregator-app-catalog.test.js.map +1 -0
- package/dist/aggregator-apps.d.ts +41 -0
- package/dist/aggregator-apps.d.ts.map +1 -0
- package/dist/aggregator-apps.js +34 -0
- package/dist/aggregator-apps.js.map +1 -0
- package/dist/ai-connection-router.d.ts +352 -0
- package/dist/ai-connection-router.d.ts.map +1 -0
- package/dist/ai-connection-router.js +55 -0
- package/dist/ai-connection-router.js.map +1 -0
- package/dist/ai-connection-usage.d.ts +48 -0
- package/dist/ai-connection-usage.d.ts.map +1 -0
- package/dist/ai-connection-usage.js +6 -0
- package/dist/ai-connection-usage.js.map +1 -0
- package/dist/ai-connections.d.ts +7 -0
- package/dist/ai-connections.d.ts.map +1 -1
- package/dist/ai-connections.js +7 -5
- package/dist/ai-connections.js.map +1 -1
- package/dist/app-definitions/agentmail.json +1 -1
- package/dist/app-definitions/airtable.json +10 -1
- package/dist/app-definitions/api-key-generic.json +2 -1
- package/dist/app-definitions/asana.json +37 -6
- package/dist/app-definitions/beehiiv.json +5 -1
- package/dist/app-definitions/bitly.json +2 -1
- package/dist/app-definitions/brex.json +23 -1
- package/dist/app-definitions/browser-use-cloud.json +53 -0
- package/dist/app-definitions/candid.json +6 -1
- package/dist/app-definitions/clickhouse.json +8 -1
- package/dist/app-definitions/cloudflare.json +7 -2
- package/dist/app-definitions/cloudinary.json +10 -1
- package/dist/app-definitions/coda.json +6 -2
- package/dist/app-definitions/cognee.json +76 -0
- package/dist/app-definitions/embat.json +7 -1
- package/dist/app-definitions/fireflies.json +2 -1
- package/dist/app-definitions/github-code-review-bot.json +57 -0
- package/dist/app-definitions/github.json +4 -43
- package/dist/app-definitions/google-calendar.json +0 -2
- package/dist/app-definitions/google-docs.json +0 -6
- package/dist/app-definitions/google-sheets.json +0 -6
- package/dist/app-definitions/google-slides.json +0 -6
- package/dist/app-definitions/honcho.json +73 -0
- package/dist/app-definitions/hugging-face.json +4 -1
- package/dist/app-definitions/kernel.json +6 -2
- package/dist/app-definitions/linear.json +2 -1
- package/dist/app-definitions/local-falcon.json +5 -1
- package/dist/app-definitions/manufact.json +7 -1
- package/dist/app-definitions/mem0.json +12 -6
- package/dist/app-definitions/miro.json +7 -1
- package/dist/app-definitions/mixpanel.json +27 -1
- package/dist/app-definitions/neon.json +155 -0
- package/dist/app-definitions/netlify.json +6 -1
- package/dist/app-definitions/notion.json +4 -1
- package/dist/app-definitions/oreilly.json +7 -2
- package/dist/app-definitions/pagerduty.json +4 -2
- package/dist/app-definitions/planetscale.json +12 -2
- package/dist/app-definitions/posthog.json +2 -1
- package/dist/app-definitions/postman.json +6 -3
- package/dist/app-definitions/razorpay.json +2 -1
- package/dist/app-definitions/resend.json +4 -1
- package/dist/app-definitions/sanity.json +6 -2
- package/dist/app-definitions/sentry.json +8 -1
- package/dist/app-definitions/similarweb.json +2 -1
- package/dist/app-definitions/slack.json +28 -1
- package/dist/app-definitions/stripe.json +6 -2
- package/dist/app-definitions/supabase.json +22 -4
- package/dist/app-definitions/supermemory.json +55 -0
- package/dist/app-definitions/ticktick.json +5 -1
- package/dist/app-definitions/todoist.json +4 -1
- package/dist/app-definitions/vercel.json +4 -1
- package/dist/app-definitions/wix.json +4 -1
- package/dist/app-definitions/youcom.json +7 -2
- package/dist/app-definitions/zep.json +54 -0
- package/dist/app-definitions-url.test.js +4 -2
- package/dist/app-definitions-url.test.js.map +1 -1
- package/dist/app-definitions.d.ts +5 -1
- package/dist/app-definitions.d.ts.map +1 -1
- package/dist/app-definitions.generated.d.ts.map +1 -1
- package/dist/app-definitions.generated.js +78 -71
- package/dist/app-definitions.generated.js.map +1 -1
- package/dist/app-definitions.js +18 -7
- package/dist/app-definitions.js.map +1 -1
- package/dist/app-definitions.test.js +173 -46
- package/dist/app-definitions.test.js.map +1 -1
- package/dist/arcade-app-catalog.json +1602 -0
- package/dist/asana-connectors.d.ts +7 -0
- package/dist/asana-connectors.d.ts.map +1 -0
- package/dist/asana-connectors.js +8 -0
- package/dist/asana-connectors.js.map +1 -0
- package/dist/browser-use.d.ts +107 -0
- package/dist/browser-use.d.ts.map +1 -0
- package/dist/browser-use.js +98 -0
- package/dist/browser-use.js.map +1 -0
- package/dist/composio-app-setup.d.ts +65 -0
- package/dist/composio-app-setup.d.ts.map +1 -0
- package/dist/composio-app-setup.js +17 -0
- package/dist/composio-app-setup.js.map +1 -0
- package/dist/composio-search-catalog.json +1589 -0
- package/dist/connection-instructions.d.ts +34 -0
- package/dist/connection-instructions.d.ts.map +1 -0
- package/dist/connection-instructions.js +48 -0
- package/dist/connection-instructions.js.map +1 -0
- package/dist/connection-instructions.test.d.ts +2 -0
- package/dist/connection-instructions.test.d.ts.map +1 -0
- package/dist/connection-instructions.test.js +84 -0
- package/dist/connection-instructions.test.js.map +1 -0
- package/dist/connection-intent-guidance.d.ts +2 -2
- package/dist/connection-intent-guidance.d.ts.map +1 -1
- package/dist/connection-intent-guidance.js +7 -20
- package/dist/connection-intent-guidance.js.map +1 -1
- package/dist/connection-intent-guidance.test.js +15 -54
- package/dist/connection-intent-guidance.test.js.map +1 -1
- package/dist/connection-routing.d.ts +33 -0
- package/dist/connection-routing.d.ts.map +1 -0
- package/dist/connection-routing.js +309 -0
- package/dist/connection-routing.js.map +1 -0
- package/dist/connection-routing.test.d.ts +2 -0
- package/dist/connection-routing.test.d.ts.map +1 -0
- package/dist/connection-routing.test.js +73 -0
- package/dist/connection-routing.test.js.map +1 -0
- package/dist/connection-search.d.ts +15 -0
- package/dist/connection-search.d.ts.map +1 -0
- package/dist/connection-search.js +75 -0
- package/dist/connection-search.js.map +1 -0
- package/dist/connection-search.test.d.ts +2 -0
- package/dist/connection-search.test.d.ts.map +1 -0
- package/dist/connection-search.test.js +37 -0
- package/dist/connection-search.test.js.map +1 -0
- package/dist/connection-setup-state.d.ts +32 -0
- package/dist/connection-setup-state.d.ts.map +1 -0
- package/dist/connection-setup-state.js +74 -0
- package/dist/connection-setup-state.js.map +1 -0
- package/dist/connection-setup-state.test.d.ts +2 -0
- package/dist/connection-setup-state.test.d.ts.map +1 -0
- package/dist/connection-setup-state.test.js +92 -0
- package/dist/connection-setup-state.test.js.map +1 -0
- package/dist/constants.d.ts +2 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -1
- package/dist/constants.js.map +1 -1
- package/dist/feature-catalog.d.ts.map +1 -1
- package/dist/feature-catalog.js +24 -5
- package/dist/feature-catalog.js.map +1 -1
- package/dist/github-skill-repository.d.ts +7 -0
- package/dist/github-skill-repository.d.ts.map +1 -0
- package/dist/github-skill-repository.js +29 -0
- package/dist/github-skill-repository.js.map +1 -0
- package/dist/google-workspace-connectors.js +7 -7
- package/dist/google-workspace-connectors.js.map +1 -1
- package/dist/heartbeat-inbox.d.ts +5 -0
- package/dist/heartbeat-inbox.d.ts.map +1 -0
- package/dist/heartbeat-inbox.js +10 -0
- package/dist/heartbeat-inbox.js.map +1 -0
- package/dist/index.d.ts +26 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -3
- package/dist/index.js.map +1 -1
- package/dist/issue-thread-interactions.test.js +53 -0
- package/dist/issue-thread-interactions.test.js.map +1 -1
- package/dist/memory-connectors.d.ts +5 -0
- package/dist/memory-connectors.d.ts.map +1 -0
- package/dist/memory-connectors.js +6 -0
- package/dist/memory-connectors.js.map +1 -0
- package/dist/memory-connectors.test.d.ts +2 -0
- package/dist/memory-connectors.test.d.ts.map +1 -0
- package/dist/memory-connectors.test.js +33 -0
- package/dist/memory-connectors.test.js.map +1 -0
- package/dist/question-set.d.ts +4 -0
- package/dist/question-set.d.ts.map +1 -0
- package/dist/question-set.js +48 -0
- package/dist/question-set.js.map +1 -0
- package/dist/remote-mcp-connectors.test.js +4 -4
- package/dist/remote-mcp-connectors.test.js.map +1 -1
- package/dist/self-serve-mcp-research.json +7 -2
- package/dist/settings-visibility-catalog-growth.test.d.ts +2 -0
- package/dist/settings-visibility-catalog-growth.test.d.ts.map +1 -0
- package/dist/settings-visibility-catalog-growth.test.js +15 -0
- package/dist/settings-visibility-catalog-growth.test.js.map +1 -0
- package/dist/settings-visibility.d.ts +13 -5
- package/dist/settings-visibility.d.ts.map +1 -1
- package/dist/settings-visibility.js +27 -5
- package/dist/settings-visibility.js.map +1 -1
- package/dist/settings-visibility.test.js +37 -0
- package/dist/settings-visibility.test.js.map +1 -1
- package/dist/slack-tools.d.ts +57 -3
- package/dist/slack-tools.d.ts.map +1 -1
- package/dist/slack-tools.js +25 -4
- package/dist/slack-tools.js.map +1 -1
- package/dist/telemetry/generated/paperclip-telemetry.d.ts +3 -0
- package/dist/telemetry/generated/paperclip-telemetry.d.ts.map +1 -1
- package/dist/telemetry/generated/paperclip-telemetry.js.map +1 -1
- package/dist/types/agent.d.ts +67 -1
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js.map +1 -1
- package/dist/types/app-definition.d.ts +5 -0
- package/dist/types/app-definition.d.ts.map +1 -1
- package/dist/types/asset.d.ts +1 -0
- package/dist/types/asset.d.ts.map +1 -1
- package/dist/types/company-skill.d.ts +6 -0
- package/dist/types/company-skill.d.ts.map +1 -1
- package/dist/types/connection-intent.d.ts +27 -1
- package/dist/types/connection-intent.d.ts.map +1 -1
- package/dist/types/email.d.ts +13 -0
- package/dist/types/email.d.ts.map +1 -1
- package/dist/types/execution-continuation.d.ts +5 -0
- package/dist/types/execution-continuation.d.ts.map +1 -1
- package/dist/types/execution-projection.d.ts +9 -0
- package/dist/types/execution-projection.d.ts.map +1 -1
- package/dist/types/execution-projection.js.map +1 -1
- package/dist/types/index.d.ts +4 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/instance.d.ts +6 -2
- package/dist/types/instance.d.ts.map +1 -1
- package/dist/types/instance.js.map +1 -1
- package/dist/types/issue.d.ts +39 -2
- package/dist/types/issue.d.ts.map +1 -1
- package/dist/types/plugin.d.ts +12 -0
- package/dist/types/plugin.d.ts.map +1 -1
- package/dist/types/project.d.ts +16 -0
- package/dist/types/project.d.ts.map +1 -1
- package/dist/types/skill-source.d.ts +135 -0
- package/dist/types/skill-source.d.ts.map +1 -0
- package/dist/types/skill-source.js +2 -0
- package/dist/types/skill-source.js.map +1 -0
- package/dist/types/tool-access.d.ts +3 -0
- package/dist/types/tool-access.d.ts.map +1 -1
- package/dist/types/tool-access.js.map +1 -1
- package/dist/validators/agent.d.ts +38 -11
- package/dist/validators/agent.d.ts.map +1 -1
- package/dist/validators/agent.js +15 -4
- package/dist/validators/agent.js.map +1 -1
- package/dist/validators/app-definition.d.ts +19 -0
- package/dist/validators/app-definition.d.ts.map +1 -1
- package/dist/validators/app-definition.js +13 -2
- package/dist/validators/app-definition.js.map +1 -1
- package/dist/validators/artifact.d.ts +1 -0
- package/dist/validators/artifact.d.ts.map +1 -1
- package/dist/validators/artifact.js +2 -0
- package/dist/validators/artifact.js.map +1 -1
- package/dist/validators/company-portability.d.ts +24 -0
- package/dist/validators/company-portability.d.ts.map +1 -1
- package/dist/validators/company-skill.d.ts +27 -0
- package/dist/validators/company-skill.d.ts.map +1 -1
- package/dist/validators/company-skill.js +8 -0
- package/dist/validators/company-skill.js.map +1 -1
- package/dist/validators/connection-intent.d.ts +5 -0
- package/dist/validators/connection-intent.d.ts.map +1 -1
- package/dist/validators/connection-intent.js +6 -1
- package/dist/validators/connection-intent.js.map +1 -1
- package/dist/validators/connection-intent.test.js +22 -0
- package/dist/validators/connection-intent.test.js.map +1 -1
- package/dist/validators/email.d.ts +5 -0
- package/dist/validators/email.d.ts.map +1 -1
- package/dist/validators/email.js +4 -0
- package/dist/validators/email.js.map +1 -1
- package/dist/validators/index.d.ts +4 -2
- package/dist/validators/index.d.ts.map +1 -1
- package/dist/validators/index.js +4 -2
- package/dist/validators/index.js.map +1 -1
- package/dist/validators/instance.d.ts +9 -2
- package/dist/validators/instance.d.ts.map +1 -1
- package/dist/validators/instance.js +5 -2
- package/dist/validators/instance.js.map +1 -1
- package/dist/validators/issue.d.ts +274 -7
- package/dist/validators/issue.d.ts.map +1 -1
- package/dist/validators/issue.js +81 -10
- package/dist/validators/issue.js.map +1 -1
- package/dist/validators/issue.test.js +10 -1
- package/dist/validators/issue.test.js.map +1 -1
- package/dist/validators/plugin.d.ts +11 -0
- package/dist/validators/plugin.d.ts.map +1 -1
- package/dist/validators/plugin.js +5 -0
- package/dist/validators/plugin.js.map +1 -1
- package/dist/validators/plugin.test.js +14 -0
- package/dist/validators/plugin.test.js.map +1 -1
- package/dist/validators/project.d.ts +4 -0
- package/dist/validators/project.d.ts.map +1 -1
- package/dist/validators/project.js +4 -0
- package/dist/validators/project.js.map +1 -1
- package/dist/validators/skill-source.d.ts +29 -0
- package/dist/validators/skill-source.d.ts.map +1 -0
- package/dist/validators/skill-source.js +26 -0
- package/dist/validators/skill-source.js.map +1 -0
- package/dist/validators/tool-access.d.ts +35 -0
- package/dist/validators/tool-access.d.ts.map +1 -1
- package/dist/validators/tool-access.js +4 -0
- package/dist/validators/tool-access.js.map +1 -1
- package/dist/workspace-restore.d.ts +8 -0
- package/dist/workspace-restore.d.ts.map +1 -0
- package/dist/workspace-restore.js +28 -0
- package/dist/workspace-restore.js.map +1 -0
- package/dist/worktree-port-registry.test.js +162 -31
- package/dist/worktree-port-registry.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import { isRemoteMcpConnectorId, } from "./remote-mcp-connectors.js";
|
|
2
|
+
import composioCatalog from "./composio-search-catalog.json" with { type: "json" };
|
|
3
|
+
import arcadeCatalog from "./arcade-app-catalog.json" with { type: "json" };
|
|
4
|
+
import { aggregatorAppIdentity } from "./aggregator-app-catalog.js";
|
|
5
|
+
import { prepareConnectionSearch, scoreConnectionSearch } from "./connection-search.js";
|
|
6
|
+
export const AGGREGATOR_PRIORITY = [
|
|
7
|
+
"composio",
|
|
8
|
+
"arcade",
|
|
9
|
+
"executor",
|
|
10
|
+
"zapier",
|
|
11
|
+
];
|
|
12
|
+
export const AGGREGATOR_NAMES = {
|
|
13
|
+
composio: "Composio",
|
|
14
|
+
arcade: "Arcade",
|
|
15
|
+
executor: "Executor",
|
|
16
|
+
zapier: "Zapier",
|
|
17
|
+
};
|
|
18
|
+
/** Reviewed public catalog snapshot, not a claim that an account has authorized an app.
|
|
19
|
+
* Add only services confirmed in the cited official catalog. No provider credentials.
|
|
20
|
+
* Executor has no universal app catalog: use the authorized workspace's indexed tools.
|
|
21
|
+
*/
|
|
22
|
+
const REVIEWED_AGGREGATOR_SUPPORT = [
|
|
23
|
+
{
|
|
24
|
+
slug: "hubspot",
|
|
25
|
+
name: "HubSpot",
|
|
26
|
+
aliases: ["hub spot"],
|
|
27
|
+
providers: {
|
|
28
|
+
composio: "2026-09-23",
|
|
29
|
+
arcade: "2026-09-23",
|
|
30
|
+
zapier: "2026-09-23",
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
slug: "salesforce",
|
|
35
|
+
name: "Salesforce",
|
|
36
|
+
aliases: [],
|
|
37
|
+
providers: {
|
|
38
|
+
composio: "2026-09-23",
|
|
39
|
+
arcade: "2026-09-23",
|
|
40
|
+
zapier: "2026-09-23",
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
slug: "ashby",
|
|
45
|
+
name: "Ashby",
|
|
46
|
+
aliases: [],
|
|
47
|
+
providers: { composio: "2026-09-23", arcade: "2026-09-23" },
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
slug: "pipedrive",
|
|
51
|
+
name: "Pipedrive",
|
|
52
|
+
aliases: [],
|
|
53
|
+
providers: { composio: "2026-09-23", zapier: "2026-09-23" },
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
slug: "gong",
|
|
57
|
+
name: "Gong",
|
|
58
|
+
aliases: [],
|
|
59
|
+
providers: { composio: "2026-09-23" },
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
slug: "outlook",
|
|
63
|
+
name: "Outlook",
|
|
64
|
+
aliases: ["microsoft outlook"],
|
|
65
|
+
providers: {
|
|
66
|
+
composio: "2026-09-23",
|
|
67
|
+
arcade: "2026-09-23",
|
|
68
|
+
zapier: "2026-09-23",
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
slug: "microsoft-teams",
|
|
73
|
+
name: "Microsoft Teams",
|
|
74
|
+
aliases: ["teams"],
|
|
75
|
+
providers: {
|
|
76
|
+
composio: "2026-09-23",
|
|
77
|
+
arcade: "2026-09-23",
|
|
78
|
+
zapier: "2026-09-23",
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
slug: "firecrawl",
|
|
83
|
+
name: "Firecrawl",
|
|
84
|
+
aliases: [],
|
|
85
|
+
providers: { composio: "2026-09-23", arcade: "2026-09-23" },
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
slug: "tavily",
|
|
89
|
+
name: "Tavily",
|
|
90
|
+
aliases: [],
|
|
91
|
+
providers: { composio: "2026-09-23", arcade: "2026-09-23" },
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
slug: "exa",
|
|
95
|
+
name: "Exa",
|
|
96
|
+
aliases: [],
|
|
97
|
+
providers: { composio: "2026-09-23", arcade: "2026-09-23" },
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
slug: "jira",
|
|
101
|
+
name: "Jira",
|
|
102
|
+
aliases: ["atlassian jira"],
|
|
103
|
+
providers: {
|
|
104
|
+
composio: "2026-09-23",
|
|
105
|
+
arcade: "2026-09-23",
|
|
106
|
+
zapier: "2026-09-23",
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
slug: "notion",
|
|
111
|
+
name: "Notion",
|
|
112
|
+
aliases: [],
|
|
113
|
+
providers: {
|
|
114
|
+
composio: "2026-09-23",
|
|
115
|
+
arcade: "2026-09-23",
|
|
116
|
+
zapier: "2026-09-23",
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
slug: "github",
|
|
121
|
+
name: "GitHub",
|
|
122
|
+
aliases: ["git hub"],
|
|
123
|
+
providers: {
|
|
124
|
+
composio: "2026-09-23",
|
|
125
|
+
arcade: "2026-09-23",
|
|
126
|
+
zapier: "2026-09-23",
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
slug: "gmail",
|
|
131
|
+
name: "Gmail",
|
|
132
|
+
aliases: ["google mail"],
|
|
133
|
+
providers: {
|
|
134
|
+
composio: "2026-09-23",
|
|
135
|
+
arcade: "2026-09-23",
|
|
136
|
+
zapier: "2026-09-23",
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
slug: "slack",
|
|
141
|
+
name: "Slack",
|
|
142
|
+
aliases: [],
|
|
143
|
+
providers: {
|
|
144
|
+
composio: "2026-09-23",
|
|
145
|
+
arcade: "2026-09-23",
|
|
146
|
+
zapier: "2026-09-23",
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
slug: "airtable",
|
|
151
|
+
name: "Airtable",
|
|
152
|
+
aliases: [],
|
|
153
|
+
providers: {
|
|
154
|
+
composio: "2026-09-23",
|
|
155
|
+
arcade: "2026-09-23",
|
|
156
|
+
zapier: "2026-09-23",
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
slug: "asana",
|
|
161
|
+
name: "Asana",
|
|
162
|
+
aliases: [],
|
|
163
|
+
providers: {
|
|
164
|
+
composio: "2026-09-23",
|
|
165
|
+
arcade: "2026-09-23",
|
|
166
|
+
zapier: "2026-09-23",
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
slug: "linear",
|
|
171
|
+
name: "Linear",
|
|
172
|
+
aliases: [],
|
|
173
|
+
providers: {
|
|
174
|
+
composio: "2026-09-23",
|
|
175
|
+
arcade: "2026-09-23",
|
|
176
|
+
zapier: "2026-09-23",
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
];
|
|
180
|
+
// Keep the other providers' reviewed support claims, and cover the complete
|
|
181
|
+
// public Composio catalog instead of maintaining a tiny app-name allowlist.
|
|
182
|
+
export const AGGREGATOR_SUPPORT_INDEX = REVIEWED_AGGREGATOR_SUPPORT.map(entry => ({ ...entry }));
|
|
183
|
+
for (const [toolkit, name] of composioCatalog.toolkits) {
|
|
184
|
+
const slug = toolkit.replaceAll("_", "-").replace(/^-+/, "");
|
|
185
|
+
const evidenceUrl = `https://docs.composio.dev/toolkits/${toolkit}`;
|
|
186
|
+
const existing = AGGREGATOR_SUPPORT_INDEX.find(entry => entry.slug === slug
|
|
187
|
+
|| (toolkit.endsWith("_mcp") && entry.slug === slug.slice(0, -4)));
|
|
188
|
+
if (existing) {
|
|
189
|
+
existing.aliases = [...new Set([...existing.aliases, toolkit, name])];
|
|
190
|
+
existing.providers = { ...existing.providers, composio: composioCatalog.verifiedAt };
|
|
191
|
+
existing.evidenceUrls ??= { composio: evidenceUrl };
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
AGGREGATOR_SUPPORT_INDEX.push({ slug, name,
|
|
195
|
+
aliases: [toolkit, name.replace(/ MCP$/i, "")],
|
|
196
|
+
providers: { composio: composioCatalog.verifiedAt },
|
|
197
|
+
evidenceUrls: { composio: evidenceUrl },
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
for (const app of arcadeCatalog.apps) {
|
|
202
|
+
const existing = AGGREGATOR_SUPPORT_INDEX.find((entry) => entry.slug === app.slug || aggregatorAppIdentity(entry.name) === aggregatorAppIdentity(app.name));
|
|
203
|
+
if (existing) {
|
|
204
|
+
existing.aliases = [...new Set([...existing.aliases, app.slug, ...app.aliases])];
|
|
205
|
+
existing.providers = { ...existing.providers, arcade: arcadeCatalog.verifiedAt };
|
|
206
|
+
existing.evidenceUrls = { ...existing.evidenceUrls, arcade: app.docsUrl };
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
AGGREGATOR_SUPPORT_INDEX.push({ slug: app.slug, name: app.name, aliases: app.aliases,
|
|
210
|
+
providers: { arcade: arcadeCatalog.verifiedAt }, evidenceUrls: { arcade: app.docsUrl } });
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
export function searchAggregatorServices(query) {
|
|
214
|
+
const prepared = typeof query === "string" ? prepareConnectionSearch(query) : query;
|
|
215
|
+
return AGGREGATOR_SUPPORT_INDEX.map(service => ({ service,
|
|
216
|
+
...scoreConnectionSearch(prepared, [service.slug, service.name, ...service.aliases]),
|
|
217
|
+
})).filter(match => match.nameScore > 0 && !isRemoteMcpConnectorId(match.service.slug))
|
|
218
|
+
.sort((a, b) => b.score - a.score || a.service.slug.localeCompare(b.service.slug));
|
|
219
|
+
}
|
|
220
|
+
export const AGGREGATOR_CATALOG_SOURCES = {
|
|
221
|
+
composio: "https://composio.dev/toolkits",
|
|
222
|
+
arcade: "https://docs.arcade.dev/en/resources/integrations",
|
|
223
|
+
zapier: "https://zapier.com/apps",
|
|
224
|
+
};
|
|
225
|
+
export function normalizeConnectionQuery(value) {
|
|
226
|
+
return value
|
|
227
|
+
.toLocaleLowerCase()
|
|
228
|
+
.replace(/[^\p{L}\p{N}]+/gu, " ")
|
|
229
|
+
.trim();
|
|
230
|
+
}
|
|
231
|
+
export function findAggregatorService(query, rankedMatches) {
|
|
232
|
+
const normalized = normalizeConnectionQuery(query);
|
|
233
|
+
const exact = AGGREGATOR_SUPPORT_INDEX.find((entry) => [entry.slug, entry.name, ...entry.aliases].some((name) => normalizeConnectionQuery(name) === normalized));
|
|
234
|
+
if (exact)
|
|
235
|
+
return exact;
|
|
236
|
+
// Agents often include the desired capability ("HubSpot recent contacts").
|
|
237
|
+
// Whole phrases avoid substring guesses; multiple named services need clarification.
|
|
238
|
+
const matches = (rankedMatches ?? searchAggregatorServices(query))
|
|
239
|
+
.filter(match => match.nameScore >= 500).map(match => match.service);
|
|
240
|
+
// "Atlassian Jira" identifies Jira, not both Jira and Atlassian's MCP.
|
|
241
|
+
const phrases = (entry) => [entry.slug, entry.name, ...entry.aliases]
|
|
242
|
+
.map(normalizeConnectionQuery).filter(name => ` ${normalized} `.includes(` ${name} `));
|
|
243
|
+
const specific = matches.filter(entry => !matches.some(other => other !== entry
|
|
244
|
+
&& phrases(entry).every(name => phrases(other).some(longer => longer !== name && ` ${longer} `.includes(` ${name} `)))));
|
|
245
|
+
return specific.length === 1 ? specific[0] : undefined;
|
|
246
|
+
}
|
|
247
|
+
/** Preserve a provider explicitly named by the user instead of applying default ranking. */
|
|
248
|
+
export function explicitAggregatorQuery(query) {
|
|
249
|
+
// A trailing exclusion is not a second proposed provider. Keep this grammar
|
|
250
|
+
// narrow; alternatives and contradictory choices still require confirmation.
|
|
251
|
+
const exclusion = query.match(/\s*,?\s+not\s+(composio|arcade|executor|zapier)[.!]?\s*$/i);
|
|
252
|
+
if (exclusion)
|
|
253
|
+
query = query.slice(0, exclusion.index).trim();
|
|
254
|
+
const matches = [
|
|
255
|
+
...query.matchAll(/\b(?:through|via|using)\s+(composio|arcade|executor|zapier)\b/gi),
|
|
256
|
+
];
|
|
257
|
+
const namedProviders = new Set((query.match(/\b(?:composio|arcade|executor|zapier)\b/gi) ?? []).map((name) => name.toLowerCase()));
|
|
258
|
+
if (matches.length !== 1 || namedProviders.size !== 1)
|
|
259
|
+
return null;
|
|
260
|
+
const match = matches[0];
|
|
261
|
+
if (exclusion?.[1]?.toLowerCase() === match[1].toLowerCase())
|
|
262
|
+
return null;
|
|
263
|
+
return {
|
|
264
|
+
provider: match[1].toLowerCase(),
|
|
265
|
+
serviceQuery: (query.slice(0, match.index) + query.slice(match.index + match[0].length)).trim(),
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
export function parseAggregatorRoute(service) {
|
|
269
|
+
const parts = service.split(":");
|
|
270
|
+
if (parts.length !== 3 ||
|
|
271
|
+
parts[0] !== "via" ||
|
|
272
|
+
!isRemoteMcpConnectorId(parts[1]) ||
|
|
273
|
+
!/^[a-z0-9][a-z0-9-]{0,79}$/.test(parts[2]))
|
|
274
|
+
return null;
|
|
275
|
+
return { provider: parts[1], targetService: parts[2] };
|
|
276
|
+
}
|
|
277
|
+
export function aggregatorProviderQuestion(targetService, targetName, results) {
|
|
278
|
+
return {
|
|
279
|
+
id: `connection-provider:${targetService}`,
|
|
280
|
+
// Keep required disclosure in the prompt: all question transports preserve it.
|
|
281
|
+
prompt: `Connect ${targetName} through an external service? These services handle the connection and requests to ${targetName}. Connecting a provider does not yet authorize ${targetName}.`,
|
|
282
|
+
selectionMode: "single",
|
|
283
|
+
required: true,
|
|
284
|
+
allowOther: false,
|
|
285
|
+
options: [
|
|
286
|
+
...results.map((result, index) => ({
|
|
287
|
+
id: result.service,
|
|
288
|
+
label: `${AGGREGATOR_NAMES[result.aggregator.provider]}${index === 0 ? " — Recommended" : ""}`,
|
|
289
|
+
description: result.reason ?? "Verify the app in this external provider.",
|
|
290
|
+
})),
|
|
291
|
+
{
|
|
292
|
+
id: "none",
|
|
293
|
+
label: "None for now",
|
|
294
|
+
description: "Do not connect through an external service.",
|
|
295
|
+
},
|
|
296
|
+
],
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
export function aggregatorContinuationInstruction(provider, targetName) {
|
|
300
|
+
const name = AGGREGATOR_NAMES[provider];
|
|
301
|
+
const discovery = {
|
|
302
|
+
composio: "Use COMPOSIO_SEARCH_TOOLS to verify the requested app and capability, then COMPOSIO_MANAGE_CONNECTIONS if app authorization is needed.",
|
|
303
|
+
arcade: "Inspect the gateway tools for the requested app. If absent, ask the user to add the app's tools in the Arcade gateway and refresh the connection. Follow tool authorization links when required.",
|
|
304
|
+
executor: "Inspect the Executor workspace's actual integrations using its documented discovery tools. Do not assume arbitrary apps exist or register integrations merely to search. Follow provider authorization and resume instructions when needed.",
|
|
305
|
+
zapier: "In Agentic mode, use discover_zapier_actions and the documented app connection flow. In Managed mode, ask the user to add the required actions in Zapier and refresh the catalog.",
|
|
306
|
+
}[provider];
|
|
307
|
+
return `${name} is an external service. Its connection is available to this agent, but ${targetName} access is not yet verified. ${discovery} Use only the requested capability and effective permissions. If support is absent, explain that result and ask before switching providers. Claim success only after verifying the underlying app; never repeat an uncertain write.`;
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=connection-routing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-routing.js","sourceRoot":"","sources":["../src/connection-routing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-routing.test.d.ts","sourceRoot":"","sources":["../src/connection-routing.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { AGGREGATOR_PRIORITY, AGGREGATOR_SUPPORT_INDEX, explicitAggregatorQuery, findAggregatorService, parseAggregatorRoute, aggregatorProviderQuestion, aggregatorContinuationInstruction, } from "./connection-routing.js";
|
|
3
|
+
describe("aggregator routing contract", () => {
|
|
4
|
+
it("ranks providers and resolves aliases without fuzzy service claims", () => {
|
|
5
|
+
expect(AGGREGATOR_PRIORITY).toEqual([
|
|
6
|
+
"composio",
|
|
7
|
+
"arcade",
|
|
8
|
+
"executor",
|
|
9
|
+
"zapier",
|
|
10
|
+
]);
|
|
11
|
+
expect(findAggregatorService(" Hub Spot ")?.slug).toBe("hubspot");
|
|
12
|
+
expect(findAggregatorService("my unknown crm")).toBeUndefined();
|
|
13
|
+
});
|
|
14
|
+
it("rejects forged or unbounded route identifiers", () => {
|
|
15
|
+
expect(parseAggregatorRoute("via:arcade:hubspot")).toEqual({
|
|
16
|
+
provider: "arcade",
|
|
17
|
+
targetService: "hubspot",
|
|
18
|
+
});
|
|
19
|
+
for (const value of [
|
|
20
|
+
"via:other:hubspot",
|
|
21
|
+
"via:composio:https://evil",
|
|
22
|
+
"via:composio:../secret",
|
|
23
|
+
"via:executor:",
|
|
24
|
+
])
|
|
25
|
+
expect(parseAggregatorRoute(value)).toBeNull();
|
|
26
|
+
});
|
|
27
|
+
it("always discloses external handling and offers None even with one provider", () => {
|
|
28
|
+
const results = [
|
|
29
|
+
{
|
|
30
|
+
service: "via:composio:hubspot",
|
|
31
|
+
aggregator: { provider: "composio" },
|
|
32
|
+
reason: "Verify app authorization",
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
const question = aggregatorProviderQuestion("hubspot", "HubSpot", results);
|
|
36
|
+
expect(question.prompt).toContain("external service");
|
|
37
|
+
expect(question.prompt).toContain("handle the connection and requests");
|
|
38
|
+
expect(question.options.map((option) => option.id)).toEqual([
|
|
39
|
+
"via:composio:hubspot",
|
|
40
|
+
"none",
|
|
41
|
+
]);
|
|
42
|
+
expect(question.selectionMode).toBe("single");
|
|
43
|
+
expect(question.allowOther).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
it.each(AGGREGATOR_PRIORITY)("does not claim underlying app readiness for %s", (provider) => {
|
|
46
|
+
expect(aggregatorContinuationInstruction(provider, "HubSpot")).toContain("HubSpot access is not yet verified");
|
|
47
|
+
expect(aggregatorContinuationInstruction(provider, "HubSpot")).toContain("ask before switching providers");
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
it("recognizes a service in capability searches without guessing ambiguous or partial names", () => {
|
|
51
|
+
expect(findAggregatorService("HubSpot recent contacts")?.slug).toBe("hubspot");
|
|
52
|
+
expect(findAggregatorService("connect atlassian jira and read issues")?.slug).toBe("jira");
|
|
53
|
+
expect(findAggregatorService("HubSpot and Salesforce contacts")).toBeUndefined();
|
|
54
|
+
expect(findAggregatorService("notionally similar")).toBeUndefined();
|
|
55
|
+
});
|
|
56
|
+
it("keeps dates per app/provider claim and parses only an unambiguous explicit provider", () => {
|
|
57
|
+
for (const app of AGGREGATOR_SUPPORT_INDEX)
|
|
58
|
+
for (const date of Object.values(app.providers))
|
|
59
|
+
expect(date).toMatch(/^\d{4}-\d{2}-\d{2}$/);
|
|
60
|
+
expect(explicitAggregatorQuery("HubSpot through Arcade")).toEqual({
|
|
61
|
+
provider: "arcade",
|
|
62
|
+
serviceQuery: "HubSpot",
|
|
63
|
+
});
|
|
64
|
+
expect(explicitAggregatorQuery("HubSpot via Arcade or via Composio")).toBeNull();
|
|
65
|
+
expect(explicitAggregatorQuery("arcade games")).toBeNull();
|
|
66
|
+
expect(explicitAggregatorQuery("HubSpot via Arcade or Composio")).toBeNull();
|
|
67
|
+
expect(explicitAggregatorQuery("Jira via Arcade, not Zapier")).toEqual({
|
|
68
|
+
provider: "arcade",
|
|
69
|
+
serviceQuery: "Jira",
|
|
70
|
+
});
|
|
71
|
+
expect(explicitAggregatorQuery("Jira via Arcade, not Arcade")).toBeNull();
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=connection-routing.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-routing.test.js","sourceRoot":"","sources":["../src/connection-routing.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Retrieval only. A fuzzy match is never evidence of authorization or consent. */
|
|
2
|
+
export declare function normalizeConnectionSearch(value: string): string;
|
|
3
|
+
/** Reuse normalized words and deduplicated name windows across a catalog scan. */
|
|
4
|
+
export declare function prepareConnectionSearch(query: string): {
|
|
5
|
+
normalized: string;
|
|
6
|
+
compact: string;
|
|
7
|
+
phrases: Set<string>;
|
|
8
|
+
phrasesByLength: Map<number, Set<string>>;
|
|
9
|
+
terms: string[];
|
|
10
|
+
};
|
|
11
|
+
export declare function scoreConnectionSearch(query: string | ReturnType<typeof prepareConnectionSearch>, names: readonly string[], description?: string): {
|
|
12
|
+
score: number;
|
|
13
|
+
nameScore: number;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=connection-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-search.d.ts","sourceRoot":"","sources":["../src/connection-search.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG/D;AAKD,kFAAkF;AAClF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM;;;;;;EAkBpD;AAaD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,WAAW,SAAK;;;EA+B3I"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/** Retrieval only. A fuzzy match is never evidence of authorization or consent. */
|
|
2
|
+
export function normalizeConnectionSearch(value) {
|
|
3
|
+
return value.normalize("NFKD").replace(/\p{M}/gu, "").toLowerCase().replace(/['’]s\b/g, "")
|
|
4
|
+
.replace(/[^\p{L}\p{N}]+/gu, " ").trim();
|
|
5
|
+
}
|
|
6
|
+
const STOP_WORDS = new Set("a an and are as at be by can connect connection connections do find for from get help i in is it me my need not of on or our please real service services so some that the their them there this to tool tools use want we with would you your".split(" "));
|
|
7
|
+
const GENERIC_NAMES = new Set([...STOP_WORDS, "contacts", "email"]);
|
|
8
|
+
/** Reuse normalized words and deduplicated name windows across a catalog scan. */
|
|
9
|
+
export function prepareConnectionSearch(query) {
|
|
10
|
+
const normalized = normalizeConnectionSearch(query);
|
|
11
|
+
const words = normalized ? normalized.split(" ") : [];
|
|
12
|
+
const phrases = new Set();
|
|
13
|
+
const phrasesByLength = new Map();
|
|
14
|
+
for (let start = 0; start < words.length; start++) {
|
|
15
|
+
let phrase = "";
|
|
16
|
+
for (let size = 1; size <= 6 && start + size <= words.length; size++) {
|
|
17
|
+
phrase += words[start + size - 1];
|
|
18
|
+
phrases.add(phrase);
|
|
19
|
+
const bucket = phrasesByLength.get(phrase.length) ?? new Set();
|
|
20
|
+
bucket.add(phrase);
|
|
21
|
+
phrasesByLength.set(phrase.length, bucket);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return { normalized, compact: words.join(""), phrases, phrasesByLength,
|
|
25
|
+
terms: [...new Set(words.filter(word => word.length > 1 && !STOP_WORDS.has(word)))],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function oneEditApart(a, b) {
|
|
29
|
+
if (Math.abs(a.length - b.length) > 1)
|
|
30
|
+
return false;
|
|
31
|
+
let i = 0;
|
|
32
|
+
while (i < Math.min(a.length, b.length) && a[i] === b[i])
|
|
33
|
+
i++;
|
|
34
|
+
if (a.length === b.length) {
|
|
35
|
+
return a.slice(i + 1) === b.slice(i + 1)
|
|
36
|
+
|| (a[i] === b[i + 1] && a[i + 1] === b[i] && a.slice(i + 2) === b.slice(i + 2));
|
|
37
|
+
}
|
|
38
|
+
return a.length > b.length ? a.slice(i + 1) === b.slice(i) : a.slice(i) === b.slice(i + 1);
|
|
39
|
+
}
|
|
40
|
+
export function scoreConnectionSearch(query, names, description = "") {
|
|
41
|
+
const prepared = typeof query === "string" ? prepareConnectionSearch(query) : query;
|
|
42
|
+
const { normalized } = prepared;
|
|
43
|
+
if (!normalized)
|
|
44
|
+
return { score: 1, nameScore: 0 };
|
|
45
|
+
let nameScore = 0;
|
|
46
|
+
for (const name of names) {
|
|
47
|
+
const normalizedName = normalizeConnectionSearch(name);
|
|
48
|
+
const compact = normalizedName.replaceAll(" ", "");
|
|
49
|
+
if (!compact)
|
|
50
|
+
continue;
|
|
51
|
+
if (compact === prepared.compact) {
|
|
52
|
+
nameScore = 1000;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
if (normalizedName.split(" ").every(word => GENERIC_NAMES.has(word)))
|
|
56
|
+
continue;
|
|
57
|
+
if (prepared.phrases.has(compact)) {
|
|
58
|
+
nameScore = Math.max(nameScore, 500 + compact.length);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (compact.length >= 5 && nameScore < 500) {
|
|
62
|
+
const fuzzy = [compact.length - 1, compact.length, compact.length + 1].some(length => length >= 5 && [...(prepared.phrasesByLength.get(length) ?? [])].some(phrase => oneEditApart(phrase, compact)));
|
|
63
|
+
if (fuzzy)
|
|
64
|
+
nameScore = Math.max(nameScore, 200 + compact.length);
|
|
65
|
+
}
|
|
66
|
+
if (prepared.compact.length >= 4 && compact.startsWith(prepared.compact)) {
|
|
67
|
+
nameScore = Math.max(nameScore, 100 + prepared.compact.length);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const haystack = new Set(normalizeConnectionSearch(description).split(" "));
|
|
71
|
+
const matched = prepared.terms.filter(term => haystack.has(term)
|
|
72
|
+
|| (term.length >= 4 && [...haystack].some(word => word.startsWith(term) || (word.length >= 4 && term.startsWith(word)))));
|
|
73
|
+
return { nameScore, score: nameScore + Math.min(80, matched.length * 5) };
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=connection-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-search.js","sourceRoot":"","sources":["../src/connection-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-search.test.d.ts","sourceRoot":"","sources":["../src/connection-search.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { scoreConnectionSearch } from "./connection-search.js";
|
|
3
|
+
import { AGGREGATOR_SUPPORT_INDEX, searchAggregatorServices } from "./connection-routing.js";
|
|
4
|
+
describe("connection search relevance", () => {
|
|
5
|
+
it.each(["agentmail", "agent mail", "AGENT-MAIL", "Agentmial", "Agentmai", "Agentmaill"])("recognizes a name in a long query: %s", name => {
|
|
6
|
+
expect(scoreConnectionSearch(`Please acquire an email address through ${name} and remember it`, ["AgentMail"]).nameScore).toBeGreaterThan(0);
|
|
7
|
+
});
|
|
8
|
+
it("ranks a named service above generic capability overlap", () => {
|
|
9
|
+
const query = "Help me connect Linear to read project documentation";
|
|
10
|
+
expect(scoreConnectionSearch(query, ["Linear"]).score)
|
|
11
|
+
.toBeGreaterThan(scoreConnectionSearch(query, ["Notion"], "Read project documentation").score);
|
|
12
|
+
});
|
|
13
|
+
it("ignores repeated filler and retains capability matches", () => {
|
|
14
|
+
const base = scoreConnectionSearch("spreadsheets", ["Sheets"], "Read spreadsheets");
|
|
15
|
+
expect(scoreConnectionSearch("please please help me find tools for spreadsheets", ["Sheets"], "Read spreadsheets").score).toBe(base.score);
|
|
16
|
+
});
|
|
17
|
+
it.each(["email", "contacts"])("retains the capability word %s without treating it as a product name", word => {
|
|
18
|
+
expect(scoreConnectionSearch(`Find a connection for ${word}`, ["Workspace"], `Search ${word}`).score).toBeGreaterThan(0);
|
|
19
|
+
expect(scoreConnectionSearch(`Find a connection for ${word}`, [word]).nameScore).toBe(0);
|
|
20
|
+
});
|
|
21
|
+
it("supports a partial name without turning substrings of prose into service claims", () => {
|
|
22
|
+
expect(scoreConnectionSearch("agen", ["AgentMail"]).nameScore).toBeGreaterThan(0);
|
|
23
|
+
expect(scoreConnectionSearch("notionally similar", ["Notion"]).nameScore).toBe(0);
|
|
24
|
+
expect(scoreConnectionSearch("please find tools", ["Findymail"]).nameScore).toBe(0);
|
|
25
|
+
expect(scoreConnectionSearch("our team's projects", ["Teams"]).nameScore).toBe(0);
|
|
26
|
+
});
|
|
27
|
+
it("indexes the public aggregator catalog with valid routes and evidence", () => {
|
|
28
|
+
expect(AGGREGATOR_SUPPORT_INDEX.length).toBeGreaterThan(1000);
|
|
29
|
+
expect(new Set(AGGREGATOR_SUPPORT_INDEX.map(app => app.slug)).size).toBe(AGGREGATOR_SUPPORT_INDEX.length);
|
|
30
|
+
for (const app of AGGREGATOR_SUPPORT_INDEX)
|
|
31
|
+
expect(app.slug).toMatch(/^[a-z0-9][a-z0-9-]{0,79}$/);
|
|
32
|
+
expect(searchAggregatorServices("circle back meeting notes")[0]?.service).toMatchObject({
|
|
33
|
+
slug: "circleback-mcp", evidenceUrls: { composio: "https://docs.composio.dev/toolkits/circleback_mcp" },
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=connection-search.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-search.test.js","sourceRoot":"","sources":["../src/connection-search.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AppDefinition, ConnectionMethodDef } from "./types/app-definition.js";
|
|
2
|
+
/**
|
|
3
|
+
* The four states every connect screen lands in (PAP-659, "one shell, four
|
|
4
|
+
* states").
|
|
5
|
+
*
|
|
6
|
+
* The point of naming them here rather than in the wizard is that two surfaces
|
|
7
|
+
* have to agree: the gallery card decides its verb from the state, and the
|
|
8
|
+
* connect screen decides its body from the same state. When each re-derived it
|
|
9
|
+
* from raw method flags they drifted — a card offering "Connect" for something
|
|
10
|
+
* that then demanded a pasted URL is exactly the inconsistency the ticket is
|
|
11
|
+
* about.
|
|
12
|
+
*
|
|
13
|
+
* - `instant` nothing to supply: connect resolves entirely from the catalog.
|
|
14
|
+
* - `authorize` one click, then the provider's own consent screen.
|
|
15
|
+
* - `paste` one thing the operator has to bring: a key, a URL, a tenant.
|
|
16
|
+
* - `register` the provider cannot issue a client, so one must be registered
|
|
17
|
+
* in its console first. A recovery state, never a normal step.
|
|
18
|
+
*/
|
|
19
|
+
export type ConnectionSetupState = "instant" | "authorize" | "paste" | "register";
|
|
20
|
+
export declare function connectionSetupStateForMethod(method: ConnectionMethodDef | null | undefined): ConnectionSetupState | null;
|
|
21
|
+
export declare function connectionSetupStateForApp(app: AppDefinition | null | undefined, methodKey?: string | null): ConnectionSetupState | null;
|
|
22
|
+
/**
|
|
23
|
+
* The gallery card's verb (PAP-659 C4).
|
|
24
|
+
*
|
|
25
|
+
* Only a method that genuinely wants a secret says so. "Add key" on a connector
|
|
26
|
+
* that actually wants a pasted URL would be worse than the generic verb, so a
|
|
27
|
+
* paste state without credential fields keeps "Connect" — the operator still
|
|
28
|
+
* lands on one screen with one field, which the verb does not need to restate.
|
|
29
|
+
*/
|
|
30
|
+
export declare function connectionSetupVerbForMethod(method: ConnectionMethodDef | null | undefined): "Connect" | "Add key";
|
|
31
|
+
export declare function connectionSetupVerbForApp(app: AppDefinition | null | undefined, methodKey?: string | null): "Connect" | "Add key";
|
|
32
|
+
//# sourceMappingURL=connection-setup-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-setup-state.d.ts","sourceRoot":"","sources":["../src/connection-setup-state.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEpF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,UAAU,CAAC;AAYlF,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,GAC7C,oBAAoB,GAAG,IAAI,CAmB7B;AAwBD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,EACrC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACxB,oBAAoB,GAAG,IAAI,CAE7B;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,GAC7C,SAAS,GAAG,SAAS,CAIvB;AAED,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,EACrC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACxB,SAAS,GAAG,SAAS,CAEvB"}
|