@agent-native/core 0.141.6 → 0.144.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. package/agent-native.eject.json +9 -0
  2. package/corpus/README.md +1 -1
  3. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +3 -14
  4. package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +11 -6
  5. package/corpus/templates/analytics/.agents/skills/prometheus/SKILL.md +5 -5
  6. package/corpus/templates/analytics/.agents/skills/provider-api/SKILL.md +19 -0
  7. package/corpus/templates/analytics/.agents/skills/turn-into-app/SKILL.md +296 -0
  8. package/corpus/templates/analytics/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  9. package/corpus/templates/analytics/.agents/skills/turn-into-skill/SKILL.md +112 -0
  10. package/corpus/templates/analytics/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  11. package/corpus/templates/analytics/AGENTS.md +37 -40
  12. package/corpus/templates/analytics/actions/compose-dashboard.ts +1 -1
  13. package/corpus/templates/analytics/actions/ensure-native-v2-dashboards.ts +1 -1
  14. package/corpus/templates/analytics/actions/list-dashboard-usage-stats.ts +17 -22
  15. package/corpus/templates/analytics/actions/migrate-first-party-analytics-to-bigquery.ts +135 -0
  16. package/corpus/templates/analytics/actions/navigate.ts +5 -6
  17. package/corpus/templates/analytics/actions/provider-api-register.ts +50 -0
  18. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +46 -13
  19. package/corpus/templates/analytics/actions/test-custom-api-connection.ts +106 -0
  20. package/corpus/templates/analytics/actions/update-dashboard.ts +0 -1
  21. package/corpus/templates/analytics/actions/view-screen.ts +0 -20
  22. package/corpus/templates/analytics/app/components/CustomApiCard.tsx +430 -0
  23. package/corpus/templates/analytics/app/components/layout/Header.tsx +0 -1
  24. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +5 -5
  25. package/corpus/templates/analytics/app/i18n-data.ts +682 -90
  26. package/corpus/templates/analytics/app/lib/native-mcp-exclusions.ts +6 -0
  27. package/corpus/templates/analytics/app/lib/sql-query.ts +33 -6
  28. package/corpus/templates/analytics/app/pages/Agents.tsx +0 -3
  29. package/corpus/templates/analytics/app/pages/DataSources.tsx +4 -0
  30. package/corpus/templates/analytics/app/pages/Settings.tsx +22 -43
  31. package/corpus/templates/analytics/app/pages/settings/settings-search.ts +23 -20
  32. package/corpus/templates/analytics/app/routes/extensions._index.tsx +1 -1
  33. package/corpus/templates/analytics/app/routes/settings.$.tsx +1 -0
  34. package/corpus/templates/analytics/app/routes/team.tsx +1 -1
  35. package/corpus/templates/analytics/changelog/2026-08-05-settings-no-longer-includes-an-unnecessary-about-section.md +6 -0
  36. package/corpus/templates/analytics/changelog/2026-08-06-analytics-dashboards-load-reliably-during-background-data-sw.md +6 -0
  37. package/corpus/templates/analytics/changelog/2026-08-06-analytics-dashboards-remain-responsive-while-historical-data.md +6 -0
  38. package/corpus/templates/analytics/changelog/2026-08-06-analytics-query-results-now-render-as-a-table-with-csv-downl.md +6 -0
  39. package/corpus/templates/analytics/changelog/2026-08-06-connect-public-https-custom-apis-and-hand-tested-endpoints-t.md +6 -0
  40. package/corpus/templates/analytics/changelog/2026-08-06-durable-agent-worker-memory.md +6 -0
  41. package/corpus/templates/analytics/changelog/2026-08-06-live-dashboard-panels-use-the-shared-query-timeout.md +6 -0
  42. package/corpus/templates/analytics/changelog/2026-08-06-on-demand-billing-is-available-as-a-native-dashboard-with-ta.md +6 -0
  43. package/corpus/templates/analytics/changelog/2026-08-06-visible-dashboard-names-are-unique.md +6 -0
  44. package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +1 -1
  45. package/corpus/templates/analytics/netlify.toml +7 -0
  46. package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +4 -0
  47. package/corpus/templates/analytics/scripts/first-party-analytics-bigquery.sql +104 -0
  48. package/corpus/templates/analytics/server/db/index.ts +27 -0
  49. package/corpus/templates/analytics/server/db/schema.ts +10 -0
  50. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +0 -2
  51. package/corpus/templates/analytics/server/lib/dashboards-store.ts +227 -60
  52. package/corpus/templates/analytics/server/lib/first-party-analytics-backend.ts +1147 -0
  53. package/corpus/templates/analytics/server/lib/first-party-analytics-health.ts +34 -15
  54. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +57 -4
  55. package/corpus/templates/analytics/server/lib/native-v2-dashboards.ts +227 -1
  56. package/corpus/templates/analytics/server/lib/real-data-actions.ts +1 -3
  57. package/corpus/templates/analytics/server/plugins/agent-chat.ts +7 -4
  58. package/corpus/templates/analytics/server/plugins/analytics-rollup-backfill-jobs.ts +1 -0
  59. package/corpus/templates/analytics/server/plugins/db.ts +52 -18
  60. package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +36 -8
  61. package/corpus/templates/assets/.agents/skills/image-generation/SKILL.md +16 -1
  62. package/corpus/templates/assets/.agents/skills/library-management/SKILL.md +16 -1
  63. package/corpus/templates/assets/.agents/skills/turn-into-app/SKILL.md +296 -0
  64. package/corpus/templates/assets/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  65. package/corpus/templates/assets/.agents/skills/turn-into-skill/SKILL.md +112 -0
  66. package/corpus/templates/assets/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  67. package/corpus/templates/assets/AGENTS.md +1 -0
  68. package/corpus/templates/assets/actions/_helpers.ts +12 -0
  69. package/corpus/templates/assets/actions/generate-image.ts +9 -3
  70. package/corpus/templates/assets/actions/import-style-from-url.ts +115 -0
  71. package/corpus/templates/assets/app/hooks/use-navigation-state.ts +3 -1
  72. package/corpus/templates/assets/app/routes/extensions._index.tsx +1 -1
  73. package/corpus/templates/assets/app/routes/settings.$.tsx +1 -0
  74. package/corpus/templates/assets/app/routes/settings.tsx +5 -0
  75. package/corpus/templates/assets/app/routes/team.tsx +1 -1
  76. package/corpus/templates/assets/changelog/2026-08-05-brand-kits-can-import-a-website-s-hydrated-visual-language-a.md +6 -0
  77. package/corpus/templates/assets/changelog/2026-08-05-generated-images-now-hand-off-embeddable-previews-to-other-w.md +6 -0
  78. package/corpus/templates/assets/server/lib/generation.ts +58 -0
  79. package/corpus/templates/assets/shared/api.ts +12 -0
  80. package/corpus/templates/brain/.agents/skills/turn-into-app/SKILL.md +296 -0
  81. package/corpus/templates/brain/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  82. package/corpus/templates/brain/.agents/skills/turn-into-skill/SKILL.md +112 -0
  83. package/corpus/templates/brain/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  84. package/corpus/templates/brain/actions/list-connection-providers.ts +24 -3
  85. package/corpus/templates/brain/app/lib/dispatch-links.ts +44 -0
  86. package/corpus/templates/brain/app/routes/extensions._index.tsx +1 -1
  87. package/corpus/templates/brain/app/routes/sources.tsx +15 -7
  88. package/corpus/templates/brain/app/routes/team.tsx +1 -1
  89. package/corpus/templates/brain/app/routes.ts +1 -1
  90. package/corpus/templates/brain/changelog/2026-08-06-brain-provider-setup-links-open-dispatch-correctly-in-standa.md +6 -0
  91. package/corpus/templates/brain/server/plugins/agent-chat.ts +1 -0
  92. package/corpus/templates/calendar/.agents/skills/event-management/SKILL.md +26 -0
  93. package/corpus/templates/calendar/.agents/skills/turn-into-app/SKILL.md +296 -0
  94. package/corpus/templates/calendar/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  95. package/corpus/templates/calendar/.agents/skills/turn-into-skill/SKILL.md +112 -0
  96. package/corpus/templates/calendar/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  97. package/corpus/templates/calendar/AGENTS.md +11 -32
  98. package/corpus/templates/calendar/actions/update-event.ts +107 -1
  99. package/corpus/templates/calendar/app/components/calendar/EventCalendarSelect.tsx +83 -0
  100. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +57 -0
  101. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +59 -73
  102. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +3 -1
  103. package/corpus/templates/calendar/app/hooks/use-events.ts +4 -1
  104. package/corpus/templates/calendar/app/i18n-data.ts +20 -0
  105. package/corpus/templates/calendar/app/routes/_app.extensions._index.tsx +1 -1
  106. package/corpus/templates/calendar/app/routes/_app.settings.$.tsx +1 -0
  107. package/corpus/templates/calendar/app/routes/_app.team.tsx +1 -1
  108. package/corpus/templates/calendar/changelog/2026-08-06-delegated-requests-continue-in-the-background.md +6 -0
  109. package/corpus/templates/calendar/changelog/2026-08-06-existing-events-can-move-between-connected-google-account-ca.md +6 -0
  110. package/corpus/templates/calendar/server/lib/google-calendar.ts +101 -0
  111. package/corpus/templates/calendar/server/plugins/agent-chat.ts +7 -1
  112. package/corpus/templates/chat/.agents/skills/turn-into-app/SKILL.md +296 -0
  113. package/corpus/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  114. package/corpus/templates/chat/.agents/skills/turn-into-skill/SKILL.md +112 -0
  115. package/corpus/templates/chat/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  116. package/corpus/templates/chat/app/components/layout/Layout.tsx +1 -1
  117. package/corpus/templates/chat/app/hooks/use-navigation-state.ts +1 -1
  118. package/corpus/templates/chat/app/root.tsx +1 -1
  119. package/corpus/templates/chat/app/routes/agent.tsx +7 -7
  120. package/corpus/templates/chat/app/routes/extensions._index.tsx +1 -1
  121. package/corpus/templates/chat/app/routes/settings.$.tsx +1 -0
  122. package/corpus/templates/chat/app/routes/team.tsx +1 -1
  123. package/corpus/templates/clips/.agents/skills/turn-into-app/SKILL.md +296 -0
  124. package/corpus/templates/clips/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  125. package/corpus/templates/clips/.agents/skills/turn-into-skill/SKILL.md +112 -0
  126. package/corpus/templates/clips/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  127. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +9 -24
  128. package/corpus/templates/clips/app/components/editor/timeline-geometry.ts +15 -0
  129. package/corpus/templates/clips/app/components/editor/waveform.tsx +4 -17
  130. package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -1
  131. package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +14 -3
  132. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +1 -1
  133. package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +1 -1
  134. package/corpus/templates/clips/app/routes/_app.extensions._index.tsx +1 -1
  135. package/corpus/templates/clips/app/routes/_app.settings.$.tsx +1 -0
  136. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +28 -38
  137. package/corpus/templates/clips/app/routes/share.$shareId.tsx +21 -27
  138. package/corpus/templates/clips/changelog/2026-08-06-clips-recovers-from-stalled-recording-setup-without-requirin.md +6 -0
  139. package/corpus/templates/clips/changelog/2026-08-06-clips-starts-faster-after-a-deploy-or-idle-period-startup-no.md +6 -0
  140. package/corpus/templates/clips/changelog/2026-08-06-deleting-a-recording-returns-cleanly-to-the-library-and-fit-.md +6 -0
  141. package/corpus/templates/clips/changelog/2026-08-06-hide-clip-insights-from-viewers-without-analytics-access.md +6 -0
  142. package/corpus/templates/clips/desktop/src/app.tsx +48 -20
  143. package/corpus/templates/clips/desktop/src/lib/recorder.ts +275 -74
  144. package/corpus/templates/clips/desktop/src/lib/recording-start-guard.ts +84 -0
  145. package/corpus/templates/clips/desktop/src/overlays/toolbar.tsx +14 -4
  146. package/corpus/templates/clips/server/plugins/db.ts +214 -26
  147. package/corpus/templates/content/.agents/skills/turn-into-app/SKILL.md +296 -0
  148. package/corpus/templates/content/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  149. package/corpus/templates/content/.agents/skills/turn-into-skill/SKILL.md +112 -0
  150. package/corpus/templates/content/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  151. package/corpus/templates/content/app/routes/_app.extensions._index.tsx +1 -1
  152. package/corpus/templates/content/app/routes/_app.settings.$.tsx +1 -0
  153. package/corpus/templates/content/app/routes/_app.team.tsx +1 -1
  154. package/corpus/templates/content/e2e/global-setup.ts +1 -1
  155. package/corpus/templates/crm/.agents/skills/turn-into-app/SKILL.md +296 -0
  156. package/corpus/templates/crm/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  157. package/corpus/templates/crm/.agents/skills/turn-into-skill/SKILL.md +112 -0
  158. package/corpus/templates/crm/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  159. package/corpus/templates/crm/changelog/2026-08-06-crm-starts-faster-after-a-deploy-or-idle-period-one-time-dat.md +6 -0
  160. package/corpus/templates/crm/server/plugins/db.ts +11 -8
  161. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +36 -1
  162. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +6 -1
  163. package/corpus/templates/design/.agents/skills/turn-into-app/SKILL.md +296 -0
  164. package/corpus/templates/design/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  165. package/corpus/templates/design/.agents/skills/turn-into-skill/SKILL.md +112 -0
  166. package/corpus/templates/design/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  167. package/corpus/templates/design/actions/analyze-brand-assets.ts +7 -7
  168. package/corpus/templates/design/actions/import-from-url.ts +6 -5
  169. package/corpus/templates/design/app/components/design/LayersPanel.tsx +27 -18
  170. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +2 -2
  171. package/corpus/templates/design/app/pages/Index.tsx +6 -2
  172. package/corpus/templates/design/app/routes/extensions._index.tsx +1 -1
  173. package/corpus/templates/design/app/routes/settings.$.tsx +1 -0
  174. package/corpus/templates/design/app/routes/team.tsx +1 -1
  175. package/corpus/templates/design/changelog/2026-08-05-deleting-a-design-from-the-home-page-no-longer-leaves-the-ap.md +6 -0
  176. package/corpus/templates/design/changelog/2026-08-05-renaming-a-layer-now-focuses-its-name-field-automatically.md +6 -0
  177. package/corpus/templates/design/changelog/2026-08-05-website-url-imports-now-capture-hydrated-browser-computed-de.md +6 -0
  178. package/corpus/templates/design/e2e/global-setup.ts +1 -1
  179. package/corpus/templates/design/server/plugins/agent-chat.ts +2 -0
  180. package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +296 -0
  181. package/corpus/templates/dispatch/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  182. package/corpus/templates/dispatch/.agents/skills/turn-into-skill/SKILL.md +112 -0
  183. package/corpus/templates/dispatch/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  184. package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +1 -1
  185. package/corpus/templates/dispatch/app/routes/settings.$.tsx +1 -0
  186. package/corpus/templates/dispatch/app/routes/team.tsx +1 -1
  187. package/corpus/templates/dispatch/changelog/2026-08-06-ready-workspace-apps-stay-one-click-away-in-a-compact-dispat.md +6 -0
  188. package/corpus/templates/dispatch/changelog/2026-08-06-shared-vault-values-and-management-are-now-restricted-to-wor.md +6 -0
  189. package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +296 -0
  190. package/corpus/templates/factory/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  191. package/corpus/templates/factory/.agents/skills/turn-into-skill/SKILL.md +112 -0
  192. package/corpus/templates/factory/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  193. package/corpus/templates/factory/app/hooks/use-navigation-state.ts +1 -1
  194. package/corpus/templates/factory/app/routes/extensions._index.tsx +1 -1
  195. package/corpus/templates/factory/app/routes/settings.$.tsx +1 -0
  196. package/corpus/templates/factory/app/routes/team.tsx +1 -1
  197. package/corpus/templates/forms/.agents/skills/turn-into-app/SKILL.md +296 -0
  198. package/corpus/templates/forms/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  199. package/corpus/templates/forms/.agents/skills/turn-into-skill/SKILL.md +112 -0
  200. package/corpus/templates/forms/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  201. package/corpus/templates/forms/app/routes/_app.extensions._index.tsx +1 -1
  202. package/corpus/templates/forms/app/routes/_app.settings.$.tsx +1 -0
  203. package/corpus/templates/forms/app/routes/_app.team.tsx +1 -1
  204. package/corpus/templates/forms/changelog/2026-08-06-delegated-requests-continue-in-the-background.md +6 -0
  205. package/corpus/templates/forms/server/plugins/agent-chat.ts +4 -0
  206. package/corpus/templates/forms/shared/navigation.ts +1 -1
  207. package/corpus/templates/macros/.agents/skills/turn-into-app/SKILL.md +296 -0
  208. package/corpus/templates/macros/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  209. package/corpus/templates/macros/.agents/skills/turn-into-skill/SKILL.md +112 -0
  210. package/corpus/templates/macros/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  211. package/corpus/templates/macros/app/routes/extensions._index.tsx +1 -1
  212. package/corpus/templates/macros/app/routes/settings.$.tsx +1 -0
  213. package/corpus/templates/macros/app/routes/team.tsx +1 -1
  214. package/corpus/templates/mail/.agents/skills/turn-into-app/SKILL.md +296 -0
  215. package/corpus/templates/mail/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  216. package/corpus/templates/mail/.agents/skills/turn-into-skill/SKILL.md +112 -0
  217. package/corpus/templates/mail/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  218. package/corpus/templates/mail/app/routes/extensions._index.tsx +1 -1
  219. package/corpus/templates/mail/app/routes/settings.$.tsx +1 -0
  220. package/corpus/templates/mail/changelog/2026-08-06-delegated-requests-continue-in-the-background.md +6 -0
  221. package/corpus/templates/mail/server/plugins/agent-chat.ts +6 -0
  222. package/corpus/templates/plan/.agents/skills/turn-into-app/SKILL.md +296 -0
  223. package/corpus/templates/plan/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  224. package/corpus/templates/plan/.agents/skills/turn-into-skill/SKILL.md +112 -0
  225. package/corpus/templates/plan/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  226. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +1 -1
  227. package/corpus/templates/plan/app/routes/extensions._index.tsx +1 -1
  228. package/corpus/templates/plan/app/routes/settings.$.tsx +1 -0
  229. package/corpus/templates/plan/app/routes/team.tsx +1 -1
  230. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +48 -5
  231. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +40 -2
  232. package/corpus/templates/slides/.agents/skills/image-generation-via-a2a/SKILL.md +6 -0
  233. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +15 -2
  234. package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +29 -24
  235. package/corpus/templates/slides/.agents/skills/turn-into-app/SKILL.md +296 -0
  236. package/corpus/templates/slides/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  237. package/corpus/templates/slides/.agents/skills/turn-into-skill/SKILL.md +112 -0
  238. package/corpus/templates/slides/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  239. package/corpus/templates/slides/AGENTS.md +7 -9
  240. package/corpus/templates/slides/_gitignore +1 -0
  241. package/corpus/templates/slides/actions/analyze-brand-assets.ts +7 -7
  242. package/corpus/templates/slides/actions/export-pptx.ts +402 -36
  243. package/corpus/templates/slides/actions/import-file.ts +46 -85
  244. package/corpus/templates/slides/actions/import-from-url.ts +6 -6
  245. package/corpus/templates/slides/actions/import-google-slides-reference.ts +271 -12
  246. package/corpus/templates/slides/actions/import-pptx.ts +85 -60
  247. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +10 -13
  248. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +1 -1
  249. package/corpus/templates/slides/app/components/editor/AddSlidePopover.tsx +5 -1
  250. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +25 -12
  251. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +112 -57
  252. package/corpus/templates/slides/app/components/editor/GoogleDriveConnectionCta.tsx +202 -0
  253. package/corpus/templates/slides/app/components/editor/GoogleSlidesReferenceImport.tsx +26 -14
  254. package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +176 -0
  255. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +182 -141
  256. package/corpus/templates/slides/app/components/editor/canvas-interactions/index.ts +1 -0
  257. package/corpus/templates/slides/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +18 -0
  258. package/corpus/templates/slides/app/components/editor/slide-text-targets.ts +85 -0
  259. package/corpus/templates/slides/app/components/layout/Layout.tsx +3 -0
  260. package/corpus/templates/slides/app/components/onboarding/FirstDeckOnboardingFlow.tsx +13 -3
  261. package/corpus/templates/slides/app/components/presentation/PresentationView.tsx +27 -1
  262. package/corpus/templates/slides/app/context/DeckContext.tsx +71 -20
  263. package/corpus/templates/slides/app/global.css +6 -0
  264. package/corpus/templates/slides/app/i18n/en-US.ts +1 -0
  265. package/corpus/templates/slides/app/lib/create-deck-generation.ts +10 -6
  266. package/corpus/templates/slides/app/lib/deck-preview-frame.ts +15 -0
  267. package/corpus/templates/slides/app/lib/deck-share-links.ts +9 -0
  268. package/corpus/templates/slides/app/lib/export-pptx-client.ts +89 -0
  269. package/corpus/templates/slides/app/lib/slide-animation-elements.ts +3 -0
  270. package/corpus/templates/slides/app/pages/DeckEditor.tsx +17 -0
  271. package/corpus/templates/slides/app/pages/Index.tsx +107 -6
  272. package/corpus/templates/slides/app/routes/extensions._index.tsx +1 -1
  273. package/corpus/templates/slides/app/routes/settings.$.tsx +1 -0
  274. package/corpus/templates/slides/app/routes/team.tsx +1 -1
  275. package/corpus/templates/slides/changelog/2026-08-05-failed-deck-creation-and-reference-uploads-now-recover-clean.md +6 -0
  276. package/corpus/templates/slides/changelog/2026-08-05-slides-recover-completed-generation-results-after-a-sync-hic.md +6 -0
  277. package/corpus/templates/slides/changelog/2026-08-05-website-url-imports-now-capture-hydrated-browser-computed-st.md +6 -0
  278. package/corpus/templates/slides/changelog/2026-08-06-clicking-the-gray-canvas-around-a-slide-clears-its-selection.md +6 -0
  279. package/corpus/templates/slides/changelog/2026-08-06-deck-thumbnails-keep-a-consistent-listing-frame-across-aspec.md +6 -0
  280. package/corpus/templates/slides/changelog/2026-08-06-deep-linked-decks-open-directly-instead-of-being-interrupted.md +6 -0
  281. package/corpus/templates/slides/changelog/2026-08-06-google-slides-exports-now-show-clear-import-steps-when-direc.md +6 -0
  282. package/corpus/templates/slides/changelog/2026-08-06-import-pdf-google-slides-and-powerpoint-decks-directly-from-.md +6 -0
  283. package/corpus/templates/slides/changelog/2026-08-06-imported-powerpoint-exports-keep-text-and-images-editable-an.md +6 -0
  284. package/corpus/templates/slides/changelog/2026-08-06-presentation-prompts-continue-adding-rendered-slides-until-t.md +6 -0
  285. package/corpus/templates/slides/changelog/2026-08-06-public-decks-now-share-read-only-presentation-links-by-defau.md +6 -0
  286. package/corpus/templates/slides/changelog/2026-08-06-slides-offers-a-direct-connect-google-button-when-a-drive-co.md +6 -0
  287. package/corpus/templates/slides/changelog/2026-08-06-slides-preserve-uploaded-pdf-layouts-accept-larger-reference.md +6 -0
  288. package/corpus/templates/slides/changelog/2026-08-06-styled-words-stay-part-of-their-text-box-instead-of-becoming.md +6 -0
  289. package/corpus/templates/slides/server/handlers/google-docs-auth.ts +7 -20
  290. package/corpus/templates/slides/server/handlers/import/html-converter.ts +236 -13
  291. package/corpus/templates/slides/server/handlers/import/pptx-assets.ts +67 -0
  292. package/corpus/templates/slides/server/handlers/import/pptx-parser.ts +2 -0
  293. package/corpus/templates/slides/server/handlers/uploads.ts +7 -3
  294. package/corpus/templates/slides/server/lib/chat-attachments.ts +6 -3
  295. package/corpus/templates/slides/server/lib/emails.ts +7 -2
  296. package/corpus/templates/slides/server/lib/google-docs-error.ts +50 -0
  297. package/corpus/templates/slides/server/lib/google-docs-oauth.ts +1 -0
  298. package/corpus/templates/slides/server/lib/import-asset-storage.ts +127 -0
  299. package/corpus/templates/slides/server/plugins/agent-chat.ts +4 -3
  300. package/corpus/templates/slides/server/routes/api/import-assets/[token].get.ts +70 -0
  301. package/corpus/templates/slides/shared/upload-types.ts +3 -0
  302. package/corpus/templates/tasks/.agents/skills/turn-into-app/SKILL.md +296 -0
  303. package/corpus/templates/tasks/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  304. package/corpus/templates/tasks/.agents/skills/turn-into-skill/SKILL.md +112 -0
  305. package/corpus/templates/tasks/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  306. package/corpus/templates/tasks/app/components/layout/Header.tsx +3 -1
  307. package/corpus/templates/tasks/app/routes/extensions._index.tsx +1 -1
  308. package/corpus/templates/tasks/app/routes/settings.$.tsx +1 -0
  309. package/dist/agent/engine/ai-sdk-engine.js +49 -3
  310. package/dist/agent/production-agent.d.ts +18 -0
  311. package/dist/agent/production-agent.js +80 -1
  312. package/dist/agent/types.d.ts +7 -0
  313. package/dist/cli/agent-plugin.d.ts +112 -0
  314. package/dist/cli/agent-plugin.js +1081 -0
  315. package/dist/cli/app-skill.js +39 -1
  316. package/dist/cli/code-agent-executor.d.ts +3 -0
  317. package/dist/cli/code-agent-executor.js +51 -13
  318. package/dist/cli/index.js +13 -0
  319. package/dist/cli/templates-meta.js +1 -1
  320. package/dist/client/AgentPanel.d.ts +3 -1
  321. package/dist/client/AgentPanel.js +9 -2
  322. package/dist/client/AssistantChat.d.ts +8 -0
  323. package/dist/client/AssistantChat.js +23 -8
  324. package/dist/client/NewWorkspaceAppFlow.js +1 -0
  325. package/dist/client/agent-chat-adapter.d.ts +1 -1
  326. package/dist/client/agent-chat-adapter.js +153 -7
  327. package/dist/client/agent-page/AgentWorkspaceContent.d.ts +1 -1
  328. package/dist/client/agent-page/AgentWorkspaceContent.js +13 -13
  329. package/dist/client/assistant-ui-recovery.d.ts +2 -1
  330. package/dist/client/assistant-ui-recovery.js +7 -3
  331. package/dist/client/chat/run-recovery.js +5 -1
  332. package/dist/client/embed-auth.js +6 -2
  333. package/dist/client/error-format.js +12 -0
  334. package/dist/client/integrations/IntegrationsPanel.js +40 -6
  335. package/dist/client/onboarding/FirstRunOnboarding.js +11 -4
  336. package/dist/client/org/OrgSwitcher.js +2 -2
  337. package/dist/client/org/TeamPage.js +92 -72
  338. package/dist/client/require-session.d.ts +1 -1
  339. package/dist/client/require-session.js +4 -4
  340. package/dist/client/resources/McpConnectionSuggestion.d.ts +1 -0
  341. package/dist/client/resources/McpConnectionSuggestion.js +27 -10
  342. package/dist/client/resources/McpIntegrationDialog.js +77 -45
  343. package/dist/client/resources/mcp-integration-catalog.d.ts +13 -1
  344. package/dist/client/resources/mcp-integration-catalog.js +255 -2
  345. package/dist/client/resources/mcp-integration-logos.js +18 -2
  346. package/dist/client/resources/use-mcp-servers.d.ts +5 -0
  347. package/dist/client/resources/use-mcp-servers.js +36 -0
  348. package/dist/client/settings/AccountSettingsCard.js +42 -36
  349. package/dist/client/settings/AutomationsSection.js +1 -1
  350. package/dist/client/settings/DemoModeSection.d.ts +3 -1
  351. package/dist/client/settings/DemoModeSection.js +4 -1
  352. package/dist/client/settings/ExtensionsSettingsContent.js +1 -1
  353. package/dist/client/settings/SchedulingTimezoneField.d.ts +3 -1
  354. package/dist/client/settings/SchedulingTimezoneField.js +9 -5
  355. package/dist/client/settings/SettingsPanel.d.ts +4 -1
  356. package/dist/client/settings/SettingsPanel.js +21 -21
  357. package/dist/client/settings/SettingsTabsPage.d.ts +2 -2
  358. package/dist/client/settings/SettingsTabsPage.js +98 -45
  359. package/dist/client/settings/VoiceTranscriptionSection.js +6 -1
  360. package/dist/client/settings/useSettingsPanelController.js +47 -8
  361. package/dist/collab/routes.d.ts +1 -1
  362. package/dist/db/client.d.ts +9 -0
  363. package/dist/db/client.js +51 -16
  364. package/dist/db/create-get-db.js +2 -2
  365. package/dist/db/ddl-guard.d.ts +11 -10
  366. package/dist/db/ddl-guard.js +40 -12
  367. package/dist/deploy/build.d.ts +2 -0
  368. package/dist/deploy/build.js +97 -4
  369. package/dist/deploy/workspace-deploy.js +0 -2
  370. package/dist/guards/no-env-credentials.js +9 -0
  371. package/dist/ingestion/index.d.ts +1 -1
  372. package/dist/ingestion/pptx.d.ts +68 -0
  373. package/dist/ingestion/pptx.js +660 -213
  374. package/dist/ingestion/website.d.ts +30 -0
  375. package/dist/integrations/plugin.js +9 -6
  376. package/dist/localization/default-messages.d.ts +59 -0
  377. package/dist/localization/default-messages.js +62 -2
  378. package/dist/mcp/screen-memory-stdio.d.ts +7 -7
  379. package/dist/mcp-client/oauth-routes.d.ts +2 -0
  380. package/dist/mcp-client/oauth-routes.js +74 -7
  381. package/dist/mcp-client/routes.d.ts +1 -0
  382. package/dist/mcp-client/routes.js +49 -0
  383. package/dist/navigation/index.js +16 -5
  384. package/dist/notifications/routes.d.ts +1 -1
  385. package/dist/observability/routes.d.ts +3 -3
  386. package/dist/onboarding/app-profile.js +11 -0
  387. package/dist/progress/routes.d.ts +1 -1
  388. package/dist/provider-api/actions/custom-provider-registration.d.ts +13 -13
  389. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  390. package/dist/resources/store.js +15 -1
  391. package/dist/scripts/call-agent.js +45 -4
  392. package/dist/secrets/routes.d.ts +6 -6
  393. package/dist/server/agent-chat/action-filters-a2a.d.ts +1 -1
  394. package/dist/server/agent-chat/action-filters-a2a.js +36 -1
  395. package/dist/server/agent-chat-plugin.js +29 -8
  396. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  397. package/dist/server/auth.js +55 -17
  398. package/dist/server/better-auth-instance.js +5 -3
  399. package/dist/server/core-routes-plugin.d.ts +8 -1
  400. package/dist/server/core-routes-plugin.js +28 -3
  401. package/dist/server/credential-provider.d.ts +3 -3
  402. package/dist/server/credential-provider.js +90 -4
  403. package/dist/server/identity-sso.js +2 -1
  404. package/dist/server/onboarding-html.d.ts +2 -0
  405. package/dist/server/onboarding-html.js +171 -62
  406. package/dist/server/realtime-token.d.ts +1 -1
  407. package/dist/server/self-dispatch.d.ts +5 -4
  408. package/dist/server/self-dispatch.js +25 -14
  409. package/dist/server/ssr-handler.d.ts +1 -1
  410. package/dist/server/ssr-handler.js +1 -1
  411. package/dist/server/workspace-provider-oauth.js +1 -1
  412. package/dist/setup-connections/onboarding.js +1 -1
  413. package/dist/shared/cache-control.d.ts +26 -2
  414. package/dist/shared/cache-control.js +43 -2
  415. package/dist/shared/index.d.ts +1 -1
  416. package/dist/shared/index.js +1 -1
  417. package/dist/shared/password-policy.d.ts +3 -0
  418. package/dist/shared/password-policy.js +3 -0
  419. package/dist/shared/sign-in-journey.d.ts +5 -2
  420. package/dist/shared/sign-in-journey.js +10 -4
  421. package/dist/sharing/actions/set-resource-visibility.js +16 -4
  422. package/dist/sharing/registry.d.ts +14 -0
  423. package/dist/styles/agent-native.css +6 -0
  424. package/dist/templates/chat/.agents/skills/turn-into-app/SKILL.md +296 -0
  425. package/dist/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  426. package/dist/templates/chat/.agents/skills/turn-into-skill/SKILL.md +112 -0
  427. package/dist/templates/chat/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  428. package/dist/templates/chat/app/components/layout/Layout.tsx +1 -1
  429. package/dist/templates/chat/app/hooks/use-navigation-state.ts +1 -1
  430. package/dist/templates/chat/app/root.tsx +1 -1
  431. package/dist/templates/chat/app/routes/agent.tsx +7 -7
  432. package/dist/templates/chat/app/routes/extensions._index.tsx +1 -1
  433. package/dist/templates/chat/app/routes/settings.$.tsx +1 -0
  434. package/dist/templates/chat/app/routes/team.tsx +1 -1
  435. package/dist/templates/default/.agents/skills/turn-into-app/SKILL.md +296 -0
  436. package/dist/templates/default/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  437. package/dist/templates/default/.agents/skills/turn-into-skill/SKILL.md +112 -0
  438. package/dist/templates/default/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  439. package/dist/templates/headless/.agents/skills/turn-into-app/SKILL.md +296 -0
  440. package/dist/templates/headless/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  441. package/dist/templates/headless/.agents/skills/turn-into-skill/SKILL.md +112 -0
  442. package/dist/templates/headless/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  443. package/dist/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +6 -0
  444. package/dist/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +37 -6
  445. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +4 -2
  446. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +51 -0
  447. package/dist/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +296 -0
  448. package/dist/templates/workspace-core/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  449. package/dist/templates/workspace-core/.agents/skills/turn-into-skill/SKILL.md +112 -0
  450. package/dist/templates/workspace-core/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  451. package/dist/templates/workspace-root/AGENTS.md +7 -0
  452. package/dist/user-profile/actions/change-password.js +8 -3
  453. package/dist/user-profile/actions/set-password.js +5 -1
  454. package/dist/vite/action-types-plugin.js +59 -0
  455. package/docs/content/authentication.mdx +4 -5
  456. package/docs/content/skills-guide.mdx +13 -0
  457. package/docs/content/template-analytics-developers.mdx +1 -1
  458. package/docs/content/template-calendar-developers.mdx +1 -1
  459. package/docs/content/template-chat-developers.mdx +2 -2
  460. package/docs/content/template-content-developers.mdx +1 -1
  461. package/docs/content/template-mail-developers.mdx +1 -1
  462. package/docs/content/template-plan-developers.mdx +1 -1
  463. package/docs/content/toolkit-command-navigation.mdx +6 -6
  464. package/docs/content/toolkit-org-team.mdx +1 -1
  465. package/docs/content/toolkit-settings.mdx +8 -8
  466. package/docs/content/toolkit-setup-connections.mdx +1 -1
  467. package/package.json +6 -2
  468. package/src/templates/chat/.agents/skills/turn-into-app/SKILL.md +296 -0
  469. package/src/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  470. package/src/templates/chat/.agents/skills/turn-into-skill/SKILL.md +112 -0
  471. package/src/templates/chat/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  472. package/src/templates/chat/app/components/layout/Layout.tsx +1 -1
  473. package/src/templates/chat/app/hooks/use-navigation-state.ts +1 -1
  474. package/src/templates/chat/app/root.tsx +1 -1
  475. package/src/templates/chat/app/routes/agent.tsx +7 -7
  476. package/src/templates/chat/app/routes/extensions._index.tsx +1 -1
  477. package/src/templates/chat/app/routes/settings.$.tsx +1 -0
  478. package/src/templates/chat/app/routes/team.tsx +1 -1
  479. package/src/templates/default/.agents/skills/turn-into-app/SKILL.md +296 -0
  480. package/src/templates/default/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  481. package/src/templates/default/.agents/skills/turn-into-skill/SKILL.md +112 -0
  482. package/src/templates/default/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  483. package/src/templates/headless/.agents/skills/turn-into-app/SKILL.md +296 -0
  484. package/src/templates/headless/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  485. package/src/templates/headless/.agents/skills/turn-into-skill/SKILL.md +112 -0
  486. package/src/templates/headless/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  487. package/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +6 -0
  488. package/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +37 -6
  489. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +4 -2
  490. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +51 -0
  491. package/src/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +296 -0
  492. package/src/templates/workspace-core/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  493. package/src/templates/workspace-core/.agents/skills/turn-into-skill/SKILL.md +112 -0
  494. package/src/templates/workspace-core/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  495. package/src/templates/workspace-root/AGENTS.md +7 -0
  496. package/corpus/templates/analytics/.agents/skills/dashboard-management/references/template-catalog-and-demo.md +0 -62
  497. package/corpus/templates/analytics/actions/install-dashboard-template.ts +0 -369
  498. package/corpus/templates/analytics/actions/list-dashboard-templates.ts +0 -47
  499. package/corpus/templates/analytics/actions/list-native-v2-dashboard-templates.ts +0 -34
  500. package/corpus/templates/analytics/app/routes/catalog.tsx +0 -240
  501. package/src/templates/default/actions/navigate.spec.ts +0 -53
@@ -7,7 +7,7 @@ import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, }
7
7
  import { Tooltip, TooltipContent, TooltipTrigger, } from "../components/ui/tooltip.js";
8
8
  import { useT } from "../i18n.js";
9
9
  import { cn } from "../utils.js";
10
- import { buildMcpOAuthStartUrl, createMcpIntegrationFormDefaults, filterMcpIntegrations, getMcpIntegrationApiFallback, getDefaultMcpIntegrations, isCustomMcpIntegrationEnabled, navigateToMcpOAuthStart, resolveMcpIntegrationScope, shouldOfferMcpOrganizationScope, } from "./mcp-integration-catalog.js";
10
+ import { buildMcpOAuthStartUrl, createMcpIntegrationFormDefaults, filterMcpIntegrations, getMcpIntegrationApiFallback, getDefaultMcpIntegrations, isCustomMcpIntegrationEnabled, navigateToMcpOAuthStart, resolveMcpIntegrationScope, shouldOfferMcpIntegrationOrganizationScope, shouldOfferMcpOrganizationScope, } from "./mcp-integration-catalog.js";
11
11
  import { formatMcpServerError, getMcpUrlValidationError, testMcpServerUrl, useMcpServers, } from "./use-mcp-servers.js";
12
12
  function IntegrationLogo({ name, logoUrl }) {
13
13
  const [loaded, setLoaded] = useState(false);
@@ -51,6 +51,17 @@ function compareUrl(value) {
51
51
  return value.trim().replace(/\/+$/, "");
52
52
  }
53
53
  }
54
+ function requiresMcpIntegrationSetup(integration) {
55
+ return Boolean(!integration.managedOAuth &&
56
+ (integration.connectionMode === "manual" ||
57
+ integration.availability === "provider-setup" ||
58
+ integration.availability === "client-restricted"));
59
+ }
60
+ function resolveIntegrationScope(integration, defaultScope, hasOrg, canCreateOrgMcp) {
61
+ return resolveMcpIntegrationScope(defaultScope, hasOrg, canCreateOrgMcp, !integration ||
62
+ (integration.supportsOrganizationScope === true &&
63
+ integration.managedOAuth !== true));
64
+ }
54
65
  export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId = null, defaultScope, canCreateOrgMcp, hasOrg, onCreateMcpServer, onCreated, integrations, }) {
55
66
  const t = useT();
56
67
  const [mode, setMode] = useState("catalog");
@@ -84,10 +95,7 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
84
95
  .map((server) => compareUrl(server.url)));
85
96
  }, [mcpServersQuery.data]);
86
97
  const filteredIntegrations = useMemo(() => filterMcpIntegrations(query, defaultIntegrations), [defaultIntegrations, query]);
87
- const selectedRequiresSetup = Boolean(selected &&
88
- (selected.connectionMode === "manual" ||
89
- selected.availability === "provider-setup" ||
90
- selected.availability === "client-restricted"));
98
+ const selectedRequiresSetup = Boolean(selected && requiresMcpIntegrationSetup(selected));
91
99
  useEffect(() => {
92
100
  if (!open)
93
101
  return;
@@ -98,7 +106,7 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
98
106
  setMode(initialIntegration || !showCatalog ? "form" : "catalog");
99
107
  setQuery("");
100
108
  setSelected(initialIntegration ?? null);
101
- setScope(safeDefaultScope);
109
+ setScope(resolveIntegrationScope(initialIntegration, defaultScope, hasOrg, canCreateOrgMcp));
102
110
  setName(initialDefaults.name);
103
111
  setUrl(initialDefaults.url);
104
112
  setDescription(initialDefaults.description);
@@ -110,6 +118,9 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
110
118
  }, [
111
119
  defaultIntegrations,
112
120
  initialIntegrationId,
121
+ canCreateOrgMcp,
122
+ defaultScope,
123
+ hasOrg,
113
124
  open,
114
125
  safeDefaultScope,
115
126
  showCatalog,
@@ -127,7 +138,7 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
127
138
  const openForm = (integration) => {
128
139
  const defaults = createMcpIntegrationFormDefaults(integration);
129
140
  setSelected(integration ?? null);
130
- setScope(safeDefaultScope);
141
+ setScope(resolveIntegrationScope(integration, defaultScope, hasOrg, canCreateOrgMcp));
131
142
  setName(defaults.name);
132
143
  setUrl(defaults.url);
133
144
  setDescription(defaults.description);
@@ -154,7 +165,7 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
154
165
  name: args.name,
155
166
  url: args.url,
156
167
  description: args.description,
157
- scope,
168
+ scope: options?.scope ?? scope,
158
169
  returnUrl,
159
170
  })));
160
171
  };
@@ -162,7 +173,13 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
162
173
  name: integration.name,
163
174
  url: integration.url,
164
175
  description: integration.description,
165
- }, options);
176
+ }, {
177
+ ...options,
178
+ scope: integration.supportsOrganizationScope === true &&
179
+ integration.managedOAuth !== true
180
+ ? scope
181
+ : "user",
182
+ });
166
183
  const connectCustomWithOAuth = () => {
167
184
  if (!name.trim()) {
168
185
  setError(t("mcpIntegrations.serverNameRequired"));
@@ -212,10 +229,12 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
212
229
  });
213
230
  };
214
231
  const quickConnect = (integration) => {
215
- if (integration.connectionMode === "manual" ||
216
- integration.availability === "provider-setup") {
232
+ if (shouldOfferMcpIntegrationOrganizationScope(integration, hasOrg, canCreateOrgMcp)) {
233
+ openForm(integration);
217
234
  return;
218
235
  }
236
+ if (requiresMcpIntegrationSetup(integration))
237
+ return;
219
238
  if (integration.authMode === "oauth") {
220
239
  connectWithOAuth(integration, { quickId: integration.id });
221
240
  return;
@@ -225,7 +244,7 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
225
244
  return;
226
245
  }
227
246
  void createServer({
228
- scope: safeDefaultScope,
247
+ scope: resolveIntegrationScope(integration, defaultScope, hasOrg, canCreateOrgMcp),
229
248
  name: integration.name,
230
249
  url: integration.url,
231
250
  description: integration.description,
@@ -263,13 +282,20 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
263
282
  }
264
283
  };
265
284
  const renderScopeSelector = () => {
266
- if (!shouldOfferMcpOrganizationScope(hasOrg, canCreateOrgMcp))
285
+ if (selected?.managedOAuth)
286
+ return null;
287
+ const canSelectScope = selected
288
+ ? shouldOfferMcpIntegrationOrganizationScope(selected, hasOrg, canCreateOrgMcp)
289
+ : shouldOfferMcpOrganizationScope(hasOrg, canCreateOrgMcp);
290
+ if (!canSelectScope)
267
291
  return null;
268
- return (_jsxs("div", { className: "flex gap-1 rounded-md border border-border bg-background p-0.5", children: [_jsx("button", { type: "button", onClick: () => setScope("user"), className: cn("flex-1 rounded px-2 py-1.5 text-[11px] font-medium", scope === "user"
269
- ? "bg-accent text-foreground"
270
- : "text-muted-foreground hover:text-foreground"), children: t("mcpIntegrations.personal") }), _jsx("button", { type: "button", onClick: () => setScope("org"), className: cn("flex-1 rounded px-2 py-1.5 text-[11px] font-medium", scope === "org"
271
- ? "bg-accent text-foreground"
272
- : "text-muted-foreground hover:text-foreground"), children: t("mcpIntegrations.organization") })] }));
292
+ return (_jsxs("div", { className: "space-y-1.5", children: [_jsx("p", { className: "text-[11px] font-medium text-foreground", children: t("mcpIntegrations.scopeQuestion") }), _jsxs("div", { className: "flex gap-1 rounded-md border border-border bg-background p-0.5", children: [_jsx("button", { type: "button", onClick: () => setScope("user"), "aria-pressed": scope === "user", className: cn("flex-1 rounded px-2 py-1.5 text-[11px] font-medium", scope === "user"
293
+ ? "bg-accent text-foreground"
294
+ : "text-muted-foreground hover:text-foreground"), children: t("mcpIntegrations.personal") }), _jsx("button", { type: "button", onClick: () => setScope("org"), "aria-pressed": scope === "org", className: cn("flex-1 rounded px-2 py-1.5 text-[11px] font-medium", scope === "org"
295
+ ? "bg-accent text-foreground"
296
+ : "text-muted-foreground hover:text-foreground"), children: t("mcpIntegrations.sharedWithWorkspace") })] }), _jsx("p", { className: "text-[11px] leading-relaxed text-muted-foreground", children: t(scope === "user"
297
+ ? "mcpIntegrations.personalDescription"
298
+ : "mcpIntegrations.organizationDescription") })] }));
273
299
  };
274
300
  if (!showCatalog && !customIntegrationEnabled)
275
301
  return null;
@@ -279,9 +305,7 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
279
305
  const apiFallback = getMcpIntegrationApiFallback(integration);
280
306
  const connected = connectedUrls.has(compareUrl(integration.url));
281
307
  const requiresHeaders = integration.authMode === "headers";
282
- const setupOnly = integration.connectionMode === "manual" ||
283
- integration.availability === "provider-setup" ||
284
- integration.availability === "client-restricted";
308
+ const setupOnly = requiresMcpIntegrationSetup(integration);
285
309
  return (_jsxs("article", { 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", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(IntegrationLogo, { name: integration.name, logoUrl: integration.logoUrl }), _jsxs("div", { className: "min-w-0", children: [_jsx("h3", { className: "truncate text-[13px] font-semibold text-foreground", children: integration.name }), integration.availability !== "ready" && (_jsx("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", children: integration.availability === "beta"
286
310
  ? t("mcpIntegrations.status.beta")
287
311
  : integration.availability ===
@@ -291,7 +315,7 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
291
315
  ? t("mcpIntegrations.status.verified")
292
316
  : integration.verification === "restricted"
293
317
  ? t("mcpIntegrations.status.restricted")
294
- : t("mcpIntegrations.status.preflightOnly") })] })] }), _jsx("p", { className: "mt-1 line-clamp-2 flex-1 text-[12px] leading-relaxed text-muted-foreground", children: t(integration.descriptionKey) }), _jsxs("div", { className: "mt-3 flex items-center gap-2", children: [connected ? (_jsx("button", { type: "button", disabled: true, className: "inline-flex h-8 flex-1 cursor-not-allowed items-center justify-center gap-1.5 rounded-md border border-border bg-muted px-2.5 text-[12px] font-medium text-muted-foreground opacity-70", children: t("mcpIntegrations.connected") })) : setupOnly ? (_jsxs(_Fragment, { children: [apiFallback && (_jsx("button", { type: "button", onClick: () => openAgentSettings(`secrets:${apiFallback.secretKey}`), className: "inline-flex h-8 flex-1 items-center justify-center gap-1.5 rounded-md bg-primary px-2.5 text-[12px] font-medium text-primary-foreground hover:bg-primary/90", children: t("mcpIntegrations.useApiToken") })), _jsxs("a", { href: integration.docsUrl, target: "_blank", rel: "noopener noreferrer", className: "inline-flex h-8 flex-1 items-center justify-center gap-1.5 rounded-md border border-border bg-background px-2.5 text-[12px] font-medium text-foreground hover:bg-accent", children: [t("mcpIntegrations.viewSetup"), _jsx(IconExternalLink, { className: "h-3.5 w-3.5" })] })] })) : (_jsxs("button", { type: "button", onClick: () => quickConnect(integration), disabled: busy, "aria-busy": quickBusyId === integration.id, className: cn("inline-flex h-8 flex-1 items-center justify-center gap-1.5 rounded-md bg-primary px-2.5 text-[12px] font-medium text-primary-foreground hover:bg-primary/90", busy && "cursor-not-allowed opacity-70"), children: [quickBusyId === integration.id ? (_jsx(IconLoader2, { className: "h-3.5 w-3.5 animate-spin" })) : null, integration.authMode === "oauth"
318
+ : t("mcpIntegrations.status.preflightOnly") })] })] }), _jsx("p", { className: "mt-1 line-clamp-2 flex-1 text-[12px] leading-relaxed text-muted-foreground", children: t(integration.descriptionKey) }), _jsxs("div", { className: "mt-3 flex items-center gap-2", children: [connected ? (_jsx("button", { type: "button", disabled: true, className: "inline-flex h-8 flex-1 cursor-not-allowed items-center justify-center gap-1.5 rounded-md border border-border bg-muted px-2.5 text-[12px] font-medium text-muted-foreground opacity-70", children: t("mcpIntegrations.connected") })) : setupOnly ? (_jsxs(_Fragment, { children: [apiFallback && (_jsx("button", { type: "button", onClick: () => openAgentSettings(`secrets:${apiFallback.secretKey}`), className: "inline-flex h-8 flex-1 items-center justify-center gap-1.5 rounded-md bg-primary px-2.5 text-[12px] font-medium text-primary-foreground hover:bg-primary/90", children: t("mcpIntegrations.useApiToken") })), _jsx("button", { type: "button", onClick: () => openForm(integration), className: "inline-flex h-8 flex-1 items-center justify-center gap-1.5 rounded-md border border-border bg-background px-2.5 text-[12px] font-medium text-foreground hover:bg-accent", children: t("mcpIntegrations.viewSetup") })] })) : (_jsxs("button", { type: "button", onClick: () => quickConnect(integration), disabled: busy, "aria-busy": quickBusyId === integration.id, className: cn("inline-flex h-8 flex-1 items-center justify-center gap-1.5 rounded-md bg-primary px-2.5 text-[12px] font-medium text-primary-foreground hover:bg-primary/90", busy && "cursor-not-allowed opacity-70"), children: [quickBusyId === integration.id ? (_jsx(IconLoader2, { className: "h-3.5 w-3.5 animate-spin" })) : null, integration.authMode === "oauth"
295
319
  ? t("mcpIntegrations.connectWithOAuth")
296
320
  : requiresHeaders
297
321
  ? t("mcpIntegrations.configure")
@@ -304,29 +328,37 @@ export function McpIntegrationDialog({ open, onOpenChange, initialIntegrationId
304
328
  clearFeedback();
305
329
  setMode("catalog");
306
330
  }, className: cn("mb-1 inline-flex w-fit items-center gap-1 text-[11px] text-muted-foreground hover:text-foreground", !showCatalog && "hidden"), children: [_jsx(IconArrowLeft, { className: "h-3 w-3 rtl:-scale-x-100" }), t("mcpIntegrations.backToIntegrations")] }), _jsx(DialogTitle, { children: selected
307
- ? t("mcpIntegrations.configureTitle", {
308
- name: selected.name,
309
- })
331
+ ? selectedRequiresSetup
332
+ ? t("mcpIntegrations.setupTitle", {
333
+ name: selected.name,
334
+ })
335
+ : t("mcpIntegrations.configureTitle", {
336
+ name: selected.name,
337
+ })
310
338
  : t("mcpIntegrations.customTitle") }), _jsx(DialogDescription, { children: selected
311
- ? selected.authMode === "none"
312
- ? t("mcpIntegrations.presetNoAuthDescription")
313
- : t("mcpIntegrations.presetAuthDescription")
314
- : t("mcpIntegrations.customDescription") })] }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto px-7 py-5", children: _jsxs("div", { className: "space-y-3", children: [renderScopeSelector(), selected?.setupNoteKey && (_jsx("div", { className: "rounded-md border border-border bg-muted/40 px-3 py-2 text-[11px] leading-relaxed text-muted-foreground", children: t(selected.setupNoteKey) })), selected?.authMode === "oauth" && (_jsx("div", { className: "rounded-md border border-blue-500/20 bg-blue-500/5 px-3 py-2 text-[11px] leading-relaxed text-blue-700 dark:text-blue-300", children: t("mcpIntegrations.oauthNotice") })), _jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1 block text-[10px] font-medium text-muted-foreground", children: t("mcpIntegrations.serverName") }), _jsx("input", { ref: inputRef, value: name, onChange: (event) => {
315
- setName(event.target.value);
316
- clearFeedback();
317
- }, className: "w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-ring", placeholder: t("mcpIntegrations.serverNamePlaceholder") })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1 block text-[10px] font-medium text-muted-foreground", children: t("mcpIntegrations.url") }), _jsx("input", { value: url, onChange: (event) => {
318
- setUrl(event.target.value);
319
- clearFeedback();
320
- }, className: "w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-ring", placeholder: t("mcpIntegrations.urlPlaceholder") })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1 block text-[10px] font-medium text-muted-foreground", children: t("mcpIntegrations.fieldDescription") }), _jsx("input", { value: description, onChange: (event) => {
321
- setDescription(event.target.value);
322
- clearFeedback();
323
- }, className: "w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-ring", placeholder: t("mcpIntegrations.descriptionPlaceholder") })] }), selected?.authMode !== "oauth" && (_jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1 block text-[10px] font-medium text-muted-foreground", children: t("mcpIntegrations.headers") }), _jsx("textarea", { value: headersText, onChange: (event) => {
324
- setHeadersText(event.target.value);
325
- clearFeedback();
326
- }, rows: 3, className: "w-full resize-y rounded-md border border-border bg-background px-2.5 py-1.5 text-[12px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-ring", style: {
327
- fontFamily: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace',
328
- }, placeholder: selected?.headerPlaceholder ??
329
- t("mcpIntegrations.headersPlaceholder") })] })), selected?.docsUrl && (_jsxs("a", { href: selected.docsUrl, target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center gap-1 text-[11px] text-muted-foreground underline hover:text-foreground", children: [t("mcpIntegrations.openSetupDocs"), _jsx(IconExternalLink, { className: "h-3 w-3" })] })), testResult && (_jsxs("div", { className: cn("flex items-start gap-1 rounded-md px-3 py-2 text-[11px] leading-snug", testResult.ok
339
+ ? selectedRequiresSetup
340
+ ? t("mcpIntegrations.providerSetupFormDescription")
341
+ : selected.authMode === "none"
342
+ ? t("mcpIntegrations.presetNoAuthDescription")
343
+ : t("mcpIntegrations.presetAuthDescription")
344
+ : t("mcpIntegrations.customDescription") })] }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto px-7 py-5", children: _jsxs("div", { className: "space-y-3", children: [renderScopeSelector(), selected?.setupNoteKey && (_jsx("div", { className: "rounded-md border border-border bg-muted/40 px-3 py-2 text-[11px] leading-relaxed text-muted-foreground", children: t(selected.setupNoteKey) })), selectedRequiresSetup && selected && (_jsxs("div", { className: "rounded-md border border-border bg-muted/40 px-3 py-2 text-[11px] leading-relaxed", children: [_jsx("p", { className: "font-medium text-foreground", children: t("mcpIntegrations.providerSetupRequired") }), _jsx("p", { className: "mt-0.5 text-muted-foreground", children: t("mcpIntegrations.providerSetupDescription", {
345
+ name: selected.name,
346
+ }) })] })), !selectedRequiresSetup && (_jsxs(_Fragment, { children: [selected?.authMode === "oauth" && (_jsx("div", { className: "rounded-md border border-primary/20 bg-primary/5 px-3 py-2 text-[11px] leading-relaxed text-primary", children: t("mcpIntegrations.oauthNotice") })), _jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1 block text-[10px] font-medium text-muted-foreground", children: t("mcpIntegrations.serverName") }), _jsx("input", { ref: inputRef, value: name, onChange: (event) => {
347
+ setName(event.target.value);
348
+ clearFeedback();
349
+ }, className: "w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-ring", placeholder: t("mcpIntegrations.serverNamePlaceholder") })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1 block text-[10px] font-medium text-muted-foreground", children: t("mcpIntegrations.url") }), _jsx("input", { value: url, onChange: (event) => {
350
+ setUrl(event.target.value);
351
+ clearFeedback();
352
+ }, className: "w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-ring", placeholder: t("mcpIntegrations.urlPlaceholder") })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1 block text-[10px] font-medium text-muted-foreground", children: t("mcpIntegrations.fieldDescription") }), _jsx("input", { value: description, onChange: (event) => {
353
+ setDescription(event.target.value);
354
+ clearFeedback();
355
+ }, className: "w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-ring", placeholder: t("mcpIntegrations.descriptionPlaceholder") })] }), selected?.authMode !== "oauth" && (_jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1 block text-[10px] font-medium text-muted-foreground", children: t("mcpIntegrations.headers") }), _jsx("textarea", { value: headersText, onChange: (event) => {
356
+ setHeadersText(event.target.value);
357
+ clearFeedback();
358
+ }, rows: 3, className: "w-full resize-y rounded-md border border-border bg-background px-2.5 py-1.5 text-[12px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-ring", style: {
359
+ fontFamily: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace',
360
+ }, placeholder: selected?.headerPlaceholder ??
361
+ t("mcpIntegrations.headersPlaceholder") })] })), selected?.docsUrl && (_jsxs("a", { href: selected.docsUrl, target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center gap-1 text-[11px] text-muted-foreground underline hover:text-foreground", children: [t("mcpIntegrations.openSetupDocs"), _jsx(IconExternalLink, { className: "h-3 w-3" })] }))] })), testResult && (_jsxs("div", { className: cn("flex items-start gap-1 rounded-md px-3 py-2 text-[11px] leading-snug", testResult.ok
330
362
  ? "bg-green-500/5 text-green-600 dark:text-green-400"
331
- : "bg-red-500/5 text-red-600 dark:text-red-400"), children: [testResult.ok && (_jsx(IconCheck, { className: "mt-0.5 h-3 w-3 shrink-0" })), _jsx("span", { className: "min-w-0 break-words", children: testResult.message })] })), error && (_jsx("div", { className: "break-words rounded-md bg-red-500/5 px-3 py-2 text-[11px] leading-snug text-red-600 dark:text-red-400", children: error }))] }) }), _jsxs("div", { className: "flex shrink-0 items-center justify-between gap-2 border-t border-border px-7 py-4", children: [!selectedRequiresSetup && (_jsx("button", { type: "button", onClick: runTest, disabled: !url.trim() || busy, className: "rounded-md border border-border bg-background px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent disabled:pointer-events-none disabled:opacity-40", children: t("mcpIntegrations.test") })), !selected ? (_jsxs("button", { type: "button", onClick: connectCustomWithOAuth, disabled: !name.trim() || !url.trim() || busy, "aria-busy": busy, className: "rounded-md border border-border bg-background px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent disabled:pointer-events-none disabled:opacity-40", children: [busy && (_jsx(IconLoader2, { className: "me-1.5 inline h-3.5 w-3.5 animate-spin" })), t("mcpIntegrations.connectWithOAuth")] })) : null, selectedRequiresSetup ? (selected?.docsUrl ? (_jsxs("a", { href: selected.docsUrl, target: "_blank", rel: "noopener noreferrer", className: "ms-auto inline-flex min-w-[92px] items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-[12px] font-medium text-primary-foreground hover:bg-primary/90", children: [t("mcpIntegrations.viewSetup"), _jsx(IconExternalLink, { className: "h-3 w-3" })] })) : null) : selected?.authMode === "oauth" ? (_jsxs("button", { type: "button", onClick: () => connectWithOAuth(selected), disabled: !name.trim() || !url.trim() || busy, "aria-busy": busy, className: "inline-flex min-w-[92px] items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-[12px] font-medium text-primary-foreground hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-40", children: [busy && _jsx(IconLoader2, { className: "h-3.5 w-3.5 animate-spin" }), t("mcpIntegrations.connectWithOAuth")] })) : (_jsxs("button", { type: "button", onClick: submitForm, disabled: !name.trim() || !url.trim() || busy, className: "inline-flex min-w-[92px] items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-[12px] font-medium text-primary-foreground hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-40", children: [busy && _jsx(IconLoader2, { className: "h-3.5 w-3.5 animate-spin" }), t("mcpIntegrations.connect")] }))] })] })) }) }));
363
+ : "bg-red-500/5 text-red-600 dark:text-red-400"), children: [testResult.ok && (_jsx(IconCheck, { className: "mt-0.5 h-3 w-3 shrink-0" })), _jsx("span", { className: "min-w-0 break-words", children: testResult.message })] })), error && (_jsx("div", { className: "break-words rounded-md bg-red-500/5 px-3 py-2 text-[11px] leading-snug text-red-600 dark:text-red-400", children: error }))] }) }), _jsxs("div", { className: "flex shrink-0 items-center justify-between gap-2 border-t border-border px-7 py-4", children: [!selectedRequiresSetup && (_jsx("button", { type: "button", onClick: runTest, disabled: !url.trim() || busy, className: "rounded-md border border-border bg-background px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent disabled:pointer-events-none disabled:opacity-40", children: t("mcpIntegrations.test") })), !selected ? (_jsxs("button", { type: "button", onClick: connectCustomWithOAuth, disabled: !name.trim() || !url.trim() || busy, "aria-busy": busy, className: "rounded-md border border-border bg-background px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent disabled:pointer-events-none disabled:opacity-40", children: [busy && (_jsx(IconLoader2, { className: "me-1.5 inline h-3.5 w-3.5 animate-spin" })), t("mcpIntegrations.connectWithOAuth")] })) : null, selectedRequiresSetup ? (_jsxs("div", { className: "ms-auto flex items-center gap-2", children: [selected?.docsUrl ? (_jsxs("a", { href: selected.docsUrl, target: "_blank", rel: "noopener noreferrer", className: "inline-flex min-w-[92px] items-center justify-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent", children: [t("mcpIntegrations.viewSetup"), _jsx(IconExternalLink, { className: "h-3 w-3" })] })) : null, selected?.authMode === "oauth" && (_jsxs("button", { type: "button", onClick: () => connectWithOAuth(selected), disabled: busy, "aria-busy": busy, className: "inline-flex min-w-[132px] items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-[12px] font-medium text-primary-foreground hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-40", children: [busy && (_jsx(IconLoader2, { className: "h-3.5 w-3.5 animate-spin" })), t("mcpIntegrations.continueToConnect")] }))] })) : selected?.authMode === "oauth" ? (_jsxs("button", { type: "button", onClick: () => connectWithOAuth(selected), disabled: !name.trim() || !url.trim() || busy, "aria-busy": busy, className: "inline-flex min-w-[92px] items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-[12px] font-medium text-primary-foreground hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-40", children: [busy && _jsx(IconLoader2, { className: "h-3.5 w-3.5 animate-spin" }), t("mcpIntegrations.connectWithOAuth")] })) : (_jsxs("button", { type: "button", onClick: submitForm, disabled: !name.trim() || !url.trim() || busy, className: "inline-flex min-w-[92px] items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-[12px] font-medium text-primary-foreground hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-40", children: [busy && _jsx(IconLoader2, { className: "h-3.5 w-3.5 animate-spin" }), t("mcpIntegrations.connect")] }))] })] })) }) }));
332
364
  }
@@ -17,6 +17,17 @@ export interface DefaultMcpIntegration {
17
17
  availability: McpIntegrationAvailability;
18
18
  verification: McpIntegrationVerification;
19
19
  logoUrl: string;
20
+ /**
21
+ * The server has a first-party OAuth client configured for this provider.
22
+ * Keep the connection user-scoped even when the client itself is shared.
23
+ */
24
+ managedOAuth?: boolean;
25
+ /**
26
+ * The provider supports a workspace connection whose access can be shared
27
+ * with permitted workspace members. Keep this opt-in until provider scope
28
+ * semantics are verified.
29
+ */
30
+ supportsOrganizationScope?: boolean;
20
31
  docsUrl?: string;
21
32
  setupNoteKey?: string;
22
33
  apiFallback?: {
@@ -51,8 +62,9 @@ export declare function isMcpIntegrationCatalogAvailable(config?: McpIntegration
51
62
  export declare function mcpIntegrationAuthLabel(mode: McpIntegrationAuthMode): string;
52
63
  export declare function buildMcpOAuthStartUrl({ name, url, description, scope, returnUrl, }: McpOAuthStartParams): string;
53
64
  export declare function navigateToMcpOAuthStart(url: string): void;
54
- export declare function resolveMcpIntegrationScope(defaultScope: "user" | "org", hasOrg: boolean, canCreateOrgMcp: boolean): "user" | "org";
65
+ export declare function resolveMcpIntegrationScope(defaultScope: "user" | "org", hasOrg: boolean, canCreateOrgMcp: boolean, supportsOrganizationScope?: boolean): "user" | "org";
55
66
  export declare function shouldOfferMcpOrganizationScope(hasOrg: boolean, canCreateOrgMcp: boolean): boolean;
67
+ export declare function shouldOfferMcpIntegrationOrganizationScope(integration: DefaultMcpIntegration, hasOrg: boolean, canCreateOrgMcp: boolean): boolean;
56
68
  export declare function filterMcpIntegrations(query: string, integrations?: DefaultMcpIntegration[]): DefaultMcpIntegration[];
57
69
  export declare function findMcpIntegrationForText(text: string, integrations?: DefaultMcpIntegration[]): DefaultMcpIntegration | null;
58
70
  /**
@@ -16,6 +16,7 @@ export const DEFAULT_MCP_INTEGRATIONS = [
16
16
  availability: "ready",
17
17
  verification: "verified",
18
18
  logoUrl: mcpIntegrationLogo("context7"),
19
+ supportsOrganizationScope: true,
19
20
  docsUrl: "https://context7.com/",
20
21
  keywords: ["docs", "documentation", "libraries", "frameworks"],
21
22
  },
@@ -63,6 +64,31 @@ export const DEFAULT_MCP_INTEGRATIONS = [
63
64
  "screenshots",
64
65
  ],
65
66
  },
67
+ {
68
+ id: "amplitude",
69
+ name: "Amplitude",
70
+ provider: "amplitude",
71
+ description: "Read and work with Amplitude product analytics.",
72
+ descriptionKey: "mcpIntegrations.catalog.amplitude.description",
73
+ useCase: "product analytics, charts, dashboards, cohorts, experiments",
74
+ useCaseKey: "mcpIntegrations.catalog.amplitude.useCase",
75
+ url: "https://mcp.amplitude.com/mcp",
76
+ authMode: "oauth",
77
+ connectionMode: "oauth",
78
+ availability: "ready",
79
+ verification: "preflight-only",
80
+ logoUrl: mcpIntegrationLogo("amplitude"),
81
+ docsUrl: "https://amplitude.com/docs/amplitude-ai/amplitude-mcp/other-clients",
82
+ setupNoteKey: "mcpIntegrations.catalog.amplitude.setupNote",
83
+ keywords: [
84
+ "analytics",
85
+ "product analytics",
86
+ "charts",
87
+ "dashboards",
88
+ "cohorts",
89
+ "experiments",
90
+ ],
91
+ },
66
92
  {
67
93
  id: "notion",
68
94
  name: "Notion",
@@ -107,6 +133,32 @@ export const DEFAULT_MCP_INTEGRATIONS = [
107
133
  "decisions",
108
134
  ],
109
135
  },
136
+ {
137
+ id: "gong",
138
+ name: "Gong",
139
+ provider: "gong",
140
+ description: "Search Gong calls and generate account and deal insights.",
141
+ descriptionKey: "mcpIntegrations.catalog.gong.description",
142
+ useCase: "sales calls, transcripts, deal insights, account summaries",
143
+ useCaseKey: "mcpIntegrations.catalog.gong.useCase",
144
+ url: "https://mcp.gong.io/mcp",
145
+ authMode: "oauth",
146
+ connectionMode: "manual",
147
+ availability: "provider-setup",
148
+ verification: "restricted",
149
+ logoUrl: mcpIntegrationLogo("gong"),
150
+ supportsOrganizationScope: true,
151
+ docsUrl: "https://help.gong.io/docs/create-an-integration-to-connect-to-the-mcp-server",
152
+ setupNoteKey: "mcpIntegrations.catalog.gong.setupNote",
153
+ keywords: [
154
+ "sales calls",
155
+ "calls",
156
+ "transcripts",
157
+ "deals",
158
+ "accounts",
159
+ "revenue intelligence",
160
+ ],
161
+ },
110
162
  {
111
163
  id: "semgrep",
112
164
  name: "Semgrep",
@@ -121,6 +173,7 @@ export const DEFAULT_MCP_INTEGRATIONS = [
121
173
  availability: "ready",
122
174
  verification: "preflight-only",
123
175
  logoUrl: mcpIntegrationLogo("semgrep"),
176
+ supportsOrganizationScope: true,
124
177
  docsUrl: "https://github.com/semgrep/mcp#readme",
125
178
  keywords: ["security", "sast", "code scanning", "vulnerabilities"],
126
179
  },
@@ -141,6 +194,82 @@ export const DEFAULT_MCP_INTEGRATIONS = [
141
194
  docsUrl: "https://linear.app/docs/mcp",
142
195
  keywords: ["issues", "tickets", "planning", "project management"],
143
196
  },
197
+ {
198
+ id: "apollo",
199
+ name: "Apollo",
200
+ provider: "apollo",
201
+ description: "Search, enrich, and manage Apollo GTM data.",
202
+ descriptionKey: "mcpIntegrations.catalog.apollo.description",
203
+ useCase: "prospecting, enrichment, contacts, sequences, account research",
204
+ useCaseKey: "mcpIntegrations.catalog.apollo.useCase",
205
+ url: "https://mcp.apollo.io/mcp",
206
+ authMode: "oauth",
207
+ connectionMode: "oauth",
208
+ availability: "ready",
209
+ verification: "preflight-only",
210
+ logoUrl: mcpIntegrationLogo("apollo"),
211
+ docsUrl: "https://docs.apollo.io/docs/apollo-mcp",
212
+ setupNoteKey: "mcpIntegrations.catalog.apollo.setupNote",
213
+ keywords: [
214
+ "prospecting",
215
+ "enrichment",
216
+ "contacts",
217
+ "sequences",
218
+ "accounts",
219
+ "GTM",
220
+ ],
221
+ },
222
+ {
223
+ id: "common-room",
224
+ name: "Common Room",
225
+ provider: "common-room",
226
+ description: "Research buyer signals, contacts, and organizations.",
227
+ descriptionKey: "mcpIntegrations.catalog.commonRoom.description",
228
+ useCase: "buyer intelligence, product signals, intent, contact enrichment",
229
+ useCaseKey: "mcpIntegrations.catalog.commonRoom.useCase",
230
+ url: "https://mcp.commonroom.io/mcp",
231
+ authMode: "oauth",
232
+ connectionMode: "oauth",
233
+ availability: "ready",
234
+ verification: "preflight-only",
235
+ logoUrl: mcpIntegrationLogo("common-room"),
236
+ docsUrl: "https://www.commonroom.io/docs/using-common-room/mcp-server/",
237
+ setupNoteKey: "mcpIntegrations.catalog.commonRoom.setupNote",
238
+ keywords: [
239
+ "buyer intelligence",
240
+ "intent",
241
+ "signals",
242
+ "contacts",
243
+ "organizations",
244
+ "GTM",
245
+ ],
246
+ },
247
+ {
248
+ id: "exa",
249
+ name: "Exa",
250
+ provider: "exa",
251
+ description: "Search the web and fetch pages with Exa.",
252
+ descriptionKey: "mcpIntegrations.catalog.exa.description",
253
+ useCase: "web search, research, code search, page fetching",
254
+ useCaseKey: "mcpIntegrations.catalog.exa.useCase",
255
+ url: "https://mcp.exa.ai/mcp",
256
+ authMode: "none",
257
+ connectionMode: "direct",
258
+ availability: "ready",
259
+ verification: "preflight-only",
260
+ logoUrl: mcpIntegrationLogo("exa"),
261
+ supportsOrganizationScope: true,
262
+ docsUrl: "https://exa.ai/docs/reference/exa-mcp",
263
+ setupNoteKey: "mcpIntegrations.catalog.exa.setupNote",
264
+ keywords: [
265
+ "web search",
266
+ "research",
267
+ "code search",
268
+ "crawl",
269
+ "fetch",
270
+ "web",
271
+ ],
272
+ },
144
273
  {
145
274
  id: "atlassian",
146
275
  name: "Atlassian",
@@ -229,6 +358,59 @@ export const DEFAULT_MCP_INTEGRATIONS = [
229
358
  setupNoteKey: "mcpIntegrations.catalog.cloudflare.setupNote",
230
359
  keywords: ["cloud", "workers", "dns", "security", "observability"],
231
360
  },
361
+ {
362
+ id: "grafana",
363
+ name: "Grafana",
364
+ provider: "grafana",
365
+ description: "Query Grafana Cloud metrics, logs, and observability data.",
366
+ descriptionKey: "mcpIntegrations.catalog.grafana.description",
367
+ useCase: "observability, metrics, logs, traces, dashboards",
368
+ useCaseKey: "mcpIntegrations.catalog.grafana.useCase",
369
+ url: "https://mcp.grafana.com/mcp",
370
+ authMode: "oauth",
371
+ connectionMode: "oauth",
372
+ availability: "beta",
373
+ verification: "preflight-only",
374
+ logoUrl: mcpIntegrationLogo("grafana"),
375
+ docsUrl: "https://grafana.com/docs/grafana-cloud/ai-tools/mcp-servers/cloud-mcp/",
376
+ setupNoteKey: "mcpIntegrations.catalog.grafana.setupNote",
377
+ keywords: [
378
+ "observability",
379
+ "metrics",
380
+ "logs",
381
+ "traces",
382
+ "dashboards",
383
+ "Grafana Cloud",
384
+ ],
385
+ },
386
+ {
387
+ id: "google-workspace",
388
+ name: "Google Workspace",
389
+ provider: "google-workspace",
390
+ description: "Search Google Workspace data through its remote MCP server.",
391
+ descriptionKey: "mcpIntegrations.catalog.googleWorkspace.description",
392
+ useCase: "Workspace search across Gmail, Drive, Calendar, Chat, Docs, Sheets, Slides",
393
+ useCaseKey: "mcpIntegrations.catalog.googleWorkspace.useCase",
394
+ url: "https://workspacemcp.googleapis.com/mcp/v1",
395
+ authMode: "oauth",
396
+ connectionMode: "manual",
397
+ availability: "beta",
398
+ verification: "restricted",
399
+ logoUrl: mcpIntegrationLogo("google-workspace"),
400
+ docsUrl: "https://developers.google.com/workspace/guides/configure-mcp-servers",
401
+ setupNoteKey: "mcpIntegrations.catalog.googleWorkspace.setupNote",
402
+ brandAliases: ["Google", "Gmail", "Google Drive", "Google Calendar"],
403
+ keywords: [
404
+ "email",
405
+ "gmail",
406
+ "drive",
407
+ "calendar",
408
+ "chat",
409
+ "docs",
410
+ "sheets",
411
+ "slides",
412
+ ],
413
+ },
232
414
  {
233
415
  id: "gitlab",
234
416
  name: "GitLab",
@@ -374,10 +556,36 @@ export const DEFAULT_MCP_INTEGRATIONS = [
374
556
  availability: "provider-setup",
375
557
  verification: "restricted",
376
558
  logoUrl: mcpIntegrationLogo("hubspot"),
559
+ managedOAuth: true,
377
560
  docsUrl: "https://developers.hubspot.com/docs/apps/developer-platform/build-apps/integrate-with-the-remote-hubspot-mcp-server",
378
561
  setupNoteKey: "mcpIntegrations.catalog.hubspot.setupNote",
379
562
  keywords: ["crm", "contacts", "companies", "deals", "tickets"],
380
563
  },
564
+ {
565
+ id: "pylon",
566
+ name: "Pylon",
567
+ provider: "pylon",
568
+ description: "Search and update Pylon support data.",
569
+ descriptionKey: "mcpIntegrations.catalog.pylon.description",
570
+ useCase: "customer support, issues, accounts, contacts, conversations",
571
+ useCaseKey: "mcpIntegrations.catalog.pylon.useCase",
572
+ url: "https://mcp.usepylon.com/",
573
+ authMode: "oauth",
574
+ connectionMode: "oauth",
575
+ availability: "provider-setup",
576
+ verification: "restricted",
577
+ logoUrl: mcpIntegrationLogo("pylon"),
578
+ docsUrl: "https://www.usepylon.com/integrations/mcp",
579
+ setupNoteKey: "mcpIntegrations.catalog.pylon.setupNote",
580
+ keywords: [
581
+ "support",
582
+ "issues",
583
+ "accounts",
584
+ "contacts",
585
+ "conversations",
586
+ "customer support",
587
+ ],
588
+ },
381
589
  {
382
590
  id: "intercom",
383
591
  name: "Intercom",
@@ -468,6 +676,32 @@ export const DEFAULT_MCP_INTEGRATIONS = [
468
676
  setupNoteKey: "mcpIntegrations.catalog.box.setupNote",
469
677
  keywords: ["files", "folders", "documents", "enterprise content"],
470
678
  },
679
+ {
680
+ id: "builder-cms",
681
+ name: "Builder.io",
682
+ provider: "builder",
683
+ description: "Search Builder Publish and Hybrid Space content.",
684
+ descriptionKey: "mcpIntegrations.catalog.builder.description",
685
+ useCase: "content models, pages, entries, Publish and Hybrid Spaces",
686
+ useCaseKey: "mcpIntegrations.catalog.builder.useCase",
687
+ url: "https://mcp.builder.io/mcp/publish",
688
+ authMode: "oauth",
689
+ connectionMode: "oauth",
690
+ availability: "ready",
691
+ verification: "preflight-only",
692
+ logoUrl: mcpIntegrationLogo("builder-cms"),
693
+ docsUrl: "https://www.builder.io/c/docs/mcp-builder-server/",
694
+ setupNoteKey: "mcpIntegrations.catalog.builder.setupNote",
695
+ keywords: [
696
+ "Builder",
697
+ "content",
698
+ "CMS",
699
+ "pages",
700
+ "models",
701
+ "Publish",
702
+ "Hybrid",
703
+ ],
704
+ },
471
705
  {
472
706
  id: "netlify",
473
707
  name: "Netlify",
@@ -608,12 +842,22 @@ export function navigateToMcpOAuthStart(url) {
608
842
  navigate();
609
843
  }
610
844
  }
611
- export function resolveMcpIntegrationScope(defaultScope, hasOrg, canCreateOrgMcp) {
612
- return defaultScope === "org" && hasOrg && canCreateOrgMcp ? "org" : "user";
845
+ export function resolveMcpIntegrationScope(defaultScope, hasOrg, canCreateOrgMcp, supportsOrganizationScope = true) {
846
+ return defaultScope === "org" &&
847
+ hasOrg &&
848
+ canCreateOrgMcp &&
849
+ supportsOrganizationScope
850
+ ? "org"
851
+ : "user";
613
852
  }
614
853
  export function shouldOfferMcpOrganizationScope(hasOrg, canCreateOrgMcp) {
615
854
  return hasOrg && canCreateOrgMcp;
616
855
  }
856
+ export function shouldOfferMcpIntegrationOrganizationScope(integration, hasOrg, canCreateOrgMcp) {
857
+ return (shouldOfferMcpOrganizationScope(hasOrg, canCreateOrgMcp) &&
858
+ integration.supportsOrganizationScope === true &&
859
+ integration.managedOAuth !== true);
860
+ }
617
861
  export function filterMcpIntegrations(query, integrations = getDefaultMcpIntegrations()) {
618
862
  const needle = query.trim().toLowerCase();
619
863
  if (!needle)
@@ -635,8 +879,16 @@ export function filterMcpIntegrations(query, integrations = getDefaultMcpIntegra
635
879
  });
636
880
  }
637
881
  const MCP_LINK_HOSTS = {
882
+ amplitude: ["amplitude.com"],
883
+ apollo: ["apollo.io"],
884
+ "common-room": ["commonroom.io"],
638
885
  context7: ["context7.com"],
886
+ exa: ["exa.ai"],
639
887
  sentry: ["sentry.io", "sentry.dev"],
888
+ gong: ["gong.io"],
889
+ grafana: ["grafana.com", "grafana.net"],
890
+ "google-workspace": ["google.com", "googleapis.com"],
891
+ "builder-cms": ["builder.io"],
640
892
  notion: ["notion.so", "notion.site"],
641
893
  granola: ["granola.ai"],
642
894
  semgrep: ["semgrep.dev", "semgrep.com"],
@@ -654,6 +906,7 @@ const MCP_LINK_HOSTS = {
654
906
  asana: ["asana.com"],
655
907
  hubspot: ["hubspot.com"],
656
908
  intercom: ["intercom.com"],
909
+ pylon: ["usepylon.com", "pylon.com"],
657
910
  monday: ["monday.com"],
658
911
  webflow: ["webflow.com"],
659
912
  paypal: ["paypal.com"],