@stigmer/react 3.11.0 → 3.11.1-dev.20260812192248

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (396) hide show
  1. package/agent-instance/AgentInstanceList.d.ts.map +1 -1
  2. package/agent-instance/AgentInstanceList.js +2 -1
  3. package/agent-instance/AgentInstanceList.js.map +1 -1
  4. package/api-key/ApiKeyListPanel.d.ts.map +1 -1
  5. package/api-key/ApiKeyListPanel.js +2 -1
  6. package/api-key/ApiKeyListPanel.js.map +1 -1
  7. package/attachment/AttachmentChipList.d.ts.map +1 -1
  8. package/attachment/AttachmentChipList.js +9 -8
  9. package/attachment/AttachmentChipList.js.map +1 -1
  10. package/attachment/AttachmentImageLightbox.d.ts.map +1 -1
  11. package/attachment/AttachmentImageLightbox.js +1 -1
  12. package/attachment/AttachmentImageLightbox.js.map +1 -1
  13. package/channel/AgentChannelsPanel.d.ts.map +1 -1
  14. package/channel/AgentChannelsPanel.js +2 -1
  15. package/channel/AgentChannelsPanel.js.map +1 -1
  16. package/channel/ChannelConversationsDialog.d.ts.map +1 -1
  17. package/channel/ChannelConversationsDialog.js +2 -1
  18. package/channel/ChannelConversationsDialog.js.map +1 -1
  19. package/channel/ChannelTemplatesDialog.d.ts.map +1 -1
  20. package/channel/ChannelTemplatesDialog.js +2 -1
  21. package/channel/ChannelTemplatesDialog.js.map +1 -1
  22. package/channel-app/internal.d.ts.map +1 -1
  23. package/channel-app/internal.js +2 -1
  24. package/channel-app/internal.js.map +1 -1
  25. package/composer/ComposerToolbar.d.ts.map +1 -1
  26. package/composer/ComposerToolbar.js +10 -7
  27. package/composer/ComposerToolbar.js.map +1 -1
  28. package/composer/ConfigureMenu.d.ts.map +1 -1
  29. package/composer/ConfigureMenu.js +2 -1
  30. package/composer/ConfigureMenu.js.map +1 -1
  31. package/composer/ContextChip.d.ts.map +1 -1
  32. package/composer/ContextChip.js +2 -1
  33. package/composer/ContextChip.js.map +1 -1
  34. package/composer/ContextPopover.d.ts.map +1 -1
  35. package/composer/ContextPopover.js +2 -1
  36. package/composer/ContextPopover.js.map +1 -1
  37. package/composer/SessionComposer.d.ts +13 -0
  38. package/composer/SessionComposer.d.ts.map +1 -1
  39. package/composer/SessionComposer.js +12 -2
  40. package/composer/SessionComposer.js.map +1 -1
  41. package/conversation/ConversationMediaAttachment.d.ts.map +1 -1
  42. package/conversation/ConversationMediaAttachment.js +2 -1
  43. package/conversation/ConversationMediaAttachment.js.map +1 -1
  44. package/conversation/ConversationTimelineView.d.ts.map +1 -1
  45. package/conversation/ConversationTimelineView.js +14 -4
  46. package/conversation/ConversationTimelineView.js.map +1 -1
  47. package/conversation/conversationPresentation.d.ts +28 -0
  48. package/conversation/conversationPresentation.d.ts.map +1 -1
  49. package/conversation/conversationPresentation.js +38 -1
  50. package/conversation/conversationPresentation.js.map +1 -1
  51. package/cursor-accounts/MemberCoverageTable.d.ts.map +1 -1
  52. package/cursor-accounts/MemberCoverageTable.js +6 -5
  53. package/cursor-accounts/MemberCoverageTable.js.map +1 -1
  54. package/dashboard/DashboardKPICards.d.ts.map +1 -1
  55. package/dashboard/DashboardKPICards.js +3 -1
  56. package/dashboard/DashboardKPICards.js.map +1 -1
  57. package/datastore/CollectionRecordsBrowser.d.ts.map +1 -1
  58. package/datastore/CollectionRecordsBrowser.js +5 -2
  59. package/datastore/CollectionRecordsBrowser.js.map +1 -1
  60. package/environment/EnvironmentVariableEditor.d.ts.map +1 -1
  61. package/environment/EnvironmentVariableEditor.js +2 -1
  62. package/environment/EnvironmentVariableEditor.js.map +1 -1
  63. package/execution/ApprovalCard.d.ts.map +1 -1
  64. package/execution/ApprovalCard.js +1 -1
  65. package/execution/ApprovalCard.js.map +1 -1
  66. package/execution/ArtifactRowView.d.ts.map +1 -1
  67. package/execution/ArtifactRowView.js +2 -1
  68. package/execution/ArtifactRowView.js.map +1 -1
  69. package/execution/FilePathLink.d.ts +4 -4
  70. package/execution/FilePathLink.d.ts.map +1 -1
  71. package/execution/FilePathLink.js +4 -4
  72. package/execution/FilePathLink.js.map +1 -1
  73. package/execution/McpToolDetail.d.ts.map +1 -1
  74. package/execution/McpToolDetail.js +2 -1
  75. package/execution/McpToolDetail.js.map +1 -1
  76. package/execution/MessageAttachments.d.ts.map +1 -1
  77. package/execution/MessageAttachments.js +10 -8
  78. package/execution/MessageAttachments.js.map +1 -1
  79. package/execution/MessageEntry.d.ts.map +1 -1
  80. package/execution/MessageEntry.js +2 -1
  81. package/execution/MessageEntry.js.map +1 -1
  82. package/execution/PlanArtifactCard.d.ts.map +1 -1
  83. package/execution/PlanArtifactCard.js +7 -4
  84. package/execution/PlanArtifactCard.js.map +1 -1
  85. package/execution/ToolCallDetail.d.ts.map +1 -1
  86. package/execution/ToolCallDetail.js +1 -1
  87. package/execution/ToolCallDetail.js.map +1 -1
  88. package/execution/ToolCallItem.d.ts.map +1 -1
  89. package/execution/ToolCallItem.js +5 -1
  90. package/execution/ToolCallItem.js.map +1 -1
  91. package/execution/WriteBackCard.d.ts.map +1 -1
  92. package/execution/WriteBackCard.js +6 -4
  93. package/execution/WriteBackCard.js.map +1 -1
  94. package/execution/artifact-row-item.d.ts +1 -1
  95. package/execution/artifact-row-item.d.ts.map +1 -1
  96. package/file-reference/FileReferenceChipList.d.ts.map +1 -1
  97. package/file-reference/FileReferenceChipList.js +6 -1
  98. package/file-reference/FileReferenceChipList.js.map +1 -1
  99. package/iam-policy/OrgMembersPanel.d.ts.map +1 -1
  100. package/iam-policy/OrgMembersPanel.js +6 -5
  101. package/iam-policy/OrgMembersPanel.js.map +1 -1
  102. package/iam-policy/ProviderBadge.d.ts.map +1 -1
  103. package/iam-policy/ProviderBadge.js +3 -2
  104. package/iam-policy/ProviderBadge.js.map +1 -1
  105. package/iam-policy/RoleSelector.d.ts.map +1 -1
  106. package/iam-policy/RoleSelector.js +1 -1
  107. package/iam-policy/RoleSelector.js.map +1 -1
  108. package/identity-provider/IdentityProviderListPanel.d.ts.map +1 -1
  109. package/identity-provider/IdentityProviderListPanel.js +2 -1
  110. package/identity-provider/IdentityProviderListPanel.js.map +1 -1
  111. package/internal/truncated-text.d.ts +17 -0
  112. package/internal/truncated-text.d.ts.map +1 -0
  113. package/internal/truncated-text.js +27 -0
  114. package/internal/truncated-text.js.map +1 -0
  115. package/invitation/InvitationManager.d.ts.map +1 -1
  116. package/invitation/InvitationManager.js +4 -3
  117. package/invitation/InvitationManager.js.map +1 -1
  118. package/library/ScopeToggle.d.ts.map +1 -1
  119. package/library/ScopeToggle.js +10 -2
  120. package/library/ScopeToggle.js.map +1 -1
  121. package/library/VisibilitySelector.d.ts.map +1 -1
  122. package/library/VisibilitySelector.js +2 -1
  123. package/library/VisibilitySelector.js.map +1 -1
  124. package/mcp-server/McpServerConfigPanel.d.ts +30 -1
  125. package/mcp-server/McpServerConfigPanel.d.ts.map +1 -1
  126. package/mcp-server/McpServerConfigPanel.js +18 -8
  127. package/mcp-server/McpServerConfigPanel.js.map +1 -1
  128. package/mcp-server/McpServerConnectDialog.d.ts +12 -1
  129. package/mcp-server/McpServerConnectDialog.d.ts.map +1 -1
  130. package/mcp-server/McpServerConnectDialog.js +8 -7
  131. package/mcp-server/McpServerConnectDialog.js.map +1 -1
  132. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  133. package/mcp-server/McpServerDetailView.js +4 -4
  134. package/mcp-server/McpServerDetailView.js.map +1 -1
  135. package/mcp-server/McpServerPicker.d.ts.map +1 -1
  136. package/mcp-server/McpServerPicker.js +86 -5
  137. package/mcp-server/McpServerPicker.js.map +1 -1
  138. package/mcp-server/McpToolSelector.d.ts.map +1 -1
  139. package/mcp-server/McpToolSelector.js +2 -1
  140. package/mcp-server/McpToolSelector.js.map +1 -1
  141. package/mcp-server/VendorApprovalBlockedNotice.d.ts +77 -0
  142. package/mcp-server/VendorApprovalBlockedNotice.d.ts.map +1 -0
  143. package/mcp-server/VendorApprovalBlockedNotice.js +62 -0
  144. package/mcp-server/VendorApprovalBlockedNotice.js.map +1 -0
  145. package/mcp-server/mcpServerSetupReducer.d.ts +18 -0
  146. package/mcp-server/mcpServerSetupReducer.d.ts.map +1 -1
  147. package/mcp-server/mcpServerSetupReducer.js +6 -0
  148. package/mcp-server/mcpServerSetupReducer.js.map +1 -1
  149. package/mcp-server/useMcpServerSetup.d.ts.map +1 -1
  150. package/mcp-server/useMcpServerSetup.js +7 -0
  151. package/mcp-server/useMcpServerSetup.js.map +1 -1
  152. package/oauth-app/OAuthAppListPanel.d.ts.map +1 -1
  153. package/oauth-app/OAuthAppListPanel.js +2 -1
  154. package/oauth-app/OAuthAppListPanel.js.map +1 -1
  155. package/package.json +4 -4
  156. package/platform-client/PlatformClientListPanel.d.ts.map +1 -1
  157. package/platform-client/PlatformClientListPanel.js +3 -2
  158. package/platform-client/PlatformClientListPanel.js.map +1 -1
  159. package/pricing-governance/BaselineEditor.d.ts.map +1 -1
  160. package/pricing-governance/BaselineEditor.js +7 -1
  161. package/pricing-governance/BaselineEditor.js.map +1 -1
  162. package/pricing-governance/ModelCatalogPanel.d.ts.map +1 -1
  163. package/pricing-governance/ModelCatalogPanel.js +2 -1
  164. package/pricing-governance/ModelCatalogPanel.js.map +1 -1
  165. package/pricing-governance/PricingGovernanceConsole.d.ts.map +1 -1
  166. package/pricing-governance/PricingGovernanceConsole.js +2 -1
  167. package/pricing-governance/PricingGovernanceConsole.js.map +1 -1
  168. package/pricing-governance/PricingGovernancePanel.d.ts.map +1 -1
  169. package/pricing-governance/PricingGovernancePanel.js +2 -1
  170. package/pricing-governance/PricingGovernancePanel.js.map +1 -1
  171. package/resource-workbench/components/StatusBadge.d.ts.map +1 -1
  172. package/resource-workbench/components/StatusBadge.js +2 -1
  173. package/resource-workbench/components/StatusBadge.js.map +1 -1
  174. package/schedule/CadenceField.d.ts.map +1 -1
  175. package/schedule/CadenceField.js +15 -8
  176. package/schedule/CadenceField.js.map +1 -1
  177. package/schedule/ScheduleRunsTable.d.ts.map +1 -1
  178. package/schedule/ScheduleRunsTable.js +3 -2
  179. package/schedule/ScheduleRunsTable.js.map +1 -1
  180. package/session/PlanEditor.d.ts.map +1 -1
  181. package/session/PlanEditor.js +3 -5
  182. package/session/PlanEditor.js.map +1 -1
  183. package/sharing/AgentShareList.d.ts.map +1 -1
  184. package/sharing/AgentShareList.js +3 -1
  185. package/sharing/AgentShareList.js.map +1 -1
  186. package/sharing/ShareAgentDialog.d.ts.map +1 -1
  187. package/sharing/ShareAgentDialog.js +2 -1
  188. package/sharing/ShareAgentDialog.js.map +1 -1
  189. package/skill/SkillDetailView.d.ts.map +1 -1
  190. package/skill/SkillDetailView.js +3 -2
  191. package/skill/SkillDetailView.js.map +1 -1
  192. package/src/__tests__/helpers/open-menu.ts +88 -0
  193. package/src/__tests__/portal-container.test.tsx +3 -3
  194. package/src/agent-instance/AgentInstanceList.tsx +5 -6
  195. package/src/agent-instance/__tests__/AgentInstanceList.test.tsx +5 -4
  196. package/src/api-key/ApiKeyListPanel.tsx +11 -3
  197. package/src/attachment/AttachmentChipList.tsx +74 -65
  198. package/src/attachment/AttachmentImageLightbox.tsx +5 -4
  199. package/src/attachment/__tests__/AttachmentChipList.test.tsx +4 -3
  200. package/src/channel/AgentChannelsPanel.tsx +5 -6
  201. package/src/channel/ChannelConversationsDialog.tsx +5 -3
  202. package/src/channel/ChannelTemplatesDialog.tsx +5 -6
  203. package/src/channel/__tests__/AgentChannelsPanel.test.tsx +14 -9
  204. package/src/channel-app/internal.tsx +5 -6
  205. package/src/composer/ComposerToolbar.tsx +122 -90
  206. package/src/composer/ConfigureMenu.tsx +33 -24
  207. package/src/composer/ContextChip.tsx +2 -3
  208. package/src/composer/ContextPopover.tsx +27 -18
  209. package/src/composer/SessionComposer.tsx +41 -9
  210. package/src/composer/__tests__/SessionComposer-agentSetupError.test.tsx +124 -0
  211. package/src/composer/__tests__/SessionComposer-lockAgent.test.tsx +4 -9
  212. package/src/conversation/ConversationMediaAttachment.tsx +2 -2
  213. package/src/conversation/ConversationTimelineView.tsx +19 -2
  214. package/src/conversation/__tests__/ConversationTimelineView.test.tsx +106 -3
  215. package/src/conversation/conversationPresentation.ts +52 -1
  216. package/src/cursor-accounts/MemberCoverageTable.tsx +15 -13
  217. package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +4 -4
  218. package/src/dashboard/DashboardKPICards.tsx +2 -1
  219. package/src/datastore/CollectionRecordsBrowser.tsx +8 -7
  220. package/src/environment/EnvironmentVariableEditor.tsx +17 -6
  221. package/src/execution/ApprovalCard.tsx +1 -3
  222. package/src/execution/ArtifactRowView.tsx +68 -48
  223. package/src/execution/FilePathLink.tsx +43 -27
  224. package/src/execution/McpToolDetail.tsx +6 -2
  225. package/src/execution/MessageAttachments.tsx +57 -41
  226. package/src/execution/MessageEntry.tsx +22 -15
  227. package/src/execution/PlanArtifactCard.tsx +25 -18
  228. package/src/execution/ToolCallDetail.tsx +1 -4
  229. package/src/execution/ToolCallItem.tsx +18 -7
  230. package/src/execution/WriteBackCard.tsx +38 -29
  231. package/src/execution/__tests__/ArtifactRow.test.tsx +6 -2
  232. package/src/execution/__tests__/ArtifactRowView.test.tsx +5 -2
  233. package/src/execution/__tests__/FilePathLink.test.tsx +10 -6
  234. package/src/execution/__tests__/FileReviewCard.test.tsx +2 -1
  235. package/src/execution/__tests__/MessageEntry-attachments.test.tsx +3 -2
  236. package/src/execution/__tests__/MessageThread.test.tsx +6 -1
  237. package/src/execution/__tests__/artifact-row-tooltips.layout.test.tsx +115 -0
  238. package/src/execution/artifact-row-item.ts +1 -1
  239. package/src/file-reference/FileReferenceChipList.tsx +29 -17
  240. package/src/file-reference/__tests__/FileReferenceChipList.test.tsx +5 -2
  241. package/src/iam-policy/OrgMembersPanel.tsx +26 -19
  242. package/src/iam-policy/ProviderBadge.tsx +17 -10
  243. package/src/iam-policy/RoleSelector.tsx +0 -1
  244. package/src/identity-provider/IdentityProviderListPanel.tsx +11 -3
  245. package/src/internal/__tests__/truncated-text.layout.test.tsx +68 -0
  246. package/src/internal/__tests__/truncated-text.test.tsx +33 -0
  247. package/src/internal/truncated-text.tsx +81 -0
  248. package/src/invitation/InvitationManager.tsx +18 -5
  249. package/src/library/ScopeToggle.tsx +14 -2
  250. package/src/library/VisibilitySelector.tsx +21 -14
  251. package/src/mcp-server/McpServerConfigPanel.tsx +79 -37
  252. package/src/mcp-server/McpServerConnectDialog.tsx +41 -5
  253. package/src/mcp-server/McpServerDetailView.tsx +23 -39
  254. package/src/mcp-server/McpServerPicker.tsx +99 -7
  255. package/src/mcp-server/McpToolSelector.tsx +12 -7
  256. package/src/mcp-server/VendorApprovalBlockedNotice.tsx +221 -0
  257. package/src/mcp-server/__tests__/McpServerPicker.test.tsx +504 -0
  258. package/src/mcp-server/__tests__/VendorApprovalBlocked.surfaces.test.tsx +321 -0
  259. package/src/mcp-server/__tests__/VendorApprovalBlockedNotice.test.tsx +154 -0
  260. package/src/mcp-server/mcpServerSetupReducer.ts +24 -0
  261. package/src/mcp-server/useMcpServerSetup.ts +9 -0
  262. package/src/oauth-app/OAuthAppListPanel.tsx +11 -3
  263. package/src/platform-client/PlatformClientListPanel.tsx +35 -18
  264. package/src/pricing-governance/BaselineEditor.tsx +20 -0
  265. package/src/pricing-governance/ModelCatalogPanel.tsx +9 -5
  266. package/src/pricing-governance/PricingGovernanceConsole.tsx +9 -5
  267. package/src/pricing-governance/PricingGovernancePanel.tsx +13 -4
  268. package/src/pricing-governance/__tests__/ModelCatalogPanel.test.tsx +37 -0
  269. package/src/resource-workbench/components/StatusBadge.tsx +7 -3
  270. package/src/schedule/CadenceField.tsx +38 -27
  271. package/src/schedule/ScheduleRunsTable.tsx +23 -11
  272. package/src/schedule/__tests__/cadence-tooltips.layout.test.tsx +86 -0
  273. package/src/session/PlanEditor.tsx +9 -8
  274. package/src/sharing/AgentShareList.tsx +28 -22
  275. package/src/sharing/ShareAgentDialog.tsx +5 -6
  276. package/src/sharing/__tests__/AgentShareList.test.tsx +4 -4
  277. package/src/skill/SkillDetailView.tsx +23 -12
  278. package/src/version-history/VersionTimelineEntry.tsx +21 -12
  279. package/src/workflow/CanvasTransitionEdge.tsx +23 -16
  280. package/src/workflow/ExecutionActiveTaskIndicator.tsx +74 -59
  281. package/src/workflow/TaskPickerPopover.tsx +0 -1
  282. package/src/workflow/WorkflowCanvasEditor.tsx +95 -64
  283. package/src/workflow/WorkflowNode.tsx +13 -6
  284. package/src/workflow/WorkflowTaskApprovalSummary.tsx +18 -11
  285. package/src/workflow/WorkflowTaskList.tsx +2 -2
  286. package/src/workflow/WorkflowVersionBadge.tsx +33 -18
  287. package/src/workflow/WorkflowVersionTimeline.tsx +7 -6
  288. package/src/workflow/__tests__/WorkflowTaskApprovalSummary.test.tsx +3 -1
  289. package/src/workflow/__tests__/structured-data-viewer.test.tsx +5 -2
  290. package/src/workflow/execution-comparison/ExecutionComparisonView.tsx +5 -3
  291. package/src/workflow/execution-comparison/TaskComparisonTable.tsx +12 -5
  292. package/src/workflow/execution-history/ExecutionHistoryTable.tsx +24 -15
  293. package/src/workflow/inspector/InspectorHeader.tsx +20 -11
  294. package/src/workflow/inspector/NestedTaskList.tsx +18 -11
  295. package/src/workflow/inspector/WorkflowSummaryPanel.tsx +5 -3
  296. package/src/workflow/inspector/tabs/BranchesTab.tsx +61 -31
  297. package/src/workflow/instance/WorkflowInstanceList.tsx +5 -6
  298. package/src/workflow/instance/__tests__/WorkflowInstanceList.test.tsx +5 -4
  299. package/src/workflow/node-shell/DiffBadge.tsx +18 -11
  300. package/src/workflow/node-shell/ExecutionBadge.tsx +73 -46
  301. package/src/workflow/node-shell/NodeActions.tsx +128 -94
  302. package/src/workflow/task-detail/StructuredDataViewer.tsx +4 -2
  303. package/src/workspace/EditorTabs.tsx +102 -85
  304. package/src/workspace/ExplorerTree.tsx +47 -30
  305. package/src/workspace/FileViewer.tsx +11 -3
  306. package/src/workspace/PanelChip.tsx +32 -23
  307. package/src/workspace/WorkspaceEditor.tsx +21 -9
  308. package/src/workspace/WorkspaceSummary.tsx +21 -12
  309. package/src/workspace/WorkspaceSurface.tsx +86 -61
  310. package/src/workspace/__tests__/EditorTabs.test.tsx +5 -2
  311. package/src/workspace/__tests__/WorkspaceSurface.test.tsx +5 -2
  312. package/version-history/VersionTimelineEntry.d.ts.map +1 -1
  313. package/version-history/VersionTimelineEntry.js +2 -1
  314. package/version-history/VersionTimelineEntry.js.map +1 -1
  315. package/workflow/CanvasTransitionEdge.d.ts.map +1 -1
  316. package/workflow/CanvasTransitionEdge.js +3 -2
  317. package/workflow/CanvasTransitionEdge.js.map +1 -1
  318. package/workflow/ExecutionActiveTaskIndicator.d.ts.map +1 -1
  319. package/workflow/ExecutionActiveTaskIndicator.js +12 -11
  320. package/workflow/ExecutionActiveTaskIndicator.js.map +1 -1
  321. package/workflow/TaskPickerPopover.js +1 -1
  322. package/workflow/TaskPickerPopover.js.map +1 -1
  323. package/workflow/WorkflowCanvasEditor.d.ts.map +1 -1
  324. package/workflow/WorkflowCanvasEditor.js +9 -2
  325. package/workflow/WorkflowCanvasEditor.js.map +1 -1
  326. package/workflow/WorkflowNode.d.ts.map +1 -1
  327. package/workflow/WorkflowNode.js +2 -1
  328. package/workflow/WorkflowNode.js.map +1 -1
  329. package/workflow/WorkflowTaskApprovalSummary.d.ts.map +1 -1
  330. package/workflow/WorkflowTaskApprovalSummary.js +6 -4
  331. package/workflow/WorkflowTaskApprovalSummary.js.map +1 -1
  332. package/workflow/WorkflowTaskList.js +2 -2
  333. package/workflow/WorkflowTaskList.js.map +1 -1
  334. package/workflow/WorkflowVersionBadge.d.ts.map +1 -1
  335. package/workflow/WorkflowVersionBadge.js +2 -1
  336. package/workflow/WorkflowVersionBadge.js.map +1 -1
  337. package/workflow/WorkflowVersionTimeline.d.ts.map +1 -1
  338. package/workflow/WorkflowVersionTimeline.js +2 -1
  339. package/workflow/WorkflowVersionTimeline.js.map +1 -1
  340. package/workflow/execution-comparison/ExecutionComparisonView.d.ts.map +1 -1
  341. package/workflow/execution-comparison/ExecutionComparisonView.js +2 -1
  342. package/workflow/execution-comparison/ExecutionComparisonView.js.map +1 -1
  343. package/workflow/execution-comparison/TaskComparisonTable.d.ts.map +1 -1
  344. package/workflow/execution-comparison/TaskComparisonTable.js +2 -1
  345. package/workflow/execution-comparison/TaskComparisonTable.js.map +1 -1
  346. package/workflow/execution-history/ExecutionHistoryTable.d.ts.map +1 -1
  347. package/workflow/execution-history/ExecutionHistoryTable.js +6 -4
  348. package/workflow/execution-history/ExecutionHistoryTable.js.map +1 -1
  349. package/workflow/inspector/InspectorHeader.d.ts.map +1 -1
  350. package/workflow/inspector/InspectorHeader.js +4 -2
  351. package/workflow/inspector/InspectorHeader.js.map +1 -1
  352. package/workflow/inspector/NestedTaskList.d.ts.map +1 -1
  353. package/workflow/inspector/NestedTaskList.js +2 -1
  354. package/workflow/inspector/NestedTaskList.js.map +1 -1
  355. package/workflow/inspector/WorkflowSummaryPanel.d.ts.map +1 -1
  356. package/workflow/inspector/WorkflowSummaryPanel.js +2 -1
  357. package/workflow/inspector/WorkflowSummaryPanel.js.map +1 -1
  358. package/workflow/inspector/tabs/BranchesTab.d.ts.map +1 -1
  359. package/workflow/inspector/tabs/BranchesTab.js +5 -2
  360. package/workflow/inspector/tabs/BranchesTab.js.map +1 -1
  361. package/workflow/instance/WorkflowInstanceList.d.ts.map +1 -1
  362. package/workflow/instance/WorkflowInstanceList.js +2 -1
  363. package/workflow/instance/WorkflowInstanceList.js.map +1 -1
  364. package/workflow/node-shell/DiffBadge.d.ts.map +1 -1
  365. package/workflow/node-shell/DiffBadge.js +3 -2
  366. package/workflow/node-shell/DiffBadge.js.map +1 -1
  367. package/workflow/node-shell/ExecutionBadge.d.ts.map +1 -1
  368. package/workflow/node-shell/ExecutionBadge.js +5 -4
  369. package/workflow/node-shell/ExecutionBadge.js.map +1 -1
  370. package/workflow/node-shell/NodeActions.d.ts.map +1 -1
  371. package/workflow/node-shell/NodeActions.js +12 -11
  372. package/workflow/node-shell/NodeActions.js.map +1 -1
  373. package/workflow/task-detail/StructuredDataViewer.d.ts.map +1 -1
  374. package/workflow/task-detail/StructuredDataViewer.js +5 -1
  375. package/workflow/task-detail/StructuredDataViewer.js.map +1 -1
  376. package/workspace/EditorTabs.d.ts.map +1 -1
  377. package/workspace/EditorTabs.js +38 -37
  378. package/workspace/EditorTabs.js.map +1 -1
  379. package/workspace/ExplorerTree.d.ts.map +1 -1
  380. package/workspace/ExplorerTree.js +2 -1
  381. package/workspace/ExplorerTree.js.map +1 -1
  382. package/workspace/FileViewer.d.ts.map +1 -1
  383. package/workspace/FileViewer.js +2 -1
  384. package/workspace/FileViewer.js.map +1 -1
  385. package/workspace/PanelChip.d.ts.map +1 -1
  386. package/workspace/PanelChip.js +2 -1
  387. package/workspace/PanelChip.js.map +1 -1
  388. package/workspace/WorkspaceEditor.d.ts.map +1 -1
  389. package/workspace/WorkspaceEditor.js +2 -1
  390. package/workspace/WorkspaceEditor.js.map +1 -1
  391. package/workspace/WorkspaceSummary.d.ts.map +1 -1
  392. package/workspace/WorkspaceSummary.js +7 -2
  393. package/workspace/WorkspaceSummary.js.map +1 -1
  394. package/workspace/WorkspaceSurface.d.ts.map +1 -1
  395. package/workspace/WorkspaceSurface.js +12 -11
  396. package/workspace/WorkspaceSurface.js.map +1 -1
@@ -3,6 +3,12 @@
3
3
  import { useCallback, type KeyboardEvent, type MouseEvent } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
5
  import { editorKey, type OpenEditor } from "../internal/store/index.js";
6
+ import {
7
+ Tooltip,
8
+ TooltipContent,
9
+ TooltipProvider,
10
+ TooltipTrigger,
11
+ } from "../internal/tooltip.js";
6
12
 
7
13
  /**
8
14
  * Deterministic, space-free DOM id for a tab, built from an instance-scoped
@@ -73,94 +79,105 @@ export function EditorTabs({
73
79
  );
74
80
 
75
81
  return (
76
- <div
77
- role="tablist"
78
- aria-label="Open editors"
79
- aria-orientation="horizontal"
80
- className={cn(
81
- "stg:flex stg:shrink-0 stg:items-stretch stg:overflow-x-auto stg:border-b stg:border-border",
82
- className,
83
- )}
84
- >
85
- {editors.map((editor, index) => {
86
- const key = editorKey(editor.entryId, editor.path);
87
- const isActive = key === activeKey;
88
- const lastSlash = editor.path.lastIndexOf("/");
89
- const basename =
90
- lastSlash >= 0 ? editor.path.slice(lastSlash + 1) : editor.path;
82
+ <TooltipProvider>
83
+ <div
84
+ role="tablist"
85
+ aria-label="Open editors"
86
+ aria-orientation="horizontal"
87
+ className={cn(
88
+ "stg:flex stg:shrink-0 stg:items-stretch stg:overflow-x-auto stg:border-b stg:border-border",
89
+ className,
90
+ )}
91
+ >
92
+ {editors.map((editor, index) => {
93
+ const key = editorKey(editor.entryId, editor.path);
94
+ const isActive = key === activeKey;
95
+ const lastSlash = editor.path.lastIndexOf("/");
96
+ const basename =
97
+ lastSlash >= 0 ? editor.path.slice(lastSlash + 1) : editor.path;
91
98
 
92
- const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {
93
- if (e.key === "ArrowRight") {
94
- e.preventDefault();
95
- move(index, 1);
96
- } else if (e.key === "ArrowLeft") {
97
- e.preventDefault();
98
- move(index, -1);
99
- } else if (e.key === "Enter" || e.key === " ") {
100
- e.preventDefault();
101
- onActivate(editor.entryId, editor.path);
102
- } else if (e.key === "Delete" || e.key === "Backspace") {
103
- e.preventDefault();
104
- onClose(editor.entryId, editor.path);
105
- }
106
- };
99
+ const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {
100
+ if (e.key === "ArrowRight") {
101
+ e.preventDefault();
102
+ move(index, 1);
103
+ } else if (e.key === "ArrowLeft") {
104
+ e.preventDefault();
105
+ move(index, -1);
106
+ } else if (e.key === "Enter" || e.key === " ") {
107
+ e.preventDefault();
108
+ onActivate(editor.entryId, editor.path);
109
+ } else if (e.key === "Delete" || e.key === "Backspace") {
110
+ e.preventDefault();
111
+ onClose(editor.entryId, editor.path);
112
+ }
113
+ };
107
114
 
108
- const handleAuxClick = (e: MouseEvent<HTMLDivElement>) => {
109
- // Middle click closes, matching browser/editor tab conventions.
110
- if (e.button === 1) {
111
- e.preventDefault();
112
- onClose(editor.entryId, editor.path);
113
- }
114
- };
115
+ const handleAuxClick = (e: MouseEvent<HTMLDivElement>) => {
116
+ // Middle click closes, matching browser/editor tab conventions.
117
+ if (e.button === 1) {
118
+ e.preventDefault();
119
+ onClose(editor.entryId, editor.path);
120
+ }
121
+ };
115
122
 
116
- return (
117
- <div
118
- key={key}
119
- role="tab"
120
- id={tabIdPrefix ? editorTabDomId(tabIdPrefix, key) : undefined}
121
- aria-selected={isActive}
122
- aria-controls={panelId}
123
- tabIndex={isActive ? 0 : -1}
124
- title={editor.path}
125
- onClick={() => onActivate(editor.entryId, editor.path)}
126
- onDoubleClick={() => onPin(editor.entryId, editor.path)}
127
- onAuxClick={handleAuxClick}
128
- onKeyDown={handleKeyDown}
129
- className={cn(
130
- "stg:group stg:flex stg:max-w-[12rem] stg:shrink-0 stg:cursor-pointer stg:items-center stg:gap-1.5 stg:border-r stg:border-border stg:px-3 stg:py-1.5 stg:text-xs stg:transition-colors",
131
- "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-inset stg:focus-visible:ring-ring",
132
- isActive
133
- ? "stg:bg-background stg:text-foreground"
134
- : "stg:bg-muted-faint stg:text-muted-foreground stg:hover:bg-muted stg:hover:text-foreground",
135
- )}
136
- >
137
- <span className={cn("stg:truncate", editor.preview && "stg:italic")}>
138
- {basename}
139
- </span>
140
- {/* The visual close "X" is a presentational mouse affordance, NOT a
141
- nested interactive control: a `<button>` inside `role="tab"` would
142
- violate WCAG 4.1.2 (axe `nested-interactive`). Assistive tech and
143
- keyboard users close the focused tab via Delete/Backspace (handled
144
- above), so `aria-hidden` here removes the redundant nested control
145
- without losing the close action for anyone. */}
146
- <span
147
- aria-hidden="true"
148
- title={`Close ${basename}`}
149
- onClick={(e) => {
150
- e.stopPropagation();
151
- onClose(editor.entryId, editor.path);
152
- }}
153
- className={cn(
154
- "stg:shrink-0 stg:cursor-pointer stg:rounded stg:p-0.5 stg:text-muted-foreground stg:transition-opacity stg:hover:bg-accent-hover stg:hover:text-foreground",
155
- isActive ? "stg:opacity-100" : "stg:opacity-0 stg:group-hover:opacity-100",
156
- )}
157
- >
158
- <CloseIcon />
159
- </span>
160
- </div>
161
- );
162
- })}
163
- </div>
123
+ return (
124
+ <Tooltip key={key}>
125
+ <TooltipTrigger
126
+ render={
127
+ <div
128
+ role="tab"
129
+ id={tabIdPrefix ? editorTabDomId(tabIdPrefix, key) : undefined}
130
+ aria-selected={isActive}
131
+ aria-controls={panelId}
132
+ tabIndex={isActive ? 0 : -1}
133
+ onClick={() => onActivate(editor.entryId, editor.path)}
134
+ onDoubleClick={() => onPin(editor.entryId, editor.path)}
135
+ onAuxClick={handleAuxClick}
136
+ onKeyDown={handleKeyDown}
137
+ className={cn(
138
+ "stg:group stg:flex stg:max-w-[12rem] stg:shrink-0 stg:cursor-pointer stg:items-center stg:gap-1.5 stg:border-r stg:border-border stg:px-3 stg:py-1.5 stg:text-xs stg:transition-colors",
139
+ "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-inset stg:focus-visible:ring-ring",
140
+ isActive
141
+ ? "stg:bg-background stg:text-foreground"
142
+ : "stg:bg-muted-faint stg:text-muted-foreground stg:hover:bg-muted stg:hover:text-foreground",
143
+ )}
144
+ />
145
+ }
146
+ >
147
+ <span className={cn("stg:truncate", editor.preview && "stg:italic")}>
148
+ {basename}
149
+ </span>
150
+ {/* The visual close "X" is a presentational mouse affordance, NOT a
151
+ nested interactive control: a `<button>` inside `role="tab"` would
152
+ violate WCAG 4.1.2 (axe `nested-interactive`). Assistive tech and
153
+ keyboard users close the focused tab via Delete/Backspace (handled
154
+ above), so `aria-hidden` here removes the redundant nested control
155
+ without losing the close action for anyone. It carries no tooltip
156
+ of its own: it sits inside the tab's tooltip trigger, so a nested
157
+ trigger would pop two tooltips at once, and its old title only
158
+ restated the visible basename. */}
159
+ <span
160
+ aria-hidden="true"
161
+ onClick={(e) => {
162
+ e.stopPropagation();
163
+ onClose(editor.entryId, editor.path);
164
+ }}
165
+ className={cn(
166
+ "stg:shrink-0 stg:cursor-pointer stg:rounded stg:p-0.5 stg:text-muted-foreground stg:transition-opacity stg:hover:bg-accent-hover stg:hover:text-foreground",
167
+ isActive ? "stg:opacity-100" : "stg:opacity-0 stg:group-hover:opacity-100",
168
+ )}
169
+ >
170
+ <CloseIcon />
171
+ </span>
172
+ </TooltipTrigger>
173
+ <TooltipContent side="top" className="stg:break-all">
174
+ {editor.path}
175
+ </TooltipContent>
176
+ </Tooltip>
177
+ );
178
+ })}
179
+ </div>
180
+ </TooltipProvider>
164
181
  );
165
182
  }
166
183
 
@@ -4,6 +4,7 @@ import { useState } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
5
  import { FileTreeNode } from "../internal/file-tree/index.js";
6
6
  import type { SelectedWorkspaceFile } from "../internal/store/index.js";
7
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
7
8
  import { useWorkspaceFiles } from "./useWorkspaceFiles.js";
8
9
  import type { WorkspaceEntry } from "./useWorkspaceEntries.js";
9
10
  import type { WorkspaceFileLister } from "./WorkspaceFileLister.js";
@@ -91,38 +92,54 @@ function ExplorerRoot({
91
92
  return (
92
93
  <div className="stg:flex stg:flex-col">
93
94
  <div className="stg:group/root stg:flex stg:items-stretch">
94
- <button
95
- type="button"
96
- onClick={() => setExpanded((prev) => !prev)}
97
- aria-expanded={expanded}
98
- className={cn(
99
- "stg:flex stg:min-w-0 stg:flex-1 stg:items-center stg:gap-1.5 stg:px-1.5 stg:py-1 stg:text-left stg:text-[0.7rem] stg:font-semibold stg:uppercase stg:tracking-wide stg:text-foreground stg:transition-colors stg:hover:bg-accent-hover",
100
- "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-inset stg:focus-visible:ring-ring",
101
- )}
102
- title={entry.type === "local" ? entry.localPath : entry.gitUrl}
103
- >
104
- <span
105
- aria-hidden="true"
106
- className="stg:text-[10px] stg:text-muted-foreground-subtle"
95
+ <Tooltip>
96
+ <TooltipTrigger
97
+ render={
98
+ <button
99
+ type="button"
100
+ onClick={() => setExpanded((prev) => !prev)}
101
+ aria-expanded={expanded}
102
+ className={cn(
103
+ "stg:flex stg:min-w-0 stg:flex-1 stg:items-center stg:gap-1.5 stg:px-1.5 stg:py-1 stg:text-left stg:text-[0.7rem] stg:font-semibold stg:uppercase stg:tracking-wide stg:text-foreground stg:transition-colors stg:hover:bg-accent-hover",
104
+ "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-inset stg:focus-visible:ring-ring",
105
+ )}
106
+ />
107
+ }
107
108
  >
108
- {expanded ? "▼" : "▶"}
109
- </span>
110
- <span className="stg:truncate">{entry.name}</span>
111
- </button>
109
+ <span
110
+ aria-hidden="true"
111
+ className="stg:text-[10px] stg:text-muted-foreground-subtle"
112
+ >
113
+ {expanded ? "▼" : "▶"}
114
+ </span>
115
+ <span className="stg:truncate">{entry.name}</span>
116
+ </TooltipTrigger>
117
+ <TooltipContent side="top" className="stg:break-all">
118
+ {entry.type === "local" ? entry.localPath : entry.gitUrl}
119
+ </TooltipContent>
120
+ </Tooltip>
112
121
  {onRemove && (
113
- <button
114
- type="button"
115
- onClick={() => onRemove(entry.id)}
116
- aria-label={`Remove ${entry.name} from workspace`}
117
- title={`Remove ${entry.name} from workspace`}
118
- className={cn(
119
- "stg:shrink-0 stg:px-1.5 stg:text-muted-foreground stg:opacity-0 stg:transition-opacity",
120
- "stg:group-hover/root:opacity-100 stg:focus-visible:opacity-100",
121
- "stg:hover:text-destructive stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-inset stg:focus-visible:ring-ring",
122
- )}
123
- >
124
- <RemoveIcon />
125
- </button>
122
+ <Tooltip>
123
+ <TooltipTrigger
124
+ render={
125
+ <button
126
+ type="button"
127
+ onClick={() => onRemove(entry.id)}
128
+ aria-label={`Remove ${entry.name} from workspace`}
129
+ className={cn(
130
+ "stg:shrink-0 stg:px-1.5 stg:text-muted-foreground stg:opacity-0 stg:transition-opacity",
131
+ "stg:group-hover/root:opacity-100 stg:focus-visible:opacity-100",
132
+ "stg:hover:text-destructive stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-inset stg:focus-visible:ring-ring",
133
+ )}
134
+ />
135
+ }
136
+ >
137
+ <RemoveIcon />
138
+ </TooltipTrigger>
139
+ <TooltipContent side="top">
140
+ {`Remove ${entry.name} from workspace`}
141
+ </TooltipContent>
142
+ </Tooltip>
126
143
  )}
127
144
  </div>
128
145
 
@@ -22,6 +22,7 @@ import { ArtifactContentRenderer } from "../execution/ArtifactContentRenderer.js
22
22
  import { FileChangeDiff } from "../execution/FileChangesView.js";
23
23
  import { useFileChangeContent } from "../execution/useFileChangeContent.js";
24
24
  import { UNSTYLED_BUTTON } from "../internal/form-primitives.js";
25
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
25
26
  import type { RevealTarget } from "../internal/useRevealLine.js";
26
27
  import type { SelectedWorkspaceFile } from "../internal/store/workspace-file-selection-store.js";
27
28
  import { useWorkspaceFileContent } from "./useWorkspaceFileContent.js";
@@ -660,9 +661,16 @@ function ViewerHeader({
660
661
  <div className="stg:flex stg:items-center stg:gap-2 stg:border-b stg:border-border stg:px-3 stg:py-2">
661
662
  <FileIcon />
662
663
  <div className="stg:flex stg:min-w-0 stg:flex-1 stg:items-baseline stg:gap-1.5">
663
- <span className="stg:truncate stg:text-xs stg:font-semibold stg:text-foreground" title={dir ? `${dir}/${basename}` : basename}>
664
- {basename}
665
- </span>
664
+ <Tooltip>
665
+ <TooltipTrigger
666
+ render={<span className="stg:truncate stg:text-xs stg:font-semibold stg:text-foreground" />}
667
+ >
668
+ {basename}
669
+ </TooltipTrigger>
670
+ <TooltipContent side="top" className="stg:break-all">
671
+ {dir ? `${dir}/${basename}` : basename}
672
+ </TooltipContent>
673
+ </Tooltip>
666
674
  {dir && (
667
675
  <span className="stg:truncate stg:text-[0.65rem] stg:text-muted-foreground">{dir}</span>
668
676
  )}
@@ -5,6 +5,7 @@
5
5
 
6
6
  import { useEffect, useRef } from "react";
7
7
  import { cn } from "@stigmer/theme";
8
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
8
9
 
9
10
  /** Props for {@link PanelChip}. */
10
11
  export interface PanelChipProps {
@@ -50,29 +51,37 @@ export function PanelChip({ isOpen, onToggle, badgeCount }: PanelChipProps) {
50
51
  }, [isOpen]);
51
52
 
52
53
  return (
53
- <button
54
- ref={buttonRef}
55
- type="button"
56
- onClick={onToggle}
57
- aria-expanded={isOpen}
58
- aria-label={isOpen ? "Hide panel" : "Show panel"}
59
- title={isOpen ? "Hide panel" : "Show panel"}
60
- className={cn(
61
- "stg:flex stg:items-center stg:gap-1.5 stg:rounded-md stg:border stg:border-border stg:bg-card stg:px-1.5 stg:py-1",
62
- "stg:text-muted-foreground stg:transition-colors stg:hover:bg-muted stg:hover:text-foreground",
63
- "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring",
64
- )}
65
- >
66
- {showCount && (
67
- <span
68
- aria-label={`${badgeCount} new items`}
69
- className="stg:inline-flex stg:min-w-[1rem] stg:items-center stg:justify-center stg:rounded-full stg:bg-primary stg:px-1 stg:py-px stg:text-[10px] stg:font-medium stg:leading-none stg:text-primary-foreground"
70
- >
71
- {badgeCount}
72
- </span>
73
- )}
74
- <PanelIcon open={isOpen} />
75
- </button>
54
+ <Tooltip>
55
+ <TooltipTrigger
56
+ render={
57
+ <button
58
+ ref={buttonRef}
59
+ type="button"
60
+ onClick={onToggle}
61
+ aria-expanded={isOpen}
62
+ aria-label={isOpen ? "Hide panel" : "Show panel"}
63
+ className={cn(
64
+ "stg:flex stg:items-center stg:gap-1.5 stg:rounded-md stg:border stg:border-border stg:bg-card stg:px-1.5 stg:py-1",
65
+ "stg:text-muted-foreground stg:transition-colors stg:hover:bg-muted stg:hover:text-foreground",
66
+ "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring",
67
+ )}
68
+ />
69
+ }
70
+ >
71
+ {showCount && (
72
+ <span
73
+ aria-label={`${badgeCount} new items`}
74
+ className="stg:inline-flex stg:min-w-[1rem] stg:items-center stg:justify-center stg:rounded-full stg:bg-primary stg:px-1 stg:py-px stg:text-[10px] stg:font-medium stg:leading-none stg:text-primary-foreground"
75
+ >
76
+ {badgeCount}
77
+ </span>
78
+ )}
79
+ <PanelIcon open={isOpen} />
80
+ </TooltipTrigger>
81
+ <TooltipContent side="top">
82
+ {isOpen ? "Hide panel" : "Show panel"}
83
+ </TooltipContent>
84
+ </Tooltip>
76
85
  );
77
86
  }
78
87
 
@@ -7,6 +7,7 @@ import type { UseGitHubConnectionReturn } from "../github/useGitHubConnection.js
7
7
  import { GitHubRepoPicker } from "../github/GitHubRepoPicker.js";
8
8
  import { useScrollShadows } from "../internal/useScrollShadows.js";
9
9
  import { ScrollFade } from "../internal/ScrollFade.js";
10
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
10
11
 
11
12
  type ActivePanel = "github" | null;
12
13
 
@@ -202,15 +203,26 @@ export function WorkspaceEditor({
202
203
  <FolderIcon />
203
204
  </span>
204
205
  )}
205
- <span
206
- className={cn(
207
- "stg:min-w-0 stg:flex-1 stg:truncate stg:text-foreground",
208
- entry.type === "local" && "stg:[direction:rtl] stg:text-left",
209
- )}
210
- title={entry.name}
211
- >
212
- <bdi>{entry.name}</bdi>
213
- </span>
206
+ {/* Not TruncatedText: the <bdi> + rtl-direction pair keeps the
207
+ tail of a long local path visible, which a plain text span
208
+ cannot reproduce. */}
209
+ <Tooltip>
210
+ <TooltipTrigger
211
+ render={
212
+ <span
213
+ className={cn(
214
+ "stg:min-w-0 stg:flex-1 stg:truncate stg:text-foreground",
215
+ entry.type === "local" && "stg:[direction:rtl] stg:text-left",
216
+ )}
217
+ />
218
+ }
219
+ >
220
+ <bdi>{entry.name}</bdi>
221
+ </TooltipTrigger>
222
+ <TooltipContent side="top" className="stg:break-all">
223
+ {entry.name}
224
+ </TooltipContent>
225
+ </Tooltip>
214
226
  <button
215
227
  type="button"
216
228
  onClick={() => workspace.remove(entry.id)}
@@ -3,6 +3,8 @@
3
3
  import type { WorkspaceEntry } from "@stigmer/protos/ai/stigmer/agentic/session/v1/workspace_pb";
4
4
  import type { WorkspaceSource } from "@stigmer/protos/ai/stigmer/agentic/session/v1/workspace_pb";
5
5
  import { cn } from "@stigmer/theme";
6
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
7
+ import { TruncatedText } from "../internal/truncated-text.js";
6
8
 
7
9
  /** Props for {@link WorkspaceSummary}. */
8
10
  export interface WorkspaceSummaryProps {
@@ -67,25 +69,32 @@ function SourceLabel({ source }: { source?: WorkspaceSource }) {
67
69
  const short = url
68
70
  .replace(/^https?:\/\//, "")
69
71
  .replace(/\.git$/, "");
72
+ // The cell shows the shortened form but the tooltip restores the full
73
+ // URL (protocol and .git suffix), so this is a hover-always hint, not an
74
+ // overflow-gated TruncatedText.
70
75
  return (
71
- <span
72
- className="stg:ml-5 stg:block stg:truncate stg:text-muted-foreground"
73
- title={url}
74
- >
75
- {short}
76
- </span>
76
+ <Tooltip>
77
+ <TooltipTrigger
78
+ render={
79
+ <span className="stg:ml-5 stg:block stg:truncate stg:text-muted-foreground" />
80
+ }
81
+ >
82
+ {short}
83
+ </TooltipTrigger>
84
+ <TooltipContent side="top" className="stg:break-all">
85
+ {url}
86
+ </TooltipContent>
87
+ </Tooltip>
77
88
  );
78
89
  }
79
90
 
80
91
  if (source.source.case === "localPath") {
81
92
  const path = source.source.value.path;
82
93
  return (
83
- <span
84
- className="stg:ml-5 stg:block stg:truncate stg:font-mono stg:text-muted-foreground"
85
- title={path}
86
- >
87
- {path}
88
- </span>
94
+ <TruncatedText
95
+ text={path}
96
+ className="stg:ml-5 stg:block stg:font-mono stg:text-muted-foreground"
97
+ />
89
98
  );
90
99
  }
91
100