@stigmer/react 3.12.3 → 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 (314) hide show
  1. package/agent/steps/IdentityStep.d.ts.map +1 -1
  2. package/agent/steps/IdentityStep.js +2 -1
  3. package/agent/steps/IdentityStep.js.map +1 -1
  4. package/agent-instance/AgentInstanceDetailPanel.d.ts.map +1 -1
  5. package/agent-instance/AgentInstanceDetailPanel.js +2 -1
  6. package/agent-instance/AgentInstanceDetailPanel.js.map +1 -1
  7. package/api-key/CreateApiKeyForm.d.ts.map +1 -1
  8. package/api-key/CreateApiKeyForm.js +2 -1
  9. package/api-key/CreateApiKeyForm.js.map +1 -1
  10. package/channel/ChannelConversationsDialog.d.ts.map +1 -1
  11. package/channel/ChannelConversationsDialog.js +2 -1
  12. package/channel/ChannelConversationsDialog.js.map +1 -1
  13. package/channel/ChannelTemplatesDialog.d.ts.map +1 -1
  14. package/channel/ChannelTemplatesDialog.js +2 -1
  15. package/channel/ChannelTemplatesDialog.js.map +1 -1
  16. package/channel/ConnectSlackDialog.d.ts.map +1 -1
  17. package/channel/ConnectSlackDialog.js +2 -1
  18. package/channel/ConnectSlackDialog.js.map +1 -1
  19. package/channel/connect/ServingAppSection.d.ts.map +1 -1
  20. package/channel/connect/ServingAppSection.js +2 -1
  21. package/channel/connect/ServingAppSection.js.map +1 -1
  22. package/channel-app/CreateChannelAppForm.d.ts.map +1 -1
  23. package/channel-app/CreateChannelAppForm.js +2 -1
  24. package/channel-app/CreateChannelAppForm.js.map +1 -1
  25. package/conversation/ConversationListPane.d.ts.map +1 -1
  26. package/conversation/ConversationListPane.js +2 -1
  27. package/conversation/ConversationListPane.js.map +1 -1
  28. package/conversation/ConversationTimelineView.d.ts.map +1 -1
  29. package/conversation/ConversationTimelineView.js +2 -1
  30. package/conversation/ConversationTimelineView.js.map +1 -1
  31. package/cursor-accounts/CursorAccountsConsole.d.ts.map +1 -1
  32. package/cursor-accounts/CursorAccountsConsole.js +2 -1
  33. package/cursor-accounts/CursorAccountsConsole.js.map +1 -1
  34. package/cursor-accounts/MemberKeysPanel.d.ts.map +1 -1
  35. package/cursor-accounts/MemberKeysPanel.js +2 -1
  36. package/cursor-accounts/MemberKeysPanel.js.map +1 -1
  37. package/dashboard/DashboardFailedRuns.d.ts.map +1 -1
  38. package/dashboard/DashboardFailedRuns.js +2 -1
  39. package/dashboard/DashboardFailedRuns.js.map +1 -1
  40. package/dependency-graph/DependencyGraph.d.ts.map +1 -1
  41. package/dependency-graph/DependencyGraph.js +2 -1
  42. package/dependency-graph/DependencyGraph.js.map +1 -1
  43. package/dependency-graph/DependencyTreeNode.d.ts.map +1 -1
  44. package/dependency-graph/DependencyTreeNode.js +2 -1
  45. package/dependency-graph/DependencyTreeNode.js.map +1 -1
  46. package/environment/EnvironmentPicker.d.ts.map +1 -1
  47. package/environment/EnvironmentPicker.js +2 -1
  48. package/environment/EnvironmentPicker.js.map +1 -1
  49. package/error/SecretFlowErrorGuide.d.ts.map +1 -1
  50. package/error/SecretFlowErrorGuide.js +2 -1
  51. package/error/SecretFlowErrorGuide.js.map +1 -1
  52. package/execution/ArtifactContentBody.d.ts.map +1 -1
  53. package/execution/ArtifactContentBody.js +2 -1
  54. package/execution/ArtifactContentBody.js.map +1 -1
  55. package/execution/ArtifactsWidget.d.ts.map +1 -1
  56. package/execution/ArtifactsWidget.js +2 -1
  57. package/execution/ArtifactsWidget.js.map +1 -1
  58. package/execution/FileChangeProgressBar.d.ts.map +1 -1
  59. package/execution/FileChangeProgressBar.js +2 -1
  60. package/execution/FileChangeProgressBar.js.map +1 -1
  61. package/execution/TodoList.d.ts.map +1 -1
  62. package/execution/TodoList.js +2 -1
  63. package/execution/TodoList.js.map +1 -1
  64. package/execution/WriteBacksWidget.d.ts.map +1 -1
  65. package/execution/WriteBacksWidget.js +2 -1
  66. package/execution/WriteBacksWidget.js.map +1 -1
  67. package/execution/tool-categories.d.ts +5 -22
  68. package/execution/tool-categories.d.ts.map +1 -1
  69. package/execution/tool-categories.js +8 -38
  70. package/execution/tool-categories.js.map +1 -1
  71. package/iam-policy/PeopleWithAccess.d.ts.map +1 -1
  72. package/iam-policy/PeopleWithAccess.js +2 -1
  73. package/iam-policy/PeopleWithAccess.js.map +1 -1
  74. package/iam-policy/PrincipalPicker.d.ts.map +1 -1
  75. package/iam-policy/PrincipalPicker.js +2 -1
  76. package/iam-policy/PrincipalPicker.js.map +1 -1
  77. package/iam-policy/RoleSelector.d.ts.map +1 -1
  78. package/iam-policy/RoleSelector.js +2 -1
  79. package/iam-policy/RoleSelector.js.map +1 -1
  80. package/identity-provider/CreateIdentityProviderForm.d.ts.map +1 -1
  81. package/identity-provider/CreateIdentityProviderForm.js +2 -1
  82. package/identity-provider/CreateIdentityProviderForm.js.map +1 -1
  83. package/identity-provider/IdentityProviderDetailPanel.d.ts.map +1 -1
  84. package/identity-provider/IdentityProviderDetailPanel.js +2 -1
  85. package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
  86. package/identity-provider/IdentityProviderWizard.d.ts.map +1 -1
  87. package/identity-provider/IdentityProviderWizard.js +2 -1
  88. package/identity-provider/IdentityProviderWizard.js.map +1 -1
  89. package/index.d.ts +3 -1
  90. package/index.d.ts.map +1 -1
  91. package/index.js +3 -0
  92. package/index.js.map +1 -1
  93. package/internal/element-resets.d.ts +17 -0
  94. package/internal/element-resets.d.ts.map +1 -0
  95. package/internal/element-resets.js +32 -0
  96. package/internal/element-resets.js.map +1 -0
  97. package/internal/file-tree/FileTreeNode.d.ts.map +1 -1
  98. package/internal/file-tree/FileTreeNode.js +2 -1
  99. package/internal/file-tree/FileTreeNode.js.map +1 -1
  100. package/internal/markdown-components.d.ts +7 -0
  101. package/internal/markdown-components.d.ts.map +1 -1
  102. package/internal/markdown-components.js +15 -5
  103. package/internal/markdown-components.js.map +1 -1
  104. package/invitation/InvitationManager.d.ts.map +1 -1
  105. package/invitation/InvitationManager.js +2 -1
  106. package/invitation/InvitationManager.js.map +1 -1
  107. package/manifest/ApplyManifestDialog.d.ts.map +1 -1
  108. package/manifest/ApplyManifestDialog.js +2 -1
  109. package/manifest/ApplyManifestDialog.js.map +1 -1
  110. package/mcp-server/steps/IdentityTransportStep.d.ts.map +1 -1
  111. package/mcp-server/steps/IdentityTransportStep.js +2 -1
  112. package/mcp-server/steps/IdentityTransportStep.js.map +1 -1
  113. package/package.json +4 -4
  114. package/platform-client/CreatePlatformClientForm.d.ts.map +1 -1
  115. package/platform-client/CreatePlatformClientForm.js +2 -1
  116. package/platform-client/CreatePlatformClientForm.js.map +1 -1
  117. package/platform-client/PlatformClientDetailPanel.d.ts.map +1 -1
  118. package/platform-client/PlatformClientDetailPanel.js +2 -1
  119. package/platform-client/PlatformClientDetailPanel.js.map +1 -1
  120. package/pricing-governance/BaselineEditor.d.ts.map +1 -1
  121. package/pricing-governance/BaselineEditor.js +2 -1
  122. package/pricing-governance/BaselineEditor.js.map +1 -1
  123. package/pricing-governance/PricingGovernanceConsole.d.ts.map +1 -1
  124. package/pricing-governance/PricingGovernanceConsole.js +2 -1
  125. package/pricing-governance/PricingGovernanceConsole.js.map +1 -1
  126. package/provider-standing/ProviderStandingAccessNotice.d.ts +11 -0
  127. package/provider-standing/ProviderStandingAccessNotice.d.ts.map +1 -0
  128. package/provider-standing/ProviderStandingAccessNotice.js +14 -0
  129. package/provider-standing/ProviderStandingAccessNotice.js.map +1 -0
  130. package/provider-standing/ProviderStandingConsole.d.ts +24 -0
  131. package/provider-standing/ProviderStandingConsole.d.ts.map +1 -0
  132. package/provider-standing/ProviderStandingConsole.js +98 -0
  133. package/provider-standing/ProviderStandingConsole.js.map +1 -0
  134. package/provider-standing/index.d.ts +6 -0
  135. package/provider-standing/index.d.ts.map +1 -0
  136. package/provider-standing/index.js +6 -0
  137. package/provider-standing/index.js.map +1 -0
  138. package/provider-standing/useProviderStanding.d.ts +34 -0
  139. package/provider-standing/useProviderStanding.d.ts.map +1 -0
  140. package/provider-standing/useProviderStanding.js +26 -0
  141. package/provider-standing/useProviderStanding.js.map +1 -0
  142. package/provider.d.ts +12 -0
  143. package/provider.d.ts.map +1 -1
  144. package/provider.js +12 -0
  145. package/provider.js.map +1 -1
  146. package/resource-creation/StepIndicator.d.ts.map +1 -1
  147. package/resource-creation/StepIndicator.js +2 -1
  148. package/resource-creation/StepIndicator.js.map +1 -1
  149. package/schedule/ScheduleDetailView.d.ts.map +1 -1
  150. package/schedule/ScheduleDetailView.js +3 -2
  151. package/schedule/ScheduleDetailView.js.map +1 -1
  152. package/schedule/ScheduleRunsTable.d.ts.map +1 -1
  153. package/schedule/ScheduleRunsTable.js +2 -1
  154. package/schedule/ScheduleRunsTable.js.map +1 -1
  155. package/session/facets/ArtifactsTab.d.ts.map +1 -1
  156. package/session/facets/ArtifactsTab.js +2 -1
  157. package/session/facets/ArtifactsTab.js.map +1 -1
  158. package/session/facets/ChangesTab.d.ts.map +1 -1
  159. package/session/facets/ChangesTab.js +2 -1
  160. package/session/facets/ChangesTab.js.map +1 -1
  161. package/session/facets/UsageTab.d.ts +10 -3
  162. package/session/facets/UsageTab.d.ts.map +1 -1
  163. package/session/facets/UsageTab.js +42 -6
  164. package/session/facets/UsageTab.js.map +1 -1
  165. package/session/index.d.ts +1 -1
  166. package/session/index.d.ts.map +1 -1
  167. package/session/index.js.map +1 -1
  168. package/session/useSessionUsage.d.ts +25 -0
  169. package/session/useSessionUsage.d.ts.map +1 -1
  170. package/session/useSessionUsage.js +11 -0
  171. package/session/useSessionUsage.js.map +1 -1
  172. package/settings/settings-nav.d.ts.map +1 -1
  173. package/settings/settings-nav.js +7 -1
  174. package/settings/settings-nav.js.map +1 -1
  175. package/settings/useSettingsNavGroups.d.ts.map +1 -1
  176. package/settings/useSettingsNavGroups.js +4 -1
  177. package/settings/useSettingsNavGroups.js.map +1 -1
  178. package/sharing/ShareAgentDialog.d.ts.map +1 -1
  179. package/sharing/ShareAgentDialog.js +2 -1
  180. package/sharing/ShareAgentDialog.js.map +1 -1
  181. package/sidebar/WorkspaceSidebar.d.ts.map +1 -1
  182. package/sidebar/WorkspaceSidebar.js +2 -1
  183. package/sidebar/WorkspaceSidebar.js.map +1 -1
  184. package/skill/SkillFileBrowser.d.ts.map +1 -1
  185. package/skill/SkillFileBrowser.js +2 -1
  186. package/skill/SkillFileBrowser.js.map +1 -1
  187. package/skill/internal/fetchAndUnpackArtifact.d.ts +1 -1
  188. package/skill/internal/fetchAndUnpackArtifact.d.ts.map +1 -1
  189. package/skill/internal/fetchAndUnpackArtifact.js +47 -3
  190. package/skill/internal/fetchAndUnpackArtifact.js.map +1 -1
  191. package/skill/useSkillDiff.d.ts.map +1 -1
  192. package/skill/useSkillDiff.js +7 -1
  193. package/skill/useSkillDiff.js.map +1 -1
  194. package/skill/useSkillUpload.d.ts.map +1 -1
  195. package/skill/useSkillUpload.js +22 -4
  196. package/skill/useSkillUpload.js.map +1 -1
  197. package/src/__tests__/bare-host-resets.layout.test.tsx +184 -0
  198. package/src/agent/steps/IdentityStep.tsx +2 -1
  199. package/src/agent-instance/AgentInstanceDetailPanel.tsx +2 -1
  200. package/src/api-key/CreateApiKeyForm.tsx +2 -1
  201. package/src/channel/ChannelConversationsDialog.tsx +2 -1
  202. package/src/channel/ChannelTemplatesDialog.tsx +2 -1
  203. package/src/channel/ConnectSlackDialog.tsx +2 -1
  204. package/src/channel/connect/ServingAppSection.tsx +2 -1
  205. package/src/channel-app/CreateChannelAppForm.tsx +2 -1
  206. package/src/conversation/ConversationListPane.tsx +2 -5
  207. package/src/conversation/ConversationTimelineView.tsx +2 -1
  208. package/src/cursor-accounts/CursorAccountsConsole.tsx +2 -1
  209. package/src/cursor-accounts/MemberKeysPanel.tsx +2 -1
  210. package/src/dashboard/DashboardFailedRuns.tsx +2 -1
  211. package/src/dependency-graph/DependencyGraph.tsx +2 -1
  212. package/src/dependency-graph/DependencyTreeNode.tsx +2 -1
  213. package/src/environment/EnvironmentPicker.tsx +2 -1
  214. package/src/error/SecretFlowErrorGuide.tsx +3 -2
  215. package/src/execution/ArtifactContentBody.tsx +2 -1
  216. package/src/execution/ArtifactsWidget.tsx +2 -1
  217. package/src/execution/FileChangeProgressBar.tsx +2 -1
  218. package/src/execution/TodoList.tsx +2 -1
  219. package/src/execution/WriteBacksWidget.tsx +2 -1
  220. package/src/execution/tool-categories.ts +17 -41
  221. package/src/iam-policy/PeopleWithAccess.tsx +2 -1
  222. package/src/iam-policy/PrincipalPicker.tsx +2 -0
  223. package/src/iam-policy/RoleSelector.tsx +2 -1
  224. package/src/identity-provider/CreateIdentityProviderForm.tsx +2 -1
  225. package/src/identity-provider/IdentityProviderDetailPanel.tsx +2 -1
  226. package/src/identity-provider/IdentityProviderWizard.tsx +2 -1
  227. package/src/index.ts +13 -0
  228. package/src/internal/element-resets.ts +33 -0
  229. package/src/internal/file-tree/FileTreeNode.tsx +2 -1
  230. package/src/internal/markdown-components.tsx +15 -5
  231. package/src/invitation/InvitationManager.tsx +3 -2
  232. package/src/manifest/ApplyManifestDialog.tsx +2 -1
  233. package/src/mcp-server/steps/IdentityTransportStep.tsx +3 -2
  234. package/src/platform-client/CreatePlatformClientForm.tsx +4 -3
  235. package/src/platform-client/PlatformClientDetailPanel.tsx +4 -3
  236. package/src/pricing-governance/BaselineEditor.tsx +3 -2
  237. package/src/pricing-governance/PricingGovernanceConsole.tsx +2 -1
  238. package/src/provider-standing/ProviderStandingAccessNotice.tsx +36 -0
  239. package/src/provider-standing/ProviderStandingConsole.tsx +216 -0
  240. package/src/provider-standing/__tests__/ProviderStandingConsole.test.tsx +143 -0
  241. package/src/provider-standing/index.ts +8 -0
  242. package/src/provider-standing/useProviderStanding.ts +50 -0
  243. package/src/provider.tsx +12 -0
  244. package/src/resource-creation/StepIndicator.tsx +2 -1
  245. package/src/schedule/ScheduleDetailView.tsx +3 -2
  246. package/src/schedule/ScheduleRunsTable.tsx +2 -1
  247. package/src/session/__tests__/UsageTab.test.tsx +136 -0
  248. package/src/session/__tests__/useSessionUsage.test.ts +19 -0
  249. package/src/session/facets/ArtifactsTab.tsx +2 -1
  250. package/src/session/facets/ChangesTab.tsx +2 -1
  251. package/src/session/facets/UsageTab.tsx +98 -6
  252. package/src/session/index.ts +1 -0
  253. package/src/session/useSessionUsage.ts +37 -0
  254. package/src/settings/__tests__/useSettingsNavGroups.test.tsx +11 -1
  255. package/src/settings/settings-nav.ts +7 -0
  256. package/src/settings/useSettingsNavGroups.ts +8 -1
  257. package/src/sharing/ShareAgentDialog.tsx +2 -1
  258. package/src/sidebar/WorkspaceSidebar.tsx +2 -1
  259. package/src/skill/SkillFileBrowser.tsx +2 -1
  260. package/src/skill/__tests__/SkillFileBrowser.test.tsx +10 -2
  261. package/src/skill/__tests__/fetchAndUnpackArtifact.test.ts +90 -0
  262. package/src/skill/__tests__/useSkillUpload.test.ts +69 -0
  263. package/src/skill/internal/fetchAndUnpackArtifact.ts +54 -4
  264. package/src/skill/useSkillDiff.ts +7 -1
  265. package/src/skill/useSkillUpload.ts +25 -6
  266. package/src/workflow/FailedRunsWidget.tsx +2 -1
  267. package/src/workflow/PendingApprovalsWidget.tsx +2 -1
  268. package/src/workflow/facets/WorkflowArtifactsTab.tsx +2 -1
  269. package/src/workflow/facets/WorkflowUsageTab.tsx +2 -1
  270. package/src/workflow/inspector/WorkflowSummaryPanel.tsx +2 -1
  271. package/src/workflow/inspector/tabs/BranchesTab.tsx +2 -1
  272. package/src/workflow/inspector/tabs/IterationTab.tsx +2 -1
  273. package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +2 -1
  274. package/src/workspace/ExplorerTree.tsx +2 -1
  275. package/src/workspace/WorkspaceContentSearch.tsx +2 -1
  276. package/src/workspace/WorkspaceFileSearch.tsx +2 -1
  277. package/src/workspace/WorkspaceSummary.tsx +2 -1
  278. package/styles.css +1 -1
  279. package/workflow/FailedRunsWidget.d.ts.map +1 -1
  280. package/workflow/FailedRunsWidget.js +2 -1
  281. package/workflow/FailedRunsWidget.js.map +1 -1
  282. package/workflow/PendingApprovalsWidget.d.ts.map +1 -1
  283. package/workflow/PendingApprovalsWidget.js +2 -1
  284. package/workflow/PendingApprovalsWidget.js.map +1 -1
  285. package/workflow/facets/WorkflowArtifactsTab.d.ts.map +1 -1
  286. package/workflow/facets/WorkflowArtifactsTab.js +2 -1
  287. package/workflow/facets/WorkflowArtifactsTab.js.map +1 -1
  288. package/workflow/facets/WorkflowUsageTab.d.ts.map +1 -1
  289. package/workflow/facets/WorkflowUsageTab.js +2 -1
  290. package/workflow/facets/WorkflowUsageTab.js.map +1 -1
  291. package/workflow/inspector/WorkflowSummaryPanel.d.ts.map +1 -1
  292. package/workflow/inspector/WorkflowSummaryPanel.js +2 -1
  293. package/workflow/inspector/WorkflowSummaryPanel.js.map +1 -1
  294. package/workflow/inspector/tabs/BranchesTab.d.ts.map +1 -1
  295. package/workflow/inspector/tabs/BranchesTab.js +2 -1
  296. package/workflow/inspector/tabs/BranchesTab.js.map +1 -1
  297. package/workflow/inspector/tabs/IterationTab.d.ts.map +1 -1
  298. package/workflow/inspector/tabs/IterationTab.js +2 -1
  299. package/workflow/inspector/tabs/IterationTab.js.map +1 -1
  300. package/workflow/instance/WorkflowInstanceDetailPanel.d.ts.map +1 -1
  301. package/workflow/instance/WorkflowInstanceDetailPanel.js +2 -1
  302. package/workflow/instance/WorkflowInstanceDetailPanel.js.map +1 -1
  303. package/workspace/ExplorerTree.d.ts.map +1 -1
  304. package/workspace/ExplorerTree.js +2 -1
  305. package/workspace/ExplorerTree.js.map +1 -1
  306. package/workspace/WorkspaceContentSearch.d.ts.map +1 -1
  307. package/workspace/WorkspaceContentSearch.js +2 -1
  308. package/workspace/WorkspaceContentSearch.js.map +1 -1
  309. package/workspace/WorkspaceFileSearch.d.ts.map +1 -1
  310. package/workspace/WorkspaceFileSearch.js +2 -1
  311. package/workspace/WorkspaceFileSearch.js.map +1 -1
  312. package/workspace/WorkspaceSummary.d.ts.map +1 -1
  313. package/workspace/WorkspaceSummary.js +2 -1
  314. package/workspace/WorkspaceSummary.js.map +1 -1
@@ -3,6 +3,7 @@
3
3
  import { memo, useState } from "react";
4
4
  import type { FileChangeProgress } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/filereview_pb";
5
5
  import { cn } from "@stigmer/theme";
6
+ import { UNSTYLED_LIST } from "../internal/element-resets.js";
6
7
  import { FileKindBadge, FileLineStats } from "./FileReviewAtoms.js";
7
8
  import { FilePathLink } from "./FilePathLink.js";
8
9
 
@@ -91,7 +92,7 @@ export const FileChangeProgressBar = memo(function FileChangeProgressBar({
91
92
  <FileLineStats linesAdded={linesAdded} linesRemoved={linesRemoved} />
92
93
  </div>
93
94
  {expanded && (
94
- <ul className="stg:mt-2 stg:max-h-[30vh] stg:space-y-1 stg:overflow-y-auto">
95
+ <ul className={cn(UNSTYLED_LIST, "stg:mt-2 stg:max-h-[30vh] stg:space-y-1 stg:overflow-y-auto")}>
95
96
  {entries.map((entry) => {
96
97
  const path = entry.pathAfter || entry.pathBefore;
97
98
  return (
@@ -4,6 +4,7 @@ import { useMemo, type ComponentType } from "react";
4
4
  import type { TodoItem } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/todo_pb";
5
5
  import { TodoStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
6
6
  import { cn } from "@stigmer/theme";
7
+ import { UNSTYLED_LIST } from "../internal/element-resets.js";
7
8
 
8
9
  /** Props for {@link TodoList}. */
9
10
  export interface TodoListProps {
@@ -69,7 +70,7 @@ export function TodoList({
69
70
  return (
70
71
  <ul
71
72
  role="list"
72
- className={cn("stg:flex stg:flex-col stg:gap-1", className)}
73
+ className={cn(UNSTYLED_LIST, "stg:flex stg:flex-col stg:gap-1", className)}
73
74
  aria-label="Tasks"
74
75
  >
75
76
  {sortedTodos.map((item) => (
@@ -2,6 +2,7 @@
2
2
 
3
3
  import type { AgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
4
4
  import { cn } from "@stigmer/theme";
5
+ import { UNSTYLED_LIST } from "../internal/element-resets.js";
5
6
  import { useSessionWriteBacks } from "../session/useSessionWriteBacks.js";
6
7
  import { WriteBackCard } from "./WriteBackCard.js";
7
8
 
@@ -71,7 +72,7 @@ export function WriteBacksWidget({
71
72
  </span>
72
73
  </div>
73
74
 
74
- <ul role="list" className="stg:flex stg:flex-col stg:gap-3">
75
+ <ul role="list" className={cn(UNSTYLED_LIST, "stg:flex stg:flex-col stg:gap-3")}>
75
76
  {writeBacks.map((entry) => (
76
77
  <li key={entry.writeBack.workspaceEntryName}>
77
78
  <WriteBackCard writeBack={entry.writeBack} />
@@ -1,16 +1,22 @@
1
1
  import type { ToolCall } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
2
2
  import { ToolCallStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
3
3
  import type { JsonObject } from "@bufbuild/protobuf";
4
- import { ToolKind, resolveToolKind, resolveToolKindByName } from "@stigmer/sdk";
4
+ import {
5
+ ToolKind,
6
+ resolveToolKind,
7
+ resolveToolKindByName,
8
+ shellIntentFromArgs,
9
+ } from "@stigmer/sdk";
5
10
 
6
11
  /**
7
12
  * Discriminated tool categories for type-aware rendering.
8
13
  *
9
14
  * This is the presentation taxonomy. Classification (name -> kind) lives in
10
15
  * `@stigmer/sdk`'s `resolveToolKind` (single source of truth, shared with the
11
- * runner and Go CLI); this file maps each {@link ToolKind} to its presentation
12
- * metadata (label, primary argument). `"mcp"` covers tools originating from an
13
- * MCP server, whose names are dynamic.
16
+ * runner, @stigmer/ink, and the CLI's headless renderers); this file maps each
17
+ * {@link ToolKind} to its presentation metadata (label, primary argument).
18
+ * `"mcp"` covers tools originating from an MCP server, whose names are
19
+ * dynamic.
14
20
  */
15
21
  export type ToolCategory =
16
22
  | "shell"
@@ -497,42 +503,12 @@ export function extractIntentFromPreview(
497
503
  }
498
504
  }
499
505
 
500
- /**
501
- * The tool-call argument that carries a model-authored intent phrase for
502
- * SHELL tools (stigmer#276) a short human description of what the command
503
- * does and why, rendered as the row title with the command as secondary text.
504
- *
505
- * Two writers populate it, converged on one wire key by design: the native
506
- * harness's tool-intent middleware (`backend/services/runner/src/middleware/
507
- * tool-intent.ts`, `INTENT_ARG`) extends the shell tool's bind-time schema
508
- * with it, and the Cursor harness's built-in Shell tool carries it natively.
509
- * The shared, machine-checked contract is
510
- * `test/fixtures/tool-view/intent-title.json` — keep all three in lockstep.
511
- */
512
- export const SHELL_INTENT_ARG_FIELD = "description";
513
-
514
- /**
515
- * The intent-title extraction core: SHELL-kind-scoped on purpose, because
516
- * `description` means other things on other tools (a task tool's description
517
- * is the sub-agent subject, never a row title). Blank and non-string values
518
- * degrade to null — the caller falls back to the category label.
519
- */
520
- function extractIntentFromArgs(kind: ToolKind, args: JsonObject | undefined): string | null {
521
- if (kind !== ToolKind.SHELL || !args) return null;
522
- const value = args[SHELL_INTENT_ARG_FIELD];
523
- if (typeof value !== "string") return null;
524
- const trimmed = value.trim();
525
- return trimmed.length > 0 ? trimmed : null;
526
- }
527
-
528
- /**
529
- * Extracts the model-authored intent phrase from a SHELL tool call, or null
530
- * when absent (legacy executions, models that skipped the optional arg, and
531
- * every non-shell kind). See {@link SHELL_INTENT_ARG_FIELD}.
532
- */
533
- export function extractShellIntent(toolCall: ToolCall): string | null {
534
- return extractIntentFromArgs(resolveToolKind(toolCall), toolCall.args);
535
- }
506
+ // Intent-title extraction lives in @stigmer/sdk's tool-view module — the
507
+ // cross-surface single source of truth the intent-title.json fixture pins —
508
+ // so React, Ink, and the CLI's headless renderers share one implementation.
509
+ // Re-exported here because this module is where React's public tool-view API
510
+ // surfaced them first (#677).
511
+ export { SHELL_INTENT_ARG_FIELD, extractShellIntent } from "@stigmer/sdk";
536
512
 
537
513
  /**
538
514
  * Preview-string twin of {@link extractShellIntent} for surfaces that carry a
@@ -556,7 +532,7 @@ export function extractShellIntentFromPreview(
556
532
  try {
557
533
  const parsed = JSON.parse(argsPreview);
558
534
  if (typeof parsed !== "object" || parsed === null) return null;
559
- return extractIntentFromArgs(kind, parsed as JsonObject);
535
+ return shellIntentFromArgs(kind, parsed as JsonObject);
560
536
  } catch {
561
537
  return null;
562
538
  }
@@ -4,6 +4,7 @@ import { useCallback, useState } from "react";
4
4
  import type { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
5
5
  import type { PrincipalAccess } from "@stigmer/protos/ai/stigmer/iam/iampolicy/v1/io_pb";
6
6
  import { cn } from "@stigmer/theme";
7
+ import { UNSTYLED_LIST } from "../internal/element-resets.js";
7
8
  import { getUserMessage } from "@stigmer/sdk";
8
9
  import { useShareFlow, type ShareFlowResource } from "./useShareFlow.js";
9
10
  import { GrantAccessForm } from "./GrantAccessForm.js";
@@ -83,7 +84,7 @@ export function PeopleWithAccess({
83
84
  )}
84
85
 
85
86
  {!isLoading && accessList.length > 0 && (
86
- <ul className="stg:space-y-1 stg:mt-2" aria-label="People with access">
87
+ <ul className={cn(UNSTYLED_LIST, "stg:space-y-1 stg:mt-2")} aria-label="People with access">
87
88
  {accessList.map((entry) => (
88
89
  <AccessEntry
89
90
  key={entry.principal?.id ?? "unknown"}
@@ -3,6 +3,7 @@
3
3
  import { useCallback, useId, useMemo, useRef, useState } from "react";
4
4
  import type { ApiResourceRefView } from "@stigmer/protos/ai/stigmer/iam/iampolicy/v1/io_pb";
5
5
  import { cn } from "@stigmer/theme";
6
+ import { UNSTYLED_LIST } from "../internal/element-resets.js";
6
7
  import { getUserMessage } from "@stigmer/sdk";
7
8
  import { useResourceAccess } from "./useResourceAccess.js";
8
9
  import { ProviderBadge, providerLabel } from "./ProviderBadge.js";
@@ -238,6 +239,7 @@ export function PrincipalPicker({
238
239
  role="listbox"
239
240
  aria-label="Organization members"
240
241
  className={cn(
242
+ UNSTYLED_LIST,
241
243
  "stg:absolute stg:z-10 stg:mt-1 stg:max-h-56 stg:w-full stg:overflow-auto stg:rounded-md stg:border stg:border-border stg:bg-popover stg:py-1 stg:shadow-md",
242
244
  )}
243
245
  >
@@ -4,6 +4,7 @@ import { useId } from "react";
4
4
  import type { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
5
5
  import type { IamRole } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
6
6
  import { cn } from "@stigmer/theme";
7
+ import { UNSTYLED_FIELDSET } from "../internal/element-resets.js";
7
8
  import { useRoleSelector } from "./useRoleSelector.js";
8
9
 
9
10
  /** Props for {@link RoleSelector}. */
@@ -73,7 +74,7 @@ export function RoleSelector({
73
74
  }
74
75
 
75
76
  return (
76
- <fieldset className={cn("stg:space-y-1.5", className)}>
77
+ <fieldset className={cn(UNSTYLED_FIELDSET, "stg:space-y-1.5", className)}>
77
78
  <legend className="stg:text-xs stg:font-medium stg:text-foreground">Role</legend>
78
79
  <div className="stg:flex stg:flex-wrap stg:gap-2">
79
80
  {options.map((opt) => {
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { type FormEvent, 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 type { IdentityProvider } from "@stigmer/protos/ai/stigmer/iam/identityprovider/v1/api_pb";
7
8
  import { IamRole } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
@@ -388,7 +389,7 @@ function JitSection({
388
389
  }
389
390
 
390
391
  return (
391
- <fieldset className="stg:space-y-2.5" disabled={disabled}>
392
+ <fieldset className={cn(UNSTYLED_FIELDSET, "stg:space-y-2.5")} disabled={disabled}>
392
393
  <hr className="stg:border-border-muted" />
393
394
  <legend className="stg:text-xs stg:font-medium stg:text-foreground">
394
395
  JIT provisioning
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { type FormEvent, useCallback, useId, useRef, 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 type { IdentityProvider } from "@stigmer/protos/ai/stigmer/iam/identityprovider/v1/api_pb";
7
8
  import { IamRole } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
@@ -674,7 +675,7 @@ function JitEditSection({
674
675
  }
675
676
 
676
677
  return (
677
- <fieldset className="stg:space-y-2.5" disabled={disabled}>
678
+ <fieldset className={cn(UNSTYLED_FIELDSET, "stg:space-y-2.5")} disabled={disabled}>
678
679
  <hr className="stg:border-border-muted" />
679
680
  <legend className="stg:text-xs stg:font-medium stg:text-foreground">
680
681
  JIT provisioning
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { type FormEvent, 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 type { IdentityProvider } from "@stigmer/protos/ai/stigmer/iam/identityprovider/v1/api_pb";
7
8
  import { IamRole } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
@@ -838,7 +839,7 @@ function JitProvisioningSection({
838
839
  }
839
840
 
840
841
  return (
841
- <fieldset className="stg:space-y-2.5" disabled={disabled}>
842
+ <fieldset className={cn(UNSTYLED_FIELDSET, "stg:space-y-2.5")} disabled={disabled}>
842
843
  <hr className="stg:border-border-muted" />
843
844
  <legend className="stg:text-xs stg:font-medium stg:text-foreground">
844
845
  JIT provisioning
package/src/index.ts CHANGED
@@ -196,6 +196,7 @@ export type {
196
196
  UseSessionFileChangesReturn,
197
197
  ModelCostEntry,
198
198
  UseSessionUsageReturn,
199
+ ExecutionUsageEntry,
199
200
  UseAgentRefFromSessionReturn,
200
201
  UseNewSessionFlowOptions,
201
202
  UseNewSessionFlowReturn,
@@ -1042,6 +1043,18 @@ export type {
1042
1043
  CursorAccountEditorProps,
1043
1044
  } from "./cursor-accounts/index.js";
1044
1045
 
1046
+ // Provider standing — read-only platform-operator view of the platform's
1047
+ // LLM provider account health (canary-probe verdicts, cloud#447)
1048
+ export {
1049
+ useProviderStanding,
1050
+ ProviderStandingConsole,
1051
+ ProviderStandingAccessNotice,
1052
+ } from "./provider-standing/index.js";
1053
+ export type {
1054
+ UseProviderStandingReturn,
1055
+ ProviderStandingConsoleProps,
1056
+ } from "./provider-standing/index.js";
1057
+
1045
1058
  // Settings — navigation structure + section components shared across app shells
1046
1059
  export {
1047
1060
  SETTINGS_NAV_GROUPS,
@@ -0,0 +1,33 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Per-element UA-default resets for preflight-less hosts (#695).
3
+ // Internal — never exported from the package barrel.
4
+ //
5
+ // Why these are per-component classes and NOT stylesheet rules: the #374
6
+ // scoped form-control preflight in `styles.css` could reset every button
7
+ // under `.stgm` because UA control chrome is never wanted. Lists are
8
+ // different — "UI list" vs "content list" is a semantic distinction CSS
9
+ // scoping cannot express. The documented quickstart wraps the host's whole
10
+ // app in `StigmerProvider`, so a `.stgm ul { list-style: none }` rule would
11
+ // strip the bullets off the HOST's own content. Every SDK-rendered UI list
12
+ // therefore declares its own reset (enforced by the `stigmer/require-list-reset`
13
+ // lint rule); markdown-rendered content lists instead declare their bullets
14
+ // explicitly (`stg:list-disc stg:pl-5 ...` in markdown-components.tsx).
15
+ // ---------------------------------------------------------------------------
16
+
17
+ /**
18
+ * UA-default reset for a UI `<ul>`/`<ol>` (no bullets, no indent, no
19
+ * margins). Without it, a host that ships no global CSS reset renders list
20
+ * markers and ~40px of `padding-inline-start` on every SDK list — invisible
21
+ * on first-party surfaces (console, desktop, docs tours all ship global
22
+ * resets), broken in exactly the third-party embeds the SDK exists for.
23
+ * Spacing utilities (`stg:space-y-*`, `stg:p-*`) compose on top.
24
+ */
25
+ export const UNSTYLED_LIST = "stg:m-0 stg:list-none stg:p-0";
26
+
27
+ /**
28
+ * UA-default reset for `<fieldset>` (margin-inline, padding, and
29
+ * `min-inline-size: min-content` — the last one silently breaks flex/grid
30
+ * shrinking). The UA border is already cleared by the `.stgm *` border reset
31
+ * in `styles.css`, so it is not repeated here.
32
+ */
33
+ export const UNSTYLED_FIELDSET = "stg:m-0 stg:min-w-0 stg:p-0";
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { useCallback, useState, type DragEvent } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
+ import { UNSTYLED_LIST } from "../element-resets.js";
5
6
  import { FileTypeIcon, FolderTypeIcon } from "../file-icons/index.js";
6
7
  import type { TreeNode } from "./tree-node.js";
7
8
 
@@ -151,7 +152,7 @@ export function FileTreeNode({
151
152
  {isFolder && expanded && node.children && (
152
153
  <ul
153
154
  role="group"
154
- className={cn(indentGuides && "stg:ml-3 stg:border-l stg:border-border")}
155
+ className={cn(UNSTYLED_LIST, indentGuides && "stg:ml-3 stg:border-l stg:border-border")}
155
156
  >
156
157
  {node.children.map((child) => (
157
158
  <FileTreeNode
@@ -152,12 +152,19 @@ function extractMermaidSource(children: ReactNode): string | null {
152
152
  * ensuring correct rendering in both the Stigmer Console and third-party
153
153
  * host applications with custom themes.
154
154
  *
155
+ * Margin-bearing elements (`p`, `ul`, `ol`, `pre`, `blockquote`) declare
156
+ * their top margin (`stg:mt-0`) and blockquote its inline margins
157
+ * explicitly: the spacing rhythm here is authored via `mb-*` on the
158
+ * assumption that UA base margins are zero, which is only true when the
159
+ * host ships a global reset — preflight-less embeds otherwise stack
160
+ * `margin-top: 1em` (and 40px blockquote indents) on top (#695).
161
+ *
155
162
  * Used by `MessageEntry` (chat messages) and `SkillDetailView` (SKILL.md).
156
163
  */
157
164
  export const MARKDOWN_COMPONENTS: Components = {
158
165
  p({ children, ...props }: MdProps<"p">) {
159
166
  return (
160
- <p className="stg:text-sm stg:text-foreground stg:mb-3 stg:last:mb-0 stg:leading-relaxed stg:break-words" {...props}>
167
+ <p className="stg:text-sm stg:text-foreground stg:mt-0 stg:mb-3 stg:last:mb-0 stg:leading-relaxed stg:break-words" {...props}>
161
168
  {children}
162
169
  </p>
163
170
  );
@@ -211,7 +218,7 @@ export const MARKDOWN_COMPONENTS: Components = {
211
218
 
212
219
  ul({ children, ...props }: MdProps<"ul">) {
213
220
  return (
214
- <ul className="stg:list-disc stg:pl-5 stg:mb-3 stg:last:mb-0 stg:space-y-1 stg:text-sm stg:text-foreground" {...props}>
221
+ <ul className="stg:list-disc stg:pl-5 stg:mt-0 stg:mb-3 stg:last:mb-0 stg:space-y-1 stg:text-sm stg:text-foreground" {...props}>
215
222
  {children}
216
223
  </ul>
217
224
  );
@@ -219,7 +226,7 @@ export const MARKDOWN_COMPONENTS: Components = {
219
226
 
220
227
  ol({ children, ...props }: MdProps<"ol">) {
221
228
  return (
222
- <ol className="stg:list-decimal stg:pl-5 stg:mb-3 stg:last:mb-0 stg:space-y-1 stg:text-sm stg:text-foreground" {...props}>
229
+ <ol className="stg:list-decimal stg:pl-5 stg:mt-0 stg:mb-3 stg:last:mb-0 stg:space-y-1 stg:text-sm stg:text-foreground" {...props}>
223
230
  {children}
224
231
  </ol>
225
232
  );
@@ -245,7 +252,7 @@ export const MARKDOWN_COMPONENTS: Components = {
245
252
 
246
253
  return (
247
254
  <pre
248
- className="stg:mb-3 stg:last:mb-0 stg:overflow-x-auto stg:rounded-md stg:bg-muted stg:p-3"
255
+ className="stg:mt-0 stg:mb-3 stg:last:mb-0 stg:overflow-x-auto stg:rounded-md stg:bg-muted stg:p-3"
249
256
  {...props}
250
257
  >
251
258
  {children}
@@ -293,9 +300,12 @@ export const MARKDOWN_COMPONENTS: Components = {
293
300
  },
294
301
 
295
302
  blockquote({ children, ...props }: MdProps<"blockquote">) {
303
+ // mx-0 matters as much as mt-0 here: UA blockquote margin is `1em 40px`,
304
+ // so a preflight-less host renders a double indent on BOTH sides on top
305
+ // of the border-l + pl-4 treatment.
296
306
  return (
297
307
  <blockquote
298
- className="stg:border-l-2 stg:border-border stg:pl-4 stg:mb-3 stg:last:mb-0 stg:text-muted-foreground stg:italic"
308
+ className="stg:border-l-2 stg:border-border stg:mx-0 stg:mt-0 stg:mb-3 stg:pl-4 stg:last:mb-0 stg:text-muted-foreground stg:italic"
299
309
  {...props}
300
310
  >
301
311
  {children}
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { useCallback, useId, useState, type FormEvent } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
+ import { UNSTYLED_FIELDSET } from "../internal/element-resets.js";
5
6
  import {
6
7
  getUserMessage,
7
8
  iamRoleDisplayName,
@@ -302,7 +303,7 @@ function CreateInvitationForm({
302
303
  />
303
304
 
304
305
  {/* Expiry */}
305
- <fieldset className="stg:space-y-1.5">
306
+ <fieldset className={cn(UNSTYLED_FIELDSET, "stg:space-y-1.5")}>
306
307
  <legend className="stg:text-xs stg:font-medium stg:text-foreground">
307
308
  Expires in
308
309
  </legend>
@@ -324,7 +325,7 @@ function CreateInvitationForm({
324
325
  </fieldset>
325
326
 
326
327
  {/* Redemption mode */}
327
- <fieldset className="stg:space-y-1.5">
328
+ <fieldset className={cn(UNSTYLED_FIELDSET, "stg:space-y-1.5")}>
328
329
  <legend className="stg:text-xs stg:font-medium stg:text-foreground">
329
330
  Usage limit
330
331
  </legend>
@@ -3,6 +3,7 @@
3
3
  import { lazy, Suspense, useCallback, useEffect, useRef } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
5
  import { DialogShell } from "../internal/DialogShell.js";
6
+ import { UNSTYLED_LIST } from "../internal/element-resets.js";
6
7
  import { toast } from "../feedback/toast.js";
7
8
  import { RedactedSecretsNotice } from "./RedactedSecretsNotice.js";
8
9
  import {
@@ -189,7 +190,7 @@ export function ApplyManifestDialog({
189
190
 
190
191
  {/* Per-document preview */}
191
192
  {manifest.entries && manifest.entries.length > 0 && (
192
- <ul className="stg:flex stg:max-h-48 stg:flex-col stg:gap-2 stg:overflow-y-auto" aria-label="Resources to apply">
193
+ <ul className={cn(UNSTYLED_LIST, "stg:flex stg:max-h-48 stg:flex-col stg:gap-2 stg:overflow-y-auto")} aria-label="Resources to apply">
193
194
  {manifest.entries.map((entry, index) => (
194
195
  <PreviewRow key={`${entry.document.handler.yamlKind}/${entry.document.org}/${entry.document.slug}/${index}`} entry={entry} />
195
196
  ))}
@@ -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
+ }