@intentius/chant-lexicon-grafana 0.97.0 → 0.99.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 (451) hide show
  1. package/README.md +15 -5
  2. package/dist/actions/grafana.d.ts +24 -0
  3. package/dist/actions/grafana.d.ts.map +1 -0
  4. package/dist/actions/index.d.ts +2 -0
  5. package/dist/actions/index.d.ts.map +1 -0
  6. package/dist/alerting-build.d.ts +128 -0
  7. package/dist/alerting-build.d.ts.map +1 -0
  8. package/dist/alerting.d.ts +273 -0
  9. package/dist/alerting.d.ts.map +1 -0
  10. package/dist/api/apply.d.ts +156 -0
  11. package/dist/api/apply.d.ts.map +1 -0
  12. package/dist/api/bind.d.ts +32 -0
  13. package/dist/api/bind.d.ts.map +1 -0
  14. package/dist/api/client.d.ts +76 -0
  15. package/dist/api/client.d.ts.map +1 -0
  16. package/dist/api/converge.d.ts +33 -0
  17. package/dist/api/converge.d.ts.map +1 -0
  18. package/dist/api/dashboards.d.ts +102 -0
  19. package/dist/api/dashboards.d.ts.map +1 -0
  20. package/dist/api/datasources.d.ts +26 -0
  21. package/dist/api/datasources.d.ts.map +1 -0
  22. package/dist/api/fake-grafana-writes.d.ts +41 -0
  23. package/dist/api/fake-grafana-writes.d.ts.map +1 -0
  24. package/dist/api/fake-grafana.d.ts +61 -0
  25. package/dist/api/fake-grafana.d.ts.map +1 -0
  26. package/dist/api/folders.d.ts +110 -0
  27. package/dist/api/folders.d.ts.map +1 -0
  28. package/dist/api/library-panels.d.ts +52 -0
  29. package/dist/api/library-panels.d.ts.map +1 -0
  30. package/dist/build.d.ts +30 -2
  31. package/dist/build.d.ts.map +1 -1
  32. package/dist/catalog.d.ts +1 -1
  33. package/dist/catalog.d.ts.map +1 -1
  34. package/dist/codegen/docs.d.ts.map +1 -1
  35. package/dist/codegen/schema-types.d.ts +3 -3
  36. package/dist/codegen/schema-types.d.ts.map +1 -1
  37. package/dist/composites/agent-dashboard.d.ts.map +1 -1
  38. package/dist/composites/catalog.d.ts.map +1 -1
  39. package/dist/composites/index.d.ts +4 -2
  40. package/dist/composites/index.d.ts.map +1 -1
  41. package/dist/composites/red-dashboard.d.ts +21 -2
  42. package/dist/composites/red-dashboard.d.ts.map +1 -1
  43. package/dist/composites/shared.d.ts +7 -0
  44. package/dist/composites/shared.d.ts.map +1 -1
  45. package/dist/composites/slo-alert-rules.d.ts +92 -0
  46. package/dist/composites/slo-alert-rules.d.ts.map +1 -0
  47. package/dist/config.d.ts +111 -0
  48. package/dist/config.d.ts.map +1 -0
  49. package/dist/contact-point-secrets.d.ts +17 -0
  50. package/dist/contact-point-secrets.d.ts.map +1 -0
  51. package/dist/dashboard.d.ts +16 -2
  52. package/dist/dashboard.d.ts.map +1 -1
  53. package/dist/datasource-refs.d.ts +95 -0
  54. package/dist/datasource-refs.d.ts.map +1 -0
  55. package/dist/datasource.d.ts +29 -0
  56. package/dist/datasource.d.ts.map +1 -1
  57. package/dist/deep-observe-hooks.d.ts +64 -0
  58. package/dist/deep-observe-hooks.d.ts.map +1 -0
  59. package/dist/deep-observe.d.ts +42 -0
  60. package/dist/deep-observe.d.ts.map +1 -0
  61. package/dist/describe-resources.d.ts +49 -0
  62. package/dist/describe-resources.d.ts.map +1 -0
  63. package/dist/detect.d.ts +28 -1
  64. package/dist/detect.d.ts.map +1 -1
  65. package/dist/export-resources.d.ts +38 -0
  66. package/dist/export-resources.d.ts.map +1 -0
  67. package/dist/import/alerting.d.ts +40 -0
  68. package/dist/import/alerting.d.ts.map +1 -0
  69. package/dist/import/edits.d.ts +47 -0
  70. package/dist/import/edits.d.ts.map +1 -0
  71. package/dist/import/embedded.d.ts +14 -0
  72. package/dist/import/embedded.d.ts.map +1 -0
  73. package/dist/import/generator.d.ts +60 -0
  74. package/dist/import/generator.d.ts.map +1 -0
  75. package/dist/import/live-export.d.ts +108 -0
  76. package/dist/import/live-export.d.ts.map +1 -0
  77. package/dist/import/mappings.d.ts +83 -0
  78. package/dist/import/mappings.d.ts.map +1 -0
  79. package/dist/import/model.d.ts +98 -0
  80. package/dist/import/model.d.ts.map +1 -0
  81. package/dist/import/normalize-alerting.d.ts +26 -0
  82. package/dist/import/normalize-alerting.d.ts.map +1 -0
  83. package/dist/import/normalize.d.ts +74 -0
  84. package/dist/import/normalize.d.ts.map +1 -0
  85. package/dist/import/parser.d.ts +110 -0
  86. package/dist/import/parser.d.ts.map +1 -0
  87. package/dist/import/report.d.ts +26 -0
  88. package/dist/import/report.d.ts.map +1 -0
  89. package/dist/import/testdata/fixtures.d.ts +35 -0
  90. package/dist/import/testdata/fixtures.d.ts.map +1 -0
  91. package/dist/import/v2.d.ts +72 -0
  92. package/dist/import/v2.d.ts.map +1 -0
  93. package/dist/index.d.ts +26 -9
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/integrity.json +18 -10
  96. package/dist/k8s.d.ts +107 -0
  97. package/dist/k8s.d.ts.map +1 -0
  98. package/dist/lint/audit-catalog.d.ts +2 -1
  99. package/dist/lint/audit-catalog.d.ts.map +1 -1
  100. package/dist/lint/post-synth/graf101.d.ts +2 -2
  101. package/dist/lint/post-synth/graf102.d.ts +1 -1
  102. package/dist/lint/post-synth/graf107.d.ts +1 -1
  103. package/dist/lint/post-synth/graf108.d.ts +8 -0
  104. package/dist/lint/post-synth/graf108.d.ts.map +1 -0
  105. package/dist/lint/post-synth/graf109.d.ts +8 -0
  106. package/dist/lint/post-synth/graf109.d.ts.map +1 -0
  107. package/dist/lint/post-synth/graf111.d.ts +8 -0
  108. package/dist/lint/post-synth/graf111.d.ts.map +1 -0
  109. package/dist/lint/post-synth/graf112.d.ts +8 -0
  110. package/dist/lint/post-synth/graf112.d.ts.map +1 -0
  111. package/dist/lint/post-synth/graf113.d.ts +8 -0
  112. package/dist/lint/post-synth/graf113.d.ts.map +1 -0
  113. package/dist/lint/post-synth/graf114.d.ts +8 -0
  114. package/dist/lint/post-synth/graf114.d.ts.map +1 -0
  115. package/dist/lint/post-synth/graf115.d.ts +8 -0
  116. package/dist/lint/post-synth/graf115.d.ts.map +1 -0
  117. package/dist/lint/post-synth/grafana-helpers.d.ts +7 -5
  118. package/dist/lint/post-synth/grafana-helpers.d.ts.map +1 -1
  119. package/dist/lint/post-synth/index.d.ts.map +1 -1
  120. package/dist/lint/rules/literal-secret.d.ts +7 -3
  121. package/dist/lint/rules/literal-secret.d.ts.map +1 -1
  122. package/dist/lsp/hover.d.ts.map +1 -1
  123. package/dist/manifest.json +1 -1
  124. package/dist/members.d.ts +27 -0
  125. package/dist/members.d.ts.map +1 -0
  126. package/dist/meta.json +135 -0
  127. package/dist/okf/index.md +36 -2
  128. package/dist/okf/rules/GRAF002.md +3 -2
  129. package/dist/okf/rules/GRAF101.md +3 -2
  130. package/dist/okf/rules/GRAF102.md +1 -0
  131. package/dist/okf/rules/GRAF108.md +11 -0
  132. package/dist/okf/rules/GRAF109.md +15 -0
  133. package/dist/okf/rules/GRAF111.md +11 -0
  134. package/dist/okf/rules/GRAF112.md +16 -0
  135. package/dist/okf/rules/GRAF113.md +16 -0
  136. package/dist/okf/rules/GRAF114.md +11 -0
  137. package/dist/okf/rules/GRAF115.md +11 -0
  138. package/dist/okf/types/AlertListPanel.md +9 -0
  139. package/dist/okf/types/AlertQuery.md +9 -0
  140. package/dist/okf/types/AlertRule.md +9 -0
  141. package/dist/okf/types/AlertRuleGroup.md +9 -0
  142. package/dist/okf/types/BarChartPanel.md +9 -0
  143. package/dist/okf/types/BarGaugePanel.md +9 -0
  144. package/dist/okf/types/CanvasPanel.md +9 -0
  145. package/dist/okf/types/ClassicConditionsExpression.md +9 -0
  146. package/dist/okf/types/ContactPoint.md +14 -0
  147. package/dist/okf/types/Dashboard.md +1 -0
  148. package/dist/okf/types/Datasource.md +3 -2
  149. package/dist/okf/types/ExternalDatasource.md +15 -0
  150. package/dist/okf/types/FlameGraphPanel.md +9 -0
  151. package/dist/okf/types/GeomapPanel.md +9 -0
  152. package/dist/okf/types/HistogramPanel.md +9 -0
  153. package/dist/okf/types/MathExpression.md +9 -0
  154. package/dist/okf/types/MuteTiming.md +13 -0
  155. package/dist/okf/types/NodeGraphPanel.md +9 -0
  156. package/dist/okf/types/NotificationPolicy.md +9 -0
  157. package/dist/okf/types/NotificationTemplate.md +9 -0
  158. package/dist/okf/types/PieChartPanel.md +9 -0
  159. package/dist/okf/types/ReduceExpression.md +9 -0
  160. package/dist/okf/types/ResampleExpression.md +9 -0
  161. package/dist/okf/types/SqlExpression.md +9 -0
  162. package/dist/okf/types/StateTimelinePanel.md +9 -0
  163. package/dist/okf/types/StatusHistoryPanel.md +9 -0
  164. package/dist/okf/types/ThresholdExpression.md +9 -0
  165. package/dist/okf/types/TrendPanel.md +9 -0
  166. package/dist/okf/types/XYChartPanel.md +9 -0
  167. package/dist/op/activities/grafana-apply.d.ts +75 -0
  168. package/dist/op/activities/grafana-apply.d.ts.map +1 -0
  169. package/dist/op/activities/index.d.ts +9 -0
  170. package/dist/op/activities/index.d.ts.map +1 -0
  171. package/dist/op/builders.d.ts +24 -0
  172. package/dist/op/builders.d.ts.map +1 -0
  173. package/dist/ownership.d.ts +67 -0
  174. package/dist/ownership.d.ts.map +1 -0
  175. package/dist/panel-options.d.ts +65 -0
  176. package/dist/panel-options.d.ts.map +1 -0
  177. package/dist/panels.d.ts +46 -9
  178. package/dist/panels.d.ts.map +1 -1
  179. package/dist/pin.d.ts +29 -7
  180. package/dist/pin.d.ts.map +1 -1
  181. package/dist/plugin.d.ts.map +1 -1
  182. package/dist/promql-check.d.ts +51 -0
  183. package/dist/promql-check.d.ts.map +1 -0
  184. package/dist/query.d.ts +9 -8
  185. package/dist/query.d.ts.map +1 -1
  186. package/dist/rules/graf101.ts +3 -3
  187. package/dist/rules/graf102.ts +1 -1
  188. package/dist/rules/graf107.ts +1 -1
  189. package/dist/rules/graf108.ts +17 -0
  190. package/dist/rules/graf109.ts +17 -0
  191. package/dist/rules/graf111.ts +17 -0
  192. package/dist/rules/graf112.ts +17 -0
  193. package/dist/rules/graf113.ts +17 -0
  194. package/dist/rules/graf114.ts +17 -0
  195. package/dist/rules/graf115.ts +17 -0
  196. package/dist/rules/grafana-helpers.ts +15 -8
  197. package/dist/rules/literal-secret.ts +60 -6
  198. package/dist/schema/barchart.gen.d.ts +198 -0
  199. package/dist/schema/barchart.gen.d.ts.map +1 -0
  200. package/dist/schema/bargauge.gen.d.ts +97 -0
  201. package/dist/schema/bargauge.gen.d.ts.map +1 -0
  202. package/dist/schema/canvas.gen.d.ts +152 -0
  203. package/dist/schema/canvas.gen.d.ts.map +1 -0
  204. package/dist/schema/dashboard.gen.d.ts +196 -21
  205. package/dist/schema/dashboard.gen.d.ts.map +1 -1
  206. package/dist/schema/expr.gen.d.ts +606 -0
  207. package/dist/schema/expr.gen.d.ts.map +1 -0
  208. package/dist/schema/gauge.gen.d.ts.map +1 -1
  209. package/dist/schema/geomap.gen.d.ts +100 -0
  210. package/dist/schema/geomap.gen.d.ts.map +1 -0
  211. package/dist/schema/heatmap.gen.d.ts.map +1 -1
  212. package/dist/schema/histogram.gen.d.ts +132 -0
  213. package/dist/schema/histogram.gen.d.ts.map +1 -0
  214. package/dist/schema/index.d.ts +12 -0
  215. package/dist/schema/index.d.ts.map +1 -1
  216. package/dist/schema/logs.gen.d.ts +1 -0
  217. package/dist/schema/logs.gen.d.ts.map +1 -1
  218. package/dist/schema/loki.gen.d.ts.map +1 -1
  219. package/dist/schema/nodegraph.gen.d.ts +49 -0
  220. package/dist/schema/nodegraph.gen.d.ts.map +1 -0
  221. package/dist/schema/piechart.gen.d.ts +127 -0
  222. package/dist/schema/piechart.gen.d.ts.map +1 -0
  223. package/dist/schema/prometheus.gen.d.ts.map +1 -1
  224. package/dist/schema/stat.gen.d.ts.map +1 -1
  225. package/dist/schema/statetimeline.gen.d.ts +124 -0
  226. package/dist/schema/statetimeline.gen.d.ts.map +1 -0
  227. package/dist/schema/statushistory.gen.d.ts +114 -0
  228. package/dist/schema/statushistory.gen.d.ts.map +1 -0
  229. package/dist/schema/table.gen.d.ts +22 -3
  230. package/dist/schema/table.gen.d.ts.map +1 -1
  231. package/dist/schema/tempo.gen.d.ts.map +1 -1
  232. package/dist/schema/text.gen.d.ts.map +1 -1
  233. package/dist/schema/timeseries.gen.d.ts +5 -1
  234. package/dist/schema/timeseries.gen.d.ts.map +1 -1
  235. package/dist/schema/trend.gen.d.ts +180 -0
  236. package/dist/schema/trend.gen.d.ts.map +1 -0
  237. package/dist/schema/xychart.gen.d.ts +145 -0
  238. package/dist/schema/xychart.gen.d.ts.map +1 -0
  239. package/dist/schema-validate.d.ts +30 -4
  240. package/dist/schema-validate.d.ts.map +1 -1
  241. package/dist/serializer.d.ts +11 -3
  242. package/dist/serializer.d.ts.map +1 -1
  243. package/dist/skill-defs.d.ts.map +1 -1
  244. package/dist/skills/chant-grafana-alerting.md +49 -0
  245. package/dist/skills/chant-grafana-provisioning.md +3 -3
  246. package/dist/skills/chant-grafana.md +12 -6
  247. package/dist/spec/fetch-units-cli.d.ts +3 -0
  248. package/dist/spec/fetch-units-cli.d.ts.map +1 -0
  249. package/dist/spec/overlay.d.ts +43 -0
  250. package/dist/spec/overlay.d.ts.map +1 -0
  251. package/dist/spec/schemas.d.ts +13 -7
  252. package/dist/spec/schemas.d.ts.map +1 -1
  253. package/dist/spec/units.d.ts +35 -0
  254. package/dist/spec/units.d.ts.map +1 -0
  255. package/dist/spec/units.gen.d.ts +2 -0
  256. package/dist/spec/units.gen.d.ts.map +1 -0
  257. package/dist/transformations.d.ts +459 -0
  258. package/dist/transformations.d.ts.map +1 -0
  259. package/dist/util.d.ts +6 -0
  260. package/dist/util.d.ts.map +1 -1
  261. package/dist/validate-alerting.d.ts +65 -0
  262. package/dist/validate-alerting.d.ts.map +1 -0
  263. package/dist/validate-output.d.ts +49 -9
  264. package/dist/validate-output.d.ts.map +1 -1
  265. package/dist/validate.d.ts.map +1 -1
  266. package/dist/variables.d.ts +7 -2
  267. package/dist/variables.d.ts.map +1 -1
  268. package/package.json +12 -4
  269. package/src/actions/actions.test.ts +24 -0
  270. package/src/actions/grafana.ts +40 -0
  271. package/src/actions/index.ts +1 -0
  272. package/src/alerting-build.ts +376 -0
  273. package/src/alerting.e2e.test.ts +212 -0
  274. package/src/alerting.test.ts +272 -0
  275. package/src/alerting.ts +435 -0
  276. package/src/api/apply.test.ts +238 -0
  277. package/src/api/apply.ts +384 -0
  278. package/src/api/bind.ts +58 -0
  279. package/src/api/client.ts +148 -0
  280. package/src/api/converge.ts +63 -0
  281. package/src/api/dashboards.ts +247 -0
  282. package/src/api/datasources.ts +33 -0
  283. package/src/api/fake-grafana-writes.ts +201 -0
  284. package/src/api/fake-grafana.ts +186 -0
  285. package/src/api/folders.ts +265 -0
  286. package/src/api/library-panels.ts +101 -0
  287. package/src/build.test.ts +210 -5
  288. package/src/build.ts +180 -43
  289. package/src/catalog.ts +86 -2
  290. package/src/codegen/docs.ts +42 -9
  291. package/src/codegen/schema-types.ts +16 -6
  292. package/src/composites/agent-dashboard.ts +6 -3
  293. package/src/composites/catalog.test.ts +2 -2
  294. package/src/composites/catalog.ts +82 -0
  295. package/src/composites/composites.test.ts +73 -9
  296. package/src/composites/index.ts +4 -2
  297. package/src/composites/queries.e2e.test.ts +374 -0
  298. package/src/composites/red-dashboard.ts +83 -12
  299. package/src/composites/shared.ts +11 -0
  300. package/src/composites/slo-alert-rules.ts +149 -0
  301. package/src/config.test.ts +61 -0
  302. package/src/config.ts +138 -0
  303. package/src/contact-point-secrets.ts +63 -0
  304. package/src/dashboard.ts +16 -2
  305. package/src/datasource-refs.test.ts +56 -0
  306. package/src/datasource-refs.ts +189 -0
  307. package/src/datasource.ts +52 -0
  308. package/src/deep-observe-hooks.ts +252 -0
  309. package/src/deep-observe.test.ts +265 -0
  310. package/src/deep-observe.ts +164 -0
  311. package/src/describe-resources.test.ts +255 -0
  312. package/src/describe-resources.ts +209 -0
  313. package/src/detect.ts +79 -2
  314. package/src/export-resources.test.ts +129 -0
  315. package/src/export-resources.ts +84 -0
  316. package/src/generated/lexicon-grafana.json +135 -0
  317. package/src/import/alerting-roundtrip.test.ts +161 -0
  318. package/src/import/alerting.ts +500 -0
  319. package/src/import/edits.ts +95 -0
  320. package/src/import/embedded.test.ts +45 -0
  321. package/src/import/embedded.ts +47 -0
  322. package/src/import/generated-types.e2e.test.ts +118 -0
  323. package/src/import/generator.test.ts +210 -0
  324. package/src/import/generator.ts +462 -0
  325. package/src/import/live-export.ts +264 -0
  326. package/src/import/mappings.ts +264 -0
  327. package/src/import/model.ts +110 -0
  328. package/src/import/normalize-alerting.ts +101 -0
  329. package/src/import/normalize.test.ts +117 -0
  330. package/src/import/normalize.ts +364 -0
  331. package/src/import/parser.test.ts +440 -0
  332. package/src/import/parser.ts +1236 -0
  333. package/src/import/report.ts +62 -0
  334. package/src/import/roundtrip.test.ts +468 -0
  335. package/src/import/testdata/fixtures.ts +129 -0
  336. package/src/import/v2.test.ts +292 -0
  337. package/src/import/v2.ts +803 -0
  338. package/src/import.e2e.test.ts +31 -84
  339. package/src/import.test.ts +9 -3
  340. package/src/index.ts +190 -5
  341. package/src/k8s.test.ts +98 -0
  342. package/src/k8s.ts +197 -0
  343. package/src/lint/audit-catalog.ts +60 -3
  344. package/src/lint/core-lint.test.ts +43 -0
  345. package/src/lint/post-synth/graf101.ts +3 -3
  346. package/src/lint/post-synth/graf102.ts +1 -1
  347. package/src/lint/post-synth/graf107.ts +1 -1
  348. package/src/lint/post-synth/graf108.ts +17 -0
  349. package/src/lint/post-synth/graf109.ts +17 -0
  350. package/src/lint/post-synth/graf111.ts +17 -0
  351. package/src/lint/post-synth/graf112.ts +17 -0
  352. package/src/lint/post-synth/graf113.ts +17 -0
  353. package/src/lint/post-synth/graf114.ts +17 -0
  354. package/src/lint/post-synth/graf115.ts +17 -0
  355. package/src/lint/post-synth/grafana-helpers.ts +15 -8
  356. package/src/lint/post-synth/index.ts +14 -0
  357. package/src/lint/post-synth/post-synth.test.ts +235 -11
  358. package/src/lint/rules/literal-secret.ts +60 -6
  359. package/src/lint/rules/rules.test.ts +27 -0
  360. package/src/lsp/completions.test.ts +5 -0
  361. package/src/lsp/hover.test.ts +7 -0
  362. package/src/lsp/hover.ts +8 -1
  363. package/src/members.ts +68 -0
  364. package/src/observe.e2e.test.ts +255 -0
  365. package/src/op/activities/grafana-apply.e2e.test.ts +175 -0
  366. package/src/op/activities/grafana-apply.test.ts +229 -0
  367. package/src/op/activities/grafana-apply.ts +171 -0
  368. package/src/op/activities/index.ts +8 -0
  369. package/src/op/builders.test.ts +40 -0
  370. package/src/op/builders.ts +34 -0
  371. package/src/ownership.ts +103 -0
  372. package/src/panel-options.ts +66 -0
  373. package/src/panels.test.ts +51 -0
  374. package/src/panels.ts +148 -10
  375. package/src/pin.ts +57 -6
  376. package/src/plugin.test.ts +5 -2
  377. package/src/plugin.ts +66 -0
  378. package/src/promql-check.test.ts +108 -0
  379. package/src/promql-check.ts +189 -0
  380. package/src/query.ts +13 -8
  381. package/src/schema/barchart.gen.ts +221 -0
  382. package/src/schema/bargauge.gen.ts +111 -0
  383. package/src/schema/canvas.gen.ts +176 -0
  384. package/src/schema/dashboard.gen.ts +206 -22
  385. package/src/schema/expr.gen.ts +618 -0
  386. package/src/schema/gauge.gen.ts +2 -1
  387. package/src/schema/geomap.gen.ts +112 -0
  388. package/src/schema/heatmap.gen.ts +2 -1
  389. package/src/schema/histogram.gen.ts +151 -0
  390. package/src/schema/index.ts +12 -0
  391. package/src/schema/logs.gen.ts +3 -1
  392. package/src/schema/loki.gen.ts +2 -1
  393. package/src/schema/nodegraph.gen.ts +58 -0
  394. package/src/schema/piechart.gen.ts +146 -0
  395. package/src/schema/prometheus.gen.ts +2 -1
  396. package/src/schema/stat.gen.ts +2 -1
  397. package/src/schema/statetimeline.gen.ts +143 -0
  398. package/src/schema/statushistory.gen.ts +132 -0
  399. package/src/schema/table.gen.ts +27 -4
  400. package/src/schema/tempo.gen.ts +2 -1
  401. package/src/schema/text.gen.ts +2 -1
  402. package/src/schema/timeseries.gen.ts +7 -2
  403. package/src/schema/trend.gen.ts +208 -0
  404. package/src/schema/xychart.gen.ts +167 -0
  405. package/src/schema-overlay.test.ts +282 -0
  406. package/src/schema-validate.ts +141 -50
  407. package/src/schema.test.ts +4 -2
  408. package/src/serializer.test.ts +13 -1
  409. package/src/serializer.ts +11 -3
  410. package/src/skill-defs.ts +17 -0
  411. package/src/skills/chant-grafana-alerting.md +49 -0
  412. package/src/skills/chant-grafana-provisioning.md +3 -3
  413. package/src/skills/chant-grafana.md +12 -6
  414. package/src/spec/fetch-cli.ts +3 -3
  415. package/src/spec/fetch-units-cli.ts +37 -0
  416. package/src/spec/overlay/canvas.overlay.json +142 -0
  417. package/src/spec/overlay/dashboard.overlay.json +378 -0
  418. package/src/spec/overlay/expr.overlay.json +14 -0
  419. package/src/spec/overlay/geomap.overlay.json +35 -0
  420. package/src/spec/overlay/logs.overlay.json +14 -0
  421. package/src/spec/overlay/nodegraph.overlay.json +31 -0
  422. package/src/spec/overlay/piechart.overlay.json +17 -0
  423. package/src/spec/overlay/table.overlay.json +84 -0
  424. package/src/spec/overlay/timeseries.overlay.json +21 -0
  425. package/src/spec/overlay/trend.overlay.json +17 -0
  426. package/src/spec/overlay/xychart.overlay.json +16 -0
  427. package/src/spec/overlay.ts +105 -0
  428. package/src/spec/schemas/barchart.jsonschema.json +419 -0
  429. package/src/spec/schemas/bargauge.jsonschema.json +224 -0
  430. package/src/spec/schemas/canvas.jsonschema.json +356 -0
  431. package/src/spec/schemas/dashboardv2.jsonschema.json +3387 -0
  432. package/src/spec/schemas/expr.jsonschema.json +987 -0
  433. package/src/spec/schemas/geomap.jsonschema.json +220 -0
  434. package/src/spec/schemas/histogram.jsonschema.json +308 -0
  435. package/src/spec/schemas/nodegraph.jsonschema.json +77 -0
  436. package/src/spec/schemas/piechart.jsonschema.json +275 -0
  437. package/src/spec/schemas/statetimeline.jsonschema.json +324 -0
  438. package/src/spec/schemas/statushistory.jsonschema.json +292 -0
  439. package/src/spec/schemas/trend.jsonschema.json +449 -0
  440. package/src/spec/schemas/xychart.jsonschema.json +428 -0
  441. package/src/spec/schemas.ts +22 -10
  442. package/src/spec/units.gen.ts +281 -0
  443. package/src/spec/units.ts +77 -0
  444. package/src/transformations.test.ts +65 -0
  445. package/src/transformations.ts +574 -0
  446. package/src/util.ts +8 -0
  447. package/src/validate-alerting.test.ts +255 -0
  448. package/src/validate-alerting.ts +428 -0
  449. package/src/validate-output.ts +332 -101
  450. package/src/validate.ts +14 -0
  451. package/src/variables.ts +7 -2
@@ -0,0 +1,435 @@
1
+ /**
2
+ * Grafana-managed alerting: rule groups, their rules, queries and
3
+ * server-side expressions, contact points, the notification policy tree,
4
+ * mute timings and notification templates.
5
+ *
6
+ * Everything here is written to Grafana's alerting file provisioning
7
+ * format, `provisioning/alerting/chant.yaml` (see `alerting-build.ts`). The
8
+ * shapes follow the file format as Grafana reads it
9
+ * (`pkg/services/provisioning/alerting/*_types.go`, identical at v12.4.11
10
+ * and v13.2.2), so a key here is the key in the file. Server-side
11
+ * expressions are typed from the vendored `expr` schema (see `src/pin.ts`).
12
+ *
13
+ * Resources: `AlertRuleGroup`, `ContactPoint`, `NotificationPolicy`,
14
+ * `MuteTiming`, `NotificationTemplate`. Property-kind (they live inside a
15
+ * rule group): `AlertRule`, `AlertQuery` and the expression classes.
16
+ */
17
+
18
+ import { createProperty, createResource } from "@intentius/chant/runtime";
19
+ import type { Declarable } from "@intentius/chant/declarable";
20
+ import type { TimePeriodConfig } from "@intentius/chant-lexicon-prometheus/model";
21
+ import type { MatchOp } from "@intentius/chant-lexicon-prometheus/matchers";
22
+ import type { DatasourceInput, QueryEntity } from "./query";
23
+ import type { DashboardEntity } from "./dashboard";
24
+ import type { TypeClassicConditions, TypeMath, TypeReduce, TypeResample, TypeSql, TypeThreshold } from "./schema/expr.gen";
25
+
26
+ /** The datasource uid Grafana gives server-side expressions. */
27
+ export const EXPRESSION_DATASOURCE_UID = "__expr__";
28
+
29
+ /** A Prometheus-style duration (`30s`, `5m`, `1h`), or a number of seconds. */
30
+ export type AlertDuration = string | number;
31
+
32
+ // ── Queries and expressions ─────────────────────────────────────
33
+
34
+ /** How far back a query reads, relative to the evaluation time. */
35
+ export interface RelativeTimeRange {
36
+ /** How far back the range starts, e.g. `10m` or `600` (seconds). */
37
+ from: AlertDuration;
38
+ /** How far back it ends. Defaults to 0: the evaluation time. */
39
+ to?: AlertDuration;
40
+ }
41
+
42
+ export interface AlertQueryProps {
43
+ /**
44
+ * The datasource the query runs on: a `Datasource`, an `ExternalDatasource`,
45
+ * a `{ type, uid }` ref, or a bare uid string when its plugin type is not
46
+ * known (the checks cannot tell what it is then).
47
+ */
48
+ datasource?: DatasourceInput | string;
49
+ /** A typed query (`PromQuery`, `LokiQuery`, ...) whose model and datasource are used. Set this or `model`. */
50
+ query?: QueryEntity;
51
+ /** The query model exactly as Grafana stores it. Written as it is. */
52
+ model?: Record<string, unknown>;
53
+ /** Defaults to the query's position in `data`: A, B, C, ... */
54
+ refId?: string;
55
+ queryType?: string;
56
+ /** Defaults to the rule's `relativeTimeRange`. */
57
+ relativeTimeRange?: RelativeTimeRange;
58
+ }
59
+
60
+ export interface AlertQueryEntity extends Declarable {
61
+ readonly props: AlertQueryProps;
62
+ }
63
+
64
+ export const ALERT_QUERY_TYPE = "Grafana::AlertQuery";
65
+
66
+ const AlertQueryBase = createProperty(ALERT_QUERY_TYPE, "grafana") as unknown as (this: object, props: Record<string, unknown>) => void;
67
+
68
+ /**
69
+ * One datasource query of an alert rule. A typed query (`PromQuery`) can go
70
+ * straight into a rule's `data`; `AlertQuery` is for a query model of any
71
+ * plugin, or to give a typed query its own time range or refId.
72
+ */
73
+ export const AlertQuery = function (this: object, props: AlertQueryProps) {
74
+ AlertQueryBase.call(this, props as unknown as Record<string, unknown>);
75
+ } as unknown as new (props: AlertQueryProps) => AlertQueryEntity;
76
+ Object.defineProperty(AlertQuery, "name", { value: "AlertQuery" });
77
+
78
+ export function isAlertQueryEntity(value: unknown): value is AlertQueryEntity {
79
+ return typeof value === "object" && value !== null && (value as Declarable).entityType === ALERT_QUERY_TYPE && (value as Declarable).lexicon === "grafana";
80
+ }
81
+
82
+ /** Fields of an expression model the builder writes itself. */
83
+ type Managed = "type" | "datasource" | "refId";
84
+
85
+ /** Every expression takes its refId (defaulting to its position) and an optional time range. */
86
+ interface ExpressionCommon {
87
+ refId?: string;
88
+ relativeTimeRange?: RelativeTimeRange;
89
+ }
90
+
91
+ export type ReduceExpressionProps = Omit<TypeReduce, Managed> & ExpressionCommon;
92
+ export type MathExpressionProps = Omit<TypeMath, Managed> & ExpressionCommon;
93
+ export type ThresholdExpressionProps = Omit<TypeThreshold, Managed> & ExpressionCommon;
94
+ export type ResampleExpressionProps = Omit<TypeResample, Managed> & ExpressionCommon;
95
+ export type ClassicConditionsExpressionProps = Omit<TypeClassicConditions, Managed> & ExpressionCommon;
96
+ export type SqlExpressionProps = Omit<TypeSql, Managed> & ExpressionCommon;
97
+
98
+ export type ExpressionKind = "reduce" | "math" | "threshold" | "resample" | "classic_conditions" | "sql";
99
+
100
+ export const EXPRESSION_TYPE_PREFIX = "Grafana::Expression::";
101
+
102
+ export interface ExpressionEntity<P = Record<string, unknown>> extends Declarable {
103
+ readonly props: P;
104
+ /** The expression's `type` in the model. */
105
+ readonly expressionKind: ExpressionKind;
106
+ }
107
+
108
+ function expressionClass<P>(kind: ExpressionKind, className: string): new (props: P) => ExpressionEntity<P> {
109
+ const Base = createProperty(`${EXPRESSION_TYPE_PREFIX}${kind}`, "grafana") as unknown as (this: object, props: Record<string, unknown>) => void;
110
+ const Cls = function (this: object, props: P) {
111
+ Base.call(this, props as unknown as Record<string, unknown>);
112
+ Object.defineProperty(this, "expressionKind", { value: kind, enumerable: false });
113
+ };
114
+ Object.defineProperty(Cls, "name", { value: className });
115
+ return Cls as unknown as new (props: P) => ExpressionEntity<P>;
116
+ }
117
+
118
+ /** Reduce a series to one number per series: `expression` is a refId (`A` or `$A`). */
119
+ export const ReduceExpression = expressionClass<ReduceExpressionProps>("reduce", "ReduceExpression");
120
+ /** Arithmetic and logic over results by refId: `$A / $B`, `$A > 0.05 && $B > 0.05`. */
121
+ export const MathExpression = expressionClass<MathExpressionProps>("math", "MathExpression");
122
+ /** Compare a result with a threshold; an `unloadEvaluator` adds a recovery threshold. */
123
+ export const ThresholdExpression = expressionClass<ThresholdExpressionProps>("threshold", "ThresholdExpression");
124
+ /** Resample a time series to a fixed `window`. */
125
+ export const ResampleExpression = expressionClass<ResampleExpressionProps>("resample", "ResampleExpression");
126
+ /** Grafana's legacy classic conditions: reducers, evaluators and and/or across queries. */
127
+ export const ClassicConditionsExpression = expressionClass<ClassicConditionsExpressionProps>("classic_conditions", "ClassicConditionsExpression");
128
+ /** A SQL query over the other results (Grafana's SQL expressions). */
129
+ export const SqlExpression = expressionClass<SqlExpressionProps>("sql", "SqlExpression");
130
+
131
+ export function isExpressionEntity(value: unknown): value is ExpressionEntity {
132
+ return (
133
+ typeof value === "object" &&
134
+ value !== null &&
135
+ (value as Declarable).lexicon === "grafana" &&
136
+ typeof (value as Declarable).entityType === "string" &&
137
+ (value as Declarable).entityType.startsWith(EXPRESSION_TYPE_PREFIX)
138
+ );
139
+ }
140
+
141
+ /** One entry of a rule's `data`: a typed query, an `AlertQuery`, or an expression. */
142
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
143
+ export type AlertRuleData = QueryEntity<any, any> | AlertQueryEntity | ExpressionEntity<any>;
144
+
145
+ // ── Rules and groups ────────────────────────────────────────────
146
+
147
+ export type NoDataState = "NoData" | "Alerting" | "OK" | "KeepLast";
148
+ export type ExecErrState = "Error" | "Alerting" | "OK" | "KeepLast";
149
+
150
+ /** Per-rule routing: send this rule's alerts to a contact point directly, instead of through the policy tree. */
151
+ export interface AlertRuleNotificationSettings {
152
+ receiver: ContactPointEntity | string;
153
+ group_by?: string[];
154
+ group_wait?: string;
155
+ group_interval?: string;
156
+ repeat_interval?: string;
157
+ mute_time_intervals?: Array<MuteTimingEntity | string>;
158
+ active_time_intervals?: Array<MuteTimingEntity | string>;
159
+ }
160
+
161
+ /** What makes a rule a recording rule: the metric it writes and the refId it writes from. */
162
+ export interface AlertRuleRecord {
163
+ metric: string;
164
+ /** The refId whose result is recorded. */
165
+ from: string;
166
+ /** Where the metric is written (a Prometheus datasource with remote write). */
167
+ targetDatasourceUid?: string;
168
+ }
169
+
170
+ export interface AlertRuleProps {
171
+ title: string;
172
+ /**
173
+ * Stable id: letters, digits, `-` and `_`, at most 40 characters. Grafana
174
+ * refuses a rule without one. Defaults to the title as a uid.
175
+ */
176
+ uid?: string;
177
+ /** Queries and expressions, in the order Grafana evaluates them. */
178
+ data: AlertRuleData[];
179
+ /** The refId whose result decides whether the rule fires. Defaults to the last entry of `data`. Recording rules have none. */
180
+ condition?: string;
181
+ /** Default time range of every query in `data` that sets none. Defaults to the last 10 minutes, as Grafana's editor does. */
182
+ relativeTimeRange?: RelativeTimeRange;
183
+ /** How long the condition must hold before the alert fires. */
184
+ for?: string;
185
+ /** How long the alert keeps firing after the condition stops holding. */
186
+ keepFiringFor?: string;
187
+ /** What a query with no data does (Grafana's default: `NoData`). */
188
+ noDataState?: NoDataState;
189
+ /** What a query error does (Grafana's default: `Error`). */
190
+ execErrState?: ExecErrState;
191
+ /** Evaluations a series may be missing before its alert resolves. */
192
+ missing_series_evals_to_resolve?: number;
193
+ labels?: Record<string, string>;
194
+ annotations?: Record<string, string>;
195
+ isPaused?: boolean;
196
+ /** The dashboard (and `panelId`) the rule is linked to. */
197
+ dashboardUid?: DashboardEntity | string;
198
+ panelId?: number;
199
+ notification_settings?: AlertRuleNotificationSettings;
200
+ record?: AlertRuleRecord;
201
+ }
202
+
203
+ export interface AlertRuleEntity extends Declarable {
204
+ readonly props: AlertRuleProps;
205
+ }
206
+
207
+ export const ALERT_RULE_TYPE = "Grafana::AlertRule";
208
+
209
+ const AlertRuleBase = createProperty(ALERT_RULE_TYPE, "grafana") as unknown as (this: object, props: Record<string, unknown>) => void;
210
+
211
+ /** A Grafana-managed alert or recording rule, inside an `AlertRuleGroup`. */
212
+ export const AlertRule = function (this: object, props: AlertRuleProps) {
213
+ AlertRuleBase.call(this, props as unknown as Record<string, unknown>);
214
+ } as unknown as new (props: AlertRuleProps) => AlertRuleEntity;
215
+ Object.defineProperty(AlertRule, "name", { value: "AlertRule" });
216
+
217
+ export function isAlertRuleEntity(value: unknown): value is AlertRuleEntity {
218
+ return typeof value === "object" && value !== null && (value as Declarable).entityType === ALERT_RULE_TYPE && (value as Declarable).lexicon === "grafana";
219
+ }
220
+
221
+ export interface AlertRuleGroupProps {
222
+ /** The group's name, unique within its folder. */
223
+ name: string;
224
+ /** The folder the rules are stored in, by title; Grafana creates it when missing. */
225
+ folder: string;
226
+ /** How often every rule in the group is evaluated, a multiple of 10s. Defaults to `1m`. */
227
+ interval?: string;
228
+ orgId?: number;
229
+ rules: AlertRuleEntity[];
230
+ }
231
+
232
+ export interface AlertRuleGroupEntity extends Declarable {
233
+ readonly props: AlertRuleGroupProps;
234
+ }
235
+
236
+ export const ALERT_RULE_GROUP_TYPE = "Grafana::AlertRuleGroup";
237
+
238
+ const GroupBase = createResource(ALERT_RULE_GROUP_TYPE, "grafana", {}) as unknown as (this: object, props: Record<string, unknown>) => void;
239
+
240
+ /** A group of Grafana-managed rules, evaluated together at one interval. */
241
+ export const AlertRuleGroup = function (this: object, props: AlertRuleGroupProps) {
242
+ GroupBase.call(this, props as unknown as Record<string, unknown>);
243
+ } as unknown as new (props: AlertRuleGroupProps) => AlertRuleGroupEntity;
244
+ Object.defineProperty(AlertRuleGroup, "name", { value: "AlertRuleGroup" });
245
+
246
+ export function isAlertRuleGroupEntity(value: unknown): value is AlertRuleGroupEntity {
247
+ return typeof value === "object" && value !== null && (value as Declarable).entityType === ALERT_RULE_GROUP_TYPE && (value as Declarable).lexicon === "grafana";
248
+ }
249
+
250
+ // ── Contact points ──────────────────────────────────────────────
251
+
252
+ /** The integrations Grafana 12.4 and 13.2 offer (`GET /api/alert-notifiers`). Any other plugin id is accepted as a string. */
253
+ export type ContactPointIntegrationType =
254
+ | "dingding"
255
+ | "discord"
256
+ | "email"
257
+ | "googlechat"
258
+ | "jira"
259
+ | "kafka"
260
+ | "line"
261
+ | "mqtt"
262
+ | "oncall"
263
+ | "opsgenie"
264
+ | "pagerduty"
265
+ | "prometheus-alertmanager"
266
+ | "pushover"
267
+ | "sensugo"
268
+ | "slack"
269
+ | "sns"
270
+ | "teams"
271
+ | "telegram"
272
+ | "threema"
273
+ | "victorops"
274
+ | "webex"
275
+ | "webhook"
276
+ | "wechat"
277
+ | "wecom";
278
+
279
+ /** One integration of a contact point. */
280
+ export interface ContactPointReceiver {
281
+ /** Stable id, at most 40 characters. Defaults to the contact point's name and the integration type as a uid. */
282
+ uid?: string;
283
+ // eslint-disable-next-line @typescript-eslint/ban-types
284
+ type: ContactPointIntegrationType | (string & {});
285
+ /**
286
+ * The integration's settings. Write secrets (webhook URLs, tokens,
287
+ * passwords) as `$__env{NAME}` or `$__file{/path}`: Grafana expands them
288
+ * when it reads the file, and GRAF002 flags a literal.
289
+ */
290
+ settings: Record<string, unknown>;
291
+ disableResolveMessage?: boolean;
292
+ }
293
+
294
+ export interface ContactPointProps {
295
+ /** The name policies and rules route to. */
296
+ name: string;
297
+ orgId?: number;
298
+ receivers: ContactPointReceiver[];
299
+ }
300
+
301
+ export interface ContactPointEntity extends Declarable {
302
+ readonly props: ContactPointProps;
303
+ }
304
+
305
+ export const CONTACT_POINT_TYPE = "Grafana::ContactPoint";
306
+
307
+ const ContactPointBase = createResource(CONTACT_POINT_TYPE, "grafana", {}) as unknown as (this: object, props: Record<string, unknown>) => void;
308
+
309
+ /** A contact point: one or more integrations alerts are sent to, under one name. */
310
+ export const ContactPoint = function (this: object, props: ContactPointProps) {
311
+ ContactPointBase.call(this, props as unknown as Record<string, unknown>);
312
+ } as unknown as new (props: ContactPointProps) => ContactPointEntity;
313
+ Object.defineProperty(ContactPoint, "name", { value: "ContactPoint" });
314
+
315
+ export function isContactPointEntity(value: unknown): value is ContactPointEntity {
316
+ return typeof value === "object" && value !== null && (value as Declarable).entityType === CONTACT_POINT_TYPE && (value as Declarable).lexicon === "grafana";
317
+ }
318
+
319
+ // ── Mute timings and templates ──────────────────────────────────
320
+
321
+ export interface MuteTimingProps {
322
+ /** The name policies and rules refer to. */
323
+ name: string;
324
+ orgId?: number;
325
+ /** When it applies: each period's fields left out match everything. */
326
+ time_intervals: TimePeriodConfig[];
327
+ }
328
+
329
+ export interface MuteTimingEntity extends Declarable {
330
+ readonly props: MuteTimingProps;
331
+ }
332
+
333
+ export const MUTE_TIMING_TYPE = "Grafana::MuteTiming";
334
+
335
+ const MuteTimingBase = createResource(MUTE_TIMING_TYPE, "grafana", {}) as unknown as (this: object, props: Record<string, unknown>) => void;
336
+
337
+ /** A named time interval, for a policy's or rule's `mute_time_intervals` or `active_time_intervals`. */
338
+ export const MuteTiming = function (this: object, props: MuteTimingProps) {
339
+ MuteTimingBase.call(this, props as unknown as Record<string, unknown>);
340
+ } as unknown as new (props: MuteTimingProps) => MuteTimingEntity;
341
+ Object.defineProperty(MuteTiming, "name", { value: "MuteTiming" });
342
+
343
+ export function isMuteTimingEntity(value: unknown): value is MuteTimingEntity {
344
+ return typeof value === "object" && value !== null && (value as Declarable).entityType === MUTE_TIMING_TYPE && (value as Declarable).lexicon === "grafana";
345
+ }
346
+
347
+ export interface NotificationTemplateProps {
348
+ /** The template group's name. */
349
+ name: string;
350
+ orgId?: number;
351
+ /** Go template text, usually one or more `{{ define "..." }}` blocks. */
352
+ template: string;
353
+ }
354
+
355
+ export interface NotificationTemplateEntity extends Declarable {
356
+ readonly props: NotificationTemplateProps;
357
+ }
358
+
359
+ export const NOTIFICATION_TEMPLATE_TYPE = "Grafana::NotificationTemplate";
360
+
361
+ const TemplateBase = createResource(NOTIFICATION_TEMPLATE_TYPE, "grafana", {}) as unknown as (this: object, props: Record<string, unknown>) => void;
362
+
363
+ /** A notification template group, usable from contact point settings. */
364
+ export const NotificationTemplate = function (this: object, props: NotificationTemplateProps) {
365
+ TemplateBase.call(this, props as unknown as Record<string, unknown>);
366
+ } as unknown as new (props: NotificationTemplateProps) => NotificationTemplateEntity;
367
+ Object.defineProperty(NotificationTemplate, "name", { value: "NotificationTemplate" });
368
+
369
+ export function isNotificationTemplateEntity(value: unknown): value is NotificationTemplateEntity {
370
+ return (
371
+ typeof value === "object" && value !== null && (value as Declarable).entityType === NOTIFICATION_TEMPLATE_TYPE && (value as Declarable).lexicon === "grafana"
372
+ );
373
+ }
374
+
375
+ // ── Notification policies ───────────────────────────────────────
376
+
377
+ /** A label matcher as Grafana stores it: `["severity", "=", "page"]`. */
378
+ export type ObjectMatcher = [string, MatchOp, string];
379
+
380
+ /** Routing settings shared by the root policy and its child routes. */
381
+ interface PolicySettings {
382
+ /** Group alerts by these labels; `["..."]` groups by every label. */
383
+ group_by?: string[];
384
+ group_wait?: string;
385
+ group_interval?: string;
386
+ repeat_interval?: string;
387
+ mute_time_intervals?: Array<MuteTimingEntity | string>;
388
+ active_time_intervals?: Array<MuteTimingEntity | string>;
389
+ routes?: PolicyRoute[];
390
+ }
391
+
392
+ /** A child route of the policy tree. */
393
+ export interface PolicyRoute extends PolicySettings {
394
+ /** Defaults to the parent's receiver. */
395
+ receiver?: ContactPointEntity | string;
396
+ /** Matchers as `[label, op, value]`, the form Grafana writes. */
397
+ object_matchers?: ObjectMatcher[];
398
+ /** Matchers in Alertmanager's syntax, e.g. `severity="page"`. */
399
+ matchers?: string[];
400
+ /** @deprecated Alertmanager's old equality matchers; use `object_matchers`. */
401
+ match?: Record<string, string>;
402
+ /** @deprecated Alertmanager's old regex matchers; use `object_matchers`. */
403
+ match_re?: Record<string, string>;
404
+ /** Keep matching sibling routes after this one matches. */
405
+ continue?: boolean;
406
+ }
407
+
408
+ export interface NotificationPolicyProps extends PolicySettings {
409
+ orgId?: number;
410
+ /** The contact point every alert goes to unless a route sends it elsewhere. */
411
+ receiver: ContactPointEntity | string;
412
+ }
413
+
414
+ export interface NotificationPolicyEntity extends Declarable {
415
+ readonly props: NotificationPolicyProps;
416
+ }
417
+
418
+ export const NOTIFICATION_POLICY_TYPE = "Grafana::NotificationPolicy";
419
+
420
+ const PolicyBase = createResource(NOTIFICATION_POLICY_TYPE, "grafana", {}) as unknown as (this: object, props: Record<string, unknown>) => void;
421
+
422
+ /**
423
+ * An organisation's notification policy tree, from its root. Provisioning it
424
+ * replaces the whole tree, so there is one per organisation.
425
+ */
426
+ export const NotificationPolicy = function (this: object, props: NotificationPolicyProps) {
427
+ PolicyBase.call(this, props as unknown as Record<string, unknown>);
428
+ } as unknown as new (props: NotificationPolicyProps) => NotificationPolicyEntity;
429
+ Object.defineProperty(NotificationPolicy, "name", { value: "NotificationPolicy" });
430
+
431
+ export function isNotificationPolicyEntity(value: unknown): value is NotificationPolicyEntity {
432
+ return (
433
+ typeof value === "object" && value !== null && (value as Declarable).entityType === NOTIFICATION_POLICY_TYPE && (value as Declarable).lexicon === "grafana"
434
+ );
435
+ }