@slashfi/agents-sdk 0.1.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/dist/server.js ADDED
@@ -0,0 +1,308 @@
1
+ /**
2
+ * Agent Server
3
+ *
4
+ * HTTP server that exposes the agent registry via JSON-RPC endpoints.
5
+ * Compatible with MCP (Model Context Protocol) over HTTP.
6
+ *
7
+ * Endpoints:
8
+ * - POST /call - Execute agent actions (execute_tool, describe_tools, load)
9
+ * - GET /list - List registered agents
10
+ * - POST /oauth/token - OAuth2 token endpoint (when @auth is registered)
11
+ *
12
+ * Auth Integration:
13
+ * When an `@auth` agent is registered, the server automatically:
14
+ * - Validates Bearer tokens on requests
15
+ * - Resolves tokens to identity + scopes
16
+ * - Populates callerId, callerType in the request context
17
+ * - Recognizes the root key for admin access
18
+ * - Mounts the /oauth/token endpoint
19
+ */
20
+ // ============================================
21
+ // Response Helpers
22
+ // ============================================
23
+ function jsonResponse(data, status = 200) {
24
+ return new Response(JSON.stringify(data), {
25
+ status,
26
+ headers: {
27
+ "Content-Type": "application/json",
28
+ },
29
+ });
30
+ }
31
+ function corsHeaders() {
32
+ return {
33
+ "Access-Control-Allow-Origin": "*",
34
+ "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
35
+ "Access-Control-Allow-Headers": "Content-Type, Authorization",
36
+ };
37
+ }
38
+ // ============================================
39
+ // Auth Detection
40
+ // ============================================
41
+ function detectAuth(registry) {
42
+ const authAgent = registry.get("@auth");
43
+ if (!authAgent?.__authStore || !authAgent.__rootKey)
44
+ return null;
45
+ return {
46
+ store: authAgent.__authStore,
47
+ rootKey: authAgent.__rootKey,
48
+ tokenTtl: authAgent.__tokenTtl ?? 3600,
49
+ };
50
+ }
51
+ async function resolveAuth(req, authConfig) {
52
+ const authHeader = req.headers.get("Authorization");
53
+ if (!authHeader)
54
+ return null;
55
+ const [scheme, credential] = authHeader.split(" ", 2);
56
+ if (scheme?.toLowerCase() !== "bearer" || !credential)
57
+ return null;
58
+ // Check root key
59
+ if (credential === authConfig.rootKey) {
60
+ return {
61
+ callerId: "root",
62
+ callerType: "system",
63
+ scopes: ["*"],
64
+ isRoot: true,
65
+ };
66
+ }
67
+ // Validate token
68
+ const token = await authConfig.store.validateToken(credential);
69
+ if (!token)
70
+ return null;
71
+ // Look up client name
72
+ const client = await authConfig.store.getClient(token.clientId);
73
+ return {
74
+ callerId: client?.name ?? token.clientId,
75
+ callerType: "agent",
76
+ scopes: token.scopes,
77
+ isRoot: false,
78
+ };
79
+ }
80
+ // ============================================
81
+ // Visibility Filtering for /list
82
+ // ============================================
83
+ function canSeeAgent(agent, auth) {
84
+ const visibility = agent.visibility ?? "internal";
85
+ if (auth?.isRoot)
86
+ return true;
87
+ if (visibility === "public")
88
+ return true;
89
+ if (visibility === "internal" && auth)
90
+ return true;
91
+ return false;
92
+ }
93
+ // ============================================
94
+ // Create Server
95
+ // ============================================
96
+ /**
97
+ * Create an HTTP server for the agent registry.
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * const registry = createAgentRegistry();
102
+ * registry.register(createAuthAgent({ rootKey: 'rk_xxx' }));
103
+ * registry.register(myAgent);
104
+ *
105
+ * const server = createAgentServer(registry, { port: 3000 });
106
+ * await server.start();
107
+ * // POST /call - Execute agent actions
108
+ * // GET /list - List agents (filtered by auth)
109
+ * // POST /oauth/token - OAuth2 token endpoint
110
+ * ```
111
+ */
112
+ export function createAgentServer(registry, options = {}) {
113
+ const { port = 3000, hostname = "localhost", basePath = "", cors = true, onNotFound, } = options;
114
+ let serverInstance = null;
115
+ let serverUrl = null;
116
+ // Detect auth configuration
117
+ const authConfig = detectAuth(registry);
118
+ /**
119
+ * Handle incoming requests.
120
+ */
121
+ async function fetch(req) {
122
+ const url = new URL(req.url);
123
+ const path = url.pathname.replace(basePath, "") || "/";
124
+ // Handle CORS preflight
125
+ if (cors && req.method === "OPTIONS") {
126
+ return new Response(null, {
127
+ status: 204,
128
+ headers: corsHeaders(),
129
+ });
130
+ }
131
+ // Add CORS headers to response
132
+ const addCors = (response) => {
133
+ if (!cors)
134
+ return response;
135
+ const headers = new Headers(response.headers);
136
+ for (const [key, value] of Object.entries(corsHeaders())) {
137
+ headers.set(key, value);
138
+ }
139
+ return new Response(response.body, {
140
+ status: response.status,
141
+ statusText: response.statusText,
142
+ headers,
143
+ });
144
+ };
145
+ // Resolve auth on every request
146
+ const auth = authConfig ? await resolveAuth(req, authConfig) : null;
147
+ try {
148
+ // POST /oauth/token - Standard OAuth2 endpoint
149
+ if (path === "/oauth/token" && req.method === "POST" && authConfig) {
150
+ const contentType = req.headers.get("Content-Type") ?? "";
151
+ let grantType;
152
+ let clientId;
153
+ let clientSecret;
154
+ if (contentType.includes("application/x-www-form-urlencoded")) {
155
+ const body = await req.text();
156
+ const params = new URLSearchParams(body);
157
+ grantType = params.get("grant_type") ?? "";
158
+ clientId = params.get("client_id") ?? "";
159
+ clientSecret = params.get("client_secret") ?? "";
160
+ }
161
+ else {
162
+ const body = (await req.json());
163
+ grantType = body.grant_type ?? "";
164
+ clientId = body.client_id ?? "";
165
+ clientSecret = body.client_secret ?? "";
166
+ }
167
+ if (grantType !== "client_credentials") {
168
+ return addCors(jsonResponse({
169
+ error: "unsupported_grant_type",
170
+ error_description: "Only client_credentials is supported",
171
+ }, 400));
172
+ }
173
+ if (!clientId || !clientSecret) {
174
+ return addCors(jsonResponse({
175
+ error: "invalid_request",
176
+ error_description: "Missing client_id or client_secret",
177
+ }, 400));
178
+ }
179
+ const client = await authConfig.store.validateClient(clientId, clientSecret);
180
+ if (!client) {
181
+ return addCors(jsonResponse({
182
+ error: "invalid_client",
183
+ error_description: "Invalid client credentials",
184
+ }, 401));
185
+ }
186
+ // Generate token
187
+ const tokenString = `at_${Array.from({ length: 48 }, () => "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(Math.random() * 62)]).join("")}`;
188
+ const token = {
189
+ token: tokenString,
190
+ clientId: client.clientId,
191
+ scopes: client.scopes,
192
+ issuedAt: Date.now(),
193
+ expiresAt: Date.now() + authConfig.tokenTtl * 1000,
194
+ };
195
+ await authConfig.store.storeToken(token);
196
+ // Standard OAuth2 response
197
+ return addCors(jsonResponse({
198
+ access_token: token.token,
199
+ token_type: "bearer",
200
+ expires_in: authConfig.tokenTtl,
201
+ scope: client.scopes.join(" "),
202
+ }));
203
+ }
204
+ // POST /call - Execute agent action
205
+ if (path === "/call" && req.method === "POST") {
206
+ const body = (await req.json());
207
+ if (!body.path || !body.action) {
208
+ return addCors(jsonResponse({
209
+ success: false,
210
+ error: "Missing required fields: path, action",
211
+ code: "INVALID_REQUEST",
212
+ }, 400));
213
+ }
214
+ // Inject auth context into request
215
+ if (auth) {
216
+ body.callerId = auth.callerId;
217
+ body.callerType = auth.callerType;
218
+ if (!body.metadata)
219
+ body.metadata = {};
220
+ body.metadata.scopes = auth.scopes;
221
+ body.metadata.isRoot = auth.isRoot;
222
+ }
223
+ // Root key bypasses all access checks
224
+ if (auth?.isRoot) {
225
+ body.callerType = "system";
226
+ }
227
+ const result = await registry.call(body);
228
+ const status = "success" in result && result.success ? 200 : 400;
229
+ return addCors(jsonResponse(result, status));
230
+ }
231
+ // GET /list - List agents (filtered by visibility)
232
+ if (path === "/list" && req.method === "GET") {
233
+ const agents = registry.list();
234
+ const visible = agents.filter((agent) => canSeeAgent(agent, auth));
235
+ return addCors(jsonResponse({
236
+ success: true,
237
+ agents: visible.map((agent) => ({
238
+ path: agent.path,
239
+ name: agent.config?.name,
240
+ description: agent.config?.description,
241
+ supportedActions: agent.config?.supportedActions,
242
+ tools: agent.tools
243
+ .filter((t) => {
244
+ const tv = t.visibility ?? "internal";
245
+ if (auth?.isRoot)
246
+ return true;
247
+ if (tv === "public")
248
+ return true;
249
+ if (tv === "internal" && auth)
250
+ return true;
251
+ return false;
252
+ })
253
+ .map((t) => t.name),
254
+ })),
255
+ }));
256
+ }
257
+ // Not found
258
+ if (onNotFound) {
259
+ return addCors(await onNotFound(req));
260
+ }
261
+ return addCors(jsonResponse({
262
+ success: false,
263
+ error: `Not found: ${req.method} ${path}`,
264
+ code: "NOT_FOUND",
265
+ }, 404));
266
+ }
267
+ catch (err) {
268
+ return addCors(jsonResponse({
269
+ success: false,
270
+ error: err instanceof Error ? err.message : String(err),
271
+ code: "INTERNAL_ERROR",
272
+ }, 500));
273
+ }
274
+ }
275
+ const server = {
276
+ async start() {
277
+ if (serverInstance) {
278
+ throw new Error("Server is already running");
279
+ }
280
+ serverInstance = Bun.serve({
281
+ port,
282
+ hostname,
283
+ fetch,
284
+ });
285
+ serverUrl = `http://${hostname}:${port}${basePath}`;
286
+ console.log(`Agent server running at ${serverUrl}`);
287
+ console.log(` POST ${basePath}/call - Execute agent actions`);
288
+ console.log(` GET ${basePath}/list - List agents`);
289
+ if (authConfig) {
290
+ console.log(` POST ${basePath}/oauth/token - OAuth2 token endpoint`);
291
+ console.log(" Auth: enabled (root key configured)");
292
+ }
293
+ },
294
+ async stop() {
295
+ if (serverInstance) {
296
+ serverInstance.stop();
297
+ serverInstance = null;
298
+ serverUrl = null;
299
+ }
300
+ },
301
+ fetch,
302
+ get url() {
303
+ return serverUrl;
304
+ },
305
+ };
306
+ return server;
307
+ }
308
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}