@hangox/mg-cli 1.1.2 → 1.1.3

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.js CHANGED
@@ -670,8 +670,8 @@ var ConnectionManager = class {
670
670
  allConnections = /* @__PURE__ */ new Map();
671
671
  /** 心跳检查定时器 */
672
672
  heartbeatTimer = null;
673
- constructor(logger) {
674
- this.logger = logger;
673
+ constructor(logger2) {
674
+ this.logger = logger2;
675
675
  }
676
676
  /**
677
677
  * 启动心跳检查
@@ -898,9 +898,9 @@ var RequestHandler = class {
898
898
  connectionManager;
899
899
  /** 待处理的请求 */
900
900
  pendingRequests = /* @__PURE__ */ new Map();
901
- constructor(connectionManager, logger) {
901
+ constructor(connectionManager, logger2) {
902
902
  this.connectionManager = connectionManager;
903
- this.logger = logger;
903
+ this.logger = logger2;
904
904
  }
905
905
  /**
906
906
  * 处理 Consumer 请求
@@ -1043,6 +1043,60 @@ var RequestHandler = class {
1043
1043
  }
1044
1044
  };
1045
1045
 
1046
+ // src/server/analytics.ts
1047
+ import { PostHog } from "posthog-node";
1048
+ var POSTHOG_API_KEY = "phc_cSZZIxZOPhWOlsw92Wz8tmKQ5z8eQYsI3m9aM2Ujia9";
1049
+ var POSTHOG_HOST = "https://us.i.posthog.com";
1050
+ var posthogClient = null;
1051
+ var logger = null;
1052
+ function isTelemetryDisabled() {
1053
+ return process.env.MG_TELEMETRY_DISABLED === "1" || process.env.MG_TELEMETRY_DISABLED === "true" || process.env.DO_NOT_TRACK === "1" || process.env.DO_NOT_TRACK === "true";
1054
+ }
1055
+ function initServerAnalytics(serverLogger) {
1056
+ logger = serverLogger;
1057
+ if (isTelemetryDisabled()) {
1058
+ logger.info("\u9065\u6D4B\u5DF2\u7981\u7528 (MG_TELEMETRY_DISABLED \u6216 DO_NOT_TRACK)");
1059
+ return;
1060
+ }
1061
+ if (!posthogClient) {
1062
+ posthogClient = new PostHog(POSTHOG_API_KEY, {
1063
+ host: POSTHOG_HOST,
1064
+ // Server 端使用批量模式,减少网络请求
1065
+ flushAt: 10,
1066
+ flushInterval: 3e4
1067
+ // 30 秒
1068
+ });
1069
+ logger.info("PostHog Analytics \u5DF2\u521D\u59CB\u5316");
1070
+ }
1071
+ }
1072
+ function trackEvent(eventData) {
1073
+ if (!posthogClient) {
1074
+ return;
1075
+ }
1076
+ try {
1077
+ posthogClient.capture({
1078
+ distinctId: eventData.distinctId,
1079
+ event: eventData.event,
1080
+ properties: eventData.properties
1081
+ });
1082
+ logger?.info(`\u7EDF\u8BA1\u4E8B\u4EF6\u5DF2\u8BB0\u5F55: ${eventData.event}`, eventData.properties);
1083
+ } catch (error) {
1084
+ logger?.error("\u7EDF\u8BA1\u4E8B\u4EF6\u8BB0\u5F55\u5931\u8D25:", error);
1085
+ }
1086
+ }
1087
+ async function shutdownServerAnalytics() {
1088
+ if (posthogClient) {
1089
+ try {
1090
+ logger?.info("\u6B63\u5728\u53D1\u9001\u5269\u4F59\u7EDF\u8BA1\u4E8B\u4EF6...");
1091
+ await posthogClient.shutdown();
1092
+ logger?.info("PostHog Analytics \u5DF2\u5173\u95ED");
1093
+ } catch (error) {
1094
+ logger?.error("\u5173\u95ED PostHog \u5931\u8D25:", error);
1095
+ }
1096
+ posthogClient = null;
1097
+ }
1098
+ }
1099
+
1046
1100
  // src/server/websocket-server.ts
1047
1101
  var MGServer = class {
1048
1102
  wss = null;
@@ -1074,6 +1128,7 @@ var MGServer = class {
1074
1128
  this.startedAt = /* @__PURE__ */ new Date();
1075
1129
  this.logger.info(`Server \u542F\u52A8\u6210\u529F\uFF0C\u76D1\u542C\u7AEF\u53E3: ${port}`);
1076
1130
  this.connectionManager.startHeartbeatCheck(HEARTBEAT_INTERVAL);
1131
+ initServerAnalytics(this.logger);
1077
1132
  resolve9(port);
1078
1133
  });
1079
1134
  this.wss.on("error", (error) => {
@@ -1133,6 +1188,10 @@ var MGServer = class {
1133
1188
  this.handleRegister(ws, message);
1134
1189
  return;
1135
1190
  }
1191
+ if (message.type === "track_analytics" /* TRACK_ANALYTICS */) {
1192
+ this.handleTrackAnalytics(message);
1193
+ return;
1194
+ }
1136
1195
  const managedWs = ws;
1137
1196
  if (!managedWs.connectionId) {
1138
1197
  this.logger.warn("\u672A\u6CE8\u518C\u7684\u8FDE\u63A5\u53D1\u9001\u6D88\u606F\uFF0C\u5FFD\u7565");
@@ -1210,6 +1269,9 @@ var MGServer = class {
1210
1269
  case "navigate_to_node" /* NAVIGATE_TO_NODE */:
1211
1270
  this.handleNavigateToNode(ws, message);
1212
1271
  break;
1272
+ case "track_analytics" /* TRACK_ANALYTICS */:
1273
+ this.handleTrackAnalytics(message);
1274
+ break;
1213
1275
  case "response" /* RESPONSE */:
1214
1276
  case "error" /* ERROR */:
1215
1277
  this.requestHandler.handleResponse(message);
@@ -1355,6 +1417,15 @@ var MGServer = class {
1355
1417
  }
1356
1418
  });
1357
1419
  }
1420
+ /**
1421
+ * 处理统计事件
1422
+ */
1423
+ handleTrackAnalytics(message) {
1424
+ const eventData = message.data;
1425
+ if (eventData) {
1426
+ trackEvent(eventData);
1427
+ }
1428
+ }
1358
1429
  /**
1359
1430
  * 处理节点导航请求
1360
1431
  */
@@ -1428,6 +1499,7 @@ var MGServer = class {
1428
1499
  return;
1429
1500
  }
1430
1501
  this.logger.info("\u6B63\u5728\u505C\u6B62 Server...");
1502
+ await shutdownServerAnalytics();
1431
1503
  this.requestHandler.cleanupAll();
1432
1504
  this.connectionManager.closeAll();
1433
1505
  return new Promise((resolve9) => {
@@ -1488,14 +1560,14 @@ async function startServerForeground(port) {
1488
1560
  );
1489
1561
  }
1490
1562
  ensureConfigDir();
1491
- const logger = createLogger({
1563
+ const logger2 = createLogger({
1492
1564
  console: true,
1493
1565
  file: true,
1494
1566
  minLevel: "INFO" /* INFO */
1495
1567
  });
1496
1568
  const server = createServer({
1497
1569
  port: port || DEFAULT_PORT,
1498
- logger
1570
+ logger: logger2
1499
1571
  });
1500
1572
  const cleanup = async () => {
1501
1573
  console.log("\n\u6B63\u5728\u505C\u6B62 Server...");
@@ -1521,7 +1593,7 @@ MG Server \u542F\u52A8\u6210\u529F`);
1521
1593
  console.log(`
1522
1594
  \u6309 Ctrl+C \u505C\u6B62...`);
1523
1595
  } catch (error) {
1524
- logger.error("Server \u542F\u52A8\u5931\u8D25:", error);
1596
+ logger2.error("Server \u542F\u52A8\u5931\u8D25:", error);
1525
1597
  throw error;
1526
1598
  }
1527
1599
  }
@@ -1781,14 +1853,11 @@ var MGClient = class {
1781
1853
  };
1782
1854
 
1783
1855
  // src/cli/analytics.ts
1784
- import { PostHog } from "posthog-node";
1856
+ import { WebSocket as WebSocket3 } from "ws";
1785
1857
  import { createHash } from "crypto";
1786
1858
  import { hostname, userInfo, platform, release } from "os";
1787
- var POSTHOG_API_KEY = "phc_cSZZIxZOPhWOlsw92Wz8tmKQ5z8eQYsI3m9aM2Ujia9";
1788
- var POSTHOG_HOST = "https://us.i.posthog.com";
1789
- var posthogClient = null;
1790
1859
  var machineId = null;
1791
- function isTelemetryDisabled() {
1860
+ function isTelemetryDisabled2() {
1792
1861
  return process.env.MG_TELEMETRY_DISABLED === "1" || process.env.MG_TELEMETRY_DISABLED === "true" || process.env.DO_NOT_TRACK === "1" || process.env.DO_NOT_TRACK === "true";
1793
1862
  }
1794
1863
  function getMachineId() {
@@ -1805,39 +1874,50 @@ function getMachineId() {
1805
1874
  }
1806
1875
  return machineId;
1807
1876
  }
1808
- function getClient() {
1809
- if (isTelemetryDisabled()) {
1810
- return null;
1811
- }
1812
- if (!posthogClient) {
1813
- posthogClient = new PostHog(POSTHOG_API_KEY, {
1814
- host: POSTHOG_HOST,
1815
- // CLI 工具使用立即刷新模式
1816
- flushAt: 1,
1817
- flushInterval: 0
1877
+ function sendToServer(eventData) {
1878
+ try {
1879
+ const serverInfo = readServerInfo();
1880
+ if (!serverInfo) {
1881
+ return;
1882
+ }
1883
+ if (!isProcessRunning(serverInfo.pid)) {
1884
+ return;
1885
+ }
1886
+ const ws = new WebSocket3(`ws://localhost:${serverInfo.port}`);
1887
+ const timeout = setTimeout(() => {
1888
+ ws.close();
1889
+ }, 1e3);
1890
+ ws.on("open", () => {
1891
+ const message = {
1892
+ type: "track_analytics" /* TRACK_ANALYTICS */,
1893
+ data: eventData
1894
+ };
1895
+ ws.send(JSON.stringify(message));
1896
+ clearTimeout(timeout);
1897
+ ws.close();
1818
1898
  });
1899
+ ws.on("error", () => {
1900
+ clearTimeout(timeout);
1901
+ });
1902
+ } catch {
1819
1903
  }
1820
- return posthogClient;
1821
1904
  }
1822
1905
  function trackCommand(properties) {
1823
- const client = getClient();
1824
- if (!client) {
1906
+ if (isTelemetryDisabled2()) {
1825
1907
  return;
1826
1908
  }
1827
- try {
1828
- client.capture({
1829
- distinctId: getMachineId(),
1830
- event: "cli_command",
1831
- properties: {
1832
- ...properties,
1833
- version: getVersion(),
1834
- os: platform(),
1835
- os_release: release(),
1836
- node_version: process.version
1837
- }
1838
- });
1839
- } catch {
1840
- }
1909
+ const eventData = {
1910
+ distinctId: getMachineId(),
1911
+ event: "cli_command",
1912
+ properties: {
1913
+ ...properties,
1914
+ version: getVersion(),
1915
+ os: platform(),
1916
+ os_release: release(),
1917
+ node_version: process.version
1918
+ }
1919
+ };
1920
+ sendToServer(eventData);
1841
1921
  }
1842
1922
  function createCommandTracker(commandName) {
1843
1923
  const startTime = Date.now();