@stigmer/react 3.12.2 → 3.12.4

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 (429) hide show
  1. package/access/ManageAccessDialog.d.ts.map +1 -1
  2. package/access/ManageAccessDialog.js +3 -19
  3. package/access/ManageAccessDialog.js.map +1 -1
  4. package/agent/steps/IdentityStep.d.ts.map +1 -1
  5. package/agent/steps/IdentityStep.js +2 -1
  6. package/agent/steps/IdentityStep.js.map +1 -1
  7. package/agent-instance/AgentInstanceDetailPanel.d.ts.map +1 -1
  8. package/agent-instance/AgentInstanceDetailPanel.js +2 -1
  9. package/agent-instance/AgentInstanceDetailPanel.js.map +1 -1
  10. package/agent-instance/CreateAgentInstanceDialog.d.ts.map +1 -1
  11. package/agent-instance/CreateAgentInstanceDialog.js +7 -20
  12. package/agent-instance/CreateAgentInstanceDialog.js.map +1 -1
  13. package/api-key/CreateApiKeyForm.d.ts.map +1 -1
  14. package/api-key/CreateApiKeyForm.js +2 -1
  15. package/api-key/CreateApiKeyForm.js.map +1 -1
  16. package/attachment/AttachmentImageLightbox.d.ts.map +1 -1
  17. package/attachment/AttachmentImageLightbox.js +8 -23
  18. package/attachment/AttachmentImageLightbox.js.map +1 -1
  19. package/channel/ChannelConversationsDialog.d.ts.map +1 -1
  20. package/channel/ChannelConversationsDialog.js +5 -20
  21. package/channel/ChannelConversationsDialog.js.map +1 -1
  22. package/channel/ChannelCredentialsDialog.d.ts.map +1 -1
  23. package/channel/ChannelCredentialsDialog.js +3 -19
  24. package/channel/ChannelCredentialsDialog.js.map +1 -1
  25. package/channel/ChannelTemplatesDialog.d.ts.map +1 -1
  26. package/channel/ChannelTemplatesDialog.js +6 -21
  27. package/channel/ChannelTemplatesDialog.js.map +1 -1
  28. package/channel/ConnectSlackDialog.d.ts.map +1 -1
  29. package/channel/ConnectSlackDialog.js +5 -22
  30. package/channel/ConnectSlackDialog.js.map +1 -1
  31. package/channel/ConnectWhatsAppDialog.d.ts.map +1 -1
  32. package/channel/ConnectWhatsAppDialog.js +3 -21
  33. package/channel/ConnectWhatsAppDialog.js.map +1 -1
  34. package/channel/connect/ServingAppSection.d.ts.map +1 -1
  35. package/channel/connect/ServingAppSection.js +2 -1
  36. package/channel/connect/ServingAppSection.js.map +1 -1
  37. package/channel-app/CreateChannelAppForm.d.ts.map +1 -1
  38. package/channel-app/CreateChannelAppForm.js +2 -1
  39. package/channel-app/CreateChannelAppForm.js.map +1 -1
  40. package/conversation/ConversationAttentionBanner.d.ts +23 -6
  41. package/conversation/ConversationAttentionBanner.d.ts.map +1 -1
  42. package/conversation/ConversationAttentionBanner.js +25 -10
  43. package/conversation/ConversationAttentionBanner.js.map +1 -1
  44. package/conversation/ConversationListPane.d.ts.map +1 -1
  45. package/conversation/ConversationListPane.js +26 -6
  46. package/conversation/ConversationListPane.js.map +1 -1
  47. package/conversation/ConversationTimelineView.d.ts.map +1 -1
  48. package/conversation/ConversationTimelineView.js +2 -1
  49. package/conversation/ConversationTimelineView.js.map +1 -1
  50. package/conversation/ConversationsWorkbench.d.ts.map +1 -1
  51. package/conversation/ConversationsWorkbench.js +1 -1
  52. package/conversation/ConversationsWorkbench.js.map +1 -1
  53. package/cursor-accounts/CursorAccountsConsole.d.ts.map +1 -1
  54. package/cursor-accounts/CursorAccountsConsole.js +2 -1
  55. package/cursor-accounts/CursorAccountsConsole.js.map +1 -1
  56. package/cursor-accounts/MemberKeysPanel.d.ts.map +1 -1
  57. package/cursor-accounts/MemberKeysPanel.js +2 -1
  58. package/cursor-accounts/MemberKeysPanel.js.map +1 -1
  59. package/dashboard/DashboardFailedRuns.d.ts.map +1 -1
  60. package/dashboard/DashboardFailedRuns.js +2 -1
  61. package/dashboard/DashboardFailedRuns.js.map +1 -1
  62. package/dependency-graph/DependencyGraph.d.ts.map +1 -1
  63. package/dependency-graph/DependencyGraph.js +2 -1
  64. package/dependency-graph/DependencyGraph.js.map +1 -1
  65. package/dependency-graph/DependencyTreeNode.d.ts.map +1 -1
  66. package/dependency-graph/DependencyTreeNode.js +2 -1
  67. package/dependency-graph/DependencyTreeNode.js.map +1 -1
  68. package/environment/EnvironmentPicker.d.ts.map +1 -1
  69. package/environment/EnvironmentPicker.js +2 -1
  70. package/environment/EnvironmentPicker.js.map +1 -1
  71. package/error/SecretFlowErrorGuide.d.ts.map +1 -1
  72. package/error/SecretFlowErrorGuide.js +2 -1
  73. package/error/SecretFlowErrorGuide.js.map +1 -1
  74. package/execution/ApprovalCard.d.ts.map +1 -1
  75. package/execution/ApprovalCard.js +13 -3
  76. package/execution/ApprovalCard.js.map +1 -1
  77. package/execution/ArtifactContentBody.d.ts.map +1 -1
  78. package/execution/ArtifactContentBody.js +2 -1
  79. package/execution/ArtifactContentBody.js.map +1 -1
  80. package/execution/ArtifactPreviewModal.d.ts.map +1 -1
  81. package/execution/ArtifactPreviewModal.js +11 -17
  82. package/execution/ArtifactPreviewModal.js.map +1 -1
  83. package/execution/ArtifactsWidget.d.ts.map +1 -1
  84. package/execution/ArtifactsWidget.js +2 -1
  85. package/execution/ArtifactsWidget.js.map +1 -1
  86. package/execution/FileChangeProgressBar.d.ts.map +1 -1
  87. package/execution/FileChangeProgressBar.js +2 -1
  88. package/execution/FileChangeProgressBar.js.map +1 -1
  89. package/execution/TodoList.d.ts.map +1 -1
  90. package/execution/TodoList.js +2 -1
  91. package/execution/TodoList.js.map +1 -1
  92. package/execution/ToolCallItem.d.ts +3 -1
  93. package/execution/ToolCallItem.d.ts.map +1 -1
  94. package/execution/ToolCallItem.js +19 -7
  95. package/execution/ToolCallItem.js.map +1 -1
  96. package/execution/WriteBacksWidget.d.ts.map +1 -1
  97. package/execution/WriteBacksWidget.js +2 -1
  98. package/execution/WriteBacksWidget.js.map +1 -1
  99. package/execution/index.d.ts +1 -1
  100. package/execution/index.d.ts.map +1 -1
  101. package/execution/index.js +1 -1
  102. package/execution/index.js.map +1 -1
  103. package/execution/tool-categories.d.ts +37 -3
  104. package/execution/tool-categories.d.ts.map +1 -1
  105. package/execution/tool-categories.js +74 -2
  106. package/execution/tool-categories.js.map +1 -1
  107. package/execution/tool-presenter.d.ts +15 -0
  108. package/execution/tool-presenter.d.ts.map +1 -1
  109. package/execution/tool-presenter.js +7 -2
  110. package/execution/tool-presenter.js.map +1 -1
  111. package/iam-policy/PeopleWithAccess.d.ts.map +1 -1
  112. package/iam-policy/PeopleWithAccess.js +2 -1
  113. package/iam-policy/PeopleWithAccess.js.map +1 -1
  114. package/iam-policy/PrincipalPicker.d.ts.map +1 -1
  115. package/iam-policy/PrincipalPicker.js +2 -1
  116. package/iam-policy/PrincipalPicker.js.map +1 -1
  117. package/iam-policy/RoleSelector.d.ts.map +1 -1
  118. package/iam-policy/RoleSelector.js +2 -1
  119. package/iam-policy/RoleSelector.js.map +1 -1
  120. package/identity-provider/CreateIdentityProviderForm.d.ts.map +1 -1
  121. package/identity-provider/CreateIdentityProviderForm.js +2 -1
  122. package/identity-provider/CreateIdentityProviderForm.js.map +1 -1
  123. package/identity-provider/IdentityProviderDetailPanel.d.ts.map +1 -1
  124. package/identity-provider/IdentityProviderDetailPanel.js +2 -1
  125. package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
  126. package/identity-provider/IdentityProviderWizard.d.ts.map +1 -1
  127. package/identity-provider/IdentityProviderWizard.js +2 -1
  128. package/identity-provider/IdentityProviderWizard.js.map +1 -1
  129. package/index.d.ts +4 -2
  130. package/index.d.ts.map +1 -1
  131. package/index.js +4 -1
  132. package/index.js.map +1 -1
  133. package/internal/DialogShell.d.ts +77 -0
  134. package/internal/DialogShell.d.ts.map +1 -0
  135. package/internal/DialogShell.js +77 -0
  136. package/internal/DialogShell.js.map +1 -0
  137. package/internal/element-resets.d.ts +17 -0
  138. package/internal/element-resets.d.ts.map +1 -0
  139. package/internal/element-resets.js +32 -0
  140. package/internal/element-resets.js.map +1 -0
  141. package/internal/file-tree/FileTreeNode.d.ts.map +1 -1
  142. package/internal/file-tree/FileTreeNode.js +2 -1
  143. package/internal/file-tree/FileTreeNode.js.map +1 -1
  144. package/internal/markdown-components.d.ts +7 -0
  145. package/internal/markdown-components.d.ts.map +1 -1
  146. package/internal/markdown-components.js +15 -5
  147. package/internal/markdown-components.js.map +1 -1
  148. package/invitation/InvitationManager.d.ts.map +1 -1
  149. package/invitation/InvitationManager.js +2 -1
  150. package/invitation/InvitationManager.js.map +1 -1
  151. package/manifest/ApplyManifestDialog.d.ts.map +1 -1
  152. package/manifest/ApplyManifestDialog.js +8 -17
  153. package/manifest/ApplyManifestDialog.js.map +1 -1
  154. package/manifest/EditResourceYamlDialog.d.ts.map +1 -1
  155. package/manifest/EditResourceYamlDialog.js +3 -19
  156. package/manifest/EditResourceYamlDialog.js.map +1 -1
  157. package/mcp-server/McpServerConnectDialog.d.ts.map +1 -1
  158. package/mcp-server/McpServerConnectDialog.js +8 -20
  159. package/mcp-server/McpServerConnectDialog.js.map +1 -1
  160. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  161. package/mcp-server/McpServerDetailView.js +4 -15
  162. package/mcp-server/McpServerDetailView.js.map +1 -1
  163. package/mcp-server/steps/IdentityTransportStep.d.ts.map +1 -1
  164. package/mcp-server/steps/IdentityTransportStep.js +2 -1
  165. package/mcp-server/steps/IdentityTransportStep.js.map +1 -1
  166. package/package.json +4 -4
  167. package/platform-client/CreatePlatformClientForm.d.ts.map +1 -1
  168. package/platform-client/CreatePlatformClientForm.js +2 -1
  169. package/platform-client/CreatePlatformClientForm.js.map +1 -1
  170. package/platform-client/PlatformClientDetailPanel.d.ts.map +1 -1
  171. package/platform-client/PlatformClientDetailPanel.js +2 -1
  172. package/platform-client/PlatformClientDetailPanel.js.map +1 -1
  173. package/pricing-governance/BaselineEditor.d.ts.map +1 -1
  174. package/pricing-governance/BaselineEditor.js +2 -1
  175. package/pricing-governance/BaselineEditor.js.map +1 -1
  176. package/pricing-governance/PricingGovernanceConsole.d.ts.map +1 -1
  177. package/pricing-governance/PricingGovernanceConsole.js +2 -1
  178. package/pricing-governance/PricingGovernanceConsole.js.map +1 -1
  179. package/provider-standing/ProviderStandingAccessNotice.d.ts +11 -0
  180. package/provider-standing/ProviderStandingAccessNotice.d.ts.map +1 -0
  181. package/provider-standing/ProviderStandingAccessNotice.js +14 -0
  182. package/provider-standing/ProviderStandingAccessNotice.js.map +1 -0
  183. package/provider-standing/ProviderStandingConsole.d.ts +24 -0
  184. package/provider-standing/ProviderStandingConsole.d.ts.map +1 -0
  185. package/provider-standing/ProviderStandingConsole.js +98 -0
  186. package/provider-standing/ProviderStandingConsole.js.map +1 -0
  187. package/provider-standing/index.d.ts +6 -0
  188. package/provider-standing/index.d.ts.map +1 -0
  189. package/provider-standing/index.js +6 -0
  190. package/provider-standing/index.js.map +1 -0
  191. package/provider-standing/useProviderStanding.d.ts +34 -0
  192. package/provider-standing/useProviderStanding.d.ts.map +1 -0
  193. package/provider-standing/useProviderStanding.js +26 -0
  194. package/provider-standing/useProviderStanding.js.map +1 -0
  195. package/provider.d.ts +12 -0
  196. package/provider.d.ts.map +1 -1
  197. package/provider.js +12 -0
  198. package/provider.js.map +1 -1
  199. package/resource-creation/StepIndicator.d.ts.map +1 -1
  200. package/resource-creation/StepIndicator.js +2 -1
  201. package/resource-creation/StepIndicator.js.map +1 -1
  202. package/resource-detail/ConfirmDialog.d.ts +2 -3
  203. package/resource-detail/ConfirmDialog.d.ts.map +1 -1
  204. package/resource-detail/ConfirmDialog.js +8 -20
  205. package/resource-detail/ConfirmDialog.js.map +1 -1
  206. package/schedule/ScheduleDetailView.d.ts.map +1 -1
  207. package/schedule/ScheduleDetailView.js +3 -2
  208. package/schedule/ScheduleDetailView.js.map +1 -1
  209. package/schedule/ScheduleRunsTable.d.ts.map +1 -1
  210. package/schedule/ScheduleRunsTable.js +2 -1
  211. package/schedule/ScheduleRunsTable.js.map +1 -1
  212. package/session/facets/ArtifactsTab.d.ts.map +1 -1
  213. package/session/facets/ArtifactsTab.js +2 -1
  214. package/session/facets/ArtifactsTab.js.map +1 -1
  215. package/session/facets/ChangesTab.d.ts.map +1 -1
  216. package/session/facets/ChangesTab.js +2 -1
  217. package/session/facets/ChangesTab.js.map +1 -1
  218. package/session/facets/UsageTab.d.ts +10 -3
  219. package/session/facets/UsageTab.d.ts.map +1 -1
  220. package/session/facets/UsageTab.js +42 -6
  221. package/session/facets/UsageTab.js.map +1 -1
  222. package/session/index.d.ts +1 -1
  223. package/session/index.d.ts.map +1 -1
  224. package/session/index.js.map +1 -1
  225. package/session/useSessionUsage.d.ts +25 -0
  226. package/session/useSessionUsage.d.ts.map +1 -1
  227. package/session/useSessionUsage.js +11 -0
  228. package/session/useSessionUsage.js.map +1 -1
  229. package/settings/settings-nav.d.ts.map +1 -1
  230. package/settings/settings-nav.js +7 -1
  231. package/settings/settings-nav.js.map +1 -1
  232. package/settings/useSettingsNavGroups.d.ts.map +1 -1
  233. package/settings/useSettingsNavGroups.js +4 -1
  234. package/settings/useSettingsNavGroups.js.map +1 -1
  235. package/sharing/ShareAgentDialog.d.ts.map +1 -1
  236. package/sharing/ShareAgentDialog.js +4 -21
  237. package/sharing/ShareAgentDialog.js.map +1 -1
  238. package/sidebar/WorkspaceSidebar.d.ts.map +1 -1
  239. package/sidebar/WorkspaceSidebar.js +2 -1
  240. package/sidebar/WorkspaceSidebar.js.map +1 -1
  241. package/skill/SkillDiffDialog.d.ts.map +1 -1
  242. package/skill/SkillDiffDialog.js +5 -21
  243. package/skill/SkillDiffDialog.js.map +1 -1
  244. package/skill/SkillFileBrowser.d.ts.map +1 -1
  245. package/skill/SkillFileBrowser.js +2 -1
  246. package/skill/SkillFileBrowser.js.map +1 -1
  247. package/skill/internal/fetchAndUnpackArtifact.d.ts +1 -1
  248. package/skill/internal/fetchAndUnpackArtifact.d.ts.map +1 -1
  249. package/skill/internal/fetchAndUnpackArtifact.js +47 -3
  250. package/skill/internal/fetchAndUnpackArtifact.js.map +1 -1
  251. package/skill/useSkillDiff.d.ts.map +1 -1
  252. package/skill/useSkillDiff.js +7 -1
  253. package/skill/useSkillDiff.js.map +1 -1
  254. package/skill/useSkillUpload.d.ts.map +1 -1
  255. package/skill/useSkillUpload.js +22 -4
  256. package/skill/useSkillUpload.js.map +1 -1
  257. package/src/__tests__/bare-host-resets.layout.test.tsx +184 -0
  258. package/src/access/ManageAccessDialog.tsx +7 -27
  259. package/src/agent/steps/IdentityStep.tsx +2 -1
  260. package/src/agent-instance/AgentInstanceDetailPanel.tsx +2 -1
  261. package/src/agent-instance/CreateAgentInstanceDialog.tsx +14 -27
  262. package/src/api-key/CreateApiKeyForm.tsx +2 -1
  263. package/src/attachment/AttachmentImageLightbox.tsx +13 -36
  264. package/src/channel/ChannelConversationsDialog.tsx +10 -28
  265. package/src/channel/ChannelCredentialsDialog.tsx +8 -28
  266. package/src/channel/ChannelTemplatesDialog.tsx +12 -30
  267. package/src/channel/ConnectSlackDialog.tsx +10 -31
  268. package/src/channel/ConnectWhatsAppDialog.tsx +8 -30
  269. package/src/channel/connect/ServingAppSection.tsx +2 -1
  270. package/src/channel-app/CreateChannelAppForm.tsx +2 -1
  271. package/src/conversation/ConversationAttentionBanner.tsx +64 -19
  272. package/src/conversation/ConversationListPane.tsx +39 -17
  273. package/src/conversation/ConversationTimelineView.tsx +2 -1
  274. package/src/conversation/ConversationsWorkbench.tsx +1 -0
  275. package/src/conversation/__tests__/ConversationAttentionBanner.test.tsx +76 -2
  276. package/src/conversation/__tests__/ConversationListPane.test.tsx +15 -4
  277. package/src/cursor-accounts/CursorAccountsConsole.tsx +2 -1
  278. package/src/cursor-accounts/MemberKeysPanel.tsx +2 -1
  279. package/src/dashboard/DashboardFailedRuns.tsx +2 -1
  280. package/src/dependency-graph/DependencyGraph.tsx +2 -1
  281. package/src/dependency-graph/DependencyTreeNode.tsx +2 -1
  282. package/src/environment/EnvironmentPicker.tsx +2 -1
  283. package/src/error/SecretFlowErrorGuide.tsx +3 -2
  284. package/src/execution/ApprovalCard.tsx +23 -2
  285. package/src/execution/ArtifactContentBody.tsx +2 -1
  286. package/src/execution/ArtifactPreviewModal.tsx +15 -27
  287. package/src/execution/ArtifactsWidget.tsx +2 -1
  288. package/src/execution/FileChangeProgressBar.tsx +2 -1
  289. package/src/execution/TodoList.tsx +2 -1
  290. package/src/execution/ToolCallItem.tsx +19 -8
  291. package/src/execution/WriteBacksWidget.tsx +2 -1
  292. package/src/execution/__tests__/intent-title.test.tsx +221 -0
  293. package/src/execution/index.ts +3 -0
  294. package/src/execution/tool-categories.ts +103 -5
  295. package/src/execution/tool-presenter.ts +22 -1
  296. package/src/iam-policy/PeopleWithAccess.tsx +2 -1
  297. package/src/iam-policy/PrincipalPicker.tsx +2 -0
  298. package/src/iam-policy/RoleSelector.tsx +2 -1
  299. package/src/identity-provider/CreateIdentityProviderForm.tsx +2 -1
  300. package/src/identity-provider/IdentityProviderDetailPanel.tsx +2 -1
  301. package/src/identity-provider/IdentityProviderWizard.tsx +2 -1
  302. package/src/index.ts +16 -0
  303. package/src/internal/DialogShell.tsx +169 -0
  304. package/src/internal/__tests__/DialogShell.test.tsx +223 -0
  305. package/src/internal/element-resets.ts +33 -0
  306. package/src/internal/file-tree/FileTreeNode.tsx +2 -1
  307. package/src/internal/markdown-components.tsx +15 -5
  308. package/src/invitation/InvitationManager.tsx +3 -2
  309. package/src/manifest/ApplyManifestDialog.tsx +10 -27
  310. package/src/manifest/EditResourceYamlDialog.tsx +4 -31
  311. package/src/mcp-server/McpServerConnectDialog.tsx +15 -29
  312. package/src/mcp-server/McpServerDetailView.tsx +12 -24
  313. package/src/mcp-server/steps/IdentityTransportStep.tsx +3 -2
  314. package/src/platform-client/CreatePlatformClientForm.tsx +4 -3
  315. package/src/platform-client/PlatformClientDetailPanel.tsx +4 -3
  316. package/src/pricing-governance/BaselineEditor.tsx +3 -2
  317. package/src/pricing-governance/PricingGovernanceConsole.tsx +2 -1
  318. package/src/provider-standing/ProviderStandingAccessNotice.tsx +36 -0
  319. package/src/provider-standing/ProviderStandingConsole.tsx +216 -0
  320. package/src/provider-standing/__tests__/ProviderStandingConsole.test.tsx +143 -0
  321. package/src/provider-standing/index.ts +8 -0
  322. package/src/provider-standing/useProviderStanding.ts +50 -0
  323. package/src/provider.tsx +12 -0
  324. package/src/resource-creation/StepIndicator.tsx +2 -1
  325. package/src/resource-detail/ConfirmDialog.tsx +9 -30
  326. package/src/schedule/ScheduleDetailView.tsx +3 -2
  327. package/src/schedule/ScheduleRunsTable.tsx +2 -1
  328. package/src/session/__tests__/UsageTab.test.tsx +136 -0
  329. package/src/session/__tests__/useSessionUsage.test.ts +19 -0
  330. package/src/session/facets/ArtifactsTab.tsx +2 -1
  331. package/src/session/facets/ChangesTab.tsx +2 -1
  332. package/src/session/facets/UsageTab.tsx +98 -6
  333. package/src/session/index.ts +1 -0
  334. package/src/session/useSessionUsage.ts +37 -0
  335. package/src/settings/__tests__/useSettingsNavGroups.test.tsx +11 -1
  336. package/src/settings/settings-nav.ts +7 -0
  337. package/src/settings/useSettingsNavGroups.ts +8 -1
  338. package/src/sharing/ShareAgentDialog.tsx +9 -30
  339. package/src/sidebar/WorkspaceSidebar.tsx +2 -1
  340. package/src/skill/SkillDiffDialog.tsx +13 -36
  341. package/src/skill/SkillFileBrowser.tsx +2 -1
  342. package/src/skill/__tests__/SkillFileBrowser.test.tsx +10 -2
  343. package/src/skill/__tests__/fetchAndUnpackArtifact.test.ts +90 -0
  344. package/src/skill/__tests__/useSkillUpload.test.ts +69 -0
  345. package/src/skill/internal/fetchAndUnpackArtifact.ts +54 -4
  346. package/src/skill/useSkillDiff.ts +7 -1
  347. package/src/skill/useSkillUpload.ts +25 -6
  348. package/src/workflow/FailedRunsWidget.tsx +2 -1
  349. package/src/workflow/PendingApprovalsWidget.tsx +2 -1
  350. package/src/workflow/ViewYamlDialog.tsx +18 -37
  351. package/src/workflow/WorkflowArchitectDialog.tsx +11 -43
  352. package/src/workflow/WorkflowExplainDialog.tsx +11 -37
  353. package/src/workflow/WorkflowGraphFullscreenDialog.tsx +14 -26
  354. package/src/workflow/WorkflowRunDialog.tsx +21 -48
  355. package/src/workflow/execution-comparison/ExecutionComparisonPicker.tsx +14 -31
  356. package/src/workflow/facets/WorkflowArtifactsTab.tsx +2 -1
  357. package/src/workflow/facets/WorkflowUsageTab.tsx +2 -1
  358. package/src/workflow/inspector/WorkflowSummaryPanel.tsx +2 -1
  359. package/src/workflow/inspector/tabs/BranchesTab.tsx +2 -1
  360. package/src/workflow/inspector/tabs/IterationTab.tsx +2 -1
  361. package/src/workflow/instance/CreateWorkflowInstanceDialog.tsx +14 -27
  362. package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +2 -1
  363. package/src/workflow/templates/WorkflowTemplatePreview.tsx +18 -28
  364. package/src/workspace/ExplorerTree.tsx +2 -1
  365. package/src/workspace/WorkspaceContentSearch.tsx +2 -1
  366. package/src/workspace/WorkspaceFileSearch.tsx +2 -1
  367. package/src/workspace/WorkspaceSummary.tsx +2 -1
  368. package/styles.css +1 -1
  369. package/workflow/FailedRunsWidget.d.ts.map +1 -1
  370. package/workflow/FailedRunsWidget.js +2 -1
  371. package/workflow/FailedRunsWidget.js.map +1 -1
  372. package/workflow/PendingApprovalsWidget.d.ts.map +1 -1
  373. package/workflow/PendingApprovalsWidget.js +2 -1
  374. package/workflow/PendingApprovalsWidget.js.map +1 -1
  375. package/workflow/ViewYamlDialog.d.ts.map +1 -1
  376. package/workflow/ViewYamlDialog.js +10 -29
  377. package/workflow/ViewYamlDialog.js.map +1 -1
  378. package/workflow/WorkflowArchitectDialog.d.ts.map +1 -1
  379. package/workflow/WorkflowArchitectDialog.js +5 -24
  380. package/workflow/WorkflowArchitectDialog.js.map +1 -1
  381. package/workflow/WorkflowExplainDialog.d.ts.map +1 -1
  382. package/workflow/WorkflowExplainDialog.js +5 -21
  383. package/workflow/WorkflowExplainDialog.js.map +1 -1
  384. package/workflow/WorkflowGraphFullscreenDialog.d.ts.map +1 -1
  385. package/workflow/WorkflowGraphFullscreenDialog.js +11 -17
  386. package/workflow/WorkflowGraphFullscreenDialog.js.map +1 -1
  387. package/workflow/WorkflowRunDialog.d.ts.map +1 -1
  388. package/workflow/WorkflowRunDialog.js +13 -29
  389. package/workflow/WorkflowRunDialog.js.map +1 -1
  390. package/workflow/execution-comparison/ExecutionComparisonPicker.d.ts.map +1 -1
  391. package/workflow/execution-comparison/ExecutionComparisonPicker.js +8 -26
  392. package/workflow/execution-comparison/ExecutionComparisonPicker.js.map +1 -1
  393. package/workflow/facets/WorkflowArtifactsTab.d.ts.map +1 -1
  394. package/workflow/facets/WorkflowArtifactsTab.js +2 -1
  395. package/workflow/facets/WorkflowArtifactsTab.js.map +1 -1
  396. package/workflow/facets/WorkflowUsageTab.d.ts.map +1 -1
  397. package/workflow/facets/WorkflowUsageTab.js +2 -1
  398. package/workflow/facets/WorkflowUsageTab.js.map +1 -1
  399. package/workflow/inspector/WorkflowSummaryPanel.d.ts.map +1 -1
  400. package/workflow/inspector/WorkflowSummaryPanel.js +2 -1
  401. package/workflow/inspector/WorkflowSummaryPanel.js.map +1 -1
  402. package/workflow/inspector/tabs/BranchesTab.d.ts.map +1 -1
  403. package/workflow/inspector/tabs/BranchesTab.js +2 -1
  404. package/workflow/inspector/tabs/BranchesTab.js.map +1 -1
  405. package/workflow/inspector/tabs/IterationTab.d.ts.map +1 -1
  406. package/workflow/inspector/tabs/IterationTab.js +2 -1
  407. package/workflow/inspector/tabs/IterationTab.js.map +1 -1
  408. package/workflow/instance/CreateWorkflowInstanceDialog.d.ts.map +1 -1
  409. package/workflow/instance/CreateWorkflowInstanceDialog.js +7 -20
  410. package/workflow/instance/CreateWorkflowInstanceDialog.js.map +1 -1
  411. package/workflow/instance/WorkflowInstanceDetailPanel.d.ts.map +1 -1
  412. package/workflow/instance/WorkflowInstanceDetailPanel.js +2 -1
  413. package/workflow/instance/WorkflowInstanceDetailPanel.js.map +1 -1
  414. package/workflow/templates/WorkflowTemplatePreview.d.ts +1 -1
  415. package/workflow/templates/WorkflowTemplatePreview.d.ts.map +1 -1
  416. package/workflow/templates/WorkflowTemplatePreview.js +10 -22
  417. package/workflow/templates/WorkflowTemplatePreview.js.map +1 -1
  418. package/workspace/ExplorerTree.d.ts.map +1 -1
  419. package/workspace/ExplorerTree.js +2 -1
  420. package/workspace/ExplorerTree.js.map +1 -1
  421. package/workspace/WorkspaceContentSearch.d.ts.map +1 -1
  422. package/workspace/WorkspaceContentSearch.js +2 -1
  423. package/workspace/WorkspaceContentSearch.js.map +1 -1
  424. package/workspace/WorkspaceFileSearch.d.ts.map +1 -1
  425. package/workspace/WorkspaceFileSearch.js +2 -1
  426. package/workspace/WorkspaceFileSearch.js.map +1 -1
  427. package/workspace/WorkspaceSummary.d.ts.map +1 -1
  428. package/workspace/WorkspaceSummary.js +2 -1
  429. package/workspace/WorkspaceSummary.js.map +1 -1
@@ -1,8 +1,9 @@
1
1
  "use client";
2
2
 
3
- import { lazy, Suspense, useCallback, useEffect, useRef } from "react";
3
+ import { lazy, Suspense, useCallback, useEffect } from "react";
4
4
  import type { Message } from "@bufbuild/protobuf";
5
5
  import { cn } from "@stigmer/theme";
6
+ import { DialogShell } from "../internal/DialogShell.js";
6
7
  import { getUserMessage, type AppliedManifest } from "@stigmer/sdk";
7
8
  import { toast } from "../feedback/toast.js";
8
9
  import { RedactedSecretsNotice } from "./RedactedSecretsNotice.js";
@@ -67,34 +68,14 @@ export function EditResourceYamlDialog({
67
68
  resource,
68
69
  onApplied,
69
70
  }: EditResourceYamlDialogProps) {
70
- const dialogRef = useRef<HTMLDialogElement>(null);
71
71
  const edit = useEditResourceYaml({ resource });
72
72
  const { reset } = edit;
73
73
 
74
- // Sync dialog open state with the native <dialog> element.
75
- useEffect(() => {
76
- const dialog = dialogRef.current;
77
- if (!dialog) return;
78
- if (open && !dialog.open) {
79
- dialog.showModal();
80
- } else if (!open && dialog.open) {
81
- dialog.close();
82
- }
83
- }, [open]);
84
-
85
74
  // Discard stale edits from a previous session when the dialog opens.
86
75
  useEffect(() => {
87
76
  if (open) reset();
88
77
  }, [open, reset]);
89
78
 
90
- const handleCancel = useCallback(
91
- (e: React.SyntheticEvent) => {
92
- e.preventDefault();
93
- onOpenChange(false);
94
- },
95
- [onOpenChange],
96
- );
97
-
98
79
  const handleApply = useCallback(async () => {
99
80
  try {
100
81
  const result = await edit.apply();
@@ -111,15 +92,7 @@ export function EditResourceYamlDialog({
111
92
  edit.validation.status === "valid" && edit.isDirty && !edit.isApplying;
112
93
 
113
94
  return (
114
- <dialog
115
- ref={dialogRef}
116
- onCancel={handleCancel}
117
- className={cn(
118
- "stg:fixed stg:inset-0 stg:z-50 stg:m-auto stg:w-full stg:max-w-3xl stg:rounded-lg stg:border stg:border-border stg:bg-popover stg:p-0 stg:text-popover-foreground stg:shadow-lg",
119
- "stg:backdrop:bg-backdrop",
120
- "stg:open:animate-in stg:open:fade-in-0 stg:open:zoom-in-95",
121
- )}
122
- >
95
+ <DialogShell open={open} onOpenChange={onOpenChange} width="3xl" aria-label="Edit YAML">
123
96
  <div className="stg:flex stg:flex-col stg:gap-4 stg:p-6">
124
97
  {/* Header */}
125
98
  <div className="stg:flex stg:flex-col stg:gap-1">
@@ -233,7 +206,7 @@ export function EditResourceYamlDialog({
233
206
  </div>
234
207
  </div>
235
208
  </div>
236
- </dialog>
209
+ </DialogShell>
237
210
  );
238
211
  }
239
212
 
@@ -1,7 +1,8 @@
1
1
  "use client";
2
2
 
3
- import { useCallback, useEffect, useRef, useState } from "react";
3
+ import { useCallback, useEffect, useState } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
+ import { DialogShell } from "../internal/DialogShell.js";
5
6
  import type { EnvVarInput } from "@stigmer/sdk";
6
7
  import { useMcpServer } from "./useMcpServer.js";
7
8
  import { useMcpServerCredentials } from "./useMcpServerCredentials.js";
@@ -88,29 +89,11 @@ export function McpServerConnectDialog({
88
89
  onOpenDetails,
89
90
  className,
90
91
  }: McpServerConnectDialogProps) {
91
- const dialogRef = useRef<HTMLDialogElement>(null);
92
92
  const resolvedOrg = activeOrg || org;
93
93
 
94
- useEffect(() => {
95
- const dialog = dialogRef.current;
96
- if (!dialog) return;
97
-
98
- if (open && !dialog.open) {
99
- dialog.showModal();
100
- } else if (!open && dialog.open) {
101
- dialog.close();
102
- }
103
- }, [open]);
104
-
105
- const handleDialogClose = useCallback(() => {
106
- onClose();
107
- }, [onClose]);
108
-
109
- const handleBackdropClick = useCallback(
110
- (e: React.MouseEvent<HTMLDialogElement>) => {
111
- if (e.target === dialogRef.current) {
112
- onClose();
113
- }
94
+ const handleOpenChange = useCallback(
95
+ (nextOpen: boolean) => {
96
+ if (!nextOpen) onClose();
114
97
  },
115
98
  [onClose],
116
99
  );
@@ -118,15 +101,18 @@ export function McpServerConnectDialog({
118
101
  if (!open) return null;
119
102
 
120
103
  return (
121
- <dialog
122
- ref={dialogRef}
123
- onClose={handleDialogClose}
124
- onClick={handleBackdropClick}
104
+ <DialogShell
105
+ open
106
+ onOpenChange={handleOpenChange}
107
+ width="md"
108
+ dismissOnBackdrop
109
+ // Card surface + visible overflow are deliberate: the connect form
110
+ // hosts popovers that extend past the dialog bounds.
125
111
  className={cn(
126
- "stg:m-auto stg:max-h-[85vh] stg:w-full stg:max-w-md stg:overflow-visible stg:rounded-lg stg:border stg:border-border stg:bg-card stg:p-0 stg:text-foreground stg:shadow-lg",
127
- "stg:backdrop:bg-backdrop",
112
+ "stg:max-h-[85vh] stg:overflow-visible stg:bg-card stg:text-foreground",
128
113
  className,
129
114
  )}
115
+ aria-label={`Connect ${slug}`}
130
116
  >
131
117
  <div
132
118
  className="stg:flex stg:max-h-[85vh] stg:flex-col stg:overflow-y-auto stg:p-6"
@@ -141,7 +127,7 @@ export function McpServerConnectDialog({
141
127
  onOpenDetails={onOpenDetails}
142
128
  />
143
129
  </div>
144
- </dialog>
130
+ </DialogShell>
145
131
  );
146
132
  }
147
133
 
@@ -36,6 +36,7 @@ import { OAuthAppForm } from "./OAuthAppForm.js";
36
36
  import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
37
37
  import { ErrorMessage } from "../error/ErrorMessage.js";
38
38
  import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
39
+ import { DialogShell } from "../internal/DialogShell.js";
39
40
  import { EnvVarForm } from "../environment/EnvVarForm.js";
40
41
  import type { EnvVarFormVariable } from "../environment/EnvVarForm.js";
41
42
  import { VisibilityBadge } from "../library/VisibilitySelector.js";
@@ -282,7 +283,6 @@ export function McpServerDetailView({
282
283
  const [showCredentialForm, setShowCredentialForm] = useState(defaultShowCredentialForm);
283
284
  const [showByoaForm, setShowByoaForm] = useState(false);
284
285
  const [capabilityTab, setCapabilityTab] = useState<CapabilityTab>(defaultCapabilityTab);
285
- const byoaDialogRef = useRef<HTMLDialogElement>(null);
286
286
 
287
287
  const onResourceLoadRef = useRef(onResourceLoad);
288
288
  onResourceLoadRef.current = onResourceLoad;
@@ -388,20 +388,9 @@ export function McpServerDetailView({
388
388
  }
389
389
  }, [mcpServer, disconnectOAuth, credentials, refetch, activeOrg, org]);
390
390
 
391
- // BYOA dialog lifecycle — native <dialog> toggle
392
- useEffect(() => {
393
- const dialog = byoaDialogRef.current;
394
- if (!dialog) return;
395
- if (showByoaForm && !dialog.open) {
396
- dialog.showModal();
397
- } else if (!showByoaForm && dialog.open) {
398
- dialog.close();
399
- }
400
- }, [showByoaForm]);
401
-
402
- const handleByoaDialogCancel = useCallback(
403
- (e: React.SyntheticEvent) => {
404
- e.preventDefault();
391
+ const handleByoaOpenChange = useCallback(
392
+ (nextOpen: boolean) => {
393
+ if (nextOpen) return;
405
394
  setShowByoaForm(false);
406
395
  orgOAuthApp.clearErrors();
407
396
  },
@@ -706,14 +695,13 @@ export function McpServerDetailView({
706
695
  )}
707
696
  </Section>
708
697
 
709
- {/* BYOA dialog — native <dialog> for zero-dependency modal behavior */}
710
- <dialog
711
- ref={byoaDialogRef}
712
- onCancel={handleByoaDialogCancel}
713
- className={cn(
714
- "stg:m-auto stg:w-full stg:max-w-md stg:rounded-lg stg:border stg:border-border stg:bg-background stg:p-6 stg:shadow-lg",
715
- "stg:backdrop:bg-backdrop",
716
- )}
698
+ {/* BYOA dialog */}
699
+ <DialogShell
700
+ open={showByoaForm}
701
+ onOpenChange={handleByoaOpenChange}
702
+ width="md"
703
+ className="stg:p-6"
704
+ aria-label="Use your own OAuth app"
717
705
  >
718
706
  <h3 className="stg:mb-4 stg:text-base stg:font-semibold stg:text-foreground">
719
707
  Use your own OAuth app
@@ -729,7 +717,7 @@ export function McpServerDetailView({
729
717
  isSubmitting={orgOAuthApp.isSetting}
730
718
  error={orgOAuthApp.setError}
731
719
  />
732
- </dialog>
720
+ </DialogShell>
733
721
 
734
722
  <Section title="Capabilities" scrollTarget="mcp-capabilities">
735
723
  <Tabs
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { useCallback, useId } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
+ import { UNSTYLED_FIELDSET } from "../../internal/element-resets.js";
5
6
  import { generateSlug } from "../../internal/slug.js";
6
7
  import type { McpServerWizardData, KeyValueEntry } from "./types.js";
7
8
 
@@ -179,7 +180,7 @@ export function IdentityTransportStep({
179
180
  />
180
181
  </div>
181
182
 
182
- <fieldset className="stg:space-y-1.5">
183
+ <fieldset className={cn(UNSTYLED_FIELDSET, "stg:space-y-1.5")}>
183
184
  <legend className="stg:text-sm stg:font-medium stg:text-foreground">
184
185
  Visibility
185
186
  </legend>
@@ -204,7 +205,7 @@ export function IdentityTransportStep({
204
205
 
205
206
  {/* data-scroll-target: guided tours/demos scroll the transport config
206
207
  (the step's decision point) into view within the wizard's scroll area. */}
207
- <fieldset className="stg:space-y-3" data-scroll-target="mcp-transport">
208
+ <fieldset className={cn(UNSTYLED_FIELDSET, "stg:space-y-3")} data-scroll-target="mcp-transport">
208
209
  <legend className="stg:text-sm stg:font-medium stg:text-foreground">
209
210
  Transport <span className="stg:text-destructive">*</span>
210
211
  </legend>
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { type FormEvent, type KeyboardEvent, useCallback, useId, useState } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
+ import { UNSTYLED_FIELDSET } from "../internal/element-resets.js";
5
6
  import { getUserMessage } from "@stigmer/sdk";
6
7
  import { IamRole } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
7
8
  import type { PlatformClientCreateResponse } from "@stigmer/protos/ai/stigmer/iam/platformclient/v1/io_pb";
@@ -167,7 +168,7 @@ export function CreatePlatformClientForm({
167
168
  />
168
169
 
169
170
  {/* Expiry */}
170
- <fieldset className="stg:space-y-2" disabled={isCreating}>
171
+ <fieldset className={cn(UNSTYLED_FIELDSET, "stg:space-y-2")} disabled={isCreating}>
171
172
  <legend className="stg:text-xs stg:font-medium stg:text-foreground">
172
173
  Expiry
173
174
  </legend>
@@ -202,7 +203,7 @@ export function CreatePlatformClientForm({
202
203
  </fieldset>
203
204
 
204
205
  {/* JIT provisioning */}
205
- <fieldset className="stg:space-y-2.5" disabled={isCreating}>
206
+ <fieldset className={cn(UNSTYLED_FIELDSET, "stg:space-y-2.5")} disabled={isCreating}>
206
207
  <hr className="stg:border-border-muted" />
207
208
  <legend className="stg:text-xs stg:font-medium stg:text-foreground">
208
209
  JIT provisioning
@@ -263,7 +264,7 @@ export function CreatePlatformClientForm({
263
264
  </fieldset>
264
265
 
265
266
  {/* Allowed origins */}
266
- <fieldset className="stg:space-y-2" disabled={isCreating}>
267
+ <fieldset className={cn(UNSTYLED_FIELDSET, "stg:space-y-2")} disabled={isCreating}>
267
268
  <hr className="stg:border-border-muted" />
268
269
  <legend className="stg:text-xs stg:font-medium stg:text-foreground">
269
270
  Allowed origins
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { type FormEvent, type KeyboardEvent, useCallback, useId, useState } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
+ import { UNSTYLED_FIELDSET } from "../internal/element-resets.js";
5
6
  import { getUserMessage } from "@stigmer/sdk";
6
7
  import { IamRole } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
7
8
  import { timestampDate, type Timestamp } from "@bufbuild/protobuf/wkt";
@@ -302,7 +303,7 @@ export function PlatformClientDetailPanel({
302
303
  </div>
303
304
 
304
305
  {/* Expiry */}
305
- <fieldset className="stg:space-y-2" disabled={isUpdating}>
306
+ <fieldset className={cn(UNSTYLED_FIELDSET, "stg:space-y-2")} disabled={isUpdating}>
306
307
  <legend className="stg:text-xs stg:font-medium stg:text-foreground">
307
308
  Expiry
308
309
  </legend>
@@ -337,7 +338,7 @@ export function PlatformClientDetailPanel({
337
338
  </fieldset>
338
339
 
339
340
  {/* JIT provisioning */}
340
- <fieldset className="stg:space-y-2.5" disabled={isUpdating}>
341
+ <fieldset className={cn(UNSTYLED_FIELDSET, "stg:space-y-2.5")} disabled={isUpdating}>
341
342
  <hr className="stg:border-border-muted" />
342
343
  <legend className="stg:text-xs stg:font-medium stg:text-foreground">
343
344
  JIT provisioning
@@ -393,7 +394,7 @@ export function PlatformClientDetailPanel({
393
394
  </fieldset>
394
395
 
395
396
  {/* Allowed origins */}
396
- <fieldset className="stg:space-y-2" disabled={isUpdating}>
397
+ <fieldset className={cn(UNSTYLED_FIELDSET, "stg:space-y-2")} disabled={isUpdating}>
397
398
  <hr className="stg:border-border-muted" />
398
399
  <legend className="stg:text-xs stg:font-medium stg:text-foreground">
399
400
  Allowed origins
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import { useCallback, useState, type FormEvent } from "react";
4
+ import { UNSTYLED_FIELDSET } from "../internal/element-resets.js";
4
5
  import { create } from "@bufbuild/protobuf";
5
6
  import { getUserMessage } from "@stigmer/sdk";
6
7
  import {
@@ -546,7 +547,7 @@ export function BaselineEditor({
546
547
  Featured (appears in the curated default picker list)
547
548
  </label>
548
549
 
549
- <fieldset className="stg:space-y-2">
550
+ <fieldset className={`${UNSTYLED_FIELDSET} stg:space-y-2`}>
550
551
  <legend className="stg:text-xs stg:font-medium stg:text-foreground">
551
552
  Rates ($ per million tokens)
552
553
  </legend>
@@ -565,7 +566,7 @@ export function BaselineEditor({
565
566
  </div>
566
567
  </fieldset>
567
568
 
568
- <fieldset className="stg:space-y-2">
569
+ <fieldset className={`${UNSTYLED_FIELDSET} stg:space-y-2`}>
569
570
  <legend className="stg:text-xs stg:font-medium stg:text-foreground">Pricing variants</legend>
570
571
  {form.variants.map((variant, index) => (
571
572
  <div key={index} className="stg:space-y-2 stg:rounded-md stg:border stg:border-border-muted stg:px-2.5 stg:py-2">
@@ -11,6 +11,7 @@ import { RetireConfirm } from "./RetireConfirm.js";
11
11
  import { ModelGovernanceDetail } from "./ModelGovernanceDetail.js";
12
12
  import { OperatorAccessNotice } from "./OperatorAccessNotice.js";
13
13
  import { GovernanceBadge, PendingOverrideCard, RateCell } from "./governance-primitives.js";
14
+ import { UNSTYLED_LIST } from "../internal/element-resets.js";
14
15
  import { INPUT_CLASSES } from "../internal/form-primitives.js";
15
16
  import { TruncatedText } from "../internal/truncated-text.js";
16
17
  import { ZERO } from "./pricing-format.js";
@@ -328,7 +329,7 @@ function ModelsTab({
328
329
  : "The catalog is empty — has the baseline seed migration run?"}
329
330
  </p>
330
331
  ) : (
331
- <ul role="list" aria-label="Models" className="stg:m-0 stg:list-none stg:p-0">
332
+ <ul role="list" aria-label="Models" className={UNSTYLED_LIST}>
332
333
  {view.models.map((row) => (
333
334
  <ModelRow key={row.key} row={row} onOpen={() => view.openDetail(row.key)} />
334
335
  ))}
@@ -0,0 +1,36 @@
1
+ "use client";
2
+
3
+ import { cn } from "@stigmer/theme";
4
+
5
+ /**
6
+ * The access-denied state for the provider-standing operator surface.
7
+ * Server-side authorization (`can_view_provider_standing` on
8
+ * `platform:stigmer`) is the real gate — this is the honest, designed
9
+ * face of that denial for anyone who navigates to the operator route
10
+ * without the permission, instead of a raw RPC error string.
11
+ */
12
+ export function ProviderStandingAccessNotice({
13
+ className,
14
+ }: {
15
+ readonly className?: string;
16
+ }) {
17
+ return (
18
+ <div
19
+ className={cn(
20
+ "stg:rounded-lg stg:border stg:border-border stg:bg-card stg:px-4 stg:py-6 stg:text-center",
21
+ className,
22
+ )}
23
+ role="status"
24
+ >
25
+ <p className="stg:text-xs stg:font-semibold stg:text-foreground">
26
+ Platform operator access required
27
+ </p>
28
+ <p className="stg:mx-auto stg:mt-1 stg:max-w-md stg:text-xs stg:text-muted-foreground">
29
+ Provider standing reports the health of the platform&apos;s own LLM
30
+ provider accounts, which is Stigmer-internal. It needs the platform
31
+ operator role — organization roles do not grant it. If you believe
32
+ you should have access, contact a platform operator.
33
+ </p>
34
+ </div>
35
+ );
36
+ }
@@ -0,0 +1,216 @@
1
+ "use client";
2
+
3
+ import { cn } from "@stigmer/theme";
4
+ import { getUserMessage, isPermissionDenied } from "@stigmer/sdk";
5
+ import type { Timestamp } from "@bufbuild/protobuf/wkt";
6
+ import type { ProviderStandingEntry } from "@stigmer/protos/ai/stigmer/platform/providerstanding/v1/io_pb";
7
+ import { Button } from "../button/index.js";
8
+ import { ProviderStandingAccessNotice } from "./ProviderStandingAccessNotice.js";
9
+ import { useProviderStanding } from "./useProviderStanding.js";
10
+
11
+ /** Props for {@link ProviderStandingConsole}. */
12
+ export interface ProviderStandingConsoleProps {
13
+ /** Additional CSS class names. */
14
+ readonly className?: string;
15
+ }
16
+
17
+ // BigInt literals (0n) require an ES2020 target, which not every consuming
18
+ // app's tsconfig guarantees — the constructor form is target-agnostic (the
19
+ // cursor-account-format precedent).
20
+ const ZERO = BigInt(0);
21
+
22
+ /**
23
+ * A probe verdict older than this is flagged stale — the probe-silence
24
+ * alert's UI twin: the probe runs hourly and the alert fires at 3h (the
25
+ * 60m interval plus generous grace), so the console goes amber on the
26
+ * same clock operators are paged on.
27
+ */
28
+ const STALE_AFTER_MS = 3 * 60 * 60 * 1000;
29
+
30
+ /**
31
+ * Display metadata for the probe's closed status vocabulary (the
32
+ * lowercase labels StandingStatus persists). An unknown future label
33
+ * degrades to a muted badge showing the raw label — the wire contract is
34
+ * a string precisely so consoles never fail to decode a new status.
35
+ */
36
+ const STATUS_DISPLAY: Record<string, { label: string; tone: "ok" | "warn" | "muted" }> = {
37
+ healthy: { label: "Healthy", tone: "ok" },
38
+ platform_billing: { label: "Billing rejected", tone: "warn" },
39
+ platform_auth: { label: "Auth rejected", tone: "warn" },
40
+ unclassified_error: { label: "Erroring", tone: "warn" },
41
+ unreachable: { label: "Unreachable", tone: "warn" },
42
+ not_configured: { label: "Not configured", tone: "muted" },
43
+ };
44
+
45
+ /**
46
+ * The platform-operator console page for provider standing: one card per
47
+ * platform LLM provider account with the latest canary-probe verdict —
48
+ * status, round-trip latency, upstream HTTP status, a bounded error
49
+ * summary, and when the probe last ran (flagged when stale).
50
+ *
51
+ * Read-only by design: the detection core (hourly probe, standing store,
52
+ * degraded/silence alerts) lives server-side; this surface only makes it
53
+ * visible where operators already look. Requires
54
+ * `can_view_provider_standing` on `platform:stigmer` — non-operators see
55
+ * the designed access notice.
56
+ *
57
+ * @example
58
+ * ```tsx
59
+ * <ProviderStandingConsole />
60
+ * ```
61
+ */
62
+ export function ProviderStandingConsole({ className }: ProviderStandingConsoleProps) {
63
+ const { standing, isLoading, isRefetching, error, refetch } = useProviderStanding();
64
+
65
+ if (isLoading) {
66
+ return (
67
+ <div className={cn("stg:space-y-2", className)} aria-busy="true">
68
+ <div className="stg:h-4 stg:w-40 stg:animate-pulse stg:rounded stg:bg-muted-subtle" />
69
+ {Array.from({ length: 2 }, (_, i) => (
70
+ <div key={i} className="stg:h-16 stg:animate-pulse stg:rounded-lg stg:bg-muted-subtle" />
71
+ ))}
72
+ </div>
73
+ );
74
+ }
75
+
76
+ if (error) {
77
+ // A non-operator landing here is expected (the route is reachable by
78
+ // URL) — show the designed access notice, not a raw RPC error.
79
+ if (isPermissionDenied(error)) {
80
+ return <ProviderStandingAccessNotice className={className} />;
81
+ }
82
+ return (
83
+ <p className={cn("stg:text-destructive stg:text-xs", className)} role="alert">
84
+ {getUserMessage(error)}
85
+ </p>
86
+ );
87
+ }
88
+
89
+ const providers = standing?.providers ?? [];
90
+
91
+ return (
92
+ <div className={cn("stg:space-y-3", className)}>
93
+ <div className="stg:flex stg:items-center stg:justify-between">
94
+ <p className="stg:text-xs stg:text-muted-foreground">
95
+ Latest canary verdict per platform provider account, probed hourly.
96
+ </p>
97
+ <Button
98
+ variant="outline"
99
+ size="sm"
100
+ onClick={refetch}
101
+ disabled={isRefetching}
102
+ >
103
+ {isRefetching ? "Refreshing…" : "Refresh"}
104
+ </Button>
105
+ </div>
106
+
107
+ {providers.length === 0 ? (
108
+ <p className="stg:rounded-lg stg:border stg:border-border stg:bg-card stg:px-4 stg:py-6 stg:text-center stg:text-xs stg:text-muted-foreground">
109
+ No probe verdicts recorded yet — the standing probe has not
110
+ completed a pass since this deployment came up.
111
+ </p>
112
+ ) : (
113
+ <ul className="stg:m-0 stg:grid stg:list-none stg:gap-2 stg:p-0 sm:stg:grid-cols-2">
114
+ {providers.map((entry) => (
115
+ <StandingCard key={entry.provider} entry={entry} />
116
+ ))}
117
+ </ul>
118
+ )}
119
+ </div>
120
+ );
121
+ }
122
+
123
+ function StandingCard({ entry }: { readonly entry: ProviderStandingEntry }) {
124
+ const display = STATUS_DISPLAY[entry.status] ?? {
125
+ label: entry.status || "unknown",
126
+ tone: "muted" as const,
127
+ };
128
+ const stale = isStale(entry.checkedAt);
129
+
130
+ return (
131
+ <li className="stg:rounded-lg stg:border stg:border-border stg:bg-card stg:p-3">
132
+ <div className="stg:flex stg:items-center stg:justify-between stg:gap-2">
133
+ <span className="stg:text-sm stg:font-semibold stg:capitalize stg:text-foreground">
134
+ {entry.provider}
135
+ </span>
136
+ <StatusBadge tone={display.tone} label={display.label} />
137
+ </div>
138
+
139
+ <dl className="stg:mt-2 stg:flex stg:flex-wrap stg:gap-x-4 stg:gap-y-1 stg:text-xs stg:text-muted-foreground">
140
+ {entry.latencyMs > ZERO && (
141
+ <div className="stg:flex stg:gap-1">
142
+ <dt>Latency</dt>
143
+ <dd className="stg:m-0 stg:text-foreground">{`${entry.latencyMs}ms`}</dd>
144
+ </div>
145
+ )}
146
+ {entry.httpStatus > 0 && (
147
+ <div className="stg:flex stg:gap-1">
148
+ <dt>HTTP</dt>
149
+ <dd className="stg:m-0 stg:text-foreground">{entry.httpStatus}</dd>
150
+ </div>
151
+ )}
152
+ <div className="stg:flex stg:gap-1">
153
+ <dt>Probed</dt>
154
+ <dd
155
+ className={cn(
156
+ "stg:m-0",
157
+ stale ? "stg:font-medium stg:text-destructive" : "stg:text-foreground",
158
+ )}
159
+ >
160
+ {formatProbeTime(entry.checkedAt)}
161
+ {stale ? " — stale" : ""}
162
+ </dd>
163
+ </div>
164
+ </dl>
165
+
166
+ {entry.errorSummary && (
167
+ <p className="stg:mt-2 stg:break-words stg:rounded stg:bg-muted-subtle stg:px-2 stg:py-1 stg:text-[11px] stg:text-muted-foreground">
168
+ {entry.errorSummary}
169
+ </p>
170
+ )}
171
+ </li>
172
+ );
173
+ }
174
+
175
+ /**
176
+ * Small tonal status badge — the cursor-accounts StateBadge shape, local
177
+ * to this module (the two operator surfaces evolve independently).
178
+ */
179
+ function StatusBadge({
180
+ tone,
181
+ label,
182
+ }: {
183
+ readonly tone: "ok" | "warn" | "muted";
184
+ readonly label: string;
185
+ }) {
186
+ return (
187
+ <span
188
+ className={cn(
189
+ "stg:inline-block stg:rounded stg:px-1.5 stg:py-0.5 stg:text-[10px] stg:font-medium",
190
+ tone === "ok" && "stg:bg-accent stg:text-primary",
191
+ tone === "warn" && "stg:bg-muted-subtle stg:text-destructive",
192
+ tone === "muted" && "stg:bg-muted-subtle stg:text-muted-foreground",
193
+ )}
194
+ >
195
+ {label}
196
+ </span>
197
+ );
198
+ }
199
+
200
+ function isStale(ts: Timestamp | undefined): boolean {
201
+ if (!ts || ts.seconds === ZERO) return true;
202
+ return Date.now() - Number(ts.seconds) * 1000 > STALE_AFTER_MS;
203
+ }
204
+
205
+ /** Proto Timestamp to a compact local date-time (e.g. "Jul 22, 14:05"). */
206
+ function formatProbeTime(ts: Timestamp | undefined): string {
207
+ if (!ts || ts.seconds === ZERO) {
208
+ return "never";
209
+ }
210
+ return new Date(Number(ts.seconds) * 1000).toLocaleString(undefined, {
211
+ month: "short",
212
+ day: "numeric",
213
+ hour: "2-digit",
214
+ minute: "2-digit",
215
+ });
216
+ }