@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.
Files changed (357) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +86 -3
  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 -5
  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,77 @@
1
+ import { z } from "zod";
2
+ import type { ProfileSource } from "./server-locale.js";
3
+ /**
4
+ * The analytics module's OWN settings slice, persisted under
5
+ * `profile.modules.analytics` in the shared profile record (see the camunda7
6
+ * `modules` field — the profile transports the slice, this module owns its
7
+ * schema). Read fail-soft: a missing/foreign slice yields the defaults, so a
8
+ * stale or hand-edited record can never break analytics tools.
9
+ */
10
+ export declare const analyticsSettingsSchema: z.ZodObject<{
11
+ defaultPeriod: z.ZodDefault<z.ZodEnum<{
12
+ "1d": "1d";
13
+ "3d": "3d";
14
+ "7d": "7d";
15
+ "14d": "14d";
16
+ "30d": "30d";
17
+ }>>;
18
+ minBucketSize: z.ZodDefault<z.ZodNumber>;
19
+ }, z.core.$strip>;
20
+ export type AnalyticsSettings = z.infer<typeof analyticsSettingsSchema>;
21
+ /**
22
+ * The save tool's input — deliberately default-FREE: zod 4 re-applies
23
+ * `.default()`s through `.partial()` on parse, so a defaulted partial would
24
+ * materialize omitted fields at the tool boundary and a "single-field" save
25
+ * would silently reset the other saved value. With this shape, omitted keys
26
+ * stay absent and the handler's merge keeps them unchanged.
27
+ *
28
+ * Spelled out by hand because the save descriptions differ from the schema's
29
+ * ("Omitted → unchanged" is what the model needs at a write boundary). When the
30
+ * descriptions can be shared, derive it instead:
31
+ * `z.object(withoutDefaults(analyticsSettingsSchema.shape)).partial()`
32
+ * (`withoutDefaults` from `@miragon/pulse-widget-shell/server`) — which is what
33
+ * camunda7's `userProfileSaveInput` does.
34
+ */
35
+ export declare const analyticsSettingsSaveInput: z.ZodObject<{
36
+ defaultPeriod: z.ZodOptional<z.ZodEnum<{
37
+ "1d": "1d";
38
+ "3d": "3d";
39
+ "7d": "7d";
40
+ "14d": "14d";
41
+ "30d": "30d";
42
+ }>>;
43
+ minBucketSize: z.ZodOptional<z.ZodNumber>;
44
+ }, z.core.$strip>;
45
+ /**
46
+ * `period` at the tool boundary is optional (no zod default) so an omitted
47
+ * value is distinguishable and can fall back to the user's saved analytics
48
+ * default before the schema default applies. Derived from PERIODS — never a
49
+ * copied enum. Shared by the widget tools and the registrar tools.
50
+ */
51
+ export declare const optionalPeriod: z.ZodOptional<z.ZodEnum<{
52
+ "1d": "1d";
53
+ "3d": "3d";
54
+ "7d": "7d";
55
+ "14d": "14d";
56
+ "30d": "30d";
57
+ }>>;
58
+ /** Same optional-at-the-boundary treatment for `minBucketSize`. */
59
+ export declare const optionalMinBucketSize: z.ZodOptional<z.ZodNumber>;
60
+ /** The module's slice key inside `profile.modules`. */
61
+ export declare const ANALYTICS_MODULE_KEY = "analytics";
62
+ /**
63
+ * The slice parsed leniently: garbage or absence yields the defaults —
64
+ * per FIELD (shared `parseModuleSlice`), so one invalid value keeps the
65
+ * other saved preference intact.
66
+ */
67
+ export declare function parseAnalyticsSettings(modules: Record<string, unknown> | undefined): AnalyticsSettings;
68
+ /**
69
+ * Resolve the request's effective analytics settings from the shared profile
70
+ * store — the single place tools apply the "explicit arg > saved setting >
71
+ * schema default" precedence for `period`/`minBucketSize`. Fail-soft on every
72
+ * axis: no store, no resolvable key, or a store OUTAGE all yield the schema
73
+ * defaults — a profile-store hiccup must never fail an analytics read that
74
+ * only needs Prometheus.
75
+ */
76
+ export declare function settingsFor(store: ProfileSource | undefined, ctx?: unknown): Promise<AnalyticsSettings>;
77
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAGvD;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;iBAalC,CAAA;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAEvE;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;iBAWrC,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc;;;;;;GAGiE,CAAA;AAE5F,mEAAmE;AACnE,eAAO,MAAM,qBAAqB,4BAO/B,CAAA;AAEH,uDAAuD;AACvD,eAAO,MAAM,oBAAoB,cAAc,CAAA;AAE/C;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC3C,iBAAiB,CAEnB;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,aAAa,GAAG,SAAS,EAChC,GAAG,CAAC,EAAE,OAAO,GACZ,OAAO,CAAC,iBAAiB,CAAC,CAU5B"}
@@ -0,0 +1,99 @@
1
+ import { z } from "zod";
2
+ import { PERIODS } from "@miragon/pulse-analytics-client";
3
+ import { parseModuleSlice } from "@miragon/pulse-widget-shell/server";
4
+ import { resolveSettingsKey } from "./server-locale.js";
5
+ /**
6
+ * The analytics module's OWN settings slice, persisted under
7
+ * `profile.modules.analytics` in the shared profile record (see the camunda7
8
+ * `modules` field — the profile transports the slice, this module owns its
9
+ * schema). Read fail-soft: a missing/foreign slice yields the defaults, so a
10
+ * stale or hand-edited record can never break analytics tools.
11
+ */
12
+ export const analyticsSettingsSchema = z.object({
13
+ defaultPeriod: z
14
+ .enum(PERIODS)
15
+ .default("7d")
16
+ .describe("Default look-back window applied when an analytics call omits `period`."),
17
+ minBucketSize: z
18
+ .number()
19
+ .int()
20
+ .min(1)
21
+ .default(10)
22
+ .describe("Default minimum per-window instance count before comparison results are flagged `suppressed`, applied when a compare call omits `minBucketSize`."),
23
+ });
24
+ /**
25
+ * The save tool's input — deliberately default-FREE: zod 4 re-applies
26
+ * `.default()`s through `.partial()` on parse, so a defaulted partial would
27
+ * materialize omitted fields at the tool boundary and a "single-field" save
28
+ * would silently reset the other saved value. With this shape, omitted keys
29
+ * stay absent and the handler's merge keeps them unchanged.
30
+ *
31
+ * Spelled out by hand because the save descriptions differ from the schema's
32
+ * ("Omitted → unchanged" is what the model needs at a write boundary). When the
33
+ * descriptions can be shared, derive it instead:
34
+ * `z.object(withoutDefaults(analyticsSettingsSchema.shape)).partial()`
35
+ * (`withoutDefaults` from `@miragon/pulse-widget-shell/server`) — which is what
36
+ * camunda7's `userProfileSaveInput` does.
37
+ */
38
+ export const analyticsSettingsSaveInput = z.object({
39
+ defaultPeriod: z
40
+ .enum(PERIODS)
41
+ .optional()
42
+ .describe("New default look-back period. Omitted → unchanged."),
43
+ minBucketSize: z
44
+ .number()
45
+ .int()
46
+ .min(1)
47
+ .optional()
48
+ .describe("New minimum comparison bucket size. Omitted → unchanged."),
49
+ });
50
+ /**
51
+ * `period` at the tool boundary is optional (no zod default) so an omitted
52
+ * value is distinguishable and can fall back to the user's saved analytics
53
+ * default before the schema default applies. Derived from PERIODS — never a
54
+ * copied enum. Shared by the widget tools and the registrar tools.
55
+ */
56
+ export const optionalPeriod = z
57
+ .enum(PERIODS)
58
+ .optional()
59
+ .describe("Analysis time period. Omitted → the user's saved analytics default (else 7d).");
60
+ /** Same optional-at-the-boundary treatment for `minBucketSize`. */
61
+ export const optionalMinBucketSize = z
62
+ .number()
63
+ .int()
64
+ .min(1)
65
+ .optional()
66
+ .describe("Minimum per-window instance count before results are flagged `suppressed`. Omitted → the user's saved analytics default (else 10).");
67
+ /** The module's slice key inside `profile.modules`. */
68
+ export const ANALYTICS_MODULE_KEY = "analytics";
69
+ /**
70
+ * The slice parsed leniently: garbage or absence yields the defaults —
71
+ * per FIELD (shared `parseModuleSlice`), so one invalid value keeps the
72
+ * other saved preference intact.
73
+ */
74
+ export function parseAnalyticsSettings(modules) {
75
+ return parseModuleSlice(analyticsSettingsSchema, modules?.[ANALYTICS_MODULE_KEY]);
76
+ }
77
+ /**
78
+ * Resolve the request's effective analytics settings from the shared profile
79
+ * store — the single place tools apply the "explicit arg > saved setting >
80
+ * schema default" precedence for `period`/`minBucketSize`. Fail-soft on every
81
+ * axis: no store, no resolvable key, or a store OUTAGE all yield the schema
82
+ * defaults — a profile-store hiccup must never fail an analytics read that
83
+ * only needs Prometheus.
84
+ */
85
+ export async function settingsFor(store, ctx) {
86
+ if (!store)
87
+ return analyticsSettingsSchema.parse({});
88
+ const key = resolveSettingsKey(ctx);
89
+ if (!key)
90
+ return analyticsSettingsSchema.parse({});
91
+ try {
92
+ const profile = await store.get(key);
93
+ return parseAnalyticsSettings(profile?.modules);
94
+ }
95
+ catch {
96
+ return analyticsSettingsSchema.parse({});
97
+ }
98
+ }
99
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAA;AAErE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAEvD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,aAAa,EAAE,CAAC;SACb,IAAI,CAAC,OAAO,CAAC;SACb,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,yEAAyE,CAAC;IACtF,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CACP,kJAAkJ,CACnJ;CACJ,CAAC,CAAA;AAIF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,aAAa,EAAE,CAAC;SACb,IAAI,CAAC,OAAO,CAAC;SACb,QAAQ,EAAE;SACV,QAAQ,CAAC,oDAAoD,CAAC;IACjE,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,0DAA0D,CAAC;CACxE,CAAC,CAAA;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC5B,IAAI,CAAC,OAAO,CAAC;KACb,QAAQ,EAAE;KACV,QAAQ,CAAC,+EAA+E,CAAC,CAAA;AAE5F,mEAAmE;AACnE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC;KACnC,MAAM,EAAE;KACR,GAAG,EAAE;KACL,GAAG,CAAC,CAAC,CAAC;KACN,QAAQ,EAAE;KACV,QAAQ,CACP,oIAAoI,CACrI,CAAA;AAEH,uDAAuD;AACvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,WAAW,CAAA;AAE/C;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAA4C;IAE5C,OAAO,gBAAgB,CAAC,uBAAuB,EAAE,OAAO,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAA;AACnF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAgC,EAChC,GAAa;IAEb,IAAI,CAAC,KAAK;QAAE,OAAO,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACpD,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;IACnC,IAAI,CAAC,GAAG;QAAE,OAAO,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAClD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACpC,OAAO,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC1C,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=settings.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.test.d.ts","sourceRoot":"","sources":["../src/settings.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,299 @@
1
+ import { afterEach, describe, expect, it, vi } from "vitest";
2
+ import { parseToolResult } from "@miragon/mcp-toolkit-ui";
3
+ import { createInMemoryProfileStore, runWithMcpRequestInfo, } from "@miragon/pulse-widget-shell/server";
4
+ import { analyticsSettingsSaveInput, analyticsSettingsSchema, parseAnalyticsSettings, settingsFor, } from "./settings.js";
5
+ import { registerSettingsTools } from "./settings-tools.js";
6
+ import { ANALYTICS_SAVE_SETTINGS, ANALYTICS_SETTINGS_DATA } from "./tool-names.js";
7
+ import { localizeFor } from "./server-locale.js";
8
+ /** A feed's payload as the widget reads it (feeds answer in JSON text only). */
9
+ const feedData = (result) => parseToolResult(result);
10
+ afterEach(() => {
11
+ vi.restoreAllMocks();
12
+ });
13
+ /** A signed-in caller's handler ctx (mcp-use's flattened `ctx.auth`). */
14
+ const CTX = { auth: { user: { id: "user-1" } } };
15
+ describe("analyticsSettingsSchema", () => {
16
+ it("fills every default from an empty object", () => {
17
+ expect(analyticsSettingsSchema.parse({})).toEqual({ defaultPeriod: "7d", minBucketSize: 10 });
18
+ });
19
+ });
20
+ describe("analyticsSettingsSaveInput", () => {
21
+ // Zod 4 re-applies `.default()`s through `.partial()` — the save input must
22
+ // stay default-free so a single-field save can't reset the other saved value
23
+ // at the tool boundary.
24
+ it("keeps omitted fields ABSENT instead of materializing defaults", () => {
25
+ expect(analyticsSettingsSaveInput.parse({ minBucketSize: 5 })).toEqual({ minBucketSize: 5 });
26
+ expect(analyticsSettingsSaveInput.parse({})).toEqual({});
27
+ });
28
+ });
29
+ describe("parseAnalyticsSettings", () => {
30
+ it("returns defaults when the slice is absent", () => {
31
+ expect(parseAnalyticsSettings(undefined)).toEqual({ defaultPeriod: "7d", minBucketSize: 10 });
32
+ expect(parseAnalyticsSettings({})).toEqual({ defaultPeriod: "7d", minBucketSize: 10 });
33
+ });
34
+ it("returns defaults for a garbage slice (fail-soft)", () => {
35
+ expect(parseAnalyticsSettings({ analytics: "nope" })).toEqual({
36
+ defaultPeriod: "7d",
37
+ minBucketSize: 10,
38
+ });
39
+ expect(parseAnalyticsSettings({ analytics: { defaultPeriod: "yesterday" } })).toEqual({
40
+ defaultPeriod: "7d",
41
+ minBucketSize: 10,
42
+ });
43
+ });
44
+ it("degrades per FIELD: one invalid value keeps the other saved preference", () => {
45
+ expect(parseAnalyticsSettings({ analytics: { defaultPeriod: "yesterday", minBucketSize: 5 } })).toEqual({ defaultPeriod: "7d", minBucketSize: 5 });
46
+ });
47
+ it("parses a valid slice and fills missing fields with defaults", () => {
48
+ expect(parseAnalyticsSettings({ analytics: { defaultPeriod: "30d" } })).toEqual({
49
+ defaultPeriod: "30d",
50
+ minBucketSize: 10,
51
+ });
52
+ });
53
+ it("ignores other modules' slices", () => {
54
+ expect(parseAnalyticsSettings({ other: { defaultPeriod: "1d" } })).toEqual({
55
+ defaultPeriod: "7d",
56
+ minBucketSize: 10,
57
+ });
58
+ });
59
+ });
60
+ describe("settingsFor", () => {
61
+ it("returns defaults without a store", async () => {
62
+ expect(await settingsFor(undefined)).toEqual({ defaultPeriod: "7d", minBucketSize: 10 });
63
+ });
64
+ it("reads the slice off the profile record", async () => {
65
+ const store = {
66
+ get: () => Promise.resolve({ modules: { analytics: { defaultPeriod: "14d", minBucketSize: 3 } } }),
67
+ };
68
+ expect(await settingsFor(store, CTX)).toEqual({ defaultPeriod: "14d", minBucketSize: 3 });
69
+ // No caller identity → the defaults, never someone else's slice.
70
+ expect(await settingsFor(store)).toEqual({ defaultPeriod: "7d", minBucketSize: 10 });
71
+ });
72
+ it("falls back to defaults when the store throws (outage must not fail analytics reads)", async () => {
73
+ const store = {
74
+ get: () => Promise.reject(new Error("connection refused")),
75
+ };
76
+ expect(await settingsFor(store, CTX)).toEqual({ defaultPeriod: "7d", minBucketSize: 10 });
77
+ });
78
+ });
79
+ describe("localizeFor", () => {
80
+ it("binds the translate to the profile language", async () => {
81
+ const store = { get: () => Promise.resolve({ language: "de" }) };
82
+ const t = await localizeFor(store, CTX);
83
+ expect(t("aSettings.heading")).toBe("Analyse-Einstellungen");
84
+ });
85
+ it("falls back to English on a store OUTAGE, like settingsFor", async () => {
86
+ const store = { get: () => Promise.reject(new Error("connection refused")) };
87
+ const t = await localizeFor(store, CTX);
88
+ expect(t("aSettings.heading")).toBe("Analytics settings");
89
+ });
90
+ });
91
+ describe("registerSettingsTools", () => {
92
+ // `toolset` is a plain string here on purpose: an untyped (JS) caller can
93
+ // hand the gate any name, and the gate must still resolve it fail-closed.
94
+ function registeredToolNames(store, toolset) {
95
+ const tool = vi.fn();
96
+ const server = { tool };
97
+ registerSettingsTools(server, store, toolset);
98
+ return tool.mock.calls.map((c) => c[0].name);
99
+ }
100
+ const writable = {
101
+ get: () => Promise.resolve(undefined),
102
+ save: () => Promise.resolve({}),
103
+ };
104
+ it('registers the save tool with a writable store in the "standard" toolset', () => {
105
+ expect(registeredToolNames(writable, "standard")).toEqual([
106
+ "analytics_show_settings",
107
+ ANALYTICS_SETTINGS_DATA,
108
+ ANALYTICS_SAVE_SETTINGS,
109
+ ]);
110
+ });
111
+ it("stays read-only without a writable store (no save tool), even in standard", () => {
112
+ const readOnly = { get: () => Promise.resolve(undefined) };
113
+ expect(registeredToolNames(readOnly, "standard")).toEqual([
114
+ "analytics_show_settings",
115
+ ANALYTICS_SETTINGS_DATA,
116
+ ]);
117
+ expect(registeredToolNames(undefined, "standard")).toEqual([
118
+ "analytics_show_settings",
119
+ ANALYTICS_SETTINGS_DATA,
120
+ ]);
121
+ });
122
+ it("fails closed WITHOUT a toolset: a writable store alone registers no save tool", () => {
123
+ // A missing toolset is the read-only floor (silently — it is the
124
+ // documented default of a direct caller, not a misconfiguration).
125
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
126
+ expect(registeredToolNames(writable)).toEqual([
127
+ "analytics_show_settings",
128
+ ANALYTICS_SETTINGS_DATA,
129
+ ]);
130
+ expect(warn).not.toHaveBeenCalled();
131
+ });
132
+ it('drops the durable save tool in the "read-only" toolset, fails closed on unknown names', () => {
133
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
134
+ expect(registeredToolNames(writable, "read-only")).toEqual([
135
+ "analytics_show_settings",
136
+ ANALYTICS_SETTINGS_DATA,
137
+ ]);
138
+ expect(registeredToolNames(writable, "nonsense")).toEqual([
139
+ "analytics_show_settings",
140
+ ANALYTICS_SETTINGS_DATA,
141
+ ]);
142
+ expect(warn).toHaveBeenCalledWith(expect.stringContaining('Unknown toolset "nonsense"'));
143
+ });
144
+ it("a save-less section reports canSave false even for an identified caller", async () => {
145
+ const tool = vi.fn();
146
+ registerSettingsTools({ tool }, writable, "read-only");
147
+ const data = tool.mock.calls.find((c) => c[0].name === ANALYTICS_SETTINGS_DATA)[1];
148
+ const view = await runWithMcpRequestInfo({ authUserId: "user-7" }, () => data());
149
+ expect(feedData(view).canSave).toBe(false);
150
+ });
151
+ it("the model summary points at the save tool only when it is registered", async () => {
152
+ const show = async (toolset) => {
153
+ const tool = vi.fn();
154
+ registerSettingsTools({ tool }, writable, toolset);
155
+ const handler = tool.mock.calls.find((c) => c[0].name === "analytics_show_settings")[1];
156
+ return runWithMcpRequestInfo({ authUserId: "user-7" }, () => handler());
157
+ };
158
+ const defaults = { defaultPeriod: "7d", minBucketSize: 10 };
159
+ const standard = await show("standard");
160
+ expect(standard.content[0].text).toBe("Analytics settings: default period 7d, min bucket size 10. Change via analytics_save_settings.");
161
+ // A caller whose profile names no language follows the host: the server
162
+ // sets no view title (an English one would sit over a German view), and
163
+ // the section's own heading names the view (#322 U3).
164
+ expect(standard.structuredContent.title).toBeUndefined();
165
+ expect(standard.structuredContent).toMatchObject({
166
+ layout: [{ row: [{ widget: "analytics:settings" }] }],
167
+ context: {
168
+ stepData: {
169
+ result: {
170
+ data: { settings: defaults, canSave: true },
171
+ _app: "analytics",
172
+ _dataType: "analytics:settings",
173
+ },
174
+ },
175
+ },
176
+ });
177
+ // On the read-only floor the save tool does not exist — advertising it to
178
+ // the model would send it to an unknown tool.
179
+ const readOnly = await show("read-only");
180
+ expect(readOnly.content[0].text).toBe("Analytics settings: default period 7d, min bucket size 10.");
181
+ expect(readOnly.structuredContent).toMatchObject({
182
+ context: { stepData: { result: { data: { settings: defaults, canSave: false } } } },
183
+ });
184
+ });
185
+ it("declares honest metadata for the settings triple", () => {
186
+ const tool = vi.fn();
187
+ registerSettingsTools({ tool }, writable, "standard");
188
+ const definitions = tool.mock.calls.map((c) => c[0]);
189
+ const readOnlyRead = { readOnlyHint: true, idempotentHint: true, openWorldHint: true };
190
+ expect(definitions.map(({ name, annotations }) => [name, annotations])).toEqual([
191
+ ["analytics_show_settings", readOnlyRead],
192
+ [ANALYTICS_SETTINGS_DATA, readOnlyRead],
193
+ [
194
+ ANALYTICS_SAVE_SETTINGS,
195
+ { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
196
+ ],
197
+ ]);
198
+ for (const { name, title, description } of definitions) {
199
+ expect(title, `${name} title`).toBeTruthy();
200
+ expect(description, `${name} description`).toBeTruthy();
201
+ }
202
+ });
203
+ it("round-trips a save through the caller's record", async () => {
204
+ const store = createInMemoryProfileStore();
205
+ const tool = vi.fn();
206
+ registerSettingsTools({ tool }, store, "standard");
207
+ const handlerFor = (name) => {
208
+ const call = tool.mock.calls.find((c) => c[0].name === name);
209
+ if (!call)
210
+ throw new Error(`tool ${name} not registered`);
211
+ return call[1];
212
+ };
213
+ const saved = await handlerFor(ANALYTICS_SAVE_SETTINGS)({ defaultPeriod: "30d" }, CTX);
214
+ // The widget reads the EFFECTIVE slice back from structuredContent; the
215
+ // model gets the localized confirmation.
216
+ expect(saved.structuredContent).toEqual({ defaultPeriod: "30d", minBucketSize: 10 });
217
+ expect(saved.content).toEqual([
218
+ {
219
+ type: "text",
220
+ text: "Analytics settings saved: default period 30d, min bucket size 10.",
221
+ },
222
+ ]);
223
+ // Only the provided field is persisted — no defaults materialized into
224
+ // storage, so a later default change applies to fields never set.
225
+ expect((await store.get("user-1"))?.modules).toEqual({
226
+ analytics: { defaultPeriod: "30d" },
227
+ });
228
+ const data = await handlerFor(ANALYTICS_SETTINGS_DATA)({}, CTX);
229
+ expect(feedData(data).settings).toEqual({ defaultPeriod: "30d", minBucketSize: 10 });
230
+ });
231
+ it("a partial save keeps the other saved value (the store merges the patch)", async () => {
232
+ const store = createInMemoryProfileStore();
233
+ const tool = vi.fn();
234
+ registerSettingsTools({ tool }, store, "standard");
235
+ const call = tool.mock.calls.find((c) => c[0].name === ANALYTICS_SAVE_SETTINGS);
236
+ const save = call[1];
237
+ await save({ defaultPeriod: "30d" }, CTX);
238
+ const saved = await save({ minBucketSize: 5 }, CTX);
239
+ expect((await store.get("user-1"))?.modules).toEqual({
240
+ analytics: { defaultPeriod: "30d", minBucketSize: 5 },
241
+ });
242
+ // The report is the SAVED slice, not just this call's patch.
243
+ expect(saved.structuredContent).toEqual({ defaultPeriod: "30d", minBucketSize: 5 });
244
+ });
245
+ it("concurrent saves of the two fields keep both, even when one already held a value", async () => {
246
+ // Writes land after a round-trip, like a database's: the second save runs
247
+ // while the first one's write is still in flight. A save that handed the
248
+ // store a slice pre-read outside its lock would write the stale period back.
249
+ const inner = createInMemoryProfileStore();
250
+ await inner.save("user-1", { modules: { analytics: { defaultPeriod: "7d" } } });
251
+ const store = {
252
+ get: (key) => inner.get(key),
253
+ save: async (key, input, opts) => {
254
+ await new Promise((resolve) => setTimeout(resolve, 10));
255
+ return inner.save(key, input, opts);
256
+ },
257
+ };
258
+ const tool = vi.fn();
259
+ registerSettingsTools({ tool }, store, "standard");
260
+ const save = tool.mock.calls.find((c) => c[0].name === ANALYTICS_SAVE_SETTINGS)[1];
261
+ const first = save({ defaultPeriod: "30d" }, CTX);
262
+ await new Promise((resolve) => setTimeout(resolve, 1));
263
+ await Promise.all([first, save({ minBucketSize: 25 }, CTX)]);
264
+ expect((await inner.get("user-1"))?.modules).toEqual({
265
+ analytics: { defaultPeriod: "30d", minBucketSize: 25 },
266
+ });
267
+ });
268
+ // HTTP without OAuth: the ambient request info exists but carries no
269
+ // identity — the section must go read-only and the save tool must refuse
270
+ // with an actionable cause.
271
+ it("identity gating: canSave false + save refusal without identity, true with an auth user", async () => {
272
+ const tool = vi.fn();
273
+ registerSettingsTools({ tool }, { get: () => Promise.resolve(undefined), save: () => Promise.resolve({}) }, "standard");
274
+ const handlerFor = (name) => {
275
+ const call = tool.mock.calls.find((c) => c[0].name === name);
276
+ if (!call)
277
+ throw new Error(`tool ${name} not registered`);
278
+ return call[1];
279
+ };
280
+ const bare = await runWithMcpRequestInfo({}, () => handlerFor(ANALYTICS_SETTINGS_DATA)({}));
281
+ expect(feedData(bare).canSave).toBe(false);
282
+ const refused = await runWithMcpRequestInfo({}, () => handlerFor(ANALYTICS_SAVE_SETTINGS)({ defaultPeriod: "30d" }));
283
+ expect(refused.isError).toBe(true);
284
+ expect(refused.content?.[0]?.text).toContain("MCP_OAUTH");
285
+ const authed = await runWithMcpRequestInfo({ authUserId: "user-7" }, () => handlerFor(ANALYTICS_SETTINGS_DATA)({}));
286
+ expect(feedData(authed).canSave).toBe(true);
287
+ });
288
+ it("stamps the OAuth caller on the saved record as its owner", async () => {
289
+ const save = vi.fn(() => Promise.resolve({}));
290
+ const tool = vi.fn();
291
+ registerSettingsTools({ tool }, { get: () => Promise.resolve(undefined), save }, "standard");
292
+ const handler = tool.mock.calls.find((c) => c[0].name === ANALYTICS_SAVE_SETTINGS)[1];
293
+ await runWithMcpRequestInfo({ authUserId: "user-7" }, () => handler({ minBucketSize: 5 }));
294
+ expect(save).toHaveBeenCalledOnce();
295
+ expect(save.mock.calls[0][1]).toEqual({ modules: { analytics: { minBucketSize: 5 } } });
296
+ expect(save.mock.calls[0][2]).toEqual({ userId: "user-7" });
297
+ });
298
+ });
299
+ //# sourceMappingURL=settings.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.test.js","sourceRoot":"","sources":["../src/settings.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAEzD,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,sBAAsB,EACtB,WAAW,GACZ,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAClF,OAAO,EAAE,WAAW,EAAsB,MAAM,oBAAoB,CAAA;AAGpE,gFAAgF;AAChF,MAAM,QAAQ,GAAG,CAA8B,MAAe,EAAK,EAAE,CAAC,eAAe,CAAI,MAAM,CAAC,CAAA;AAEhG,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,eAAe,EAAE,CAAA;AACtB,CAAC,CAAC,CAAA;AAEF,yEAAyE;AACzE,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;AAEhD,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAA;IAC/F,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,4EAA4E;IAC5E,6EAA6E;IAC7E,wBAAwB;IACxB,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,0BAA0B,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAA;QAC5F,MAAM,CAAC,0BAA0B,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC1D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAA;QAC7F,MAAM,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAA;IACxF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5D,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,EAAE;SAClB,CAAC,CAAA;QACF,MAAM,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACpF,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,EAAE;SAClB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,CACJ,sBAAsB,CAAC,EAAE,SAAS,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC,CACxF,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9E,aAAa,EAAE,KAAK;YACpB,aAAa,EAAE,EAAE;SAClB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,sBAAsB,CAAC,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACzE,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,EAAE;SAClB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,CAAC,MAAM,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAA;IAC1F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,KAAK,GAAkB;YAC3B,GAAG,EAAE,GAAG,EAAE,CACR,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;SAC1F,CAAA;QACD,MAAM,CAAC,MAAM,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAA;QACzF,iEAAiE;QACjE,MAAM,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAA;IACtF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;QACnG,MAAM,KAAK,GAAkB;YAC3B,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;SAC3D,CAAA;QACD,MAAM,CAAC,MAAM,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAA;IAC3F,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,KAAK,GAAkB,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;QAC/E,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACvC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,KAAK,GAAkB,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAA;QAC3F,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACvC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;IAC3D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,0EAA0E;IAC1E,0EAA0E;IAC1E,SAAS,mBAAmB,CAAC,KAAqB,EAAE,OAAgB;QAClE,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACpB,MAAM,MAAM,GAAG,EAAE,IAAI,EAA0B,CAAA;QAC/C,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,OAAuC,CAAC,CAAA;QAC7E,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,CAAC,CAAsB,CAAC,IAAI,CAAC,CAAA;IACpE,CAAC;IAED,MAAM,QAAQ,GAAkB;QAC9B,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;QACrC,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;KAChC,CAAA;IAED,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;YACxD,yBAAyB;YACzB,uBAAuB;YACvB,uBAAuB;SACxB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,QAAQ,GAAkB,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAA;QACzE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;YACxD,yBAAyB;YACzB,uBAAuB;SACxB,CAAC,CAAA;QACF,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;YACzD,yBAAyB;YACzB,uBAAuB;SACxB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,iEAAiE;QACjE,kEAAkE;QAClE,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACnE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5C,yBAAyB;YACzB,uBAAuB;SACxB,CAAC,CAAA;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uFAAuF,EAAE,GAAG,EAAE;QAC/F,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACnE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;YACzD,yBAAyB;YACzB,uBAAuB;SACxB,CAAC,CAAA;QACF,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;YACxD,yBAAyB;YACzB,uBAAuB;SACxB,CAAC,CAAA;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,4BAA4B,CAAC,CAAC,CAAA;IAC1F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACpB,qBAAqB,CAAC,EAAE,IAAI,EAA0B,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;QAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,CAAC,CAAsB,CAAC,IAAI,KAAK,uBAAuB,CAClE,CAAC,CAAC,CAA2B,CAAA;QAC/B,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;QAChF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QAKpF,MAAM,IAAI,GAAG,KAAK,EAAE,OAAyB,EAAuB,EAAE;YACpE,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YACpB,qBAAqB,CAAC,EAAE,IAAI,EAA0B,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAClC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,CAAC,CAAsB,CAAC,IAAI,KAAK,yBAAyB,CACpE,CAAC,CAAC,CAA8B,CAAA;YAClC,OAAO,qBAAqB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;QACzE,CAAC,CAAA;QACD,MAAM,QAAQ,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,CAAA;QAE3D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAA;QACvC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACnC,gGAAgG,CACjG,CAAA;QACD,wEAAwE;QACxE,wEAAwE;QACxE,sDAAsD;QACtD,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAA;QACxD,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,aAAa,CAAC;YAC/C,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,EAAE,CAAC;YACrD,OAAO,EAAE;gBACP,QAAQ,EAAE;oBACR,MAAM,EAAE;wBACN,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE;wBAC3C,IAAI,EAAE,WAAW;wBACjB,SAAS,EAAE,oBAAoB;qBAChC;iBACF;aACF;SACF,CAAC,CAAA;QAEF,0EAA0E;QAC1E,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,CAAA;QACxC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACnC,4DAA4D,CAC7D,CAAA;QACD,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,aAAa,CAAC;YAC/C,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;SACpF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACpB,qBAAqB,CAAC,EAAE,IAAI,EAA0B,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;QAC7E,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CACrC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,CAKF,CACJ,CAAA;QACD,MAAM,YAAY,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAA;QACtF,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9E,CAAC,yBAAyB,EAAE,YAAY,CAAC;YACzC,CAAC,uBAAuB,EAAE,YAAY,CAAC;YACvC;gBACE,uBAAuB;gBACvB,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;aAC5F;SACF,CAAC,CAAA;QACF,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,WAAW,EAAE,CAAC;YACvD,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAC,UAAU,EAAE,CAAA;YAC3C,MAAM,CAAC,WAAW,EAAE,GAAG,IAAI,cAAc,CAAC,CAAC,UAAU,EAAE,CAAA;QACzD,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,KAAK,GAAG,0BAA0B,EAAE,CAAA;QAC1C,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACpB,qBAAqB,CAAC,EAAE,IAAI,EAA0B,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;QAQ1E,MAAM,UAAU,GAAG,CAAC,IAAY,EAAW,EAAE;YAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,CAAC,CAAsB,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;YAClF,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,iBAAiB,CAAC,CAAA;YACzD,OAAO,IAAI,CAAC,CAAC,CAAY,CAAA;QAC3B,CAAC,CAAA;QAED,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,uBAAuB,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAA;QACtF,wEAAwE;QACxE,yCAAyC;QACzC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAA;QACpF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YAC5B;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,mEAAmE;aAC1E;SACF,CAAC,CAAA;QACF,uEAAuE;QACvE,kEAAkE;QAClE,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC;YACnD,SAAS,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE;SACpC,CAAC,CAAA;QACF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,uBAAuB,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;QAC/D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAA;IACtF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,KAAK,GAAG,0BAA0B,EAAE,CAAA;QAC1C,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACpB,qBAAqB,CAAC,EAAE,IAAI,EAA0B,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;QAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,CAAC,CAAsB,CAAC,IAAI,KAAK,uBAAuB,CACnE,CAAA;QACD,MAAM,IAAI,GAAG,IAAK,CAAC,CAAC,CAGyB,CAAA;QAE7C,MAAM,IAAI,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAA;QACzC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;QACnD,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC;YACnD,SAAS,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE;SACtD,CAAC,CAAA;QACF,6DAA6D;QAC7D,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAA;IACrF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;QAChG,0EAA0E;QAC1E,yEAAyE;QACzE,6EAA6E;QAC7E,MAAM,KAAK,GAAG,0BAA0B,EAAE,CAAA;QAC1C,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;QAC/E,MAAM,KAAK,GAAkB;YAC3B,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YAC5B,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBAC/B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;gBACvD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;YACrC,CAAC;SACF,CAAA;QACD,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACpB,qBAAqB,CAAC,EAAE,IAAI,EAA0B,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;QAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,CAAC,CAAsB,CAAC,IAAI,KAAK,uBAAuB,CAClE,CAAC,CAAC,CAAwD,CAAA;QAE5D,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAA;QACjD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;QACtD,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;QAC5D,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC;YACnD,SAAS,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE;SACvD,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,qEAAqE;IACrE,yEAAyE;IACzE,4BAA4B;IAC5B,EAAE,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;QACtG,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACpB,qBAAqB,CACnB,EAAE,IAAI,EAA0B,EAChC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAC1E,UAAU,CACX,CAAA;QASD,MAAM,UAAU,GAAG,CAAC,IAAY,EAAW,EAAE;YAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,CAAC,CAAsB,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;YAClF,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,iBAAiB,CAAC,CAAA;YACzD,OAAO,IAAI,CAAC,CAAC,CAAY,CAAA;QAC3B,CAAC,CAAA;QAED,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC3F,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC1C,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,EAAE,EAAE,GAAG,EAAE,CACnD,UAAU,CAAC,uBAAuB,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAC9D,CAAA;QACD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;QAEzD,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CACxE,UAAU,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,CACxC,CAAA;QACD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,CAAqC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;QACjF,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACpB,qBAAqB,CACnB,EAAE,IAAI,EAA0B,EAChC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAC/C,UAAU,CACX,CAAA;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAClC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,CAAC,CAAsB,CAAC,IAAI,KAAK,uBAAuB,CAClE,CAAC,CAAC,CAA0C,CAAA;QAE9C,MAAM,qBAAqB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAC1F,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,EAAE,CAAA;QACnC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACvF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,30 @@
1
+ import { type PrometheusClient, type Period } from "@miragon/pulse-analytics-client";
2
+ import type { AnalyticsEngineScope } from "../engine-ids.js";
3
+ import type { ProfileSource } from "../server-locale.js";
4
+ import type { NameLookup } from "../bpmn-name-lookup.js";
5
+ /** What the analytics plugin hands its pipeline steps (`appConfig` in `plugin.ts`). */
6
+ export interface AnalyticsAppConfig {
7
+ client: PrometheusClient;
8
+ /** The server's configured engine ids — a step never reads an engine outside them. */
9
+ engineScope: AnalyticsEngineScope;
10
+ /** The shared profile store — the source of the caller's saved analytics defaults. */
11
+ profileStore?: ProfileSource;
12
+ /** The process names behind the ids, the same lookup the tools use (absent → ids). */
13
+ namesFor?: NameLookup;
14
+ }
15
+ /** The optional `analytics:engine` scoping key both steps read. */
16
+ export declare const ENGINE_KEY_DECLARATION: {
17
+ key: string;
18
+ description: string;
19
+ };
20
+ /** The step's `analytics:engine` key resolved to configured ids (omitted = all of them). */
21
+ export declare function stepEngines(keys: Record<string, unknown>, engineScope: AnalyticsEngineScope): string[];
22
+ /**
23
+ * The step's `analytics:period`: the key when set, else the CALLER's saved
24
+ * analytics default (resolved from the ambient request — a step gets no
25
+ * handler ctx), else the module default — the tools' precedence.
26
+ */
27
+ export declare function stepPeriod(keys: Record<string, unknown>, profileStore: ProfileSource | undefined): Promise<Period>;
28
+ /** The step's optional `analytics:processDefinitionKey` (omitted = every process). */
29
+ export declare function stepProcessKey(keys: Record<string, unknown>): string | undefined;
30
+ //# sourceMappingURL=app-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-config.d.ts","sourceRoot":"","sources":["../../src/steps/app-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,gBAAgB,EAAE,KAAK,MAAM,EAAE,MAAM,iCAAiC,CAAA;AAC7F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAExD,uFAAuF;AACvF,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,gBAAgB,CAAA;IACxB,sFAAsF;IACtF,WAAW,EAAE,oBAAoB,CAAA;IACjC,sFAAsF;IACtF,YAAY,CAAC,EAAE,aAAa,CAAA;IAC5B,sFAAsF;IACtF,QAAQ,CAAC,EAAE,UAAU,CAAA;CACtB;AAUD,mEAAmE;AACnE,eAAO,MAAM,sBAAsB;;;CAIlC,CAAA;AAED,4FAA4F;AAC5F,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,WAAW,EAAE,oBAAoB,GAChC,MAAM,EAAE,CAYV;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,YAAY,EAAE,aAAa,GAAG,SAAS,GACtC,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAMhF"}
@@ -0,0 +1,46 @@
1
+ import { PERIODS } from "@miragon/pulse-analytics-client";
2
+ import { settingsFor } from "../settings.js";
3
+ /*
4
+ * Step keys arrive unchecked: render-view and the builder accept them as a
5
+ * free-form record and pass them through untouched. So each reader below holds
6
+ * the line the tools' strict inputs hold — a malformed value is refused naming
7
+ * its key, never read as "omitted" (which would widen `analytics:engine` to the
8
+ * whole fleet, or swap in a default period nobody asked for).
9
+ */
10
+ /** The optional `analytics:engine` scoping key both steps read. */
11
+ export const ENGINE_KEY_DECLARATION = {
12
+ key: "analytics:engine",
13
+ description: "Engine id, or a list of ids, to scope to (one of the server's configured engines). When omitted, every configured engine is aggregated — the result's `engines` names them.",
14
+ };
15
+ /** The step's `analytics:engine` key resolved to configured ids (omitted = all of them). */
16
+ export function stepEngines(keys, engineScope) {
17
+ const raw = keys[ENGINE_KEY_DECLARATION.key];
18
+ const wellFormed = raw === undefined ||
19
+ typeof raw === "string" ||
20
+ (Array.isArray(raw) && raw.every((id) => typeof id === "string"));
21
+ if (!wellFormed) {
22
+ throw new Error(`${ENGINE_KEY_DECLARATION.key} must be an engine id or a list of engine ids — omit it to cover every configured engine.`);
23
+ }
24
+ return engineScope.resolve(raw);
25
+ }
26
+ /**
27
+ * The step's `analytics:period`: the key when set, else the CALLER's saved
28
+ * analytics default (resolved from the ambient request — a step gets no
29
+ * handler ctx), else the module default — the tools' precedence.
30
+ */
31
+ export async function stepPeriod(keys, profileStore) {
32
+ const raw = keys["analytics:period"];
33
+ if (raw === undefined)
34
+ return (await settingsFor(profileStore)).defaultPeriod;
35
+ if (PERIODS.includes(raw))
36
+ return raw;
37
+ throw new Error(`analytics:period must be one of ${PERIODS.join(", ")} — omit it for the caller's saved default.`);
38
+ }
39
+ /** The step's optional `analytics:processDefinitionKey` (omitted = every process). */
40
+ export function stepProcessKey(keys) {
41
+ const raw = keys["analytics:processDefinitionKey"];
42
+ if (raw === undefined || typeof raw === "string")
43
+ return raw;
44
+ throw new Error("analytics:processDefinitionKey must be a process definition key (a string) — omit it to cover every process.");
45
+ }
46
+ //# sourceMappingURL=app-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-config.js","sourceRoot":"","sources":["../../src/steps/app-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAsC,MAAM,iCAAiC,CAAA;AAG7F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAc5C;;;;;;GAMG;AAEH,mEAAmE;AACnE,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,GAAG,EAAE,kBAAkB;IACvB,WAAW,EACT,6KAA6K;CAChL,CAAA;AAED,4FAA4F;AAC5F,MAAM,UAAU,WAAW,CACzB,IAA6B,EAC7B,WAAiC;IAEjC,MAAM,GAAG,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAA;IAC5C,MAAM,UAAU,GACd,GAAG,KAAK,SAAS;QACjB,OAAO,GAAG,KAAK,QAAQ;QACvB,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAA;IACnE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,GAAG,sBAAsB,CAAC,GAAG,2FAA2F,CACzH,CAAA;IACH,CAAC;IACD,OAAO,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAA6B,EAC7B,YAAuC;IAEvC,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAA;IACpC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,CAAC,MAAM,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAA;IAC7E,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAa,CAAC;QAAE,OAAO,GAAa,CAAA;IACzD,MAAM,IAAI,KAAK,CACb,mCAAmC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,4CAA4C,CAClG,CAAA;AACH,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,cAAc,CAAC,IAA6B;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,gCAAgC,CAAC,CAAA;IAClD,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAA;IAC5D,MAAM,IAAI,KAAK,CACb,8GAA8G,CAC/G,CAAA;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { PipelineStepDefinition } from "@miragon/mcp-toolkit-core";
2
+ import { type AnalyticsAppConfig } from "./app-config.js";
3
+ /**
4
+ * Loads the dashboard figures from Prometheus — window flows plus the live
5
+ * state, the same `dashboardData` as `analytics_show_dashboard`. Consumed by
6
+ * `analytics:dashboard`. Reads optional filter keys:
7
+ * - `analytics:processDefinitionKey`
8
+ * - `analytics:period` (1d | 3d | 7d | 14d | 30d; omitted = the caller's saved default)
9
+ * - `analytics:engine` (configured engine id(s); omitted = all of them)
10
+ */
11
+ export declare const loadDashboardStep: PipelineStepDefinition<AnalyticsAppConfig>;
12
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/steps/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAA;AAKvE,OAAO,EAKL,KAAK,kBAAkB,EACxB,MAAM,iBAAiB,CAAA;AAMxB;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,EAAE,sBAAsB,CAAC,kBAAkB,CA+CxE,CAAA"}