@agent-native/toolkit 0.210.1-nightly-20261020093350 → 0.210.1

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 (56) hide show
  1. package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
  2. package/dist/app/i18n/catalogs/ar-SA.js +13 -1
  3. package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
  4. package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
  5. package/dist/app/i18n/catalogs/de-DE.js +13 -1
  6. package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
  7. package/dist/app/i18n/catalogs/en-US.d.ts +13 -1
  8. package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
  9. package/dist/app/i18n/catalogs/en-US.js +13 -1
  10. package/dist/app/i18n/catalogs/en-US.js.map +1 -1
  11. package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
  12. package/dist/app/i18n/catalogs/es-ES.js +13 -1
  13. package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
  14. package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
  15. package/dist/app/i18n/catalogs/fr-FR.js +13 -1
  16. package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
  17. package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
  18. package/dist/app/i18n/catalogs/hi-IN.js +13 -1
  19. package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
  20. package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
  21. package/dist/app/i18n/catalogs/ja-JP.js +13 -1
  22. package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
  23. package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
  24. package/dist/app/i18n/catalogs/ko-KR.js +13 -1
  25. package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
  26. package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
  27. package/dist/app/i18n/catalogs/pt-BR.js +13 -1
  28. package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
  29. package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
  30. package/dist/app/i18n/catalogs/zh-CN.js +13 -1
  31. package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
  32. package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
  33. package/dist/app/i18n/catalogs/zh-TW.js +13 -1
  34. package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
  35. package/dist/app/integrations/IntegrationDetailPage.js +4 -0
  36. package/dist/app/integrations/IntegrationDetailPage.js.map +1 -1
  37. package/dist/app/resources/McpIntegrationDialog.d.ts.map +1 -1
  38. package/dist/app/resources/McpIntegrationDialog.js +106 -32
  39. package/dist/app/resources/McpIntegrationDialog.js.map +1 -1
  40. package/package.json +4 -4
  41. package/src/app/i18n/catalogs/ar-SA.ts +19 -1
  42. package/src/app/i18n/catalogs/de-DE.ts +22 -1
  43. package/src/app/i18n/catalogs/en-US.ts +19 -1
  44. package/src/app/i18n/catalogs/es-ES.ts +22 -1
  45. package/src/app/i18n/catalogs/fr-FR.ts +22 -1
  46. package/src/app/i18n/catalogs/hi-IN.ts +19 -1
  47. package/src/app/i18n/catalogs/ja-JP.ts +20 -1
  48. package/src/app/i18n/catalogs/ko-KR.ts +20 -1
  49. package/src/app/i18n/catalogs/pt-BR.ts +22 -1
  50. package/src/app/i18n/catalogs/zh-CN.ts +18 -1
  51. package/src/app/i18n/catalogs/zh-TW.ts +18 -1
  52. package/src/app/integrations/IntegrationDetailPage.spec.tsx +39 -23
  53. package/src/app/integrations/IntegrationDetailPage.tsx +4 -0
  54. package/src/app/resources/McpIntegrationDialog.hardening.spec.tsx +14 -0
  55. package/src/app/resources/McpIntegrationDialog.spec.tsx +135 -1
  56. package/src/app/resources/McpIntegrationDialog.tsx +257 -78
@@ -716,7 +716,28 @@ const messages: ToolkitAgentChatTranslation = {
716
716
  "mcpIntegrations.catalog.hubspot.useCase":
717
717
  "CRM, Kontakte, Unternehmen, Deals, Tickets, Kundenanalysen",
718
718
  "mcpIntegrations.catalog.hubspot.setupNote":
719
- 'Wenn eine vom Workspace verwaltete "HubSpot MCP Auth App" konfiguriert ist, kann jedes Mitglied ein persönliches HubSpot-Konto mit OAuth und PKCE verbinden. Andernfalls erstelle die App vor dem Verbinden in der HubSpot Developer Platform. Der bestehende HubSpot-OAuth-Connector bleibt für App-Aktionen verfügbar.',
719
+ "Jede Person verbindet ihr eigenes HubSpot-Konto, nachdem ein Workspace-Owner die HubSpot MCP Auth App eingerichtet hat.",
720
+ "mcpIntegrations.hubspot.setupTitle": "HubSpot MCP einrichten",
721
+ "mcpIntegrations.hubspot.dialogDescription":
722
+ "Ein Workspace-Owner richtet HubSpot MCP einmal ein. Danach verbindet jedes Mitglied das eigene Konto.",
723
+ "mcpIntegrations.hubspot.workspaceSetupStatus":
724
+ "Workspace-Einrichtung erforderlich",
725
+ "mcpIntegrations.hubspot.setupChecking":
726
+ "Workspace-Einrichtung wird geprüft…",
727
+ "mcpIntegrations.hubspot.setupUnavailable":
728
+ "Einrichtungsstatus nicht verfügbar",
729
+ "mcpIntegrations.hubspot.setupUnavailableDescription":
730
+ "Die OAuth-Einstellungen des Workspace konnten nicht geprüft werden. Bitte erneut versuchen.",
731
+ "mcpIntegrations.hubspot.ownerSetupDescription":
732
+ "Erstelle eine HubSpot MCP Auth App und füge ihre Client-ID und ihr Secret unter Agent-Native settings → API keys hinzu.",
733
+ "mcpIntegrations.hubspot.memberSetupDescription":
734
+ "Bitte einen Workspace-Owner, eine HubSpot MCP Auth App zu erstellen und Client-ID sowie Secret unter Agent-Native settings → API keys hinzuzufügen. Danach kannst du dein eigenes HubSpot-Konto verbinden.",
735
+ "mcpIntegrations.hubspot.noWorkspaceDescription":
736
+ "Tritt einem Workspace bei, bevor du HubSpot MCP verbindest.",
737
+ "mcpIntegrations.hubspot.configureWorkspaceCredentials":
738
+ "Workspace-Zugangsdaten hinzufügen",
739
+ "mcpIntegrations.hubspot.refreshSetupStatus": "Erneut prüfen",
740
+ "mcpIntegrations.hubspot.retrySetupStatus": "Erneut versuchen",
720
741
  "mcpIntegrations.catalog.pylon.description":
721
742
  "Pylon-Supportdaten durchsuchen und aktualisieren.",
722
743
  "mcpIntegrations.catalog.pylon.useCase":
@@ -998,7 +998,25 @@ const messages = {
998
998
  "mcpIntegrations.catalog.hubspot.useCase":
999
999
  "CRM, contacts, companies, deals, tickets, customer analytics",
1000
1000
  "mcpIntegrations.catalog.hubspot.setupNote":
1001
- "When a workspace-managed HubSpot MCP Auth App is configured, any member can connect a personal HubSpot account with OAuth and PKCE. Otherwise, create the app in the HubSpot Developer Platform before connecting; the existing HubSpot OAuth connector remains available to app actions.",
1001
+ "Each person connects their own HubSpot account after a workspace owner configures the HubSpot MCP Auth App.",
1002
+ "mcpIntegrations.hubspot.setupTitle": "Set up HubSpot MCP",
1003
+ "mcpIntegrations.hubspot.dialogDescription":
1004
+ "A workspace owner configures HubSpot MCP once. Each member then connects their own account.",
1005
+ "mcpIntegrations.hubspot.workspaceSetupStatus": "Workspace setup required",
1006
+ "mcpIntegrations.hubspot.setupChecking": "Checking workspace setup…",
1007
+ "mcpIntegrations.hubspot.setupUnavailable": "Setup status unavailable",
1008
+ "mcpIntegrations.hubspot.setupUnavailableDescription":
1009
+ "Couldn't check the workspace OAuth settings. Try again.",
1010
+ "mcpIntegrations.hubspot.ownerSetupDescription":
1011
+ "Create a HubSpot MCP Auth App, then add its client ID and secret in Agent-Native settings → API keys.",
1012
+ "mcpIntegrations.hubspot.memberSetupDescription":
1013
+ "Ask a workspace owner to create a HubSpot MCP Auth App and add its client ID and secret in Agent-Native settings → API keys. You can connect your own HubSpot account after setup.",
1014
+ "mcpIntegrations.hubspot.noWorkspaceDescription":
1015
+ "Join a workspace before connecting HubSpot MCP.",
1016
+ "mcpIntegrations.hubspot.configureWorkspaceCredentials":
1017
+ "Add workspace credentials",
1018
+ "mcpIntegrations.hubspot.refreshSetupStatus": "Check again",
1019
+ "mcpIntegrations.hubspot.retrySetupStatus": "Retry",
1002
1020
  "mcpIntegrations.catalog.pylon.description":
1003
1021
  "Search and update Pylon support data.",
1004
1022
  "mcpIntegrations.catalog.pylon.useCase":
@@ -714,7 +714,28 @@ const messages: ToolkitAgentChatTranslation = {
714
714
  "mcpIntegrations.catalog.hubspot.useCase":
715
715
  "CRM, contactos, empresas, negocios, tickets, analítica de clientes",
716
716
  "mcpIntegrations.catalog.hubspot.setupNote":
717
- "Si hay una HubSpot MCP Auth App gestionada por el espacio de trabajo, cualquier miembro puede conectar una cuenta personal de HubSpot con OAuth y PKCE. Si no, crea la app en HubSpot Developer Platform antes de conectar; el conector OAuth de HubSpot existente sigue disponible para las acciones de la app.",
717
+ "Cada persona conecta su propia cuenta de HubSpot después de que un propietario configure la HubSpot MCP Auth App.",
718
+ "mcpIntegrations.hubspot.setupTitle": "Configurar HubSpot MCP",
719
+ "mcpIntegrations.hubspot.dialogDescription":
720
+ "Un propietario configura HubSpot MCP una vez. Después, cada miembro conecta su propia cuenta.",
721
+ "mcpIntegrations.hubspot.workspaceSetupStatus":
722
+ "Se requiere configuración del espacio de trabajo",
723
+ "mcpIntegrations.hubspot.setupChecking":
724
+ "Comprobando la configuración del espacio de trabajo…",
725
+ "mcpIntegrations.hubspot.setupUnavailable":
726
+ "Estado de configuración no disponible",
727
+ "mcpIntegrations.hubspot.setupUnavailableDescription":
728
+ "No se pudo comprobar la configuración OAuth del espacio de trabajo. Inténtalo de nuevo.",
729
+ "mcpIntegrations.hubspot.ownerSetupDescription":
730
+ "Crea una HubSpot MCP Auth App y añade su ID y secreto de cliente en Agent-Native settings → API keys.",
731
+ "mcpIntegrations.hubspot.memberSetupDescription":
732
+ "Pide a un propietario que cree una HubSpot MCP Auth App y añada su ID y secreto de cliente en Agent-Native settings → API keys. Después podrás conectar tu propia cuenta de HubSpot.",
733
+ "mcpIntegrations.hubspot.noWorkspaceDescription":
734
+ "Únete a un espacio de trabajo antes de conectar HubSpot MCP.",
735
+ "mcpIntegrations.hubspot.configureWorkspaceCredentials":
736
+ "Añadir credenciales del espacio de trabajo",
737
+ "mcpIntegrations.hubspot.refreshSetupStatus": "Volver a comprobar",
738
+ "mcpIntegrations.hubspot.retrySetupStatus": "Reintentar",
718
739
  "mcpIntegrations.catalog.pylon.description":
719
740
  "Busca y actualiza datos de soporte de Pylon.",
720
741
  "mcpIntegrations.catalog.pylon.useCase":
@@ -720,7 +720,28 @@ const messages: ToolkitAgentChatTranslation = {
720
720
  "mcpIntegrations.catalog.hubspot.useCase":
721
721
  "CRM, contacts, entreprises, transactions, tickets, analytique client",
722
722
  "mcpIntegrations.catalog.hubspot.setupNote":
723
- "Lorsqu’une HubSpot MCP Auth App gérée par l’espace de travail est configurée, tout membre peut connecter un compte HubSpot personnel avec OAuth et PKCE. Sinon, créez l’app dans HubSpot Developer Platform avant de vous connecter. Le connecteur OAuth HubSpot existant reste disponible pour les actions de l’app.",
723
+ "Chaque personne connecte son propre compte HubSpot après la configuration de la HubSpot MCP Auth App par un propriétaire de l’espace de travail.",
724
+ "mcpIntegrations.hubspot.setupTitle": "Configurer HubSpot MCP",
725
+ "mcpIntegrations.hubspot.dialogDescription":
726
+ "Un propriétaire configure HubSpot MCP une seule fois. Chaque membre connecte ensuite son propre compte.",
727
+ "mcpIntegrations.hubspot.workspaceSetupStatus":
728
+ "Configuration de l’espace de travail requise",
729
+ "mcpIntegrations.hubspot.setupChecking":
730
+ "Vérification de la configuration de l’espace de travail…",
731
+ "mcpIntegrations.hubspot.setupUnavailable":
732
+ "État de la configuration indisponible",
733
+ "mcpIntegrations.hubspot.setupUnavailableDescription":
734
+ "Impossible de vérifier les paramètres OAuth de l’espace de travail. Réessayez.",
735
+ "mcpIntegrations.hubspot.ownerSetupDescription":
736
+ "Créez une HubSpot MCP Auth App, puis ajoutez son ID et son secret client dans Agent-Native settings → API keys.",
737
+ "mcpIntegrations.hubspot.memberSetupDescription":
738
+ "Demandez à un propriétaire de créer une HubSpot MCP Auth App et d’ajouter son ID et son secret client dans Agent-Native settings → API keys. Vous pourrez ensuite connecter votre propre compte HubSpot.",
739
+ "mcpIntegrations.hubspot.noWorkspaceDescription":
740
+ "Rejoignez un espace de travail avant de connecter HubSpot MCP.",
741
+ "mcpIntegrations.hubspot.configureWorkspaceCredentials":
742
+ "Ajouter les identifiants de l’espace de travail",
743
+ "mcpIntegrations.hubspot.refreshSetupStatus": "Vérifier à nouveau",
744
+ "mcpIntegrations.hubspot.retrySetupStatus": "Réessayer",
724
745
  "mcpIntegrations.catalog.pylon.description":
725
746
  "Recherchez et mettez à jour les données de support Pylon.",
726
747
  "mcpIntegrations.catalog.pylon.useCase":
@@ -983,7 +983,25 @@ const messages: ToolkitAgentChatTranslation = {
983
983
  "mcpIntegrations.catalog.hubspot.useCase":
984
984
  "CRM, संपर्क, कंपनियाँ, डील, टिकट, ग्राहक एनालिटिक्स",
985
985
  "mcpIntegrations.catalog.hubspot.setupNote":
986
- "जब वर्कस्पेस द्वारा प्रबंधित HubSpot MCP Auth App कॉन्फ़िगर होता है, तो कोई भी सदस्य OAuth और PKCE के साथ अपना व्यक्तिगत HubSpot खाता कनेक्ट कर सकता है। नहीं तो, कनेक्ट करने से पहले HubSpot Developer Platform में ऐप बनाएँ। मौजूदा HubSpot OAuth कनेक्टर ऐप एक्शन के लिए उपलब्ध रहता है।",
986
+ "वर्कस्पेस का मालिक HubSpot MCP Auth App सेट अप करने के बाद हर व्यक्ति अपना HubSpot खाता जोड़ता है।",
987
+ "mcpIntegrations.hubspot.setupTitle": "HubSpot MCP सेट अप करें",
988
+ "mcpIntegrations.hubspot.dialogDescription":
989
+ "वर्कस्पेस का मालिक HubSpot MCP को एक बार सेट अप करता है। इसके बाद हर सदस्य अपना खाता जोड़ता है।",
990
+ "mcpIntegrations.hubspot.workspaceSetupStatus": "वर्कस्पेस सेटअप ज़रूरी है",
991
+ "mcpIntegrations.hubspot.setupChecking": "वर्कस्पेस सेटअप जाँचा जा रहा है…",
992
+ "mcpIntegrations.hubspot.setupUnavailable": "सेटअप की स्थिति उपलब्ध नहीं है",
993
+ "mcpIntegrations.hubspot.setupUnavailableDescription":
994
+ "वर्कस्पेस OAuth सेटिंग जाँची नहीं जा सकी। फिर से कोशिश करें।",
995
+ "mcpIntegrations.hubspot.ownerSetupDescription":
996
+ "HubSpot MCP Auth App बनाएँ, फिर Agent-Native settings → API keys में उसका client ID और secret जोड़ें।",
997
+ "mcpIntegrations.hubspot.memberSetupDescription":
998
+ "वर्कस्पेस के मालिक से HubSpot MCP Auth App बनाने और Agent-Native settings → API keys में उसका client ID और secret जोड़ने को कहें। सेटअप के बाद आप अपना HubSpot खाता जोड़ सकते हैं।",
999
+ "mcpIntegrations.hubspot.noWorkspaceDescription":
1000
+ "HubSpot MCP जोड़ने से पहले किसी वर्कस्पेस से जुड़ें।",
1001
+ "mcpIntegrations.hubspot.configureWorkspaceCredentials":
1002
+ "वर्कस्पेस credentials जोड़ें",
1003
+ "mcpIntegrations.hubspot.refreshSetupStatus": "फिर से जाँचें",
1004
+ "mcpIntegrations.hubspot.retrySetupStatus": "फिर कोशिश करें",
987
1005
  "mcpIntegrations.catalog.pylon.description":
988
1006
  "Pylon सपोर्ट डेटा खोजें और अपडेट करें।",
989
1007
  "mcpIntegrations.catalog.pylon.useCase":
@@ -1017,7 +1017,26 @@ const messages: ToolkitAgentChatTranslation = {
1017
1017
  "mcpIntegrations.catalog.hubspot.useCase":
1018
1018
  "CRM、連絡先、会社、取引、チケット、顧客分析",
1019
1019
  "mcpIntegrations.catalog.hubspot.setupNote":
1020
- "ワークスペースで管理する HubSpot MCP Auth App が設定されている場合、どのメンバーも OAuth と PKCE で個人の HubSpot アカウントを接続できます。設定されていない場合は、接続する前に HubSpot Developer Platform でアプリを作成してください。既存の HubSpot OAuth コネクターは引き続きアプリのアクションで利用できます。",
1020
+ "ワークスペースのオーナーが HubSpot MCP Auth App を設定すると、各メンバーが自分の HubSpot アカウントを接続できます。",
1021
+ "mcpIntegrations.hubspot.setupTitle": "HubSpot MCP を設定",
1022
+ "mcpIntegrations.hubspot.dialogDescription":
1023
+ "ワークスペースのオーナーが HubSpot MCP を一度設定します。その後、各メンバーが自分のアカウントを接続します。",
1024
+ "mcpIntegrations.hubspot.workspaceSetupStatus":
1025
+ "ワークスペースの設定が必要です",
1026
+ "mcpIntegrations.hubspot.setupChecking": "ワークスペースの設定を確認中…",
1027
+ "mcpIntegrations.hubspot.setupUnavailable": "設定状況を確認できません",
1028
+ "mcpIntegrations.hubspot.setupUnavailableDescription":
1029
+ "ワークスペースの OAuth 設定を確認できませんでした。もう一度お試しください。",
1030
+ "mcpIntegrations.hubspot.ownerSetupDescription":
1031
+ "HubSpot MCP Auth App を作成し、Agent-Native settings → API keys にクライアント ID とシークレットを追加してください。",
1032
+ "mcpIntegrations.hubspot.memberSetupDescription":
1033
+ "ワークスペースのオーナーに HubSpot MCP Auth App の作成と、Agent-Native settings → API keys へのクライアント ID とシークレットの追加を依頼してください。設定後、自分の HubSpot アカウントを接続できます。",
1034
+ "mcpIntegrations.hubspot.noWorkspaceDescription":
1035
+ "HubSpot MCP を接続する前にワークスペースに参加してください。",
1036
+ "mcpIntegrations.hubspot.configureWorkspaceCredentials":
1037
+ "ワークスペースの認証情報を追加",
1038
+ "mcpIntegrations.hubspot.refreshSetupStatus": "再確認",
1039
+ "mcpIntegrations.hubspot.retrySetupStatus": "再試行",
1021
1040
  "mcpIntegrations.catalog.pylon.description":
1022
1041
  "Pylon のサポートデータを検索、更新します。",
1023
1042
  "mcpIntegrations.catalog.pylon.useCase":
@@ -993,7 +993,26 @@ const messages: ToolkitAgentChatTranslation = {
993
993
  "mcpIntegrations.catalog.hubspot.useCase":
994
994
  "CRM, 연락처, 회사, 거래, 티켓, 고객 분석",
995
995
  "mcpIntegrations.catalog.hubspot.setupNote":
996
- "워크스페이스에서 관리하는 HubSpot MCP Auth App이 구성되어 있으면 모든 멤버가 OAuth와 PKCE로 개인 HubSpot 계정을 연결할 수 있습니다. 그렇지 않으면 연결하기 전에 HubSpot Developer Platform에서 앱을 만드세요. 기존 HubSpot OAuth 커넥터는 앱 작업에서 계속 사용할 수 있습니다.",
996
+ "워크스페이스 소유자가 HubSpot MCP Auth App을 설정한 뒤 각 사용자가 자신의 HubSpot 계정을 연결합니다.",
997
+ "mcpIntegrations.hubspot.setupTitle": "HubSpot MCP 설정",
998
+ "mcpIntegrations.hubspot.dialogDescription":
999
+ "워크스페이스 소유자가 HubSpot MCP를 한 번 설정합니다. 이후 각 구성원이 자신의 계정을 연결합니다.",
1000
+ "mcpIntegrations.hubspot.workspaceSetupStatus":
1001
+ "워크스페이스 설정이 필요합니다",
1002
+ "mcpIntegrations.hubspot.setupChecking": "워크스페이스 설정 확인 중…",
1003
+ "mcpIntegrations.hubspot.setupUnavailable": "설정 상태를 확인할 수 없습니다",
1004
+ "mcpIntegrations.hubspot.setupUnavailableDescription":
1005
+ "워크스페이스 OAuth 설정을 확인하지 못했습니다. 다시 시도하세요.",
1006
+ "mcpIntegrations.hubspot.ownerSetupDescription":
1007
+ "HubSpot MCP Auth App을 만든 다음 Agent-Native settings → API keys에서 클라이언트 ID와 시크릿을 추가하세요.",
1008
+ "mcpIntegrations.hubspot.memberSetupDescription":
1009
+ "워크스페이스 소유자에게 HubSpot MCP Auth App을 만들고 Agent-Native settings → API keys에 클라이언트 ID와 시크릿을 추가해 달라고 요청하세요. 설정 후 본인의 HubSpot 계정을 연결할 수 있습니다.",
1010
+ "mcpIntegrations.hubspot.noWorkspaceDescription":
1011
+ "HubSpot MCP를 연결하려면 먼저 워크스페이스에 참여하세요.",
1012
+ "mcpIntegrations.hubspot.configureWorkspaceCredentials":
1013
+ "워크스페이스 자격 증명 추가",
1014
+ "mcpIntegrations.hubspot.refreshSetupStatus": "다시 확인",
1015
+ "mcpIntegrations.hubspot.retrySetupStatus": "다시 시도",
997
1016
  "mcpIntegrations.catalog.pylon.description":
998
1017
  "Pylon 지원 데이터를 검색하고 업데이트합니다.",
999
1018
  "mcpIntegrations.catalog.pylon.useCase":
@@ -708,7 +708,28 @@ const messages: ToolkitAgentChatTranslation = {
708
708
  "mcpIntegrations.catalog.hubspot.useCase":
709
709
  "CRM, contatos, empresas, negócios, tickets, análise de clientes",
710
710
  "mcpIntegrations.catalog.hubspot.setupNote":
711
- "Quando um HubSpot MCP Auth App gerenciado pelo espaço de trabalho estiver configurado, qualquer membro pode conectar uma conta pessoal do HubSpot com OAuth e PKCE. Caso contrário, crie o app no HubSpot Developer Platform antes de conectar. O conector OAuth existente do HubSpot continua disponível para as ações do app.",
711
+ "Cada pessoa conecta sua própria conta do HubSpot depois que um proprietário configura o HubSpot MCP Auth App.",
712
+ "mcpIntegrations.hubspot.setupTitle": "Configurar o HubSpot MCP",
713
+ "mcpIntegrations.hubspot.dialogDescription":
714
+ "Um proprietário configura o HubSpot MCP uma vez. Depois, cada membro conecta a própria conta.",
715
+ "mcpIntegrations.hubspot.workspaceSetupStatus":
716
+ "É necessário configurar o espaço de trabalho",
717
+ "mcpIntegrations.hubspot.setupChecking":
718
+ "Verificando a configuração do espaço de trabalho…",
719
+ "mcpIntegrations.hubspot.setupUnavailable":
720
+ "Status da configuração indisponível",
721
+ "mcpIntegrations.hubspot.setupUnavailableDescription":
722
+ "Não foi possível verificar as configurações OAuth do espaço de trabalho. Tente novamente.",
723
+ "mcpIntegrations.hubspot.ownerSetupDescription":
724
+ "Crie um HubSpot MCP Auth App e adicione o ID e o segredo do cliente em Agent-Native settings → API keys.",
725
+ "mcpIntegrations.hubspot.memberSetupDescription":
726
+ "Peça a um proprietário para criar um HubSpot MCP Auth App e adicionar o ID e o segredo do cliente em Agent-Native settings → API keys. Depois da configuração, você poderá conectar sua própria conta do HubSpot.",
727
+ "mcpIntegrations.hubspot.noWorkspaceDescription":
728
+ "Entre em um espaço de trabalho antes de conectar o HubSpot MCP.",
729
+ "mcpIntegrations.hubspot.configureWorkspaceCredentials":
730
+ "Adicionar credenciais do espaço de trabalho",
731
+ "mcpIntegrations.hubspot.refreshSetupStatus": "Verificar novamente",
732
+ "mcpIntegrations.hubspot.retrySetupStatus": "Tentar novamente",
712
733
  "mcpIntegrations.catalog.pylon.description":
713
734
  "Pesquise e atualize dados de suporte do Pylon.",
714
735
  "mcpIntegrations.catalog.pylon.useCase":
@@ -938,7 +938,24 @@ const messages: ToolkitAgentChatTranslation = {
938
938
  "mcpIntegrations.catalog.hubspot.useCase":
939
939
  "CRM、联系人、公司、交易、工单、客户分析",
940
940
  "mcpIntegrations.catalog.hubspot.setupNote":
941
- "如果已配置由工作区管理的 HubSpot MCP Auth App,任何成员都可以通过 OAuth 和 PKCE 连接个人 HubSpot 账号。否则,请在连接前于 HubSpot Developer Platform 中创建该应用;现有的 HubSpot OAuth 连接器仍可供应用操作使用。",
941
+ "工作区所有者配置 HubSpot MCP Auth App 后,每位成员都可以连接自己的 HubSpot 账户。",
942
+ "mcpIntegrations.hubspot.setupTitle": "设置 HubSpot MCP",
943
+ "mcpIntegrations.hubspot.dialogDescription":
944
+ "工作区所有者只需配置一次 HubSpot MCP。之后每位成员都可以连接自己的账户。",
945
+ "mcpIntegrations.hubspot.workspaceSetupStatus": "需要配置工作区",
946
+ "mcpIntegrations.hubspot.setupChecking": "正在检查工作区配置…",
947
+ "mcpIntegrations.hubspot.setupUnavailable": "无法获取配置状态",
948
+ "mcpIntegrations.hubspot.setupUnavailableDescription":
949
+ "无法检查工作区 OAuth 设置,请重试。",
950
+ "mcpIntegrations.hubspot.ownerSetupDescription":
951
+ "创建 HubSpot MCP Auth App,然后在 Agent-Native settings → API keys 中添加客户端 ID 和密钥。",
952
+ "mcpIntegrations.hubspot.memberSetupDescription":
953
+ "请工作区所有者创建 HubSpot MCP Auth App,并在 Agent-Native settings → API keys 中添加客户端 ID 和密钥。配置完成后,你可以连接自己的 HubSpot 账户。",
954
+ "mcpIntegrations.hubspot.noWorkspaceDescription":
955
+ "请先加入工作区,再连接 HubSpot MCP。",
956
+ "mcpIntegrations.hubspot.configureWorkspaceCredentials": "添加工作区凭据",
957
+ "mcpIntegrations.hubspot.refreshSetupStatus": "重新检查",
958
+ "mcpIntegrations.hubspot.retrySetupStatus": "重试",
942
959
  "mcpIntegrations.catalog.pylon.description": "搜索和更新 Pylon 支持数据。",
943
960
  "mcpIntegrations.catalog.pylon.useCase": "客户支持、问题、客户、联系人、对话",
944
961
  "mcpIntegrations.catalog.pylon.setupNote":
@@ -939,7 +939,24 @@ const messages: ToolkitAgentChatTranslation = {
939
939
  "mcpIntegrations.catalog.hubspot.useCase":
940
940
  "CRM、聯絡人、公司、交易、工單、客戶分析",
941
941
  "mcpIntegrations.catalog.hubspot.setupNote":
942
- "設定由工作區管理的 HubSpot MCP Auth App 後,任何成員都可以使用 OAuth 和 PKCE 連線個人 HubSpot 帳戶。否則,請在連線前於 HubSpot Developer Platform 建立應用程式;現有的 HubSpot OAuth 連接器仍可供應用程式操作使用。",
942
+ "工作區擁有者設定 HubSpot MCP Auth App 後,每位成員都可以連結自己的 HubSpot 帳戶。",
943
+ "mcpIntegrations.hubspot.setupTitle": "設定 HubSpot MCP",
944
+ "mcpIntegrations.hubspot.dialogDescription":
945
+ "工作區擁有者只需設定一次 HubSpot MCP。之後每位成員都可以連結自己的帳戶。",
946
+ "mcpIntegrations.hubspot.workspaceSetupStatus": "需要設定工作區",
947
+ "mcpIntegrations.hubspot.setupChecking": "正在檢查工作區設定…",
948
+ "mcpIntegrations.hubspot.setupUnavailable": "無法取得設定狀態",
949
+ "mcpIntegrations.hubspot.setupUnavailableDescription":
950
+ "無法檢查工作區 OAuth 設定,請重試。",
951
+ "mcpIntegrations.hubspot.ownerSetupDescription":
952
+ "建立 HubSpot MCP Auth App,然後在 Agent-Native settings → API keys 中新增用戶端 ID 和密鑰。",
953
+ "mcpIntegrations.hubspot.memberSetupDescription":
954
+ "請工作區擁有者建立 HubSpot MCP Auth App,並在 Agent-Native settings → API keys 中新增用戶端 ID 和密鑰。設定完成後,你可以連結自己的 HubSpot 帳戶。",
955
+ "mcpIntegrations.hubspot.noWorkspaceDescription":
956
+ "請先加入工作區,再連結 HubSpot MCP。",
957
+ "mcpIntegrations.hubspot.configureWorkspaceCredentials": "新增工作區憑證",
958
+ "mcpIntegrations.hubspot.refreshSetupStatus": "重新檢查",
959
+ "mcpIntegrations.hubspot.retrySetupStatus": "重試",
943
960
  "mcpIntegrations.catalog.pylon.description": "搜尋及更新 Pylon 支援資料。",
944
961
  "mcpIntegrations.catalog.pylon.useCase": "客戶支援、議題、客戶、聯絡人、對話",
945
962
  "mcpIntegrations.catalog.pylon.setupNote":
@@ -386,29 +386,45 @@ describe("IntegrationDetailPage", () => {
386
386
  );
387
387
  });
388
388
 
389
- it.each(["hubspot", "canva"])(
390
- "preserves the supported personal OAuth flow for %s members",
391
- async (id) => {
392
- servers([], "member");
393
- await render(id, MEMBER);
394
- const { action } = await renderHeader();
395
- expect(action?.textContent).toBe("Connect");
396
- expect(container.textContent).not.toContain(
397
- "An admin needs to set this up",
398
- );
399
- await act(async () => action?.click());
400
- expect(oauth.navigateToMcpOAuthStart).toHaveBeenCalledTimes(1);
401
- const url = new URL(
402
- oauth.navigateToMcpOAuthStart.mock.calls[0]![0] as string,
403
- "http://localhost",
404
- );
405
- expect(url.searchParams.get("scope")).toBe("user");
406
- expect(url.searchParams.get("url")).toBe(
407
- `https://mcp.${id}.com${id === "canva" ? "/mcp" : ""}`,
408
- );
409
- expect(createServer).not.toHaveBeenCalled();
410
- },
411
- );
389
+ it("opens the readiness-gated setup dialog for HubSpot OAuth", async () => {
390
+ servers([], "member");
391
+ await render("hubspot", MEMBER);
392
+ const { action } = await renderHeader();
393
+ expect(action?.textContent).toBe("Connect");
394
+
395
+ await act(async () => action?.click());
396
+
397
+ expect(oauth.navigateToMcpOAuthStart).not.toHaveBeenCalled();
398
+ const props = dialogMocks.McpIntegrationDialog.mock.calls.at(-1)?.[0] as {
399
+ open: boolean;
400
+ initialIntegrationId: string | null;
401
+ };
402
+ expect(props).toMatchObject({
403
+ open: true,
404
+ initialIntegrationId: "hubspot",
405
+ });
406
+ expect(createServer).not.toHaveBeenCalled();
407
+ });
408
+
409
+ it("preserves the supported personal OAuth flow for Canva members", async () => {
410
+ const id = "canva";
411
+ servers([], "member");
412
+ await render(id, MEMBER);
413
+ const { action } = await renderHeader();
414
+ expect(action?.textContent).toBe("Connect");
415
+ expect(container.textContent).not.toContain(
416
+ "An admin needs to set this up",
417
+ );
418
+ await act(async () => action?.click());
419
+ expect(oauth.navigateToMcpOAuthStart).toHaveBeenCalledTimes(1);
420
+ const url = new URL(
421
+ oauth.navigateToMcpOAuthStart.mock.calls[0]![0] as string,
422
+ "http://localhost",
423
+ );
424
+ expect(url.searchParams.get("scope")).toBe("user");
425
+ expect(url.searchParams.get("url")).toBe("https://mcp.canva.com/mcp");
426
+ expect(createServer).not.toHaveBeenCalled();
427
+ });
412
428
 
413
429
  it("locks sharing for members", async () => {
414
430
  servers([], "member");
@@ -460,6 +460,10 @@ function IntegrationDetail({
460
460
 
461
461
  const connect = async () => {
462
462
  if (unavailable || signIn === "token") return;
463
+ if (integration.id === "hubspot") {
464
+ setSetupOpen(true);
465
+ return;
466
+ }
463
467
  // No preset URL (Sigma's is per account): the connect dialog asks for it.
464
468
  if (!integration.url.trim()) {
465
469
  setSetupOpen(true);
@@ -15,8 +15,18 @@ const mocks = vi.hoisted(() => ({
15
15
  settings: vi.fn(),
16
16
  create: vi.fn(),
17
17
  close: vi.fn(),
18
+ hubspotOAuthReadinessQuery: {
19
+ data: { hubspot: "configured" as "configured" | "missing" },
20
+ isSuccess: true,
21
+ isError: false,
22
+ isFetching: false,
23
+ refetch: vi.fn().mockResolvedValue(undefined),
24
+ },
18
25
  resolvePath: vi.fn((path: string) => path),
19
26
  }));
27
+ vi.mock("@agent-native/core/client/hooks", () => ({
28
+ useActionQuery: () => mocks.hubspotOAuthReadinessQuery,
29
+ }));
20
30
  vi.mock("@agent-native/core/client/api-path", () => ({
21
31
  agentNativePath: mocks.resolvePath,
22
32
  }));
@@ -56,6 +66,10 @@ describe("legacy integration setup routing", () => {
56
66
  beforeEach(() => {
57
67
  vi.clearAllMocks();
58
68
  mocks.resolvePath.mockImplementation((path) => path);
69
+ mocks.hubspotOAuthReadinessQuery.data = { hubspot: "configured" };
70
+ mocks.hubspotOAuthReadinessQuery.isSuccess = true;
71
+ mocks.hubspotOAuthReadinessQuery.isError = false;
72
+ mocks.hubspotOAuthReadinessQuery.isFetching = false;
59
73
  vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
60
74
  vi.stubGlobal("__AGENT_NATIVE_CONFIG__", { template: "design" });
61
75
  container = document.createElement("div");
@@ -11,6 +11,14 @@ import { McpIntegrationDialog } from "./McpIntegrationDialog.js";
11
11
  const mocks = vi.hoisted(() => ({
12
12
  navigateToMcpOAuthStart: vi.fn(),
13
13
  customIntegrationEnabled: vi.fn(() => false),
14
+ settings: vi.fn(),
15
+ hubspotOAuthReadinessQuery: {
16
+ data: { hubspot: "configured" as "configured" | "missing" },
17
+ isSuccess: true,
18
+ isError: false,
19
+ isFetching: false,
20
+ refetch: vi.fn().mockResolvedValue(undefined),
21
+ },
14
22
  mcpServersQuery: {
15
23
  data: {
16
24
  user: [],
@@ -26,6 +34,15 @@ const mocks = vi.hoisted(() => ({
26
34
  },
27
35
  }));
28
36
 
37
+ vi.mock("@agent-native/core/client/hooks", () => ({
38
+ useActionQuery: () => mocks.hubspotOAuthReadinessQuery,
39
+ }));
40
+
41
+ vi.mock("../shared/index.js", async (original) => ({
42
+ ...(await original<typeof import("../shared/index.js")>()),
43
+ openAgentSettings: mocks.settings,
44
+ }));
45
+
29
46
  vi.mock(
30
47
  "@agent-native/core/client/resources/mcp-integration-catalog",
31
48
  async (importOriginal) => ({
@@ -55,6 +72,14 @@ describe("McpIntegrationDialog", () => {
55
72
  vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
56
73
  mocks.navigateToMcpOAuthStart.mockReset().mockReturnValue(true);
57
74
  mocks.customIntegrationEnabled.mockReset().mockReturnValue(false);
75
+ mocks.settings.mockReset();
76
+ mocks.hubspotOAuthReadinessQuery.data = { hubspot: "configured" };
77
+ mocks.hubspotOAuthReadinessQuery.isSuccess = true;
78
+ mocks.hubspotOAuthReadinessQuery.isError = false;
79
+ mocks.hubspotOAuthReadinessQuery.isFetching = false;
80
+ mocks.hubspotOAuthReadinessQuery.refetch
81
+ .mockReset()
82
+ .mockResolvedValue(undefined);
58
83
  mocks.mcpServersQuery.isSuccess = true;
59
84
  mocks.mcpServersQuery.isError = false;
60
85
  mocks.mcpServersQuery.error = null;
@@ -1201,7 +1226,7 @@ describe("McpIntegrationDialog", () => {
1201
1226
  expect(document.body.textContent).toContain("Provider setup required");
1202
1227
  });
1203
1228
 
1204
- it("offers personal OAuth for a managed setup-gated integration", () => {
1229
+ it("offers personal HubSpot OAuth when the workspace client is configured", () => {
1205
1230
  const hubspot = DEFAULT_MCP_INTEGRATIONS.find(
1206
1231
  (integration) => integration.id === "hubspot",
1207
1232
  )!;
@@ -1238,4 +1263,113 @@ describe("McpIntegrationDialog", () => {
1238
1263
  new URL(url, "https://analytics.example.com").searchParams.get("scope"),
1239
1264
  ).toBe("user");
1240
1265
  });
1266
+
1267
+ it("shows workspace setup instead of starting HubSpot OAuth when credentials are missing", () => {
1268
+ mocks.hubspotOAuthReadinessQuery.data = { hubspot: "missing" };
1269
+
1270
+ const hubspot = DEFAULT_MCP_INTEGRATIONS.find(
1271
+ (integration) => integration.id === "hubspot",
1272
+ )!;
1273
+ act(() => {
1274
+ root.render(
1275
+ <TooltipProvider>
1276
+ <McpIntegrationDialog
1277
+ open
1278
+ onOpenChange={() => {}}
1279
+ initialIntegrationId="hubspot"
1280
+ defaultScope="org"
1281
+ canCreateOrgMcp
1282
+ hasOrg
1283
+ onCreateMcpServer={vi.fn()}
1284
+ integrations={[hubspot]}
1285
+ />
1286
+ </TooltipProvider>,
1287
+ );
1288
+ });
1289
+
1290
+ expect(document.body.textContent).toContain("workspace owner");
1291
+ expect(document.body.textContent).toContain("HubSpot MCP Auth App");
1292
+ expect(document.body.textContent).not.toContain("Connect my account");
1293
+ expect(mocks.navigateToMcpOAuthStart).not.toHaveBeenCalled();
1294
+
1295
+ const configure = [...document.body.querySelectorAll("button")].find(
1296
+ (button) => button.textContent === "Add workspace credentials",
1297
+ );
1298
+ expect(configure).toBeTruthy();
1299
+ act(() => configure?.click());
1300
+ expect(mocks.settings).toHaveBeenCalledExactlyOnceWith(
1301
+ "secrets:HUBSPOT_MCP_CLIENT_ID",
1302
+ );
1303
+ });
1304
+
1305
+ it("opens HubSpot setup when the catalog row is clicked before OAuth readiness", () => {
1306
+ mocks.hubspotOAuthReadinessQuery.data = { hubspot: "missing" };
1307
+
1308
+ const hubspot = DEFAULT_MCP_INTEGRATIONS.find(
1309
+ (integration) => integration.id === "hubspot",
1310
+ )!;
1311
+ act(() => {
1312
+ root.render(
1313
+ <TooltipProvider>
1314
+ <McpIntegrationDialog
1315
+ open
1316
+ onOpenChange={() => {}}
1317
+ defaultScope="user"
1318
+ canCreateOrgMcp
1319
+ hasOrg
1320
+ onCreateMcpServer={vi.fn()}
1321
+ integrations={[hubspot]}
1322
+ />
1323
+ </TooltipProvider>,
1324
+ );
1325
+ });
1326
+
1327
+ const connect = document.body.querySelector<HTMLButtonElement>(
1328
+ 'button[aria-label="Open setup guide HubSpot"]',
1329
+ );
1330
+ expect(connect).toBeTruthy();
1331
+
1332
+ act(() => connect?.click());
1333
+
1334
+ expect(document.body.textContent).toContain("workspace owner");
1335
+ expect(document.body.textContent).toContain("HubSpot MCP Auth App");
1336
+ expect(mocks.navigateToMcpOAuthStart).not.toHaveBeenCalled();
1337
+ });
1338
+
1339
+ it("keeps HubSpot connect blocked when readiness cannot be checked and offers retry", () => {
1340
+ mocks.hubspotOAuthReadinessQuery.data = undefined as never;
1341
+ mocks.hubspotOAuthReadinessQuery.isSuccess = false;
1342
+ mocks.hubspotOAuthReadinessQuery.isError = true;
1343
+
1344
+ const hubspot = DEFAULT_MCP_INTEGRATIONS.find(
1345
+ (integration) => integration.id === "hubspot",
1346
+ )!;
1347
+ act(() => {
1348
+ root.render(
1349
+ <TooltipProvider>
1350
+ <McpIntegrationDialog
1351
+ open
1352
+ onOpenChange={() => {}}
1353
+ initialIntegrationId="hubspot"
1354
+ defaultScope="user"
1355
+ canCreateOrgMcp={false}
1356
+ hasOrg
1357
+ onCreateMcpServer={vi.fn()}
1358
+ integrations={[hubspot]}
1359
+ />
1360
+ </TooltipProvider>,
1361
+ );
1362
+ });
1363
+
1364
+ expect(document.body.textContent).toContain(
1365
+ "Couldn't check the workspace OAuth settings",
1366
+ );
1367
+ expect(document.body.querySelector('button[type="submit"]')).toBeNull();
1368
+ expect(mocks.navigateToMcpOAuthStart).not.toHaveBeenCalled();
1369
+ const retry = [...document.body.querySelectorAll("button")].find(
1370
+ (button) => button.textContent === "Retry",
1371
+ );
1372
+ act(() => retry?.click());
1373
+ expect(mocks.hubspotOAuthReadinessQuery.refetch).toHaveBeenCalledOnce();
1374
+ });
1241
1375
  });