@agent-native/toolkit 0.217.0 → 0.219.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 (206) hide show
  1. package/agent-native.eject.json +21 -0
  2. package/dist/app/agent-page/AgentContextTab.d.ts.map +1 -1
  3. package/dist/app/agent-page/AgentContextTab.js +1 -0
  4. package/dist/app/agent-page/AgentContextTab.js.map +1 -1
  5. package/dist/app/agentkit/react/components.d.ts.map +1 -1
  6. package/dist/app/agentkit/react/components.js +1 -1
  7. package/dist/app/agentkit/react/components.js.map +1 -1
  8. package/dist/app/agentkit/react/context.d.ts +4 -1
  9. package/dist/app/agentkit/react/context.d.ts.map +1 -1
  10. package/dist/app/agentkit/react/context.js +3 -1
  11. package/dist/app/agentkit/react/context.js.map +1 -1
  12. package/dist/app/agentkit/react/data-chart-layout.d.ts +30 -0
  13. package/dist/app/agentkit/react/data-chart-layout.d.ts.map +1 -0
  14. package/dist/app/agentkit/react/data-chart-layout.js +2 -0
  15. package/dist/app/agentkit/react/data-chart-layout.js.map +1 -0
  16. package/dist/app/agentkit/react/index.d.ts +1 -0
  17. package/dist/app/agentkit/react/index.d.ts.map +1 -1
  18. package/dist/app/agentkit/react/index.js +1 -0
  19. package/dist/app/agentkit/react/index.js.map +1 -1
  20. package/dist/app/agentkit/react/root.d.ts +3 -1
  21. package/dist/app/agentkit/react/root.d.ts.map +1 -1
  22. package/dist/app/agentkit/react/root.js +2 -2
  23. package/dist/app/agentkit/react/root.js.map +1 -1
  24. package/dist/app/agentkit/react/styles.css +31 -6
  25. package/dist/app/agentkit/react/transcript-layout.d.ts +2 -0
  26. package/dist/app/agentkit/react/transcript-layout.d.ts.map +1 -1
  27. package/dist/app/agentkit/react/transcript-layout.js.map +1 -1
  28. package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
  29. package/dist/app/chat/AgentKitAssistantChat.js +2 -2
  30. package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
  31. package/dist/app/chat/AgentPanel.js +6 -6
  32. package/dist/app/chat/AgentPanel.js.map +1 -1
  33. package/dist/app/chat/MultiTabAssistantChat.d.ts.map +1 -1
  34. package/dist/app/chat/MultiTabAssistantChat.js +53 -95
  35. package/dist/app/chat/MultiTabAssistantChat.js.map +1 -1
  36. package/dist/app/chat/agentkit-chat/action-widget.d.ts.map +1 -1
  37. package/dist/app/chat/agentkit-chat/action-widget.js +4 -1
  38. package/dist/app/chat/agentkit-chat/action-widget.js.map +1 -1
  39. package/dist/app/chat/agentkit-chat/rail.d.ts +1 -1
  40. package/dist/app/chat/agentkit-chat/rail.d.ts.map +1 -1
  41. package/dist/app/chat/agentkit-chat/rail.js +1 -1
  42. package/dist/app/chat/agentkit-chat/rail.js.map +1 -1
  43. package/dist/app/chat/chat/index.d.ts +2 -1
  44. package/dist/app/chat/chat/index.d.ts.map +1 -1
  45. package/dist/app/chat/chat/index.js +1 -1
  46. package/dist/app/chat/chat/index.js.map +1 -1
  47. package/dist/app/chat/chat/surface-types.d.ts +3 -0
  48. package/dist/app/chat/chat/surface-types.d.ts.map +1 -1
  49. package/dist/app/chat/chat/surface-types.js.map +1 -1
  50. package/dist/app/chat/chat/tool-call-display.d.ts +5 -1
  51. package/dist/app/chat/chat/tool-call-display.d.ts.map +1 -1
  52. package/dist/app/chat/chat/tool-call-display.js +6 -4
  53. package/dist/app/chat/chat/tool-call-display.js.map +1 -1
  54. package/dist/app/chat/chat/tool-render-registry.d.ts +4 -0
  55. package/dist/app/chat/chat/tool-render-registry.d.ts.map +1 -1
  56. package/dist/app/chat/chat/tool-render-registry.js.map +1 -1
  57. package/dist/app/chat/chat/widgets/DataChartRenderer.d.ts +3 -1
  58. package/dist/app/chat/chat/widgets/DataChartRenderer.d.ts.map +1 -1
  59. package/dist/app/chat/chat/widgets/DataChartRenderer.js +116 -26
  60. package/dist/app/chat/chat/widgets/DataChartRenderer.js.map +1 -1
  61. package/dist/app/chat/chat/widgets/DataChartWidget.d.ts +3 -1
  62. package/dist/app/chat/chat/widgets/DataChartWidget.d.ts.map +1 -1
  63. package/dist/app/chat/chat/widgets/DataChartWidget.js +21 -2
  64. package/dist/app/chat/chat/widgets/DataChartWidget.js.map +1 -1
  65. package/dist/app/chat/chat/widgets/DataInsightsWidget.d.ts +3 -1
  66. package/dist/app/chat/chat/widgets/DataInsightsWidget.d.ts.map +1 -1
  67. package/dist/app/chat/chat/widgets/DataInsightsWidget.js +2 -2
  68. package/dist/app/chat/chat/widgets/DataInsightsWidget.js.map +1 -1
  69. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.d.ts +1 -1
  70. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.d.ts.map +1 -1
  71. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.js +3 -1
  72. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.js.map +1 -1
  73. package/dist/app/chat/chat/widgets/builtin-tool-renderers.d.ts.map +1 -1
  74. package/dist/app/chat/chat/widgets/builtin-tool-renderers.js +2 -2
  75. package/dist/app/chat/chat/widgets/builtin-tool-renderers.js.map +1 -1
  76. package/dist/app/chat/chat-first/chat-history.d.ts +13 -2
  77. package/dist/app/chat/chat-first/chat-history.d.ts.map +1 -1
  78. package/dist/app/chat/chat-first/chat-history.js +24 -3
  79. package/dist/app/chat/chat-first/chat-history.js.map +1 -1
  80. package/dist/app/chat/conversation/AgentConversation.d.ts.map +1 -1
  81. package/dist/app/chat/conversation/AgentConversation.js +6 -1
  82. package/dist/app/chat/conversation/AgentConversation.js.map +1 -1
  83. package/dist/app/chat/ownership-history/ChatOwnerAvatar.d.ts +6 -0
  84. package/dist/app/chat/ownership-history/ChatOwnerAvatar.d.ts.map +1 -0
  85. package/dist/app/chat/ownership-history/ChatOwnerAvatar.js +9 -0
  86. package/dist/app/chat/ownership-history/ChatOwnerAvatar.js.map +1 -0
  87. package/dist/app/chat/ownership-history/index.d.ts +11 -0
  88. package/dist/app/chat/ownership-history/index.d.ts.map +1 -0
  89. package/dist/app/chat/ownership-history/index.js +22 -0
  90. package/dist/app/chat/ownership-history/index.js.map +1 -0
  91. package/dist/app/chat/ownership-history/rows.d.ts +27 -0
  92. package/dist/app/chat/ownership-history/rows.d.ts.map +1 -0
  93. package/dist/app/chat/ownership-history/rows.js +101 -0
  94. package/dist/app/chat/ownership-history/rows.js.map +1 -0
  95. package/dist/app/chat/ownership-history/useOwnershipChatHistory.d.ts +52 -0
  96. package/dist/app/chat/ownership-history/useOwnershipChatHistory.d.ts.map +1 -0
  97. package/dist/app/chat/ownership-history/useOwnershipChatHistory.js +497 -0
  98. package/dist/app/chat/ownership-history/useOwnershipChatHistory.js.map +1 -0
  99. package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
  100. package/dist/app/i18n/catalogs/ar-SA.js +3 -0
  101. package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
  102. package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
  103. package/dist/app/i18n/catalogs/de-DE.js +3 -0
  104. package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
  105. package/dist/app/i18n/catalogs/en-US.d.ts +3 -0
  106. package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
  107. package/dist/app/i18n/catalogs/en-US.js +3 -0
  108. package/dist/app/i18n/catalogs/en-US.js.map +1 -1
  109. package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
  110. package/dist/app/i18n/catalogs/es-ES.js +3 -0
  111. package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
  112. package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
  113. package/dist/app/i18n/catalogs/fr-FR.js +3 -0
  114. package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
  115. package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
  116. package/dist/app/i18n/catalogs/hi-IN.js +3 -0
  117. package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
  118. package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
  119. package/dist/app/i18n/catalogs/ja-JP.js +3 -0
  120. package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
  121. package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
  122. package/dist/app/i18n/catalogs/ko-KR.js +3 -0
  123. package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
  124. package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
  125. package/dist/app/i18n/catalogs/pt-BR.js +3 -0
  126. package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
  127. package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
  128. package/dist/app/i18n/catalogs/zh-CN.js +3 -0
  129. package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
  130. package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
  131. package/dist/app/i18n/catalogs/zh-TW.js +3 -0
  132. package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
  133. package/dist/app/shared/CommandMenu.d.ts +2 -0
  134. package/dist/app/shared/CommandMenu.d.ts.map +1 -1
  135. package/dist/app/shared/CommandMenu.js +11 -6
  136. package/dist/app/shared/CommandMenu.js.map +1 -1
  137. package/dist/app/sharing/ShareButton.d.ts.map +1 -1
  138. package/dist/app/sharing/ShareButton.js +9 -8
  139. package/dist/app/sharing/ShareButton.js.map +1 -1
  140. package/dist/chat-history/ChatHistoryList.d.ts +16 -3
  141. package/dist/chat-history/ChatHistoryList.d.ts.map +1 -1
  142. package/dist/chat-history/ChatHistoryList.js +25 -15
  143. package/dist/chat-history/ChatHistoryList.js.map +1 -1
  144. package/dist/chat-history.css +109 -9
  145. package/dist/composer/TiptapComposer.js +1 -1
  146. package/dist/composer/TiptapComposer.js.map +1 -1
  147. package/package.json +10 -3
  148. package/src/app/agent-page/AgentContextTab.spec.ts +50 -2
  149. package/src/app/agent-page/AgentContextTab.tsx +1 -0
  150. package/src/app/agentkit/react/components.interaction.spec.tsx +2 -0
  151. package/src/app/agentkit/react/components.spec.tsx +11 -6
  152. package/src/app/agentkit/react/components.tsx +3 -0
  153. package/src/app/agentkit/react/context.tsx +6 -0
  154. package/src/app/agentkit/react/data-chart-layout.ts +25 -0
  155. package/src/app/agentkit/react/index.ts +1 -0
  156. package/src/app/agentkit/react/root.tsx +4 -0
  157. package/src/app/agentkit/react/styles.css +31 -6
  158. package/src/app/agentkit/react/transcript-layout.ts +2 -0
  159. package/src/app/chat/AgentKitAssistantChat.spec.tsx +201 -27
  160. package/src/app/chat/AgentKitAssistantChat.tsx +3 -0
  161. package/src/app/chat/AgentPanel.tsx +8 -8
  162. package/src/app/chat/MultiTabAssistantChat.spec.tsx +270 -3
  163. package/src/app/chat/MultiTabAssistantChat.tsx +81 -158
  164. package/src/app/chat/agentkit-chat/action-widget.spec.tsx +62 -0
  165. package/src/app/chat/agentkit-chat/action-widget.tsx +4 -0
  166. package/src/app/chat/agentkit-chat/rail.ts +11 -0
  167. package/src/app/chat/chat/index.ts +10 -0
  168. package/src/app/chat/chat/surface-types.ts +3 -0
  169. package/src/app/chat/chat/tool-call-display.spec.tsx +29 -0
  170. package/src/app/chat/chat/tool-call-display.tsx +17 -1
  171. package/src/app/chat/chat/tool-render-registry.tsx +5 -0
  172. package/src/app/chat/chat/widgets/DataChartRenderer.spec.tsx +377 -17
  173. package/src/app/chat/chat/widgets/DataChartRenderer.tsx +232 -63
  174. package/src/app/chat/chat/widgets/DataChartWidget.spec.tsx +67 -0
  175. package/src/app/chat/chat/widgets/DataChartWidget.tsx +39 -5
  176. package/src/app/chat/chat/widgets/DataInsightsWidget.tsx +13 -2
  177. package/src/app/chat/chat/widgets/DataWidgetDisplayControls.tsx +6 -4
  178. package/src/app/chat/chat/widgets/builtin-tool-renderers.tsx +5 -1
  179. package/src/app/chat/chat-first/chat-history.spec.tsx +79 -0
  180. package/src/app/chat/chat-first/chat-history.tsx +75 -22
  181. package/src/app/chat/conversation/AgentConversation.spec.tsx +51 -1
  182. package/src/app/chat/conversation/AgentConversation.tsx +11 -2
  183. package/src/app/chat/ownership-history/ChatOwnerAvatar.tsx +27 -0
  184. package/src/app/chat/ownership-history/index.tsx +67 -0
  185. package/src/app/chat/ownership-history/ownership-history.spec.tsx +3146 -0
  186. package/src/app/chat/ownership-history/rows.ts +156 -0
  187. package/src/app/chat/ownership-history/useOwnershipChatHistory.ts +709 -0
  188. package/src/app/i18n/catalogs/ar-SA.ts +3 -0
  189. package/src/app/i18n/catalogs/de-DE.ts +3 -0
  190. package/src/app/i18n/catalogs/en-US.ts +3 -0
  191. package/src/app/i18n/catalogs/es-ES.ts +3 -0
  192. package/src/app/i18n/catalogs/fr-FR.ts +3 -0
  193. package/src/app/i18n/catalogs/hi-IN.ts +3 -0
  194. package/src/app/i18n/catalogs/ja-JP.ts +3 -0
  195. package/src/app/i18n/catalogs/ko-KR.ts +3 -0
  196. package/src/app/i18n/catalogs/pt-BR.ts +3 -0
  197. package/src/app/i18n/catalogs/zh-CN.ts +3 -0
  198. package/src/app/i18n/catalogs/zh-TW.ts +3 -0
  199. package/src/app/shared/CommandMenu.spec.tsx +175 -6
  200. package/src/app/shared/CommandMenu.tsx +24 -7
  201. package/src/app/sharing/ShareButton.tsx +12 -10
  202. package/src/chat-history/ChatHistoryList.spec.tsx +51 -0
  203. package/src/chat-history/ChatHistoryList.tsx +87 -26
  204. package/src/chat-history/ChatHistoryRailSections.spec.tsx +12 -4
  205. package/src/chat-history.css +109 -9
  206. package/src/composer/TiptapComposer.tsx +1 -1
@@ -480,6 +480,9 @@ const messages: ToolkitAgentChatTranslation = {
480
480
  "history.ownedBy": "Eigentümer: {{name}}",
481
481
  "history.accessDirect": "Mit dir geteilt",
482
482
  "history.accessOrganization": "Mit deiner Organisation geteilt",
483
+ "history.copyLink": "Link kopieren",
484
+ "history.linkCopied": "Link kopiert",
485
+ "history.copyLinkFailed": "Link konnte nicht kopiert werden",
483
486
  "integrations.availableSection": "Verfügbare Integrationen",
484
487
  "integrations.connectedSection": "Verbunden",
485
488
  "integrations.goToApiKeys": "Zu den API-Schlüsseln",
@@ -769,6 +769,9 @@ const messages = {
769
769
  "history.ownedBy": "Owner: {{name}}",
770
770
  "history.accessDirect": "Shared with you",
771
771
  "history.accessOrganization": "Shared with your organization",
772
+ "history.copyLink": "Copy link",
773
+ "history.linkCopied": "Link copied",
774
+ "history.copyLinkFailed": "Couldn't copy the link",
772
775
  "integrations.availableSection": "Available integrations",
773
776
  "integrations.connectedSection": "Connected",
774
777
  "integrations.goToApiKeys": "Go to API keys",
@@ -479,6 +479,9 @@ const messages: ToolkitAgentChatTranslation = {
479
479
  "history.ownedBy": "Propietario: {{name}}",
480
480
  "history.accessDirect": "Compartidos contigo",
481
481
  "history.accessOrganization": "Compartido con tu organización",
482
+ "history.copyLink": "Copiar enlace",
483
+ "history.linkCopied": "Enlace copiado",
484
+ "history.copyLinkFailed": "No se pudo copiar el enlace",
482
485
  "integrations.availableSection": "Integraciones disponibles",
483
486
  "integrations.connectedSection": "Conectado",
484
487
  "integrations.goToApiKeys": "Ir a claves de API",
@@ -478,6 +478,9 @@ const messages: ToolkitAgentChatTranslation = {
478
478
  "history.ownedBy": "Propriétaire : {{name}}",
479
479
  "history.accessDirect": "Partagés avec vous",
480
480
  "history.accessOrganization": "Partagé avec votre organisation",
481
+ "history.copyLink": "Copier le lien",
482
+ "history.linkCopied": "Lien copié",
483
+ "history.copyLinkFailed": "Impossible de copier le lien",
481
484
  "integrations.availableSection": "Intégrations disponibles",
482
485
  "integrations.connectedSection": "Connecté",
483
486
  "integrations.goToApiKeys": "Aller aux clés API",
@@ -759,6 +759,9 @@ const messages: ToolkitAgentChatTranslation = {
759
759
  "history.ownedBy": "मालिक: {{name}}",
760
760
  "history.accessDirect": "आपके साथ साझा",
761
761
  "history.accessOrganization": "आपके संगठन के साथ साझा",
762
+ "history.copyLink": "लिंक कॉपी करें",
763
+ "history.linkCopied": "लिंक कॉपी हो गया",
764
+ "history.copyLinkFailed": "लिंक कॉपी नहीं हो सका",
762
765
  "integrations.availableSection": "उपलब्ध इंटीग्रेशन",
763
766
  "integrations.connectedSection": "कनेक्ट किए गए",
764
767
  "integrations.goToApiKeys": "API कुंजियों पर जाएं",
@@ -783,6 +783,9 @@ const messages: ToolkitAgentChatTranslation = {
783
783
  "history.ownedBy": "所有者: {{name}}",
784
784
  "history.accessDirect": "共有されたチャット",
785
785
  "history.accessOrganization": "組織と共有",
786
+ "history.copyLink": "リンクをコピー",
787
+ "history.linkCopied": "リンクをコピーしました",
788
+ "history.copyLinkFailed": "リンクをコピーできませんでした",
786
789
  "integrations.availableSection": "利用可能な連携",
787
790
  "integrations.connectedSection": "接続済み",
788
791
  "integrations.goToApiKeys": "API キーへ移動",
@@ -762,6 +762,9 @@ const messages: ToolkitAgentChatTranslation = {
762
762
  "history.ownedBy": "소유자: {{name}}",
763
763
  "history.accessDirect": "나와 공유된 채팅",
764
764
  "history.accessOrganization": "조직과 공유됨",
765
+ "history.copyLink": "링크 복사",
766
+ "history.linkCopied": "링크를 복사했어요",
767
+ "history.copyLinkFailed": "링크를 복사하지 못했어요",
765
768
  "integrations.availableSection": "사용 가능한 연동",
766
769
  "integrations.connectedSection": "연결됨",
767
770
  "integrations.goToApiKeys": "API 키로 이동",
@@ -473,6 +473,9 @@ const messages: ToolkitAgentChatTranslation = {
473
473
  "history.ownedBy": "Proprietário: {{name}}",
474
474
  "history.accessDirect": "Compartilhados com você",
475
475
  "history.accessOrganization": "Compartilhado com sua organização",
476
+ "history.copyLink": "Copiar link",
477
+ "history.linkCopied": "Link copiado",
478
+ "history.copyLinkFailed": "Não foi possível copiar o link",
476
479
  "integrations.availableSection": "Integrações disponíveis",
477
480
  "integrations.connectedSection": "Conectado",
478
481
  "integrations.goToApiKeys": "Ir para chaves de API",
@@ -726,6 +726,9 @@ const messages: ToolkitAgentChatTranslation = {
726
726
  "history.ownedBy": "所有者:{{name}}",
727
727
  "history.accessDirect": "与您共享",
728
728
  "history.accessOrganization": "与您的组织共享",
729
+ "history.copyLink": "复制链接",
730
+ "history.linkCopied": "链接已复制",
731
+ "history.copyLinkFailed": "无法复制链接",
729
732
  "integrations.availableSection": "可用集成",
730
733
  "integrations.connectedSection": "已连接",
731
734
  "integrations.goToApiKeys": "前往 API 密钥",
@@ -728,6 +728,9 @@ const messages: ToolkitAgentChatTranslation = {
728
728
  "history.ownedBy": "擁有者:{{name}}",
729
729
  "history.accessDirect": "與您共用",
730
730
  "history.accessOrganization": "與您的組織共用",
731
+ "history.copyLink": "複製連結",
732
+ "history.linkCopied": "已複製連結",
733
+ "history.copyLinkFailed": "無法複製連結",
731
734
  "integrations.availableSection": "可用整合",
732
735
  "integrations.connectedSection": "已連線",
733
736
  "integrations.goToApiKeys": "前往 API 金鑰",
@@ -9,13 +9,19 @@ const agentEngineStatusMock = vi.hoisted(() => ({
9
9
  state: "missing" as "unknown" | "configured" | "missing" | "unavailable",
10
10
  }));
11
11
 
12
- vi.mock("@agent-native/core/client/use-agent-engine-configured", () => ({
13
- useAgentEngineConfigured: () => ({
14
- canChat: agentEngineStatusMock.state === "configured",
15
- missing: agentEngineStatusMock.state === "missing",
16
- state: agentEngineStatusMock.state,
12
+ vi.mock(
13
+ "@agent-native/core/client/use-agent-engine-configured",
14
+ async (importOriginal) => ({
15
+ ...(await importOriginal<
16
+ typeof import("@agent-native/core/client/use-agent-engine-configured")
17
+ >()),
18
+ useAgentEngineConfigured: () => ({
19
+ canChat: agentEngineStatusMock.state === "configured",
20
+ missing: agentEngineStatusMock.state === "missing",
21
+ state: agentEngineStatusMock.state,
22
+ }),
17
23
  }),
18
- }));
24
+ );
19
25
 
20
26
  vi.mock("../chat/chat/run-recovery.js", async () => {
21
27
  const { createElement } = await import("react");
@@ -44,6 +50,7 @@ import {
44
50
  openAgentSettings,
45
51
  useCommandMenuNestedDialog,
46
52
  useCommandMenuShortcut,
53
+ type AppCommandContext,
47
54
  type AppCommandGroup,
48
55
  type CommandMenuItemMatchContext,
49
56
  type CommandMenuItemMatcher,
@@ -1836,6 +1843,168 @@ describe("CommandMenu", () => {
1836
1843
  ).toContain("Selected preview");
1837
1844
  });
1838
1845
 
1846
+ it("renders opt-in app command previews in only the selected row", () => {
1847
+ renderAppCommands({
1848
+ groups: [
1849
+ {
1850
+ id: "results",
1851
+ order: 1,
1852
+ commands: [
1853
+ {
1854
+ id: "record",
1855
+ order: 1,
1856
+ label: "Meeting notes",
1857
+ inlinePreview: <span>First row preview</span>,
1858
+ onSelect() {},
1859
+ },
1860
+ {
1861
+ id: "meeting-agenda",
1862
+ order: 2,
1863
+ label: "Meeting agenda",
1864
+ inlinePreview: <span>Second row preview</span>,
1865
+ onSelect() {},
1866
+ },
1867
+ ],
1868
+ },
1869
+ ],
1870
+ });
1871
+
1872
+ const firstRow = document.querySelector(
1873
+ '[cmdk-item][data-value="app-command:results:record"]',
1874
+ );
1875
+ const secondRow = document.querySelector(
1876
+ '[cmdk-item][data-value="app-command:results:meeting-agenda"]',
1877
+ );
1878
+ expect(
1879
+ firstRow?.querySelector(
1880
+ '[data-testid="command-menu-app-command-preview"]',
1881
+ )?.textContent,
1882
+ ).toBe("First row preview");
1883
+ expect(
1884
+ secondRow?.querySelector(
1885
+ '[data-testid="command-menu-app-command-preview"]',
1886
+ ),
1887
+ ).toBeNull();
1888
+
1889
+ const input = document.querySelector<HTMLInputElement>("[cmdk-input]");
1890
+ expect(input).toBeTruthy();
1891
+ act(() =>
1892
+ input!.dispatchEvent(
1893
+ new KeyboardEvent("keydown", { key: "ArrowDown", bubbles: true }),
1894
+ ),
1895
+ );
1896
+
1897
+ expect(
1898
+ firstRow?.querySelector(
1899
+ '[data-testid="command-menu-app-command-preview"]',
1900
+ ),
1901
+ ).toBeNull();
1902
+ expect(
1903
+ secondRow?.querySelector(
1904
+ '[data-testid="command-menu-app-command-preview"]',
1905
+ )?.textContent,
1906
+ ).toBe("Second row preview");
1907
+ });
1908
+
1909
+ it("keeps the selected app preview when search retains the highlighted row", () => {
1910
+ renderAppCommands({
1911
+ groups: [
1912
+ {
1913
+ id: "results",
1914
+ order: 1,
1915
+ commands: [
1916
+ {
1917
+ id: "meeting-notes",
1918
+ order: 1,
1919
+ label: "Meeting notes",
1920
+ inlinePreview: <span>Meeting preview</span>,
1921
+ onSelect() {},
1922
+ },
1923
+ {
1924
+ id: "other-task",
1925
+ order: 2,
1926
+ label: "Other task",
1927
+ inlinePreview: <span>Other preview</span>,
1928
+ onSelect() {},
1929
+ },
1930
+ ],
1931
+ },
1932
+ ],
1933
+ });
1934
+
1935
+ const selectedPreview = () =>
1936
+ document.querySelector(
1937
+ '[cmdk-item][data-value="app-command:results:meeting-notes"] [data-testid="command-menu-app-command-preview"]',
1938
+ )?.textContent;
1939
+
1940
+ expect(selectedPreview()).toBe("Meeting preview");
1941
+ search("Meeting");
1942
+ expect(selectedPreview()).toBe("Meeting preview");
1943
+ });
1944
+
1945
+ it("passes app context and search to an app command row preview", () => {
1946
+ const renderPreview = vi.fn(
1947
+ ({
1948
+ search: currentSearch,
1949
+ appContext,
1950
+ }: AppCommandContext<{ workspace: string }>) => (
1951
+ <span>{`${currentSearch}|${appContext?.workspace}`}</span>
1952
+ ),
1953
+ );
1954
+ renderAppCommands({
1955
+ initialSelection: "none",
1956
+ context: { workspace: "alpha" },
1957
+ groups: [
1958
+ {
1959
+ id: "results",
1960
+ order: 1,
1961
+ commands: [
1962
+ {
1963
+ id: "workspace",
1964
+ order: 1,
1965
+ label: "Open workspace",
1966
+ inlinePreview: renderPreview,
1967
+ onSelect() {},
1968
+ },
1969
+ ],
1970
+ },
1971
+ ],
1972
+ });
1973
+
1974
+ const input = document.querySelector<HTMLInputElement>("[cmdk-input]");
1975
+ expect(input).toBeTruthy();
1976
+ const moveDown = () =>
1977
+ act(() =>
1978
+ input!.dispatchEvent(
1979
+ new KeyboardEvent("keydown", { key: "ArrowDown", bubbles: true }),
1980
+ ),
1981
+ );
1982
+ moveDown();
1983
+
1984
+ expect(renderPreview).toHaveBeenCalledWith(
1985
+ expect.objectContaining({
1986
+ search: "",
1987
+ appContext: { workspace: "alpha" },
1988
+ }),
1989
+ );
1990
+ expect(
1991
+ document.querySelector('[data-testid="command-menu-app-command-preview"]')
1992
+ ?.textContent,
1993
+ ).toBe("|alpha");
1994
+
1995
+ search("workspace");
1996
+ moveDown();
1997
+ expect(
1998
+ document.querySelector(
1999
+ '[cmdk-item][data-value="app-command:results:workspace"]',
2000
+ ),
2001
+ ).toBeTruthy();
2002
+ expect(
2003
+ document.querySelector('[data-testid="command-menu-app-command-preview"]')
2004
+ ?.textContent,
2005
+ ).toBe("workspace|alpha");
2006
+ });
2007
+
1839
2008
  it("hides the app preview when a non-app result is selected", () => {
1840
2009
  renderAppCommands({
1841
2010
  groups: [
@@ -304,6 +304,10 @@ interface AppCommandBase<TAppContext> {
304
304
  preview?:
305
305
  | ReactNode
306
306
  | ((context: AppCommandContext<TAppContext>) => ReactNode);
307
+ /** Content rendered at the end of this command's selected row. */
308
+ inlinePreview?:
309
+ | ReactNode
310
+ | ((context: AppCommandContext<TAppContext>) => ReactNode);
307
311
  visibleWhen?: (context: AppCommandContext<TAppContext>) => boolean;
308
312
  enabledWhen?: (context: AppCommandContext<TAppContext>) => boolean;
309
313
  deferSelect?: boolean;
@@ -877,9 +881,10 @@ export function CommandMenu<TAppContext = unknown>({
877
881
  firstEnabledAppCommand?.value ??
878
882
  NO_COMMAND_SELECTION)
879
883
  : undefined;
884
+ const selectedAppCommandValue = commandMenuValue ?? selectedCommandValue;
880
885
  const previewAppCommand =
881
886
  appCommandEntries.find(
882
- (entry) => entry.value === (commandMenuValue ?? selectedCommandValue),
887
+ (entry) => entry.value === selectedAppCommandValue,
883
888
  ) ?? selectedAppCommand;
884
889
  const appPreview = previewAppCommand?.command.preview;
885
890
  const renderedAppPreview =
@@ -973,6 +978,12 @@ export function CommandMenu<TAppContext = unknown>({
973
978
  {commands.map((command) => {
974
979
  const value = `app-command:${group.id}:${command.id}`;
975
980
  const enabled = command.enabledWhen?.(appCommandContext) ?? true;
981
+ const inlinePreview =
982
+ value === selectedAppCommandValue
983
+ ? typeof command.inlinePreview === "function"
984
+ ? command.inlinePreview(appCommandContext)
985
+ : command.inlinePreview
986
+ : null;
976
987
  return (
977
988
  <CommandItemPrimitive
978
989
  key={command.id}
@@ -1003,6 +1014,14 @@ export function CommandMenu<TAppContext = unknown>({
1003
1014
  {command.shortcutHint}
1004
1015
  </CommandShortcutPrimitive>
1005
1016
  ) : null}
1017
+ {inlinePreview != null ? (
1018
+ <div
1019
+ data-testid="command-menu-app-command-preview"
1020
+ className="ms-auto min-w-0"
1021
+ >
1022
+ {inlinePreview}
1023
+ </div>
1024
+ ) : null}
1006
1025
  </CommandItemPrimitive>
1007
1026
  );
1008
1027
  })}
@@ -1299,12 +1318,10 @@ export function CommandMenu<TAppContext = unknown>({
1299
1318
  onValueChange={(value) => {
1300
1319
  updateSearch(value);
1301
1320
  selectionEnabledRef.current = false;
1302
- if (initialSelection === "none") setSelectionEnabled(false);
1303
- setSelectedCommandValue(
1304
- initialSelection === "none"
1305
- ? nextEmptySelectionValue()
1306
- : "",
1307
- );
1321
+ if (initialSelection === "none") {
1322
+ setSelectionEnabled(false);
1323
+ setSelectedCommandValue(nextEmptySelectionValue());
1324
+ }
1308
1325
  }}
1309
1326
  onKeyDown={(event) => {
1310
1327
  if (
@@ -1150,6 +1150,12 @@ function MemberAutocomplete({
1150
1150
  activeIndex >= 0 && activeIndex < suggestions.length
1151
1151
  ? suggestions[activeIndex]
1152
1152
  : null;
1153
+ const listOpen =
1154
+ open &&
1155
+ (suggestions.length > 0 ||
1156
+ search.isLoading ||
1157
+ Boolean(search.error) ||
1158
+ value.trim().length > 0);
1153
1159
 
1154
1160
  useEffect(() => {
1155
1161
  setActiveIndex(-1);
@@ -1230,7 +1236,7 @@ function MemberAutocomplete({
1230
1236
  };
1231
1237
 
1232
1238
  return (
1233
- <Popover open={open} onOpenChange={onOpenChange}>
1239
+ <Popover open={listOpen} onOpenChange={onOpenChange}>
1234
1240
  <PopoverAnchor asChild>
1235
1241
  <div className="flex h-9 min-w-0 flex-1 items-center overflow-hidden rounded-md border border-input bg-card focus-within:ring-1 focus-within:ring-ring">
1236
1242
  <input
@@ -1238,8 +1244,8 @@ function MemberAutocomplete({
1238
1244
  type="text"
1239
1245
  role="combobox"
1240
1246
  aria-autocomplete="list"
1241
- aria-expanded={open}
1242
- aria-controls={open ? listboxId : undefined}
1247
+ aria-expanded={listOpen}
1248
+ aria-controls={listOpen ? listboxId : undefined}
1243
1249
  aria-activedescendant={
1244
1250
  activeIndex >= 0 ? optionId(listboxId, activeIndex) : undefined
1245
1251
  }
@@ -1361,13 +1367,9 @@ function MemberAutocomplete({
1361
1367
 
1362
1368
  {!search.isLoading && !search.error && suggestions.length === 0 ? (
1363
1369
  <div className="px-3 py-3 text-sm text-muted-foreground">
1364
- {value.trim()
1365
- ? t("agentChat.share.noMatches", {
1366
- defaultValue: "No matches.",
1367
- })
1368
- : t("agentChat.share.noPeopleFound", {
1369
- defaultValue: "No people found.",
1370
- })}
1370
+ {t("agentChat.share.noMatches", {
1371
+ defaultValue: "No matches.",
1372
+ })}
1371
1373
  </div>
1372
1374
  ) : null}
1373
1375
 
@@ -635,4 +635,55 @@ describe("ChatHistoryList", () => {
635
635
  });
636
636
  expect(container.querySelector(".an-chat-history-row__menu")).toBeNull();
637
637
  });
638
+
639
+ it("keeps a read-only row to its owner header and Copy link", async () => {
640
+ const onCopyLink = vi.fn();
641
+ const onDelete = vi.fn();
642
+ act(() => {
643
+ root.render(
644
+ <ChatHistoryList
645
+ items={[
646
+ item({
647
+ id: "shared",
648
+ readOnly: true,
649
+ ownerAvatar: <span data-testid="avatar">P</span>,
650
+ ownerLabel: "pat@example.com",
651
+ accessLabel: "Shared with your organization",
652
+ accessBasis: "organization",
653
+ }),
654
+ ]}
655
+ onSelect={() => {}}
656
+ onRename={() => {}}
657
+ onDelete={onDelete}
658
+ onTogglePin={() => {}}
659
+ onCopyLink={onCopyLink}
660
+ />,
661
+ );
662
+ });
663
+
664
+ const row = container.querySelector<HTMLElement>(".an-chat-history-row")!;
665
+ const mark = row.querySelector(".an-chat-history-row__owner-mark");
666
+ expect(mark?.getAttribute("data-access-basis")).toBe("organization");
667
+ expect(mark?.querySelector("[data-testid='avatar']")).not.toBeNull();
668
+ expect(
669
+ row.querySelector(".an-chat-history-row__topline")?.textContent,
670
+ ).toBe("sharedP");
671
+
672
+ await openMenu(
673
+ row.querySelector<HTMLButtonElement>(
674
+ ".an-chat-history-row__menu-trigger",
675
+ )!,
676
+ );
677
+ expect(
678
+ document.body.querySelector(".an-chat-history-row__menu-owner")
679
+ ?.textContent,
680
+ ).toBe("Ppat@example.comShared with your organization");
681
+ expect(getMenuItems().map((element) => element.textContent)).toEqual([
682
+ "Copy link",
683
+ ]);
684
+
685
+ act(() => getMenuItems()[0]?.click());
686
+ expect(onCopyLink).toHaveBeenCalledWith("shared");
687
+ expect(onDelete).not.toHaveBeenCalled();
688
+ });
638
689
  });