@stigmer/react 3.40.1 → 3.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/README.md +1 -0
  2. package/access/ManageAccessDialog.d.ts +1 -1
  3. package/access/ManageAccessDialog.js +1 -1
  4. package/access/types.d.ts +1 -1
  5. package/billing/ChangePlanDialog.d.ts.map +1 -1
  6. package/billing/ChangePlanDialog.js +13 -1
  7. package/billing/ChangePlanDialog.js.map +1 -1
  8. package/billing/ProviderKeysSection.d.ts +33 -0
  9. package/billing/ProviderKeysSection.d.ts.map +1 -0
  10. package/billing/ProviderKeysSection.js +143 -0
  11. package/billing/ProviderKeysSection.js.map +1 -0
  12. package/billing/UpgradeNotice.d.ts.map +1 -1
  13. package/billing/UpgradeNotice.js +1 -0
  14. package/billing/UpgradeNotice.js.map +1 -1
  15. package/billing/index.d.ts +4 -0
  16. package/billing/index.d.ts.map +1 -1
  17. package/billing/index.js +2 -0
  18. package/billing/index.js.map +1 -1
  19. package/billing/plan-features.d.ts +3 -2
  20. package/billing/plan-features.d.ts.map +1 -1
  21. package/billing/plan-features.js +4 -3
  22. package/billing/plan-features.js.map +1 -1
  23. package/billing/useProviderKeys.d.ts +67 -0
  24. package/billing/useProviderKeys.d.ts.map +1 -0
  25. package/billing/useProviderKeys.js +61 -0
  26. package/billing/useProviderKeys.js.map +1 -0
  27. package/channel/AgentChannelsPanel.d.ts.map +1 -1
  28. package/channel/AgentChannelsPanel.js +11 -9
  29. package/channel/AgentChannelsPanel.js.map +1 -1
  30. package/channel/connect/ServingAppSection.js +1 -1
  31. package/channel/connect/ServingAppSection.js.map +1 -1
  32. package/channel-app/ChannelAppDetailPanel.d.ts +2 -2
  33. package/channel-app/ChannelAppDetailPanel.js +17 -10
  34. package/channel-app/ChannelAppDetailPanel.js.map +1 -1
  35. package/channel-app/ChannelAppListPanel.d.ts +2 -2
  36. package/channel-app/CreateChannelAppForm.js +1 -1
  37. package/channel-app/CreateChannelAppForm.js.map +1 -1
  38. package/channel-app/copy.d.ts +3 -3
  39. package/channel-app/copy.js +3 -3
  40. package/channel-app/internal.d.ts +9 -0
  41. package/channel-app/internal.d.ts.map +1 -1
  42. package/channel-app/internal.js +9 -0
  43. package/channel-app/internal.js.map +1 -1
  44. package/channel-app/slackAppSetup.d.ts +3 -1
  45. package/channel-app/slackAppSetup.d.ts.map +1 -1
  46. package/channel-app/slackAppSetup.js +3 -1
  47. package/channel-app/slackAppSetup.js.map +1 -1
  48. package/channel-app/whatsappAppSetup.d.ts +3 -1
  49. package/channel-app/whatsappAppSetup.d.ts.map +1 -1
  50. package/channel-app/whatsappAppSetup.js +3 -1
  51. package/channel-app/whatsappAppSetup.js.map +1 -1
  52. package/composer/SessionComposer.d.ts.map +1 -1
  53. package/composer/SessionComposer.js +5 -9
  54. package/composer/SessionComposer.js.map +1 -1
  55. package/environment/EnvironmentVariableEditor.js +1 -1
  56. package/environment/EnvironmentVariableEditor.js.map +1 -1
  57. package/environment/index.d.ts +1 -1
  58. package/environment/index.d.ts.map +1 -1
  59. package/environment/index.js +1 -1
  60. package/environment/index.js.map +1 -1
  61. package/environment/systemEnvVars.d.ts +4 -63
  62. package/environment/systemEnvVars.d.ts.map +1 -1
  63. package/environment/systemEnvVars.js +21 -113
  64. package/environment/systemEnvVars.js.map +1 -1
  65. package/execution/RecalledMemoriesCard.js +1 -1
  66. package/iam-policy/OrgMembersPanel.js +1 -1
  67. package/iam-policy/OrgMembersPanel.js.map +1 -1
  68. package/iam-policy/useCheckPermission.d.ts +4 -1
  69. package/iam-policy/useCheckPermission.d.ts.map +1 -1
  70. package/iam-policy/useCheckPermission.js +4 -1
  71. package/iam-policy/useCheckPermission.js.map +1 -1
  72. package/iam-policy/useGrantableRoles.d.ts +1 -1
  73. package/iam-policy/useGrantableRoles.js +1 -1
  74. package/iam-policy/useRevokeOrgAccess.d.ts +10 -8
  75. package/iam-policy/useRevokeOrgAccess.d.ts.map +1 -1
  76. package/iam-policy/useRevokeOrgAccess.js +4 -4
  77. package/iam-policy/useRevokeOrgAccess.js.map +1 -1
  78. package/identity-account/AccountPreferencesPanel.d.ts +6 -0
  79. package/identity-account/AccountPreferencesPanel.d.ts.map +1 -1
  80. package/identity-account/AccountPreferencesPanel.js +33 -2
  81. package/identity-account/AccountPreferencesPanel.js.map +1 -1
  82. package/identity-account/useAccountExecutionDefaults.d.ts +1 -1
  83. package/identity-account/useAccountExecutionDefaults.d.ts.map +1 -1
  84. package/identity-account/useAccountExecutionDefaults.js +2 -3
  85. package/identity-account/useAccountExecutionDefaults.js.map +1 -1
  86. package/index.d.ts +3 -3
  87. package/index.d.ts.map +1 -1
  88. package/index.js +3 -3
  89. package/index.js.map +1 -1
  90. package/internal/UnknownPublicAddressNotice.d.ts +20 -0
  91. package/internal/UnknownPublicAddressNotice.d.ts.map +1 -0
  92. package/internal/UnknownPublicAddressNotice.js +19 -0
  93. package/internal/UnknownPublicAddressNotice.js.map +1 -0
  94. package/internal/features.js +2 -2
  95. package/internal/features.js.map +1 -1
  96. package/library/InstanceVisibilitySelector.d.ts +1 -1
  97. package/library/InstanceVisibilitySelector.d.ts.map +1 -1
  98. package/library/ResourceVisibilityControl.d.ts +6 -3
  99. package/library/ResourceVisibilityControl.d.ts.map +1 -1
  100. package/library/ResourceVisibilityControl.js +7 -4
  101. package/library/ResourceVisibilityControl.js.map +1 -1
  102. package/library/VisibilitySelector.d.ts +2 -2
  103. package/library/VisibilitySelector.d.ts.map +1 -1
  104. package/library/VisibilitySelector.js +1 -1
  105. package/licenses/LicenseIssueForm.js +1 -1
  106. package/licenses/LicenseIssueForm.js.map +1 -1
  107. package/licenses/license-format.d.ts +7 -5
  108. package/licenses/license-format.d.ts.map +1 -1
  109. package/licenses/license-format.js +1 -3
  110. package/licenses/license-format.js.map +1 -1
  111. package/mcp-server/McpServerConnectDialog.js +4 -5
  112. package/mcp-server/McpServerConnectDialog.js.map +1 -1
  113. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  114. package/mcp-server/McpServerDetailView.js +3 -6
  115. package/mcp-server/McpServerDetailView.js.map +1 -1
  116. package/mcp-server/McpServerPicker.d.ts.map +1 -1
  117. package/mcp-server/McpServerPicker.js +2 -6
  118. package/mcp-server/McpServerPicker.js.map +1 -1
  119. package/mcp-server/McpToolSelector.js +1 -1
  120. package/mcp-server/McpToolSelector.js.map +1 -1
  121. package/mcp-server/useMcpServerConnect.d.ts +14 -25
  122. package/mcp-server/useMcpServerConnect.d.ts.map +1 -1
  123. package/mcp-server/useMcpServerConnect.js +7 -19
  124. package/mcp-server/useMcpServerConnect.js.map +1 -1
  125. package/mcp-server/useMcpServerOAuthConnect.d.ts +1 -3
  126. package/mcp-server/useMcpServerOAuthConnect.d.ts.map +1 -1
  127. package/mcp-server/useMcpServerOAuthConnect.js +6 -19
  128. package/mcp-server/useMcpServerOAuthConnect.js.map +1 -1
  129. package/models/HarnessSelector.d.ts.map +1 -1
  130. package/models/HarnessSelector.js +1 -2
  131. package/models/HarnessSelector.js.map +1 -1
  132. package/models/ModelSelector.d.ts +1 -1
  133. package/models/ModelSelector.d.ts.map +1 -1
  134. package/models/ModelSelector.js +1 -7
  135. package/models/ModelSelector.js.map +1 -1
  136. package/models/harness.d.ts +10 -6
  137. package/models/harness.d.ts.map +1 -1
  138. package/models/harness.js +35 -28
  139. package/models/harness.js.map +1 -1
  140. package/models/index.d.ts +1 -1
  141. package/models/index.d.ts.map +1 -1
  142. package/models/index.js +1 -1
  143. package/models/index.js.map +1 -1
  144. package/organization/OrgPreferencesPanel.d.ts.map +1 -1
  145. package/organization/OrgPreferencesPanel.js +13 -1
  146. package/organization/OrgPreferencesPanel.js.map +1 -1
  147. package/package.json +5 -5
  148. package/plugin/useMcpServerReadiness.js +2 -2
  149. package/plugin/useMcpServerReadiness.js.map +1 -1
  150. package/provider-standing/ProviderStandingConsole.js +1 -1
  151. package/provider.d.ts +27 -1
  152. package/provider.d.ts.map +1 -1
  153. package/provider.js +3 -2
  154. package/provider.js.map +1 -1
  155. package/public-base-url-context.d.ts +35 -0
  156. package/public-base-url-context.d.ts.map +1 -0
  157. package/public-base-url-context.js +62 -0
  158. package/public-base-url-context.js.map +1 -0
  159. package/resource-workbench/components/SelectionCheckbox.js +1 -1
  160. package/resource-workbench/components/SelectionCheckbox.js.map +1 -1
  161. package/session/useLocalSessionWorker.d.ts +19 -3
  162. package/session/useLocalSessionWorker.d.ts.map +1 -1
  163. package/session/useLocalSessionWorker.js +37 -4
  164. package/session/useLocalSessionWorker.js.map +1 -1
  165. package/settings/ChannelAppsSection.d.ts +4 -4
  166. package/settings/ChannelAppsSection.js +4 -4
  167. package/settings/ProviderKeysSection.d.ts +3 -0
  168. package/settings/ProviderKeysSection.d.ts.map +1 -0
  169. package/settings/ProviderKeysSection.js +3 -0
  170. package/settings/ProviderKeysSection.js.map +1 -0
  171. package/settings/index.d.ts +2 -0
  172. package/settings/index.d.ts.map +1 -1
  173. package/settings/index.js +1 -0
  174. package/settings/index.js.map +1 -1
  175. package/settings/settings-nav.d.ts.map +1 -1
  176. package/settings/settings-nav.js +2 -1
  177. package/settings/settings-nav.js.map +1 -1
  178. package/sharing/ShareAgentDialog.d.ts.map +1 -1
  179. package/sharing/ShareAgentDialog.js +12 -8
  180. package/sharing/ShareAgentDialog.js.map +1 -1
  181. package/sharing/useCanCreateAgentShare.d.ts +3 -1
  182. package/sharing/useCanCreateAgentShare.d.ts.map +1 -1
  183. package/sharing/useCanCreateAgentShare.js +5 -3
  184. package/sharing/useCanCreateAgentShare.js.map +1 -1
  185. package/sharing/useSaveAgentShare.d.ts +1 -1
  186. package/sharing/useSaveAgentShare.js +1 -1
  187. package/src/access/ManageAccessDialog.tsx +1 -1
  188. package/src/access/types.ts +1 -1
  189. package/src/billing/ChangePlanDialog.tsx +14 -2
  190. package/src/billing/ProviderKeysSection.tsx +324 -0
  191. package/src/billing/UpgradeNotice.tsx +1 -0
  192. package/src/billing/index.ts +9 -0
  193. package/src/billing/plan-features.ts +4 -3
  194. package/src/billing/useProviderKeys.ts +129 -0
  195. package/src/channel/AgentChannelsPanel.tsx +11 -9
  196. package/src/channel/connect/ServingAppSection.tsx +1 -1
  197. package/src/channel-app/ChannelAppDetailPanel.tsx +37 -20
  198. package/src/channel-app/ChannelAppListPanel.tsx +2 -2
  199. package/src/channel-app/CreateChannelAppForm.tsx +0 -1
  200. package/src/channel-app/copy.ts +3 -3
  201. package/src/channel-app/internal.tsx +21 -0
  202. package/src/channel-app/slackAppSetup.ts +3 -1
  203. package/src/channel-app/whatsappAppSetup.ts +3 -1
  204. package/src/composer/SessionComposer.tsx +5 -14
  205. package/src/environment/EnvironmentVariableEditor.tsx +1 -1
  206. package/src/environment/index.ts +1 -7
  207. package/src/environment/systemEnvVars.ts +21 -133
  208. package/src/execution/RecalledMemoriesCard.tsx +1 -1
  209. package/src/iam-policy/OrgMembersPanel.tsx +3 -1
  210. package/src/iam-policy/useCheckPermission.ts +4 -1
  211. package/src/iam-policy/useGrantableRoles.ts +1 -1
  212. package/src/iam-policy/useRevokeOrgAccess.ts +10 -8
  213. package/src/identity-account/AccountPreferencesPanel.tsx +56 -9
  214. package/src/identity-account/useAccountExecutionDefaults.ts +2 -5
  215. package/src/index.ts +9 -5
  216. package/src/internal/UnknownPublicAddressNotice.tsx +31 -0
  217. package/src/internal/features.ts +2 -2
  218. package/src/library/InstanceVisibilitySelector.tsx +1 -1
  219. package/src/library/ResourceVisibilityControl.tsx +7 -4
  220. package/src/library/VisibilitySelector.tsx +2 -2
  221. package/src/licenses/LicenseIssueForm.tsx +1 -1
  222. package/src/licenses/license-format.ts +11 -7
  223. package/src/mcp-server/McpServerConnectDialog.tsx +4 -6
  224. package/src/mcp-server/McpServerDetailView.tsx +3 -6
  225. package/src/mcp-server/McpServerPicker.tsx +2 -12
  226. package/src/mcp-server/McpToolSelector.tsx +1 -1
  227. package/src/mcp-server/useMcpServerConnect.ts +14 -33
  228. package/src/mcp-server/useMcpServerOAuthConnect.ts +7 -23
  229. package/src/models/HarnessSelector.tsx +1 -3
  230. package/src/models/ModelSelector.tsx +2 -7
  231. package/src/models/harness.ts +41 -39
  232. package/src/models/index.ts +1 -1
  233. package/src/organization/OrgPreferencesPanel.tsx +19 -1
  234. package/src/plugin/useMcpServerReadiness.ts +2 -2
  235. package/src/provider-standing/ProviderStandingConsole.tsx +1 -1
  236. package/src/provider.tsx +56 -26
  237. package/src/public-base-url-context.ts +70 -0
  238. package/src/resource-workbench/components/SelectionCheckbox.tsx +1 -1
  239. package/src/session/useLocalSessionWorker.ts +35 -4
  240. package/src/settings/ChannelAppsSection.tsx +4 -4
  241. package/src/settings/ProviderKeysSection.tsx +4 -0
  242. package/src/settings/index.ts +2 -0
  243. package/src/settings/settings-nav.ts +2 -0
  244. package/src/sharing/ShareAgentDialog.tsx +30 -14
  245. package/src/sharing/useCanCreateAgentShare.ts +6 -4
  246. package/src/sharing/useSaveAgentShare.ts +1 -1
  247. package/src/styles.css +14 -4
  248. package/src/workflow/WorkflowTaskApprovalSummary.tsx +14 -7
  249. package/src/workflow/inspector/tabs/BranchesTab.tsx +2 -2
  250. package/src/workflow/inspector/tabs/CatchTab.tsx +1 -1
  251. package/src/workflow/inspector/tabs/IterationTab.tsx +1 -1
  252. package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +7 -6
  253. package/src/workflow/task-detail/task-approval.ts +20 -13
  254. package/styles.css +1 -1
  255. package/workflow/WorkflowTaskApprovalSummary.d.ts +7 -4
  256. package/workflow/WorkflowTaskApprovalSummary.d.ts.map +1 -1
  257. package/workflow/WorkflowTaskApprovalSummary.js +8 -3
  258. package/workflow/WorkflowTaskApprovalSummary.js.map +1 -1
  259. package/workflow/inspector/tabs/BranchesTab.js +1 -1
  260. package/workflow/inspector/tabs/BranchesTab.js.map +1 -1
  261. package/workflow/inspector/tabs/CatchTab.js +1 -1
  262. package/workflow/inspector/tabs/CatchTab.js.map +1 -1
  263. package/workflow/inspector/tabs/IterationTab.js +1 -1
  264. package/workflow/inspector/tabs/IterationTab.js.map +1 -1
  265. package/workflow/instance/WorkflowInstanceDetailPanel.d.ts.map +1 -1
  266. package/workflow/instance/WorkflowInstanceDetailPanel.js +6 -5
  267. package/workflow/instance/WorkflowInstanceDetailPanel.js.map +1 -1
  268. package/workflow/task-detail/task-approval.d.ts +13 -11
  269. package/workflow/task-detail/task-approval.d.ts.map +1 -1
  270. package/workflow/task-detail/task-approval.js +8 -4
  271. package/workflow/task-detail/task-approval.js.map +1 -1
@@ -71,10 +71,13 @@ export interface ResourceVisibilityControlProps {
71
71
  *
72
72
  * Behavior:
73
73
  * - Always renders a legible state: a read-only {@link VisibilityBadge}
74
- * is shown to viewers without `can_edit` and while the permission check
75
- * is in flight — never a silent blank.
74
+ * is shown to anyone without `can_manage_audience` and while the
75
+ * permission check is in flight — never a silent blank.
76
76
  * - Upgrades to the interactive {@link VisibilitySelector} for users with
77
- * `can_edit`, persisting changes via {@link useUpdateVisibility} and invoking
77
+ * `can_manage_audience`, the server's bar on every `updateVisibility`:
78
+ * visibility decides who reaches the resource, so an editor, who may
79
+ * change the definition, sees the badge. Persists changes via
80
+ * {@link useUpdateVisibility} and invokes
78
81
  * {@link ResourceVisibilityControlProps.onChanged} on success.
79
82
  *
80
83
  * Offered levels are kind- and context-aware (`visibilityLevels.ts`):
@@ -166,7 +169,7 @@ export function ResourceVisibilityControl({
166
169
  return (
167
170
  <PermissionGate
168
171
  resource={{ kind: FGA_KIND[kind], id: resourceId }}
169
- relation="can_edit"
172
+ relation="can_manage_audience"
170
173
  fallback={badge}
171
174
  loading={badge}
172
175
  >
@@ -54,7 +54,7 @@ export interface VisibilitySelectorProps {
54
54
  readonly mode?: VisibilitySelectorMode;
55
55
  /** Shows a spinner/disabled state while the RPC is in flight. */
56
56
  readonly isPending?: boolean;
57
- /** Disables all interaction (e.g., when the user lacks can_edit). */
57
+ /** Disables all interaction (e.g., when the user lacks can_manage_audience). */
58
58
  readonly disabled?: boolean;
59
59
  /** Accessible name for the control. Defaults to "Resource visibility". */
60
60
  readonly ariaLabel?: string;
@@ -444,7 +444,7 @@ export interface VisibilityBadgeProps {
444
444
  * for a row from before its retirement).
445
445
  *
446
446
  * Rendered wherever the interactive {@link VisibilitySelector} is not
447
- * available — for viewers who lack `can_edit`, and while a permission check
447
+ * available — for anyone who lacks `can_manage_audience`, and while a permission check
448
448
  * is in flight — so a resource's visibility is always legible rather than
449
449
  * silently blank. Shares the chip styling with the selector trigger so the
450
450
  * read-only and editable states are visually consistent.
@@ -71,7 +71,7 @@ type CustomerMode = "existing" | "new";
71
71
  * browser-blue control inside its brand.
72
72
  */
73
73
  const NATIVE_CONTROL =
74
- "stg:size-3.5 stg:shrink-0 stg:cursor-pointer stg:accent-primary stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring stg:focus-visible:ring-offset-1";
74
+ "stg:size-3.5 stg:shrink-0 stg:cursor-pointer stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring stg:focus-visible:ring-offset-1";
75
75
 
76
76
  const TERM_PRESET_HINT: Readonly<Record<IssuableTerm, string>> = {
77
77
  [LicenseTerm.trial]: "30 days",
@@ -27,11 +27,17 @@ export type IssuableTerm = LicenseTerm.trial | LicenseTerm.paid;
27
27
 
28
28
  /**
29
29
  * Features a Cloud plan sells but a license never carries: they tier the
30
- * hosted runtime, and an Enterprise deployment has them by edition, so
31
- * offering one on a license would sell a capability the license does not
32
- * control.
30
+ * Cloud's hosted runtime, and on a self-hosted deployment the edition
31
+ * decides whether they exist, never a license, so offering one on a
32
+ * license would sell a capability the license does not control. A license
33
+ * issued before a value joined this list may still carry it; the console
34
+ * shows it nowhere.
33
35
  */
34
- export type PlanOnlyFeature = Feature.teams | Feature.managed_organizations;
36
+ export type PlanOnlyFeature =
37
+ | Feature.channels
38
+ | Feature.sharing
39
+ | Feature.teams
40
+ | Feature.managed_organizations;
35
41
 
36
42
  /**
37
43
  * Features the contract names but nothing gates: every edition serves them
@@ -71,8 +77,6 @@ export const FEATURE_LABELS: Readonly<
71
77
  > = {
72
78
  [Feature.sso_enforcement]: FEATURE_COPY[Feature.sso_enforcement],
73
79
  [Feature.byo_provider_keys]: FEATURE_COPY[Feature.byo_provider_keys],
74
- [Feature.channels]: FEATURE_COPY[Feature.channels],
75
- [Feature.sharing]: FEATURE_COPY[Feature.sharing],
76
80
  };
77
81
 
78
82
  /** Every grantable feature, in contract order (derived from the label map). */
@@ -163,7 +167,7 @@ export function limitPart(limit: number | undefined, noun: string): string {
163
167
  return limit === undefined ? `Unlimited ${noun}s` : plural(limit, noun);
164
168
  }
165
169
 
166
- /** The granted features by name, in contract order: "SSO enforcement, Channels". */
170
+ /** The granted features by name, in contract order: "SSO enforcement, Bring your own provider keys". */
167
171
  export function featureNames(features: readonly number[]): string {
168
172
  const names = GRANTABLE_FEATURES.filter((f) => features.includes(f)).map((f) => FEATURE_LABELS[f].label);
169
173
  return names.length === 0 ? "No features" : names.join(", ");
@@ -156,20 +156,18 @@ function ConnectDialogContent({
156
156
 
157
157
  const serverName = mcpServer?.metadata?.name ?? slug;
158
158
  const serverId = mcpServer?.metadata?.id ?? "";
159
- const declaredEnvKeys = Object.keys(mcpServer?.spec?.env ?? {});
160
-
161
159
  const handleConnect = useCallback(async () => {
162
160
  if (!serverId) return;
163
161
 
164
162
  setPhase("connecting");
165
163
  try {
166
- await connect(serverId, activeOrg, undefined, declaredEnvKeys);
164
+ await connect(serverId, activeOrg);
167
165
  setPhase("success");
168
166
  onConnected?.(serverName);
169
167
  } catch {
170
168
  setPhase("error");
171
169
  }
172
- }, [serverId, activeOrg, declaredEnvKeys, connect, onConnected, serverName]);
170
+ }, [serverId, activeOrg, connect, onConnected, serverName]);
173
171
 
174
172
  const handleCredentialSubmit = useCallback(
175
173
  async (values: Record<string, EnvVarInput>) => {
@@ -188,7 +186,7 @@ function ConnectDialogContent({
188
186
  void handleConnect();
189
187
  return;
190
188
  }
191
- oauth.startOAuth(serverId, activeOrg, declaredEnvKeys).then(
189
+ oauth.startOAuth(serverId, activeOrg).then(
192
190
  () => {
193
191
  creds.refetch();
194
192
  setPhase("success");
@@ -203,7 +201,7 @@ function ConnectDialogContent({
203
201
  setPhase("error");
204
202
  },
205
203
  );
206
- }, [serverId, activeOrg, declaredEnvKeys, oauth, creds, onConnected, serverName, handleConnect]);
204
+ }, [serverId, activeOrg, oauth, creds, onConnected, serverName, handleConnect]);
207
205
 
208
206
  // Auto-trigger connect when credentials become ready (manual-only servers)
209
207
  useEffect(() => {
@@ -263,9 +263,8 @@ export function McpServerDetailView({
263
263
  const handleOAuthSignIn = useCallback(async () => {
264
264
  if (!mcpServer?.metadata?.id) return;
265
265
 
266
- const envKeys = Object.keys(mcpServer.spec?.env ?? {});
267
266
  try {
268
- await oauth.startOAuth(mcpServer.metadata.id, activeOrg ?? org, envKeys);
267
+ await oauth.startOAuth(mcpServer.metadata.id, activeOrg ?? org);
269
268
  credentials.refetch();
270
269
  refetch();
271
270
  } catch {
@@ -305,9 +304,8 @@ export function McpServerDetailView({
305
304
  return;
306
305
  }
307
306
 
308
- const envKeys = Object.keys(mcpServer.spec?.env ?? {});
309
307
  try {
310
- await connection.connect(mcpServer.metadata.id, activeOrg ?? org, undefined, envKeys);
308
+ await connection.connect(mcpServer.metadata.id, activeOrg ?? org);
311
309
  // Discovery succeeded — retire the OAuth chain's stale
312
310
  // discovery-failure error so the banner doesn't outlive the state
313
311
  // it described.
@@ -330,9 +328,8 @@ export function McpServerDetailView({
330
328
  }
331
329
 
332
330
  if (mcpServer?.metadata?.id) {
333
- const envKeys = Object.keys(mcpServer.spec?.env ?? {});
334
331
  const connectOrg = activeOrg ?? org;
335
- await connection.connect(mcpServer.metadata.id, connectOrg, values, envKeys);
332
+ await connection.connect(mcpServer.metadata.id, connectOrg, values);
336
333
  refetch();
337
334
  }
338
335
 
@@ -428,11 +428,6 @@ export function McpServerPicker({
428
428
  (oauthStatus?.vendorApprovalStatus === VendorApprovalStatus.PENDING ||
429
429
  oauthStatus?.vendorApprovalStatus === VendorApprovalStatus.REJECTED);
430
430
 
431
- // System env vars are only injected when the server declares them —
432
- // the dialog and detail view pass these on every OAuth chain and
433
- // bare connect; the picker must too.
434
- const declaredEnvKeys = Object.keys(entry.mcpServer.spec?.env ?? {});
435
-
436
431
  // Scope the shared hooks' signals to the server they belong to.
437
432
  const isOwnOAuthAttempt = oauthAttemptKey === view.serverKey;
438
433
  const oauthError = isOwnOAuthAttempt ? oauth.error : null;
@@ -476,12 +471,7 @@ export function McpServerPicker({
476
471
  // server-side. Retry bare discovery; never relaunch the
477
472
  // popup (stigmer/stigmer#418).
478
473
  try {
479
- await discovery.connect(
480
- serverId,
481
- connectOrg,
482
- undefined,
483
- declaredEnvKeys,
484
- );
474
+ await discovery.connect(serverId, connectOrg);
485
475
  // Discovery succeeded — retire the chain's stale
486
476
  // failure and re-evaluate the entry so it resolves
487
477
  // ready with the discovered tools.
@@ -494,7 +484,7 @@ export function McpServerPicker({
494
484
  }
495
485
 
496
486
  try {
497
- await oauth.startOAuth(serverId, connectOrg, declaredEnvKeys);
487
+ await oauth.startOAuth(serverId, connectOrg);
498
488
  setup.onServerAdded(ref);
499
489
  } catch {
500
490
  // error state managed by oauth hook
@@ -178,7 +178,7 @@ export function McpToolSelector({
178
178
  onChange={() => handleToggle(tool.name)}
179
179
  disabled={disabled}
180
180
  aria-describedby={descId}
181
- className="stg:mt-0.5 stg:size-3 stg:shrink-0 stg:accent-primary stg:disabled:pointer-events-none stg:disabled:opacity-50"
181
+ className="stg:mt-0.5 stg:size-3 stg:shrink-0 stg:disabled:pointer-events-none stg:disabled:opacity-50"
182
182
  />
183
183
  <span className="stg:min-w-0 stg:flex-1">
184
184
  <span className="stg:flex stg:items-center stg:gap-1.5">
@@ -6,7 +6,6 @@ import type { McpServer } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/
6
6
  import { ConnectInputSchema } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/io_pb";
7
7
  import { connectAndWait, type EnvVarInput } from "@stigmer/sdk";
8
8
  import { useStigmer } from "../hooks.js";
9
- import { resolveDeclaredSystemEnvVars } from "../environment/systemEnvVars.js";
10
9
  import { toError } from "../internal/toError.js";
11
10
 
12
11
  /** Return value of {@link useMcpServerConnect}. */
@@ -22,23 +21,19 @@ export interface UseMcpServerConnectReturn {
22
21
  * survives browser transport limits. Backends without the lane fall
23
22
  * back to the blocking `connect` RPC transparently.
24
23
  *
25
- * Platform system env vars (`STIGMER_SERVER_ADDRESS`,
26
- * `STIGMER_API_KEY`) are injected only when the MCP server
27
- * declares them in its `spec.env`. Pass `declaredEnvKeys` so the
28
- * hook can determine which system vars the server actually needs.
29
- * When omitted, no system vars are injected.
24
+ * Without `runtimeEnv`, the backend resolves the server's declared
25
+ * variables itself: OAuth tokens from the managed grant, the rest from
26
+ * the caller's personal environment. The platform's own keys are
27
+ * filled by the runner, never sent from here (`SYSTEM_ENV_VAR_KEYS`).
30
28
  *
31
- * When `runtimeEnv` is provided, those values are merged on top
32
- * (caller values win). The backend merges the result on top of
33
- * the user's personal environment so saved credentials (e.g.,
34
- * OAuth tokens) are still resolved.
29
+ * With `runtimeEnv`, the backend connects with exactly those values
30
+ * and resolves nothing else (stigmer/stigmer#1453), so pass it only
31
+ * for a one-time connect whose values the caller supplies whole.
35
32
  *
36
33
  * @param mcpServerId - System-generated ID of the MCP server (metadata.id).
37
34
  * @param org - The caller's active organization slug. Required for
38
35
  * OAuth grant lookup and personal environment resolution.
39
- * @param runtimeEnv - Optional additional environment variables.
40
- * @param declaredEnvKeys - Keys from the server's `spec.env` declaration.
41
- * System vars are only injected when declared here.
36
+ * @param runtimeEnv - Optional one-time values for this connect.
42
37
  * @returns The updated McpServer with populated status.discovered_capabilities
43
38
  * and status.tool_approvals.
44
39
  */
@@ -46,7 +41,6 @@ export interface UseMcpServerConnectReturn {
46
41
  mcpServerId: string,
47
42
  org: string,
48
43
  runtimeEnv?: Record<string, EnvVarInput>,
49
- declaredEnvKeys?: readonly string[],
50
44
  ) => Promise<McpServer>;
51
45
  /** `true` while the connect operation is in flight (start through settle). */
52
46
  readonly isConnecting: boolean;
@@ -64,14 +58,9 @@ export interface UseMcpServerConnectReturn {
64
58
  * server's tools and resource templates, then classifies each tool's
65
59
  * approval policy via a structured-output LLM call.
66
60
  *
67
- * Platform system env vars (`STIGMER_SERVER_ADDRESS`,
68
- * `STIGMER_API_KEY`) are injected only when the target MCP server
69
- * declares them in `spec.env`. Pass the server's declared env keys
70
- * via `declaredEnvKeys` so the hook knows which system vars to
71
- * include. When not provided, no system vars are injected.
72
- *
73
- * Additional one-time credentials can be passed via `runtimeEnv`
74
- * and will override both system vars and personal env values.
61
+ * Saved credentials need nothing from the caller: the backend resolves
62
+ * them. One-time credentials ride `runtimeEnv` and replace that
63
+ * resolution for this connect.
75
64
  *
76
65
  * @example
77
66
  * ```tsx
@@ -80,15 +69,13 @@ export interface UseMcpServerConnectReturn {
80
69
  *
81
70
  * // Saved credentials: already in personal environment
82
71
  * async function handleConnectSaved() {
83
- * const envKeys = Object.keys(mcpServer.spec?.env ?? {});
84
- * await connect(mcpServer.metadata.id, undefined, envKeys);
72
+ * await connect(mcpServer.metadata.id, org);
85
73
  * refetch();
86
74
  * }
87
75
  *
88
76
  * // One-time use: pass credentials directly
89
77
  * async function handleConnectTemporary(values: Record<string, EnvVarInput>) {
90
- * const envKeys = Object.keys(mcpServer.spec?.env ?? {});
91
- * await connect(mcpServer.metadata.id, values, envKeys);
78
+ * await connect(mcpServer.metadata.id, org, values);
92
79
  * refetch();
93
80
  * }
94
81
  * ```
@@ -105,19 +92,13 @@ export function useMcpServerConnect(): UseMcpServerConnectReturn {
105
92
  mcpServerId: string,
106
93
  org: string,
107
94
  runtimeEnv?: Record<string, EnvVarInput>,
108
- declaredEnvKeys?: readonly string[],
109
95
  ): Promise<McpServer> => {
110
96
  setIsConnecting(true);
111
97
  setError(null);
112
98
 
113
99
  try {
114
- const systemEnv = declaredEnvKeys
115
- ? await resolveDeclaredSystemEnvVars(stigmer, declaredEnvKeys)
116
- : {};
117
- const mergedEnv = { ...systemEnv, ...(runtimeEnv ?? {}) };
118
-
119
100
  const runtimeEnvMap: Record<string, { value: string; isSecret: boolean }> = {};
120
- for (const [key, envInput] of Object.entries(mergedEnv)) {
101
+ for (const [key, envInput] of Object.entries(runtimeEnv ?? {})) {
121
102
  runtimeEnvMap[key] = {
122
103
  value: envInput.value,
123
104
  isSecret: envInput.isSecret ?? false,
@@ -10,7 +10,6 @@ import {
10
10
  ConnectInputSchema,
11
11
  } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/io_pb";
12
12
  import { useStigmer } from "../hooks.js";
13
- import { resolveDeclaredSystemEnvVars } from "../environment/systemEnvVars.js";
14
13
  import { toError } from "../internal/toError.js";
15
14
  import {
16
15
  openOAuthPopup,
@@ -81,11 +80,9 @@ export interface UseMcpServerOAuthConnectReturn {
81
80
  *
82
81
  * @param mcpServerId - System-generated ID (metadata.id) of the MCP server.
83
82
  * @param org - Organization context for token storage (caller's active org).
84
- * @param declaredEnvKeys - Keys from the server's `spec.env` declaration.
85
- * System vars are only injected when declared here.
86
83
  * @returns The updated McpServer after tool discovery completes.
87
84
  */
88
- readonly startOAuth: (mcpServerId: string, org: string, declaredEnvKeys?: readonly string[]) => Promise<McpServer>;
85
+ readonly startOAuth: (mcpServerId: string, org: string) => Promise<McpServer>;
89
86
  /** `true` while any phase of the OAuth flow is in progress. */
90
87
  readonly isInProgress: boolean;
91
88
  /** Current phase of the OAuth flow. */
@@ -182,7 +179,7 @@ export function useMcpServerOAuthConnect(): UseMcpServerOAuthConnectReturn {
182
179
  }, [advancePhase]);
183
180
 
184
181
  const startOAuth = useCallback(
185
- async (mcpServerId: string, org: string, declaredEnvKeys?: readonly string[]): Promise<McpServer> => {
182
+ async (mcpServerId: string, org: string): Promise<McpServer> => {
186
183
  advancePhase("initiating");
187
184
  setError(null);
188
185
  setFailedPhase(null);
@@ -229,24 +226,11 @@ export function useMcpServerOAuthConnect(): UseMcpServerOAuthConnectReturn {
229
226
 
230
227
  advancePhase("connecting");
231
228
 
232
- const systemEnv = declaredEnvKeys
233
- ? await resolveDeclaredSystemEnvVars(stigmer, declaredEnvKeys)
234
- : {};
235
- const runtimeEnvMap: Record<string, { value: string; isSecret: boolean }> = {};
236
- for (const [key, envInput] of Object.entries(systemEnv)) {
237
- runtimeEnvMap[key] = {
238
- value: envInput.value,
239
- isSecret: envInput.isSecret ?? false,
240
- };
241
- }
242
-
243
- const input = create(ConnectInputSchema, {
244
- mcpServerId,
245
- org,
246
- ...(Object.keys(runtimeEnvMap).length > 0
247
- ? { runtimeEnv: runtimeEnvMap }
248
- : {}),
249
- });
229
+ // No runtime env: the backend resolves the token this flow just
230
+ // stored from the managed grant, and every other declared variable
231
+ // from the caller's personal environment. A runtime env would
232
+ // replace that resolution whole (stigmer/stigmer#1453).
233
+ const input = create(ConnectInputSchema, { mcpServerId, org });
250
234
 
251
235
  // Async connect lane (stigmer/stigmer#425): startConnect + poll via
252
236
  // the SDK's shared protocol, so the discovery wait can outlive the
@@ -1,9 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import { useCallback, useRef, type KeyboardEvent } from "react";
4
- import { HARNESS_LABELS, type HarnessOption } from "./harness.js";
5
-
6
- const OPTIONS: readonly HarnessOption[] = ["native", "cursor"];
4
+ import { HARNESS_LABELS, HARNESS_OPTIONS as OPTIONS, type HarnessOption } from "./harness.js";
7
5
 
8
6
  /** Props for {@link HarnessSelector}. */
9
7
  export interface HarnessSelectorProps {
@@ -47,7 +47,7 @@ export interface ModelSelectorProps {
47
47
  readonly onHarnessChange?: (harness: HarnessOption) => void;
48
48
  /**
49
49
  * Restrict which harnesses appear in the dropdown.
50
- * When omitted, shows all registered harnesses that have models in the registry.
50
+ * When omitted, shows every harness the platform runs ({@link HARNESS_OPTIONS}).
51
51
  */
52
52
  readonly availableHarnesses?: readonly HarnessOption[];
53
53
  /** Override the curated (featured) list for the current harness. */
@@ -218,12 +218,7 @@ export function ModelSelector({
218
218
  const searchRef = useRef<HTMLInputElement>(null);
219
219
  const listRef = useRef<HTMLDivElement>(null);
220
220
 
221
- const resolvedHarnesses = useMemo(() => {
222
- if (availableHarnesses) return availableHarnesses;
223
- // For now, show native and cursor (the two harnesses with models in the registry).
224
- // Future harnesses will be added to the registry and appear here automatically.
225
- return HARNESS_OPTIONS.filter((h) => h === "native" || h === "cursor");
226
- }, [availableHarnesses]);
221
+ const resolvedHarnesses = availableHarnesses ?? HARNESS_OPTIONS;
227
222
 
228
223
  const selectedModel = (value ? getModel(value) : undefined) ?? defaultModel ?? undefined;
229
224
 
@@ -4,18 +4,33 @@ import { Harness } from "@stigmer/protos/ai/stigmer/agentic/session/v1/enum_pb";
4
4
  * String literal alias for the proto {@link Harness} enum.
5
5
  *
6
6
  * Used on component props and hook options so platform builders
7
- * do not need to import proto enums to use the SDK.
8
- *
9
- * This union grows as new execution engines are integrated.
10
- * Each value must have a corresponding entry in {@link HARNESS_META}.
7
+ * do not need to import proto enums to use the SDK. Exactly the
8
+ * engines the platform runs; it grows only when the proto enum does.
9
+ */
10
+ export type HarnessOption = "native" | "cursor";
11
+
12
+ /**
13
+ * The proto {@link Harness} member for each option — the one table the
14
+ * option set is read from, so the SDK can never offer an engine the proto
15
+ * does not name (stigmer/stigmer#1143: four extra options once mapped
16
+ * silently to NATIVE). Listed in proto enum order.
17
+ */
18
+ const HARNESS_BY_OPTION = {
19
+ native: Harness.NATIVE,
20
+ cursor: Harness.CURSOR,
21
+ } as const satisfies Record<HarnessOption, Exclude<Harness, Harness.UNSPECIFIED>>;
22
+
23
+ /**
24
+ * The reverse of {@link HARNESS_BY_OPTION}, keyed by every engine the proto
25
+ * names. Typed over the whole enum (minus UNSPECIFIED), so a member added
26
+ * to the proto is a compile error here until it has an option — and then
27
+ * in {@link HARNESS_BY_OPTION} and {@link HARNESS_META} until it has an
28
+ * entry in each.
11
29
  */
12
- export type HarnessOption =
13
- | "native"
14
- | "cursor"
15
- | "copilot"
16
- | "claude_code"
17
- | "codex"
18
- | "devin";
30
+ const OPTION_BY_HARNESS: Readonly<Record<Exclude<Harness, Harness.UNSPECIFIED>, HarnessOption>> = {
31
+ [Harness.NATIVE]: "native",
32
+ [Harness.CURSOR]: "cursor",
33
+ };
19
34
 
20
35
  /** Display metadata for a single harness. */
21
36
  export interface HarnessDisplayInfo {
@@ -34,10 +49,6 @@ export interface HarnessDisplayInfo {
34
49
  export const HARNESS_META: Readonly<Record<HarnessOption, HarnessDisplayInfo>> = {
35
50
  native: { label: "Stigmer", description: "Stigmer's native agent runtime" },
36
51
  cursor: { label: "Cursor", description: "Cursor IDE agent with codebase indexing" },
37
- copilot: { label: "GitHub Copilot", description: "GitHub-native sub-agent orchestration" },
38
- claude_code: { label: "Claude Agent SDK", description: "Anthropic's agent SDK with built-in tools" },
39
- codex: { label: "OpenAI Codex", description: "Thread-based execution with structured output" },
40
- devin: { label: "Devin", description: "Full autonomous engineer, session-based" },
41
52
  };
42
53
 
43
54
  /**
@@ -50,28 +61,24 @@ export const HARNESS_LABELS: Readonly<Record<HarnessOption, string>> = Object.fr
50
61
  Object.entries(HARNESS_META).map(([k, v]) => [k, v.label]),
51
62
  ) as Record<HarnessOption, string>;
52
63
 
53
- /** Ordered list of all registered harness IDs. */
54
- export const HARNESS_OPTIONS: readonly HarnessOption[] = [
55
- "native",
56
- "cursor",
57
- "copilot",
58
- "claude_code",
59
- "codex",
60
- "devin",
61
- ];
64
+ /** Ordered list of all registered harness IDs, in proto enum order. */
65
+ export const HARNESS_OPTIONS: readonly HarnessOption[] = Object.keys(HARNESS_BY_OPTION) as HarnessOption[];
62
66
 
63
67
  /** Platform default — resolves to the native engine. */
64
68
  export const DEFAULT_HARNESS: HarnessOption = "native";
65
69
 
70
+ /**
71
+ * Whether a string names a {@link HarnessOption} — the check for a value
72
+ * the SDK did not write itself (a stored preference, a URL parameter),
73
+ * which may name an engine this platform does not run.
74
+ */
75
+ export function isHarnessOption(value: string): value is HarnessOption {
76
+ return Object.hasOwn(HARNESS_BY_OPTION, value);
77
+ }
78
+
66
79
  /** Convert a {@link HarnessOption} string to the proto {@link Harness} enum. */
67
80
  export function toProtoHarness(h: HarnessOption): Harness {
68
- switch (h) {
69
- case "cursor":
70
- return Harness.CURSOR;
71
- case "native":
72
- default:
73
- return Harness.NATIVE;
74
- }
81
+ return HARNESS_BY_OPTION[h];
75
82
  }
76
83
 
77
84
  /**
@@ -80,12 +87,7 @@ export function toProtoHarness(h: HarnessOption): Harness {
80
87
  * `UNSPECIFIED` and any unknown values map to `"native"`.
81
88
  */
82
89
  export function fromProtoHarness(h: Harness): HarnessOption {
83
- switch (h) {
84
- case Harness.CURSOR:
85
- return "cursor";
86
- case Harness.NATIVE:
87
- case Harness.UNSPECIFIED:
88
- default:
89
- return "native";
90
- }
90
+ // A wire value may be UNSPECIFIED, or an engine newer than this build.
91
+ const known: Partial<Record<Harness, HarnessOption>> = OPTION_BY_HARNESS;
92
+ return known[h] ?? DEFAULT_HARNESS;
91
93
  }
@@ -9,7 +9,7 @@ export { ModelSelector } from "./ModelSelector.js";
9
9
  export type { ModelSelectorProps } from "./ModelSelector.js";
10
10
  export { HarnessSelector } from "./HarnessSelector.js";
11
11
  export type { HarnessSelectorProps } from "./HarnessSelector.js";
12
- export { DEFAULT_HARNESS, HARNESS_LABELS, HARNESS_META, HARNESS_OPTIONS, toProtoHarness, fromProtoHarness } from "./harness.js";
12
+ export { DEFAULT_HARNESS, HARNESS_LABELS, HARNESS_META, HARNESS_OPTIONS, isHarnessOption, toProtoHarness, fromProtoHarness } from "./harness.js";
13
13
  export type { HarnessOption, HarnessDisplayInfo } from "./harness.js";
14
14
  export { FAST_SERVICE_TIER, toProtoServiceTier, fromProtoServiceTier } from "./service-tier.js";
15
15
  export type { ServiceTierOption } from "./service-tier.js";
@@ -7,10 +7,19 @@ import type { Organization } from "@stigmer/protos/ai/stigmer/tenancy/organizati
7
7
  import { useOrganization } from "./useOrganization.js";
8
8
  import { useUpdateOrganization } from "./useUpdateOrganization.js";
9
9
  import { useCheckPermission } from "../iam-policy/useCheckPermission.js";
10
+ import { useServerInfo } from "../server-info.js";
10
11
  import { MemoryEnabledRow } from "../internal/MemoryEnabledRow.js";
11
12
  import { StandingContextField } from "../internal/StandingContextField.js";
12
13
  import { SpinnerIcon } from "../internal/SpinnerIcon.js";
13
14
 
15
+ /** The memory row's copy where each member's own switch must also be on. */
16
+ const MEMBER_CONSENT_MEMORY_HELPER_TEXT =
17
+ "Allow agents to remember confirmed facts about members of this organization. Each member must also turn memory on in their own account preferences; once a member has many memories, each conversation recalls their most relevant ones, shown on the execution. Changes apply immediately.";
18
+
19
+ /** The memory row's copy on a server where this switch alone decides memory. */
20
+ const ORG_ALONE_MEMORY_HELPER_TEXT =
21
+ "Allow agents to remember confirmed facts. On this server this switch alone decides memory; once there are many memories, each conversation recalls the most relevant ones, shown on the execution. Changes apply immediately.";
22
+
14
23
  /** Props for {@link OrgPreferencesPanel}. */
15
24
  export interface OrgPreferencesPanelProps {
16
25
  /** The ID of the organization whose preferences to display and edit. */
@@ -69,6 +78,15 @@ export function OrgPreferencesPanel({
69
78
  error: memoryFlagError,
70
79
  } = useUpdateOrganization();
71
80
 
81
+ // On a server that trusts every request, this switch alone decides memory:
82
+ // there is no person's switch to also turn on (the account panel says so
83
+ // in its place).
84
+ const { serverInfo } = useServerInfo();
85
+ const memoryHelperText =
86
+ serverInfo?.authenticationRequired === false
87
+ ? ORG_ALONE_MEMORY_HELPER_TEXT
88
+ : MEMBER_CONSENT_MEMORY_HELPER_TEXT;
89
+
72
90
  // Fail-open: OSS local mode has no IAM service, so editing stays
73
91
  // available there; cloud gets a genuine server verdict.
74
92
  const { allowed: canEdit } = useCheckPermission(
@@ -221,7 +239,7 @@ export function OrgPreferencesPanel({
221
239
  saving={isSavingMemoryFlag}
222
240
  readOnly={!canEdit}
223
241
  error={memoryFlagError}
224
- helperText="Allow agents to remember confirmed facts about members of this organization. Each member must also turn memory on in their own account preferences; once a member has many memories, each conversation recalls their most relevant ones, shown on the execution. Changes apply immediately."
242
+ helperText={memoryHelperText}
225
243
  />
226
244
 
227
245
  {!canEdit && (
@@ -109,14 +109,14 @@ export function useMcpServerReadiness(
109
109
  oauth.clearError();
110
110
  // A sign-in that fails leaves the row on "Sign in" with the reason; one
111
111
  // that lands refetches so the row says "Signed in" from the grant.
112
- void oauth.startOAuth(id, org, declaredVariables).then(
112
+ void oauth.startOAuth(id, org).then(
113
113
  () => {
114
114
  refetch();
115
115
  onSignedIn?.(id);
116
116
  },
117
117
  () => undefined,
118
118
  );
119
- }, [kind, mcpServer, org, oauth.clearError, oauth.startOAuth, declaredVariables, refetch, onSignedIn]);
119
+ }, [kind, mcpServer, org, oauth.clearError, oauth.startOAuth, refetch, onSignedIn]);
120
120
 
121
121
  const error = useMemo(() => {
122
122
  if (readError) return readError;
@@ -110,7 +110,7 @@ export function ProviderStandingConsole({ className }: ProviderStandingConsolePr
110
110
  completed a pass since this deployment came up.
111
111
  </p>
112
112
  ) : (
113
- <ul className="stg:m-0 stg:grid stg:list-none stg:gap-2 stg:p-0 sm:stg:grid-cols-2">
113
+ <ul className="stg:m-0 stg:grid stg:list-none stg:gap-2 stg:p-0 stg:sm:grid-cols-2">
114
114
  {providers.map((entry) => (
115
115
  <StandingCard key={entry.provider} entry={entry} />
116
116
  ))}