@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,285 @@
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.runAllCommand = void 0;
37
+ const commander_1 = require("commander");
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const config_1 = require("../lib/config");
41
+ const llm_1 = require("../lib/llm");
42
+ const models_1 = require("../lib/llm/models");
43
+ const bigquery_1 = require("../lib/bigquery");
44
+ const manifest_1 = require("../lib/manifest");
45
+ const params_1 = require("../lib/params");
46
+ const template_1 = require("../lib/template");
47
+ const renderer_1 = require("../lib/renderer");
48
+ const analysis_1 = require("../lib/analysis");
49
+ const pdf_1 = require("../lib/pdf");
50
+ const deliver_1 = require("../lib/deliver");
51
+ const alarm_1 = require("../lib/alarm");
52
+ const alarm_state_1 = require("../lib/alarm-state");
53
+ const alarm_notify_1 = require("../lib/alarm-notify");
54
+ function safePath(baseDir, relativePath) {
55
+ const resolved = path.resolve(baseDir, relativePath);
56
+ const realBase = fs.realpathSync(baseDir);
57
+ if (!resolved.startsWith(path.resolve(baseDir))) {
58
+ throw new Error(`Path traversal detected: "${relativePath}" escapes report directory`);
59
+ }
60
+ if (fs.existsSync(resolved)) {
61
+ const realResolved = fs.realpathSync(resolved);
62
+ if (!realResolved.startsWith(realBase + path.sep) && realResolved !== realBase) {
63
+ throw new Error(`Symlink traversal detected: "${relativePath}" resolves outside report directory`);
64
+ }
65
+ }
66
+ return resolved;
67
+ }
68
+ exports.runAllCommand = new commander_1.Command('run-all')
69
+ .description('Replay all saved reports')
70
+ .option('--no-analysis', 'Skip analysis generation')
71
+ .option('--analysis-api-key <key>', 'API key for headless analysis generation')
72
+ .option('--analysis-model <model>', 'Model for analysis generation', 'claude-sonnet-4-5-20250929')
73
+ .option('--deliver', 'Deliver report via Slack/email as configured in manifest')
74
+ .option('--no-deliver', 'Skip delivery even if configured')
75
+ .option('--skip-alarms', 'Skip alarm evaluation')
76
+ .option('--landscape', 'Generate PDF in landscape orientation')
77
+ .option('--force', 'Skip cost safety check')
78
+ .option('--max-bytes <bytes>', 'Max bytes processed before aborting (default: 10 GB)')
79
+ .allowUnknownOption(true)
80
+ .action(async (options, command) => {
81
+ try {
82
+ const config = (0, config_1.loadConfig)();
83
+ const globalOpts = command.optsWithGlobals ? command.optsWithGlobals() : (command.parent?.opts() || {});
84
+ const merchant = (0, config_1.resolveMerchant)(config, globalOpts.merchant);
85
+ const reportsDir = path.resolve(merchant.default_output_dir);
86
+ if (!fs.existsSync(reportsDir)) {
87
+ console.error(`Error: Reports directory not found: ${path.relative(process.cwd(), reportsDir)}`);
88
+ process.exit(1);
89
+ }
90
+ // List all reports
91
+ const reports = (0, manifest_1.listReports)(reportsDir);
92
+ if (reports.length === 0) {
93
+ console.log('No reports found in ' + path.relative(process.cwd(), reportsDir));
94
+ return;
95
+ }
96
+ // Extract CLI parameter overrides
97
+ const cliOverrides = {};
98
+ for (const arg of process.argv) {
99
+ const match = arg.match(/^--([a-z][a-z0-9_]*)=(.+)$/);
100
+ if (match && !['no-analysis', 'analysis-api-key'].includes(match[1])) {
101
+ cliOverrides[match[1]] = match[2];
102
+ }
103
+ }
104
+ console.log('');
105
+ const results = [];
106
+ let totalBytes = 0;
107
+ for (let i = 0; i < reports.length; i++) {
108
+ const reportInfo = reports[i];
109
+ const reportDir = path.join(reportsDir, reportInfo.dir);
110
+ const manifest = (0, manifest_1.loadManifest)(reportDir);
111
+ const label = `[${i + 1}/${reports.length}] ${manifest.name}`;
112
+ try {
113
+ // Resolve report-specific params
114
+ const paramDefs = (manifest.parameters || []);
115
+ const resolved = await (0, params_1.resolveParameters)(paramDefs, cliOverrides);
116
+ // Load and substitute SQL
117
+ const sqlPath = safePath(reportDir, manifest.sql_file);
118
+ if (!fs.existsSync(sqlPath)) {
119
+ throw new Error(`SQL file not found: ${path.relative(process.cwd(), sqlPath)}`);
120
+ }
121
+ let sql = fs.readFileSync(sqlPath, 'utf-8');
122
+ sql = (0, template_1.substituteParams)(sql, resolved);
123
+ // Build query parameters array
124
+ const queryParams = Object.entries(resolved).map(([name, value]) => ({
125
+ name,
126
+ type: 'STRING',
127
+ value,
128
+ }));
129
+ // Execute query
130
+ const result = await (0, bigquery_1.executeQuery)(merchant, sql, queryParams, {
131
+ force: options.force,
132
+ maxBytes: options.maxBytes ? parseInt(options.maxBytes, 10) : undefined,
133
+ });
134
+ // Save data
135
+ const dataPath = path.join(reportDir, 'data.json');
136
+ fs.writeFileSync(dataPath, JSON.stringify(result.rows, null, 2));
137
+ // Render chart
138
+ const chartConfig = manifest.chart;
139
+ const chartPath = safePath(reportDir, chartConfig.echarts_file);
140
+ if (fs.existsSync(chartPath)) {
141
+ const outputExt = chartConfig.output_format === 'pdf' ? 'pdf' : 'png';
142
+ const outputPath = path.join(reportDir, `chart.${outputExt}`);
143
+ await (0, renderer_1.renderChart)({
144
+ chartJsPath: chartPath,
145
+ dataJsonPath: dataPath,
146
+ outputPath,
147
+ width: chartConfig.width,
148
+ height: chartConfig.height,
149
+ format: outputExt,
150
+ isDashboard: false,
151
+ });
152
+ }
153
+ // Analysis generation
154
+ if (options.analysis !== false) {
155
+ const analysisConfig = manifest.analysis || { include: true, prompt_file: 'analysis_prompt.md', output_file: 'report.md' };
156
+ const promptFile = safePath(reportDir, analysisConfig.prompt_file || 'analysis_prompt.md');
157
+ const outputFile = safePath(reportDir, analysisConfig.output_file || 'report.md');
158
+ // Resolve LLM config: CLI flags > config file > defaults
159
+ const llmConfig = (0, config_1.resolveLlmConfig)(config, {
160
+ provider: globalOpts.llmProvider,
161
+ apiKey: options.analysisApiKey,
162
+ });
163
+ const defaultModels = (0, models_1.getDefaultModels)(llmConfig.provider);
164
+ const analysisModel = options.analysisModel || llmConfig.analysisModel || defaultModels.analysis;
165
+ if ((llmConfig.apiKey || llmConfig.provider === 'bedrock') && fs.existsSync(promptFile)) {
166
+ try {
167
+ const provider = (0, llm_1.createProvider)(llmConfig.provider, {
168
+ apiKey: llmConfig.apiKey,
169
+ region: llmConfig.region,
170
+ });
171
+ const chartPng = path.join(reportDir, 'chart.png');
172
+ await (0, analysis_1.generateAnalysis)({
173
+ provider,
174
+ analysisPromptPath: promptFile,
175
+ dataJsonPath: dataPath,
176
+ chartPngPath: fs.existsSync(chartPng) ? chartPng : undefined,
177
+ outputPath: outputFile,
178
+ model: analysisModel,
179
+ });
180
+ }
181
+ catch (analysisErr) {
182
+ console.error(` Analysis failed for ${manifest.name}: ${analysisErr.message}`);
183
+ }
184
+ }
185
+ }
186
+ // Generate PDF if report.md exists
187
+ const reportMdPath = path.join(reportDir, 'report.md');
188
+ if (fs.existsSync(reportMdPath)) {
189
+ try {
190
+ const chartPng = path.join(reportDir, 'chart.png');
191
+ const analysisConf = manifest.analysis || {};
192
+ const useLandscape = options.landscape ?? analysisConf.landscape ?? false;
193
+ await (0, pdf_1.generatePdf)({
194
+ markdownPath: reportMdPath,
195
+ outputPath: path.join(reportDir, 'report.pdf'),
196
+ chartPngPath: fs.existsSync(chartPng) ? chartPng : undefined,
197
+ landscape: useLandscape,
198
+ });
199
+ }
200
+ catch (pdfErr) {
201
+ console.error(` PDF failed for ${manifest.name}: ${pdfErr.message}`);
202
+ }
203
+ }
204
+ // Update manifest
205
+ (0, manifest_1.addRunHistoryEntry)(manifest, {
206
+ run_date: new Date().toISOString().split('T')[0],
207
+ parameters: resolved,
208
+ status: 'success',
209
+ rows_returned: result.totalRows,
210
+ bytes_processed: result.bytesProcessed,
211
+ });
212
+ (0, manifest_1.saveManifest)(reportDir, manifest);
213
+ // Alarm evaluation
214
+ let hasTriggeredAlarms = false;
215
+ if (manifest.alarms && manifest.alarms.length > 0 && !options.skipAlarms) {
216
+ const alarmState = (0, alarm_state_1.loadAlarmState)(reportDir);
217
+ const alarmResults = (0, alarm_1.evaluateAlarms)(manifest.alarms, result.rows, alarmState);
218
+ const triggered = alarmResults.filter(r => r.triggered);
219
+ const fired = triggered.filter(r => !r.suppressed);
220
+ const suppressed = triggered.filter(r => r.suppressed);
221
+ hasTriggeredAlarms = fired.length > 0;
222
+ const metrics = (0, alarm_1.extractAlarmMetrics)(manifest.alarms, result.rows);
223
+ (0, alarm_state_1.recordAlarmRun)(alarmState, resolved, metrics, triggered.map(r => r.alarm.name), suppressed.map(r => r.alarm.name));
224
+ (0, alarm_state_1.saveAlarmState)(reportDir, alarmState);
225
+ if (fired.length > 0) {
226
+ for (const ar of fired) {
227
+ const icon = ar.alarm.severity === 'critical' ? 'CRITICAL' : ar.alarm.severity === 'high' ? 'HIGH' : 'LOW';
228
+ console.log(` \u26a0 ALARM [${icon}] ${ar.alarm.name}: ${ar.reason}`);
229
+ }
230
+ if (manifest.delivery && options.deliver) {
231
+ await (0, alarm_notify_1.deliverAlarmNotifications)(manifest.name, alarmResults, manifest.delivery);
232
+ }
233
+ }
234
+ }
235
+ // Deliver report if --deliver flag is set
236
+ if (options.deliver && manifest.delivery) {
237
+ await (0, deliver_1.deliverReport)(reportDir, manifest, { hasTriggeredAlarms });
238
+ }
239
+ const cost = (result.bytesProcessed / (1024 * 1024 * 1024 * 1024)) * 6.25;
240
+ totalBytes += result.bytesProcessed;
241
+ const dots = '.'.repeat(Math.max(1, 55 - label.length));
242
+ console.log(` ${label} ${dots} + (${formatBytes(result.bytesProcessed)}, $${cost.toFixed(3)})`);
243
+ results.push({
244
+ name: manifest.name,
245
+ status: 'success',
246
+ bytesProcessed: result.bytesProcessed,
247
+ rows: result.totalRows,
248
+ });
249
+ }
250
+ catch (err) {
251
+ const dots = '.'.repeat(Math.max(1, 55 - label.length));
252
+ console.log(` ${label} ${dots} x ${err.message}`);
253
+ results.push({
254
+ name: manifest.name,
255
+ status: 'error',
256
+ bytesProcessed: 0,
257
+ rows: 0,
258
+ error: err.message,
259
+ });
260
+ }
261
+ }
262
+ // Summary
263
+ const successful = results.filter((r) => r.status === 'success');
264
+ const failed = results.filter((r) => r.status === 'error');
265
+ const totalCost = (totalBytes / (1024 * 1024 * 1024 * 1024)) * 6.25;
266
+ console.log('');
267
+ console.log(` Total: ${successful.length} reports, ${formatBytes(totalBytes)} processed, $${totalCost.toFixed(3)}`);
268
+ if (failed.length > 0) {
269
+ console.log(` Failed: ${failed.length} reports`);
270
+ }
271
+ console.log('');
272
+ }
273
+ catch (err) {
274
+ console.error(`Error: ${err.message}`);
275
+ process.exit(1);
276
+ }
277
+ });
278
+ function formatBytes(bytes) {
279
+ if (bytes === 0)
280
+ return '0 B';
281
+ const units = ['B', 'KB', 'MB', 'GB', 'TB'];
282
+ const i = Math.floor(Math.log(bytes) / Math.log(1024));
283
+ return (bytes / Math.pow(1024, i)).toFixed(1) + ' ' + units[i];
284
+ }
285
+ //# sourceMappingURL=run-all.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-all.js","sourceRoot":"","sources":["../../src/commands/run-all.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const runCommand: Command;
3
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkCpC,eAAO,MAAM,UAAU,SAgRnB,CAAC"}
@@ -0,0 +1,321 @@
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.runCommand = void 0;
37
+ const commander_1 = require("commander");
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const config_1 = require("../lib/config");
41
+ const llm_1 = require("../lib/llm");
42
+ const models_1 = require("../lib/llm/models");
43
+ const bigquery_1 = require("../lib/bigquery");
44
+ const manifest_1 = require("../lib/manifest");
45
+ const params_1 = require("../lib/params");
46
+ const template_1 = require("../lib/template");
47
+ const renderer_1 = require("../lib/renderer");
48
+ const analysis_1 = require("../lib/analysis");
49
+ const pdf_1 = require("../lib/pdf");
50
+ const deliver_1 = require("../lib/deliver");
51
+ const alarm_1 = require("../lib/alarm");
52
+ const alarm_state_1 = require("../lib/alarm-state");
53
+ const alarm_notify_1 = require("../lib/alarm-notify");
54
+ function safePath(baseDir, relativePath) {
55
+ const resolved = path.resolve(baseDir, relativePath);
56
+ const realBase = fs.realpathSync(baseDir);
57
+ if (!resolved.startsWith(path.resolve(baseDir))) {
58
+ throw new Error(`Path traversal detected: "${relativePath}" escapes report directory`);
59
+ }
60
+ // Also check resolved symlinks if the file exists
61
+ if (fs.existsSync(resolved)) {
62
+ const realResolved = fs.realpathSync(resolved);
63
+ if (!realResolved.startsWith(realBase + path.sep) && realResolved !== realBase) {
64
+ throw new Error(`Symlink traversal detected: "${relativePath}" resolves outside report directory`);
65
+ }
66
+ }
67
+ return resolved;
68
+ }
69
+ exports.runCommand = new commander_1.Command('run')
70
+ .description('Replay a saved report (resolve params, query, render)')
71
+ .argument('<report-name>', 'Name of the report directory under ./reports/')
72
+ .option('--no-analysis', 'Skip analysis generation')
73
+ .option('--analysis-api-key <key>', 'API key for headless analysis generation')
74
+ .option('--analysis-model <model>', 'Model for analysis generation', 'claude-sonnet-4-5-20250929')
75
+ .option('--deliver', 'Deliver report via Slack/email as configured in manifest')
76
+ .option('--no-deliver', 'Skip delivery even if configured')
77
+ .option('--skip-alarms', 'Skip alarm evaluation')
78
+ .option('--landscape', 'Generate PDF in landscape orientation')
79
+ .option('--force', 'Skip cost safety check')
80
+ .option('--max-bytes <bytes>', 'Max bytes processed before aborting (default: 10 GB)')
81
+ .allowUnknownOption(true)
82
+ .action(async (reportName, options, command) => {
83
+ try {
84
+ const config = (0, config_1.loadConfig)();
85
+ const globalOpts = command.optsWithGlobals ? command.optsWithGlobals() : (command.parent?.opts() || {});
86
+ const merchant = (0, config_1.resolveMerchant)(config, globalOpts.merchant);
87
+ if (reportName.includes('..') || reportName.includes('/') || reportName.includes('\\')) {
88
+ throw new Error('Invalid report name');
89
+ }
90
+ const reportsDir = path.resolve(merchant.default_output_dir);
91
+ const reportDir = path.join(reportsDir, reportName);
92
+ if (!fs.existsSync(reportDir)) {
93
+ console.error(`Error: Report directory not found: ${path.relative(process.cwd(), reportDir)}`);
94
+ process.exit(1);
95
+ }
96
+ // Load manifest
97
+ const manifest = (0, manifest_1.loadManifest)(reportDir);
98
+ // Extract CLI parameter overrides from unknown args (--param_name=value)
99
+ const cliOverrides = {};
100
+ const rawArgs = command.args || [];
101
+ for (const arg of rawArgs) {
102
+ const match = arg.match(/^--([a-z][a-z0-9_]*)=(.+)$/);
103
+ if (match) {
104
+ cliOverrides[match[1]] = match[2];
105
+ }
106
+ }
107
+ // Also check parent args for param overrides
108
+ for (const arg of process.argv) {
109
+ const match = arg.match(/^--([a-z][a-z0-9_]*)=(.+)$/);
110
+ if (match && !['no-analysis', 'analysis-api-key'].includes(match[1])) {
111
+ cliOverrides[match[1]] = match[2];
112
+ }
113
+ }
114
+ // Resolve parameters: CLI overrides > manifest defaults > prompt
115
+ const paramDefs = (manifest.parameters || []);
116
+ const resolved = await (0, params_1.resolveParameters)(paramDefs, cliOverrides);
117
+ console.log('');
118
+ console.log(` Running: ${manifest.name}`);
119
+ console.log(' ' + '─'.repeat(50));
120
+ // Show resolved params
121
+ for (const [key, value] of Object.entries(resolved)) {
122
+ console.log(` ${key} = ${value}`);
123
+ }
124
+ console.log('');
125
+ // Load and substitute SQL
126
+ const sqlPath = safePath(reportDir, manifest.sql_file);
127
+ if (!fs.existsSync(sqlPath)) {
128
+ console.error(`Error: SQL file not found: ${path.relative(process.cwd(), sqlPath)}`);
129
+ process.exit(1);
130
+ }
131
+ let sql = fs.readFileSync(sqlPath, 'utf-8');
132
+ sql = (0, template_1.substituteParams)(sql, resolved);
133
+ // Build query parameters array
134
+ const queryParams = Object.entries(resolved).map(([name, value]) => ({
135
+ name,
136
+ type: 'STRING',
137
+ value,
138
+ }));
139
+ // Execute query
140
+ console.log(' Executing query...');
141
+ const result = await (0, bigquery_1.executeQuery)(merchant, sql, queryParams, {
142
+ force: options.force,
143
+ maxBytes: options.maxBytes ? parseInt(options.maxBytes, 10) : undefined,
144
+ });
145
+ console.log(` Rows: ${result.totalRows}`);
146
+ console.log(` Bytes processed: ${formatBytes(result.bytesProcessed)}`);
147
+ console.log(` Cost: $${((result.bytesProcessed / (1024 * 1024 * 1024 * 1024)) * 6.25).toFixed(4)}`);
148
+ // Save data for chart rendering
149
+ const dataPath = path.join(reportDir, 'data.json');
150
+ fs.writeFileSync(dataPath, JSON.stringify(result.rows, null, 2));
151
+ // Render chart
152
+ const chartConfig = manifest.chart;
153
+ const chartPath = safePath(reportDir, chartConfig.echarts_file);
154
+ if (fs.existsSync(chartPath)) {
155
+ const outputExt = chartConfig.output_format === 'pdf' ? 'pdf' : 'png';
156
+ const outputPath = path.join(reportDir, `chart.${outputExt}`);
157
+ console.log(' Rendering chart...');
158
+ const renderResult = await (0, renderer_1.renderChart)({
159
+ chartJsPath: chartPath,
160
+ dataJsonPath: dataPath,
161
+ outputPath,
162
+ width: chartConfig.width,
163
+ height: chartConfig.height,
164
+ format: outputExt,
165
+ isDashboard: false,
166
+ });
167
+ if (renderResult.errors && renderResult.errors.length > 0) {
168
+ console.error(' Chart rendering errors:');
169
+ for (const err of renderResult.errors) {
170
+ console.error(` - ${err}`);
171
+ }
172
+ }
173
+ else {
174
+ console.log(` Chart: ${path.relative(process.cwd(), renderResult.outputPath)}`);
175
+ }
176
+ // Render dashboard version if output format is both or png
177
+ if (chartConfig.output_format !== 'pdf') {
178
+ const dashOutputPath = path.join(reportDir, 'chart-dashboard.png');
179
+ await (0, renderer_1.renderChart)({
180
+ chartJsPath: chartPath,
181
+ dataJsonPath: dataPath,
182
+ outputPath: dashOutputPath,
183
+ width: 200,
184
+ height: 200,
185
+ format: 'png',
186
+ isDashboard: true,
187
+ });
188
+ }
189
+ }
190
+ else {
191
+ console.log(` Skipping chart render (${chartConfig.echarts_file} not found)`);
192
+ }
193
+ // Update manifest run history
194
+ (0, manifest_1.addRunHistoryEntry)(manifest, {
195
+ run_date: new Date().toISOString().split('T')[0],
196
+ parameters: resolved,
197
+ status: 'success',
198
+ rows_returned: result.totalRows,
199
+ bytes_processed: result.bytesProcessed,
200
+ });
201
+ (0, manifest_1.saveManifest)(reportDir, manifest);
202
+ // Alarm evaluation
203
+ let hasTriggeredAlarms = false;
204
+ if (manifest.alarms && manifest.alarms.length > 0 && !options.skipAlarms) {
205
+ console.log(' Evaluating alarms...');
206
+ const alarmState = (0, alarm_state_1.loadAlarmState)(reportDir);
207
+ const alarmResults = (0, alarm_1.evaluateAlarms)(manifest.alarms, result.rows, alarmState);
208
+ const triggered = alarmResults.filter(r => r.triggered);
209
+ const fired = triggered.filter(r => !r.suppressed);
210
+ const suppressed = triggered.filter(r => r.suppressed);
211
+ hasTriggeredAlarms = fired.length > 0;
212
+ // Record metrics and alarm state
213
+ const metrics = (0, alarm_1.extractAlarmMetrics)(manifest.alarms, result.rows);
214
+ (0, alarm_state_1.recordAlarmRun)(alarmState, resolved, metrics, triggered.map(r => r.alarm.name), suppressed.map(r => r.alarm.name));
215
+ (0, alarm_state_1.saveAlarmState)(reportDir, alarmState);
216
+ // Log alarm results
217
+ for (const ar of alarmResults) {
218
+ if (ar.triggered && !ar.suppressed) {
219
+ const icon = ar.alarm.severity === 'critical' ? 'CRITICAL' : ar.alarm.severity === 'high' ? 'HIGH' : 'LOW';
220
+ console.log(` \u26a0 ALARM [${icon}] ${ar.alarm.name}: ${ar.reason}`);
221
+ }
222
+ else if (ar.triggered && ar.suppressed) {
223
+ console.log(` \u23f8 Suppressed: ${ar.alarm.name} (cooldown active)`);
224
+ }
225
+ }
226
+ if (triggered.length === 0) {
227
+ console.log(' Alarms: all clear');
228
+ }
229
+ // Deliver alarm notifications
230
+ if (fired.length > 0 && manifest.delivery && options.deliver) {
231
+ await (0, alarm_notify_1.deliverAlarmNotifications)(manifest.name, alarmResults, manifest.delivery);
232
+ }
233
+ }
234
+ // Analysis generation
235
+ if (options.analysis !== false) {
236
+ const analysisConfig = manifest.analysis || { include: true, prompt_file: 'analysis_prompt.md', output_file: 'report.md' };
237
+ const promptFile = safePath(reportDir, analysisConfig.prompt_file || 'analysis_prompt.md');
238
+ const outputFile = safePath(reportDir, analysisConfig.output_file || 'report.md');
239
+ // Resolve LLM config: CLI flags > config file > defaults
240
+ const llmConfig = (0, config_1.resolveLlmConfig)(config, {
241
+ provider: globalOpts.llmProvider,
242
+ apiKey: options.analysisApiKey,
243
+ });
244
+ const defaultModels = (0, models_1.getDefaultModels)(llmConfig.provider);
245
+ const analysisModel = options.analysisModel || llmConfig.analysisModel || defaultModels.analysis;
246
+ if ((llmConfig.apiKey || llmConfig.provider === 'bedrock') && fs.existsSync(promptFile)) {
247
+ console.log(' Generating analysis...');
248
+ try {
249
+ const provider = (0, llm_1.createProvider)(llmConfig.provider, {
250
+ apiKey: llmConfig.apiKey,
251
+ region: llmConfig.region,
252
+ });
253
+ const chartPng = path.join(reportDir, 'chart.png');
254
+ await (0, analysis_1.generateAnalysis)({
255
+ provider,
256
+ analysisPromptPath: promptFile,
257
+ dataJsonPath: dataPath,
258
+ chartPngPath: fs.existsSync(chartPng) ? chartPng : undefined,
259
+ outputPath: outputFile,
260
+ model: analysisModel,
261
+ });
262
+ console.log(` Analysis: ${path.relative(process.cwd(), outputFile)}`);
263
+ }
264
+ catch (err) {
265
+ console.error(` Analysis failed: ${err.message}`);
266
+ }
267
+ }
268
+ else if (!fs.existsSync(promptFile)) {
269
+ console.log(' Analysis: No analysis_prompt.md found. Use Claude Code to generate one.');
270
+ }
271
+ else {
272
+ console.log(` Analysis: Set --analysis-api-key or ${llmConfig.apiKeyEnv || 'ANTHROPIC_API_KEY'} to generate analysis on replay.`);
273
+ }
274
+ }
275
+ // Generate PDF combining analysis + chart
276
+ const reportMd = path.join(reportDir, 'report.md');
277
+ if (fs.existsSync(reportMd)) {
278
+ const pdfPath = path.join(reportDir, 'report.pdf');
279
+ console.log(' Generating PDF...');
280
+ try {
281
+ const chartPng = path.join(reportDir, 'chart.png');
282
+ const analysisConfig = manifest.analysis || {};
283
+ const useLandscape = options.landscape ?? analysisConfig.landscape ?? false;
284
+ await (0, pdf_1.generatePdf)({
285
+ markdownPath: reportMd,
286
+ outputPath: pdfPath,
287
+ chartPngPath: fs.existsSync(chartPng) ? chartPng : undefined,
288
+ landscape: useLandscape,
289
+ });
290
+ console.log(` PDF: ${path.relative(process.cwd(), pdfPath)}`);
291
+ }
292
+ catch (err) {
293
+ console.error(` PDF generation failed: ${err.message}`);
294
+ }
295
+ }
296
+ // Deliver report if --deliver flag is set
297
+ if (options.deliver) {
298
+ if (manifest.delivery) {
299
+ await (0, deliver_1.deliverReport)(reportDir, manifest, { hasTriggeredAlarms });
300
+ }
301
+ else {
302
+ console.log(' Delivery: No delivery config in manifest, skipping.');
303
+ }
304
+ }
305
+ console.log('');
306
+ console.log(' Done.');
307
+ console.log('');
308
+ }
309
+ catch (err) {
310
+ console.error(`Error: ${err.message}`);
311
+ process.exit(1);
312
+ }
313
+ });
314
+ function formatBytes(bytes) {
315
+ if (bytes === 0)
316
+ return '0 B';
317
+ const units = ['B', 'KB', 'MB', 'GB', 'TB'];
318
+ const i = Math.floor(Math.log(bytes) / Math.log(1024));
319
+ return (bytes / Math.pow(1024, i)).toFixed(1) + ' ' + units[i];
320
+ }
321
+ //# sourceMappingURL=run.js.map