cross-agent-teams-mcp 0.5.11 → 0.5.12

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/cli.d.ts CHANGED
@@ -6,6 +6,7 @@ interface DaemonCliArgs {
6
6
  requestedPort: number;
7
7
  host: string;
8
8
  localDevice: string;
9
+ loopbackCompanion: boolean;
9
10
  }
10
11
  declare function parseDaemonCliArgs(argv?: readonly string[], env?: NodeJS.ProcessEnv): DaemonCliArgs;
11
12
 
package/dist/cli.js CHANGED
@@ -8,6 +8,7 @@ import { fileURLToPath } from "url";
8
8
 
9
9
  // src/daemon/server.ts
10
10
  import Fastify from "fastify";
11
+ import { createServer as createHttpServer } from "http";
11
12
 
12
13
  // src/storage/db.ts
13
14
  import Database from "better-sqlite3";
@@ -4043,6 +4044,9 @@ function classifyPeerAddress(address) {
4043
4044
  function isLoopbackHost(host) {
4044
4045
  return host === "localhost" || isLoopbackAddress(host);
4045
4046
  }
4047
+ function bindHostCoversIpv4Loopback(host) {
4048
+ return host === "127.0.0.1" || host === "localhost" || host === "0.0.0.0";
4049
+ }
4046
4050
 
4047
4051
  // src/daemon/server.ts
4048
4052
  var DEFAULT_KEEP_ALIVE_TIMEOUT_MS = 12e4;
@@ -4101,10 +4105,46 @@ async function buildServer(opts) {
4101
4105
  async function startServer(opts) {
4102
4106
  const app = await buildServer(opts);
4103
4107
  const host = opts.host ?? "127.0.0.1";
4108
+ const companionRef = { server: void 0 };
4109
+ app.addHook("onClose", async () => {
4110
+ const server = companionRef.server;
4111
+ if (!server) return;
4112
+ await new Promise((resolve) => {
4113
+ server.close(() => resolve());
4114
+ });
4115
+ });
4104
4116
  await app.listen({ port: opts.port, host });
4105
4117
  const addr = app.server.address();
4106
4118
  const port = addr && typeof addr === "object" ? addr.port : opts.port;
4107
- return { app, port, host };
4119
+ const companionEnabled = opts.loopbackCompanion !== false;
4120
+ if (companionEnabled && !bindHostCoversIpv4Loopback(host)) {
4121
+ const handler = app.server.listeners("request")[0];
4122
+ if (!handler) {
4123
+ await app.close();
4124
+ throw new Error("loopback_companion_no_handler: Fastify did not expose a request handler");
4125
+ }
4126
+ const companion = createHttpServer(handler);
4127
+ try {
4128
+ await new Promise((resolve, reject) => {
4129
+ const onErr = (err) => reject(err);
4130
+ companion.once("error", onErr);
4131
+ companion.listen(port, "127.0.0.1", () => {
4132
+ companion.removeListener("error", onErr);
4133
+ resolve();
4134
+ });
4135
+ });
4136
+ } catch (err) {
4137
+ try {
4138
+ companion.close();
4139
+ } catch {
4140
+ }
4141
+ await app.close();
4142
+ const detail = err instanceof Error ? err.message : String(err);
4143
+ throw new Error(`loopback_companion_bind_failed: ${detail}`);
4144
+ }
4145
+ companionRef.server = companion;
4146
+ }
4147
+ return { app, port, host, loopbackCompanion: companionRef.server };
4108
4148
  }
4109
4149
 
4110
4150
  // src/daemon/pid.ts
@@ -4155,6 +4195,7 @@ function wireShutdown(app, pidPath, opts = {}) {
4155
4195
  const exit = opts.exit ?? ((code) => {
4156
4196
  process.exit(code);
4157
4197
  });
4198
+ const extraForceClose = opts.extraForceClose;
4158
4199
  let shuttingDown = false;
4159
4200
  const handler = (_signal) => {
4160
4201
  if (shuttingDown) {
@@ -4163,17 +4204,26 @@ function wireShutdown(app, pidPath, opts = {}) {
4163
4204
  return;
4164
4205
  }
4165
4206
  shuttingDown = true;
4166
- void runDrain(app, pidPath, graceMs, exit);
4207
+ void runDrain(app, pidPath, graceMs, exit, extraForceClose);
4167
4208
  };
4168
4209
  process.on("SIGTERM", handler);
4169
4210
  process.on("SIGINT", handler);
4170
4211
  }
4171
- async function runDrain(app, pidPath, graceMs, exit) {
4172
- if (graceMs <= 0) {
4212
+ function forceCloseAll(app, extra) {
4213
+ try {
4214
+ app.server.closeAllConnections();
4215
+ } catch {
4216
+ }
4217
+ if (extra) {
4173
4218
  try {
4174
- app.server.closeAllConnections();
4219
+ extra();
4175
4220
  } catch {
4176
4221
  }
4222
+ }
4223
+ }
4224
+ async function runDrain(app, pidPath, graceMs, exit, extraForceClose) {
4225
+ if (graceMs <= 0) {
4226
+ forceCloseAll(app, extraForceClose);
4177
4227
  try {
4178
4228
  await app.close();
4179
4229
  } catch {
@@ -4190,10 +4240,7 @@ async function runDrain(app, pidPath, graceMs, exit) {
4190
4240
  const closed = app.close().then(() => "closed").catch(() => "closed");
4191
4241
  const winner = await Promise.race([closed, deadline]);
4192
4242
  if (winner === "timeout") {
4193
- try {
4194
- app.server.closeAllConnections();
4195
- } catch {
4196
- }
4243
+ forceCloseAll(app, extraForceClose);
4197
4244
  try {
4198
4245
  await app.close();
4199
4246
  } catch {
@@ -4240,13 +4287,15 @@ function parseDaemonCliArgs(argv = process.argv, env = process.env) {
4240
4287
  const host = parseArg("--host", "127.0.0.1") ?? "127.0.0.1";
4241
4288
  const localDevice = resolveLocalDeviceLabel(parseArg("--device"));
4242
4289
  const requestedPort = Number(parseArg("--port", "9100"));
4290
+ const loopbackCompanion = !process.argv.includes("--no-loopback-companion");
4243
4291
  return {
4244
4292
  pidPath: parseArg("--pid-file", join(home, "daemon.pid")),
4245
4293
  dbPath: parseArg("--db", join(home, "data.db")),
4246
4294
  token,
4247
4295
  requestedPort,
4248
4296
  host,
4249
- localDevice
4297
+ localDevice,
4298
+ loopbackCompanion
4250
4299
  };
4251
4300
  } finally {
4252
4301
  process.argv = originalArgv;
@@ -4270,10 +4319,20 @@ async function runDaemon() {
4270
4319
  token: args.token,
4271
4320
  port,
4272
4321
  host: args.host,
4273
- localDevice: args.localDevice
4322
+ localDevice: args.localDevice,
4323
+ loopbackCompanion: args.loopbackCompanion
4324
+ });
4325
+ const companion = started.loopbackCompanion;
4326
+ wireShutdown(started.app, args.pidPath, {
4327
+ extraForceClose: companion ? () => {
4328
+ try {
4329
+ companion.closeAllConnections();
4330
+ } catch {
4331
+ }
4332
+ } : void 0
4274
4333
  });
4275
- wireShutdown(started.app, args.pidPath);
4276
- console.log(`listening on ${started.host}:${started.port} device=${args.localDevice}`);
4334
+ const companionSuffix = companion ? ` (+ 127.0.0.1:${started.port} loopback companion)` : "";
4335
+ console.log(`listening on ${started.host}:${started.port}${companionSuffix} device=${args.localDevice}`);
4277
4336
  }
4278
4337
  function resolveDaemonPort(explicit) {
4279
4338
  if (explicit !== void 0) {