@agent-native/toolkit 0.212.1 → 0.214.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 (209) hide show
  1. package/agent-native.eject.json +9 -0
  2. package/dist/app/agentkit/react/components.d.ts.map +1 -1
  3. package/dist/app/agentkit/react/components.js +10 -4
  4. package/dist/app/agentkit/react/components.js.map +1 -1
  5. package/dist/app/agentkit/react/context.d.ts +13 -1
  6. package/dist/app/agentkit/react/context.d.ts.map +1 -1
  7. package/dist/app/agentkit/react/context.js +3 -1
  8. package/dist/app/agentkit/react/context.js.map +1 -1
  9. package/dist/app/agentkit/react/index.d.ts +1 -0
  10. package/dist/app/agentkit/react/index.d.ts.map +1 -1
  11. package/dist/app/agentkit/react/index.js +1 -0
  12. package/dist/app/agentkit/react/index.js.map +1 -1
  13. package/dist/app/agentkit/react/message-content-order.d.ts +21 -0
  14. package/dist/app/agentkit/react/message-content-order.d.ts.map +1 -0
  15. package/dist/app/agentkit/react/message-content-order.js +173 -0
  16. package/dist/app/agentkit/react/message-content-order.js.map +1 -0
  17. package/dist/app/agentkit/react/root.d.ts +3 -1
  18. package/dist/app/agentkit/react/root.d.ts.map +1 -1
  19. package/dist/app/agentkit/react/root.js +2 -2
  20. package/dist/app/agentkit/react/root.js.map +1 -1
  21. package/dist/app/agentkit/react/styles.css +2 -2
  22. package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
  23. package/dist/app/chat/AgentKitAssistantChat.js +7 -2
  24. package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
  25. package/dist/app/chat/AgentPanel.d.ts +14 -2
  26. package/dist/app/chat/AgentPanel.d.ts.map +1 -1
  27. package/dist/app/chat/AgentPanel.js +22 -5
  28. package/dist/app/chat/AgentPanel.js.map +1 -1
  29. package/dist/app/chat/chat/surface-types.d.ts +8 -0
  30. package/dist/app/chat/chat/surface-types.d.ts.map +1 -1
  31. package/dist/app/chat/chat/surface-types.js.map +1 -1
  32. package/dist/app/chat/chat/widgets/DataChartRenderer.d.ts.map +1 -1
  33. package/dist/app/chat/chat/widgets/DataChartRenderer.js +127 -30
  34. package/dist/app/chat/chat/widgets/DataChartRenderer.js.map +1 -1
  35. package/dist/app/chat/chat/widgets/DataChartWidget.d.ts +3 -2
  36. package/dist/app/chat/chat/widgets/DataChartWidget.d.ts.map +1 -1
  37. package/dist/app/chat/chat/widgets/DataChartWidget.js +14 -9
  38. package/dist/app/chat/chat/widgets/DataChartWidget.js.map +1 -1
  39. package/dist/app/chat/chat/widgets/DataInsightsWidget.js +1 -1
  40. package/dist/app/chat/chat/widgets/DataInsightsWidget.js.map +1 -1
  41. package/dist/app/chat/chat/widgets/DataTableWidget.d.ts +3 -2
  42. package/dist/app/chat/chat/widgets/DataTableWidget.d.ts.map +1 -1
  43. package/dist/app/chat/chat/widgets/DataTableWidget.js +10 -66
  44. package/dist/app/chat/chat/widgets/DataTableWidget.js.map +1 -1
  45. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.d.ts +11 -0
  46. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.d.ts.map +1 -0
  47. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.js +131 -0
  48. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.js.map +1 -0
  49. package/dist/app/chat/chat/widgets/builtin-tool-renderers.js +2 -2
  50. package/dist/app/chat/chat/widgets/builtin-tool-renderers.js.map +1 -1
  51. package/dist/app/chat/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  52. package/dist/app/chat/mcp-apps/McpAppRenderer.js +6 -5
  53. package/dist/app/chat/mcp-apps/McpAppRenderer.js.map +1 -1
  54. package/dist/app/chat/mcp-apps/mcp-app-theme.d.ts +2 -0
  55. package/dist/app/chat/mcp-apps/mcp-app-theme.d.ts.map +1 -0
  56. package/dist/app/chat/mcp-apps/mcp-app-theme.js +11 -0
  57. package/dist/app/chat/mcp-apps/mcp-app-theme.js.map +1 -0
  58. package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
  59. package/dist/app/i18n/catalogs/ar-SA.js +10 -0
  60. package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
  61. package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
  62. package/dist/app/i18n/catalogs/de-DE.js +10 -0
  63. package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
  64. package/dist/app/i18n/catalogs/en-US.d.ts +10 -0
  65. package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
  66. package/dist/app/i18n/catalogs/en-US.js +10 -0
  67. package/dist/app/i18n/catalogs/en-US.js.map +1 -1
  68. package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
  69. package/dist/app/i18n/catalogs/es-ES.js +10 -0
  70. package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
  71. package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
  72. package/dist/app/i18n/catalogs/fr-FR.js +10 -0
  73. package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
  74. package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
  75. package/dist/app/i18n/catalogs/hi-IN.js +10 -0
  76. package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
  77. package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
  78. package/dist/app/i18n/catalogs/ja-JP.js +10 -0
  79. package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
  80. package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
  81. package/dist/app/i18n/catalogs/ko-KR.js +10 -0
  82. package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
  83. package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
  84. package/dist/app/i18n/catalogs/pt-BR.js +10 -0
  85. package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
  86. package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
  87. package/dist/app/i18n/catalogs/zh-CN.js +10 -0
  88. package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
  89. package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
  90. package/dist/app/i18n/catalogs/zh-TW.js +10 -0
  91. package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
  92. package/dist/app/org/AuthenticationSection.d.ts +3 -0
  93. package/dist/app/org/AuthenticationSection.d.ts.map +1 -1
  94. package/dist/app/org/AuthenticationSection.js +9 -3
  95. package/dist/app/org/AuthenticationSection.js.map +1 -1
  96. package/dist/app/org/pages/OrgAuthenticationPage.d.ts.map +1 -1
  97. package/dist/app/org/pages/OrgAuthenticationPage.js +2 -2
  98. package/dist/app/org/pages/OrgAuthenticationPage.js.map +1 -1
  99. package/dist/app/providers/AppProviders.d.ts +2 -1
  100. package/dist/app/providers/AppProviders.d.ts.map +1 -1
  101. package/dist/app/providers/AppProviders.js +4 -3
  102. package/dist/app/providers/AppProviders.js.map +1 -1
  103. package/dist/app/providers/ThemeFamilySync.d.ts +2 -0
  104. package/dist/app/providers/ThemeFamilySync.d.ts.map +1 -0
  105. package/dist/app/providers/ThemeFamilySync.js +6 -0
  106. package/dist/app/providers/ThemeFamilySync.js.map +1 -0
  107. package/dist/app/settings/account/PreferencesSettings.d.ts.map +1 -1
  108. package/dist/app/settings/account/PreferencesSettings.js +2 -1
  109. package/dist/app/settings/account/PreferencesSettings.js.map +1 -1
  110. package/dist/app/settings/account/ThemeFamilySettings.d.ts +2 -0
  111. package/dist/app/settings/account/ThemeFamilySettings.d.ts.map +1 -0
  112. package/dist/app/settings/account/ThemeFamilySettings.js +31 -0
  113. package/dist/app/settings/account/ThemeFamilySettings.js.map +1 -0
  114. package/dist/app/settings/account/search-entries.d.ts.map +1 -1
  115. package/dist/app/settings/account/search-entries.js +6 -0
  116. package/dist/app/settings/account/search-entries.js.map +1 -1
  117. package/dist/app/shared/DefaultSpinner.d.ts.map +1 -1
  118. package/dist/app/shared/DefaultSpinner.js +4 -5
  119. package/dist/app/shared/DefaultSpinner.js.map +1 -1
  120. package/dist/app/shared/ErrorBoundary.d.ts +1 -0
  121. package/dist/app/shared/ErrorBoundary.d.ts.map +1 -1
  122. package/dist/app/shared/ErrorBoundary.js +27 -12
  123. package/dist/app/shared/ErrorBoundary.js.map +1 -1
  124. package/dist/app/shared/PoweredByBadge.d.ts.map +1 -1
  125. package/dist/app/shared/PoweredByBadge.js +8 -49
  126. package/dist/app/shared/PoweredByBadge.js.map +1 -1
  127. package/dist/app/styles/agent-conversation.css +0 -23
  128. package/dist/app/styles/agent-native.css +1 -1
  129. package/dist/app/styles/theme-families.css +66 -0
  130. package/dist/composer/ComposerContextBanner.d.ts +22 -0
  131. package/dist/composer/ComposerContextBanner.d.ts.map +1 -0
  132. package/dist/composer/ComposerContextBanner.js +9 -0
  133. package/dist/composer/ComposerContextBanner.js.map +1 -0
  134. package/dist/composer/ComposerModePicker.d.ts +26 -0
  135. package/dist/composer/ComposerModePicker.d.ts.map +1 -0
  136. package/dist/composer/ComposerModePicker.js +14 -0
  137. package/dist/composer/ComposerModePicker.js.map +1 -0
  138. package/dist/composer/index.d.ts +2 -0
  139. package/dist/composer/index.d.ts.map +1 -1
  140. package/dist/composer/index.js +2 -0
  141. package/dist/composer/index.js.map +1 -1
  142. package/dist/styles.css +1 -0
  143. package/package.json +3 -3
  144. package/src/app/agentkit/react/components.spec.tsx +12 -0
  145. package/src/app/agentkit/react/components.tsx +41 -22
  146. package/src/app/agentkit/react/context.tsx +17 -0
  147. package/src/app/agentkit/react/index.ts +1 -0
  148. package/src/app/agentkit/react/lifecycle.spec.tsx +116 -1
  149. package/src/app/agentkit/react/message-content-order.spec.ts +190 -0
  150. package/src/app/agentkit/react/message-content-order.ts +246 -0
  151. package/src/app/agentkit/react/root.tsx +4 -0
  152. package/src/app/agentkit/react/styles.css +2 -2
  153. package/src/app/chat/AgentKitAssistantChat.spec.tsx +19 -0
  154. package/src/app/chat/AgentKitAssistantChat.tsx +10 -1
  155. package/src/app/chat/AgentPanel.header.spec.ts +72 -14
  156. package/src/app/chat/AgentPanel.tsx +97 -53
  157. package/src/app/chat/chat/surface-types.ts +8 -0
  158. package/src/app/chat/chat/widgets/DataChartRenderer.spec.tsx +217 -0
  159. package/src/app/chat/chat/widgets/DataChartRenderer.tsx +306 -68
  160. package/src/app/chat/chat/widgets/DataChartWidget.spec.tsx +329 -0
  161. package/src/app/chat/chat/widgets/DataChartWidget.ssr.spec.tsx +25 -0
  162. package/src/app/chat/chat/widgets/DataChartWidget.tsx +48 -33
  163. package/src/app/chat/chat/widgets/DataInsightsWidget.tsx +2 -2
  164. package/src/app/chat/chat/widgets/DataTableWidget.spec.tsx +37 -3
  165. package/src/app/chat/chat/widgets/DataTableWidget.tsx +22 -86
  166. package/src/app/chat/chat/widgets/DataWidgetDisplayControls.tsx +301 -0
  167. package/src/app/chat/chat/widgets/builtin-tool-renderers.tsx +5 -5
  168. package/src/app/chat/mcp-apps/McpAppRenderer.tsx +10 -5
  169. package/src/app/chat/mcp-apps/mcp-app-theme.spec.ts +30 -0
  170. package/src/app/chat/mcp-apps/mcp-app-theme.ts +11 -0
  171. package/src/app/i18n/catalogs/ar-SA.ts +12 -0
  172. package/src/app/i18n/catalogs/de-DE.ts +13 -0
  173. package/src/app/i18n/catalogs/en-US.ts +12 -0
  174. package/src/app/i18n/catalogs/es-ES.ts +14 -0
  175. package/src/app/i18n/catalogs/fr-FR.ts +14 -0
  176. package/src/app/i18n/catalogs/hi-IN.ts +12 -0
  177. package/src/app/i18n/catalogs/ja-JP.ts +12 -0
  178. package/src/app/i18n/catalogs/ko-KR.ts +12 -0
  179. package/src/app/i18n/catalogs/pt-BR.ts +13 -0
  180. package/src/app/i18n/catalogs/zh-CN.ts +11 -0
  181. package/src/app/i18n/catalogs/zh-TW.ts +12 -0
  182. package/src/app/org/AuthenticationSection.spec.tsx +62 -0
  183. package/src/app/org/AuthenticationSection.tsx +47 -1
  184. package/src/app/org/pages/OrgAuthenticationPage.tsx +4 -0
  185. package/src/app/org/pages/OrgSettingsPages.spec.tsx +3 -0
  186. package/src/app/providers/AppProviders.spec.tsx +71 -0
  187. package/src/app/providers/AppProviders.tsx +10 -0
  188. package/src/app/providers/ThemeFamilySync.tsx +6 -0
  189. package/src/app/settings/account/PreferencesSettings.spec.tsx +13 -2
  190. package/src/app/settings/account/PreferencesSettings.tsx +8 -0
  191. package/src/app/settings/account/ThemeFamilySettings.tsx +61 -0
  192. package/src/app/settings/account/search-entries.ts +6 -0
  193. package/src/app/shared/DefaultSpinner.spec.tsx +14 -0
  194. package/src/app/shared/DefaultSpinner.tsx +4 -5
  195. package/src/app/shared/ErrorBoundary.spec.tsx +45 -2
  196. package/src/app/shared/ErrorBoundary.tsx +37 -12
  197. package/src/app/shared/PoweredByBadge.spec.tsx +16 -0
  198. package/src/app/shared/PoweredByBadge.tsx +8 -50
  199. package/src/app/styles/agent-conversation.css +0 -23
  200. package/src/app/styles/agent-native.css +1 -1
  201. package/src/app/styles/agent-native.spec.ts +18 -0
  202. package/src/app/styles/theme-families.css +66 -0
  203. package/src/app/styles/theme-families.spec.ts +29 -0
  204. package/src/composer/ComposerContextBanner.spec.tsx +74 -0
  205. package/src/composer/ComposerContextBanner.tsx +72 -0
  206. package/src/composer/ComposerModePicker.spec.tsx +101 -0
  207. package/src/composer/ComposerModePicker.tsx +98 -0
  208. package/src/composer/index.ts +9 -0
  209. package/src/styles.css +1 -0
@@ -1063,6 +1063,9 @@ const messages: ToolkitAgentChatTranslation = {
1063
1063
  "tool.worked": "Trabajó",
1064
1064
  "tool.workedFor": "Trabajó durante {{duration}}",
1065
1065
  "widget.chart": "Gráfico",
1066
+ "widget.chartActions": "Acciones del gráfico",
1067
+ "widget.dataSources": "Fuentes de datos",
1068
+ "widget.tableActions": "Acciones de la tabla",
1066
1069
  "widget.dataChart": "Gráfico de datos",
1067
1070
  "widget.dataInsights": "Información sobre los datos",
1068
1071
  "widget.dataTable": "Tabla de datos",
@@ -2155,6 +2158,10 @@ const messages: ToolkitAgentChatTranslation = {
2155
2158
  "Definido. Permite que las apps de este espacio de trabajo se verifiquen entre sí.",
2156
2159
  "settingsOrg.auth.sharedSecretNotSet":
2157
2160
  "Sin definir. Permite que las apps de este espacio de trabajo se verifiquen entre sí.",
2161
+ "settingsOrg.auth.memberDelegation":
2162
+ "Delegación de identidad de miembros de la organización",
2163
+ "settingsOrg.auth.memberDelegationHelp":
2164
+ "Las aplicaciones conectadas que tengan este secreto compartido de la organización pueden afirmar la identidad de cualquier miembro actual al llamar a esta aplicación. Esta aplicación comprueba la lista de miembros en tiempo real y limita el acceso delegado a la organización a los permisos del rol de miembro.",
2158
2165
  "settingsOrg.auth.secretNotSetValue": "Sin definir",
2159
2166
  "settingsOrg.auth.manage": "Gestionar",
2160
2167
  "settingsOrg.auth.reveal": "Mostrar",
@@ -2227,6 +2234,13 @@ const messages: ToolkitAgentChatTranslation = {
2227
2234
  "settingsShell.account.languageAndRegion": "Idioma y región",
2228
2235
  "settingsShell.account.languageDescription":
2229
2236
  "Se aplica en todos tus dispositivos.",
2237
+ "settingsShell.account.appearance": "Apariencia",
2238
+ "settingsShell.account.themeFamily": "Familia de tema",
2239
+ "settingsShell.account.themeFamilyAgentNative": "Agent-Native",
2240
+ "settingsShell.account.themeFamilyOriginal":
2241
+ "Colores originales de la aplicación",
2242
+ "settingsShell.account.themeFamilySaveError":
2243
+ "No se pudo actualizar el tema. Inténtalo de nuevo.",
2230
2244
  "settingsShell.account.manage": "Gestionar",
2231
2245
  "settingsShell.account.name": "Nombre",
2232
2246
  "settingsShell.account.nameDescription":
@@ -1068,6 +1068,9 @@ const messages: ToolkitAgentChatTranslation = {
1068
1068
  "tool.worked": "A travaillé",
1069
1069
  "tool.workedFor": "A travaillé pendant {{duration}}",
1070
1070
  "widget.chart": "Graphique",
1071
+ "widget.chartActions": "Actions du graphique",
1072
+ "widget.dataSources": "Sources de données",
1073
+ "widget.tableActions": "Actions du tableau",
1071
1074
  "widget.dataChart": "Graphique de données",
1072
1075
  "widget.dataInsights": "Informations sur les données",
1073
1076
  "widget.dataTable": "Tableau de données",
@@ -2170,6 +2173,10 @@ const messages: ToolkitAgentChatTranslation = {
2170
2173
  "Défini. Permet aux applications de cet espace de travail de se vérifier mutuellement.",
2171
2174
  "settingsOrg.auth.sharedSecretNotSet":
2172
2175
  "Non défini. Permet aux applications de cet espace de travail de se vérifier mutuellement.",
2176
+ "settingsOrg.auth.memberDelegation":
2177
+ "Délégation d’identité des membres de l’organisation",
2178
+ "settingsOrg.auth.memberDelegationHelp":
2179
+ "Les applications connectées qui détiennent ce secret partagé de l’organisation peuvent déclarer l’identité de n’importe quel membre actuel lorsqu’elles appellent cette application. Cette application vérifie la liste des membres en temps réel et limite l’accès délégué à l’organisation aux autorisations du rôle de membre.",
2173
2180
  "settingsOrg.auth.secretNotSetValue": "Non défini",
2174
2181
  "settingsOrg.auth.manage": "Gérer",
2175
2182
  "settingsOrg.auth.reveal": "Afficher",
@@ -2241,6 +2248,13 @@ const messages: ToolkitAgentChatTranslation = {
2241
2248
  "settingsShell.account.languageAndRegion": "Langue et région",
2242
2249
  "settingsShell.account.languageDescription":
2243
2250
  "S’applique sur tous vos appareils.",
2251
+ "settingsShell.account.appearance": "Apparence",
2252
+ "settingsShell.account.themeFamily": "Famille de thème",
2253
+ "settingsShell.account.themeFamilyAgentNative": "Agent-Native",
2254
+ "settingsShell.account.themeFamilyOriginal":
2255
+ "Couleurs d’origine de l’application",
2256
+ "settingsShell.account.themeFamilySaveError":
2257
+ "Impossible de mettre à jour le thème. Réessayez.",
2244
2258
  "settingsShell.account.manage": "Gérer",
2245
2259
  "settingsShell.account.name": "Nom",
2246
2260
  "settingsShell.account.nameDescription":
@@ -1491,6 +1491,9 @@ const messages: ToolkitAgentChatTranslation = {
1491
1491
  "tool.worked": "काम किया",
1492
1492
  "tool.workedFor": "{{duration}} तक काम किया",
1493
1493
  "widget.chart": "चार्ट",
1494
+ "widget.chartActions": "चार्ट कार्रवाइयाँ",
1495
+ "widget.dataSources": "डेटा स्रोत",
1496
+ "widget.tableActions": "टेबल कार्रवाइयाँ",
1494
1497
  "widget.dataChart": "डेटा चार्ट",
1495
1498
  "widget.dataInsights": "डेटा इनसाइट्स",
1496
1499
  "widget.dataTable": "डेटा तालिका",
@@ -1998,6 +2001,9 @@ const messages: ToolkitAgentChatTranslation = {
1998
2001
  "सेट है। इससे इस वर्कस्पेस के ऐप्स एक-दूसरे की पुष्टि कर पाते हैं।",
1999
2002
  "settingsOrg.auth.sharedSecretNotSet":
2000
2003
  "सेट नहीं है। इससे इस वर्कस्पेस के ऐप्स एक-दूसरे की पुष्टि कर पाते हैं।",
2004
+ "settingsOrg.auth.memberDelegation": "संगठन सदस्य की पहचान का प्रत्यायोजन",
2005
+ "settingsOrg.auth.memberDelegationHelp":
2006
+ "इस साझा संगठन सीक्रेट वाले कनेक्टेड ऐप्स इस ऐप को कॉल करते समय किसी भी वर्तमान सदस्य की पहचान का दावा कर सकते हैं। यह ऐप लाइव सदस्य सूची की जांच करता है और प्रत्यायोजित संगठन एक्सेस को सदस्य-स्तर की अनुमतियों तक सीमित रखता है।",
2001
2007
  "settingsOrg.auth.secretNotSetValue": "सेट नहीं है",
2002
2008
  "settingsOrg.auth.manage": "प्रबंधित करें",
2003
2009
  "settingsOrg.auth.reveal": "दिखाएं",
@@ -2060,6 +2066,12 @@ const messages: ToolkitAgentChatTranslation = {
2060
2066
  "इस बदलाव की पुष्टि करने के निर्देशों के लिए अपना ईमेल देखें।",
2061
2067
  "settingsShell.account.languageAndRegion": "भाषा और क्षेत्र",
2062
2068
  "settingsShell.account.languageDescription": "आपके सभी डिवाइस पर लागू होता है।",
2069
+ "settingsShell.account.appearance": "रूप-रंग",
2070
+ "settingsShell.account.themeFamily": "थीम शैली",
2071
+ "settingsShell.account.themeFamilyAgentNative": "Agent-Native",
2072
+ "settingsShell.account.themeFamilyOriginal": "ऐप के मूल रंग",
2073
+ "settingsShell.account.themeFamilySaveError":
2074
+ "थीम शैली अपडेट नहीं की जा सकी। फिर कोशिश करें।",
2063
2075
  "settingsShell.account.manage": "प्रबंधित करें",
2064
2076
  "settingsShell.account.name": "नाम",
2065
2077
  "settingsShell.account.nameDescription":
@@ -1536,6 +1536,9 @@ const messages: ToolkitAgentChatTranslation = {
1536
1536
  "tool.worked": "作業しました",
1537
1537
  "tool.workedFor": "{{duration}} 作業しました",
1538
1538
  "widget.chart": "チャート",
1539
+ "widget.chartActions": "チャート操作",
1540
+ "widget.dataSources": "データソース",
1541
+ "widget.tableActions": "テーブル操作",
1539
1542
  "widget.dataChart": "データチャート",
1540
1543
  "widget.dataInsights": "データインサイト",
1541
1544
  "widget.dataTable": "データテーブル",
@@ -2031,6 +2034,9 @@ const messages: ToolkitAgentChatTranslation = {
2031
2034
  "設定済み。このワークスペースのアプリが互いを検証できます。",
2032
2035
  "settingsOrg.auth.sharedSecretNotSet":
2033
2036
  "未設定。このワークスペースのアプリが互いを検証できます。",
2037
+ "settingsOrg.auth.memberDelegation": "組織メンバーの本人確認を委任",
2038
+ "settingsOrg.auth.memberDelegationHelp":
2039
+ "この組織の共有シークレットを持つ接続済みアプリは、このアプリを呼び出す際に現在のメンバーであれば誰でもその本人であると主張できます。このアプリは最新のメンバー一覧を確認し、委任された組織アクセスをメンバー権限に制限します。",
2034
2040
  "settingsOrg.auth.secretNotSetValue": "未設定",
2035
2041
  "settingsOrg.auth.manage": "管理",
2036
2042
  "settingsOrg.auth.reveal": "表示",
@@ -2090,6 +2096,12 @@ const messages: ToolkitAgentChatTranslation = {
2090
2096
  "settingsShell.account.languageAndRegion": "言語と地域",
2091
2097
  "settingsShell.account.languageDescription":
2092
2098
  "すべてのデバイスに適用されます。",
2099
+ "settingsShell.account.appearance": "外観",
2100
+ "settingsShell.account.themeFamily": "テーマ",
2101
+ "settingsShell.account.themeFamilyAgentNative": "Agent-Native",
2102
+ "settingsShell.account.themeFamilyOriginal": "アプリのオリジナルカラー",
2103
+ "settingsShell.account.themeFamilySaveError":
2104
+ "テーマを更新できませんでした。もう一度お試しください。",
2093
2105
  "settingsShell.account.manage": "管理",
2094
2106
  "settingsShell.account.name": "名前",
2095
2107
  "settingsShell.account.nameDescription":
@@ -1510,6 +1510,9 @@ const messages: ToolkitAgentChatTranslation = {
1510
1510
  "tool.worked": "작업함",
1511
1511
  "tool.workedFor": "{{duration}} 동안 작업함",
1512
1512
  "widget.chart": "차트",
1513
+ "widget.chartActions": "차트 작업",
1514
+ "widget.dataSources": "데이터 소스",
1515
+ "widget.tableActions": "표 작업",
1513
1516
  "widget.dataChart": "데이터 차트",
1514
1517
  "widget.dataInsights": "데이터 인사이트",
1515
1518
  "widget.dataTable": "데이터 테이블",
@@ -1998,6 +2001,9 @@ const messages: ToolkitAgentChatTranslation = {
1998
2001
  "설정됨. 이 워크스페이스의 앱이 서로를 확인할 수 있습니다.",
1999
2002
  "settingsOrg.auth.sharedSecretNotSet":
2000
2003
  "설정 안 됨. 이 워크스페이스의 앱이 서로를 확인할 수 있습니다.",
2004
+ "settingsOrg.auth.memberDelegation": "조직 구성원 신원 위임",
2005
+ "settingsOrg.auth.memberDelegationHelp":
2006
+ "이 공유 조직 비밀을 보유한 연결된 앱은 이 앱을 호출할 때 현재 구성원 누구의 신원이든 주장할 수 있습니다. 이 앱은 실시간 구성원 명단을 확인하고 위임된 조직 액세스를 구성원 수준 권한으로 제한합니다.",
2001
2007
  "settingsOrg.auth.secretNotSetValue": "설정 안 됨",
2002
2008
  "settingsOrg.auth.manage": "관리",
2003
2009
  "settingsOrg.auth.reveal": "표시",
@@ -2054,6 +2060,12 @@ const messages: ToolkitAgentChatTranslation = {
2054
2060
  "이메일을 확인하고 안내에 따라 이 변경을 확정하세요.",
2055
2061
  "settingsShell.account.languageAndRegion": "언어 및 지역",
2056
2062
  "settingsShell.account.languageDescription": "모든 기기에 적용됩니다.",
2063
+ "settingsShell.account.appearance": "모양",
2064
+ "settingsShell.account.themeFamily": "테마 스타일",
2065
+ "settingsShell.account.themeFamilyAgentNative": "Agent-Native",
2066
+ "settingsShell.account.themeFamilyOriginal": "앱의 원래 색상",
2067
+ "settingsShell.account.themeFamilySaveError":
2068
+ "테마 스타일을 업데이트하지 못했습니다. 다시 시도하세요.",
2057
2069
  "settingsShell.account.manage": "관리",
2058
2070
  "settingsShell.account.name": "이름",
2059
2071
  "settingsShell.account.nameDescription":
@@ -1055,6 +1055,9 @@ const messages: ToolkitAgentChatTranslation = {
1055
1055
  "tool.worked": "Trabalhou",
1056
1056
  "tool.workedFor": "Trabalhou por {{duration}}",
1057
1057
  "widget.chart": "Gráfico",
1058
+ "widget.chartActions": "Ações do gráfico",
1059
+ "widget.dataSources": "Fontes de dados",
1060
+ "widget.tableActions": "Ações da tabela",
1058
1061
  "widget.dataChart": "Gráfico de dados",
1059
1062
  "widget.dataInsights": "Insights de dados",
1060
1063
  "widget.dataTable": "Tabela de dados",
@@ -2145,6 +2148,10 @@ const messages: ToolkitAgentChatTranslation = {
2145
2148
  "Definido. Permite que os apps deste espaço de trabalho verifiquem uns aos outros.",
2146
2149
  "settingsOrg.auth.sharedSecretNotSet":
2147
2150
  "Não definido. Permite que os apps deste espaço de trabalho verifiquem uns aos outros.",
2151
+ "settingsOrg.auth.memberDelegation":
2152
+ "Delegação de identidade de membros da organização",
2153
+ "settingsOrg.auth.memberDelegationHelp":
2154
+ "Apps conectados que tenham este segredo compartilhado da organização podem declarar a identidade de qualquer membro atual ao chamar este app. Este app verifica a lista de membros em tempo real e limita o acesso delegado à organização às permissões do nível de membro.",
2148
2155
  "settingsOrg.auth.secretNotSetValue": "Não definido",
2149
2156
  "settingsOrg.auth.manage": "Gerenciar",
2150
2157
  "settingsOrg.auth.reveal": "Mostrar",
@@ -2216,6 +2223,12 @@ const messages: ToolkitAgentChatTranslation = {
2216
2223
  "settingsShell.account.languageAndRegion": "Idioma e região",
2217
2224
  "settingsShell.account.languageDescription":
2218
2225
  "Vale para todos os seus dispositivos.",
2226
+ "settingsShell.account.appearance": "Aparência",
2227
+ "settingsShell.account.themeFamily": "Família do tema",
2228
+ "settingsShell.account.themeFamilyAgentNative": "Agent-Native",
2229
+ "settingsShell.account.themeFamilyOriginal": "Cores originais do app",
2230
+ "settingsShell.account.themeFamilySaveError":
2231
+ "Não foi possível atualizar o tema. Tente novamente.",
2219
2232
  "settingsShell.account.manage": "Gerenciar",
2220
2233
  "settingsShell.account.name": "Nome",
2221
2234
  "settingsShell.account.nameDescription":
@@ -1419,6 +1419,9 @@ const messages: ToolkitAgentChatTranslation = {
1419
1419
  "tool.worked": "已处理",
1420
1420
  "tool.workedFor": "处理了 {{duration}}",
1421
1421
  "widget.chart": "图表",
1422
+ "widget.chartActions": "图表操作",
1423
+ "widget.dataSources": "数据来源",
1424
+ "widget.tableActions": "表格操作",
1422
1425
  "widget.dataChart": "数据图表",
1423
1426
  "widget.dataInsights": "数据洞察",
1424
1427
  "widget.dataTable": "数据表",
@@ -1885,6 +1888,9 @@ const messages: ToolkitAgentChatTranslation = {
1885
1888
  "settingsOrg.auth.sharedSecret": "共享密钥",
1886
1889
  "settingsOrg.auth.sharedSecretSet": "已设置。让此工作区中的应用相互验证。",
1887
1890
  "settingsOrg.auth.sharedSecretNotSet": "未设置。让此工作区中的应用相互验证。",
1891
+ "settingsOrg.auth.memberDelegation": "组织成员身份委派",
1892
+ "settingsOrg.auth.memberDelegationHelp":
1893
+ "持有此组织共享密钥的已连接应用在调用此应用时,可以声明为任意一名当前成员。此应用会检查实时成员名单,并将受委派的组织访问权限限制为成员级权限。",
1888
1894
  "settingsOrg.auth.secretNotSetValue": "未设置",
1889
1895
  "settingsOrg.auth.manage": "管理",
1890
1896
  "settingsOrg.auth.reveal": "显示",
@@ -1937,6 +1943,11 @@ const messages: ToolkitAgentChatTranslation = {
1937
1943
  "settingsShell.account.emailChangeSent": "请查看您的邮箱,按说明确认此更改。",
1938
1944
  "settingsShell.account.languageAndRegion": "语言和地区",
1939
1945
  "settingsShell.account.languageDescription": "适用于您的所有设备。",
1946
+ "settingsShell.account.appearance": "外观",
1947
+ "settingsShell.account.themeFamily": "主题样式",
1948
+ "settingsShell.account.themeFamilyAgentNative": "Agent-Native",
1949
+ "settingsShell.account.themeFamilyOriginal": "原应用配色",
1950
+ "settingsShell.account.themeFamilySaveError": "无法更新主题样式。请重试。",
1940
1951
  "settingsShell.account.manage": "管理",
1941
1952
  "settingsShell.account.name": "姓名",
1942
1953
  "settingsShell.account.nameDescription":
@@ -1424,6 +1424,9 @@ const messages: ToolkitAgentChatTranslation = {
1424
1424
  "tool.worked": "已處理",
1425
1425
  "tool.workedFor": "處理了 {{duration}}",
1426
1426
  "widget.chart": "圖表",
1427
+ "widget.chartActions": "圖表操作",
1428
+ "widget.dataSources": "資料來源",
1429
+ "widget.tableActions": "表格操作",
1427
1430
  "widget.dataChart": "資料圖表",
1428
1431
  "widget.dataInsights": "資料洞察",
1429
1432
  "widget.dataTable": "資料表",
@@ -1894,6 +1897,9 @@ const messages: ToolkitAgentChatTranslation = {
1894
1897
  "已設定。讓此工作區中的應用程式互相驗證。",
1895
1898
  "settingsOrg.auth.sharedSecretNotSet":
1896
1899
  "未設定。讓此工作區中的應用程式互相驗證。",
1900
+ "settingsOrg.auth.memberDelegation": "組織成員身分委派",
1901
+ "settingsOrg.auth.memberDelegationHelp":
1902
+ "持有此組織共用密鑰的已連結應用程式在呼叫此應用程式時,可以聲稱是任何一位現任成員。此應用程式會檢查即時成員名單,並將受委派的組織存取權限制為成員層級的權限。",
1897
1903
  "settingsOrg.auth.secretNotSetValue": "未設定",
1898
1904
  "settingsOrg.auth.manage": "管理",
1899
1905
  "settingsOrg.auth.reveal": "顯示",
@@ -1947,6 +1953,12 @@ const messages: ToolkitAgentChatTranslation = {
1947
1953
  "請查看您的電子郵件,依照說明確認此變更。",
1948
1954
  "settingsShell.account.languageAndRegion": "語言和地區",
1949
1955
  "settingsShell.account.languageDescription": "套用至您的所有裝置。",
1956
+ "settingsShell.account.appearance": "外觀",
1957
+ "settingsShell.account.themeFamily": "主題樣式",
1958
+ "settingsShell.account.themeFamilyAgentNative": "Agent-Native",
1959
+ "settingsShell.account.themeFamilyOriginal": "原始應用程式配色",
1960
+ "settingsShell.account.themeFamilySaveError":
1961
+ "無法更新主題樣式,請再試一次。",
1950
1962
  "settingsShell.account.manage": "管理",
1951
1963
  "settingsShell.account.name": "姓名",
1952
1964
  "settingsShell.account.nameDescription":
@@ -0,0 +1,62 @@
1
+ // @vitest-environment happy-dom
2
+
3
+ import React, { act } from "react";
4
+ import { createRoot, type Root } from "react-dom/client";
5
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
+
7
+ const mocks = vi.hoisted(() => ({
8
+ setDelegation: { error: null, isPending: false, mutate: vi.fn() },
9
+ }));
10
+
11
+ vi.mock("@agent-native/core/client/org", () => ({
12
+ useSetA2AMemberDelegation: () => mocks.setDelegation,
13
+ }));
14
+
15
+ vi.mock("@agent-native/core/client/i18n", () => ({
16
+ useT: () => (key: string) => key,
17
+ }));
18
+
19
+ import { TooltipProvider } from "@agent-native/toolkit/ui/tooltip";
20
+
21
+ import { A2AMemberDelegationSection } from "./AuthenticationSection.js";
22
+
23
+ describe("A2AMemberDelegationSection", () => {
24
+ let container: HTMLDivElement;
25
+ let root: Root;
26
+
27
+ beforeEach(() => {
28
+ vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
29
+ container = document.createElement("div");
30
+ document.body.appendChild(container);
31
+ root = createRoot(container);
32
+ vi.clearAllMocks();
33
+ });
34
+
35
+ afterEach(() => {
36
+ act(() => root.unmount());
37
+ container.remove();
38
+ vi.unstubAllGlobals();
39
+ });
40
+
41
+ it("shows the owner-controlled setting and sends the selected value", () => {
42
+ act(() => {
43
+ root.render(
44
+ <TooltipProvider>
45
+ <A2AMemberDelegationSection enabled={false} />
46
+ </TooltipProvider>,
47
+ );
48
+ });
49
+
50
+ const toggle = container.querySelector('[role="switch"]');
51
+ expect(toggle?.getAttribute("aria-label")).toBe(
52
+ "agentChat.settingsOrg.auth.memberDelegation",
53
+ );
54
+ expect(toggle?.getAttribute("aria-checked")).toBe("false");
55
+
56
+ act(() =>
57
+ toggle?.dispatchEvent(new MouseEvent("click", { bubbles: true })),
58
+ );
59
+
60
+ expect(mocks.setDelegation.mutate).toHaveBeenCalledWith(true);
61
+ });
62
+ });
@@ -4,6 +4,7 @@ import {
4
4
  useSetOrgDomain,
5
5
  useRevealA2ASecret,
6
6
  useSetA2ASecret,
7
+ useSetA2AMemberDelegation,
7
8
  useSyncA2ASecret,
8
9
  type SyncA2ASecretResult,
9
10
  } from "@agent-native/core/client/org";
@@ -18,6 +19,7 @@ import {
18
19
  PopoverTrigger,
19
20
  } from "@agent-native/toolkit/ui/popover";
20
21
  import { Spinner } from "@agent-native/toolkit/ui/spinner";
22
+ import { Switch } from "@agent-native/toolkit/ui/switch";
21
23
  import {
22
24
  Tooltip,
23
25
  TooltipContent,
@@ -34,6 +36,7 @@ import {
34
36
  IconEye,
35
37
  IconEyeOff,
36
38
  IconCloudUpload,
39
+ IconInfoCircle,
37
40
  } from "@tabler/icons-react";
38
41
  import { useState } from "react";
39
42
 
@@ -505,6 +508,44 @@ export function A2ASecretSection({ isSet }: { isSet: boolean }) {
505
508
  );
506
509
  }
507
510
 
511
+ export function A2AMemberDelegationSection({ enabled }: { enabled: boolean }) {
512
+ const t = useT();
513
+ const setDelegation = useSetA2AMemberDelegation();
514
+
515
+ return (
516
+ <SettingsRow
517
+ id="a2a-member-delegation"
518
+ label={
519
+ <Tooltip>
520
+ <TooltipTrigger asChild>
521
+ <span className="inline-flex items-center gap-1" tabIndex={0}>
522
+ {t("agentChat.settingsOrg.auth.memberDelegation")}
523
+ <IconInfoCircle
524
+ aria-hidden="true"
525
+ className="size-4 text-muted-foreground"
526
+ />
527
+ </span>
528
+ </TooltipTrigger>
529
+ <TooltipContent>
530
+ {t("agentChat.settingsOrg.auth.memberDelegationHelp")}
531
+ </TooltipContent>
532
+ </Tooltip>
533
+ }
534
+ control={
535
+ <div className="flex items-center justify-end gap-3">
536
+ <ErrorText error={setDelegation.error} />
537
+ <Switch
538
+ checked={enabled}
539
+ onCheckedChange={(value) => setDelegation.mutate(value)}
540
+ disabled={setDelegation.isPending}
541
+ aria-label={t("agentChat.settingsOrg.auth.memberDelegation")}
542
+ />
543
+ </div>
544
+ }
545
+ />
546
+ );
547
+ }
548
+
508
549
  /**
509
550
  * Sign-in policy, SSO, SCIM, and domain auto-join for owners and admins, plus
510
551
  * the cross-app secret for owners. Renders nothing for members.
@@ -528,7 +569,12 @@ export function AuthenticationSection({ title }: { title?: string }) {
528
569
  requiredAuthProvider={org.requiredAuthProvider}
529
570
  />
530
571
  {org.role === "owner" && (
531
- <A2ASecretSection isSet={Boolean(org.a2aSecretSet)} />
572
+ <>
573
+ <A2ASecretSection isSet={Boolean(org.a2aSecretSet)} />
574
+ <A2AMemberDelegationSection
575
+ enabled={Boolean(org.a2aMemberDelegationEnabled)}
576
+ />
577
+ </>
532
578
  )}
533
579
  </SettingsGroup>
534
580
  </SectionTooltipProvider>
@@ -19,6 +19,7 @@ import { useState } from "react";
19
19
 
20
20
  import { SettingsGroup, SettingsRow } from "../../settings/SettingsRow.js";
21
21
  import {
22
+ A2AMemberDelegationSection,
22
23
  A2ASecretSection,
23
24
  DomainSettingsSection,
24
25
  } from "../AuthenticationSection.js";
@@ -204,6 +205,9 @@ function OrgAuthenticationContent({ org }: { org: OrgInfo }) {
204
205
  title={t("agentChat.settingsOrg.auth.betweenApps")}
205
206
  >
206
207
  <A2ASecretSection isSet={Boolean(org.a2aSecretSet)} />
208
+ <A2AMemberDelegationSection
209
+ enabled={Boolean(org.a2aMemberDelegationEnabled)}
210
+ />
207
211
  </SettingsGroup>
208
212
  )}
209
213
  </div>
@@ -88,6 +88,7 @@ vi.mock("../OrgIdentitySettings.js", () => ({
88
88
  vi.mock("../AuthenticationSection.js", () => ({
89
89
  DomainSettingsSection: () => <div id="email-domain" />,
90
90
  A2ASecretSection: () => <div id="cross-app-authentication" />,
91
+ A2AMemberDelegationSection: () => <div id="member-delegation" />,
91
92
  }));
92
93
 
93
94
  vi.mock("../OrgGeneralSection.js", () => ({
@@ -194,6 +195,7 @@ describe("Organization settings pages", () => {
194
195
  expect(methods?.textContent).toContain("Email and password, and Google.");
195
196
  expect(container.querySelector("#email-domain")).not.toBeNull();
196
197
  expect(container.querySelector("#cross-app-authentication")).toBeNull();
198
+ expect(container.querySelector("#member-delegation")).toBeNull();
197
199
  });
198
200
 
199
201
  it("shows the owner the shared secret", () => {
@@ -203,6 +205,7 @@ describe("Organization settings pages", () => {
203
205
  expect(
204
206
  container.querySelector("#cross-app-authentication"),
205
207
  ).not.toBeNull();
208
+ expect(container.querySelector("#member-delegation")).not.toBeNull();
206
209
  });
207
210
 
208
211
  it("lists each method and the variables that turn it on", () => {
@@ -9,12 +9,17 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
9
9
  import { resetAgentEngineReadinessForTests } from "../../../../core/src/client/agent-engine-readiness.js";
10
10
 
11
11
  const useSessionMock = vi.fn();
12
+ const useThemeFamilyMock = vi.fn();
12
13
  vi.mock("@agent-native/core/client/use-session", async (importOriginal) => ({
13
14
  ...(await importOriginal<
14
15
  typeof import("@agent-native/core/client/use-session")
15
16
  >()),
16
17
  useSession: () => useSessionMock(),
17
18
  }));
19
+ vi.mock("@agent-native/core/client/ui", async (importOriginal) => ({
20
+ ...(await importOriginal<typeof import("@agent-native/core/client/ui")>()),
21
+ useThemeFamily: () => useThemeFamilyMock(),
22
+ }));
18
23
  vi.mock("@agent-native/core/client/action-query-cache", () => ({
19
24
  ActionQueryCacheGate: ({ children }: { children: React.ReactNode }) => (
20
25
  <div data-testid="action-query-cache-gate">{children}</div>
@@ -48,9 +53,34 @@ let originalLocation: Location;
48
53
  let originalParent: Window;
49
54
  let originalFetch: typeof window.fetch;
50
55
  let originalModelContext: PropertyDescriptor | undefined;
56
+ let originalLocalStorage: PropertyDescriptor | undefined;
51
57
  let originalDocumentTitle: string;
52
58
  let replaceMock: ReturnType<typeof vi.fn>;
53
59
 
60
+ function createTestLocalStorage(): Storage {
61
+ const values = new Map<string, string>();
62
+ return {
63
+ get length() {
64
+ return values.size;
65
+ },
66
+ clear() {
67
+ values.clear();
68
+ },
69
+ getItem(key) {
70
+ return values.get(String(key)) ?? null;
71
+ },
72
+ key(index) {
73
+ return [...values.keys()][index] ?? null;
74
+ },
75
+ removeItem(key) {
76
+ values.delete(String(key));
77
+ },
78
+ setItem(key, value) {
79
+ values.set(String(key), String(value));
80
+ },
81
+ };
82
+ }
83
+
54
84
  beforeEach(() => {
55
85
  resetAgentEngineReadinessForTests();
56
86
  container = document.createElement("div");
@@ -64,6 +94,14 @@ beforeEach(() => {
64
94
  document,
65
95
  "modelContext",
66
96
  );
97
+ originalLocalStorage = Object.getOwnPropertyDescriptor(
98
+ window,
99
+ "localStorage",
100
+ );
101
+ Object.defineProperty(window, "localStorage", {
102
+ configurable: true,
103
+ value: createTestLocalStorage(),
104
+ });
67
105
  Object.defineProperty(window, "fetch", {
68
106
  configurable: true,
69
107
  value: vi
@@ -102,6 +140,11 @@ afterEach(() => {
102
140
  configurable: true,
103
141
  value: originalFetch,
104
142
  });
143
+ if (originalLocalStorage) {
144
+ Object.defineProperty(window, "localStorage", originalLocalStorage);
145
+ } else {
146
+ delete (window as Window & { localStorage?: Storage }).localStorage;
147
+ }
105
148
  if (originalModelContext) {
106
149
  Object.defineProperty(document, "modelContext", originalModelContext);
107
150
  } else {
@@ -115,6 +158,7 @@ function renderProviders(props: {
115
158
  isPublicPath?: boolean;
116
159
  sessionBypass?: boolean;
117
160
  skipFirstRunOnboarding?: boolean;
161
+ enableThemeFamily?: boolean;
118
162
  disableWebMcp?: boolean;
119
163
  children?: React.ReactNode;
120
164
  }) {
@@ -183,6 +227,33 @@ const SIGNED_IN_SESSION = {
183
227
  };
184
228
 
185
229
  describe("AppProviders session gate", () => {
230
+ it("mounts theme-family sync by default in an authenticated app shell", async () => {
231
+ useSessionMock.mockReturnValue(SIGNED_IN_SESSION);
232
+
233
+ renderProviders({ skipFirstRunOnboarding: true });
234
+ await act(async () => {
235
+ await import("./ThemeFamilySync.js");
236
+ });
237
+
238
+ expect(useThemeFamilyMock).toHaveBeenCalledOnce();
239
+ });
240
+
241
+ it("allows an authenticated app shell to disable theme-family sync", () => {
242
+ useSessionMock.mockReturnValue(SIGNED_IN_SESSION);
243
+
244
+ renderProviders({ skipFirstRunOnboarding: true, enableThemeFamily: false });
245
+
246
+ expect(useThemeFamilyMock).not.toHaveBeenCalled();
247
+ });
248
+
249
+ it("does not load theme-family settings on public routes", () => {
250
+ useSessionMock.mockReturnValue(SIGNED_OUT_SESSION);
251
+
252
+ renderProviders({ isPublicPath: true });
253
+
254
+ expect(useThemeFamilyMock).not.toHaveBeenCalled();
255
+ });
256
+
186
257
  it("uses Toolkit's theme-aware toaster by default", () => {
187
258
  useSessionMock.mockReturnValue(SIGNED_OUT_SESSION);
188
259
 
@@ -95,6 +95,8 @@ export interface AppProvidersProps {
95
95
  */
96
96
  ownsDocument?: boolean;
97
97
 
98
+ enableThemeFamily?: boolean;
99
+
98
100
  documentTitleFallback?: string;
99
101
 
100
102
  children: React.ReactNode;
@@ -397,6 +399,8 @@ function AgentEngineReadinessBootstrap() {
397
399
  return null;
398
400
  }
399
401
 
402
+ const ThemeFamilySync = React.lazy(() => import("./ThemeFamilySync.js"));
403
+
400
404
  function ProvidersInner({
401
405
  queryClient,
402
406
  defaultTheme = "system",
@@ -507,6 +511,7 @@ export function AppProviders({
507
511
  i18n,
508
512
  documentTitleFallback,
509
513
  ownsDocument = true,
514
+ enableThemeFamily = true,
510
515
  children,
511
516
  }: AppProvidersProps) {
512
517
  const fallback = clientOnlyFallback ?? (
@@ -543,6 +548,11 @@ export function AppProviders({
543
548
  children
544
549
  ) : (
545
550
  <>
551
+ {ownsDocument && enableThemeFamily ? (
552
+ <React.Suspense fallback={null}>
553
+ <ThemeFamilySync />
554
+ </React.Suspense>
555
+ ) : null}
546
556
  <AgentEngineReadinessBootstrap />
547
557
  <FirstRunOnboardingStartupGate
548
558
  suppressSurface={skipFirstRunOnboarding}
@@ -0,0 +1,6 @@
1
+ import { useThemeFamily } from "@agent-native/core/client/ui";
2
+
3
+ export default function ThemeFamilySync() {
4
+ useThemeFamily();
5
+ return null;
6
+ }