@miragon/pulse-analytics-connector 0.0.0-bootstrap.0 → 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.
- package/LICENSE +21 -0
- package/README.md +86 -3
- package/dist/bpmn-name-lookup.d.ts +72 -0
- package/dist/bpmn-name-lookup.d.ts.map +1 -0
- package/dist/bpmn-name-lookup.js +123 -0
- package/dist/bpmn-name-lookup.js.map +1 -0
- package/dist/bpmn-name-lookup.test.d.ts +2 -0
- package/dist/bpmn-name-lookup.test.d.ts.map +1 -0
- package/dist/bpmn-name-lookup.test.js +287 -0
- package/dist/bpmn-name-lookup.test.js.map +1 -0
- package/dist/bpmn-names.d.ts +38 -0
- package/dist/bpmn-names.d.ts.map +1 -0
- package/dist/bpmn-names.js +22 -0
- package/dist/bpmn-names.js.map +1 -0
- package/dist/brand-gates.test.d.ts +2 -0
- package/dist/brand-gates.test.d.ts.map +1 -0
- package/dist/brand-gates.test.js +58 -0
- package/dist/brand-gates.test.js.map +1 -0
- package/dist/builder-texts.d.ts +4 -0
- package/dist/builder-texts.d.ts.map +1 -0
- package/dist/builder-texts.js +14 -0
- package/dist/builder-texts.js.map +1 -0
- package/dist/builder-texts.test.d.ts +2 -0
- package/dist/builder-texts.test.d.ts.map +1 -0
- package/dist/builder-texts.test.js +32 -0
- package/dist/builder-texts.test.js.map +1 -0
- package/dist/definition.d.ts +3 -0
- package/dist/definition.d.ts.map +1 -0
- package/dist/definition.js +151 -0
- package/dist/definition.js.map +1 -0
- package/dist/engine-ids.d.ts +42 -0
- package/dist/engine-ids.d.ts.map +1 -0
- package/dist/engine-ids.js +50 -0
- package/dist/engine-ids.js.map +1 -0
- package/dist/engine-scope.test.d.ts +2 -0
- package/dist/engine-scope.test.d.ts.map +1 -0
- package/dist/engine-scope.test.js +260 -0
- package/dist/engine-scope.test.js.map +1 -0
- package/dist/heatmap-data.d.ts +15 -0
- package/dist/heatmap-data.d.ts.map +1 -0
- package/dist/heatmap-data.js +2 -0
- package/dist/heatmap-data.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/instructions.d.ts +8 -0
- package/dist/instructions.d.ts.map +1 -0
- package/dist/instructions.js +33 -0
- package/dist/instructions.js.map +1 -0
- package/dist/messages/de.ask-ai.d.ts +9 -0
- package/dist/messages/de.ask-ai.d.ts.map +1 -0
- package/dist/messages/de.ask-ai.js +18 -0
- package/dist/messages/de.ask-ai.js.map +1 -0
- package/dist/messages/de.builder.d.ts +12 -0
- package/dist/messages/de.builder.d.ts.map +1 -0
- package/dist/messages/de.builder.js +53 -0
- package/dist/messages/de.builder.js.map +1 -0
- package/dist/messages/de.server.d.ts +8 -0
- package/dist/messages/de.server.d.ts.map +1 -0
- package/dist/messages/de.server.js +26 -0
- package/dist/messages/de.server.js.map +1 -0
- package/dist/messages/de.sweep.d.ts +10 -0
- package/dist/messages/de.sweep.d.ts.map +1 -0
- package/dist/messages/de.sweep.js +203 -0
- package/dist/messages/de.sweep.js.map +1 -0
- package/dist/messages/en.ask-ai.d.ts +25 -0
- package/dist/messages/en.ask-ai.d.ts.map +1 -0
- package/dist/messages/en.ask-ai.js +24 -0
- package/dist/messages/en.ask-ai.js.map +1 -0
- package/dist/messages/en.builder.d.ts +12 -0
- package/dist/messages/en.builder.d.ts.map +1 -0
- package/dist/messages/en.builder.js +53 -0
- package/dist/messages/en.builder.js.map +1 -0
- package/dist/messages/en.server.d.ts +8 -0
- package/dist/messages/en.server.d.ts.map +1 -0
- package/dist/messages/en.server.js +26 -0
- package/dist/messages/en.server.js.map +1 -0
- package/dist/messages/en.sweep.d.ts +11 -0
- package/dist/messages/en.sweep.d.ts.map +1 -0
- package/dist/messages/en.sweep.js +204 -0
- package/dist/messages/en.sweep.js.map +1 -0
- package/dist/messages/glossary.d.ts +26 -0
- package/dist/messages/glossary.d.ts.map +1 -0
- package/dist/messages/glossary.js +37 -0
- package/dist/messages/glossary.js.map +1 -0
- package/dist/messages/glossary.test.d.ts +2 -0
- package/dist/messages/glossary.test.d.ts.map +1 -0
- package/dist/messages/glossary.test.js +109 -0
- package/dist/messages/glossary.test.js.map +1 -0
- package/dist/messages/index.d.ts +12 -0
- package/dist/messages/index.d.ts.map +1 -0
- package/dist/messages/index.js +23 -0
- package/dist/messages/index.js.map +1 -0
- package/dist/messages/plural.d.ts +10 -0
- package/dist/messages/plural.d.ts.map +1 -0
- package/dist/messages/plural.js +17 -0
- package/dist/messages/plural.js.map +1 -0
- package/dist/messages/use-t.d.ts +10 -0
- package/dist/messages/use-t.d.ts.map +1 -0
- package/dist/messages/use-t.js +10 -0
- package/dist/messages/use-t.js.map +1 -0
- package/dist/module.d.ts +48 -0
- package/dist/module.d.ts.map +1 -0
- package/dist/module.js +174 -0
- package/dist/module.js.map +1 -0
- package/dist/module.test.d.ts +2 -0
- package/dist/module.test.d.ts.map +1 -0
- package/dist/module.test.js +230 -0
- package/dist/module.test.js.map +1 -0
- package/dist/named-views.d.ts +27 -0
- package/dist/named-views.d.ts.map +1 -0
- package/dist/named-views.js +73 -0
- package/dist/named-views.js.map +1 -0
- package/dist/named-views.test.d.ts +2 -0
- package/dist/named-views.test.d.ts.map +1 -0
- package/dist/named-views.test.js +110 -0
- package/dist/named-views.test.js.map +1 -0
- package/dist/plugin.d.ts +44 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +52 -0
- package/dist/plugin.js.map +1 -0
- package/dist/prometheus-wiring.test.d.ts +2 -0
- package/dist/prometheus-wiring.test.d.ts.map +1 -0
- package/dist/prometheus-wiring.test.js +142 -0
- package/dist/prometheus-wiring.test.js.map +1 -0
- package/dist/server-locale.d.ts +48 -0
- package/dist/server-locale.d.ts.map +1 -0
- package/dist/server-locale.js +33 -0
- package/dist/server-locale.js.map +1 -0
- package/dist/settings-tools.d.ts +23 -0
- package/dist/settings-tools.d.ts.map +1 -0
- package/dist/settings-tools.js +100 -0
- package/dist/settings-tools.js.map +1 -0
- package/dist/settings.d.ts +77 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +99 -0
- package/dist/settings.js.map +1 -0
- package/dist/settings.test.d.ts +2 -0
- package/dist/settings.test.d.ts.map +1 -0
- package/dist/settings.test.js +299 -0
- package/dist/settings.test.js.map +1 -0
- package/dist/steps/app-config.d.ts +30 -0
- package/dist/steps/app-config.d.ts.map +1 -0
- package/dist/steps/app-config.js +46 -0
- package/dist/steps/app-config.js.map +1 -0
- package/dist/steps/dashboard.d.ts +12 -0
- package/dist/steps/dashboard.d.ts.map +1 -0
- package/dist/steps/dashboard.js +58 -0
- package/dist/steps/dashboard.js.map +1 -0
- package/dist/steps/failure-dashboard.d.ts +10 -0
- package/dist/steps/failure-dashboard.d.ts.map +1 -0
- package/dist/steps/failure-dashboard.js +32 -0
- package/dist/steps/failure-dashboard.js.map +1 -0
- package/dist/steps/index.d.ts +3 -0
- package/dist/steps/index.d.ts.map +1 -0
- package/dist/steps/index.js +3 -0
- package/dist/steps/index.js.map +1 -0
- package/dist/steps/steps.test.d.ts +2 -0
- package/dist/steps/steps.test.d.ts.map +1 -0
- package/dist/steps/steps.test.js +153 -0
- package/dist/steps/steps.test.js.map +1 -0
- package/dist/tool-names.d.ts +13 -0
- package/dist/tool-names.d.ts.map +1 -0
- package/dist/tool-names.js +27 -0
- package/dist/tool-names.js.map +1 -0
- package/dist/tools/cluster-compare.d.ts +8 -0
- package/dist/tools/cluster-compare.d.ts.map +1 -0
- package/dist/tools/cluster-compare.js +17 -0
- package/dist/tools/cluster-compare.js.map +1 -0
- package/dist/tools/element.d.ts +8 -0
- package/dist/tools/element.d.ts.map +1 -0
- package/dist/tools/element.js +25 -0
- package/dist/tools/element.js.map +1 -0
- package/dist/tools/engine-compare.d.ts +8 -0
- package/dist/tools/engine-compare.d.ts.map +1 -0
- package/dist/tools/engine-compare.js +18 -0
- package/dist/tools/engine-compare.js.map +1 -0
- package/dist/tools/engine-compare.test.d.ts +2 -0
- package/dist/tools/engine-compare.test.d.ts.map +1 -0
- package/dist/tools/engine-compare.test.js +166 -0
- package/dist/tools/engine-compare.test.js.map +1 -0
- package/dist/tools/engine-landscape.d.ts +7 -0
- package/dist/tools/engine-landscape.d.ts.map +1 -0
- package/dist/tools/engine-landscape.js +13 -0
- package/dist/tools/engine-landscape.js.map +1 -0
- package/dist/tools/engine-landscape.test.d.ts +2 -0
- package/dist/tools/engine-landscape.test.d.ts.map +1 -0
- package/dist/tools/engine-landscape.test.js +110 -0
- package/dist/tools/engine-landscape.test.js.map +1 -0
- package/dist/tools/failures.d.ts +7 -0
- package/dist/tools/failures.d.ts.map +1 -0
- package/dist/tools/failures.js +13 -0
- package/dist/tools/failures.js.map +1 -0
- package/dist/tools/health.d.ts +7 -0
- package/dist/tools/health.d.ts.map +1 -0
- package/dist/tools/health.js +23 -0
- package/dist/tools/health.js.map +1 -0
- package/dist/tools/health.test.d.ts +2 -0
- package/dist/tools/health.test.d.ts.map +1 -0
- package/dist/tools/health.test.js +119 -0
- package/dist/tools/health.test.js.map +1 -0
- package/dist/tools/index.d.ts +18 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +35 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/performance.d.ts +8 -0
- package/dist/tools/performance.d.ts.map +1 -0
- package/dist/tools/performance.js +25 -0
- package/dist/tools/performance.js.map +1 -0
- package/dist/tools/performance.test.d.ts +2 -0
- package/dist/tools/performance.test.d.ts.map +1 -0
- package/dist/tools/performance.test.js +176 -0
- package/dist/tools/performance.test.js.map +1 -0
- package/dist/tools/version-compare.d.ts +8 -0
- package/dist/tools/version-compare.d.ts.map +1 -0
- package/dist/tools/version-compare.js +17 -0
- package/dist/tools/version-compare.js.map +1 -0
- package/dist/tools/version-compare.test.d.ts +2 -0
- package/dist/tools/version-compare.test.d.ts.map +1 -0
- package/dist/tools/version-compare.test.js +82 -0
- package/dist/tools/version-compare.test.js.map +1 -0
- package/dist/toolsets.d.ts +17 -0
- package/dist/toolsets.d.ts.map +1 -0
- package/dist/toolsets.js +47 -0
- package/dist/toolsets.js.map +1 -0
- package/dist/toolsets.test.d.ts +2 -0
- package/dist/toolsets.test.d.ts.map +1 -0
- package/dist/toolsets.test.js +91 -0
- package/dist/toolsets.test.js.map +1 -0
- package/dist/view-title.test.d.ts +2 -0
- package/dist/view-title.test.d.ts.map +1 -0
- package/dist/view-title.test.js +91 -0
- package/dist/view-title.test.js.map +1 -0
- package/dist/widget-tools/comparisons.d.ts +13 -0
- package/dist/widget-tools/comparisons.d.ts.map +1 -0
- package/dist/widget-tools/comparisons.js +177 -0
- package/dist/widget-tools/comparisons.js.map +1 -0
- package/dist/widget-tools/comparisons.test.d.ts +2 -0
- package/dist/widget-tools/comparisons.test.d.ts.map +1 -0
- package/dist/widget-tools/comparisons.test.js +123 -0
- package/dist/widget-tools/comparisons.test.js.map +1 -0
- package/dist/widget-tools/shared.d.ts +36 -0
- package/dist/widget-tools/shared.d.ts.map +1 -0
- package/dist/widget-tools/shared.js +39 -0
- package/dist/widget-tools/shared.js.map +1 -0
- package/dist/widget-tools.d.ts +25 -0
- package/dist/widget-tools.d.ts.map +1 -0
- package/dist/widget-tools.js +269 -0
- package/dist/widget-tools.js.map +1 -0
- package/dist/widget-tools.test.d.ts +2 -0
- package/dist/widget-tools.test.d.ts.map +1 -0
- package/dist/widget-tools.test.js +272 -0
- package/dist/widget-tools.test.js.map +1 -0
- package/package.json +91 -5
- package/src/bpmn-name-lookup.test.ts +333 -0
- package/src/bpmn-name-lookup.ts +197 -0
- package/src/bpmn-names.ts +51 -0
- package/src/brand-gates.test.ts +69 -0
- package/src/builder-texts.test.ts +40 -0
- package/src/builder-texts.ts +15 -0
- package/src/definition.ts +181 -0
- package/src/engine-ids.ts +85 -0
- package/src/engine-scope.test.ts +324 -0
- package/src/heatmap-data.ts +14 -0
- package/src/index.ts +4 -0
- package/src/instructions.ts +33 -0
- package/src/messages/GLOSSARY.md +88 -0
- package/src/messages/de.ask-ai.ts +28 -0
- package/src/messages/de.builder.ts +77 -0
- package/src/messages/de.server.ts +39 -0
- package/src/messages/de.sweep.ts +244 -0
- package/src/messages/en.ask-ai.ts +34 -0
- package/src/messages/en.builder.ts +76 -0
- package/src/messages/en.server.ts +39 -0
- package/src/messages/en.sweep.ts +240 -0
- package/src/messages/glossary.test.ts +122 -0
- package/src/messages/glossary.ts +62 -0
- package/src/messages/index.ts +24 -0
- package/src/messages/plural.ts +18 -0
- package/src/messages/use-t.ts +12 -0
- package/src/module.test.ts +319 -0
- package/src/module.ts +211 -0
- package/src/named-views.test.ts +141 -0
- package/src/named-views.ts +97 -0
- package/src/plugin.ts +94 -0
- package/src/prometheus-wiring.test.ts +174 -0
- package/src/server-locale.ts +59 -0
- package/src/settings-tools.ts +170 -0
- package/src/settings.test.ts +402 -0
- package/src/settings.ts +114 -0
- package/src/steps/app-config.ts +75 -0
- package/src/steps/dashboard.ts +73 -0
- package/src/steps/failure-dashboard.ts +38 -0
- package/src/steps/index.ts +2 -0
- package/src/steps/steps.test.ts +216 -0
- package/src/tool-names.ts +26 -0
- package/src/tools/cluster-compare.ts +28 -0
- package/src/tools/element.ts +35 -0
- package/src/tools/engine-compare.test.ts +210 -0
- package/src/tools/engine-compare.ts +30 -0
- package/src/tools/engine-landscape.test.ts +138 -0
- package/src/tools/engine-landscape.ts +21 -0
- package/src/tools/failures.ts +19 -0
- package/src/tools/health.test.ts +156 -0
- package/src/tools/health.ts +29 -0
- package/src/tools/index.ts +44 -0
- package/src/tools/performance.test.ts +210 -0
- package/src/tools/performance.ts +38 -0
- package/src/tools/version-compare.test.ts +97 -0
- package/src/tools/version-compare.ts +28 -0
- package/src/toolsets.test.ts +107 -0
- package/src/toolsets.ts +56 -0
- package/src/view-title.test.ts +123 -0
- package/src/widget-tools/comparisons.test.ts +170 -0
- package/src/widget-tools/comparisons.ts +229 -0
- package/src/widget-tools/shared.ts +67 -0
- package/src/widget-tools.test.ts +306 -0
- package/src/widget-tools.ts +375 -0
- package/src/widgets/analytics-dashboard/activity-bottleneck-table.tsx +179 -0
- package/src/widgets/analytics-dashboard/definition-breakdown.tsx +108 -0
- package/src/widgets/analytics-dashboard/execution-performance-kpi.tsx +94 -0
- package/src/widgets/analytics-dashboard/execution-summary-kpi.tsx +122 -0
- package/src/widgets/analytics-dashboard/lib.ts +43 -0
- package/src/widgets/bpmn-heatmap.test.tsx +75 -0
- package/src/widgets/bpmn-heatmap.tsx +127 -0
- package/src/widgets/catalogue-sync.test.ts +16 -0
- package/src/widgets/cluster-compare.tsx +148 -0
- package/src/widgets/comparison-shared.test.ts +237 -0
- package/src/widgets/comparison-shared.tsx +371 -0
- package/src/widgets/comparison-widgets.test.tsx +307 -0
- package/src/widgets/dashboard-widgets.test.tsx +397 -0
- package/src/widgets/engine-compare.tsx +87 -0
- package/src/widgets/engine-landscape.tsx +352 -0
- package/src/widgets/failure-dashboard/error-patterns-table.tsx +122 -0
- package/src/widgets/failure-dashboard/failure-rate-table.test.ts +80 -0
- package/src/widgets/failure-dashboard/failure-rate-table.tsx +170 -0
- package/src/widgets/failure-dashboard/lib.ts +32 -0
- package/src/widgets/failure-dashboard/summary-kpi.tsx +122 -0
- package/src/widgets/failure-landscape-widgets.test.tsx +393 -0
- package/src/widgets/figure.tsx +79 -0
- package/src/widgets/hand-off.test.ts +126 -0
- package/src/widgets/hand-off.ts +102 -0
- package/src/widgets/index.ts +124 -0
- package/src/widgets/model-descriptions.dashboard.test.ts +280 -0
- package/src/widgets/model-descriptions.test.ts +251 -0
- package/src/widgets/model-descriptions.ts +428 -0
- package/src/widgets/names.test.ts +32 -0
- package/src/widgets/names.ts +39 -0
- package/src/widgets/query-gate.test.tsx +57 -0
- package/src/widgets/query-gate.tsx +50 -0
- package/src/widgets/settings-section.test.tsx +174 -0
- package/src/widgets/settings-section.tsx +244 -0
- package/src/widgets/version-compare.test.ts +68 -0
- package/src/widgets/version-compare.tsx +96 -0
- package/src/widgets/view-meta.ts +18 -0
- package/src/widgets/widget-render.test-support.tsx +103 -0
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { appOnly, buildComposedView, buildDataFeedResult, buildSingleWidgetView, showToolBinding, withToolErrors, strictToolInput, } from "@miragon/pulse-widget-shell/server";
|
|
2
|
+
import { queries, schemas, withCallerSignal, } from "@miragon/pulse-analytics-client";
|
|
3
|
+
import { ANALYTICS_BPMN_HEATMAP_DATA, ANALYTICS_BPMN_XML_DATA, ANALYTICS_DASHBOARD_DATA, ANALYTICS_FAILURE_DASHBOARD_DATA, } from "./tool-names.js";
|
|
4
|
+
import { localizeViewFor } from "./server-locale.js";
|
|
5
|
+
import { optionalPeriod, settingsFor } from "./settings.js";
|
|
6
|
+
import { registerComparisonWidgetTools } from "./widget-tools/comparisons.js";
|
|
7
|
+
import { engineScopeSummary } from "./widget-tools/shared.js";
|
|
8
|
+
import { isFleetRequest, withEngineScope } from "./engine-ids.js";
|
|
9
|
+
import { NO_NAMES } from "./bpmn-name-lookup.js";
|
|
10
|
+
import { namedDashboard, namedFailureDashboard } from "./named-views.js";
|
|
11
|
+
/**
|
|
12
|
+
* Heatmap inputs shared by `analytics_show_bpmn_heatmap` and its
|
|
13
|
+
* `analytics_bpmn_heatmap_data` feed, composed from the exported client
|
|
14
|
+
* schemas so the describe() texts stay in one place.
|
|
15
|
+
*/
|
|
16
|
+
const heatmapInputShape = {
|
|
17
|
+
processDefinitionKey: schemas.elementBottleneckInput.shape.processDefinitionKey,
|
|
18
|
+
period: optionalPeriod,
|
|
19
|
+
...schemas.engineFilterShape,
|
|
20
|
+
};
|
|
21
|
+
/** Dashboard + its feed: one input shape, so the self-fetch can carry every scope the show tool takes. */
|
|
22
|
+
const dashboardInputShape = {
|
|
23
|
+
processDefinitionKey: schemas.clusterCompareInput.shape.processDefinitionKey,
|
|
24
|
+
period: optionalPeriod,
|
|
25
|
+
...schemas.engineFilterShape,
|
|
26
|
+
};
|
|
27
|
+
/** "n/a" for a figure that was not measured — never a plausible 0. */
|
|
28
|
+
const orNa = (value) => value ?? "n/a";
|
|
29
|
+
/** The model-facing dashboard summary: window flows and the live state, never mixed. */
|
|
30
|
+
function dashboardSummary(t, data, fleet) {
|
|
31
|
+
return t("aSum.dashboard", {
|
|
32
|
+
scope: data.processDefinitionKey
|
|
33
|
+
? t("aSum.scopeForProcess", { key: data.processDefinitionKey })
|
|
34
|
+
: "",
|
|
35
|
+
period: data.period,
|
|
36
|
+
engines: engineScopeSummary(t, data.engines, fleet),
|
|
37
|
+
totalCount: data.totalCount,
|
|
38
|
+
completedCount: data.completedCount,
|
|
39
|
+
incidentsCreated: data.incidentsCreated,
|
|
40
|
+
incidentRatePct: orNa(data.incidentRatePct),
|
|
41
|
+
runningNow: orNa(data.runningNow),
|
|
42
|
+
openIncidentsNow: orNa(data.openIncidentsNow),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
export function registerWidgetTools(server, ch, options) {
|
|
46
|
+
// Each show tool words its result via `await localizeViewFor(profileStore, ctx)`:
|
|
47
|
+
// `t` for the model-facing `summary` (→ "en" without a store or a caller
|
|
48
|
+
// identity), `title` for the view title, set only in a language the profile
|
|
49
|
+
// names (the kit's one rule for every module, #322 U3).
|
|
50
|
+
const { profileStore, engineScope } = options;
|
|
51
|
+
const namesFor = options.namesFor ?? NO_NAMES;
|
|
52
|
+
/**
|
|
53
|
+
* Fetches the latest deployed version's BPMN XML for the heatmap overlay via
|
|
54
|
+
* the injected lookup, from the engines whose heat it shows, in
|
|
55
|
+
* configuration order: the first that has the model draws it, so a process
|
|
56
|
+
* that runs only on a later engine still gets its diagram. Without a
|
|
57
|
+
* lookup, or when every engine fails or finds nothing, the XML is `null`
|
|
58
|
+
* and `bpmnMissing` says which of the two happened, so the widget's
|
|
59
|
+
* fallback names the known cause (`heatmap-data.ts`).
|
|
60
|
+
*/
|
|
61
|
+
async function loadBpmn(processDefinitionKey, engines) {
|
|
62
|
+
const fetchBpmnXml = options.fetchBpmnXml;
|
|
63
|
+
if (!fetchBpmnXml)
|
|
64
|
+
return { bpmnXml: null, bpmnMissing: "no-camunda7" };
|
|
65
|
+
for (const engine of engines.length > 0 ? engines : [undefined]) {
|
|
66
|
+
const bpmnXml = await fetchBpmnXml(processDefinitionKey, engine).catch(() => null);
|
|
67
|
+
if (bpmnXml)
|
|
68
|
+
return { bpmnXml };
|
|
69
|
+
}
|
|
70
|
+
return { bpmnXml: null, bpmnMissing: "not-loaded" };
|
|
71
|
+
}
|
|
72
|
+
// --- Process Analytics Dashboard ---
|
|
73
|
+
server.tool({
|
|
74
|
+
name: "analytics_show_dashboard",
|
|
75
|
+
title: "Process Analytics Dashboard",
|
|
76
|
+
description: "Show process metrics from Prometheus: flows within the period (starts, completions, incidents created/resolved, durations of the instances that ended) and the live state right now (instances running, incidents open), per process definition and per (process, activity).",
|
|
77
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
78
|
+
inputSchema: strictToolInput(dashboardInputShape),
|
|
79
|
+
...showToolBinding("analytics_show_dashboard", "Process Analytics Dashboard"),
|
|
80
|
+
}, withToolErrors(async (args, ctx) => {
|
|
81
|
+
const { t, title } = await localizeViewFor(profileStore, ctx);
|
|
82
|
+
const settings = await settingsFor(profileStore, ctx);
|
|
83
|
+
const period = args.period ?? settings.defaultPeriod;
|
|
84
|
+
const data = await namedDashboard(await queries.dashboardData(withCallerSignal(ch, ctx.signal), {
|
|
85
|
+
...withEngineScope(engineScope, args),
|
|
86
|
+
period,
|
|
87
|
+
minBucketSize: settings.minBucketSize,
|
|
88
|
+
}), namesFor);
|
|
89
|
+
// The RESOLVED period and the requested scope travel as cell props, so a
|
|
90
|
+
// widget that self-fetches (structuredContent stripped, a saved view)
|
|
91
|
+
// reads the same scope instead of the fleet default.
|
|
92
|
+
const cellProps = {
|
|
93
|
+
period,
|
|
94
|
+
...(args.processDefinitionKey ? { processDefinitionKey: args.processDefinitionKey } : {}),
|
|
95
|
+
...(isFleetRequest(args.engine) ? {} : { engine: args.engine }),
|
|
96
|
+
};
|
|
97
|
+
return buildComposedView({
|
|
98
|
+
app: "analytics",
|
|
99
|
+
// The view title in the language the profile names (the widget heading's
|
|
100
|
+
// own key); none with "system", where the heading names the view.
|
|
101
|
+
title: title("aExecSummary.title"),
|
|
102
|
+
layout: [
|
|
103
|
+
{ row: [{ widget: "analytics:execution-summary-kpi", props: cellProps }] },
|
|
104
|
+
{ row: [{ widget: "analytics:execution-performance-kpi", props: cellProps }] },
|
|
105
|
+
{ row: [{ widget: "analytics:process-definition-breakdown", props: cellProps }] },
|
|
106
|
+
{ row: [{ widget: "analytics:activity-bottleneck-table", props: cellProps }] },
|
|
107
|
+
],
|
|
108
|
+
entries: [{ dataType: "analytics:dashboard", data }],
|
|
109
|
+
summary: dashboardSummary(t, data, isFleetRequest(args.engine)),
|
|
110
|
+
});
|
|
111
|
+
}));
|
|
112
|
+
// --- Failure Dashboard ---
|
|
113
|
+
server.tool({
|
|
114
|
+
name: "analytics_show_failure_dashboard",
|
|
115
|
+
title: "Failure Analysis Dashboard",
|
|
116
|
+
description: "Show the incidents open right now from Prometheus, grouped by incident type and process definition (no activity, message or timestamps), with each affected process's running instances and dead jobs. Use to show the metric view to the user; for one engine's live incident clusters use camunda7_show_engine_health.",
|
|
117
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
118
|
+
inputSchema: strictToolInput({
|
|
119
|
+
...schemas.engineFilterShape,
|
|
120
|
+
}),
|
|
121
|
+
...showToolBinding("analytics_show_failure_dashboard", "Failure Analysis Dashboard"),
|
|
122
|
+
}, withToolErrors(async (args, ctx) => {
|
|
123
|
+
const { t, title } = await localizeViewFor(profileStore, ctx);
|
|
124
|
+
const data = await namedFailureDashboard(await queries.failureDashboardData(withCallerSignal(ch, ctx.signal), withEngineScope(engineScope, args)), namesFor);
|
|
125
|
+
// The requested scope travels as cell props so a self-fetch keeps it.
|
|
126
|
+
const cellProps = isFleetRequest(args.engine) ? undefined : { engine: args.engine };
|
|
127
|
+
return buildComposedView({
|
|
128
|
+
app: "analytics",
|
|
129
|
+
title: title("aFailureSummary.title"),
|
|
130
|
+
layout: [
|
|
131
|
+
{ row: [{ widget: "analytics:failure-summary-kpi", props: cellProps }] },
|
|
132
|
+
{ row: [{ widget: "analytics:error-patterns-table", props: cellProps }] },
|
|
133
|
+
{ row: [{ widget: "analytics:failure-rate-table", props: cellProps }] },
|
|
134
|
+
],
|
|
135
|
+
entries: [{ dataType: "analytics:failureDashboard", data }],
|
|
136
|
+
summary: t("aSum.failureDashboard", {
|
|
137
|
+
engines: engineScopeSummary(t, data.engines, isFleetRequest(args.engine)),
|
|
138
|
+
totalIncidents: data.totalIncidents,
|
|
139
|
+
uniqueErrorPatterns: data.uniqueErrorPatterns,
|
|
140
|
+
mostAffected: data.mostAffectedProcess
|
|
141
|
+
? t("aSum.mostAffectedProcess", { key: data.mostAffectedProcess })
|
|
142
|
+
: "",
|
|
143
|
+
}),
|
|
144
|
+
});
|
|
145
|
+
}));
|
|
146
|
+
registerComparisonWidgetTools({ server, ch, engineScope, profileStore, namesFor });
|
|
147
|
+
// --- BPMN Heatmap (per-element frequency + duration on the diagram) ---
|
|
148
|
+
server.tool({
|
|
149
|
+
name: "analytics_show_bpmn_heatmap",
|
|
150
|
+
title: "BPMN Heatmap",
|
|
151
|
+
description: "Render a process definition's BPMN diagram with a per-element heat overlay from metrics, with a Frequency↔Duration toggle (traversal count vs average duration per element). Node-level only — sequence-flow/edge heat is not available from metrics — and rendered on the latest deployed version's diagram (activity metrics carry no version label). Needs the camunda7 client to fetch the BPMN XML; otherwise the widget shows a fallback.",
|
|
152
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
153
|
+
inputSchema: strictToolInput(heatmapInputShape),
|
|
154
|
+
...showToolBinding("analytics_show_bpmn_heatmap", "BPMN Heatmap"),
|
|
155
|
+
}, withToolErrors(async (args, ctx) => {
|
|
156
|
+
const { t, title } = await localizeViewFor(profileStore, ctx);
|
|
157
|
+
const period = args.period ?? (await settingsFor(profileStore, ctx)).defaultPeriod;
|
|
158
|
+
const scoped = withEngineScope(engineScope, args);
|
|
159
|
+
const heat = await queries.elementHeat(withCallerSignal(ch, ctx.signal), {
|
|
160
|
+
...scoped,
|
|
161
|
+
period,
|
|
162
|
+
});
|
|
163
|
+
// Read here only to know whether a diagram exists (and why not); the
|
|
164
|
+
// XML stays out of the payload — the widget reads it from
|
|
165
|
+
// `analytics_bpmn_xml_data` (cached by the camunda7 lookup).
|
|
166
|
+
const bpmn = await loadBpmn(args.processDefinitionKey, scoped.engine);
|
|
167
|
+
return buildSingleWidgetView({
|
|
168
|
+
widget: "analytics:bpmn-heatmap",
|
|
169
|
+
app: "analytics",
|
|
170
|
+
dataType: "analytics:bpmnHeatmap",
|
|
171
|
+
// `AnalyticsBpmnHeatmapData` (widgets/bpmn-heatmap.tsx): the engines
|
|
172
|
+
// travel with the heat, so the model description names them.
|
|
173
|
+
data: {
|
|
174
|
+
processDefinitionKey: args.processDefinitionKey,
|
|
175
|
+
period,
|
|
176
|
+
engines: scoped.engine,
|
|
177
|
+
...(bpmn.bpmnMissing ? { bpmnMissing: bpmn.bpmnMissing } : {}),
|
|
178
|
+
frequency: heat.frequency,
|
|
179
|
+
durationSec: heat.durationSec,
|
|
180
|
+
asOf: heat.asOf,
|
|
181
|
+
},
|
|
182
|
+
title: title("aHeatmap.title"),
|
|
183
|
+
summary: t("aSum.bpmnHeatmap", {
|
|
184
|
+
key: args.processDefinitionKey,
|
|
185
|
+
period,
|
|
186
|
+
engines: engineScopeSummary(t, scoped.engine, isFleetRequest(args.engine)),
|
|
187
|
+
elementCount: Object.keys(heat.frequency).length,
|
|
188
|
+
fallbackNote: bpmn.bpmnXml ? "" : t("aSum.bpmnHeatmapNoXml"),
|
|
189
|
+
}),
|
|
190
|
+
});
|
|
191
|
+
}));
|
|
192
|
+
server.tool({
|
|
193
|
+
name: ANALYTICS_BPMN_HEATMAP_DATA,
|
|
194
|
+
title: "BPMN heatmap data (internal)",
|
|
195
|
+
description: "Internal JSON feed (no UI) for the BPMN heatmap — per-element execution frequency + average duration over a window. Lets another widget (e.g. the CIB Seven cockpit) paint the heat on its own diagram. Prefer analytics_show_bpmn_heatmap for a standalone view.",
|
|
196
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
197
|
+
inputSchema: strictToolInput(heatmapInputShape),
|
|
198
|
+
...appOnly,
|
|
199
|
+
}, withToolErrors(async (args, ctx) => {
|
|
200
|
+
const period = args.period ?? (await settingsFor(profileStore, ctx)).defaultPeriod;
|
|
201
|
+
const scoped = withEngineScope(engineScope, args);
|
|
202
|
+
const heat = await queries.elementHeat(withCallerSignal(ch, ctx.signal), {
|
|
203
|
+
...scoped,
|
|
204
|
+
period,
|
|
205
|
+
});
|
|
206
|
+
const data = {
|
|
207
|
+
processDefinitionKey: args.processDefinitionKey,
|
|
208
|
+
period,
|
|
209
|
+
engines: scoped.engine,
|
|
210
|
+
frequency: heat.frequency,
|
|
211
|
+
durationSec: heat.durationSec,
|
|
212
|
+
asOf: heat.asOf,
|
|
213
|
+
};
|
|
214
|
+
return buildDataFeedResult(data);
|
|
215
|
+
}));
|
|
216
|
+
server.tool({
|
|
217
|
+
name: ANALYTICS_BPMN_XML_DATA,
|
|
218
|
+
title: "BPMN heatmap diagram (internal)",
|
|
219
|
+
description: "Internal JSON feed (no UI): the latest deployed BPMN XML of a process key on the engines in scope, for the heatmap view's diagram.",
|
|
220
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
221
|
+
inputSchema: strictToolInput({
|
|
222
|
+
processDefinitionKey: heatmapInputShape.processDefinitionKey,
|
|
223
|
+
...schemas.engineFilterShape,
|
|
224
|
+
}),
|
|
225
|
+
...appOnly,
|
|
226
|
+
}, withToolErrors(async (args) => {
|
|
227
|
+
const scoped = withEngineScope(engineScope, args);
|
|
228
|
+
return buildDataFeedResult({
|
|
229
|
+
processDefinitionKey: args.processDefinitionKey,
|
|
230
|
+
...(await loadBpmn(args.processDefinitionKey, scoped.engine)),
|
|
231
|
+
});
|
|
232
|
+
}));
|
|
233
|
+
// ── Per-view data feeds (plain, no UI) ──────────────────────────────────
|
|
234
|
+
// Backing the dashboard widgets' self-fetch. Self-fetching a show_* tool
|
|
235
|
+
// instead would be host-defined behavior: hosts honoring
|
|
236
|
+
// `resultCanProduceWidget` may render a second widget per refresh, and the
|
|
237
|
+
// show tool's localized model summary is generated for a call the model
|
|
238
|
+
// never sees.
|
|
239
|
+
server.tool({
|
|
240
|
+
name: ANALYTICS_DASHBOARD_DATA,
|
|
241
|
+
title: "Analytics dashboard data (internal)",
|
|
242
|
+
description: "Internal JSON feed (no UI) for the analytics dashboard widgets' self-fetch. Prefer analytics_show_dashboard.",
|
|
243
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
244
|
+
inputSchema: strictToolInput(dashboardInputShape),
|
|
245
|
+
...appOnly,
|
|
246
|
+
}, withToolErrors(async (args, ctx) => {
|
|
247
|
+
const settings = await settingsFor(profileStore, ctx);
|
|
248
|
+
const data = await namedDashboard(await queries.dashboardData(withCallerSignal(ch, ctx.signal), {
|
|
249
|
+
...withEngineScope(engineScope, args),
|
|
250
|
+
period: args.period ?? settings.defaultPeriod,
|
|
251
|
+
minBucketSize: settings.minBucketSize,
|
|
252
|
+
}), namesFor);
|
|
253
|
+
return buildDataFeedResult({ ...data });
|
|
254
|
+
}));
|
|
255
|
+
server.tool({
|
|
256
|
+
name: ANALYTICS_FAILURE_DASHBOARD_DATA,
|
|
257
|
+
title: "Failure dashboard data (internal)",
|
|
258
|
+
description: "Internal JSON feed (no UI) for the failure dashboard widgets' self-fetch. Prefer analytics_show_failure_dashboard.",
|
|
259
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
260
|
+
inputSchema: strictToolInput({
|
|
261
|
+
...schemas.engineFilterShape,
|
|
262
|
+
}),
|
|
263
|
+
...appOnly,
|
|
264
|
+
}, withToolErrors(async (args, ctx) => {
|
|
265
|
+
const data = await namedFailureDashboard(await queries.failureDashboardData(withCallerSignal(ch, ctx.signal), withEngineScope(engineScope, args)), namesFor);
|
|
266
|
+
return buildDataFeedResult({ ...data });
|
|
267
|
+
}));
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=widget-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget-tools.js","sourceRoot":"","sources":["../src/widget-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget-tools.test.d.ts","sourceRoot":"","sources":["../src/widget-tools.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { parseToolResult } from "@miragon/mcp-toolkit-ui";
|
|
3
|
+
import { registerWidgetTools } from "./widget-tools.js";
|
|
4
|
+
import { createEngineScope } from "./engine-ids.js";
|
|
5
|
+
/** A feed's payload as the widget reads it (feeds answer in JSON text only). */
|
|
6
|
+
const feedData = (result) => parseToolResult(result);
|
|
7
|
+
/** Registers the widget tools on a stand-in server and returns their handlers. */
|
|
8
|
+
function handlers(ch) {
|
|
9
|
+
const byName = new Map();
|
|
10
|
+
const server = {
|
|
11
|
+
tool: (definition, handler) => {
|
|
12
|
+
byName.set(definition.name, handler);
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
registerWidgetTools(server, ch, { engineScope: createEngineScope(["prod-a", "prod-b"]) });
|
|
16
|
+
return byName;
|
|
17
|
+
}
|
|
18
|
+
/** PrometheusClient that records every instant PromQL string and returns no samples. */
|
|
19
|
+
function recordingClient() {
|
|
20
|
+
const queries = [];
|
|
21
|
+
return {
|
|
22
|
+
client: {
|
|
23
|
+
instant: (query) => {
|
|
24
|
+
queries.push(query);
|
|
25
|
+
return Promise.resolve([]);
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
queries,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const cells = (result) => result.structuredContent.layout.flatMap((r) => r.row);
|
|
32
|
+
/**
|
|
33
|
+
* The engine-health hand-off renders `analytics_show_failure_dashboard` for
|
|
34
|
+
* ONE engine: the cells must know that scope, or their hand-offs and model
|
|
35
|
+
* contexts send the model to every engine (or the saved default) instead.
|
|
36
|
+
*/
|
|
37
|
+
describe("analytics_show_failure_dashboard engine scope", () => {
|
|
38
|
+
it("queries the engine and hands it to every cell", async () => {
|
|
39
|
+
const { client, queries } = recordingClient();
|
|
40
|
+
const show = handlers(client).get("analytics_show_failure_dashboard");
|
|
41
|
+
const result = await show({ engine: "prod-b" }, {});
|
|
42
|
+
expect(queries.length).toBeGreaterThan(0);
|
|
43
|
+
for (const query of queries)
|
|
44
|
+
expect(query).toContain('engine_id="prod-b"');
|
|
45
|
+
// The cells' self-fetches keep their scope through these props; their
|
|
46
|
+
// hand-offs and model contexts name the data's `engines` echo
|
|
47
|
+
// (model-descriptions.test.ts pins the `engine` id they then carry).
|
|
48
|
+
expect(cells(result)).toEqual([
|
|
49
|
+
{ widget: "analytics:failure-summary-kpi", props: { engine: "prod-b" } },
|
|
50
|
+
{ widget: "analytics:error-patterns-table", props: { engine: "prod-b" } },
|
|
51
|
+
{ widget: "analytics:failure-rate-table", props: { engine: "prod-b" } },
|
|
52
|
+
]);
|
|
53
|
+
});
|
|
54
|
+
// The aggregate is the CONFIGURED fleet (#336), never the whole Prometheus:
|
|
55
|
+
// the query names every configured engine, and the data echoes them.
|
|
56
|
+
it("reads the configured fleet for the aggregate and leaves the cells unscoped", async () => {
|
|
57
|
+
const { client, queries } = recordingClient();
|
|
58
|
+
const result = await handlers(client).get("analytics_show_failure_dashboard")({}, {});
|
|
59
|
+
expect(queries.length).toBeGreaterThan(0);
|
|
60
|
+
for (const query of queries)
|
|
61
|
+
expect(query).toContain('engine_id=~"prod-a|prod-b"');
|
|
62
|
+
expect(cells(result).every((cell) => cell.props === undefined)).toBe(true);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe("view titles (U3) and the heatmap's as-of stamp (U7)", () => {
|
|
66
|
+
const CTX = { auth: { user: { id: "user-1" } } };
|
|
67
|
+
function localizedHandlers(language) {
|
|
68
|
+
const byName = new Map();
|
|
69
|
+
const server = {
|
|
70
|
+
tool: (definition, handler) => {
|
|
71
|
+
byName.set(definition.name, handler);
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
const profileStore = { get: () => Promise.resolve({ language }) };
|
|
75
|
+
registerWidgetTools(server, recordingClient().client, {
|
|
76
|
+
engineScope: createEngineScope(["prod-a"]),
|
|
77
|
+
profileStore,
|
|
78
|
+
});
|
|
79
|
+
return byName;
|
|
80
|
+
}
|
|
81
|
+
const SHOWS = [
|
|
82
|
+
["analytics_show_dashboard", {}],
|
|
83
|
+
["analytics_show_failure_dashboard", {}],
|
|
84
|
+
["analytics_show_bpmn_heatmap", { processDefinitionKey: "order" }],
|
|
85
|
+
];
|
|
86
|
+
const titles = async (language) => {
|
|
87
|
+
const tools = localizedHandlers(language);
|
|
88
|
+
const results = await Promise.all(SHOWS.map(([name, args]) => tools.get(name)(args, CTX)));
|
|
89
|
+
return results.map((r) => r.structuredContent.title);
|
|
90
|
+
};
|
|
91
|
+
it("titles each view in the caller's language, like the widget heading", async () => {
|
|
92
|
+
expect(await titles("de")).toEqual(["Prozessanalyse", "Fehleranalyse", "BPMN-Heatmap"]);
|
|
93
|
+
expect(await titles("en")).toEqual(["Process analytics", "Failure analysis", "BPMN heatmap"]);
|
|
94
|
+
});
|
|
95
|
+
it("stamps the heatmap with the time its values were read, in the view and the feed", async () => {
|
|
96
|
+
const tools = localizedHandlers("en");
|
|
97
|
+
const args = { processDefinitionKey: "order" };
|
|
98
|
+
const show = (await tools.get("analytics_show_bpmn_heatmap")(args, CTX));
|
|
99
|
+
const feed = await tools.get("analytics_bpmn_heatmap_data")(args, CTX);
|
|
100
|
+
const iso = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
|
|
101
|
+
expect(show.structuredContent.context.stepData.result.data.asOf).toMatch(iso);
|
|
102
|
+
expect(feedData(feed).asOf).toMatch(iso);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
/**
|
|
106
|
+
* The heatmap says WHY it has no diagram only when the server knows it: no
|
|
107
|
+
* lookup injected (camunda7 not active), or a lookup that failed or found
|
|
108
|
+
* nothing. The widget picks its text from that and never guesses.
|
|
109
|
+
*/
|
|
110
|
+
describe("the heatmap's missing-diagram cause", () => {
|
|
111
|
+
/**
|
|
112
|
+
* The diagram fields of the show tool's payload (a cause at most, never the
|
|
113
|
+
* XML: the model reads that payload on some hosts), of the heat feed (none)
|
|
114
|
+
* and of the diagram feed the widget reads the XML from.
|
|
115
|
+
*/
|
|
116
|
+
async function payloads(fetchBpmnXml, engines = ["prod-a"]) {
|
|
117
|
+
const byName = new Map();
|
|
118
|
+
const server = {
|
|
119
|
+
tool: (definition, handler) => {
|
|
120
|
+
byName.set(definition.name, handler);
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
registerWidgetTools(server, recordingClient().client, {
|
|
124
|
+
engineScope: createEngineScope(engines),
|
|
125
|
+
fetchBpmnXml,
|
|
126
|
+
});
|
|
127
|
+
const args = { processDefinitionKey: "order" };
|
|
128
|
+
const show = (await byName.get("analytics_show_bpmn_heatmap")(args, {}));
|
|
129
|
+
const heat = feedData(await byName.get("analytics_bpmn_heatmap_data")(args, {}));
|
|
130
|
+
const diagram = feedData(await byName.get("analytics_bpmn_xml_data")(args, {}));
|
|
131
|
+
const fields = ({ bpmnXml, bpmnMissing }) => ({ bpmnXml, bpmnMissing });
|
|
132
|
+
return {
|
|
133
|
+
show: fields(show.structuredContent.context.stepData.result.data),
|
|
134
|
+
heat: fields(heat),
|
|
135
|
+
diagram: fields(diagram),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
it("names the missing camunda7 module only when no lookup was injected", async () => {
|
|
139
|
+
const { show, heat, diagram } = await payloads();
|
|
140
|
+
expect(show).toEqual({ bpmnXml: undefined, bpmnMissing: "no-camunda7" });
|
|
141
|
+
expect(heat).toEqual({ bpmnXml: undefined, bpmnMissing: undefined });
|
|
142
|
+
expect(diagram).toEqual({ bpmnXml: null, bpmnMissing: "no-camunda7" });
|
|
143
|
+
});
|
|
144
|
+
it("says the lookup found nothing when it failed or returned null", async () => {
|
|
145
|
+
const failing = () => Promise.reject(new Error("ECONNREFUSED"));
|
|
146
|
+
const empty = () => Promise.resolve(null);
|
|
147
|
+
for (const fetcher of [failing, empty]) {
|
|
148
|
+
const { show, diagram } = await payloads(fetcher);
|
|
149
|
+
expect(show).toEqual({ bpmnXml: undefined, bpmnMissing: "not-loaded" });
|
|
150
|
+
expect(diagram).toEqual({ bpmnXml: null, bpmnMissing: "not-loaded" });
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
it("keeps the XML out of the show payload and the heat feed when the diagram is there", async () => {
|
|
154
|
+
const xml = '<?xml version="1.0"?><definitions />';
|
|
155
|
+
const { show, heat, diagram } = await payloads(() => Promise.resolve(xml));
|
|
156
|
+
expect(show).toEqual({ bpmnXml: undefined, bpmnMissing: undefined });
|
|
157
|
+
expect(heat).toEqual({ bpmnXml: undefined, bpmnMissing: undefined });
|
|
158
|
+
expect(diagram).toEqual({ bpmnXml: xml, bpmnMissing: undefined });
|
|
159
|
+
});
|
|
160
|
+
// The process may run on a later engine only: the first engine of the
|
|
161
|
+
// scope (configuration order) that has the model draws it.
|
|
162
|
+
it("reads the diagram from the engines of its scope in order", async () => {
|
|
163
|
+
const xml = '<?xml version="1.0"?><definitions />';
|
|
164
|
+
const asked = [];
|
|
165
|
+
const fetcher = (key, engine) => {
|
|
166
|
+
asked.push([key, engine]);
|
|
167
|
+
if (engine === "prod-a")
|
|
168
|
+
return Promise.reject(new Error("503"));
|
|
169
|
+
return Promise.resolve(engine === "prod-c" ? xml : null);
|
|
170
|
+
};
|
|
171
|
+
const { diagram } = await payloads(fetcher, ["prod-a", "prod-b", "prod-c"]);
|
|
172
|
+
expect(diagram).toEqual({ bpmnXml: xml, bpmnMissing: undefined });
|
|
173
|
+
expect(asked.slice(0, 3)).toEqual([
|
|
174
|
+
["order", "prod-a"],
|
|
175
|
+
["order", "prod-b"],
|
|
176
|
+
["order", "prod-c"],
|
|
177
|
+
]);
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
/**
|
|
181
|
+
* The names behind the ids (U13): the dashboard, the failure dashboard and
|
|
182
|
+
* the landscape carry the process (and, for the activity breakdown, the
|
|
183
|
+
* element) names the lookup knows, in the show tool's payload and in its
|
|
184
|
+
* feed alike. The dashboard judges its rate against the caller's saved
|
|
185
|
+
* comparison floor.
|
|
186
|
+
*/
|
|
187
|
+
describe("the names behind the ids", () => {
|
|
188
|
+
const ORDER = { process_definition_key: "order" };
|
|
189
|
+
/** One process with one activity, an open incident group and a deployment. */
|
|
190
|
+
const client = {
|
|
191
|
+
instant: (query) => {
|
|
192
|
+
if (query.includes("by (process_definition_key, activity_id, activity_type)")) {
|
|
193
|
+
return Promise.resolve([
|
|
194
|
+
{ metric: { ...ORDER, activity_id: "Task_A", activity_type: "userTask" }, value: 2 },
|
|
195
|
+
]);
|
|
196
|
+
}
|
|
197
|
+
if (query.includes("by (process_definition_key, incident_type)")) {
|
|
198
|
+
return Promise.resolve([{ metric: { ...ORDER, incident_type: "failedJob" }, value: 1 }]);
|
|
199
|
+
}
|
|
200
|
+
if (query.includes("by (engine_id, process_definition_key)")) {
|
|
201
|
+
return Promise.resolve([{ metric: { ...ORDER, engine_id: "prod-a" }, value: 1 }]);
|
|
202
|
+
}
|
|
203
|
+
if (query.includes("by (process_definition_key)")) {
|
|
204
|
+
return Promise.resolve([{ metric: ORDER, value: 3 }]);
|
|
205
|
+
}
|
|
206
|
+
if (query.includes("process_instance_started_total")) {
|
|
207
|
+
return Promise.resolve([{ metric: {}, value: 4 }]);
|
|
208
|
+
}
|
|
209
|
+
return Promise.resolve([]);
|
|
210
|
+
},
|
|
211
|
+
};
|
|
212
|
+
const NAMES = { order: { name: "Order fulfillment", elements: { Task_A: "Pack" } } };
|
|
213
|
+
async function run(name) {
|
|
214
|
+
const byName = new Map();
|
|
215
|
+
const server = {
|
|
216
|
+
tool: (definition, handler) => {
|
|
217
|
+
byName.set(definition.name, handler);
|
|
218
|
+
},
|
|
219
|
+
};
|
|
220
|
+
const calls = [];
|
|
221
|
+
const profileStore = {
|
|
222
|
+
get: () => Promise.resolve({ modules: { analytics: { minBucketSize: 3 } } }),
|
|
223
|
+
};
|
|
224
|
+
registerWidgetTools(server, client, {
|
|
225
|
+
engineScope: createEngineScope(["prod-a"]),
|
|
226
|
+
profileStore,
|
|
227
|
+
namesFor: (keys, request) => {
|
|
228
|
+
calls.push([[...keys], request]);
|
|
229
|
+
return Promise.resolve(NAMES);
|
|
230
|
+
},
|
|
231
|
+
});
|
|
232
|
+
const ctx = { auth: { user: { id: "user-1" } } };
|
|
233
|
+
const result = await byName.get(name)({}, ctx);
|
|
234
|
+
return { content: feedData(result), calls };
|
|
235
|
+
}
|
|
236
|
+
/** The payload of a show tool (its step data) or of a feed (the content itself). */
|
|
237
|
+
const payloadOf = (content) => (content.context?.stepData
|
|
238
|
+
?.result?.data ?? content);
|
|
239
|
+
it.each([
|
|
240
|
+
"analytics_show_dashboard",
|
|
241
|
+
"analytics_dashboard_data",
|
|
242
|
+
"analytics_show_failure_dashboard",
|
|
243
|
+
"analytics_failure_dashboard_data",
|
|
244
|
+
"analytics_show_engine_landscape",
|
|
245
|
+
"analytics_engine_landscape_data",
|
|
246
|
+
])("%s carries the names", async (name) => {
|
|
247
|
+
const { content, calls } = await run(name);
|
|
248
|
+
expect(JSON.stringify(content)).toContain('"names":{"order":{"name":"Order fulfillment"');
|
|
249
|
+
expect(calls).toHaveLength(1);
|
|
250
|
+
expect(calls[0][0]).toContain("order");
|
|
251
|
+
});
|
|
252
|
+
it("asks for the elements of the activity breakdown only", async () => {
|
|
253
|
+
const { calls } = await run("analytics_dashboard_data");
|
|
254
|
+
expect(calls[0][1]?.elementIds).toEqual({ order: ["Task_A"] });
|
|
255
|
+
const failures = await run("analytics_failure_dashboard_data");
|
|
256
|
+
expect(failures.calls[0][1]?.elementIds).toEqual({ order: [] });
|
|
257
|
+
});
|
|
258
|
+
// A process that runs only on a later engine is named too: each view says
|
|
259
|
+
// which engines its rows come from, the landscape per process.
|
|
260
|
+
it("reads the models on the engines the rows come from", async () => {
|
|
261
|
+
const failures = await run("analytics_failure_dashboard_data");
|
|
262
|
+
expect(failures.calls[0][1]?.engines).toEqual(["prod-a"]);
|
|
263
|
+
const landscape = await run("analytics_engine_landscape_data");
|
|
264
|
+
expect(landscape.calls[0][1]?.enginesByKey).toEqual({ order: ["prod-a"] });
|
|
265
|
+
});
|
|
266
|
+
it("judges the dashboard's rate against the caller's saved comparison floor", async () => {
|
|
267
|
+
const { content } = await run("analytics_dashboard_data");
|
|
268
|
+
// 4 starts in each window, the saved floor 3: a change of the rate is judged.
|
|
269
|
+
expect(payloadOf(content).previous).toMatchObject({ totalCount: 4, suppressed: false });
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
//# sourceMappingURL=widget-tools.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget-tools.test.js","sourceRoot":"","sources":["../src/widget-tools.test.ts"],"names":[],"mappings":"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"}
|