@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
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import { cn } from "@stigmer/theme";
4
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
4
5
 
5
6
  /** Props for {@link FileReferenceChipList}. */
6
7
  export interface FileReferenceChipListProps {
@@ -83,24 +84,35 @@ function FileReferenceChip({
83
84
  const filename = path.split("/").pop() ?? path;
84
85
 
85
86
  return (
86
- <span
87
- role="listitem"
88
- aria-label={`Referenced file: ${path}`}
89
- title={path}
90
- className="stg:inline-flex stg:max-w-[200px] stg:items-center stg:gap-1 stg:rounded-md stg:bg-muted-subtle stg:px-2 stg:py-0.5 stg:text-xs stg:text-foreground"
91
- >
92
- <FileRefIcon />
93
- <span className="stg:truncate">{filename}</span>
94
- <button
95
- type="button"
96
- onClick={onRemove}
97
- disabled={disabled}
98
- className="stg:ml-0.5 stg:shrink-0 stg:text-muted-foreground stg:hover:text-destructive stg:disabled:pointer-events-none"
99
- aria-label={`Remove reference to ${path}`}
87
+ // The chip shows only the basename; the tooltip restores the full path,
88
+ // so it is a hover-always hint on the chip, not an overflow-gated
89
+ // TruncatedText.
90
+ <Tooltip>
91
+ <TooltipTrigger
92
+ render={
93
+ <span
94
+ role="listitem"
95
+ aria-label={`Referenced file: ${path}`}
96
+ className="stg:inline-flex stg:max-w-[200px] stg:items-center stg:gap-1 stg:rounded-md stg:bg-muted-subtle stg:px-2 stg:py-0.5 stg:text-xs stg:text-foreground"
97
+ />
98
+ }
100
99
  >
101
- <XIcon />
102
- </button>
103
- </span>
100
+ <FileRefIcon />
101
+ <span className="stg:truncate">{filename}</span>
102
+ <button
103
+ type="button"
104
+ onClick={onRemove}
105
+ disabled={disabled}
106
+ className="stg:ml-0.5 stg:shrink-0 stg:text-muted-foreground stg:hover:text-destructive stg:disabled:pointer-events-none"
107
+ aria-label={`Remove reference to ${path}`}
108
+ >
109
+ <XIcon />
110
+ </button>
111
+ </TooltipTrigger>
112
+ <TooltipContent side="top" className="stg:break-all">
113
+ {path}
114
+ </TooltipContent>
115
+ </Tooltip>
104
116
  );
105
117
  }
106
118
 
@@ -80,7 +80,7 @@ describe("FileReferenceChipList", () => {
80
80
  expect(list.getAttribute("aria-label")).toBe("Referenced workspace files");
81
81
  });
82
82
 
83
- it("sets title attribute on chip for full path tooltip", () => {
83
+ it("keeps the chip free of native titles — the full path rides the house tooltip", () => {
84
84
  render(
85
85
  <FileReferenceChipList
86
86
  refs={["src/deeply/nested/file.ts"]}
@@ -89,6 +89,9 @@ describe("FileReferenceChipList", () => {
89
89
  );
90
90
 
91
91
  const item = screen.getByRole("listitem");
92
- expect(item.getAttribute("title")).toBe("src/deeply/nested/file.ts");
92
+ expect(item.getAttribute("title")).toBeNull();
93
+ // The basename stays visible; the full path is the tooltip's content
94
+ // (reveal pinned in the real-browser suites).
95
+ expect(item.textContent).toContain("file.ts");
93
96
  });
94
97
  });
@@ -15,6 +15,7 @@ import {
15
15
  iamRoleFromString,
16
16
  iamRoleToString,
17
17
  } from "@stigmer/sdk";
18
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
18
19
  import { useResourceAccess } from "./useResourceAccess.js";
19
20
  import { usePrincipalsCount } from "./usePrincipalsCount.js";
20
21
  import { useWhoAmI } from "./useWhoAmI.js";
@@ -282,26 +283,32 @@ function MemberRow({
282
283
  function RoleBadge({ grant }: { grant: RoleGrant }) {
283
284
  const roleName = grant.role?.name || grant.role?.code || "Unknown";
284
285
  return (
285
- <span
286
- className={cn(
287
- "stg:inline-flex stg:items-center stg:rounded-md stg:border stg:px-2 stg:py-0.5 stg:text-[0.65rem] stg:font-medium",
288
- grant.isInherited
289
- ? "stg:border-border-muted stg:text-muted-foreground stg:bg-muted-subtle stg:italic"
290
- : "stg:border-border stg:bg-muted stg:text-foreground",
291
- )}
292
- title={
293
- grant.isInherited
286
+ <Tooltip>
287
+ <TooltipTrigger
288
+ render={
289
+ <span
290
+ className={cn(
291
+ "stg:inline-flex stg:items-center stg:rounded-md stg:border stg:px-2 stg:py-0.5 stg:text-[0.65rem] stg:font-medium",
292
+ grant.isInherited
293
+ ? "stg:border-border-muted stg:text-muted-foreground stg:bg-muted-subtle stg:italic"
294
+ : "stg:border-border stg:bg-muted stg:text-foreground",
295
+ )}
296
+ />
297
+ }
298
+ >
299
+ {roleName}
300
+ {grant.isInherited && (
301
+ <span className="stg:ml-1 stg:text-[0.55rem] stg:text-muted-foreground">
302
+ (inherited)
303
+ </span>
304
+ )}
305
+ </TooltipTrigger>
306
+ <TooltipContent side="top">
307
+ {grant.isInherited
294
308
  ? `Inherited from ${grant.ownerResource?.kind ?? "parent"}`
295
- : `Directly assigned`
296
- }
297
- >
298
- {roleName}
299
- {grant.isInherited && (
300
- <span className="stg:ml-1 stg:text-[0.55rem] stg:text-muted-foreground">
301
- (inherited)
302
- </span>
303
- )}
304
- </span>
309
+ : `Directly assigned`}
310
+ </TooltipContent>
311
+ </Tooltip>
305
312
  );
306
313
  }
307
314
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  import type { ApiResourceRefView } from "@stigmer/protos/ai/stigmer/iam/iampolicy/v1/io_pb";
4
4
  import { cn } from "@stigmer/theme";
5
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
5
6
 
6
7
  /**
7
8
  * The human-readable identity-source label for a principal, or `""` when none
@@ -39,15 +40,21 @@ export function ProviderBadge({ principal, className }: ProviderBadgeProps) {
39
40
  }
40
41
 
41
42
  return (
42
- <span
43
- className={cn(
44
- "stg:inline-flex stg:items-center stg:rounded stg:px-1.5 stg:py-0.5 stg:text-[0.6rem] stg:font-medium",
45
- "stg:bg-muted-subtle stg:text-muted-foreground",
46
- className,
47
- )}
48
- title={`Identity provider: ${label}`}
49
- >
50
- {label}
51
- </span>
43
+ <Tooltip>
44
+ <TooltipTrigger
45
+ render={
46
+ <span
47
+ className={cn(
48
+ "stg:inline-flex stg:items-center stg:rounded stg:px-1.5 stg:py-0.5 stg:text-[0.6rem] stg:font-medium",
49
+ "stg:bg-muted-subtle stg:text-muted-foreground",
50
+ className,
51
+ )}
52
+ />
53
+ }
54
+ >
55
+ {label}
56
+ </TooltipTrigger>
57
+ <TooltipContent side="top">{`Identity provider: ${label}`}</TooltipContent>
58
+ </Tooltip>
52
59
  );
53
60
  }
@@ -74,7 +74,6 @@ export function RoleSelector({
74
74
  return (
75
75
  <label
76
76
  key={opt.value}
77
- title={opt.description}
78
77
  className={cn(
79
78
  "stg:inline-flex stg:cursor-pointer stg:flex-col stg:rounded-md stg:border stg:px-3 stg:py-1.5 stg:text-xs stg:transition-colors",
80
79
  isChecked
@@ -5,6 +5,7 @@ import { cn } from "@stigmer/theme";
5
5
  import { getUserMessage } from "@stigmer/sdk";
6
6
  import { timestampDate } from "@bufbuild/protobuf/wkt";
7
7
  import type { IdentityProvider } from "@stigmer/protos/ai/stigmer/iam/identityprovider/v1/api_pb";
8
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
8
9
  import { useIdentityProviderList } from "./useIdentityProviderList.js";
9
10
  import { useDeleteIdentityProvider } from "./useDeleteIdentityProvider.js";
10
11
 
@@ -246,9 +247,16 @@ function IdpRow({
246
247
  </span>
247
248
  )}
248
249
  {createdAt && (
249
- <span title={`Created ${timestampDate(createdAt).toISOString()}`}>
250
- {formatShortDate(timestampDate(createdAt))}
251
- </span>
250
+ <Tooltip>
251
+ <TooltipTrigger
252
+ render={<time dateTime={timestampDate(createdAt).toISOString()} />}
253
+ >
254
+ {formatShortDate(timestampDate(createdAt))}
255
+ </TooltipTrigger>
256
+ <TooltipContent side="top">
257
+ {`Created ${timestampDate(createdAt).toISOString()}`}
258
+ </TooltipContent>
259
+ </Tooltip>
252
260
  )}
253
261
  </div>
254
262
 
package/src/index.ts CHANGED
@@ -701,88 +701,6 @@ export type {
701
701
  AgentWizardData,
702
702
  } from "./agent/index.js";
703
703
 
704
- // Datastore — data hooks (kind family + describe projection), record
705
- // hooks (find/insert/update/delete + grid collection), guarded delete,
706
- // the canonical value semantics of declared fields, the typed filter
707
- // model, and the six styled components (detail view, records browser,
708
- // filter builder, record form, schema view, sync report, delete dialog)
709
- export {
710
- useDatastore,
711
- useDatastoreList,
712
- useDatastoreCount,
713
- useDatastoreSearch,
714
- useDatastoreDescription,
715
- DEFAULT_PARTITION,
716
- useRecordList,
717
- useInsertRecord,
718
- useUpdateRecord,
719
- useDeleteRecord,
720
- useRecordCollection,
721
- useDeleteDatastore,
722
- buildUpdateFields,
723
- coerceFieldValue,
724
- formatFieldValue,
725
- formatSystemTimestamp,
726
- isListOperator,
727
- isSortableField,
728
- isValuelessOperator,
729
- operatorsForField,
730
- OPERATOR_LABELS,
731
- RESERVED_FIELD_NAMES,
732
- SYSTEM_FIELD_OPERATORS,
733
- buildRecordFilter,
734
- filterableFields,
735
- formatConditionChip,
736
- isConditionComplete,
737
- FieldValueControl,
738
- FIELD_INPUT_CLASSES,
739
- CollectionSchemaView,
740
- formatSubject,
741
- DatastoreSyncReport,
742
- RecordFilterBuilder,
743
- RecordFormPanel,
744
- CollectionRecordsBrowser,
745
- DeleteDatastoreDialog,
746
- DatastoreDetailView,
747
- DatastoreIcon,
748
- } from "./datastore/index.js";
749
- export type {
750
- UseDatastoreReturn,
751
- UseDatastoreListOptions,
752
- UseDatastoreListReturn,
753
- UseDatastoreCountOptions,
754
- UseDatastoreCountReturn,
755
- UseDatastoreSearchOptions,
756
- UseDatastoreSearchReturn,
757
- UseDatastoreDescriptionReturn,
758
- RecordScope,
759
- UseRecordListParams,
760
- UseRecordListReturn,
761
- InsertRecordArgs,
762
- UseInsertRecordReturn,
763
- UpdateRecordArgs,
764
- UseUpdateRecordReturn,
765
- DeleteRecordArgs,
766
- UseDeleteRecordReturn,
767
- RecordColumnDef,
768
- UseRecordCollectionOptions,
769
- UseRecordCollectionReturn,
770
- DeleteDatastoreArgs,
771
- UseDeleteDatastoreReturn,
772
- CoerceResult,
773
- FilterableField,
774
- RecordConditionDraft,
775
- FieldValueControlProps,
776
- CollectionSchemaViewProps,
777
- DatastoreSyncReportProps,
778
- RecordFilterBuilderProps,
779
- RecordFormPanelProps,
780
- CollectionRecordsBrowserProps,
781
- DeleteDatastoreDialogProps,
782
- DatastoreDetailTab,
783
- DatastoreDetailViewProps,
784
- } from "./datastore/index.js";
785
-
786
704
  // Schedule — the disabled-vs-paused state derivation, the direct-query
787
705
  // list core + workbench adapter (schedules are not search-backed), data
788
706
  // hooks (get by reference, paginated list, count), behavior hooks
@@ -0,0 +1,68 @@
1
+ // TruncatedText's overflow gating in a real Chromium (stigmer-cloud#268).
2
+ // The native `title` idiom this helper replaced fired whether or not the
3
+ // text was actually clipped; the helper opens the house tooltip ONLY when
4
+ // CSS truncation really happened. That distinction is a layout fact —
5
+ // happy-dom reports zero geometry — so only a real browser can pin it.
6
+
7
+ import "../../../dist/styles.css";
8
+
9
+ import { describe, it, expect, vi, afterEach } from "vitest";
10
+ import { render, cleanup } from "@testing-library/react";
11
+ import { userEvent } from "@vitest/browser/context";
12
+ import type { ReactElement } from "react";
13
+ import { TruncatedText } from "../truncated-text.js";
14
+
15
+ const LONG = "a-very-long-model-identifier/that-cannot-fit-in-eighty-pixels";
16
+ const SHORT = "fits";
17
+
18
+ /** A themed, hard-sized cell so truncation geometry is real. */
19
+ function renderInCell(ui: ReactElement, width: string) {
20
+ const cell = document.createElement("div");
21
+ cell.className = "stgm";
22
+ cell.style.width = width;
23
+ cell.style.display = "block";
24
+ document.body.appendChild(cell);
25
+ render(ui, { container: cell });
26
+ return cell;
27
+ }
28
+
29
+ function portaledText(cell: HTMLElement): string {
30
+ return Array.from(document.body.children)
31
+ .filter((node) => node !== cell)
32
+ .map((node) => node.textContent ?? "")
33
+ .join(" ");
34
+ }
35
+
36
+ afterEach(() => {
37
+ cleanup();
38
+ document.querySelectorAll(".stgm").forEach((node) => node.remove());
39
+ });
40
+
41
+ describe("TruncatedText overflow gating", () => {
42
+ it("reveals the full value on hover when the text is actually clipped", async () => {
43
+ const cell = renderInCell(<TruncatedText text={LONG} />, "80px");
44
+ expect(cell.querySelector("[title]")).toBeNull();
45
+
46
+ const span = cell.querySelector("span");
47
+ expect(span!.scrollWidth).toBeGreaterThan(span!.clientWidth);
48
+
49
+ await userEvent.hover(span!);
50
+ await vi.waitFor(
51
+ () => expect(portaledText(cell)).toContain(LONG),
52
+ { timeout: 3000, interval: 50 },
53
+ );
54
+ await userEvent.unhover(span!);
55
+ });
56
+
57
+ it("stays quiet when nothing is clipped — the tooltip would only repeat the cell", async () => {
58
+ const cell = renderInCell(<TruncatedText text={SHORT} />, "300px");
59
+
60
+ const span = cell.querySelector("span");
61
+ await userEvent.hover(span!);
62
+ // Base UI's default open delay is 600ms; wait past it and assert the
63
+ // portal never produced the tooltip.
64
+ await new Promise((resolve) => setTimeout(resolve, 1200));
65
+ expect(portaledText(cell)).not.toContain(SHORT);
66
+ await userEvent.unhover(span!);
67
+ });
68
+ });
@@ -0,0 +1,33 @@
1
+ // Fast structural pins for TruncatedText (the native-title sweep's
2
+ // truncation replacement, stigmer-cloud#268). Happy-dom can honestly pin
3
+ // the STRUCTURE — full text in the DOM, zero native titles, zero new tab
4
+ // stops; the overflow-gated REVEAL needs real layout and lives in
5
+ // truncated-text.layout.test.tsx.
6
+
7
+ import { describe, it, expect, afterEach } from "vitest";
8
+ import { render, cleanup, screen } from "@testing-library/react";
9
+ import { TruncatedText } from "../truncated-text.js";
10
+
11
+ afterEach(cleanup);
12
+
13
+ describe("TruncatedText", () => {
14
+ it("renders the full text in the DOM with no native title and no tab stop", () => {
15
+ render(<TruncatedText text="models/anthropic/claude-4.6-opus" />);
16
+
17
+ // CSS truncation is purely visual: screen readers and selection get
18
+ // the full value from the DOM, so no sr-only duplicate is needed.
19
+ const span = screen.getByText("models/anthropic/claude-4.6-opus");
20
+ expect(span.closest("[title]")).toBeNull();
21
+ expect(span.closest("[tabindex]")).toBeNull();
22
+ });
23
+
24
+ it("applies stg:truncate by default and yields to a line-clamp class", () => {
25
+ const { rerender } = render(<TruncatedText text="abc" />);
26
+ expect(screen.getByText("abc").className).toContain("stg:truncate");
27
+
28
+ rerender(<TruncatedText text="abc" className="stg:line-clamp-2" />);
29
+ const clamped = screen.getByText("abc");
30
+ expect(clamped.className).toContain("stg:line-clamp-2");
31
+ expect(clamped.className).not.toContain("stg:truncate");
32
+ });
33
+ });
@@ -0,0 +1,81 @@
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import { cn } from "@stigmer/theme";
5
+ import { Tooltip, TooltipContent, TooltipTrigger } from "./tooltip.js";
6
+
7
+ // ---------------------------------------------------------------------------
8
+ // SDK-internal truncated-text span with an overflow-gated house tooltip.
9
+ //
10
+ // Replaces the `title={fullValue}` idiom on truncated cells (paths, hashes,
11
+ // model ids, …) after the native-title sweep (stigmer/stigmer-cloud#268).
12
+ // Native titles were OS-delayed and fired whether or not the text was
13
+ // actually clipped; this helper opens the house tooltip ONLY when the text
14
+ // truly overflows its box, checked at open time — a non-truncated cell
15
+ // stays tooltip-free.
16
+ //
17
+ // The trigger is a plain, non-focusable span (the StatusHint precedent in
18
+ // ConversationTimelineView): CSS truncation is purely visual, so the full
19
+ // text is already in the DOM for screen readers and selection — the tooltip
20
+ // is a sighted-pointer convenience, and a tab stop per table cell would be
21
+ // noise. Works with or without a `TooltipProvider` in scope (the provider
22
+ // only adds delay grouping); like ./tooltip.tsx, NOT exported from
23
+ // @stigmer/react.
24
+ // ---------------------------------------------------------------------------
25
+
26
+ interface TruncatedTextProps {
27
+ /** The full value: rendered inside the span and shown by the tooltip. */
28
+ readonly text: string;
29
+ /**
30
+ * Classes for the truncating span. `stg:truncate` is applied by default;
31
+ * pass a `stg:line-clamp-*` class instead for multi-line clamping (the
32
+ * overflow check covers both axes).
33
+ */
34
+ readonly className?: string;
35
+ /** Tooltip placement; truncated cells read best with the default "top". */
36
+ readonly side?: React.ComponentProps<typeof TooltipContent>["side"];
37
+ }
38
+
39
+ /** True when CSS actually clipped the element on either axis. */
40
+ function isOverflowing(el: HTMLElement): boolean {
41
+ return el.scrollWidth > el.clientWidth || el.scrollHeight > el.clientHeight;
42
+ }
43
+
44
+ export function TruncatedText({ text, className, side = "top" }: TruncatedTextProps) {
45
+ const spanRef = React.useRef<HTMLSpanElement>(null);
46
+ const [open, setOpen] = React.useState(false);
47
+
48
+ const handleOpenChange = React.useCallback((nextOpen: boolean) => {
49
+ if (nextOpen && spanRef.current && !isOverflowing(spanRef.current)) {
50
+ return; // Nothing is clipped — the tooltip would only repeat the cell.
51
+ }
52
+ setOpen(nextOpen);
53
+ }, []);
54
+
55
+ return (
56
+ <Tooltip open={open} onOpenChange={handleOpenChange}>
57
+ <TooltipTrigger
58
+ render={
59
+ <span
60
+ ref={spanRef}
61
+ className={cn(
62
+ // A plain inline span can neither truncate (overflow does not
63
+ // apply to inline boxes) nor be measured (clientWidth is 0 by
64
+ // spec), so the span defaults to block; cn()'s conflict
65
+ // resolution lets callers override with their own display
66
+ // class (inline-block, flex-1 cells, …).
67
+ "stg:block",
68
+ className?.match(/(?:^|\s)stg:line-clamp-/) ? undefined : "stg:truncate",
69
+ className,
70
+ )}
71
+ />
72
+ }
73
+ >
74
+ {text}
75
+ </TooltipTrigger>
76
+ <TooltipContent side={side} className="stg:break-all">
77
+ {text}
78
+ </TooltipContent>
79
+ </Tooltip>
80
+ );
81
+ }
@@ -15,6 +15,7 @@ import { useOrgInvitations } from "./useOrgInvitations.js";
15
15
  import { useCreateInvitation } from "./useCreateInvitation.js";
16
16
  import { useRevokeInvitation } from "./useRevokeInvitation.js";
17
17
  import { InvitationCreatedAlert } from "./InvitationCreatedAlert.js";
18
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
18
19
  import { RoleSelector } from "../iam-policy/RoleSelector.js";
19
20
 
20
21
  // ---------------------------------------------------------------------------
@@ -465,11 +466,23 @@ function InvitationRow({
465
466
 
466
467
  {/* Expiry */}
467
468
  {expiresAt && (
468
- <span className="stg:text-xs stg:text-muted-foreground" title={timestampDate(expiresAt).toISOString()}>
469
- {isActive
470
- ? formatRelativeExpiry(timestampDate(expiresAt))
471
- : formatShortDate(timestampDate(expiresAt))}
472
- </span>
469
+ <Tooltip>
470
+ <TooltipTrigger
471
+ render={
472
+ <time
473
+ dateTime={timestampDate(expiresAt).toISOString()}
474
+ className="stg:text-xs stg:text-muted-foreground"
475
+ />
476
+ }
477
+ >
478
+ {isActive
479
+ ? formatRelativeExpiry(timestampDate(expiresAt))
480
+ : formatShortDate(timestampDate(expiresAt))}
481
+ </TooltipTrigger>
482
+ <TooltipContent side="top">
483
+ {timestampDate(expiresAt).toISOString()}
484
+ </TooltipContent>
485
+ </Tooltip>
473
486
  )}
474
487
  </div>
475
488
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { useCallback, useRef } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
5
6
  import type { ResourceListScope } from "../search/index.js";
6
7
 
7
8
  /** Props for {@link ScopeToggle}. */
@@ -116,7 +117,7 @@ export function ScopeToggle({
116
117
  const isSelected = value === option.value;
117
118
  const Icon = option.icon;
118
119
 
119
- return (
120
+ const radio = (
120
121
  <button
121
122
  key={option.value}
122
123
  ref={(el) => {
@@ -126,7 +127,6 @@ export function ScopeToggle({
126
127
  role="radio"
127
128
  aria-checked={isSelected}
128
129
  aria-label={option.ariaLabel}
129
- title={compact ? option.ariaLabel : undefined}
130
130
  tabIndex={isSelected ? 0 : -1}
131
131
  disabled={disabled}
132
132
  onClick={() => handleSelect(option.value)}
@@ -143,6 +143,18 @@ export function ScopeToggle({
143
143
  {!compact && option.label}
144
144
  </button>
145
145
  );
146
+
147
+ // Icon-only radios need their name discoverable by sighted users
148
+ // too: in compact mode each radio is its own tooltip trigger (hover
149
+ // and roving-tabindex focus both open it). Full mode shows visible
150
+ // labels, so a tooltip would only repeat them.
151
+ if (!compact) return radio;
152
+ return (
153
+ <Tooltip key={option.value}>
154
+ <TooltipTrigger render={radio} />
155
+ <TooltipContent side="top">{option.ariaLabel}</TooltipContent>
156
+ </Tooltip>
157
+ );
146
158
  })}
147
159
  </div>
148
160
  );
@@ -5,6 +5,7 @@ import { Popover } from "@base-ui/react/popover";
5
5
  import { cn } from "@stigmer/theme";
6
6
  import { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
7
7
  import { useStigmerPortalContainer } from "../portal-container.js";
8
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
8
9
  import { ConfirmDialog } from "../resource-detail/ConfirmDialog.js";
9
10
  import { useConfirmAction } from "../resource-detail/useConfirmAction.js";
10
11
  import {
@@ -454,20 +455,26 @@ export function VisibilityBadge({
454
455
 
455
456
  if (onClick) {
456
457
  return (
457
- <button
458
- type="button"
459
- onClick={onClick}
460
- title="Manage access"
461
- aria-label={`${option.label} visibility — manage access`}
462
- className={cn(
463
- VISIBILITY_CHIP_CLASS,
464
- "stg:transition-colors stg:hover:bg-accent-hover stg:hover:text-foreground",
465
- "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring",
466
- className,
467
- )}
468
- >
469
- {content}
470
- </button>
458
+ <Tooltip>
459
+ <TooltipTrigger
460
+ render={
461
+ <button
462
+ type="button"
463
+ onClick={onClick}
464
+ aria-label={`${option.label} visibility — manage access`}
465
+ className={cn(
466
+ VISIBILITY_CHIP_CLASS,
467
+ "stg:transition-colors stg:hover:bg-accent-hover stg:hover:text-foreground",
468
+ "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring",
469
+ className,
470
+ )}
471
+ />
472
+ }
473
+ >
474
+ {content}
475
+ </TooltipTrigger>
476
+ <TooltipContent side="top">Manage access</TooltipContent>
477
+ </Tooltip>
471
478
  );
472
479
  }
473
480
 
@@ -3,7 +3,6 @@
3
3
  import { useCallback, useMemo } from "react";
4
4
  import { parse as parseYaml } from "yaml";
5
5
  import type { Agent } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
6
- import type { Datastore } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/api_pb";
7
6
  import type { McpServer } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/api_pb";
8
7
  import type { Schedule } from "@stigmer/protos/ai/stigmer/agentic/schedule/v1/api_pb";
9
8
  import type { Workflow } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/api_pb";
@@ -18,9 +17,9 @@ import { serializeWorkflowYaml } from "../workflow/serialize-workflow-yaml.js";
18
17
  /** Options for {@link useExportResource}. */
19
18
  export interface UseExportResourceOptions {
20
19
  /** The resource kind — determines which serializer is used. */
21
- readonly kind: "Agent" | "McpServer" | "Workflow" | "Datastore" | "Schedule";
20
+ readonly kind: "Agent" | "McpServer" | "Workflow" | "Schedule";
22
21
  /** The proto resource to export, or `null` when not yet loaded. */
23
- readonly resource: Agent | McpServer | Workflow | Datastore | Schedule | null;
22
+ readonly resource: Agent | McpServer | Workflow | Schedule | null;
24
23
  }
25
24
 
26
25
  /** Return value of {@link useExportResource}. */
@@ -45,7 +44,7 @@ export interface UseExportResourceReturn {
45
44
 
46
45
  /**
47
46
  * Headless export hook for Stigmer resources (Agent, McpServer,
48
- * Workflow, Datastore, Schedule).
47
+ * Workflow, Schedule).
49
48
  *
50
49
  * Serializes the resource into YAML and JSON formats and provides
51
50
  * stable callbacks for copying to clipboard or triggering a file
@@ -155,8 +155,7 @@ export function EditResourceYamlDialog({
155
155
  </div>
156
156
  )}
157
157
 
158
- {/* Apply error — the server's refusal (e.g. a datastore
159
- collection-removal rejection) rendered verbatim, with an
158
+ {/* Apply error — the server's refusal rendered verbatim, with an
160
159
  acknowledge-and-retry affordance: the operator reads the
161
160
  guard, edits or decides, and re-applies without reopening
162
161
  the dialog. */}