@hirohsu/user-web-feedback 2.8.9 → 2.8.10

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.cjs CHANGED
@@ -105762,6 +105762,7 @@ var WebServer = class {
105762
105762
  mcpServerRef = null;
105763
105763
  sseTransports = /* @__PURE__ */ new Map();
105764
105764
  sseTransportsList = [];
105765
+ pendingDeliveryCache = /* @__PURE__ */ new Map();
105765
105766
  dbInitialized = false;
105766
105767
  selfProbeService;
105767
105768
  /**
@@ -107803,8 +107804,24 @@ var WebServer = class {
107803
107804
  this.emitDashboardSessionUpdated(session.projectId, feedbackData.sessionId, "completed", session.workSummary);
107804
107805
  }
107805
107806
  if (session.resolve) {
107807
+ if (session.projectId) {
107808
+ const cachedResult2 = {
107809
+ feedback: session.feedback,
107810
+ sessionId: feedbackData.sessionId,
107811
+ feedbackUrl: this.generateFeedbackUrl(feedbackData.sessionId),
107812
+ projectId: session.projectId,
107813
+ projectName: session.projectName || ""
107814
+ };
107815
+ this.pendingDeliveryCache.set(session.projectId, {
107816
+ result: cachedResult2,
107817
+ expiresAt: Date.now() + 6e4
107818
+ });
107819
+ const projectId = session.projectId;
107820
+ setTimeout(() => this.pendingDeliveryCache.delete(projectId), 6e4);
107821
+ }
107806
107822
  session.resolve(session.feedback);
107807
- this.sessionStorage.deleteSession(feedbackData.sessionId);
107823
+ const sessionIdToDelete = feedbackData.sessionId;
107824
+ setTimeout(() => this.sessionStorage.deleteSession(sessionIdToDelete), 5e3);
107808
107825
  }
107809
107826
  } catch (error2) {
107810
107827
  logger.error("\u8655\u7406\u56DE\u994B\u63D0\u4EA4\u6642\u51FA\u932F:", error2);
@@ -107891,6 +107908,12 @@ var WebServer = class {
107891
107908
  const project = projectName ? projectManager.getOrCreateProject(projectName, projectPath) : projectManager.getDefaultProject();
107892
107909
  logger.info(`\u5EFA\u7ACB\u56DE\u994B\u6703\u8A71: ${sessionId}, \u903E\u6642: ${timeoutSeconds}\u79D2, \u5C08\u6848: ${project.name} (${project.id})`);
107893
107910
  const feedbackUrl = this.generateFeedbackUrl(sessionId);
107911
+ const pendingEntry = this.pendingDeliveryCache.get(project.id);
107912
+ if (pendingEntry && pendingEntry.expiresAt > Date.now() && !this.sessionStorage.getSession(pendingEntry.result.sessionId)) {
107913
+ logger.warn(`[\u91CD\u8A66\u88DC\u511F] \u5075\u6E2C\u5230\u5C08\u6848 "${project.name}" \u5B58\u5728\u672A\u78BA\u8A8D\u9001\u9054\u7684\u56DE\u8986 (sessionId: ${pendingEntry.result.sessionId})\uFF0C\u76F4\u63A5\u56DE\u50B3\u5FEB\u53D6\u7D50\u679C`);
107914
+ this.pendingDeliveryCache.delete(project.id);
107915
+ return pendingEntry.result;
107916
+ }
107894
107917
  return new Promise((resolve2, reject) => {
107895
107918
  const session = {
107896
107919
  workSummary,
@@ -108137,7 +108160,7 @@ var WebServer = class {
108137
108160
  } else {
108138
108161
  clearInterval(heartbeat);
108139
108162
  }
108140
- }, 3e4);
108163
+ }, 15e3);
108141
108164
  req.on("close", () => {
108142
108165
  clearInterval(heartbeat);
108143
108166
  logger.info("SSE \u9023\u7DDA\u5DF2\u95DC\u9589");
@@ -108197,6 +108220,11 @@ var WebServer = class {
108197
108220
  }
108198
108221
  req.socket?.setTimeout(0);
108199
108222
  req.socket?.setKeepAlive(true, 3e4);
108223
+ req.on("close", () => {
108224
+ if (!res.writableEnded) {
108225
+ logger.warn("[\u5BB9\u932F] MCP Client HTTP \u9023\u7DDA\u5728\u5DE5\u5177\u57F7\u884C\u671F\u9593\u63D0\u524D\u95DC\u9589\uFF0C\u56DE\u8986\u53EF\u80FD\u672A\u9001\u9054\uFF0C\u4E0B\u6B21\u547C\u53EB\u5C07\u5F9E\u5FEB\u53D6\u53D6\u56DE");
108226
+ }
108227
+ });
108200
108228
  const sessionId = req.headers["mcp-session-id"];
108201
108229
  const isInitialize = req.body?.method === "initialize";
108202
108230
  if (isInitialize) {
package/dist/index.cjs CHANGED
@@ -102779,6 +102779,7 @@ var WebServer = class {
102779
102779
  mcpServerRef = null;
102780
102780
  sseTransports = /* @__PURE__ */ new Map();
102781
102781
  sseTransportsList = [];
102782
+ pendingDeliveryCache = /* @__PURE__ */ new Map();
102782
102783
  dbInitialized = false;
102783
102784
  selfProbeService;
102784
102785
  /**
@@ -104820,8 +104821,24 @@ var WebServer = class {
104820
104821
  this.emitDashboardSessionUpdated(session.projectId, feedbackData.sessionId, "completed", session.workSummary);
104821
104822
  }
104822
104823
  if (session.resolve) {
104824
+ if (session.projectId) {
104825
+ const cachedResult2 = {
104826
+ feedback: session.feedback,
104827
+ sessionId: feedbackData.sessionId,
104828
+ feedbackUrl: this.generateFeedbackUrl(feedbackData.sessionId),
104829
+ projectId: session.projectId,
104830
+ projectName: session.projectName || ""
104831
+ };
104832
+ this.pendingDeliveryCache.set(session.projectId, {
104833
+ result: cachedResult2,
104834
+ expiresAt: Date.now() + 6e4
104835
+ });
104836
+ const projectId = session.projectId;
104837
+ setTimeout(() => this.pendingDeliveryCache.delete(projectId), 6e4);
104838
+ }
104823
104839
  session.resolve(session.feedback);
104824
- this.sessionStorage.deleteSession(feedbackData.sessionId);
104840
+ const sessionIdToDelete = feedbackData.sessionId;
104841
+ setTimeout(() => this.sessionStorage.deleteSession(sessionIdToDelete), 5e3);
104825
104842
  }
104826
104843
  } catch (error2) {
104827
104844
  logger.error("\u8655\u7406\u56DE\u994B\u63D0\u4EA4\u6642\u51FA\u932F:", error2);
@@ -104908,6 +104925,12 @@ var WebServer = class {
104908
104925
  const project = projectName ? projectManager.getOrCreateProject(projectName, projectPath) : projectManager.getDefaultProject();
104909
104926
  logger.info(`\u5EFA\u7ACB\u56DE\u994B\u6703\u8A71: ${sessionId}, \u903E\u6642: ${timeoutSeconds}\u79D2, \u5C08\u6848: ${project.name} (${project.id})`);
104910
104927
  const feedbackUrl = this.generateFeedbackUrl(sessionId);
104928
+ const pendingEntry = this.pendingDeliveryCache.get(project.id);
104929
+ if (pendingEntry && pendingEntry.expiresAt > Date.now() && !this.sessionStorage.getSession(pendingEntry.result.sessionId)) {
104930
+ logger.warn(`[\u91CD\u8A66\u88DC\u511F] \u5075\u6E2C\u5230\u5C08\u6848 "${project.name}" \u5B58\u5728\u672A\u78BA\u8A8D\u9001\u9054\u7684\u56DE\u8986 (sessionId: ${pendingEntry.result.sessionId})\uFF0C\u76F4\u63A5\u56DE\u50B3\u5FEB\u53D6\u7D50\u679C`);
104931
+ this.pendingDeliveryCache.delete(project.id);
104932
+ return pendingEntry.result;
104933
+ }
104911
104934
  return new Promise((resolve, reject) => {
104912
104935
  const session = {
104913
104936
  workSummary,
@@ -105154,7 +105177,7 @@ var WebServer = class {
105154
105177
  } else {
105155
105178
  clearInterval(heartbeat);
105156
105179
  }
105157
- }, 3e4);
105180
+ }, 15e3);
105158
105181
  req.on("close", () => {
105159
105182
  clearInterval(heartbeat);
105160
105183
  logger.info("SSE \u9023\u7DDA\u5DF2\u95DC\u9589");
@@ -105214,6 +105237,11 @@ var WebServer = class {
105214
105237
  }
105215
105238
  req.socket?.setTimeout(0);
105216
105239
  req.socket?.setKeepAlive(true, 3e4);
105240
+ req.on("close", () => {
105241
+ if (!res.writableEnded) {
105242
+ logger.warn("[\u5BB9\u932F] MCP Client HTTP \u9023\u7DDA\u5728\u5DE5\u5177\u57F7\u884C\u671F\u9593\u63D0\u524D\u95DC\u9589\uFF0C\u56DE\u8986\u53EF\u80FD\u672A\u9001\u9054\uFF0C\u4E0B\u6B21\u547C\u53EB\u5C07\u5F9E\u5FEB\u53D6\u53D6\u56DE");
105243
+ }
105244
+ });
105217
105245
  const sessionId = req.headers["mcp-session-id"];
105218
105246
  const isInitialize = req.body?.method === "initialize";
105219
105247
  if (isInitialize) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hirohsu/user-web-feedback",
3
- "version": "2.8.9",
3
+ "version": "2.8.10",
4
4
  "description": "基於Node.js的MCP回饋收集器 - 支持AI工作彙報和用戶回饋收集",
5
5
  "main": "dist/index.cjs",
6
6
  "bin": {