@stigmer/react 3.11.0 → 3.12.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 (559) hide show
  1. package/activity/useRecentActivity.d.ts +3 -2
  2. package/activity/useRecentActivity.d.ts.map +1 -1
  3. package/activity/useRecentActivity.js +3 -2
  4. package/activity/useRecentActivity.js.map +1 -1
  5. package/agent/AgentDetailView.d.ts +2 -12
  6. package/agent/AgentDetailView.d.ts.map +1 -1
  7. package/agent/AgentDetailView.js +10 -42
  8. package/agent/AgentDetailView.js.map +1 -1
  9. package/agent/internal/agentToInput.d.ts.map +1 -1
  10. package/agent/internal/agentToInput.js +0 -8
  11. package/agent/internal/agentToInput.js.map +1 -1
  12. package/agent-instance/AgentInstanceList.d.ts.map +1 -1
  13. package/agent-instance/AgentInstanceList.js +2 -1
  14. package/agent-instance/AgentInstanceList.js.map +1 -1
  15. package/api-key/ApiKeyListPanel.d.ts.map +1 -1
  16. package/api-key/ApiKeyListPanel.js +2 -1
  17. package/api-key/ApiKeyListPanel.js.map +1 -1
  18. package/attachment/AttachmentChipList.d.ts.map +1 -1
  19. package/attachment/AttachmentChipList.js +9 -8
  20. package/attachment/AttachmentChipList.js.map +1 -1
  21. package/attachment/AttachmentImageLightbox.d.ts.map +1 -1
  22. package/attachment/AttachmentImageLightbox.js +1 -1
  23. package/attachment/AttachmentImageLightbox.js.map +1 -1
  24. package/channel/AgentChannelsPanel.d.ts.map +1 -1
  25. package/channel/AgentChannelsPanel.js +2 -1
  26. package/channel/AgentChannelsPanel.js.map +1 -1
  27. package/channel/ChannelConversationsDialog.d.ts.map +1 -1
  28. package/channel/ChannelConversationsDialog.js +2 -1
  29. package/channel/ChannelConversationsDialog.js.map +1 -1
  30. package/channel/ChannelTemplatesDialog.d.ts.map +1 -1
  31. package/channel/ChannelTemplatesDialog.js +2 -1
  32. package/channel/ChannelTemplatesDialog.js.map +1 -1
  33. package/channel-app/internal.d.ts.map +1 -1
  34. package/channel-app/internal.js +2 -1
  35. package/channel-app/internal.js.map +1 -1
  36. package/composer/ComposerToolbar.d.ts.map +1 -1
  37. package/composer/ComposerToolbar.js +10 -7
  38. package/composer/ComposerToolbar.js.map +1 -1
  39. package/composer/ConfigureMenu.d.ts.map +1 -1
  40. package/composer/ConfigureMenu.js +2 -1
  41. package/composer/ConfigureMenu.js.map +1 -1
  42. package/composer/ContextChip.d.ts.map +1 -1
  43. package/composer/ContextChip.js +2 -1
  44. package/composer/ContextChip.js.map +1 -1
  45. package/composer/ContextPopover.d.ts.map +1 -1
  46. package/composer/ContextPopover.js +2 -1
  47. package/composer/ContextPopover.js.map +1 -1
  48. package/composer/SessionComposer.d.ts +13 -0
  49. package/composer/SessionComposer.d.ts.map +1 -1
  50. package/composer/SessionComposer.js +12 -2
  51. package/composer/SessionComposer.js.map +1 -1
  52. package/conversation/ConversationMediaAttachment.d.ts.map +1 -1
  53. package/conversation/ConversationMediaAttachment.js +2 -1
  54. package/conversation/ConversationMediaAttachment.js.map +1 -1
  55. package/conversation/ConversationTimelineView.d.ts.map +1 -1
  56. package/conversation/ConversationTimelineView.js +14 -4
  57. package/conversation/ConversationTimelineView.js.map +1 -1
  58. package/conversation/conversationPresentation.d.ts +28 -0
  59. package/conversation/conversationPresentation.d.ts.map +1 -1
  60. package/conversation/conversationPresentation.js +38 -1
  61. package/conversation/conversationPresentation.js.map +1 -1
  62. package/cursor-accounts/MemberCoverageTable.d.ts.map +1 -1
  63. package/cursor-accounts/MemberCoverageTable.js +6 -5
  64. package/cursor-accounts/MemberCoverageTable.js.map +1 -1
  65. package/dashboard/DashboardKPICards.d.ts.map +1 -1
  66. package/dashboard/DashboardKPICards.js +3 -1
  67. package/dashboard/DashboardKPICards.js.map +1 -1
  68. package/dependency-graph/DependencyTreeNode.d.ts.map +1 -1
  69. package/dependency-graph/DependencyTreeNode.js +1 -7
  70. package/dependency-graph/DependencyTreeNode.js.map +1 -1
  71. package/dependency-graph/types.d.ts +8 -20
  72. package/dependency-graph/types.d.ts.map +1 -1
  73. package/dependency-graph/useDependencyGraph.d.ts.map +1 -1
  74. package/dependency-graph/useDependencyGraph.js +2 -20
  75. package/dependency-graph/useDependencyGraph.js.map +1 -1
  76. package/environment/EnvironmentVariableEditor.d.ts.map +1 -1
  77. package/environment/EnvironmentVariableEditor.js +2 -1
  78. package/environment/EnvironmentVariableEditor.js.map +1 -1
  79. package/execution/ApprovalCard.d.ts.map +1 -1
  80. package/execution/ApprovalCard.js +1 -1
  81. package/execution/ApprovalCard.js.map +1 -1
  82. package/execution/ArtifactRowView.d.ts.map +1 -1
  83. package/execution/ArtifactRowView.js +2 -1
  84. package/execution/ArtifactRowView.js.map +1 -1
  85. package/execution/FilePathLink.d.ts +4 -4
  86. package/execution/FilePathLink.d.ts.map +1 -1
  87. package/execution/FilePathLink.js +4 -4
  88. package/execution/FilePathLink.js.map +1 -1
  89. package/execution/McpToolDetail.d.ts.map +1 -1
  90. package/execution/McpToolDetail.js +2 -1
  91. package/execution/McpToolDetail.js.map +1 -1
  92. package/execution/MessageAttachments.d.ts.map +1 -1
  93. package/execution/MessageAttachments.js +10 -8
  94. package/execution/MessageAttachments.js.map +1 -1
  95. package/execution/MessageEntry.d.ts.map +1 -1
  96. package/execution/MessageEntry.js +2 -1
  97. package/execution/MessageEntry.js.map +1 -1
  98. package/execution/PlanArtifactCard.d.ts.map +1 -1
  99. package/execution/PlanArtifactCard.js +7 -4
  100. package/execution/PlanArtifactCard.js.map +1 -1
  101. package/execution/ToolCallDetail.d.ts.map +1 -1
  102. package/execution/ToolCallDetail.js +1 -1
  103. package/execution/ToolCallDetail.js.map +1 -1
  104. package/execution/ToolCallItem.d.ts.map +1 -1
  105. package/execution/ToolCallItem.js +5 -1
  106. package/execution/ToolCallItem.js.map +1 -1
  107. package/execution/WriteBackCard.d.ts.map +1 -1
  108. package/execution/WriteBackCard.js +6 -4
  109. package/execution/WriteBackCard.js.map +1 -1
  110. package/execution/artifact-row-item.d.ts +1 -1
  111. package/execution/artifact-row-item.d.ts.map +1 -1
  112. package/file-reference/FileReferenceChipList.d.ts.map +1 -1
  113. package/file-reference/FileReferenceChipList.js +6 -1
  114. package/file-reference/FileReferenceChipList.js.map +1 -1
  115. package/iam-policy/OrgMembersPanel.d.ts.map +1 -1
  116. package/iam-policy/OrgMembersPanel.js +6 -5
  117. package/iam-policy/OrgMembersPanel.js.map +1 -1
  118. package/iam-policy/ProviderBadge.d.ts.map +1 -1
  119. package/iam-policy/ProviderBadge.js +3 -2
  120. package/iam-policy/ProviderBadge.js.map +1 -1
  121. package/iam-policy/RoleSelector.d.ts.map +1 -1
  122. package/iam-policy/RoleSelector.js +1 -1
  123. package/iam-policy/RoleSelector.js.map +1 -1
  124. package/identity-provider/IdentityProviderListPanel.d.ts.map +1 -1
  125. package/identity-provider/IdentityProviderListPanel.js +2 -1
  126. package/identity-provider/IdentityProviderListPanel.js.map +1 -1
  127. package/index.d.ts +0 -2
  128. package/index.d.ts.map +1 -1
  129. package/index.js +0 -6
  130. package/index.js.map +1 -1
  131. package/internal/truncated-text.d.ts +17 -0
  132. package/internal/truncated-text.d.ts.map +1 -0
  133. package/internal/truncated-text.js +27 -0
  134. package/internal/truncated-text.js.map +1 -0
  135. package/invitation/InvitationManager.d.ts.map +1 -1
  136. package/invitation/InvitationManager.js +4 -3
  137. package/invitation/InvitationManager.js.map +1 -1
  138. package/library/ScopeToggle.d.ts.map +1 -1
  139. package/library/ScopeToggle.js +10 -2
  140. package/library/ScopeToggle.js.map +1 -1
  141. package/library/VisibilitySelector.d.ts.map +1 -1
  142. package/library/VisibilitySelector.js +2 -1
  143. package/library/VisibilitySelector.js.map +1 -1
  144. package/library/useExportResource.d.ts +3 -4
  145. package/library/useExportResource.d.ts.map +1 -1
  146. package/library/useExportResource.js +1 -1
  147. package/library/useExportResource.js.map +1 -1
  148. package/manifest/EditResourceYamlDialog.d.ts.map +1 -1
  149. package/manifest/EditResourceYamlDialog.js.map +1 -1
  150. package/mcp-server/McpServerConfigPanel.d.ts +30 -1
  151. package/mcp-server/McpServerConfigPanel.d.ts.map +1 -1
  152. package/mcp-server/McpServerConfigPanel.js +18 -8
  153. package/mcp-server/McpServerConfigPanel.js.map +1 -1
  154. package/mcp-server/McpServerConnectDialog.d.ts +12 -1
  155. package/mcp-server/McpServerConnectDialog.d.ts.map +1 -1
  156. package/mcp-server/McpServerConnectDialog.js +8 -7
  157. package/mcp-server/McpServerConnectDialog.js.map +1 -1
  158. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  159. package/mcp-server/McpServerDetailView.js +4 -4
  160. package/mcp-server/McpServerDetailView.js.map +1 -1
  161. package/mcp-server/McpServerPicker.d.ts.map +1 -1
  162. package/mcp-server/McpServerPicker.js +86 -5
  163. package/mcp-server/McpServerPicker.js.map +1 -1
  164. package/mcp-server/McpToolSelector.d.ts.map +1 -1
  165. package/mcp-server/McpToolSelector.js +2 -1
  166. package/mcp-server/McpToolSelector.js.map +1 -1
  167. package/mcp-server/VendorApprovalBlockedNotice.d.ts +77 -0
  168. package/mcp-server/VendorApprovalBlockedNotice.d.ts.map +1 -0
  169. package/mcp-server/VendorApprovalBlockedNotice.js +62 -0
  170. package/mcp-server/VendorApprovalBlockedNotice.js.map +1 -0
  171. package/mcp-server/mcpServerSetupReducer.d.ts +18 -0
  172. package/mcp-server/mcpServerSetupReducer.d.ts.map +1 -1
  173. package/mcp-server/mcpServerSetupReducer.js +6 -0
  174. package/mcp-server/mcpServerSetupReducer.js.map +1 -1
  175. package/mcp-server/useMcpServerSetup.d.ts.map +1 -1
  176. package/mcp-server/useMcpServerSetup.js +7 -0
  177. package/mcp-server/useMcpServerSetup.js.map +1 -1
  178. package/oauth-app/OAuthAppListPanel.d.ts.map +1 -1
  179. package/oauth-app/OAuthAppListPanel.js +2 -1
  180. package/oauth-app/OAuthAppListPanel.js.map +1 -1
  181. package/package.json +4 -4
  182. package/platform-client/PlatformClientListPanel.d.ts.map +1 -1
  183. package/platform-client/PlatformClientListPanel.js +3 -2
  184. package/platform-client/PlatformClientListPanel.js.map +1 -1
  185. package/pricing-governance/BaselineEditor.d.ts.map +1 -1
  186. package/pricing-governance/BaselineEditor.js +7 -1
  187. package/pricing-governance/BaselineEditor.js.map +1 -1
  188. package/pricing-governance/ModelCatalogPanel.d.ts.map +1 -1
  189. package/pricing-governance/ModelCatalogPanel.js +2 -1
  190. package/pricing-governance/ModelCatalogPanel.js.map +1 -1
  191. package/pricing-governance/PricingGovernanceConsole.d.ts.map +1 -1
  192. package/pricing-governance/PricingGovernanceConsole.js +2 -1
  193. package/pricing-governance/PricingGovernanceConsole.js.map +1 -1
  194. package/pricing-governance/PricingGovernancePanel.d.ts.map +1 -1
  195. package/pricing-governance/PricingGovernancePanel.js +2 -1
  196. package/pricing-governance/PricingGovernancePanel.js.map +1 -1
  197. package/resource-workbench/components/StatusBadge.d.ts.map +1 -1
  198. package/resource-workbench/components/StatusBadge.js +2 -1
  199. package/resource-workbench/components/StatusBadge.js.map +1 -1
  200. package/schedule/CadenceField.d.ts.map +1 -1
  201. package/schedule/CadenceField.js +15 -8
  202. package/schedule/CadenceField.js.map +1 -1
  203. package/schedule/ScheduleRunsTable.d.ts.map +1 -1
  204. package/schedule/ScheduleRunsTable.js +3 -2
  205. package/schedule/ScheduleRunsTable.js.map +1 -1
  206. package/session/PlanEditor.d.ts.map +1 -1
  207. package/session/PlanEditor.js +3 -5
  208. package/session/PlanEditor.js.map +1 -1
  209. package/sharing/AgentShareList.d.ts.map +1 -1
  210. package/sharing/AgentShareList.js +3 -1
  211. package/sharing/AgentShareList.js.map +1 -1
  212. package/sharing/ShareAgentDialog.d.ts.map +1 -1
  213. package/sharing/ShareAgentDialog.js +2 -1
  214. package/sharing/ShareAgentDialog.js.map +1 -1
  215. package/skill/SkillDetailView.d.ts.map +1 -1
  216. package/skill/SkillDetailView.js +3 -2
  217. package/skill/SkillDetailView.js.map +1 -1
  218. package/src/__tests__/helpers/open-menu.ts +88 -0
  219. package/src/__tests__/portal-container.test.tsx +3 -3
  220. package/src/activity/useRecentActivity.ts +3 -2
  221. package/src/agent/AgentDetailView.tsx +6 -130
  222. package/src/agent/internal/__tests__/agentToInput.test.ts +2 -11
  223. package/src/agent/internal/agentToInput.ts +0 -11
  224. package/src/agent-instance/AgentInstanceList.tsx +5 -6
  225. package/src/agent-instance/__tests__/AgentInstanceList.test.tsx +5 -4
  226. package/src/api-key/ApiKeyListPanel.tsx +11 -3
  227. package/src/attachment/AttachmentChipList.tsx +74 -65
  228. package/src/attachment/AttachmentImageLightbox.tsx +5 -4
  229. package/src/attachment/__tests__/AttachmentChipList.test.tsx +4 -3
  230. package/src/channel/AgentChannelsPanel.tsx +5 -6
  231. package/src/channel/ChannelConversationsDialog.tsx +5 -3
  232. package/src/channel/ChannelTemplatesDialog.tsx +5 -6
  233. package/src/channel/__tests__/AgentChannelsPanel.test.tsx +14 -9
  234. package/src/channel-app/internal.tsx +5 -6
  235. package/src/composer/ComposerToolbar.tsx +122 -90
  236. package/src/composer/ConfigureMenu.tsx +33 -24
  237. package/src/composer/ContextChip.tsx +2 -3
  238. package/src/composer/ContextPopover.tsx +27 -18
  239. package/src/composer/SessionComposer.tsx +41 -9
  240. package/src/composer/__tests__/SessionComposer-agentSetupError.test.tsx +124 -0
  241. package/src/composer/__tests__/SessionComposer-lockAgent.test.tsx +4 -9
  242. package/src/conversation/ConversationMediaAttachment.tsx +2 -2
  243. package/src/conversation/ConversationTimelineView.tsx +19 -2
  244. package/src/conversation/__tests__/ConversationTimelineView.test.tsx +106 -3
  245. package/src/conversation/conversationPresentation.ts +52 -1
  246. package/src/cursor-accounts/MemberCoverageTable.tsx +15 -13
  247. package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +4 -4
  248. package/src/dashboard/DashboardKPICards.tsx +2 -1
  249. package/src/dependency-graph/DependencyTreeNode.tsx +1 -7
  250. package/src/dependency-graph/__tests__/useDependencyGraph.test.ts +18 -34
  251. package/src/dependency-graph/types.ts +8 -20
  252. package/src/dependency-graph/useDependencyGraph.ts +2 -22
  253. package/src/environment/EnvironmentVariableEditor.tsx +17 -6
  254. package/src/execution/ApprovalCard.tsx +1 -3
  255. package/src/execution/ArtifactRowView.tsx +68 -48
  256. package/src/execution/FilePathLink.tsx +43 -27
  257. package/src/execution/McpToolDetail.tsx +6 -2
  258. package/src/execution/MessageAttachments.tsx +57 -41
  259. package/src/execution/MessageEntry.tsx +22 -15
  260. package/src/execution/PlanArtifactCard.tsx +25 -18
  261. package/src/execution/ToolCallDetail.tsx +1 -4
  262. package/src/execution/ToolCallItem.tsx +18 -7
  263. package/src/execution/WriteBackCard.tsx +38 -29
  264. package/src/execution/__tests__/ArtifactRow.test.tsx +6 -2
  265. package/src/execution/__tests__/ArtifactRowView.test.tsx +5 -2
  266. package/src/execution/__tests__/FilePathLink.test.tsx +10 -6
  267. package/src/execution/__tests__/FileReviewCard.test.tsx +2 -1
  268. package/src/execution/__tests__/MessageEntry-attachments.test.tsx +3 -2
  269. package/src/execution/__tests__/MessageThread.test.tsx +6 -1
  270. package/src/execution/__tests__/artifact-row-tooltips.layout.test.tsx +115 -0
  271. package/src/execution/artifact-row-item.ts +1 -1
  272. package/src/file-reference/FileReferenceChipList.tsx +29 -17
  273. package/src/file-reference/__tests__/FileReferenceChipList.test.tsx +5 -2
  274. package/src/iam-policy/OrgMembersPanel.tsx +26 -19
  275. package/src/iam-policy/ProviderBadge.tsx +17 -10
  276. package/src/iam-policy/RoleSelector.tsx +0 -1
  277. package/src/identity-provider/IdentityProviderListPanel.tsx +11 -3
  278. package/src/index.ts +0 -82
  279. package/src/internal/__tests__/truncated-text.layout.test.tsx +68 -0
  280. package/src/internal/__tests__/truncated-text.test.tsx +33 -0
  281. package/src/internal/truncated-text.tsx +81 -0
  282. package/src/invitation/InvitationManager.tsx +18 -5
  283. package/src/library/ScopeToggle.tsx +14 -2
  284. package/src/library/VisibilitySelector.tsx +21 -14
  285. package/src/library/useExportResource.ts +3 -4
  286. package/src/manifest/EditResourceYamlDialog.tsx +1 -2
  287. package/src/manifest/__tests__/ApplyManifestDialog.test.tsx +2 -2
  288. package/src/manifest/__tests__/EditResourceYamlDialog.test.tsx +9 -9
  289. package/src/mcp-server/McpServerConfigPanel.tsx +79 -37
  290. package/src/mcp-server/McpServerConnectDialog.tsx +41 -5
  291. package/src/mcp-server/McpServerDetailView.tsx +23 -39
  292. package/src/mcp-server/McpServerPicker.tsx +99 -7
  293. package/src/mcp-server/McpToolSelector.tsx +12 -7
  294. package/src/mcp-server/VendorApprovalBlockedNotice.tsx +221 -0
  295. package/src/mcp-server/__tests__/McpServerPicker.test.tsx +504 -0
  296. package/src/mcp-server/__tests__/VendorApprovalBlocked.surfaces.test.tsx +321 -0
  297. package/src/mcp-server/__tests__/VendorApprovalBlockedNotice.test.tsx +154 -0
  298. package/src/mcp-server/mcpServerSetupReducer.ts +24 -0
  299. package/src/mcp-server/useMcpServerSetup.ts +9 -0
  300. package/src/oauth-app/OAuthAppListPanel.tsx +11 -3
  301. package/src/platform-client/PlatformClientListPanel.tsx +35 -18
  302. package/src/pricing-governance/BaselineEditor.tsx +20 -0
  303. package/src/pricing-governance/ModelCatalogPanel.tsx +9 -5
  304. package/src/pricing-governance/PricingGovernanceConsole.tsx +9 -5
  305. package/src/pricing-governance/PricingGovernancePanel.tsx +13 -4
  306. package/src/pricing-governance/__tests__/ModelCatalogPanel.test.tsx +37 -0
  307. package/src/resource-workbench/components/StatusBadge.tsx +7 -3
  308. package/src/schedule/CadenceField.tsx +38 -27
  309. package/src/schedule/ScheduleRunsTable.tsx +23 -11
  310. package/src/schedule/__tests__/cadence-tooltips.layout.test.tsx +86 -0
  311. package/src/session/PlanEditor.tsx +9 -8
  312. package/src/sharing/AgentShareList.tsx +28 -22
  313. package/src/sharing/ShareAgentDialog.tsx +5 -6
  314. package/src/sharing/__tests__/AgentShareList.test.tsx +4 -4
  315. package/src/skill/SkillDetailView.tsx +23 -12
  316. package/src/version-history/VersionTimelineEntry.tsx +21 -12
  317. package/src/workflow/CanvasTransitionEdge.tsx +23 -16
  318. package/src/workflow/ExecutionActiveTaskIndicator.tsx +74 -59
  319. package/src/workflow/TaskPickerPopover.tsx +0 -1
  320. package/src/workflow/WorkflowCanvasEditor.tsx +95 -64
  321. package/src/workflow/WorkflowNode.tsx +13 -6
  322. package/src/workflow/WorkflowTaskApprovalSummary.tsx +18 -11
  323. package/src/workflow/WorkflowTaskList.tsx +2 -2
  324. package/src/workflow/WorkflowVersionBadge.tsx +33 -18
  325. package/src/workflow/WorkflowVersionTimeline.tsx +7 -6
  326. package/src/workflow/__tests__/WorkflowTaskApprovalSummary.test.tsx +3 -1
  327. package/src/workflow/__tests__/structured-data-viewer.test.tsx +5 -2
  328. package/src/workflow/execution-comparison/ExecutionComparisonView.tsx +5 -3
  329. package/src/workflow/execution-comparison/TaskComparisonTable.tsx +12 -5
  330. package/src/workflow/execution-history/ExecutionHistoryTable.tsx +24 -15
  331. package/src/workflow/inspector/InspectorHeader.tsx +20 -11
  332. package/src/workflow/inspector/NestedTaskList.tsx +18 -11
  333. package/src/workflow/inspector/WorkflowSummaryPanel.tsx +5 -3
  334. package/src/workflow/inspector/tabs/BranchesTab.tsx +61 -31
  335. package/src/workflow/instance/WorkflowInstanceList.tsx +5 -6
  336. package/src/workflow/instance/__tests__/WorkflowInstanceList.test.tsx +5 -4
  337. package/src/workflow/node-shell/DiffBadge.tsx +18 -11
  338. package/src/workflow/node-shell/ExecutionBadge.tsx +73 -46
  339. package/src/workflow/node-shell/NodeActions.tsx +128 -94
  340. package/src/workflow/task-detail/StructuredDataViewer.tsx +4 -2
  341. package/src/workspace/EditorTabs.tsx +102 -85
  342. package/src/workspace/ExplorerTree.tsx +47 -30
  343. package/src/workspace/FileViewer.tsx +11 -3
  344. package/src/workspace/PanelChip.tsx +32 -23
  345. package/src/workspace/WorkspaceEditor.tsx +21 -9
  346. package/src/workspace/WorkspaceSummary.tsx +21 -12
  347. package/src/workspace/WorkspaceSurface.tsx +86 -61
  348. package/src/workspace/__tests__/EditorTabs.test.tsx +5 -2
  349. package/src/workspace/__tests__/WorkspaceSurface.test.tsx +5 -2
  350. package/styles.css +1 -1
  351. package/version-history/VersionTimelineEntry.d.ts.map +1 -1
  352. package/version-history/VersionTimelineEntry.js +2 -1
  353. package/version-history/VersionTimelineEntry.js.map +1 -1
  354. package/workflow/CanvasTransitionEdge.d.ts +1 -1
  355. package/workflow/CanvasTransitionEdge.d.ts.map +1 -1
  356. package/workflow/CanvasTransitionEdge.js +3 -2
  357. package/workflow/CanvasTransitionEdge.js.map +1 -1
  358. package/workflow/ExecutionActiveTaskIndicator.d.ts.map +1 -1
  359. package/workflow/ExecutionActiveTaskIndicator.js +12 -11
  360. package/workflow/ExecutionActiveTaskIndicator.js.map +1 -1
  361. package/workflow/TaskPickerPopover.js +1 -1
  362. package/workflow/TaskPickerPopover.js.map +1 -1
  363. package/workflow/WorkflowCanvasEditor.d.ts.map +1 -1
  364. package/workflow/WorkflowCanvasEditor.js +9 -2
  365. package/workflow/WorkflowCanvasEditor.js.map +1 -1
  366. package/workflow/WorkflowNode.d.ts.map +1 -1
  367. package/workflow/WorkflowNode.js +2 -1
  368. package/workflow/WorkflowNode.js.map +1 -1
  369. package/workflow/WorkflowTaskApprovalSummary.d.ts.map +1 -1
  370. package/workflow/WorkflowTaskApprovalSummary.js +6 -4
  371. package/workflow/WorkflowTaskApprovalSummary.js.map +1 -1
  372. package/workflow/WorkflowTaskList.js +2 -2
  373. package/workflow/WorkflowTaskList.js.map +1 -1
  374. package/workflow/WorkflowVersionBadge.d.ts.map +1 -1
  375. package/workflow/WorkflowVersionBadge.js +2 -1
  376. package/workflow/WorkflowVersionBadge.js.map +1 -1
  377. package/workflow/WorkflowVersionTimeline.d.ts.map +1 -1
  378. package/workflow/WorkflowVersionTimeline.js +2 -1
  379. package/workflow/WorkflowVersionTimeline.js.map +1 -1
  380. package/workflow/execution-comparison/ExecutionComparisonView.d.ts.map +1 -1
  381. package/workflow/execution-comparison/ExecutionComparisonView.js +2 -1
  382. package/workflow/execution-comparison/ExecutionComparisonView.js.map +1 -1
  383. package/workflow/execution-comparison/TaskComparisonTable.d.ts.map +1 -1
  384. package/workflow/execution-comparison/TaskComparisonTable.js +2 -1
  385. package/workflow/execution-comparison/TaskComparisonTable.js.map +1 -1
  386. package/workflow/execution-history/ExecutionHistoryTable.d.ts.map +1 -1
  387. package/workflow/execution-history/ExecutionHistoryTable.js +6 -4
  388. package/workflow/execution-history/ExecutionHistoryTable.js.map +1 -1
  389. package/workflow/inspector/InspectorHeader.d.ts.map +1 -1
  390. package/workflow/inspector/InspectorHeader.js +4 -2
  391. package/workflow/inspector/InspectorHeader.js.map +1 -1
  392. package/workflow/inspector/NestedTaskList.d.ts.map +1 -1
  393. package/workflow/inspector/NestedTaskList.js +2 -1
  394. package/workflow/inspector/NestedTaskList.js.map +1 -1
  395. package/workflow/inspector/WorkflowSummaryPanel.d.ts.map +1 -1
  396. package/workflow/inspector/WorkflowSummaryPanel.js +2 -1
  397. package/workflow/inspector/WorkflowSummaryPanel.js.map +1 -1
  398. package/workflow/inspector/tabs/BranchesTab.d.ts.map +1 -1
  399. package/workflow/inspector/tabs/BranchesTab.js +5 -2
  400. package/workflow/inspector/tabs/BranchesTab.js.map +1 -1
  401. package/workflow/instance/WorkflowInstanceList.d.ts.map +1 -1
  402. package/workflow/instance/WorkflowInstanceList.js +2 -1
  403. package/workflow/instance/WorkflowInstanceList.js.map +1 -1
  404. package/workflow/node-shell/DiffBadge.d.ts.map +1 -1
  405. package/workflow/node-shell/DiffBadge.js +3 -2
  406. package/workflow/node-shell/DiffBadge.js.map +1 -1
  407. package/workflow/node-shell/ExecutionBadge.d.ts.map +1 -1
  408. package/workflow/node-shell/ExecutionBadge.js +5 -4
  409. package/workflow/node-shell/ExecutionBadge.js.map +1 -1
  410. package/workflow/node-shell/NodeActions.d.ts.map +1 -1
  411. package/workflow/node-shell/NodeActions.js +12 -11
  412. package/workflow/node-shell/NodeActions.js.map +1 -1
  413. package/workflow/task-detail/StructuredDataViewer.d.ts.map +1 -1
  414. package/workflow/task-detail/StructuredDataViewer.js +5 -1
  415. package/workflow/task-detail/StructuredDataViewer.js.map +1 -1
  416. package/workspace/EditorTabs.d.ts.map +1 -1
  417. package/workspace/EditorTabs.js +38 -37
  418. package/workspace/EditorTabs.js.map +1 -1
  419. package/workspace/ExplorerTree.d.ts.map +1 -1
  420. package/workspace/ExplorerTree.js +2 -1
  421. package/workspace/ExplorerTree.js.map +1 -1
  422. package/workspace/FileViewer.d.ts.map +1 -1
  423. package/workspace/FileViewer.js +2 -1
  424. package/workspace/FileViewer.js.map +1 -1
  425. package/workspace/PanelChip.d.ts.map +1 -1
  426. package/workspace/PanelChip.js +2 -1
  427. package/workspace/PanelChip.js.map +1 -1
  428. package/workspace/WorkspaceEditor.d.ts.map +1 -1
  429. package/workspace/WorkspaceEditor.js +2 -1
  430. package/workspace/WorkspaceEditor.js.map +1 -1
  431. package/workspace/WorkspaceSummary.d.ts.map +1 -1
  432. package/workspace/WorkspaceSummary.js +7 -2
  433. package/workspace/WorkspaceSummary.js.map +1 -1
  434. package/workspace/WorkspaceSurface.d.ts.map +1 -1
  435. package/workspace/WorkspaceSurface.js +12 -11
  436. package/workspace/WorkspaceSurface.js.map +1 -1
  437. package/datastore/CollectionRecordsBrowser.d.ts +0 -34
  438. package/datastore/CollectionRecordsBrowser.d.ts.map +0 -1
  439. package/datastore/CollectionRecordsBrowser.js +0 -223
  440. package/datastore/CollectionRecordsBrowser.js.map +0 -1
  441. package/datastore/CollectionSchemaView.d.ts +0 -29
  442. package/datastore/CollectionSchemaView.d.ts.map +0 -1
  443. package/datastore/CollectionSchemaView.js +0 -93
  444. package/datastore/CollectionSchemaView.js.map +0 -1
  445. package/datastore/DatastoreDetailView.d.ts +0 -44
  446. package/datastore/DatastoreDetailView.d.ts.map +0 -1
  447. package/datastore/DatastoreDetailView.js +0 -76
  448. package/datastore/DatastoreDetailView.js.map +0 -1
  449. package/datastore/DatastoreSyncReport.d.ts +0 -19
  450. package/datastore/DatastoreSyncReport.d.ts.map +0 -1
  451. package/datastore/DatastoreSyncReport.js +0 -45
  452. package/datastore/DatastoreSyncReport.js.map +0 -1
  453. package/datastore/DeleteDatastoreDialog.d.ts +0 -35
  454. package/datastore/DeleteDatastoreDialog.d.ts.map +0 -1
  455. package/datastore/DeleteDatastoreDialog.js +0 -90
  456. package/datastore/DeleteDatastoreDialog.js.map +0 -1
  457. package/datastore/FieldValueControl.d.ts +0 -55
  458. package/datastore/FieldValueControl.d.ts.map +0 -1
  459. package/datastore/FieldValueControl.js +0 -138
  460. package/datastore/FieldValueControl.js.map +0 -1
  461. package/datastore/RecordFilterBuilder.d.ts +0 -37
  462. package/datastore/RecordFilterBuilder.d.ts.map +0 -1
  463. package/datastore/RecordFilterBuilder.js +0 -122
  464. package/datastore/RecordFilterBuilder.js.map +0 -1
  465. package/datastore/RecordFormPanel.d.ts +0 -45
  466. package/datastore/RecordFormPanel.d.ts.map +0 -1
  467. package/datastore/RecordFormPanel.js +0 -215
  468. package/datastore/RecordFormPanel.js.map +0 -1
  469. package/datastore/index.d.ts +0 -43
  470. package/datastore/index.d.ts.map +0 -1
  471. package/datastore/index.js +0 -22
  472. package/datastore/index.js.map +0 -1
  473. package/datastore/recordFilter.d.ts +0 -62
  474. package/datastore/recordFilter.d.ts.map +0 -1
  475. package/datastore/recordFilter.js +0 -104
  476. package/datastore/recordFilter.js.map +0 -1
  477. package/datastore/recordValues.d.ts +0 -85
  478. package/datastore/recordValues.d.ts.map +0 -1
  479. package/datastore/recordValues.js +0 -282
  480. package/datastore/recordValues.js.map +0 -1
  481. package/datastore/useDatastore.d.ts +0 -39
  482. package/datastore/useDatastore.d.ts.map +0 -1
  483. package/datastore/useDatastore.js +0 -44
  484. package/datastore/useDatastore.js.map +0 -1
  485. package/datastore/useDatastoreCount.d.ts +0 -50
  486. package/datastore/useDatastoreCount.d.ts.map +0 -1
  487. package/datastore/useDatastoreCount.js +0 -27
  488. package/datastore/useDatastoreCount.js.map +0 -1
  489. package/datastore/useDatastoreDescription.d.ts +0 -54
  490. package/datastore/useDatastoreDescription.d.ts.map +0 -1
  491. package/datastore/useDatastoreDescription.js +0 -50
  492. package/datastore/useDatastoreDescription.js.map +0 -1
  493. package/datastore/useDatastoreList.d.ts +0 -57
  494. package/datastore/useDatastoreList.d.ts.map +0 -1
  495. package/datastore/useDatastoreList.js +0 -29
  496. package/datastore/useDatastoreList.js.map +0 -1
  497. package/datastore/useDatastoreSearch.d.ts +0 -19
  498. package/datastore/useDatastoreSearch.d.ts.map +0 -1
  499. package/datastore/useDatastoreSearch.js +0 -22
  500. package/datastore/useDatastoreSearch.js.map +0 -1
  501. package/datastore/useDeleteDatastore.d.ts +0 -53
  502. package/datastore/useDeleteDatastore.d.ts.map +0 -1
  503. package/datastore/useDeleteDatastore.js +0 -40
  504. package/datastore/useDeleteDatastore.js.map +0 -1
  505. package/datastore/useDeleteRecord.d.ts +0 -34
  506. package/datastore/useDeleteRecord.d.ts.map +0 -1
  507. package/datastore/useDeleteRecord.js +0 -43
  508. package/datastore/useDeleteRecord.js.map +0 -1
  509. package/datastore/useInsertRecord.d.ts +0 -50
  510. package/datastore/useInsertRecord.d.ts.map +0 -1
  511. package/datastore/useInsertRecord.js +0 -55
  512. package/datastore/useInsertRecord.js.map +0 -1
  513. package/datastore/useRecordCollection.d.ts +0 -104
  514. package/datastore/useRecordCollection.d.ts.map +0 -1
  515. package/datastore/useRecordCollection.js +0 -136
  516. package/datastore/useRecordCollection.js.map +0 -1
  517. package/datastore/useRecordList.d.ts +0 -66
  518. package/datastore/useRecordList.d.ts.map +0 -1
  519. package/datastore/useRecordList.js +0 -58
  520. package/datastore/useRecordList.js.map +0 -1
  521. package/datastore/useUpdateRecord.d.ts +0 -52
  522. package/datastore/useUpdateRecord.d.ts.map +0 -1
  523. package/datastore/useUpdateRecord.js +0 -55
  524. package/datastore/useUpdateRecord.js.map +0 -1
  525. package/src/agent/__tests__/AgentDetailView.datastores.test.tsx +0 -166
  526. package/src/datastore/CollectionRecordsBrowser.tsx +0 -570
  527. package/src/datastore/CollectionSchemaView.tsx +0 -247
  528. package/src/datastore/DatastoreDetailView.tsx +0 -201
  529. package/src/datastore/DatastoreSyncReport.tsx +0 -105
  530. package/src/datastore/DeleteDatastoreDialog.tsx +0 -202
  531. package/src/datastore/FieldValueControl.tsx +0 -289
  532. package/src/datastore/RecordFilterBuilder.tsx +0 -422
  533. package/src/datastore/RecordFormPanel.tsx +0 -432
  534. package/src/datastore/__tests__/CollectionRecordsBrowser.test.tsx +0 -245
  535. package/src/datastore/__tests__/DeleteDatastoreDialog.test.tsx +0 -133
  536. package/src/datastore/__tests__/FieldValueControl.test.tsx +0 -160
  537. package/src/datastore/__tests__/RecordFilterBuilder.test.tsx +0 -155
  538. package/src/datastore/__tests__/RecordFormPanel.test.tsx +0 -227
  539. package/src/datastore/__tests__/recordFilter.test.ts +0 -169
  540. package/src/datastore/__tests__/recordMutations.test.tsx +0 -195
  541. package/src/datastore/__tests__/recordValues.test.ts +0 -359
  542. package/src/datastore/__tests__/schemaAndSyncViews.test.tsx +0 -142
  543. package/src/datastore/__tests__/useDatastoreDescription.test.tsx +0 -143
  544. package/src/datastore/__tests__/useRecordCollection.test.tsx +0 -250
  545. package/src/datastore/__tests__/useRecordList.test.tsx +0 -85
  546. package/src/datastore/index.ts +0 -111
  547. package/src/datastore/recordFilter.ts +0 -154
  548. package/src/datastore/recordValues.ts +0 -327
  549. package/src/datastore/useDatastore.ts +0 -67
  550. package/src/datastore/useDatastoreCount.ts +0 -69
  551. package/src/datastore/useDatastoreDescription.ts +0 -90
  552. package/src/datastore/useDatastoreList.ts +0 -79
  553. package/src/datastore/useDatastoreSearch.ts +0 -39
  554. package/src/datastore/useDeleteDatastore.ts +0 -87
  555. package/src/datastore/useDeleteRecord.ts +0 -77
  556. package/src/datastore/useInsertRecord.ts +0 -92
  557. package/src/datastore/useRecordCollection.ts +0 -256
  558. package/src/datastore/useRecordList.ts +0 -131
  559. package/src/datastore/useUpdateRecord.ts +0 -95
@@ -5,6 +5,7 @@ import Markdown from "react-markdown";
5
5
  import type { JsonObject } from "@bufbuild/protobuf";
6
6
  import { cn } from "@stigmer/theme";
7
7
  import { MARKDOWN_COMPONENTS, REMARK_PLUGINS } from "../internal/markdown-components.js";
8
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
8
9
  import { formatDuration, formatTimestamp } from "./format-utils.js";
9
10
  import type { TaskOutcome } from "./WorkflowTaskApprovalCard.js";
10
11
  import {
@@ -190,27 +191,33 @@ export const WorkflowTaskApprovalSummary = memo(function WorkflowTaskApprovalSum
190
191
  /**
191
192
  * `by <avatar> Ada Lovelace` — the reviewer's display identity, following
192
193
  * the platform's actor pattern (see `WorkflowVersionTimeline`). The email
193
- * rides as a native tooltip when it is not already the visible label. A
194
+ * rides on the house tooltip when it is not already the visible label. A
194
195
  * label that fell through to the raw identity (legacy records) renders
195
196
  * de-emphasized — internal IDs are never presented as if they were names.
196
197
  */
197
198
  function ReviewerChip({ reviewer }: { readonly reviewer: TaskReviewerView }) {
199
+ const nameClass = cn(
200
+ reviewer.isRawId
201
+ ? "stg:font-mono stg:text-[10px] stg:text-muted-foreground"
202
+ : "stg:font-medium stg:text-foreground",
203
+ );
204
+
198
205
  return (
199
206
  <span className="stg:flex stg:items-center stg:gap-1">
200
207
  by{" "}
201
208
  {reviewer.avatar && (
202
209
  <img src={reviewer.avatar} alt="" className="stg:size-3.5 stg:rounded-full" />
203
210
  )}
204
- <span
205
- className={cn(
206
- reviewer.isRawId
207
- ? "stg:font-mono stg:text-[10px] stg:text-muted-foreground"
208
- : "stg:font-medium stg:text-foreground",
209
- )}
210
- title={reviewer.email || undefined}
211
- >
212
- {reviewer.label}
213
- </span>
211
+ {reviewer.email ? (
212
+ <Tooltip>
213
+ <TooltipTrigger render={<span className={nameClass} />}>
214
+ {reviewer.label}
215
+ </TooltipTrigger>
216
+ <TooltipContent side="top">{reviewer.email}</TooltipContent>
217
+ </Tooltip>
218
+ ) : (
219
+ <span className={nameClass}>{reviewer.label}</span>
220
+ )}
214
221
  </span>
215
222
  );
216
223
  }
@@ -141,16 +141,16 @@ function formatKindName(kind: WorkflowTaskKind): string {
141
141
  * keep the bundle size minimal (DD-004).
142
142
  */
143
143
  function TaskKindIcon({
144
- iconName,
145
144
  className,
146
145
  }: {
146
+ // The icon name is accepted (future per-kind icons) but not surfaced: the
147
+ // glyph is decorative and the kind label is already visible next to it.
147
148
  readonly iconName: string;
148
149
  readonly className?: string;
149
150
  }) {
150
151
  return (
151
152
  <span
152
153
  className={cn("stg:inline-flex stg:items-center stg:justify-center", className)}
153
- title={iconName}
154
154
  aria-hidden="true"
155
155
  >
156
156
  <TaskDotIcon />
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { memo, useCallback, useState } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
5
6
 
6
7
  /** Props for {@link WorkflowVersionBadge}. */
7
8
  export interface WorkflowVersionBadgeProps {
@@ -56,26 +57,40 @@ export const WorkflowVersionBadge = memo(function WorkflowVersionBadge({
56
57
  return (
57
58
  <span className={cn("stg:inline-flex stg:items-center stg:gap-1.5", className)}>
58
59
  {isCurrent && (
59
- <span
60
- className="stg:size-2 stg:shrink-0 stg:rounded-full stg:bg-status-ready"
61
- aria-label="Current version"
62
- title="Current version"
63
- />
60
+ <Tooltip>
61
+ <TooltipTrigger
62
+ render={
63
+ <span
64
+ className="stg:size-2 stg:shrink-0 stg:rounded-full stg:bg-status-ready"
65
+ aria-label="Current version"
66
+ />
67
+ }
68
+ />
69
+ <TooltipContent side="top">Current version</TooltipContent>
70
+ </Tooltip>
64
71
  )}
65
72
 
66
- <button
67
- type="button"
68
- onClick={handleCopy}
69
- title={copied ? "Copied!" : `Copy full hash: ${versionHash}`}
70
- className={cn(
71
- "stg:shrink-0 stg:rounded stg:bg-muted stg:px-1.5 stg:py-0.5 stg:font-mono stg:text-[11px] stg:font-medium stg:text-foreground stg:transition-colors",
72
- "stg:hover:bg-accent-hover",
73
- "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring",
74
- copied && "stg:bg-status-ready-subtle stg:text-status-ready",
75
- )}
76
- >
77
- {copied ? "copied" : truncated}
78
- </button>
73
+ <Tooltip>
74
+ <TooltipTrigger
75
+ render={
76
+ <button
77
+ type="button"
78
+ onClick={handleCopy}
79
+ className={cn(
80
+ "stg:shrink-0 stg:rounded stg:bg-muted stg:px-1.5 stg:py-0.5 stg:font-mono stg:text-[11px] stg:font-medium stg:text-foreground stg:transition-colors",
81
+ "stg:hover:bg-accent-hover",
82
+ "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring",
83
+ copied && "stg:bg-status-ready-subtle stg:text-status-ready",
84
+ )}
85
+ />
86
+ }
87
+ >
88
+ {copied ? "copied" : truncated}
89
+ </TooltipTrigger>
90
+ <TooltipContent side="top" className="stg:break-all">
91
+ {copied ? "Copied!" : `Copy full hash: ${versionHash}`}
92
+ </TooltipContent>
93
+ </Tooltip>
79
94
 
80
95
  {tag && (
81
96
  <span className="stg:shrink-0 stg:rounded-full stg:bg-primary-subtle stg:px-1.5 stg:py-0.5 stg:text-[10px] stg:font-medium stg:text-primary">
@@ -5,6 +5,7 @@ import { cn } from "@stigmer/theme";
5
5
  import { useWorkflowVersions } from "./useWorkflowVersions.js";
6
6
  import { WorkflowVersionBadge } from "./WorkflowVersionBadge.js";
7
7
  import type { VersionEntry } from "../version-history/types.js";
8
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
8
9
 
9
10
  /** Props for {@link WorkflowVersionTimeline}. */
10
11
  export interface WorkflowVersionTimelineProps {
@@ -169,12 +170,12 @@ function VersionTimelineRow({
169
170
 
170
171
  {/* Second line: timestamp + actor */}
171
172
  <div className="stg:flex stg:items-center stg:gap-2 stg:text-xs stg:text-muted-foreground">
172
- <time
173
- dateTime={entry.timestamp.toISOString()}
174
- title={entry.timestamp.toLocaleString()}
175
- >
176
- {formatRelativeTime(entry.timestamp)}
177
- </time>
173
+ <Tooltip>
174
+ <TooltipTrigger render={<time dateTime={entry.timestamp.toISOString()} />}>
175
+ {formatRelativeTime(entry.timestamp)}
176
+ </TooltipTrigger>
177
+ <TooltipContent side="top">{entry.timestamp.toLocaleString()}</TooltipContent>
178
+ </Tooltip>
178
179
 
179
180
  {entry.actor && (
180
181
  <>
@@ -74,7 +74,9 @@ describe("WorkflowTaskApprovalSummary", () => {
74
74
  />,
75
75
  );
76
76
  const name = screen.getByText("Ada Lovelace");
77
- expect(name.getAttribute("title")).toBe("ada@example.com");
77
+ // The email rides the house tooltip now (native titles are banned,
78
+ // stigmer-cloud#268); the name span stays title-free.
79
+ expect(name.getAttribute("title")).toBeNull();
78
80
  expect(document.querySelector('img[src="https://example.com/ada.png"]')).toBeTruthy();
79
81
  // The raw identity is never shown when a display identity exists.
80
82
  expect(screen.queryByText("ida_01abc")).toBeNull();
@@ -69,8 +69,11 @@ describe("StructuredDataViewer", () => {
69
69
  it("does not treat IDs/URLs > 120 chars as prose", () => {
70
70
  const longId = "aex_" + "a".repeat(200);
71
71
  render(<StructuredDataViewer data={{ execution_id: longId }} />);
72
- const element = screen.getByTitle(longId);
73
- expect(element).toBeTruthy();
72
+ // A long ID renders as a truncating value (TruncatedText — the full
73
+ // string stays in the DOM; native titles are banned), never as a <p>.
74
+ const element = screen.getByText(longId);
75
+ expect(element.tagName).not.toBe("P");
76
+ expect(element.closest("[title]")).toBeNull();
74
77
  });
75
78
  });
76
79
 
@@ -6,6 +6,7 @@ import { WorkflowExecutionPhaseBadge } from "../WorkflowExecutionPhaseBadge.js";
6
6
  import { useExecutionComparison } from "./useExecutionComparison.js";
7
7
  import { ComparisonSummaryCards } from "./ComparisonSummaryCards.js";
8
8
  import { TaskComparisonTable } from "./TaskComparisonTable.js";
9
+ import { TruncatedText } from "../../internal/truncated-text.js";
9
10
 
10
11
  /** Props for {@link ExecutionComparisonView}. */
11
12
  export interface ExecutionComparisonViewProps {
@@ -146,9 +147,10 @@ function ExecutionLabel({
146
147
  {label}:
147
148
  </span>
148
149
  <WorkflowExecutionPhaseBadge phase={phase} />
149
- <span className="stg:max-w-[10rem] stg:truncate stg:text-xs stg:font-medium stg:text-[var(--stgm-foreground,#1a1a2e)]" title={name}>
150
- {name}
151
- </span>
150
+ <TruncatedText
151
+ text={name}
152
+ className="stg:max-w-[10rem] stg:text-xs stg:font-medium stg:text-[var(--stgm-foreground,#1a1a2e)]"
153
+ />
152
154
  </div>
153
155
  );
154
156
  }
@@ -5,6 +5,7 @@ import { cn } from "@stigmer/theme";
5
5
  import { WorkflowTaskStatus } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/enum_pb";
6
6
  import { formatDuration, formatMicroUsd } from "../format-utils.js";
7
7
  import type { TaskComparison, ExecutionComparison } from "./types.js";
8
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../../internal/tooltip.js";
8
9
 
9
10
  /** Props for {@link TaskComparisonTable}. */
10
11
  export interface TaskComparisonTableProps {
@@ -152,11 +153,17 @@ const TaskRow = memo(function TaskRow({
152
153
  <td className="stg:px-3 stg:py-2">
153
154
  <div className="stg:flex stg:items-center stg:gap-1.5">
154
155
  {isDivergencePoint && (
155
- <span
156
- className="stg:inline-block stg:h-1.5 stg:w-1.5 stg:rounded-full stg:bg-[var(--stgm-warning,#f59e0b)]"
157
- title="First point of divergence"
158
- aria-label="Divergence point"
159
- />
156
+ <Tooltip>
157
+ <TooltipTrigger
158
+ render={
159
+ <span
160
+ className="stg:inline-block stg:h-1.5 stg:w-1.5 stg:rounded-full stg:bg-[var(--stgm-warning,#f59e0b)]"
161
+ aria-label="Divergence point"
162
+ />
163
+ }
164
+ />
165
+ <TooltipContent side="top">First point of divergence</TooltipContent>
166
+ </Tooltip>
160
167
  )}
161
168
  <span className="stg:font-medium stg:text-[var(--stgm-foreground,#1a1a2e)]">
162
169
  {task.taskName}
@@ -10,6 +10,8 @@ import {
10
10
  type ExecutionSortField,
11
11
  type SortDirection,
12
12
  } from "./derive-execution-row.js";
13
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../../internal/tooltip.js";
14
+ import { TruncatedText } from "../../internal/truncated-text.js";
13
15
 
14
16
  // ---------------------------------------------------------------------------
15
17
  // Column definitions
@@ -33,9 +35,10 @@ const COLUMNS: readonly ColumnDef[] = [
33
35
  header: "Name",
34
36
  sortField: "name",
35
37
  cell: (row) => (
36
- <span className="stg:font-medium stg:text-foreground stg:truncate stg:max-w-[12rem] stg:inline-block" title={row.name}>
37
- {row.name || "\u2014"}
38
- </span>
38
+ <TruncatedText
39
+ text={row.name || "\u2014"}
40
+ className="stg:font-medium stg:text-foreground stg:max-w-[12rem] stg:inline-block"
41
+ />
39
42
  ),
40
43
  defaultVisible: true,
41
44
  minWidth: "8rem",
@@ -54,9 +57,12 @@ const COLUMNS: readonly ColumnDef[] = [
54
57
  sortField: "startedAt",
55
58
  cell: (row) =>
56
59
  row.startedAt ? (
57
- <time dateTime={row.startedAt.toISOString()} title={row.startedAt.toLocaleString()}>
58
- {formatRelativeTime(row.startedAt)}
59
- </time>
60
+ <Tooltip>
61
+ <TooltipTrigger render={<time dateTime={row.startedAt.toISOString()} />}>
62
+ {formatRelativeTime(row.startedAt)}
63
+ </TooltipTrigger>
64
+ <TooltipContent side="top">{row.startedAt.toLocaleString()}</TooltipContent>
65
+ </Tooltip>
60
66
  ) : (
61
67
  "\u2014"
62
68
  ),
@@ -103,9 +109,14 @@ const COLUMNS: readonly ColumnDef[] = [
103
109
  sortField: "tasks",
104
110
  cell: (row) =>
105
111
  row.taskCount > 0 ? (
106
- <span title={`${row.completedTaskCount} of ${row.taskCount} tasks finished`}>
107
- {row.completedTaskCount}/{row.taskCount}
108
- </span>
112
+ <Tooltip>
113
+ <TooltipTrigger render={<span />}>
114
+ {row.completedTaskCount}/{row.taskCount}
115
+ </TooltipTrigger>
116
+ <TooltipContent side="top">
117
+ {`${row.completedTaskCount} of ${row.taskCount} tasks finished`}
118
+ </TooltipContent>
119
+ </Tooltip>
109
120
  ) : (
110
121
  "\u2014"
111
122
  ),
@@ -122,15 +133,13 @@ const COLUMNS: readonly ColumnDef[] = [
122
133
  if (!label) return "\u2014";
123
134
  const isFailed = !!row.failedTaskName;
124
135
  return (
125
- <span
136
+ <TruncatedText
137
+ text={label}
126
138
  className={cn(
127
- "stg:truncate stg:max-w-[10rem] stg:inline-block stg:text-xs",
139
+ "stg:max-w-[10rem] stg:inline-block stg:text-xs",
128
140
  isFailed ? "stg:text-destructive" : "stg:text-muted-foreground",
129
141
  )}
130
- title={label}
131
- >
132
- {label}
133
- </span>
142
+ />
134
143
  );
135
144
  },
136
145
  defaultVisible: true,
@@ -5,6 +5,8 @@ import { cn } from "@stigmer/theme";
5
5
  import type { WorkflowGraphModel } from "../workflow-graph-model.js";
6
6
  import { TASK_NAME_PATTERN, TASK_NAME_PATTERN_ERROR } from "../canvas-constants.js";
7
7
  import type { InspectorNodeIdentity, InspectorMutations } from "./types.js";
8
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../../internal/tooltip.js";
9
+ import { TruncatedText } from "../../internal/truncated-text.js";
8
10
 
9
11
  /** Props for {@link InspectorHeader}. */
10
12
  export interface InspectorHeaderProps {
@@ -107,14 +109,20 @@ export const InspectorHeader = memo(function InspectorHeader({
107
109
  )}
108
110
  </div>
109
111
  ) : (
110
- <button
111
- type="button"
112
- onClick={startEditing}
113
- className="stg:w-fit stg:max-w-full stg:truncate stg:text-left stg:text-sm stg:font-semibold stg:text-[var(--stgm-foreground,#1a1a2e)] stg:hover:underline"
114
- title="Click to rename"
115
- >
116
- {identity.taskName}
117
- </button>
112
+ <Tooltip>
113
+ <TooltipTrigger
114
+ render={
115
+ <button
116
+ type="button"
117
+ onClick={startEditing}
118
+ className="stg:w-fit stg:max-w-full stg:truncate stg:text-left stg:text-sm stg:font-semibold stg:text-[var(--stgm-foreground,#1a1a2e)] stg:hover:underline"
119
+ />
120
+ }
121
+ >
122
+ {identity.taskName}
123
+ </TooltipTrigger>
124
+ <TooltipContent side="top">Click to rename</TooltipContent>
125
+ </Tooltip>
118
126
  )}
119
127
  </div>
120
128
 
@@ -155,9 +163,10 @@ export const InspectorHeader = memo(function InspectorHeader({
155
163
  {identity.kindString.replace(/_/g, " ")}
156
164
  </span>
157
165
  {identity.description && (
158
- <span className="stg:truncate stg:text-[10px] stg:text-[var(--stgm-muted-foreground,#737373)]" title={identity.description}>
159
- {identity.description}
160
- </span>
166
+ <TruncatedText
167
+ text={identity.description}
168
+ className="stg:text-[10px] stg:text-[var(--stgm-muted-foreground,#737373)]"
169
+ />
161
170
  )}
162
171
  </div>
163
172
  </div>
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { memo, useCallback } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../../internal/tooltip.js";
5
6
 
6
7
  /** A nested task entry for display in the inspector. */
7
8
  export interface NestedTaskEntry {
@@ -118,17 +119,23 @@ export const NestedTaskList = memo(function NestedTaskList({
118
119
 
119
120
  {/* Remove button */}
120
121
  {editable && onRemove && (
121
- <button
122
- type="button"
123
- onClick={(e) => { e.stopPropagation(); onRemove(idx); }}
124
- className="stg:shrink-0 stg:opacity-0 stg:group-hover/task:opacity-100 stg:transition-opacity stg:text-[var(--stgm-muted-foreground,#737373)] stg:hover:text-[var(--stgm-destructive,#ef4444)]"
125
- aria-label={`Remove task ${task.name}`}
126
- title="Remove"
127
- >
128
- <svg width="10" height="10" viewBox="0 0 10 10" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" aria-hidden="true">
129
- <path d="M2.5 2.5l5 5M7.5 2.5l-5 5" />
130
- </svg>
131
- </button>
122
+ <Tooltip>
123
+ <TooltipTrigger
124
+ render={
125
+ <button
126
+ type="button"
127
+ onClick={(e) => { e.stopPropagation(); onRemove(idx); }}
128
+ className="stg:shrink-0 stg:opacity-0 stg:group-hover/task:opacity-100 stg:transition-opacity stg:text-[var(--stgm-muted-foreground,#737373)] stg:hover:text-[var(--stgm-destructive,#ef4444)]"
129
+ aria-label={`Remove task ${task.name}`}
130
+ />
131
+ }
132
+ >
133
+ <svg width="10" height="10" viewBox="0 0 10 10" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" aria-hidden="true">
134
+ <path d="M2.5 2.5l5 5M7.5 2.5l-5 5" />
135
+ </svg>
136
+ </TooltipTrigger>
137
+ <TooltipContent side="top">Remove</TooltipContent>
138
+ </Tooltip>
132
139
  )}
133
140
  </div>
134
141
  ))}
@@ -6,6 +6,7 @@ import type { WorkflowGraphModel, WorkflowGraphBudget, WorkflowGraphEnvVar } fro
6
6
  import { START_NODE_ID, END_NODE_ID } from "../workflow-graph-model.js";
7
7
  import { CATEGORY_DISPLAY_NAMES } from "../canvas-constants.js";
8
8
  import type { TopologyNodeCategory } from "../useWorkflowTopology.js";
9
+ import { TruncatedText } from "../../internal/truncated-text.js";
9
10
 
10
11
  /** Props for {@link WorkflowSummaryPanel}. */
11
12
  export interface WorkflowSummaryPanelProps {
@@ -201,9 +202,10 @@ function EnvVarsSection({
201
202
  <span className="stg:text-[var(--stgm-muted-foreground,#737373)]">optional</span>
202
203
  )}
203
204
  {env.description && (
204
- <span className="stg:truncate stg:text-[var(--stgm-muted-foreground,#737373)]" title={env.description}>
205
- {env.description}
206
- </span>
205
+ <TruncatedText
206
+ text={env.description}
207
+ className="stg:text-[var(--stgm-muted-foreground,#737373)]"
208
+ />
207
209
  )}
208
210
  </div>
209
211
  ))}
@@ -2,6 +2,11 @@
2
2
 
3
3
  import { memo, useCallback, useMemo, useState } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
+ import {
6
+ Tooltip,
7
+ TooltipContent,
8
+ TooltipTrigger,
9
+ } from "../../../internal/tooltip.js";
5
10
  import type { WorkflowGraphNode, WorkflowGraphModel } from "../../workflow-graph-model.js";
6
11
  import type { InspectorMutations } from "../types.js";
7
12
 
@@ -172,17 +177,23 @@ function SwitchCaseBranches({
172
177
  </div>
173
178
 
174
179
  {/* Remove button */}
175
- <button
176
- type="button"
177
- onClick={() => handleRemove(caseEntry.name)}
178
- className="stg:shrink-0 stg:opacity-0 stg:group-hover/case:opacity-100 stg:transition-opacity stg:text-[var(--stgm-muted-foreground,#737373)] stg:hover:text-[var(--stgm-destructive,#ef4444)]"
179
- aria-label={`Remove case ${caseEntry.name}`}
180
- title="Remove case"
181
- >
182
- <svg width="12" height="12" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" aria-hidden="true">
183
- <path d="M3 3l6 6M9 3l-6 6" />
184
- </svg>
185
- </button>
180
+ <Tooltip>
181
+ <TooltipTrigger
182
+ render={
183
+ <button
184
+ type="button"
185
+ onClick={() => handleRemove(caseEntry.name)}
186
+ className="stg:shrink-0 stg:opacity-0 stg:group-hover/case:opacity-100 stg:transition-opacity stg:text-[var(--stgm-muted-foreground,#737373)] stg:hover:text-[var(--stgm-destructive,#ef4444)]"
187
+ aria-label={`Remove case ${caseEntry.name}`}
188
+ />
189
+ }
190
+ >
191
+ <svg width="12" height="12" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" aria-hidden="true">
192
+ <path d="M3 3l6 6M9 3l-6 6" />
193
+ </svg>
194
+ </TooltipTrigger>
195
+ <TooltipContent side="top">Remove case</TooltipContent>
196
+ </Tooltip>
186
197
  </div>
187
198
  );
188
199
  })}
@@ -354,32 +365,51 @@ function ForkBranches({
354
365
  className="stg:w-full stg:rounded stg:border stg:border-[var(--stgm-ring,#3b82f6)] stg:bg-[var(--stgm-background,#fff)] stg:px-1 stg:py-0.5 stg:text-[11px] stg:text-[var(--stgm-foreground,#1a1a2e)] stg:outline-none"
355
366
  />
356
367
  ) : (
357
- <span
358
- className="stg:text-[11px] stg:font-medium stg:text-[var(--stgm-foreground,#1a1a2e)] stg:truncate stg:block stg:cursor-text"
359
- onDoubleClick={() => startRename(idx, branch.name)}
360
- title="Double-click to rename"
361
- >
362
- {branch.name}
363
- </span>
368
+ <Tooltip>
369
+ <TooltipTrigger
370
+ render={
371
+ <span
372
+ className="stg:text-[11px] stg:font-medium stg:text-[var(--stgm-foreground,#1a1a2e)] stg:truncate stg:block stg:cursor-text"
373
+ onDoubleClick={() => startRename(idx, branch.name)}
374
+ />
375
+ }
376
+ >
377
+ {branch.name}
378
+ </TooltipTrigger>
379
+ <TooltipContent side="top">
380
+ Double-click to rename
381
+ </TooltipContent>
382
+ </Tooltip>
364
383
  )}
365
384
  <span className="stg:text-[10px] stg:text-[var(--stgm-muted-foreground,#737373)]">
366
385
  {branch.taskCount} {branch.taskCount === 1 ? "task" : "tasks"}
367
386
  </span>
368
387
  </div>
369
388
 
370
- {/* Remove — disabled if only 2 branches */}
371
- <button
372
- type="button"
373
- onClick={() => handleRemove(branch.name)}
374
- disabled={branches.length <= 2}
375
- className="stg:shrink-0 stg:opacity-0 stg:group-hover/branch:opacity-100 stg:transition-opacity stg:text-[var(--stgm-muted-foreground,#737373)] stg:hover:text-[var(--stgm-destructive,#ef4444)] stg:disabled:opacity-30 stg:disabled:cursor-not-allowed"
376
- aria-label={`Remove branch ${branch.name}`}
377
- title={branches.length <= 2 ? "Fork requires at least 2 branches" : "Remove branch"}
378
- >
379
- <svg width="12" height="12" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" aria-hidden="true">
380
- <path d="M3 3l6 6M9 3l-6 6" />
381
- </svg>
382
- </button>
389
+ {/* Remove — disabled if only 2 branches. The tooltip trigger is
390
+ a wrapper span so the "why is this disabled" explanation
391
+ stays hoverable (disabled buttons never receive pointer
392
+ events). */}
393
+ <Tooltip>
394
+ <TooltipTrigger render={<span className="stg:inline-flex stg:shrink-0" />}>
395
+ <button
396
+ type="button"
397
+ onClick={() => handleRemove(branch.name)}
398
+ disabled={branches.length <= 2}
399
+ className="stg:shrink-0 stg:opacity-0 stg:group-hover/branch:opacity-100 stg:transition-opacity stg:text-[var(--stgm-muted-foreground,#737373)] stg:hover:text-[var(--stgm-destructive,#ef4444)] stg:disabled:opacity-30 stg:disabled:cursor-not-allowed"
400
+ aria-label={`Remove branch ${branch.name}`}
401
+ >
402
+ <svg width="12" height="12" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" aria-hidden="true">
403
+ <path d="M3 3l6 6M9 3l-6 6" />
404
+ </svg>
405
+ </button>
406
+ </TooltipTrigger>
407
+ <TooltipContent side="top">
408
+ {branches.length <= 2
409
+ ? "Fork requires at least 2 branches"
410
+ : "Remove branch"}
411
+ </TooltipContent>
412
+ </Tooltip>
383
413
  </div>
384
414
  ))}
385
415
  </div>
@@ -12,6 +12,7 @@ import { useEnvironmentList } from "../../environment/useEnvironmentList.js";
12
12
  import { ResourceVisibilityControl } from "../../library/ResourceVisibilityControl.js";
13
13
  import { useCheckPermission } from "../../iam-policy/useCheckPermission.js";
14
14
  import { WorkflowInstanceEmptyState } from "./WorkflowInstanceEmptyState.js";
15
+ import { TruncatedText } from "../../internal/truncated-text.js";
15
16
 
16
17
  /** Props for {@link WorkflowInstanceList}. */
17
18
  export interface WorkflowInstanceListProps {
@@ -206,12 +207,10 @@ function InstanceRow({
206
207
  >
207
208
  <td className="stg:px-4 stg:py-2.5">
208
209
  <div className="stg:min-w-0">
209
- <span
210
- className="stg:block stg:truncate stg:font-medium stg:text-foreground"
211
- title={meta?.name || meta?.slug || undefined}
212
- >
213
- {meta?.name || meta?.slug || "—"}
214
- </span>
210
+ <TruncatedText
211
+ text={meta?.name || meta?.slug || "—"}
212
+ className="stg:block stg:font-medium stg:text-foreground"
213
+ />
215
214
  {instance.spec?.description && (
216
215
  <p className="stg:text-[0.65rem] stg:text-muted-foreground stg:truncate">
217
216
  {instance.spec.description}
@@ -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 { WorkflowInstanceList } from "../WorkflowInstanceList";
5
6
 
6
7
  // Isolate the row-actions behavior under test from the data, environment,
@@ -78,7 +79,7 @@ describe("WorkflowInstanceList row actions", () => {
78
79
 
79
80
  // No always-visible action buttons; the row shows a single kebab.
80
81
  expect(screen.queryByRole("button", { name: "Run" })).toBeNull();
81
- fireEvent.click(screen.getByRole("button", { name: /^Actions for/ }));
82
+ await openMenu(screen.getByRole("button", { name: /^Actions for/ }));
82
83
 
83
84
  expect(await screen.findByRole("menuitem", { name: "Run" })).toBeTruthy();
84
85
  expect(screen.getByRole("menuitem", { name: "Delete" })).toBeTruthy();
@@ -97,7 +98,7 @@ describe("WorkflowInstanceList row actions", () => {
97
98
  />,
98
99
  );
99
100
 
100
- fireEvent.click(screen.getByRole("button", { name: /^Actions for/ }));
101
+ await openMenu(screen.getByRole("button", { name: /^Actions for/ }));
101
102
  fireEvent.click(await screen.findByRole("menuitem", { name: "Run" }));
102
103
 
103
104
  expect(onRun).toHaveBeenCalledTimes(1);
@@ -117,7 +118,7 @@ describe("WorkflowInstanceList row actions", () => {
117
118
  />,
118
119
  );
119
120
 
120
- fireEvent.click(screen.getByRole("button", { name: /^Actions for/ }));
121
+ await openMenu(screen.getByRole("button", { name: /^Actions for/ }));
121
122
  fireEvent.click(await screen.findByRole("menuitem", { name: "Delete" }));
122
123
 
123
124
  expect(onDelete).toHaveBeenCalledWith(inst);
@@ -135,7 +136,7 @@ describe("WorkflowInstanceList row actions", () => {
135
136
  />,
136
137
  );
137
138
 
138
- fireEvent.click(screen.getByRole("button", { name: /^Actions for/ }));
139
+ await openMenu(screen.getByRole("button", { name: /^Actions for/ }));
139
140
  expect(await screen.findByRole("menuitem", { name: "Run" })).toBeTruthy();
140
141
  expect(screen.queryByRole("menuitem", { name: "Delete" })).toBeNull();
141
142
  });