@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.
- package/LICENSE +191 -0
- package/README.md +952 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +42 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/alarm.d.ts +3 -0
- package/dist/commands/alarm.d.ts.map +1 -0
- package/dist/commands/alarm.js +146 -0
- package/dist/commands/alarm.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +749 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/deck.d.ts +3 -0
- package/dist/commands/deck.d.ts.map +1 -0
- package/dist/commands/deck.js +567 -0
- package/dist/commands/deck.js.map +1 -0
- package/dist/commands/dry-run.d.ts +3 -0
- package/dist/commands/dry-run.d.ts.map +1 -0
- package/dist/commands/dry-run.js +105 -0
- package/dist/commands/dry-run.js.map +1 -0
- package/dist/commands/history.d.ts +3 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +127 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +302 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install-skill.d.ts +3 -0
- package/dist/commands/install-skill.d.ts.map +1 -0
- package/dist/commands/install-skill.js +132 -0
- package/dist/commands/install-skill.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +89 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/query.d.ts +3 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +152 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/render.d.ts +3 -0
- package/dist/commands/render.d.ts.map +1 -0
- package/dist/commands/render.js +107 -0
- package/dist/commands/render.js.map +1 -0
- package/dist/commands/run-all.d.ts +3 -0
- package/dist/commands/run-all.d.ts.map +1 -0
- package/dist/commands/run-all.js +285 -0
- package/dist/commands/run-all.js.map +1 -0
- package/dist/commands/run.d.ts +3 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +321 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/schema.d.ts +3 -0
- package/dist/commands/schema.d.ts.map +1 -0
- package/dist/commands/schema.js +271 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/validate.d.ts +3 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +109 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/lib/alarm-notify.d.ts +16 -0
- package/dist/lib/alarm-notify.d.ts.map +1 -0
- package/dist/lib/alarm-notify.js +312 -0
- package/dist/lib/alarm-notify.js.map +1 -0
- package/dist/lib/alarm-state.d.ts +26 -0
- package/dist/lib/alarm-state.d.ts.map +1 -0
- package/dist/lib/alarm-state.js +118 -0
- package/dist/lib/alarm-state.js.map +1 -0
- package/dist/lib/alarm.d.ts +28 -0
- package/dist/lib/alarm.d.ts.map +1 -0
- package/dist/lib/alarm.js +215 -0
- package/dist/lib/alarm.js.map +1 -0
- package/dist/lib/analysis.d.ts +16 -0
- package/dist/lib/analysis.d.ts.map +1 -0
- package/dist/lib/analysis.js +134 -0
- package/dist/lib/analysis.js.map +1 -0
- package/dist/lib/bigquery.d.ts +55 -0
- package/dist/lib/bigquery.d.ts.map +1 -0
- package/dist/lib/bigquery.js +321 -0
- package/dist/lib/bigquery.js.map +1 -0
- package/dist/lib/config-writer.d.ts +3 -0
- package/dist/lib/config-writer.d.ts.map +1 -0
- package/dist/lib/config-writer.js +60 -0
- package/dist/lib/config-writer.js.map +1 -0
- package/dist/lib/config.d.ts +63 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +151 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/dashboard.d.ts +3 -0
- package/dist/lib/dashboard.d.ts.map +1 -0
- package/dist/lib/dashboard.js +468 -0
- package/dist/lib/dashboard.js.map +1 -0
- package/dist/lib/deck.d.ts +58 -0
- package/dist/lib/deck.d.ts.map +1 -0
- package/dist/lib/deck.js +232 -0
- package/dist/lib/deck.js.map +1 -0
- package/dist/lib/deliver-email.d.ts +14 -0
- package/dist/lib/deliver-email.d.ts.map +1 -0
- package/dist/lib/deliver-email.js +360 -0
- package/dist/lib/deliver-email.js.map +1 -0
- package/dist/lib/deliver-slack.d.ts +6 -0
- package/dist/lib/deliver-slack.d.ts.map +1 -0
- package/dist/lib/deliver-slack.js +73 -0
- package/dist/lib/deliver-slack.js.map +1 -0
- package/dist/lib/deliver.d.ts +10 -0
- package/dist/lib/deliver.d.ts.map +1 -0
- package/dist/lib/deliver.js +95 -0
- package/dist/lib/deliver.js.map +1 -0
- package/dist/lib/llm/anthropic.d.ts +7 -0
- package/dist/lib/llm/anthropic.d.ts.map +1 -0
- package/dist/lib/llm/anthropic.js +69 -0
- package/dist/lib/llm/anthropic.js.map +1 -0
- package/dist/lib/llm/bedrock.d.ts +7 -0
- package/dist/lib/llm/bedrock.d.ts.map +1 -0
- package/dist/lib/llm/bedrock.js +67 -0
- package/dist/lib/llm/bedrock.js.map +1 -0
- package/dist/lib/llm/gemini.d.ts +7 -0
- package/dist/lib/llm/gemini.d.ts.map +1 -0
- package/dist/lib/llm/gemini.js +67 -0
- package/dist/lib/llm/gemini.js.map +1 -0
- package/dist/lib/llm/index.d.ts +5 -0
- package/dist/lib/llm/index.d.ts.map +1 -0
- package/dist/lib/llm/index.js +61 -0
- package/dist/lib/llm/index.js.map +1 -0
- package/dist/lib/llm/models.d.ts +5 -0
- package/dist/lib/llm/models.d.ts.map +1 -0
- package/dist/lib/llm/models.js +33 -0
- package/dist/lib/llm/models.js.map +1 -0
- package/dist/lib/llm/openai.d.ts +8 -0
- package/dist/lib/llm/openai.d.ts.map +1 -0
- package/dist/lib/llm/openai.js +48 -0
- package/dist/lib/llm/openai.js.map +1 -0
- package/dist/lib/llm/provider.d.ts +28 -0
- package/dist/lib/llm/provider.d.ts.map +1 -0
- package/dist/lib/llm/provider.js +3 -0
- package/dist/lib/llm/provider.js.map +1 -0
- package/dist/lib/manifest.d.ts +95 -0
- package/dist/lib/manifest.d.ts.map +1 -0
- package/dist/lib/manifest.js +105 -0
- package/dist/lib/manifest.js.map +1 -0
- package/dist/lib/params.d.ts +27 -0
- package/dist/lib/params.d.ts.map +1 -0
- package/dist/lib/params.js +192 -0
- package/dist/lib/params.js.map +1 -0
- package/dist/lib/pdf.d.ts +8 -0
- package/dist/lib/pdf.d.ts.map +1 -0
- package/dist/lib/pdf.js +86 -0
- package/dist/lib/pdf.js.map +1 -0
- package/dist/lib/renderer.d.ts +17 -0
- package/dist/lib/renderer.d.ts.map +1 -0
- package/dist/lib/renderer.js +166 -0
- package/dist/lib/renderer.js.map +1 -0
- package/dist/lib/schema-filter.d.ts +3 -0
- package/dist/lib/schema-filter.d.ts.map +1 -0
- package/dist/lib/schema-filter.js +49 -0
- package/dist/lib/schema-filter.js.map +1 -0
- package/dist/lib/template.d.ts +4 -0
- package/dist/lib/template.d.ts.map +1 -0
- package/dist/lib/template.js +37 -0
- package/dist/lib/template.js.map +1 -0
- package/dist/lib/validator.d.ts +8 -0
- package/dist/lib/validator.d.ts.map +1 -0
- package/dist/lib/validator.js +88 -0
- package/dist/lib/validator.js.map +1 -0
- package/package.json +59 -0
- package/schemas/deck.schema.json +122 -0
- package/schemas/report-manifest.schema.json +309 -0
- package/schemas/tables/README.md +45 -0
- package/schemas/tables/ultracart_dw/uc_affiliate_clicks.json +186 -0
- package/schemas/tables/ultracart_dw/uc_affiliate_commission_groups.json +317 -0
- package/schemas/tables/ultracart_dw/uc_affiliate_ledgers.json +404 -0
- package/schemas/tables/ultracart_dw/uc_affiliate_network_pixel_postback_logs.json +166 -0
- package/schemas/tables/ultracart_dw/uc_affiliate_network_pixels.json +106 -0
- package/schemas/tables/ultracart_dw/uc_affiliate_payments.json +204 -0
- package/schemas/tables/ultracart_dw/uc_affiliate_postback_logs.json +90 -0
- package/schemas/tables/ultracart_dw/uc_affiliates.json +425 -0
- package/schemas/tables/ultracart_dw/uc_auto_orders.json +13848 -0
- package/schemas/tables/ultracart_dw/uc_cart_abandons.json +3971 -0
- package/schemas/tables/ultracart_dw/uc_conversation_pbx_calls.json +374 -0
- package/schemas/tables/ultracart_dw/uc_conversations.json +374 -0
- package/schemas/tables/ultracart_dw/uc_coupons.json +1893 -0
- package/schemas/tables/ultracart_dw/uc_customers.json +11886 -0
- package/schemas/tables/ultracart_dw/uc_fraud_rules.json +239 -0
- package/schemas/tables/ultracart_dw/uc_gift_certificates.json +135 -0
- package/schemas/tables/ultracart_dw/uc_item_inventory_history.json +79 -0
- package/schemas/tables/ultracart_dw/uc_items.json +4437 -0
- package/schemas/tables/ultracart_dw/uc_orders.json +6629 -0
- package/schemas/tables/ultracart_dw/uc_rotating_transaction_gateway_history.json +271 -0
- package/schemas/tables/ultracart_dw/uc_rotating_transaction_gateways.json +416 -0
- package/schemas/tables/ultracart_dw/uc_shipping_methods.json +1372 -0
- package/schemas/tables/ultracart_dw/uc_storefront_customers.json +261 -0
- package/schemas/tables/ultracart_dw/uc_storefront_experiments.json +386 -0
- package/schemas/tables/ultracart_dw/uc_storefront_pages.json +513 -0
- package/schemas/tables/ultracart_dw/uc_storefront_upsell_offer_events.json +338 -0
- package/schemas/tables/ultracart_dw/uc_storefront_upsell_offers.json +431 -0
- package/schemas/tables/ultracart_dw/uc_storefront_upsell_paths.json +163 -0
- package/schemas/tables/ultracart_dw/uc_storefronts.json +62 -0
- package/schemas/tables/ultracart_dw/uc_surveys.json +238 -0
- package/schemas/tables/ultracart_dw/uc_workflow_tasks.json +377 -0
- package/schemas/tables/ultracart_dw/uc_zoho_desk_tickets.json +1184 -0
- package/schemas/tables/ultracart_dw_high/uc_affiliate_clicks.json +186 -0
- package/schemas/tables/ultracart_dw_high/uc_affiliate_commission_groups.json +317 -0
- package/schemas/tables/ultracart_dw_high/uc_affiliate_ledgers.json +404 -0
- package/schemas/tables/ultracart_dw_high/uc_affiliate_network_pixel_postback_logs.json +166 -0
- package/schemas/tables/ultracart_dw_high/uc_affiliate_network_pixels.json +106 -0
- package/schemas/tables/ultracart_dw_high/uc_affiliate_payments.json +204 -0
- package/schemas/tables/ultracart_dw_high/uc_affiliate_postback_logs.json +90 -0
- package/schemas/tables/ultracart_dw_high/uc_affiliates.json +425 -0
- package/schemas/tables/ultracart_dw_high/uc_auto_orders.json +14332 -0
- package/schemas/tables/ultracart_dw_high/uc_cart_abandons.json +4245 -0
- package/schemas/tables/ultracart_dw_high/uc_conversation_pbx_calls.json +415 -0
- package/schemas/tables/ultracart_dw_high/uc_conversations.json +415 -0
- package/schemas/tables/ultracart_dw_high/uc_coupons.json +1893 -0
- package/schemas/tables/ultracart_dw_high/uc_customers.json +12250 -0
- package/schemas/tables/ultracart_dw_high/uc_fraud_rules.json +239 -0
- package/schemas/tables/ultracart_dw_high/uc_gift_certificates.json +135 -0
- package/schemas/tables/ultracart_dw_high/uc_item_inventory_history.json +79 -0
- package/schemas/tables/ultracart_dw_high/uc_items.json +4437 -0
- package/schemas/tables/ultracart_dw_high/uc_orders.json +6871 -0
- package/schemas/tables/ultracart_dw_high/uc_rotating_transaction_gateway_history.json +271 -0
- package/schemas/tables/ultracart_dw_high/uc_rotating_transaction_gateways.json +416 -0
- package/schemas/tables/ultracart_dw_high/uc_shipping_methods.json +1372 -0
- package/schemas/tables/ultracart_dw_high/uc_storefront_customers.json +261 -0
- package/schemas/tables/ultracart_dw_high/uc_storefront_experiments.json +386 -0
- package/schemas/tables/ultracart_dw_high/uc_storefront_pages.json +513 -0
- package/schemas/tables/ultracart_dw_high/uc_storefront_upsell_offer_events.json +338 -0
- package/schemas/tables/ultracart_dw_high/uc_storefront_upsell_offers.json +431 -0
- package/schemas/tables/ultracart_dw_high/uc_storefront_upsell_paths.json +163 -0
- package/schemas/tables/ultracart_dw_high/uc_storefronts.json +62 -0
- package/schemas/tables/ultracart_dw_high/uc_surveys.json +269 -0
- package/schemas/tables/ultracart_dw_high/uc_workflow_tasks.json +377 -0
- package/schemas/tables/ultracart_dw_high/uc_zoho_desk_tickets.json +1330 -0
- package/schemas/tables/ultracart_dw_low/uc_affiliate_clicks.json +186 -0
- package/schemas/tables/ultracart_dw_low/uc_affiliate_commission_groups.json +317 -0
- package/schemas/tables/ultracart_dw_low/uc_affiliate_ledgers.json +404 -0
- package/schemas/tables/ultracart_dw_low/uc_affiliate_network_pixel_postback_logs.json +166 -0
- package/schemas/tables/ultracart_dw_low/uc_affiliate_network_pixels.json +106 -0
- package/schemas/tables/ultracart_dw_low/uc_affiliate_payments.json +204 -0
- package/schemas/tables/ultracart_dw_low/uc_affiliate_postback_logs.json +90 -0
- package/schemas/tables/ultracart_dw_low/uc_affiliates.json +425 -0
- package/schemas/tables/ultracart_dw_low/uc_auto_orders.json +13868 -0
- package/schemas/tables/ultracart_dw_low/uc_cart_abandons.json +3971 -0
- package/schemas/tables/ultracart_dw_low/uc_conversation_pbx_calls.json +374 -0
- package/schemas/tables/ultracart_dw_low/uc_conversations.json +374 -0
- package/schemas/tables/ultracart_dw_low/uc_coupons.json +1893 -0
- package/schemas/tables/ultracart_dw_low/uc_customers.json +11900 -0
- package/schemas/tables/ultracart_dw_low/uc_fraud_rules.json +239 -0
- package/schemas/tables/ultracart_dw_low/uc_gift_certificates.json +135 -0
- package/schemas/tables/ultracart_dw_low/uc_item_inventory_history.json +79 -0
- package/schemas/tables/ultracart_dw_low/uc_items.json +4437 -0
- package/schemas/tables/ultracart_dw_low/uc_orders.json +6639 -0
- package/schemas/tables/ultracart_dw_low/uc_rotating_transaction_gateway_history.json +271 -0
- package/schemas/tables/ultracart_dw_low/uc_rotating_transaction_gateways.json +416 -0
- package/schemas/tables/ultracart_dw_low/uc_shipping_methods.json +1372 -0
- package/schemas/tables/ultracart_dw_low/uc_storefront_customers.json +261 -0
- package/schemas/tables/ultracart_dw_low/uc_storefront_experiments.json +386 -0
- package/schemas/tables/ultracart_dw_low/uc_storefront_pages.json +513 -0
- package/schemas/tables/ultracart_dw_low/uc_storefront_upsell_offer_events.json +338 -0
- package/schemas/tables/ultracart_dw_low/uc_storefront_upsell_offers.json +431 -0
- package/schemas/tables/ultracart_dw_low/uc_storefront_upsell_paths.json +163 -0
- package/schemas/tables/ultracart_dw_low/uc_storefronts.json +62 -0
- package/schemas/tables/ultracart_dw_low/uc_surveys.json +238 -0
- package/schemas/tables/ultracart_dw_low/uc_workflow_tasks.json +377 -0
- package/schemas/tables/ultracart_dw_low/uc_zoho_desk_tickets.json +1184 -0
- package/schemas/tables/ultracart_dw_medium/uc_affiliate_clicks.json +186 -0
- package/schemas/tables/ultracart_dw_medium/uc_affiliate_commission_groups.json +317 -0
- package/schemas/tables/ultracart_dw_medium/uc_affiliate_ledgers.json +404 -0
- package/schemas/tables/ultracart_dw_medium/uc_affiliate_network_pixel_postback_logs.json +166 -0
- package/schemas/tables/ultracart_dw_medium/uc_affiliate_network_pixels.json +106 -0
- package/schemas/tables/ultracart_dw_medium/uc_affiliate_payments.json +204 -0
- package/schemas/tables/ultracart_dw_medium/uc_affiliate_postback_logs.json +90 -0
- package/schemas/tables/ultracart_dw_medium/uc_affiliates.json +425 -0
- package/schemas/tables/ultracart_dw_medium/uc_auto_orders.json +14320 -0
- package/schemas/tables/ultracart_dw_medium/uc_cart_abandons.json +4245 -0
- package/schemas/tables/ultracart_dw_medium/uc_conversation_pbx_calls.json +415 -0
- package/schemas/tables/ultracart_dw_medium/uc_conversations.json +415 -0
- package/schemas/tables/ultracart_dw_medium/uc_coupons.json +1893 -0
- package/schemas/tables/ultracart_dw_medium/uc_customers.json +12250 -0
- package/schemas/tables/ultracart_dw_medium/uc_fraud_rules.json +239 -0
- package/schemas/tables/ultracart_dw_medium/uc_gift_certificates.json +135 -0
- package/schemas/tables/ultracart_dw_medium/uc_item_inventory_history.json +79 -0
- package/schemas/tables/ultracart_dw_medium/uc_items.json +4437 -0
- package/schemas/tables/ultracart_dw_medium/uc_orders.json +6865 -0
- package/schemas/tables/ultracart_dw_medium/uc_rotating_transaction_gateway_history.json +271 -0
- package/schemas/tables/ultracart_dw_medium/uc_rotating_transaction_gateways.json +416 -0
- package/schemas/tables/ultracart_dw_medium/uc_shipping_methods.json +1372 -0
- package/schemas/tables/ultracart_dw_medium/uc_storefront_customers.json +261 -0
- package/schemas/tables/ultracart_dw_medium/uc_storefront_experiments.json +386 -0
- package/schemas/tables/ultracart_dw_medium/uc_storefront_pages.json +513 -0
- package/schemas/tables/ultracart_dw_medium/uc_storefront_upsell_offer_events.json +338 -0
- package/schemas/tables/ultracart_dw_medium/uc_storefront_upsell_offers.json +431 -0
- package/schemas/tables/ultracart_dw_medium/uc_storefront_upsell_paths.json +163 -0
- package/schemas/tables/ultracart_dw_medium/uc_storefronts.json +62 -0
- package/schemas/tables/ultracart_dw_medium/uc_surveys.json +269 -0
- package/schemas/tables/ultracart_dw_medium/uc_workflow_tasks.json +377 -0
- package/schemas/tables/ultracart_dw_medium/uc_zoho_desk_tickets.json +1330 -0
- package/schemas/tables/ultracart_dw_streaming/uc_analytics_session_streaming.json +2444 -0
- package/schemas/tables/ultracart_dw_streaming/uc_screen_recording_streaming.json +509 -0
- package/schemas/ultracart-bq-config.schema.json +140 -0
- package/skill/skill.md +1228 -0
- 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":"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"}
|
|
@@ -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"}
|