@ultracart/bq-skill 0.1.2

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 (303) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +952 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +42 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/alarm.d.ts +3 -0
  8. package/dist/commands/alarm.d.ts.map +1 -0
  9. package/dist/commands/alarm.js +146 -0
  10. package/dist/commands/alarm.js.map +1 -0
  11. package/dist/commands/config.d.ts +3 -0
  12. package/dist/commands/config.d.ts.map +1 -0
  13. package/dist/commands/config.js +749 -0
  14. package/dist/commands/config.js.map +1 -0
  15. package/dist/commands/deck.d.ts +3 -0
  16. package/dist/commands/deck.d.ts.map +1 -0
  17. package/dist/commands/deck.js +567 -0
  18. package/dist/commands/deck.js.map +1 -0
  19. package/dist/commands/dry-run.d.ts +3 -0
  20. package/dist/commands/dry-run.d.ts.map +1 -0
  21. package/dist/commands/dry-run.js +105 -0
  22. package/dist/commands/dry-run.js.map +1 -0
  23. package/dist/commands/history.d.ts +3 -0
  24. package/dist/commands/history.d.ts.map +1 -0
  25. package/dist/commands/history.js +127 -0
  26. package/dist/commands/history.js.map +1 -0
  27. package/dist/commands/init.d.ts +3 -0
  28. package/dist/commands/init.d.ts.map +1 -0
  29. package/dist/commands/init.js +302 -0
  30. package/dist/commands/init.js.map +1 -0
  31. package/dist/commands/install-skill.d.ts +3 -0
  32. package/dist/commands/install-skill.d.ts.map +1 -0
  33. package/dist/commands/install-skill.js +132 -0
  34. package/dist/commands/install-skill.js.map +1 -0
  35. package/dist/commands/list.d.ts +3 -0
  36. package/dist/commands/list.d.ts.map +1 -0
  37. package/dist/commands/list.js +89 -0
  38. package/dist/commands/list.js.map +1 -0
  39. package/dist/commands/query.d.ts +3 -0
  40. package/dist/commands/query.d.ts.map +1 -0
  41. package/dist/commands/query.js +152 -0
  42. package/dist/commands/query.js.map +1 -0
  43. package/dist/commands/render.d.ts +3 -0
  44. package/dist/commands/render.d.ts.map +1 -0
  45. package/dist/commands/render.js +107 -0
  46. package/dist/commands/render.js.map +1 -0
  47. package/dist/commands/run-all.d.ts +3 -0
  48. package/dist/commands/run-all.d.ts.map +1 -0
  49. package/dist/commands/run-all.js +285 -0
  50. package/dist/commands/run-all.js.map +1 -0
  51. package/dist/commands/run.d.ts +3 -0
  52. package/dist/commands/run.d.ts.map +1 -0
  53. package/dist/commands/run.js +321 -0
  54. package/dist/commands/run.js.map +1 -0
  55. package/dist/commands/schema.d.ts +3 -0
  56. package/dist/commands/schema.d.ts.map +1 -0
  57. package/dist/commands/schema.js +271 -0
  58. package/dist/commands/schema.js.map +1 -0
  59. package/dist/commands/validate.d.ts +3 -0
  60. package/dist/commands/validate.d.ts.map +1 -0
  61. package/dist/commands/validate.js +109 -0
  62. package/dist/commands/validate.js.map +1 -0
  63. package/dist/lib/alarm-notify.d.ts +16 -0
  64. package/dist/lib/alarm-notify.d.ts.map +1 -0
  65. package/dist/lib/alarm-notify.js +312 -0
  66. package/dist/lib/alarm-notify.js.map +1 -0
  67. package/dist/lib/alarm-state.d.ts +26 -0
  68. package/dist/lib/alarm-state.d.ts.map +1 -0
  69. package/dist/lib/alarm-state.js +118 -0
  70. package/dist/lib/alarm-state.js.map +1 -0
  71. package/dist/lib/alarm.d.ts +28 -0
  72. package/dist/lib/alarm.d.ts.map +1 -0
  73. package/dist/lib/alarm.js +215 -0
  74. package/dist/lib/alarm.js.map +1 -0
  75. package/dist/lib/analysis.d.ts +16 -0
  76. package/dist/lib/analysis.d.ts.map +1 -0
  77. package/dist/lib/analysis.js +134 -0
  78. package/dist/lib/analysis.js.map +1 -0
  79. package/dist/lib/bigquery.d.ts +55 -0
  80. package/dist/lib/bigquery.d.ts.map +1 -0
  81. package/dist/lib/bigquery.js +321 -0
  82. package/dist/lib/bigquery.js.map +1 -0
  83. package/dist/lib/config-writer.d.ts +3 -0
  84. package/dist/lib/config-writer.d.ts.map +1 -0
  85. package/dist/lib/config-writer.js +60 -0
  86. package/dist/lib/config-writer.js.map +1 -0
  87. package/dist/lib/config.d.ts +63 -0
  88. package/dist/lib/config.d.ts.map +1 -0
  89. package/dist/lib/config.js +151 -0
  90. package/dist/lib/config.js.map +1 -0
  91. package/dist/lib/dashboard.d.ts +3 -0
  92. package/dist/lib/dashboard.d.ts.map +1 -0
  93. package/dist/lib/dashboard.js +468 -0
  94. package/dist/lib/dashboard.js.map +1 -0
  95. package/dist/lib/deck.d.ts +58 -0
  96. package/dist/lib/deck.d.ts.map +1 -0
  97. package/dist/lib/deck.js +232 -0
  98. package/dist/lib/deck.js.map +1 -0
  99. package/dist/lib/deliver-email.d.ts +14 -0
  100. package/dist/lib/deliver-email.d.ts.map +1 -0
  101. package/dist/lib/deliver-email.js +360 -0
  102. package/dist/lib/deliver-email.js.map +1 -0
  103. package/dist/lib/deliver-slack.d.ts +6 -0
  104. package/dist/lib/deliver-slack.d.ts.map +1 -0
  105. package/dist/lib/deliver-slack.js +73 -0
  106. package/dist/lib/deliver-slack.js.map +1 -0
  107. package/dist/lib/deliver.d.ts +10 -0
  108. package/dist/lib/deliver.d.ts.map +1 -0
  109. package/dist/lib/deliver.js +95 -0
  110. package/dist/lib/deliver.js.map +1 -0
  111. package/dist/lib/llm/anthropic.d.ts +7 -0
  112. package/dist/lib/llm/anthropic.d.ts.map +1 -0
  113. package/dist/lib/llm/anthropic.js +69 -0
  114. package/dist/lib/llm/anthropic.js.map +1 -0
  115. package/dist/lib/llm/bedrock.d.ts +7 -0
  116. package/dist/lib/llm/bedrock.d.ts.map +1 -0
  117. package/dist/lib/llm/bedrock.js +67 -0
  118. package/dist/lib/llm/bedrock.js.map +1 -0
  119. package/dist/lib/llm/gemini.d.ts +7 -0
  120. package/dist/lib/llm/gemini.d.ts.map +1 -0
  121. package/dist/lib/llm/gemini.js +67 -0
  122. package/dist/lib/llm/gemini.js.map +1 -0
  123. package/dist/lib/llm/index.d.ts +5 -0
  124. package/dist/lib/llm/index.d.ts.map +1 -0
  125. package/dist/lib/llm/index.js +61 -0
  126. package/dist/lib/llm/index.js.map +1 -0
  127. package/dist/lib/llm/models.d.ts +5 -0
  128. package/dist/lib/llm/models.d.ts.map +1 -0
  129. package/dist/lib/llm/models.js +33 -0
  130. package/dist/lib/llm/models.js.map +1 -0
  131. package/dist/lib/llm/openai.d.ts +8 -0
  132. package/dist/lib/llm/openai.d.ts.map +1 -0
  133. package/dist/lib/llm/openai.js +48 -0
  134. package/dist/lib/llm/openai.js.map +1 -0
  135. package/dist/lib/llm/provider.d.ts +28 -0
  136. package/dist/lib/llm/provider.d.ts.map +1 -0
  137. package/dist/lib/llm/provider.js +3 -0
  138. package/dist/lib/llm/provider.js.map +1 -0
  139. package/dist/lib/manifest.d.ts +95 -0
  140. package/dist/lib/manifest.d.ts.map +1 -0
  141. package/dist/lib/manifest.js +105 -0
  142. package/dist/lib/manifest.js.map +1 -0
  143. package/dist/lib/params.d.ts +27 -0
  144. package/dist/lib/params.d.ts.map +1 -0
  145. package/dist/lib/params.js +192 -0
  146. package/dist/lib/params.js.map +1 -0
  147. package/dist/lib/pdf.d.ts +8 -0
  148. package/dist/lib/pdf.d.ts.map +1 -0
  149. package/dist/lib/pdf.js +86 -0
  150. package/dist/lib/pdf.js.map +1 -0
  151. package/dist/lib/renderer.d.ts +17 -0
  152. package/dist/lib/renderer.d.ts.map +1 -0
  153. package/dist/lib/renderer.js +166 -0
  154. package/dist/lib/renderer.js.map +1 -0
  155. package/dist/lib/schema-filter.d.ts +3 -0
  156. package/dist/lib/schema-filter.d.ts.map +1 -0
  157. package/dist/lib/schema-filter.js +49 -0
  158. package/dist/lib/schema-filter.js.map +1 -0
  159. package/dist/lib/template.d.ts +4 -0
  160. package/dist/lib/template.d.ts.map +1 -0
  161. package/dist/lib/template.js +37 -0
  162. package/dist/lib/template.js.map +1 -0
  163. package/dist/lib/validator.d.ts +8 -0
  164. package/dist/lib/validator.d.ts.map +1 -0
  165. package/dist/lib/validator.js +88 -0
  166. package/dist/lib/validator.js.map +1 -0
  167. package/package.json +59 -0
  168. package/schemas/deck.schema.json +122 -0
  169. package/schemas/report-manifest.schema.json +309 -0
  170. package/schemas/tables/README.md +45 -0
  171. package/schemas/tables/ultracart_dw/uc_affiliate_clicks.json +186 -0
  172. package/schemas/tables/ultracart_dw/uc_affiliate_commission_groups.json +317 -0
  173. package/schemas/tables/ultracart_dw/uc_affiliate_ledgers.json +404 -0
  174. package/schemas/tables/ultracart_dw/uc_affiliate_network_pixel_postback_logs.json +166 -0
  175. package/schemas/tables/ultracart_dw/uc_affiliate_network_pixels.json +106 -0
  176. package/schemas/tables/ultracart_dw/uc_affiliate_payments.json +204 -0
  177. package/schemas/tables/ultracart_dw/uc_affiliate_postback_logs.json +90 -0
  178. package/schemas/tables/ultracart_dw/uc_affiliates.json +425 -0
  179. package/schemas/tables/ultracart_dw/uc_auto_orders.json +13848 -0
  180. package/schemas/tables/ultracart_dw/uc_cart_abandons.json +3971 -0
  181. package/schemas/tables/ultracart_dw/uc_conversation_pbx_calls.json +374 -0
  182. package/schemas/tables/ultracart_dw/uc_conversations.json +374 -0
  183. package/schemas/tables/ultracart_dw/uc_coupons.json +1893 -0
  184. package/schemas/tables/ultracart_dw/uc_customers.json +11886 -0
  185. package/schemas/tables/ultracart_dw/uc_fraud_rules.json +239 -0
  186. package/schemas/tables/ultracart_dw/uc_gift_certificates.json +135 -0
  187. package/schemas/tables/ultracart_dw/uc_item_inventory_history.json +79 -0
  188. package/schemas/tables/ultracart_dw/uc_items.json +4437 -0
  189. package/schemas/tables/ultracart_dw/uc_orders.json +6629 -0
  190. package/schemas/tables/ultracart_dw/uc_rotating_transaction_gateway_history.json +271 -0
  191. package/schemas/tables/ultracart_dw/uc_rotating_transaction_gateways.json +416 -0
  192. package/schemas/tables/ultracart_dw/uc_shipping_methods.json +1372 -0
  193. package/schemas/tables/ultracart_dw/uc_storefront_customers.json +261 -0
  194. package/schemas/tables/ultracart_dw/uc_storefront_experiments.json +386 -0
  195. package/schemas/tables/ultracart_dw/uc_storefront_pages.json +513 -0
  196. package/schemas/tables/ultracart_dw/uc_storefront_upsell_offer_events.json +338 -0
  197. package/schemas/tables/ultracart_dw/uc_storefront_upsell_offers.json +431 -0
  198. package/schemas/tables/ultracart_dw/uc_storefront_upsell_paths.json +163 -0
  199. package/schemas/tables/ultracart_dw/uc_storefronts.json +62 -0
  200. package/schemas/tables/ultracart_dw/uc_surveys.json +238 -0
  201. package/schemas/tables/ultracart_dw/uc_workflow_tasks.json +377 -0
  202. package/schemas/tables/ultracart_dw/uc_zoho_desk_tickets.json +1184 -0
  203. package/schemas/tables/ultracart_dw_high/uc_affiliate_clicks.json +186 -0
  204. package/schemas/tables/ultracart_dw_high/uc_affiliate_commission_groups.json +317 -0
  205. package/schemas/tables/ultracart_dw_high/uc_affiliate_ledgers.json +404 -0
  206. package/schemas/tables/ultracart_dw_high/uc_affiliate_network_pixel_postback_logs.json +166 -0
  207. package/schemas/tables/ultracart_dw_high/uc_affiliate_network_pixels.json +106 -0
  208. package/schemas/tables/ultracart_dw_high/uc_affiliate_payments.json +204 -0
  209. package/schemas/tables/ultracart_dw_high/uc_affiliate_postback_logs.json +90 -0
  210. package/schemas/tables/ultracart_dw_high/uc_affiliates.json +425 -0
  211. package/schemas/tables/ultracart_dw_high/uc_auto_orders.json +14332 -0
  212. package/schemas/tables/ultracart_dw_high/uc_cart_abandons.json +4245 -0
  213. package/schemas/tables/ultracart_dw_high/uc_conversation_pbx_calls.json +415 -0
  214. package/schemas/tables/ultracart_dw_high/uc_conversations.json +415 -0
  215. package/schemas/tables/ultracart_dw_high/uc_coupons.json +1893 -0
  216. package/schemas/tables/ultracart_dw_high/uc_customers.json +12250 -0
  217. package/schemas/tables/ultracart_dw_high/uc_fraud_rules.json +239 -0
  218. package/schemas/tables/ultracart_dw_high/uc_gift_certificates.json +135 -0
  219. package/schemas/tables/ultracart_dw_high/uc_item_inventory_history.json +79 -0
  220. package/schemas/tables/ultracart_dw_high/uc_items.json +4437 -0
  221. package/schemas/tables/ultracart_dw_high/uc_orders.json +6871 -0
  222. package/schemas/tables/ultracart_dw_high/uc_rotating_transaction_gateway_history.json +271 -0
  223. package/schemas/tables/ultracart_dw_high/uc_rotating_transaction_gateways.json +416 -0
  224. package/schemas/tables/ultracart_dw_high/uc_shipping_methods.json +1372 -0
  225. package/schemas/tables/ultracart_dw_high/uc_storefront_customers.json +261 -0
  226. package/schemas/tables/ultracart_dw_high/uc_storefront_experiments.json +386 -0
  227. package/schemas/tables/ultracart_dw_high/uc_storefront_pages.json +513 -0
  228. package/schemas/tables/ultracart_dw_high/uc_storefront_upsell_offer_events.json +338 -0
  229. package/schemas/tables/ultracart_dw_high/uc_storefront_upsell_offers.json +431 -0
  230. package/schemas/tables/ultracart_dw_high/uc_storefront_upsell_paths.json +163 -0
  231. package/schemas/tables/ultracart_dw_high/uc_storefronts.json +62 -0
  232. package/schemas/tables/ultracart_dw_high/uc_surveys.json +269 -0
  233. package/schemas/tables/ultracart_dw_high/uc_workflow_tasks.json +377 -0
  234. package/schemas/tables/ultracart_dw_high/uc_zoho_desk_tickets.json +1330 -0
  235. package/schemas/tables/ultracart_dw_low/uc_affiliate_clicks.json +186 -0
  236. package/schemas/tables/ultracart_dw_low/uc_affiliate_commission_groups.json +317 -0
  237. package/schemas/tables/ultracart_dw_low/uc_affiliate_ledgers.json +404 -0
  238. package/schemas/tables/ultracart_dw_low/uc_affiliate_network_pixel_postback_logs.json +166 -0
  239. package/schemas/tables/ultracart_dw_low/uc_affiliate_network_pixels.json +106 -0
  240. package/schemas/tables/ultracart_dw_low/uc_affiliate_payments.json +204 -0
  241. package/schemas/tables/ultracart_dw_low/uc_affiliate_postback_logs.json +90 -0
  242. package/schemas/tables/ultracart_dw_low/uc_affiliates.json +425 -0
  243. package/schemas/tables/ultracart_dw_low/uc_auto_orders.json +13868 -0
  244. package/schemas/tables/ultracart_dw_low/uc_cart_abandons.json +3971 -0
  245. package/schemas/tables/ultracart_dw_low/uc_conversation_pbx_calls.json +374 -0
  246. package/schemas/tables/ultracart_dw_low/uc_conversations.json +374 -0
  247. package/schemas/tables/ultracart_dw_low/uc_coupons.json +1893 -0
  248. package/schemas/tables/ultracart_dw_low/uc_customers.json +11900 -0
  249. package/schemas/tables/ultracart_dw_low/uc_fraud_rules.json +239 -0
  250. package/schemas/tables/ultracart_dw_low/uc_gift_certificates.json +135 -0
  251. package/schemas/tables/ultracart_dw_low/uc_item_inventory_history.json +79 -0
  252. package/schemas/tables/ultracart_dw_low/uc_items.json +4437 -0
  253. package/schemas/tables/ultracart_dw_low/uc_orders.json +6639 -0
  254. package/schemas/tables/ultracart_dw_low/uc_rotating_transaction_gateway_history.json +271 -0
  255. package/schemas/tables/ultracart_dw_low/uc_rotating_transaction_gateways.json +416 -0
  256. package/schemas/tables/ultracart_dw_low/uc_shipping_methods.json +1372 -0
  257. package/schemas/tables/ultracart_dw_low/uc_storefront_customers.json +261 -0
  258. package/schemas/tables/ultracart_dw_low/uc_storefront_experiments.json +386 -0
  259. package/schemas/tables/ultracart_dw_low/uc_storefront_pages.json +513 -0
  260. package/schemas/tables/ultracart_dw_low/uc_storefront_upsell_offer_events.json +338 -0
  261. package/schemas/tables/ultracart_dw_low/uc_storefront_upsell_offers.json +431 -0
  262. package/schemas/tables/ultracart_dw_low/uc_storefront_upsell_paths.json +163 -0
  263. package/schemas/tables/ultracart_dw_low/uc_storefronts.json +62 -0
  264. package/schemas/tables/ultracart_dw_low/uc_surveys.json +238 -0
  265. package/schemas/tables/ultracart_dw_low/uc_workflow_tasks.json +377 -0
  266. package/schemas/tables/ultracart_dw_low/uc_zoho_desk_tickets.json +1184 -0
  267. package/schemas/tables/ultracart_dw_medium/uc_affiliate_clicks.json +186 -0
  268. package/schemas/tables/ultracart_dw_medium/uc_affiliate_commission_groups.json +317 -0
  269. package/schemas/tables/ultracart_dw_medium/uc_affiliate_ledgers.json +404 -0
  270. package/schemas/tables/ultracart_dw_medium/uc_affiliate_network_pixel_postback_logs.json +166 -0
  271. package/schemas/tables/ultracart_dw_medium/uc_affiliate_network_pixels.json +106 -0
  272. package/schemas/tables/ultracart_dw_medium/uc_affiliate_payments.json +204 -0
  273. package/schemas/tables/ultracart_dw_medium/uc_affiliate_postback_logs.json +90 -0
  274. package/schemas/tables/ultracart_dw_medium/uc_affiliates.json +425 -0
  275. package/schemas/tables/ultracart_dw_medium/uc_auto_orders.json +14320 -0
  276. package/schemas/tables/ultracart_dw_medium/uc_cart_abandons.json +4245 -0
  277. package/schemas/tables/ultracart_dw_medium/uc_conversation_pbx_calls.json +415 -0
  278. package/schemas/tables/ultracart_dw_medium/uc_conversations.json +415 -0
  279. package/schemas/tables/ultracart_dw_medium/uc_coupons.json +1893 -0
  280. package/schemas/tables/ultracart_dw_medium/uc_customers.json +12250 -0
  281. package/schemas/tables/ultracart_dw_medium/uc_fraud_rules.json +239 -0
  282. package/schemas/tables/ultracart_dw_medium/uc_gift_certificates.json +135 -0
  283. package/schemas/tables/ultracart_dw_medium/uc_item_inventory_history.json +79 -0
  284. package/schemas/tables/ultracart_dw_medium/uc_items.json +4437 -0
  285. package/schemas/tables/ultracart_dw_medium/uc_orders.json +6865 -0
  286. package/schemas/tables/ultracart_dw_medium/uc_rotating_transaction_gateway_history.json +271 -0
  287. package/schemas/tables/ultracart_dw_medium/uc_rotating_transaction_gateways.json +416 -0
  288. package/schemas/tables/ultracart_dw_medium/uc_shipping_methods.json +1372 -0
  289. package/schemas/tables/ultracart_dw_medium/uc_storefront_customers.json +261 -0
  290. package/schemas/tables/ultracart_dw_medium/uc_storefront_experiments.json +386 -0
  291. package/schemas/tables/ultracart_dw_medium/uc_storefront_pages.json +513 -0
  292. package/schemas/tables/ultracart_dw_medium/uc_storefront_upsell_offer_events.json +338 -0
  293. package/schemas/tables/ultracart_dw_medium/uc_storefront_upsell_offers.json +431 -0
  294. package/schemas/tables/ultracart_dw_medium/uc_storefront_upsell_paths.json +163 -0
  295. package/schemas/tables/ultracart_dw_medium/uc_storefronts.json +62 -0
  296. package/schemas/tables/ultracart_dw_medium/uc_surveys.json +269 -0
  297. package/schemas/tables/ultracart_dw_medium/uc_workflow_tasks.json +377 -0
  298. package/schemas/tables/ultracart_dw_medium/uc_zoho_desk_tickets.json +1330 -0
  299. package/schemas/tables/ultracart_dw_streaming/uc_analytics_session_streaming.json +2444 -0
  300. package/schemas/tables/ultracart_dw_streaming/uc_screen_recording_streaming.json +509 -0
  301. package/schemas/ultracart-bq-config.schema.json +140 -0
  302. package/skill/skill.md +1228 -0
  303. package/templates/render.html +73 -0
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.evaluateAlarms = evaluateAlarms;
4
+ exports.aggregateMetric = aggregateMetric;
5
+ exports.parseCooldown = parseCooldown;
6
+ exports.extractAlarmMetrics = extractAlarmMetrics;
7
+ /**
8
+ * Evaluate all alarms for a report against the current data.json rows.
9
+ */
10
+ function evaluateAlarms(alarms, data, alarmState) {
11
+ const results = [];
12
+ for (const alarm of alarms) {
13
+ const result = evaluateAlarm(alarm, data, alarmState);
14
+ results.push(result);
15
+ }
16
+ return results;
17
+ }
18
+ function evaluateAlarm(alarm, data, alarmState) {
19
+ switch (alarm.type) {
20
+ case 'missing_data':
21
+ return evaluateMissingData(alarm, data, alarmState);
22
+ case 'threshold':
23
+ return evaluateThreshold(alarm, data, alarmState);
24
+ case 'pct_change':
25
+ return evaluatePctChange(alarm, data, alarmState);
26
+ default:
27
+ return { alarm, triggered: false, reason: `Unknown alarm type: ${alarm.type}`, suppressed: false };
28
+ }
29
+ }
30
+ function evaluateMissingData(alarm, data, alarmState) {
31
+ const triggered = data.length === 0;
32
+ const suppressed = triggered && isSuppressed(alarm, alarmState);
33
+ return {
34
+ alarm,
35
+ triggered,
36
+ reason: triggered ? 'Query returned zero rows' : `Query returned ${data.length} rows`,
37
+ suppressed,
38
+ };
39
+ }
40
+ function evaluateThreshold(alarm, data, alarmState) {
41
+ if (!alarm.metric || alarm.operator === undefined || alarm.value === undefined) {
42
+ return { alarm, triggered: false, reason: 'Alarm missing required fields: metric, operator, value', suppressed: false };
43
+ }
44
+ if (data.length === 0) {
45
+ return { alarm, triggered: false, reason: 'No data to evaluate', suppressed: false };
46
+ }
47
+ const aggregate = alarm.aggregate || 'sum';
48
+ const currentValue = aggregateMetric(data, alarm.metric, aggregate);
49
+ if (currentValue === null) {
50
+ return { alarm, triggered: false, reason: `Metric "${alarm.metric}" not found or not numeric`, suppressed: false };
51
+ }
52
+ const triggered = compareValues(currentValue, alarm.operator, alarm.value);
53
+ const suppressed = triggered && isSuppressed(alarm, alarmState);
54
+ return {
55
+ alarm,
56
+ triggered,
57
+ currentValue,
58
+ reason: triggered
59
+ ? `${alarm.metric} (${aggregate}) = ${currentValue} ${alarm.operator} ${alarm.value}`
60
+ : `${alarm.metric} (${aggregate}) = ${currentValue}, threshold ${alarm.operator} ${alarm.value} not met`,
61
+ suppressed,
62
+ };
63
+ }
64
+ function evaluatePctChange(alarm, data, alarmState) {
65
+ if (!alarm.metric || alarm.operator === undefined || alarm.value === undefined) {
66
+ return { alarm, triggered: false, reason: 'Alarm missing required fields: metric, operator, value', suppressed: false };
67
+ }
68
+ if (data.length === 0) {
69
+ return { alarm, triggered: false, reason: 'No data to evaluate', suppressed: false };
70
+ }
71
+ const aggregate = alarm.aggregate || 'sum';
72
+ const currentValue = aggregateMetric(data, alarm.metric, aggregate);
73
+ if (currentValue === null) {
74
+ return { alarm, triggered: false, reason: `Metric "${alarm.metric}" not found or not numeric`, suppressed: false };
75
+ }
76
+ // Find previous run's metric value
77
+ const previousEntry = getPreviousMetricEntry(alarmState, alarm.metric);
78
+ if (!previousEntry) {
79
+ return {
80
+ alarm,
81
+ triggered: false,
82
+ currentValue,
83
+ reason: `No previous run data for "${alarm.metric}" — first run, skipping percent change check`,
84
+ suppressed: false,
85
+ };
86
+ }
87
+ const previousValue = previousEntry.metrics[alarm.metric];
88
+ if (previousValue === 0) {
89
+ // Avoid division by zero
90
+ const triggered = currentValue !== 0;
91
+ const suppressed = triggered && isSuppressed(alarm, alarmState);
92
+ return {
93
+ alarm,
94
+ triggered,
95
+ currentValue,
96
+ previousValue,
97
+ reason: triggered
98
+ ? `Previous ${alarm.metric} was 0, current is ${currentValue} — infinite change`
99
+ : `Both previous and current ${alarm.metric} are 0`,
100
+ suppressed,
101
+ };
102
+ }
103
+ const pctChange = ((currentValue - previousValue) / Math.abs(previousValue)) * 100;
104
+ const triggered = compareValues(pctChange, alarm.operator, alarm.value);
105
+ const suppressed = triggered && isSuppressed(alarm, alarmState);
106
+ return {
107
+ alarm,
108
+ triggered,
109
+ currentValue,
110
+ previousValue,
111
+ pctChange,
112
+ reason: triggered
113
+ ? `${alarm.metric} changed ${pctChange >= 0 ? '+' : ''}${pctChange.toFixed(1)}% (${previousValue} → ${currentValue}), threshold ${alarm.operator} ${alarm.value}%`
114
+ : `${alarm.metric} changed ${pctChange >= 0 ? '+' : ''}${pctChange.toFixed(1)}% (${previousValue} → ${currentValue}), threshold ${alarm.operator} ${alarm.value}% not met`,
115
+ suppressed,
116
+ };
117
+ }
118
+ /**
119
+ * Aggregate a numeric column from the data rows.
120
+ */
121
+ function aggregateMetric(data, metric, aggregate) {
122
+ const values = [];
123
+ for (const row of data) {
124
+ const raw = row[metric];
125
+ if (raw === null || raw === undefined)
126
+ continue;
127
+ const num = typeof raw === 'number' ? raw : parseFloat(String(raw));
128
+ if (!isNaN(num))
129
+ values.push(num);
130
+ }
131
+ if (values.length === 0)
132
+ return null;
133
+ switch (aggregate) {
134
+ case 'sum':
135
+ return values.reduce((a, b) => a + b, 0);
136
+ case 'avg':
137
+ return values.reduce((a, b) => a + b, 0) / values.length;
138
+ case 'min':
139
+ return Math.min(...values);
140
+ case 'max':
141
+ return Math.max(...values);
142
+ case 'first':
143
+ return values[0];
144
+ case 'last':
145
+ return values[values.length - 1];
146
+ default:
147
+ return null;
148
+ }
149
+ }
150
+ function compareValues(actual, operator, threshold) {
151
+ switch (operator) {
152
+ case '<': return actual < threshold;
153
+ case '>': return actual > threshold;
154
+ case '<=': return actual <= threshold;
155
+ case '>=': return actual >= threshold;
156
+ case '==': return actual === threshold;
157
+ case '!=': return actual !== threshold;
158
+ default: return false;
159
+ }
160
+ }
161
+ function getPreviousMetricEntry(alarmState, metric) {
162
+ if (!alarmState.metric_history || alarmState.metric_history.length === 0)
163
+ return null;
164
+ // Walk backwards to find the most recent entry that has this metric
165
+ for (let i = alarmState.metric_history.length - 1; i >= 0; i--) {
166
+ const entry = alarmState.metric_history[i];
167
+ if (entry.metrics[metric] !== undefined)
168
+ return entry;
169
+ }
170
+ return null;
171
+ }
172
+ /**
173
+ * Parse a cooldown duration string like "24h", "7d", "1h" into milliseconds.
174
+ */
175
+ function parseCooldown(cooldown) {
176
+ const match = cooldown.match(/^(\d+)(h|d|m)$/);
177
+ if (!match)
178
+ return 24 * 60 * 60 * 1000; // default 24h
179
+ const amount = parseInt(match[1], 10);
180
+ switch (match[2]) {
181
+ case 'h': return amount * 60 * 60 * 1000;
182
+ case 'd': return amount * 24 * 60 * 60 * 1000;
183
+ case 'm': return amount * 60 * 1000;
184
+ default: return 24 * 60 * 60 * 1000;
185
+ }
186
+ }
187
+ function isSuppressed(alarm, alarmState) {
188
+ const cooldown = alarm.cooldown || '24h';
189
+ if (cooldown === '0')
190
+ return false;
191
+ const suppression = alarmState.suppression?.[alarm.name];
192
+ if (!suppression)
193
+ return false;
194
+ const lastFired = new Date(suppression.last_fired).getTime();
195
+ const now = Date.now();
196
+ const cooldownMs = parseCooldown(cooldown);
197
+ return (now - lastFired) < cooldownMs;
198
+ }
199
+ /**
200
+ * Extract the metrics referenced by alarms from the current data.
201
+ */
202
+ function extractAlarmMetrics(alarms, data) {
203
+ const metrics = {};
204
+ for (const alarm of alarms) {
205
+ if (alarm.metric && alarm.type !== 'missing_data') {
206
+ const aggregate = alarm.aggregate || 'sum';
207
+ const value = aggregateMetric(data, alarm.metric, aggregate);
208
+ if (value !== null) {
209
+ metrics[alarm.metric] = value;
210
+ }
211
+ }
212
+ }
213
+ return metrics;
214
+ }
215
+ //# sourceMappingURL=alarm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm.js","sourceRoot":"","sources":["../../src/lib/alarm.ts"],"names":[],"mappings":";;AAgBA,wCAaC;AA0ID,0CAgCC;AAgCD,sCAWC;AAmBD,kDAiBC;AAzQD;;GAEG;AACH,SAAgB,cAAc,CAC5B,MAAyB,EACzB,IAA+B,EAC/B,UAAsB;IAEtB,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CACpB,KAAsB,EACtB,IAA+B,EAC/B,UAAsB;IAEtB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,cAAc;YACjB,OAAO,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACtD,KAAK,WAAW;YACd,OAAO,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACpD,KAAK,YAAY;YACf,OAAO,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACpD;YACE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,KAAK,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACvG,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAsB,EACtB,IAA+B,EAC/B,UAAsB;IAEtB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,SAAS,IAAI,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAEhE,OAAO;QACL,KAAK;QACL,SAAS;QACT,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,MAAM,OAAO;QACrF,UAAU;KACX,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,KAAsB,EACtB,IAA+B,EAC/B,UAAsB;IAEtB,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/E,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,wDAAwD,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAC1H,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACvF,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC;IAC3C,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEpE,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,KAAK,CAAC,MAAM,4BAA4B,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACrH,CAAC;IAED,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,SAAS,IAAI,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAEhE,OAAO;QACL,KAAK;QACL,SAAS;QACT,YAAY;QACZ,MAAM,EAAE,SAAS;YACf,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,OAAO,YAAY,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;YACrF,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,OAAO,YAAY,eAAe,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,UAAU;QAC1G,UAAU;KACX,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,KAAsB,EACtB,IAA+B,EAC/B,UAAsB;IAEtB,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/E,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,wDAAwD,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAC1H,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACvF,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC;IAC3C,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEpE,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,KAAK,CAAC,MAAM,4BAA4B,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACrH,CAAC;IAED,mCAAmC;IACnC,MAAM,aAAa,GAAG,sBAAsB,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACvE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;YACL,KAAK;YACL,SAAS,EAAE,KAAK;YAChB,YAAY;YACZ,MAAM,EAAE,6BAA6B,KAAK,CAAC,MAAM,8CAA8C;YAC/F,UAAU,EAAE,KAAK;SAClB,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;QACxB,yBAAyB;QACzB,MAAM,SAAS,GAAG,YAAY,KAAK,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,SAAS,IAAI,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAChE,OAAO;YACL,KAAK;YACL,SAAS;YACT,YAAY;YACZ,aAAa;YACb,MAAM,EAAE,SAAS;gBACf,CAAC,CAAC,YAAY,KAAK,CAAC,MAAM,sBAAsB,YAAY,oBAAoB;gBAChF,CAAC,CAAC,6BAA6B,KAAK,CAAC,MAAM,QAAQ;YACrD,UAAU;SACX,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,CAAC,YAAY,GAAG,aAAa,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,GAAG,GAAG,CAAC;IACnF,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACxE,MAAM,UAAU,GAAG,SAAS,IAAI,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAEhE,OAAO;QACL,KAAK;QACL,SAAS;QACT,YAAY;QACZ,aAAa;QACb,SAAS;QACT,MAAM,EAAE,SAAS;YACf,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,YAAY,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,aAAa,MAAM,YAAY,gBAAgB,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,GAAG;YAClK,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,YAAY,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,aAAa,MAAM,YAAY,gBAAgB,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,WAAW;QAC5K,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAC7B,IAA+B,EAC/B,MAAc,EACd,SAAyB;IAEzB,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;QACxB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;YAAE,SAAS;QAChD,MAAM,GAAG,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3C,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QAC3D,KAAK,KAAK;YACR,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QAC7B,KAAK,KAAK;YACR,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QAC7B,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnC;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,MAAc,EAAE,QAAuB,EAAE,SAAiB;IAC/E,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,GAAG,CAAC,CAAC,OAAO,MAAM,GAAG,SAAS,CAAC;QACpC,KAAK,GAAG,CAAC,CAAC,OAAO,MAAM,GAAG,SAAS,CAAC;QACpC,KAAK,IAAI,CAAC,CAAC,OAAO,MAAM,IAAI,SAAS,CAAC;QACtC,KAAK,IAAI,CAAC,CAAC,OAAO,MAAM,IAAI,SAAS,CAAC;QACtC,KAAK,IAAI,CAAC,CAAC,OAAO,MAAM,KAAK,SAAS,CAAC;QACvC,KAAK,IAAI,CAAC,CAAC,OAAO,MAAM,KAAK,SAAS,CAAC;QACvC,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC;IACxB,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAC7B,UAAsB,EACtB,MAAc;IAEd,IAAI,CAAC,UAAU,CAAC,cAAc,IAAI,UAAU,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtF,oEAAoE;IACpE,KAAK,IAAI,CAAC,GAAG,UAAU,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;IACxD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,QAAgB;IAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,cAAc;IAEtD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtC,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACjB,KAAK,GAAG,CAAC,CAAC,OAAO,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACzC,KAAK,GAAG,CAAC,CAAC,OAAO,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC9C,KAAK,GAAG,CAAC,CAAC,OAAO,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC;QACpC,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACtC,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAsB,EAAE,UAAsB;IAClE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC;IACzC,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IAEnC,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IAE/B,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;IAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAE3C,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,UAAU,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CACjC,MAAyB,EACzB,IAA+B;IAE/B,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAClD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC;YAC3C,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC7D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { LlmProvider } from './llm/provider';
2
+ export interface AnalysisOptions {
3
+ provider: LlmProvider;
4
+ analysisPromptPath: string;
5
+ dataJsonPath: string;
6
+ chartPngPath?: string;
7
+ outputPath: string;
8
+ model: string;
9
+ }
10
+ export declare function generateAnalysis(options: AnalysisOptions): Promise<string>;
11
+ /**
12
+ * Generate a default analysis prompt template when Claude Code creates a new report.
13
+ * This is a generic template — Claude Code should customize it based on the specific query/data.
14
+ */
15
+ export declare function getDefaultAnalysisPromptTemplate(reportName: string, sqlSummary: string, dataFields: string[]): string;
16
+ //# sourceMappingURL=analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../src/lib/analysis.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAA8B,MAAM,gBAAgB,CAAC;AAE9E,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAsDhF;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CA2CrH"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.generateAnalysis = generateAnalysis;
37
+ exports.getDefaultAnalysisPromptTemplate = getDefaultAnalysisPromptTemplate;
38
+ const fs = __importStar(require("fs"));
39
+ async function generateAnalysis(options) {
40
+ const analysisPrompt = fs.readFileSync(options.analysisPromptPath, 'utf-8');
41
+ const rawData = fs.readFileSync(options.dataJsonPath, 'utf-8');
42
+ // Normalize data to array
43
+ let dataStr;
44
+ try {
45
+ const parsed = JSON.parse(rawData);
46
+ dataStr = JSON.stringify(Array.isArray(parsed) ? parsed : parsed.rows || parsed, null, 2);
47
+ }
48
+ catch {
49
+ dataStr = rawData;
50
+ }
51
+ // Build user message content parts
52
+ const contentParts = [];
53
+ contentParts.push({
54
+ type: 'text',
55
+ text: `Here is the query result data (JSON):\n\n\`\`\`json\n${dataStr}\n\`\`\``,
56
+ });
57
+ // Include chart PNG if available
58
+ if (options.chartPngPath && fs.existsSync(options.chartPngPath)) {
59
+ const pngData = fs.readFileSync(options.chartPngPath);
60
+ contentParts.push({
61
+ type: 'image',
62
+ mediaType: 'image/png',
63
+ base64Data: pngData.toString('base64'),
64
+ });
65
+ contentParts.push({
66
+ type: 'text',
67
+ text: 'Above is the rendered chart visualization for this report.',
68
+ });
69
+ }
70
+ contentParts.push({
71
+ type: 'text',
72
+ text: 'Please generate the executive analysis based on the data and visualization provided.',
73
+ });
74
+ const messages = [
75
+ { role: 'system', content: analysisPrompt },
76
+ { role: 'user', content: contentParts },
77
+ ];
78
+ const analysisText = await options.provider.complete(messages, {
79
+ model: options.model,
80
+ maxTokens: 4096,
81
+ });
82
+ // Write to output file
83
+ fs.writeFileSync(options.outputPath, analysisText);
84
+ return analysisText;
85
+ }
86
+ /**
87
+ * Generate a default analysis prompt template when Claude Code creates a new report.
88
+ * This is a generic template — Claude Code should customize it based on the specific query/data.
89
+ */
90
+ function getDefaultAnalysisPromptTemplate(reportName, sqlSummary, dataFields) {
91
+ return `# ${reportName} — Analysis System Prompt
92
+
93
+ ## Overview
94
+ You are an expert analyst specializing in UltraCart e-commerce data. You will receive JSON data and a corresponding PNG visualization. Generate a comprehensive executive analysis.
95
+
96
+ ## Source Query Context
97
+ ${sqlSummary}
98
+
99
+ ## JSON Data Fields
100
+ ${dataFields.map((f) => `- **${f}**`).join('\n')}
101
+
102
+ ## Analysis Methodology
103
+
104
+ ### 1. Executive Summary
105
+ - 2-3 sentence overview of the key findings
106
+ - Lead with the most impactful insight
107
+
108
+ ### 2. Key Findings
109
+ - Top 3-5 findings supported by specific numbers from the data
110
+ - Include percentage comparisons where applicable
111
+ - Reference the visualization where relevant
112
+
113
+ ### 3. Trend & Pattern Analysis
114
+ - Identify notable trends, patterns, or anomalies
115
+ - Compare segments (if applicable)
116
+ - Note any concerning or encouraging patterns
117
+
118
+ ### 4. Alert Conditions
119
+ - Flag any metrics that appear unusual (sudden drops >30%, unexpected spikes, etc.)
120
+ - Note data quality issues if any (negative values, missing data, etc.)
121
+
122
+ ### 5. Actionable Recommendations
123
+ - 3-5 specific, actionable recommendations based on the data
124
+ - Prioritize by potential business impact
125
+ - Be specific — reference actual values from the data
126
+
127
+ ## Output Format
128
+ - Use markdown formatting
129
+ - Include specific numbers, percentages, and comparisons
130
+ - Keep the analysis concise but thorough (500-1000 words)
131
+ - Write for a business audience, not a technical one
132
+ `;
133
+ }
134
+ //# sourceMappingURL=analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../src/lib/analysis.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,4CAsDC;AAMD,4EA2CC;AApHD,uCAAyB;AAalB,KAAK,UAAU,gBAAgB,CAAC,OAAwB;IAC7D,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAE/D,0BAA0B;IAC1B,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,OAAO,CAAC;IACpB,CAAC;IAED,mCAAmC;IACnC,MAAM,YAAY,GAAqB,EAAE,CAAC;IAE1C,YAAY,CAAC,IAAI,CAAC;QAChB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,wDAAwD,OAAO,UAAU;KAChF,CAAC,CAAC;IAEH,iCAAiC;IACjC,IAAI,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAChE,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACtD,YAAY,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,OAAO;YACb,SAAS,EAAE,WAAW;YACtB,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;SACvC,CAAC,CAAC;QACH,YAAY,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,4DAA4D;SACnE,CAAC,CAAC;IACL,CAAC;IAED,YAAY,CAAC,IAAI,CAAC;QAChB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,sFAAsF;KAC7F,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAiB;QAC7B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE;QAC3C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE;KACxC,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE;QAC7D,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,uBAAuB;IACvB,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAEnD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,SAAgB,gCAAgC,CAAC,UAAkB,EAAE,UAAkB,EAAE,UAAoB;IAC3G,OAAO,KAAK,UAAU;;;;;;EAMtB,UAAU;;;EAGV,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgC/C,CAAC;AACF,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { ResolvedMerchantConfig } from './config';
2
+ export interface DatasetInfo {
3
+ dataset_id: string;
4
+ description: string;
5
+ }
6
+ export interface TableInfo {
7
+ table_name: string;
8
+ description: string;
9
+ }
10
+ export interface QueryParameter {
11
+ name: string;
12
+ type: 'DATE' | 'DATETIME' | 'INT64' | 'FLOAT64' | 'BOOL' | 'STRING';
13
+ value: string;
14
+ }
15
+ export interface QueryOptions {
16
+ sample?: number;
17
+ dryRun?: boolean;
18
+ maxBytes?: number;
19
+ force?: boolean;
20
+ }
21
+ export interface QueryResult {
22
+ rows: Record<string, unknown>[];
23
+ totalRows: number;
24
+ schema: Array<{
25
+ name: string;
26
+ type: string;
27
+ mode: string;
28
+ }>;
29
+ bytesProcessed: number;
30
+ }
31
+ export declare function getProject(config: ResolvedMerchantConfig): string;
32
+ export declare function getDatasets(config: ResolvedMerchantConfig): DatasetInfo[];
33
+ export declare function getTables(config: ResolvedMerchantConfig, datasetId: string): TableInfo[];
34
+ export declare function getTableSchema(config: ResolvedMerchantConfig, datasetId: string, tableName: string, options?: {
35
+ live?: boolean;
36
+ }): Promise<Array<{
37
+ name: string;
38
+ type: string;
39
+ mode: string;
40
+ description?: string;
41
+ fields?: unknown[];
42
+ }>>;
43
+ export declare function executeQuery(config: ResolvedMerchantConfig, sql: string, params?: QueryParameter[], options?: QueryOptions): Promise<QueryResult>;
44
+ export interface ExternalTableInfo {
45
+ alias: string;
46
+ projectId: string;
47
+ description?: string;
48
+ dataset: string;
49
+ table: string;
50
+ fullyQualified: string;
51
+ }
52
+ export declare function getExternalTables(config: ResolvedMerchantConfig): ExternalTableInfo[];
53
+ export declare function getExternalTableSchema(config: ResolvedMerchantConfig, projectId: string, datasetId: string, tableName: string): Promise<any[]>;
54
+ export declare function refreshSchemaCache(config: ResolvedMerchantConfig): Promise<void>;
55
+ //# sourceMappingURL=bigquery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bigquery.d.ts","sourceRoot":"","sources":["../../src/lib/bigquery.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IACpE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,cAAc,EAAE,MAAM,CAAC;CACxB;AAMD,wBAAgB,UAAU,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAEjE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,sBAAsB,GAAG,WAAW,EAAE,CAoBzE;AAgDD,wBAAgB,SAAS,CAAC,MAAM,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,CAKxF;AAMD,wBAAsB,cAAc,CAClC,MAAM,EAAE,sBAAsB,EAC9B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3B,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,CAAC,CAaxG;AAUD,wBAAsB,YAAY,CAChC,MAAM,EAAE,sBAAsB,EAC9B,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,cAAc,EAAO,EAC7B,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CA4GtB;AAUD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,sBAAsB,GAAG,iBAAiB,EAAE,CAoBrF;AAQD,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,sBAAsB,EAC9B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,EAAE,CAAC,CAwBhB;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAatF"}