@stigmer/react 0.0.81 → 0.0.83
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/mcp-server/McpServerConfigPanel.d.ts +23 -1
- package/mcp-server/McpServerConfigPanel.d.ts.map +1 -1
- package/mcp-server/McpServerConfigPanel.js +14 -5
- package/mcp-server/McpServerConfigPanel.js.map +1 -1
- package/mcp-server/McpServerDetailView.d.ts.map +1 -1
- package/mcp-server/McpServerDetailView.js +28 -10
- package/mcp-server/McpServerDetailView.js.map +1 -1
- package/mcp-server/McpServerPicker.d.ts.map +1 -1
- package/mcp-server/McpServerPicker.js +27 -3
- package/mcp-server/McpServerPicker.js.map +1 -1
- package/mcp-server/OAuthCallbackHandler.d.ts.map +1 -1
- package/mcp-server/OAuthCallbackHandler.js +33 -9
- package/mcp-server/OAuthCallbackHandler.js.map +1 -1
- package/mcp-server/useMcpServerCredentials.d.ts +53 -2
- package/mcp-server/useMcpServerCredentials.d.ts.map +1 -1
- package/mcp-server/useMcpServerCredentials.js +37 -6
- package/mcp-server/useMcpServerCredentials.js.map +1 -1
- package/mcp-server/useMcpServerOAuthConnect.d.ts +7 -0
- package/mcp-server/useMcpServerOAuthConnect.d.ts.map +1 -1
- package/mcp-server/useMcpServerOAuthConnect.js +48 -5
- package/mcp-server/useMcpServerOAuthConnect.js.map +1 -1
- package/package.json +4 -4
- package/src/mcp-server/McpServerConfigPanel.tsx +82 -4
- package/src/mcp-server/McpServerDetailView.tsx +96 -12
- package/src/mcp-server/McpServerPicker.tsx +56 -18
- package/src/mcp-server/OAuthCallbackHandler.tsx +39 -12
- package/src/mcp-server/useMcpServerCredentials.ts +68 -6
- package/src/mcp-server/useMcpServerOAuthConnect.ts +46 -5
- package/styles.css +1 -1
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useEffect, useRef, useState } from "react";
|
|
4
4
|
import { cn } from "@stigmer/theme";
|
|
5
|
-
import { OAUTH_CALLBACK_MESSAGE_TYPE } from "./useMcpServerOAuthConnect";
|
|
5
|
+
import { OAUTH_CALLBACK_MESSAGE_TYPE, OAUTH_BROADCAST_CHANNEL, } from "./useMcpServerOAuthConnect";
|
|
6
6
|
/**
|
|
7
7
|
* Lightweight component for OAuth callback pages.
|
|
8
8
|
*
|
|
@@ -55,25 +55,49 @@ export function OAuthCallbackHandler({ onFallback, className, }) {
|
|
|
55
55
|
setStatus("error");
|
|
56
56
|
return;
|
|
57
57
|
}
|
|
58
|
+
const message = {
|
|
59
|
+
type: OAUTH_CALLBACK_MESSAGE_TYPE,
|
|
60
|
+
code,
|
|
61
|
+
state,
|
|
62
|
+
};
|
|
63
|
+
// Always broadcast via BroadcastChannel — works even when
|
|
64
|
+
// Cross-Origin-Opener-Policy has severed window.opener.
|
|
65
|
+
let broadcastSent = false;
|
|
66
|
+
try {
|
|
67
|
+
const bc = new BroadcastChannel(OAUTH_BROADCAST_CHANNEL);
|
|
68
|
+
bc.postMessage(message);
|
|
69
|
+
bc.close();
|
|
70
|
+
broadcastSent = true;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// BroadcastChannel unavailable — rely on postMessage below.
|
|
74
|
+
}
|
|
58
75
|
const opener = window.opener;
|
|
59
76
|
if (opener && !opener.closed) {
|
|
60
|
-
const message = {
|
|
61
|
-
type: OAUTH_CALLBACK_MESSAGE_TYPE,
|
|
62
|
-
code,
|
|
63
|
-
state,
|
|
64
|
-
};
|
|
65
77
|
try {
|
|
66
78
|
opener.postMessage(message, window.location.origin);
|
|
67
79
|
setStatus("done");
|
|
68
80
|
window.close();
|
|
69
81
|
}
|
|
70
82
|
catch {
|
|
71
|
-
|
|
72
|
-
"
|
|
73
|
-
|
|
83
|
+
if (broadcastSent) {
|
|
84
|
+
setStatus("done");
|
|
85
|
+
window.close();
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
setErrorMessage("Could not communicate with the parent window. " +
|
|
89
|
+
"Please close this tab and try again.");
|
|
90
|
+
setStatus("error");
|
|
91
|
+
}
|
|
74
92
|
}
|
|
75
93
|
return;
|
|
76
94
|
}
|
|
95
|
+
// opener is null (COOP case) but BroadcastChannel delivered the message.
|
|
96
|
+
if (broadcastSent) {
|
|
97
|
+
setStatus("done");
|
|
98
|
+
window.close();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
77
101
|
if (onFallback) {
|
|
78
102
|
onFallback({ code, state });
|
|
79
103
|
setStatus("done");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OAuthCallbackHandler.js","sourceRoot":"","sources":["../../src/mcp-server/OAuthCallbackHandler.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"OAuthCallbackHandler.js","sourceRoot":"","sources":["../../src/mcp-server/OAuthCallbackHandler.tsx"],"names":[],"mappings":"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"}
|
|
@@ -80,6 +80,35 @@ export interface UseMcpServerCredentialsReturn {
|
|
|
80
80
|
readonly isSaving: boolean;
|
|
81
81
|
/** Re-check the personal environment. */
|
|
82
82
|
readonly refetch: () => void;
|
|
83
|
+
/**
|
|
84
|
+
* `true` when the referenced OAuthApp's vendor approval is still pending.
|
|
85
|
+
* When pending, the platform-managed OAuth sign-in flow is unavailable
|
|
86
|
+
* and the sign-in button should be disabled. Users can still connect
|
|
87
|
+
* via manual token entry (manual override).
|
|
88
|
+
*/
|
|
89
|
+
readonly isVendorApprovalPending: boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Documentation URL for users who want to bring their own OAuth
|
|
92
|
+
* credentials while the platform's OAuth app is pending vendor approval.
|
|
93
|
+
* `null` when no documentation link is available.
|
|
94
|
+
*/
|
|
95
|
+
readonly vendorApprovalDocsUrl: string | null;
|
|
96
|
+
/**
|
|
97
|
+
* When `true`, the user has opted to bypass OAuth and enter the
|
|
98
|
+
* `target_env_var` token manually. In this state:
|
|
99
|
+
*
|
|
100
|
+
* - {@link missingVariables} includes the OAuth-managed variable
|
|
101
|
+
* - {@link isReady} no longer requires an active OAuth grant
|
|
102
|
+
*
|
|
103
|
+
* Only meaningful when `authMode` is `"oauth"`. Has no effect on
|
|
104
|
+
* manual-only servers.
|
|
105
|
+
*/
|
|
106
|
+
readonly manualOverride: boolean;
|
|
107
|
+
/**
|
|
108
|
+
* Toggle the manual override. Pass `true` to switch from OAuth to
|
|
109
|
+
* manual token entry; `false` to revert to the OAuth flow.
|
|
110
|
+
*/
|
|
111
|
+
readonly setManualOverride: (override: boolean) => void;
|
|
83
112
|
}
|
|
84
113
|
/**
|
|
85
114
|
* Checks the user's personal environment against an MCP server's
|
|
@@ -109,9 +138,31 @@ export interface UseMcpServerCredentialsReturn {
|
|
|
109
138
|
* ```tsx
|
|
110
139
|
* const creds = useMcpServerCredentials("acme", mcpServer);
|
|
111
140
|
*
|
|
112
|
-
* // OAuth server — sign-in button +
|
|
141
|
+
* // OAuth server — sign-in button + manual override escape hatch
|
|
113
142
|
* if (creds.authMode === "oauth" && !creds.isOAuthConnected) {
|
|
114
|
-
*
|
|
143
|
+
* if (creds.manualOverride) {
|
|
144
|
+
* // User opted to enter the token manually
|
|
145
|
+
* return (
|
|
146
|
+
* <>
|
|
147
|
+
* <EnvVarForm
|
|
148
|
+
* variables={creds.missingVariables}
|
|
149
|
+
* onSubmit={(values) => creds.saveCredentials(values)}
|
|
150
|
+
* isSubmitting={creds.isSaving}
|
|
151
|
+
* />
|
|
152
|
+
* <button onClick={() => creds.setManualOverride(false)}>
|
|
153
|
+
* Sign in with OAuth instead
|
|
154
|
+
* </button>
|
|
155
|
+
* </>
|
|
156
|
+
* );
|
|
157
|
+
* }
|
|
158
|
+
* return (
|
|
159
|
+
* <>
|
|
160
|
+
* <button onClick={startOAuth}>Sign in</button>
|
|
161
|
+
* <button onClick={() => creds.setManualOverride(true)}>
|
|
162
|
+
* Enter token manually
|
|
163
|
+
* </button>
|
|
164
|
+
* </>
|
|
165
|
+
* );
|
|
115
166
|
* }
|
|
116
167
|
*
|
|
117
168
|
* // Manual vars still needed (mixed mode or manual-only)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMcpServerCredentials.d.ts","sourceRoot":"","sources":["../../src/mcp-server/useMcpServerCredentials.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wDAAwD,CAAC;
|
|
1
|
+
{"version":3,"file":"useMcpServerCredentials.d.ts","sourceRoot":"","sources":["../../src/mcp-server/useMcpServerCredentials.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wDAAwD,CAAC;AAKxF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGpE;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEnD,uDAAuD;AACvD,MAAM,WAAW,6BAA6B;IAC5C;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,CAAC;IAChD;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,8EAA8E;IAC9E,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,eAAe,EAAE,CACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,KAChC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,yCAAyC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAC;IAC1C;;;;OAIG;IACH,QAAQ,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C;;;;;;;;;OASG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;CACzD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,SAAS,EAAE,SAAS,GAAG,IAAI,GAC1B,6BAA6B,CAmF/B"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { useCallback, useMemo } from "react";
|
|
2
|
+
import { useCallback, useMemo, useState } from "react";
|
|
3
|
+
import { VendorApprovalStatus } from "@stigmer/protos/ai/stigmer/iam/oauthapp/v1/spec_pb";
|
|
3
4
|
import { usePersonalEnvironment } from "../environment/usePersonalEnvironment";
|
|
4
5
|
import { diffEnv } from "../environment/diffEnv";
|
|
5
6
|
import { SYSTEM_ENV_VAR_KEYS } from "../environment/systemEnvVars";
|
|
@@ -32,9 +33,31 @@ import { useOAuthGrantStatus } from "./useOAuthGrantStatus";
|
|
|
32
33
|
* ```tsx
|
|
33
34
|
* const creds = useMcpServerCredentials("acme", mcpServer);
|
|
34
35
|
*
|
|
35
|
-
* // OAuth server — sign-in button +
|
|
36
|
+
* // OAuth server — sign-in button + manual override escape hatch
|
|
36
37
|
* if (creds.authMode === "oauth" && !creds.isOAuthConnected) {
|
|
37
|
-
*
|
|
38
|
+
* if (creds.manualOverride) {
|
|
39
|
+
* // User opted to enter the token manually
|
|
40
|
+
* return (
|
|
41
|
+
* <>
|
|
42
|
+
* <EnvVarForm
|
|
43
|
+
* variables={creds.missingVariables}
|
|
44
|
+
* onSubmit={(values) => creds.saveCredentials(values)}
|
|
45
|
+
* isSubmitting={creds.isSaving}
|
|
46
|
+
* />
|
|
47
|
+
* <button onClick={() => creds.setManualOverride(false)}>
|
|
48
|
+
* Sign in with OAuth instead
|
|
49
|
+
* </button>
|
|
50
|
+
* </>
|
|
51
|
+
* );
|
|
52
|
+
* }
|
|
53
|
+
* return (
|
|
54
|
+
* <>
|
|
55
|
+
* <button onClick={startOAuth}>Sign in</button>
|
|
56
|
+
* <button onClick={() => creds.setManualOverride(true)}>
|
|
57
|
+
* Enter token manually
|
|
58
|
+
* </button>
|
|
59
|
+
* </>
|
|
60
|
+
* );
|
|
38
61
|
* }
|
|
39
62
|
*
|
|
40
63
|
* // Manual vars still needed (mixed mode or manual-only)
|
|
@@ -52,10 +75,14 @@ import { useOAuthGrantStatus } from "./useOAuthGrantStatus";
|
|
|
52
75
|
*/
|
|
53
76
|
export function useMcpServerCredentials(org, mcpServer) {
|
|
54
77
|
const personalEnv = usePersonalEnvironment(org);
|
|
78
|
+
const [manualOverride, setManualOverride] = useState(false);
|
|
55
79
|
const auth = mcpServer?.spec?.auth;
|
|
56
80
|
const authMode = auth ? "oauth" : "manual";
|
|
57
81
|
const oauthTargetEnvVar = auth?.targetEnvVar || null;
|
|
58
82
|
const tokenLifetimeHint = auth?.tokenLifetimeHint || null;
|
|
83
|
+
const isVendorApprovalPending = authMode === "oauth" &&
|
|
84
|
+
auth?.vendorApprovalStatus === VendorApprovalStatus.PENDING;
|
|
85
|
+
const vendorApprovalDocsUrl = auth?.vendorApprovalDocsUrl || null;
|
|
59
86
|
const grantStatus = useOAuthGrantStatus(authMode === "oauth" ? (mcpServer?.metadata?.id ?? null) : null, authMode === "oauth" ? org : null);
|
|
60
87
|
const isOAuthConnected = authMode === "oauth" && grantStatus.connected;
|
|
61
88
|
const existingKeys = useMemo(() => new Set(Object.keys(personalEnv.environment?.spec?.data ?? {})), [personalEnv.environment]);
|
|
@@ -69,14 +96,14 @@ export function useMcpServerCredentials(org, mcpServer) {
|
|
|
69
96
|
}, [mcpServer, existingKeys]);
|
|
70
97
|
const requiredMissing = useMemo(() => allMissingVariables.filter((v) => !v.optional), [allMissingVariables]);
|
|
71
98
|
const missingVariables = useMemo(() => {
|
|
72
|
-
if (!oauthTargetEnvVar)
|
|
99
|
+
if (!oauthTargetEnvVar || manualOverride)
|
|
73
100
|
return requiredMissing;
|
|
74
101
|
return requiredMissing.filter((v) => v.key !== oauthTargetEnvVar);
|
|
75
|
-
}, [requiredMissing, oauthTargetEnvVar]);
|
|
102
|
+
}, [requiredMissing, oauthTargetEnvVar, manualOverride]);
|
|
76
103
|
const isReady = !personalEnv.isLoading &&
|
|
77
104
|
!grantStatus.isLoading &&
|
|
78
105
|
missingVariables.length === 0 &&
|
|
79
|
-
(authMode === "manual" || isOAuthConnected);
|
|
106
|
+
(authMode === "manual" || manualOverride || isOAuthConnected);
|
|
80
107
|
const saveCredentials = useCallback(async (values) => {
|
|
81
108
|
await personalEnv.getOrCreate();
|
|
82
109
|
await personalEnv.addVariables(values);
|
|
@@ -91,6 +118,8 @@ export function useMcpServerCredentials(org, mcpServer) {
|
|
|
91
118
|
isOAuthConnected,
|
|
92
119
|
accessTokenExpiresAt: grantStatus.accessTokenExpiresAt,
|
|
93
120
|
tokenLifetimeHint,
|
|
121
|
+
isVendorApprovalPending,
|
|
122
|
+
vendorApprovalDocsUrl,
|
|
94
123
|
missingVariables,
|
|
95
124
|
isReady,
|
|
96
125
|
isLoading: personalEnv.isLoading || grantStatus.isLoading,
|
|
@@ -98,6 +127,8 @@ export function useMcpServerCredentials(org, mcpServer) {
|
|
|
98
127
|
saveCredentials,
|
|
99
128
|
isSaving: personalEnv.isMutating,
|
|
100
129
|
refetch,
|
|
130
|
+
manualOverride,
|
|
131
|
+
setManualOverride,
|
|
101
132
|
};
|
|
102
133
|
}
|
|
103
134
|
//# sourceMappingURL=useMcpServerCredentials.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMcpServerCredentials.js","sourceRoot":"","sources":["../../src/mcp-server/useMcpServerCredentials.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useMcpServerCredentials.js","sourceRoot":"","sources":["../../src/mcp-server/useMcpServerCredentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,13 @@ import type { McpServer } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/
|
|
|
5
5
|
* @internal
|
|
6
6
|
*/
|
|
7
7
|
export declare const OAUTH_CALLBACK_MESSAGE_TYPE = "stigmer:oauth:callback";
|
|
8
|
+
/**
|
|
9
|
+
* BroadcastChannel name used as a fallback when `window.opener` is severed
|
|
10
|
+
* by `Cross-Origin-Opener-Policy` headers on the OAuth provider.
|
|
11
|
+
*
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
export declare const OAUTH_BROADCAST_CHANNEL = "stigmer:oauth:broadcast";
|
|
8
15
|
/**
|
|
9
16
|
* Shape of the `postMessage` payload sent from the OAuth callback popup.
|
|
10
17
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMcpServerOAuthConnect.d.ts","sourceRoot":"","sources":["../../src/mcp-server/useMcpServerOAuthConnect.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wDAAwD,CAAC;AAUxF;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,2BAA2B,CAAC;AAEpE;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,OAAO,2BAA2B,CAAC;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,iDAAiD;AACjD,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,YAAY,GACZ,mBAAmB,GACnB,YAAY,GACZ,YAAY,GACZ,MAAM,CAAC;AAEX,wDAAwD;AACxD,MAAM,WAAW,8BAA8B;IAC7C;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACnH,+DAA+D;IAC/D,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,uCAAuC;IACvC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,wDAAwD;IACxD,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;CACjC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,wBAAwB,IAAI,8BAA8B,CAsHzE"}
|
|
1
|
+
{"version":3,"file":"useMcpServerOAuthConnect.d.ts","sourceRoot":"","sources":["../../src/mcp-server/useMcpServerOAuthConnect.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wDAAwD,CAAC;AAUxF;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,2BAA2B,CAAC;AAEpE;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,4BAA4B,CAAC;AAEjE;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,OAAO,2BAA2B,CAAC;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,iDAAiD;AACjD,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,YAAY,GACZ,mBAAmB,GACnB,YAAY,GACZ,YAAY,GACZ,MAAM,CAAC;AAEX,wDAAwD;AACxD,MAAM,WAAW,8BAA8B;IAC7C;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACnH,+DAA+D;IAC/D,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,uCAAuC;IACvC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,wDAAwD;IACxD,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;CACjC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,wBAAwB,IAAI,8BAA8B,CAsHzE"}
|
|
@@ -11,6 +11,13 @@ import { toError } from "../internal/toError";
|
|
|
11
11
|
* @internal
|
|
12
12
|
*/
|
|
13
13
|
export const OAUTH_CALLBACK_MESSAGE_TYPE = "stigmer:oauth:callback";
|
|
14
|
+
/**
|
|
15
|
+
* BroadcastChannel name used as a fallback when `window.opener` is severed
|
|
16
|
+
* by `Cross-Origin-Opener-Policy` headers on the OAuth provider.
|
|
17
|
+
*
|
|
18
|
+
* @internal
|
|
19
|
+
*/
|
|
20
|
+
export const OAUTH_BROADCAST_CHANNEL = "stigmer:oauth:broadcast";
|
|
14
21
|
const POPUP_WIDTH = 600;
|
|
15
22
|
const POPUP_HEIGHT = 700;
|
|
16
23
|
const POPUP_CALLBACK_TIMEOUT_MS = 120_000;
|
|
@@ -135,17 +142,29 @@ export function useMcpServerOAuthConnect() {
|
|
|
135
142
|
// ---------------------------------------------------------------------------
|
|
136
143
|
// Popup callback listener
|
|
137
144
|
// ---------------------------------------------------------------------------
|
|
145
|
+
/**
|
|
146
|
+
* Grace period (ms) after `popup.closed` is first detected before treating
|
|
147
|
+
* it as a user-initiated close. COOP providers sever the opener reference
|
|
148
|
+
* immediately, making `popup.closed` appear `true` while the popup is still
|
|
149
|
+
* active. The grace period lets the BroadcastChannel callback arrive.
|
|
150
|
+
*/
|
|
151
|
+
const POPUP_CLOSED_GRACE_MS = 5_000;
|
|
138
152
|
function waitForOAuthCallback(popup, expectedState, onDispose) {
|
|
139
153
|
return new Promise((resolve, reject) => {
|
|
140
154
|
let settled = false;
|
|
141
155
|
let timeoutId;
|
|
142
156
|
let pollId;
|
|
157
|
+
let bc = null;
|
|
143
158
|
function cleanup() {
|
|
144
159
|
if (timeoutId)
|
|
145
160
|
clearTimeout(timeoutId);
|
|
146
161
|
if (pollId)
|
|
147
162
|
clearInterval(pollId);
|
|
148
163
|
window.removeEventListener("message", onMessage);
|
|
164
|
+
try {
|
|
165
|
+
bc?.close();
|
|
166
|
+
}
|
|
167
|
+
catch { /* ignore */ }
|
|
149
168
|
}
|
|
150
169
|
function settle(outcome) {
|
|
151
170
|
if (settled)
|
|
@@ -163,10 +182,7 @@ function waitForOAuthCallback(popup, expectedState, onDispose) {
|
|
|
163
182
|
settle(new Error("OAuth flow was cancelled."));
|
|
164
183
|
closePopup(popup);
|
|
165
184
|
});
|
|
166
|
-
function
|
|
167
|
-
if (event.origin !== window.location.origin)
|
|
168
|
-
return;
|
|
169
|
-
const data = event.data;
|
|
185
|
+
function validateAndSettle(data) {
|
|
170
186
|
if (data?.type !== OAUTH_CALLBACK_MESSAGE_TYPE)
|
|
171
187
|
return;
|
|
172
188
|
if (data.state !== expectedState) {
|
|
@@ -180,16 +196,43 @@ function waitForOAuthCallback(popup, expectedState, onDispose) {
|
|
|
180
196
|
}
|
|
181
197
|
settle({ code: data.code, state: data.state });
|
|
182
198
|
}
|
|
199
|
+
function onMessage(event) {
|
|
200
|
+
if (event.origin !== window.location.origin)
|
|
201
|
+
return;
|
|
202
|
+
validateAndSettle(event.data);
|
|
203
|
+
}
|
|
183
204
|
window.addEventListener("message", onMessage);
|
|
205
|
+
// BroadcastChannel — works even when COOP severs window.opener.
|
|
206
|
+
try {
|
|
207
|
+
bc = new BroadcastChannel(OAUTH_BROADCAST_CHANNEL);
|
|
208
|
+
bc.onmessage = (event) => {
|
|
209
|
+
validateAndSettle(event.data);
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
// BroadcastChannel unsupported — rely on postMessage only.
|
|
214
|
+
}
|
|
184
215
|
timeoutId = setTimeout(() => {
|
|
185
216
|
settle(new Error("OAuth authentication timed out. Ensure your callback page " +
|
|
186
217
|
"renders <OAuthCallbackHandler /> from @stigmer/react at " +
|
|
187
218
|
"the URL configured as your OAuth redirect URI."));
|
|
188
219
|
closePopup(popup);
|
|
189
220
|
}, POPUP_CALLBACK_TIMEOUT_MS);
|
|
221
|
+
// COOP providers make popup.closed appear true immediately after
|
|
222
|
+
// cross-origin navigation. Wait a grace period before treating it
|
|
223
|
+
// as a real user-initiated close.
|
|
224
|
+
let popupClosedAt = null;
|
|
190
225
|
pollId = setInterval(() => {
|
|
191
226
|
if (popup.closed) {
|
|
192
|
-
|
|
227
|
+
if (popupClosedAt === null) {
|
|
228
|
+
popupClosedAt = Date.now();
|
|
229
|
+
}
|
|
230
|
+
else if (Date.now() - popupClosedAt > POPUP_CLOSED_GRACE_MS) {
|
|
231
|
+
settle(new Error("The authentication window was closed before completing sign-in."));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
popupClosedAt = null;
|
|
193
236
|
}
|
|
194
237
|
}, 500);
|
|
195
238
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMcpServerOAuthConnect.js","sourceRoot":"","sources":["../../src/mcp-server/useMcpServerOAuthConnect.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EACL,+BAA+B,EAC/B,+BAA+B,EAC/B,kBAAkB,GACnB,MAAM,uDAAuD,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"useMcpServerOAuthConnect.js","sourceRoot":"","sources":["../../src/mcp-server/useMcpServerOAuthConnect.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stigmer/react",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.83",
|
|
4
4
|
"description": "React provider and client hook for the Stigmer platform SDK",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
}
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@stigmer/theme": "0.0.
|
|
38
|
+
"@stigmer/theme": "0.0.83",
|
|
39
39
|
"react-markdown": "^10.1.0",
|
|
40
40
|
"remark-gfm": "^4.0.1",
|
|
41
41
|
"yaml": "^2.8.2"
|
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
"peerDependencies": {
|
|
44
44
|
"@base-ui/react": "^1.0.0",
|
|
45
45
|
"@bufbuild/protobuf": "^2.0.0",
|
|
46
|
-
"@stigmer/protos": "0.0.
|
|
47
|
-
"@stigmer/sdk": "0.0.
|
|
46
|
+
"@stigmer/protos": "0.0.83",
|
|
47
|
+
"@stigmer/sdk": "0.0.83",
|
|
48
48
|
"react": "^19.0.0",
|
|
49
49
|
"react-dom": "^19.0.0"
|
|
50
50
|
}
|
|
@@ -76,6 +76,16 @@ export interface McpServerOAuthSignInProps {
|
|
|
76
76
|
readonly error: Error | null;
|
|
77
77
|
/** Clear the OAuth error state. */
|
|
78
78
|
readonly onClearError: () => void;
|
|
79
|
+
/**
|
|
80
|
+
* `true` when the platform's OAuth app is pending vendor approval.
|
|
81
|
+
* Disables the sign-in button and shows an informational message.
|
|
82
|
+
*/
|
|
83
|
+
readonly isVendorApprovalPending?: boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Documentation URL for bringing your own OAuth token.
|
|
86
|
+
* Shown as a help link when `isVendorApprovalPending` is `true`.
|
|
87
|
+
*/
|
|
88
|
+
readonly vendorApprovalDocsUrl?: string | null;
|
|
79
89
|
}
|
|
80
90
|
|
|
81
91
|
// ---------------------------------------------------------------------------
|
|
@@ -113,6 +123,18 @@ export interface McpServerConfigPanelProps {
|
|
|
113
123
|
readonly onEnabledToolsChange: (enabledTools: string[]) => void;
|
|
114
124
|
/** Called when the user clicks "Back" to return to the picker list. */
|
|
115
125
|
readonly onBack: () => void;
|
|
126
|
+
/**
|
|
127
|
+
* When provided, a "Enter token manually" link is shown below the
|
|
128
|
+
* OAuth sign-in section. Clicking it switches the panel to manual
|
|
129
|
+
* token entry mode — the caller is responsible for updating the
|
|
130
|
+
* `credentials` and `oauthSignIn` props accordingly.
|
|
131
|
+
*/
|
|
132
|
+
readonly onSwitchToManual?: () => void;
|
|
133
|
+
/**
|
|
134
|
+
* When provided, a "Sign in with OAuth instead" link is shown near
|
|
135
|
+
* the credentials form. Clicking it reverts to the OAuth flow.
|
|
136
|
+
*/
|
|
137
|
+
readonly onSwitchToOAuth?: () => void;
|
|
116
138
|
/** Error to display inline (e.g., from credential submission failure). */
|
|
117
139
|
readonly error?: Error | null;
|
|
118
140
|
/** Disables all interaction. */
|
|
@@ -179,6 +201,8 @@ export function McpServerConfigPanel({
|
|
|
179
201
|
enabledTools,
|
|
180
202
|
onEnabledToolsChange,
|
|
181
203
|
onBack,
|
|
204
|
+
onSwitchToManual,
|
|
205
|
+
onSwitchToOAuth,
|
|
182
206
|
error,
|
|
183
207
|
disabled,
|
|
184
208
|
className,
|
|
@@ -257,9 +281,23 @@ export function McpServerConfigPanel({
|
|
|
257
281
|
onSignIn={oauthSignIn.onSignIn}
|
|
258
282
|
error={oauthSignIn.error}
|
|
259
283
|
onClearError={oauthSignIn.onClearError}
|
|
284
|
+
isVendorApprovalPending={oauthSignIn.isVendorApprovalPending}
|
|
285
|
+
vendorApprovalDocsUrl={oauthSignIn.vendorApprovalDocsUrl}
|
|
286
|
+
onSwitchToManual={onSwitchToManual}
|
|
260
287
|
/>
|
|
261
288
|
)}
|
|
262
289
|
|
|
290
|
+
{/* Switch back to OAuth — shown in manual override mode */}
|
|
291
|
+
{!oauthSignIn && onSwitchToOAuth && (
|
|
292
|
+
<button
|
|
293
|
+
type="button"
|
|
294
|
+
onClick={onSwitchToOAuth}
|
|
295
|
+
className="text-[0.65rem] text-muted-foreground underline decoration-muted-foreground/40 underline-offset-2 hover:text-foreground hover:decoration-foreground"
|
|
296
|
+
>
|
|
297
|
+
Sign in with OAuth instead
|
|
298
|
+
</button>
|
|
299
|
+
)}
|
|
300
|
+
|
|
263
301
|
{/* Credentials form — only when credentials prop is provided */}
|
|
264
302
|
{credentials && (
|
|
265
303
|
<EnvVarForm
|
|
@@ -308,6 +346,9 @@ function InlineOAuthSignIn({
|
|
|
308
346
|
onSignIn,
|
|
309
347
|
error,
|
|
310
348
|
onClearError,
|
|
349
|
+
isVendorApprovalPending,
|
|
350
|
+
vendorApprovalDocsUrl,
|
|
351
|
+
onSwitchToManual,
|
|
311
352
|
}: {
|
|
312
353
|
readonly serverName: string;
|
|
313
354
|
readonly isConnected: boolean;
|
|
@@ -315,6 +356,9 @@ function InlineOAuthSignIn({
|
|
|
315
356
|
readonly onSignIn: () => void;
|
|
316
357
|
readonly error: Error | null;
|
|
317
358
|
readonly onClearError: () => void;
|
|
359
|
+
readonly isVendorApprovalPending?: boolean;
|
|
360
|
+
readonly vendorApprovalDocsUrl?: string | null;
|
|
361
|
+
readonly onSwitchToManual?: () => void;
|
|
318
362
|
}) {
|
|
319
363
|
const isBusy =
|
|
320
364
|
phase === "initiating" ||
|
|
@@ -322,28 +366,38 @@ function InlineOAuthSignIn({
|
|
|
322
366
|
phase === "completing" ||
|
|
323
367
|
phase === "connecting";
|
|
324
368
|
|
|
369
|
+
const signInDisabled = isBusy || !!isVendorApprovalPending;
|
|
370
|
+
|
|
325
371
|
return (
|
|
326
372
|
<div className="space-y-1.5">
|
|
327
373
|
<div className="flex items-center justify-between">
|
|
328
374
|
<span
|
|
329
375
|
className={cn(
|
|
330
376
|
"inline-flex items-center gap-1 text-[0.65rem] font-medium",
|
|
331
|
-
isConnected
|
|
377
|
+
isConnected
|
|
378
|
+
? "text-success"
|
|
379
|
+
: isVendorApprovalPending
|
|
380
|
+
? "text-amber-600 dark:text-amber-400"
|
|
381
|
+
: "text-muted-foreground",
|
|
332
382
|
)}
|
|
333
383
|
>
|
|
334
384
|
<span
|
|
335
385
|
className={cn(
|
|
336
386
|
"size-1.5 rounded-full",
|
|
337
|
-
isConnected
|
|
387
|
+
isConnected
|
|
388
|
+
? "bg-success"
|
|
389
|
+
: isVendorApprovalPending
|
|
390
|
+
? "bg-amber-500"
|
|
391
|
+
: "bg-muted-foreground",
|
|
338
392
|
)}
|
|
339
393
|
aria-hidden="true"
|
|
340
394
|
/>
|
|
341
|
-
{isConnected ? "Signed in" : "Sign-in required"}
|
|
395
|
+
{isConnected ? "Signed in" : isVendorApprovalPending ? "Pending approval" : "Sign-in required"}
|
|
342
396
|
</span>
|
|
343
397
|
<button
|
|
344
398
|
type="button"
|
|
345
399
|
onClick={onSignIn}
|
|
346
|
-
disabled={
|
|
400
|
+
disabled={signInDisabled}
|
|
347
401
|
className={cn(
|
|
348
402
|
"inline-flex items-center gap-1 rounded px-2 py-0.5 text-[0.65rem] font-medium",
|
|
349
403
|
isConnected
|
|
@@ -361,6 +415,21 @@ function InlineOAuthSignIn({
|
|
|
361
415
|
)}
|
|
362
416
|
</button>
|
|
363
417
|
</div>
|
|
418
|
+
{isVendorApprovalPending && !isConnected && (
|
|
419
|
+
<div className="text-[0.65rem] text-amber-700 dark:text-amber-300">
|
|
420
|
+
<p>OAuth sign-in is pending vendor approval.</p>
|
|
421
|
+
{vendorApprovalDocsUrl && (
|
|
422
|
+
<a
|
|
423
|
+
href={vendorApprovalDocsUrl}
|
|
424
|
+
target="_blank"
|
|
425
|
+
rel="noopener noreferrer"
|
|
426
|
+
className="underline decoration-amber-600/40 underline-offset-2 hover:decoration-amber-600 dark:decoration-amber-400/40 dark:hover:decoration-amber-400"
|
|
427
|
+
>
|
|
428
|
+
Learn how to bring your own token
|
|
429
|
+
</a>
|
|
430
|
+
)}
|
|
431
|
+
</div>
|
|
432
|
+
)}
|
|
364
433
|
{error && (
|
|
365
434
|
<div className="flex items-start gap-1.5 text-[0.65rem] text-destructive">
|
|
366
435
|
<span className="flex-1">{error.message}</span>
|
|
@@ -373,6 +442,15 @@ function InlineOAuthSignIn({
|
|
|
373
442
|
</button>
|
|
374
443
|
</div>
|
|
375
444
|
)}
|
|
445
|
+
{onSwitchToManual && !isConnected && !isBusy && (
|
|
446
|
+
<button
|
|
447
|
+
type="button"
|
|
448
|
+
onClick={onSwitchToManual}
|
|
449
|
+
className="text-[0.65rem] text-muted-foreground underline decoration-muted-foreground/40 underline-offset-2 hover:text-foreground hover:decoration-foreground"
|
|
450
|
+
>
|
|
451
|
+
Enter token manually
|
|
452
|
+
</button>
|
|
453
|
+
)}
|
|
376
454
|
</div>
|
|
377
455
|
);
|
|
378
456
|
}
|