local-risk-alert-feed 0.1.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 (283) hide show
  1. package/dist/cjs/adapters/index.js +8 -0
  2. package/dist/cjs/adapters/index.js.map +1 -0
  3. package/dist/cjs/adapters/lambda.js +143 -0
  4. package/dist/cjs/adapters/lambda.js.map +1 -0
  5. package/dist/cjs/adapters/vercel.js +119 -0
  6. package/dist/cjs/adapters/vercel.js.map +1 -0
  7. package/dist/cjs/core/alert-aggregator.js +207 -0
  8. package/dist/cjs/core/alert-aggregator.js.map +1 -0
  9. package/dist/cjs/core/alert-feed.js +236 -0
  10. package/dist/cjs/core/alert-feed.js.map +1 -0
  11. package/dist/cjs/core/index.js +22 -0
  12. package/dist/cjs/core/index.js.map +1 -0
  13. package/dist/cjs/core/plugin-registry.js +193 -0
  14. package/dist/cjs/core/plugin-registry.js.map +1 -0
  15. package/dist/cjs/core/plugin-resolver.js +121 -0
  16. package/dist/cjs/core/plugin-resolver.js.map +1 -0
  17. package/dist/cjs/core/time-range.js +67 -0
  18. package/dist/cjs/core/time-range.js.map +1 -0
  19. package/dist/cjs/errors/fetch-error.js +71 -0
  20. package/dist/cjs/errors/fetch-error.js.map +1 -0
  21. package/dist/cjs/errors/index.js +15 -0
  22. package/dist/cjs/errors/index.js.map +1 -0
  23. package/dist/cjs/errors/plugin-error.js +80 -0
  24. package/dist/cjs/errors/plugin-error.js.map +1 -0
  25. package/dist/cjs/errors/validation-error.js +49 -0
  26. package/dist/cjs/errors/validation-error.js.map +1 -0
  27. package/dist/cjs/geo/distance.js +94 -0
  28. package/dist/cjs/geo/distance.js.map +1 -0
  29. package/dist/cjs/geo/index.js +18 -0
  30. package/dist/cjs/geo/index.js.map +1 -0
  31. package/dist/cjs/geo/point-in-radius.js +86 -0
  32. package/dist/cjs/geo/point-in-radius.js.map +1 -0
  33. package/dist/cjs/index.js +90 -0
  34. package/dist/cjs/index.js.map +1 -0
  35. package/dist/cjs/plugins/air-quality/airnow.plugin.js +343 -0
  36. package/dist/cjs/plugins/air-quality/airnow.plugin.js.map +1 -0
  37. package/dist/cjs/plugins/air-quality/index.js +6 -0
  38. package/dist/cjs/plugins/air-quality/index.js.map +1 -0
  39. package/dist/cjs/plugins/base-plugin.js +213 -0
  40. package/dist/cjs/plugins/base-plugin.js.map +1 -0
  41. package/dist/cjs/plugins/events/index.js +6 -0
  42. package/dist/cjs/plugins/events/index.js.map +1 -0
  43. package/dist/cjs/plugins/events/phoenix-events.plugin.js +382 -0
  44. package/dist/cjs/plugins/events/phoenix-events.plugin.js.map +1 -0
  45. package/dist/cjs/plugins/fire-emt/index.js +6 -0
  46. package/dist/cjs/plugins/fire-emt/index.js.map +1 -0
  47. package/dist/cjs/plugins/fire-emt/phoenix-fire.plugin.js +262 -0
  48. package/dist/cjs/plugins/fire-emt/phoenix-fire.plugin.js.map +1 -0
  49. package/dist/cjs/plugins/index.js +28 -0
  50. package/dist/cjs/plugins/index.js.map +1 -0
  51. package/dist/cjs/plugins/police-blotter/index.js +6 -0
  52. package/dist/cjs/plugins/police-blotter/index.js.map +1 -0
  53. package/dist/cjs/plugins/police-blotter/phoenix-police.plugin.js +198 -0
  54. package/dist/cjs/plugins/police-blotter/phoenix-police.plugin.js.map +1 -0
  55. package/dist/cjs/plugins/pulsepoint/index.js +6 -0
  56. package/dist/cjs/plugins/pulsepoint/index.js.map +1 -0
  57. package/dist/cjs/plugins/pulsepoint/pulsepoint.plugin.js +275 -0
  58. package/dist/cjs/plugins/pulsepoint/pulsepoint.plugin.js.map +1 -0
  59. package/dist/cjs/plugins/traffic/arizona-traffic.plugin.js +391 -0
  60. package/dist/cjs/plugins/traffic/arizona-traffic.plugin.js.map +1 -0
  61. package/dist/cjs/plugins/traffic/index.js +6 -0
  62. package/dist/cjs/plugins/traffic/index.js.map +1 -0
  63. package/dist/cjs/plugins/weather/index.js +6 -0
  64. package/dist/cjs/plugins/weather/index.js.map +1 -0
  65. package/dist/cjs/plugins/weather/nws-weather.plugin.js +180 -0
  66. package/dist/cjs/plugins/weather/nws-weather.plugin.js.map +1 -0
  67. package/dist/cjs/schemas/alert.schema.js +93 -0
  68. package/dist/cjs/schemas/alert.schema.js.map +1 -0
  69. package/dist/cjs/schemas/index.js +24 -0
  70. package/dist/cjs/schemas/index.js.map +1 -0
  71. package/dist/cjs/schemas/query.schema.js +76 -0
  72. package/dist/cjs/schemas/query.schema.js.map +1 -0
  73. package/dist/cjs/types/alert.js +35 -0
  74. package/dist/cjs/types/alert.js.map +1 -0
  75. package/dist/cjs/types/config.js +13 -0
  76. package/dist/cjs/types/config.js.map +1 -0
  77. package/dist/cjs/types/geo.js +3 -0
  78. package/dist/cjs/types/geo.js.map +1 -0
  79. package/dist/cjs/types/index.js +16 -0
  80. package/dist/cjs/types/index.js.map +1 -0
  81. package/dist/cjs/types/plugin.js +3 -0
  82. package/dist/cjs/types/plugin.js.map +1 -0
  83. package/dist/cjs/types/query.js +28 -0
  84. package/dist/cjs/types/query.js.map +1 -0
  85. package/dist/cjs/utils/cache.js +188 -0
  86. package/dist/cjs/utils/cache.js.map +1 -0
  87. package/dist/cjs/utils/csv.js +189 -0
  88. package/dist/cjs/utils/csv.js.map +1 -0
  89. package/dist/cjs/utils/date.js +153 -0
  90. package/dist/cjs/utils/date.js.map +1 -0
  91. package/dist/cjs/utils/index.js +28 -0
  92. package/dist/cjs/utils/index.js.map +1 -0
  93. package/dist/cjs/utils/retry.js +109 -0
  94. package/dist/cjs/utils/retry.js.map +1 -0
  95. package/dist/esm/adapters/index.js +3 -0
  96. package/dist/esm/adapters/index.js.map +1 -0
  97. package/dist/esm/adapters/lambda.js +140 -0
  98. package/dist/esm/adapters/lambda.js.map +1 -0
  99. package/dist/esm/adapters/vercel.js +116 -0
  100. package/dist/esm/adapters/vercel.js.map +1 -0
  101. package/dist/esm/core/alert-aggregator.js +203 -0
  102. package/dist/esm/core/alert-aggregator.js.map +1 -0
  103. package/dist/esm/core/alert-feed.js +232 -0
  104. package/dist/esm/core/alert-feed.js.map +1 -0
  105. package/dist/esm/core/index.js +6 -0
  106. package/dist/esm/core/index.js.map +1 -0
  107. package/dist/esm/core/plugin-registry.js +189 -0
  108. package/dist/esm/core/plugin-registry.js.map +1 -0
  109. package/dist/esm/core/plugin-resolver.js +117 -0
  110. package/dist/esm/core/plugin-resolver.js.map +1 -0
  111. package/dist/esm/core/time-range.js +57 -0
  112. package/dist/esm/core/time-range.js.map +1 -0
  113. package/dist/esm/errors/fetch-error.js +67 -0
  114. package/dist/esm/errors/fetch-error.js.map +1 -0
  115. package/dist/esm/errors/index.js +4 -0
  116. package/dist/esm/errors/index.js.map +1 -0
  117. package/dist/esm/errors/plugin-error.js +71 -0
  118. package/dist/esm/errors/plugin-error.js.map +1 -0
  119. package/dist/esm/errors/validation-error.js +45 -0
  120. package/dist/esm/errors/validation-error.js.map +1 -0
  121. package/dist/esm/geo/distance.js +85 -0
  122. package/dist/esm/geo/distance.js.map +1 -0
  123. package/dist/esm/geo/index.js +3 -0
  124. package/dist/esm/geo/index.js.map +1 -0
  125. package/dist/esm/geo/point-in-radius.js +79 -0
  126. package/dist/esm/geo/point-in-radius.js.map +1 -0
  127. package/dist/esm/index.js +30 -0
  128. package/dist/esm/index.js.map +1 -0
  129. package/dist/esm/plugins/air-quality/airnow.plugin.js +339 -0
  130. package/dist/esm/plugins/air-quality/airnow.plugin.js.map +1 -0
  131. package/dist/esm/plugins/air-quality/index.js +2 -0
  132. package/dist/esm/plugins/air-quality/index.js.map +1 -0
  133. package/dist/esm/plugins/base-plugin.js +209 -0
  134. package/dist/esm/plugins/base-plugin.js.map +1 -0
  135. package/dist/esm/plugins/events/index.js +2 -0
  136. package/dist/esm/plugins/events/index.js.map +1 -0
  137. package/dist/esm/plugins/events/phoenix-events.plugin.js +378 -0
  138. package/dist/esm/plugins/events/phoenix-events.plugin.js.map +1 -0
  139. package/dist/esm/plugins/fire-emt/index.js +2 -0
  140. package/dist/esm/plugins/fire-emt/index.js.map +1 -0
  141. package/dist/esm/plugins/fire-emt/phoenix-fire.plugin.js +258 -0
  142. package/dist/esm/plugins/fire-emt/phoenix-fire.plugin.js.map +1 -0
  143. package/dist/esm/plugins/index.js +17 -0
  144. package/dist/esm/plugins/index.js.map +1 -0
  145. package/dist/esm/plugins/police-blotter/index.js +2 -0
  146. package/dist/esm/plugins/police-blotter/index.js.map +1 -0
  147. package/dist/esm/plugins/police-blotter/phoenix-police.plugin.js +194 -0
  148. package/dist/esm/plugins/police-blotter/phoenix-police.plugin.js.map +1 -0
  149. package/dist/esm/plugins/pulsepoint/index.js +2 -0
  150. package/dist/esm/plugins/pulsepoint/index.js.map +1 -0
  151. package/dist/esm/plugins/pulsepoint/pulsepoint.plugin.js +271 -0
  152. package/dist/esm/plugins/pulsepoint/pulsepoint.plugin.js.map +1 -0
  153. package/dist/esm/plugins/traffic/arizona-traffic.plugin.js +387 -0
  154. package/dist/esm/plugins/traffic/arizona-traffic.plugin.js.map +1 -0
  155. package/dist/esm/plugins/traffic/index.js +2 -0
  156. package/dist/esm/plugins/traffic/index.js.map +1 -0
  157. package/dist/esm/plugins/weather/index.js +2 -0
  158. package/dist/esm/plugins/weather/index.js.map +1 -0
  159. package/dist/esm/plugins/weather/nws-weather.plugin.js +176 -0
  160. package/dist/esm/plugins/weather/nws-weather.plugin.js.map +1 -0
  161. package/dist/esm/schemas/alert.schema.js +90 -0
  162. package/dist/esm/schemas/alert.schema.js.map +1 -0
  163. package/dist/esm/schemas/index.js +5 -0
  164. package/dist/esm/schemas/index.js.map +1 -0
  165. package/dist/esm/schemas/query.schema.js +72 -0
  166. package/dist/esm/schemas/query.schema.js.map +1 -0
  167. package/dist/esm/types/alert.js +32 -0
  168. package/dist/esm/types/alert.js.map +1 -0
  169. package/dist/esm/types/config.js +10 -0
  170. package/dist/esm/types/config.js.map +1 -0
  171. package/dist/esm/types/geo.js +2 -0
  172. package/dist/esm/types/geo.js.map +1 -0
  173. package/dist/esm/types/index.js +4 -0
  174. package/dist/esm/types/index.js.map +1 -0
  175. package/dist/esm/types/plugin.js +2 -0
  176. package/dist/esm/types/plugin.js.map +1 -0
  177. package/dist/esm/types/query.js +25 -0
  178. package/dist/esm/types/query.js.map +1 -0
  179. package/dist/esm/utils/cache.js +181 -0
  180. package/dist/esm/utils/cache.js.map +1 -0
  181. package/dist/esm/utils/csv.js +185 -0
  182. package/dist/esm/utils/csv.js.map +1 -0
  183. package/dist/esm/utils/date.js +142 -0
  184. package/dist/esm/utils/date.js.map +1 -0
  185. package/dist/esm/utils/index.js +5 -0
  186. package/dist/esm/utils/index.js.map +1 -0
  187. package/dist/esm/utils/retry.js +102 -0
  188. package/dist/esm/utils/retry.js.map +1 -0
  189. package/dist/types/adapters/index.d.ts +5 -0
  190. package/dist/types/adapters/index.d.ts.map +1 -0
  191. package/dist/types/adapters/lambda.d.ts +37 -0
  192. package/dist/types/adapters/lambda.d.ts.map +1 -0
  193. package/dist/types/adapters/vercel.d.ts +54 -0
  194. package/dist/types/adapters/vercel.d.ts.map +1 -0
  195. package/dist/types/core/alert-aggregator.d.ts +81 -0
  196. package/dist/types/core/alert-aggregator.d.ts.map +1 -0
  197. package/dist/types/core/alert-feed.d.ts +80 -0
  198. package/dist/types/core/alert-feed.d.ts.map +1 -0
  199. package/dist/types/core/index.d.ts +8 -0
  200. package/dist/types/core/index.d.ts.map +1 -0
  201. package/dist/types/core/plugin-registry.d.ts +91 -0
  202. package/dist/types/core/plugin-registry.d.ts.map +1 -0
  203. package/dist/types/core/plugin-resolver.d.ts +78 -0
  204. package/dist/types/core/plugin-resolver.d.ts.map +1 -0
  205. package/dist/types/core/time-range.d.ts +40 -0
  206. package/dist/types/core/time-range.d.ts.map +1 -0
  207. package/dist/types/errors/fetch-error.d.ts +46 -0
  208. package/dist/types/errors/fetch-error.d.ts.map +1 -0
  209. package/dist/types/errors/index.d.ts +5 -0
  210. package/dist/types/errors/index.d.ts.map +1 -0
  211. package/dist/types/errors/plugin-error.d.ts +42 -0
  212. package/dist/types/errors/plugin-error.d.ts.map +1 -0
  213. package/dist/types/errors/validation-error.d.ts +34 -0
  214. package/dist/types/errors/validation-error.d.ts.map +1 -0
  215. package/dist/types/geo/distance.d.ts +50 -0
  216. package/dist/types/geo/distance.d.ts.map +1 -0
  217. package/dist/types/geo/index.d.ts +3 -0
  218. package/dist/types/geo/index.d.ts.map +1 -0
  219. package/dist/types/geo/point-in-radius.d.ts +44 -0
  220. package/dist/types/geo/point-in-radius.d.ts.map +1 -0
  221. package/dist/types/index.d.ts +32 -0
  222. package/dist/types/index.d.ts.map +1 -0
  223. package/dist/types/plugins/air-quality/airnow.plugin.d.ts +84 -0
  224. package/dist/types/plugins/air-quality/airnow.plugin.d.ts.map +1 -0
  225. package/dist/types/plugins/air-quality/index.d.ts +3 -0
  226. package/dist/types/plugins/air-quality/index.d.ts.map +1 -0
  227. package/dist/types/plugins/base-plugin.d.ts +99 -0
  228. package/dist/types/plugins/base-plugin.d.ts.map +1 -0
  229. package/dist/types/plugins/events/index.d.ts +3 -0
  230. package/dist/types/plugins/events/index.d.ts.map +1 -0
  231. package/dist/types/plugins/events/phoenix-events.plugin.d.ts +71 -0
  232. package/dist/types/plugins/events/phoenix-events.plugin.d.ts.map +1 -0
  233. package/dist/types/plugins/fire-emt/index.d.ts +3 -0
  234. package/dist/types/plugins/fire-emt/index.d.ts.map +1 -0
  235. package/dist/types/plugins/fire-emt/phoenix-fire.plugin.d.ts +47 -0
  236. package/dist/types/plugins/fire-emt/phoenix-fire.plugin.d.ts.map +1 -0
  237. package/dist/types/plugins/index.d.ts +17 -0
  238. package/dist/types/plugins/index.d.ts.map +1 -0
  239. package/dist/types/plugins/police-blotter/index.d.ts +3 -0
  240. package/dist/types/plugins/police-blotter/index.d.ts.map +1 -0
  241. package/dist/types/plugins/police-blotter/phoenix-police.plugin.d.ts +49 -0
  242. package/dist/types/plugins/police-blotter/phoenix-police.plugin.d.ts.map +1 -0
  243. package/dist/types/plugins/pulsepoint/index.d.ts +3 -0
  244. package/dist/types/plugins/pulsepoint/index.d.ts.map +1 -0
  245. package/dist/types/plugins/pulsepoint/pulsepoint.plugin.d.ts +61 -0
  246. package/dist/types/plugins/pulsepoint/pulsepoint.plugin.d.ts.map +1 -0
  247. package/dist/types/plugins/traffic/arizona-traffic.plugin.d.ts +83 -0
  248. package/dist/types/plugins/traffic/arizona-traffic.plugin.d.ts.map +1 -0
  249. package/dist/types/plugins/traffic/index.d.ts +3 -0
  250. package/dist/types/plugins/traffic/index.d.ts.map +1 -0
  251. package/dist/types/plugins/weather/index.d.ts +3 -0
  252. package/dist/types/plugins/weather/index.d.ts.map +1 -0
  253. package/dist/types/plugins/weather/nws-weather.plugin.d.ts +50 -0
  254. package/dist/types/plugins/weather/nws-weather.plugin.d.ts.map +1 -0
  255. package/dist/types/schemas/alert.schema.d.ts +266 -0
  256. package/dist/types/schemas/alert.schema.d.ts.map +1 -0
  257. package/dist/types/schemas/index.d.ts +5 -0
  258. package/dist/types/schemas/index.d.ts.map +1 -0
  259. package/dist/types/schemas/query.schema.d.ts +150 -0
  260. package/dist/types/schemas/query.schema.d.ts.map +1 -0
  261. package/dist/types/types/alert.d.ts +96 -0
  262. package/dist/types/types/alert.d.ts.map +1 -0
  263. package/dist/types/types/config.d.ts +63 -0
  264. package/dist/types/types/config.d.ts.map +1 -0
  265. package/dist/types/types/geo.d.ts +33 -0
  266. package/dist/types/types/geo.d.ts.map +1 -0
  267. package/dist/types/types/index.d.ts +9 -0
  268. package/dist/types/types/index.d.ts.map +1 -0
  269. package/dist/types/types/plugin.d.ts +125 -0
  270. package/dist/types/types/plugin.d.ts.map +1 -0
  271. package/dist/types/types/query.d.ts +86 -0
  272. package/dist/types/types/query.d.ts.map +1 -0
  273. package/dist/types/utils/cache.d.ts +112 -0
  274. package/dist/types/utils/cache.d.ts.map +1 -0
  275. package/dist/types/utils/csv.d.ts +38 -0
  276. package/dist/types/utils/csv.d.ts.map +1 -0
  277. package/dist/types/utils/date.d.ts +47 -0
  278. package/dist/types/utils/date.d.ts.map +1 -0
  279. package/dist/types/utils/index.d.ts +7 -0
  280. package/dist/types/utils/index.d.ts.map +1 -0
  281. package/dist/types/utils/retry.d.ts +51 -0
  282. package/dist/types/utils/retry.d.ts.map +1 -0
  283. package/package.json +115 -0
@@ -0,0 +1,236 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AlertFeed = void 0;
4
+ const types_1 = require("../types");
5
+ const plugin_registry_1 = require("./plugin-registry");
6
+ const plugin_resolver_1 = require("./plugin-resolver");
7
+ const alert_aggregator_1 = require("./alert-aggregator");
8
+ const time_range_1 = require("./time-range");
9
+ const errors_1 = require("../errors");
10
+ const utils_1 = require("../utils");
11
+ /**
12
+ * Main AlertFeed class that coordinates plugin fetching and alert aggregation.
13
+ */
14
+ class AlertFeed {
15
+ registry;
16
+ resolver;
17
+ aggregator;
18
+ config;
19
+ constructor(config) {
20
+ this.registry = new plugin_registry_1.PluginRegistry();
21
+ this.resolver = new plugin_resolver_1.PluginResolver();
22
+ this.aggregator = new alert_aggregator_1.AlertAggregator();
23
+ this.config = {
24
+ defaultCacheTtlMs: config?.defaultCacheTtlMs ?? 5 * 60 * 1000,
25
+ pluginTimeoutMs: config?.pluginTimeoutMs ?? 30 * 1000,
26
+ continueOnPluginError: config?.continueOnPluginError ?? true,
27
+ maxConcurrentFetches: config?.maxConcurrentFetches ?? 5,
28
+ };
29
+ // Register initial plugins if provided
30
+ if (config?.plugins) {
31
+ // Don't await here - call registerPlugins separately
32
+ this.registerPluginsSync(config.plugins);
33
+ }
34
+ }
35
+ /**
36
+ * Register plugins synchronously (for constructor use).
37
+ * Initialization happens lazily on first query.
38
+ */
39
+ registerPluginsSync(registrations) {
40
+ for (const reg of registrations) {
41
+ // Queue registration without awaiting
42
+ this.registry.register(reg).catch(() => {
43
+ // Errors will be caught on first query
44
+ });
45
+ }
46
+ }
47
+ /**
48
+ * Register plugins with the feed.
49
+ *
50
+ * @param registrations - Array of plugin registrations
51
+ */
52
+ async registerPlugins(registrations) {
53
+ await this.registry.registerAll(registrations);
54
+ }
55
+ /**
56
+ * Register a single plugin.
57
+ *
58
+ * @param registration - Plugin registration
59
+ */
60
+ async registerPlugin(registration) {
61
+ await this.registry.register(registration);
62
+ }
63
+ /**
64
+ * Unregister a plugin by ID.
65
+ *
66
+ * @param pluginId - The plugin ID to unregister
67
+ */
68
+ async unregisterPlugin(pluginId) {
69
+ await this.registry.unregister(pluginId);
70
+ }
71
+ /**
72
+ * Query for alerts based on location and filters.
73
+ *
74
+ * @param query - Query parameters
75
+ * @returns Query response with alerts and metadata
76
+ */
77
+ async query(query) {
78
+ // Normalize query parameters
79
+ const radiusMeters = query.radiusMeters ?? types_1.DEFAULT_QUERY_RADIUS_METERS;
80
+ const limit = query.limit ?? types_1.DEFAULT_QUERY_LIMIT;
81
+ const timeRange = (0, time_range_1.normalizeTimeRange)(query.timeRange);
82
+ // Get all enabled plugins
83
+ const allPlugins = this.registry.getAll(true);
84
+ // Resolve which plugins to query based on location and filters
85
+ const applicablePlugins = this.resolver.resolve(allPlugins, {
86
+ location: query.location,
87
+ categories: query.categories,
88
+ temporalTypes: query.temporalTypes,
89
+ });
90
+ // Fetch from all applicable plugins
91
+ const { alertSets, pluginResults } = await this.fetchFromPlugins(applicablePlugins, {
92
+ location: query.location,
93
+ radiusMeters,
94
+ timeRange,
95
+ limit,
96
+ categories: query.categories,
97
+ temporalTypes: query.temporalTypes,
98
+ }, query.includePluginResults ?? false);
99
+ // Aggregate alerts
100
+ const aggregatedAlerts = this.aggregator.aggregate(alertSets, {
101
+ minRiskLevel: query.minRiskLevel,
102
+ timeRange,
103
+ location: query.location,
104
+ radiusMeters,
105
+ limit,
106
+ });
107
+ const truncated = aggregatedAlerts.length < this.getTotalAlertCount(alertSets);
108
+ // Build response
109
+ const response = {
110
+ alerts: aggregatedAlerts,
111
+ meta: {
112
+ totalCount: aggregatedAlerts.length,
113
+ queriedAt: new Date().toISOString(),
114
+ timeRange,
115
+ location: query.location,
116
+ radiusMeters,
117
+ truncated,
118
+ },
119
+ };
120
+ if (query.includePluginResults) {
121
+ response.pluginResults = pluginResults;
122
+ }
123
+ return response;
124
+ }
125
+ /**
126
+ * Fetch alerts from multiple plugins with concurrency control.
127
+ */
128
+ async fetchFromPlugins(plugins, options, includeResults) {
129
+ const alertSets = [];
130
+ const pluginResults = [];
131
+ // Process plugins with concurrency limit
132
+ const chunks = this.chunkArray(plugins, this.config.maxConcurrentFetches);
133
+ for (const chunk of chunks) {
134
+ const chunkResults = await Promise.all(chunk.map((plugin) => this.fetchFromPlugin(plugin, options)));
135
+ for (const result of chunkResults) {
136
+ alertSets.push(result.alerts);
137
+ if (includeResults) {
138
+ pluginResults.push(result.info);
139
+ }
140
+ }
141
+ }
142
+ return { alertSets, pluginResults };
143
+ }
144
+ /**
145
+ * Fetch alerts from a single plugin with timeout handling.
146
+ */
147
+ async fetchFromPlugin(plugin, options) {
148
+ const startTime = Date.now();
149
+ const pluginId = plugin.metadata.id;
150
+ const pluginName = plugin.metadata.name;
151
+ try {
152
+ const result = await (0, utils_1.withTimeout)(() => plugin.fetchAlerts(options), this.config.pluginTimeoutMs, `Plugin "${pluginId}" timed out`);
153
+ return {
154
+ alerts: result.alerts,
155
+ info: {
156
+ pluginId,
157
+ pluginName,
158
+ success: true,
159
+ alertCount: result.alerts.length,
160
+ durationMs: Date.now() - startTime,
161
+ fromCache: result.fromCache,
162
+ warnings: result.warnings,
163
+ },
164
+ };
165
+ }
166
+ catch (error) {
167
+ const durationMs = Date.now() - startTime;
168
+ const errorMessage = error instanceof Error ? error.message : String(error);
169
+ const info = {
170
+ pluginId,
171
+ pluginName,
172
+ success: false,
173
+ alertCount: 0,
174
+ durationMs,
175
+ error: errorMessage,
176
+ };
177
+ if (!this.config.continueOnPluginError) {
178
+ if (error instanceof errors_1.PluginTimeoutError) {
179
+ throw error;
180
+ }
181
+ throw new errors_1.PluginFetchError(pluginId, errorMessage, error instanceof Error ? error : undefined);
182
+ }
183
+ return { alerts: [], info };
184
+ }
185
+ }
186
+ /**
187
+ * Get total count of alerts across all sets.
188
+ */
189
+ getTotalAlertCount(alertSets) {
190
+ return alertSets.reduce((sum, set) => sum + set.length, 0);
191
+ }
192
+ /**
193
+ * Split an array into chunks.
194
+ */
195
+ chunkArray(array, size) {
196
+ const chunks = [];
197
+ for (let i = 0; i < array.length; i += size) {
198
+ chunks.push(array.slice(i, i + size));
199
+ }
200
+ return chunks;
201
+ }
202
+ /**
203
+ * Get registered plugin metadata.
204
+ *
205
+ * @param enabledOnly - Only return enabled plugins (default: true)
206
+ */
207
+ getPluginMetadata(enabledOnly = true) {
208
+ return this.registry.getMetadata(enabledOnly);
209
+ }
210
+ /**
211
+ * Check if a plugin is registered.
212
+ */
213
+ hasPlugin(pluginId) {
214
+ return this.registry.has(pluginId);
215
+ }
216
+ /**
217
+ * Enable a plugin.
218
+ */
219
+ async enablePlugin(pluginId) {
220
+ await this.registry.enable(pluginId);
221
+ }
222
+ /**
223
+ * Disable a plugin.
224
+ */
225
+ disablePlugin(pluginId) {
226
+ this.registry.disable(pluginId);
227
+ }
228
+ /**
229
+ * Dispose of the feed and all plugins.
230
+ */
231
+ async dispose() {
232
+ await this.registry.dispose();
233
+ }
234
+ }
235
+ exports.AlertFeed = AlertFeed;
236
+ //# sourceMappingURL=alert-feed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alert-feed.js","sourceRoot":"","sources":["../../../src/core/alert-feed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isTimeRangeCurrent = exports.isTimeRangeInFuture = exports.isTimeRangeInPast = exports.getTimeRangeDuration = exports.normalizeTimeRange = exports.getDefaultTimeRangePreset = exports.getDefaultTimeRange = exports.resolveTimeRangePreset = exports.resolveTimeRange = exports.AlertAggregator = exports.PluginResolver = exports.PluginRegistry = exports.AlertFeed = void 0;
4
+ var alert_feed_1 = require("./alert-feed");
5
+ Object.defineProperty(exports, "AlertFeed", { enumerable: true, get: function () { return alert_feed_1.AlertFeed; } });
6
+ var plugin_registry_1 = require("./plugin-registry");
7
+ Object.defineProperty(exports, "PluginRegistry", { enumerable: true, get: function () { return plugin_registry_1.PluginRegistry; } });
8
+ var plugin_resolver_1 = require("./plugin-resolver");
9
+ Object.defineProperty(exports, "PluginResolver", { enumerable: true, get: function () { return plugin_resolver_1.PluginResolver; } });
10
+ var alert_aggregator_1 = require("./alert-aggregator");
11
+ Object.defineProperty(exports, "AlertAggregator", { enumerable: true, get: function () { return alert_aggregator_1.AlertAggregator; } });
12
+ var time_range_1 = require("./time-range");
13
+ Object.defineProperty(exports, "resolveTimeRange", { enumerable: true, get: function () { return time_range_1.resolveTimeRange; } });
14
+ Object.defineProperty(exports, "resolveTimeRangePreset", { enumerable: true, get: function () { return time_range_1.resolveTimeRangePreset; } });
15
+ Object.defineProperty(exports, "getDefaultTimeRange", { enumerable: true, get: function () { return time_range_1.getDefaultTimeRange; } });
16
+ Object.defineProperty(exports, "getDefaultTimeRangePreset", { enumerable: true, get: function () { return time_range_1.getDefaultTimeRangePreset; } });
17
+ Object.defineProperty(exports, "normalizeTimeRange", { enumerable: true, get: function () { return time_range_1.normalizeTimeRange; } });
18
+ Object.defineProperty(exports, "getTimeRangeDuration", { enumerable: true, get: function () { return time_range_1.getTimeRangeDuration; } });
19
+ Object.defineProperty(exports, "isTimeRangeInPast", { enumerable: true, get: function () { return time_range_1.isTimeRangeInPast; } });
20
+ Object.defineProperty(exports, "isTimeRangeInFuture", { enumerable: true, get: function () { return time_range_1.isTimeRangeInFuture; } });
21
+ Object.defineProperty(exports, "isTimeRangeCurrent", { enumerable: true, get: function () { return time_range_1.isTimeRangeCurrent; } });
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/index.ts"],"names":[],"mappings":";;;AAAA,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AAEvB,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AAExB,2CAUsB;AATpB,8GAAA,gBAAgB,OAAA;AAChB,oHAAA,sBAAsB,OAAA;AACtB,iHAAA,mBAAmB,OAAA;AACnB,uHAAA,yBAAyB,OAAA;AACzB,gHAAA,kBAAkB,OAAA;AAClB,kHAAA,oBAAoB,OAAA;AACpB,+GAAA,iBAAiB,OAAA;AACjB,iHAAA,mBAAmB,OAAA;AACnB,gHAAA,kBAAkB,OAAA"}
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PluginRegistry = void 0;
4
+ const errors_1 = require("../errors");
5
+ /**
6
+ * Registry for managing alert plugins.
7
+ *
8
+ * Handles registration, initialization, and lifecycle of plugins.
9
+ */
10
+ class PluginRegistry {
11
+ plugins = new Map();
12
+ /**
13
+ * Register a single plugin.
14
+ *
15
+ * @param registration - Plugin registration details
16
+ * @throws DuplicatePluginError if a plugin with the same ID is already registered
17
+ */
18
+ async register(registration) {
19
+ const { plugin, config, enabled = true } = registration;
20
+ const pluginId = plugin.metadata.id;
21
+ if (this.plugins.has(pluginId)) {
22
+ throw new errors_1.DuplicatePluginError(pluginId);
23
+ }
24
+ const entry = {
25
+ plugin,
26
+ config,
27
+ enabled,
28
+ initialized: false,
29
+ };
30
+ this.plugins.set(pluginId, entry);
31
+ // Initialize if enabled
32
+ if (enabled) {
33
+ await this.initializePlugin(entry);
34
+ }
35
+ }
36
+ /**
37
+ * Register multiple plugins at once.
38
+ *
39
+ * @param registrations - Array of plugin registrations
40
+ */
41
+ async registerAll(registrations) {
42
+ for (const registration of registrations) {
43
+ await this.register(registration);
44
+ }
45
+ }
46
+ /**
47
+ * Unregister a plugin by ID.
48
+ *
49
+ * @param pluginId - The plugin ID to unregister
50
+ * @throws PluginNotFoundError if the plugin is not registered
51
+ */
52
+ async unregister(pluginId) {
53
+ const entry = this.plugins.get(pluginId);
54
+ if (!entry) {
55
+ throw new errors_1.PluginNotFoundError(pluginId);
56
+ }
57
+ // Dispose if initialized
58
+ if (entry.initialized && entry.plugin.dispose) {
59
+ await entry.plugin.dispose();
60
+ }
61
+ this.plugins.delete(pluginId);
62
+ }
63
+ /**
64
+ * Get a plugin by ID.
65
+ *
66
+ * @param pluginId - The plugin ID to retrieve
67
+ * @returns The plugin instance or undefined if not found
68
+ */
69
+ get(pluginId) {
70
+ return this.plugins.get(pluginId)?.plugin;
71
+ }
72
+ /**
73
+ * Get all registered plugins.
74
+ *
75
+ * @param enabledOnly - If true, only return enabled plugins (default: true)
76
+ * @returns Array of plugin instances
77
+ */
78
+ getAll(enabledOnly = true) {
79
+ const plugins = [];
80
+ for (const entry of this.plugins.values()) {
81
+ if (!enabledOnly || entry.enabled) {
82
+ plugins.push(entry.plugin);
83
+ }
84
+ }
85
+ return plugins;
86
+ }
87
+ /**
88
+ * Get metadata for all registered plugins.
89
+ *
90
+ * @param enabledOnly - If true, only return enabled plugins
91
+ * @returns Array of plugin metadata
92
+ */
93
+ getMetadata(enabledOnly = true) {
94
+ return this.getAll(enabledOnly).map((p) => p.metadata);
95
+ }
96
+ /**
97
+ * Check if a plugin is registered.
98
+ *
99
+ * @param pluginId - The plugin ID to check
100
+ * @returns true if the plugin is registered
101
+ */
102
+ has(pluginId) {
103
+ return this.plugins.has(pluginId);
104
+ }
105
+ /**
106
+ * Enable a registered plugin.
107
+ *
108
+ * @param pluginId - The plugin ID to enable
109
+ */
110
+ async enable(pluginId) {
111
+ const entry = this.plugins.get(pluginId);
112
+ if (!entry) {
113
+ throw new errors_1.PluginNotFoundError(pluginId);
114
+ }
115
+ entry.enabled = true;
116
+ if (!entry.initialized) {
117
+ await this.initializePlugin(entry);
118
+ }
119
+ }
120
+ /**
121
+ * Disable a registered plugin.
122
+ *
123
+ * @param pluginId - The plugin ID to disable
124
+ */
125
+ disable(pluginId) {
126
+ const entry = this.plugins.get(pluginId);
127
+ if (!entry) {
128
+ throw new errors_1.PluginNotFoundError(pluginId);
129
+ }
130
+ entry.enabled = false;
131
+ }
132
+ /**
133
+ * Check if a plugin is enabled.
134
+ *
135
+ * @param pluginId - The plugin ID to check
136
+ * @returns true if the plugin is enabled
137
+ */
138
+ isEnabled(pluginId) {
139
+ return this.plugins.get(pluginId)?.enabled ?? false;
140
+ }
141
+ /**
142
+ * Get the number of registered plugins.
143
+ *
144
+ * @param enabledOnly - If true, only count enabled plugins
145
+ */
146
+ size(enabledOnly = false) {
147
+ if (!enabledOnly) {
148
+ return this.plugins.size;
149
+ }
150
+ let count = 0;
151
+ for (const entry of this.plugins.values()) {
152
+ if (entry.enabled)
153
+ count++;
154
+ }
155
+ return count;
156
+ }
157
+ /**
158
+ * Dispose all plugins and clear the registry.
159
+ */
160
+ async dispose() {
161
+ for (const entry of this.plugins.values()) {
162
+ if (entry.initialized && entry.plugin.dispose) {
163
+ try {
164
+ await entry.plugin.dispose();
165
+ }
166
+ catch {
167
+ // Ignore disposal errors
168
+ }
169
+ }
170
+ }
171
+ this.plugins.clear();
172
+ }
173
+ /**
174
+ * Initialize a plugin.
175
+ */
176
+ async initializePlugin(entry) {
177
+ if (entry.initialized)
178
+ return;
179
+ const pluginId = entry.plugin.metadata.id;
180
+ try {
181
+ if (entry.plugin.initialize) {
182
+ await entry.plugin.initialize(entry.config);
183
+ }
184
+ entry.initialized = true;
185
+ }
186
+ catch (error) {
187
+ const message = error instanceof Error ? error.message : String(error);
188
+ throw new errors_1.PluginInitializationError(pluginId, message, error instanceof Error ? error : undefined);
189
+ }
190
+ }
191
+ }
192
+ exports.PluginRegistry = PluginRegistry;
193
+ //# sourceMappingURL=plugin-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-registry.js","sourceRoot":"","sources":["../../../src/core/plugin-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PluginResolver = void 0;
4
+ /**
5
+ * Resolves which plugins are applicable for a given query.
6
+ *
7
+ * Determines plugin coverage based on:
8
+ * - Geographic coverage (global or regional with center + radius)
9
+ * - Supported alert categories
10
+ * - Supported temporal types
11
+ */
12
+ class PluginResolver {
13
+ /**
14
+ * Resolve which plugins cover the given location and match the filters.
15
+ *
16
+ * @param plugins - Available plugins to check
17
+ * @param options - Resolution options including location and filters
18
+ * @returns Array of plugins that match all criteria
19
+ */
20
+ resolve(plugins, options) {
21
+ const { location, categories, temporalTypes } = options;
22
+ return plugins.filter((plugin) => {
23
+ // Check location coverage
24
+ if (!plugin.coversLocation(location)) {
25
+ return false;
26
+ }
27
+ // Check category support
28
+ if (categories && categories.length > 0) {
29
+ const supported = plugin.metadata.supportedCategories;
30
+ const hasCategory = categories.some((c) => supported.includes(c));
31
+ if (!hasCategory) {
32
+ return false;
33
+ }
34
+ }
35
+ // Check temporal type support
36
+ if (temporalTypes && temporalTypes.length > 0) {
37
+ const supported = plugin.metadata.supportedTemporalTypes;
38
+ const hasTemporalType = temporalTypes.some((t) => supported.includes(t));
39
+ if (!hasTemporalType) {
40
+ return false;
41
+ }
42
+ }
43
+ return true;
44
+ });
45
+ }
46
+ /**
47
+ * Resolve plugins with detailed coverage information.
48
+ *
49
+ * @param plugins - Available plugins to check
50
+ * @param options - Resolution options
51
+ * @returns Array of resolved plugins with coverage details
52
+ */
53
+ resolveWithDetails(plugins, options) {
54
+ const { location, categories, temporalTypes } = options;
55
+ return plugins.map((plugin) => {
56
+ const coversLocation = plugin.coversLocation(location);
57
+ let supportsCategories = true;
58
+ if (categories && categories.length > 0) {
59
+ const supported = plugin.metadata.supportedCategories;
60
+ supportsCategories = categories.some((c) => supported.includes(c));
61
+ }
62
+ let supportsTemporalTypes = true;
63
+ if (temporalTypes && temporalTypes.length > 0) {
64
+ const supported = plugin.metadata.supportedTemporalTypes;
65
+ supportsTemporalTypes = temporalTypes.some((t) => supported.includes(t));
66
+ }
67
+ return {
68
+ plugin,
69
+ coversLocation,
70
+ supportsCategories,
71
+ supportsTemporalTypes,
72
+ };
73
+ });
74
+ }
75
+ /**
76
+ * Get plugins that cover a specific location (regardless of category/temporal filters).
77
+ *
78
+ * @param plugins - Available plugins
79
+ * @param location - The location to check
80
+ * @returns Plugins that cover the location
81
+ */
82
+ getPluginsForLocation(plugins, location) {
83
+ return plugins.filter((plugin) => plugin.coversLocation(location));
84
+ }
85
+ /**
86
+ * Get plugins that support specific categories.
87
+ *
88
+ * @param plugins - Available plugins
89
+ * @param categories - Categories to filter by
90
+ * @returns Plugins that support at least one of the specified categories
91
+ */
92
+ getPluginsForCategories(plugins, categories) {
93
+ if (categories.length === 0) {
94
+ return plugins;
95
+ }
96
+ return plugins.filter((plugin) => {
97
+ const supported = plugin.metadata.supportedCategories;
98
+ return categories.some((c) => supported.includes(c));
99
+ });
100
+ }
101
+ /**
102
+ * Get global plugins (plugins that cover all locations).
103
+ *
104
+ * @param plugins - Available plugins
105
+ * @returns Plugins with global coverage
106
+ */
107
+ getGlobalPlugins(plugins) {
108
+ return plugins.filter((plugin) => plugin.metadata.coverage.type === 'global');
109
+ }
110
+ /**
111
+ * Get regional plugins (plugins that cover specific geographic areas).
112
+ *
113
+ * @param plugins - Available plugins
114
+ * @returns Plugins with regional coverage
115
+ */
116
+ getRegionalPlugins(plugins) {
117
+ return plugins.filter((plugin) => plugin.metadata.coverage.type === 'regional');
118
+ }
119
+ }
120
+ exports.PluginResolver = PluginResolver;
121
+ //# sourceMappingURL=plugin-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-resolver.js","sourceRoot":"","sources":["../../../src/core/plugin-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveTimeRangePreset = exports.resolveTimeRange = void 0;
4
+ exports.getDefaultTimeRangePreset = getDefaultTimeRangePreset;
5
+ exports.getDefaultTimeRange = getDefaultTimeRange;
6
+ exports.normalizeTimeRange = normalizeTimeRange;
7
+ exports.getTimeRangeDuration = getTimeRangeDuration;
8
+ exports.isTimeRangeInPast = isTimeRangeInPast;
9
+ exports.isTimeRangeInFuture = isTimeRangeInFuture;
10
+ exports.isTimeRangeCurrent = isTimeRangeCurrent;
11
+ const utils_1 = require("../utils");
12
+ Object.defineProperty(exports, "resolveTimeRangePreset", { enumerable: true, get: function () { return utils_1.resolveTimeRangePreset; } });
13
+ /**
14
+ * Re-export time range utilities for use in core module.
15
+ */
16
+ exports.resolveTimeRange = utils_1.resolveTimeRange;
17
+ /**
18
+ * Get the default time range preset.
19
+ */
20
+ function getDefaultTimeRangePreset() {
21
+ return 'next-24h';
22
+ }
23
+ /**
24
+ * Get the default resolved time range.
25
+ */
26
+ function getDefaultTimeRange() {
27
+ return (0, utils_1.resolveTimeRangePreset)(getDefaultTimeRangePreset(), new Date());
28
+ }
29
+ /**
30
+ * Normalize a time range input to an explicit TimeRange.
31
+ *
32
+ * @param input - Time range input (preset or explicit)
33
+ * @param defaultPreset - Default preset to use if input is undefined
34
+ * @returns Normalized TimeRange
35
+ */
36
+ function normalizeTimeRange(input, defaultPreset = 'next-24h') {
37
+ if (!input) {
38
+ return (0, utils_1.resolveTimeRangePreset)(defaultPreset, new Date());
39
+ }
40
+ return (0, utils_1.resolveTimeRange)(input, new Date());
41
+ }
42
+ /**
43
+ * Get the duration of a time range in milliseconds.
44
+ */
45
+ function getTimeRangeDuration(range) {
46
+ return new Date(range.end).getTime() - new Date(range.start).getTime();
47
+ }
48
+ /**
49
+ * Check if a time range is in the past.
50
+ */
51
+ function isTimeRangeInPast(range) {
52
+ return new Date(range.end).getTime() < Date.now();
53
+ }
54
+ /**
55
+ * Check if a time range is in the future.
56
+ */
57
+ function isTimeRangeInFuture(range) {
58
+ return new Date(range.start).getTime() > Date.now();
59
+ }
60
+ /**
61
+ * Check if a time range spans the current time.
62
+ */
63
+ function isTimeRangeCurrent(range) {
64
+ const now = Date.now();
65
+ return new Date(range.start).getTime() <= now && new Date(range.end).getTime() >= now;
66
+ }
67
+ //# sourceMappingURL=time-range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-range.js","sourceRoot":"","sources":["../../../src/core/time-range.ts"],"names":[],"mappings":";;;AAYA,8DAEC;AAKD,kDAEC;AASD,gDASC;AAKD,oDAEC;AAKD,8CAEC;AAKD,kDAEC;AAKD,gDAGC;AAnED,oCAA4F;AAMnF,uGAN0C,8BAAsB,OAM1C;AAJ/B;;GAEG;AACU,QAAA,gBAAgB,GAAG,wBAAoB,CAAC;AAGrD;;GAEG;AACH,SAAgB,yBAAyB;IACvC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB;IACjC,OAAO,IAAA,8BAAsB,EAAC,yBAAyB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAChC,KAAsB,EACtB,gBAAiC,UAAU;IAE3C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAA,8BAAsB,EAAC,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,IAAA,wBAAoB,EAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,KAAgB;IACnD,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;AACzE,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,KAAgB;IAChD,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,KAAgB;IAClD,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,KAAgB;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC;AACxF,CAAC"}