@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
@@ -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 { PlatformClient } from "@stigmer/protos/ai/stigmer/iam/platformclient/v1/api_pb";
8
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
8
9
  import { usePlatformClientList } from "./usePlatformClientList.js";
9
10
  import { useDeletePlatformClient } from "./useDeletePlatformClient.js";
10
11
 
@@ -239,12 +240,14 @@ function PlatformClientRow({
239
240
 
240
241
  <div className="stg:hidden stg:sm:flex stg:shrink-0 stg:items-center stg:gap-3 stg:text-xs stg:text-muted-foreground">
241
242
  {fingerprint && (
242
- <span
243
- className="stg:font-mono"
244
- title={`Secret fingerprint: ${fingerprint}`}
245
- >
246
- ••••{fingerprint.slice(-4)}
247
- </span>
243
+ <Tooltip>
244
+ <TooltipTrigger render={<span className="stg:font-mono" />}>
245
+ ••••{fingerprint.slice(-4)}
246
+ </TooltipTrigger>
247
+ <TooltipContent side="top" className="stg:break-all">
248
+ {`Secret fingerprint: ${fingerprint}`}
249
+ </TooltipContent>
250
+ </Tooltip>
248
251
  )}
249
252
  <ExpiryBadge spec={spec} />
250
253
  {spec?.autoProvisionAccounts && (
@@ -253,9 +256,16 @@ function PlatformClientRow({
253
256
  </span>
254
257
  )}
255
258
  {createdAt && (
256
- <span title={`Created ${timestampDate(createdAt).toISOString()}`}>
257
- {formatShortDate(timestampDate(createdAt))}
258
- </span>
259
+ <Tooltip>
260
+ <TooltipTrigger
261
+ render={<time dateTime={timestampDate(createdAt).toISOString()} />}
262
+ >
263
+ {formatShortDate(timestampDate(createdAt))}
264
+ </TooltipTrigger>
265
+ <TooltipContent side="top">
266
+ {`Created ${timestampDate(createdAt).toISOString()}`}
267
+ </TooltipContent>
268
+ </Tooltip>
259
269
  )}
260
270
  </div>
261
271
 
@@ -305,15 +315,22 @@ function ExpiryBadge({ spec }: { spec: PlatformClient["spec"] }) {
305
315
  const date = timestampDate(spec.expiresAt);
306
316
  const isExpired = date < new Date();
307
317
  return (
308
- <span
309
- className={cn(
310
- "stg:text-[0.65rem]",
311
- isExpired ? "stg:text-destructive stg:font-medium" : "stg:text-muted-foreground",
312
- )}
313
- title={`Expires ${date.toISOString()}`}
314
- >
315
- {isExpired ? "Expired" : `Exp ${formatShortDate(date)}`}
316
- </span>
318
+ <Tooltip>
319
+ <TooltipTrigger
320
+ render={
321
+ <time
322
+ dateTime={date.toISOString()}
323
+ className={cn(
324
+ "stg:text-[0.65rem]",
325
+ isExpired ? "stg:text-destructive stg:font-medium" : "stg:text-muted-foreground",
326
+ )}
327
+ />
328
+ }
329
+ >
330
+ {isExpired ? "Expired" : `Exp ${formatShortDate(date)}`}
331
+ </TooltipTrigger>
332
+ <TooltipContent side="top">{`Expires ${date.toISOString()}`}</TooltipContent>
333
+ </Tooltip>
317
334
  );
318
335
  }
319
336
  return null;
@@ -86,6 +86,8 @@ interface CatalogForm {
86
86
  readonly speedTier: string;
87
87
  readonly costTier: string;
88
88
  readonly featured: boolean;
89
+ /** Comma-separated base-level wire ids (inbound aliases). */
90
+ readonly wireIds: string;
89
91
  readonly input: string;
90
92
  readonly output: string;
91
93
  readonly cacheWrite: string;
@@ -105,6 +107,7 @@ const EMPTY_FORM: CatalogForm = {
105
107
  speedTier: "fast",
106
108
  costTier: "standard",
107
109
  featured: false,
110
+ wireIds: "",
108
111
  input: "",
109
112
  output: "",
110
113
  cacheWrite: "0",
@@ -126,6 +129,7 @@ function formFromBaseline(baseline: ModelPricingBaseline): CatalogForm {
126
129
  speedTier: baseline.speedTier || "fast",
127
130
  costTier: baseline.costTier || "standard",
128
131
  featured: baseline.featured,
132
+ wireIds: baseline.wireIds.join(", "),
129
133
  input: microsToDollarString(pricing?.inputPriceMicrosPerMillion ?? ZERO),
130
134
  output: microsToDollarString(pricing?.outputPriceMicrosPerMillion ?? ZERO),
131
135
  cacheWrite: microsToDollarString(pricing?.cacheWritePriceMicrosPerMillion ?? ZERO),
@@ -212,6 +216,10 @@ function buildBaseline(
212
216
  speedTier: form.speedTier,
213
217
  costTier: form.costTier,
214
218
  featured: form.featured,
219
+ wireIds: form.wireIds
220
+ .split(",")
221
+ .map((w) => w.trim())
222
+ .filter((w) => w !== ""),
215
223
  pricing: create(PricingBlockSchema, {
216
224
  inputPriceMicrosPerMillion: input,
217
225
  outputPriceMicrosPerMillion: output,
@@ -516,6 +524,18 @@ export function BaselineEditor({
516
524
  </Field>
517
525
  </div>
518
526
 
527
+ {/* Inbound aliases, editable on existing entries (unlike identity):
528
+ adding an alias to a live model is this field's primary use. */}
529
+ <Field label="Wire ids (comma-separated)">
530
+ <input
531
+ className={INPUT_CLASSES}
532
+ value={form.wireIds}
533
+ onChange={(e) => set("wireIds", e.target.value)}
534
+ placeholder="e.g. gemini-3-flash-preview"
535
+ disabled={isSubmitting}
536
+ />
537
+ </Field>
538
+
519
539
  <label className="stg:flex stg:cursor-pointer stg:items-center stg:gap-1.5 stg:text-xs stg:text-foreground">
520
540
  <input
521
541
  type="checkbox"
@@ -8,6 +8,7 @@ import {
8
8
  type ModelPricingBaseline,
9
9
  } from "@stigmer/protos/ai/stigmer/billing/v1/model_pricing_baseline_pb";
10
10
  import { Button } from "../button/index.js";
11
+ import { TruncatedText } from "../internal/truncated-text.js";
11
12
  import { BaselineEditor } from "./BaselineEditor.js";
12
13
  import { RetireConfirm } from "./RetireConfirm.js";
13
14
  import { OperatorAccessNotice } from "./OperatorAccessNotice.js";
@@ -232,13 +233,16 @@ function CatalogRow({
232
233
  className="stg:grid stg:grid-cols-[2fr_1fr_1fr_1fr_1fr_auto] stg:items-center stg:gap-2 stg:px-3 stg:py-2 stg:text-xs"
233
234
  >
234
235
  <span role="cell" className="stg:min-w-0">
235
- <span className="stg:block stg:truncate stg:font-medium stg:text-foreground" title={baseline.modelId}>
236
+ {/* The display name needs no tooltip: the model id it used to
237
+ reveal is printed on the line below, which shows its own
238
+ tooltip when clipped. */}
239
+ <span className="stg:block stg:truncate stg:font-medium stg:text-foreground">
236
240
  {baseline.displayName || baseline.modelId}
237
241
  </span>
238
- <span className="stg:block stg:truncate stg:text-[11px] stg:text-muted-foreground">
239
- {baseline.modelId}
240
- {baseline.featured ? " · featured" : ""}
241
- </span>
242
+ <TruncatedText
243
+ text={`${baseline.modelId}${baseline.featured ? " · featured" : ""}`}
244
+ className="stg:block stg:text-[11px] stg:text-muted-foreground"
245
+ />
242
246
  </span>
243
247
  <span role="cell" className="stg:text-muted-foreground">
244
248
  {baseline.harness}
@@ -12,6 +12,7 @@ import { ModelGovernanceDetail } from "./ModelGovernanceDetail.js";
12
12
  import { OperatorAccessNotice } from "./OperatorAccessNotice.js";
13
13
  import { GovernanceBadge, PendingOverrideCard, RateCell } from "./governance-primitives.js";
14
14
  import { INPUT_CLASSES } from "../internal/form-primitives.js";
15
+ import { TruncatedText } from "../internal/truncated-text.js";
15
16
  import { ZERO } from "./pricing-format.js";
16
17
  import { useDecidePricingOverride } from "./useDecidePricingOverride.js";
17
18
  import { useRetireModelPricingBaseline } from "./useRetireModelPricingBaseline.js";
@@ -367,13 +368,16 @@ function ModelRow({
367
368
  )}
368
369
  >
369
370
  <span className="stg:min-w-0">
370
- <span className="stg:block stg:truncate stg:font-medium stg:text-foreground" title={baseline.modelId}>
371
+ {/* The display name needs no tooltip: the model id it used to
372
+ reveal is printed on the line below, which shows its own
373
+ tooltip when clipped. */}
374
+ <span className="stg:block stg:truncate stg:font-medium stg:text-foreground">
371
375
  {baseline.displayName || baseline.modelId}
372
376
  </span>
373
- <span className="stg:block stg:truncate stg:text-[11px] stg:text-muted-foreground">
374
- {baseline.modelId}
375
- {baseline.featured ? " · featured" : ""}
376
- </span>
377
+ <TruncatedText
378
+ text={`${baseline.modelId}${baseline.featured ? " · featured" : ""}`}
379
+ className="stg:block stg:text-[11px] stg:text-muted-foreground"
380
+ />
377
381
  </span>
378
382
  <span className="stg:text-muted-foreground">{baseline.harness}</span>
379
383
  <RateCell
@@ -5,6 +5,7 @@ import { getUserMessage, isPermissionDenied } from "@stigmer/sdk";
5
5
  import type {
6
6
  ModelPricingGovernanceEntry,
7
7
  } from "@stigmer/protos/ai/stigmer/billing/v1/io_pb";
8
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
8
9
  import { OperatorAccessNotice } from "./OperatorAccessNotice.js";
9
10
  import { GovernanceBadge, PendingOverrideCard, RateCell } from "./governance-primitives.js";
10
11
  import { usePricingGovernance } from "./usePricingGovernance.js";
@@ -140,10 +141,18 @@ function GovernanceRow({ entry }: { readonly entry: ModelPricingGovernanceEntry
140
141
  return (
141
142
  <div role="row"
142
143
  className="stg:grid stg:grid-cols-[2fr_1fr_1fr_1fr_1fr] stg:items-center stg:gap-2 stg:border-b stg:border-border stg:px-3 stg:py-2 stg:text-xs stg:last:border-b-0">
143
- <span role="cell" className="stg:truncate stg:font-medium stg:text-foreground"
144
- title={entry.modelId}>
145
- {entry.displayName || entry.modelId}
146
- </span>
144
+ <Tooltip>
145
+ <TooltipTrigger
146
+ render={
147
+ <span role="cell" className="stg:truncate stg:font-medium stg:text-foreground" />
148
+ }
149
+ >
150
+ {entry.displayName || entry.modelId}
151
+ </TooltipTrigger>
152
+ <TooltipContent side="top" className="stg:break-all">
153
+ {entry.modelId}
154
+ </TooltipContent>
155
+ </Tooltip>
147
156
  <span role="cell" className="stg:text-muted-foreground">{entry.harness}</span>
148
157
  <RateCell
149
158
  role="cell"
@@ -53,6 +53,7 @@ function sonnetBaseline(overrides: Record<string, unknown> = {}) {
53
53
  costTier: "standard",
54
54
  speedTier: "fast",
55
55
  featured: true,
56
+ wireIds: ["claude-sonnet-4-6-preview"],
56
57
  status: ModelPricingBaselineStatus.pricing_baseline_active,
57
58
  pricing: create(PricingBlockSchema, {
58
59
  inputPriceMicrosPerMillion: 3_000_000n,
@@ -169,6 +170,42 @@ describe("ModelCatalogPanel", () => {
169
170
  expect(submitted.baseline.pricingVariants.fast.wireIds).toEqual([
170
171
  "claude-sonnet-4-6-fast",
171
172
  ]);
173
+ // Base-level wire ids survive an unrelated edit — the form surfaces
174
+ // them precisely so a price edit can never silently erase them.
175
+ expect(submitted.baseline.wireIds).toEqual(["claude-sonnet-4-6-preview"]);
176
+ });
177
+
178
+ it("edits base-level wire ids and submits the parsed list", async () => {
179
+ const user = userEvent.setup();
180
+ const upsertModelPricingBaseline = vi.fn().mockResolvedValue(sonnetBaseline());
181
+ const client = createMockStigmer({
182
+ listModelPricingBaselines: vi
183
+ .fn()
184
+ .mockResolvedValue({ baselines: [sonnetBaseline()] }),
185
+ upsertModelPricingBaseline,
186
+ });
187
+
188
+ render(<ModelCatalogPanel />, { wrapper: wrapper(client) });
189
+ await user.click(await screen.findByRole("button", { name: "Edit" }));
190
+
191
+ // The base "Wire ids" field comes before the variant's in DOM order.
192
+ const wireIdsField = screen.getAllByLabelText("Wire ids (comma-separated)")[0];
193
+ await user.clear(wireIdsField);
194
+ await user.type(
195
+ wireIdsField,
196
+ "claude-sonnet-4-6-preview, accounts/fireworks/models/sonnet-4p6",
197
+ );
198
+ await user.click(screen.getByRole("button", { name: "Review changes" }));
199
+
200
+ // Alias-only edits move no rates — the confirm step says so.
201
+ expect(await screen.findByText(/No rate changes/)).toBeTruthy();
202
+ await user.click(screen.getByRole("button", { name: "Apply revision" }));
203
+ await waitFor(() => expect(upsertModelPricingBaseline).toHaveBeenCalledTimes(1));
204
+
205
+ expect(upsertModelPricingBaseline.mock.calls[0][0].baseline.wireIds).toEqual([
206
+ "claude-sonnet-4-6-preview",
207
+ "accounts/fireworks/models/sonnet-4p6",
208
+ ]);
172
209
  });
173
210
 
174
211
  it("rejects invalid rates client-side before any RPC", async () => {
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import { cn } from "@stigmer/theme";
4
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../../internal/tooltip.js";
4
5
  import type { StatusPhase } from "../types.js";
5
6
 
6
7
  /** Props for {@link StatusBadge}. */
@@ -69,9 +70,12 @@ export function StatusBadge({
69
70
  if (!tooltip) return badge;
70
71
 
71
72
  return (
72
- <span title={tooltip} className="stg:inline-flex">
73
- {badge}
74
- </span>
73
+ <Tooltip>
74
+ <TooltipTrigger render={<span className="stg:inline-flex" />}>
75
+ {badge}
76
+ </TooltipTrigger>
77
+ <TooltipContent side="top">{tooltip}</TooltipContent>
78
+ </Tooltip>
75
79
  );
76
80
  }
77
81
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { useCallback, useId } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
5
6
  import {
6
7
  cadenceToCron,
7
8
  describeCadence,
@@ -164,33 +165,43 @@ export function CadenceField({
164
165
  // schedule with zero days is not expressible in cron.
165
166
  const isLastSelected = isOn && value.days.length === 1;
166
167
  return (
167
- <button
168
- key={label}
169
- type="button"
170
- aria-pressed={isOn}
171
- aria-label={label}
172
- title={label}
173
- disabled={disabled || isLastSelected}
174
- onClick={() =>
175
- onChange({
176
- ...value,
177
- days: isOn
178
- ? value.days.filter((d) => d !== day)
179
- : [...value.days, day].sort((a, b) => a - b),
180
- })
181
- }
182
- className={cn(
183
- "stg:inline-flex stg:h-7 stg:w-9 stg:items-center stg:justify-center stg:rounded-md stg:border stg:text-xs stg:font-medium stg:transition-colors",
184
- "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring",
185
- "stg:disabled:pointer-events-none",
186
- isOn
187
- ? "stg:border-primary stg:bg-primary stg:text-primary-foreground"
188
- : "stg:border-input stg:bg-background stg:text-muted-foreground stg:hover:text-foreground",
189
- isLastSelected && "stg:opacity-70",
190
- )}
191
- >
192
- {label.slice(0, 3)}
193
- </button>
168
+ // The tooltip trigger is a wrapper span so the hint stays
169
+ // hoverable on the always-disabled last selected day — the
170
+ // one toggle whose state actually needs explaining.
171
+ <Tooltip key={label}>
172
+ <TooltipTrigger render={<span className="stg:inline-flex" />}>
173
+ <button
174
+ type="button"
175
+ aria-pressed={isOn}
176
+ aria-label={label}
177
+ disabled={disabled || isLastSelected}
178
+ onClick={() =>
179
+ onChange({
180
+ ...value,
181
+ days: isOn
182
+ ? value.days.filter((d) => d !== day)
183
+ : [...value.days, day].sort((a, b) => a - b),
184
+ })
185
+ }
186
+ className={cn(
187
+ "stg:inline-flex stg:h-7 stg:w-9 stg:items-center stg:justify-center stg:rounded-md stg:border stg:text-xs stg:font-medium stg:transition-colors",
188
+ "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring",
189
+ "stg:disabled:pointer-events-none",
190
+ isOn
191
+ ? "stg:border-primary stg:bg-primary stg:text-primary-foreground"
192
+ : "stg:border-input stg:bg-background stg:text-muted-foreground stg:hover:text-foreground",
193
+ isLastSelected && "stg:opacity-70",
194
+ )}
195
+ >
196
+ {label.slice(0, 3)}
197
+ </button>
198
+ </TooltipTrigger>
199
+ <TooltipContent side="top">
200
+ {isLastSelected
201
+ ? "A weekly schedule needs at least one day"
202
+ : label}
203
+ </TooltipContent>
204
+ </Tooltip>
194
205
  );
195
206
  })}
196
207
  </div>
@@ -11,6 +11,7 @@ import {
11
11
  import { formatRelativeTime } from "../activity/format-relative-time.js";
12
12
  import { ErrorMessage } from "../error/ErrorMessage.js";
13
13
  import { Pagination } from "../internal/Pagination.js";
14
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
14
15
  import { useScheduleRuns } from "./useScheduleRuns.js";
15
16
 
16
17
  /** Props for {@link ScheduleRunsTable}. */
@@ -188,12 +189,17 @@ function RunTableRow({
188
189
  <span role="cell" className="stg:hidden stg:text-xs stg:text-muted-foreground stg:sm:block">
189
190
  {runOriginLabel(run.origin)}
190
191
  </span>
191
- <span
192
- role="cell"
193
- className="stg:text-xs stg:text-muted-foreground"
194
- title={fireDate ? fireDate.toLocaleString() : undefined}
195
- >
196
- {fireDate ? formatRelativeTime(fireDate, now) : "—"}
192
+ <span role="cell" className="stg:text-xs stg:text-muted-foreground">
193
+ {fireDate ? (
194
+ <Tooltip>
195
+ <TooltipTrigger render={<time dateTime={fireDate.toISOString()} />}>
196
+ {formatRelativeTime(fireDate, now)}
197
+ </TooltipTrigger>
198
+ <TooltipContent side="top">{fireDate.toLocaleString()}</TooltipContent>
199
+ </Tooltip>
200
+ ) : (
201
+ "—"
202
+ )}
197
203
  </span>
198
204
  <span
199
205
  role="cell"
@@ -313,11 +319,17 @@ function CompactRunRow({
313
319
  {runOriginLabel(run.origin)}
314
320
  </span>
315
321
  <span className="stg:text-xs stg:text-muted-foreground-subtle">·</span>
316
- <span
317
- className="stg:text-xs stg:text-muted-foreground"
318
- title={fireDate ? fireDate.toLocaleString() : undefined}
319
- >
320
- {fireDate ? formatRelativeTime(fireDate, now) : "—"}
322
+ <span className="stg:text-xs stg:text-muted-foreground">
323
+ {fireDate ? (
324
+ <Tooltip>
325
+ <TooltipTrigger render={<time dateTime={fireDate.toISOString()} />}>
326
+ {formatRelativeTime(fireDate, now)}
327
+ </TooltipTrigger>
328
+ <TooltipContent side="top">{fireDate.toLocaleString()}</TooltipContent>
329
+ </Tooltip>
330
+ ) : (
331
+ "—"
332
+ )}
321
333
  </span>
322
334
  </div>
323
335
  {run.reason && (
@@ -0,0 +1,86 @@
1
+ // The disabled-control tooltip contract from the native-title sweep
2
+ // (stigmer-cloud#268), pinned in a real Chromium on CadenceField's
3
+ // weekday toggles — the sweep's canonical "explanation on a disabled
4
+ // control" site. Browsers suppress pointer events on disabled form
5
+ // controls, so the old native `title` was unreachable by EVERY input
6
+ // method exactly when it mattered (the always-disabled last selected
7
+ // day). The fix hangs the house tooltip off a wrapper span; this suite
8
+ // proves a mouse user really gets the reason while the button is
9
+ // disabled.
10
+
11
+ import "../../../dist/styles.css";
12
+
13
+ import { describe, it, expect, vi, afterEach } from "vitest";
14
+ import { render, cleanup } from "@testing-library/react";
15
+ import { userEvent } from "@vitest/browser/context";
16
+ import { CadenceField } from "../CadenceField.js";
17
+
18
+ function renderWeekly() {
19
+ const pane = document.createElement("div");
20
+ pane.className = "stgm";
21
+ pane.style.width = "480px";
22
+ document.body.appendChild(pane);
23
+ render(
24
+ <CadenceField
25
+ value={{ kind: "weekly", days: [1], hour: 9, minute: 0 }}
26
+ onChange={() => {}}
27
+ />,
28
+ { container: pane },
29
+ );
30
+ return pane;
31
+ }
32
+
33
+ afterEach(() => {
34
+ cleanup();
35
+ document.querySelectorAll(".stgm").forEach((node) => node.remove());
36
+ });
37
+
38
+ describe("CadenceField disabled-day tooltip", () => {
39
+ it("explains the locked last-selected day on hover while the button is disabled", async () => {
40
+ const pane = renderWeekly();
41
+ expect(pane.querySelector("[title]")).toBeNull();
42
+
43
+ const monday = Array.from(pane.querySelectorAll("button")).find(
44
+ (el) => el.getAttribute("aria-label") === "Monday",
45
+ );
46
+ expect(monday!.disabled).toBe(true);
47
+
48
+ // Hover the wrapper span — the disabled button itself receives no
49
+ // pointer events, which is the entire reason the wrapper exists.
50
+ const wrapper = monday!.parentElement!;
51
+ await userEvent.hover(wrapper);
52
+ await vi.waitFor(
53
+ () => {
54
+ const portaled = Array.from(document.body.children)
55
+ .filter((node) => node !== pane)
56
+ .map((node) => node.textContent ?? "")
57
+ .join(" ");
58
+ expect(portaled).toContain("A weekly schedule needs at least one day");
59
+ },
60
+ { timeout: 3000, interval: 50 },
61
+ );
62
+ await userEvent.unhover(wrapper);
63
+ });
64
+
65
+ it("names an enabled weekday on hover", async () => {
66
+ const pane = renderWeekly();
67
+
68
+ const tuesday = Array.from(pane.querySelectorAll("button")).find(
69
+ (el) => el.getAttribute("aria-label") === "Tuesday",
70
+ );
71
+ expect(tuesday!.disabled).toBe(false);
72
+
73
+ await userEvent.hover(tuesday!.parentElement!);
74
+ await vi.waitFor(
75
+ () => {
76
+ const portaled = Array.from(document.body.children)
77
+ .filter((node) => node !== pane)
78
+ .map((node) => node.textContent ?? "")
79
+ .join(" ");
80
+ expect(portaled).toContain("Tuesday");
81
+ },
82
+ { timeout: 3000, interval: 50 },
83
+ );
84
+ await userEvent.unhover(tuesday!.parentElement!);
85
+ });
86
+ });
@@ -153,17 +153,21 @@ export function PlanEditor({
153
153
  onClick={() => setView("edit")}
154
154
  label="Edit"
155
155
  disabled={!canEdit}
156
- title={
157
- !canEdit
158
- ? "This plan is too large to edit in place — download it instead."
159
- : undefined
160
- }
161
156
  />
162
157
  )}
163
158
  </div>
164
159
  <span className="stg:text-[0.65rem] stg:tabular-nums stg:text-muted-foreground-faint">
165
160
  {formatArtifactSize(plan.artifact.sizeBytes)}
166
161
  </span>
162
+ {/* The reason the Edit tab is disabled must be visible text: a
163
+ disabled tab leaves the tab order and drops pointer events, so
164
+ no hover- or focus-dependent hint can ever reach the user who
165
+ needs it. */}
166
+ {activeDraft !== undefined && !canEdit && (
167
+ <span className="stg:min-w-0 stg:text-[0.65rem] stg:text-muted-foreground">
168
+ This plan is too large to edit in place — download it instead.
169
+ </span>
170
+ )}
167
171
 
168
172
  <div className="stg:ml-auto stg:flex stg:min-w-0 stg:flex-wrap stg:items-center stg:gap-3">
169
173
  {activeDraft?.isEdited && (
@@ -312,13 +316,11 @@ function ViewTab({
312
316
  onClick,
313
317
  label,
314
318
  disabled,
315
- title,
316
319
  }: {
317
320
  readonly active: boolean;
318
321
  readonly onClick: () => void;
319
322
  readonly label: string;
320
323
  readonly disabled?: boolean;
321
- readonly title?: string;
322
324
  }) {
323
325
  return (
324
326
  <button
@@ -327,7 +329,6 @@ function ViewTab({
327
329
  aria-selected={active}
328
330
  onClick={onClick}
329
331
  disabled={disabled}
330
- title={title}
331
332
  className={cn(
332
333
  "stg:rounded stg:px-2 stg:py-0.5 stg:text-[0.65rem] stg:font-medium stg:transition-colors",
333
334
  "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring",
@@ -15,6 +15,8 @@ import { ActionMenu } from "../action-menu/index.js";
15
15
  import { Button } from "../button/Button.js";
16
16
  import { EmptyState } from "../empty-state/EmptyState.js";
17
17
  import { useCheckPermission } from "../iam-policy/useCheckPermission.js";
18
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
19
+ import { TruncatedText } from "../internal/truncated-text.js";
18
20
  import { ConfirmDialog } from "../resource-detail/ConfirmDialog.js";
19
21
  import { useConfirmAction } from "../resource-detail/useConfirmAction.js";
20
22
  import { useCopyResource } from "../resource-detail/useCopyResource.js";
@@ -311,35 +313,39 @@ function ShareRow({
311
313
  >
312
314
  <td className="stg:px-4 stg:py-2.5">
313
315
  <div className="stg:flex stg:min-w-0 stg:items-center stg:gap-2">
314
- <span
315
- className="stg:truncate stg:font-medium stg:text-foreground"
316
- title={meta?.name || slug || undefined}
317
- >
318
- {meta?.name || slug || "\u2014"}
319
- </span>
316
+ <TruncatedText
317
+ text={meta?.name || slug || "\u2014"}
318
+ className="stg:font-medium stg:text-foreground"
319
+ />
320
320
  {isCrossOrg && (
321
- <span
322
- className={cn(
323
- "stg:inline-flex stg:shrink-0 stg:items-center stg:rounded-md stg:px-1.5 stg:py-0.5",
324
- "stg:text-[0.6rem] stg:font-medium stg:uppercase stg:tracking-wide",
325
- "stg:bg-muted stg:text-muted-foreground stg:border stg:border-border",
326
- )}
327
- title={`This share lives in ${org}; the agent lives in ${agent.metadata?.org}`}
328
- >
329
- Cross-org
330
- </span>
321
+ <Tooltip>
322
+ <TooltipTrigger
323
+ render={
324
+ <span
325
+ className={cn(
326
+ "stg:inline-flex stg:shrink-0 stg:items-center stg:rounded-md stg:px-1.5 stg:py-0.5",
327
+ "stg:text-[0.6rem] stg:font-medium stg:uppercase stg:tracking-wide",
328
+ "stg:bg-muted stg:text-muted-foreground stg:border stg:border-border",
329
+ )}
330
+ />
331
+ }
332
+ >
333
+ Cross-org
334
+ </TooltipTrigger>
335
+ <TooltipContent side="top">
336
+ {`This share lives in ${org}; the agent lives in ${agent.metadata?.org}`}
337
+ </TooltipContent>
338
+ </Tooltip>
331
339
  )}
332
340
  </div>
333
341
  </td>
334
342
 
335
343
  <td className="stg:px-4 stg:py-2.5" onClick={(e) => e.stopPropagation()}>
336
344
  <div className="stg:flex stg:min-w-0 stg:items-center stg:gap-1.5">
337
- <code
338
- className="stg:truncate stg:font-mono stg:text-xs stg:text-muted-foreground"
339
- title={displayPath}
340
- >
341
- {displayPath}
342
- </code>
345
+ <TruncatedText
346
+ text={displayPath}
347
+ className="stg:font-mono stg:text-xs stg:text-muted-foreground"
348
+ />
343
349
  <button
344
350
  type="button"
345
351
  onClick={handleCopyLink}