@miragon/pulse-analytics-connector 0.0.0-stage → 0.21.0

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 (357) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +87 -2
  3. package/dist/bpmn-name-lookup.d.ts +72 -0
  4. package/dist/bpmn-name-lookup.d.ts.map +1 -0
  5. package/dist/bpmn-name-lookup.js +123 -0
  6. package/dist/bpmn-name-lookup.js.map +1 -0
  7. package/dist/bpmn-name-lookup.test.d.ts +2 -0
  8. package/dist/bpmn-name-lookup.test.d.ts.map +1 -0
  9. package/dist/bpmn-name-lookup.test.js +287 -0
  10. package/dist/bpmn-name-lookup.test.js.map +1 -0
  11. package/dist/bpmn-names.d.ts +38 -0
  12. package/dist/bpmn-names.d.ts.map +1 -0
  13. package/dist/bpmn-names.js +22 -0
  14. package/dist/bpmn-names.js.map +1 -0
  15. package/dist/brand-gates.test.d.ts +2 -0
  16. package/dist/brand-gates.test.d.ts.map +1 -0
  17. package/dist/brand-gates.test.js +58 -0
  18. package/dist/brand-gates.test.js.map +1 -0
  19. package/dist/builder-texts.d.ts +4 -0
  20. package/dist/builder-texts.d.ts.map +1 -0
  21. package/dist/builder-texts.js +14 -0
  22. package/dist/builder-texts.js.map +1 -0
  23. package/dist/builder-texts.test.d.ts +2 -0
  24. package/dist/builder-texts.test.d.ts.map +1 -0
  25. package/dist/builder-texts.test.js +32 -0
  26. package/dist/builder-texts.test.js.map +1 -0
  27. package/dist/definition.d.ts +3 -0
  28. package/dist/definition.d.ts.map +1 -0
  29. package/dist/definition.js +151 -0
  30. package/dist/definition.js.map +1 -0
  31. package/dist/engine-ids.d.ts +42 -0
  32. package/dist/engine-ids.d.ts.map +1 -0
  33. package/dist/engine-ids.js +50 -0
  34. package/dist/engine-ids.js.map +1 -0
  35. package/dist/engine-scope.test.d.ts +2 -0
  36. package/dist/engine-scope.test.d.ts.map +1 -0
  37. package/dist/engine-scope.test.js +260 -0
  38. package/dist/engine-scope.test.js.map +1 -0
  39. package/dist/heatmap-data.d.ts +15 -0
  40. package/dist/heatmap-data.d.ts.map +1 -0
  41. package/dist/heatmap-data.js +2 -0
  42. package/dist/heatmap-data.js.map +1 -0
  43. package/dist/index.d.ts +5 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +3 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/instructions.d.ts +8 -0
  48. package/dist/instructions.d.ts.map +1 -0
  49. package/dist/instructions.js +33 -0
  50. package/dist/instructions.js.map +1 -0
  51. package/dist/messages/de.ask-ai.d.ts +9 -0
  52. package/dist/messages/de.ask-ai.d.ts.map +1 -0
  53. package/dist/messages/de.ask-ai.js +18 -0
  54. package/dist/messages/de.ask-ai.js.map +1 -0
  55. package/dist/messages/de.builder.d.ts +12 -0
  56. package/dist/messages/de.builder.d.ts.map +1 -0
  57. package/dist/messages/de.builder.js +53 -0
  58. package/dist/messages/de.builder.js.map +1 -0
  59. package/dist/messages/de.server.d.ts +8 -0
  60. package/dist/messages/de.server.d.ts.map +1 -0
  61. package/dist/messages/de.server.js +26 -0
  62. package/dist/messages/de.server.js.map +1 -0
  63. package/dist/messages/de.sweep.d.ts +10 -0
  64. package/dist/messages/de.sweep.d.ts.map +1 -0
  65. package/dist/messages/de.sweep.js +203 -0
  66. package/dist/messages/de.sweep.js.map +1 -0
  67. package/dist/messages/en.ask-ai.d.ts +25 -0
  68. package/dist/messages/en.ask-ai.d.ts.map +1 -0
  69. package/dist/messages/en.ask-ai.js +24 -0
  70. package/dist/messages/en.ask-ai.js.map +1 -0
  71. package/dist/messages/en.builder.d.ts +12 -0
  72. package/dist/messages/en.builder.d.ts.map +1 -0
  73. package/dist/messages/en.builder.js +53 -0
  74. package/dist/messages/en.builder.js.map +1 -0
  75. package/dist/messages/en.server.d.ts +8 -0
  76. package/dist/messages/en.server.d.ts.map +1 -0
  77. package/dist/messages/en.server.js +26 -0
  78. package/dist/messages/en.server.js.map +1 -0
  79. package/dist/messages/en.sweep.d.ts +11 -0
  80. package/dist/messages/en.sweep.d.ts.map +1 -0
  81. package/dist/messages/en.sweep.js +204 -0
  82. package/dist/messages/en.sweep.js.map +1 -0
  83. package/dist/messages/glossary.d.ts +26 -0
  84. package/dist/messages/glossary.d.ts.map +1 -0
  85. package/dist/messages/glossary.js +37 -0
  86. package/dist/messages/glossary.js.map +1 -0
  87. package/dist/messages/glossary.test.d.ts +2 -0
  88. package/dist/messages/glossary.test.d.ts.map +1 -0
  89. package/dist/messages/glossary.test.js +109 -0
  90. package/dist/messages/glossary.test.js.map +1 -0
  91. package/dist/messages/index.d.ts +12 -0
  92. package/dist/messages/index.d.ts.map +1 -0
  93. package/dist/messages/index.js +23 -0
  94. package/dist/messages/index.js.map +1 -0
  95. package/dist/messages/plural.d.ts +10 -0
  96. package/dist/messages/plural.d.ts.map +1 -0
  97. package/dist/messages/plural.js +17 -0
  98. package/dist/messages/plural.js.map +1 -0
  99. package/dist/messages/use-t.d.ts +10 -0
  100. package/dist/messages/use-t.d.ts.map +1 -0
  101. package/dist/messages/use-t.js +10 -0
  102. package/dist/messages/use-t.js.map +1 -0
  103. package/dist/module.d.ts +48 -0
  104. package/dist/module.d.ts.map +1 -0
  105. package/dist/module.js +174 -0
  106. package/dist/module.js.map +1 -0
  107. package/dist/module.test.d.ts +2 -0
  108. package/dist/module.test.d.ts.map +1 -0
  109. package/dist/module.test.js +230 -0
  110. package/dist/module.test.js.map +1 -0
  111. package/dist/named-views.d.ts +27 -0
  112. package/dist/named-views.d.ts.map +1 -0
  113. package/dist/named-views.js +73 -0
  114. package/dist/named-views.js.map +1 -0
  115. package/dist/named-views.test.d.ts +2 -0
  116. package/dist/named-views.test.d.ts.map +1 -0
  117. package/dist/named-views.test.js +110 -0
  118. package/dist/named-views.test.js.map +1 -0
  119. package/dist/plugin.d.ts +44 -0
  120. package/dist/plugin.d.ts.map +1 -0
  121. package/dist/plugin.js +52 -0
  122. package/dist/plugin.js.map +1 -0
  123. package/dist/prometheus-wiring.test.d.ts +2 -0
  124. package/dist/prometheus-wiring.test.d.ts.map +1 -0
  125. package/dist/prometheus-wiring.test.js +142 -0
  126. package/dist/prometheus-wiring.test.js.map +1 -0
  127. package/dist/server-locale.d.ts +48 -0
  128. package/dist/server-locale.d.ts.map +1 -0
  129. package/dist/server-locale.js +33 -0
  130. package/dist/server-locale.js.map +1 -0
  131. package/dist/settings-tools.d.ts +23 -0
  132. package/dist/settings-tools.d.ts.map +1 -0
  133. package/dist/settings-tools.js +100 -0
  134. package/dist/settings-tools.js.map +1 -0
  135. package/dist/settings.d.ts +77 -0
  136. package/dist/settings.d.ts.map +1 -0
  137. package/dist/settings.js +99 -0
  138. package/dist/settings.js.map +1 -0
  139. package/dist/settings.test.d.ts +2 -0
  140. package/dist/settings.test.d.ts.map +1 -0
  141. package/dist/settings.test.js +299 -0
  142. package/dist/settings.test.js.map +1 -0
  143. package/dist/steps/app-config.d.ts +30 -0
  144. package/dist/steps/app-config.d.ts.map +1 -0
  145. package/dist/steps/app-config.js +46 -0
  146. package/dist/steps/app-config.js.map +1 -0
  147. package/dist/steps/dashboard.d.ts +12 -0
  148. package/dist/steps/dashboard.d.ts.map +1 -0
  149. package/dist/steps/dashboard.js +58 -0
  150. package/dist/steps/dashboard.js.map +1 -0
  151. package/dist/steps/failure-dashboard.d.ts +10 -0
  152. package/dist/steps/failure-dashboard.d.ts.map +1 -0
  153. package/dist/steps/failure-dashboard.js +32 -0
  154. package/dist/steps/failure-dashboard.js.map +1 -0
  155. package/dist/steps/index.d.ts +3 -0
  156. package/dist/steps/index.d.ts.map +1 -0
  157. package/dist/steps/index.js +3 -0
  158. package/dist/steps/index.js.map +1 -0
  159. package/dist/steps/steps.test.d.ts +2 -0
  160. package/dist/steps/steps.test.d.ts.map +1 -0
  161. package/dist/steps/steps.test.js +153 -0
  162. package/dist/steps/steps.test.js.map +1 -0
  163. package/dist/tool-names.d.ts +13 -0
  164. package/dist/tool-names.d.ts.map +1 -0
  165. package/dist/tool-names.js +27 -0
  166. package/dist/tool-names.js.map +1 -0
  167. package/dist/tools/cluster-compare.d.ts +8 -0
  168. package/dist/tools/cluster-compare.d.ts.map +1 -0
  169. package/dist/tools/cluster-compare.js +17 -0
  170. package/dist/tools/cluster-compare.js.map +1 -0
  171. package/dist/tools/element.d.ts +8 -0
  172. package/dist/tools/element.d.ts.map +1 -0
  173. package/dist/tools/element.js +25 -0
  174. package/dist/tools/element.js.map +1 -0
  175. package/dist/tools/engine-compare.d.ts +8 -0
  176. package/dist/tools/engine-compare.d.ts.map +1 -0
  177. package/dist/tools/engine-compare.js +18 -0
  178. package/dist/tools/engine-compare.js.map +1 -0
  179. package/dist/tools/engine-compare.test.d.ts +2 -0
  180. package/dist/tools/engine-compare.test.d.ts.map +1 -0
  181. package/dist/tools/engine-compare.test.js +166 -0
  182. package/dist/tools/engine-compare.test.js.map +1 -0
  183. package/dist/tools/engine-landscape.d.ts +7 -0
  184. package/dist/tools/engine-landscape.d.ts.map +1 -0
  185. package/dist/tools/engine-landscape.js +13 -0
  186. package/dist/tools/engine-landscape.js.map +1 -0
  187. package/dist/tools/engine-landscape.test.d.ts +2 -0
  188. package/dist/tools/engine-landscape.test.d.ts.map +1 -0
  189. package/dist/tools/engine-landscape.test.js +110 -0
  190. package/dist/tools/engine-landscape.test.js.map +1 -0
  191. package/dist/tools/failures.d.ts +7 -0
  192. package/dist/tools/failures.d.ts.map +1 -0
  193. package/dist/tools/failures.js +13 -0
  194. package/dist/tools/failures.js.map +1 -0
  195. package/dist/tools/health.d.ts +7 -0
  196. package/dist/tools/health.d.ts.map +1 -0
  197. package/dist/tools/health.js +23 -0
  198. package/dist/tools/health.js.map +1 -0
  199. package/dist/tools/health.test.d.ts +2 -0
  200. package/dist/tools/health.test.d.ts.map +1 -0
  201. package/dist/tools/health.test.js +119 -0
  202. package/dist/tools/health.test.js.map +1 -0
  203. package/dist/tools/index.d.ts +18 -0
  204. package/dist/tools/index.d.ts.map +1 -0
  205. package/dist/tools/index.js +35 -0
  206. package/dist/tools/index.js.map +1 -0
  207. package/dist/tools/performance.d.ts +8 -0
  208. package/dist/tools/performance.d.ts.map +1 -0
  209. package/dist/tools/performance.js +25 -0
  210. package/dist/tools/performance.js.map +1 -0
  211. package/dist/tools/performance.test.d.ts +2 -0
  212. package/dist/tools/performance.test.d.ts.map +1 -0
  213. package/dist/tools/performance.test.js +176 -0
  214. package/dist/tools/performance.test.js.map +1 -0
  215. package/dist/tools/version-compare.d.ts +8 -0
  216. package/dist/tools/version-compare.d.ts.map +1 -0
  217. package/dist/tools/version-compare.js +17 -0
  218. package/dist/tools/version-compare.js.map +1 -0
  219. package/dist/tools/version-compare.test.d.ts +2 -0
  220. package/dist/tools/version-compare.test.d.ts.map +1 -0
  221. package/dist/tools/version-compare.test.js +82 -0
  222. package/dist/tools/version-compare.test.js.map +1 -0
  223. package/dist/toolsets.d.ts +17 -0
  224. package/dist/toolsets.d.ts.map +1 -0
  225. package/dist/toolsets.js +47 -0
  226. package/dist/toolsets.js.map +1 -0
  227. package/dist/toolsets.test.d.ts +2 -0
  228. package/dist/toolsets.test.d.ts.map +1 -0
  229. package/dist/toolsets.test.js +91 -0
  230. package/dist/toolsets.test.js.map +1 -0
  231. package/dist/view-title.test.d.ts +2 -0
  232. package/dist/view-title.test.d.ts.map +1 -0
  233. package/dist/view-title.test.js +91 -0
  234. package/dist/view-title.test.js.map +1 -0
  235. package/dist/widget-tools/comparisons.d.ts +13 -0
  236. package/dist/widget-tools/comparisons.d.ts.map +1 -0
  237. package/dist/widget-tools/comparisons.js +177 -0
  238. package/dist/widget-tools/comparisons.js.map +1 -0
  239. package/dist/widget-tools/comparisons.test.d.ts +2 -0
  240. package/dist/widget-tools/comparisons.test.d.ts.map +1 -0
  241. package/dist/widget-tools/comparisons.test.js +123 -0
  242. package/dist/widget-tools/comparisons.test.js.map +1 -0
  243. package/dist/widget-tools/shared.d.ts +36 -0
  244. package/dist/widget-tools/shared.d.ts.map +1 -0
  245. package/dist/widget-tools/shared.js +39 -0
  246. package/dist/widget-tools/shared.js.map +1 -0
  247. package/dist/widget-tools.d.ts +25 -0
  248. package/dist/widget-tools.d.ts.map +1 -0
  249. package/dist/widget-tools.js +269 -0
  250. package/dist/widget-tools.js.map +1 -0
  251. package/dist/widget-tools.test.d.ts +2 -0
  252. package/dist/widget-tools.test.d.ts.map +1 -0
  253. package/dist/widget-tools.test.js +272 -0
  254. package/dist/widget-tools.test.js.map +1 -0
  255. package/package.json +91 -3
  256. package/src/bpmn-name-lookup.test.ts +333 -0
  257. package/src/bpmn-name-lookup.ts +197 -0
  258. package/src/bpmn-names.ts +51 -0
  259. package/src/brand-gates.test.ts +69 -0
  260. package/src/builder-texts.test.ts +40 -0
  261. package/src/builder-texts.ts +15 -0
  262. package/src/definition.ts +181 -0
  263. package/src/engine-ids.ts +85 -0
  264. package/src/engine-scope.test.ts +324 -0
  265. package/src/heatmap-data.ts +14 -0
  266. package/src/index.ts +4 -0
  267. package/src/instructions.ts +33 -0
  268. package/src/messages/GLOSSARY.md +88 -0
  269. package/src/messages/de.ask-ai.ts +28 -0
  270. package/src/messages/de.builder.ts +77 -0
  271. package/src/messages/de.server.ts +39 -0
  272. package/src/messages/de.sweep.ts +244 -0
  273. package/src/messages/en.ask-ai.ts +34 -0
  274. package/src/messages/en.builder.ts +76 -0
  275. package/src/messages/en.server.ts +39 -0
  276. package/src/messages/en.sweep.ts +240 -0
  277. package/src/messages/glossary.test.ts +122 -0
  278. package/src/messages/glossary.ts +62 -0
  279. package/src/messages/index.ts +24 -0
  280. package/src/messages/plural.ts +18 -0
  281. package/src/messages/use-t.ts +12 -0
  282. package/src/module.test.ts +319 -0
  283. package/src/module.ts +211 -0
  284. package/src/named-views.test.ts +141 -0
  285. package/src/named-views.ts +97 -0
  286. package/src/plugin.ts +94 -0
  287. package/src/prometheus-wiring.test.ts +174 -0
  288. package/src/server-locale.ts +59 -0
  289. package/src/settings-tools.ts +170 -0
  290. package/src/settings.test.ts +402 -0
  291. package/src/settings.ts +114 -0
  292. package/src/steps/app-config.ts +75 -0
  293. package/src/steps/dashboard.ts +73 -0
  294. package/src/steps/failure-dashboard.ts +38 -0
  295. package/src/steps/index.ts +2 -0
  296. package/src/steps/steps.test.ts +216 -0
  297. package/src/tool-names.ts +26 -0
  298. package/src/tools/cluster-compare.ts +28 -0
  299. package/src/tools/element.ts +35 -0
  300. package/src/tools/engine-compare.test.ts +210 -0
  301. package/src/tools/engine-compare.ts +30 -0
  302. package/src/tools/engine-landscape.test.ts +138 -0
  303. package/src/tools/engine-landscape.ts +21 -0
  304. package/src/tools/failures.ts +19 -0
  305. package/src/tools/health.test.ts +156 -0
  306. package/src/tools/health.ts +29 -0
  307. package/src/tools/index.ts +44 -0
  308. package/src/tools/performance.test.ts +210 -0
  309. package/src/tools/performance.ts +38 -0
  310. package/src/tools/version-compare.test.ts +97 -0
  311. package/src/tools/version-compare.ts +28 -0
  312. package/src/toolsets.test.ts +107 -0
  313. package/src/toolsets.ts +56 -0
  314. package/src/view-title.test.ts +123 -0
  315. package/src/widget-tools/comparisons.test.ts +170 -0
  316. package/src/widget-tools/comparisons.ts +229 -0
  317. package/src/widget-tools/shared.ts +67 -0
  318. package/src/widget-tools.test.ts +306 -0
  319. package/src/widget-tools.ts +375 -0
  320. package/src/widgets/analytics-dashboard/activity-bottleneck-table.tsx +179 -0
  321. package/src/widgets/analytics-dashboard/definition-breakdown.tsx +108 -0
  322. package/src/widgets/analytics-dashboard/execution-performance-kpi.tsx +94 -0
  323. package/src/widgets/analytics-dashboard/execution-summary-kpi.tsx +122 -0
  324. package/src/widgets/analytics-dashboard/lib.ts +43 -0
  325. package/src/widgets/bpmn-heatmap.test.tsx +75 -0
  326. package/src/widgets/bpmn-heatmap.tsx +127 -0
  327. package/src/widgets/catalogue-sync.test.ts +16 -0
  328. package/src/widgets/cluster-compare.tsx +148 -0
  329. package/src/widgets/comparison-shared.test.ts +237 -0
  330. package/src/widgets/comparison-shared.tsx +371 -0
  331. package/src/widgets/comparison-widgets.test.tsx +307 -0
  332. package/src/widgets/dashboard-widgets.test.tsx +397 -0
  333. package/src/widgets/engine-compare.tsx +87 -0
  334. package/src/widgets/engine-landscape.tsx +352 -0
  335. package/src/widgets/failure-dashboard/error-patterns-table.tsx +122 -0
  336. package/src/widgets/failure-dashboard/failure-rate-table.test.ts +80 -0
  337. package/src/widgets/failure-dashboard/failure-rate-table.tsx +170 -0
  338. package/src/widgets/failure-dashboard/lib.ts +32 -0
  339. package/src/widgets/failure-dashboard/summary-kpi.tsx +122 -0
  340. package/src/widgets/failure-landscape-widgets.test.tsx +393 -0
  341. package/src/widgets/figure.tsx +79 -0
  342. package/src/widgets/hand-off.test.ts +126 -0
  343. package/src/widgets/hand-off.ts +102 -0
  344. package/src/widgets/index.ts +124 -0
  345. package/src/widgets/model-descriptions.dashboard.test.ts +280 -0
  346. package/src/widgets/model-descriptions.test.ts +251 -0
  347. package/src/widgets/model-descriptions.ts +428 -0
  348. package/src/widgets/names.test.ts +32 -0
  349. package/src/widgets/names.ts +39 -0
  350. package/src/widgets/query-gate.test.tsx +57 -0
  351. package/src/widgets/query-gate.tsx +50 -0
  352. package/src/widgets/settings-section.test.tsx +174 -0
  353. package/src/widgets/settings-section.tsx +244 -0
  354. package/src/widgets/version-compare.test.ts +68 -0
  355. package/src/widgets/version-compare.tsx +96 -0
  356. package/src/widgets/view-meta.ts +18 -0
  357. package/src/widgets/widget-render.test-support.tsx +103 -0
@@ -0,0 +1,166 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { z } from "zod";
3
+ import { increaseIn } from "@miragon/pulse-analytics-client";
4
+ import { createEngineScope } from "../engine-ids.js";
5
+ import { registerEngineCompareTools } from "./engine-compare.js";
6
+ const scope = createEngineScope(["prod-a", "prod-b"]);
7
+ const register = (r, store) => registerEngineCompareTools(r, scope, store);
8
+ /** Registrar stand-in that captures each tool's full config instead of an MCPServer. */
9
+ function captureConfigs(registerModule) {
10
+ const configs = new Map();
11
+ const register = Object.assign((config) => {
12
+ configs.set(config.name, config);
13
+ }, { getRegisteredTools: () => [] });
14
+ registerModule(register);
15
+ return configs;
16
+ }
17
+ function captureHandlers(registerModule) {
18
+ const configs = captureConfigs(registerModule);
19
+ return new Map([...configs].map(([name, c]) => [name, c.handler]));
20
+ }
21
+ /** PrometheusClient that records every instant PromQL string and returns no samples. */
22
+ function recordingClient() {
23
+ const queries = [];
24
+ return {
25
+ client: {
26
+ instant: (query) => {
27
+ queries.push(query);
28
+ return Promise.resolve([]);
29
+ },
30
+ },
31
+ queries,
32
+ };
33
+ }
34
+ /** The five KPI queries per engine — no duplicate incident query without an element (N85). */
35
+ function kpiQueries(sel, completedSel, range) {
36
+ const count = (series) => increaseIn(series, { range });
37
+ const duration = "camunda_process_instance_duration_milliseconds";
38
+ return [
39
+ `sum(${count(`camunda_process_instance_started_total${sel}`)})`,
40
+ `sum(${count(`camunda_process_instance_ended_total${completedSel}`)})`,
41
+ `sum(${count(`camunda_incident_created_total${sel}`)})`,
42
+ `sum(${count(`${duration}_sum${sel}`)}) / sum(${count(`${duration}_count${sel}`)})`,
43
+ `histogram_quantile(0.95, sum by (le)(${count(`${duration}_bucket${sel}`)}))`,
44
+ ];
45
+ }
46
+ describe("analytics_engine_compare PromQL", () => {
47
+ it("partitions every query by engine_id and applies the shared window", async () => {
48
+ const handlers = captureHandlers(register);
49
+ const { client, queries } = recordingClient();
50
+ const key = 'process_definition_key="order"';
51
+ await handlers.get("analytics_engine_compare")(client, {
52
+ processDefinitionKey: "order",
53
+ engineA: "prod-a",
54
+ engineB: "prod-b",
55
+ windowDays: 14,
56
+ minBucketSize: 10,
57
+ });
58
+ expect(queries).toEqual([
59
+ ...kpiQueries(`{${key},engine_id="prod-a"}`, `{${key},state="COMPLETED",engine_id="prod-a"}`, "14d"),
60
+ ...kpiQueries(`{${key},engine_id="prod-b"}`, `{${key},state="COMPLETED",engine_id="prod-b"}`, "14d"),
61
+ ]);
62
+ });
63
+ it("scopes to processDefinitionKey everywhere and activityId only on the incident query", async () => {
64
+ const handlers = captureHandlers(register);
65
+ const { client, queries } = recordingClient();
66
+ await handlers.get("analytics_engine_compare")(client, {
67
+ engineA: "prod-a",
68
+ engineB: "prod-b",
69
+ windowDays: 7,
70
+ processDefinitionKey: "order",
71
+ activityId: "Task_check",
72
+ minBucketSize: 1,
73
+ });
74
+ const key = 'process_definition_key="order"';
75
+ // Five KPI queries per engine plus the element-scoped incident count.
76
+ expect(queries).toHaveLength(12);
77
+ expect(queries.every((q) => q.includes(key))).toBe(true);
78
+ const elementScoped = queries.filter((q) => q.includes('activity_id="Task_check"'));
79
+ const incidents = (engine) => `sum(${increaseIn(`camunda_incident_created_total{${key},activity_id="Task_check",engine_id="${engine}"}`, { range: "7d" })})`;
80
+ expect(elementScoped).toEqual([incidents("prod-a"), incidents("prod-b")]);
81
+ });
82
+ it("refuses an engine this server is not configured for, before any query (N138)", async () => {
83
+ const handlers = captureHandlers(register);
84
+ const { client, queries } = recordingClient();
85
+ await expect(handlers.get("analytics_engine_compare")(client, {
86
+ processDefinitionKey: "order",
87
+ engineA: "prod-a",
88
+ engineB: "tenant-x",
89
+ windowDays: 7,
90
+ })).rejects.toThrow(/Unknown engine "tenant-x" in engineB/);
91
+ expect(queries).toEqual([]);
92
+ });
93
+ it("reads 'nothing ended' as an unmeasured duration and suppresses its delta (N78)", async () => {
94
+ const handlers = captureHandlers(register);
95
+ // Both engines started 40 instances; only prod-a has completed any — prod-b
96
+ // has no duration sample at all.
97
+ const client = {
98
+ instant: (q) => Promise.resolve(q.includes("duration_milliseconds") && q.includes("prod-b")
99
+ ? []
100
+ : [{ metric: {}, value: q.includes("duration_milliseconds") ? 30_000 : 40 }]),
101
+ };
102
+ const result = (await handlers.get("analytics_engine_compare")(client, {
103
+ processDefinitionKey: "order",
104
+ engineA: "prod-a",
105
+ engineB: "prod-b",
106
+ windowDays: 7,
107
+ minBucketSize: 1,
108
+ }));
109
+ expect(result.kpis[1]).toMatchObject({ avg_duration_sec: null, p95_duration_sec: null });
110
+ // Never a −100 % from a missing value.
111
+ expect(result.delta).toMatchObject({
112
+ avg_duration_delta_pct: null,
113
+ p95_duration_delta_pct: null,
114
+ });
115
+ });
116
+ it("prefers an explicit minBucketSize over the resolved setting", async () => {
117
+ const handlers = captureHandlers(register);
118
+ const { client } = recordingClient();
119
+ const explicit = (await handlers.get("analytics_engine_compare")(client, {
120
+ processDefinitionKey: "order",
121
+ engineA: "prod-a",
122
+ engineB: "prod-b",
123
+ windowDays: 7,
124
+ minBucketSize: 3,
125
+ }));
126
+ const fallback = (await handlers.get("analytics_engine_compare")(client, {
127
+ processDefinitionKey: "order",
128
+ engineA: "prod-a",
129
+ engineB: "prod-b",
130
+ windowDays: 7,
131
+ }));
132
+ // "explicit arg > saved setting > schema default": without a store or a
133
+ // resolvable profile key the registrar path lands on the schema default.
134
+ expect(explicit.minBucketSize).toBe(3);
135
+ expect(fallback.minBucketSize).toBe(10);
136
+ });
137
+ });
138
+ describe("analytics_engine_compare registration", () => {
139
+ const config = captureConfigs(register).get("analytics_engine_compare");
140
+ it("registers under the analytics category as a read-only external read", () => {
141
+ expect(config.category).toBe("analytics");
142
+ // toolsets.test.ts derives admin-only status from these; a read that lost
143
+ // `readOnlyHint` would silently change the toolset surface.
144
+ expect(config.annotations).toEqual({
145
+ readOnlyHint: true,
146
+ idempotentHint: true,
147
+ openWorldHint: true,
148
+ });
149
+ });
150
+ it("tells the model why the process scope is mandatory", () => {
151
+ // The description is the only place a model learns that an unscoped
152
+ // engine-vs-engine comparison measures the process mix — losing it turns
153
+ // the tool back into the apples-to-oranges comparison it replaced.
154
+ expect(config.description).toContain("processDefinitionKey is required");
155
+ expect(config.description).toContain("process mixes");
156
+ expect(config.description).toContain("analytics_engine_landscape");
157
+ });
158
+ it("requires processDefinitionKey at the schema boundary", () => {
159
+ const parsed = z.object(config.inputSchema).safeParse({
160
+ engineA: "prod-a",
161
+ engineB: "prod-b",
162
+ });
163
+ expect(parsed.success).toBe(false);
164
+ });
165
+ });
166
+ //# sourceMappingURL=engine-compare.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-compare.test.js","sourceRoot":"","sources":["../../src/tools/engine-compare.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { PrometheusClient } from "@miragon/pulse-analytics-client";
2
+ import type { createToolRegistrar } from "@miragon/mcp-toolkit-core/tools";
3
+ import { type AnalyticsEngineScope } from "../engine-ids.js";
4
+ type Register = ReturnType<typeof createToolRegistrar<PrometheusClient>>;
5
+ export declare function registerEngineLandscapeTools(register: Register, engineScope: AnalyticsEngineScope): void;
6
+ export {};
7
+ //# sourceMappingURL=engine-landscape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-landscape.d.ts","sourceRoot":"","sources":["../../src/tools/engine-landscape.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAEvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AAC1E,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAE7E,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,CAAA;AAExE,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,oBAAoB,QAWlC"}
@@ -0,0 +1,13 @@
1
+ import { schemas, queries } from "@miragon/pulse-analytics-client";
2
+ import { withEngineScope } from "../engine-ids.js";
3
+ export function registerEngineLandscapeTools(register, engineScope) {
4
+ register({
5
+ name: "analytics_engine_landscape",
6
+ category: "analytics",
7
+ description: "Cross-engine overview of the process landscape: which process definitions run on which engine (the inventory matrix), the absolute load per engine (running instances, open incidents, failed jobs), and the engine-owned job backlog (executable/suspended/future-due jobs, open external tasks). Reports counts, not rates, on purpose — engines host different process mixes, so a per-engine failure rate or average duration measures the mix rather than the engine. The backlog gauges carry no process label and therefore DO compare across engines. Returns `sharedProcessKeys`: the definitions deployed on more than one engine, the only sound inputs for analytics_engine_compare. Covers the server's configured engines (omitted engine = all of them); an engine reporting no metrics at all comes back with `reporting: false`.",
8
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
9
+ inputSchema: schemas.engineLandscapeInput.shape,
10
+ handler: async (ch, args) => queries.engineLandscape(ch, withEngineScope(engineScope, args)),
11
+ });
12
+ }
13
+ //# sourceMappingURL=engine-landscape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-landscape.js","sourceRoot":"","sources":["../../src/tools/engine-landscape.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA;AAElE,OAAO,EAAE,eAAe,EAA6B,MAAM,kBAAkB,CAAA;AAI7E,MAAM,UAAU,4BAA4B,CAC1C,QAAkB,EAClB,WAAiC;IAEjC,QAAQ,CAAC;QACP,IAAI,EAAE,4BAA4B;QAClC,QAAQ,EAAE,WAAW;QACrB,WAAW,EACT,mzBAAmzB;QACrzB,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;QAC9E,WAAW,EAAE,OAAO,CAAC,oBAAoB,CAAC,KAAK;QAC/C,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;KAC7F,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=engine-landscape.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-landscape.test.d.ts","sourceRoot":"","sources":["../../src/tools/engine-landscape.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,110 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { z } from "zod";
3
+ import { createEngineScope } from "../engine-ids.js";
4
+ import { registerEngineLandscapeTools } from "./engine-landscape.js";
5
+ /** The engines this server is configured for — prod-c reports nothing. */
6
+ const scope = createEngineScope(["prod-a", "prod-b", "prod-c"]);
7
+ const register = (r) => registerEngineLandscapeTools(r, scope);
8
+ /** Registrar stand-in that captures each tool's full config instead of an MCPServer. */
9
+ function captureConfigs(registerModule) {
10
+ const configs = new Map();
11
+ const register = Object.assign((config) => {
12
+ configs.set(config.name, config);
13
+ }, { getRegisteredTools: () => [] });
14
+ registerModule(register);
15
+ return configs;
16
+ }
17
+ function captureHandlers(registerModule) {
18
+ const configs = captureConfigs(registerModule);
19
+ return new Map([...configs].map(([name, c]) => [name, c.handler]));
20
+ }
21
+ /** Records every PromQL string and answers with a two-engine landscape. */
22
+ function recordingClient() {
23
+ const queries = [];
24
+ const cell = (engine_id, process_definition_key, value) => ({
25
+ metric: { engine_id, process_definition_key },
26
+ value,
27
+ });
28
+ return {
29
+ client: {
30
+ instant: (query) => {
31
+ queries.push(query);
32
+ if (query.includes("process_definitions_deployed")) {
33
+ return Promise.resolve([cell("prod-a", "order", 1), cell("prod-b", "onboarding", 1)]);
34
+ }
35
+ if (query.includes("process_instances_running")) {
36
+ return Promise.resolve([cell("prod-a", "order", 5)]);
37
+ }
38
+ return Promise.resolve([]);
39
+ },
40
+ },
41
+ queries,
42
+ };
43
+ }
44
+ describe("analytics_engine_landscape", () => {
45
+ it("builds the inventory matrix and issues one node-folded query per metric", async () => {
46
+ const handlers = captureHandlers(register);
47
+ const { client, queries } = recordingClient();
48
+ const result = (await handlers.get("analytics_engine_landscape")(client, {}));
49
+ // Engine omitted = the configured fleet: the silent prod-c stays visible.
50
+ expect(result.engines.map((e) => e.engineId)).toEqual(["prod-a", "prod-b", "prod-c"]);
51
+ expect(result.engines[0].runningInstances).toBe(5);
52
+ // Each engine runs its own definition — nothing to compare like-for-like.
53
+ expect(result.sharedProcessKeys).toEqual([]);
54
+ const sel = '{engine_id=~"prod-a|prod-b|prod-c"}';
55
+ // Every gauge folded over its own labels first: a clustered engine's
56
+ // nodes report the same engine-wide rows.
57
+ const byKey = (gauge, labels = "process_definition_key, engine_id") => `sum by (engine_id, process_definition_key)(max by (${labels})(${gauge}${sel}))`;
58
+ expect(queries).toEqual([
59
+ byKey("camunda_process_definitions_deployed"),
60
+ byKey("camunda_process_instances_running"),
61
+ byKey("camunda_incidents_open", "process_definition_key, incident_type, engine_id"),
62
+ byKey("camunda_jobs_failed"),
63
+ `max by (engine_id)(camunda_jobs_executable${sel})`,
64
+ `max by (engine_id)(camunda_jobs_suspended${sel})`,
65
+ `max by (engine_id)(camunda_jobs_due_future${sel})`,
66
+ `max by (engine_id)(camunda_external_tasks_open${sel})`,
67
+ ]);
68
+ });
69
+ it("applies the engine filter and keeps a non-reporting engine visible", async () => {
70
+ const handlers = captureHandlers(register);
71
+ const { client, queries } = recordingClient();
72
+ const result = (await handlers.get("analytics_engine_landscape")(client, {
73
+ engine: ["prod-a", "prod-c"],
74
+ }));
75
+ expect(queries.every((q) => q.includes('{engine_id=~"prod-a|prod-c"}'))).toBe(true);
76
+ expect(result.engines.find((e) => e.engineId === "prod-c")).toMatchObject({ reporting: false });
77
+ });
78
+ it("never lists another tenant's engine from a shared Prometheus (N138)", async () => {
79
+ const handlers = captureHandlers(register);
80
+ const { client, queries } = recordingClient();
81
+ await expect(handlers.get("analytics_engine_landscape")(client, { engine: ["prod-a", "tenant-x"] })).rejects.toThrow(/Unknown engine "tenant-x"/);
82
+ expect(queries).toEqual([]);
83
+ });
84
+ });
85
+ describe("analytics_engine_landscape registration", () => {
86
+ const config = captureConfigs(register).get("analytics_engine_landscape");
87
+ it("registers under the analytics category as a read-only external read", () => {
88
+ expect(config.category).toBe("analytics");
89
+ expect(config.annotations).toEqual({
90
+ readOnlyHint: true,
91
+ idempotentHint: true,
92
+ openWorldHint: true,
93
+ });
94
+ });
95
+ it("tells the model that counts — not per-engine rates — are the point", () => {
96
+ // Without this the model would divide the counts back into per-engine
97
+ // rates and compare them, which is exactly the confound the view exists
98
+ // to avoid.
99
+ expect(config.description).toContain("counts, not rates");
100
+ expect(config.description).toContain("process mixes");
101
+ expect(config.description).toContain("sharedProcessKeys");
102
+ });
103
+ it("accepts an engine list or nothing at all", () => {
104
+ const schema = z.object(config.inputSchema);
105
+ expect(schema.safeParse({}).success).toBe(true);
106
+ expect(schema.safeParse({ engine: ["prod-a", "prod-b"] }).success).toBe(true);
107
+ expect(schema.safeParse({ engine: "prod-a" }).success).toBe(true);
108
+ });
109
+ });
110
+ //# sourceMappingURL=engine-landscape.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-landscape.test.js","sourceRoot":"","sources":["../../src/tools/engine-landscape.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { PrometheusClient } from "@miragon/pulse-analytics-client";
2
+ import type { createToolRegistrar } from "@miragon/mcp-toolkit-core/tools";
3
+ import { type AnalyticsEngineScope } from "../engine-ids.js";
4
+ type Register = ReturnType<typeof createToolRegistrar<PrometheusClient>>;
5
+ export declare function registerFailureTools(register: Register, engineScope: AnalyticsEngineScope): void;
6
+ export {};
7
+ //# sourceMappingURL=failures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failures.d.ts","sourceRoot":"","sources":["../../src/tools/failures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAEvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AAC1E,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAE7E,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,CAAA;AAExE,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,QAWzF"}
@@ -0,0 +1,13 @@
1
+ import { schemas, queries } from "@miragon/pulse-analytics-client";
2
+ import { withEngineScope } from "../engine-ids.js";
3
+ export function registerFailureTools(register, engineScope) {
4
+ register({
5
+ name: "analytics_find_failed_instances",
6
+ category: "analytics",
7
+ description: "List currently-open incident patterns from process metrics, grouped by incident type and process definition (point-in-time — what is failing right now; no message, activity or timestamps). Use for counts across engines; for the actual failed instances (ids, messages) use camunda7_list_incidents, for past ones camunda7_query_historic_incidents.",
8
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
9
+ inputSchema: schemas.findFailedInstancesInput.shape,
10
+ handler: async (ch, args) => queries.findFailedInstances(ch, withEngineScope(engineScope, args)),
11
+ });
12
+ }
13
+ //# sourceMappingURL=failures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failures.js","sourceRoot":"","sources":["../../src/tools/failures.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA;AAElE,OAAO,EAAE,eAAe,EAA6B,MAAM,kBAAkB,CAAA;AAI7E,MAAM,UAAU,oBAAoB,CAAC,QAAkB,EAAE,WAAiC;IACxF,QAAQ,CAAC;QACP,IAAI,EAAE,iCAAiC;QACvC,QAAQ,EAAE,WAAW;QACrB,WAAW,EACT,2VAA2V;QAC7V,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;QAC9E,WAAW,EAAE,OAAO,CAAC,wBAAwB,CAAC,KAAK;QACnD,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAC1B,OAAO,CAAC,mBAAmB,CAAC,EAAE,EAAE,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;KACtE,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { PrometheusClient } from "@miragon/pulse-analytics-client";
2
+ import type { createToolRegistrar } from "@miragon/mcp-toolkit-core/tools";
3
+ import type { AnalyticsEngineScope } from "../engine-ids.js";
4
+ type Register = ReturnType<typeof createToolRegistrar<PrometheusClient>>;
5
+ export declare function registerHealthTools(register: Register, engineScope: AnalyticsEngineScope): void;
6
+ export {};
7
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/tools/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAEvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AAC1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAE5D,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,CAAA;AAExE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,QAqBxF"}
@@ -0,0 +1,23 @@
1
+ import { ENGINE_HEALTH_STATUS_RULE, schemas, queries } from "@miragon/pulse-analytics-client";
2
+ export function registerHealthTools(register, engineScope) {
3
+ register({
4
+ name: "analytics_engine_health",
5
+ category: "analytics",
6
+ description: "Live operational health of the CIB Seven engine(s), from Prometheus state gauges: running WIP, open incidents by type, dead jobs (retries exhausted), executable/suspended job backlog, open/unassigned user tasks, external-task backlog, deployed definitions, and which alert rules are firing/pending. " +
7
+ "Names the engines judged and the silent ones (`silentEngines`: their counts read 0 because nothing arrives). " +
8
+ `Status: ${ENGINE_HEALTH_STATUS_RULE} ` +
9
+ "Use for fleet-wide or metric-based health; for one engine's live incident clusters use camunda7_show_engine_health.",
10
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
11
+ inputSchema: schemas.engineHealthInput.shape,
12
+ handler: async (ch, args) => {
13
+ const engines = engineScope.resolve(args.engine);
14
+ // The module's engine-less alerts (a collector outage) only count for a
15
+ // verdict over the whole configured fleet.
16
+ return queries.engineHealth(ch, {
17
+ engine: engines,
18
+ includeFleetAlerts: engineScope.coversFleet(engines),
19
+ });
20
+ },
21
+ });
22
+ }
23
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/tools/health.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA;AAM7F,MAAM,UAAU,mBAAmB,CAAC,QAAkB,EAAE,WAAiC;IACvF,QAAQ,CAAC;QACP,IAAI,EAAE,yBAAyB;QAC/B,QAAQ,EAAE,WAAW;QACrB,WAAW,EACT,6SAA6S;YAC7S,+GAA+G;YAC/G,WAAW,yBAAyB,GAAG;YACvC,qHAAqH;QACvH,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;QAC9E,WAAW,EAAE,OAAO,CAAC,iBAAiB,CAAC,KAAK;QAC5C,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;YAC1B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAChD,wEAAwE;YACxE,2CAA2C;YAC3C,OAAO,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE;gBAC9B,MAAM,EAAE,OAAO;gBACf,kBAAkB,EAAE,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC;aACrD,CAAC,CAAA;QACJ,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=health.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.test.d.ts","sourceRoot":"","sources":["../../src/tools/health.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,119 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { ENGINE_HEALTH_STATUS_RULE, } from "@miragon/pulse-analytics-client";
3
+ import { createEngineScope } from "../engine-ids.js";
4
+ import { registerHealthTools } from "./health.js";
5
+ /** The fleet this server is configured for. */
6
+ const scope = createEngineScope(["prod-a", "prod-b"]);
7
+ /** Registrar stand-in that captures the tool's config instead of an MCPServer. */
8
+ function captureConfig() {
9
+ const configs = [];
10
+ const register = Object.assign((config) => configs.push(config), {
11
+ getRegisteredTools: () => [],
12
+ });
13
+ registerHealthTools(register, scope);
14
+ return configs[0];
15
+ }
16
+ /** PrometheusClient that records every instant PromQL string and answers via `answer`. */
17
+ function recordingClient(answer = () => []) {
18
+ const queries = [];
19
+ const client = {
20
+ instant: (query) => {
21
+ queries.push(query);
22
+ return Promise.resolve(answer(query));
23
+ },
24
+ };
25
+ return { client, queries };
26
+ }
27
+ const run = (client, args) => captureConfig().handler(client, args, {});
28
+ /** Prometheus where only `prod-a` reports its engine-state gauges (when the selector admits it). */
29
+ const onlyProdAReports = (query) => query.includes("prod-a") &&
30
+ (query.includes("camunda_jobs_executable") || query.includes("camunda_external_tasks_open"))
31
+ ? [{ metric: { engine_id: "prod-a" }, value: 0 }]
32
+ : [];
33
+ describe("analytics_engine_health — engine scope (N138)", () => {
34
+ it("with engine omitted, judges exactly the configured fleet — never every engine Prometheus holds", async () => {
35
+ const { client, queries } = recordingClient();
36
+ const result = await run(client, {});
37
+ expect(result.engines).toEqual(["prod-a", "prod-b"]);
38
+ expect(queries.every((q) => q.includes('engine_id=~"prod-a|prod-b"'))).toBe(true);
39
+ });
40
+ it("refuses an engine id this server is not configured for, before any query", async () => {
41
+ const { client, queries } = recordingClient();
42
+ await expect(run(client, { engine: "tenant-x" })).rejects.toThrow(/Unknown engine "tenant-x".*configured engines: prod-a, prod-b/);
43
+ expect(queries).toEqual([]);
44
+ });
45
+ });
46
+ describe("analytics_engine_health — verdict (N76)", () => {
47
+ it("reads a Prometheus without any metrics of the fleet as unknown, never healthy", async () => {
48
+ const { client } = recordingClient();
49
+ const result = await run(client, {});
50
+ expect(result.status).toBe("unknown");
51
+ expect(result.silentEngines).toEqual(["prod-a", "prod-b"]);
52
+ });
53
+ it("reads a silent engine as unknown, not as an idle healthy one", async () => {
54
+ const { client } = recordingClient(onlyProdAReports);
55
+ const result = await run(client, { engine: "prod-b" });
56
+ expect(result).toMatchObject({
57
+ status: "unknown",
58
+ engines: ["prod-b"],
59
+ reportingEngines: [],
60
+ silentEngines: ["prod-b"],
61
+ });
62
+ });
63
+ it("degrades the fleet verdict while one configured engine is silent", async () => {
64
+ const { client } = recordingClient(onlyProdAReports);
65
+ const result = await run(client, {});
66
+ expect(result).toMatchObject({
67
+ status: "degraded",
68
+ reportingEngines: ["prod-a"],
69
+ silentEngines: ["prod-b"],
70
+ });
71
+ });
72
+ });
73
+ describe("analytics_engine_health — alerts (N76)", () => {
74
+ const alertQueries = (queries) => queries.filter((q) => q.includes("ALERTS"));
75
+ it("scopes one engine's verdict to that engine's alerts only", async () => {
76
+ const { client, queries } = recordingClient();
77
+ await run(client, { engine: "prod-a" });
78
+ expect(alertQueries(queries)).toEqual([
79
+ 'ALERTS{alertstate="firing",engine_id="prod-a"}',
80
+ 'ALERTS{alertstate="pending",engine_id="prod-a"}',
81
+ ]);
82
+ });
83
+ it.each([
84
+ ["engine omitted", {}, "prod-a|prod-b"],
85
+ ["every configured engine named", { engine: ["prod-b", "prod-a"] }, "prod-b|prod-a"],
86
+ ])("adds the module's own engine-less alerts to a verdict over the whole fleet (%s)", async (_case, args, ids) => {
87
+ const { client, queries } = recordingClient();
88
+ await run(client, args);
89
+ expect(alertQueries(queries)[0]).toBe(`ALERTS{alertstate="firing",engine_id=~"${ids}"} or ` +
90
+ 'ALERTS{alertstate="firing",alertname=~"CibSeven.+",engine_id=""}');
91
+ });
92
+ it("never lets a foreign critical alert in a shared Prometheus decide the verdict", async () => {
93
+ // A critical alert of somebody else's rule, carrying no engine_id: the
94
+ // scoped selector cannot match it, so it never reaches the verdict.
95
+ const { client, queries } = recordingClient(onlyProdAReports);
96
+ const result = await run(client, { engine: "prod-a" });
97
+ expect(alertQueries(queries).some((q) => !q.includes('engine_id="prod-a"'))).toBe(false);
98
+ expect(result.status).toBe("healthy");
99
+ });
100
+ });
101
+ /**
102
+ * #340: two health tools judge different data by different rules — each
103
+ * states its own in the description AND the result, and routes to the other.
104
+ */
105
+ describe("analytics_engine_health verdict labeling", () => {
106
+ it("carries the status rule — including the unknown verdict — in every result", async () => {
107
+ const { client } = recordingClient();
108
+ const result = await run(client, {});
109
+ expect(result.statusRule).toBe(ENGINE_HEALTH_STATUS_RULE);
110
+ expect(ENGINE_HEALTH_STATUS_RULE).toMatch(/^From Prometheus, over the engines in scope: unknown when none of them reports metrics;/);
111
+ });
112
+ it("states the rule, the engine scope and the routing to camunda7_show_engine_health", () => {
113
+ const { description } = captureConfig();
114
+ expect(description).toContain(`Status: ${ENGINE_HEALTH_STATUS_RULE}`);
115
+ expect(description).toContain("the silent ones (`silentEngines`");
116
+ expect(description).toContain("Use for fleet-wide or metric-based health; for one engine's live incident clusters use camunda7_show_engine_health.");
117
+ });
118
+ });
119
+ //# sourceMappingURL=health.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.test.js","sourceRoot":"","sources":["../../src/tools/health.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { MCPServer } from "mcp-use";
2
+ import type { PrometheusClient } from "@miragon/pulse-analytics-client";
3
+ import type { ProfileSource } from "../server-locale.js";
4
+ import type { AnalyticsEngineScope } from "../engine-ids.js";
5
+ /**
6
+ * `profileStore` feeds the saved analytics defaults (`modules.analytics`) into
7
+ * every tool that takes `period`/`minBucketSize` — the same "explicit arg >
8
+ * saved setting > schema default" resolution as the widget tools, so the
9
+ * settings contract holds across the whole tool surface. The handlers pass the
10
+ * ctx the registrar hands them to `settingsFor`, so the caller resolves
11
+ * exactly like the settings tools' own (`resolveProfileKey`).
12
+ *
13
+ * `engineScope` holds the server's configured engine ids: every tool resolves
14
+ * its `engine` argument through it (omitted = all of them), so no query ever
15
+ * reads an engine this server is not configured for (`engine-ids.ts`).
16
+ */
17
+ export declare function registerTools(server: MCPServer, client: PrometheusClient, engineScope: AnalyticsEngineScope, profileStore?: ProfileSource): void;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAExC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAU5D;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,oBAAoB,EACjC,YAAY,CAAC,EAAE,aAAa,GAC3B,IAAI,CAYN"}
@@ -0,0 +1,35 @@
1
+ import { createToolRegistrar } from "@miragon/mcp-toolkit-core/tools";
2
+ import { registerPerformanceTools } from "./performance.js";
3
+ import { registerFailureTools } from "./failures.js";
4
+ import { registerElementTools } from "./element.js";
5
+ import { registerClusterCompareTools } from "./cluster-compare.js";
6
+ import { registerVersionCompareTools } from "./version-compare.js";
7
+ import { registerEngineCompareTools } from "./engine-compare.js";
8
+ import { registerEngineLandscapeTools } from "./engine-landscape.js";
9
+ import { registerHealthTools } from "./health.js";
10
+ /**
11
+ * `profileStore` feeds the saved analytics defaults (`modules.analytics`) into
12
+ * every tool that takes `period`/`minBucketSize` — the same "explicit arg >
13
+ * saved setting > schema default" resolution as the widget tools, so the
14
+ * settings contract holds across the whole tool surface. The handlers pass the
15
+ * ctx the registrar hands them to `settingsFor`, so the caller resolves
16
+ * exactly like the settings tools' own (`resolveProfileKey`).
17
+ *
18
+ * `engineScope` holds the server's configured engine ids: every tool resolves
19
+ * its `engine` argument through it (omitted = all of them), so no query ever
20
+ * reads an engine this server is not configured for (`engine-ids.ts`).
21
+ */
22
+ export function registerTools(server, client, engineScope, profileStore) {
23
+ // Strict input: an unknown (e.g. misnamed) key is a tool error naming the
24
+ // valid keys instead of a silently dropped filter (#329).
25
+ const register = createToolRegistrar(server, client, { strictInput: true });
26
+ registerPerformanceTools(register, engineScope, profileStore);
27
+ registerFailureTools(register, engineScope);
28
+ registerElementTools(register, engineScope, profileStore);
29
+ registerClusterCompareTools(register, engineScope, profileStore);
30
+ registerVersionCompareTools(register, engineScope, profileStore);
31
+ registerEngineCompareTools(register, engineScope, profileStore);
32
+ registerEngineLandscapeTools(register, engineScope);
33
+ registerHealthTools(register, engineScope);
34
+ }
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AAIrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAiB,EACjB,MAAwB,EACxB,WAAiC,EACjC,YAA4B;IAE5B,0EAA0E;IAC1E,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3E,wBAAwB,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAA;IAC7D,oBAAoB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;IAC3C,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAA;IACzD,2BAA2B,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAA;IAChE,2BAA2B,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAA;IAChE,0BAA0B,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAA;IAC/D,4BAA4B,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;IACnD,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;AAC5C,CAAC"}