@jskit-ai/connectors-catalog 0.1.39 → 0.1.41

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 (85) hide show
  1. package/README.md +4 -2
  2. package/docs/ai.md +14 -4
  3. package/docs/amplitude.md +8 -9
  4. package/docs/apify.md +3 -3
  5. package/docs/apollo-io.md +3 -4
  6. package/docs/asana.md +3 -4
  7. package/docs/ashby.md +3 -3
  8. package/docs/atlassian.md +9 -9
  9. package/docs/attention.md +3 -3
  10. package/docs/aws-athena.md +1 -1
  11. package/docs/aws-s3.md +1 -1
  12. package/docs/brevo.md +3 -3
  13. package/docs/calendly.md +2 -2
  14. package/docs/canva.md +5 -5
  15. package/docs/chargebee.md +4 -4
  16. package/docs/clay.md +4 -4
  17. package/docs/clickhouse.md +2 -2
  18. package/docs/confidence-exp.md +2 -2
  19. package/docs/confidence-flags.md +2 -2
  20. package/docs/confidence-oauth.md +1 -2
  21. package/docs/contentful.md +1 -1
  22. package/docs/dbt-semantic-layer.md +4 -4
  23. package/docs/elevenlabs.md +2 -2
  24. package/docs/figma.md +4 -4
  25. package/docs/firebase-cloud-messaging.md +1 -1
  26. package/docs/fireflies.md +4 -4
  27. package/docs/gatewayapi.md +1 -1
  28. package/docs/gemini-enterprise.md +1 -1
  29. package/docs/github-api.md +1 -1
  30. package/docs/gmail.md +1 -1
  31. package/docs/google-docs.md +1 -1
  32. package/docs/google-drive.md +2 -2
  33. package/docs/google-maps-platform.md +3 -3
  34. package/docs/google-search-console.md +2 -2
  35. package/docs/granola.md +4 -4
  36. package/docs/hex.md +4 -4
  37. package/docs/hubspot.md +1 -1
  38. package/docs/incident-io.md +1 -1
  39. package/docs/inngest.md +1 -1
  40. package/docs/klipy.md +1 -1
  41. package/docs/lexware.md +2 -2
  42. package/docs/lightspeed.md +1 -1
  43. package/docs/linear.md +3 -4
  44. package/docs/linkedin.md +1 -1
  45. package/docs/logo-dev.md +1 -1
  46. package/docs/mapbox.md +2 -2
  47. package/docs/microsoft-fabric.md +1 -1
  48. package/docs/microsoft-powerpoint.md +1 -1
  49. package/docs/microsoft-word.md +1 -1
  50. package/docs/miro.md +2 -2
  51. package/docs/n8n.md +1 -1
  52. package/docs/posthog.md +5 -5
  53. package/docs/salesforce.md +2 -3
  54. package/docs/sanity.md +2 -2
  55. package/docs/semrush.md +4 -4
  56. package/docs/sentry.md +2 -2
  57. package/docs/sevdesk.md +2 -2
  58. package/docs/shopify.md +2 -2
  59. package/docs/slack.md +3 -3
  60. package/docs/telegram.md +1 -1
  61. package/docs/twilio.md +2 -2
  62. package/docs/wiz.md +3 -3
  63. package/docs/xero.md +2 -2
  64. package/docs/zoho-books.md +3 -4
  65. package/docs/zoho-crm.md +3 -3
  66. package/package.json +3 -3
  67. package/src/server/ai.js +1 -0
  68. package/src/shared/ai-models.json +1 -2
  69. package/src/shared/amplitude.js +1 -1
  70. package/src/shared/confidence.js +1 -1
  71. package/src/shared/dbt-semantic-layer.js +1 -1
  72. package/src/shared/definitions.js +1 -1
  73. package/src/shared/figma.js +2 -2
  74. package/src/shared/firebase-cloud-messaging.js +1 -1
  75. package/src/shared/linkedin.js +1 -1
  76. package/src/shared/mcp.js +3 -3
  77. package/src/shared/microsoft-fabric.js +1 -1
  78. package/src/shared/microsoft.js +5 -5
  79. package/src/shared/miro.js +1 -1
  80. package/src/shared/oura.js +2 -2
  81. package/src/shared/snowflake.js +1 -1
  82. package/src/shared/tokens.js +13 -13
  83. package/src/shared/wave.js +1 -1
  84. package/test/ai.test.js +17 -2
  85. package/test/microsoft-fabric.test.js +3 -1
package/src/server/ai.js CHANGED
@@ -38,6 +38,7 @@ function createAiConnectionResolver({ configuration, authorize, resolveReference
38
38
  // Never expose this result through a browser API or include it in logs.
39
39
  // Missing baseURL means use the named provider SDK's own default endpoint.
40
40
  return Object.freeze({ providerId: provider.id, model: model.id, sdkPackage: model.sdkPackage,
41
+ modelLimits: Object.freeze({ ...model.limit }),
41
42
  ...(provider.baseURL ? { baseURL: provider.baseURL } : {}), apiKey, access: model.access });
42
43
  }
43
44
  return Object.freeze({ resolve });
@@ -1535,8 +1535,7 @@
1535
1535
  {"id":"zai-org/GLM-5.3-Flash","name":"GLM-5.3-Flash","cost":{"input":0.15,"output":0.5,"cache_read":0.03},"limit":{"context":1048576,"output":131072},"modalities":{"input":["text","image","video","pdf"],"output":["text"]},"sdkPackage":"@ai-sdk/deepinfra","access":"paid"}
1536
1536
  ]},
1537
1537
  {"id": "deepseek", "name": "DeepSeek", "documentationUrl": "https://api-docs.deepseek.com/quick_start/pricing", "baseURL": "https://api.deepseek.com", "environment": ["DEEPSEEK_API_KEY"], "sdkPackage": "@ai-sdk/openai-compatible", "models": [
1538
- {"id":"deepseek-v4-flash","name":"DeepSeek V4 Flash","cost":{"input":0.14,"output":0.28,"reasoning":0.28,"cache_read":0.0028},"limit":{"context":1000000,"output":384000},"modalities":{"input":["text"],"output":["text"]},"sdkPackage":"@ai-sdk/openai-compatible","access":"paid"},
1539
- {"id":"deepseek-v4-flash-vision-exp","name":"DeepSeek V4 Flash Vision Exp","status":"beta","cost":{"input":0.14,"output":0.28,"reasoning":0.28,"cache_read":0.0028},"limit":{"context":1000000,"output":384000},"modalities":{"input":["text","image"],"output":["text"]},"sdkPackage":"@ai-sdk/openai-compatible","access":"paid"},
1538
+ {"id":"deepseek-flash","name":"DeepSeek V4.1 Flash","limit":{"context":1048576,"output":384000},"modalities":{"input":["text","image"],"output":["text"]},"sdkPackage":"@ai-sdk/openai-compatible","access":"paid"},
1540
1539
  {"id":"deepseek-v4-pro","name":"DeepSeek V4 Pro","cost":{"input":0.435,"output":0.87,"reasoning":0.87,"cache_read":0.003625},"limit":{"context":1000000,"output":384000},"modalities":{"input":["text"],"output":["text"]},"sdkPackage":"@ai-sdk/openai-compatible","access":"paid"}
1541
1540
  ]},
1542
1541
  {"id": "digitalocean", "name": "DigitalOcean", "documentationUrl": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", "baseURL": "https://inference.do-ai.run/v1", "environment": ["DIGITALOCEAN_ACCESS_TOKEN"], "sdkPackage": "@ai-sdk/openai-compatible", "models": [
@@ -16,7 +16,7 @@ const amplitudeDefinition = Object.freeze({
16
16
  ? "https://mcp.eu.amplitude.com/register" : "https://mcp.amplitude.com/register",
17
17
  url: "https://amplitude.com/docs/amplitude-ai/amplitude-mcp/other-clients",
18
18
  steps: [
19
- "Select the account's US or EU region and the permissions needed. Set the Suggested callback URL to the route your application actually serves. With a new Client ID, choose Register client and connect: Vibe64 saves the returned client ID in configuration and the secret and callback in development Env. There is no developer-console app form in this flow.",
19
+ "Select the account's US or EU region and the permissions needed. Set the Suggested callback URL to the route your application actually serves. With a new Client ID, choose Register client and connect: the connection host saves the returned client ID in configuration and the secret and callback in development Env. There is no developer-console app form in this flow.",
20
20
  "For an existing client, enter its Client ID and store its secret and exact registered callback in the referenced Env variables. The manual registration request below remains available for CLI users. If registration fails, inspect the provider and Env before retrying; a client may already exist.",
21
21
  "Keep Read Amplitude content selected so registration and verification can succeed. Save configuration, begin consent and sign into Amplitude. If access is blocked, an administrator opens Settings → Content Access → MCP to check organization access, then Org Settings → Role Management → AI Features to grant Use MCP (read) and, only when needed, Use MCP (write) to the intended user and projects.",
22
22
  "The runtime verifies tool discovery without calling a tool. The assistant host must authorize each tool name and its arguments separately.",
@@ -17,7 +17,7 @@ function definition(id, name, description) {
17
17
  ? "Flag creation, variants, schema changes and targeting rules require explicit host approval of the exact change. Inspect the resulting flag and use testResolveFlag for the intended test entity. This configures management access, not production flag evaluation; wire the native Confidence/OpenFeature client separately."
18
18
  : "Retrieve experiment details and results through the host's approved tools. Preserve confidence intervals, sample sizes, significance and status messages: a positive effect estimate alone is not a winning experiment. Confidence performs the statistical analysis.",
19
19
  "Flags and experiments keep separate configured connections even though they share an OAuth service. Do not reuse a grant by changing its provider ID.",
20
- "If client_secret_expires_at is returned, plan replacement before expiry. A failed or interrupted registration is not proof that no client was created; investigate before retrying. Saving alone does not register a client or attach tools. Automatic Vibe64 coding-assistant attachment is deferred; an explicitly wired host can use these tools. Disconnect removes the local grant; it does not undo flag changes or revoke all provider access."
20
+ "If client_secret_expires_at is returned, plan replacement before expiry. A failed or interrupted registration is not proof that no client was created; investigate before retrying. Saving alone does not register a client or attach tools. An explicitly wired assistant host can use these tools. Disconnect removes the local grant; it does not undo flag changes or revoke all provider access."
21
21
  ] }
22
22
  });
23
23
  }
@@ -24,7 +24,7 @@ const dbtSemanticLayerDefinition = Object.freeze({
24
24
  "Choose Map new service token, name it for this application, select Semantic Layer Only and Metadata Only permissions, then Save. Copy the one-time token. If token creation is unavailable, ask your dbt administrator to create and link it.",
25
25
  "Return to Project details and copy the GraphQL hostname and Environment ID from the Semantic Layer connection details. Enter them here, preserving every ID digit. Enter env:DBT_SERVICE_TOKEN in Service token reference and save configuration. Choose Set credential in Env, paste the token as DBT_SERVICE_TOKEN and save it there.",
26
26
  "Return here and choose Connect account / Verify again. Check connection only reads saved status. Verification reads environment metadata; an explicitly wired application can then create metric queries and request their status and JSON result pages. If denied, check the host, environment, linked warehouse credential and token permissions. Replace the token through Env when rotating it; local Disconnect does not revoke it in dbt.",
27
- "Query execution uses your warehouse capacity. The app owns permitted metrics, trusted dimension/time filters and bounded polling. JSON results suit small tables; use dbt’s native Arrow tooling for large production workloads. Do not retry an uncertain query submission automatically. Configuring this connection does not attach dbt to Vibe64’s coding assistant.",
27
+ "Query execution uses your warehouse capacity. The app owns permitted metrics, trusted dimension/time filters and bounded polling. JSON results suit small tables; use dbt’s native Arrow tooling for large production workloads. Do not retry an uncertain query submission automatically. Your application must explicitly expose approved dbt tools to its assistant.",
28
28
  "This token flow has no OAuth callback or app-user login. Public and Online need the customer's own account, permissions and capacity."
29
29
  ] }
30
30
  });
@@ -130,7 +130,7 @@ const firecrawlDefinition = Object.freeze({
130
130
  "Enter env:FIRECRAWL_API_KEY as the API key reference and Save configuration. Follow Set credential in Env, save the real key as FIRECRAWL_API_KEY, then return here and choose Connect account or Verify again. Check connection reads saved status. Keep the key out of source and browser code.",
131
131
  "Verification reads remaining team credits without scraping. A valid key with zero credits can connect, but does not promise a successful scrape. Scraping is a separate, authorized operation that consumes credits. Correct invalid keys or team access before retrying a failed connection.",
132
132
  "Search, mapping, extraction and crawling use your team credits. Crawls require an explicit page limit. Save the returned job ID, check its status, follow returned result pages and inspect crawl errors; starting a crawl is not a completed import. Your app owns scheduling and saved content.",
133
- "To rotate a key, use the team API Keys page, update Env and verify again before revoking the previous key. Disconnect only removes this application connection; revoke the key in Firecrawl separately. No OAuth app ID, secret or callback is required. This setup uses your team credits; Vibe64 does not supply a managed subscription."
133
+ "To rotate a key, use the team API Keys page, update Env and verify again before revoking the previous key. Disconnect only removes this application connection; revoke the key in Firecrawl separately. No OAuth app ID, secret or callback is required. This setup uses your team credits; the connector does not supply a managed subscription."
134
134
  ]
135
135
  }
136
136
  });
@@ -11,8 +11,8 @@ const figmaDefinition = Object.freeze({
11
11
  "Copy client_id from the successful response into Client ID and save configuration. Use Set credential in Env to store client_secret under the displayed Client secret reference. Use Set callback in Env to save the exact registered callback. Keep the registration response private.",
12
12
  "Save, begin authorization, sign into Figma and review its consent screen. A personal access token cannot replace this MCP OAuth registration.",
13
13
  "The host must authorize each tool and its arguments. The MCP permission can expose write tools; listing a tool does not authorize an edit.",
14
- "Use a Figma file/frame link to identify the allowed file and node. The assistant host consumes returned design text/images and chooses its framework; connecting alone does not generate screens. Vibe64 coding-assistant attachment is deferred.",
15
- "Remote MCP is the supported mode for both installed and hosted Vibe64. Desktop MCP must run beside the consuming desktop client; a VPS localhost address points to the VPS, not your laptop. Do not enter a desktop localhost URL as the hosted remote endpoint.",
14
+ "Use a Figma file/frame link to identify the allowed file and node. The assistant host consumes returned design text/images and chooses its framework; connecting alone does not generate screens. Assistant tool attachment requires explicit host integration.",
15
+ "Remote MCP supports both local and hosted assistant applications. Desktop MCP must run beside the consuming desktop client; a VPS localhost address points to the VPS, not your laptop. Do not enter a desktop localhost URL as the hosted remote endpoint.",
16
16
  "Disconnect removes the local grant; it does not undo design edits or revoke all provider access. This uses Figma's remote server. Desktop MCP, app-user login and automatic assistant attachment are separate capabilities."
17
17
  ]
18
18
  }
@@ -37,7 +37,7 @@ const firebaseCloudMessagingDefinition = Object.freeze({
37
37
  "For web push, select Include web push. Under Project settings > General > Your apps, select your Web app, or click the Web icon and Register app with a nickname. Firebase Hosting is optional. From SDK setup and configuration, copy apiKey into Firebase API key and appId into Firebase App ID. These values are public.",
38
38
  "Open Project settings > Cloud Messaging > Web configuration > Web Push certificates. Generate or select a key pair and copy only its public key.",
39
39
  "The app must still register a service worker, request browser notification permission and associate installations with authorized app users. A new custom domain needs its own browser registration.",
40
- "The app must upload each registration to its authenticated backend with a timestamp and associate it with that user/device. On connector_recipient_unregistered, remove only that recipient association; on connector_message_invalid, check the payload first and do not blindly delete tokens. A send receipt is acceptance, not proof the device displayed a notification. Editor coding-assistant attachment is deferred.",
40
+ "The app must upload each registration to its authenticated backend with a timestamp and associate it with that user/device. On connector_recipient_unregistered, remove only that recipient association; on connector_message_invalid, check the payload first and do not blindly delete tokens. A send receipt is acceptance, not proof the device displayed a notification.",
41
41
  "Save again after changing web settings and verify the connection. For permission failures, check the enabled API, target project ID and sender IAM access. Disconnect removes the local connection, not the Google private key: rotate or delete that key in Google Cloud IAM > Service Accounts > your sender > Keys, and update Env when rotating. No browser OAuth callback or login feature is involved. Separate Firebase projects provide separate project quotas; service accounts in one project do not."
42
42
  ] }
43
43
  });
@@ -17,7 +17,7 @@ const linkedinDefinition = Object.freeze({
17
17
  "Save configuration, then choose Set credential in Env to store Client Secret as LINKEDIN_CLIENT_SECRET. Use Open Env to store the registered callback as LINKEDIN_CALLBACK_URL, or the alternate names you entered in the references. Return to this connection when both values are set.",
18
18
  "For shared or assistant access, choose Connect account and authorize the intended LinkedIn member. For Each user, connection starts from the generated application's account screen after signing in. Verification reads the member's profile; it does not publish or create an application login. Email may be absent even when requested.",
19
19
  "Your application must approve the exact post text and visibility (PUBLIC or CONNECTIONS) before posts.create. The adapter derives the author from the connected member; it cannot publish as an arbitrary person. A timeout may occur after a post was created: check LinkedIn before manually repeating it.",
20
- "LIMITATIONS: text posts only, with no image/video upload, organization posts, scheduling, post editing/deletion or analytics. Example: publish an approved announcement, but not a photo campaign. Saving this connection does not attach LinkedIn tools to Vibe64 coding chat.",
20
+ "LIMITATIONS: text posts only, with no image/video upload, organization posts, scheduling, post editing/deletion or analytics. Example: publish an approved announcement, but not a photo campaign. Your application must explicitly expose approved LinkedIn tools to its assistant.",
21
21
  "Reconnect repeats consent. Ordinary access expiry requires connecting again unless LinkedIn has enabled programmatic refresh for your registration and supplied a refresh token. Disconnect removes the local grant; remove provider access separately through LinkedIn's permitted-services settings. A new app registration or callback may require consent again."
22
22
 
23
23
  ]
package/src/shared/mcp.js CHANGED
@@ -45,7 +45,7 @@ const n8nDefinition = Object.freeze({
45
45
  clientRegistrationEndpoint: (settings) => settings.oauthDiscovery?.resource === settings.serverUrl
46
46
  ? settings.oauthDiscovery.oauth.registration_endpoint : undefined,
47
47
  stepsByAuthentication: { oauth2: [
48
- "LIMITATIONS: Automatic Vibe64 coding-chat attachment is deferred. A separately wired CLI or assistant host can discover and invoke exposed workflows through MCP after approving the exact tool and arguments; connecting alone does not attach chat tools. This connector is not the n8n REST API or a workflow designer.",
48
+ "LIMITATIONS: Assistant tool attachment requires explicit host integration. A separately wired CLI or assistant host can discover and invoke exposed workflows through MCP after approving the exact tool and arguments; connecting alone does not attach chat tools. This connector is not the n8n REST API or a workflow designer.",
49
49
  "In n8n, open Settings → Instance-level MCP and enable access as an instance owner or admin. Copy its full Server URL. In this editor, Discover OAuth settings reads the instance's public authority and permissions. CLI users can call discoverN8nOAuth. A server without advertised OAuth permissions is not supported by this path; use its personal API key method instead.",
50
50
  "Select OAuth and the smallest set of advertised permissions your application needs. Keep Assistant access. Enter the Suggested callback URL your application will actually serve; use the application address, not the editor dashboard. If n8n restricts Allowed callback URLs, ask its owner/admin to allow that exact URL before registration.",
51
51
  "In this editor, choose Register client and connect. This saves the client ID in configuration and the secret, callback and recovery client ID in development Env, then starts your application’s consent flow. It requires unused Env keys and an application-owned callback/setup command. Alternatively, use OAuth client registration below to send the displayed JSON in one POST with Content-Type: application/json, or call registerN8nClient from the CLI. A timeout may still have created a client; investigate before repeating registration.",
@@ -55,7 +55,7 @@ const n8nDefinition = Object.freeze({
55
55
  "Use Reconnect for fresh consent. Disconnect here removes the local grant. Review and remove provider access separately in n8n's Instance-level MCP → Connected clients. Changing the Server URL requires discovery again; a new callback or client registration may also require fresh consent. Your application owns tokens and refresh outside the editor."
56
56
  ] },
57
57
  steps: [
58
- "LIMITATIONS: Automatic Vibe64 coding-chat attachment is deferred. A separately wired CLI or assistant host can discover and invoke exposed workflows through MCP after approving the exact tool and arguments; connecting alone does not attach chat tools. This connector is not the n8n REST API or a workflow designer.",
58
+ "LIMITATIONS: Assistant tool attachment requires explicit host integration. A separately wired CLI or assistant host can discover and invoke exposed workflows through MCP after approving the exact tool and arguments; connecting alone does not attach chat tools. This connector is not the n8n REST API or a workflow designer.",
59
59
  "In n8n, open Settings → Instance-level MCP. An instance owner or admin selects Enable MCP access. This setup uses the personal-token method; n8n's OAuth tab is a different connection path.",
60
60
  "Under Connection details, select Connect → API key. On first opening, n8n generates a personal token for your account. Copy the Server URL and token now: after leaving, the token is redacted. Older versions call this tab Access Token. Do not use a REST API key or a workflow's MCP Server Trigger URL.",
61
61
  "Paste the full HTTPS Server URL ending /mcp-server/http here, keeping any installation subdirectory or port. Keep env:N8N_API_KEY as the token reference. Save configuration, then select Set credential in Env to store the token value. No OAuth app ID or callback is needed for this token method.",
@@ -77,7 +77,7 @@ const sanityDefinition = Object.freeze({
77
77
  url: "https://www.sanity.io/docs/ai/mcp-server",
78
78
  clientRegistrationEndpoint: "https://mcp.sanity.io/register",
79
79
  steps: [
80
- "Choose OAuth for Sanity account consent, or API key for a project-scoped token. This is builder/assistant context, not generated-app login. The editor coding-assistant attachment is deferred; saving alone does not make those tools available in chat.",
80
+ "Choose OAuth for Sanity account consent, or API key for a project-scoped token. This is builder/assistant context, not generated-app login. The assistant host must explicitly attach and authorize these tools; saving alone does not make them available in chat.",
81
81
  "For OAuth, use the exact Suggested callback URL served by your backend. Click Register client and connect to create your client and save its credentials in development Env. For manual setup, POST the shown OAuth client registration JSON once to https://mcp.sanity.io/register, or use registerSanityClient from a CLI, then save client_id and the secret reference. Register only callbacks your backend serves.",
82
82
  "Save the client and callback references, set their values in Env, then connect and approve Sanity account access. The global scope is the provider's MCP scope, not a per-dataset permission selector. Authorize specific project, dataset and tool arguments in your assistant host.",
83
83
  "For API key authentication instead, select API key in Authentication. Open sanity.io/manage, select the intended project, then Settings, API, Tokens and Add new token.",
@@ -39,7 +39,7 @@ const microsoftFabricDefinition = Object.freeze({
39
39
  "Open the existing API for GraphQL and select Copy endpoint. Paste the complete URL into Fabric GraphQL Endpoint. The signed-in user or service principal needs API Execute access; the caller or saved connection also needs underlying data-source permissions. These are separate grants.",
40
40
  "Save configuration, then use Set credential in Env for the secret. User consent also needs Open Env to store the exact registered URL as MICROSOFT_FABRIC_CALLBACK_URL. Connect account uses the selected shared identity; per-user connections happen inside the generated app. Service account connects without a browser consent window.",
41
41
  "Use graphql.execute with an app-approved query, JSON variables and optional operationName. It accepts mutations too: authorize the exact document and inputs on your backend. Partial GraphQL errors fail the call and may follow a successful change; inspect data before retrying.",
42
- "LIMITATIONS: no automatic table browser, schema-specific client, pagination, subscriptions or Vibe64 assistant attachment. Example: query your inventory with its actual schema, but do not expect a generated inventory dashboard or an unrestricted query console.",
42
+ "LIMITATIONS: no automatic table browser, schema-specific client, pagination, subscriptions or automatic assistant attachment. Example: query your inventory with its actual schema, but do not expect a generated inventory dashboard or an unrestricted query console.",
43
43
  "Verification reads only the root type name; it does not test your business queries or mutate data. For optional schema discovery, a workspace administrator enables Introspection in the API settings. Rotate expiring secrets in Env before deleting old ones. Disconnect removes local access, not Fabric permissions or Microsoft consent."
44
44
  ] }
45
45
  });
@@ -81,7 +81,7 @@ const microsoftOneDriveDefinition = Object.freeze({
81
81
  "Save configuration, then use Set credential in Env for the secret and Open Env for the exact registered callback URL. Connect account authorizes the shared account for this project; each app user connects inside the generated app in per-user mode. This connector does not establish application login.",
82
82
  "Use an account with OneDrive already provisioned. Verification only lists its drive root. Browse folders with items.list(folderId), then items.get for metadata and a short-lived download URL. That URL grants file access: send it only to the authorized app user, never log/cache it, and download without forwarding the Microsoft Authorization header. Folder metadata has no download URL.",
83
83
  "files.upload needs Files.ReadWrite, a parent folder ID, file name and Base64 content up to 5 MB. Its conflict behavior defaults to fail; explicitly approve replace before overwriting. Do not retry uncertain uploads automatically: inspect the folder first.",
84
- "LIMITATIONS: larger/resumable transfers use your framework's native Graph upload-session client. No file manager, sharing editor, app-folder automation or Vibe64 tool attachment is supplied. Example: upload a small report and provide its download link; a multi-gigabyte video needs native transfer wiring.",
84
+ "LIMITATIONS: larger/resumable transfers use your framework's native Graph upload-session client. No file manager, sharing editor, app-folder automation or automatic assistant tool attachment is supplied. Example: upload a small report and provide its download link; a multi-gigabyte video needs native transfer wiring.",
85
85
  "Replace expiring client secrets in Env before removing the old secret. Reconnect after consent or permission changes. Disconnect removes the project's local grant; remove Microsoft consent separately through the account or directory's application-permission controls."
86
86
  ]
87
87
  }
@@ -106,7 +106,7 @@ const microsoftExcelDefinition = Object.freeze({
106
106
  "Verification lists the signed-in user's drive root without requiring a workbook ID or changing files. Your app can browse folders using items.list and pass a workbook's returned id to worksheets.list. Worksheet access needs Files.ReadWrite and a supported accessible workbook; successful connection alone does not prove either.",
107
107
  "After selecting a workbook and worksheet, ranges.get reads a bounded A1 address such as A1:B2. ranges.update writes an exactly matching matrix of values OR formulas, up to 10,000 cells. A null cell leaves its existing value unchanged. Your app must approve the target and content before writing; the form itself never edits cells.",
108
108
  "For repeated operations, sessions.create requires an explicit persistChanges choice: true saves edits, false uses a temporary copy. Pass the returned sessionId to each range call and close it with sessions.close. Use a work or school account for sessions; Microsoft does not support personal accounts for session close. Without a session, edits persist. Do not automatically repeat a write after a timeout; inspect the workbook first.",
109
- "LIMITATIONS: no workbook creation, charts, pivot tables, formatting editor or asynchronous session polling. Example: update a budget range and formula, but do not receive a spreadsheet designer. Application login and Vibe64 assistant tool attachment remain separate.",
109
+ "LIMITATIONS: no workbook creation, charts, pivot tables, formatting editor or asynchronous session polling. Example: update a budget range and formula, but do not receive a spreadsheet designer. Application login and assistant tool attachment remain separate.",
110
110
  "Replace expiring client secrets in Env before deleting the old secret. Reconnect when consent expires or permissions change. Disconnect removes the project's local grant; Microsoft consent remains until removed through the account or directory's application-permission controls."
111
111
  ]
112
112
  }
@@ -133,7 +133,7 @@ const microsoftTeamsDefinition = Object.freeze({
133
133
  "Save configuration, then use Set credential in Env for the secret and Open Env for the registered callback. Connect account authorizes the shared account for this project. In per-user mode, each generated-app user connects separately. Connecting the builder does not connect everyone; application login is separate.",
134
134
  "Verification lists teams where the signed-in account is a direct member. An empty list can be valid, and access to a shared channel does not necessarily include its host team. Use channels.list for a selected team. Reading messages/replies needs ChannelMessage.Read.All; sending needs ChannelMessage.Send. Enable the chosen permission in Entra and this form, obtain any administrator consent, then reconnect.",
135
135
  "messages.list and replies.list read channel conversations; messages.send and replies.send send plain text to the explicitly selected channel/thread. Existing chats use chats.list, chatMessages.list and chatMessages.send with Chat.ReadWrite. The app must approve each destination and message; do not retry uncertain sends automatically. Sanitize returned HTML before display.",
136
- "LIMITATIONS: no team/chat creation, membership changes, message edits/deletion, attachments, meeting bot or Vibe64 tool attachment. Example: read a channel and post an approved status update, but do not receive a Teams client or automatic team administration. Profile-read consent does not create a user-directory feature.",
136
+ "LIMITATIONS: no team/chat creation, membership changes, message edits/deletion, attachments, meeting bot or automatic assistant tool attachment. Example: read a channel and post an approved status update, but do not receive a Teams client or automatic team administration. Profile-read consent does not create a user-directory feature.",
137
137
  "Rotate expiring secrets in Env before deleting the old secret. Reconnect after consent or permission changes. Disconnect removes local grants; Microsoft account or directory application-permission controls manage provider consent separately."
138
138
  ]
139
139
  }
@@ -158,7 +158,7 @@ const microsoftOneNoteDefinition = Object.freeze({
158
158
  "Save configuration, then use Set credential in Env for the secret and Open Env for the callback. Connect account authorizes the shared account this project will use. In per-user mode, each user connects inside the generated application. OneNote authorization does not create your application's login session.",
159
159
  "Verification lists the signed-in user's notebooks without creating a notebook or changing pages. Browse notebooks, sections and pages with notebooks.list, sections.list and pages.list; pages.content returns HTML up to 1 MiB. The app must sanitize HTML before rendering it, or show it as plain text. Use an account with access to the notebooks your application needs.",
160
160
  "To create a note, add Notes.Create (or Notes.ReadWrite), reconnect, then call pages.create with a section ID, title and plain text. To append text to an existing page, add Notes.ReadWrite and call pages.append with its page ID and text. Text is escaped, not treated as HTML. Approve the destination and content before writes; inspect the page before retrying an uncertain result.",
161
- "LIMITATIONS: no rich-text editor, binary attachments, page replacement/deletion, nested section-group traversal or Vibe64 tool attachment. Example: create meeting notes and append an action item, but do not expect an embedded OneNote designer or image upload.",
161
+ "LIMITATIONS: no rich-text editor, binary attachments, page replacement/deletion, nested section-group traversal or automatic assistant tool attachment. Example: create meeting notes and append an action item, but do not expect an embedded OneNote designer or image upload.",
162
162
  "Rotate expiring client secrets in Env before deleting the old secret. Reconnect after consent or permission changes. Disconnect removes the project's local grant; Microsoft account or directory application-permission controls manage provider consent separately."
163
163
  ]
164
164
  }
@@ -188,7 +188,7 @@ const microsoftSharePointDefinition = Object.freeze({
188
188
  "Use an account with access to the intended SharePoint sites. Verification searches site names and other indexed properties without changing a site. Empty results can be a successful search. It does not crawl documents, edit lists or grant access to additional sites. Sites.Selected application permissions are not supported by this search operation.",
189
189
  "After sites.search, use the returned site ID with libraries.list or lists.list. files.list browses a selected drive and folder; files.get supplies metadata/private short-lived download links. Never log these links or forward the Microsoft bearer token to them. files.upload supports up to 5 MB and defaults to fail on an existing name; approve replace explicitly.",
190
190
  "listItems.list returns fields and ETags. listItems.create/update accepts internal column names and scalar values. Updates require the current eTag; if Microsoft returns 412, reload and review the conflicting edit rather than overwriting. Approve the site, list and values in your app before writing.",
191
- "LIMITATIONS: no site-collection creation, SharePoint admin UI, complex field editors, sharing/permissions editor or Vibe64 tool attachment. Large/resumable file transfers need native Graph wiring. Example: update a project-status list and upload a report, but do not receive a SharePoint site builder.",
191
+ "LIMITATIONS: no site-collection creation, SharePoint admin UI, complex field editors, sharing/permissions editor or automatic assistant tool attachment. Large/resumable file transfers need native Graph wiring. Example: update a project-status list and upload a report, but do not receive a SharePoint site builder.",
192
192
  "Rotate expiring secrets in Env before removing the old secret. Reconnect after consent or permission changes. Disconnect removes local grants; use Microsoft account or directory application-permission controls to manage provider consent separately."
193
193
  ]
194
194
  }
@@ -17,7 +17,7 @@ const miroDefinition = Object.freeze({
17
17
  "Keep env:MIRO_CLIENT_SECRET and env:MIRO_CALLBACK_URL as references. Save configuration, then use Set credential in Env for the returned secret and Open Env for the exact registered callback. Changing this form does not update an already registered client.",
18
18
  "Click Connect account, sign into Miro and select the team containing the boards you want. Review access and Continue back to your host. Reconnect and choose the correct team if board access fails. Team and organization policies still apply.",
19
19
  "Verification discovers available tools without executing them. The assistant host must authorize each tool and its exact board arguments before use. Discovery does not prove access to a particular board. Identity scopes do not configure app login, and this connection does not attach tools to chat automatically.",
20
- "LIMITATIONS: connecting does not attach Miro tools to Vibe64 coding chat. Example: an explicitly wired CLI/assistant host can read a board or request a diagram through discovered tools, but Vibe64 will not automatically see that board in your conversation. This shared attachment feature is deferred. No embedded board editor is provided.",
20
+ "LIMITATIONS: connecting alone does not attach Miro tools to an assistant. Example: an explicitly wired CLI/assistant host can read a board or request a diagram through discovered tools. The application must explicitly supply that board to the conversation. No embedded board editor is provided.",
21
21
  "Reconnect to change teams or consent. Disconnect removes local grants; manage provider access separately in Miro. Keep registration secrets in Env and replace expiring credentials through the provider's supported setup before they expire."
22
22
 
23
23
  ]
@@ -15,8 +15,8 @@ const ouraDefinition = Object.freeze({
15
15
  "Provide the application name and website describing your integration. Add the exact Suggested callback URL from this screen to the registration's allowed redirect URIs, including scheme and path. Your application's backend must serve that callback. The hosting URL suggested here is the starting point; update the provider and Env together if your app moves to a custom domain.",
16
16
  "Copy the assigned Client ID here. Keep env:OURA_CLIENT_SECRET and env:OURA_CALLBACK_URL as references and Save configuration. Use Set credential in Env to store the Client Secret as OURA_CLIENT_SECRET, and Set callback in Env to store the registered URL as OURA_CALLBACK_URL. Keep the actual secret out of configuration JSON and chat.",
17
17
  "Keep daily permission selected: verification reads daily sleep summaries. Select heartrate only for heart-rate samples; personal or email only if your application needs those profile fields. Each app user connects their own account and may decline individual permissions; declining daily prevents this connection from being verified. This grants Oura data access, not application login.",
18
- "In Vibe64, choose Prepare app user connection request to prepare the application wiring. Once implemented, each user opens the application's own account screen, connects Oura and approves access. Oura documents a ten-user limit before application approval; request review from the application's page for wider use. Gen3 and later users need an active Oura Membership for API data. If verification is forbidden, check membership and granted permissions; an empty sleep list can mean there is no synced data yet.",
19
- "In the application, reconnect starts consent again and disconnect removes that user's local grant; manage the application's authorization in Oura separately. The application owns stored grants and single-use refresh tokens, including after leaving Vibe64. Preserve its private connection store when moving hosts."
18
+ "Prepare the application’s per-user connection wiring before users connect. Once implemented, each user opens the application's own account screen, connects Oura and approves access. Oura documents a ten-user limit before application approval; request review from the application's page for wider use. Gen3 and later users need an active Oura Membership for API data. If verification is forbidden, check membership and granted permissions; an empty sleep list can mean there is no synced data yet.",
19
+ "In the application, reconnect starts consent again and disconnect removes that user's local grant; manage the application's authorization in Oura separately. The application owns stored grants and single-use refresh tokens, across hosting changes. Preserve its private connection store when moving hosts."
20
20
  ]
21
21
  }
22
22
  });
@@ -30,7 +30,7 @@ const snowflakeDefinition = Object.freeze({
30
30
  hint: "Exact case-sensitive schema name for SQL execution; blank uses the user's default namespace." },
31
31
  { name: "accountUrl", label: "Account URL", placeholder: "https://myorg-myaccount.snowflakecomputing.com",
32
32
  hint: "Copy the account URL from Snowflake. Snowsight browser paths and organization-console URLs are not API addresses." },
33
- { name: "role", label: "Role", placeholder: "VIBE64_READER",
33
+ { name: "role", label: "Role", placeholder: "APP_READER",
34
34
  hint: "Use the exact name from SHOW ROLES, normally uppercase. Leave blank to use each connected user's default role. Shared accounts should use a dedicated role." }
35
35
  ],
36
36
  scopes: [{ value: "refresh_token", label: "Keep access between visits (required)", recommended: true, required: true }],
@@ -45,7 +45,7 @@ const notionDefinition = Object.freeze({
45
45
  : method === "oauth2" ? "https://developers.notion.com/guides/get-started/public-connections" : notionInternalDefinition.setup.url,
46
46
  clientRegistrationEndpoint: (settings) => settings.connectionType === "mcp" ? "https://mcp.notion.com/register" : undefined,
47
47
  stepsForSettings: (settings, method) => settings.connectionType === "mcp" ? [
48
- "LIMITATIONS: Automatic Vibe64 coding-chat attachment is deferred. A wired host may call discovered tools after authorizing each call; merely saving this connection does not equip coding chat. REST content operations belong to Application data mode.",
48
+ "LIMITATIONS: Assistant tool attachment requires explicit host integration. A wired host may call discovered tools after authorizing each call; merely saving this connection does not equip coding chat. REST content operations belong to Application data mode.",
49
49
  "Choose Hosted assistant tools (MCP). This uses Notion's hosted MCP service, with a separate OAuth client from a public REST connection. Keep Assistant access and the required Notion MCP access permission.",
50
50
  "Use the OAuth client registration request below with the exact callback your assistant host serves. Send its JSON once to https://mcp.notion.com/register, or use registerNotionMcpClient from the JSKIT CLI code. A timeout may still create a client; inspect the result before retrying.",
51
51
  "Copy the returned client_id into Client ID. Save client_secret in the referenced Env variable and the registered callback in its callback Env variable. Save configuration. Do not paste the full registration response or secret into configuration or chat.",
@@ -59,7 +59,7 @@ const notionDefinition = Object.freeze({
59
59
  "Copy the Suggested callback URL for your application into Notion's Redirect URIs. Your application must serve this exact callback. Complete the provider's required fields and create the connection. Marketplace listing is a separate process.",
60
60
  "In Configuration, copy OAuth client ID here. Keep env:NOTION_CLIENT_SECRET and env:NOTION_CALLBACK_URL as references. Save configuration, then use Set credential in Env for the OAuth client secret and Set callback in Env for the registered URL. Keep the secret out of source and chat.",
61
61
  "Choose Each app user's own account when users need separate grants, or One shared account for an application-owned shared connection. Connect account opens consent. Select the intended workspace and pages, then Allow access. This authorizes Notion data; it does not log someone into your application.",
62
- "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 after leaving Vibe64."
62
+ "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."
63
63
  ] } }
64
64
  });
65
65
  const brevoDefinition = definition("brevo", "Brevo", "Send email and SMS, manage contacts and campaigns, and track delivery and automation events.",
@@ -80,7 +80,7 @@ const elevenlabsDefinition = definition("elevenlabs", "ElevenLabs", "Generate sp
80
80
  "Enter env:ELEVENLABS_API_KEY in API key reference and save. Choose Set credential in Env, paste the key as ELEVENLABS_API_KEY and save there. Return and choose Connect account / Verify again; Check connection only reads saved status. Verification reads the account and does not generate audio or prove generation/cloning permissions.",
81
81
  "Choose an accessible voice and a model supporting text-to-speech. Generation spends this workspace’s credits. Voice availability and formats depend on the plan; a valid key does not grant every library voice. The app owns its text/audio screens and usage limits.",
82
82
  "Instant Voice Cloning requires an eligible plan (Starter or above), an available voice slot and permission to clone the speaker. In Voices > Add a new voice > Instant Voice Clone, provide clear audio, name the voice and confirm rights; or have the app explicitly upload authorized samples. If requires_verification is true, finish ElevenLabs verification before treating the new voice as ready.",
83
- "This connector returns bounded audio files, not live streaming. Professional Voice Cloning and realtime speech use native provider tools. Configuring it does not attach ElevenLabs to Vibe64’s coding 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
+ "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."
84
84
  ]);
85
85
  const githubApiDefinition = Object.freeze({
86
86
  ...definition("github-api", "GitHub API", "Read repository content and activity; create and update issues and pull requests.",
@@ -90,7 +90,7 @@ const githubApiDefinition = Object.freeze({
90
90
  "Choose only the permissions this application needs. Connect the shared account here; for each user's own account, the generated application's account screen starts the connection.",
91
91
  "For a personal token, select API key instead. In GitHub Settings > Developer settings > Personal access tokens > Fine-grained tokens, generate a token with an expiry, resource owner and selected repositories. Metadata read access covers repository listing; allow Contents read for files/commits/releases, Actions read for workflow runs, Issues read or write and Pull requests read or write for the operations you enable; complete organization approval if required.",
92
92
  "For token setup enter env:GITHUB_API_KEY as the API key reference, Save configuration, then Set credential in Env. Store the real token as GITHUB_API_KEY and return and choose Connect account or Verify again. Check connection reads saved status. Personal tokens need no OAuth callback.",
93
- "For OAuth private repositories request repo; public-only writes can use public_repo. These scopes are broader than fine-grained token permissions. Issue/PR writes are explicit app actions and are never performed during verification. This API connector does not synchronize project code or replace Vibe64 Git login.",
93
+ "For OAuth private repositories request repo; public-only writes can use public_repo. These scopes are broader than fine-grained token permissions. Issue/PR writes are explicit app actions and are never performed during verification. This API connector does not synchronize project code or replace Git transport authentication.",
94
94
  "Verification reads the connected account profile; repository access still depends on token permissions and organization policy. Update rotated credentials in Env. Disconnect removes local state; revoke the token or OAuth authorization in GitHub separately."
95
95
  ]),
96
96
  accountModes: ["shared", "per-user", "assistant"],
@@ -274,7 +274,7 @@ const linearKeyDefinition = definition("linear", "Linear", "Read profiles and is
274
274
  "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.",
275
275
  "Enter env:LINEAR_API_KEY as API key reference, keep Read selected and Save configuration. Choose Set credential in Env, store the actual key as LINEAR_API_KEY, and return to Connect account. The secret belongs in Env, not this form or source control.",
276
276
  "Verification reads the connected profile; it does not create issues. This key connects one account for shared or assistant use. To let each application user connect their own account, select OAuth instead.",
277
- "Your application can discover Linear MCP tools and use the returned schemas to create projects and create/update issues. Approve each tool name and its arguments before calling it; check isError before reporting success. Connecting here does not attach tools to Vibe64 Codex/OpenCode: for example, a saved connection alone does not let the coding chat edit an issue.",
277
+ "Your application can discover Linear MCP tools and use the returned schemas to create projects and create/update issues. Approve each tool name and its arguments before calling it; check isError before reporting success. Connecting alone does not attach tools to an assistant: for example, a saved connection alone does not let the coding chat edit an issue.",
278
278
  "MCP uses the same key with its permissions. Read-only keys cannot perform writes; your application must authorize individual tool calls. Disconnect removes the local connection. Revoke or replace the key in Linear separately."
279
279
  ]);
280
280
  const linearDefinition = Object.freeze({
@@ -296,7 +296,7 @@ const linearDefinition = Object.freeze({
296
296
  "Keep Read selected. Add write, issue creation, comment creation or time-schedule permissions only for features your application will actually expose. This connection acts as the consenting user. It does not create a Linear service-account agent.",
297
297
  "Save and choose Connect account for shared or assistant access. For Each user, connect from the generated application's account screen after signing in. Select the intended Linear workspace and approve access; connecting Linear is separate from logging into your application.",
298
298
  "The same OAuth grant can access GraphQL and https://mcp.linear.app/mcp. No separate MCP client registration is needed for this path. Verification only reads your profile. The application must authorize MCP tool calls, and the granted permissions limit which actions Linear permits.",
299
- "Discover MCP tools at runtime and use their returned schemas to create projects or create/update issues. Your app owns tool approval and must check isError before reporting success. LIMITATION: saving this connection does not attach tools to Vibe64 Codex/OpenCode; the coding chat cannot edit an issue merely because you connected Linear.",
299
+ "Discover MCP tools at runtime and use their returned schemas to create projects or create/update issues. Your app owns tool approval and must check isError before reporting success. LIMITATION: saving this connection does not attach tools to an assistant; the coding chat cannot edit an issue merely because you connected Linear.",
300
300
  "Reconnect repeats consent. Disconnect removes this project's local grant; revoke provider access separately in Linear Settings > Account > Security & Access > Authorized applications. Use a separate connection for another workspace. Changing registration or callback may require connecting again."
301
301
  ] }
302
302
  }
@@ -456,7 +456,7 @@ const sentryDefinition = Object.freeze({
456
456
  { 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." }
457
457
  ],
458
458
  setup: { url: "https://mcp.sentry.dev/", clientRegistrationEndpoint: "https://mcp.sentry.dev/oauth/register", steps: [
459
- "This is assistant context, not application login or SDK error-reporting setup. Editor coding-assistant attachment is deferred; saving alone does not give Vibe64 chat access to errors.",
459
+ "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.",
460
460
  "Open the intended organization in Sentry and copy its slug from the URL. Open the intended project's Settings for its slug. Project scoping is recommended; use slugs rather than display names or numeric IDs.",
461
461
  "Enter the exact HTTPS callback served by your backend in Suggested callback URL, then choose Register client and connect. This registers at https://mcp.sentry.dev/oauth/register and saves the client ID in configuration and its secret/callback in development Env. CLI users can call registerSentryClient instead. This is an MCP client, not a Sentry REST OAuth application.",
462
462
  "Save configuration and connect. Sign into Sentry and review the selected organization/project and MCP permissions before approving. Tool availability also depends on skills granted in Sentry's consent screen and your account permissions; configuration cannot grant extra access.",
@@ -471,7 +471,7 @@ const incidentIoDefinition = definition("incident-io", "incident.io", "Manage in
471
471
  "Enter env:INCIDENT_IO_API_KEY as API key reference and Save configuration. Choose Set credential in Env, save the actual token as INCIDENT_IO_API_KEY, return and choose Connect account. Verification reads incidents without changing them. This mode needs no OAuth client or callback URL.",
472
472
  "Creating incidents requires an application idempotency key and explicit public/private visibility; standard incidents may announce in Slack. Edits require an explicit notify_incident_channel choice. Follow-up updates require the current title and target status. Catalogue updates require the intended full attribute values. Your app must authorize each resource and action, retain IDs and reconcile uncertain writes.",
473
473
  "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.",
474
- "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. Editor coding-assistant attachment is deferred."
474
+ "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."
475
475
  ]);
476
476
  const firefliesDefinition = definition("fireflies", "Fireflies", "Read and search Fireflies meetings, speaker-attributed transcripts and summaries.",
477
477
  "https://docs.fireflies.ai/fundamentals/authorization", [
@@ -517,7 +517,7 @@ const perplexityDefinition = definition("perplexity", "Perplexity", "Connect you
517
517
  "Open API Keys and generate a named key for that project. Copy its full value immediately; it is only shown at creation.",
518
518
  "Enter env:PERPLEXITY_API_KEY in API key reference here and save. Choose Set credential in Env, paste the key as the PERPLEXITY_API_KEY value and save it there. Return here and choose Connect account or Verify again; Check connection only reloads status.",
519
519
  "No OAuth registration or callback URL is needed. Verification lists asynchronous Sonar requests without submitting a generation request. Listing the public model catalogue alone does not verify your key.",
520
- "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. It pays Perplexity directly; there is no Vibe64 inference gateway. 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.",
520
+ "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.",
521
521
  "For replacement, create another key and update Env before revoking the old key. A revoked key cannot be recovered."
522
522
  ]);
523
523
  const supabaseDefinition = definition("supabase", "Supabase", "List projects through the Supabase Management API.",
@@ -574,7 +574,7 @@ const mailgunDefinition = Object.freeze({
574
574
  "Verification reads the selected region's domain list. It sends no messages, configures no DNS, and does not prove that a domain is ready to send. An empty list can mean the account has no domains in that region. Changing region requires verification again.",
575
575
  "Before sending, open Send > Sending > Domains > Add new domain in Mailgun. Add the exact sending DNS records shown under Domain Verification & DNS at your DNS host, then verify the domain. Choose a sender at that domain in your app. Sandbox domains only send to authorized recipients; queued does not mean delivered.",
576
576
  "The app can send text/HTML with messages.send and inspect logs.list by sending domain. Keep the queued message ID, show actual delivery/failure events, and use an app-owned bounded polling schedule. If sending times out, check logs before manually repeating the request; there is no automatic resend.",
577
- "LIMITATIONS: no attachments, stored templates, mailing-list/campaign UI, inbound routes or webhook receiver. Example: send and track a receipt email, but not attach its PDF through this adapter. The app owns sender/recipient authorization, content and duplicate prevention. Connecting does not attach Mailgun tools to Vibe64 coding chat.",
577
+ "LIMITATIONS: no attachments, stored templates, mailing-list/campaign UI, inbound routes or webhook receiver. Example: send and track a receipt email, but not attach its PDF through this adapter. The app owns sender/recipient authorization, content and duplicate prevention. Your application must explicitly expose approved Mailgun tools to its assistant.",
578
578
  "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."
579
579
  ]),
580
580
  settingsSchema: createSchema({ region: { type: "string", enum: ["us", "eu"], defaultTo: "us" } }),
@@ -626,7 +626,7 @@ const storyblokDefinition = Object.freeze({
626
626
  "Copy the token into Env and select the space's region here. Management API personal tokens are different credentials.",
627
627
  "Save its reference, for example env:STORYBLOK_TOKEN. There is no OAuth client or callback. Connect verifies space access; an empty content list does not prove draft permission.",
628
628
  "For a public site, use a Public token and published content. Keep Preview tokens in a separate backend integration and require editor authorization before draft reads; never expose preview responses in public caches.",
629
- "Your app maps page slugs to story reads and renders its own components. It owns pagination, cache refresh after publishing and preview access. Saving this configuration does not create a website or attach the Vibe64 coding assistant.",
629
+ "Your app maps page slugs to story reads and renders its own components. It owns pagination, cache refresh after publishing and preview access. Saving this configuration does not create a website or attach tools to an assistant.",
630
630
  "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."
631
631
  ]),
632
632
  settingsSchema: createSchema({ region: { type: "string", enum: ["eu", "us", "ca", "ap", "cn"], defaultTo: "eu" } }),
@@ -654,7 +654,7 @@ const lexwareDefinition = definition("lexware", "Lexware", "Read accounting cont
654
654
  "Enter env:LEXWARE_API_KEY in API key reference here and save. Choose Set credential in Env, paste the key as the LEXWARE_API_KEY value and save it there. Return here and choose Connect account or Verify again. Check connection only refreshes status.",
655
655
  "Draft invoices require an existing contact UUID, invoice and service/delivery dates with timezones, and custom lines with quantity, unit, net EUR amount and tax rate. Choose those accounting values in the app; the connector does not infer tax. Review and finalize drafts in Lexware. No email or payment is sent.",
656
656
  "An interrupted invoice creation may already have succeeded. Check the voucher list before repeating it. Respect the provider limit of two requests per second across endpoints. The app must authorize each contact/document and approve writes before calling the connector.",
657
- "This adapter does not create contacts/articles/vouchers, download PDFs, finalize invoices, upload receipts or receive accounting events. For example, it can prepare a draft booking invoice for an existing customer, but receipt intake and signed event processing need native app implementation. Editor-assistant attachment is deferred.",
657
+ "This adapter does not create contacts/articles/vouchers, download PDFs, finalize invoices, upload receipts or receive accounting events. For example, it can prepare a draft booking invoice for an existing customer, but receipt intake and signed event processing need native app implementation.",
658
658
  "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 publish."
659
659
  ]);
660
660
  const sevdeskDefinition = Object.freeze({
@@ -722,7 +722,7 @@ const clayDefinition = Object.freeze({
722
722
  "Search creation and next-page requests are explicit operations and can consume provider capacity. Approve the query and result volume before using them. Pages advance a stateful iterator, so an interrupted next-page request must not be retried automatically.",
723
723
  "Routine runs can spend Clay credits. In Clay, open Functions > select your function > Details > enable API. Copy its t_... function ID and prefix it with function:. Use the inputs defined by that function. Approve the routine, inputs and volume before running it. A returned in_progress run ID is not a finished enrichment: fetch results later and inspect each item for errors. Never automatically repeat an uncertain run.",
724
724
  "Table queries require Clay Enterprise. Open the target table and copy the ID after /tables/ in its URL. There is no public list-tables API. Use that ID with selected fields and filters; preserve cursors and deduplicate records by ID during concurrent edits. A truncated result without a cursor requires a narrower query.",
725
- "Search filters use the current query-mode reference. The legacy filters-mode API is deprecated. Vibe64 saves this connection configuration; automatically attaching Clay tools to the coding assistant remains unavailable.",
725
+ "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.",
726
726
  "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."
727
727
  ]),
728
728
  apiKeyReferenceLabel: "Public API key reference"
@@ -38,7 +38,7 @@ const waveDefinition = Object.freeze({
38
38
  ],
39
39
  setup: { url: "https://developer.waveapps.com/hc/en-us/articles/50682251860884-2-Create-an-application", steps: [
40
40
  "Sign in to Wave, open Manage applications in the developer portal, and choose Create New Application. Enter your application name and its backend Redirect URI, then save the application.",
41
- "Use this project's deployed application URL as the callback origin, followed by the callback route implemented by its backend. Register that exact URL in Wave; do not use the Vibe64 editor address.",
41
+ "Use this project's deployed application URL as the callback origin, followed by the callback route implemented by its backend. Register that exact URL in Wave; do not use an editor address.",
42
42
  "Copy the issued Client ID into Client ID. Put the issued Client Secret in the project's Env, then enter its env:VARIABLE reference in Client secret reference. A personal access token is not a Client Secret.",
43
43
  "Put the same registered callback URL in the project's Env and enter its env:VARIABLE reference in Callback URL reference. The backend must serve that route and use the same callback during token refresh.",
44
44
  "Wave OAuth access requires an active Pro or Wave Advisor business subscription. Integrations for other Wave users require Wave approval.",
package/test/ai.test.js CHANGED
@@ -14,16 +14,30 @@ const request = { context: actor, integrationId: "suggestions" };
14
14
  const authorize = async (context) => context?.applicationId === actor.applicationId ? context : null;
15
15
  const validate = (config) => validateIntegrationConfiguration(config, { providers: [aiDefinition] });
16
16
 
17
- test("AI preserves the upstream snapshot, exposes every provider and separates deprecated models", () => {
17
+ test("AI retains the attributed snapshot with reviewed current identities and explicit deprecations", () => {
18
18
  assert.equal(aiCatalogue.extractedAt, "2026-09-10");
19
19
  assert.equal(aiCatalogue.providers.length, 213);
20
- assert.equal(listAiModels({ includeDeprecated: true }).length, 7614);
20
+ assert.equal(listAiModels({ includeDeprecated: true }).length, 7613);
21
21
  assert.match(aiCatalogue.sourceSha256, /^[a-f0-9]{64}$/u);
22
22
  assert.equal(getAiModel("opencode/grok-code").status, "deprecated");
23
23
  assert.equal(listAiModels().some((model) => model.key === "opencode/grok-code"), false);
24
24
  assert.equal(aiCatalogue.providers.find((provider) => provider.id === "amazon-bedrock").connection, "framework");
25
25
  });
26
26
 
27
+ test("DeepSeek uses its current exact Flash identity and rejects retired provider aliases", async () => {
28
+ const current = "deepseek/deepseek-flash";
29
+ assert.equal(getAiModel(current).name, "DeepSeek V4.1 Flash");
30
+ assert.deepEqual(getAiModel(current).modalities.input, ["text", "image"]);
31
+ const config = configuration({ settings: { model: current }, authentication: { method: "api-key", secretRef: "env:KEY" } });
32
+ const resolver = createAiConnectionResolver({ configuration: config, authorize, resolveReference: () => "test-key" });
33
+ assert.equal((await resolver.resolve(request)).model, "deepseek-flash");
34
+ for (const model of ["deepseek/deepseek-v4-flash", "deepseek/deepseek-v4-flash-vision-exp"]) {
35
+ assert.equal(getAiModel(model), undefined);
36
+ assert.equal(listAiModels({ providerId: "deepseek", includeDeprecated: true }).some(entry => entry.key === model), false);
37
+ assert.throws(() => validate(configuration({ ...config.integrations.suggestions, settings: { model } })), { code: "integration_configuration_invalid" });
38
+ }
39
+ });
40
+
27
41
  test("AI lists every active Zen public model first and uses Big Pickle as the explicit default", () => {
28
42
  assert.equal(listAiModels()[0].key, DEFAULT_AI_MODEL);
29
43
  assert.deepEqual(listAiModels({ access: "free-no-setup" }).map((model) => model.id).sort(), [
@@ -67,6 +81,7 @@ test("AI resolves no-account SDK parameters without environment, network or an O
67
81
  const resolver = createAiConnectionResolver({ configuration: configuration(), authorize,
68
82
  resolveReference: () => { throw new Error("Free mode must not resolve credentials."); } });
69
83
  assert.deepEqual(await resolver.resolve(request), { providerId: "opencode", model: "big-pickle",
84
+ modelLimits: getAiModel(DEFAULT_AI_MODEL).limit,
70
85
  sdkPackage: "@ai-sdk/openai-compatible", baseURL: "https://opencode.ai/zen/v1", apiKey: "public", access: "free-no-setup" });
71
86
  assert.equal(globalThis.fetch.mock.callCount(), 0);
72
87
  assert.equal(Object.hasOwn(resolver, "invoke"), false);
@@ -64,6 +64,7 @@ async function fixture(t, grantType = "authorization_code") {
64
64
  const timer = setTimeout(() => reject(new Error("Missing abort")), 1000);
65
65
  const abort = () => { clearTimeout(timer); reject(init.signal.reason); };
66
66
  if (init.signal.aborted) abort(); else init.signal.addEventListener("abort", abort, { once: true });
67
+ state.started?.();
67
68
  });
68
69
  if (state.status === 204) return new Response(null, { status: 204 });
69
70
  if (typeof state.value === "string") return new Response(state.value, { status: state.status });
@@ -227,8 +228,9 @@ test("Fabric cancelled or denied consent keeps existing access and consumes the
227
228
  test("Fabric aborts hanging requests without replay and local disconnect removes access", async (t) => {
228
229
  const f = await fixture(t); await f.connect(); f.state.hang = true;
229
230
  const before = f.requests.length; const controller = new AbortController();
231
+ const started = new Promise((resolve) => { f.state.started = resolve; });
230
232
  const pending = f.service.invoke({ ...args, operation: "graphql.execute", input: { query: "mutation Write { updateStock(id: 4) { id } }" }, signal: controller.signal });
231
- setTimeout(() => controller.abort(), 5);
233
+ await Promise.race([started, pending]); controller.abort();
232
234
  await assert.rejects(pending, { code: "connector_cancelled" }); assert.equal(f.requests.length, before + 1);
233
235
  await assert.rejects(f.service.invoke({ ...args, operation: "connection.check" }), { code: "connector_provider_timeout" });
234
236
  assert.equal(f.requests.length, before + 2);