@jonathanleelx/meddle 0.5.0-beta.2 → 0.5.0-beta.21

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 (189) hide show
  1. package/CONFIG_STRUCTURE.md +8 -2
  2. package/README.md +2 -0
  3. package/bin/commands/mock/add.js +33 -4
  4. package/bin/commands/mock/delete.js +8 -1
  5. package/bin/commands/mock/index.js +8 -4
  6. package/bin/commands/mock/list.js +1 -0
  7. package/bin/commands/mock/toggle.js +8 -1
  8. package/bin/commands/mock/update.js +31 -5
  9. package/bin/commands/route/active.js +6 -2
  10. package/bin/commands/route/add.js +12 -2
  11. package/bin/commands/route/create.js +8 -1
  12. package/bin/commands/route/delete.js +12 -2
  13. package/bin/commands/route/update.js +12 -2
  14. package/bin/commands/update.js +4 -0
  15. package/bin/lib/file-access.js +68 -25
  16. package/bin/lib/output.js +20 -1
  17. package/bin/lib/proxy-detect.js +99 -20
  18. package/bin/lib/update-check.js +67 -6
  19. package/dist/core/config-diagnostics.d.ts.map +1 -1
  20. package/dist/core/config-diagnostics.js +6 -1
  21. package/dist/core/config-diagnostics.js.map +1 -1
  22. package/dist/core/custom-plugin-loader.d.ts.map +1 -1
  23. package/dist/core/custom-plugin-loader.js +2 -0
  24. package/dist/core/custom-plugin-loader.js.map +1 -1
  25. package/dist/core/h2-pool.d.ts +1 -0
  26. package/dist/core/h2-pool.d.ts.map +1 -1
  27. package/dist/core/h2-pool.js +79 -23
  28. package/dist/core/h2-pool.js.map +1 -1
  29. package/dist/core/mock-handler.d.ts +65 -0
  30. package/dist/core/mock-handler.d.ts.map +1 -1
  31. package/dist/core/mock-handler.js +525 -29
  32. package/dist/core/mock-handler.js.map +1 -1
  33. package/dist/core/mock-utils.d.ts +58 -0
  34. package/dist/core/mock-utils.d.ts.map +1 -0
  35. package/dist/core/mock-utils.js +167 -0
  36. package/dist/core/mock-utils.js.map +1 -0
  37. package/dist/core/plugin-bootstrap-runner.d.ts +1 -0
  38. package/dist/core/plugin-bootstrap-runner.d.ts.map +1 -1
  39. package/dist/core/plugin-bootstrap-runner.js +37 -1
  40. package/dist/core/plugin-bootstrap-runner.js.map +1 -1
  41. package/dist/core/plugin-intercept.d.ts.map +1 -1
  42. package/dist/core/plugin-intercept.js +1 -0
  43. package/dist/core/plugin-intercept.js.map +1 -1
  44. package/dist/core/plugin-source.d.ts +24 -0
  45. package/dist/core/plugin-source.d.ts.map +1 -0
  46. package/dist/core/plugin-source.js +47 -0
  47. package/dist/core/plugin-source.js.map +1 -0
  48. package/dist/core/types.d.ts +13 -1
  49. package/dist/core/types.d.ts.map +1 -1
  50. package/dist/helpers.d.ts +8 -1
  51. package/dist/helpers.d.ts.map +1 -1
  52. package/dist/helpers.js +22 -5
  53. package/dist/helpers.js.map +1 -1
  54. package/dist/plugins/builtin/mock-plugin.d.ts.map +1 -1
  55. package/dist/plugins/builtin/mock-plugin.js +6 -5
  56. package/dist/plugins/builtin/mock-plugin.js.map +1 -1
  57. package/dist/server/agent/tools.d.ts.map +1 -1
  58. package/dist/server/agent/tools.js +4 -0
  59. package/dist/server/agent/tools.js.map +1 -1
  60. package/dist/server/app-info.d.ts +19 -0
  61. package/dist/server/app-info.d.ts.map +1 -0
  62. package/dist/server/app-info.js +84 -0
  63. package/dist/server/app-info.js.map +1 -0
  64. package/dist/server/config.d.ts +1 -0
  65. package/dist/server/config.d.ts.map +1 -1
  66. package/dist/server/config.js +57 -7
  67. package/dist/server/config.js.map +1 -1
  68. package/dist/server/health.d.ts.map +1 -1
  69. package/dist/server/health.js +8 -0
  70. package/dist/server/health.js.map +1 -1
  71. package/dist/server/index.d.ts +15 -0
  72. package/dist/server/index.d.ts.map +1 -1
  73. package/dist/server/index.js +2 -0
  74. package/dist/server/index.js.map +1 -1
  75. package/dist/server/mocks.d.ts +26 -0
  76. package/dist/server/mocks.d.ts.map +1 -1
  77. package/dist/server/mocks.js +110 -13
  78. package/dist/server/mocks.js.map +1 -1
  79. package/dist/server/plugins.d.ts.map +1 -1
  80. package/dist/server/plugins.js +56 -11
  81. package/dist/server/plugins.js.map +1 -1
  82. package/dist/server/rule-files.d.ts +53 -0
  83. package/dist/server/rule-files.d.ts.map +1 -1
  84. package/dist/server/rule-files.js +281 -30
  85. package/dist/server/rule-files.js.map +1 -1
  86. package/index.js +33 -5
  87. package/mcp-server.js +3 -0
  88. package/package.json +3 -2
  89. package/plugins/builtin/mock-plugin.ts +9 -5
  90. package/web/dist/assets/alert-BmsRCcSL.js +1 -0
  91. package/web/dist/assets/arrow-right-BNum_060.js +1 -0
  92. package/web/dist/assets/{body-diff-view-D7dCWajG.js → body-diff-view-ByCHr9bv.js} +2 -2
  93. package/web/dist/assets/button-BFNlGZ5p.js +1 -0
  94. package/web/dist/assets/check-BkfHQ6re.js +1 -0
  95. package/web/dist/assets/checkbox-v2kzp7K8.js +1 -0
  96. package/web/dist/assets/chevron-down-DHwUtL4O.js +1 -0
  97. package/web/dist/assets/{circle-alert-Q8cZk9Rv.js → circle-alert-zMagrFuI.js} +1 -1
  98. package/web/dist/assets/{circle-x-C9USji_R.js → circle-x-BEkinhez.js} +1 -1
  99. package/web/dist/assets/code-DD-AYxxu.js +1 -0
  100. package/web/dist/assets/{copy-BYjq1hdN.js → copy-BRnscYy1.js} +1 -1
  101. package/web/dist/assets/detail-panel-DK7pM43g.js +4 -0
  102. package/web/dist/assets/{dist-D5Dj17P8.js → dist-BCvvYbmI.js} +1 -1
  103. package/web/dist/assets/dist-BNcjMpca.js +1 -0
  104. package/web/dist/assets/{dist-Bb9TeEub.js → dist-C-E2R2jk.js} +1 -1
  105. package/web/dist/assets/{dist-C6eaYCUo.js → dist-CFZ4xMSF.js} +1 -1
  106. package/web/dist/assets/{dist-C5nMErq8.js → dist-CRmX_NvH.js} +1 -1
  107. package/web/dist/assets/dist-DD7AvbXP.js +1 -0
  108. package/web/dist/assets/{dist-Cn0y0IRn.js → dist-LiAcI8CK.js} +1 -1
  109. package/web/dist/assets/dist-UcOFuoN0.js +5 -0
  110. package/web/dist/assets/{dist-B8XUKgXe.js → dist-YM3jbhT-.js} +1 -1
  111. package/web/dist/assets/editor-pane-actions-DN-pxFsl.js +1 -0
  112. package/web/dist/assets/es2015-CRmLuA2o.js +41 -0
  113. package/web/dist/assets/{global-panel-shell-R-EZQRhs.js → global-panel-shell-D32I98dR.js} +4 -4
  114. package/web/dist/assets/health-panel-Dw7qdFVS.js +1 -0
  115. package/web/dist/assets/index-CYUNdxqh.css +2 -0
  116. package/web/dist/assets/index-CkoYwomI.js +18 -0
  117. package/web/dist/assets/mobile-proxy-panel-DtiDkpAa.js +8 -0
  118. package/web/dist/assets/mock-config-C3jSpNNu.js +1 -0
  119. package/web/dist/assets/mock-editor-panel-ByCYWJjO.js +20 -0
  120. package/web/dist/assets/mocks-file-missing-note-DmrrCBYY.js +1 -0
  121. package/web/dist/assets/monaco-editor-6oLiu4W6.js +11 -0
  122. package/web/dist/assets/pane-split-DYB05onX.js +1 -0
  123. package/web/dist/assets/panel-heading-BS8loc49.js +1 -0
  124. package/web/dist/assets/{pencil-line-Cqe41E4h.js → pencil-line-CEZ7D-de.js} +1 -1
  125. package/web/dist/assets/plugin-code-editor-DGzCBEpg.js +2 -0
  126. package/web/dist/assets/plugin-config-NVw234EF.js +2 -0
  127. package/web/dist/assets/plugin-generator-Ba4hP5rg.js +2 -0
  128. package/web/dist/assets/plugin-test-dialog-B4ojc2_9.js +7 -0
  129. package/web/dist/assets/plus-ixZQRprm.js +1 -0
  130. package/web/dist/assets/{refresh-cw-CG3HaiQT.js → refresh-cw-BfLoHqg5.js} +1 -1
  131. package/web/dist/assets/rotate-ccw-CRguJya4.js +1 -0
  132. package/web/dist/assets/route-preview-BspvfNdW.js +1 -0
  133. package/web/dist/assets/{rule-ai-assistant-panel-CNL1O0GY.js → rule-ai-assistant-panel-CQTsZMJu.js} +2 -2
  134. package/web/dist/assets/rule-config-DDOeMRXa.js +15 -0
  135. package/web/dist/assets/rule-overview-panel-CmWdMs4I.js +1 -0
  136. package/web/dist/assets/{server-Cpj4KNwN.js → server-eYXq3PbE.js} +1 -1
  137. package/web/dist/assets/settings-panel-aB0ojA9D.js +1 -0
  138. package/web/dist/assets/{shield-check-OqUmVLQt.js → shield-check-hQXjdfZ7.js} +1 -1
  139. package/web/dist/assets/smartphone-D4Q7cQfm.js +1 -0
  140. package/web/dist/assets/switch-DpLnRvOJ.js +1 -0
  141. package/web/dist/assets/{syntax-highlight-BHsSDUha.js → syntax-highlight-EJCxGikd.js} +1 -1
  142. package/web/dist/assets/table-2-DvGHhMm4.js +1 -0
  143. package/web/dist/assets/table-C3mgEjkP.js +1 -0
  144. package/web/dist/assets/textarea-BjWF0pk4.js +1 -0
  145. package/web/dist/assets/{wand-sparkles-wkul5vje.js → wand-sparkles-DDGjzjnX.js} +1 -1
  146. package/web/dist/assets/{wifi-D9M35Ajj.js → wifi-QkTcTrED.js} +1 -1
  147. package/web/dist/assets/{zap-Djo4cgux.js → zap-CEVoVkAg.js} +1 -1
  148. package/web/dist/index.html +17 -12
  149. package/web/dist/assets/alert-Bve02Ufr.js +0 -1
  150. package/web/dist/assets/arrow-right-B4Mrlj2-.js +0 -1
  151. package/web/dist/assets/button-BTToMaBW.js +0 -1
  152. package/web/dist/assets/checkbox-DK9f9Mxu.js +0 -1
  153. package/web/dist/assets/chevron-down-CPngAx4M.js +0 -1
  154. package/web/dist/assets/chevron-right-V1DGIDbL.js +0 -1
  155. package/web/dist/assets/code-5_eJ_XpJ.js +0 -1
  156. package/web/dist/assets/code-fixer-IRTVs-a6.js +0 -20
  157. package/web/dist/assets/detail-panel--2r_Fgpi.js +0 -4
  158. package/web/dist/assets/dist-CxdY_A67.js +0 -5
  159. package/web/dist/assets/es2015-CfXu88Y7.js +0 -41
  160. package/web/dist/assets/file-system-access-DK7FI6pN.js +0 -1
  161. package/web/dist/assets/health-panel-CKt2-Gkj.js +0 -1
  162. package/web/dist/assets/index-DhzkcDnh.js +0 -18
  163. package/web/dist/assets/index-PcoCj3ST.css +0 -2
  164. package/web/dist/assets/mobile-proxy-panel-Dxz-7iYx.js +0 -8
  165. package/web/dist/assets/mock-config-84LSNP6M.js +0 -1
  166. package/web/dist/assets/mock-editor-panel-RJ1abekr.js +0 -1
  167. package/web/dist/assets/monaco-editor-CbL970eS.js +0 -11
  168. package/web/dist/assets/plugin-code-editor-DfLc4JdP.js +0 -2
  169. package/web/dist/assets/plugin-config-CT-u4XYw.js +0 -1
  170. package/web/dist/assets/plugin-generator-CyBK9FuM.js +0 -2
  171. package/web/dist/assets/plugin-test-dialog-B-NF0sGH.js +0 -7
  172. package/web/dist/assets/plus-tVxSydJ8.js +0 -1
  173. package/web/dist/assets/rotate-ccw-CAYM6Vv0.js +0 -1
  174. package/web/dist/assets/route-preview-C8nW9w7i.js +0 -1
  175. package/web/dist/assets/rule-config-DXfovZnm.js +0 -15
  176. package/web/dist/assets/select-DQ6s7CL8.js +0 -1
  177. package/web/dist/assets/settings-panel-BhXgMr_a.js +0 -1
  178. package/web/dist/assets/smartphone-DKeDuJTU.js +0 -1
  179. package/web/dist/assets/switch-C-Xk56TK.js +0 -1
  180. package/web/dist/assets/table-DymgLlcc.js +0 -1
  181. package/web/dist/assets/textarea-vuxJwU0x.js +0 -1
  182. /package/web/dist/assets/{ai-config-store-DQXVJVn_.js → ai-config-store-B_VpGvwx.js} +0 -0
  183. /package/web/dist/assets/{babel-DsprIpXZ.js → babel-D1quDdNt.js} +0 -0
  184. /package/web/dist/assets/{clipboard-Dz6MgwV-.js → clipboard-DUgC_tNv.js} +0 -0
  185. /package/web/dist/assets/{dist-DZJ9SMlJ.js → dist-Bq2klZ3g.js} +0 -0
  186. /package/web/dist/assets/{estree-BP7k0NIt.js → estree--Vq99DGn.js} +0 -0
  187. /package/web/dist/assets/{html-6FIWbqxX.js → html-D2PZBPnP.js} +0 -0
  188. /package/web/dist/assets/{postcss-Dnf30fQU.js → postcss-DfIslWug.js} +0 -0
  189. /package/web/dist/assets/{standalone-CjxtLKw-.js → standalone-D-fjaAIs.js} +0 -0
@@ -4,6 +4,7 @@ export declare function refreshConfig(ctx: ServerContext): {
4
4
  status: string;
5
5
  message: string;
6
6
  mocksPath: string;
7
+ mocksParseError?: unknown;
7
8
  };
8
9
  export declare function registerConfigRoutes(app: Application, ctx: ServerContext): void;
9
10
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../server/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqB,MAAM,SAAS,CAAA;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAEvC,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAWxG;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CA0E/E"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../server/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqB,MAAM,SAAS,CAAA;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAcvC,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,CAanI;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CA+G/E"}
@@ -36,14 +36,27 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.refreshConfig = refreshConfig;
37
37
  exports.registerConfigRoutes = registerConfigRoutes;
38
38
  const fs = __importStar(require("fs"));
39
- function refreshConfig(ctx) {
40
- ctx.reloadAllRuleFiles();
39
+ /**
40
+ * Re-resolve the mocks file from settings and load it (issue #118). When the
41
+ * path changed, the mock handler also moves its file watcher and starts the
42
+ * id counter from the new file; later saves go to the new file. The old file
43
+ * is never modified or deleted.
44
+ */
45
+ function reloadMocksFromSettings(ctx) {
41
46
  ctx.currentMocksPath = null;
42
47
  ctx.loadMockRules();
48
+ ctx.broadcastToAllClients({ type: 'mocksUpdated', rules: ctx.mockRules });
49
+ }
50
+ function refreshConfig(ctx) {
51
+ ctx.reloadAllRuleFiles();
52
+ reloadMocksFromSettings(ctx);
53
+ // Issue #120: surface a broken mocks file instead of reporting a silent empty list.
54
+ const parseError = ctx.getMocksParseError?.() || null;
43
55
  return {
44
56
  status: 'success',
45
- message: '配置已刷新',
57
+ message: parseError ? '配置已刷新(Mock 文件格式错误,未加载规则)' : '配置已刷新',
46
58
  mocksPath: ctx.getMockFilePath(),
59
+ ...(parseError ? { mocksParseError: parseError } : {}),
47
60
  };
48
61
  }
49
62
  function registerConfigRoutes(app, ctx) {
@@ -93,13 +106,24 @@ function registerConfigRoutes(app, ctx) {
93
106
  }
94
107
  res.end();
95
108
  });
96
- // API: 保存系统设置
109
+ function writeSettingsAndApply(settings) {
110
+ const previousMocksPath = ctx.getMockFilePath();
111
+ const tmp = `${ctx.settingsPath}.${process.pid}.${Date.now()}.tmp`;
112
+ fs.writeFileSync(tmp, JSON.stringify(settings, null, 2), 'utf8');
113
+ fs.renameSync(tmp, ctx.settingsPath);
114
+ ctx.refreshClientAliases();
115
+ // Issue #118: a changed mocksFilePath takes effect right away (no
116
+ // restart / refresh needed). Unrelated settings saves leave the
117
+ // loaded mocks alone.
118
+ ctx.currentMocksPath = null;
119
+ if (ctx.getMockFilePath() !== previousMocksPath)
120
+ reloadMocksFromSettings(ctx);
121
+ }
122
+ // API: 保存系统设置(整份替换;旧客户端 / 迁移使用)
97
123
  app.post('/api/settings', (req, res) => {
98
124
  res.setHeader('Content-Type', 'application/json');
99
125
  try {
100
- const settings = req.body;
101
- fs.writeFileSync(ctx.settingsPath, JSON.stringify(settings, null, 2), 'utf8');
102
- ctx.refreshClientAliases();
126
+ writeSettingsAndApply(req.body);
103
127
  res.write(JSON.stringify({ status: 'success', message: '设置已保存' }));
104
128
  }
105
129
  catch (error) {
@@ -108,6 +132,32 @@ function registerConfigRoutes(app, ctx) {
108
132
  }
109
133
  res.end();
110
134
  });
135
+ // API: 只更新提交的字段(issue #121)。旧标签页保存某一项设置时,
136
+ // 不会把别处改过的字段(如 mocksFilePath)改回它手里的旧值。
137
+ app.patch('/api/settings', (req, res) => {
138
+ res.setHeader('Content-Type', 'application/json');
139
+ try {
140
+ const updates = req.body;
141
+ if (!updates || typeof updates !== 'object' || Array.isArray(updates)) {
142
+ res.statusCode = 400;
143
+ res.write(JSON.stringify({ error: '设置更新必须是 JSON 对象' }));
144
+ res.end();
145
+ return;
146
+ }
147
+ let current = {};
148
+ if (fs.existsSync(ctx.settingsPath)) {
149
+ current = JSON.parse(fs.readFileSync(ctx.settingsPath, 'utf8'));
150
+ }
151
+ const merged = { ...current, ...updates };
152
+ writeSettingsAndApply(merged);
153
+ res.write(JSON.stringify({ status: 'success', message: '设置已保存', settings: merged }));
154
+ }
155
+ catch (error) {
156
+ res.statusCode = 500;
157
+ res.write(JSON.stringify({ error: error.message }));
158
+ }
159
+ res.end();
160
+ });
111
161
  // API: 配置文件健康检查
112
162
  app.get('/api/config-doctor', (_req, res) => {
113
163
  res.setHeader('Content-Type', 'application/json');
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../server/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,sCAWC;AAED,oDA0EC;AA1FD,uCAAwB;AAGxB,SAAgB,aAAa,CAAC,GAAkB;IAC5C,GAAG,CAAC,kBAAkB,EAAE,CAAA;IAExB,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAA;IAC3B,GAAG,CAAC,aAAa,EAAE,CAAA;IAEnB,OAAO;QACH,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,GAAG,CAAC,eAAe,EAAE;KACnC,CAAA;AACL,CAAC;AAED,SAAgB,oBAAoB,CAAC,GAAgB,EAAE,GAAkB;IACrE,GAAG,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QAC3D,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,YAAY;IACZ,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,EAAE,IAAa,EAAE,GAAa,EAAE,EAAE;QACnE,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAA;QACjD,IAAI,CAAC;YACD,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,GAAG,CAAC,UAAU,GAAG,GAAG,CAAA;YACpB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QAClE,CAAC;QACD,GAAG,CAAC,GAAG,EAAE,CAAA;IACb,CAAC,CAAC,CAAA;IAEF,cAAc;IACd,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QACtD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAA;QACjD,IAAI,CAAC;YACD,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;gBAClC,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;gBAC9D,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;YAC3B,CAAC;iBAAM,CAAC;gBACJ,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;oBACrB,KAAK,EAAE,QAAQ;oBACf,WAAW,EAAE,MAAM;oBACnB,QAAQ,EAAE,QAAQ;oBAClB,gBAAgB,EAAE,GAAG;oBACrB,QAAQ,EAAE;wBACN,OAAO,EAAE,KAAK;wBACd,QAAQ,EAAE,QAAQ;wBAClB,MAAM,EAAE,EAAE;wBACV,OAAO,EAAE,EAAE;wBACX,KAAK,EAAE,EAAE;wBACT,MAAM,EAAE,EAAE;qBACb;iBACJ,CAAC,CAAC,CAAA;YACP,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,GAAG,CAAC,UAAU,GAAG,GAAG,CAAA;YACpB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QAClE,CAAC;QACD,GAAG,CAAC,GAAG,EAAE,CAAA;IACb,CAAC,CAAC,CAAA;IAEF,cAAc;IACd,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;QACtD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAA;QACjD,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAA;YACzB,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;YAC7E,GAAG,CAAC,oBAAoB,EAAE,CAAA;YAC1B,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,GAAG,CAAC,UAAU,GAAG,GAAG,CAAA;YACpB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QAClE,CAAC;QACD,GAAG,CAAC,GAAG,EAAE,CAAA;IACb,CAAC,CAAC,CAAA;IAEF,gBAAgB;IAChB,GAAG,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QAC3D,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAA;QACjD,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,GAAG,CAAC,wBAAwB,EAAE,CAAA;YAC7C,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,GAAG,CAAC,UAAU,GAAG,GAAG,CAAA;YACpB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QAClE,CAAC;QACD,GAAG,CAAC,GAAG,EAAE,CAAA;IACb,CAAC,CAAC,CAAA;AACN,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../server/config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../server/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqB,MAAM,SAAS,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAEvC,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAkB/E"}
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../server/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqB,MAAM,SAAS,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAEvC,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CA2B/E"}
@@ -2,6 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.registerHealthRoutes = registerHealthRoutes;
4
4
  function registerHealthRoutes(app, ctx) {
5
+ /**
6
+ * Side-effect-free reachability probe for the Web UI heartbeat (#105).
7
+ * Must NOT call getRuntimeHealth()/snapshot() — that resets CPU sampling and
8
+ * event-loop delay histograms shared with the watchdog.
9
+ */
10
+ app.get('/api/ping', (_req, res) => {
11
+ res.status(204).end();
12
+ });
5
13
  app.get('/api/health', (_req, res) => {
6
14
  const health = ctx.getRuntimeHealth();
7
15
  res.json(health);
@@ -1 +1 @@
1
- {"version":3,"file":"health.js","sourceRoot":"","sources":["../../server/health.ts"],"names":[],"mappings":";;AAGA,oDAkBC;AAlBD,SAAgB,oBAAoB,CAAC,GAAgB,EAAE,GAAkB;IACrE,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QACpD,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,EAAE,CAAA;QACrC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACpB,CAAC,CAAC,CAAA;IAEF,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QACrD,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,EAAE,CAAA;QACrC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACtD,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO;YAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG;YAC3B,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,KAAK;YACrC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,KAAK;SACxC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC"}
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../server/health.ts"],"names":[],"mappings":";;AAGA,oDA2BC;AA3BD,SAAgB,oBAAoB,CAAC,GAAgB,EAAE,GAAkB;IACrE;;;;OAIG;IACH,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QAClD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;IACzB,CAAC,CAAC,CAAA;IAEF,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QACpD,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,EAAE,CAAA;QACrC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACpB,CAAC,CAAC,CAAA;IAEF,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QACrD,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,EAAE,CAAA;QACrC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACtD,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO;YAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG;YAC3B,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,KAAK;YACrC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,KAAK;SACxC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC"}
@@ -44,6 +44,7 @@ export interface ServerContext {
44
44
  id: number;
45
45
  name: string;
46
46
  urlPattern: string;
47
+ query?: string;
47
48
  method: string;
48
49
  statusCode: number;
49
50
  delay: number;
@@ -101,10 +102,24 @@ export interface ServerContext {
101
102
  };
102
103
  settingsPath: string;
103
104
  meddleDir: string;
105
+ /** Meddle package name/version (root package.json — same source as `meddle --version`) */
106
+ appInfo?: {
107
+ name: string;
108
+ version: string;
109
+ };
104
110
  settings: unknown;
105
111
  loadMockRules: () => void;
106
112
  saveMockRules: () => void;
113
+ /** Issue #120: throws (code MOCKS_FILE_INVALID) when the mocks file is unparseable. */
114
+ assertMocksWritable?: () => void;
115
+ getMocksParseError?: () => {
116
+ line: number | null;
117
+ column: number | null;
118
+ message: string;
119
+ } | null;
107
120
  reloadCustomPlugins: () => Promise<unknown[]>;
121
+ /** Unload a loaded custom plugin from memory by id (does not touch disk). Resolves false if not a loaded custom plugin. */
122
+ unloadCustomPlugin?: (pluginId: string) => Promise<boolean>;
108
123
  logRuleMap: () => void;
109
124
  reloadAllRuleFiles: () => void;
110
125
  broadcastToAllClients: (data: unknown) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../server/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../server/index.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,7 @@ const rule_files_1 = require("./rule-files");
16
16
  const routes_1 = require("./agent/routes");
17
17
  const health_1 = require("./health");
18
18
  const sessions_1 = require("./sessions");
19
+ const app_info_1 = require("./app-info");
19
20
  /**
20
21
  * Create an Express app that handles all API routes
21
22
  * @param serverContext - The server context containing all state and helpers
@@ -34,6 +35,7 @@ function createApp(serverContext) {
34
35
  (0, mocks_1.registerMocksRoutes)(app, serverContext);
35
36
  (0, pipeline_1.registerPipelineRoutes)(app, serverContext);
36
37
  (0, health_1.registerHealthRoutes)(app, serverContext);
38
+ (0, app_info_1.registerAppInfoRoutes)(app, serverContext);
37
39
  (0, refactor_1.registerRefactorRoutes)(app, serverContext);
38
40
  (0, rule_files_1.registerRuleFilesRoutes)(app, serverContext);
39
41
  (0, routes_1.registerAgentRoutes)(app, serverContext);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/index.ts"],"names":[],"mappings":";;;;;AAmMA,8BAwBC;AA3ND,sDAA8C;AAE9C,qCAA+C;AAC/C,uCAAiD;AACjD,mCAA6C;AAC7C,iCAA2C;AAC3C,mCAA6C;AAC7C,yCAAmD;AACnD,yCAAmD;AACnD,6CAAsD;AACtD,2CAAoD;AACpD,qCAA+C;AAC/C,yCAAmD;AAkLnD;;;;GAIG;AACH,SAAgB,SAAS,CAAC,aAA4B;IAClD,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAA;IAErB,kCAAkC;IAClC,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IACxC,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IAE9D,0BAA0B;IAC1B,IAAA,6BAAoB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACxC,IAAA,+BAAqB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACzC,IAAA,2BAAmB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACvC,IAAA,yBAAkB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACtC,IAAA,2BAAmB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACvC,IAAA,iCAAsB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IAC1C,IAAA,6BAAoB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACxC,IAAA,iCAAsB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IAC1C,IAAA,oCAAuB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IAC3C,IAAA,4BAAmB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACvC,IAAA,iCAAsB,EAAC,GAAG,EAAE,aAAa,CAAC,CAGzC;IAAC,GAAmD,CAAC,aAAa,GAAG,aAAa,CAAA;IAEnF,OAAO,GAAG,CAAA;AACd,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/index.ts"],"names":[],"mappings":";;;;;AA4MA,8BAyBC;AArOD,sDAA8C;AAE9C,qCAA+C;AAC/C,uCAAiD;AACjD,mCAA6C;AAC7C,iCAA2C;AAC3C,mCAA6C;AAC7C,yCAAmD;AACnD,yCAAmD;AACnD,6CAAsD;AACtD,2CAAoD;AACpD,qCAA+C;AAC/C,yCAAmD;AACnD,yCAAkD;AA0LlD;;;;GAIG;AACH,SAAgB,SAAS,CAAC,aAA4B;IAClD,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAA;IAErB,kCAAkC;IAClC,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IACxC,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IAE9D,0BAA0B;IAC1B,IAAA,6BAAoB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACxC,IAAA,+BAAqB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACzC,IAAA,2BAAmB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACvC,IAAA,yBAAkB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACtC,IAAA,2BAAmB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACvC,IAAA,iCAAsB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IAC1C,IAAA,6BAAoB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACxC,IAAA,gCAAqB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACzC,IAAA,iCAAsB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IAC1C,IAAA,oCAAuB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IAC3C,IAAA,4BAAmB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACvC,IAAA,iCAAsB,EAAC,GAAG,EAAE,aAAa,CAAC,CAGzC;IAAC,GAAmD,CAAC,aAAa,GAAG,aAAa,CAAA;IAEnF,OAAO,GAAG,CAAA;AACd,CAAC"}
@@ -1,9 +1,35 @@
1
1
  import { Application } from 'express';
2
2
  import { ServerContext } from './index';
3
+ import { type LegacyMocksPath } from '../core/mock-handler';
3
4
  export type MockRule = ServerContext['mockRules'][number];
4
5
  export type MockRuleInput = Partial<Omit<MockRule, 'id'>>;
5
6
  export declare function createMockRule(ctx: ServerContext, data: MockRuleInput): MockRule;
6
7
  export declare function updateMockRule(ctx: ServerContext, id: number, data: MockRuleInput): MockRule;
7
8
  export declare function deleteMockRule(ctx: ServerContext, id: number): void;
9
+ export interface MocksFileStatus {
10
+ /** Absolute path of the mocks file the proxy currently reads and writes. */
11
+ path: string;
12
+ /** False until the first save creates a configured file that does not exist yet (issue #118). */
13
+ exists: boolean;
14
+ /**
15
+ * True when a custom `mocksFilePath` is in effect (anything other than the
16
+ * default `<MEDDLE_HOME>/mocks.json`). The UI only warns about a missing
17
+ * file when it is custom — same rule as the server-side startup warning.
18
+ */
19
+ custom: boolean;
20
+ /** Issue #120: false when the file exists but is not valid JSON; every write is then refused. */
21
+ valid: boolean;
22
+ /** Parse failure (1-based line/column) when `valid` is false, else null. */
23
+ parseError: {
24
+ line: number | null;
25
+ column: number | null;
26
+ message: string;
27
+ } | null;
28
+ /** Full human-readable error (path + position) when `valid` is false. */
29
+ error?: string;
30
+ /** Issue #121: relative path that only exists under the old (start-directory) rule. */
31
+ legacyMocksPath: LegacyMocksPath | null;
32
+ }
33
+ export declare function getMocksFileStatus(ctx: ServerContext): MocksFileStatus;
8
34
  export declare function registerMocksRoutes(app: Application, ctx: ServerContext): void;
9
35
  //# sourceMappingURL=mocks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mocks.d.ts","sourceRoot":"","sources":["../../server/mocks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqB,MAAM,SAAS,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAOvC,MAAM,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AACzD,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAA;AAOzD,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,GAAG,QAAQ,CAgBhF;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,QAAQ,CAS5F;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAQnE;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAqD9E"}
1
+ {"version":3,"file":"mocks.d.ts","sourceRoot":"","sources":["../../server/mocks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqB,MAAM,SAAS,CAAA;AAGxD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAEvC,OAAO,EAAkD,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAO3G,MAAM,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AACzD,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAA;AAkCzD,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,GAAG,QAAQ,CAwBhF;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,QAAQ,CAW5F;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAUnE;AAED,MAAM,WAAW,eAAe;IAC5B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAA;IACZ,iGAAiG;IACjG,MAAM,EAAE,OAAO,CAAA;IACf;;;;OAIG;IACH,MAAM,EAAE,OAAO,CAAA;IACf,iGAAiG;IACjG,KAAK,EAAE,OAAO,CAAA;IACd,4EAA4E;IAC5E,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAClF,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,uFAAuF;IACvF,eAAe,EAAE,eAAe,GAAG,IAAI,CAAA;CAC1C;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa,GAAG,eAAe,CAetE;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CA2D9E"}
@@ -1,22 +1,93 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.createMockRule = createMockRule;
4
37
  exports.updateMockRule = updateMockRule;
5
38
  exports.deleteMockRule = deleteMockRule;
39
+ exports.getMocksFileStatus = getMocksFileStatus;
6
40
  exports.registerMocksRoutes = registerMocksRoutes;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const mock_utils_1 = require("../core/mock-utils");
44
+ const mock_handler_1 = require("../core/mock-handler");
7
45
  function setMockJsonHeaders(res) {
8
46
  res.setHeader('Content-Type', 'application/json');
9
47
  res.setHeader('Cache-Control', 'no-store');
10
48
  }
11
- function persistMockRules(ctx) {
12
- ctx.saveMockRules();
49
+ /** Issue #120: refuse before mutating memory, so a rejected write changes nothing. */
50
+ function assertWritable(ctx) {
51
+ ctx.assertMocksWritable?.();
52
+ }
53
+ function isInvalidFileError(err) {
54
+ return err?.code === 'MOCKS_FILE_INVALID';
55
+ }
56
+ function writeError(res, err, fallbackStatus) {
57
+ const e = err;
58
+ if (isInvalidFileError(err)) {
59
+ res.statusCode = 409;
60
+ res.write(JSON.stringify({ error: e.message, code: 'MOCKS_FILE_INVALID', path: e.filePath, parseError: e.parseError }));
61
+ return;
62
+ }
63
+ res.statusCode = e.message === 'Not found' ? 404 : fallbackStatus;
64
+ res.write(JSON.stringify({ error: e.message }));
65
+ }
66
+ function persistMockRules(ctx, snapshot) {
67
+ try {
68
+ ctx.saveMockRules();
69
+ }
70
+ catch (err) {
71
+ // Roll memory back so it keeps matching the (unchanged) file.
72
+ ctx.mockRules = snapshot.rules;
73
+ ctx.mockIdSeq = snapshot.seq;
74
+ throw err;
75
+ }
13
76
  ctx.broadcastToAllClients({ type: 'mocksUpdated', rules: ctx.mockRules });
14
77
  }
15
78
  function createMockRule(ctx, data) {
79
+ // Issue #115: derive the id from both the sequence and the rules actually
80
+ // present, so a stale sequence can never reuse an existing id. Any
81
+ // client-supplied `id` in `data` is ignored — create never overwrites.
82
+ assertWritable(ctx);
83
+ const snapshot = { rules: structuredClone(ctx.mockRules), seq: ctx.mockIdSeq };
84
+ const id = (0, mock_utils_1.nextMockRuleId)(ctx.mockRules, ctx.mockIdSeq);
85
+ ctx.mockIdSeq = id + 1;
16
86
  const rule = {
17
- id: ctx.mockIdSeq++,
87
+ id,
18
88
  name: data.name || '',
19
89
  urlPattern: data.urlPattern || '',
90
+ query: data.query || '',
20
91
  method: data.method || '*',
21
92
  statusCode: data.statusCode || 200,
22
93
  delay: data.delay || 0,
@@ -26,27 +97,56 @@ function createMockRule(ctx, data) {
26
97
  enabled: data.enabled !== false
27
98
  };
28
99
  ctx.mockRules.push(rule);
29
- persistMockRules(ctx);
100
+ persistMockRules(ctx, snapshot);
30
101
  return rule;
31
102
  }
32
103
  function updateMockRule(ctx, id, data) {
104
+ assertWritable(ctx);
105
+ const snapshot = { rules: structuredClone(ctx.mockRules), seq: ctx.mockIdSeq };
33
106
  const idx = ctx.mockRules.findIndex(r => r.id === id);
34
107
  if (idx === -1) {
35
108
  throw new Error('Not found');
36
109
  }
37
110
  ctx.mockRules[idx] = { ...ctx.mockRules[idx], ...data, id };
38
- persistMockRules(ctx);
111
+ persistMockRules(ctx, snapshot);
39
112
  return ctx.mockRules[idx];
40
113
  }
41
114
  function deleteMockRule(ctx, id) {
115
+ assertWritable(ctx);
116
+ const snapshot = { rules: structuredClone(ctx.mockRules), seq: ctx.mockIdSeq };
42
117
  const idx = ctx.mockRules.findIndex(r => r.id === id);
43
118
  if (idx === -1) {
44
119
  throw new Error('Not found');
45
120
  }
46
121
  ctx.mockRules.splice(idx, 1);
47
- persistMockRules(ctx);
122
+ persistMockRules(ctx, snapshot);
123
+ }
124
+ function getMocksFileStatus(ctx) {
125
+ const file = path.resolve(ctx.getMockFilePath());
126
+ let exists = false;
127
+ try {
128
+ exists = fs.statSync(file).isFile();
129
+ }
130
+ catch (_) { /* missing */ }
131
+ const custom = file !== path.resolve(ctx.meddleDir, 'mocks.json');
132
+ const parseError = (exists && ctx.getMocksParseError?.()) || null;
133
+ const legacyMocksPath = (0, mock_handler_1.detectLegacyMocksPath)((0, mock_handler_1.readConfiguredMocksPath)(ctx.settingsPath), ctx.meddleDir);
134
+ const status = { path: file, exists, custom, valid: !parseError, parseError, legacyMocksPath };
135
+ if (parseError) {
136
+ const loc = parseError.line != null ? `第 ${parseError.line} 行第 ${parseError.column} 列:` : '';
137
+ status.error = `Mock 文件格式错误: ${file} ${loc}${parseError.message}`;
138
+ }
139
+ return status;
48
140
  }
49
141
  function registerMocksRoutes(app, ctx) {
142
+ // API: /api/mocks-file - GET status of the active mocks file (issue #118).
143
+ // Separate endpoint so GET /api/mocks keeps returning a bare array
144
+ // (MCP / CLI / older web builds depend on that shape).
145
+ app.get('/api/mocks-file', (_req, res) => {
146
+ setMockJsonHeaders(res);
147
+ res.write(JSON.stringify(getMocksFileStatus(ctx)));
148
+ res.end();
149
+ });
50
150
  // API: /api/mocks - GET (list), POST (create)
51
151
  app.route('/api/mocks')
52
152
  .get((_req, res) => {
@@ -61,8 +161,7 @@ function registerMocksRoutes(app, ctx) {
61
161
  res.write(JSON.stringify({ status: 'success', rule }));
62
162
  }
63
163
  catch (err) {
64
- res.statusCode = 400;
65
- res.write(JSON.stringify({ error: err.message }));
164
+ writeError(res, err, 400);
66
165
  }
67
166
  res.end();
68
167
  });
@@ -77,9 +176,8 @@ function registerMocksRoutes(app, ctx) {
77
176
  deleteMockRule(ctx, id);
78
177
  res.write(JSON.stringify({ status: 'success' }));
79
178
  }
80
- catch {
81
- res.statusCode = 404;
82
- res.write(JSON.stringify({ error: 'Not found' }));
179
+ catch (err) {
180
+ writeError(res, err, 404);
83
181
  }
84
182
  res.end();
85
183
  return;
@@ -92,8 +190,7 @@ function registerMocksRoutes(app, ctx) {
92
190
  res.write(JSON.stringify({ status: 'success', rule }));
93
191
  }
94
192
  catch (err) {
95
- res.statusCode = err.message === 'Not found' ? 404 : 400;
96
- res.write(JSON.stringify({ error: err.message }));
193
+ writeError(res, err, 400);
97
194
  }
98
195
  res.end();
99
196
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"mocks.js","sourceRoot":"","sources":["../../server/mocks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mocks.js","sourceRoot":"","sources":["../../server/mocks.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../server/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqB,MAAM,SAAS,CAAA;AAGxD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAEvC,KAAK,UAAU,GAAG;IACd,QAAQ,EAAE;QACN,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;IACD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACzB,CAAA;AAED,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAClB;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC;IAC7D,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,aAAa,EAAE,CAAA;CAC3B,CAAC,CAgBD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG;IACtF,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CAChB,CAoCA;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAO1E;AAED,wBAAgB,wBAAwB,CACpC,UAAU,EAAE,UAAU,EAAE,EACxB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,kBAAkB,EAAE,OAAO,GAC5B,UAAU,EAAE,CAcd;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CA+uBhF"}
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../server/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqB,MAAM,SAAS,CAAA;AAGxD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAGvC,KAAK,UAAU,GAAG;IACd,QAAQ,EAAE;QACN,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;IACD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACzB,CAAA;AAED,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAClB;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC;IAC7D,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,aAAa,EAAE,CAAA;CAC3B,CAAC,CAgBD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG;IACtF,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CAChB,CAoCA;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAO1E;AAED,wBAAgB,wBAAwB,CACpC,UAAU,EAAE,UAAU,EAAE,EACxB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,kBAAkB,EAAE,OAAO,GAC5B,UAAU,EAAE,CAcd;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CA4xBhF"}
@@ -40,6 +40,7 @@ exports.selectTestPluginsForHook = selectTestPluginsForHook;
40
40
  exports.registerPluginsRoutes = registerPluginsRoutes;
41
41
  const fs = __importStar(require("fs"));
42
42
  const path = __importStar(require("path"));
43
+ const plugin_source_1 = require("../core/plugin-source");
43
44
  async function reloadPlugins(ctx) {
44
45
  const plugins = await ctx.reloadCustomPlugins();
45
46
  const summaries = plugins.map((p) => {
@@ -201,15 +202,25 @@ function registerPluginsRoutes(app, ctx) {
201
202
  }
202
203
  const files = fs.readdirSync(pluginsDir);
203
204
  const pluginInfo = [];
205
+ // 文件名 -> 实际加载的插件 id(插件 id 由 manifest 决定,不一定是 local.<文件名>)
206
+ const loadedIdByFilename = new Map();
207
+ for (const plugin of ctx.pluginManager.getAll()) {
208
+ const source = (0, plugin_source_1.getPluginSource)(plugin);
209
+ if (source && source.kind === 'custom' && source.filename) {
210
+ loadedIdByFilename.set(source.filename, plugin.manifest.id);
211
+ }
212
+ }
204
213
  // 只列出.js文件
205
214
  const jsFiles = files.filter(f => f.endsWith('.js'));
206
215
  jsFiles.forEach(jsFile => {
207
216
  const jsPath = path.resolve(pluginsDir, jsFile);
208
217
  const jsStat = fs.statSync(jsPath);
218
+ const pluginId = loadedIdByFilename.get(jsFile);
209
219
  pluginInfo.push({
210
220
  filename: jsFile,
211
221
  path: jsPath,
212
- modified: jsStat.mtime
222
+ modified: jsStat.mtime,
223
+ ...(pluginId ? { pluginId } : {}),
213
224
  });
214
225
  });
215
226
  res.write(JSON.stringify({ plugins: pluginInfo }));
@@ -307,6 +318,35 @@ function registerPluginsRoutes(app, ctx) {
307
318
  }
308
319
  res.end();
309
320
  });
321
+ // API: 从内存卸载自定义插件(不删除文件;用于文件已删除但插件仍加载的情况)
322
+ app.post('/api/plugins/custom/loaded/:id/unload', async (req, res) => {
323
+ try {
324
+ const pluginId = String(req.params.id || '');
325
+ const target = ctx.pluginManager.getAll().find((plugin) => plugin.manifest.id === pluginId);
326
+ if (!target) {
327
+ res.status(404).json({ error: '插件未加载' });
328
+ return;
329
+ }
330
+ const source = (0, plugin_source_1.getPluginSource)(target);
331
+ if (!source || source.kind !== 'custom') {
332
+ res.status(400).json({ error: '只能卸载自定义插件' });
333
+ return;
334
+ }
335
+ if (typeof ctx.unloadCustomPlugin !== 'function') {
336
+ res.status(501).json({ error: '当前运行时不支持卸载插件' });
337
+ return;
338
+ }
339
+ const unloaded = await ctx.unloadCustomPlugin(pluginId);
340
+ if (!unloaded) {
341
+ res.status(404).json({ error: '插件未加载' });
342
+ return;
343
+ }
344
+ res.json({ status: 'success', pluginId, message: '插件已卸载' });
345
+ }
346
+ catch (error) {
347
+ res.status(500).json({ error: error.message });
348
+ }
349
+ });
310
350
  // API: 热加载自定义插件
311
351
  app.post('/api/plugins/reload', async (_req, res) => {
312
352
  res.setHeader('Content-Type', 'application/json');
@@ -720,16 +760,21 @@ function registerPluginsRoutes(app, ctx) {
720
760
  app.get('/api/plugins', (_req, res) => {
721
761
  res.setHeader('Content-Type', 'application/json');
722
762
  const pluginStats = ctx.hookDispatcher.getPluginStats ? ctx.hookDispatcher.getPluginStats() : {};
723
- const plugins = ctx.pluginManager.getAll().map((plugin) => ({
724
- id: plugin.manifest.id,
725
- name: plugin.manifest.name,
726
- version: plugin.manifest.version,
727
- hooks: plugin.manifest.hooks,
728
- permissions: plugin.manifest.permissions,
729
- priority: plugin.manifest.priority,
730
- state: ctx.pluginManager.getState(plugin.manifest.id),
731
- stats: pluginStats[plugin.manifest.id] || null,
732
- }));
763
+ const plugins = ctx.pluginManager.getAll().map((plugin) => {
764
+ const source = (0, plugin_source_1.getPluginSource)(plugin);
765
+ return {
766
+ id: plugin.manifest.id,
767
+ name: plugin.manifest.name,
768
+ version: plugin.manifest.version,
769
+ hooks: plugin.manifest.hooks,
770
+ permissions: plugin.manifest.permissions,
771
+ priority: plugin.manifest.priority,
772
+ state: ctx.pluginManager.getState(plugin.manifest.id),
773
+ stats: pluginStats[plugin.manifest.id] || null,
774
+ ...(source ? { source: source.kind } : {}),
775
+ ...(source && source.filename ? { filename: source.filename } : {}),
776
+ };
777
+ });
733
778
  res.write(JSON.stringify({
734
779
  mode: ctx.requestPipeline.mode,
735
780
  total: plugins.length,