@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
@@ -4,6 +4,8 @@ import { useState } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
5
  import { AttachmentImageLightbox } from "../attachment/AttachmentImageLightbox.js";
6
6
  import { UNSTYLED_BUTTON } from "../internal/form-primitives.js";
7
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
8
+ import { TruncatedText } from "../internal/truncated-text.js";
7
9
  import { useArtifactDownload } from "./useArtifactDownload.js";
8
10
  import { useArtifactDownloadUrl } from "./useArtifactDownloadUrl.js";
9
11
 
@@ -172,38 +174,45 @@ function ImagePreviewChip({
172
174
  }
173
175
 
174
176
  return (
175
- <span role="listitem" aria-label={name} title={name} className="stg:inline-flex">
176
- {/* The whole tile is the preview target. UNSTYLED_BUTTON adds the
177
- pointer cursor the image tile carries no other clickability
178
- cue. */}
179
- <button
180
- type="button"
181
- onClick={onPreview}
182
- aria-label={`Preview ${name}`}
183
- className={cn(
184
- UNSTYLED_BUTTON,
185
- "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",
186
- )}
177
+ <Tooltip>
178
+ <TooltipTrigger
179
+ render={<span role="listitem" aria-label={name} className="stg:inline-flex" />}
187
180
  >
188
- {url ? (
189
- <img
190
- src={url}
191
- alt=""
192
- aria-hidden="true"
193
- loading="lazy"
194
- className="stg:h-full stg:w-full stg:object-cover"
195
- />
196
- ) : (
197
- // Pulse placeholder while the presigned URL is minted — pulse
198
- // means work is genuinely in flight (contrast ImageGlyphTile).
199
- // Same footprint as the image, so no layout shift.
200
- <span
201
- className="stg:block stg:h-full stg:w-full stg:animate-pulse stg:bg-muted"
202
- aria-hidden="true"
203
- />
204
- )}
205
- </button>
206
- </span>
181
+ {/* The whole tile is the preview target. UNSTYLED_BUTTON adds the
182
+ pointer cursor — the image tile carries no other clickability
183
+ cue. */}
184
+ <button
185
+ type="button"
186
+ onClick={onPreview}
187
+ aria-label={`Preview ${name}`}
188
+ className={cn(
189
+ UNSTYLED_BUTTON,
190
+ "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",
191
+ )}
192
+ >
193
+ {url ? (
194
+ <img
195
+ src={url}
196
+ alt=""
197
+ aria-hidden="true"
198
+ loading="lazy"
199
+ className="stg:h-full stg:w-full stg:object-cover"
200
+ />
201
+ ) : (
202
+ // Pulse placeholder while the presigned URL is minted — pulse
203
+ // means work is genuinely in flight (contrast ImageGlyphTile).
204
+ // Same footprint as the image, so no layout shift.
205
+ <span
206
+ className="stg:block stg:h-full stg:w-full stg:animate-pulse stg:bg-muted"
207
+ aria-hidden="true"
208
+ />
209
+ )}
210
+ </button>
211
+ </TooltipTrigger>
212
+ <TooltipContent side="top" className="stg:break-all">
213
+ {name}
214
+ </TooltipContent>
215
+ </Tooltip>
207
216
  );
208
217
  }
209
218
 
@@ -215,14 +224,22 @@ function ImagePreviewChip({
215
224
  */
216
225
  function ImageGlyphTile({ name }: { readonly name: string }) {
217
226
  return (
218
- <span
219
- role="listitem"
220
- aria-label={name}
221
- title={name}
222
- className="stg:inline-flex stg:h-14 stg:w-14 stg:items-center stg:justify-center stg:rounded-md stg:bg-muted-subtle"
223
- >
224
- <ImageGlyph />
225
- </span>
227
+ <Tooltip>
228
+ <TooltipTrigger
229
+ render={
230
+ <span
231
+ role="listitem"
232
+ aria-label={name}
233
+ className="stg:inline-flex stg:h-14 stg:w-14 stg:items-center stg:justify-center stg:rounded-md stg:bg-muted-subtle"
234
+ />
235
+ }
236
+ >
237
+ <ImageGlyph />
238
+ </TooltipTrigger>
239
+ <TooltipContent side="top" className="stg:break-all">
240
+ {name}
241
+ </TooltipContent>
242
+ </Tooltip>
226
243
  );
227
244
  }
228
245
 
@@ -251,7 +268,7 @@ function DocumentChip({
251
268
  const content = (
252
269
  <>
253
270
  <FileGlyph />
254
- <span className="stg:min-w-0 stg:truncate">{name}</span>
271
+ <TruncatedText text={name} className="stg:min-w-0" />
255
272
  </>
256
273
  );
257
274
 
@@ -259,7 +276,6 @@ function DocumentChip({
259
276
  <span
260
277
  role="listitem"
261
278
  aria-label={name}
262
- title={name}
263
279
  className="stg:inline-flex stg:max-w-[200px] stg:items-center stg:rounded-md stg:bg-muted-subtle stg:px-2 stg:py-0.5 stg:text-xs stg:text-foreground"
264
280
  >
265
281
  {downloadable ? (
@@ -19,6 +19,7 @@ import {
19
19
  } from "./MessageAttachments.js";
20
20
  import { PlanDocumentMessage } from "./PlanDocumentMessage.js";
21
21
  import { useRenderTracer } from "../internal/dev/index.js";
22
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
22
23
 
23
24
  /** Props for {@link MessageEntry}. */
24
25
  export interface MessageEntryProps {
@@ -192,21 +193,27 @@ function HumanMessage({
192
193
  )}
193
194
  <p className="stg:text-sm stg:text-foreground stg:whitespace-pre-wrap">{content}</p>
194
195
  {onEdit && (
195
- <button
196
- type="button"
197
- onClick={onEdit}
198
- aria-label="Edit message"
199
- title="Edit"
200
- className={cn(
201
- "stg:absolute stg:-top-2.5 stg:-right-2.5 stg:inline-flex stg:h-7 stg:w-7 stg:items-center stg:justify-center stg:rounded-full",
202
- "stg:border stg:border-border stg:bg-card stg:text-muted-foreground stg:shadow-sm stg:transition",
203
- "stg:hover:text-foreground stg:hover:bg-accent-hover",
204
- "stg:opacity-0 stg:group-hover:opacity-100 stg:focus-visible:opacity-100",
205
- "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring",
206
- )}
207
- >
208
- <EditIcon />
209
- </button>
196
+ <Tooltip>
197
+ <TooltipTrigger
198
+ render={
199
+ <button
200
+ type="button"
201
+ onClick={onEdit}
202
+ aria-label="Edit message"
203
+ className={cn(
204
+ "stg:absolute stg:-top-2.5 stg:-right-2.5 stg:inline-flex stg:h-7 stg:w-7 stg:items-center stg:justify-center stg:rounded-full",
205
+ "stg:border stg:border-border stg:bg-card stg:text-muted-foreground stg:shadow-sm stg:transition",
206
+ "stg:hover:text-foreground stg:hover:bg-accent-hover",
207
+ "stg:opacity-0 stg:group-hover:opacity-100 stg:focus-visible:opacity-100",
208
+ "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring",
209
+ )}
210
+ />
211
+ }
212
+ >
213
+ <EditIcon />
214
+ </TooltipTrigger>
215
+ <TooltipContent side="top">Edit</TooltipContent>
216
+ </Tooltip>
210
217
  )}
211
218
  </div>
212
219
  );
@@ -3,6 +3,7 @@
3
3
  import { memo, useState, type ReactNode } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
5
  import type { ExecutionArtifact } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/artifact_pb";
6
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
6
7
  import { ArtifactPreviewModal } from "./ArtifactPreviewModal.js";
7
8
  import { formatArtifactSize } from "./artifact-utils.js";
8
9
  import { useArtifactCopy } from "./useArtifactCopy.js";
@@ -184,9 +185,11 @@ const FOCUS_RING =
184
185
  "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring stg:focus-visible:rounded-sm";
185
186
 
186
187
  /**
187
- * An icon-only secondary action. The accessible name doubles as the hover
188
- * tooltip (native `title` the codebase's tooltip pattern), and the padded
189
- * hit area keeps the target comfortable despite the compact glyph.
188
+ * An icon-only secondary action. The accessible name doubles as the house
189
+ * tooltip's content; the trigger is a wrapper span so the hint stays
190
+ * hoverable while the action is disabled (`pointer-events-none` on the
191
+ * button would otherwise take the tooltip down with it). The padded hit
192
+ * area keeps the target comfortable despite the compact glyph.
190
193
  */
191
194
  function IconAction({
192
195
  label,
@@ -200,21 +203,25 @@ function IconAction({
200
203
  readonly disabled?: boolean;
201
204
  }) {
202
205
  return (
203
- <button
204
- type="button"
205
- aria-label={label}
206
- title={label}
207
- onClick={onClick}
208
- disabled={disabled}
209
- className={cn(
210
- "stg:inline-flex stg:items-center stg:rounded-md stg:p-1.5 stg:text-muted-foreground",
211
- "stg:transition-colors stg:hover:bg-muted stg:hover:text-foreground",
212
- "stg:disabled:pointer-events-none stg:disabled:opacity-50",
213
- FOCUS_RING,
214
- )}
215
- >
216
- {icon}
217
- </button>
206
+ <Tooltip>
207
+ <TooltipTrigger render={<span className="stg:inline-flex" />}>
208
+ <button
209
+ type="button"
210
+ aria-label={label}
211
+ onClick={onClick}
212
+ disabled={disabled}
213
+ className={cn(
214
+ "stg:inline-flex stg:items-center stg:rounded-md stg:p-1.5 stg:text-muted-foreground",
215
+ "stg:transition-colors stg:hover:bg-muted stg:hover:text-foreground",
216
+ "stg:disabled:pointer-events-none stg:disabled:opacity-50",
217
+ FOCUS_RING,
218
+ )}
219
+ >
220
+ {icon}
221
+ </button>
222
+ </TooltipTrigger>
223
+ <TooltipContent side="top">{label}</TooltipContent>
224
+ </Tooltip>
218
225
  );
219
226
  }
220
227
 
@@ -312,10 +312,7 @@ function ProvenanceNote({ toolCall }: { toolCall: ToolCall }) {
312
312
  if (!provenance) return null;
313
313
 
314
314
  return (
315
- <p
316
- className="stg:text-[11px] stg:italic stg:text-muted-foreground"
317
- title={provenance}
318
- >
315
+ <p className="stg:text-[11px] stg:italic stg:text-muted-foreground">
319
316
  {provenance}
320
317
  </p>
321
318
  );
@@ -31,6 +31,7 @@ import type { FileReviewRowState } from "./file-review-status.js";
31
31
  import { FilePathLink } from "./FilePathLink.js";
32
32
  import { isFileCategory, type ToolCategory } from "./tool-categories.js";
33
33
  import { useToolPresentation } from "./tool-presenter.js";
34
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
34
35
 
35
36
  /** Props for {@link ToolCallItem}. */
36
37
  export interface ToolCallItemProps {
@@ -307,13 +308,23 @@ export const ToolCallItem = memo(function ToolCallItem({
307
308
  />
308
309
  ) : (
309
310
  displaySubtitle && (
310
- <span
311
- ref={measuresSubtitle ? subtitleRef : undefined}
312
- title={displaySubtitle}
313
- className="stg:min-w-0 stg:truncate stg:text-muted-foreground stg:font-mono"
314
- >
315
- {displaySubtitle}
316
- </span>
311
+ // Not TruncatedText: the span must carry the external measurement
312
+ // ref (useIsTextTruncated) that the expanded detail reads.
313
+ <Tooltip>
314
+ <TooltipTrigger
315
+ render={
316
+ <span
317
+ ref={measuresSubtitle ? subtitleRef : undefined}
318
+ className="stg:min-w-0 stg:truncate stg:text-muted-foreground stg:font-mono"
319
+ />
320
+ }
321
+ >
322
+ {displaySubtitle}
323
+ </TooltipTrigger>
324
+ <TooltipContent side="top" className="stg:break-all">
325
+ {displaySubtitle}
326
+ </TooltipContent>
327
+ </Tooltip>
317
328
  )
318
329
  )}
319
330
  {!isSubAgent && category !== "shell" && resultSummary && (
@@ -5,6 +5,8 @@ import type { WorkspaceWriteBack } from "@stigmer/protos/ai/stigmer/agentic/agen
5
5
  import { WorkspaceWriteBackPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/writeback_pb";
6
6
  import { cn } from "@stigmer/theme";
7
7
  import { DiffSummary } from "../version-history/DiffSummary.js";
8
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
9
+ import { TruncatedText } from "../internal/truncated-text.js";
8
10
  import {
9
11
  parseDiffStatSummary,
10
12
  trailingDiffStatLine,
@@ -73,12 +75,10 @@ export function WriteBackCard({ writeBack, className }: WriteBackCardProps) {
73
75
  >
74
76
  {/* Header: workspace name + quiet phase caption */}
75
77
  <div className="stg:flex stg:items-center stg:gap-2 stg:px-2 stg:py-1">
76
- <span
77
- className="stg:min-w-0 stg:flex-1 stg:truncate stg:text-xs stg:font-medium stg:text-foreground"
78
- title={displayName}
79
- >
80
- {displayName}
81
- </span>
78
+ <TruncatedText
79
+ text={displayName}
80
+ className="stg:min-w-0 stg:flex-1 stg:text-xs stg:font-medium stg:text-foreground"
81
+ />
82
82
  <PhaseCaption
83
83
  phase={writeBack.phase}
84
84
  pullRequestNumber={writeBack.pullRequestNumber}
@@ -236,16 +236,17 @@ function BranchRow({
236
236
 
237
237
  return (
238
238
  <div className="stg:group stg:flex stg:items-stretch">
239
- <div
240
- className="stg:flex stg:min-w-0 stg:flex-1 stg:items-center stg:gap-2 stg:px-2 stg:py-1 stg:text-xs"
241
- title={baseBranch ? `${branchName} \u2190 ${baseBranch}` : branchName}
242
- >
239
+ {/* The old row title restated "branch ← base", which is already visible
240
+ text; only the branch name can clip, so it alone carries the
241
+ overflow-gated tooltip. */}
242
+ <div className="stg:flex stg:min-w-0 stg:flex-1 stg:items-center stg:gap-2 stg:px-2 stg:py-1 stg:text-xs">
243
243
  <span className="stg:shrink-0 stg:text-muted-foreground">
244
244
  <GitBranchIcon />
245
245
  </span>
246
- <span className="stg:min-w-0 stg:truncate stg:font-mono stg:text-foreground">
247
- {branchName}
248
- </span>
246
+ <TruncatedText
247
+ text={branchName}
248
+ className="stg:min-w-0 stg:font-mono stg:text-foreground"
249
+ />
249
250
  {baseBranch && (
250
251
  <span className="stg:shrink-0 stg:font-mono stg:text-muted-foreground-faint">
251
252
  {"\u2190 "}
@@ -253,22 +254,30 @@ function BranchRow({
253
254
  </span>
254
255
  )}
255
256
  </div>
256
- <button
257
- type="button"
258
- onClick={handleCopy}
259
- aria-label={copied ? "Branch name copied" : `Copy branch name ${branchName}`}
260
- title={copied ? "Copied" : "Copy branch name"}
261
- className={cn(
262
- "stg:flex stg:shrink-0 stg:items-center stg:px-2 stg:text-muted-foreground stg:transition-opacity",
263
- copied
264
- ? "stg:opacity-100"
265
- : "stg:opacity-0 stg:group-hover:opacity-100 stg:focus-visible:opacity-100",
266
- "stg:hover:text-foreground",
267
- "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-inset stg:focus-visible:ring-ring",
268
- )}
269
- >
270
- {copied ? <CheckIcon /> : <CopyIcon />}
271
- </button>
257
+ <Tooltip>
258
+ <TooltipTrigger
259
+ render={
260
+ <button
261
+ type="button"
262
+ onClick={handleCopy}
263
+ aria-label={copied ? "Branch name copied" : `Copy branch name ${branchName}`}
264
+ className={cn(
265
+ "stg:flex stg:shrink-0 stg:items-center stg:px-2 stg:text-muted-foreground stg:transition-opacity",
266
+ copied
267
+ ? "stg:opacity-100"
268
+ : "stg:opacity-0 stg:group-hover:opacity-100 stg:focus-visible:opacity-100",
269
+ "stg:hover:text-foreground",
270
+ "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-inset stg:focus-visible:ring-ring",
271
+ )}
272
+ />
273
+ }
274
+ >
275
+ {copied ? <CheckIcon /> : <CopyIcon />}
276
+ </TooltipTrigger>
277
+ <TooltipContent side="top">
278
+ {copied ? "Copied" : "Copy branch name"}
279
+ </TooltipContent>
280
+ </Tooltip>
272
281
  </div>
273
282
  );
274
283
  }
@@ -132,8 +132,12 @@ describe("ArtifactRow — download", () => {
132
132
  });
133
133
  });
134
134
 
135
- it("labels the Download control 'Download ZIP' for a directory", () => {
135
+ it("renders the directory Download control with no native title", () => {
136
136
  renderRow({ artifact: dirArtifact("return-policy") });
137
- expect(screen.getByTitle("Download ZIP")).toBeTruthy();
137
+ // The "Download ZIP" copy moved to the house tooltip (native titles
138
+ // are banned — stigmer-cloud#268); its reveal is pinned in the
139
+ // real-browser suite (artifact-row-tooltips.layout.test.tsx).
140
+ expect(screen.getByLabelText("Download return-policy")).toBeTruthy();
141
+ expect(document.querySelector("[title]")).toBeNull();
138
142
  });
139
143
  });
@@ -68,11 +68,14 @@ describe("ArtifactRowView — the shared row primitive", () => {
68
68
  expect((download as HTMLButtonElement).disabled).toBe(true);
69
69
  });
70
70
 
71
- it("renders directory affordances (slash suffix, ZIP download title)", () => {
71
+ it("renders directory affordances with no native title anywhere", () => {
72
72
  renderView({
73
73
  item: { ...fileItem, name: "bundle", tooltip: "bundle", isDirectory: true },
74
74
  });
75
75
  expect(screen.getByText("bundle/")).toBeTruthy();
76
- expect(screen.getByTitle("Download ZIP")).toBeTruthy();
76
+ // The "Download ZIP" copy moved to the house tooltip (native titles
77
+ // are banned — stigmer-cloud#268); its reveal is pinned in the
78
+ // real-browser suite (artifact-row-tooltips.layout.test.tsx).
79
+ expect(document.querySelector("[title]")).toBeNull();
77
80
  });
78
81
  });
@@ -46,8 +46,8 @@ describe("FilePathLink filename-first display", () => {
46
46
  });
47
47
  });
48
48
 
49
- describe("FilePathLink full path on hover", () => {
50
- it("puts the absolute local path in the title (not the action verb)", () => {
49
+ describe("FilePathLink full path resolution", () => {
50
+ it("resolves the absolute local path into the accessible name (hover ride the house tooltip)", () => {
51
51
  const entries = [localEntry("my-app", "/Users/dev/my-app")];
52
52
  render(
53
53
  <FilePathContext.Provider value={{ workspaceEntries: entries }}>
@@ -55,14 +55,18 @@ describe("FilePathLink full path on hover", () => {
55
55
  </FilePathContext.Provider>,
56
56
  );
57
57
  const el = screen.getByRole("button");
58
- expect(el.getAttribute("title")).toBe("/Users/dev/my-app/src/main.go");
59
- // The action verb moves into the accessible name, with the path.
58
+ // The resolved path is observable in the accessible name; the visual
59
+ // hover reveal is the house tooltip (native titles are banned,
60
+ // stigmer-cloud#268).
60
61
  expect(el.getAttribute("aria-label")).toBe("Copy path: /Users/dev/my-app/src/main.go");
62
+ expect(el.getAttribute("title")).toBeNull();
61
63
  });
62
64
 
63
- it("falls back to the logical path in the title when unresolved", () => {
65
+ it("falls back to the logical path when unresolved", () => {
64
66
  render(<FilePathLink path="src/main.go" />);
65
- expect(screen.getByRole("button").getAttribute("title")).toBe("src/main.go");
67
+ const el = screen.getByRole("button");
68
+ expect(el.getAttribute("aria-label")).toBe("Copy path: src/main.go");
69
+ expect(el.getAttribute("title")).toBeNull();
66
70
  });
67
71
  });
68
72
 
@@ -883,7 +883,8 @@ describe("FileReviewCard", () => {
883
883
  expect(screen.getByText("a.ts")).toBeTruthy();
884
884
  expect(screen.getByText("b.ts")).toBeTruthy();
885
885
  expect(screen.getByRole("button", { name: /Copy path: src\/a\.ts/ })).toBeTruthy();
886
- expect(screen.getByTitle("src/a.ts")).toBeTruthy();
886
+ // Full path on hover rides the house tooltip; no native title remains.
887
+ expect(document.querySelector("[title]")).toBeNull();
887
888
  });
888
889
 
889
890
  it("keeps a single complete file collapsed behind the 'Files' expander", () => {
@@ -135,9 +135,10 @@ describe("MessageEntry attachment rendering", () => {
135
135
 
136
136
  // The tile is preview-only: no "screenshot.png" text node anywhere…
137
137
  expect(screen.queryByText("screenshot.png")).toBeNull();
138
- // …but the name stays reachable — tooltip on the listitem, aria on both.
138
+ // …but the name stays reachable — house tooltip on the tile (native
139
+ // titles are banned, stigmer-cloud#268), aria on both.
139
140
  const tile = screen.getByRole("listitem", { name: "screenshot.png" });
140
- expect(tile.getAttribute("title")).toBe("screenshot.png");
141
+ expect(tile.getAttribute("title")).toBeNull();
141
142
  expect(
142
143
  screen.getByRole("button", { name: "Preview screenshot.png" }),
143
144
  ).toBeTruthy();
@@ -365,7 +365,12 @@ describe("MessageThread", () => {
365
365
  // shows the folded set's changed file.
366
366
  expect(screen.getByText("File changes")).toBeTruthy();
367
367
  fireEvent.click(screen.getByRole("button", { name: "Show" }));
368
- expect(screen.getByTitle("src/a.ts")).toBeTruthy();
368
+ // The changed file renders as a FilePathLink whose accessible name
369
+ // carries the full path (the hover reveal is the house tooltip now —
370
+ // native titles are banned, stigmer-cloud#268).
371
+ expect(
372
+ screen.getByRole("button", { name: /Copy path: src\/a\.ts/ }),
373
+ ).toBeTruthy();
369
374
  expect(
370
375
  document.querySelector('[data-cursor-target="file-review-approve"]'),
371
376
  ).toBeNull();
@@ -0,0 +1,115 @@
1
+ // The interactive-trigger tooltip contract from the native-title sweep
2
+ // (stigmer-cloud#268), pinned in a real Chromium on ArtifactRowView. When
3
+ // an enabled control is its own tooltip trigger, keyboard FOCUS opens the
4
+ // hint too — the concrete accessibility gain over the native `title` this
5
+ // replaced, which no keyboard user ever saw. Focus-open is real focus
6
+ // machinery (Base UI opens on focus-visible), so only a real browser can
7
+ // pin it honestly.
8
+
9
+ import "../../../dist/styles.css";
10
+
11
+ import { describe, it, expect, vi, afterEach } from "vitest";
12
+ import { render, cleanup } from "@testing-library/react";
13
+ import { userEvent } from "@vitest/browser/context";
14
+ import { ArtifactRowView } from "../ArtifactRowView.js";
15
+
16
+ const ITEM = {
17
+ name: "report.pdf",
18
+ tooltip: "/workspace/output/report.pdf",
19
+ subtitlePath: null,
20
+ sizeBytes: 2048,
21
+ isDirectory: false,
22
+ };
23
+
24
+ function renderRow() {
25
+ const pane = document.createElement("div");
26
+ pane.className = "stgm";
27
+ pane.style.width = "320px";
28
+ document.body.appendChild(pane);
29
+ render(
30
+ <ul>
31
+ <ArtifactRowView
32
+ item={ITEM}
33
+ onOpen={() => {}}
34
+ onDownload={() => {}}
35
+ isDownloading={false}
36
+ />
37
+ </ul>,
38
+ { container: pane },
39
+ );
40
+ return pane;
41
+ }
42
+
43
+ function portaledText(pane: HTMLElement): string {
44
+ return Array.from(document.body.children)
45
+ .filter((node) => node !== pane)
46
+ .map((node) => node.textContent ?? "")
47
+ .join(" ");
48
+ }
49
+
50
+ afterEach(() => {
51
+ cleanup();
52
+ document.querySelectorAll(".stgm").forEach((node) => node.remove());
53
+ });
54
+
55
+ describe("ArtifactRowView tooltips", () => {
56
+ it("opens the full-path hint on keyboard focus — no pointer required", async () => {
57
+ const pane = renderRow();
58
+ expect(pane.querySelector("[title]")).toBeNull();
59
+
60
+ // Tab reaches the open button (first focusable in the row); the
61
+ // tooltip must follow focus per the interactive-trigger pattern.
62
+ await userEvent.tab();
63
+ const openButton = Array.from(pane.querySelectorAll("button")).find((el) =>
64
+ el.textContent?.includes("report.pdf"),
65
+ );
66
+ expect(document.activeElement).toBe(openButton);
67
+
68
+ await vi.waitFor(
69
+ () => expect(portaledText(pane)).toContain("/workspace/output/report.pdf"),
70
+ { timeout: 3000, interval: 50 },
71
+ );
72
+ });
73
+
74
+ it("keeps the download hint hoverable through the wrapper span", async () => {
75
+ const pane = renderRow();
76
+
77
+ const download = Array.from(pane.querySelectorAll("button")).find(
78
+ (el) => el.getAttribute("aria-label") === "Download report.pdf",
79
+ );
80
+ await userEvent.hover(download!.parentElement!);
81
+ await vi.waitFor(
82
+ () => expect(portaledText(pane)).toContain("Download"),
83
+ { timeout: 3000, interval: 50 },
84
+ );
85
+ await userEvent.unhover(download!.parentElement!);
86
+ });
87
+
88
+ it("says 'Download ZIP' for a directory", async () => {
89
+ const pane = document.createElement("div");
90
+ pane.className = "stgm";
91
+ pane.style.width = "320px";
92
+ document.body.appendChild(pane);
93
+ render(
94
+ <ul>
95
+ <ArtifactRowView
96
+ item={{ ...ITEM, name: "bundle", tooltip: "bundle", isDirectory: true }}
97
+ onOpen={() => {}}
98
+ onDownload={() => {}}
99
+ isDownloading={false}
100
+ />
101
+ </ul>,
102
+ { container: pane },
103
+ );
104
+
105
+ const download = Array.from(pane.querySelectorAll("button")).find(
106
+ (el) => el.getAttribute("aria-label") === "Download bundle",
107
+ );
108
+ await userEvent.hover(download!.parentElement!);
109
+ await vi.waitFor(
110
+ () => expect(portaledText(pane)).toContain("Download ZIP"),
111
+ { timeout: 3000, interval: 50 },
112
+ );
113
+ await userEvent.unhover(download!.parentElement!);
114
+ });
115
+ });
@@ -19,7 +19,7 @@ import type { Artifact } from "@stigmer/protos/ai/stigmer/agentic/artifact/v1/ap
19
19
  export interface ArtifactRowItem {
20
20
  /** Display label (file or directory name). */
21
21
  readonly name: string;
22
- /** Hover title — the fullest location/name known for the artifact. */
22
+ /** House-tooltip content — the fullest location/name known for the artifact. */
23
23
  readonly tooltip: string;
24
24
  /**
25
25
  * Disambiguation subtitle rendered after the name when another row shares