@agent-native/core 0.114.13 → 0.114.15

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 (151) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +15 -0
  3. package/corpus/core/docs/content/deployment.mdx +1 -1
  4. package/corpus/core/docs/content/frames.mdx +1 -1
  5. package/corpus/core/docs/content/integrations.mdx +27 -27
  6. package/corpus/core/docs/content/pr-visual-recap.mdx +17 -13
  7. package/corpus/core/docs/content/workspace-management.mdx +1 -1
  8. package/corpus/core/package.json +2 -1
  9. package/corpus/core/src/agent/engine/builder-engine.ts +4 -0
  10. package/corpus/core/src/client/AgentPanel.tsx +10 -4
  11. package/corpus/core/src/client/ConnectBuilderCard.tsx +5 -1
  12. package/corpus/core/src/client/chat/markdown-renderer.tsx +3 -5
  13. package/corpus/core/src/client/error-format.ts +2 -1
  14. package/corpus/core/src/client/index.ts +1 -0
  15. package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +2 -18
  16. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +43 -32
  17. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +4 -2
  18. package/corpus/core/src/client/settings/BackgroundAgentSection.tsx +5 -1
  19. package/corpus/core/src/client/settings/SettingsPanel.tsx +4 -4
  20. package/corpus/core/src/client/settings/useBuilderStatus.ts +3 -0
  21. package/corpus/core/src/localization/default-messages.ts +1 -7
  22. package/corpus/core/src/server/builder-browser.ts +4 -0
  23. package/corpus/core/src/server/builder-design-systems.ts +6 -1
  24. package/corpus/core/src/server/fusion-app.ts +5 -1
  25. package/corpus/core/src/shared/builder-link-tracking.ts +41 -0
  26. package/corpus/core/src/shared/index.ts +1 -0
  27. package/corpus/templates/analytics/AGENTS.md +10 -1
  28. package/corpus/templates/analytics/actions/save-dashboard-report-subscription.ts +10 -2
  29. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +5 -4
  30. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +20 -32
  31. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/report-panel-window.ts +62 -0
  32. package/corpus/templates/analytics/changelog/2026-07-21-chart-series-controls-stay-open-while-moving-from-the-legend.md +6 -0
  33. package/corpus/templates/analytics/changelog/2026-07-21-dashboard-email-captures-complete-large-dashboards-in-chunks.md +6 -0
  34. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +4 -4
  35. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +1 -8
  36. package/corpus/templates/analytics/server/lib/dashboard-report-subscriptions.ts +39 -7
  37. package/corpus/templates/analytics/server/lib/dashboard-report.ts +341 -251
  38. package/corpus/templates/analytics/server/lib/first-party-dashboard-repair.ts +114 -0
  39. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +84 -6
  40. package/corpus/templates/analytics/server/plugins/db.ts +13 -0
  41. package/corpus/templates/clips/app/components/player/video-player.tsx +10 -4
  42. package/corpus/templates/clips/changelog/2026-07-21-choose-which-whisper-model-to-use-in-settings.md +6 -0
  43. package/corpus/templates/clips/changelog/2026-07-21-fixed-organization-recording-visibility-default.md +6 -0
  44. package/corpus/templates/clips/changelog/2026-07-21-meeting-notes-stop-when-calls-end.md +6 -0
  45. package/corpus/templates/clips/desktop/src/app.tsx +66 -75
  46. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +2 -0
  47. package/corpus/templates/clips/desktop/src/hooks/useWhisperSettings.ts +172 -0
  48. package/corpus/templates/clips/desktop/src/lib/meeting-call-app.ts +41 -0
  49. package/corpus/templates/clips/desktop/src/lib/silence-events.ts +1 -0
  50. package/corpus/templates/clips/desktop/src/shared/config.ts +1 -0
  51. package/corpus/templates/clips/desktop/src/styles.css +80 -7
  52. package/corpus/templates/clips/desktop/src-tauri/src/config.rs +32 -0
  53. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +3 -0
  54. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +268 -20
  55. package/corpus/templates/clips/desktop/src-tauri/src/whisper_model.rs +285 -164
  56. package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +18 -7
  57. package/corpus/templates/clips/learnings.defaults.md +1 -1
  58. package/corpus/templates/clips/server/plugins/db.ts +11 -0
  59. package/corpus/templates/clips/shared/builder-credits.ts +1 -1
  60. package/corpus/templates/design/app/components/design/FusionAppBanner.tsx +9 -1
  61. package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +5 -1
  62. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +9 -1
  63. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +9 -1
  64. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  65. package/dist/agent/engine/builder-engine.js +4 -0
  66. package/dist/agent/engine/builder-engine.js.map +1 -1
  67. package/dist/client/AgentPanel.d.ts.map +1 -1
  68. package/dist/client/AgentPanel.js +10 -3
  69. package/dist/client/AgentPanel.js.map +1 -1
  70. package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
  71. package/dist/client/ConnectBuilderCard.js +5 -1
  72. package/dist/client/ConnectBuilderCard.js.map +1 -1
  73. package/dist/client/chat/markdown-renderer.d.ts.map +1 -1
  74. package/dist/client/chat/markdown-renderer.js +3 -2
  75. package/dist/client/chat/markdown-renderer.js.map +1 -1
  76. package/dist/client/error-format.d.ts +1 -1
  77. package/dist/client/error-format.d.ts.map +1 -1
  78. package/dist/client/error-format.js +1 -1
  79. package/dist/client/error-format.js.map +1 -1
  80. package/dist/client/index.d.ts +1 -0
  81. package/dist/client/index.d.ts.map +1 -1
  82. package/dist/client/index.js +1 -0
  83. package/dist/client/index.js.map +1 -1
  84. package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
  85. package/dist/client/integrations/IntegrationsPanel.js +3 -4
  86. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  87. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  88. package/dist/client/resources/McpIntegrationDialog.js +21 -7
  89. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  90. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  91. package/dist/client/resources/mcp-integration-catalog.js +2 -2
  92. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  93. package/dist/client/settings/BackgroundAgentSection.d.ts.map +1 -1
  94. package/dist/client/settings/BackgroundAgentSection.js +5 -1
  95. package/dist/client/settings/BackgroundAgentSection.js.map +1 -1
  96. package/dist/client/settings/SettingsPanel.js +1 -1
  97. package/dist/client/settings/SettingsPanel.js.map +1 -1
  98. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  99. package/dist/client/settings/useBuilderStatus.js +2 -0
  100. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  101. package/dist/collab/struct-routes.d.ts +1 -1
  102. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  103. package/dist/localization/default-messages.d.ts +0 -6
  104. package/dist/localization/default-messages.d.ts.map +1 -1
  105. package/dist/localization/default-messages.js +1 -7
  106. package/dist/localization/default-messages.js.map +1 -1
  107. package/dist/notifications/routes.d.ts +3 -3
  108. package/dist/observability/routes.d.ts +1 -1
  109. package/dist/resources/handlers.d.ts +1 -1
  110. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  111. package/dist/server/builder-browser.d.ts.map +1 -1
  112. package/dist/server/builder-browser.js +4 -0
  113. package/dist/server/builder-browser.js.map +1 -1
  114. package/dist/server/builder-design-systems.d.ts.map +1 -1
  115. package/dist/server/builder-design-systems.js +6 -1
  116. package/dist/server/builder-design-systems.js.map +1 -1
  117. package/dist/server/fusion-app.d.ts.map +1 -1
  118. package/dist/server/fusion-app.js +2 -1
  119. package/dist/server/fusion-app.js.map +1 -1
  120. package/dist/shared/builder-link-tracking.d.ts +14 -0
  121. package/dist/shared/builder-link-tracking.d.ts.map +1 -0
  122. package/dist/shared/builder-link-tracking.js +26 -0
  123. package/dist/shared/builder-link-tracking.js.map +1 -0
  124. package/dist/shared/index.d.ts +1 -0
  125. package/dist/shared/index.d.ts.map +1 -1
  126. package/dist/shared/index.js +1 -0
  127. package/dist/shared/index.js.map +1 -1
  128. package/docs/content/deployment.mdx +1 -1
  129. package/docs/content/frames.mdx +1 -1
  130. package/docs/content/integrations.mdx +27 -27
  131. package/docs/content/pr-visual-recap.mdx +17 -13
  132. package/docs/content/workspace-management.mdx +1 -1
  133. package/package.json +3 -2
  134. package/src/agent/engine/builder-engine.ts +4 -0
  135. package/src/client/AgentPanel.tsx +10 -4
  136. package/src/client/ConnectBuilderCard.tsx +5 -1
  137. package/src/client/chat/markdown-renderer.tsx +3 -5
  138. package/src/client/error-format.ts +2 -1
  139. package/src/client/index.ts +1 -0
  140. package/src/client/integrations/IntegrationsPanel.tsx +2 -18
  141. package/src/client/resources/McpIntegrationDialog.tsx +43 -32
  142. package/src/client/resources/mcp-integration-catalog.ts +4 -2
  143. package/src/client/settings/BackgroundAgentSection.tsx +5 -1
  144. package/src/client/settings/SettingsPanel.tsx +4 -4
  145. package/src/client/settings/useBuilderStatus.ts +3 -0
  146. package/src/localization/default-messages.ts +1 -7
  147. package/src/server/builder-browser.ts +4 -0
  148. package/src/server/builder-design-systems.ts +6 -1
  149. package/src/server/fusion-app.ts +5 -1
  150. package/src/shared/builder-link-tracking.ts +41 -0
  151. package/src/shared/index.ts +1 -0
package/corpus/README.md CHANGED
@@ -28,6 +28,6 @@ rg -n "defineAction|useActionQuery" node_modules/@agent-native/core/corpus
28
28
 
29
29
  ## Generated Counts
30
30
 
31
- - core files: 1519
31
+ - core files: 1520
32
32
  - toolkit files: 137
33
- - template files: 6185
33
+ - template files: 6194
@@ -1,5 +1,20 @@
1
1
  # @agent-native/core
2
2
 
3
+ ## 0.114.15
4
+
5
+ ### Patch Changes
6
+
7
+ - f8fe58b: Add `VISUAL_RECAP_REQUIRED_LABELS` so PR Visual Recap can run only when a pull request has an opt-in label.
8
+ - Updated dependencies [f8fe58b]
9
+ - @agent-native/recap-cli@0.5.0
10
+
11
+ ## 0.114.14
12
+
13
+ ### Patch Changes
14
+
15
+ - 8df32f6: Improve the integrations picker by removing dead discovery controls, clearly showing the available catalog size, and simplifying provider setup guidance.
16
+ - 8df32f6: Add UTM attribution to Builder.io links opened from Agent Native.
17
+
3
18
  ## 0.114.13
4
19
 
5
20
  ### Patch Changes
@@ -567,7 +567,7 @@ In a standard production deployment with [production code execution](#production
567
567
 
568
568
  ### Builder.io: Visual Editing in Production {#builderio}
569
569
 
570
- [Builder.io](https://www.builder.io) solves this by providing a managed cloud environment where the agent retains the ability to modify your app's UI in production. Connect your repo to Builder.io and prompt for UI changes directly — no redeploy needed.
570
+ [Builder.io](https://www.builder.io?utm_source=agent-native&utm_medium=docs&utm_campaign=framework&utm_content=deployment) solves this by providing a managed cloud environment where the agent retains the ability to modify your app's UI in production. Connect your repo to Builder.io and prompt for UI changes directly — no redeploy needed.
571
571
 
572
572
  **How it works:**
573
573
 
@@ -186,7 +186,7 @@ time.
186
186
 
187
187
  ## Builder.io cloud frame {#cloud-frame}
188
188
 
189
- [Builder.io](https://www.builder.io) provides a managed frame that hosts the
189
+ [Builder.io](https://www.builder.io?utm_source=agent-native&utm_medium=docs&utm_campaign=framework&utm_content=frames) provides a managed frame that hosts the
190
190
  same app and the same agent panel, in the cloud:
191
191
 
192
192
  - Real-time collaboration — multiple users can watch and interact at once.
@@ -322,33 +322,33 @@ endpoint is reachable or cataloged, but a live provider authorization or tool
322
322
  session still needs to be completed. **Restricted** entries remain discoverable
323
323
  but need provider or administrator setup before a generic connection can work.
324
324
 
325
- | Integration | Connection mode | Status | Endpoint | Setup and notes |
326
- | ------------------------------------------------------------------------------------------------------------------------------ | ---------------------- | ---------------------------------- | ----------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
327
- | [Context7](https://context7.com/) | No auth | Ready · verified | `https://mcp.context7.com/mcp` | Fetch current library and framework docs. |
328
- | [Sentry](https://docs.sentry.io/product/sentry-mcp/) | Header / token | Ready · preflight only | `https://mcp.sentry.dev/mcp` | Add a Sentry bearer token as the `Authorization` header. |
329
- | [Notion](https://developers.notion.com/guides/mcp/get-started-with-mcp) | OAuth | Ready · preflight only | `https://mcp.notion.com/mcp` | User OAuth; enterprise admins can audit or restrict MCP clients. |
330
- | [Semgrep](https://github.com/semgrep/mcp#readme) | No auth | Ready · preflight only | `https://mcp.semgrep.ai/mcp` | Scan code for security findings. |
331
- | [Linear](https://linear.app/docs/mcp) | OAuth | Ready · preflight only | `https://mcp.linear.app/mcp` | Authorize the workspace and issue permissions required by the workflow. |
332
- | [Atlassian Rovo MCP](https://developer.atlassian.com/cloud/rovo-mcp/guides/getting-started/) | OAuth + provider setup | Restricted | `https://mcp.atlassian.com/v1/mcp/authv2` | Admins may need to trust the app origin and enable Rovo Read, Write, and Search permissions. |
333
- | [Supabase](https://www.builder.io/c/docs/fusion-connect-to-supabase) | OAuth | Ready · preflight only | `https://mcp.supabase.com/mcp` | Authorize the Supabase project and requested backend scopes. |
334
- | [Neon](https://www.builder.io/c/docs/fusion-connect-to-neon) | OAuth | Ready · preflight only | `https://mcp.neon.tech/sse` | Authorize access to the serverless Postgres projects needed by the app. |
335
- | [Stripe](https://docs.stripe.com/mcp) | OAuth | Ready · preflight only | `https://mcp.stripe.com` | Review payment, customer, and subscription permissions before authorizing. |
336
- | [Cloudflare](https://developers.cloudflare.com/agents/model-context-protocol/cloudflare/servers-for-cloudflare/) | OAuth | Ready · preflight only | `https://mcp.cloudflare.com/mcp` | Choose the narrowest Cloudflare server and review scopes. |
337
- | [GitLab](https://docs.gitlab.com/user/model_context_protocol/mcp_server/) | OAuth + provider setup | Beta · restricted | `https://gitlab.com/api/v4/mcp` | A top-level group admin, or the equivalent self-managed instance admin, must allow MCP. |
338
- | [Figma](https://developers.figma.com/docs/figma-mcp-server/) | Manual setup | Approved clients only · restricted | `https://mcp.figma.com/mcp` | Figma only allows clients in its MCP Catalog. Use the [Figma REST API personal access token fallback](https://developers.figma.com/docs/rest-api/personal-access-tokens/) for file and node reads until Agent Native is approved. |
339
- | [Canva](https://www.canva.dev/docs/mcp/) | Manual setup | Approved domains · restricted | `https://mcp.canva.com/mcp` | Per-user OAuth; clients must allow Canva's canva.com and canva.ai domains and follow the current redirect setup. |
340
- | [Vercel](https://vercel.com/docs/agent-resources/vercel-mcp) | Manual setup | Approved clients only · restricted | `https://mcp.vercel.com` | Vercel must list the client as approved before a generic connection will work. |
341
- | [GitHub](https://github.com/github/github-mcp-server) | Manual setup | Provider setup · restricted | `https://api.githubcopilot.com/mcp/` | Use a registered OAuth app; organizations may also enforce OAuth App Access Policies. |
342
- | [Slack](https://docs.slack.dev/ai/slack-mcp-server/) | Manual setup | Approved clients only · restricted | `https://mcp.slack.com/mcp` | Requires a fixed registered Slack app; dynamic client registration is not supported. |
343
- | [Asana](https://developers.asana.com/docs/integrating-with-asanas-mcp-server) | Manual setup | Provider setup · restricted | `https://mcp.asana.com/v2/mcp` | Pre-register an Asana MCP OAuth app before connecting. |
344
- | [HubSpot](https://developers.hubspot.com/docs/apps/developer-platform/build-apps/integrate-with-the-remote-hubspot-mcp-server) | Manual setup | Provider setup · restricted | `https://mcp.hubspot.com` | Create a HubSpot MCP Auth App with PKCE; the existing HubSpot OAuth connector remains available to app actions. |
345
- | [Intercom](https://developers.intercom.com/docs/guides/mcp) | OAuth | Ready · preflight only | `https://mcp.intercom.com/mcp` | Available for US-hosted workspaces; confirm region and scopes during authorization. |
346
- | [monday.com](https://developer.monday.com/api-reference/docs/build-on-monday-with-ai) | OAuth | Ready · preflight only | `https://mcp.monday.com/mcp` | Choose the workspace and permissions to share during authorization. |
347
- | [Webflow](https://developers.webflow.com/mcp/reference/getting-started) | OAuth | Ready · preflight only | `https://mcp.webflow.com/mcp` | Designer capabilities may install Webflow's Bridge App; Data API access is separate. |
348
- | [PayPal](https://developer.paypal.com/ai-tools/mcp-server/) | OAuth | Ready · preflight only | `https://mcp.paypal.com/sse` | Review merchant permissions before authorizing the remote server. |
349
- | [Box](https://developer.box.com/guides/box-mcp) | Manual setup | Beta · restricted | `https://mcp.box.com` | An administrator must enable Box MCP; custom clients also need credentials, a redirect URI, and approved scopes. |
350
- | [Netlify](https://docs.netlify.com/build/build-with-ai/agent-setup-guides/agent-setup-overview/) | OAuth | Ready · preflight only | `https://netlify-mcp.netlify.app/mcp` | Review site and team permissions before completing OAuth. |
351
- | [Zapier MCP](https://help.zapier.com/hc/en-us/articles/36265392843917-Use-Zapier-MCP-with-your-client) | Header / token | User-created server · restricted | `https://mcp.zapier.com/api/v1/connect` | Create the MCP server in Zapier, then paste its generated bearer token into the header field. |
325
+ | Integration | Connection mode | Status | Endpoint | Setup and notes |
326
+ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | ---------------------------------- | ----------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
327
+ | [Context7](https://context7.com/) | No auth | Ready · verified | `https://mcp.context7.com/mcp` | Fetch current library and framework docs. |
328
+ | [Sentry](https://docs.sentry.io/product/sentry-mcp/) | Header / token | Ready · preflight only | `https://mcp.sentry.dev/mcp` | Add a Sentry bearer token as the `Authorization` header. |
329
+ | [Notion](https://developers.notion.com/guides/mcp/get-started-with-mcp) | OAuth | Ready · preflight only | `https://mcp.notion.com/mcp` | User OAuth; enterprise admins can audit or restrict MCP clients. |
330
+ | [Semgrep](https://github.com/semgrep/mcp#readme) | No auth | Ready · preflight only | `https://mcp.semgrep.ai/mcp` | Scan code for security findings. |
331
+ | [Linear](https://linear.app/docs/mcp) | OAuth | Ready · preflight only | `https://mcp.linear.app/mcp` | Authorize the workspace and issue permissions required by the workflow. |
332
+ | [Atlassian Rovo MCP](https://developer.atlassian.com/cloud/rovo-mcp/guides/getting-started/) | OAuth + provider setup | Restricted | `https://mcp.atlassian.com/v1/mcp/authv2` | Admins may need to trust the app origin and enable Rovo Read, Write, and Search permissions. |
333
+ | [Supabase](https://www.builder.io/c/docs/fusion-connect-to-supabase?utm_source=agent-native&utm_medium=docs&utm_campaign=framework&utm_content=fusion_connect_supabase) | OAuth | Ready · preflight only | `https://mcp.supabase.com/mcp` | Authorize the Supabase project and requested backend scopes. |
334
+ | [Neon](https://www.builder.io/c/docs/fusion-connect-to-neon?utm_source=agent-native&utm_medium=docs&utm_campaign=framework&utm_content=fusion_connect_neon) | OAuth | Ready · preflight only | `https://mcp.neon.tech/sse` | Authorize access to the serverless Postgres projects needed by the app. |
335
+ | [Stripe](https://docs.stripe.com/mcp) | OAuth | Ready · preflight only | `https://mcp.stripe.com` | Review payment, customer, and subscription permissions before authorizing. |
336
+ | [Cloudflare](https://developers.cloudflare.com/agents/model-context-protocol/cloudflare/servers-for-cloudflare/) | OAuth | Ready · preflight only | `https://mcp.cloudflare.com/mcp` | Choose the narrowest Cloudflare server and review scopes. |
337
+ | [GitLab](https://docs.gitlab.com/user/model_context_protocol/mcp_server/) | OAuth + provider setup | Beta · restricted | `https://gitlab.com/api/v4/mcp` | A top-level group admin, or the equivalent self-managed instance admin, must allow MCP. |
338
+ | [Figma](https://developers.figma.com/docs/figma-mcp-server/) | Manual setup | Approved clients only · restricted | `https://mcp.figma.com/mcp` | Figma only allows clients in its MCP Catalog. Use the [Figma REST API personal access token fallback](https://developers.figma.com/docs/rest-api/personal-access-tokens/) for file and node reads until Agent Native is approved. |
339
+ | [Canva](https://www.canva.dev/docs/mcp/) | Manual setup | Approved domains · restricted | `https://mcp.canva.com/mcp` | Per-user OAuth; clients must allow Canva's canva.com and canva.ai domains and follow the current redirect setup. |
340
+ | [Vercel](https://vercel.com/docs/agent-resources/vercel-mcp) | Manual setup | Approved clients only · restricted | `https://mcp.vercel.com` | Vercel must list the client as approved before a generic connection will work. |
341
+ | [GitHub](https://github.com/github/github-mcp-server) | Manual setup | Provider setup · restricted | `https://api.githubcopilot.com/mcp/` | Use a registered OAuth app; organizations may also enforce OAuth App Access Policies. |
342
+ | [Slack](https://docs.slack.dev/ai/slack-mcp-server/) | Manual setup | Approved clients only · restricted | `https://mcp.slack.com/mcp` | Requires a fixed registered Slack app; dynamic client registration is not supported. |
343
+ | [Asana](https://developers.asana.com/docs/integrating-with-asanas-mcp-server) | Manual setup | Provider setup · restricted | `https://mcp.asana.com/v2/mcp` | Pre-register an Asana MCP OAuth app before connecting. |
344
+ | [HubSpot](https://developers.hubspot.com/docs/apps/developer-platform/build-apps/integrate-with-the-remote-hubspot-mcp-server) | Manual setup | Provider setup · restricted | `https://mcp.hubspot.com` | Create a HubSpot MCP Auth App with PKCE; the existing HubSpot OAuth connector remains available to app actions. |
345
+ | [Intercom](https://developers.intercom.com/docs/guides/mcp) | OAuth | Ready · preflight only | `https://mcp.intercom.com/mcp` | Available for US-hosted workspaces; confirm region and scopes during authorization. |
346
+ | [monday.com](https://developer.monday.com/api-reference/docs/build-on-monday-with-ai) | OAuth | Ready · preflight only | `https://mcp.monday.com/mcp` | Choose the workspace and permissions to share during authorization. |
347
+ | [Webflow](https://developers.webflow.com/mcp/reference/getting-started) | OAuth | Ready · preflight only | `https://mcp.webflow.com/mcp` | Designer capabilities may install Webflow's Bridge App; Data API access is separate. |
348
+ | [PayPal](https://developer.paypal.com/ai-tools/mcp-server/) | OAuth | Ready · preflight only | `https://mcp.paypal.com/sse` | Review merchant permissions before authorizing the remote server. |
349
+ | [Box](https://developer.box.com/guides/box-mcp) | Manual setup | Beta · restricted | `https://mcp.box.com` | An administrator must enable Box MCP; custom clients also need credentials, a redirect URI, and approved scopes. |
350
+ | [Netlify](https://docs.netlify.com/build/build-with-ai/agent-setup-guides/agent-setup-overview/) | OAuth | Ready · preflight only | `https://netlify-mcp.netlify.app/mcp` | Review site and team permissions before completing OAuth. |
351
+ | [Zapier MCP](https://help.zapier.com/hc/en-us/articles/36265392843917-Use-Zapier-MCP-with-your-client) | Header / token | User-created server · restricted | `https://mcp.zapier.com/api/v1/connect` | Create the MCP server in Zapier, then paste its generated bearer token into the header field. |
352
352
 
353
353
  ### Repeatable preflight verification
354
354
 
@@ -209,7 +209,8 @@ To reduce cost:
209
209
  - **Pin a cheaper model.** For Claude, set `VISUAL_RECAP_MODEL=claude-haiku-4-5` for simple or small repos — it's the cheapest Claude tier; `claude-sonnet-5` (the default) is the balanced tier.
210
210
  - **Switch to Codex with a cheaper model.** Set `VISUAL_RECAP_AGENT=codex` with `VISUAL_RECAP_MODEL=gpt-5.6-luna` (the cheapest GPT-5.6 tier) or `gpt-5.6-terra` (mid-tier), and set `VISUAL_RECAP_REASONING=low` to cut reasoning-token spend further. Reasoning depth only applies to Codex.
211
211
  - **Point at a cheaper OpenAI-compatible provider.** Set `VISUAL_RECAP_AGENT=openai-compatible` with `VISUAL_RECAP_BASE_URL`/`VISUAL_RECAP_MODEL`/`VISUAL_RECAP_API_KEY` targeting DeepSeek, Kimi, or any other OpenAI-compatible endpoint.
212
- - **Recap less often.** Edit the installed workflow's `on.pull_request.types` from `[opened, synchronize, reopened, ready_for_review, closed]` to `[opened, ready_for_review, closed]` so it recaps only when a PR opens and when it merges, instead of on every push.
212
+ - **Require an explicit PR label.** Set `VISUAL_RECAP_REQUIRED_LABELS=visual recap` to keep the workflow installed but skip recaps until a PR has that label. Use a comma-separated list, such as `visual recap,recap`, when several labels should opt in. Applying a listed label wakes the workflow immediately.
213
+ - **Recap less often.** Edit the installed workflow's `on.pull_request.types` from `[opened, synchronize, reopened, ready_for_review, labeled, closed]` to `[opened, ready_for_review, closed]` so it recaps only when a PR opens and when it merges, instead of on every push.
213
214
 
214
215
  Every run records what it actually spent: the workflow's `recap usage` step attaches token and cost usage to the published plan, so you can look at real spend per run instead of guessing.
215
216
 
@@ -256,16 +257,17 @@ real token.
256
257
 
257
258
  ### Optional (only if you change defaults)
258
259
 
259
- | Secret / variable | Default | When you need it |
260
- | ------------------------ | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
261
- | `OPENAI_API_KEY` | — | Secret. Set together with `VISUAL_RECAP_AGENT=codex` to run the recap with Codex instead. |
262
- | `VISUAL_RECAP_API_KEY` | — | Secret. Set with `VISUAL_RECAP_AGENT=openai-compatible` for DeepSeek, Kimi, or another OpenAI-compatible provider. |
263
- | `VISUAL_RECAP_AGENT` | `claude` | Variable. Selects the coding-agent backend (`claude`, `codex`, or `openai-compatible`). |
264
- | `VISUAL_RECAP_BASE_URL` | required for compatible backend | Variable. HTTP(S) base URL for the OpenAI-compatible backend; credentials are rejected. |
265
- | `VISUAL_RECAP_MODEL` | `claude-sonnet-5` for Claude; required for compatible backend | Variable. Provider model id for OpenAI-compatible backends (required there). For Claude, unset now defaults to `claude-sonnet-5` — set it to override, e.g. `claude-haiku-4-5` for the cheapest tier. For Codex, unset uses the Codex CLI's own default. |
266
- | `VISUAL_RECAP_REASONING` | each model's default | Variable. Reasoning depth: `none`, `minimal`, `low`, `medium`, `high`, or `xhigh`. Applies to the Codex backend. |
267
- | `RECAP_CLI_VERSION` | `latest` | Variable. Pins the `@agent-native/recap-cli` version the workflow installs e.g. `1.5.0`. See [Version pinning](#version-pinning-copy-variant). |
268
- | `PLAN_RECAP_APP_URL` | `https://plan.agent-native.com` | Secret. Only when self-hosting the Plans app at a different origin. |
260
+ | Secret / variable | Default | When you need it |
261
+ | ------------------------------ | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
262
+ | `OPENAI_API_KEY` | — | Secret. Set together with `VISUAL_RECAP_AGENT=codex` to run the recap with Codex instead. |
263
+ | `VISUAL_RECAP_API_KEY` | — | Secret. Set with `VISUAL_RECAP_AGENT=openai-compatible` for DeepSeek, Kimi, or another OpenAI-compatible provider. |
264
+ | `VISUAL_RECAP_AGENT` | `claude` | Variable. Selects the coding-agent backend (`claude`, `codex`, or `openai-compatible`). |
265
+ | `VISUAL_RECAP_BASE_URL` | required for compatible backend | Variable. HTTP(S) base URL for the OpenAI-compatible backend; credentials are rejected. |
266
+ | `VISUAL_RECAP_MODEL` | `claude-sonnet-5` for Claude; required for compatible backend | Variable. Provider model id for OpenAI-compatible backends (required there). For Claude, unset now defaults to `claude-sonnet-5` — set it to override, e.g. `claude-haiku-4-5` for the cheapest tier. For Codex, unset uses the Codex CLI's own default. |
267
+ | `VISUAL_RECAP_REASONING` | each model's default | Variable. Reasoning depth: `none`, `minimal`, `low`, `medium`, `high`, or `xhigh`. Applies to the Codex backend. |
268
+ | `VISUAL_RECAP_REQUIRED_LABELS` | | Variable. Comma-separated PR labels. When set, the gate skips until the PR has at least one listed label, for example `visual recap`. |
269
+ | `RECAP_CLI_VERSION` | `latest` | Variable. Pins the `@agent-native/recap-cli` version the workflow installs e.g. `1.5.0`. See [Version pinning](#version-pinning-copy-variant). |
270
+ | `PLAN_RECAP_APP_URL` | `https://plan.agent-native.com` | Secret. Only when self-hosting the Plans app at a different origin. |
269
271
 
270
272
  The workflow auto-detects how to invoke its helper CLI (local source inside this monorepo, the published `@agent-native/recap-cli` elsewhere), so there is no `RECAP_CLI` variable to set.
271
273
 
@@ -510,10 +512,11 @@ name: PR Visual Recap
510
512
 
511
513
  on:
512
514
  pull_request:
513
- types: [opened, synchronize, reopened, ready_for_review, closed]
515
+ types: [opened, synchronize, reopened, ready_for_review, labeled, closed]
514
516
 
515
517
  jobs:
516
518
  visual-recap:
519
+ if: github.event.action != 'labeled' || vars.VISUAL_RECAP_REQUIRED_LABELS != ''
517
520
  permissions:
518
521
  actions: write
519
522
  contents: read
@@ -535,10 +538,11 @@ jobs:
535
538
  skill-source: ${{ vars.VISUAL_RECAP_SKILL_SOURCE || 'auto' }}
536
539
  runs-on: ${{ vars.VISUAL_RECAP_RUNS_ON || '"ubuntu-latest"' }}
537
540
  gate-runs-on: ${{ vars.VISUAL_RECAP_GATE_RUNS_ON || 'ubuntu-latest' }}
541
+ required-labels: ${{ vars.VISUAL_RECAP_REQUIRED_LABELS || '' }}
538
542
  # cli-version: "latest" # pin to a specific @agent-native/recap-cli version
539
543
  ```
540
544
 
541
- The same secrets and variables described in [Secrets and variables](#secrets-and-variables) apply — set them in your repo settings the same way as for the copy variant. The reusable caller forwards `VISUAL_RECAP_RUNS_ON` through its JSON `runs-on` input for the full recap job and `VISUAL_RECAP_GATE_RUNS_ON` through its plain-label `gate-runs-on` input for the metadata-only gate. The latter is used only for trusted same-repository authors; other PRs use GitHub-hosted `ubuntu-latest`. Omitting either input preserves its `ubuntu-latest` default.
545
+ The same secrets and variables described in [Secrets and variables](#secrets-and-variables) apply — set them in your repo settings the same way as for the copy variant. The reusable caller forwards `VISUAL_RECAP_RUNS_ON` through its JSON `runs-on` input for the full recap job, `VISUAL_RECAP_GATE_RUNS_ON` through its plain-label `gate-runs-on` input for the metadata-only gate, and `VISUAL_RECAP_REQUIRED_LABELS` through `required-labels` for optional PR-label gating. The gate runner input is used only for trusted same-repository authors; other PRs use GitHub-hosted `ubuntu-latest`. Omitting the runner inputs preserves their `ubuntu-latest` defaults; omitting required labels preserves automatic recap behavior.
542
546
 
543
547
  ### Installing via the CLI
544
548
 
@@ -91,7 +91,7 @@ Keep branches short-lived. Long-lived branches diverge from main and create pain
91
91
 
92
92
  ### Non-Developer Branching
93
93
 
94
- Not everyone who needs to make changes is comfortable with git. [Builder.io](https://www.builder.io) supports a visual branching model that maps to git branches under the hood — useful for content and copy changes, layout adjustments, design iterations, and A/B testing without a dev environment.
94
+ Not everyone who needs to make changes is comfortable with git. [Builder.io](https://www.builder.io?utm_source=agent-native&utm_medium=docs&utm_campaign=framework&utm_content=workspace_management) supports a visual branching model that maps to git branches under the hood — useful for content and copy changes, layout adjustments, design iterations, and A/B testing without a dev environment.
95
95
 
96
96
  ## Code Ownership
97
97
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.114.13",
3
+ "version": "0.114.15",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -150,6 +150,7 @@
150
150
  "./embedding/react": "./dist/embedding/react.js",
151
151
  "./onboarding": "./dist/onboarding/index.js",
152
152
  "./shared": "./dist/shared/index.js",
153
+ "./shared/builder-link-tracking": "./dist/shared/builder-link-tracking.js",
153
154
  "./voice": "./dist/voice/index.js",
154
155
  "./scripts": "./dist/scripts/index.js",
155
156
  "./guards": {
@@ -20,6 +20,7 @@ import {
20
20
  getBuilderGatewayBaseUrl,
21
21
  recordBuilderCredentialAuthFailure,
22
22
  } from "../../server/credential-provider.js";
23
+ import { applyBuilderUtmTrackingParams } from "../../shared/builder-link-tracking.js";
23
24
  import {
24
25
  normalizeReasoningEffortForModel,
25
26
  type ReasoningEffort,
@@ -112,6 +113,9 @@ async function buildUpgradeUrl(): Promise<string> {
112
113
  url.searchParams.set("agentNativeConnectSource", "gateway_quota_upgrade");
113
114
  url.searchParams.set("agentNativeFlow", "connect_llm");
114
115
  url.searchParams.set("framework", "agent-native");
116
+ applyBuilderUtmTrackingParams(url.searchParams, {
117
+ content: "gateway_quota_upgrade",
118
+ });
115
119
  return url.toString();
116
120
  }
117
121
 
@@ -81,6 +81,7 @@ const MultiTabAssistantChatLazy = lazy(() =>
81
81
  import { useQuery, useQueryClient } from "@tanstack/react-query";
82
82
  import { Link, useLocation, useNavigate } from "react-router";
83
83
 
84
+ import { withBuilderUtmTrackingParams } from "../shared/builder-link-tracking.js";
84
85
  import type { AgentChatSurfaceKind } from "./agent-chat-adapter.js";
85
86
  import {
86
87
  consumeAgentSidebarUrlOpenOverride,
@@ -670,14 +671,19 @@ function CodeAccessUnavailablePanel({
670
671
  compact?: boolean;
671
672
  }) {
672
673
  const { connectUrl: builderConnectUrl } = useBuilderConnectUrl();
673
- const builderHref =
674
- secondaryCtaHref ??
675
- (builderConnectUrl
674
+ const builderHref = secondaryCtaHref
675
+ ? withBuilderUtmTrackingParams(secondaryCtaHref, {
676
+ campaign: "product",
677
+ content: "code_access_unavailable_panel",
678
+ })
679
+ : builderConnectUrl
676
680
  ? withBuilderConnectTrackingParams(builderConnectUrl, {
677
681
  source: "code_access_unavailable_panel",
678
682
  flow: "background_agent",
679
683
  })
680
- : "https://builder.io");
684
+ : withBuilderUtmTrackingParams("https://builder.io", {
685
+ content: "code_access_unavailable_panel",
686
+ });
681
687
 
682
688
  return (
683
689
  <div
@@ -1,6 +1,7 @@
1
1
  import { IconExternalLink, IconLoader2 } from "@tabler/icons-react";
2
2
  import React, { useCallback, useEffect, useRef, useState } from "react";
3
3
 
4
+ import { withBuilderUtmTrackingParams } from "../shared/builder-link-tracking.js";
4
5
  import { agentNativePath } from "./api-path.js";
5
6
  import { BuilderBMark } from "./builder-mark.js";
6
7
  import { getCallbackOrigin } from "./frame.js";
@@ -307,7 +308,10 @@ export function ConnectBuilderCard({
307
308
  <div className="mt-3">
308
309
  {runResult ? (
309
310
  <a
310
- href={runResult.url}
311
+ href={withBuilderUtmTrackingParams(runResult.url, {
312
+ campaign: "product",
313
+ content: "connect_builder_card_branch",
314
+ })}
311
315
  target="_blank"
312
316
  rel="noopener noreferrer"
313
317
  className={cn(
@@ -28,10 +28,7 @@ import {
28
28
  smoothStreamingRevealCount,
29
29
  splitStreamingTextGraphemes,
30
30
  } from "../../shared/streaming-text-smoothing.js";
31
- import {
32
- NEW_CHAT_ACTION_HREF,
33
- BUILDER_SPACE_SETTINGS_URL,
34
- } from "../error-format.js";
31
+ import { NEW_CHAT_ACTION_HREF } from "../error-format.js";
35
32
  import { HighlightedCodeBlock as SharedHighlightedCodeBlock } from "../HighlightedCodeBlock.js";
36
33
  import { IframeEmbed, parseEmbedBody } from "../IframeEmbed.js";
37
34
  import { cn } from "../utils.js";
@@ -187,7 +184,8 @@ function isBuilderErrorCtaHref(href: string | undefined): boolean {
187
184
  return false;
188
185
  }
189
186
  return (
190
- url.href === BUILDER_SPACE_SETTINGS_URL ||
187
+ (url.origin === "https://builder.io" &&
188
+ url.pathname === "/account/space") ||
191
189
  url.pathname === "/account/billing" ||
192
190
  url.pathname === "/account/subscription" ||
193
191
  /^\/app\/organizations\/[^/]+\/billing$/.test(url.pathname)
@@ -11,7 +11,8 @@
11
11
  * regex stays narrow; the gateway may emit URLs containing `(`
12
12
  * (e.g. `?ref=Acme%20(staging)`) and we don't want to reject them.
13
13
  */
14
- export const BUILDER_SPACE_SETTINGS_URL = "https://builder.io/account/space";
14
+ export const BUILDER_SPACE_SETTINGS_URL =
15
+ "https://builder.io/account/space?utm_source=agent-native&utm_medium=product&utm_campaign=onboarding&utm_content=space_settings";
15
16
 
16
17
  // Pseudo-href used to mark an in-app "Start new chat" CTA inside the markdown
17
18
  // error message. The chat renderer intercepts this href and renders a button
@@ -49,6 +49,7 @@ export {
49
49
  type FeatureFlagRules,
50
50
  type SetFeatureFlagInput,
51
51
  } from "./feature-flags/index.js";
52
+ export { withBuilderUtmTrackingParams } from "../shared/builder-link-tracking.js";
52
53
  export {
53
54
  SettingsPanel,
54
55
  SettingsTabsPage,
@@ -14,7 +14,6 @@ import {
14
14
  } from "@tabler/icons-react";
15
15
  import React, { useState, useCallback, useEffect } from "react";
16
16
 
17
- import { AgentAskPopover } from "../AgentAskPopover.js";
18
17
  import { agentNativePath } from "../api-path.js";
19
18
  import {
20
19
  Tooltip,
@@ -135,7 +134,8 @@ const PLATFORMS: PlatformInfo[] = [
135
134
  "Builder.io discovers each agent's skills via A2A",
136
135
  "Chat with one agent that can trigger actions across all your apps",
137
136
  ],
138
- docsUrl: "https://www.builder.io",
137
+ docsUrl:
138
+ "https://www.builder.io?utm_source=agent-native&utm_medium=product&utm_campaign=integrations&utm_content=integrations_panel",
139
139
  },
140
140
  ];
141
141
 
@@ -512,14 +512,6 @@ export function IntegrationsPanel() {
512
512
  <div className="text-[10px] font-medium text-muted-foreground mb-1.5">
513
513
  {t("integrations.addChatIntegration")}
514
514
  </div>
515
- <AgentAskPopover
516
- label={t("integrations.addSomething")}
517
- title={t("integrations.addSomethingTitle")}
518
- placeholder={t("integrations.addSomethingPlaceholder")}
519
- prompt=""
520
- context="The user wants to add a chat or workspace integration that is not in the current directory. Research the provider's official OAuth or MCP setup, explain any app registration or allowlist requirements, and add a reusable integration preset when it is supported. Never ask the user to paste credentials into a prompt."
521
- className="mb-2 h-7 w-full justify-center border-dashed px-2 text-[10px]"
522
- />
523
515
  <AddIntegrationPicker
524
516
  connectedIds={connectedIds}
525
517
  onSelect={(p) => {
@@ -554,14 +546,6 @@ export function IntegrationsPanel() {
554
546
  </TooltipTrigger>
555
547
  <TooltipContent>{t("integrations.addIntegration")}</TooltipContent>
556
548
  </Tooltip>
557
- <AgentAskPopover
558
- label={t("integrations.addSomething")}
559
- title={t("integrations.addSomethingTitle")}
560
- placeholder={t("integrations.addSomethingPlaceholder")}
561
- prompt=""
562
- context="The user wants to add a chat or workspace integration that is not in the current directory. Research the provider's official OAuth or MCP setup, explain any app registration or allowlist requirements, and add a reusable integration preset when it is supported. Never ask the user to paste credentials into a prompt."
563
- className="h-7 px-2 text-[10px]"
564
- />
565
549
  </div>
566
550
  </div>
567
551
 
@@ -7,7 +7,6 @@ import {
7
7
  } from "@tabler/icons-react";
8
8
  import { useEffect, useMemo, useRef, useState } from "react";
9
9
 
10
- import { AgentAskPopover } from "../AgentAskPopover.js";
11
10
  import { agentNativePath } from "../api-path.js";
12
11
  import { openAgentSettings } from "../CommandMenu.js";
13
12
  import {
@@ -62,6 +61,40 @@ interface TestResult {
62
61
  message: string;
63
62
  }
64
63
 
64
+ function IntegrationLogo({ name, logoUrl }: { name: string; logoUrl: string }) {
65
+ const [loaded, setLoaded] = useState(false);
66
+ const [loadFailed, setLoadFailed] = useState(false);
67
+
68
+ useEffect(() => {
69
+ setLoaded(false);
70
+ setLoadFailed(false);
71
+ }, [logoUrl]);
72
+
73
+ return (
74
+ <div className="relative flex h-8 w-8 shrink-0 items-center justify-center overflow-hidden rounded-md border border-border bg-background text-[11px] font-semibold text-muted-foreground">
75
+ <span aria-hidden="true" hidden={loaded}>
76
+ {name.slice(0, 1)}
77
+ </span>
78
+ <img
79
+ src={logoUrl}
80
+ alt=""
81
+ loading="lazy"
82
+ decoding="async"
83
+ className="absolute inset-1 h-6 w-6 object-contain"
84
+ hidden={loadFailed}
85
+ onLoad={() => {
86
+ setLoadFailed(false);
87
+ setLoaded(true);
88
+ }}
89
+ onError={() => {
90
+ setLoadFailed(true);
91
+ setLoaded(false);
92
+ }}
93
+ />
94
+ </div>
95
+ );
96
+ }
97
+
65
98
  function parseHeaderLines(text: string): Record<string, string> | undefined {
66
99
  const out: Record<string, string> = {};
67
100
  for (const line of text.split(/\r?\n/)) {
@@ -412,7 +445,9 @@ export function McpIntegrationDialog({
412
445
  <DialogHeader className="shrink-0 px-7 pb-5 pe-14 pt-6">
413
446
  <DialogTitle>{t("mcpIntegrations.title")}</DialogTitle>
414
447
  <DialogDescription>
415
- {t("mcpIntegrations.description")}
448
+ {t("mcpIntegrations.description", {
449
+ count: defaultIntegrations.length,
450
+ })}
416
451
  </DialogDescription>
417
452
  </DialogHeader>
418
453
  <div className="flex shrink-0 flex-col gap-3 px-7 pb-5 sm:flex-row">
@@ -435,14 +470,6 @@ export function McpIntegrationDialog({
435
470
  >
436
471
  {t("mcpIntegrations.addYourOwn")}
437
472
  </button>
438
- <AgentAskPopover
439
- label={t("mcpIntegrations.addSomething")}
440
- title={t("mcpIntegrations.addSomethingTitle")}
441
- placeholder={t("mcpIntegrations.addSomethingPlaceholder")}
442
- prompt=""
443
- context="The user wants to add an MCP or provider integration that is not in the current directory. Research the provider's official remote MCP endpoint and OAuth, client-registration, or allowlist requirements. Prefer Streamable HTTP endpoints over legacy SSE, reuse an existing provider OAuth connector when appropriate, and never ask the user to paste credentials into a prompt. If this should become a reusable preset, update the integration catalog, official docs link, bundled logo, localization, and tests."
444
- className="h-9 whitespace-nowrap border-dashed px-3 text-[12px] font-medium"
445
- />
446
473
  </div>
447
474
  <div className="min-h-0 flex-1 overflow-y-auto px-7 pb-7">
448
475
  {error && (
@@ -467,27 +494,16 @@ export function McpIntegrationDialog({
467
494
  className="flex min-h-[128px] flex-col rounded-md border border-border bg-card p-4 transition-colors hover:border-border/80 hover:bg-accent/20"
468
495
  >
469
496
  <div className="flex items-center gap-3">
470
- <div className="relative flex h-8 w-8 shrink-0 items-center justify-center overflow-hidden rounded-md border border-border bg-background text-[11px] font-semibold text-muted-foreground">
471
- <span aria-hidden="true">
472
- {integration.name.slice(0, 1)}
473
- </span>
474
- <img
475
- src={integration.logoUrl}
476
- alt=""
477
- loading="lazy"
478
- decoding="async"
479
- className="absolute inset-1 h-6 w-6 object-contain"
480
- onError={(event) => {
481
- event.currentTarget.hidden = true;
482
- }}
483
- />
484
- </div>
497
+ <IntegrationLogo
498
+ name={integration.name}
499
+ logoUrl={integration.logoUrl}
500
+ />
485
501
  <div className="min-w-0">
486
502
  <h3 className="truncate text-[13px] font-semibold text-foreground">
487
503
  {integration.name}
488
504
  </h3>
489
505
  {integration.availability !== "ready" && (
490
- <span className="mt-0.5 inline-flex rounded-full border border-amber-500/20 bg-amber-500/5 px-1.5 py-0.5 text-[9px] font-medium text-amber-700 dark:text-amber-300">
506
+ <span className="mt-0.5 inline-flex rounded-full border border-border/70 bg-muted/40 px-1.5 py-0.5 text-[9px] font-medium text-muted-foreground">
491
507
  {integration.availability === "beta"
492
508
  ? t("mcpIntegrations.status.beta")
493
509
  : integration.availability ===
@@ -508,11 +524,6 @@ export function McpIntegrationDialog({
508
524
  <p className="mt-1 line-clamp-2 flex-1 text-[12px] leading-relaxed text-muted-foreground">
509
525
  {t(integration.descriptionKey)}
510
526
  </p>
511
- {integration.setupNoteKey && (
512
- <p className="mt-2 line-clamp-3 text-[10px] leading-relaxed text-amber-700 dark:text-amber-300">
513
- {t(integration.setupNoteKey)}
514
- </p>
515
- )}
516
527
  <div className="mt-3 flex items-center gap-2">
517
528
  {connected ? (
518
529
  <button
@@ -637,7 +648,7 @@ export function McpIntegrationDialog({
637
648
  <div className="space-y-3">
638
649
  {renderScopeSelector()}
639
650
  {selected?.setupNoteKey && (
640
- <div className="rounded-md border border-amber-500/20 bg-amber-500/5 px-3 py-2 text-[11px] leading-relaxed text-amber-700 dark:text-amber-300">
651
+ <div className="rounded-md border border-border bg-muted/40 px-3 py-2 text-[11px] leading-relaxed text-muted-foreground">
641
652
  {t(selected.setupNoteKey)}
642
653
  </div>
643
654
  )}
@@ -189,7 +189,8 @@ export const DEFAULT_MCP_INTEGRATIONS: DefaultMcpIntegration[] = [
189
189
  availability: "ready",
190
190
  verification: "preflight-only",
191
191
  logoUrl: mcpIntegrationLogo("supabase"),
192
- docsUrl: "https://www.builder.io/c/docs/fusion-connect-to-supabase",
192
+ docsUrl:
193
+ "https://www.builder.io/c/docs/fusion-connect-to-supabase?utm_source=agent-native&utm_medium=product&utm_campaign=integrations&utm_content=fusion_connect_supabase",
193
194
  keywords: ["database", "auth", "postgres", "storage"],
194
195
  },
195
196
  {
@@ -206,7 +207,8 @@ export const DEFAULT_MCP_INTEGRATIONS: DefaultMcpIntegration[] = [
206
207
  availability: "ready",
207
208
  verification: "preflight-only",
208
209
  logoUrl: mcpIntegrationLogo("neon"),
209
- docsUrl: "https://www.builder.io/c/docs/fusion-connect-to-neon",
210
+ docsUrl:
211
+ "https://www.builder.io/c/docs/fusion-connect-to-neon?utm_source=agent-native&utm_medium=product&utm_campaign=integrations&utm_content=fusion_connect_neon",
210
212
  keywords: ["database", "postgres", "serverless", "backend"],
211
213
  },
212
214
  {
@@ -6,6 +6,7 @@ import {
6
6
  } from "@tabler/icons-react";
7
7
  import { useState } from "react";
8
8
 
9
+ import { withBuilderUtmTrackingParams } from "../../shared/builder-link-tracking.js";
9
10
  import { trackEvent } from "../analytics.js";
10
11
  import { agentNativePath } from "../api-path.js";
11
12
  import { SettingsSection } from "./SettingsSection.js";
@@ -170,7 +171,10 @@ export function BackgroundAgentSection() {
170
171
  Branch created
171
172
  </div>
172
173
  <a
173
- href={result.url}
174
+ href={withBuilderUtmTrackingParams(result.url, {
175
+ campaign: "product",
176
+ content: "background_agent_branch",
177
+ })}
174
178
  target="_blank"
175
179
  rel="noopener noreferrer"
176
180
  className="flex items-center gap-1 text-[10px] text-foreground hover:underline"