@stigmer/react 3.40.0 → 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 (279) 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 +5 -0
  33. package/channel-app/ChannelAppDetailPanel.d.ts.map +1 -1
  34. package/channel-app/ChannelAppDetailPanel.js +22 -9
  35. package/channel-app/ChannelAppDetailPanel.js.map +1 -1
  36. package/channel-app/ChannelAppListPanel.d.ts +13 -4
  37. package/channel-app/ChannelAppListPanel.d.ts.map +1 -1
  38. package/channel-app/ChannelAppListPanel.js +5 -5
  39. package/channel-app/ChannelAppListPanel.js.map +1 -1
  40. package/channel-app/CreateChannelAppForm.js +1 -1
  41. package/channel-app/CreateChannelAppForm.js.map +1 -1
  42. package/channel-app/copy.d.ts +15 -0
  43. package/channel-app/copy.d.ts.map +1 -0
  44. package/channel-app/copy.js +15 -0
  45. package/channel-app/copy.js.map +1 -0
  46. package/channel-app/internal.d.ts +9 -0
  47. package/channel-app/internal.d.ts.map +1 -1
  48. package/channel-app/internal.js +9 -0
  49. package/channel-app/internal.js.map +1 -1
  50. package/channel-app/slackAppSetup.d.ts +3 -1
  51. package/channel-app/slackAppSetup.d.ts.map +1 -1
  52. package/channel-app/slackAppSetup.js +3 -1
  53. package/channel-app/slackAppSetup.js.map +1 -1
  54. package/channel-app/whatsappAppSetup.d.ts +3 -1
  55. package/channel-app/whatsappAppSetup.d.ts.map +1 -1
  56. package/channel-app/whatsappAppSetup.js +3 -1
  57. package/channel-app/whatsappAppSetup.js.map +1 -1
  58. package/composer/SessionComposer.d.ts.map +1 -1
  59. package/composer/SessionComposer.js +5 -9
  60. package/composer/SessionComposer.js.map +1 -1
  61. package/environment/EnvironmentVariableEditor.js +1 -1
  62. package/environment/EnvironmentVariableEditor.js.map +1 -1
  63. package/environment/index.d.ts +1 -1
  64. package/environment/index.d.ts.map +1 -1
  65. package/environment/index.js +1 -1
  66. package/environment/index.js.map +1 -1
  67. package/environment/systemEnvVars.d.ts +4 -63
  68. package/environment/systemEnvVars.d.ts.map +1 -1
  69. package/environment/systemEnvVars.js +21 -113
  70. package/environment/systemEnvVars.js.map +1 -1
  71. package/execution/RecalledMemoriesCard.js +1 -1
  72. package/iam-policy/OrgMembersPanel.js +1 -1
  73. package/iam-policy/OrgMembersPanel.js.map +1 -1
  74. package/iam-policy/useCheckPermission.d.ts +4 -1
  75. package/iam-policy/useCheckPermission.d.ts.map +1 -1
  76. package/iam-policy/useCheckPermission.js +4 -1
  77. package/iam-policy/useCheckPermission.js.map +1 -1
  78. package/iam-policy/useGrantableRoles.d.ts +1 -1
  79. package/iam-policy/useGrantableRoles.js +1 -1
  80. package/iam-policy/useRevokeOrgAccess.d.ts +10 -8
  81. package/iam-policy/useRevokeOrgAccess.d.ts.map +1 -1
  82. package/iam-policy/useRevokeOrgAccess.js +4 -4
  83. package/iam-policy/useRevokeOrgAccess.js.map +1 -1
  84. package/identity-account/AccountPreferencesPanel.d.ts +6 -0
  85. package/identity-account/AccountPreferencesPanel.d.ts.map +1 -1
  86. package/identity-account/AccountPreferencesPanel.js +33 -2
  87. package/identity-account/AccountPreferencesPanel.js.map +1 -1
  88. package/identity-account/useAccountExecutionDefaults.d.ts +1 -1
  89. package/identity-account/useAccountExecutionDefaults.d.ts.map +1 -1
  90. package/identity-account/useAccountExecutionDefaults.js +2 -3
  91. package/identity-account/useAccountExecutionDefaults.js.map +1 -1
  92. package/index.d.ts +3 -3
  93. package/index.d.ts.map +1 -1
  94. package/index.js +3 -3
  95. package/index.js.map +1 -1
  96. package/internal/UnknownPublicAddressNotice.d.ts +20 -0
  97. package/internal/UnknownPublicAddressNotice.d.ts.map +1 -0
  98. package/internal/UnknownPublicAddressNotice.js +19 -0
  99. package/internal/UnknownPublicAddressNotice.js.map +1 -0
  100. package/internal/features.js +2 -2
  101. package/internal/features.js.map +1 -1
  102. package/library/InstanceVisibilitySelector.d.ts +1 -1
  103. package/library/InstanceVisibilitySelector.d.ts.map +1 -1
  104. package/library/ResourceVisibilityControl.d.ts +6 -3
  105. package/library/ResourceVisibilityControl.d.ts.map +1 -1
  106. package/library/ResourceVisibilityControl.js +7 -4
  107. package/library/ResourceVisibilityControl.js.map +1 -1
  108. package/library/VisibilitySelector.d.ts +2 -2
  109. package/library/VisibilitySelector.d.ts.map +1 -1
  110. package/library/VisibilitySelector.js +1 -1
  111. package/licenses/LicenseIssueForm.js +1 -1
  112. package/licenses/LicenseIssueForm.js.map +1 -1
  113. package/licenses/license-format.d.ts +7 -5
  114. package/licenses/license-format.d.ts.map +1 -1
  115. package/licenses/license-format.js +1 -3
  116. package/licenses/license-format.js.map +1 -1
  117. package/mcp-server/McpServerConnectDialog.js +4 -5
  118. package/mcp-server/McpServerConnectDialog.js.map +1 -1
  119. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  120. package/mcp-server/McpServerDetailView.js +3 -6
  121. package/mcp-server/McpServerDetailView.js.map +1 -1
  122. package/mcp-server/McpServerPicker.d.ts.map +1 -1
  123. package/mcp-server/McpServerPicker.js +2 -6
  124. package/mcp-server/McpServerPicker.js.map +1 -1
  125. package/mcp-server/McpToolSelector.js +1 -1
  126. package/mcp-server/McpToolSelector.js.map +1 -1
  127. package/mcp-server/useMcpServerConnect.d.ts +14 -25
  128. package/mcp-server/useMcpServerConnect.d.ts.map +1 -1
  129. package/mcp-server/useMcpServerConnect.js +7 -19
  130. package/mcp-server/useMcpServerConnect.js.map +1 -1
  131. package/mcp-server/useMcpServerOAuthConnect.d.ts +1 -3
  132. package/mcp-server/useMcpServerOAuthConnect.d.ts.map +1 -1
  133. package/mcp-server/useMcpServerOAuthConnect.js +6 -19
  134. package/mcp-server/useMcpServerOAuthConnect.js.map +1 -1
  135. package/models/HarnessSelector.d.ts.map +1 -1
  136. package/models/HarnessSelector.js +1 -2
  137. package/models/HarnessSelector.js.map +1 -1
  138. package/models/ModelSelector.d.ts +1 -1
  139. package/models/ModelSelector.d.ts.map +1 -1
  140. package/models/ModelSelector.js +1 -7
  141. package/models/ModelSelector.js.map +1 -1
  142. package/models/harness.d.ts +10 -6
  143. package/models/harness.d.ts.map +1 -1
  144. package/models/harness.js +35 -28
  145. package/models/harness.js.map +1 -1
  146. package/models/index.d.ts +1 -1
  147. package/models/index.d.ts.map +1 -1
  148. package/models/index.js +1 -1
  149. package/models/index.js.map +1 -1
  150. package/organization/OrgPreferencesPanel.d.ts.map +1 -1
  151. package/organization/OrgPreferencesPanel.js +13 -1
  152. package/organization/OrgPreferencesPanel.js.map +1 -1
  153. package/package.json +5 -5
  154. package/plugin/useMcpServerReadiness.js +2 -2
  155. package/plugin/useMcpServerReadiness.js.map +1 -1
  156. package/provider-standing/ProviderStandingConsole.js +1 -1
  157. package/provider.d.ts +27 -1
  158. package/provider.d.ts.map +1 -1
  159. package/provider.js +3 -2
  160. package/provider.js.map +1 -1
  161. package/public-base-url-context.d.ts +35 -0
  162. package/public-base-url-context.d.ts.map +1 -0
  163. package/public-base-url-context.js +62 -0
  164. package/public-base-url-context.js.map +1 -0
  165. package/resource-workbench/components/SelectionCheckbox.js +1 -1
  166. package/resource-workbench/components/SelectionCheckbox.js.map +1 -1
  167. package/session/useLocalSessionWorker.d.ts +19 -3
  168. package/session/useLocalSessionWorker.d.ts.map +1 -1
  169. package/session/useLocalSessionWorker.js +37 -4
  170. package/session/useLocalSessionWorker.js.map +1 -1
  171. package/settings/ChannelAppsSection.d.ts +7 -0
  172. package/settings/ChannelAppsSection.d.ts.map +1 -1
  173. package/settings/ChannelAppsSection.js +15 -2
  174. package/settings/ChannelAppsSection.js.map +1 -1
  175. package/settings/ProviderKeysSection.d.ts +3 -0
  176. package/settings/ProviderKeysSection.d.ts.map +1 -0
  177. package/settings/ProviderKeysSection.js +3 -0
  178. package/settings/ProviderKeysSection.js.map +1 -0
  179. package/settings/index.d.ts +2 -0
  180. package/settings/index.d.ts.map +1 -1
  181. package/settings/index.js +1 -0
  182. package/settings/index.js.map +1 -1
  183. package/settings/settings-nav.d.ts.map +1 -1
  184. package/settings/settings-nav.js +2 -1
  185. package/settings/settings-nav.js.map +1 -1
  186. package/sharing/ShareAgentDialog.d.ts.map +1 -1
  187. package/sharing/ShareAgentDialog.js +12 -8
  188. package/sharing/ShareAgentDialog.js.map +1 -1
  189. package/sharing/useCanCreateAgentShare.d.ts +3 -1
  190. package/sharing/useCanCreateAgentShare.d.ts.map +1 -1
  191. package/sharing/useCanCreateAgentShare.js +5 -3
  192. package/sharing/useCanCreateAgentShare.js.map +1 -1
  193. package/sharing/useSaveAgentShare.d.ts +1 -1
  194. package/sharing/useSaveAgentShare.js +1 -1
  195. package/src/access/ManageAccessDialog.tsx +1 -1
  196. package/src/access/types.ts +1 -1
  197. package/src/billing/ChangePlanDialog.tsx +14 -2
  198. package/src/billing/ProviderKeysSection.tsx +324 -0
  199. package/src/billing/UpgradeNotice.tsx +1 -0
  200. package/src/billing/index.ts +9 -0
  201. package/src/billing/plan-features.ts +4 -3
  202. package/src/billing/useProviderKeys.ts +129 -0
  203. package/src/channel/AgentChannelsPanel.tsx +11 -9
  204. package/src/channel/connect/ServingAppSection.tsx +1 -1
  205. package/src/channel-app/ChannelAppDetailPanel.tsx +214 -176
  206. package/src/channel-app/ChannelAppListPanel.tsx +14 -4
  207. package/src/channel-app/CreateChannelAppForm.tsx +0 -1
  208. package/src/channel-app/copy.ts +16 -0
  209. package/src/channel-app/internal.tsx +21 -0
  210. package/src/channel-app/slackAppSetup.ts +3 -1
  211. package/src/channel-app/whatsappAppSetup.ts +3 -1
  212. package/src/composer/SessionComposer.tsx +5 -14
  213. package/src/environment/EnvironmentVariableEditor.tsx +1 -1
  214. package/src/environment/index.ts +1 -7
  215. package/src/environment/systemEnvVars.ts +21 -133
  216. package/src/execution/RecalledMemoriesCard.tsx +1 -1
  217. package/src/iam-policy/OrgMembersPanel.tsx +3 -1
  218. package/src/iam-policy/useCheckPermission.ts +4 -1
  219. package/src/iam-policy/useGrantableRoles.ts +1 -1
  220. package/src/iam-policy/useRevokeOrgAccess.ts +10 -8
  221. package/src/identity-account/AccountPreferencesPanel.tsx +56 -9
  222. package/src/identity-account/useAccountExecutionDefaults.ts +2 -5
  223. package/src/index.ts +9 -5
  224. package/src/internal/UnknownPublicAddressNotice.tsx +31 -0
  225. package/src/internal/features.ts +2 -2
  226. package/src/library/InstanceVisibilitySelector.tsx +1 -1
  227. package/src/library/ResourceVisibilityControl.tsx +7 -4
  228. package/src/library/VisibilitySelector.tsx +2 -2
  229. package/src/licenses/LicenseIssueForm.tsx +1 -1
  230. package/src/licenses/license-format.ts +11 -7
  231. package/src/mcp-server/McpServerConnectDialog.tsx +4 -6
  232. package/src/mcp-server/McpServerDetailView.tsx +3 -6
  233. package/src/mcp-server/McpServerPicker.tsx +2 -12
  234. package/src/mcp-server/McpToolSelector.tsx +1 -1
  235. package/src/mcp-server/useMcpServerConnect.ts +14 -33
  236. package/src/mcp-server/useMcpServerOAuthConnect.ts +7 -23
  237. package/src/models/HarnessSelector.tsx +1 -3
  238. package/src/models/ModelSelector.tsx +2 -7
  239. package/src/models/harness.ts +41 -39
  240. package/src/models/index.ts +1 -1
  241. package/src/organization/OrgPreferencesPanel.tsx +19 -1
  242. package/src/plugin/useMcpServerReadiness.ts +2 -2
  243. package/src/provider-standing/ProviderStandingConsole.tsx +1 -1
  244. package/src/provider.tsx +56 -26
  245. package/src/public-base-url-context.ts +70 -0
  246. package/src/resource-workbench/components/SelectionCheckbox.tsx +1 -1
  247. package/src/session/useLocalSessionWorker.ts +35 -4
  248. package/src/settings/ChannelAppsSection.tsx +19 -2
  249. package/src/settings/ProviderKeysSection.tsx +4 -0
  250. package/src/settings/index.ts +2 -0
  251. package/src/settings/settings-nav.ts +2 -0
  252. package/src/sharing/ShareAgentDialog.tsx +30 -14
  253. package/src/sharing/useCanCreateAgentShare.ts +6 -4
  254. package/src/sharing/useSaveAgentShare.ts +1 -1
  255. package/src/styles.css +14 -4
  256. package/src/workflow/WorkflowTaskApprovalSummary.tsx +14 -7
  257. package/src/workflow/inspector/tabs/BranchesTab.tsx +2 -2
  258. package/src/workflow/inspector/tabs/CatchTab.tsx +1 -1
  259. package/src/workflow/inspector/tabs/IterationTab.tsx +1 -1
  260. package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +7 -6
  261. package/src/workflow/task-detail/task-approval.ts +20 -13
  262. package/styles.css +1 -1
  263. package/workflow/WorkflowTaskApprovalSummary.d.ts +7 -4
  264. package/workflow/WorkflowTaskApprovalSummary.d.ts.map +1 -1
  265. package/workflow/WorkflowTaskApprovalSummary.js +8 -3
  266. package/workflow/WorkflowTaskApprovalSummary.js.map +1 -1
  267. package/workflow/inspector/tabs/BranchesTab.js +1 -1
  268. package/workflow/inspector/tabs/BranchesTab.js.map +1 -1
  269. package/workflow/inspector/tabs/CatchTab.js +1 -1
  270. package/workflow/inspector/tabs/CatchTab.js.map +1 -1
  271. package/workflow/inspector/tabs/IterationTab.js +1 -1
  272. package/workflow/inspector/tabs/IterationTab.js.map +1 -1
  273. package/workflow/instance/WorkflowInstanceDetailPanel.d.ts.map +1 -1
  274. package/workflow/instance/WorkflowInstanceDetailPanel.js +6 -5
  275. package/workflow/instance/WorkflowInstanceDetailPanel.js.map +1 -1
  276. package/workflow/task-detail/task-approval.d.ts +13 -11
  277. package/workflow/task-detail/task-approval.d.ts.map +1 -1
  278. package/workflow/task-detail/task-approval.js +8 -4
  279. package/workflow/task-detail/task-approval.js.map +1 -1
@@ -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
  ))}
package/src/provider.tsx CHANGED
@@ -15,6 +15,7 @@ import { StigmerContext } from "./context.js";
15
15
  import { DeploymentModeContext } from "./deployment-mode.js";
16
16
  import { ExecutionTargetContext } from "./execution-target-context.js";
17
17
  import { ApprovalDefaultsContext } from "./approval-defaults-context.js";
18
+ import { PublicBaseUrlContext } from "./public-base-url-context.js";
18
19
  import type { ApprovalDefaults } from "./approval-defaults-context.js";
19
20
  import type { ExecutionTargetOption } from "./session/execution-target.js";
20
21
  import type { RunnerAdapter } from "./runner-adapter.js";
@@ -121,6 +122,32 @@ export interface StigmerProviderProps {
121
122
  * ```
122
123
  */
123
124
  readonly approvalDefaults?: ApprovalDefaults;
125
+ /**
126
+ * The address the Stigmer API is reached at from outside this page, for
127
+ * the URLs the SDK shows a user to copy (the Slack and WhatsApp webhook
128
+ * URLs a channel app registers, and the platform client snippet in the
129
+ * Share dialog). A session's MCP servers get their
130
+ * `STIGMER_SERVER_ADDRESS` from the platform, never from this value.
131
+ *
132
+ * Omit it when the client's `baseUrl` is absolute: that address is used,
133
+ * exactly as before. Pass it when the client talks to the server through
134
+ * a relative `baseUrl` (a same-origin proxy), because the page's own
135
+ * origin need not be where Slack, Meta, a backend or a remote MCP server
136
+ * can reach the API. Without it, the copy surfaces say they do not know
137
+ * the server's public address and offer nothing to copy. Only an
138
+ * absolute `http(s)` URL is used.
139
+ *
140
+ * @example
141
+ * ```tsx
142
+ * // The browser reaches the API through the page's own origin
143
+ * const client = new Stigmer({ baseUrl: "/", getAccessToken });
144
+ *
145
+ * <StigmerProvider client={client} publicBaseUrl="https://api.example.com">
146
+ * <App />
147
+ * </StigmerProvider>
148
+ * ```
149
+ */
150
+ readonly publicBaseUrl?: string;
124
151
  /**
125
152
  * Built-in theme preset to apply.
126
153
  *
@@ -288,6 +315,7 @@ export function StigmerProvider({
288
315
  executionTarget,
289
316
  runnerAdapter,
290
317
  approvalDefaults,
318
+ publicBaseUrl,
291
319
  preset,
292
320
  className,
293
321
  colorMode = "light",
@@ -310,32 +338,34 @@ export function StigmerProvider({
310
338
  <ExecutionTargetContext.Provider value={executionTarget}>
311
339
  <ApprovalDefaultsContext.Provider value={approvalDefaults}>
312
340
  <RunnerAdapterContext.Provider value={runnerAdapter ?? null}>
313
- <ColorModeContext.Provider value={resolvedMode}>
314
- <ModelRegistryContext.Provider value={registryState}>
315
- <TaskKindRegistryContext.Provider value={taskKindRegistryState}>
316
- <ReviewRendererContext.Provider value={reviewRenderers ?? EMPTY_REVIEW_RENDERERS}>
317
- <PortalContainerContext.Provider value={portalContainer}>
318
- {/*
319
- The in-tree scoping container. `data-stgm-root` is a
320
- stable public selector — the documented seam for hosts
321
- to style THIS element only (e.g. the fixed-height
322
- embedding recipe, #260). It must never be mirrored
323
- onto the portal container, whose own `data-stgm-portal`
324
- marker keeps host in-tree-only CSS away from the
325
- off-tree element.
326
- */}
327
- <div
328
- className={scope.className}
329
- data-stgm-root=""
330
- data-stgm-color-mode={scope.colorMode}
331
- >
332
- {children}
333
- </div>
334
- </PortalContainerContext.Provider>
335
- </ReviewRendererContext.Provider>
336
- </TaskKindRegistryContext.Provider>
337
- </ModelRegistryContext.Provider>
338
- </ColorModeContext.Provider>
341
+ <PublicBaseUrlContext.Provider value={publicBaseUrl}>
342
+ <ColorModeContext.Provider value={resolvedMode}>
343
+ <ModelRegistryContext.Provider value={registryState}>
344
+ <TaskKindRegistryContext.Provider value={taskKindRegistryState}>
345
+ <ReviewRendererContext.Provider value={reviewRenderers ?? EMPTY_REVIEW_RENDERERS}>
346
+ <PortalContainerContext.Provider value={portalContainer}>
347
+ {/*
348
+ The in-tree scoping container. `data-stgm-root` is a
349
+ stable public selector — the documented seam for hosts
350
+ to style THIS element only (e.g. the fixed-height
351
+ embedding recipe, #260). It must never be mirrored
352
+ onto the portal container, whose own `data-stgm-portal`
353
+ marker keeps host in-tree-only CSS away from the
354
+ off-tree element.
355
+ */}
356
+ <div
357
+ className={scope.className}
358
+ data-stgm-root=""
359
+ data-stgm-color-mode={scope.colorMode}
360
+ >
361
+ {children}
362
+ </div>
363
+ </PortalContainerContext.Provider>
364
+ </ReviewRendererContext.Provider>
365
+ </TaskKindRegistryContext.Provider>
366
+ </ModelRegistryContext.Provider>
367
+ </ColorModeContext.Provider>
368
+ </PublicBaseUrlContext.Provider>
339
369
  </RunnerAdapterContext.Provider>
340
370
  </ApprovalDefaultsContext.Provider>
341
371
  </ExecutionTargetContext.Provider>