@stigmer/react 0.0.78 → 0.0.80
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/agent/AgentDetailView.js +2 -2
- package/agent/AgentDetailView.js.map +1 -1
- package/agent/agentSetupReducer.d.ts +3 -3
- package/agent/agentSetupReducer.d.ts.map +1 -1
- package/agent/index.d.ts +1 -1
- package/agent/index.d.ts.map +1 -1
- package/agent/index.js +1 -1
- package/agent/index.js.map +1 -1
- package/agent/useAgentSetup.d.ts +4 -4
- package/agent/useAgentSetup.js +9 -9
- package/agent/useAgentSetup.js.map +1 -1
- package/environment/EnvVarForm.d.ts +9 -3
- package/environment/EnvVarForm.d.ts.map +1 -1
- package/environment/EnvVarForm.js +1 -1
- package/environment/EnvVarForm.js.map +1 -1
- package/environment/EnvironmentListPanel.d.ts +19 -4
- package/environment/EnvironmentListPanel.d.ts.map +1 -1
- package/environment/EnvironmentListPanel.js +7 -3
- package/environment/EnvironmentListPanel.js.map +1 -1
- package/environment/{diffEnvSpec.d.ts → diffEnv.d.ts} +9 -8
- package/environment/diffEnv.d.ts.map +1 -0
- package/environment/{diffEnvSpec.js → diffEnv.js} +10 -9
- package/environment/diffEnv.js.map +1 -0
- 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/execution/SessionVariablesInput.d.ts +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/library/parse-resource-yaml.d.ts +1 -1
- package/library/parse-resource-yaml.d.ts.map +1 -1
- package/library/parse-resource-yaml.js +26 -16
- package/library/parse-resource-yaml.js.map +1 -1
- package/library/serialize-resource-yaml.js +17 -21
- package/library/serialize-resource-yaml.js.map +1 -1
- package/mcp-server/McpServerDetailView.d.ts +8 -1
- package/mcp-server/McpServerDetailView.d.ts.map +1 -1
- package/mcp-server/McpServerDetailView.js +27 -6
- package/mcp-server/McpServerDetailView.js.map +1 -1
- package/mcp-server/McpServerPicker.d.ts +8 -1
- package/mcp-server/McpServerPicker.d.ts.map +1 -1
- package/mcp-server/McpServerPicker.js +2 -2
- package/mcp-server/McpServerPicker.js.map +1 -1
- package/mcp-server/OAuthCallbackHandler.d.ts +2 -0
- package/mcp-server/OAuthCallbackHandler.d.ts.map +1 -1
- package/mcp-server/OAuthCallbackHandler.js.map +1 -1
- package/mcp-server/index.d.ts +2 -0
- package/mcp-server/index.d.ts.map +1 -1
- package/mcp-server/index.js +1 -0
- package/mcp-server/index.js.map +1 -1
- package/mcp-server/mcpServerSetupReducer.d.ts +4 -4
- package/mcp-server/useMcpServerConnect.d.ts +15 -12
- package/mcp-server/useMcpServerConnect.d.ts.map +1 -1
- package/mcp-server/useMcpServerConnect.js +17 -17
- package/mcp-server/useMcpServerConnect.js.map +1 -1
- package/mcp-server/useMcpServerCredentials.d.ts +32 -17
- package/mcp-server/useMcpServerCredentials.d.ts.map +1 -1
- package/mcp-server/useMcpServerCredentials.js +30 -19
- package/mcp-server/useMcpServerCredentials.js.map +1 -1
- package/mcp-server/useMcpServerOAuthConnect.d.ts +4 -3
- package/mcp-server/useMcpServerOAuthConnect.d.ts.map +1 -1
- package/mcp-server/useMcpServerOAuthConnect.js +16 -4
- package/mcp-server/useMcpServerOAuthConnect.js.map +1 -1
- package/mcp-server/useMcpServerSetup.d.ts +5 -5
- package/mcp-server/useMcpServerSetup.d.ts.map +1 -1
- package/mcp-server/useMcpServerSetup.js +33 -13
- package/mcp-server/useMcpServerSetup.js.map +1 -1
- package/mcp-server/useOAuthGrantStatus.d.ts +41 -0
- package/mcp-server/useOAuthGrantStatus.d.ts.map +1 -0
- package/mcp-server/useOAuthGrantStatus.js +91 -0
- package/mcp-server/useOAuthGrantStatus.js.map +1 -0
- package/package.json +4 -4
- package/src/agent/AgentDetailView.tsx +5 -5
- package/src/agent/agentSetupReducer.ts +3 -3
- package/src/agent/index.ts +1 -1
- package/src/agent/useAgentSetup.ts +11 -11
- package/src/environment/EnvVarForm.tsx +9 -3
- package/src/environment/EnvironmentListPanel.tsx +27 -9
- package/src/environment/{diffEnvSpec.ts → diffEnv.ts} +10 -9
- package/src/environment/index.ts +1 -1
- package/src/execution/SessionVariablesInput.tsx +1 -1
- package/src/index.ts +4 -2
- package/src/library/parse-resource-yaml.ts +27 -18
- package/src/library/serialize-resource-yaml.ts +20 -27
- package/src/mcp-server/McpServerDetailView.tsx +39 -7
- package/src/mcp-server/McpServerPicker.tsx +9 -1
- package/src/mcp-server/OAuthCallbackHandler.tsx +2 -0
- package/src/mcp-server/index.ts +3 -0
- package/src/mcp-server/mcpServerSetupReducer.ts +4 -4
- package/src/mcp-server/useMcpServerConnect.ts +25 -22
- package/src/mcp-server/useMcpServerCredentials.ts +65 -32
- package/src/mcp-server/useMcpServerOAuthConnect.ts +20 -6
- package/src/mcp-server/useMcpServerSetup.ts +38 -15
- package/src/mcp-server/useOAuthGrantStatus.ts +125 -0
- package/environment/diffEnvSpec.d.ts.map +0 -1
- package/environment/diffEnvSpec.js.map +0 -1
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useCallback, useMemo } from "react";
|
|
3
3
|
import { usePersonalEnvironment } from "../environment/usePersonalEnvironment";
|
|
4
|
-
import {
|
|
4
|
+
import { diffEnv } from "../environment/diffEnv";
|
|
5
5
|
import { SYSTEM_ENV_VAR_KEYS } from "../environment/systemEnvVars";
|
|
6
|
+
import { useOAuthGrantStatus } from "./useOAuthGrantStatus";
|
|
6
7
|
/**
|
|
7
8
|
* Checks the user's personal environment against an MCP server's
|
|
8
|
-
* `
|
|
9
|
+
* `env` declarations and provides a mechanism to save missing credentials.
|
|
9
10
|
*
|
|
10
11
|
* Designed for the discovery flow on the MCP server detail page:
|
|
11
12
|
* before triggering discovery, the UI needs to ensure all required
|
|
@@ -14,10 +15,12 @@ import { SYSTEM_ENV_VAR_KEYS } from "../environment/systemEnvVars";
|
|
|
14
15
|
* them.
|
|
15
16
|
*
|
|
16
17
|
* **Auth-mode-aware**: when `spec.auth` is configured, the hook
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
18
|
+
* composes {@link useOAuthGrantStatus} to determine whether the
|
|
19
|
+
* OAuth-managed variable (`target_env_var`) is connected via an
|
|
20
|
+
* active grant. The OAuth variable is excluded from `missingVariables`
|
|
21
|
+
* — it is acquired via {@link useMcpServerOAuthConnect}, not a manual
|
|
22
|
+
* form. Additional non-OAuth vars still appear in `missingVariables`
|
|
23
|
+
* (mixed mode).
|
|
21
24
|
*
|
|
22
25
|
* Unlike {@link useMcpServerSetup} which manages multi-server setup
|
|
23
26
|
* for session creation, this hook is scoped to a single server and
|
|
@@ -53,40 +56,48 @@ export function useMcpServerCredentials(org, mcpServer) {
|
|
|
53
56
|
const authMode = auth ? "oauth" : "manual";
|
|
54
57
|
const oauthTargetEnvVar = auth?.targetEnvVar || null;
|
|
55
58
|
const tokenLifetimeHint = auth?.tokenLifetimeHint || null;
|
|
59
|
+
const grantStatus = useOAuthGrantStatus(authMode === "oauth" ? (mcpServer?.metadata?.id ?? null) : null, authMode === "oauth" ? org : null);
|
|
60
|
+
const isOAuthConnected = authMode === "oauth" && grantStatus.connected;
|
|
56
61
|
const existingKeys = useMemo(() => new Set(Object.keys(personalEnv.environment?.spec?.data ?? {})), [personalEnv.environment]);
|
|
57
|
-
const isOAuthConnected = authMode === "oauth"
|
|
58
|
-
&& oauthTargetEnvVar !== null
|
|
59
|
-
&& existingKeys.has(oauthTargetEnvVar);
|
|
60
62
|
const allMissingVariables = useMemo(() => {
|
|
61
63
|
if (!mcpServer)
|
|
62
64
|
return [];
|
|
63
|
-
const
|
|
64
|
-
if (!
|
|
65
|
+
const envDeclarations = mcpServer.spec?.env;
|
|
66
|
+
if (!envDeclarations || Object.keys(envDeclarations).length === 0)
|
|
65
67
|
return [];
|
|
66
|
-
return
|
|
68
|
+
return diffEnv(envDeclarations, existingKeys).filter((v) => !SYSTEM_ENV_VAR_KEYS.has(v.key));
|
|
67
69
|
}, [mcpServer, existingKeys]);
|
|
70
|
+
const requiredMissing = useMemo(() => allMissingVariables.filter((v) => !v.optional), [allMissingVariables]);
|
|
68
71
|
const missingVariables = useMemo(() => {
|
|
69
72
|
if (!oauthTargetEnvVar)
|
|
70
|
-
return
|
|
71
|
-
return
|
|
72
|
-
}, [
|
|
73
|
-
const isReady = !personalEnv.isLoading &&
|
|
73
|
+
return requiredMissing;
|
|
74
|
+
return requiredMissing.filter((v) => v.key !== oauthTargetEnvVar);
|
|
75
|
+
}, [requiredMissing, oauthTargetEnvVar]);
|
|
76
|
+
const isReady = !personalEnv.isLoading &&
|
|
77
|
+
!grantStatus.isLoading &&
|
|
78
|
+
missingVariables.length === 0 &&
|
|
79
|
+
(authMode === "manual" || isOAuthConnected);
|
|
74
80
|
const saveCredentials = useCallback(async (values) => {
|
|
75
81
|
await personalEnv.getOrCreate();
|
|
76
82
|
await personalEnv.addVariables(values);
|
|
77
83
|
}, [personalEnv]);
|
|
84
|
+
const refetch = useCallback(() => {
|
|
85
|
+
personalEnv.refetch();
|
|
86
|
+
grantStatus.refetch();
|
|
87
|
+
}, [personalEnv, grantStatus]);
|
|
78
88
|
return {
|
|
79
89
|
authMode,
|
|
80
90
|
oauthTargetEnvVar,
|
|
81
91
|
isOAuthConnected,
|
|
92
|
+
accessTokenExpiresAt: grantStatus.accessTokenExpiresAt,
|
|
82
93
|
tokenLifetimeHint,
|
|
83
94
|
missingVariables,
|
|
84
95
|
isReady,
|
|
85
|
-
isLoading: personalEnv.isLoading,
|
|
86
|
-
error: personalEnv.error,
|
|
96
|
+
isLoading: personalEnv.isLoading || grantStatus.isLoading,
|
|
97
|
+
error: personalEnv.error ?? grantStatus.error,
|
|
87
98
|
saveCredentials,
|
|
88
99
|
isSaving: personalEnv.isMutating,
|
|
89
|
-
refetch
|
|
100
|
+
refetch,
|
|
90
101
|
};
|
|
91
102
|
}
|
|
92
103
|
//# 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;AAG7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"useMcpServerCredentials.js","sourceRoot":"","sources":["../../src/mcp-server/useMcpServerCredentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,14 +32,15 @@ export interface UseMcpServerOAuthConnectReturn {
|
|
|
32
32
|
* blockers.
|
|
33
33
|
*
|
|
34
34
|
* @param mcpServerId - System-generated ID (metadata.id) of the MCP server.
|
|
35
|
+
* @param org - Organization context for token storage (caller's active org).
|
|
35
36
|
* @returns The updated McpServer after tool discovery completes.
|
|
36
37
|
*/
|
|
37
|
-
readonly startOAuth: (mcpServerId: string) => Promise<McpServer>;
|
|
38
|
+
readonly startOAuth: (mcpServerId: string, org: string) => Promise<McpServer>;
|
|
38
39
|
/** `true` while any phase of the OAuth flow is in progress. */
|
|
39
40
|
readonly isInProgress: boolean;
|
|
40
41
|
/** Current phase of the OAuth flow. */
|
|
41
42
|
readonly phase: OAuthConnectPhase;
|
|
42
|
-
/** Error from the most recent
|
|
43
|
+
/** Error from the most recent unsuccessful attempt, or `null`. */
|
|
43
44
|
readonly error: Error | null;
|
|
44
45
|
/** Reset the hook to idle state, clearing any error. */
|
|
45
46
|
readonly clearError: () => void;
|
|
@@ -65,7 +66,7 @@ export interface UseMcpServerOAuthConnectReturn {
|
|
|
65
66
|
*
|
|
66
67
|
* async function handleSignIn() {
|
|
67
68
|
* try {
|
|
68
|
-
* await oauth.startOAuth(mcpServer.metadata.id);
|
|
69
|
+
* await oauth.startOAuth(mcpServer.metadata.id, org);
|
|
69
70
|
* refetch();
|
|
70
71
|
* } catch {
|
|
71
72
|
* // error is available via oauth.error
|
|
@@ -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;
|
|
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;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9E,+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,CAiHzE"}
|
|
@@ -3,6 +3,7 @@ import { useCallback, useEffect, useRef, useState } from "react";
|
|
|
3
3
|
import { create } from "@bufbuild/protobuf";
|
|
4
4
|
import { InitiateOAuthConnectInputSchema, CompleteOAuthConnectInputSchema, ConnectInputSchema, } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/io_pb";
|
|
5
5
|
import { useStigmer } from "../hooks";
|
|
6
|
+
import { resolveSystemEnvVarValues } from "../environment/systemEnvVars";
|
|
6
7
|
import { toError } from "../internal/toError";
|
|
7
8
|
/**
|
|
8
9
|
* Message type posted by {@link OAuthCallbackHandler} to the opener window.
|
|
@@ -34,7 +35,7 @@ const POPUP_CALLBACK_TIMEOUT_MS = 120_000;
|
|
|
34
35
|
*
|
|
35
36
|
* async function handleSignIn() {
|
|
36
37
|
* try {
|
|
37
|
-
* await oauth.startOAuth(mcpServer.metadata.id);
|
|
38
|
+
* await oauth.startOAuth(mcpServer.metadata.id, org);
|
|
38
39
|
* refetch();
|
|
39
40
|
* } catch {
|
|
40
41
|
* // error is available via oauth.error
|
|
@@ -61,7 +62,7 @@ export function useMcpServerOAuthConnect() {
|
|
|
61
62
|
setPhase("idle");
|
|
62
63
|
setError(null);
|
|
63
64
|
}, []);
|
|
64
|
-
const startOAuth = useCallback(async (mcpServerId) => {
|
|
65
|
+
const startOAuth = useCallback(async (mcpServerId, org) => {
|
|
65
66
|
setPhase("initiating");
|
|
66
67
|
setError(null);
|
|
67
68
|
cleanupRef.current?.();
|
|
@@ -77,7 +78,7 @@ export function useMcpServerOAuthConnect() {
|
|
|
77
78
|
}
|
|
78
79
|
popupRef.current = popup;
|
|
79
80
|
try {
|
|
80
|
-
const initOutput = await stigmer.mcpServer.initiateOAuthConnect(create(InitiateOAuthConnectInputSchema, { mcpServerId }));
|
|
81
|
+
const initOutput = await stigmer.mcpServer.initiateOAuthConnect(create(InitiateOAuthConnectInputSchema, { mcpServerId, org }));
|
|
81
82
|
popup.location.href = initOutput.authorizationUrl;
|
|
82
83
|
setPhase("awaiting-callback");
|
|
83
84
|
const { code, state } = await waitForOAuthCallback(popup, initOutput.state, (dispose) => {
|
|
@@ -90,7 +91,18 @@ export function useMcpServerOAuthConnect() {
|
|
|
90
91
|
state,
|
|
91
92
|
}));
|
|
92
93
|
setPhase("connecting");
|
|
93
|
-
const
|
|
94
|
+
const systemEnv = await resolveSystemEnvVarValues(stigmer);
|
|
95
|
+
const runtimeEnvMap = {};
|
|
96
|
+
for (const [key, envInput] of Object.entries(systemEnv)) {
|
|
97
|
+
runtimeEnvMap[key] = {
|
|
98
|
+
value: envInput.value,
|
|
99
|
+
isSecret: envInput.isSecret ?? false,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const server = await stigmer.mcpServer.connect(create(ConnectInputSchema, {
|
|
103
|
+
mcpServerId,
|
|
104
|
+
runtimeEnv: runtimeEnvMap,
|
|
105
|
+
}));
|
|
94
106
|
setPhase("done");
|
|
95
107
|
return server;
|
|
96
108
|
}
|
|
@@ -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,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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"}
|
|
@@ -29,8 +29,8 @@ export interface UseMcpServerSetupReturn {
|
|
|
29
29
|
/**
|
|
30
30
|
* Add an MCP server to the setup flow.
|
|
31
31
|
*
|
|
32
|
-
* Fetches the full server resource, checks `
|
|
33
|
-
* personal environment, and resolves the entry to either `ready`
|
|
32
|
+
* Fetches the full server resource, checks `env` declarations against
|
|
33
|
+
* the personal environment, and resolves the entry to either `ready`
|
|
34
34
|
* (no credentials needed or all present) or `needsSetup` (missing
|
|
35
35
|
* variables). Also extracts discovered tools and approval policies
|
|
36
36
|
* for the tool selector.
|
|
@@ -104,8 +104,8 @@ export interface UseMcpServerSetupReturn {
|
|
|
104
104
|
* MCP servers selected in the {@link McpServerPicker}.
|
|
105
105
|
*
|
|
106
106
|
* When a user toggles an MCP server ON, this hook fetches the server's
|
|
107
|
-
* full resource, checks its `
|
|
108
|
-
* (via {@link
|
|
107
|
+
* full resource, checks its `env` declarations against the personal
|
|
108
|
+
* environment (via {@link diffEnv}), and determines whether credentials are
|
|
109
109
|
* needed. It also extracts discovered tools and approval policies for
|
|
110
110
|
* the tool selector UI.
|
|
111
111
|
*
|
|
@@ -131,7 +131,7 @@ export interface UseMcpServerSetupReturn {
|
|
|
131
131
|
* @param org - Organization slug. Pass `null` to disable.
|
|
132
132
|
* @param poolKeys - Optional set of env-var keys already available
|
|
133
133
|
* from the session env pool (manual secrets, one-time env vars from
|
|
134
|
-
* other components). When provided, servers whose `
|
|
134
|
+
* other components). When provided, servers whose `env` keys
|
|
135
135
|
* are fully covered by `poolKeys` + personal env auto-resolve to
|
|
136
136
|
* `ready` without prompting. Reactive — when `poolKeys` changes,
|
|
137
137
|
* `needsSetup` entries are re-evaluated.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMcpServerSetup.d.ts","sourceRoot":"","sources":["../../src/mcp-server/useMcpServerSetup.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"useMcpServerSetup.d.ts","sourceRoot":"","sources":["../../src/mcp-server/useMcpServerSetup.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAoBlF,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,iEAAiE;AACjE,MAAM,WAAW,uBAAuB;IACtC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,iDAAiD;AACjD,MAAM,WAAW,uBAAuB;IACtC;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,yBAAyB,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAElG;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAExD;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IAElD;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,aAAa,EAAE,CACtB,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACnC,OAAO,CAAC,EAAE,uBAAuB,KAC9B,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnB;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAEtE,6EAA6E;IAC7E,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IAEhD,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;IAE3B;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAEjC;;;;;;OAMG;IACH,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAExD;;;;;;OAMG;IACH,QAAQ,CAAC,WAAW,EAAE,mBAAmB,EAAE,CAAC;CAC7C;AA2BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACrB,uBAAuB,CAqRzB"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useCallback, useEffect, useMemo, useReducer, useRef } from "react";
|
|
3
|
+
import { create } from "@bufbuild/protobuf";
|
|
4
|
+
import { GetOAuthGrantStatusInputSchema } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/io_pb";
|
|
3
5
|
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
4
6
|
import { useStigmer } from "../hooks";
|
|
5
7
|
import { usePersonalEnvironment } from "../environment/usePersonalEnvironment";
|
|
6
|
-
import {
|
|
8
|
+
import { diffEnv } from "../environment/diffEnv";
|
|
7
9
|
import { toError } from "../internal/toError";
|
|
8
10
|
import { mcpServerSetupReducer, INITIAL_MCP_SETUP_STATE, toServerKey, } from "./mcpServerSetupReducer";
|
|
9
11
|
export { toServerKey } from "./mcpServerSetupReducer";
|
|
@@ -32,8 +34,8 @@ function computeDefaultEnabledTools(mcpServer, discoveredTools) {
|
|
|
32
34
|
* MCP servers selected in the {@link McpServerPicker}.
|
|
33
35
|
*
|
|
34
36
|
* When a user toggles an MCP server ON, this hook fetches the server's
|
|
35
|
-
* full resource, checks its `
|
|
36
|
-
* (via {@link
|
|
37
|
+
* full resource, checks its `env` declarations against the personal
|
|
38
|
+
* environment (via {@link diffEnv}), and determines whether credentials are
|
|
37
39
|
* needed. It also extracts discovered tools and approval policies for
|
|
38
40
|
* the tool selector UI.
|
|
39
41
|
*
|
|
@@ -59,7 +61,7 @@ function computeDefaultEnabledTools(mcpServer, discoveredTools) {
|
|
|
59
61
|
* @param org - Organization slug. Pass `null` to disable.
|
|
60
62
|
* @param poolKeys - Optional set of env-var keys already available
|
|
61
63
|
* from the session env pool (manual secrets, one-time env vars from
|
|
62
|
-
* other components). When provided, servers whose `
|
|
64
|
+
* other components). When provided, servers whose `env` keys
|
|
63
65
|
* are fully covered by `poolKeys` + personal env auto-resolve to
|
|
64
66
|
* `ready` without prompting. Reactive — when `poolKeys` changes,
|
|
65
67
|
* `needsSetup` entries are re-evaluated.
|
|
@@ -108,8 +110,8 @@ export function useMcpServerSetup(org, poolKeys) {
|
|
|
108
110
|
const mcpServer = await stigmer.mcpServer.getByReference(ref);
|
|
109
111
|
const discoveredTools = mcpServer.status?.discoveredCapabilities?.tools ?? [];
|
|
110
112
|
const toolApprovals = mcpServer.spec?.pinnedToolApprovals ?? [];
|
|
111
|
-
const
|
|
112
|
-
if (!
|
|
113
|
+
const envDeclarations = mcpServer.spec?.env;
|
|
114
|
+
if (!envDeclarations || Object.keys(envDeclarations).length === 0) {
|
|
113
115
|
dispatch({
|
|
114
116
|
type: "RESOLVE_READY",
|
|
115
117
|
key,
|
|
@@ -121,8 +123,25 @@ export function useMcpServerSetup(org, poolKeys) {
|
|
|
121
123
|
return;
|
|
122
124
|
}
|
|
123
125
|
const existingKeys = new Set(Object.keys(personalEnv.environment?.spec?.data ?? {}));
|
|
124
|
-
const
|
|
125
|
-
if (
|
|
126
|
+
const auth = mcpServer.spec?.auth;
|
|
127
|
+
if (auth?.targetEnvVar && mcpServer.metadata?.id) {
|
|
128
|
+
try {
|
|
129
|
+
const grantStatus = await stigmer.mcpServer.getOAuthGrantStatus(create(GetOAuthGrantStatusInputSchema, {
|
|
130
|
+
resourceId: mcpServer.metadata.id,
|
|
131
|
+
org,
|
|
132
|
+
}));
|
|
133
|
+
if (grantStatus.connected) {
|
|
134
|
+
existingKeys.add(auth.targetEnvVar);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Non-fatal: if grant status lookup fails, the OAuth var stays
|
|
139
|
+
// in missingVariables and the UI shows the sign-in button.
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const allMissing = diffEnv(envDeclarations, existingKeys, poolKeys);
|
|
143
|
+
const requiredMissing = allMissing.filter((v) => !v.optional);
|
|
144
|
+
if (requiredMissing.length === 0) {
|
|
126
145
|
dispatch({
|
|
127
146
|
type: "RESOLVE_READY",
|
|
128
147
|
key,
|
|
@@ -137,7 +156,7 @@ export function useMcpServerSetup(org, poolKeys) {
|
|
|
137
156
|
type: "RESOLVE_NEEDS_SETUP",
|
|
138
157
|
key,
|
|
139
158
|
mcpServer,
|
|
140
|
-
missingVariables,
|
|
159
|
+
missingVariables: requiredMissing,
|
|
141
160
|
discoveredTools,
|
|
142
161
|
toolApprovals,
|
|
143
162
|
});
|
|
@@ -215,12 +234,13 @@ export function useMcpServerSetup(org, poolKeys) {
|
|
|
215
234
|
for (const [key, entry] of Object.entries(entriesRef.current)) {
|
|
216
235
|
if (entry.status !== "needsSetup")
|
|
217
236
|
continue;
|
|
218
|
-
const
|
|
219
|
-
if (!
|
|
237
|
+
const envDeclarations = entry.mcpServer.spec?.env;
|
|
238
|
+
if (!envDeclarations)
|
|
220
239
|
continue;
|
|
221
|
-
const
|
|
240
|
+
const allMissing = diffEnv(envDeclarations, personalKeys, poolKeys);
|
|
241
|
+
const requiredMissing = allMissing.filter((v) => !v.optional);
|
|
222
242
|
const enabledTools = computeDefaultEnabledTools(entry.mcpServer, entry.discoveredTools);
|
|
223
|
-
dispatch({ type: "POOL_RESOLVE", key, missingVariables, enabledTools });
|
|
243
|
+
dispatch({ type: "POOL_RESOLVE", key, missingVariables: requiredMissing, enabledTools });
|
|
224
244
|
}
|
|
225
245
|
}, [poolKeys, personalEnv.environment]);
|
|
226
246
|
// -------------------------------------------------------------------------
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMcpServerSetup.js","sourceRoot":"","sources":["../../src/mcp-server/useMcpServerSetup.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useMcpServerSetup.js","sourceRoot":"","sources":["../../src/mcp-server/useMcpServerSetup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** Return value of {@link useOAuthGrantStatus}. */
|
|
2
|
+
export interface UseOAuthGrantStatusReturn {
|
|
3
|
+
/** Whether the user has an active OAuth grant for this resource + org. */
|
|
4
|
+
readonly connected: boolean;
|
|
5
|
+
/**
|
|
6
|
+
* When the access token expires (Unix timestamp seconds).
|
|
7
|
+
* `BigInt(0)` when no grant exists or the token does not expire.
|
|
8
|
+
*/
|
|
9
|
+
readonly accessTokenExpiresAt: bigint;
|
|
10
|
+
/** The env var name managed by OAuth, or empty string when no grant exists. */
|
|
11
|
+
readonly targetEnvVar: string;
|
|
12
|
+
/** Auth method used (`"mcp_oauth"` or `"vendor_oauth"`), or empty string. */
|
|
13
|
+
readonly authMethod: string;
|
|
14
|
+
/** `true` while the grant status is being fetched. */
|
|
15
|
+
readonly isLoading: boolean;
|
|
16
|
+
/** Error from the last failed request, or `null` when healthy. */
|
|
17
|
+
readonly error: Error | null;
|
|
18
|
+
/** Discard cached data and re-fetch the grant status. */
|
|
19
|
+
readonly refetch: () => void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Data hook that fetches the OAuth grant status for a single MCP server.
|
|
23
|
+
*
|
|
24
|
+
* Wraps `stigmer.mcpServer.getOAuthGrantStatus()` with loading, error,
|
|
25
|
+
* and idle state management. When `resourceId` or `org` changes, the
|
|
26
|
+
* previous in-flight request is discarded and a fresh fetch begins.
|
|
27
|
+
*
|
|
28
|
+
* Pass `null` for either parameter to skip fetching (stable no-op).
|
|
29
|
+
* This is useful when the MCP server resource has not loaded yet.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```tsx
|
|
33
|
+
* const grantStatus = useOAuthGrantStatus(mcpServer?.metadata?.id ?? null, org);
|
|
34
|
+
*
|
|
35
|
+
* if (grantStatus.isLoading) return <Spinner />;
|
|
36
|
+
* if (grantStatus.connected) return <span>Connected via OAuth</span>;
|
|
37
|
+
* return <button onClick={startOAuth}>Sign in</button>;
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare function useOAuthGrantStatus(resourceId: string | null, org: string | null): UseOAuthGrantStatusReturn;
|
|
41
|
+
//# sourceMappingURL=useOAuthGrantStatus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOAuthGrantStatus.d.ts","sourceRoot":"","sources":["../../src/mcp-server/useOAuthGrantStatus.ts"],"names":[],"mappings":"AAQA,mDAAmD;AACnD,MAAM,WAAW,yBAAyB;IACxC,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,+EAA+E;IAC/E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,6EAA6E;IAC7E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,sDAAsD;IACtD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAcD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,GAAG,EAAE,MAAM,GAAG,IAAI,GACjB,yBAAyB,CA6D3B"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useEffect, useState } from "react";
|
|
3
|
+
import { create } from "@bufbuild/protobuf";
|
|
4
|
+
import { GetOAuthGrantStatusInputSchema } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/io_pb";
|
|
5
|
+
import { useStigmer } from "../hooks";
|
|
6
|
+
import { toError } from "../internal/toError";
|
|
7
|
+
const BIGINT_ZERO = BigInt(0);
|
|
8
|
+
const IDLE = {
|
|
9
|
+
connected: false,
|
|
10
|
+
accessTokenExpiresAt: BIGINT_ZERO,
|
|
11
|
+
targetEnvVar: "",
|
|
12
|
+
authMethod: "",
|
|
13
|
+
isLoading: false,
|
|
14
|
+
error: null,
|
|
15
|
+
refetch: () => { },
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Data hook that fetches the OAuth grant status for a single MCP server.
|
|
19
|
+
*
|
|
20
|
+
* Wraps `stigmer.mcpServer.getOAuthGrantStatus()` with loading, error,
|
|
21
|
+
* and idle state management. When `resourceId` or `org` changes, the
|
|
22
|
+
* previous in-flight request is discarded and a fresh fetch begins.
|
|
23
|
+
*
|
|
24
|
+
* Pass `null` for either parameter to skip fetching (stable no-op).
|
|
25
|
+
* This is useful when the MCP server resource has not loaded yet.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```tsx
|
|
29
|
+
* const grantStatus = useOAuthGrantStatus(mcpServer?.metadata?.id ?? null, org);
|
|
30
|
+
*
|
|
31
|
+
* if (grantStatus.isLoading) return <Spinner />;
|
|
32
|
+
* if (grantStatus.connected) return <span>Connected via OAuth</span>;
|
|
33
|
+
* return <button onClick={startOAuth}>Sign in</button>;
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export function useOAuthGrantStatus(resourceId, org) {
|
|
37
|
+
const stigmer = useStigmer();
|
|
38
|
+
const [connected, setConnected] = useState(false);
|
|
39
|
+
const [accessTokenExpiresAt, setAccessTokenExpiresAt] = useState(BIGINT_ZERO);
|
|
40
|
+
const [targetEnvVar, setTargetEnvVar] = useState("");
|
|
41
|
+
const [authMethod, setAuthMethod] = useState("");
|
|
42
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
43
|
+
const [error, setError] = useState(null);
|
|
44
|
+
const [fetchKey, setFetchKey] = useState(0);
|
|
45
|
+
const refetch = useCallback(() => setFetchKey((k) => k + 1), []);
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
if (!resourceId || !org) {
|
|
48
|
+
setConnected(false);
|
|
49
|
+
setAccessTokenExpiresAt(BIGINT_ZERO);
|
|
50
|
+
setTargetEnvVar("");
|
|
51
|
+
setAuthMethod("");
|
|
52
|
+
setIsLoading(false);
|
|
53
|
+
setError(null);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const cancelled = { current: false };
|
|
57
|
+
setIsLoading(true);
|
|
58
|
+
setError(null);
|
|
59
|
+
stigmer.mcpServer
|
|
60
|
+
.getOAuthGrantStatus(create(GetOAuthGrantStatusInputSchema, { resourceId, org }))
|
|
61
|
+
.then((result) => {
|
|
62
|
+
if (cancelled.current)
|
|
63
|
+
return;
|
|
64
|
+
setConnected(result.connected);
|
|
65
|
+
setAccessTokenExpiresAt(result.accessTokenExpiresAt);
|
|
66
|
+
setTargetEnvVar(result.targetEnvVar);
|
|
67
|
+
setAuthMethod(result.authMethod);
|
|
68
|
+
setIsLoading(false);
|
|
69
|
+
}, (err) => {
|
|
70
|
+
if (cancelled.current)
|
|
71
|
+
return;
|
|
72
|
+
setError(toError(err));
|
|
73
|
+
setIsLoading(false);
|
|
74
|
+
});
|
|
75
|
+
return () => {
|
|
76
|
+
cancelled.current = true;
|
|
77
|
+
};
|
|
78
|
+
}, [resourceId, org, stigmer, fetchKey]);
|
|
79
|
+
if (!resourceId || !org)
|
|
80
|
+
return { ...IDLE, refetch };
|
|
81
|
+
return {
|
|
82
|
+
connected,
|
|
83
|
+
accessTokenExpiresAt,
|
|
84
|
+
targetEnvVar,
|
|
85
|
+
authMethod,
|
|
86
|
+
isLoading,
|
|
87
|
+
error,
|
|
88
|
+
refetch,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=useOAuthGrantStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOAuthGrantStatus.js","sourceRoot":"","sources":["../../src/mcp-server/useOAuthGrantStatus.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.80",
|
|
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.80",
|
|
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.80",
|
|
47
|
+
"@stigmer/sdk": "0.0.80",
|
|
48
48
|
"react": "^19.0.0",
|
|
49
49
|
"react-dom": "^19.0.0"
|
|
50
50
|
}
|
|
@@ -9,7 +9,7 @@ import type {
|
|
|
9
9
|
SubAgent,
|
|
10
10
|
} from "@stigmer/protos/ai/stigmer/agentic/agent/v1/spec_pb";
|
|
11
11
|
import type { ApiResourceReference } from "@stigmer/protos/ai/stigmer/commons/apiresource/io_pb";
|
|
12
|
-
import type {
|
|
12
|
+
import type { EnvVarDeclaration } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/spec_pb";
|
|
13
13
|
import { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
|
|
14
14
|
import { useAgent } from "./useAgent";
|
|
15
15
|
import { ErrorMessage } from "../error/ErrorMessage";
|
|
@@ -155,8 +155,8 @@ export function AgentDetailView({
|
|
|
155
155
|
<SubAgentsSection subAgents={spec.subAgents} />
|
|
156
156
|
)}
|
|
157
157
|
|
|
158
|
-
{spec?.
|
|
159
|
-
<
|
|
158
|
+
{spec?.env && Object.keys(spec.env).length > 0 && (
|
|
159
|
+
<EnvSection data={spec.env} />
|
|
160
160
|
)}
|
|
161
161
|
</div>
|
|
162
162
|
);
|
|
@@ -534,10 +534,10 @@ function SubAgentDetails({
|
|
|
534
534
|
);
|
|
535
535
|
}
|
|
536
536
|
|
|
537
|
-
function
|
|
537
|
+
function EnvSection({
|
|
538
538
|
data,
|
|
539
539
|
}: {
|
|
540
|
-
readonly data: { [key: string]:
|
|
540
|
+
readonly data: { [key: string]: EnvVarDeclaration };
|
|
541
541
|
}) {
|
|
542
542
|
const entries = Object.entries(data).sort(([a], [b]) =>
|
|
543
543
|
a.localeCompare(b),
|
|
@@ -14,8 +14,8 @@ import type { AgentEnvFormVariable } from "./AgentEnvForm";
|
|
|
14
14
|
* existed). Use `instanceId` with `createSession`.
|
|
15
15
|
* - `"oneTime"` — Secrets were collected but **not** persisted. Pass
|
|
16
16
|
* `runtimeEnv` to `createExecution` for this run only.
|
|
17
|
-
* - `"direct"` — The agent has no `
|
|
18
|
-
* Create the session with `agentRef` directly.
|
|
17
|
+
* - `"direct"` — The agent has no `env` declarations and needs no
|
|
18
|
+
* secrets. Create the session with `agentRef` directly.
|
|
19
19
|
*/
|
|
20
20
|
export type AgentResolution =
|
|
21
21
|
| {
|
|
@@ -31,7 +31,7 @@ export type AgentResolution =
|
|
|
31
31
|
readonly runtimeEnv: Record<string, EnvVarInput>;
|
|
32
32
|
}
|
|
33
33
|
| {
|
|
34
|
-
/** The agent has no `
|
|
34
|
+
/** The agent has no `env` declarations and needs no secrets. */
|
|
35
35
|
readonly mode: "direct";
|
|
36
36
|
};
|
|
37
37
|
|