@ellery/savio 0.2.1 → 0.4.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/index.js +46 -17
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -85,13 +85,15 @@ var TokenRefreshError = class extends Error {
|
|
|
85
85
|
// src/login.ts
|
|
86
86
|
import { createServer } from "http";
|
|
87
87
|
import { randomBytes } from "crypto";
|
|
88
|
+
import { hostname } from "os";
|
|
88
89
|
import { URL as URL2 } from "url";
|
|
89
90
|
import open from "open";
|
|
90
91
|
var LOGIN_TIMEOUT_MS = 12e4;
|
|
91
92
|
async function browserLogin(serverUrl) {
|
|
92
93
|
const state = randomBytes(32).toString("hex");
|
|
93
94
|
const { port, token } = await startCallbackServer(state);
|
|
94
|
-
const
|
|
95
|
+
const host = hostname();
|
|
96
|
+
const authUrl = `${serverUrl}/cli-auth?port=${port}&state=${encodeURIComponent(state)}&hostname=${encodeURIComponent(host)}`;
|
|
95
97
|
process.stderr.write(`Opening browser to authorize...
|
|
96
98
|
`);
|
|
97
99
|
process.stderr.write(`If the browser doesn't open, visit:
|
|
@@ -181,19 +183,46 @@ async function startProxy(refreshToken, serverUrl) {
|
|
|
181
183
|
}
|
|
182
184
|
throw err;
|
|
183
185
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
186
|
+
let client;
|
|
187
|
+
function createTransport() {
|
|
188
|
+
return new StreamableHTTPClientTransport(
|
|
189
|
+
new URL(`${serverUrl}/mcp`),
|
|
190
|
+
{
|
|
191
|
+
fetch: async (input, init) => {
|
|
192
|
+
const token = await tokenManager.getAccessToken();
|
|
193
|
+
const headers = new Headers(init?.headers);
|
|
194
|
+
headers.set("Authorization", `Bearer ${token}`);
|
|
195
|
+
return globalThis.fetch(input, { ...init, headers });
|
|
196
|
+
}
|
|
192
197
|
}
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
async function connect() {
|
|
201
|
+
client = new Client({ name: "savio", version: "1.0.0" });
|
|
202
|
+
await client.connect(createTransport());
|
|
203
|
+
}
|
|
204
|
+
async function reconnect() {
|
|
205
|
+
try {
|
|
206
|
+
await client.close();
|
|
207
|
+
} catch {
|
|
193
208
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
209
|
+
await connect();
|
|
210
|
+
process.stderr.write(`Reconnected to ${serverUrl}
|
|
211
|
+
`);
|
|
212
|
+
}
|
|
213
|
+
async function withReconnect(fn) {
|
|
214
|
+
try {
|
|
215
|
+
return await fn();
|
|
216
|
+
} catch (err) {
|
|
217
|
+
try {
|
|
218
|
+
await reconnect();
|
|
219
|
+
return await fn();
|
|
220
|
+
} catch (retryErr) {
|
|
221
|
+
throw retryErr;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
await connect();
|
|
197
226
|
process.stderr.write(`Connected to ${serverUrl}
|
|
198
227
|
`);
|
|
199
228
|
const server = new Server(
|
|
@@ -201,19 +230,19 @@ async function startProxy(refreshToken, serverUrl) {
|
|
|
201
230
|
{ capabilities: { tools: {}, resources: {} } }
|
|
202
231
|
);
|
|
203
232
|
server.setRequestHandler(ListToolsRequestSchema, async (req) => {
|
|
204
|
-
return client.listTools(req.params);
|
|
233
|
+
return withReconnect(() => client.listTools(req.params));
|
|
205
234
|
});
|
|
206
235
|
server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
207
|
-
return client.callTool(req.params);
|
|
236
|
+
return withReconnect(() => client.callTool(req.params));
|
|
208
237
|
});
|
|
209
238
|
server.setRequestHandler(ListResourcesRequestSchema, async (req) => {
|
|
210
|
-
return client.listResources(req.params);
|
|
239
|
+
return withReconnect(() => client.listResources(req.params));
|
|
211
240
|
});
|
|
212
241
|
server.setRequestHandler(ReadResourceRequestSchema, async (req) => {
|
|
213
|
-
return client.readResource(req.params);
|
|
242
|
+
return withReconnect(() => client.readResource(req.params));
|
|
214
243
|
});
|
|
215
244
|
server.setRequestHandler(ListResourceTemplatesRequestSchema, async (req) => {
|
|
216
|
-
return client.listResourceTemplates(req.params);
|
|
245
|
+
return withReconnect(() => client.listResourceTemplates(req.params));
|
|
217
246
|
});
|
|
218
247
|
const stdioTransport = new StdioServerTransport();
|
|
219
248
|
await server.connect(stdioTransport);
|