jefrichat-mcp 0.48.7 → 0.48.8

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 (3) hide show
  1. package/dist/http.js +141 -53
  2. package/dist/index.js +23 -2
  3. package/package.json +1 -1
package/dist/http.js CHANGED
@@ -20888,8 +20888,8 @@ var require_application = __commonJS({
20888
20888
  tryRender(view, renderOptions, done);
20889
20889
  };
20890
20890
  app2.listen = function listen() {
20891
- var server = http2.createServer(this);
20892
- return server.listen.apply(server, arguments);
20891
+ var server2 = http2.createServer(this);
20892
+ return server2.listen.apply(server2, arguments);
20893
20893
  };
20894
20894
  function logerror(err) {
20895
20895
  if (this.get("env") !== "test") console.error(err.stack || err.toString());
@@ -33214,10 +33214,10 @@ var require_websocket_server = __commonJS({
33214
33214
  process.nextTick(emitClose, this);
33215
33215
  }
33216
33216
  } else {
33217
- const server = this._server;
33217
+ const server2 = this._server;
33218
33218
  this._removeListeners();
33219
33219
  this._removeListeners = this._server = null;
33220
- server.close(() => {
33220
+ server2.close(() => {
33221
33221
  emitClose(this);
33222
33222
  });
33223
33223
  }
@@ -33402,17 +33402,17 @@ var require_websocket_server = __commonJS({
33402
33402
  }
33403
33403
  };
33404
33404
  module.exports = WebSocketServer2;
33405
- function addListeners(server, map3) {
33406
- for (const event of Object.keys(map3)) server.on(event, map3[event]);
33405
+ function addListeners(server2, map3) {
33406
+ for (const event of Object.keys(map3)) server2.on(event, map3[event]);
33407
33407
  return function removeListeners() {
33408
33408
  for (const event of Object.keys(map3)) {
33409
- server.removeListener(event, map3[event]);
33409
+ server2.removeListener(event, map3[event]);
33410
33410
  }
33411
33411
  };
33412
33412
  }
33413
- function emitClose(server) {
33414
- server._state = CLOSED;
33415
- server.emit("close");
33413
+ function emitClose(server2) {
33414
+ server2._state = CLOSED;
33415
+ server2.emit("close");
33416
33416
  }
33417
33417
  function socketOnError() {
33418
33418
  this.destroy();
@@ -33431,11 +33431,11 @@ var require_websocket_server = __commonJS({
33431
33431
  ` + Object.keys(headers).map((h) => `${h}: ${headers[h]}`).join("\r\n") + "\r\n\r\n" + message
33432
33432
  );
33433
33433
  }
33434
- function abortHandshakeOrEmitwsClientError(server, req, socket, code3, message, headers) {
33435
- if (server.listenerCount("wsClientError")) {
33434
+ function abortHandshakeOrEmitwsClientError(server2, req, socket, code3, message, headers) {
33435
+ if (server2.listenerCount("wsClientError")) {
33436
33436
  const err = new Error(message);
33437
33437
  Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError);
33438
- server.emit("wsClientError", err, socket, req);
33438
+ server2.emit("wsClientError", err, socket, req);
33439
33439
  } else {
33440
33440
  abortHandshake(socket, code3, message, headers);
33441
33441
  }
@@ -60697,15 +60697,15 @@ var JefriClient = class _JefriClient {
60697
60697
  get online() {
60698
60698
  return this.hasConnected && !this.closing && this.ws?.readyState === this.ws?.OPEN;
60699
60699
  }
60700
- constructor(server) {
60701
- this.server = server.replace(/\/$/, "");
60700
+ constructor(server2) {
60701
+ this.server = server2.replace(/\/$/, "");
60702
60702
  }
60703
60703
  static async connect(opts = {}) {
60704
- const server = (opts.server ?? "https://jefrichat.com").replace(/\/$/, "");
60705
- const client = new _JefriClient(server);
60704
+ const server2 = (opts.server ?? "https://jefrichat.com").replace(/\/$/, "");
60705
+ const client = new _JefriClient(server2);
60706
60706
  let token = opts.token;
60707
60707
  if (!token) {
60708
- const res = await fetch(`${server}/api/agents`, {
60708
+ const res = await fetch(`${server2}/api/agents`, {
60709
60709
  method: "POST",
60710
60710
  headers: { "content-type": "application/json" },
60711
60711
  body: JSON.stringify({
@@ -62005,7 +62005,21 @@ function waitFor(c, event, match, timeoutMs = 4e3) {
62005
62005
  }, timeoutMs);
62006
62006
  });
62007
62007
  }
62008
- var ok3 = (text5) => ({ content: [{ type: "text", text: text5 }] });
62008
+ var upgradeNotice = null;
62009
+ var upgradeShownAt = 0;
62010
+ var UPGRADE_REPEAT_MS = 24 * 60 * 60 * 1e3;
62011
+ function takeUpgradeNotice(now = Date.now()) {
62012
+ if (!upgradeNotice) return null;
62013
+ if (upgradeShownAt && now - upgradeShownAt < UPGRADE_REPEAT_MS) return null;
62014
+ upgradeShownAt = now;
62015
+ return upgradeNotice;
62016
+ }
62017
+ var ok3 = (text5, now = Date.now()) => {
62018
+ const notice = takeUpgradeNotice(now);
62019
+ return { content: [{ type: "text", text: notice ? `${text5}
62020
+
62021
+ ${notice}` : text5 }] };
62022
+ };
62009
62023
  var fail = (text5) => ({ content: [{ type: "text", text: text5 }], isError: true });
62010
62024
  var WATERMARK_FILE = np3.join(os4.homedir(), ".jefri", "inbox.json");
62011
62025
  var inboxWatermark = new Map(
@@ -62024,9 +62038,9 @@ function saveWatermark() {
62024
62038
  } catch {
62025
62039
  }
62026
62040
  }
62027
- function registerAcpTools(server, ctx) {
62041
+ function registerAcpTools(server2, ctx) {
62028
62042
  const ENABLE_E2E = process.env.JEFRI_ENABLE_E2E === "true";
62029
- const e2eServer = ENABLE_E2E ? server : { registerTool: () => void 0 };
62043
+ const e2eServer = ENABLE_E2E ? server2 : { registerTool: () => void 0 };
62030
62044
  const withClient = async (fn) => {
62031
62045
  try {
62032
62046
  const c = await ctx.ensureClient();
@@ -62036,7 +62050,7 @@ function registerAcpTools(server, ctx) {
62036
62050
  ${e?.message ?? e}`);
62037
62051
  }
62038
62052
  };
62039
- server.registerTool(
62053
+ server2.registerTool(
62040
62054
  "jefri_whoami",
62041
62055
  {
62042
62056
  title: "Who am I on Jefri Chat",
@@ -62047,7 +62061,7 @@ ${e?.message ?? e}`);
62047
62061
  async (c) => ok3(`You are "${c.identity.displayName}" (@${c.identity.username}) on Jefri Chat at ${ctx.serverUrl}, status: online.`)
62048
62062
  )
62049
62063
  );
62050
- server.registerTool(
62064
+ server2.registerTool(
62051
62065
  "jefri_agents",
62052
62066
  {
62053
62067
  title: "List your connections",
@@ -62083,7 +62097,7 @@ ${e?.message ?? e}`);
62083
62097
  }
62084
62098
  return { status: res.status, body };
62085
62099
  };
62086
- server.registerTool(
62100
+ server2.registerTool(
62087
62101
  "jefri_agent_apps",
62088
62102
  {
62089
62103
  title: "See where your agents are running",
@@ -62107,7 +62121,7 @@ ${lines.join("\n")}
62107
62121
  Use jefri_agent_apps with agent=<name> to see its live app + active state.`);
62108
62122
  })
62109
62123
  );
62110
- server.registerTool(
62124
+ server2.registerTool(
62111
62125
  "jefri_deactivate",
62112
62126
  {
62113
62127
  title: "Deactivate an agent",
@@ -62120,7 +62134,7 @@ Use jefri_agent_apps with agent=<name> to see its live app + active state.`);
62120
62134
  return ok3(`\u{1F6D1} Deactivated @${agent}. It's disconnected and can't reconnect from any app until you reactivate it.`);
62121
62135
  })
62122
62136
  );
62123
- server.registerTool(
62137
+ server2.registerTool(
62124
62138
  "jefri_activate",
62125
62139
  {
62126
62140
  title: "Reactivate an agent",
@@ -62133,7 +62147,7 @@ Use jefri_agent_apps with agent=<name> to see its live app + active state.`);
62133
62147
  return ok3(`\u2705 Reactivated @${agent}. It can connect again now.`);
62134
62148
  })
62135
62149
  );
62136
- server.registerTool(
62150
+ server2.registerTool(
62137
62151
  "jefri_send",
62138
62152
  {
62139
62153
  title: "Send a message",
@@ -62286,7 +62300,7 @@ ${fp}`);
62286
62300
  return ok3(`Sent private E2E group file.`);
62287
62301
  })
62288
62302
  );
62289
- server.registerTool(
62303
+ server2.registerTool(
62290
62304
  "jefri_send_file",
62291
62305
  {
62292
62306
  title: "Send a file, PDF, or image",
@@ -62370,7 +62384,7 @@ ${psCmd}
62370
62384
  return ok3(`Sent \u{1F4CE} ${name} to @${to}${caption ? ` \u2014 "${caption}"` : ""}`);
62371
62385
  })
62372
62386
  );
62373
- server.registerTool(
62387
+ server2.registerTool(
62374
62388
  "jefri_send_code",
62375
62389
  {
62376
62390
  title: "Send code / text as a file",
@@ -62405,7 +62419,7 @@ ${psCmd}
62405
62419
  return ok3(`Sent \u{1F4C4} ${fileName} (${content3.length} chars) to @${to}${caption ? ` \u2014 "${caption}"` : ""}`);
62406
62420
  })
62407
62421
  );
62408
- server.registerTool(
62422
+ server2.registerTool(
62409
62423
  "jefri_send_folder",
62410
62424
  {
62411
62425
  title: "Send a whole folder / project (zipped)",
@@ -62503,7 +62517,7 @@ ${psCmd}
62503
62517
  );
62504
62518
  })
62505
62519
  );
62506
- server.registerTool(
62520
+ server2.registerTool(
62507
62521
  "jefri_download_file",
62508
62522
  {
62509
62523
  title: "Download / save a file someone sent you",
@@ -62550,7 +62564,7 @@ It downloads the file to your machine (current folder unless you set a path). Fi
62550
62564
  );
62551
62565
  })
62552
62566
  );
62553
- server.registerTool(
62567
+ server2.registerTool(
62554
62568
  "jefri_connect",
62555
62569
  {
62556
62570
  title: "Request a connection",
@@ -62566,7 +62580,7 @@ It downloads the file to your machine (current folder unless you set a path). Fi
62566
62580
  })
62567
62581
  );
62568
62582
  const hubBase = () => ctx.serverUrl.replace(/\/$/, "");
62569
- server.registerTool(
62583
+ server2.registerTool(
62570
62584
  "jefri_departments",
62571
62585
  {
62572
62586
  title: "List your departments",
@@ -62580,7 +62594,7 @@ It downloads the file to your machine (current folder unless you set a path). Fi
62580
62594
  return ok3(d.map((x) => `\u2022 ${x.name} (${x.org}) \u2014 access: ${x.myLevel} [id: ${x.id}]`).join("\n"));
62581
62595
  })
62582
62596
  );
62583
- server.registerTool(
62597
+ server2.registerTool(
62584
62598
  "jefri_dept_files",
62585
62599
  {
62586
62600
  title: "List a department's files",
@@ -62595,7 +62609,7 @@ It downloads the file to your machine (current folder unless you set a path). Fi
62595
62609
  return ok3(files.map((f) => `\u2022 ${f.name} [${f.kind}] \u2014 by ${f.createdBy}, ${new Date(f.updatedAt).toLocaleDateString()} (id: ${f.id})`).join("\n"));
62596
62610
  })
62597
62611
  );
62598
- server.registerTool(
62612
+ server2.registerTool(
62599
62613
  "jefri_dept_read",
62600
62614
  {
62601
62615
  title: "Download a department file",
@@ -62625,7 +62639,7 @@ ${cmd}
62625
62639
  (Set your token first: export JEFRI_TOKEN=\u2026 from the app's Connect dialog \u2014 it isn't printed here on purpose.)`);
62626
62640
  })
62627
62641
  );
62628
- server.registerTool(
62642
+ server2.registerTool(
62629
62643
  "jefri_dept_add_file",
62630
62644
  {
62631
62645
  title: "Add a file to a department",
@@ -62648,7 +62662,7 @@ ${cmd}
62648
62662
  (With 'write' access it's added directly; with 'propose' access it's submitted for an admin to approve; read-only is rejected.)`);
62649
62663
  })
62650
62664
  );
62651
- server.registerTool(
62665
+ server2.registerTool(
62652
62666
  "jefri_my_docs",
62653
62667
  {
62654
62668
  title: "List my documents (memory)",
@@ -62667,7 +62681,7 @@ ${cmd}
62667
62681
  );
62668
62682
  })
62669
62683
  );
62670
- server.registerTool(
62684
+ server2.registerTool(
62671
62685
  "jefri_search_docs",
62672
62686
  {
62673
62687
  title: "Search my document memory",
@@ -62690,7 +62704,7 @@ ${h.text}`).join("\n\n---\n\n")
62690
62704
  );
62691
62705
  })
62692
62706
  );
62693
- server.registerTool(
62707
+ server2.registerTool(
62694
62708
  "jefri_read_doc",
62695
62709
  {
62696
62710
  title: "Read/get one of my documents",
@@ -62715,7 +62729,7 @@ ${cmd}
62715
62729
  (Set your token first: export JEFRI_TOKEN=\u2026 from the app's Connect dialog \u2014 it isn't printed here on purpose.)`);
62716
62730
  })
62717
62731
  );
62718
- server.registerTool(
62732
+ server2.registerTool(
62719
62733
  "jefri_add_doc",
62720
62734
  {
62721
62735
  title: "Add a document to my memory",
@@ -62735,7 +62749,7 @@ Or just upload ${fname} from the agent's page in the web app.`
62735
62749
  );
62736
62750
  })
62737
62751
  );
62738
- server.registerTool(
62752
+ server2.registerTool(
62739
62753
  "jefri_my_tasks",
62740
62754
  {
62741
62755
  title: "My department tasks",
@@ -62752,7 +62766,7 @@ Or just upload ${fname} from the agent's page in the web app.`
62752
62766
  );
62753
62767
  })
62754
62768
  );
62755
- server.registerTool(
62769
+ server2.registerTool(
62756
62770
  "jefri_task_status",
62757
62771
  {
62758
62772
  title: "Update a task's status",
@@ -62774,7 +62788,7 @@ Or just upload ${fname} from the agent's page in the web app.`
62774
62788
  return ok3(`Task marked ${status === "done" ? "\u2705 done" : status}.`);
62775
62789
  })
62776
62790
  );
62777
- server.registerTool(
62791
+ server2.registerTool(
62778
62792
  "jefri_inbox",
62779
62793
  {
62780
62794
  title: "Read unread messages",
@@ -62830,7 +62844,7 @@ Or just upload ${fname} from the agent's page in the web app.`
62830
62844
  ` + lines.join("\n"));
62831
62845
  })
62832
62846
  );
62833
- server.registerTool(
62847
+ server2.registerTool(
62834
62848
  "jefri_groups",
62835
62849
  {
62836
62850
  title: "List your groups",
@@ -62846,7 +62860,7 @@ Or just upload ${fname} from the agent's page in the web app.`
62846
62860
  );
62847
62861
  })
62848
62862
  );
62849
- server.registerTool(
62863
+ server2.registerTool(
62850
62864
  "jefri_send_group",
62851
62865
  {
62852
62866
  title: "Send a group message",
@@ -62864,7 +62878,7 @@ Or just upload ${fname} from the agent's page in the web app.`
62864
62878
  return ok3(`Posted to the group.`);
62865
62879
  })
62866
62880
  );
62867
- server.registerTool(
62881
+ server2.registerTool(
62868
62882
  "jefri_send_group_file",
62869
62883
  {
62870
62884
  title: "Send a file to a group",
@@ -62938,7 +62952,7 @@ Or just upload ${fname} from the agent's page in the web app.`
62938
62952
  return ok3(`Sent \u{1F4CE} ${name} to the group.`);
62939
62953
  })
62940
62954
  );
62941
- server.registerTool(
62955
+ server2.registerTool(
62942
62956
  "jefri_history",
62943
62957
  {
62944
62958
  title: "Read conversation history",
@@ -62978,7 +62992,7 @@ Or just upload ${fname} from the agent's page in the web app.`
62978
62992
  return ok3(lines.join("\n"));
62979
62993
  })
62980
62994
  );
62981
- server.registerTool(
62995
+ server2.registerTool(
62982
62996
  "jefri_search",
62983
62997
  {
62984
62998
  title: "Discover agents",
@@ -62996,7 +63010,7 @@ Or just upload ${fname} from the agent's page in the web app.`
62996
63010
  );
62997
63011
  })
62998
63012
  );
62999
- server.registerTool(
63013
+ server2.registerTool(
63000
63014
  "jefri_set_status",
63001
63015
  {
63002
63016
  title: "Set presence",
@@ -63011,7 +63025,7 @@ Or just upload ${fname} from the agent's page in the web app.`
63011
63025
  })
63012
63026
  );
63013
63027
  if (ctx.local) {
63014
- server.registerTool(
63028
+ server2.registerTool(
63015
63029
  "jefri_notifications",
63016
63030
  {
63017
63031
  title: "Notification settings",
@@ -63090,7 +63104,7 @@ Or just upload ${fname} from the agent's page in the web app.`
63090
63104
  return ok3(summary);
63091
63105
  })
63092
63106
  );
63093
- server.registerTool(
63107
+ server2.registerTool(
63094
63108
  "jefri_autonomous",
63095
63109
  {
63096
63110
  title: "Autonomous mode",
@@ -63167,6 +63181,34 @@ function attachInbox(c, inbox, self, onIncoming) {
63167
63181
  c.on("file_received", capture);
63168
63182
  }
63169
63183
 
63184
+ // src/drain.ts
63185
+ function durationEnv(name, fallback, env = process.env) {
63186
+ const raw = env[name];
63187
+ if (raw === void 0 || raw === "") return fallback;
63188
+ const n = Number(raw);
63189
+ if (!Number.isFinite(n) || n <= 0) {
63190
+ console.error(`[mcp] ignoring ${name}="${raw}" \u2014 expected a positive number; using ${fallback}ms`);
63191
+ return fallback;
63192
+ }
63193
+ return n;
63194
+ }
63195
+ function sweepIdleSessions(map3) {
63196
+ let closed = 0;
63197
+ let busy = 0;
63198
+ for (const s of map3) {
63199
+ if (s.inflight > 0) {
63200
+ busy++;
63201
+ continue;
63202
+ }
63203
+ try {
63204
+ s.transport.close?.();
63205
+ closed++;
63206
+ } catch {
63207
+ }
63208
+ }
63209
+ return { closed, busy };
63210
+ }
63211
+
63170
63212
  // src/http.ts
63171
63213
  var HUB = process.env.JEFRI_SERVER ?? "http://localhost:4000";
63172
63214
  var PORT = Number(process.env.MCP_HTTP_PORT ?? 4001);
@@ -63310,7 +63352,14 @@ app.use((req, res, next) => {
63310
63352
  next();
63311
63353
  });
63312
63354
  app.use(import_express.default.json({ limit: process.env.MCP_MAX_BODY ?? "4mb" }));
63313
- var health = (_req, res) => res.json({ ok: true, service: "jefrichat-mcp-http", hub: HUB, sessions: sessions.size });
63355
+ var draining = false;
63356
+ var health = (_req, res) => res.status(draining ? 503 : 200).json({
63357
+ ok: !draining,
63358
+ draining,
63359
+ service: "jefrichat-mcp-http",
63360
+ hub: HUB,
63361
+ sessions: sessions.size
63362
+ });
63314
63363
  app.get("/health", health);
63315
63364
  app.get("/mcp/health", health);
63316
63365
  app.post("/mcp", async (req, res) => {
@@ -63488,13 +63537,52 @@ var bySession = async (req, res) => {
63488
63537
  };
63489
63538
  app.get("/mcp", bySession);
63490
63539
  app.delete("/mcp", bySession);
63491
- http.createServer(app).listen(PORT, () => {
63540
+ var server = http.createServer(app).listen(PORT, () => {
63492
63541
  console.error(`
63493
63542
  \u{1F310} Jefri Chat remote MCP (HTTP) on http://localhost:${PORT}/mcp`);
63494
63543
  console.error(` hub: ${HUB}`);
63495
63544
  console.error(` auth: Authorization: Bearer <jefri_token>
63496
63545
  `);
63497
63546
  });
63547
+ var DRAIN_MS = durationEnv("MCP_DRAIN_MS", 15e3);
63548
+ var UNHEALTHY_MS = durationEnv("MCP_UNHEALTHY_MS", 5e3);
63549
+ var shuttingDown = false;
63550
+ function drain2(signal) {
63551
+ if (shuttingDown) return;
63552
+ shuttingDown = true;
63553
+ draining = true;
63554
+ const deadline = Date.now() + UNHEALTHY_MS + DRAIN_MS;
63555
+ console.error(
63556
+ `[mcp] ${signal} \u2014 unhealthy for ${UNHEALTHY_MS}ms, then draining ${sessions.size} session(s) for up to ${DRAIN_MS}ms`
63557
+ );
63558
+ const closeAndFinish = () => {
63559
+ server.close(() => {
63560
+ console.error("[mcp] drained cleanly");
63561
+ process.exit(0);
63562
+ });
63563
+ const sweep = setInterval(() => {
63564
+ const { busy } = sweepIdleSessions(sessions.values());
63565
+ if (busy === 0) {
63566
+ clearInterval(sweep);
63567
+ console.error("[mcp] all sessions idle \u2014 closing");
63568
+ return;
63569
+ }
63570
+ if (Date.now() >= deadline) {
63571
+ clearInterval(sweep);
63572
+ console.error(`[mcp] drain deadline reached with ${busy} session(s) still busy \u2014 exiting`);
63573
+ process.exit(0);
63574
+ }
63575
+ }, 250);
63576
+ sweep.unref();
63577
+ };
63578
+ setTimeout(closeAndFinish, UNHEALTHY_MS).unref();
63579
+ setTimeout(() => {
63580
+ console.error("[mcp] drain deadline reached \u2014 exiting");
63581
+ process.exit(0);
63582
+ }, UNHEALTHY_MS + DRAIN_MS + 500).unref();
63583
+ }
63584
+ process.on("SIGTERM", () => drain2("SIGTERM"));
63585
+ process.on("SIGINT", () => drain2("SIGINT"));
63498
63586
  /*! Bundled license information:
63499
63587
 
63500
63588
  depd/index.js:
package/dist/index.js CHANGED
@@ -40788,7 +40788,24 @@ function waitFor(c2, event, match, timeoutMs = 4e3) {
40788
40788
  }, timeoutMs);
40789
40789
  });
40790
40790
  }
40791
- var ok3 = (text5) => ({ content: [{ type: "text", text: text5 }] });
40791
+ var upgradeNotice = null;
40792
+ var upgradeShownAt = 0;
40793
+ var UPGRADE_REPEAT_MS = 24 * 60 * 60 * 1e3;
40794
+ function setUpgradeNotice(text5) {
40795
+ upgradeNotice = text5;
40796
+ }
40797
+ function takeUpgradeNotice(now = Date.now()) {
40798
+ if (!upgradeNotice) return null;
40799
+ if (upgradeShownAt && now - upgradeShownAt < UPGRADE_REPEAT_MS) return null;
40800
+ upgradeShownAt = now;
40801
+ return upgradeNotice;
40802
+ }
40803
+ var ok3 = (text5, now = Date.now()) => {
40804
+ const notice = takeUpgradeNotice(now);
40805
+ return { content: [{ type: "text", text: notice ? `${text5}
40806
+
40807
+ ${notice}` : text5 }] };
40808
+ };
40792
40809
  var fail = (text5) => ({ content: [{ type: "text", text: text5 }], isError: true });
40793
40810
  var WATERMARK_FILE = np4.join(os4.homedir(), ".jefri", "inbox.json");
40794
40811
  var inboxWatermark = new Map(
@@ -42936,10 +42953,14 @@ async function main() {
42936
42953
  log("unhandled rejection:", reason?.stack ?? reason);
42937
42954
  });
42938
42955
  void checkForUpdate().then((u) => {
42939
- if (u?.outdated)
42956
+ if (u?.outdated) {
42957
+ setUpgradeNotice(
42958
+ `\u26A0\uFE0F Jefri Chat connector ${u.current} is out of date (latest ${u.latest}). Restart this agent to upgrade \u2014 a running connector keeps the build it started with. If it was started with npx, that is enough; if installed globally, run: npm update -g jefrichat-mcp`
42959
+ );
42940
42960
  note(
42941
42961
  `\u2191 update available: jefrichat-mcp ${u.current} \u2192 ${u.latest}. Reconnect this agent (npx jefrichat-mcp@latest, or 'npm update -g jefrichat-mcp@latest' if globally installed) to get it.`
42942
42962
  );
42963
+ }
42943
42964
  }).catch(() => {
42944
42965
  });
42945
42966
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jefrichat-mcp",
3
- "version": "0.48.7",
3
+ "version": "0.48.8",
4
4
  "description": "Jefri Chat connector — join the Jefri Chat network (WhatsApp for AI agents) from any MCP client (Claude, Codex, Cursor, …).",
5
5
  "type": "module",
6
6
  "bin": {