@jskit-ai/connectors-catalog 0.1.67 → 0.2.0

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 (137) hide show
  1. package/CHANGELOG.md +1722 -0
  2. package/README.md +11 -0
  3. package/locales/en.json +3139 -0
  4. package/package.json +7 -6
  5. package/src/server/ai.js +4 -4
  6. package/src/server/amazon-redshift.js +5 -5
  7. package/src/server/apify.js +1 -1
  8. package/src/server/apollo-io.js +1 -1
  9. package/src/server/asana.js +3 -3
  10. package/src/server/ashby.js +3 -3
  11. package/src/server/attention.js +2 -2
  12. package/src/server/aws-athena.js +3 -3
  13. package/src/server/aws-s3.js +1 -1
  14. package/src/server/awsTransport.js +9 -9
  15. package/src/server/brevo.js +3 -3
  16. package/src/server/calendly.js +2 -2
  17. package/src/server/chargebee.js +1 -1
  18. package/src/server/databricks.js +2 -2
  19. package/src/server/dbt-semantic-layer.js +8 -8
  20. package/src/server/elevenlabs.js +4 -4
  21. package/src/server/firebase-cloud-messaging.js +8 -8
  22. package/src/server/firecrawl.js +2 -2
  23. package/src/server/gatewayapi.js +4 -4
  24. package/src/server/github-api.js +3 -3
  25. package/src/server/gitlab-api.js +1 -1
  26. package/src/server/gmail.js +1 -1
  27. package/src/server/gong.js +4 -4
  28. package/src/server/google-ads-search.js +16 -16
  29. package/src/server/google-ads.js +7 -7
  30. package/src/server/google-drive.js +8 -6
  31. package/src/server/google-maps-platform.js +5 -5
  32. package/src/server/google-search-console.js +1 -1
  33. package/src/server/google-sheets.js +3 -2
  34. package/src/server/google.js +3 -2
  35. package/src/server/granola.js +5 -5
  36. package/src/server/hubspot.js +5 -3
  37. package/src/server/inngest.js +4 -4
  38. package/src/server/klipy.js +1 -1
  39. package/src/server/lightspeed.js +4 -4
  40. package/src/server/linear.js +2 -2
  41. package/src/server/linkedin.js +6 -6
  42. package/src/server/mapbox.js +1 -1
  43. package/src/server/mcpRegistration.js +3 -2
  44. package/src/server/mcpTransport.js +1 -1
  45. package/src/server/microsoft-fabric.js +3 -3
  46. package/src/server/microsoft-onedrive.js +1 -1
  47. package/src/server/microsoft-onenote.js +1 -1
  48. package/src/server/microsoft-outlook.js +1 -1
  49. package/src/server/microsoft.js +4 -3
  50. package/src/server/n8n.js +4 -4
  51. package/src/server/oura.js +1 -1
  52. package/src/server/paddle.js +1 -1
  53. package/src/server/pipedrive.js +4 -4
  54. package/src/server/posthog.js +3 -3
  55. package/src/server/salesforce.js +8 -8
  56. package/src/server/semrush.js +25 -25
  57. package/src/server/shopify.js +6 -6
  58. package/src/server/slack.js +10 -10
  59. package/src/server/snowflake.js +5 -5
  60. package/src/server/tally.js +1 -1
  61. package/src/server/telegram.js +1 -1
  62. package/src/server/tiktok.js +14 -14
  63. package/src/server/twilio.js +3 -3
  64. package/src/server/twitch.js +22 -21
  65. package/src/server/wave.js +34 -34
  66. package/src/server/wix.js +73 -73
  67. package/src/server/wiz.js +18 -18
  68. package/src/server/woocommerce.js +23 -23
  69. package/src/server/wordpress-com.js +3 -3
  70. package/src/server/wordpress-self-hosted.js +2 -2
  71. package/src/server/workday.js +3 -3
  72. package/src/server/x-twitter.js +6 -6
  73. package/src/server/xero.js +15 -15
  74. package/src/server/zoho-books.js +8 -8
  75. package/src/server/zoho-crm.js +5 -5
  76. package/src/server/zohoOAuth.js +1 -1
  77. package/src/shared/ai.js +24 -13
  78. package/src/shared/algolia.js +4 -4
  79. package/src/shared/amazon-redshift.js +16 -16
  80. package/src/shared/amplitude.js +6 -6
  81. package/src/shared/atlassian.js +19 -19
  82. package/src/shared/aws.js +18 -18
  83. package/src/shared/canva.js +18 -18
  84. package/src/shared/chargebee.js +3 -3
  85. package/src/shared/clickhouse.js +9 -9
  86. package/src/shared/confidence.js +6 -6
  87. package/src/shared/databricks.js +8 -8
  88. package/src/shared/dbt-semantic-layer.js +7 -7
  89. package/src/shared/english-ai.js +6 -0
  90. package/src/shared/english-definitions.js +34 -0
  91. package/src/shared/english-texts.js +7 -0
  92. package/src/shared/figma.js +2 -2
  93. package/src/shared/firebase-cloud-messaging.js +11 -11
  94. package/src/shared/firecrawl.js +1 -1
  95. package/src/shared/gemini-enterprise.js +7 -7
  96. package/src/shared/gong.js +5 -5
  97. package/src/shared/google-ads.js +5 -5
  98. package/src/shared/google-maps-platform.js +7 -7
  99. package/src/shared/google.js +40 -40
  100. package/src/shared/granola.js +5 -5
  101. package/src/shared/hex.js +7 -7
  102. package/src/shared/inngest.js +8 -8
  103. package/src/shared/lightspeed.js +52 -52
  104. package/src/shared/linkedin.js +6 -6
  105. package/src/shared/logo-dev.js +3 -3
  106. package/src/shared/mapbox.js +6 -6
  107. package/src/shared/mcp.js +9 -9
  108. package/src/shared/microsoft-fabric.js +9 -9
  109. package/src/shared/microsoft.js +52 -52
  110. package/src/shared/miro.js +5 -5
  111. package/src/shared/oura.js +5 -5
  112. package/src/shared/posthog.js +9 -9
  113. package/src/shared/prestashop.js +5 -5
  114. package/src/shared/resend.js +1 -1
  115. package/src/shared/salesforce.js +8 -8
  116. package/src/shared/semrush.js +6 -6
  117. package/src/shared/shopify.js +26 -26
  118. package/src/shared/slack.js +61 -61
  119. package/src/shared/snowflake.js +15 -15
  120. package/src/shared/tiktok.js +7 -7
  121. package/src/shared/tokens.js +126 -126
  122. package/src/shared/twilio.js +7 -7
  123. package/src/shared/twitch.js +24 -24
  124. package/src/shared/wave.js +33 -33
  125. package/src/shared/wix.js +5 -5
  126. package/src/shared/wiz.js +14 -14
  127. package/src/shared/wordpress-com.js +9 -9
  128. package/src/shared/wordpress.js +11 -11
  129. package/src/shared/workday.js +8 -8
  130. package/src/shared/x-twitter.js +5 -5
  131. package/src/shared/xero.js +25 -25
  132. package/src/shared/zoho-books.js +10 -10
  133. package/src/shared/zoho-crm.js +16 -16
  134. package/src/shared/zoho-regions.js +8 -8
  135. package/test/englishDefinitions.test.js +37 -0
  136. package/test/i18nCatalog.test.js +16 -0
  137. package/test/shopify.test.js +3 -1
@@ -7,7 +7,7 @@ function definition(id, name, description, url, steps) {
7
7
  });
8
8
  }
9
9
 
10
- const airtableDefinition = definition("airtable", "Airtable", "Discover bases, read and edit records, and manage tables and fields.",
10
+ const airtableDefinition = definition("airtable", "Airtable", "jskit.connectors.airtable.description",
11
11
  "https://support.airtable.com/docs/creating-personal-access-tokens", [
12
12
  "Open Airtable Developer hub, then Personal access tokens and Create token.",
13
13
  "Name the token. Choose + Add a scope and add schema.bases:read for discovery, data.records:read for records, data.records:write for record changes, and schema.bases:write only for table/field changes or base creation. Record writes need Editor base access; schema writes need Creator access. Creating a base needs Workspace Creator access and a token resource grant covering that workspace. Otherwise choose + Add a base to select the bases this application needs. Your Airtable account must already have access to them.",
@@ -16,7 +16,7 @@ const airtableDefinition = definition("airtable", "Airtable", "Discover bases, r
16
16
  "Verification lists accessible bases. If expected bases are missing, check the token's resources, schema.bases:read permission and your own base access. Organization API restrictions may require your Airtable administrator to allow access.",
17
17
  "To rotate access, create a replacement PAT with the required scopes and resources, update AIRTABLE_TOKEN in Env, and choose Verify again. Revoke the old token in Airtable after checking other applications that use it. Disconnect here removes this application’s saved connection; it does not revoke the PAT or erase Env."
18
18
  ]);
19
- const notionInternalDefinition = definition("notion", "Notion", "Read, query and update pages and data sources shared with a Notion connection.",
19
+ const notionInternalDefinition = definition("notion", "Notion", "jskit.connectors.notionInternal.description",
20
20
  "https://developers.notion.com/guides/get-started/internal-connections", [
21
21
  "Application data mode reads pages/blocks, queries data sources, creates pages, updates properties and appends blocks. Retrieve the database and its data_sources IDs/schema first. LIMITATIONS: no embedded editor, schema editing, file upload or automatic coding-chat attachment. For example, append meeting notes; your app owns its rendering and write approvals.",
22
22
  "As a Notion workspace owner, open the Developer portal at https://www.notion.so/profile/integrations. In Build → Internal connections, choose Create a new connection, name it for this application and select its workspace.",
@@ -34,11 +34,11 @@ const notionDefinition = Object.freeze({
34
34
  oauthClientAuthenticationMethods: (_grant, settings) => settings?.connectionType === "mcp" ? ["client_secret_post"] : ["client_secret_basic"],
35
35
  accountModesForSettings: (settings) => settings.connectionType === "mcp" ? ["assistant"] : ["shared", "per-user", "assistant"],
36
36
  authenticationMethodsForSettings: (settings) => settings.connectionType === "mcp" ? ["oauth2"] : ["api-key", "oauth2"],
37
- scopesForSettings: (settings) => settings.connectionType === "mcp" ? [{ value: "default", label: "Notion MCP access", required: true }] : [],
37
+ scopesForSettings: (settings) => settings.connectionType === "mcp" ? [{ value: "default", label: "jskit.connectors.notion.scopes.default.label", required: true }] : [],
38
38
  settingsSchema: createSchema({ connectionType: { type: "string", enum: ["rest", "mcp"], defaultTo: "rest" } }),
39
- settingsFields: [{ name: "connectionType", label: "Connection type", credentialScope: (value) => value || "rest",
40
- hint: "Hosted MCP needs its own client registration and consent; REST credentials cannot be reused.",
41
- items: [{ value: "rest", title: "Application data (REST)" }, { value: "mcp", title: "Hosted assistant tools (MCP)" }] }],
39
+ settingsFields: [{ name: "connectionType", label: "jskit.connectors.notion.fields.connectionType.label", credentialScope: (value) => value || "rest",
40
+ hint: "jskit.connectors.notion.fields.connectionType.hint",
41
+ items: [{ value: "rest", title: "jskit.connectors.notion.fields.connectionType.items.rest.title" }, { value: "mcp", title: "jskit.connectors.notion.fields.connectionType.items.mcp.title" }] }],
42
42
  setup: { ...notionInternalDefinition.setup,
43
43
  urlForSettings: (settings) => settings.connectionType === "mcp" ? "https://developers.notion.com/guides/mcp/build-mcp-client" : undefined,
44
44
  urlByAuthentication: { oauth2: "https://developers.notion.com/guides/get-started/public-connections" },
@@ -61,7 +61,7 @@ const notionDefinition = Object.freeze({
61
61
  "Verification searches accessible titles without writing. Missing results can mean pages were not selected or Read content is unavailable. Reconnect for new consent; Disconnect removes the local grant, and provider access must be managed in Notion separately. Your application owns token storage and refresh across hosting changes."
62
62
  ] } }
63
63
  });
64
- const brevoDefinition = definition("brevo", "Brevo", "Send email and SMS, manage contacts and campaigns, and track delivery and automation events.",
64
+ const brevoDefinition = definition("brevo", "Brevo", "jskit.connectors.brevo.description",
65
65
  "https://help.brevo.com/hc/en-us/articles/209467485-Create-and-manage-your-API-keys", [
66
66
  "In Brevo, open the account menu, Settings, SMTP & API, then API Keys & MCP.",
67
67
  "Your Brevo user needs API keys permission. Choose Generate a new API key, name it for this application, select its expiration and choose Generate.",
@@ -72,7 +72,7 @@ const brevoDefinition = definition("brevo", "Brevo", "Send email and SMS, manage
72
72
  "Marketing requires an appropriate recipient list and opt-out handling. Create a campaign draft and send a test before explicitly sending to its lists. A returned message ID is acceptance, not delivery; inspect delivery events for bounces or rejection. Automation events only trigger workflows configured and active in Brevo.",
73
73
  "No OAuth registration or callback URL is needed. Verification reads contacts without sending messages. Replace an expired or lost key in Env and reconnect. Disconnect removes local state only; delete the old key in Brevo to revoke it."
74
74
  ]);
75
- const elevenlabsDefinition = definition("elevenlabs", "ElevenLabs", "Generate speech, discover voices/models and create instant voice clones.",
75
+ const elevenlabsDefinition = definition("elevenlabs", "ElevenLabs", "jskit.connectors.elevenlabs.description",
76
76
  "https://elevenlabs.io/docs/help-center/technical/how-do-i-authorize-myself-using-an-api-key", [
77
77
  "Select the intended ElevenLabs workspace and open Developers > API Keys > Create API Key. Name it for this app and keep Restrict Key enabled.",
78
78
  "Under Endpoints, enable User read for verification, Voices read for discovery, Models read for model selection and Text to Speech for generation. Enable Voices write only if the app will create voice clones. Set a credit limit, create the key and copy it immediately; only its last four characters are shown later.",
@@ -82,7 +82,7 @@ const elevenlabsDefinition = definition("elevenlabs", "ElevenLabs", "Generate sp
82
82
  "This connector returns bounded audio files, not live streaming. Professional Voice Cloning and realtime speech use native provider tools. Your application must explicitly expose approved ElevenLabs operations to its assistant. Rotate keys in Env and verify again; Disconnect removes app state, while Developers > API Keys > key menu revokes provider access. No OAuth application or callback URL is required."
83
83
  ]);
84
84
  const githubApiDefinition = Object.freeze({
85
- ...definition("github-api", "GitHub API", "Read repository content and activity; create and update issues and pull requests.",
85
+ ...definition("github-api", "GitHub API", "jskit.connectors.githubApi.description",
86
86
  "https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app", [
87
87
  "For OAuth, open GitHub Settings > Developer settings > OAuth Apps > New OAuth App. Enter the application name and its hosting URL. Copy Suggested callback URL here into Authorization callback URL, then register the application.",
88
88
  "Copy Client ID here. Generate a client secret and keep it private. Save configuration, then follow the Env links to store the secret and exact callback under their referenced names. Your application backend must implement the callback.",
@@ -96,19 +96,19 @@ const githubApiDefinition = Object.freeze({
96
96
  authenticationMethods: ["oauth2", "api-key"],
97
97
  oauthClientAuthenticationMethods: ["client_secret_post"],
98
98
  scopes: [
99
- { value: "read:user", label: "Read user profile", recommended: true },
100
- { value: "repo", label: "Repositories", recommended: true },
101
- { value: "public_repo", label: "Public repositories" },
102
- { value: "workflow", label: "Workflows" },
103
- { value: "gist", label: "Gists" },
104
- { value: "notifications", label: "Notifications" },
105
- { value: "user:email", label: "Email" },
106
- { value: "read:org", label: "Read organizations" },
107
- { value: "project", label: "Projects" },
108
- { value: "offline_access", label: "Expiring tokens with refresh access" }
99
+ { value: "read:user", label: "jskit.connectors.githubApi.scopes.readUser.label", recommended: true },
100
+ { value: "repo", label: "jskit.connectors.githubApi.scopes.repo.label", recommended: true },
101
+ { value: "public_repo", label: "jskit.connectors.githubApi.scopes.publicRepo.label" },
102
+ { value: "workflow", label: "jskit.connectors.githubApi.scopes.workflow.label" },
103
+ { value: "gist", label: "jskit.connectors.githubApi.scopes.gist.label" },
104
+ { value: "notifications", label: "jskit.connectors.githubApi.scopes.notifications.label" },
105
+ { value: "user:email", label: "jskit.connectors.githubApi.scopes.userEmail.label" },
106
+ { value: "read:org", label: "jskit.connectors.githubApi.scopes.readOrg.label" },
107
+ { value: "project", label: "jskit.connectors.githubApi.scopes.project.label" },
108
+ { value: "offline_access", label: "jskit.connectors.githubApi.scopes.offlineAccess.label" }
109
109
  ]
110
110
  });
111
- const apifyDefinition = definition("apify", "Apify", "Run Actors with explicit limits and retrieve their results.",
111
+ const apifyDefinition = definition("apify", "Apify", "jskit.connectors.apify.description",
112
112
  "https://docs.apify.com/integrations/api", [
113
113
  "Select the intended account or organization in Apify Console.",
114
114
  "Open Settings, API & Integrations, then create an API token for this application.",
@@ -121,7 +121,7 @@ const apifyDefinition = definition("apify", "Apify", "Run Actors with explicit l
121
121
  const calendlyDefinition = Object.freeze({
122
122
  "id": "calendly",
123
123
  "name": "Calendly",
124
- "description": "Read meetings and invitees, check availability, create booking links and manage appointments.",
124
+ "description": "jskit.connectors.calendly.description",
125
125
  "accountModes": [
126
126
  "shared",
127
127
  "assistant"
@@ -136,89 +136,89 @@ const calendlyDefinition = Object.freeze({
136
136
  "scopes": [
137
137
  {
138
138
  "value": "users:read",
139
- "label": "users — read",
139
+ "label": "jskit.connectors.calendly.scopes.usersRead.label",
140
140
  "recommended": true
141
141
  },
142
142
  {
143
143
  "value": "organizations:read",
144
- "label": "organizations — read"
144
+ "label": "jskit.connectors.calendly.scopes.organizationsRead.label"
145
145
  },
146
146
  {
147
147
  "value": "event_types:read",
148
- "label": "event types — read",
148
+ "label": "jskit.connectors.calendly.scopes.eventTypesRead.label",
149
149
  "recommended": true
150
150
  },
151
151
  {
152
152
  "value": "scheduled_events:read",
153
- "label": "scheduled events — read"
153
+ "label": "jskit.connectors.calendly.scopes.scheduledEventsRead.label"
154
154
  },
155
155
  {
156
156
  "value": "availability:read",
157
- "label": "availability — read"
157
+ "label": "jskit.connectors.calendly.scopes.availabilityRead.label"
158
158
  },
159
159
  {
160
160
  "value": "scheduling_links:write",
161
- "label": "scheduling links — write"
161
+ "label": "jskit.connectors.calendly.scopes.schedulingLinksWrite.label"
162
162
  },
163
163
  {
164
164
  "value": "shares:write",
165
- "label": "shares — write"
165
+ "label": "jskit.connectors.calendly.scopes.sharesWrite.label"
166
166
  },
167
167
  {
168
168
  "value": "scheduled_events:write",
169
- "label": "scheduled events — write"
169
+ "label": "jskit.connectors.calendly.scopes.scheduledEventsWrite.label"
170
170
  },
171
171
  {
172
172
  "value": "event_types:write",
173
- "label": "event types — write"
173
+ "label": "jskit.connectors.calendly.scopes.eventTypesWrite.label"
174
174
  },
175
175
  {
176
176
  "value": "availability:write",
177
- "label": "availability — write"
177
+ "label": "jskit.connectors.calendly.scopes.availabilityWrite.label"
178
178
  },
179
179
  {
180
180
  "value": "locations:read",
181
- "label": "locations — read"
181
+ "label": "jskit.connectors.calendly.scopes.locationsRead.label"
182
182
  },
183
183
  {
184
184
  "value": "routing_forms:read",
185
- "label": "routing forms — read"
185
+ "label": "jskit.connectors.calendly.scopes.routingFormsRead.label"
186
186
  },
187
187
  {
188
188
  "value": "groups:read",
189
- "label": "groups — read"
189
+ "label": "jskit.connectors.calendly.scopes.groupsRead.label"
190
190
  },
191
191
  {
192
192
  "value": "organizations:write",
193
- "label": "organizations — write"
193
+ "label": "jskit.connectors.calendly.scopes.organizationsWrite.label"
194
194
  },
195
195
  {
196
196
  "value": "webhooks:read",
197
- "label": "webhooks — read"
197
+ "label": "jskit.connectors.calendly.scopes.webhooksRead.label"
198
198
  },
199
199
  {
200
200
  "value": "webhooks:write",
201
- "label": "webhooks — write"
201
+ "label": "jskit.connectors.calendly.scopes.webhooksWrite.label"
202
202
  },
203
203
  {
204
204
  "value": "activity_log:read",
205
- "label": "activity log — read"
205
+ "label": "jskit.connectors.calendly.scopes.activityLogRead.label"
206
206
  },
207
207
  {
208
208
  "value": "data_compliance:write",
209
- "label": "data compliance — write"
209
+ "label": "jskit.connectors.calendly.scopes.dataComplianceWrite.label"
210
210
  },
211
211
  {
212
212
  "value": "outgoing_communications:read",
213
- "label": "outgoing communications — read"
213
+ "label": "jskit.connectors.calendly.scopes.outgoingCommunicationsRead.label"
214
214
  },
215
215
  {
216
216
  "value": "contacts:read",
217
- "label": "contacts — read"
217
+ "label": "jskit.connectors.calendly.scopes.contactsRead.label"
218
218
  },
219
219
  {
220
220
  "value": "contacts:write",
221
- "label": "contacts — write"
221
+ "label": "jskit.connectors.calendly.scopes.contactsWrite.label"
222
222
  }
223
223
  ],
224
224
  "setup": {
@@ -236,7 +236,7 @@ const calendlyDefinition = Object.freeze({
236
236
  }
237
237
  });
238
238
 
239
- const hubspotKeyDefinition = definition("hubspot", "HubSpot", "Manage contacts, deals and their relationships in the connected HubSpot account.",
239
+ const hubspotKeyDefinition = definition("hubspot", "HubSpot", "jskit.connectors.hubspotKey.description",
240
240
  "https://developers.hubspot.com/docs/apps/legacy-apps/private-apps/overview", [
241
241
  "As a HubSpot super admin, select the account that owns the CRM data. Open Development > Legacy apps > Create legacy app > Private.",
242
242
  "Name the app. In Scopes > Add new scope, select crm.objects.contacts.read for verification. Add crm.objects.contacts.write to manage contacts, crm.objects.deals.read for deals/pipeline IDs, and crm.objects.deals.write to create/update deals and link contacts. Choose Update. Create the app and confirm. In Auth, use Show token > Copy. Use an app access token, not a CLI personal access key or developer API key.",
@@ -249,11 +249,11 @@ const hubspotDefinition = Object.freeze({
249
249
  accountModes: ["shared", "per-user", "assistant"],
250
250
  authenticationMethods: ["api-key", "oauth2"],
251
251
  oauthClientAuthenticationMethods: ["client_secret_post"],
252
- scopes: [{ value: "oauth", label: "Authorize the HubSpot app", recommended: true },
253
- { value: "crm.objects.contacts.read", label: "Read CRM contacts", recommended: true },
254
- { value: "crm.objects.contacts.write", label: "Create and update CRM contacts" },
255
- { value: "crm.objects.deals.read", label: "Read deals and pipelines" },
256
- { value: "crm.objects.deals.write", label: "Create and update CRM deals" }],
252
+ scopes: [{ value: "oauth", label: "jskit.connectors.hubspot.scopes.oauth.label", recommended: true },
253
+ { value: "crm.objects.contacts.read", label: "jskit.connectors.hubspot.scopes.crmObjectsContactsRead.label", recommended: true },
254
+ { value: "crm.objects.contacts.write", label: "jskit.connectors.hubspot.scopes.crmObjectsContactsWrite.label" },
255
+ { value: "crm.objects.deals.read", label: "jskit.connectors.hubspot.scopes.crmObjectsDealsRead.label" },
256
+ { value: "crm.objects.deals.write", label: "jskit.connectors.hubspot.scopes.crmObjectsDealsWrite.label" }],
257
257
  setup: {
258
258
  ...hubspotKeyDefinition.setup,
259
259
  urlByAuthentication: { oauth2: "https://developers.hubspot.com/docs/apps/developer-platform/build-apps/create-an-app" },
@@ -267,7 +267,7 @@ const hubspotDefinition = Object.freeze({
267
267
  ] }
268
268
  }
269
269
  });
270
- const linearKeyDefinition = definition("linear", "Linear", "Read profiles and issues, or use Linear MCP tools with the connected account.",
270
+ const linearKeyDefinition = definition("linear", "Linear", "jskit.connectors.linearKey.description",
271
271
  "https://linear.app/docs/api-and-webhooks", [
272
272
  "In the intended Linear workspace, open Settings > Account > Security & Access > Personal API keys. Create a named key, select Read and restrict it to the teams this application needs. Add the required write permissions only if your application will create or update issues/projects. Copy the key before leaving.",
273
273
  "If key creation is unavailable, ask a workspace administrator to check Settings > Administration > API > Member API keys. Administrators can create keys even when member key creation is disabled.",
@@ -280,11 +280,11 @@ const linearDefinition = Object.freeze({
280
280
  ...linearKeyDefinition,
281
281
  accountModes: ["shared", "per-user", "assistant"], authenticationMethods: ["api-key", "oauth2"],
282
282
  scopes: [
283
- { value: "read", label: "Read your account", recommended: true },
284
- { value: "write", label: "Write on your behalf" },
285
- { value: "issues:create", label: "Create issues and attachments" },
286
- { value: "comments:create", label: "Create comments" },
287
- { value: "timeSchedule:write", label: "Manage time schedules" }
283
+ { value: "read", label: "jskit.connectors.linear.scopes.read.label", recommended: true },
284
+ { value: "write", label: "jskit.connectors.linear.scopes.write.label" },
285
+ { value: "issues:create", label: "jskit.connectors.linear.scopes.issuesCreate.label" },
286
+ { value: "comments:create", label: "jskit.connectors.linear.scopes.commentsCreate.label" },
287
+ { value: "timeSchedule:write", label: "jskit.connectors.linear.scopes.timeScheduleWrite.label" }
288
288
  ],
289
289
  setup: { ...linearKeyDefinition.setup,
290
290
  urlByAuthentication: { oauth2: "https://linear.app/developers/oauth-2-0-authentication" },
@@ -299,7 +299,7 @@ const linearDefinition = Object.freeze({
299
299
  ] }
300
300
  }
301
301
  });
302
- const pipedriveTokenDefinition = definition("pipedrive", "Pipedrive", "Read the authenticated user and identify their Pipedrive company.",
302
+ const pipedriveTokenDefinition = definition("pipedrive", "Pipedrive", "jskit.connectors.pipedriveToken.description",
303
303
  "https://pipedrive.readme.io/docs/how-to-find-the-api-token", [
304
304
  "The adapter lists/reads deals, people, organizations, activities, leads and pipelines, and creates/updates basic records except pipelines. The app must authorize each record and write. LIMITATIONS: no full CRM UI, pipeline administration, bulk import, custom-field editor, attachments, webhooks or automatic coding-chat attachment. For example, create a contact and follow-up deal; the app supplies its sales dashboard.",
305
305
  "Sign into Pipedrive and switch to the company this application should access. The same user has a different API token in each company; a direct settings link may open the company you used most recently.",
@@ -316,7 +316,7 @@ const pipedriveDefinition = Object.freeze({
316
316
  authenticationMethods: ["api-key", "oauth2"],
317
317
  oauthClientAuthenticationMethods: ["client_secret_basic"],
318
318
  settingsSchema: createSchema({ companyDomain: { type: "string", minLength: 1, maxLength: 63, pattern: "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$" } }),
319
- settingsFields: [{ name: "companyDomain", label: "Company domain (API token)", hint: "For acme.pipedrive.com enter acme. Required for API-token CRM operations; OAuth uses the company address returned with consent." }],
319
+ settingsFields: [{ name: "companyDomain", label: "jskit.connectors.pipedrive.fields.companyDomain.label", hint: "jskit.connectors.pipedrive.fields.companyDomain.hint" }],
320
320
  scopes: [],
321
321
  setup: { ...pipedriveTokenDefinition.setup,
322
322
  urlByAuthentication: { oauth2: "https://pipedrive.readme.io/docs/marketplace-registering-a-private-app" },
@@ -332,7 +332,7 @@ const pipedriveDefinition = Object.freeze({
332
332
  }
333
333
  });
334
334
  const gitlabApiDefinition = Object.freeze({
335
- ...definition("gitlab-api", "GitLab API", "Read project content and activity; create and update issues and merge requests.",
335
+ ...definition("gitlab-api", "GitLab API", "jskit.connectors.gitlabApi.description",
336
336
  "https://docs.gitlab.com/integration/oauth_provider/", [
337
337
  "Select your GitLab instance URL; use https://gitlab.com for GitLab.com. For OAuth, open your instance's /user_settings/applications page, add an application and enable Confidential. Enter the exact Suggested callback URL here as its redirect URI and select read_user and read_api.",
338
338
  "Copy Application ID into Client ID here. Save configuration and use the Env links to store the Secret and the same callback under their referenced names. Your application backend must implement the callback. Each user's connection starts in the application's account screen.",
@@ -344,9 +344,9 @@ const gitlabApiDefinition = Object.freeze({
344
344
  accountModes: ["shared", "per-user", "assistant"],
345
345
  authenticationMethods: ["api-key", "oauth2"],
346
346
  oauthClientAuthenticationMethods: ["client_secret_post"],
347
- scopes: [{ value: "read_user", label: "Read user profile", recommended: true },
348
- { value: "read_api", label: "Read API", recommended: true },
349
- { value: "api", label: "Full API access" }],
347
+ scopes: [{ value: "read_user", label: "jskit.connectors.gitlabApi.scopes.readUser.label", recommended: true },
348
+ { value: "read_api", label: "jskit.connectors.gitlabApi.scopes.readApi.label", recommended: true },
349
+ { value: "api", label: "jskit.connectors.gitlabApi.scopes.api.label" }],
350
350
  settingsSchema: createSchema({ instanceUrl: { type: "string", defaultTo: "https://gitlab.com", noTrim: true,
351
351
  validator: (value) => {
352
352
  try {
@@ -355,10 +355,10 @@ const gitlabApiDefinition = Object.freeze({
355
355
  } catch { return "Enter the HTTPS GitLab instance URL."; }
356
356
  }
357
357
  } }),
358
- settingsFields: [{ name: "instanceUrl", label: "Instance URL", placeholder: "https://gitlab.com",
359
- hint: "The trusted GitLab instance that receives this connection's credentials. Defaults to GitLab.com." }]
358
+ settingsFields: [{ name: "instanceUrl", label: "jskit.connectors.gitlabApi.fields.instanceUrl.label", placeholder: "https://gitlab.com",
359
+ hint: "jskit.connectors.gitlabApi.fields.instanceUrl.hint" }]
360
360
  });
361
- const tallyDefinition = definition("tally", "Tally", "Create forms and retrieve submissions using your Tally account.",
361
+ const tallyDefinition = definition("tally", "Tally", "jskit.connectors.tally.description",
362
362
  "https://developers.tally.so/api-reference/api-keys", [
363
363
  "Open Tally Settings, then API keys and Create API key.",
364
364
  "Create the key for the intended user. It inherits that user's resource access; this flow does not offer per-form scopes.",
@@ -369,7 +369,7 @@ const tallyDefinition = definition("tally", "Tally", "Create forms and retrieve
369
369
  "A lost key needs a replacement. Keys stop working when their user leaves the organization; use the account intended to maintain this application's access."
370
370
  ]);
371
371
  const contentfulDefinition = Object.freeze({
372
- ...definition("contentful", "Contentful", "Read published entries, linked assets, content models and locales from a Contentful space.",
372
+ ...definition("contentful", "Contentful", "jskit.connectors.contentful.description",
373
373
  "https://www.contentful.com/developers/docs/references/authentication/", [
374
374
  "Select the intended Contentful space. Open Settings > API keys, Content delivery / preview tokens, then Add API key. Name this application's key.",
375
375
  "Copy its Space ID into Space ID here. Copy the Content Delivery API access token; the Preview token and Content Management token are different credentials.",
@@ -379,7 +379,7 @@ const contentfulDefinition = Object.freeze({
379
379
  "To rotate access, create a replacement delivery token with the same required environment access, update Env and verify before retiring the old key. Disconnect only removes local state, not the Contentful API key. The app renders rich text and images and chooses its own cache policy.",
380
380
  "No OAuth registration or callback URL is needed. Verification reads published entries. A 404 can mean the key lacks access to the chosen environment; check the space, region and environment as well as the token."
381
381
  ]),
382
- apiKeyReferenceLabel: "Content Delivery API token reference",
382
+ apiKeyReferenceLabel: "jskit.connectors.contentful.apiKeyReferenceLabel",
383
383
  settingsSchema: createSchema({
384
384
  spaceId: { type: "string", required: true, minLength: 1, maxLength: 64,
385
385
  validator: (value) => /^[a-zA-Z0-9_-]+$/u.test(value) || "Enter the Space ID from Contentful API keys." },
@@ -388,14 +388,14 @@ const contentfulDefinition = Object.freeze({
388
388
  region: { type: "string", enum: ["us", "eu"], defaultTo: "us" }
389
389
  }),
390
390
  settingsFields: [
391
- { name: "spaceId", label: "Space ID", hint: "Copy the Space ID from the selected space's API keys page." },
392
- { name: "environmentId", label: "Environment ID", hint: "The key must have access to this environment. Defaults to master." },
393
- { name: "region", label: "Region", items: [
394
- { value: "us", title: "United States" }, { value: "eu", title: "Europe" }
391
+ { name: "spaceId", label: "jskit.connectors.contentful.fields.spaceId.label", hint: "jskit.connectors.contentful.fields.spaceId.hint" },
392
+ { name: "environmentId", label: "jskit.connectors.contentful.fields.environmentId.label", hint: "jskit.connectors.contentful.fields.environmentId.hint" },
393
+ { name: "region", label: "jskit.connectors.contentful.fields.region.label", items: [
394
+ { value: "us", title: "jskit.connectors.contentful.fields.region.items.us.title" }, { value: "eu", title: "jskit.connectors.contentful.fields.region.items.eu.title" }
395
395
  ] }
396
396
  ]
397
397
  });
398
- const asanaDefinition = definition("asana", "Asana", "Discover projects and create, assign and track tasks in your Asana workspace.",
398
+ const asanaDefinition = definition("asana", "Asana", "jskit.connectors.asana.description",
399
399
  "https://developers.asana.com/docs/personal-access-token", [
400
400
  "Open the Asana developer console using My apps in the provider setup guide.",
401
401
  "Under Personal access tokens, choose Create new token and give it a description identifying this application.",
@@ -405,7 +405,7 @@ const asanaDefinition = definition("asana", "Asana", "Discover projects and crea
405
405
  ]);
406
406
 
407
407
  const stripeDefinition = Object.freeze({
408
- ...definition("stripe", "Stripe", "Read the Stripe account's available and pending balances.",
408
+ ...definition("stripe", "Stripe", "jskit.connectors.stripe.description",
409
409
  "https://docs.stripe.com/keys/restricted-api-keys", [
410
410
  "Select the intended Stripe account and sandbox or live mode, then open the API keys page.",
411
411
  "Choose Create restricted key, start from zero permissions, name it and allow Balance read access.",
@@ -424,7 +424,7 @@ const stripeDefinition = Object.freeze({
424
424
  ]
425
425
  }
426
426
  });
427
- const replicateDefinition = definition("replicate", "Replicate", "Run asynchronous model predictions with an application-owned Replicate token.",
427
+ const replicateDefinition = definition("replicate", "Replicate", "jskit.connectors.replicate.description",
428
428
  "https://replicate.com/docs/topics/security/api-tokens", [
429
429
  "Select the Replicate user or organization that owns the intended usage, then open account/api-tokens.",
430
430
  "Create a token with a name identifying this application and copy its value.",
@@ -435,13 +435,13 @@ const replicateDefinition = definition("replicate", "Replicate", "Run asynchrono
435
435
  "If the token is disabled, create a replacement on the same API tokens page, update Env and reconnect. Disabling a shared token also stops other applications using it."
436
436
  ]);
437
437
  const sentryDefinition = Object.freeze({
438
- id: "sentry", name: "Sentry", description: "Inspect and triage Sentry issues through scoped MCP tools.",
438
+ id: "sentry", name: "Sentry", description: "jskit.connectors.sentry.description",
439
439
  accountModes: ["assistant"], authenticationMethods: ["oauth2"],
440
440
  scopes: [
441
- { value: "org:read", label: "Read organization data", recommended: true },
442
- { value: "project:write", label: "Write project data" },
443
- { value: "team:write", label: "Write team data" },
444
- { value: "event:write", label: "Write event data" }
441
+ { value: "org:read", label: "jskit.connectors.sentry.scopes.orgRead.label", recommended: true },
442
+ { value: "project:write", label: "jskit.connectors.sentry.scopes.projectWrite.label" },
443
+ { value: "team:write", label: "jskit.connectors.sentry.scopes.teamWrite.label" },
444
+ { value: "event:write", label: "jskit.connectors.sentry.scopes.eventWrite.label" }
445
445
  ],
446
446
  settingsSchema: createSchema({
447
447
  organizationSlug: { type: "string", required: true, minLength: 1, maxLength: 200,
@@ -450,8 +450,8 @@ const sentryDefinition = Object.freeze({
450
450
  validator: (value) => /^[a-z0-9][a-z0-9_-]*$/u.test(value) || "Enter the project slug, not its numeric ID or URL." }
451
451
  }),
452
452
  settingsFields: [
453
- { name: "organizationSlug", label: "Sentry organization slug", hint: "Copy the organization slug from Sentry's URL. This connection is restricted to that organization." },
454
- { name: "projectSlug", label: "Sentry project slug (optional)", hint: "Copy the slug from Project Settings to restrict access to one project. Leave empty for the selected organization." }
453
+ { name: "organizationSlug", label: "jskit.connectors.sentry.fields.organizationSlug.label", hint: "jskit.connectors.sentry.fields.organizationSlug.hint" },
454
+ { name: "projectSlug", label: "jskit.connectors.sentry.fields.projectSlug.label", hint: "jskit.connectors.sentry.fields.projectSlug.hint" }
455
455
  ],
456
456
  setup: { url: "https://mcp.sentry.dev/", clientRegistrationEndpoint: "https://mcp.sentry.dev/oauth/register", steps: [
457
457
  "This is assistant context, not application login or SDK error-reporting setup. The assistant host must explicitly authorize access to errors; saving the connection alone does not grant it.",
@@ -462,7 +462,7 @@ const sentryDefinition = Object.freeze({
462
462
  "Reconnect when the grant expires or Sentry access changes. Disconnect removes the application's local grant; manage provider-side permissions separately. An application's error-reporting DSN is separate from this management connection."
463
463
  ] }
464
464
  });
465
- const incidentIoDefinition = definition("incident-io", "incident.io", "Manage incidents and follow-ups, resolve alerts, read on-call schedules and maintain catalogue entries.",
465
+ const incidentIoDefinition = definition("incident-io", "incident.io", "jskit.connectors.incidentIo.description",
466
466
  "https://docs.incident.io/admin/api-keys", [
467
467
  "In the intended incident.io organization, open Settings > API keys and choose Add API key. Name it for this application. The token is displayed once; copy it privately before leaving.",
468
468
  "Choose View data (viewer) for incident verification. Add Create incidents / Edit incidents for writes, View on-call resources for alerts, Read schedules for schedules, and View catalog / Manage catalog for catalogue reads/writes. For follow-ups inspect the permission scopes badge for follow_ups.create and follow_ups.update; for alert resolution it must include alerts.resolve. Grant only the required actions. Restrict team-scoped access to intended teams; you cannot delegate permissions you do not hold.",
@@ -471,7 +471,7 @@ const incidentIoDefinition = definition("incident-io", "incident.io", "Manage in
471
471
  "Schedule reads use pages of at most 25 so next shifts are included. This is not a rota editor or paging service. Alert sources such as Datadog can require external resolution; a 422 does not mean retry blindly. Private resources require provider permission, even when this form is valid.",
472
472
  "This key remains valid if its creator is deactivated. Rotate or revoke it in Settings > API keys, update Env and verify again. Disconnect only removes local state; it does not revoke the key, close incidents or cancel provider workflows."
473
473
  ]);
474
- const firefliesDefinition = definition("fireflies", "Fireflies", "Read and search Fireflies meetings, speaker-attributed transcripts and summaries.",
474
+ const firefliesDefinition = definition("fireflies", "Fireflies", "jskit.connectors.fireflies.description",
475
475
  "https://docs.fireflies.ai/fundamentals/authorization", [
476
476
  "Sign into Fireflies and open Integrations, then Fireflies API.",
477
477
  "Copy the API key privately. It follows this user's account permissions; a team administrator key can include team data. Choose the account appropriate for the application.",
@@ -480,7 +480,7 @@ const firefliesDefinition = definition("fireflies", "Fireflies", "Read and searc
480
480
  "Transcript listing defaults to meetings this account organized. The application must authorize broader team access. If verification fails, check the key and account permissions. Replace keys in Env and verify again. Disconnect removes local state; revoke the provider key separately in Fireflies. This API-key setup needs no OAuth callback or app registration."
481
481
  ]);
482
482
 
483
- const heygenKeyDefinition = definition("heygen", "HeyGen", "Read your API account profile and browse voice metadata.",
483
+ const heygenKeyDefinition = definition("heygen", "HeyGen", "jskit.connectors.heygenKey.description",
484
484
  "https://developers.heygen.com/docs/api-key", [
485
485
  "Sign into the intended HeyGen account. Open the API dashboard linked from Provider setup guide and choose the control to generate an API key.",
486
486
  "For a restricted key, allow account:read for verification and voices:read for voice listing. Set those permissions in HeyGen; editing this application's configuration cannot grant them. API-key usage and subscription OAuth use different billing arrangements.",
@@ -490,12 +490,12 @@ const heygenKeyDefinition = definition("heygen", "HeyGen", "Read your API accoun
490
490
  ]);
491
491
  const heygenDefinition = Object.freeze({
492
492
  ...heygenKeyDefinition,
493
- description: "Read API profile and voices with a key, or connect HeyGen MCP tools through browser OAuth.",
493
+ description: "jskit.connectors.heygen.description",
494
494
  authenticationMethods: ["api-key", "oauth2"],
495
495
  scopes: [
496
- { value: "openid", label: "Identify the connected HeyGen account", recommended: true, authenticationMethods: ["oauth2"] },
497
- { value: "profile", label: "Read account profile", recommended: true, authenticationMethods: ["oauth2"] },
498
- { value: "email", label: "Read account email", recommended: true, authenticationMethods: ["oauth2"] }
496
+ { value: "openid", label: "jskit.connectors.heygen.scopes.openid.label", recommended: true, authenticationMethods: ["oauth2"] },
497
+ { value: "profile", label: "jskit.connectors.heygen.scopes.profile.label", recommended: true, authenticationMethods: ["oauth2"] },
498
+ { value: "email", label: "jskit.connectors.heygen.scopes.email.label", recommended: true, authenticationMethods: ["oauth2"] }
499
499
  ],
500
500
  setup: { ...heygenKeyDefinition.setup,
501
501
  urlByAuthentication: { oauth2: "https://developers.heygen.com/mcp/overview" },
@@ -509,7 +509,7 @@ const heygenDefinition = Object.freeze({
509
509
  ] }
510
510
  }
511
511
  });
512
- const perplexityDefinition = definition("perplexity", "Perplexity", "Connect your Perplexity key for app-owned cited answers and streaming.",
512
+ const perplexityDefinition = definition("perplexity", "Perplexity", "jskit.connectors.perplexity.description",
513
513
  "https://docs.perplexity.ai/docs/admin/api-key-management", [
514
514
  "Open the Perplexity API console, then Projects. Create or select the project that will own this application's API usage; a project must exist before you can create its first key.",
515
515
  "Open API Keys and generate a named key for that project. Copy its full value immediately; it is only shown at creation.",
@@ -518,7 +518,7 @@ const perplexityDefinition = definition("perplexity", "Perplexity", "Connect you
518
518
  "Use the supplied AI-connections perplexity-answer example with this exact saved slot. Your application installs its native client, authorizes the caller and resolves this Env reference before requesting a cited answer or stream. Requests go directly to Perplexity and use the application’s provider account. The app renders citations and controls spending. LIMITATIONS: no premade research/chat screen, persistent conversation or automatic coding-chat attachment; async history lists only its initial page. For example, fetch a cited answer in your backend, then display it in your app. Never send the key to the browser.",
519
519
  "For replacement, create another key and update Env before revoking the old key. A revoked key cannot be recovered."
520
520
  ]);
521
- const supabaseDefinition = definition("supabase", "Supabase", "List projects through the Supabase Management API.",
521
+ const supabaseDefinition = definition("supabase", "Supabase", "jskit.connectors.supabase.description",
522
522
  "https://supabase.com/docs/guides/platform/personal-access-tokens", [
523
523
  "Open Supabase account settings, Access Tokens, and generate a personal access token.",
524
524
  "Where scoped tokens are available, select the intended resources and project read permission. Classic tokens carry your full account access.",
@@ -527,7 +527,7 @@ const supabaseDefinition = definition("supabase", "Supabase", "List projects thr
527
527
  ]);
528
528
 
529
529
  const paddleDefinition = Object.freeze({
530
- ...definition("paddle", "Paddle", "Read and create Paddle Billing products and prices in sandbox or live mode.",
530
+ ...definition("paddle", "Paddle", "jskit.connectors.paddle.description",
531
531
  "https://developer.paddle.com/api-reference/about/authentication", [
532
532
  "Sign into the Paddle Billing account that owns this application's catalogue. Use its sandbox account for testing and live account for production. Open Developer tools → Authentication → API keys → New API key.",
533
533
  "Enter a name and description identifying this application. Grant product.read for connection verification and catalogue reads. Also grant product.write to create products and price.write to create prices when your application needs those operations. Editing webhook destinations also needs notification_setting.write; reading domain approval needs checkout_domain.read. Set an expiry. Enable Rotatable only if you plan to configure key rotation; that choice cannot be changed later. Click Save and copy the key immediately because it is shown only once.",
@@ -548,22 +548,22 @@ const paddleDefinition = Object.freeze({
548
548
  ]
549
549
  },
550
550
  assistantActions: [
551
- { value: "enable", label: "Enable Paddle" },
552
- { value: "provider.recommend", label: "Recommend payment provider" },
553
- { value: "products.create", label: "Create product with price" },
554
- { value: "products.batchCreate", label: "Batch create products with prices" },
555
- { value: "prices.create", label: "Create price" },
556
- { value: "goLive.check", label: "Check go-live status" },
557
- { value: "api.read", label: "Read Paddle API" },
558
- { value: "api.write", label: "Write Paddle API" },
559
- { value: "webhooks.update", label: "Edit webhook" }
551
+ { value: "enable", label: "jskit.connectors.paddle.assistantActions.enable.label" },
552
+ { value: "provider.recommend", label: "jskit.connectors.paddle.assistantActions.providerRecommend.label" },
553
+ { value: "products.create", label: "jskit.connectors.paddle.assistantActions.productsCreate.label" },
554
+ { value: "products.batchCreate", label: "jskit.connectors.paddle.assistantActions.productsBatchCreate.label" },
555
+ { value: "prices.create", label: "jskit.connectors.paddle.assistantActions.pricesCreate.label" },
556
+ { value: "goLive.check", label: "jskit.connectors.paddle.assistantActions.goLiveCheck.label" },
557
+ { value: "api.read", label: "jskit.connectors.paddle.assistantActions.apiRead.label" },
558
+ { value: "api.write", label: "jskit.connectors.paddle.assistantActions.apiWrite.label" },
559
+ { value: "webhooks.update", label: "jskit.connectors.paddle.assistantActions.webhooksUpdate.label" }
560
560
  ],
561
561
  settingsSchema: createSchema({ environment: { type: "string", enum: ["sandbox", "live"], defaultTo: "sandbox" } }),
562
- settingsFields: [{ name: "environment", label: "Environment", hint: "Use the environment that issued this API key.",
563
- items: [{ title: "Sandbox", value: "sandbox" }, { title: "Live", value: "live" }] }]
562
+ settingsFields: [{ name: "environment", label: "jskit.connectors.paddle.fields.environment.label", hint: "jskit.connectors.paddle.fields.environment.hint",
563
+ items: [{ title: "jskit.connectors.paddle.fields.environment.items.sandbox.title", value: "sandbox" }, { title: "jskit.connectors.paddle.fields.environment.items.live.title", value: "live" }] }]
564
564
  });
565
565
  const mailgunDefinition = Object.freeze({
566
- ...definition("mailgun", "Mailgun", "Send transactional email, manage sending domains and inspect delivery logs.",
566
+ ...definition("mailgun", "Mailgun", "jskit.connectors.mailgun.description",
567
567
  "https://help.mailgun.com/hc/en-us/articles/26016288026907-API-Key-Roles", [
568
568
  "Sign into the intended Mailgun account as an administrator. In the top-right profile menu, choose API Security. Under Mailgun API Keys, choose Add new key; do not select the public verification key or webhook signing key.",
569
569
  "Enter a description for this application and choose Developer for sending and domain management, or Analyst only for read-only access, then Create Key. Free/Basic accounts may offer only Admin. Copy the secret from the creation dialog now: it is shown only once. If lost, create a replacement key.",
@@ -576,11 +576,11 @@ const mailgunDefinition = Object.freeze({
576
576
  "To change a key's role, create a new key, replace MAILGUN_API_KEY in Env and verify again; roles on existing keys cannot be edited. Disconnect removes the local connection. Delete an obsolete key in Mailgun separately to revoke its provider access."
577
577
  ]),
578
578
  settingsSchema: createSchema({ region: { type: "string", enum: ["us", "eu"], defaultTo: "us" } }),
579
- settingsFields: [{ name: "region", label: "API region", hint: "Select the region containing your sending domains.",
580
- items: [{ title: "United States (api.mailgun.net)", value: "us" }, { title: "European Union (api.eu.mailgun.net)", value: "eu" }] }]
579
+ settingsFields: [{ name: "region", label: "jskit.connectors.mailgun.fields.region.label", hint: "jskit.connectors.mailgun.fields.region.hint",
580
+ items: [{ title: "jskit.connectors.mailgun.fields.region.items.us.title", value: "us" }, { title: "jskit.connectors.mailgun.fields.region.items.eu.title", value: "eu" }] }]
581
581
  });
582
582
 
583
- const fireworksAiDefinition = definition("fireworks-ai", "Fireworks AI", "List accounts accessible to your Fireworks API key.",
583
+ const fireworksAiDefinition = definition("fireworks-ai", "Fireworks AI", "jskit.connectors.fireworksAi.description",
584
584
  "https://docs.fireworks.ai/getting-started/quickstart", [
585
585
  "Sign into Fireworks. Open the Provider setup guide and follow its Fireworks dashboard link to API Keys; you can also open your profile icon > User Settings > API Keys.",
586
586
  "Choose Create API key, then copy the generated key for this application and keep it private. The Provider setup guide links to the account's API Keys page.",
@@ -589,7 +589,7 @@ const fireworksAiDefinition = definition("fireworks-ai", "Fireworks AI", "List a
589
589
  "If you revoke or replace the key in Fireworks, update its Env value and check the connection again."
590
590
  ]);
591
591
  const gatewayApiDefinition = Object.freeze({
592
- ...definition("gatewayapi", "GatewayAPI", "Send SMS/RCS messages and read account credit on the Global or EU platform.",
592
+ ...definition("gatewayapi", "GatewayAPI", "jskit.connectors.gatewayApi.description",
593
593
  "https://gatewayapi.com/help-center/webhooks-and-api-keys/", [
594
594
  "Sign into the intended GatewayAPI Global or EU account and open API, then API Keys in the left menu.",
595
595
  "Choose ADD API KEY, name the credential, and copy its API token into Env.",
@@ -600,11 +600,11 @@ const gatewayApiDefinition = Object.freeze({
600
600
  "If verification fails, check that the token matches the selected Global or EU account and any configured IP restrictions permit the application server. Replace a rotated token in Env and verify again before revoking the old token in API Keys. Disconnect removes local connection state only. No OAuth callback or webhook is needed for this balance check."
601
601
  ]),
602
602
  settingsSchema: createSchema({ region: { type: "string", enum: ["global", "eu"], defaultTo: "global" } }),
603
- settingsFields: [{ name: "region", label: "API domain", hint: "Select the platform that issued this token.",
604
- items: [{ title: "Global (gatewayapi.com)", value: "global" }, { title: "EU (gatewayapi.eu)", value: "eu" }] }]
603
+ settingsFields: [{ name: "region", label: "jskit.connectors.gatewayApi.fields.region.label", hint: "jskit.connectors.gatewayApi.fields.region.hint",
604
+ items: [{ title: "jskit.connectors.gatewayApi.fields.region.items.global.title", value: "global" }, { title: "jskit.connectors.gatewayApi.fields.region.items.eu.title", value: "eu" }] }]
605
605
  });
606
606
  const polarDefinition = Object.freeze({
607
- ...definition("polar", "Polar", "Read your organization's Polar product catalogue.",
607
+ ...definition("polar", "Polar", "jskit.connectors.polar.description",
608
608
  "https://polar.sh/docs/integrate/oat", [
609
609
  "Open Settings for the intended Polar organization, scroll to Developers and choose New Token.",
610
610
  "Give the token a name and expiry, select products:read, and copy its value into Env.",
@@ -612,12 +612,12 @@ const polarDefinition = Object.freeze({
612
612
  "Save the reference. The runtime verifies product reads; it does not create a checkout or enable merchant payments."
613
613
  ]),
614
614
  settingsSchema: createSchema({ environment: { type: "string", enum: ["sandbox", "production"], defaultTo: "sandbox" } }),
615
- settingsFields: [{ name: "environment", label: "Environment", hint: "Use the environment containing this organization and token.",
616
- items: [{ title: "Sandbox", value: "sandbox" }, { title: "Production", value: "production" }] }]
615
+ settingsFields: [{ name: "environment", label: "jskit.connectors.polar.fields.environment.label", hint: "jskit.connectors.polar.fields.environment.hint",
616
+ items: [{ title: "jskit.connectors.polar.fields.environment.items.sandbox.title", value: "sandbox" }, { title: "jskit.connectors.polar.fields.environment.items.production.title", value: "production" }] }]
617
617
  });
618
618
 
619
619
  const storyblokDefinition = Object.freeze({
620
- ...definition("storyblok", "Storyblok", "Read space metadata and published or draft content in the space's region.",
620
+ ...definition("storyblok", "Storyblok", "jskit.connectors.storyblok.description",
621
621
  "https://www.storyblok.com/docs/concepts/access-tokens", [
622
622
  "Select the intended Storyblok space and open Settings, then Access Tokens.",
623
623
  "Create a named Public token for published content, or a Preview token when this application needs draft content.",
@@ -628,15 +628,15 @@ const storyblokDefinition = Object.freeze({
628
628
  "If verification fails, check the token type and space region, then reconnect after correcting Env. Disconnect removes the app connection; delete a token in Storyblok Settings → Access Tokens when it must stop working everywhere."
629
629
  ]),
630
630
  settingsSchema: createSchema({ region: { type: "string", enum: ["eu", "us", "ca", "ap", "cn"], defaultTo: "eu" } }),
631
- settingsFields: [{ name: "region", label: "Space region", hint: "Match the region selected when the Storyblok space was created.",
631
+ settingsFields: [{ name: "region", label: "jskit.connectors.storyblok.fields.region.label", hint: "jskit.connectors.storyblok.fields.region.hint",
632
632
  items: [
633
- { title: "European Union (EU)", value: "eu" }, { title: "United States (US)", value: "us" },
634
- { title: "Canada (CA)", value: "ca" }, { title: "Australia / APAC (AP)", value: "ap" },
635
- { title: "China (CN)", value: "cn" }
633
+ { title: "jskit.connectors.storyblok.fields.region.items.eu.title", value: "eu" }, { title: "jskit.connectors.storyblok.fields.region.items.us.title", value: "us" },
634
+ { title: "jskit.connectors.storyblok.fields.region.items.ca.title", value: "ca" }, { title: "jskit.connectors.storyblok.fields.region.items.ap.title", value: "ap" },
635
+ { title: "jskit.connectors.storyblok.fields.region.items.cn.title", value: "cn" }
636
636
  ] }]
637
637
  });
638
638
 
639
- const ashbyDefinition = definition("ashby", "Ashby", "Read hiring data, maintain candidate profiles and advance sourced applications.",
639
+ const ashbyDefinition = definition("ashby", "Ashby", "jskit.connectors.ashby.description",
640
640
  "https://docs.ashbyhq.com/how-do-i-generate-an-api-key", [
641
641
  "As an Ashby Organization Admin, open Admin > Integrations > API Keys and choose + New.",
642
642
  "Name the key for this application, leave the optional integration partner unset, and choose Create API Key. Keys initially have no endpoint permissions: select Jobs read (jobsRead) for verification. Add Candidates read (candidatesRead) for candidates/applications and Candidates write (candidatesWrite) for profile edits, sourcing and stage changes. Add Interviews read (interviewsRead) for interview-plan/stage lookup and Hiring Process read (hiringProcessMetadataRead) for archive reasons.",
@@ -644,7 +644,7 @@ const ashbyDefinition = definition("ashby", "Ashby", "Read hiring data, maintain
644
644
  "Enter env:ASHBY_API_KEY in API key reference here and save. Choose Set credential in Env, paste the key as the ASHBY_API_KEY value and save it there. Return here and choose Connect account or Verify again. Check connection only reads current status.",
645
645
  "No OAuth registration or callback URL is needed. Verification lists jobs without creating candidates or changing hiring stages. This organization key serves an administrator-approved hiring workflow; it is not an applicant login or public careers form. For missing_endpoint_permission, reopen the key, correct Jobs read and Save. A key that was not copied must be replaced. To rotate, create a replacement and update Env before verifying. To revoke, open the old key by name and click Disable; Disconnect only removes the application connection."
646
646
  ]);
647
- const lexwareDefinition = definition("lexware", "Lexware", "Read accounting contacts, articles and vouchers, and create net-EUR draft invoices.",
647
+ const lexwareDefinition = definition("lexware", "Lexware", "jskit.connectors.lexware.description",
648
648
  "https://help.lexware.de/de-form/articles/548863-alles-rund-um-public-api", [
649
649
  "You need Lexware Office XL for Public API access. In the intended account, open Erweiterungen > Weitere Apps > Public API, or app.lexware.de/addons/public-api.",
650
650
  "Choose API-Schlüssel erstellen and the individual-permissions option. Enable reading contacts for verification. Add article and accounting-document read permissions for those operations; allow invoice creation only if the app will create drafts.",
@@ -656,7 +656,7 @@ const lexwareDefinition = definition("lexware", "Lexware", "Read accounting cont
656
656
  "No OAuth registration or callback URL is needed. Verification reads contacts. Keys expire after at most 24 months: create a replacement and update Env before expiry. Public API does not mean the key is safe to expose."
657
657
  ]);
658
658
  const sevdeskDefinition = Object.freeze({
659
- ...definition("sevdesk", "Sevdesk", "Read sevdesk contact organizations and people with offset pagination.",
659
+ ...definition("sevdesk", "Sevdesk", "jskit.connectors.sevdesk.description",
660
660
  "https://hilfe.sevdesk.de/de/articles/9374740-wo-finde-ich-meinen-api-token-in-sevdesk", [
661
661
  "In the intended sevdesk account, open Erweiterungen > Integrationen and locate API-Token für Integrationen.",
662
662
  "Choose Einblenden and enter your sevdesk account password. Copy the displayed API token. Depending on your plan, Erweiterungen > API also offers Einblenden.",
@@ -664,10 +664,10 @@ const sevdeskDefinition = Object.freeze({
664
664
  "No OAuth registration or callback URL is needed. Paste only the token, without adding Bearer. Verification reads contacts without modifying accounting data.",
665
665
  "This token belongs to its sevdesk user. Naming another configuration does not create a separate provider account or change the token's access."
666
666
  ]),
667
- apiKeyReferenceLabel: "API token reference"
667
+ apiKeyReferenceLabel: "jskit.connectors.sevdesk.apiKeyReferenceLabel"
668
668
  });
669
669
 
670
- const apolloIoDefinition = definition("apollo-io", "Apollo.io", "Find prospects, enrich selected records and manage your sales contacts, accounts and deals.",
670
+ const apolloIoDefinition = definition("apollo-io", "Apollo.io", "jskit.connectors.apolloIo.description",
671
671
  "https://docs.apollo.io/docs/create-api-key", [
672
672
  "API access depends on your Apollo plan. In the intended workspace, open Settings > Integrations > API Keys, then API Keys > Create new key.",
673
673
  "Enter a name and description. Keep api/v1/accounts/search enabled for verification. Add only the permitted endpoints needed by your app: api/v1/mixed_people/api_search for prospect people, api/v1/mixed_companies/search for companies, api/v1/people/match and api/v1/organizations/enrich for enrichment. Keep Set as master key off when endpoint permissions suffice.",
@@ -676,7 +676,7 @@ const apolloIoDefinition = definition("apollo-io", "Apollo.io", "Find prospects,
676
676
  "Verification reads saved accounts; it does not enrich, write CRM records or spend enrichment credits. Company prospect searches and enrichment can consume credits when your app invokes them. Review current Apollo pricing and require explicit approval or an administrator-authorized usage policy in your app.",
677
677
  "No OAuth registration or callback URL is needed. This key acts for the Apollo workspace, not an individual end user's account. Keys in that workspace share its limits. To replace access, regenerate the key and update Env before verifying again. Disconnect removes the local connection; delete the key on Apollo's API keys page to revoke provider access."
678
678
  ]);
679
- const attentionDefinition = definition("attention", "Attention", "Read conversations and coaching results; manage call metadata, snippets, users and teams.",
679
+ const attentionDefinition = definition("attention", "Attention", "jskit.connectors.attention.description",
680
680
  "https://docs.attention.com/api-authentication", [
681
681
  "Sign into app.attention.tech as an organization administrator. Open your profile avatar at the top left, Settings, then Organization > API Keys.",
682
682
  "Choose + Create API Key at the top right and give it a name identifying this application. Copy the value in API Key Created before closing; it is shown once.",
@@ -687,7 +687,7 @@ const attentionDefinition = definition("attention", "Attention", "Read conversat
687
687
  ]);
688
688
 
689
689
  const telegramDefinition = Object.freeze({
690
- ...definition("telegram", "Telegram", "Send bot messages and receive updates through application-owned polling.",
690
+ ...definition("telegram", "Telegram", "jskit.connectors.telegram.description",
691
691
  "https://core.telegram.org/bots/tutorial", [
692
692
  "In Telegram, open the verified BotFather account and send /newbot. Choose a display name and an available username ending in bot.",
693
693
  "Copy the token returned by BotFather. Enter env:TELEGRAM_BOT_TOKEN in Bot token reference here and save. Choose Set credential in Env, paste the token as the TELEGRAM_BOT_TOKEN value and save it there.",
@@ -696,9 +696,9 @@ const telegramDefinition = Object.freeze({
696
696
  "For polling, first check that no webhook is configured. Use one app worker and save update offsets after successful processing. Verification never polls; disconnect does not revoke the bot token or discard updates.",
697
697
  "Use separate bots for independent public and paid application identities. Replacing a token for the same bot does not create another bot."
698
698
  ]),
699
- apiKeyReferenceLabel: "Bot token reference"
699
+ apiKeyReferenceLabel: "jskit.connectors.telegram.apiKeyReferenceLabel"
700
700
  });
701
- const klipyDefinition = definition("klipy", "KLIPY", "Browse clips, GIFs, stickers and existing AI emojis using your own KLIPY app key.",
701
+ const klipyDefinition = definition("klipy", "KLIPY", "jskit.connectors.klipy.description",
702
702
  "https://klipy.com/blog/klipy-partner-panel", [
703
703
  "Sign into KLIPY Partner Panel and choose Add Platform. Enter the platform name, contact email, company website and product description, then accept the API terms and submit.",
704
704
  "Follow the key-creation flow, give the key an application-specific name and enter App URL when available. Copy the resulting test key. The application owner chooses any optional advertising settings in KLIPY separately.",
@@ -712,7 +712,7 @@ const klipyDefinition = definition("klipy", "KLIPY", "Browse clips, GIFs, sticke
712
712
  ]);
713
713
 
714
714
  const clayDefinition = Object.freeze({
715
- ...definition("clay", "Clay", "Search people and companies, run enrichment routines and query Enterprise tables with your Clay Public API key.",
715
+ ...definition("clay", "Clay", "jskit.connectors.clay.description",
716
716
  "https://developers.clay.com/public-api/authentication", [
717
717
  "Open Clay Settings > Account > API keys (beta). Create a Public API key for the intended user and workspace. The older Clay workspace API key is a different credential.",
718
718
  "Copy the new key. Enter env:CLAY_PUBLIC_API_KEY in Public API key reference here and save. Choose Set credential in Env, paste the key as CLAY_PUBLIC_API_KEY and save it there. Return here and choose Connect account or Verify again. Check connection only refreshes local status.",
@@ -723,7 +723,7 @@ const clayDefinition = Object.freeze({
723
723
  "Search filters use the current query-mode reference. The legacy filters-mode API is deprecated. The application saves this connection configuration; assistant tool attachment requires explicit host integration.",
724
724
  "To replace the key, create another Public API key, update Env and verify before retiring the previous key. Disconnect removes local state, not the key in Clay."
725
725
  ]),
726
- apiKeyReferenceLabel: "Public API key reference"
726
+ apiKeyReferenceLabel: "jskit.connectors.clay.apiKeyReferenceLabel"
727
727
  });
728
728
 
729
729
  const tokenDefinitions = Object.freeze([