@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
@@ -311,7 +311,6 @@ function ProviderPicker({
311
311
  checked={checked}
312
312
  onChange={() => onChange(p.id)}
313
313
  disabled={disabled}
314
- className="stg:accent-current"
315
314
  />
316
315
  <p.Icon className="stg:size-3.5 stg:shrink-0 stg:text-foreground" />
317
316
  <span className="stg:text-xs stg:font-medium stg:text-foreground">{p.label}</span>
@@ -4,9 +4,9 @@
4
4
  * thing.
5
5
  *
6
6
  * A channel app carries its organization's Slack or Meta app secrets, so the
7
- * model shows it to its creator, anyone granted viewer on it and the
8
- * organization's admins, and plain members and viewers may not see it at all
9
- * (stigmer/stigmer#1384). An empty list is therefore not evidence that none
7
+ * model shows it to the organization's admins and anyone granted viewer on
8
+ * it, and plain members and viewers may not see it at all
9
+ * (stigmer/stigmer#1384, #1409). An empty list is therefore not evidence that none
10
10
  * is registered, so a caller who may not create channel apps is told who
11
11
  * manages them instead of being told that nothing exists.
12
12
  */
@@ -3,6 +3,7 @@
3
3
  import { useCallback } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
5
  import { TruncatedText } from "../internal/truncated-text.js";
6
+ import { UnknownPublicAddressNotice } from "../internal/UnknownPublicAddressNotice.js";
6
7
  import { useCopyFeedback } from "../internal/useCopyFeedback.js";
7
8
 
8
9
  /**
@@ -89,6 +90,26 @@ export function CopyRow({
89
90
  );
90
91
  }
91
92
 
93
+ /**
94
+ * The place of a {@link CopyRow} whose URL cannot be built because the
95
+ * server's public address is unknown: the same label, then the shared
96
+ * notice in place of the value and its copy button.
97
+ */
98
+ export function UnknownAddressRow({
99
+ label,
100
+ subject,
101
+ }: {
102
+ label: string;
103
+ subject: string;
104
+ }) {
105
+ return (
106
+ <div className="stg:space-y-1">
107
+ <p className="stg:text-xs stg:font-medium stg:text-foreground">{label}</p>
108
+ <UnknownPublicAddressNotice subject={subject} />
109
+ </div>
110
+ );
111
+ }
112
+
92
113
  /** A multi-line copyable value (the app manifest) in a scrollable block. */
93
114
  export function CopyBlock({
94
115
  label,
@@ -53,7 +53,9 @@ export const SLACK_CHANNEL_APP_BOT_EVENTS = [
53
53
  * The events webhook URL for one ChannelApp: the per-app route the
54
54
  * receiver resolves the app's signing secret by.
55
55
  *
56
- * @param apiBaseUrl the Stigmer API origin (`stigmer.baseUrl`)
56
+ * @param apiBaseUrl the server's public base URL, absolute (the one
57
+ * `StigmerProvider`'s `publicBaseUrl` names, or the
58
+ * client's `baseUrl` when that is absolute)
57
59
  * @param channelAppId the ChannelApp resource id (`chapp_...`)
58
60
  */
59
61
  export function slackChannelAppWebhookUrl(
@@ -36,7 +36,9 @@ export const WHATSAPP_CHANNEL_APP_WEBHOOK_FIELDS = ["messages"] as const;
36
36
  * The events webhook URL for one ChannelApp: the per-app route the
37
37
  * receiver resolves the app's secret and verify token by.
38
38
  *
39
- * @param apiBaseUrl the Stigmer API origin (`stigmer.baseUrl`)
39
+ * @param apiBaseUrl the server's public base URL, absolute (the one
40
+ * `StigmerProvider`'s `publicBaseUrl` names, or the
41
+ * client's `baseUrl` when that is absolute)
40
42
  * @param channelAppId the ChannelApp resource id (`chapp_...`)
41
43
  */
42
44
  export function whatsappChannelAppWebhookUrl(
@@ -39,11 +39,7 @@ import { FileReferenceChipList } from "../file-reference/FileReferenceChipList.j
39
39
  import { FILE_REF_MIME } from "../internal/file-tree/index.js";
40
40
  import { useSessionEnvPool } from "../environment/useSessionEnvPool.js";
41
41
  import { usePersonalEnvironment } from "../environment/usePersonalEnvironment.js";
42
- import { useStigmer } from "../hooks.js";
43
- import {
44
- SYSTEM_ENV_VAR_KEYS,
45
- resolveSystemEnvVarValues,
46
- } from "../environment/systemEnvVars.js";
42
+ import { SYSTEM_ENV_VAR_KEYS } from "../environment/systemEnvVars.js";
47
43
  import { useRenderTracer } from "../internal/dev/index.js";
48
44
  import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
49
45
  import {
@@ -714,8 +710,6 @@ const SessionComposerInner = forwardRef<SessionComposerHandle, SessionComposerPr
714
710
  [personalEnv.environment],
715
711
  );
716
712
 
717
- const stigmer = useStigmer();
718
-
719
713
  const pool = useSessionEnvPool({
720
714
  personalEnvKeys,
721
715
  manualSecrets: sessionVariables?.entries,
@@ -1025,14 +1019,11 @@ const SessionComposerInner = forwardRef<SessionComposerHandle, SessionComposerPr
1025
1019
  }
1026
1020
  }
1027
1021
 
1022
+ // Only what the page collected for this run: the platform's own keys
1023
+ // are filled in the runner, below every value a user saved
1024
+ // (systemEnvVars.ts header, stigmer/stigmer#1446).
1028
1025
  const env: Record<string, EnvVarInput> = {};
1029
1026
 
1030
- // System env vars first (lowest priority) — auto-resolved from
1031
- // the Stigmer client's connection context so MCP servers and
1032
- // agents can reach the backend without manual user input.
1033
- const systemVars = await resolveSystemEnvVarValues(stigmer);
1034
- Object.assign(env, systemVars);
1035
-
1036
1027
  if (
1037
1028
  agentSetup.state.status === "ready" &&
1038
1029
  agentSetup.state.resolution.mode === "oneTime"
@@ -1108,7 +1099,7 @@ const SessionComposerInner = forwardRef<SessionComposerHandle, SessionComposerPr
1108
1099
  fileRefs.clear();
1109
1100
  }
1110
1101
  },
1111
- [onSubmit, effective, stigmer, agentSetup.state, mcpSetup.pendingRuntimeEnv, sessionVariables, enableAttachments, attachments, personalEnv, showInteractionModePicker, interactionMode],
1102
+ [onSubmit, effective, agentSetup.state, mcpSetup.pendingRuntimeEnv, sessionVariables, enableAttachments, attachments, personalEnv, showInteractionModePicker, interactionMode],
1112
1103
  );
1113
1104
 
1114
1105
  const composer = useComposer({
@@ -586,7 +586,7 @@ function AddVariableForm({
586
586
  checked={isSecret}
587
587
  onChange={(e) => setIsSecret(e.target.checked)}
588
588
  disabled={isAdding}
589
- className="stg:accent-primary stg:size-3"
589
+ className="stg:size-3"
590
590
  />
591
591
  Secret
592
592
  </label>
@@ -41,13 +41,7 @@ export type {
41
41
  SessionEnvPoolInput,
42
42
  UseSessionEnvPoolReturn,
43
43
  } from "./useSessionEnvPool.js";
44
- export {
45
- SYSTEM_ENV_VAR_KEYS,
46
- toGrpcAddress,
47
- buildSystemEnvVars,
48
- resolveSystemEnvVarValues,
49
- resolveDeclaredSystemEnvVars,
50
- } from "./systemEnvVars.js";
44
+ export { SYSTEM_ENV_VAR_KEYS } from "./systemEnvVars.js";
51
45
  export { EnvironmentPicker } from "./EnvironmentPicker.js";
52
46
  export type { EnvironmentPickerProps } from "./EnvironmentPicker.js";
53
47
  export { useToolCredentialsReadiness } from "./useToolCredentialsReadiness.js";
@@ -1,143 +1,31 @@
1
- import type { EnvVarInput, Stigmer } from "@stigmer/sdk";
2
-
3
1
  // ---------------------------------------------------------------------------
4
2
  // Well-known Stigmer platform environment variable keys
5
3
  //
6
- // These env vars configure MCP server subprocesses (and agents) to
7
- // communicate back to the Stigmer backend. Because the SDK client
8
- // already knows the server address and auth credential, the setup
9
- // hooks can skip prompting users for these values and inject them
10
- // automatically at session creation time.
4
+ // A platform value comes from the component that knows it, fills only a key
5
+ // that is still missing, and reaches only a server that declares it
6
+ // (stigmer/stigmer#1446). The page is not that component for any key, so
7
+ // this SDK supplies none: a value it wrote into a run's runtime env would
8
+ // sit in the top merge layer, above every value a user saved, and a run
9
+ // whose agent declares no env would carry it into the agent's shell.
10
+ //
11
+ // STIGMER_SERVER_ADDRESS is the one key the platform fills. The runner
12
+ // writes it for a server that declares it and holds no value: from the
13
+ // server's public address, which the server hands every sandbox it
14
+ // provisions, or for a stdio child from the endpoint the runner dials
15
+ // itself (backend/services/runner, the platform-server-address module).
16
+ //
17
+ // STIGMER_API_KEY is not a platform key. A server that calls the Stigmer
18
+ // API declares it like any other secret, and its user saves an API key for
19
+ // it; nothing hands a user-defined server the signed-in user's bearer.
11
20
  // ---------------------------------------------------------------------------
12
21
 
13
- const STIGMER_SERVER_ADDRESS = "STIGMER_SERVER_ADDRESS";
14
- const STIGMER_API_KEY = "STIGMER_API_KEY";
15
-
16
22
  /**
17
- * Environment variable keys that the SDK can resolve automatically
18
- * from the current {@link Stigmer} client context.
23
+ * Environment variable keys the platform fills itself, so the setup hooks
24
+ * never prompt a user for them and the credential forms never ask for them.
19
25
  *
20
- * Used by setup hooks to exclude these keys from the "missing
21
- * variables" prompt and by the session composer to inject their
22
- * values into runtime env at submit time.
23
- *
24
- * Platform builders who manage setup hooks directly can use this
25
- * set to extend their own `poolKeys`.
26
+ * Platform builders who manage setup hooks directly can use this set to
27
+ * extend their own `poolKeys`.
26
28
  */
27
29
  export const SYSTEM_ENV_VAR_KEYS: ReadonlySet<string> = new Set([
28
- STIGMER_SERVER_ADDRESS,
29
- STIGMER_API_KEY,
30
+ "STIGMER_SERVER_ADDRESS",
30
31
  ]);
31
-
32
- /**
33
- * Convert an HTTP(S) base URL to a gRPC host:port address.
34
- *
35
- * The Stigmer server serves both gRPC and gRPC-Web on the same
36
- * endpoint, so stripping the protocol and extracting host:port
37
- * produces a valid gRPC dial target.
38
- *
39
- * @example
40
- * ```ts
41
- * toGrpcAddress("http://localhost:7234") // "localhost:7234"
42
- * toGrpcAddress("https://api.stigmer.ai") // "api.stigmer.ai:443"
43
- * toGrpcAddress("https://api.stigmer.ai:8443") // "api.stigmer.ai:8443"
44
- * ```
45
- */
46
- export function toGrpcAddress(httpUrl: string): string {
47
- try {
48
- const url = new URL(httpUrl);
49
- const host = url.hostname;
50
- const port =
51
- url.port || (url.protocol === "https:" ? "443" : "80");
52
- return `${host}:${port}`;
53
- } catch {
54
- return httpUrl;
55
- }
56
- }
57
-
58
- /**
59
- * Build system env var entries from raw connection parameters.
60
- *
61
- * Pure function — no side effects, no async. Suitable for unit
62
- * testing without a live Stigmer client.
63
- *
64
- * @param baseUrl - The Stigmer client's base URL (HTTP).
65
- * @param credential - Current auth credential, or `null` for
66
- * unauthenticated (OSS) backends. When `null`, a placeholder
67
- * value is used so the MCP server env var is always populated.
68
- */
69
- export function buildSystemEnvVars(
70
- baseUrl: string,
71
- credential: string | null,
72
- ): Record<string, EnvVarInput> {
73
- return {
74
- [STIGMER_SERVER_ADDRESS]: {
75
- value: toGrpcAddress(baseUrl),
76
- isSecret: false,
77
- description:
78
- "Auto-resolved from the current Stigmer connection.",
79
- },
80
- [STIGMER_API_KEY]: {
81
- value: credential || "unused",
82
- isSecret: true,
83
- description:
84
- "Auto-resolved from the current Stigmer auth context.",
85
- },
86
- };
87
- }
88
-
89
- /**
90
- * Resolve system env var values from a live {@link Stigmer} client.
91
- *
92
- * Calls {@link Stigmer.getAuthCredential} to obtain the current
93
- * credential, then delegates to {@link buildSystemEnvVars}.
94
- *
95
- * Intended for use at session submit time — the returned values
96
- * are injected into `runtimeEnv` at the **lowest priority** so
97
- * any user-provided values (personal env, manual secrets) win.
98
- */
99
- export async function resolveSystemEnvVarValues(
100
- stigmer: Stigmer,
101
- ): Promise<Record<string, EnvVarInput>> {
102
- const credential = await stigmer.getAuthCredential();
103
- return buildSystemEnvVars(stigmer.baseUrl, credential);
104
- }
105
-
106
- /**
107
- * Resolve only the system env vars that the target resource actually
108
- * declares in its environment specification.
109
- *
110
- * System vars (`STIGMER_SERVER_ADDRESS`, `STIGMER_API_KEY`) should
111
- * only be injected when the resource needs them — blindly injecting
112
- * them causes `runtime_env` to be non-empty on the wire, which
113
- * changes the backend's missing-credential tolerance semantics.
114
- *
115
- * @param stigmer - Live Stigmer client for credential resolution.
116
- * @param declaredEnvKeys - The set of env var keys the target
117
- * resource declares (e.g., `Object.keys(mcpServer.spec.env)`).
118
- * Only system vars whose keys appear here are included.
119
- * @returns Filtered system env vars (may be empty).
120
- */
121
- export async function resolveDeclaredSystemEnvVars(
122
- stigmer: Stigmer,
123
- declaredEnvKeys: ReadonlySet<string> | readonly string[],
124
- ): Promise<Record<string, EnvVarInput>> {
125
- const keys =
126
- declaredEnvKeys instanceof Set
127
- ? declaredEnvKeys
128
- : new Set(declaredEnvKeys);
129
-
130
- const hasDeclared = [...SYSTEM_ENV_VAR_KEYS].some((k) => keys.has(k));
131
- if (!hasDeclared) {
132
- return {};
133
- }
134
-
135
- const all = await resolveSystemEnvVarValues(stigmer);
136
- const filtered: Record<string, EnvVarInput> = {};
137
- for (const [key, value] of Object.entries(all)) {
138
- if (keys.has(key)) {
139
- filtered[key] = value;
140
- }
141
- }
142
- return filtered;
143
- }
@@ -90,7 +90,7 @@ export const RecalledMemoriesCard = memo(function RecalledMemoriesCard({
90
90
  onClick={() => setExpanded((prev) => !prev)}
91
91
  className={cn(
92
92
  "stg:flex stg:w-full stg:items-center stg:gap-3 stg:px-3 stg:py-2 stg:text-left",
93
- "stg:text-xs stg:text-muted-foreground hover:stg:text-foreground",
93
+ "stg:text-xs stg:text-muted-foreground stg:hover:text-foreground",
94
94
  )}
95
95
  >
96
96
  <MemoryIcon />
@@ -496,7 +496,9 @@ function RemoveCopy({
496
496
  case "member":
497
497
  return (
498
498
  <>
499
- Remove {name} from this organization? This revokes all their access.
499
+ Remove {name} from this organization? They lose access to everything
500
+ in it, including what was shared with them and their teams. What
501
+ they created stays with the organization.
500
502
  </>
501
503
  );
502
504
  case "productUser":
@@ -69,7 +69,10 @@ interface SettledCheck {
69
69
  * `false` (so operator-only navigation never appears where the seat
70
70
  * does not exist), `can_grant_access` on a resource the edition does not
71
71
  * share per person is `false` (open source grants roles on organizations
72
- * only), and everything else is the edition's authorizer's answer. By
72
+ * only), and everything else is the edition's authorizer's answer. So a
73
+ * control that changes who reaches a resource (its visibility, a share, a
74
+ * channel) asks `can_manage_audience`, never `can_grant_access`: the owner
75
+ * holds it in every edition. By
73
76
  * default the hook *fails open* while the check is in flight or when the
74
77
  * RPC fails, so a transient error never hides a control the server would
75
78
  * honor. Pass `{ fail: "closed" }` for surfaces that must stay hidden
@@ -26,7 +26,7 @@ export interface UseGrantableRolesReturn {
26
26
  * @example
27
27
  * ```tsx
28
28
  * const { roles, hasRoles } = useGrantableRoles(ApiResourceKind.agent);
29
- * // roles = [IamRole.owner, IamRole.viewer]
29
+ * // roles = [IamRole.owner, IamRole.editor, IamRole.viewer]
30
30
  * // hasRoles = true
31
31
  * ```
32
32
  */
@@ -9,11 +9,13 @@ import { toError } from "../internal/toError.js";
9
9
  /** Return value of {@link useRevokeOrgAccess}. */
10
10
  export interface UseRevokeOrgAccessReturn {
11
11
  /**
12
- * Remove all of a user's access to an organization.
12
+ * Remove a person from an organization.
13
13
  *
14
- * Deletes every IAM policy granting the identity account access
15
- * to the organization and its child resources (agents, environments,
16
- * etc.) in a single operation.
14
+ * Revokes their roles on the organization and everything they hold on
15
+ * its resources: what was shared with them (agents, environments,
16
+ * sessions and the rest) and their team memberships, in a single
17
+ * operation. What they created stays with the organization; it is
18
+ * theirs again only if they are invited back.
17
19
  */
18
20
  readonly revoke: (accountId: string, orgId: string) => Promise<void>;
19
21
  /** `true` while the revoke request is in flight. */
@@ -28,10 +30,10 @@ export interface UseRevokeOrgAccessReturn {
28
30
  * Behavior hook that wraps `iamPolicy.revokeOrgAccess()` with
29
31
  * loading/error state.
30
32
  *
31
- * Removes all IAM policy bindings for a specific identity account
32
- * within an organization — including bindings on child resources
33
- * (agents, environments, etc.). This is the "remove member from org"
34
- * operation.
33
+ * Removes a person from an organization: their roles on it, what was
34
+ * shared with them on its resources and their team memberships. From
35
+ * then on they reach nothing in the organization; what they created
36
+ * stays with it. This is the "remove member from org" operation.
35
37
  *
36
38
  * @example
37
39
  * ```tsx
@@ -15,6 +15,7 @@ import type { IdentityAccount } from "@stigmer/protos/ai/stigmer/iam/identityacc
15
15
  import { useMyIdentityAccount } from "./useMyIdentityAccount.js";
16
16
  import { useUpdateIdentityAccount } from "./useUpdateIdentityAccount.js";
17
17
  import { useModelRegistry } from "../models/index.js";
18
+ import { useServerInfo } from "../server-info.js";
18
19
  import { HARNESS_META, type HarnessOption } from "../models/harness.js";
19
20
  import { MemoryEnabledRow } from "../internal/MemoryEnabledRow.js";
20
21
  import { StandingContextField } from "../internal/StandingContextField.js";
@@ -49,6 +50,12 @@ export interface AccountPreferencesPanelProps {
49
50
  * answer with. A server that cannot answer surfaces its error through the
50
51
  * fetch-error state below, never a hidden branch.
51
52
  *
53
+ * The one posture question it does ask is about memory. The person's own
54
+ * memory switch is honoured only by a server that authenticates its
55
+ * callers; on a server that trusts every request (the single-operator
56
+ * laptop), memory is the organization's switch alone, so the panel says
57
+ * that in the switch's place rather than offering one that does nothing.
58
+ *
52
59
  * All visual properties flow through `--stgm-*` design tokens. Zero
53
60
  * dependencies on Console routing, auth context, or layout — platform
54
61
  * builders can embed it directly:
@@ -86,6 +93,8 @@ export function AccountPreferencesPanel({
86
93
  error: memoryFlagError,
87
94
  } = useUpdateIdentityAccount();
88
95
 
96
+ const memoryGovernance = useMemoryGovernance();
97
+
89
98
  const [standingContext, setStandingContext] = useState("");
90
99
  const [defaultHarness, setDefaultHarness] = useState("");
91
100
  const [defaultNativeModel, setDefaultNativeModel] = useState("");
@@ -377,14 +386,17 @@ export function AccountPreferencesPanel({
377
386
  </div>
378
387
  </div>
379
388
 
380
- <MemoryEnabledRow
381
- id={`${baseId}-memory-enabled`}
382
- checked={account.spec?.preferences?.memoryEnabled ?? false}
383
- onToggle={(next) => void handleMemoryToggle(next)}
384
- saving={isSavingMemoryFlag}
385
- error={memoryFlagError}
386
- helperText="When on, agents may propose facts to remember about you; only facts you confirm are stored. Confirmed memories are shared with your future sessions and appear on those executions' records; once you have many, each conversation recalls the most relevant ones, shown on the execution. Requires your organization to have memory enabled. Changes apply immediately."
387
- />
389
+ {memoryGovernance === "organization" && <OrganizationGovernedMemory />}
390
+ {memoryGovernance === "person" && (
391
+ <MemoryEnabledRow
392
+ id={`${baseId}-memory-enabled`}
393
+ checked={account.spec?.preferences?.memoryEnabled ?? false}
394
+ onToggle={(next) => void handleMemoryToggle(next)}
395
+ saving={isSavingMemoryFlag}
396
+ error={memoryFlagError}
397
+ helperText="When on, agents may propose facts to remember about you; only facts you confirm are stored. Confirmed memories are shared with your future sessions and appear on those executions' records; once you have many, each conversation recalls the most relevant ones, shown on the execution. Requires your organization to have memory enabled. Changes apply immediately."
398
+ />
399
+ )}
388
400
 
389
401
  {updateError && (
390
402
  <p className="stg:text-destructive stg:text-[0.65rem]" role="alert">
@@ -494,7 +506,7 @@ function HarnessOptionRow({
494
506
  disabled={disabled}
495
507
  aria-labelledby={titleId}
496
508
  aria-describedby={descriptionId}
497
- className="stg:mt-0.5 stg:accent-primary stg:focus-visible:outline-none stg:focus-visible:ring-1 stg:focus-visible:ring-ring"
509
+ className="stg:mt-0.5 stg:focus-visible:outline-none stg:focus-visible:ring-1 stg:focus-visible:ring-ring"
498
510
  />
499
511
  <span className="stg:min-w-0 stg:flex-1">
500
512
  <span
@@ -584,3 +596,38 @@ function DefaultModelSelect({
584
596
  </div>
585
597
  );
586
598
  }
599
+
600
+ /**
601
+ * Who decides memory on the connected server, for the memory row.
602
+ *
603
+ * - `"person"`: the person's own switch counts (a server that authenticates
604
+ * its callers, one too old to report its posture, or one whose answer
605
+ * failed: an unknown posture offers the control and lets the server
606
+ * decide, as `authentication_required`'s contract says).
607
+ * - `"organization"`: the server trusts every request, so its one operator
608
+ * decides memory through the organization's switch alone.
609
+ * - `null`: the server has not answered yet, so the row renders nothing
610
+ * rather than a switch that flashes and disappears.
611
+ */
612
+ function useMemoryGovernance(): "person" | "organization" | null {
613
+ const { serverInfo, error } = useServerInfo();
614
+ if (serverInfo !== null) {
615
+ return serverInfo.authenticationRequired === false ? "organization" : "person";
616
+ }
617
+ return error !== null ? "person" : null;
618
+ }
619
+
620
+ /** The memory row on a server where the organization's switch alone decides. */
621
+ function OrganizationGovernedMemory() {
622
+ return (
623
+ <div className="stg:space-y-1">
624
+ <span className="stg:block stg:text-xs stg:font-medium stg:text-foreground">
625
+ Memory
626
+ </span>
627
+ <p className="stg:text-[0.65rem] stg:leading-snug stg:text-muted-foreground">
628
+ On this server, memory follows your organization&apos;s setting. Turn it
629
+ on or off in the organization&apos;s preferences.
630
+ </p>
631
+ </div>
632
+ );
633
+ }
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { useMemo } from "react";
4
4
  import { useMyIdentityAccount } from "./useMyIdentityAccount.js";
5
- import type { HarnessOption } from "../models/harness.js";
5
+ import { isHarnessOption, type HarnessOption } from "../models/harness.js";
6
6
 
7
7
  /**
8
8
  * The current user's account-level execution defaults, shaped for the
@@ -57,10 +57,7 @@ export function useAccountExecutionDefaults(): AccountExecutionDefaults | undefi
57
57
  // The proto validates default_harness to the shipped set, but a client
58
58
  // must not trust persisted data it did not write — unknown values are
59
59
  // treated as undeclared.
60
- const harness =
61
- prefs.defaultHarness === "native" || prefs.defaultHarness === "cursor"
62
- ? (prefs.defaultHarness satisfies HarnessOption)
63
- : undefined;
60
+ const harness = isHarnessOption(prefs.defaultHarness) ? prefs.defaultHarness : undefined;
64
61
  const nativeModel = prefs.defaultNativeModel || undefined;
65
62
  const cursorModel = prefs.defaultCursorModel || undefined;
66
63
  // Only a declared `true` travels — an unset bool is "no preference",
package/src/index.ts CHANGED
@@ -948,7 +948,7 @@ export type {
948
948
  UseUpdateScheduleSpecReturn,
949
949
  } from "./schedule/index.js";
950
950
 
951
- // Environment — data hooks, list hook, personal convenience hook, secret reveal, variable management, env var form, system env vars, and styled components
951
+ // Environment — data hooks, list hook, personal convenience hook, secret reveal, variable management, env var form, the platform-filled key set, and styled components
952
952
  export {
953
953
  useEnvironment,
954
954
  useEnvironmentList,
@@ -964,10 +964,6 @@ export {
964
964
  EnvVarForm,
965
965
  useSessionEnvPool,
966
966
  SYSTEM_ENV_VAR_KEYS,
967
- toGrpcAddress,
968
- buildSystemEnvVars,
969
- resolveSystemEnvVarValues,
970
- resolveDeclaredSystemEnvVars,
971
967
  EnvironmentPicker,
972
968
  useToolCredentialsReadiness,
973
969
  } from "./environment/index.js";
@@ -1164,6 +1160,9 @@ export {
1164
1160
  useSubscription,
1165
1161
  useEntitlements,
1166
1162
  usePeriodEstimate,
1163
+ useProviderKeys,
1164
+ useProviderKeyActions,
1165
+ ProviderKeysSection,
1167
1166
  useChangePlan,
1168
1167
  useCancelSubscription,
1169
1168
  useCreatePaymentMethodSetupSession,
@@ -1206,6 +1205,11 @@ export type {
1206
1205
  UseEntitlementsReturn,
1207
1206
  UsePeriodEstimateOptions,
1208
1207
  UsePeriodEstimateReturn,
1208
+ ProviderKeyProvider,
1209
+ UseProviderKeysOptions,
1210
+ UseProviderKeysReturn,
1211
+ UseProviderKeyActionsReturn,
1212
+ ProviderKeysSectionProps,
1209
1213
  UseChangePlanReturn,
1210
1214
  UseCancelSubscriptionReturn,
1211
1215
  UseCreatePaymentMethodSetupSessionReturn,
@@ -0,0 +1,31 @@
1
+ "use client";
2
+
3
+ /** Props for {@link UnknownPublicAddressNotice}. */
4
+ export interface UnknownPublicAddressNoticeProps {
5
+ /** What cannot be shown, as it reads mid-sentence ("the callback URL"). */
6
+ readonly subject: string;
7
+ }
8
+
9
+ /**
10
+ * Shown in place of a copyable URL or snippet when the server's public
11
+ * address is unknown (`usePublicBaseUrl` answered `null`): the client talks
12
+ * to the server through a relative `baseUrl` and the host named no
13
+ * `publicBaseUrl`. One sentence, shared by every copy surface, so a user is
14
+ * told plainly why there is nothing to copy instead of being offered an
15
+ * address Slack, Meta or a backend cannot call.
16
+ *
17
+ * The surface keeps its own label above the notice, the shape the channel
18
+ * app panel already uses for a verify token it can no longer show. The
19
+ * reader is the host's user, not its developer, so the copy names no prop
20
+ * or configuration.
21
+ */
22
+ export function UnknownPublicAddressNotice({
23
+ subject,
24
+ }: UnknownPublicAddressNoticeProps) {
25
+ return (
26
+ <p className="stg:text-[0.65rem] stg:text-muted-foreground">
27
+ This app doesn&apos;t know your Stigmer server&apos;s public address, so
28
+ it can&apos;t show {subject}.
29
+ </p>
30
+ );
31
+ }
@@ -23,7 +23,7 @@ export const FEATURE_COPY: Readonly<
23
23
  },
24
24
  [Feature.byo_provider_keys]: {
25
25
  label: "Bring your own provider keys",
26
- description: "Use the customer's own LLM provider keys instead of the metered proxy.",
26
+ description: "Run agents on your own Anthropic and OpenAI keys, with no Stigmer commission on those tokens.",
27
27
  },
28
28
  [Feature.channels]: {
29
29
  label: "Channels",
@@ -31,7 +31,7 @@ export const FEATURE_COPY: Readonly<
31
31
  },
32
32
  [Feature.sharing]: {
33
33
  label: "Sharing",
34
- description: "Share agents with individuals and guests through hosted links.",
34
+ description: "Share agents through hosted links, with your organization or with anyone who has the link.",
35
35
  },
36
36
  [Feature.teams]: {
37
37
  label: "Teams",
@@ -26,7 +26,7 @@ export interface InstanceVisibilitySelectorProps {
26
26
  readonly mode?: VisibilitySelectorMode;
27
27
  /** Shows a spinner/disabled state while the RPC is in flight. */
28
28
  readonly isPending?: boolean;
29
- /** Disables all interaction (e.g., when the user lacks can_edit). */
29
+ /** Disables all interaction (e.g., when the user lacks can_manage_audience). */
30
30
  readonly disabled?: boolean;
31
31
  /** Additional CSS classes applied to the root element. */
32
32
  readonly className?: string;