@stigmer/react 3.11.0 → 3.11.1-dev.20260812192248

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 (396) hide show
  1. package/agent-instance/AgentInstanceList.d.ts.map +1 -1
  2. package/agent-instance/AgentInstanceList.js +2 -1
  3. package/agent-instance/AgentInstanceList.js.map +1 -1
  4. package/api-key/ApiKeyListPanel.d.ts.map +1 -1
  5. package/api-key/ApiKeyListPanel.js +2 -1
  6. package/api-key/ApiKeyListPanel.js.map +1 -1
  7. package/attachment/AttachmentChipList.d.ts.map +1 -1
  8. package/attachment/AttachmentChipList.js +9 -8
  9. package/attachment/AttachmentChipList.js.map +1 -1
  10. package/attachment/AttachmentImageLightbox.d.ts.map +1 -1
  11. package/attachment/AttachmentImageLightbox.js +1 -1
  12. package/attachment/AttachmentImageLightbox.js.map +1 -1
  13. package/channel/AgentChannelsPanel.d.ts.map +1 -1
  14. package/channel/AgentChannelsPanel.js +2 -1
  15. package/channel/AgentChannelsPanel.js.map +1 -1
  16. package/channel/ChannelConversationsDialog.d.ts.map +1 -1
  17. package/channel/ChannelConversationsDialog.js +2 -1
  18. package/channel/ChannelConversationsDialog.js.map +1 -1
  19. package/channel/ChannelTemplatesDialog.d.ts.map +1 -1
  20. package/channel/ChannelTemplatesDialog.js +2 -1
  21. package/channel/ChannelTemplatesDialog.js.map +1 -1
  22. package/channel-app/internal.d.ts.map +1 -1
  23. package/channel-app/internal.js +2 -1
  24. package/channel-app/internal.js.map +1 -1
  25. package/composer/ComposerToolbar.d.ts.map +1 -1
  26. package/composer/ComposerToolbar.js +10 -7
  27. package/composer/ComposerToolbar.js.map +1 -1
  28. package/composer/ConfigureMenu.d.ts.map +1 -1
  29. package/composer/ConfigureMenu.js +2 -1
  30. package/composer/ConfigureMenu.js.map +1 -1
  31. package/composer/ContextChip.d.ts.map +1 -1
  32. package/composer/ContextChip.js +2 -1
  33. package/composer/ContextChip.js.map +1 -1
  34. package/composer/ContextPopover.d.ts.map +1 -1
  35. package/composer/ContextPopover.js +2 -1
  36. package/composer/ContextPopover.js.map +1 -1
  37. package/composer/SessionComposer.d.ts +13 -0
  38. package/composer/SessionComposer.d.ts.map +1 -1
  39. package/composer/SessionComposer.js +12 -2
  40. package/composer/SessionComposer.js.map +1 -1
  41. package/conversation/ConversationMediaAttachment.d.ts.map +1 -1
  42. package/conversation/ConversationMediaAttachment.js +2 -1
  43. package/conversation/ConversationMediaAttachment.js.map +1 -1
  44. package/conversation/ConversationTimelineView.d.ts.map +1 -1
  45. package/conversation/ConversationTimelineView.js +14 -4
  46. package/conversation/ConversationTimelineView.js.map +1 -1
  47. package/conversation/conversationPresentation.d.ts +28 -0
  48. package/conversation/conversationPresentation.d.ts.map +1 -1
  49. package/conversation/conversationPresentation.js +38 -1
  50. package/conversation/conversationPresentation.js.map +1 -1
  51. package/cursor-accounts/MemberCoverageTable.d.ts.map +1 -1
  52. package/cursor-accounts/MemberCoverageTable.js +6 -5
  53. package/cursor-accounts/MemberCoverageTable.js.map +1 -1
  54. package/dashboard/DashboardKPICards.d.ts.map +1 -1
  55. package/dashboard/DashboardKPICards.js +3 -1
  56. package/dashboard/DashboardKPICards.js.map +1 -1
  57. package/datastore/CollectionRecordsBrowser.d.ts.map +1 -1
  58. package/datastore/CollectionRecordsBrowser.js +5 -2
  59. package/datastore/CollectionRecordsBrowser.js.map +1 -1
  60. package/environment/EnvironmentVariableEditor.d.ts.map +1 -1
  61. package/environment/EnvironmentVariableEditor.js +2 -1
  62. package/environment/EnvironmentVariableEditor.js.map +1 -1
  63. package/execution/ApprovalCard.d.ts.map +1 -1
  64. package/execution/ApprovalCard.js +1 -1
  65. package/execution/ApprovalCard.js.map +1 -1
  66. package/execution/ArtifactRowView.d.ts.map +1 -1
  67. package/execution/ArtifactRowView.js +2 -1
  68. package/execution/ArtifactRowView.js.map +1 -1
  69. package/execution/FilePathLink.d.ts +4 -4
  70. package/execution/FilePathLink.d.ts.map +1 -1
  71. package/execution/FilePathLink.js +4 -4
  72. package/execution/FilePathLink.js.map +1 -1
  73. package/execution/McpToolDetail.d.ts.map +1 -1
  74. package/execution/McpToolDetail.js +2 -1
  75. package/execution/McpToolDetail.js.map +1 -1
  76. package/execution/MessageAttachments.d.ts.map +1 -1
  77. package/execution/MessageAttachments.js +10 -8
  78. package/execution/MessageAttachments.js.map +1 -1
  79. package/execution/MessageEntry.d.ts.map +1 -1
  80. package/execution/MessageEntry.js +2 -1
  81. package/execution/MessageEntry.js.map +1 -1
  82. package/execution/PlanArtifactCard.d.ts.map +1 -1
  83. package/execution/PlanArtifactCard.js +7 -4
  84. package/execution/PlanArtifactCard.js.map +1 -1
  85. package/execution/ToolCallDetail.d.ts.map +1 -1
  86. package/execution/ToolCallDetail.js +1 -1
  87. package/execution/ToolCallDetail.js.map +1 -1
  88. package/execution/ToolCallItem.d.ts.map +1 -1
  89. package/execution/ToolCallItem.js +5 -1
  90. package/execution/ToolCallItem.js.map +1 -1
  91. package/execution/WriteBackCard.d.ts.map +1 -1
  92. package/execution/WriteBackCard.js +6 -4
  93. package/execution/WriteBackCard.js.map +1 -1
  94. package/execution/artifact-row-item.d.ts +1 -1
  95. package/execution/artifact-row-item.d.ts.map +1 -1
  96. package/file-reference/FileReferenceChipList.d.ts.map +1 -1
  97. package/file-reference/FileReferenceChipList.js +6 -1
  98. package/file-reference/FileReferenceChipList.js.map +1 -1
  99. package/iam-policy/OrgMembersPanel.d.ts.map +1 -1
  100. package/iam-policy/OrgMembersPanel.js +6 -5
  101. package/iam-policy/OrgMembersPanel.js.map +1 -1
  102. package/iam-policy/ProviderBadge.d.ts.map +1 -1
  103. package/iam-policy/ProviderBadge.js +3 -2
  104. package/iam-policy/ProviderBadge.js.map +1 -1
  105. package/iam-policy/RoleSelector.d.ts.map +1 -1
  106. package/iam-policy/RoleSelector.js +1 -1
  107. package/iam-policy/RoleSelector.js.map +1 -1
  108. package/identity-provider/IdentityProviderListPanel.d.ts.map +1 -1
  109. package/identity-provider/IdentityProviderListPanel.js +2 -1
  110. package/identity-provider/IdentityProviderListPanel.js.map +1 -1
  111. package/internal/truncated-text.d.ts +17 -0
  112. package/internal/truncated-text.d.ts.map +1 -0
  113. package/internal/truncated-text.js +27 -0
  114. package/internal/truncated-text.js.map +1 -0
  115. package/invitation/InvitationManager.d.ts.map +1 -1
  116. package/invitation/InvitationManager.js +4 -3
  117. package/invitation/InvitationManager.js.map +1 -1
  118. package/library/ScopeToggle.d.ts.map +1 -1
  119. package/library/ScopeToggle.js +10 -2
  120. package/library/ScopeToggle.js.map +1 -1
  121. package/library/VisibilitySelector.d.ts.map +1 -1
  122. package/library/VisibilitySelector.js +2 -1
  123. package/library/VisibilitySelector.js.map +1 -1
  124. package/mcp-server/McpServerConfigPanel.d.ts +30 -1
  125. package/mcp-server/McpServerConfigPanel.d.ts.map +1 -1
  126. package/mcp-server/McpServerConfigPanel.js +18 -8
  127. package/mcp-server/McpServerConfigPanel.js.map +1 -1
  128. package/mcp-server/McpServerConnectDialog.d.ts +12 -1
  129. package/mcp-server/McpServerConnectDialog.d.ts.map +1 -1
  130. package/mcp-server/McpServerConnectDialog.js +8 -7
  131. package/mcp-server/McpServerConnectDialog.js.map +1 -1
  132. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  133. package/mcp-server/McpServerDetailView.js +4 -4
  134. package/mcp-server/McpServerDetailView.js.map +1 -1
  135. package/mcp-server/McpServerPicker.d.ts.map +1 -1
  136. package/mcp-server/McpServerPicker.js +86 -5
  137. package/mcp-server/McpServerPicker.js.map +1 -1
  138. package/mcp-server/McpToolSelector.d.ts.map +1 -1
  139. package/mcp-server/McpToolSelector.js +2 -1
  140. package/mcp-server/McpToolSelector.js.map +1 -1
  141. package/mcp-server/VendorApprovalBlockedNotice.d.ts +77 -0
  142. package/mcp-server/VendorApprovalBlockedNotice.d.ts.map +1 -0
  143. package/mcp-server/VendorApprovalBlockedNotice.js +62 -0
  144. package/mcp-server/VendorApprovalBlockedNotice.js.map +1 -0
  145. package/mcp-server/mcpServerSetupReducer.d.ts +18 -0
  146. package/mcp-server/mcpServerSetupReducer.d.ts.map +1 -1
  147. package/mcp-server/mcpServerSetupReducer.js +6 -0
  148. package/mcp-server/mcpServerSetupReducer.js.map +1 -1
  149. package/mcp-server/useMcpServerSetup.d.ts.map +1 -1
  150. package/mcp-server/useMcpServerSetup.js +7 -0
  151. package/mcp-server/useMcpServerSetup.js.map +1 -1
  152. package/oauth-app/OAuthAppListPanel.d.ts.map +1 -1
  153. package/oauth-app/OAuthAppListPanel.js +2 -1
  154. package/oauth-app/OAuthAppListPanel.js.map +1 -1
  155. package/package.json +4 -4
  156. package/platform-client/PlatformClientListPanel.d.ts.map +1 -1
  157. package/platform-client/PlatformClientListPanel.js +3 -2
  158. package/platform-client/PlatformClientListPanel.js.map +1 -1
  159. package/pricing-governance/BaselineEditor.d.ts.map +1 -1
  160. package/pricing-governance/BaselineEditor.js +7 -1
  161. package/pricing-governance/BaselineEditor.js.map +1 -1
  162. package/pricing-governance/ModelCatalogPanel.d.ts.map +1 -1
  163. package/pricing-governance/ModelCatalogPanel.js +2 -1
  164. package/pricing-governance/ModelCatalogPanel.js.map +1 -1
  165. package/pricing-governance/PricingGovernanceConsole.d.ts.map +1 -1
  166. package/pricing-governance/PricingGovernanceConsole.js +2 -1
  167. package/pricing-governance/PricingGovernanceConsole.js.map +1 -1
  168. package/pricing-governance/PricingGovernancePanel.d.ts.map +1 -1
  169. package/pricing-governance/PricingGovernancePanel.js +2 -1
  170. package/pricing-governance/PricingGovernancePanel.js.map +1 -1
  171. package/resource-workbench/components/StatusBadge.d.ts.map +1 -1
  172. package/resource-workbench/components/StatusBadge.js +2 -1
  173. package/resource-workbench/components/StatusBadge.js.map +1 -1
  174. package/schedule/CadenceField.d.ts.map +1 -1
  175. package/schedule/CadenceField.js +15 -8
  176. package/schedule/CadenceField.js.map +1 -1
  177. package/schedule/ScheduleRunsTable.d.ts.map +1 -1
  178. package/schedule/ScheduleRunsTable.js +3 -2
  179. package/schedule/ScheduleRunsTable.js.map +1 -1
  180. package/session/PlanEditor.d.ts.map +1 -1
  181. package/session/PlanEditor.js +3 -5
  182. package/session/PlanEditor.js.map +1 -1
  183. package/sharing/AgentShareList.d.ts.map +1 -1
  184. package/sharing/AgentShareList.js +3 -1
  185. package/sharing/AgentShareList.js.map +1 -1
  186. package/sharing/ShareAgentDialog.d.ts.map +1 -1
  187. package/sharing/ShareAgentDialog.js +2 -1
  188. package/sharing/ShareAgentDialog.js.map +1 -1
  189. package/skill/SkillDetailView.d.ts.map +1 -1
  190. package/skill/SkillDetailView.js +3 -2
  191. package/skill/SkillDetailView.js.map +1 -1
  192. package/src/__tests__/helpers/open-menu.ts +88 -0
  193. package/src/__tests__/portal-container.test.tsx +3 -3
  194. package/src/agent-instance/AgentInstanceList.tsx +5 -6
  195. package/src/agent-instance/__tests__/AgentInstanceList.test.tsx +5 -4
  196. package/src/api-key/ApiKeyListPanel.tsx +11 -3
  197. package/src/attachment/AttachmentChipList.tsx +74 -65
  198. package/src/attachment/AttachmentImageLightbox.tsx +5 -4
  199. package/src/attachment/__tests__/AttachmentChipList.test.tsx +4 -3
  200. package/src/channel/AgentChannelsPanel.tsx +5 -6
  201. package/src/channel/ChannelConversationsDialog.tsx +5 -3
  202. package/src/channel/ChannelTemplatesDialog.tsx +5 -6
  203. package/src/channel/__tests__/AgentChannelsPanel.test.tsx +14 -9
  204. package/src/channel-app/internal.tsx +5 -6
  205. package/src/composer/ComposerToolbar.tsx +122 -90
  206. package/src/composer/ConfigureMenu.tsx +33 -24
  207. package/src/composer/ContextChip.tsx +2 -3
  208. package/src/composer/ContextPopover.tsx +27 -18
  209. package/src/composer/SessionComposer.tsx +41 -9
  210. package/src/composer/__tests__/SessionComposer-agentSetupError.test.tsx +124 -0
  211. package/src/composer/__tests__/SessionComposer-lockAgent.test.tsx +4 -9
  212. package/src/conversation/ConversationMediaAttachment.tsx +2 -2
  213. package/src/conversation/ConversationTimelineView.tsx +19 -2
  214. package/src/conversation/__tests__/ConversationTimelineView.test.tsx +106 -3
  215. package/src/conversation/conversationPresentation.ts +52 -1
  216. package/src/cursor-accounts/MemberCoverageTable.tsx +15 -13
  217. package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +4 -4
  218. package/src/dashboard/DashboardKPICards.tsx +2 -1
  219. package/src/datastore/CollectionRecordsBrowser.tsx +8 -7
  220. package/src/environment/EnvironmentVariableEditor.tsx +17 -6
  221. package/src/execution/ApprovalCard.tsx +1 -3
  222. package/src/execution/ArtifactRowView.tsx +68 -48
  223. package/src/execution/FilePathLink.tsx +43 -27
  224. package/src/execution/McpToolDetail.tsx +6 -2
  225. package/src/execution/MessageAttachments.tsx +57 -41
  226. package/src/execution/MessageEntry.tsx +22 -15
  227. package/src/execution/PlanArtifactCard.tsx +25 -18
  228. package/src/execution/ToolCallDetail.tsx +1 -4
  229. package/src/execution/ToolCallItem.tsx +18 -7
  230. package/src/execution/WriteBackCard.tsx +38 -29
  231. package/src/execution/__tests__/ArtifactRow.test.tsx +6 -2
  232. package/src/execution/__tests__/ArtifactRowView.test.tsx +5 -2
  233. package/src/execution/__tests__/FilePathLink.test.tsx +10 -6
  234. package/src/execution/__tests__/FileReviewCard.test.tsx +2 -1
  235. package/src/execution/__tests__/MessageEntry-attachments.test.tsx +3 -2
  236. package/src/execution/__tests__/MessageThread.test.tsx +6 -1
  237. package/src/execution/__tests__/artifact-row-tooltips.layout.test.tsx +115 -0
  238. package/src/execution/artifact-row-item.ts +1 -1
  239. package/src/file-reference/FileReferenceChipList.tsx +29 -17
  240. package/src/file-reference/__tests__/FileReferenceChipList.test.tsx +5 -2
  241. package/src/iam-policy/OrgMembersPanel.tsx +26 -19
  242. package/src/iam-policy/ProviderBadge.tsx +17 -10
  243. package/src/iam-policy/RoleSelector.tsx +0 -1
  244. package/src/identity-provider/IdentityProviderListPanel.tsx +11 -3
  245. package/src/internal/__tests__/truncated-text.layout.test.tsx +68 -0
  246. package/src/internal/__tests__/truncated-text.test.tsx +33 -0
  247. package/src/internal/truncated-text.tsx +81 -0
  248. package/src/invitation/InvitationManager.tsx +18 -5
  249. package/src/library/ScopeToggle.tsx +14 -2
  250. package/src/library/VisibilitySelector.tsx +21 -14
  251. package/src/mcp-server/McpServerConfigPanel.tsx +79 -37
  252. package/src/mcp-server/McpServerConnectDialog.tsx +41 -5
  253. package/src/mcp-server/McpServerDetailView.tsx +23 -39
  254. package/src/mcp-server/McpServerPicker.tsx +99 -7
  255. package/src/mcp-server/McpToolSelector.tsx +12 -7
  256. package/src/mcp-server/VendorApprovalBlockedNotice.tsx +221 -0
  257. package/src/mcp-server/__tests__/McpServerPicker.test.tsx +504 -0
  258. package/src/mcp-server/__tests__/VendorApprovalBlocked.surfaces.test.tsx +321 -0
  259. package/src/mcp-server/__tests__/VendorApprovalBlockedNotice.test.tsx +154 -0
  260. package/src/mcp-server/mcpServerSetupReducer.ts +24 -0
  261. package/src/mcp-server/useMcpServerSetup.ts +9 -0
  262. package/src/oauth-app/OAuthAppListPanel.tsx +11 -3
  263. package/src/platform-client/PlatformClientListPanel.tsx +35 -18
  264. package/src/pricing-governance/BaselineEditor.tsx +20 -0
  265. package/src/pricing-governance/ModelCatalogPanel.tsx +9 -5
  266. package/src/pricing-governance/PricingGovernanceConsole.tsx +9 -5
  267. package/src/pricing-governance/PricingGovernancePanel.tsx +13 -4
  268. package/src/pricing-governance/__tests__/ModelCatalogPanel.test.tsx +37 -0
  269. package/src/resource-workbench/components/StatusBadge.tsx +7 -3
  270. package/src/schedule/CadenceField.tsx +38 -27
  271. package/src/schedule/ScheduleRunsTable.tsx +23 -11
  272. package/src/schedule/__tests__/cadence-tooltips.layout.test.tsx +86 -0
  273. package/src/session/PlanEditor.tsx +9 -8
  274. package/src/sharing/AgentShareList.tsx +28 -22
  275. package/src/sharing/ShareAgentDialog.tsx +5 -6
  276. package/src/sharing/__tests__/AgentShareList.test.tsx +4 -4
  277. package/src/skill/SkillDetailView.tsx +23 -12
  278. package/src/version-history/VersionTimelineEntry.tsx +21 -12
  279. package/src/workflow/CanvasTransitionEdge.tsx +23 -16
  280. package/src/workflow/ExecutionActiveTaskIndicator.tsx +74 -59
  281. package/src/workflow/TaskPickerPopover.tsx +0 -1
  282. package/src/workflow/WorkflowCanvasEditor.tsx +95 -64
  283. package/src/workflow/WorkflowNode.tsx +13 -6
  284. package/src/workflow/WorkflowTaskApprovalSummary.tsx +18 -11
  285. package/src/workflow/WorkflowTaskList.tsx +2 -2
  286. package/src/workflow/WorkflowVersionBadge.tsx +33 -18
  287. package/src/workflow/WorkflowVersionTimeline.tsx +7 -6
  288. package/src/workflow/__tests__/WorkflowTaskApprovalSummary.test.tsx +3 -1
  289. package/src/workflow/__tests__/structured-data-viewer.test.tsx +5 -2
  290. package/src/workflow/execution-comparison/ExecutionComparisonView.tsx +5 -3
  291. package/src/workflow/execution-comparison/TaskComparisonTable.tsx +12 -5
  292. package/src/workflow/execution-history/ExecutionHistoryTable.tsx +24 -15
  293. package/src/workflow/inspector/InspectorHeader.tsx +20 -11
  294. package/src/workflow/inspector/NestedTaskList.tsx +18 -11
  295. package/src/workflow/inspector/WorkflowSummaryPanel.tsx +5 -3
  296. package/src/workflow/inspector/tabs/BranchesTab.tsx +61 -31
  297. package/src/workflow/instance/WorkflowInstanceList.tsx +5 -6
  298. package/src/workflow/instance/__tests__/WorkflowInstanceList.test.tsx +5 -4
  299. package/src/workflow/node-shell/DiffBadge.tsx +18 -11
  300. package/src/workflow/node-shell/ExecutionBadge.tsx +73 -46
  301. package/src/workflow/node-shell/NodeActions.tsx +128 -94
  302. package/src/workflow/task-detail/StructuredDataViewer.tsx +4 -2
  303. package/src/workspace/EditorTabs.tsx +102 -85
  304. package/src/workspace/ExplorerTree.tsx +47 -30
  305. package/src/workspace/FileViewer.tsx +11 -3
  306. package/src/workspace/PanelChip.tsx +32 -23
  307. package/src/workspace/WorkspaceEditor.tsx +21 -9
  308. package/src/workspace/WorkspaceSummary.tsx +21 -12
  309. package/src/workspace/WorkspaceSurface.tsx +86 -61
  310. package/src/workspace/__tests__/EditorTabs.test.tsx +5 -2
  311. package/src/workspace/__tests__/WorkspaceSurface.test.tsx +5 -2
  312. package/version-history/VersionTimelineEntry.d.ts.map +1 -1
  313. package/version-history/VersionTimelineEntry.js +2 -1
  314. package/version-history/VersionTimelineEntry.js.map +1 -1
  315. package/workflow/CanvasTransitionEdge.d.ts.map +1 -1
  316. package/workflow/CanvasTransitionEdge.js +3 -2
  317. package/workflow/CanvasTransitionEdge.js.map +1 -1
  318. package/workflow/ExecutionActiveTaskIndicator.d.ts.map +1 -1
  319. package/workflow/ExecutionActiveTaskIndicator.js +12 -11
  320. package/workflow/ExecutionActiveTaskIndicator.js.map +1 -1
  321. package/workflow/TaskPickerPopover.js +1 -1
  322. package/workflow/TaskPickerPopover.js.map +1 -1
  323. package/workflow/WorkflowCanvasEditor.d.ts.map +1 -1
  324. package/workflow/WorkflowCanvasEditor.js +9 -2
  325. package/workflow/WorkflowCanvasEditor.js.map +1 -1
  326. package/workflow/WorkflowNode.d.ts.map +1 -1
  327. package/workflow/WorkflowNode.js +2 -1
  328. package/workflow/WorkflowNode.js.map +1 -1
  329. package/workflow/WorkflowTaskApprovalSummary.d.ts.map +1 -1
  330. package/workflow/WorkflowTaskApprovalSummary.js +6 -4
  331. package/workflow/WorkflowTaskApprovalSummary.js.map +1 -1
  332. package/workflow/WorkflowTaskList.js +2 -2
  333. package/workflow/WorkflowTaskList.js.map +1 -1
  334. package/workflow/WorkflowVersionBadge.d.ts.map +1 -1
  335. package/workflow/WorkflowVersionBadge.js +2 -1
  336. package/workflow/WorkflowVersionBadge.js.map +1 -1
  337. package/workflow/WorkflowVersionTimeline.d.ts.map +1 -1
  338. package/workflow/WorkflowVersionTimeline.js +2 -1
  339. package/workflow/WorkflowVersionTimeline.js.map +1 -1
  340. package/workflow/execution-comparison/ExecutionComparisonView.d.ts.map +1 -1
  341. package/workflow/execution-comparison/ExecutionComparisonView.js +2 -1
  342. package/workflow/execution-comparison/ExecutionComparisonView.js.map +1 -1
  343. package/workflow/execution-comparison/TaskComparisonTable.d.ts.map +1 -1
  344. package/workflow/execution-comparison/TaskComparisonTable.js +2 -1
  345. package/workflow/execution-comparison/TaskComparisonTable.js.map +1 -1
  346. package/workflow/execution-history/ExecutionHistoryTable.d.ts.map +1 -1
  347. package/workflow/execution-history/ExecutionHistoryTable.js +6 -4
  348. package/workflow/execution-history/ExecutionHistoryTable.js.map +1 -1
  349. package/workflow/inspector/InspectorHeader.d.ts.map +1 -1
  350. package/workflow/inspector/InspectorHeader.js +4 -2
  351. package/workflow/inspector/InspectorHeader.js.map +1 -1
  352. package/workflow/inspector/NestedTaskList.d.ts.map +1 -1
  353. package/workflow/inspector/NestedTaskList.js +2 -1
  354. package/workflow/inspector/NestedTaskList.js.map +1 -1
  355. package/workflow/inspector/WorkflowSummaryPanel.d.ts.map +1 -1
  356. package/workflow/inspector/WorkflowSummaryPanel.js +2 -1
  357. package/workflow/inspector/WorkflowSummaryPanel.js.map +1 -1
  358. package/workflow/inspector/tabs/BranchesTab.d.ts.map +1 -1
  359. package/workflow/inspector/tabs/BranchesTab.js +5 -2
  360. package/workflow/inspector/tabs/BranchesTab.js.map +1 -1
  361. package/workflow/instance/WorkflowInstanceList.d.ts.map +1 -1
  362. package/workflow/instance/WorkflowInstanceList.js +2 -1
  363. package/workflow/instance/WorkflowInstanceList.js.map +1 -1
  364. package/workflow/node-shell/DiffBadge.d.ts.map +1 -1
  365. package/workflow/node-shell/DiffBadge.js +3 -2
  366. package/workflow/node-shell/DiffBadge.js.map +1 -1
  367. package/workflow/node-shell/ExecutionBadge.d.ts.map +1 -1
  368. package/workflow/node-shell/ExecutionBadge.js +5 -4
  369. package/workflow/node-shell/ExecutionBadge.js.map +1 -1
  370. package/workflow/node-shell/NodeActions.d.ts.map +1 -1
  371. package/workflow/node-shell/NodeActions.js +12 -11
  372. package/workflow/node-shell/NodeActions.js.map +1 -1
  373. package/workflow/task-detail/StructuredDataViewer.d.ts.map +1 -1
  374. package/workflow/task-detail/StructuredDataViewer.js +5 -1
  375. package/workflow/task-detail/StructuredDataViewer.js.map +1 -1
  376. package/workspace/EditorTabs.d.ts.map +1 -1
  377. package/workspace/EditorTabs.js +38 -37
  378. package/workspace/EditorTabs.js.map +1 -1
  379. package/workspace/ExplorerTree.d.ts.map +1 -1
  380. package/workspace/ExplorerTree.js +2 -1
  381. package/workspace/ExplorerTree.js.map +1 -1
  382. package/workspace/FileViewer.d.ts.map +1 -1
  383. package/workspace/FileViewer.js +2 -1
  384. package/workspace/FileViewer.js.map +1 -1
  385. package/workspace/PanelChip.d.ts.map +1 -1
  386. package/workspace/PanelChip.js +2 -1
  387. package/workspace/PanelChip.js.map +1 -1
  388. package/workspace/WorkspaceEditor.d.ts.map +1 -1
  389. package/workspace/WorkspaceEditor.js +2 -1
  390. package/workspace/WorkspaceEditor.js.map +1 -1
  391. package/workspace/WorkspaceSummary.d.ts.map +1 -1
  392. package/workspace/WorkspaceSummary.js +7 -2
  393. package/workspace/WorkspaceSummary.js.map +1 -1
  394. package/workspace/WorkspaceSurface.d.ts.map +1 -1
  395. package/workspace/WorkspaceSurface.js +12 -11
  396. package/workspace/WorkspaceSurface.js.map +1 -1
@@ -1,6 +1,7 @@
1
1
  import { describe, it, expect, vi, beforeAll, afterEach } from "vitest";
2
2
  import { render, screen, fireEvent, cleanup } from "@testing-library/react";
3
3
  import { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
4
+ import { openMenu } from "../../__tests__/helpers/open-menu";
4
5
  import { AgentInstanceList } from "../AgentInstanceList";
5
6
 
6
7
  // Isolate the row-actions behavior under test from the data, environment,
@@ -79,7 +80,7 @@ describe("AgentInstanceList row actions", () => {
79
80
 
80
81
  // No always-visible action buttons; the row shows a single kebab.
81
82
  expect(screen.queryByRole("button", { name: "Start session" })).toBeNull();
82
- fireEvent.click(screen.getByRole("button", { name: /^Actions for/ }));
83
+ await openMenu(screen.getByRole("button", { name: /^Actions for/ }));
83
84
 
84
85
  expect(
85
86
  await screen.findByRole("menuitem", { name: "Start session" }),
@@ -100,7 +101,7 @@ describe("AgentInstanceList row actions", () => {
100
101
  />,
101
102
  );
102
103
 
103
- fireEvent.click(screen.getByRole("button", { name: /^Actions for/ }));
104
+ await openMenu(screen.getByRole("button", { name: /^Actions for/ }));
104
105
  fireEvent.click(await screen.findByRole("menuitem", { name: "Start session" }));
105
106
 
106
107
  expect(onStart).toHaveBeenCalledTimes(1);
@@ -120,7 +121,7 @@ describe("AgentInstanceList row actions", () => {
120
121
  />,
121
122
  );
122
123
 
123
- fireEvent.click(screen.getByRole("button", { name: /^Actions for/ }));
124
+ await openMenu(screen.getByRole("button", { name: /^Actions for/ }));
124
125
  fireEvent.click(await screen.findByRole("menuitem", { name: "Delete" }));
125
126
 
126
127
  expect(onDelete).toHaveBeenCalledWith(inst);
@@ -138,7 +139,7 @@ describe("AgentInstanceList row actions", () => {
138
139
  />,
139
140
  );
140
141
 
141
- fireEvent.click(screen.getByRole("button", { name: /^Actions for/ }));
142
+ await openMenu(screen.getByRole("button", { name: /^Actions for/ }));
142
143
  expect(
143
144
  await screen.findByRole("menuitem", { name: "Start session" }),
144
145
  ).toBeTruthy();
@@ -5,6 +5,7 @@ import { cn } from "@stigmer/theme";
5
5
  import { getUserMessage } from "@stigmer/sdk";
6
6
  import { timestampDate } from "@bufbuild/protobuf/wkt";
7
7
  import type { ApiKey } from "@stigmer/protos/ai/stigmer/iam/apikey/v1/api_pb";
8
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
8
9
  import { useApiKeyList } from "./useApiKeyList.js";
9
10
  import { useDeleteApiKey } from "./useDeleteApiKey.js";
10
11
 
@@ -242,9 +243,16 @@ function ApiKeyRow({
242
243
  {/* Metadata columns */}
243
244
  <div className="stg:hidden stg:sm:flex stg:shrink-0 stg:items-center stg:gap-4 stg:text-xs stg:text-muted-foreground">
244
245
  {createdAt && (
245
- <span title={`Created ${timestampDate(createdAt).toISOString()}`}>
246
- {formatShortDate(timestampDate(createdAt))}
247
- </span>
246
+ <Tooltip>
247
+ <TooltipTrigger
248
+ render={<time dateTime={timestampDate(createdAt).toISOString()} />}
249
+ >
250
+ {formatShortDate(timestampDate(createdAt))}
251
+ </TooltipTrigger>
252
+ <TooltipContent side="top">
253
+ {`Created ${timestampDate(createdAt).toISOString()}`}
254
+ </TooltipContent>
255
+ </Tooltip>
248
256
  )}
249
257
  <span>
250
258
  {neverExpires
@@ -7,6 +7,7 @@ import { formatFileSize } from "./attachment-utils.js";
7
7
  import { useObjectUrl } from "./useObjectUrl.js";
8
8
  import { AttachmentImageLightbox } from "./AttachmentImageLightbox.js";
9
9
  import { UNSTYLED_BUTTON } from "../internal/form-primitives.js";
10
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
10
11
 
11
12
  /** Props for {@link AttachmentChipList}. */
12
13
  export interface AttachmentChipListProps {
@@ -216,84 +217,92 @@ function ImageAttachmentChip({
216
217
  return (
217
218
  // The remove badge and retry pill are SIBLINGS of the preview button,
218
219
  // absolutely positioned over it — buttons cannot nest inside buttons.
219
- <span
220
- role="listitem"
221
- aria-label={chipAriaLabel(entry)}
222
- title={entry.file.name}
223
- className="stg:relative stg:inline-flex"
224
- >
225
- {/* The whole tile is the preview target. Preview stays enabled while
226
- `disabled` (that prop gates the mutating remove/retry actions) and
227
- in every phase: the object URL wraps in-memory bytes, no fetch.
228
- UNSTYLED_BUTTON adds the pointer cursor — the image tile carries
229
- no other clickability cue. */}
230
- <button
231
- type="button"
232
- onClick={onPreview}
233
- aria-label={`Preview ${entry.file.name}`}
234
- className={cn(
235
- UNSTYLED_BUTTON,
236
- "stg:relative stg:block stg:h-14 stg:w-14 stg:overflow-hidden stg:rounded-md stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring",
237
- isError && "stg:ring-1 stg:ring-destructive",
238
- )}
220
+ <Tooltip>
221
+ <TooltipTrigger
222
+ render={
223
+ <span
224
+ role="listitem"
225
+ aria-label={chipAriaLabel(entry)}
226
+ className="stg:relative stg:inline-flex"
227
+ />
228
+ }
239
229
  >
240
- {url ? (
241
- <img
242
- src={url}
243
- alt=""
244
- aria-hidden="true"
245
- onError={() => setLoadFailed(true)}
230
+ {/* The whole tile is the preview target. Preview stays enabled while
231
+ `disabled` (that prop gates the mutating remove/retry actions) and
232
+ in every phase: the object URL wraps in-memory bytes, no fetch.
233
+ UNSTYLED_BUTTON adds the pointer cursor — the image tile carries
234
+ no other clickability cue. */}
235
+ <button
236
+ type="button"
237
+ onClick={onPreview}
238
+ aria-label={`Preview ${entry.file.name}`}
239
+ className={cn(
240
+ UNSTYLED_BUTTON,
241
+ "stg:relative stg:block stg:h-14 stg:w-14 stg:overflow-hidden stg:rounded-md stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring",
242
+ isError && "stg:ring-1 stg:ring-destructive",
243
+ )}
244
+ >
245
+ {url ? (
246
+ <img
247
+ src={url}
248
+ alt=""
249
+ aria-hidden="true"
250
+ onError={() => setLoadFailed(true)}
251
+ className={cn(
252
+ "stg:h-full stg:w-full stg:object-cover",
253
+ (isUploading || isError) && "stg:opacity-50",
254
+ )}
255
+ />
256
+ ) : (
257
+ // One-frame placeholder until the object-URL effect runs; same
258
+ // footprint as the image, so no layout shift.
259
+ <span
260
+ className="stg:block stg:h-full stg:w-full stg:animate-pulse stg:bg-muted"
261
+ aria-hidden="true"
262
+ />
263
+ )}
264
+ {isUploading && (
265
+ <span className="stg:absolute stg:inset-0 stg:flex stg:items-center stg:justify-center">
266
+ <ChipSpinner size={16} />
267
+ </span>
268
+ )}
269
+ </button>
270
+
271
+ {isError && (
272
+ <button
273
+ type="button"
274
+ onClick={onRetry}
275
+ disabled={disabled}
276
+ aria-label={`Retry uploading ${entry.file.name}`}
246
277
  className={cn(
247
- "stg:h-full stg:w-full stg:object-cover",
248
- (isUploading || isError) && "stg:opacity-50",
278
+ UNSTYLED_BUTTON,
279
+ "stg:absolute stg:left-1/2 stg:top-1/2 stg:-translate-x-1/2 stg:-translate-y-1/2 stg:rounded-full stg:bg-destructive stg:px-1.5 stg:py-0.5 stg:text-[0.6rem] stg:font-medium stg:leading-none stg:text-destructive-foreground stg:shadow-sm stg:hover:bg-destructive-hover stg:disabled:pointer-events-none",
249
280
  )}
250
- />
251
- ) : (
252
- // One-frame placeholder until the object-URL effect runs; same
253
- // footprint as the image, so no layout shift.
254
- <span
255
- className="stg:block stg:h-full stg:w-full stg:animate-pulse stg:bg-muted"
256
- aria-hidden="true"
257
- />
281
+ >
282
+ Retry
283
+ </button>
258
284
  )}
259
- {isUploading && (
260
- <span className="stg:absolute stg:inset-0 stg:flex stg:items-center stg:justify-center">
261
- <ChipSpinner size={16} />
262
- </span>
263
- )}
264
- </button>
265
285
 
266
- {isError && (
267
286
  <button
268
287
  type="button"
269
- onClick={onRetry}
288
+ onClick={onRemove}
270
289
  disabled={disabled}
271
- aria-label={`Retry uploading ${entry.file.name}`}
290
+ aria-label={`Remove ${entry.file.name}`}
272
291
  className={cn(
273
292
  UNSTYLED_BUTTON,
274
- "stg:absolute stg:left-1/2 stg:top-1/2 stg:-translate-x-1/2 stg:-translate-y-1/2 stg:rounded-full stg:bg-destructive stg:px-1.5 stg:py-0.5 stg:text-[0.6rem] stg:font-medium stg:leading-none stg:text-destructive-foreground stg:shadow-sm stg:hover:bg-destructive-hover stg:disabled:pointer-events-none",
293
+ // The established corner-badge geometry (ContextPopover,
294
+ // ComposerToolbar). Solid bg + border keep it legible over any
295
+ // image without opacity-modified tokens (Dont-Do #4).
296
+ "stg:absolute stg:-right-1.5 stg:-top-1.5 stg:flex stg:h-4 stg:w-4 stg:items-center stg:justify-center stg:rounded-full stg:border stg:border-border stg:bg-background stg:text-muted-foreground stg:shadow-sm stg:hover:text-destructive stg:disabled:pointer-events-none",
275
297
  )}
276
298
  >
277
- Retry
299
+ <XIcon />
278
300
  </button>
279
- )}
280
-
281
- <button
282
- type="button"
283
- onClick={onRemove}
284
- disabled={disabled}
285
- aria-label={`Remove ${entry.file.name}`}
286
- className={cn(
287
- UNSTYLED_BUTTON,
288
- // The established corner-badge geometry (ContextPopover,
289
- // ComposerToolbar). Solid bg + border keep it legible over any
290
- // image without opacity-modified tokens (Dont-Do #4).
291
- "stg:absolute stg:-right-1.5 stg:-top-1.5 stg:flex stg:h-4 stg:w-4 stg:items-center stg:justify-center stg:rounded-full stg:border stg:border-border stg:bg-background stg:text-muted-foreground stg:shadow-sm stg:hover:text-destructive stg:disabled:pointer-events-none",
292
- )}
293
- >
294
- <XIcon />
295
- </button>
296
- </span>
301
+ </TooltipTrigger>
302
+ <TooltipContent side="top" className="stg:break-all">
303
+ {entry.file.name}
304
+ </TooltipContent>
305
+ </Tooltip>
297
306
  );
298
307
  }
299
308
 
@@ -95,10 +95,11 @@ export function AttachmentImageLightbox({
95
95
  {open && (
96
96
  <div className="stg:flex stg:flex-col">
97
97
  <div className="stg:flex stg:items-center stg:gap-2 stg:px-3 stg:py-2">
98
- <span
99
- className="stg:min-w-0 stg:flex-1 stg:truncate stg:text-xs stg:font-semibold stg:text-foreground"
100
- title={filename}
101
- >
98
+ {/* No tooltip here: the house tooltip portals OUTSIDE this native
99
+ showModal() dialog, where the top layer covers it and `inert`
100
+ disables it. The old title only restated the visible filename
101
+ (also the image's alt), so it is dropped rather than replaced. */}
102
+ <span className="stg:min-w-0 stg:flex-1 stg:truncate stg:text-xs stg:font-semibold stg:text-foreground">
102
103
  {filename}
103
104
  </span>
104
105
  <button
@@ -106,11 +106,12 @@ describe("AttachmentChipList — image miniature", () => {
106
106
 
107
107
  await waitFor(() => expect(chipImage(container)).toBeTruthy());
108
108
 
109
- // The tile is the chip — the name lives in the tooltip and accessible
110
- // label, never as a text node (file chips, by contrast, keep theirs).
109
+ // The tile is the chip — the name lives in the house tooltip and
110
+ // accessible label, never as a text node (file chips, by contrast,
111
+ // keep theirs) and never a native title (banned, stigmer-cloud#268).
111
112
  expect(screen.queryByText("shot.png")).toBeNull();
112
113
  const tile = screen.getByRole("listitem", { name: /^shot\.png/ });
113
- expect(tile.getAttribute("title")).toBe("shot.png");
114
+ expect(tile.getAttribute("title")).toBeNull();
114
115
  // Remove is an always-visible corner badge, not hover-revealed.
115
116
  expect(screen.getByRole("button", { name: "Remove shot.png" })).toBeTruthy();
116
117
  });
@@ -22,6 +22,7 @@ import { useConfirmAction } from "../resource-detail/useConfirmAction.js";
22
22
  import { EditResourceYamlDialog } from "../manifest/EditResourceYamlDialog.js";
23
23
  import { useDeploymentMode } from "../deployment-mode.js";
24
24
  import { CloudFeatureNotice } from "../internal/CloudFeatureNotice.js";
25
+ import { TruncatedText } from "../internal/truncated-text.js";
25
26
  import { ChannelConversationsDialog } from "./ChannelConversationsDialog.js";
26
27
  import { ChannelCredentialsDialog } from "./ChannelCredentialsDialog.js";
27
28
  import { ChannelTemplatesDialog } from "./ChannelTemplatesDialog.js";
@@ -510,12 +511,10 @@ function ChannelCard({
510
511
  <provider.Icon className="stg:size-5 stg:shrink-0 stg:text-foreground" />
511
512
  <div className="stg:min-w-0">
512
513
  <div className="stg:flex stg:items-center stg:gap-2">
513
- <span
514
- className="stg:truncate stg:text-sm stg:font-medium stg:text-foreground"
515
- title={meta?.name || meta?.slug || undefined}
516
- >
517
- {meta?.name || meta?.slug || "\u2014"}
518
- </span>
514
+ <TruncatedText
515
+ text={meta?.name || meta?.slug || "\u2014"}
516
+ className="stg:text-sm stg:font-medium stg:text-foreground"
517
+ />
519
518
  <InstallStatePill state={installState} />
520
519
  </div>
521
520
  <p className="stg:mt-0.5 stg:text-xs stg:text-muted-foreground">
@@ -10,6 +10,7 @@ import type { Session } from "@stigmer/protos/ai/stigmer/agentic/session/v1/api_
10
10
  import { formatRelativeTime } from "../activity/format-relative-time.js";
11
11
  import { Button } from "../button/Button.js";
12
12
  import { EmptyState } from "../empty-state/EmptyState.js";
13
+ import { TruncatedText } from "../internal/truncated-text.js";
13
14
  import { channelSessionExternalUserKey } from "../session/channelOrigin.js";
14
15
  import { useChannelSessions } from "./useChannelSessions.js";
15
16
 
@@ -200,9 +201,10 @@ function ConversationRow({
200
201
  const content = (
201
202
  <>
202
203
  <div className="stg:min-w-0 stg:flex-1">
203
- <p className="stg:truncate stg:text-sm stg:text-foreground" title={subject}>
204
- {subject}
205
- </p>
204
+ <TruncatedText
205
+ text={subject}
206
+ className="stg:block stg:text-sm stg:text-foreground"
207
+ />
206
208
  {externalUser && (
207
209
  <p className="stg:mt-0.5 stg:flex stg:items-center stg:gap-1 stg:text-xs stg:text-muted-foreground">
208
210
  <User aria-hidden="true" className="stg:size-3" />
@@ -9,6 +9,7 @@ import type { ChannelTemplate } from "@stigmer/protos/ai/stigmer/agentic/agentch
9
9
  import { Button } from "../button/Button.js";
10
10
  import { EmptyState } from "../empty-state/EmptyState.js";
11
11
  import { CloudFeatureNotice } from "../internal/CloudFeatureNotice.js";
12
+ import { TruncatedText } from "../internal/truncated-text.js";
12
13
  import { StatusBadge } from "../resource-workbench/components/StatusBadge.js";
13
14
  import {
14
15
  channelPresentationOf,
@@ -332,12 +333,10 @@ function TemplateRow({ template }: { readonly template: ChannelTemplate }) {
332
333
  <li className="stg:rounded-lg stg:border stg:border-border stg:p-3">
333
334
  <div className="stg:flex stg:items-start stg:justify-between stg:gap-3">
334
335
  <div className="stg:flex stg:min-w-0 stg:flex-wrap stg:items-center stg:gap-x-2 stg:gap-y-1">
335
- <span
336
- className="stg:truncate stg:text-sm stg:font-medium stg:text-foreground"
337
- title={template.name}
338
- >
339
- {template.name}
340
- </span>
336
+ <TruncatedText
337
+ text={template.name}
338
+ className="stg:text-sm stg:font-medium stg:text-foreground"
339
+ />
341
340
  {/* (name, language) is the template's identity — each
342
341
  language is approved independently, so it always shows. */}
343
342
  <span className="stg:shrink-0 stg:text-xs stg:text-muted-foreground">
@@ -5,6 +5,7 @@ import type { AgentChannelInput } from "@stigmer/sdk";
5
5
  import { StigmerContext } from "../../context";
6
6
  import { FetchCacheContext } from "../../internal/FetchCacheProvider";
7
7
  import { DeploymentModeContext } from "../../deployment-mode";
8
+ import { openMenu } from "../../__tests__/helpers/open-menu";
8
9
  import { AgentChannelsPanel } from "../AgentChannelsPanel";
9
10
 
10
11
  // Toasts are visual feedback owned by the feedback module; keep them inert.
@@ -272,7 +273,7 @@ describe("AgentChannelsPanel", () => {
272
273
  );
273
274
 
274
275
  await waitFor(() => expect(screen.getByText("Support Slack")).toBeTruthy());
275
- fireEvent.click(screen.getByRole("button", { name: /actions for/i }));
276
+ await openMenu(screen.getByRole("button", { name: /actions for/i }));
276
277
  fireEvent.click(await screen.findByRole("menuitem", { name: "Disconnect" }));
277
278
 
278
279
  // The confirmation explains teardown vs pause before anything happens.
@@ -409,14 +410,18 @@ describe("AgentChannelsPanel", () => {
409
410
  await waitFor(() => expect(screen.getByText("Support Slack")).toBeTruthy());
410
411
  await waitFor(() => expect(checkMyPermission).toHaveBeenCalled());
411
412
 
412
- expect(screen.queryByRole("switch")).toBeNull();
413
+ // The panel renders mutation affordances optimistic-visible and hides
414
+ // them when the denial lands. "Mock was called" precedes "denial
415
+ // rendered", so wait for the state this test is actually about instead
416
+ // of racing the re-render (flaked under CPU contention, ~1/20).
417
+ await waitFor(() => expect(screen.queryByRole("switch")).toBeNull());
413
418
  expect(screen.queryByRole("button", { name: /connect to slack/i })).toBeNull();
414
419
 
415
420
  // The card menu still renders: Sessions is a viewer-level action
416
421
  // (everyone who sees the card holds can_view on the channel — the same
417
422
  // bar as viewing its sessions, DD-012). Mutation items stay
418
423
  // permission-gated and absent.
419
- fireEvent.click(screen.getByRole("button", { name: /actions for/i }));
424
+ await openMenu(screen.getByRole("button", { name: /actions for/i }));
420
425
  // The awaited query anchors on the portaled menu's mount (#323) — only
421
426
  // then are the absence assertions below meaningful rather than vacuous.
422
427
  expect(await screen.findByRole("menuitem", { name: /sessions/i })).toBeTruthy();
@@ -441,7 +446,7 @@ describe("AgentChannelsPanel", () => {
441
446
  );
442
447
  await waitFor(() => expect(screen.getByText("Support Slack")).toBeTruthy());
443
448
 
444
- fireEvent.click(screen.getByRole("button", { name: /actions for/i }));
449
+ await openMenu(screen.getByRole("button", { name: /actions for/i }));
445
450
  fireEvent.click(await screen.findByRole("menuitem", { name: /manage access/i }));
446
451
 
447
452
  // The one canonical dialog opens, and its subtitle names the channel
@@ -501,7 +506,7 @@ describe("AgentChannelsPanel", () => {
501
506
  );
502
507
 
503
508
  await waitFor(() => expect(screen.getByText("Support Slack")).toBeTruthy());
504
- fireEvent.click(screen.getByRole("button", { name: /actions for/i }));
509
+ await openMenu(screen.getByRole("button", { name: /actions for/i }));
505
510
  fireEvent.click(
506
511
  await screen.findByRole("menuitem", { name: "Tool credentials" }),
507
512
  );
@@ -629,7 +634,7 @@ describe("AgentChannelsPanel", () => {
629
634
  await waitFor(() =>
630
635
  expect(screen.getByText("Support WhatsApp")).toBeTruthy(),
631
636
  );
632
- fireEvent.click(screen.getByRole("button", { name: /actions for/i }));
637
+ await openMenu(screen.getByRole("button", { name: /actions for/i }));
633
638
  fireEvent.click(await screen.findByRole("menuitem", { name: "Disconnect" }));
634
639
 
635
640
  // WhatsApp credentials live on the shared ChannelApp and survive the
@@ -652,7 +657,7 @@ describe("AgentChannelsPanel", () => {
652
657
  await waitFor(() =>
653
658
  expect(screen.getByText("Support WhatsApp")).toBeTruthy(),
654
659
  );
655
- fireEvent.click(screen.getByRole("button", { name: /actions for/i }));
660
+ await openMenu(screen.getByRole("button", { name: /actions for/i }));
656
661
  fireEvent.click(await screen.findByRole("menuitem", { name: "Templates" }));
657
662
 
658
663
  expect(
@@ -676,7 +681,7 @@ describe("AgentChannelsPanel", () => {
676
681
  );
677
682
 
678
683
  await waitFor(() => expect(screen.getByText("Support Slack")).toBeTruthy());
679
- fireEvent.click(screen.getByRole("button", { name: /actions for/i }));
684
+ await openMenu(screen.getByRole("button", { name: /actions for/i }));
680
685
 
681
686
  // Slack has no template concept: hidden, not disabled — a disabled
682
687
  // item would imply the capability might one day exist there.
@@ -704,7 +709,7 @@ describe("AgentChannelsPanel", () => {
704
709
  expect(screen.getByText("Support WhatsApp")).toBeTruthy(),
705
710
  );
706
711
  await waitFor(() => expect(checkMyPermission).toHaveBeenCalled());
707
- fireEvent.click(screen.getByRole("button", { name: /actions for/i }));
712
+ await openMenu(screen.getByRole("button", { name: /actions for/i }));
708
713
 
709
714
  expect(
710
715
  await screen.findByRole("menuitem", { name: /sessions/i }),
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { useCallback, useState } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
+ import { TruncatedText } from "../internal/truncated-text.js";
5
6
 
6
7
  /**
7
8
  * Internal building blocks shared by the channel-app forms and panels.
@@ -74,15 +75,13 @@ export function CopyRow({
74
75
  <div className="stg:space-y-1">
75
76
  <p className="stg:text-xs stg:font-medium stg:text-foreground">{label}</p>
76
77
  <div className="stg:flex stg:items-center stg:gap-1.5">
77
- <code
78
+ <TruncatedText
79
+ text={value}
78
80
  className={cn(
79
- "stg:min-w-0 stg:flex-1 stg:truncate stg:rounded-md stg:border stg:border-border stg:bg-muted-subtle",
81
+ "stg:min-w-0 stg:flex-1 stg:rounded-md stg:border stg:border-border stg:bg-muted-subtle",
80
82
  "stg:px-2 stg:py-1.5 stg:font-mono stg:text-[0.65rem] stg:text-foreground",
81
83
  )}
82
- title={value}
83
- >
84
- {value}
85
- </code>
84
+ />
86
85
  <CopyButton copied={copied} onCopy={copy} copyTargetId={copyTargetId} />
87
86
  </div>
88
87
  </div>