@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
@@ -9,6 +9,7 @@ import {
9
9
  } from "@stigmer/protos/ai/stigmer/platform/cursoraccount/v1/io_pb";
10
10
  import type { CursorMemberSpend } from "@stigmer/protos/ai/stigmer/platform/cursoraccount/v1/cursor_account_pb";
11
11
  import { Button } from "../button/index.js";
12
+ import { TruncatedText } from "../internal/truncated-text.js";
12
13
  import { StateBadge } from "./badges.js";
13
14
  import { formatPoolPercent, formatSpendMicros } from "./cursor-account-format.js";
14
15
  import type { CursorAccountCoverage } from "./cursor-account-coverage.js";
@@ -225,9 +226,9 @@ function CoverageGroup({
225
226
  * The member-identity cell shared by key rows and gap rows. The email is
226
227
  * the row's identity, so it must be fully readable: it wraps onto more
227
228
  * lines when the column is narrow (emails are unbroken strings, so they
228
- * need explicit word-breaking) with a hover tooltip as backup, unlike
229
- * the other text cells which truncate. The secondary name line stays
230
- * truncated — it is display sugar, not identity.
229
+ * need explicit word-breaking), unlike the other text cells which
230
+ * truncate. The secondary name line stays truncated — it is display
231
+ * sugar, not identity.
231
232
  */
232
233
  function MemberCell({
233
234
  email,
@@ -238,7 +239,9 @@ function MemberCell({
238
239
  }) {
239
240
  return (
240
241
  <span role="cell" className="stg:min-w-0">
241
- <span className="stg:block stg:break-words stg:font-medium stg:text-foreground" title={email}>
242
+ {/* No tooltip: break-words shows the full email, so a hover hint
243
+ would only repeat what is already visible. */}
244
+ <span className="stg:block stg:break-words stg:font-medium stg:text-foreground">
242
245
  {email}
243
246
  </span>
244
247
  {name && (
@@ -273,16 +276,15 @@ function KeyRow({
273
276
  <div role="row" className={cn(ROW_GRID, "stg:border-t stg:border-border-muted stg:text-xs")}>
274
277
  <MemberCell email={key.boundEmail} />
275
278
  <span role="cell" className="stg:min-w-0">
276
- <span
277
- className="stg:block stg:truncate stg:text-muted-foreground"
278
- title={key.cursorKeyName || undefined}
279
- >
280
- {key.cursorKeyName || "unnamed key"}
281
- </span>
279
+ <TruncatedText
280
+ text={key.cursorKeyName || "unnamed key"}
281
+ className="stg:block stg:text-muted-foreground"
282
+ />
282
283
  {key.label && (
283
- <span className="stg:block stg:truncate stg:text-[11px] stg:text-muted-foreground" title={key.label}>
284
- {key.label}
285
- </span>
284
+ <TruncatedText
285
+ text={key.label}
286
+ className="stg:block stg:text-[11px] stg:text-muted-foreground"
287
+ />
286
288
  )}
287
289
  </span>
288
290
  <SpendCells spend={keyView.spend} />
@@ -237,10 +237,10 @@ describe("CursorAccountsConsole", () => {
237
237
  expect(screen.getByText(/On the team — key held/)).toBeTruthy();
238
238
  expect(screen.getByText("zane@scenar.ai")).toBeTruthy();
239
239
  expect(screen.getByText("stigmer-prod")).toBeTruthy();
240
- // The email is the row's identity: full value always hoverable on
241
- // both row kinds (the cell wraps rather than truncates).
242
- expect(screen.getByTitle("zane@scenar.ai")).toBeTruthy();
243
- expect(screen.getByTitle("uncovered@scenar.ai")).toBeTruthy();
240
+ // The email is the row's identity: the cell wraps rather than
241
+ // truncates, so the full value is always visible text on both row
242
+ // kinds — and never a native title (banned, stigmer-cloud#268).
243
+ expect(document.querySelector("[title]")).toBeNull();
244
244
  expect(screen.getByText("$0.17")).toBeTruthy(); // included, 169342 micro-USD
245
245
  expect(screen.getByText("Active")).toBeTruthy();
246
246
  // Category 2: on the team, no key — server-joined spend on the gap row.
@@ -103,11 +103,12 @@ export const DashboardKPICards = memo(function DashboardKPICards({
103
103
  <div className={cn("stg:grid stg:gap-3 stg:sm:grid-cols-2 stg:lg:grid-cols-4", className)}>
104
104
  {STAT_CARDS.map((card) => {
105
105
  const breakdown = card.getBreakdown(summary);
106
+ // No tooltip on the card: the breakdown is rendered visibly below
107
+ // the value, so the old title only repeated on-screen text.
106
108
  return (
107
109
  <div
108
110
  key={card.label}
109
111
  className="stg:rounded-lg stg:border stg:border-border stg:bg-card stg:px-4 stg:py-3"
110
- title={breakdown ?? undefined}
111
112
  >
112
113
  <p className="stg:text-xs stg:font-medium stg:text-muted-foreground">
113
114
  {card.label}
@@ -2,7 +2,6 @@
2
2
 
3
3
  import { useCallback, useState, type KeyboardEvent } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
- import { DatastoreIcon } from "../datastore/DatastoreDetailView.js";
6
5
  import type { DependencyNode, NodeKind } from "./types.js";
7
6
 
8
7
  interface DependencyTreeNodeProps {
@@ -16,7 +15,6 @@ const KIND_LABELS: Record<NodeKind, string> = {
16
15
  agent: "Agent",
17
16
  "mcp-server": "MCP",
18
17
  skill: "Skill",
19
- datastore: "Datastore",
20
18
  "sub-agent": "Sub-Agent",
21
19
  };
22
20
 
@@ -182,9 +180,7 @@ function kindBadgeClasses(kind: NodeKind): string {
182
180
  case "skill":
183
181
  return "stg:bg-[var(--stgm-status-pending-subtle)] stg:text-[var(--stgm-status-pending)]";
184
182
  // Badges borrow status hues as category colors (skill=pending,
185
- // sub-agent=ready); datastore takes the remaining distinct hue.
186
- case "datastore":
187
- return "stg:bg-[var(--stgm-status-degraded-subtle)] stg:text-[var(--stgm-status-degraded)]";
183
+ // sub-agent=ready).
188
184
  case "sub-agent":
189
185
  return "stg:bg-[var(--stgm-status-ready-subtle)] stg:text-[var(--stgm-status-ready)]";
190
186
  case "agent":
@@ -211,8 +207,6 @@ function NodeIcon({
211
207
  return <McpServerIcon className={className} />;
212
208
  case "skill":
213
209
  return <SkillIcon className={className} />;
214
- case "datastore":
215
- return <DatastoreIcon className={className} />;
216
210
  }
217
211
  }
218
212
 
@@ -15,48 +15,46 @@ function graphFor(spec: Parameters<typeof useDependencyGraph>[0]["spec"]) {
15
15
  return result.current;
16
16
  }
17
17
 
18
- describe("useDependencyGraph — datastore nodes", () => {
19
- it("derives a datastore node with a navigation ref", () => {
18
+ describe("useDependencyGraph", () => {
19
+ it("derives a skill node with a navigation ref", () => {
20
20
  const { tree, isEmpty } = graphFor({
21
21
  ...emptySpec,
22
- datastoreUsages: [
23
- { datastoreRef: { org: "acme", slug: "clinic-records" } },
24
- ],
22
+ skillRefs: [{ org: "acme", slug: "triage-guide" }],
25
23
  });
26
24
 
27
- // A datastore-only agent has dependencies — the tab must appear.
25
+ // A skill-only agent has dependencies — the tab must appear.
28
26
  expect(isEmpty).toBe(false);
29
27
  expect(tree).not.toBeNull();
30
28
  expect(tree!.nodeCount).toBe(2);
31
29
 
32
30
  const node = tree!.root.children[0];
33
31
  expect(node).toMatchObject({
34
- id: "datastore:clinic-records",
35
- kind: "datastore",
36
- label: "clinic-records",
37
- ref: { org: "acme", slug: "clinic-records" },
32
+ id: "skill:triage-guide",
33
+ kind: "skill",
34
+ label: "triage-guide",
35
+ ref: { org: "acme", slug: "triage-guide" },
38
36
  });
39
37
  // Same-org ref gets no qualified label.
40
38
  expect(node.qualifiedLabel).toBeUndefined();
41
39
  });
42
40
 
43
- it("qualifies cross-org datastore labels and falls back to the agent org for empty refs", () => {
41
+ it("qualifies cross-org labels and falls back to the agent org for empty refs", () => {
44
42
  const { tree } = graphFor({
45
43
  ...emptySpec,
46
- datastoreUsages: [
47
- { datastoreRef: { org: "partner", slug: "shared-records" } },
48
- { datastoreRef: { org: "", slug: "local-records" } },
44
+ skillRefs: [
45
+ { org: "partner", slug: "shared-guide" },
46
+ { org: "", slug: "local-guide" },
49
47
  ],
50
48
  });
51
49
 
52
50
  const [crossOrg, relative] = tree!.root.children;
53
- expect(crossOrg.qualifiedLabel).toBe("partner/shared-records");
54
- expect(crossOrg.ref).toEqual({ org: "partner", slug: "shared-records" });
51
+ expect(crossOrg.qualifiedLabel).toBe("partner/shared-guide");
52
+ expect(crossOrg.ref).toEqual({ org: "partner", slug: "shared-guide" });
55
53
  expect(relative.qualifiedLabel).toBeUndefined();
56
- expect(relative.ref).toEqual({ org: "acme", slug: "local-records" });
54
+ expect(relative.ref).toEqual({ org: "acme", slug: "local-guide" });
57
55
  });
58
56
 
59
- it("orders children to mirror the Overview sections: MCP, skills, datastores, sub-agents", () => {
57
+ it("orders children to mirror the Overview sections: MCP, skills, sub-agents", () => {
60
58
  const { tree } = graphFor({
61
59
  mcpServerUsages: [
62
60
  {
@@ -75,32 +73,18 @@ describe("useDependencyGraph — datastore nodes", () => {
75
73
  modelOverride: "",
76
74
  },
77
75
  ],
78
- datastoreUsages: [
79
- { datastoreRef: { org: "acme", slug: "clinic-records" } },
80
- ],
81
76
  });
82
77
 
83
78
  expect(tree!.root.children.map((c) => c.kind)).toEqual([
84
79
  "mcp-server",
85
80
  "skill",
86
- "datastore",
87
81
  "sub-agent",
88
82
  ]);
89
- expect(tree!.nodeCount).toBe(5);
90
- });
91
-
92
- it("accepts specs without the datastoreUsages field (pre-existing public callers)", () => {
93
- const { tree, isEmpty } = graphFor({
94
- ...emptySpec,
95
- skillRefs: [{ org: "acme", slug: "triage-guide" }],
96
- });
97
-
98
- expect(isEmpty).toBe(false);
99
- expect(tree!.root.children.map((c) => c.kind)).toEqual(["skill"]);
83
+ expect(tree!.nodeCount).toBe(4);
100
84
  });
101
85
 
102
86
  it("stays empty when no dependencies exist at all", () => {
103
- const { tree, isEmpty } = graphFor({ ...emptySpec, datastoreUsages: [] });
87
+ const { tree, isEmpty } = graphFor(emptySpec);
104
88
 
105
89
  expect(isEmpty).toBe(true);
106
90
  expect(tree).toBeNull();
@@ -4,10 +4,9 @@
4
4
  * - `"agent"` — the root agent (always the tree root)
5
5
  * - `"mcp-server"` — an MCP server referenced via `mcpServerUsages` or `mcpAccess`
6
6
  * - `"skill"` — a skill referenced via `skillRefs`
7
- * - `"datastore"` — a datastore referenced via `datastoreUsages`
8
7
  * - `"sub-agent"` — an inline sub-agent definition with its own dependencies
9
8
  */
10
- export type NodeKind = "agent" | "mcp-server" | "skill" | "datastore" | "sub-agent";
9
+ export type NodeKind = "agent" | "mcp-server" | "skill" | "sub-agent";
11
10
 
12
11
  /**
13
12
  * A single node in the agent dependency tree.
@@ -16,9 +15,9 @@ export type NodeKind = "agent" | "mcp-server" | "skill" | "datastore" | "sub-age
16
15
  * (MCP servers and skills they access). Edges are implicit in the
17
16
  * parent-child relationship — no separate edge type is needed.
18
17
  *
19
- * Nodes are navigable when `ref` is defined (MCP servers, skills,
20
- * datastores). Sub-agent nodes have no `ref` because they are inline
21
- * definitions within the agent spec, not standalone resources.
18
+ * Nodes are navigable when `ref` is defined (MCP servers and skills).
19
+ * Sub-agent nodes have no `ref` because they are inline definitions
20
+ * within the agent spec, not standalone resources.
22
21
  */
23
22
  export interface DependencyNode {
24
23
  /**
@@ -47,9 +46,9 @@ export interface DependencyNode {
47
46
  /** Child nodes. Empty array for leaf nodes (MCP servers, skills). */
48
47
  readonly children: readonly DependencyNode[];
49
48
  /**
50
- * Navigation reference for clickable nodes. Defined for MCP servers,
51
- * skills, and datastores (standalone resources). Undefined for
52
- * sub-agents (inline definitions) and the root agent.
49
+ * Navigation reference for clickable nodes. Defined for MCP servers
50
+ * and skills (standalone resources). Undefined for sub-agents (inline
51
+ * definitions) and the root agent.
53
52
  */
54
53
  readonly ref?: { readonly org: string; readonly slug: string };
55
54
  }
@@ -71,7 +70,7 @@ export interface DependencyGraphProps {
71
70
  /**
72
71
  * Called when a navigable node is clicked. The `node.ref` field
73
72
  * contains the `org` and `slug` for routing. Only fired for nodes
74
- * where `ref` is defined (MCP servers, skills, datastores).
73
+ * where `ref` is defined (MCP servers and skills).
75
74
  */
76
75
  readonly onNodeClick?: (node: DependencyNode) => void;
77
76
  /**
@@ -120,17 +119,6 @@ export interface UseDependencyGraphOptions {
120
119
  }[];
121
120
  readonly modelOverride: string;
122
121
  }[];
123
- /**
124
- * Datastore attachments (`spec.datastoreUsages`). Optional because
125
- * this hook is a public SDK export: callers passing hand-built spec
126
- * objects written before the field existed must keep compiling.
127
- */
128
- readonly datastoreUsages?: readonly {
129
- readonly datastoreRef?: {
130
- readonly org: string;
131
- readonly slug: string;
132
- };
133
- }[];
134
122
  } | undefined;
135
123
  }
136
124
 
@@ -41,12 +41,10 @@ export function useDependencyGraph({
41
41
  if (!spec) return { tree: null, isEmpty: true };
42
42
 
43
43
  const { mcpServerUsages, skillRefs, subAgents } = spec;
44
- const datastoreUsages = spec.datastoreUsages ?? [];
45
44
 
46
45
  const hasDeps =
47
46
  mcpServerUsages.length > 0 ||
48
47
  skillRefs.length > 0 ||
49
- datastoreUsages.length > 0 ||
50
48
  subAgents.length > 0;
51
49
 
52
50
  if (!hasDeps) return { tree: null, isEmpty: true };
@@ -94,24 +92,6 @@ export function useDependencyGraph({
94
92
  };
95
93
  });
96
94
 
97
- const datastoreNodes: DependencyNode[] = datastoreUsages
98
- .filter((u) => u.datastoreRef)
99
- .map((usage) => {
100
- nodeCount++;
101
- const ref = usage.datastoreRef!;
102
- return {
103
- id: `datastore:${ref.slug}`,
104
- kind: "datastore" as const,
105
- label: ref.slug,
106
- qualifiedLabel:
107
- ref.org && ref.org !== agentOrg
108
- ? `${ref.org}/${ref.slug}`
109
- : undefined,
110
- children: [],
111
- ref: { org: ref.org || agentOrg, slug: ref.slug },
112
- };
113
- });
114
-
115
95
  const subAgentNodes: DependencyNode[] = subAgents.map((sa) => {
116
96
  nodeCount++;
117
97
 
@@ -164,12 +144,12 @@ export function useDependencyGraph({
164
144
  });
165
145
 
166
146
  // Child ordering mirrors the Overview sections: MCP servers,
167
- // skills, datastores, then sub-agents.
147
+ // skills, then sub-agents.
168
148
  const root: DependencyNode = {
169
149
  id: `agent:${agentName}`,
170
150
  kind: "agent",
171
151
  label: agentName,
172
- children: [...mcpNodes, ...skillNodes, ...datastoreNodes, ...subAgentNodes],
152
+ children: [...mcpNodes, ...skillNodes, ...subAgentNodes],
173
153
  };
174
154
 
175
155
  return {
@@ -12,6 +12,7 @@ import { getUserMessage, type EnvVarInput } from "@stigmer/sdk";
12
12
  import type { Environment } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/api_pb";
13
13
  import { useStigmer } from "../hooks.js";
14
14
  import { toError } from "../internal/toError.js";
15
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
15
16
  import { PermissionGate } from "../iam-policy/PermissionGate.js";
16
17
  import { useUpdateEnvironmentVariables } from "./useUpdateEnvironmentVariables.js";
17
18
  import { useRemoveEnvironmentVariables } from "./useRemoveEnvironmentVariables.js";
@@ -390,12 +391,22 @@ function VariableRow({
390
391
  <div className="stg:group stg:flex stg:items-center stg:gap-3 stg:py-2">
391
392
  {/* Key + badge */}
392
393
  <div className="stg:flex stg:shrink-0 stg:items-baseline stg:gap-1.5">
393
- <span
394
- className="stg:font-mono stg:text-xs stg:font-medium stg:text-foreground"
395
- title={variable.description || undefined}
396
- >
397
- {variable.key}
398
- </span>
394
+ {variable.description ? (
395
+ <Tooltip>
396
+ <TooltipTrigger
397
+ render={
398
+ <span className="stg:font-mono stg:text-xs stg:font-medium stg:text-foreground" />
399
+ }
400
+ >
401
+ {variable.key}
402
+ </TooltipTrigger>
403
+ <TooltipContent side="top">{variable.description}</TooltipContent>
404
+ </Tooltip>
405
+ ) : (
406
+ <span className="stg:font-mono stg:text-xs stg:font-medium stg:text-foreground">
407
+ {variable.key}
408
+ </span>
409
+ )}
399
410
  {variable.isSecret && (
400
411
  <span className="stg:text-[0.55rem] stg:uppercase stg:tracking-wider stg:text-muted-foreground-subtle">
401
412
  secret
@@ -407,12 +407,10 @@ export function ApprovalCardBody({
407
407
  </div>
408
408
 
409
409
  {/* De-emphasized provenance, trailing the decision it explains. Only the
410
- informative reasons reach here (see showGateReason); the full phrase is
411
- on hover. */}
410
+ informative reasons reach here (see showGateReason). */}
412
411
  {showGateReason && (
413
412
  <p
414
413
  className="stg:text-[11px] stg:italic stg:text-muted-foreground"
415
- title={gateReason ?? undefined}
416
414
  data-cursor-target="approval-gate-reason"
417
415
  >
418
416
  {gateReason}
@@ -5,6 +5,7 @@
5
5
 
6
6
  import { cn } from "@stigmer/theme";
7
7
  import { FileTypeIcon, FolderTypeIcon } from "../internal/file-icons/index.js";
8
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
8
9
  import type { ArtifactRowItem } from "./artifact-row-item.js";
9
10
  import { formatArtifactSize } from "./artifact-utils.js";
10
11
 
@@ -59,54 +60,73 @@ export function ArtifactRowView({
59
60
  }: ArtifactRowViewProps) {
60
61
  return (
61
62
  <li className={cn("stg:group stg:flex stg:items-stretch", className)}>
62
- <button
63
- type="button"
64
- onClick={onOpen}
65
- onDoubleClick={onActivate}
66
- title={item.tooltip}
67
- className={cn(
68
- "stg:flex stg:min-w-0 stg:flex-1 stg:items-center stg:gap-2 stg:px-2 stg:py-1 stg:text-left stg:text-xs stg:text-muted-foreground stg:transition-colors",
69
- "stg:hover:bg-muted stg:hover:text-foreground",
70
- "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-inset stg:focus-visible:ring-ring",
71
- )}
72
- >
73
- <span className="stg:shrink-0 stg:text-muted-foreground">
74
- {item.isDirectory ? (
75
- <FolderTypeIcon open={false} />
76
- ) : (
77
- <FileTypeIcon fileName={item.name} />
78
- )}
79
- </span>
80
- <span className="stg:min-w-0 stg:flex-1 stg:truncate stg:text-foreground">
81
- {item.name}
82
- {item.isDirectory && "/"}
83
- {item.subtitlePath && (
84
- <span className="stg:ml-1.5 stg:text-[0.65rem] stg:text-muted-foreground">
85
- {item.subtitlePath}
86
- </span>
87
- )}
88
- </span>
89
- <span className="stg:shrink-0 stg:tabular-nums stg:text-[0.65rem] stg:text-muted-foreground-faint">
90
- {formatArtifactSize(item.sizeBytes)}
91
- </span>
92
- </button>
93
- <button
94
- type="button"
95
- onClick={onDownload}
96
- disabled={isDownloading}
97
- aria-label={
98
- isDownloading ? `Preparing ${item.name}` : `Download ${item.name}`
99
- }
100
- title={item.isDirectory ? "Download ZIP" : "Download"}
101
- className={cn(
102
- "stg:flex stg:shrink-0 stg:items-center stg:px-2 stg:text-muted-foreground stg:opacity-0 stg:transition-opacity",
103
- "stg:group-hover:opacity-100 stg:focus-visible:opacity-100",
104
- "stg:hover:text-foreground stg:disabled:opacity-50",
105
- "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-inset stg:focus-visible:ring-ring",
106
- )}
107
- >
108
- <DownloadIcon />
109
- </button>
63
+ {/* The open button is its own tooltip trigger (hover and keyboard focus
64
+ both reveal the full path); the Download button's trigger is a
65
+ wrapper span so the hint survives the in-flight `disabled` state
66
+ (browsers suppress pointer events on disabled form controls, so a
67
+ disabled button can never open its own tooltip). */}
68
+ <Tooltip>
69
+ <TooltipTrigger
70
+ render={
71
+ <button
72
+ type="button"
73
+ onClick={onOpen}
74
+ onDoubleClick={onActivate}
75
+ className={cn(
76
+ "stg:flex stg:min-w-0 stg:flex-1 stg:items-center stg:gap-2 stg:px-2 stg:py-1 stg:text-left stg:text-xs stg:text-muted-foreground stg:transition-colors",
77
+ "stg:hover:bg-muted stg:hover:text-foreground",
78
+ "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-inset stg:focus-visible:ring-ring",
79
+ )}
80
+ />
81
+ }
82
+ >
83
+ <span className="stg:shrink-0 stg:text-muted-foreground">
84
+ {item.isDirectory ? (
85
+ <FolderTypeIcon open={false} />
86
+ ) : (
87
+ <FileTypeIcon fileName={item.name} />
88
+ )}
89
+ </span>
90
+ <span className="stg:min-w-0 stg:flex-1 stg:truncate stg:text-foreground">
91
+ {item.name}
92
+ {item.isDirectory && "/"}
93
+ {item.subtitlePath && (
94
+ <span className="stg:ml-1.5 stg:text-[0.65rem] stg:text-muted-foreground">
95
+ {item.subtitlePath}
96
+ </span>
97
+ )}
98
+ </span>
99
+ <span className="stg:shrink-0 stg:tabular-nums stg:text-[0.65rem] stg:text-muted-foreground-faint">
100
+ {formatArtifactSize(item.sizeBytes)}
101
+ </span>
102
+ </TooltipTrigger>
103
+ <TooltipContent side="top" className="stg:break-all">
104
+ {item.tooltip}
105
+ </TooltipContent>
106
+ </Tooltip>
107
+ <Tooltip>
108
+ <TooltipTrigger render={<span className="stg:flex stg:shrink-0" />}>
109
+ <button
110
+ type="button"
111
+ onClick={onDownload}
112
+ disabled={isDownloading}
113
+ aria-label={
114
+ isDownloading ? `Preparing ${item.name}` : `Download ${item.name}`
115
+ }
116
+ className={cn(
117
+ "stg:flex stg:shrink-0 stg:items-center stg:px-2 stg:text-muted-foreground stg:opacity-0 stg:transition-opacity",
118
+ "stg:group-hover:opacity-100 stg:focus-visible:opacity-100",
119
+ "stg:hover:text-foreground stg:disabled:opacity-50",
120
+ "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-inset stg:focus-visible:ring-ring",
121
+ )}
122
+ >
123
+ <DownloadIcon />
124
+ </button>
125
+ </TooltipTrigger>
126
+ <TooltipContent side="top">
127
+ {item.isDirectory ? "Download ZIP" : "Download"}
128
+ </TooltipContent>
129
+ </Tooltip>
110
130
  </li>
111
131
  );
112
132
  }
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { useCallback, useContext, useMemo, useState } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
5
6
  import { FilePathContext } from "./FilePathContext.js";
6
7
  import { resolvePathAction, splitDisplayPath } from "./file-path-resolver.js";
7
8
 
@@ -18,9 +19,9 @@ export interface FilePathLinkProps {
18
19
  readonly path: string;
19
20
  /**
20
21
  * How much of the directory prefix to show. Defaults to `"hide"` (file name
21
- * only); the full path is always available on hover via `title`. Use `"dim"`
22
- * where the surrounding directory aids comprehension (diff headers, the
23
- * multi-file changes list).
22
+ * only); the full path is always available on the hover/focus tooltip. Use
23
+ * `"dim"` where the surrounding directory aids comprehension (diff headers,
24
+ * the multi-file changes list).
24
25
  */
25
26
  readonly dirDisplay?: FilePathDirDisplay;
26
27
  /** Additional CSS class names for the root element. */
@@ -35,7 +36,7 @@ const COPIED_FEEDBACK_MS = 2000;
35
36
  *
36
37
  * **Filename-first.** It shows the base name prominently and never clips it;
37
38
  * the directory is optional (`dirDisplay`) and dimmed, and the *full* path is
38
- * always available on hover via `title` (and to screen readers via
39
+ * always available on the hover/focus tooltip (and to screen readers via
39
40
  * `aria-label`). This fixes the prior behaviour, where a single `truncate` on
40
41
  * the whole path clipped the file name — the one part that identifies the
41
42
  * change — and surfaced only the action verb on hover.
@@ -75,7 +76,6 @@ export function FilePathLink({
75
76
  // path. The action verb moves into the aria-label so hover surfaces the path,
76
77
  // not "Copy path".
77
78
  const fullPath = resolved.action === "copy" ? resolved.value : path;
78
- const title = fullPath;
79
79
  const ariaLabel = `${resolved.tooltip}: ${fullPath}`;
80
80
 
81
81
  const handleCopy = useCallback(() => {
@@ -143,32 +143,48 @@ export function FilePathLink({
143
143
  // in-app viewer) and only calls `preventDefault` when the handler took it.
144
144
  if (resolved.action === "link") {
145
145
  return (
146
- <a
147
- href={resolved.url}
148
- target="_blank"
149
- rel="noopener noreferrer"
150
- onClick={handleClick}
151
- aria-label={ariaLabel}
152
- title={title}
153
- className={cn(sharedClasses, "stg:group/fpl")}
154
- >
155
- {label}
156
- <ExternalLinkIcon />
157
- </a>
146
+ <Tooltip>
147
+ <TooltipTrigger
148
+ render={
149
+ <a
150
+ href={resolved.url}
151
+ target="_blank"
152
+ rel="noopener noreferrer"
153
+ onClick={handleClick}
154
+ aria-label={ariaLabel}
155
+ className={cn(sharedClasses, "stg:group/fpl")}
156
+ />
157
+ }
158
+ >
159
+ {label}
160
+ <ExternalLinkIcon />
161
+ </TooltipTrigger>
162
+ <TooltipContent side="top" className="stg:break-all">
163
+ {fullPath}
164
+ </TooltipContent>
165
+ </Tooltip>
158
166
  );
159
167
  }
160
168
 
161
169
  return (
162
- <button
163
- type="button"
164
- onClick={handleClick}
165
- aria-label={ariaLabel}
166
- title={title}
167
- className={cn(sharedClasses, "stg:group/fpl stg:cursor-pointer")}
168
- >
169
- {label}
170
- {!copied && <CopyIcon />}
171
- </button>
170
+ <Tooltip>
171
+ <TooltipTrigger
172
+ render={
173
+ <button
174
+ type="button"
175
+ onClick={handleClick}
176
+ aria-label={ariaLabel}
177
+ className={cn(sharedClasses, "stg:group/fpl stg:cursor-pointer")}
178
+ />
179
+ }
180
+ >
181
+ {label}
182
+ {!copied && <CopyIcon />}
183
+ </TooltipTrigger>
184
+ <TooltipContent side="top" className="stg:break-all">
185
+ {fullPath}
186
+ </TooltipContent>
187
+ </Tooltip>
172
188
  );
173
189
  }
174
190
 
@@ -3,6 +3,7 @@
3
3
  import { useMemo, useState } from "react";
4
4
  import type { ToolCall } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
5
5
  import { cn } from "@stigmer/theme";
6
+ import { TruncatedText } from "../internal/truncated-text.js";
6
7
  import { formatDuration } from "./ToolCallDetail.js";
7
8
  import { humanizeToolName } from "./tool-categories.js";
8
9
  import {
@@ -301,8 +302,11 @@ function ScalarRow({ label, value }: { label: string; value: string }) {
301
302
  </pre>
302
303
  </dd>
303
304
  ) : (
304
- <dd className="stg:min-w-0 stg:truncate stg:font-mono stg:text-foreground" title={value}>
305
- {value}
305
+ <dd className="stg:min-w-0">
306
+ <TruncatedText
307
+ text={value}
308
+ className="stg:block stg:font-mono stg:text-foreground"
309
+ />
306
310
  </dd>
307
311
  )}
308
312
  </>