@slashfi/agents-sdk 0.90.2 → 0.90.5
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/dist/cjs/config-store.js +294 -54
- package/dist/cjs/config-store.js.map +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/mcp-client.js +77 -24
- package/dist/cjs/mcp-client.js.map +1 -1
- package/dist/config-store.d.ts +7 -0
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +294 -54
- package/dist/config-store.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-client.d.ts +5 -2
- package/dist/mcp-client.d.ts.map +1 -1
- package/dist/mcp-client.js +77 -24
- package/dist/mcp-client.js.map +1 -1
- package/package.json +1 -1
- package/src/config-store.test.ts +385 -0
- package/src/config-store.ts +408 -74
- package/src/index.ts +4 -1
- package/src/mcp-client.test.ts +80 -0
- package/src/mcp-client.ts +114 -31
package/dist/mcp-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../src/mcp-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../src/mcp-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/config-store.test.ts
CHANGED
|
@@ -842,6 +842,258 @@ describe("ADK ref.call() full auto-refresh flow", () => {
|
|
|
842
842
|
expect(status.fields?.access_token?.automated).toBe(false);
|
|
843
843
|
expect(status.fields?.access_token?.present).toBe(false);
|
|
844
844
|
});
|
|
845
|
+
|
|
846
|
+
test("ref.authStatus honors registry-declared authFields over oauth2 heuristics", async () => {
|
|
847
|
+
const platformRegPort = 19924;
|
|
848
|
+
const platformTool = defineTool({
|
|
849
|
+
name: "get_data",
|
|
850
|
+
description: "Platform minted bearer",
|
|
851
|
+
inputSchema: { type: "object" as const, properties: {} },
|
|
852
|
+
execute: async () => ({ ok: true }),
|
|
853
|
+
});
|
|
854
|
+
const platformAgent = defineAgent({
|
|
855
|
+
path: "platform-api",
|
|
856
|
+
entrypoint: "Platform bearer agent",
|
|
857
|
+
tools: [platformTool],
|
|
858
|
+
visibility: "public",
|
|
859
|
+
config: {
|
|
860
|
+
security: {
|
|
861
|
+
type: "oauth2",
|
|
862
|
+
flows: {
|
|
863
|
+
authorizationCode: {
|
|
864
|
+
authorizationUrl: "http://localhost/authorize",
|
|
865
|
+
tokenUrl: "http://localhost/token",
|
|
866
|
+
},
|
|
867
|
+
},
|
|
868
|
+
authFields: {
|
|
869
|
+
access_token: { required: true, automated: true },
|
|
870
|
+
},
|
|
871
|
+
},
|
|
872
|
+
},
|
|
873
|
+
});
|
|
874
|
+
const platformRegistry = createAgentRegistry();
|
|
875
|
+
platformRegistry.register(platformAgent);
|
|
876
|
+
const platformServer = createAgentServer(platformRegistry, {
|
|
877
|
+
port: platformRegPort,
|
|
878
|
+
});
|
|
879
|
+
await platformServer.start();
|
|
880
|
+
|
|
881
|
+
try {
|
|
882
|
+
const fs = createMemoryFs();
|
|
883
|
+
const adk = createAdk(fs, {
|
|
884
|
+
resolveCredentials: async ({ field }) =>
|
|
885
|
+
field === "access_token" ? "minted" : null,
|
|
886
|
+
});
|
|
887
|
+
|
|
888
|
+
await adk.registry.add({
|
|
889
|
+
name: "platform-reg",
|
|
890
|
+
url: `http://localhost:${platformRegPort}`,
|
|
891
|
+
});
|
|
892
|
+
await adk.ref.add({
|
|
893
|
+
ref: "platform-api",
|
|
894
|
+
name: "platform-api",
|
|
895
|
+
sourceRegistry: {
|
|
896
|
+
url: `http://localhost:${platformRegPort}`,
|
|
897
|
+
agentPath: "platform-api",
|
|
898
|
+
},
|
|
899
|
+
config: {},
|
|
900
|
+
});
|
|
901
|
+
|
|
902
|
+
const status = await adk.ref.authStatus("platform-api");
|
|
903
|
+
expect(status.fields?.access_token?.automated).toBe(true);
|
|
904
|
+
expect(status.fields?.access_token?.resolvable).toBe(true);
|
|
905
|
+
expect(status.complete).toBe(true);
|
|
906
|
+
|
|
907
|
+
const cacheRaw = await fs.readFile("registry-cache.json");
|
|
908
|
+
const cache = JSON.parse(cacheRaw!) as {
|
|
909
|
+
refs: Record<string, { authFields?: Record<string, unknown> }>;
|
|
910
|
+
};
|
|
911
|
+
expect(cache.refs["platform-api"].authFields).toEqual({
|
|
912
|
+
access_token: { required: true, automated: true },
|
|
913
|
+
});
|
|
914
|
+
} finally {
|
|
915
|
+
await platformServer.stop();
|
|
916
|
+
}
|
|
917
|
+
});
|
|
918
|
+
});
|
|
919
|
+
|
|
920
|
+
describe("ADK ref.call() resolveCredentials fallback", () => {
|
|
921
|
+
let registryServer: AgentServer;
|
|
922
|
+
const REG_PORT = 19922;
|
|
923
|
+
let receivedToken: string | undefined;
|
|
924
|
+
|
|
925
|
+
beforeAll(async () => {
|
|
926
|
+
const apiTool = defineTool({
|
|
927
|
+
name: "get_data",
|
|
928
|
+
description: "Echo accessToken",
|
|
929
|
+
inputSchema: { type: "object" as const, properties: {} },
|
|
930
|
+
execute: async (input: any) => {
|
|
931
|
+
receivedToken = input?.accessToken;
|
|
932
|
+
if (!receivedToken) {
|
|
933
|
+
return {
|
|
934
|
+
content: [{ type: "text", text: '{"error":"401 Unauthorized"}' }],
|
|
935
|
+
_httpStatus: 401,
|
|
936
|
+
};
|
|
937
|
+
}
|
|
938
|
+
return { ok: true, token: receivedToken };
|
|
939
|
+
},
|
|
940
|
+
});
|
|
941
|
+
|
|
942
|
+
const agent = defineAgent({
|
|
943
|
+
path: "resolved-api",
|
|
944
|
+
entrypoint: "Resolved creds agent",
|
|
945
|
+
tools: [apiTool],
|
|
946
|
+
visibility: "public",
|
|
947
|
+
config: {
|
|
948
|
+
security: {
|
|
949
|
+
type: "oauth2",
|
|
950
|
+
flows: {
|
|
951
|
+
authorizationCode: {
|
|
952
|
+
authorizationUrl: "http://localhost/authorize",
|
|
953
|
+
tokenUrl: "http://localhost/token",
|
|
954
|
+
},
|
|
955
|
+
},
|
|
956
|
+
},
|
|
957
|
+
},
|
|
958
|
+
});
|
|
959
|
+
|
|
960
|
+
const registry = createAgentRegistry();
|
|
961
|
+
registry.register(agent);
|
|
962
|
+
registryServer = createAgentServer(registry, { port: REG_PORT });
|
|
963
|
+
await registryServer.start();
|
|
964
|
+
});
|
|
965
|
+
|
|
966
|
+
afterAll(async () => {
|
|
967
|
+
await registryServer.stop();
|
|
968
|
+
});
|
|
969
|
+
|
|
970
|
+
test("uses resolveCredentials when access_token is not stored", async () => {
|
|
971
|
+
receivedToken = undefined;
|
|
972
|
+
const fs = createMemoryFs();
|
|
973
|
+
const adk = createAdk(fs, {
|
|
974
|
+
resolveCredentials: async ({ field }) => {
|
|
975
|
+
if (field === "access_token") return "minted-call-token";
|
|
976
|
+
return null;
|
|
977
|
+
},
|
|
978
|
+
});
|
|
979
|
+
|
|
980
|
+
await adk.registry.add({
|
|
981
|
+
name: "resolved-reg",
|
|
982
|
+
url: `http://localhost:${REG_PORT}`,
|
|
983
|
+
});
|
|
984
|
+
await adk.ref.add({
|
|
985
|
+
ref: "resolved-api",
|
|
986
|
+
sourceRegistry: {
|
|
987
|
+
url: `http://localhost:${REG_PORT}`,
|
|
988
|
+
agentPath: "resolved-api",
|
|
989
|
+
},
|
|
990
|
+
config: {},
|
|
991
|
+
});
|
|
992
|
+
|
|
993
|
+
const result = await adk.ref.call("resolved-api", "get_data");
|
|
994
|
+
expect(receivedToken).toBe("minted-call-token");
|
|
995
|
+
expect((result as any)?.result?.ok).toBe(true);
|
|
996
|
+
});
|
|
997
|
+
|
|
998
|
+
test("stored access_token still wins over resolveCredentials", async () => {
|
|
999
|
+
receivedToken = undefined;
|
|
1000
|
+
const fs = createMemoryFs();
|
|
1001
|
+
const adk = createAdk(fs, {
|
|
1002
|
+
resolveCredentials: async () => "should-not-be-used",
|
|
1003
|
+
});
|
|
1004
|
+
|
|
1005
|
+
await adk.registry.add({
|
|
1006
|
+
name: "resolved-reg",
|
|
1007
|
+
url: `http://localhost:${REG_PORT}`,
|
|
1008
|
+
});
|
|
1009
|
+
await adk.ref.add({
|
|
1010
|
+
ref: "resolved-api",
|
|
1011
|
+
name: "resolved-api-stored",
|
|
1012
|
+
sourceRegistry: {
|
|
1013
|
+
url: `http://localhost:${REG_PORT}`,
|
|
1014
|
+
agentPath: "resolved-api",
|
|
1015
|
+
},
|
|
1016
|
+
config: { access_token: "stored-token" },
|
|
1017
|
+
});
|
|
1018
|
+
|
|
1019
|
+
await adk.ref.call("resolved-api-stored", "get_data");
|
|
1020
|
+
expect(receivedToken).toBe("stored-token");
|
|
1021
|
+
});
|
|
1022
|
+
|
|
1023
|
+
test("uses resolveCredentials for cached apiKey header fields", async () => {
|
|
1024
|
+
let receivedHeaders: Record<string, string> | undefined;
|
|
1025
|
+
const headerRegPort = 19923;
|
|
1026
|
+
const headerServer = createAgentServer(
|
|
1027
|
+
(() => {
|
|
1028
|
+
const apiTool = defineTool({
|
|
1029
|
+
name: "get_data",
|
|
1030
|
+
description: "Echo _headers",
|
|
1031
|
+
inputSchema: { type: "object" as const, properties: {} },
|
|
1032
|
+
execute: async (input: any) => {
|
|
1033
|
+
receivedHeaders = input?._headers;
|
|
1034
|
+
return { ok: true, headers: receivedHeaders };
|
|
1035
|
+
},
|
|
1036
|
+
});
|
|
1037
|
+
const agent = defineAgent({
|
|
1038
|
+
path: "header-api",
|
|
1039
|
+
entrypoint: "Header creds agent",
|
|
1040
|
+
tools: [apiTool],
|
|
1041
|
+
visibility: "public",
|
|
1042
|
+
});
|
|
1043
|
+
const registry = createAgentRegistry();
|
|
1044
|
+
registry.register(agent);
|
|
1045
|
+
return registry;
|
|
1046
|
+
})(),
|
|
1047
|
+
{ port: headerRegPort },
|
|
1048
|
+
);
|
|
1049
|
+
await headerServer.start();
|
|
1050
|
+
|
|
1051
|
+
try {
|
|
1052
|
+
receivedHeaders = undefined;
|
|
1053
|
+
const fs = createMemoryFs();
|
|
1054
|
+
const adk = createAdk(fs, {
|
|
1055
|
+
resolveCredentials: async ({ field }) => {
|
|
1056
|
+
if (field === "x_api_key") return "resolved-header-key";
|
|
1057
|
+
return null;
|
|
1058
|
+
},
|
|
1059
|
+
});
|
|
1060
|
+
|
|
1061
|
+
await adk.registry.add({
|
|
1062
|
+
name: "header-reg",
|
|
1063
|
+
url: `http://localhost:${headerRegPort}`,
|
|
1064
|
+
});
|
|
1065
|
+
await adk.ref.add({
|
|
1066
|
+
ref: "header-api",
|
|
1067
|
+
name: "header-api",
|
|
1068
|
+
sourceRegistry: {
|
|
1069
|
+
url: `http://localhost:${headerRegPort}`,
|
|
1070
|
+
agentPath: "header-api",
|
|
1071
|
+
},
|
|
1072
|
+
config: {},
|
|
1073
|
+
});
|
|
1074
|
+
|
|
1075
|
+
await fs.writeFile(
|
|
1076
|
+
"registry-cache.json",
|
|
1077
|
+
JSON.stringify({
|
|
1078
|
+
refs: {
|
|
1079
|
+
"header-api": {
|
|
1080
|
+
ref: "header-api",
|
|
1081
|
+
fetchedAt: new Date().toISOString(),
|
|
1082
|
+
authFields: {
|
|
1083
|
+
x_api_key: { required: true, automated: false },
|
|
1084
|
+
},
|
|
1085
|
+
},
|
|
1086
|
+
},
|
|
1087
|
+
}),
|
|
1088
|
+
);
|
|
1089
|
+
|
|
1090
|
+
const result = await adk.ref.call("header-api", "get_data");
|
|
1091
|
+
expect(receivedHeaders?.["X-API-KEY"]).toBe("resolved-header-key");
|
|
1092
|
+
expect((result as any)?.result?.ok).toBe(true);
|
|
1093
|
+
} finally {
|
|
1094
|
+
await headerServer.stop();
|
|
1095
|
+
}
|
|
1096
|
+
});
|
|
845
1097
|
});
|
|
846
1098
|
|
|
847
1099
|
describe("ADK ref.call() auto-refresh on direct MCP 401", () => {
|
|
@@ -1847,3 +2099,136 @@ describe("isRefAuthComplete + cached authFields", () => {
|
|
|
1847
2099
|
expect(result).toBe(false);
|
|
1848
2100
|
});
|
|
1849
2101
|
});
|
|
2102
|
+
|
|
2103
|
+
describe("ADK ref.refreshToken() manifest-aware token endpoint", () => {
|
|
2104
|
+
let registryServer: AgentServer;
|
|
2105
|
+
let discoveryServer: ReturnType<typeof Bun.serve>;
|
|
2106
|
+
let tokenServer: ReturnType<typeof Bun.serve>;
|
|
2107
|
+
const REG_PORT = 19950;
|
|
2108
|
+
const AS_PORT = 19951;
|
|
2109
|
+
const TOKEN_PORT = 19952;
|
|
2110
|
+
let tokenRefreshCount = 0;
|
|
2111
|
+
|
|
2112
|
+
beforeAll(async () => {
|
|
2113
|
+
tokenServer = Bun.serve({
|
|
2114
|
+
port: TOKEN_PORT,
|
|
2115
|
+
async fetch(req) {
|
|
2116
|
+
tokenRefreshCount++;
|
|
2117
|
+
const params = new URLSearchParams(await req.text());
|
|
2118
|
+
if (
|
|
2119
|
+
params.get("grant_type") !== "refresh_token" ||
|
|
2120
|
+
params.get("refresh_token") !== "discovery-refresh-token" ||
|
|
2121
|
+
params.get("client_id") !== "discovery-client-id"
|
|
2122
|
+
) {
|
|
2123
|
+
return new Response(JSON.stringify({ error: "invalid_grant" }), {
|
|
2124
|
+
status: 400,
|
|
2125
|
+
});
|
|
2126
|
+
}
|
|
2127
|
+
return new Response(
|
|
2128
|
+
JSON.stringify({
|
|
2129
|
+
access_token: "discovery-refreshed-token",
|
|
2130
|
+
token_type: "Bearer",
|
|
2131
|
+
expires_in: 3600,
|
|
2132
|
+
}),
|
|
2133
|
+
{ headers: { "Content-Type": "application/json" } },
|
|
2134
|
+
);
|
|
2135
|
+
},
|
|
2136
|
+
});
|
|
2137
|
+
|
|
2138
|
+
discoveryServer = Bun.serve({
|
|
2139
|
+
port: AS_PORT,
|
|
2140
|
+
fetch(req) {
|
|
2141
|
+
const path = new URL(req.url).pathname;
|
|
2142
|
+
if (path === "/.well-known/oauth-authorization-server") {
|
|
2143
|
+
return Response.json({
|
|
2144
|
+
issuer: `http://localhost:${AS_PORT}`,
|
|
2145
|
+
authorization_endpoint: `http://localhost:${AS_PORT}/oauth/authorize`,
|
|
2146
|
+
token_endpoint: `http://localhost:${TOKEN_PORT}`,
|
|
2147
|
+
});
|
|
2148
|
+
}
|
|
2149
|
+
return new Response("not found", { status: 404 });
|
|
2150
|
+
},
|
|
2151
|
+
});
|
|
2152
|
+
|
|
2153
|
+
const stubTool = defineTool({
|
|
2154
|
+
name: "noop",
|
|
2155
|
+
description: "Unused in this test",
|
|
2156
|
+
inputSchema: { type: "object" as const, properties: {} },
|
|
2157
|
+
execute: async () => ({ ok: true }),
|
|
2158
|
+
});
|
|
2159
|
+
const agent = defineAgent({
|
|
2160
|
+
path: "discovery-oauth-agent",
|
|
2161
|
+
entrypoint: "Discovery OAuth agent",
|
|
2162
|
+
tools: [stubTool],
|
|
2163
|
+
visibility: "public",
|
|
2164
|
+
config: {
|
|
2165
|
+
security: {
|
|
2166
|
+
type: "oauth2",
|
|
2167
|
+
discoveryUrl: `http://localhost:${AS_PORT}/.well-known/oauth-authorization-server`,
|
|
2168
|
+
flows: {
|
|
2169
|
+
authorizationCode: {
|
|
2170
|
+
authorizationUrl: `http://localhost:${AS_PORT}/oauth/authorize`,
|
|
2171
|
+
},
|
|
2172
|
+
},
|
|
2173
|
+
},
|
|
2174
|
+
},
|
|
2175
|
+
});
|
|
2176
|
+
const registry = createAgentRegistry();
|
|
2177
|
+
registry.register(agent);
|
|
2178
|
+
registryServer = createAgentServer(registry, { port: REG_PORT });
|
|
2179
|
+
await registryServer.start();
|
|
2180
|
+
});
|
|
2181
|
+
|
|
2182
|
+
afterAll(async () => {
|
|
2183
|
+
await registryServer.stop();
|
|
2184
|
+
discoveryServer.stop();
|
|
2185
|
+
tokenServer.stop();
|
|
2186
|
+
});
|
|
2187
|
+
|
|
2188
|
+
test("ref.refreshToken() discovers token endpoint from discoveryUrl when tokenUrl is absent", async () => {
|
|
2189
|
+
tokenRefreshCount = 0;
|
|
2190
|
+
|
|
2191
|
+
const fs = createMemoryFs();
|
|
2192
|
+
const adk = createAdk(fs, {
|
|
2193
|
+
encryptionKey: "test-key-32-chars-long-enough!!",
|
|
2194
|
+
});
|
|
2195
|
+
|
|
2196
|
+
await adk.registry.add({
|
|
2197
|
+
name: "discovery-reg",
|
|
2198
|
+
url: `http://localhost:${REG_PORT}`,
|
|
2199
|
+
});
|
|
2200
|
+
await adk.ref.add({
|
|
2201
|
+
ref: "discovery-oauth-agent",
|
|
2202
|
+
sourceRegistry: {
|
|
2203
|
+
url: `http://localhost:${REG_PORT}`,
|
|
2204
|
+
agentPath: "discovery-oauth-agent",
|
|
2205
|
+
},
|
|
2206
|
+
});
|
|
2207
|
+
|
|
2208
|
+
const config = await adk.readConfig();
|
|
2209
|
+
await adk.writeConfig({
|
|
2210
|
+
...config,
|
|
2211
|
+
refs: config.refs?.map((r: any) => {
|
|
2212
|
+
if (r.ref === "discovery-oauth-agent") {
|
|
2213
|
+
return {
|
|
2214
|
+
...r,
|
|
2215
|
+
config: {
|
|
2216
|
+
...r.config,
|
|
2217
|
+
access_token: "stale-token",
|
|
2218
|
+
refresh_token: "discovery-refresh-token",
|
|
2219
|
+
client_id: "discovery-client-id",
|
|
2220
|
+
},
|
|
2221
|
+
};
|
|
2222
|
+
}
|
|
2223
|
+
return r;
|
|
2224
|
+
}),
|
|
2225
|
+
});
|
|
2226
|
+
|
|
2227
|
+
const refreshed = await adk.ref.refreshToken("discovery-oauth-agent");
|
|
2228
|
+
expect(refreshed).toEqual({ accessToken: "discovery-refreshed-token" });
|
|
2229
|
+
expect(tokenRefreshCount).toBe(1);
|
|
2230
|
+
|
|
2231
|
+
const updated = await adk.ref.get("discovery-oauth-agent");
|
|
2232
|
+
expect(typeof updated?.config?.expires_at).toBe("string");
|
|
2233
|
+
});
|
|
2234
|
+
});
|