cross-agent-teams-mcp 0.5.11 → 0.5.13
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 +1 -0
- package/dist/cli.js +74 -15
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
- package/src/cli.ts +12 -2
- package/src/daemon/network-origin.ts +12 -0
- package/src/daemon/server.ts +64 -5
- package/src/daemon/shutdown.ts +17 -4
- package/src/mcp/transport.ts +6 -4
package/dist/cli.d.ts
CHANGED
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";
|
|
@@ -3859,7 +3860,7 @@ function mountMcp(app, db, fanout, channelWakeFanout, opts = {}) {
|
|
|
3859
3860
|
await session.transport.handleRequest(req.raw, reply.raw);
|
|
3860
3861
|
return reply;
|
|
3861
3862
|
});
|
|
3862
|
-
function reapOrphanSessions(now, graceMs =
|
|
3863
|
+
function reapOrphanSessions(now, graceMs = 3e5) {
|
|
3863
3864
|
for (const session of sessions.values()) {
|
|
3864
3865
|
if (session.agentIdHolder.current !== void 0) continue;
|
|
3865
3866
|
const idleMs = now - session.lastActivityAt;
|
|
@@ -4043,11 +4044,14 @@ 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;
|
|
4049
4053
|
var DEFAULT_ORPHAN_GC_INTERVAL_MS = 6e4;
|
|
4050
|
-
var DEFAULT_ORPHAN_GC_IDLE_MS =
|
|
4054
|
+
var DEFAULT_ORPHAN_GC_IDLE_MS = 3e5;
|
|
4051
4055
|
function parsePositiveInt(raw, fallback) {
|
|
4052
4056
|
const n = Number(raw);
|
|
4053
4057
|
return Number.isInteger(n) && n > 0 ? n : fallback;
|
|
@@ -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
|
-
|
|
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
|
-
|
|
4172
|
-
|
|
4212
|
+
function forceCloseAll(app, extra) {
|
|
4213
|
+
try {
|
|
4214
|
+
app.server.closeAllConnections();
|
|
4215
|
+
} catch {
|
|
4216
|
+
}
|
|
4217
|
+
if (extra) {
|
|
4173
4218
|
try {
|
|
4174
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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) {
|