@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
@@ -0,0 +1,88 @@
1
+ import { screen, waitFor } from "@testing-library/react";
2
+ import userEvent from "@testing-library/user-event";
3
+
4
+ /**
5
+ * Open a Base UI floating-trigger popup (action menu, dropdown) the way a
6
+ * real pointer does, and fail with the exact stage that died.
7
+ *
8
+ * WHY THIS EXISTS (oss#483): Base UI commits a trigger's interactive props
9
+ * (open handlers, `aria-expanded`) one store-notification cycle AFTER the
10
+ * button first appears in the DOM. A test that clicks immediately after
11
+ * render can hit that window — the click lands on a not-yet-wired button
12
+ * and the open is never attempted. Invisible at human speed, the window
13
+ * widens under CI load into intermittent "menu never opened" timeouts
14
+ * (~5% per attempt under CPU starvation; mechanism pinned by probing
15
+ * `aria-expanded` synchronously after the click: `null`, with the menu
16
+ * root's `onOpenChange` never firing). The readiness stage below closes
17
+ * the race by construction; the pointer-fidelity click keeps the test on
18
+ * the open path real users exercise.
19
+ *
20
+ * Failure semantics: each stage throws a named error, so a CI log
21
+ * pinpoints WHICH link broke (trigger never wired / open never happened /
22
+ * items never rendered) instead of an opaque 8s query timeout. There are
23
+ * deliberately NO retries: a helper that re-clicks would mask genuine
24
+ * open-path regressions in the SDK.
25
+ *
26
+ * Caveat: `userEvent` deadlocks under `vi.useFakeTimers()` unless
27
+ * configured with `advanceTimers` — don't call this helper from
28
+ * fake-timer tests (none of the menu suites use them today).
29
+ *
30
+ * Not a `.test` file and inside `__tests__` deliberately: vitest does not
31
+ * collect it, and the build/typedoc excludes keep it out of the published
32
+ * package.
33
+ */
34
+ export async function openMenu(trigger: HTMLElement): Promise<void> {
35
+ await openFloatingTrigger(trigger, "menuitem");
36
+ }
37
+
38
+ /**
39
+ * Trigger-generic core: Base UI selects/comboboxes share the same wiring
40
+ * lifecycle and the same latent race (their popup items are `option`
41
+ * instead of `menuitem`). Widen to an exported `openSelect` if that family
42
+ * ever needs it — do not fork the stages.
43
+ */
44
+ async function openFloatingTrigger(
45
+ trigger: HTMLElement,
46
+ itemRole: "menuitem" | "option",
47
+ ): Promise<void> {
48
+ // Stage 1 — trigger wiring. `aria-expanded` arrives in the same props
49
+ // merge as the open handlers, so its presence is the observable signal
50
+ // that the button is actually clickable-as-a-trigger.
51
+ await waitFor(() => {
52
+ if (!trigger.hasAttribute("aria-expanded")) {
53
+ throw new Error(
54
+ `openMenu stage "trigger-wiring": trigger is rendered but Base UI ` +
55
+ `has not attached its interactive props yet (no aria-expanded). ` +
56
+ `Trigger: ${describeTrigger(trigger)}`,
57
+ );
58
+ }
59
+ });
60
+
61
+ // Stage 2 — the click, with full pointer + focus fidelity (pointerdown,
62
+ // mousedown, focus, pointerup, mouseup, click) so the primary
63
+ // mousedown-open path is exercised, not the bare-click fallback.
64
+ await userEvent.click(trigger);
65
+
66
+ // Stage 3 — the open must register on the trigger itself.
67
+ await waitFor(() => {
68
+ if (trigger.getAttribute("aria-expanded") !== "true") {
69
+ throw new Error(
70
+ `openMenu stage "open": the click was dispatched but the trigger ` +
71
+ `never reported open (aria-expanded=` +
72
+ `${JSON.stringify(trigger.getAttribute("aria-expanded"))}). ` +
73
+ `Trigger: ${describeTrigger(trigger)}`,
74
+ );
75
+ }
76
+ });
77
+
78
+ // Stage 4 — items must be queryable. findAllByRole (not waitFor) so a
79
+ // timeout here still produces testing-library's DOM dump.
80
+ await screen.findAllByRole(itemRole);
81
+ }
82
+
83
+ function describeTrigger(trigger: HTMLElement): string {
84
+ const label = trigger.getAttribute("aria-label") ?? trigger.textContent;
85
+ return `<${trigger.tagName.toLowerCase()} aria-label=${JSON.stringify(
86
+ label,
87
+ )} connected=${trigger.isConnected}>`;
88
+ }
@@ -1,10 +1,10 @@
1
1
  import { describe, it, expect, beforeAll, afterEach } from "vitest";
2
2
  import { render, renderHook, screen, cleanup } from "@testing-library/react";
3
- import { fireEvent } from "@testing-library/react";
4
3
  import type { Stigmer } from "@stigmer/sdk";
5
4
  import { StigmerProvider } from "../provider";
6
5
  import { useStigmerPortalContainer } from "../portal-container";
7
6
  import { Menu, MenuTrigger, MenuContent, MenuItem } from "../internal/menu";
7
+ import { openMenu } from "./helpers/open-menu";
8
8
 
9
9
  // Regression tests for stigmer-cloud#271: Base UI treats an EXPLICIT
10
10
  // `container={null}` as "wait for a container" and renders the popup
@@ -85,9 +85,9 @@ describe("standalone portal rendering (no StigmerProvider)", () => {
85
85
  </Menu>,
86
86
  );
87
87
 
88
- fireEvent.click(screen.getByRole("button", { name: "Open actions" }));
88
+ await openMenu(screen.getByRole("button", { name: "Open actions" }));
89
89
 
90
- const item = await screen.findByRole("menuitem", { name: "Rename" });
90
+ const item = screen.getByRole("menuitem", { name: "Rename" });
91
91
 
92
92
  // Portaled for real: in the document, but NOT inside the render
93
93
  // container — Base UI appended it to document.body.
@@ -60,8 +60,9 @@ const EPOCH = new Date(0);
60
60
  * - Fallback to `specAudit.createdAt` for documents without status updates
61
61
  * - Pagination / trimming to the requested page size
62
62
  *
63
- * The OSS server does not implement this RPC yet (stigmer#461): against a
64
- * pure OSS backend the fetch rejects and `error` is surfaced to the caller.
63
+ * Both editions implement the RPC with identical merge/projection semantics
64
+ * (the OSS server since stigmer#461; it is single-tenant, so the caller sees
65
+ * every stored resource and the org filter is a no-op there).
65
66
  */
66
67
  export function useRecentActivity(
67
68
  options?: UseRecentActivityOptions,
@@ -4,7 +4,6 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
5
  import { timestampDate } from "@bufbuild/protobuf/wkt";
6
6
  import type {
7
- DatastoreUsage,
8
7
  McpServerUsage,
9
8
  SubAgent,
10
9
  } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/spec_pb";
@@ -17,7 +16,6 @@ import { useUpdateAgent } from "./useUpdateAgent.js";
17
16
  import { agentToInput } from "./internal/agentToInput.js";
18
17
  import { toError } from "../internal/toError.js";
19
18
  import { ErrorMessage } from "../error/ErrorMessage.js";
20
- import { DatastoreIcon } from "../datastore/DatastoreDetailView.js";
21
19
  import { VisibilityBadge } from "../library/VisibilitySelector.js";
22
20
  import { useManageAccess } from "../access/useManageAccess.js";
23
21
  import { AgentShareList } from "../sharing/AgentShareList.js";
@@ -61,13 +59,6 @@ export interface AgentDetailViewProps {
61
59
  * Provides `org` and `slug` of the referenced skill.
62
60
  */
63
61
  readonly onSkillClick?: (ref: { org: string; slug: string }) => void;
64
- /**
65
- * Called when a datastore reference is clicked.
66
- * Provides `org` and `slug` of the referenced datastore so the
67
- * consumer can wire navigation. When the reference has no explicit
68
- * org, the agent's own org is used as fallback.
69
- */
70
- readonly onDatastoreClick?: (ref: { org: string; slug: string }) => void;
71
62
  /**
72
63
  * Called once when the agent resource has been fetched successfully.
73
64
  * Provides the resource display name for use cases like breadcrumbs,
@@ -186,7 +177,7 @@ export interface AgentDetailViewProps {
186
177
  * Fetches the agent via {@link useAgent} internally and renders its
187
178
  * full configuration inside a {@link ResourceDetailShell}: a
188
179
  * standardized header with action bar, followed by structured content
189
- * sections (instructions, MCP server usages, skills, datastores,
180
+ * sections (instructions, MCP server usages, skills,
190
181
  * sub-agents, and environment variables). Sections with no data are
191
182
  * omitted entirely — reducing visual noise per Nielsen heuristic #8.
192
183
  *
@@ -225,7 +216,6 @@ export function AgentDetailView({
225
216
  slug,
226
217
  onMcpServerClick,
227
218
  onSkillClick,
228
- onDatastoreClick,
229
219
  onResourceLoad,
230
220
  primaryAction,
231
221
  actions,
@@ -249,8 +239,8 @@ export function AgentDetailView({
249
239
 
250
240
  // Last failed inline save, attributed to the field that was edited so
251
241
  // only that section shows the message. The backend's message is the
252
- // UX (DD-006): e.g. the datastore exposure guard refuses public +
253
- // datastore_usages with an actionable FAILED_PRECONDITION message.
242
+ // UX (DD-006): server refusals arrive as actionable FAILED_PRECONDITION
243
+ // messages.
254
244
  const [saveError, setSaveError] = useState<{
255
245
  field: string;
256
246
  message: string;
@@ -314,11 +304,9 @@ export function AgentDetailView({
314
304
  onMcpServerClick?.(node.ref);
315
305
  } else if (node.kind === "skill") {
316
306
  onSkillClick?.(node.ref);
317
- } else if (node.kind === "datastore") {
318
- onDatastoreClick?.(node.ref);
319
307
  }
320
308
  },
321
- [onMcpServerClick, onSkillClick, onDatastoreClick],
309
+ [onMcpServerClick, onSkillClick],
322
310
  );
323
311
 
324
312
  const onResourceLoadRef = useRef(onResourceLoad);
@@ -456,7 +444,6 @@ export function AgentDetailView({
456
444
  description={spec?.description}
457
445
  onMcpServerClick={onMcpServerClick}
458
446
  onSkillClick={onSkillClick}
459
- onDatastoreClick={onDatastoreClick}
460
447
  editable={editable}
461
448
  isSaving={isUpdating}
462
449
  saveField={saveField}
@@ -496,7 +483,6 @@ function AgentOverview({
496
483
  description,
497
484
  onMcpServerClick,
498
485
  onSkillClick,
499
- onDatastoreClick,
500
486
  editable,
501
487
  isSaving,
502
488
  saveField,
@@ -508,7 +494,6 @@ function AgentOverview({
508
494
  readonly description?: string;
509
495
  readonly onMcpServerClick?: (ref: { org: string; slug: string }) => void;
510
496
  readonly onSkillClick?: (ref: { org: string; slug: string }) => void;
511
- readonly onDatastoreClick?: (ref: { org: string; slug: string }) => void;
512
497
  readonly editable?: boolean;
513
498
  readonly isSaving?: boolean;
514
499
  readonly saveField?: <K extends keyof import("@stigmer/sdk").AgentInput>(
@@ -519,8 +504,8 @@ function AgentOverview({
519
504
  readonly clearSaveError?: () => void;
520
505
  }) {
521
506
  // The failed save's message, shown only under the section that owns
522
- // the field — a rejection of a datastore edit must not appear under
523
- // the skills editor.
507
+ // the field — a rejection of one section's edit must not appear under
508
+ // another section's editor.
524
509
  const errorFor = (field: keyof import("@stigmer/sdk").AgentInput) =>
525
510
  saveError?.field === field ? saveError.message : undefined;
526
511
  const handleInstructionsSave = useCallback(
@@ -548,15 +533,6 @@ function AgentOverview({
548
533
  [saveField],
549
534
  );
550
535
 
551
- const handleDatastoresSave = useCallback(
552
- async (refs: ResourceRefRow[]) =>
553
- saveField?.(
554
- "datastoreUsages",
555
- refs.map((r) => ({ datastoreRef: { org: r.org, slug: r.slug } })),
556
- ) ?? false,
557
- [saveField],
558
- );
559
-
560
536
  const handleEnvSave = useCallback(
561
537
  async (rows: KeyValueRow[]) => {
562
538
  const env: Record<string, { isSecret?: boolean; description?: string; optional?: boolean }> = {};
@@ -600,19 +576,6 @@ function AgentOverview({
600
576
  [spec?.skillRefs, agentOrg],
601
577
  );
602
578
 
603
- const datastoreRefRows: ResourceRefRow[] = useMemo(
604
- () =>
605
- (spec?.datastoreUsages ?? []).map((usage) => ({
606
- org: usage.datastoreRef?.org || agentOrg,
607
- slug: usage.datastoreRef?.slug ?? "",
608
- label:
609
- usage.datastoreRef?.org && usage.datastoreRef.org !== agentOrg
610
- ? `${usage.datastoreRef.org}/${usage.datastoreRef.slug}`
611
- : usage.datastoreRef?.slug ?? "",
612
- })),
613
- [spec?.datastoreUsages, agentOrg],
614
- );
615
-
616
579
  const envRows: KeyValueRow[] = useMemo(
617
580
  () =>
618
581
  Object.entries(spec?.env ?? {})
@@ -631,13 +594,11 @@ function AgentOverview({
631
594
  const showInstructions = editable || !!spec?.instructions;
632
595
  const showMcpServers = editable || (spec && spec.mcpServerUsages.length > 0);
633
596
  const showSkills = editable || (spec && spec.skillRefs.length > 0);
634
- const showDatastores = editable || (spec && spec.datastoreUsages.length > 0);
635
597
  const showSubAgents = editable || (spec && spec.subAgents.length > 0);
636
598
  const showEnv = editable || (spec?.env && Object.keys(spec.env).length > 0);
637
599
 
638
600
  const [mcpEditing, setMcpEditing] = useState(false);
639
601
  const [skillsEditing, setSkillsEditing] = useState(false);
640
- const [datastoresEditing, setDatastoresEditing] = useState(false);
641
602
  const [envEditing, setEnvEditing] = useState(false);
642
603
 
643
604
  // Entering edit mode discards the previous attempt's error — the
@@ -656,13 +617,6 @@ function AgentOverview({
656
617
  },
657
618
  [clearSaveError],
658
619
  );
659
- const handleDatastoresEditingChange = useCallback(
660
- (editing: boolean) => {
661
- if (editing) clearSaveError?.();
662
- setDatastoresEditing(editing);
663
- },
664
- [clearSaveError],
665
- );
666
620
  const handleEnvEditingChange = useCallback(
667
621
  (editing: boolean) => {
668
622
  if (editing) clearSaveError?.();
@@ -765,31 +719,6 @@ function AgentOverview({
765
719
  </Section>
766
720
  )}
767
721
 
768
- {showDatastores && (
769
- <Section title="Datastores" count={spec?.datastoreUsages.length} onEdit={editable ? () => handleDatastoresEditingChange(!datastoresEditing) : undefined}>
770
- {editable ? (
771
- <InlineEditResourceList
772
- value={datastoreRefRows}
773
- onSave={handleDatastoresSave}
774
- isSaving={isSaving}
775
- error={errorFor("datastoreUsages")}
776
- editing={datastoresEditing}
777
- onEditingChange={handleDatastoresEditingChange}
778
- onItemClick={onDatastoreClick ? (ref) => onDatastoreClick({ org: ref.org, slug: ref.slug }) : undefined}
779
- itemIcon={<DatastoreIcon className="stg:size-4" />}
780
- resourceLabel="datastore"
781
- defaultOrg={agentOrg}
782
- />
783
- ) : (
784
- <DatastoresContent
785
- usages={spec?.datastoreUsages ?? []}
786
- defaultOrg={agentOrg}
787
- onDatastoreClick={onDatastoreClick}
788
- />
789
- )}
790
- </Section>
791
- )}
792
-
793
722
  {showSubAgents && (
794
723
  <SubAgentsSection
795
724
  subAgents={spec?.subAgents ?? []}
@@ -986,59 +915,6 @@ function SkillsContent({
986
915
  );
987
916
  }
988
917
 
989
- function DatastoresContent({
990
- usages,
991
- defaultOrg,
992
- onDatastoreClick,
993
- }: {
994
- readonly usages: readonly DatastoreUsage[];
995
- readonly defaultOrg: string;
996
- readonly onDatastoreClick?: (ref: { org: string; slug: string }) => void;
997
- }) {
998
- return (
999
- <div className="stg:flex stg:flex-col">
1000
- {usages.map((usage, index) => {
1001
- const ref = usage.datastoreRef;
1002
- if (!ref) return null;
1003
-
1004
- const refOrg = ref.org || defaultOrg;
1005
- const label =
1006
- ref.org && ref.org !== defaultOrg
1007
- ? `${ref.org}/${ref.slug}`
1008
- : ref.slug;
1009
-
1010
- const row = (
1011
- <div className="stg:flex stg:items-center stg:gap-3">
1012
- <DatastoreIcon className="stg:size-4 stg:shrink-0 stg:text-muted-foreground" />
1013
- <span className="stg:text-sm stg:font-medium stg:text-foreground">
1014
- {label}
1015
- </span>
1016
- </div>
1017
- );
1018
-
1019
- return onDatastoreClick ? (
1020
- <button
1021
- key={ref.slug || index}
1022
- type="button"
1023
- onClick={() => onDatastoreClick({ org: refOrg, slug: ref.slug })}
1024
- className={cn(
1025
- "stg:w-full stg:rounded-md stg:px-3 stg:py-2 stg:text-left stg:transition-colors",
1026
- "stg:hover:bg-accent-hover",
1027
- "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-inset stg:focus-visible:ring-ring",
1028
- )}
1029
- >
1030
- {row}
1031
- </button>
1032
- ) : (
1033
- <div key={ref.slug || index} className="stg:px-3 stg:py-2">
1034
- {row}
1035
- </div>
1036
- );
1037
- })}
1038
- </div>
1039
- );
1040
- }
1041
-
1042
918
  interface SubAgentDraft {
1043
919
  name: string;
1044
920
  description: string;
@@ -9,7 +9,7 @@ import { agentToInput } from "../agentToInput";
9
9
 
10
10
  /**
11
11
  * Regression guard for stigmer/stigmer#319 — the console agent editor
12
- * silently deleting `datastore_usages` on save.
12
+ * silently deleting an unmapped spec field on save.
13
13
  *
14
14
  * `agentToInput()` reconstructs a full `AgentInput` from a fetched Agent
15
15
  * so inline edits can re-submit the whole spec (the backend does full
@@ -91,19 +91,10 @@ function fullyPopulatedAgent(): Agent {
91
91
  env: {
92
92
  CLINIC_API_KEY: {
93
93
  isSecret: true,
94
- description: "Records bridge credential",
94
+ description: "Clinic API credential",
95
95
  },
96
96
  REGION: { optional: true },
97
97
  },
98
- datastoreUsages: [
99
- {
100
- datastoreRef: {
101
- org: "acme",
102
- slug: "clinic-records",
103
- kind: ApiResourceKind.datastore,
104
- },
105
- },
106
- ],
107
98
  },
108
99
  });
109
100
  }
@@ -1,7 +1,6 @@
1
1
  import type { Agent } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
2
2
  import type {
3
3
  AgentInput,
4
- DatastoreUsageInput,
5
4
  EnvVarDeclarationInput,
6
5
  McpServerUsageInput,
7
6
  SubAgentInput,
@@ -73,15 +72,6 @@ export function agentToInput(agent: Agent): AgentInput {
73
72
  modelOverride: sa.modelOverride || undefined,
74
73
  }));
75
74
 
76
- const datastoreUsages: DatastoreUsageInput[] | undefined =
77
- spec?.datastoreUsages?.map((usage) => ({
78
- datastoreRef: {
79
- org: usage.datastoreRef?.org ?? "",
80
- slug: usage.datastoreRef?.slug ?? "",
81
- version: usage.datastoreRef?.version || undefined,
82
- },
83
- }));
84
-
85
75
  let env: Record<string, EnvVarDeclarationInput> | undefined;
86
76
  if (spec?.env && Object.keys(spec.env).length > 0) {
87
77
  env = {};
@@ -108,6 +98,5 @@ export function agentToInput(agent: Agent): AgentInput {
108
98
  skillRefs: skillRefs?.length ? skillRefs : undefined,
109
99
  subAgents: subAgents?.length ? subAgents : undefined,
110
100
  env,
111
- datastoreUsages: datastoreUsages?.length ? datastoreUsages : undefined,
112
101
  };
113
102
  }
@@ -11,6 +11,7 @@ import { Button } from "../button/Button.js";
11
11
  import { useEnvironmentList } from "../environment/useEnvironmentList.js";
12
12
  import { ResourceVisibilityControl } from "../library/ResourceVisibilityControl.js";
13
13
  import { useCheckPermission } from "../iam-policy/useCheckPermission.js";
14
+ import { TruncatedText } from "../internal/truncated-text.js";
14
15
  import { AgentInstanceEmptyState } from "./AgentInstanceEmptyState.js";
15
16
 
16
17
  /** Label marking a user's auto-managed personal instance. */
@@ -216,12 +217,10 @@ function InstanceRow({
216
217
  <td className="stg:px-4 stg:py-2.5">
217
218
  <div className="stg:min-w-0">
218
219
  <div className="stg:flex stg:min-w-0 stg:items-center stg:gap-2">
219
- <span
220
- className="stg:truncate stg:font-medium stg:text-foreground"
221
- title={meta?.name || meta?.slug || undefined}
222
- >
223
- {meta?.name || meta?.slug || "\u2014"}
224
- </span>
220
+ <TruncatedText
221
+ text={meta?.name || meta?.slug || "\u2014"}
222
+ className="stg:font-medium stg:text-foreground"
223
+ />
225
224
  {isPersonal && (
226
225
  <span
227
226
  className={cn(
@@ -1,6 +1,7 @@
1
1
  import { describe, it, expect, vi, beforeAll, afterEach } from "vitest";
2
2
  import { render, screen, fireEvent, cleanup } from "@testing-library/react";
3
3
  import { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
4
+ import { openMenu } from "../../__tests__/helpers/open-menu";
4
5
  import { AgentInstanceList } from "../AgentInstanceList";
5
6
 
6
7
  // Isolate the row-actions behavior under test from the data, environment,
@@ -79,7 +80,7 @@ describe("AgentInstanceList row actions", () => {
79
80
 
80
81
  // No always-visible action buttons; the row shows a single kebab.
81
82
  expect(screen.queryByRole("button", { name: "Start session" })).toBeNull();
82
- fireEvent.click(screen.getByRole("button", { name: /^Actions for/ }));
83
+ await openMenu(screen.getByRole("button", { name: /^Actions for/ }));
83
84
 
84
85
  expect(
85
86
  await screen.findByRole("menuitem", { name: "Start session" }),
@@ -100,7 +101,7 @@ describe("AgentInstanceList row actions", () => {
100
101
  />,
101
102
  );
102
103
 
103
- fireEvent.click(screen.getByRole("button", { name: /^Actions for/ }));
104
+ await openMenu(screen.getByRole("button", { name: /^Actions for/ }));
104
105
  fireEvent.click(await screen.findByRole("menuitem", { name: "Start session" }));
105
106
 
106
107
  expect(onStart).toHaveBeenCalledTimes(1);
@@ -120,7 +121,7 @@ describe("AgentInstanceList row actions", () => {
120
121
  />,
121
122
  );
122
123
 
123
- fireEvent.click(screen.getByRole("button", { name: /^Actions for/ }));
124
+ await openMenu(screen.getByRole("button", { name: /^Actions for/ }));
124
125
  fireEvent.click(await screen.findByRole("menuitem", { name: "Delete" }));
125
126
 
126
127
  expect(onDelete).toHaveBeenCalledWith(inst);
@@ -138,7 +139,7 @@ describe("AgentInstanceList row actions", () => {
138
139
  />,
139
140
  );
140
141
 
141
- fireEvent.click(screen.getByRole("button", { name: /^Actions for/ }));
142
+ await openMenu(screen.getByRole("button", { name: /^Actions for/ }));
142
143
  expect(
143
144
  await screen.findByRole("menuitem", { name: "Start session" }),
144
145
  ).toBeTruthy();
@@ -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 { ApiKey } from "@stigmer/protos/ai/stigmer/iam/apikey/v1/api_pb";
8
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
8
9
  import { useApiKeyList } from "./useApiKeyList.js";
9
10
  import { useDeleteApiKey } from "./useDeleteApiKey.js";
10
11
 
@@ -242,9 +243,16 @@ function ApiKeyRow({
242
243
  {/* Metadata columns */}
243
244
  <div className="stg:hidden stg:sm:flex stg:shrink-0 stg:items-center stg:gap-4 stg:text-xs stg:text-muted-foreground">
244
245
  {createdAt && (
245
- <span title={`Created ${timestampDate(createdAt).toISOString()}`}>
246
- {formatShortDate(timestampDate(createdAt))}
247
- </span>
246
+ <Tooltip>
247
+ <TooltipTrigger
248
+ render={<time dateTime={timestampDate(createdAt).toISOString()} />}
249
+ >
250
+ {formatShortDate(timestampDate(createdAt))}
251
+ </TooltipTrigger>
252
+ <TooltipContent side="top">
253
+ {`Created ${timestampDate(createdAt).toISOString()}`}
254
+ </TooltipContent>
255
+ </Tooltip>
248
256
  )}
249
257
  <span>
250
258
  {neverExpires