@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.
Files changed (2) hide show
  1. package/dist/index.js +46 -17
  2. 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 authUrl = `${serverUrl}/cli-auth?port=${port}&state=${encodeURIComponent(state)}`;
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
- const httpTransport = new StreamableHTTPClientTransport(
185
- new URL(`${serverUrl}/mcp`),
186
- {
187
- fetch: async (input, init) => {
188
- const token = await tokenManager.getAccessToken();
189
- const headers = new Headers(init?.headers);
190
- headers.set("Authorization", `Bearer ${token}`);
191
- return globalThis.fetch(input, { ...init, headers });
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
- const client = new Client({ name: "savio", version: "1.0.0" });
196
- await client.connect(httpTransport);
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);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ellery/savio",
3
- "version": "0.2.1",
3
+ "version": "0.4.0",
4
4
  "description": "Savio MCP server — browser auth and local stdio proxy",
5
5
  "type": "module",
6
6
  "bin": {