@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.
- package/README.md +1 -0
- package/access/ManageAccessDialog.d.ts +1 -1
- package/access/ManageAccessDialog.js +1 -1
- package/access/types.d.ts +1 -1
- package/billing/ChangePlanDialog.d.ts.map +1 -1
- package/billing/ChangePlanDialog.js +13 -1
- package/billing/ChangePlanDialog.js.map +1 -1
- package/billing/ProviderKeysSection.d.ts +33 -0
- package/billing/ProviderKeysSection.d.ts.map +1 -0
- package/billing/ProviderKeysSection.js +143 -0
- package/billing/ProviderKeysSection.js.map +1 -0
- package/billing/UpgradeNotice.d.ts.map +1 -1
- package/billing/UpgradeNotice.js +1 -0
- package/billing/UpgradeNotice.js.map +1 -1
- package/billing/index.d.ts +4 -0
- package/billing/index.d.ts.map +1 -1
- package/billing/index.js +2 -0
- package/billing/index.js.map +1 -1
- package/billing/plan-features.d.ts +3 -2
- package/billing/plan-features.d.ts.map +1 -1
- package/billing/plan-features.js +4 -3
- package/billing/plan-features.js.map +1 -1
- package/billing/useProviderKeys.d.ts +67 -0
- package/billing/useProviderKeys.d.ts.map +1 -0
- package/billing/useProviderKeys.js +61 -0
- package/billing/useProviderKeys.js.map +1 -0
- package/channel/AgentChannelsPanel.d.ts.map +1 -1
- package/channel/AgentChannelsPanel.js +11 -9
- package/channel/AgentChannelsPanel.js.map +1 -1
- package/channel/connect/ServingAppSection.js +1 -1
- package/channel/connect/ServingAppSection.js.map +1 -1
- package/channel-app/ChannelAppDetailPanel.d.ts +2 -2
- package/channel-app/ChannelAppDetailPanel.js +17 -10
- package/channel-app/ChannelAppDetailPanel.js.map +1 -1
- package/channel-app/ChannelAppListPanel.d.ts +2 -2
- package/channel-app/CreateChannelAppForm.js +1 -1
- package/channel-app/CreateChannelAppForm.js.map +1 -1
- package/channel-app/copy.d.ts +3 -3
- package/channel-app/copy.js +3 -3
- package/channel-app/internal.d.ts +9 -0
- package/channel-app/internal.d.ts.map +1 -1
- package/channel-app/internal.js +9 -0
- package/channel-app/internal.js.map +1 -1
- package/channel-app/slackAppSetup.d.ts +3 -1
- package/channel-app/slackAppSetup.d.ts.map +1 -1
- package/channel-app/slackAppSetup.js +3 -1
- package/channel-app/slackAppSetup.js.map +1 -1
- package/channel-app/whatsappAppSetup.d.ts +3 -1
- package/channel-app/whatsappAppSetup.d.ts.map +1 -1
- package/channel-app/whatsappAppSetup.js +3 -1
- package/channel-app/whatsappAppSetup.js.map +1 -1
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +5 -9
- package/composer/SessionComposer.js.map +1 -1
- package/environment/EnvironmentVariableEditor.js +1 -1
- package/environment/EnvironmentVariableEditor.js.map +1 -1
- package/environment/index.d.ts +1 -1
- package/environment/index.d.ts.map +1 -1
- package/environment/index.js +1 -1
- package/environment/index.js.map +1 -1
- package/environment/systemEnvVars.d.ts +4 -63
- package/environment/systemEnvVars.d.ts.map +1 -1
- package/environment/systemEnvVars.js +21 -113
- package/environment/systemEnvVars.js.map +1 -1
- package/execution/RecalledMemoriesCard.js +1 -1
- package/iam-policy/OrgMembersPanel.js +1 -1
- package/iam-policy/OrgMembersPanel.js.map +1 -1
- package/iam-policy/useCheckPermission.d.ts +4 -1
- package/iam-policy/useCheckPermission.d.ts.map +1 -1
- package/iam-policy/useCheckPermission.js +4 -1
- package/iam-policy/useCheckPermission.js.map +1 -1
- package/iam-policy/useGrantableRoles.d.ts +1 -1
- package/iam-policy/useGrantableRoles.js +1 -1
- package/iam-policy/useRevokeOrgAccess.d.ts +10 -8
- package/iam-policy/useRevokeOrgAccess.d.ts.map +1 -1
- package/iam-policy/useRevokeOrgAccess.js +4 -4
- package/iam-policy/useRevokeOrgAccess.js.map +1 -1
- package/identity-account/AccountPreferencesPanel.d.ts +6 -0
- package/identity-account/AccountPreferencesPanel.d.ts.map +1 -1
- package/identity-account/AccountPreferencesPanel.js +33 -2
- package/identity-account/AccountPreferencesPanel.js.map +1 -1
- package/identity-account/useAccountExecutionDefaults.d.ts +1 -1
- package/identity-account/useAccountExecutionDefaults.d.ts.map +1 -1
- package/identity-account/useAccountExecutionDefaults.js +2 -3
- package/identity-account/useAccountExecutionDefaults.js.map +1 -1
- package/index.d.ts +3 -3
- package/index.d.ts.map +1 -1
- package/index.js +3 -3
- package/index.js.map +1 -1
- package/internal/UnknownPublicAddressNotice.d.ts +20 -0
- package/internal/UnknownPublicAddressNotice.d.ts.map +1 -0
- package/internal/UnknownPublicAddressNotice.js +19 -0
- package/internal/UnknownPublicAddressNotice.js.map +1 -0
- package/internal/features.js +2 -2
- package/internal/features.js.map +1 -1
- package/library/InstanceVisibilitySelector.d.ts +1 -1
- package/library/InstanceVisibilitySelector.d.ts.map +1 -1
- package/library/ResourceVisibilityControl.d.ts +6 -3
- package/library/ResourceVisibilityControl.d.ts.map +1 -1
- package/library/ResourceVisibilityControl.js +7 -4
- package/library/ResourceVisibilityControl.js.map +1 -1
- package/library/VisibilitySelector.d.ts +2 -2
- package/library/VisibilitySelector.d.ts.map +1 -1
- package/library/VisibilitySelector.js +1 -1
- package/licenses/LicenseIssueForm.js +1 -1
- package/licenses/LicenseIssueForm.js.map +1 -1
- package/licenses/license-format.d.ts +7 -5
- package/licenses/license-format.d.ts.map +1 -1
- package/licenses/license-format.js +1 -3
- package/licenses/license-format.js.map +1 -1
- package/mcp-server/McpServerConnectDialog.js +4 -5
- package/mcp-server/McpServerConnectDialog.js.map +1 -1
- package/mcp-server/McpServerDetailView.d.ts.map +1 -1
- package/mcp-server/McpServerDetailView.js +3 -6
- package/mcp-server/McpServerDetailView.js.map +1 -1
- package/mcp-server/McpServerPicker.d.ts.map +1 -1
- package/mcp-server/McpServerPicker.js +2 -6
- package/mcp-server/McpServerPicker.js.map +1 -1
- package/mcp-server/McpToolSelector.js +1 -1
- package/mcp-server/McpToolSelector.js.map +1 -1
- package/mcp-server/useMcpServerConnect.d.ts +14 -25
- package/mcp-server/useMcpServerConnect.d.ts.map +1 -1
- package/mcp-server/useMcpServerConnect.js +7 -19
- package/mcp-server/useMcpServerConnect.js.map +1 -1
- package/mcp-server/useMcpServerOAuthConnect.d.ts +1 -3
- package/mcp-server/useMcpServerOAuthConnect.d.ts.map +1 -1
- package/mcp-server/useMcpServerOAuthConnect.js +6 -19
- package/mcp-server/useMcpServerOAuthConnect.js.map +1 -1
- package/models/HarnessSelector.d.ts.map +1 -1
- package/models/HarnessSelector.js +1 -2
- package/models/HarnessSelector.js.map +1 -1
- package/models/ModelSelector.d.ts +1 -1
- package/models/ModelSelector.d.ts.map +1 -1
- package/models/ModelSelector.js +1 -7
- package/models/ModelSelector.js.map +1 -1
- package/models/harness.d.ts +10 -6
- package/models/harness.d.ts.map +1 -1
- package/models/harness.js +35 -28
- package/models/harness.js.map +1 -1
- package/models/index.d.ts +1 -1
- package/models/index.d.ts.map +1 -1
- package/models/index.js +1 -1
- package/models/index.js.map +1 -1
- package/organization/OrgPreferencesPanel.d.ts.map +1 -1
- package/organization/OrgPreferencesPanel.js +13 -1
- package/organization/OrgPreferencesPanel.js.map +1 -1
- package/package.json +5 -5
- package/plugin/useMcpServerReadiness.js +2 -2
- package/plugin/useMcpServerReadiness.js.map +1 -1
- package/provider-standing/ProviderStandingConsole.js +1 -1
- package/provider.d.ts +27 -1
- package/provider.d.ts.map +1 -1
- package/provider.js +3 -2
- package/provider.js.map +1 -1
- package/public-base-url-context.d.ts +35 -0
- package/public-base-url-context.d.ts.map +1 -0
- package/public-base-url-context.js +62 -0
- package/public-base-url-context.js.map +1 -0
- package/resource-workbench/components/SelectionCheckbox.js +1 -1
- package/resource-workbench/components/SelectionCheckbox.js.map +1 -1
- package/session/useLocalSessionWorker.d.ts +19 -3
- package/session/useLocalSessionWorker.d.ts.map +1 -1
- package/session/useLocalSessionWorker.js +37 -4
- package/session/useLocalSessionWorker.js.map +1 -1
- package/settings/ChannelAppsSection.d.ts +4 -4
- package/settings/ChannelAppsSection.js +4 -4
- package/settings/ProviderKeysSection.d.ts +3 -0
- package/settings/ProviderKeysSection.d.ts.map +1 -0
- package/settings/ProviderKeysSection.js +3 -0
- package/settings/ProviderKeysSection.js.map +1 -0
- package/settings/index.d.ts +2 -0
- package/settings/index.d.ts.map +1 -1
- package/settings/index.js +1 -0
- package/settings/index.js.map +1 -1
- package/settings/settings-nav.d.ts.map +1 -1
- package/settings/settings-nav.js +2 -1
- package/settings/settings-nav.js.map +1 -1
- package/sharing/ShareAgentDialog.d.ts.map +1 -1
- package/sharing/ShareAgentDialog.js +12 -8
- package/sharing/ShareAgentDialog.js.map +1 -1
- package/sharing/useCanCreateAgentShare.d.ts +3 -1
- package/sharing/useCanCreateAgentShare.d.ts.map +1 -1
- package/sharing/useCanCreateAgentShare.js +5 -3
- package/sharing/useCanCreateAgentShare.js.map +1 -1
- package/sharing/useSaveAgentShare.d.ts +1 -1
- package/sharing/useSaveAgentShare.js +1 -1
- package/src/access/ManageAccessDialog.tsx +1 -1
- package/src/access/types.ts +1 -1
- package/src/billing/ChangePlanDialog.tsx +14 -2
- package/src/billing/ProviderKeysSection.tsx +324 -0
- package/src/billing/UpgradeNotice.tsx +1 -0
- package/src/billing/index.ts +9 -0
- package/src/billing/plan-features.ts +4 -3
- package/src/billing/useProviderKeys.ts +129 -0
- package/src/channel/AgentChannelsPanel.tsx +11 -9
- package/src/channel/connect/ServingAppSection.tsx +1 -1
- package/src/channel-app/ChannelAppDetailPanel.tsx +37 -20
- package/src/channel-app/ChannelAppListPanel.tsx +2 -2
- package/src/channel-app/CreateChannelAppForm.tsx +0 -1
- package/src/channel-app/copy.ts +3 -3
- package/src/channel-app/internal.tsx +21 -0
- package/src/channel-app/slackAppSetup.ts +3 -1
- package/src/channel-app/whatsappAppSetup.ts +3 -1
- package/src/composer/SessionComposer.tsx +5 -14
- package/src/environment/EnvironmentVariableEditor.tsx +1 -1
- package/src/environment/index.ts +1 -7
- package/src/environment/systemEnvVars.ts +21 -133
- package/src/execution/RecalledMemoriesCard.tsx +1 -1
- package/src/iam-policy/OrgMembersPanel.tsx +3 -1
- package/src/iam-policy/useCheckPermission.ts +4 -1
- package/src/iam-policy/useGrantableRoles.ts +1 -1
- package/src/iam-policy/useRevokeOrgAccess.ts +10 -8
- package/src/identity-account/AccountPreferencesPanel.tsx +56 -9
- package/src/identity-account/useAccountExecutionDefaults.ts +2 -5
- package/src/index.ts +9 -5
- package/src/internal/UnknownPublicAddressNotice.tsx +31 -0
- package/src/internal/features.ts +2 -2
- package/src/library/InstanceVisibilitySelector.tsx +1 -1
- package/src/library/ResourceVisibilityControl.tsx +7 -4
- package/src/library/VisibilitySelector.tsx +2 -2
- package/src/licenses/LicenseIssueForm.tsx +1 -1
- package/src/licenses/license-format.ts +11 -7
- package/src/mcp-server/McpServerConnectDialog.tsx +4 -6
- package/src/mcp-server/McpServerDetailView.tsx +3 -6
- package/src/mcp-server/McpServerPicker.tsx +2 -12
- package/src/mcp-server/McpToolSelector.tsx +1 -1
- package/src/mcp-server/useMcpServerConnect.ts +14 -33
- package/src/mcp-server/useMcpServerOAuthConnect.ts +7 -23
- package/src/models/HarnessSelector.tsx +1 -3
- package/src/models/ModelSelector.tsx +2 -7
- package/src/models/harness.ts +41 -39
- package/src/models/index.ts +1 -1
- package/src/organization/OrgPreferencesPanel.tsx +19 -1
- package/src/plugin/useMcpServerReadiness.ts +2 -2
- package/src/provider-standing/ProviderStandingConsole.tsx +1 -1
- package/src/provider.tsx +56 -26
- package/src/public-base-url-context.ts +70 -0
- package/src/resource-workbench/components/SelectionCheckbox.tsx +1 -1
- package/src/session/useLocalSessionWorker.ts +35 -4
- package/src/settings/ChannelAppsSection.tsx +4 -4
- package/src/settings/ProviderKeysSection.tsx +4 -0
- package/src/settings/index.ts +2 -0
- package/src/settings/settings-nav.ts +2 -0
- package/src/sharing/ShareAgentDialog.tsx +30 -14
- package/src/sharing/useCanCreateAgentShare.ts +6 -4
- package/src/sharing/useSaveAgentShare.ts +1 -1
- package/src/styles.css +14 -4
- package/src/workflow/WorkflowTaskApprovalSummary.tsx +14 -7
- package/src/workflow/inspector/tabs/BranchesTab.tsx +2 -2
- package/src/workflow/inspector/tabs/CatchTab.tsx +1 -1
- package/src/workflow/inspector/tabs/IterationTab.tsx +1 -1
- package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +7 -6
- package/src/workflow/task-detail/task-approval.ts +20 -13
- package/styles.css +1 -1
- package/workflow/WorkflowTaskApprovalSummary.d.ts +7 -4
- package/workflow/WorkflowTaskApprovalSummary.d.ts.map +1 -1
- package/workflow/WorkflowTaskApprovalSummary.js +8 -3
- package/workflow/WorkflowTaskApprovalSummary.js.map +1 -1
- package/workflow/inspector/tabs/BranchesTab.js +1 -1
- package/workflow/inspector/tabs/BranchesTab.js.map +1 -1
- package/workflow/inspector/tabs/CatchTab.js +1 -1
- package/workflow/inspector/tabs/CatchTab.js.map +1 -1
- package/workflow/inspector/tabs/IterationTab.js +1 -1
- package/workflow/inspector/tabs/IterationTab.js.map +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.d.ts.map +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.js +6 -5
- package/workflow/instance/WorkflowInstanceDetailPanel.js.map +1 -1
- package/workflow/task-detail/task-approval.d.ts +13 -11
- package/workflow/task-detail/task-approval.d.ts.map +1 -1
- package/workflow/task-detail/task-approval.js +8 -4
- 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
|
|
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
|
-
* `
|
|
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="
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
31
|
-
*
|
|
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 =
|
|
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,
|
|
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
|
|
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,
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
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
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
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
|
|
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
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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(
|
|
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
|
|
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
|
|
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
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
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
|
|
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 =
|
|
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
|
|
package/src/models/harness.ts
CHANGED
|
@@ -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
|
-
|
|
10
|
-
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
}
|
package/src/models/index.ts
CHANGED
|
@@ -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=
|
|
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
|
|
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,
|
|
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:
|
|
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
|
))}
|