@hangox/mg-cli 1.1.2 → 1.1.4

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