kanmi-perf-revenue 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +347 -173
  2. package/dist/empirical/ab-testing.d.ts +83 -0
  3. package/dist/empirical/ab-testing.d.ts.map +1 -0
  4. package/dist/empirical/ab-testing.js +281 -0
  5. package/dist/empirical/ab-testing.js.map +1 -0
  6. package/dist/empirical/alerting.d.ts +85 -0
  7. package/dist/empirical/alerting.d.ts.map +1 -0
  8. package/dist/empirical/alerting.js +358 -0
  9. package/dist/empirical/alerting.js.map +1 -0
  10. package/dist/empirical/attribution.d.ts +80 -0
  11. package/dist/empirical/attribution.d.ts.map +1 -0
  12. package/dist/empirical/attribution.js +305 -0
  13. package/dist/empirical/attribution.js.map +1 -0
  14. package/dist/empirical/cohort.d.ts +75 -0
  15. package/dist/empirical/cohort.d.ts.map +1 -0
  16. package/dist/empirical/cohort.js +305 -0
  17. package/dist/empirical/cohort.js.map +1 -0
  18. package/dist/empirical/conversion-curve.d.ts +7 -10
  19. package/dist/empirical/conversion-curve.d.ts.map +1 -1
  20. package/dist/empirical/conversion-curve.js +37 -4
  21. package/dist/empirical/conversion-curve.js.map +1 -1
  22. package/dist/empirical/correlation.d.ts +91 -0
  23. package/dist/empirical/correlation.d.ts.map +1 -0
  24. package/dist/empirical/correlation.js +461 -0
  25. package/dist/empirical/correlation.js.map +1 -0
  26. package/dist/empirical/data-import.d.ts +22 -0
  27. package/dist/empirical/data-import.d.ts.map +1 -1
  28. package/dist/empirical/data-import.js +44 -0
  29. package/dist/empirical/data-import.js.map +1 -1
  30. package/dist/empirical/datadog-product-analytics.d.ts +192 -0
  31. package/dist/empirical/datadog-product-analytics.d.ts.map +1 -0
  32. package/dist/empirical/datadog-product-analytics.js +632 -0
  33. package/dist/empirical/datadog-product-analytics.js.map +1 -0
  34. package/dist/empirical/datadog-session-query.d.ts +32 -0
  35. package/dist/empirical/datadog-session-query.d.ts.map +1 -1
  36. package/dist/empirical/datadog-session-query.js +238 -17
  37. package/dist/empirical/datadog-session-query.js.map +1 -1
  38. package/dist/empirical/engagement-analysis.d.ts +112 -0
  39. package/dist/empirical/engagement-analysis.d.ts.map +1 -0
  40. package/dist/empirical/engagement-analysis.js +354 -0
  41. package/dist/empirical/engagement-analysis.js.map +1 -0
  42. package/dist/empirical/export.d.ts +75 -0
  43. package/dist/empirical/export.d.ts.map +1 -0
  44. package/dist/empirical/export.js +392 -0
  45. package/dist/empirical/export.js.map +1 -0
  46. package/dist/empirical/forecasting.d.ts +80 -0
  47. package/dist/empirical/forecasting.d.ts.map +1 -0
  48. package/dist/empirical/forecasting.js +287 -0
  49. package/dist/empirical/forecasting.js.map +1 -0
  50. package/dist/empirical/funnel.d.ts +66 -0
  51. package/dist/empirical/funnel.d.ts.map +1 -0
  52. package/dist/empirical/funnel.js +293 -0
  53. package/dist/empirical/funnel.js.map +1 -0
  54. package/dist/empirical/history.d.ts +198 -0
  55. package/dist/empirical/history.d.ts.map +1 -0
  56. package/dist/empirical/history.js +396 -0
  57. package/dist/empirical/history.js.map +1 -0
  58. package/dist/empirical/index.d.ts +41 -16
  59. package/dist/empirical/index.d.ts.map +1 -1
  60. package/dist/empirical/index.js +96 -13
  61. package/dist/empirical/index.js.map +1 -1
  62. package/dist/empirical/interactions.d.ts +89 -0
  63. package/dist/empirical/interactions.d.ts.map +1 -0
  64. package/dist/empirical/interactions.js +346 -0
  65. package/dist/empirical/interactions.js.map +1 -0
  66. package/dist/empirical/opportunity-calculator.d.ts +6 -18
  67. package/dist/empirical/opportunity-calculator.d.ts.map +1 -1
  68. package/dist/empirical/opportunity-calculator.js +19 -1
  69. package/dist/empirical/opportunity-calculator.js.map +1 -1
  70. package/dist/empirical/report.d.ts +3 -11
  71. package/dist/empirical/report.d.ts.map +1 -1
  72. package/dist/empirical/report.js +11 -7
  73. package/dist/empirical/report.js.map +1 -1
  74. package/dist/empirical/roi-calculator.d.ts +104 -0
  75. package/dist/empirical/roi-calculator.d.ts.map +1 -0
  76. package/dist/empirical/roi-calculator.js +403 -0
  77. package/dist/empirical/roi-calculator.js.map +1 -0
  78. package/dist/empirical/seasonality.d.ts +80 -0
  79. package/dist/empirical/seasonality.d.ts.map +1 -0
  80. package/dist/empirical/seasonality.js +340 -0
  81. package/dist/empirical/seasonality.js.map +1 -0
  82. package/dist/empirical/segmentation.d.ts +135 -0
  83. package/dist/empirical/segmentation.d.ts.map +1 -0
  84. package/dist/empirical/segmentation.js +379 -0
  85. package/dist/empirical/segmentation.js.map +1 -0
  86. package/dist/empirical/statistics.d.ts +118 -0
  87. package/dist/empirical/statistics.d.ts.map +1 -0
  88. package/dist/empirical/statistics.js +344 -0
  89. package/dist/empirical/statistics.js.map +1 -0
  90. package/dist/empirical/sweet-spot.d.ts +81 -0
  91. package/dist/empirical/sweet-spot.d.ts.map +1 -0
  92. package/dist/empirical/sweet-spot.js +198 -0
  93. package/dist/empirical/sweet-spot.js.map +1 -0
  94. package/package.json +2 -2
@@ -0,0 +1,354 @@
1
+ /**
2
+ * Engagement Analysis
3
+ *
4
+ * Analyzes the relationship between performance and user engagement.
5
+ * Key metrics: bounce rate, page views per session, session duration.
6
+ *
7
+ * This complements conversion analysis by showing HOW performance
8
+ * affects user behavior before conversion decisions.
9
+ *
10
+ * @author Kanmi Obasa <i@kanmiobasa.com>
11
+ */
12
+ // =============================================================================
13
+ // ENGAGEMENT CURVE BUILDER
14
+ // =============================================================================
15
+ /**
16
+ * Build an engagement curve showing bounce rate by performance bucket.
17
+ */
18
+ export function buildEngagementCurve(sessions, metric, config = {}) {
19
+ const { minSessions = 50 } = config;
20
+ const getValue = getMetricExtractor(metric);
21
+ const validSessions = sessions.filter((s) => getValue(s) !== null);
22
+ const boundaries = config.bucketBoundaries || getDefaultBoundaries(metric);
23
+ // Initialize buckets
24
+ const bucketMap = new Map();
25
+ for (const boundary of boundaries) {
26
+ bucketMap.set(boundary, []);
27
+ }
28
+ bucketMap.set(Infinity, []);
29
+ // Assign sessions to buckets
30
+ for (const session of validSessions) {
31
+ const value = getValue(session);
32
+ const bucket = findBucket(value, boundaries);
33
+ bucketMap.get(bucket).push(session);
34
+ }
35
+ // Calculate stats for each bucket
36
+ const buckets = [];
37
+ const sortedBoundaries = [...boundaries, Infinity].sort((a, b) => a - b);
38
+ let prevBoundary = 0;
39
+ for (const boundary of sortedBoundaries) {
40
+ const bucketSessions = bucketMap.get(boundary) || [];
41
+ if (bucketSessions.length === 0) {
42
+ prevBoundary = boundary;
43
+ continue;
44
+ }
45
+ const bounces = bucketSessions.filter((s) => s.bounced).length;
46
+ const bounceRate = bucketSessions.length > 0 ? bounces / bucketSessions.length : 0;
47
+ const totalPageViews = bucketSessions.reduce((sum, s) => sum + s.page_views, 0);
48
+ const avgPageViews = bucketSessions.length > 0 ? totalPageViews / bucketSessions.length : 0;
49
+ const totalDuration = bucketSessions.reduce((sum, s) => sum + (s.session_duration_ms || 0), 0);
50
+ const avgDuration = bucketSessions.length > 0 ? totalDuration / bucketSessions.length : 0;
51
+ let confidence = 'low';
52
+ if (bucketSessions.length >= 100) {
53
+ confidence = 'high';
54
+ }
55
+ else if (bucketSessions.length >= minSessions) {
56
+ confidence = 'medium';
57
+ }
58
+ buckets.push({
59
+ range: formatRange(prevBoundary, boundary, metric),
60
+ lower_ms: prevBoundary,
61
+ upper_ms: boundary,
62
+ sessions: bucketSessions.length,
63
+ bounces,
64
+ bounce_rate: bounceRate,
65
+ avg_page_views: avgPageViews,
66
+ avg_session_duration_ms: avgDuration,
67
+ confidence,
68
+ });
69
+ prevBoundary = boundary;
70
+ }
71
+ // Calculate summary
72
+ const totalSessions = validSessions.length;
73
+ const totalBounces = validSessions.filter((s) => s.bounced).length;
74
+ const overallBounceRate = totalSessions > 0 ? totalBounces / totalSessions : 0;
75
+ const totalPageViews = validSessions.reduce((sum, s) => sum + s.page_views, 0);
76
+ const avgPageViews = totalSessions > 0 ? totalPageViews / totalSessions : 0;
77
+ const totalDuration = validSessions.reduce((sum, s) => sum + (s.session_duration_ms || 0), 0);
78
+ const avgDuration = totalSessions > 0 ? totalDuration / totalSessions : 0;
79
+ const fastestBucket = buckets[0];
80
+ const slowestBucket = buckets[buckets.length - 1];
81
+ const bounceRateRange = fastestBucket && slowestBucket
82
+ ? slowestBucket.bounce_rate - fastestBucket.bounce_rate
83
+ : 0;
84
+ const relativeBounceIncrease = fastestBucket?.bounce_rate > 0
85
+ ? bounceRateRange / fastestBucket.bounce_rate
86
+ : 0;
87
+ return {
88
+ metric,
89
+ buckets,
90
+ summary: {
91
+ total_sessions: totalSessions,
92
+ total_bounces: totalBounces,
93
+ overall_bounce_rate: overallBounceRate,
94
+ avg_page_views: avgPageViews,
95
+ avg_session_duration_ms: avgDuration,
96
+ bounce_rate_range: bounceRateRange,
97
+ relative_bounce_increase: relativeBounceIncrease,
98
+ },
99
+ };
100
+ }
101
+ /**
102
+ * Build engagement curves for all performance metrics.
103
+ */
104
+ export function buildAllEngagementCurves(sessions, config = {}) {
105
+ return {
106
+ lcp: buildEngagementCurve(sessions, 'lcp', config),
107
+ fcp: buildEngagementCurve(sessions, 'fcp', config),
108
+ inp: buildEngagementCurve(sessions, 'inp', config),
109
+ cls: buildEngagementCurve(sessions, 'cls', config),
110
+ ttfb: buildEngagementCurve(sessions, 'ttfb', config),
111
+ tti: buildEngagementCurve(sessions, 'tti', config),
112
+ onload: buildEngagementCurve(sessions, 'onload', config),
113
+ page_size: buildEngagementCurve(sessions, 'page_size', config),
114
+ };
115
+ }
116
+ // =============================================================================
117
+ // ENGAGEMENT OPPORTUNITY CALCULATOR
118
+ // =============================================================================
119
+ /**
120
+ * Calculate engagement opportunities for a single metric.
121
+ */
122
+ export function calculateEngagementOpportunity(curve, targetMs) {
123
+ // Partition buckets into fast and slow
124
+ const fastBuckets = curve.buckets.filter((b) => b.upper_ms <= targetMs);
125
+ const slowBuckets = curve.buckets.filter((b) => b.lower_ms >= targetMs);
126
+ const fastSessions = fastBuckets.reduce((sum, b) => sum + b.sessions, 0);
127
+ const slowSessions = slowBuckets.reduce((sum, b) => sum + b.sessions, 0);
128
+ if (fastSessions < 50 || slowSessions < 50) {
129
+ return null;
130
+ }
131
+ const fastBounces = fastBuckets.reduce((sum, b) => sum + b.bounces, 0);
132
+ const slowBounces = slowBuckets.reduce((sum, b) => sum + b.bounces, 0);
133
+ const fastBounceRate = fastBounces / fastSessions;
134
+ const slowBounceRate = slowBounces / slowSessions;
135
+ const bounceRateDelta = slowBounceRate - fastBounceRate;
136
+ if (bounceRateDelta <= 0) {
137
+ return null;
138
+ }
139
+ const potentialBouncesPrevented = Math.round(slowSessions * bounceRateDelta);
140
+ let confidence = 'low';
141
+ const minSessions = Math.min(fastSessions, slowSessions);
142
+ if (minSessions >= 100) {
143
+ confidence = 'high';
144
+ }
145
+ else if (minSessions >= 50) {
146
+ confidence = 'medium';
147
+ }
148
+ const metricLabel = curve.metric.toUpperCase();
149
+ const targetLabel = formatTargetLabel(targetMs, curve.metric);
150
+ const slowPct = ((slowSessions / curve.summary.total_sessions) * 100).toFixed(0);
151
+ const bounceIncreasePct = ((bounceRateDelta / fastBounceRate) * 100).toFixed(0);
152
+ return {
153
+ metric: curve.metric,
154
+ target_ms: targetMs,
155
+ slow_sessions: slowSessions,
156
+ slow_bounce_rate: slowBounceRate,
157
+ fast_bounce_rate: fastBounceRate,
158
+ bounce_rate_delta: bounceRateDelta,
159
+ potential_bounces_prevented: potentialBouncesPrevented,
160
+ confidence,
161
+ insight: `${slowPct}% of sessions have ${metricLabel} > ${targetLabel}. These sessions bounce ${bounceIncreasePct}% more often. Improving could prevent ~${potentialBouncesPrevented.toLocaleString()} bounces.`,
162
+ };
163
+ }
164
+ /**
165
+ * Generate a full engagement report.
166
+ */
167
+ export function generateEngagementReport(sessions, config = {}) {
168
+ const curves = buildAllEngagementCurves(sessions, config);
169
+ // Calculate opportunities for each metric at standard thresholds
170
+ const opportunities = [];
171
+ const targets = {
172
+ lcp: [2500, 4000],
173
+ fcp: [1800, 3000],
174
+ inp: [200, 500],
175
+ cls: [100, 250],
176
+ ttfb: [800, 1800],
177
+ tti: [3800, 7300],
178
+ onload: [3000, 6000],
179
+ page_size: [3000, 6000],
180
+ };
181
+ for (const [metric, thresholds] of Object.entries(targets)) {
182
+ for (const target of thresholds) {
183
+ const opportunity = calculateEngagementOpportunity(curves[metric], target);
184
+ if (opportunity && opportunity.confidence !== 'low') {
185
+ opportunities.push(opportunity);
186
+ }
187
+ }
188
+ }
189
+ // Sort by potential impact
190
+ opportunities.sort((a, b) => b.potential_bounces_prevented - a.potential_bounces_prevented);
191
+ // Find primary driver
192
+ let primaryDriver = null;
193
+ let primaryImpact = '';
194
+ if (opportunities.length > 0) {
195
+ const top = opportunities[0];
196
+ primaryDriver = top.metric;
197
+ primaryImpact = top.insight;
198
+ }
199
+ // Overall summary
200
+ const totalSessions = sessions.length;
201
+ const totalBounces = sessions.filter((s) => s.bounced).length;
202
+ const overallBounceRate = totalSessions > 0 ? totalBounces / totalSessions : 0;
203
+ const totalPageViews = sessions.reduce((sum, s) => sum + s.page_views, 0);
204
+ const avgPageViews = totalSessions > 0 ? totalPageViews / totalSessions : 0;
205
+ return {
206
+ curves,
207
+ opportunities,
208
+ summary: {
209
+ total_sessions: totalSessions,
210
+ overall_bounce_rate: overallBounceRate,
211
+ avg_page_views: avgPageViews,
212
+ primary_driver: primaryDriver,
213
+ primary_driver_impact: primaryImpact,
214
+ },
215
+ };
216
+ }
217
+ /**
218
+ * Generate a markdown report of engagement analysis.
219
+ */
220
+ export function generateEngagementMarkdownReport(report) {
221
+ const lines = [];
222
+ lines.push('# Engagement Analysis Report');
223
+ lines.push('');
224
+ lines.push('> Analyzing how performance affects user engagement: bounce rate, page views, and session duration.');
225
+ lines.push('');
226
+ // Summary
227
+ lines.push('## Summary');
228
+ lines.push('');
229
+ lines.push(`- **Total Sessions:** ${report.summary.total_sessions.toLocaleString()}`);
230
+ lines.push(`- **Overall Bounce Rate:** ${(report.summary.overall_bounce_rate * 100).toFixed(1)}%`);
231
+ lines.push(`- **Average Page Views:** ${report.summary.avg_page_views.toFixed(1)}`);
232
+ lines.push('');
233
+ if (report.summary.primary_driver) {
234
+ lines.push('### Primary Performance Driver');
235
+ lines.push('');
236
+ lines.push(`**${report.summary.primary_driver.toUpperCase()}** has the largest impact on engagement.`);
237
+ lines.push('');
238
+ lines.push(report.summary.primary_driver_impact);
239
+ lines.push('');
240
+ }
241
+ // Bounce Rate by Metric
242
+ lines.push('## Bounce Rate by Performance');
243
+ lines.push('');
244
+ for (const [metric, curve] of Object.entries(report.curves)) {
245
+ if (curve.buckets.length === 0)
246
+ continue;
247
+ const metricLabel = metric === 'page_size' ? 'Page Size' : metric.toUpperCase();
248
+ lines.push(`### ${metricLabel}`);
249
+ lines.push('');
250
+ lines.push('| Range | Sessions | Bounce Rate | Avg Page Views | Avg Duration |');
251
+ lines.push('|-------|----------|-------------|----------------|--------------|');
252
+ for (const bucket of curve.buckets) {
253
+ const bounceRatePct = (bucket.bounce_rate * 100).toFixed(1);
254
+ const durationMin = (bucket.avg_session_duration_ms / 60000).toFixed(1);
255
+ lines.push(`| ${bucket.range} | ${bucket.sessions.toLocaleString()} | ${bounceRatePct}% | ${bucket.avg_page_views.toFixed(1)} | ${durationMin}m |`);
256
+ }
257
+ if (curve.summary.relative_bounce_increase > 0.1) {
258
+ const increasePct = (curve.summary.relative_bounce_increase * 100).toFixed(0);
259
+ lines.push('');
260
+ lines.push(`**Insight:** Slowest bucket bounces ${increasePct}% more than fastest bucket.`);
261
+ }
262
+ lines.push('');
263
+ }
264
+ // Opportunities
265
+ if (report.opportunities.length > 0) {
266
+ lines.push('## Opportunities to Reduce Bounce Rate');
267
+ lines.push('');
268
+ lines.push('| Metric | Target | Slow Sessions | Bounce Increase | Bounces Prevented |');
269
+ lines.push('|--------|--------|---------------|-----------------|-------------------|');
270
+ for (const opp of report.opportunities.slice(0, 5)) {
271
+ const targetLabel = formatTargetLabel(opp.target_ms, opp.metric);
272
+ const bounceIncrease = ((opp.bounce_rate_delta / opp.fast_bounce_rate) * 100).toFixed(0);
273
+ lines.push(`| ${opp.metric.toUpperCase()} | ${targetLabel} | ${opp.slow_sessions.toLocaleString()} | +${bounceIncrease}% | ~${opp.potential_bounces_prevented.toLocaleString()} |`);
274
+ }
275
+ lines.push('');
276
+ }
277
+ lines.push('---');
278
+ lines.push('*Generated by Empirical Performance Revenue Engine*');
279
+ return lines.join('\n');
280
+ }
281
+ // =============================================================================
282
+ // HELPERS
283
+ // =============================================================================
284
+ function getMetricExtractor(metric) {
285
+ switch (metric) {
286
+ case 'lcp':
287
+ return (s) => s.lcp_ms;
288
+ case 'fcp':
289
+ return (s) => s.fcp_ms;
290
+ case 'inp':
291
+ return (s) => s.inp_ms;
292
+ case 'cls':
293
+ return (s) => (s.cls !== null ? s.cls * 1000 : null);
294
+ case 'ttfb':
295
+ return (s) => s.ttfb_ms;
296
+ case 'tti':
297
+ return (s) => s.tti_ms;
298
+ case 'onload':
299
+ return (s) => s.onload_ms;
300
+ case 'page_size':
301
+ return (s) => s.page_size_kb;
302
+ }
303
+ }
304
+ function getDefaultBoundaries(metric) {
305
+ switch (metric) {
306
+ case 'lcp':
307
+ return [1000, 1500, 2000, 2500, 3000, 3500, 4000, 5000, 6000];
308
+ case 'fcp':
309
+ return [500, 1000, 1500, 1800, 2200, 2600, 3000, 4000];
310
+ case 'inp':
311
+ return [50, 100, 150, 200, 300, 400, 500, 750];
312
+ case 'cls':
313
+ return [25, 50, 75, 100, 150, 200, 250, 350];
314
+ case 'ttfb':
315
+ return [200, 400, 600, 800, 1000, 1500, 2000, 3000];
316
+ case 'tti':
317
+ return [2000, 3000, 3800, 5000, 6000, 7300, 9000, 12000];
318
+ case 'onload':
319
+ return [1500, 2000, 2500, 3000, 4000, 5000, 6000, 8000];
320
+ case 'page_size':
321
+ return [1000, 2000, 3000, 4000, 5000, 6000, 8000, 10000];
322
+ }
323
+ }
324
+ function findBucket(value, boundaries) {
325
+ for (const boundary of boundaries.sort((a, b) => a - b)) {
326
+ if (value < boundary) {
327
+ return boundary;
328
+ }
329
+ }
330
+ return Infinity;
331
+ }
332
+ function formatRange(lower, upper, metric) {
333
+ if (metric === 'cls') {
334
+ const lowerCls = (lower / 1000).toFixed(2);
335
+ const upperCls = upper === Infinity ? '∞' : (upper / 1000).toFixed(2);
336
+ return `${lowerCls}-${upperCls}`;
337
+ }
338
+ const lowerSec = (lower / 1000).toFixed(1);
339
+ const upperSec = upper === Infinity ? '∞' : (upper / 1000).toFixed(1);
340
+ return `${lowerSec}s-${upperSec}s`;
341
+ }
342
+ function formatTargetLabel(targetMs, metric) {
343
+ if (metric === 'cls') {
344
+ return (targetMs / 1000).toFixed(2);
345
+ }
346
+ if (metric === 'page_size') {
347
+ return `${(targetMs / 1000).toFixed(1)}MB`;
348
+ }
349
+ if (targetMs >= 1000) {
350
+ return `${(targetMs / 1000).toFixed(1)}s`;
351
+ }
352
+ return `${targetMs}ms`;
353
+ }
354
+ //# sourceMappingURL=engagement-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engagement-analysis.js","sourceRoot":"","sources":["../../src/empirical/engagement-analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Export Formats
3
+ *
4
+ * Export analysis results to various formats:
5
+ * - JSON (machine-readable)
6
+ * - CSV (spreadsheet-compatible)
7
+ * - Slack (formatted message blocks)
8
+ * - Email (HTML email template)
9
+ *
10
+ * @author Kanmi Obasa <i@kanmiobasa.com>
11
+ */
12
+ import type { AnalysisResult } from './index.js';
13
+ import type { AlertReport } from './alerting.js';
14
+ export interface ExportOptions {
15
+ includeRawData?: boolean;
16
+ format?: 'compact' | 'pretty';
17
+ clientName?: string;
18
+ dateRange?: {
19
+ start: string;
20
+ end: string;
21
+ };
22
+ }
23
+ export interface SlackBlock {
24
+ type: 'section' | 'header' | 'divider' | 'context';
25
+ text?: {
26
+ type: 'mrkdwn' | 'plain_text';
27
+ text: string;
28
+ };
29
+ fields?: Array<{
30
+ type: 'mrkdwn' | 'plain_text';
31
+ text: string;
32
+ }>;
33
+ }
34
+ export interface SlackMessage {
35
+ blocks: SlackBlock[];
36
+ text: string;
37
+ }
38
+ export interface EmailTemplate {
39
+ subject: string;
40
+ html: string;
41
+ text: string;
42
+ }
43
+ /**
44
+ * Export analysis to JSON.
45
+ */
46
+ export declare function exportToJson(result: AnalysisResult, options?: ExportOptions): string;
47
+ /**
48
+ * Export opportunities to CSV.
49
+ */
50
+ export declare function exportOpportunitiesToCsv(result: AnalysisResult): string;
51
+ /**
52
+ * Export curve data to CSV.
53
+ */
54
+ export declare function exportCurvesToCsv(result: AnalysisResult): string;
55
+ /**
56
+ * Format analysis result for Slack.
57
+ */
58
+ export declare function exportToSlack(result: AnalysisResult, options?: ExportOptions): SlackMessage;
59
+ /**
60
+ * Format alerts for Slack.
61
+ */
62
+ export declare function exportAlertsToSlack(report: AlertReport): SlackMessage;
63
+ /**
64
+ * Generate email template from analysis.
65
+ */
66
+ export declare function exportToEmail(result: AnalysisResult, options?: ExportOptions): EmailTemplate;
67
+ /**
68
+ * Generate webhook payload.
69
+ */
70
+ export declare function exportToWebhook(result: AnalysisResult, options?: ExportOptions): Record<string, unknown>;
71
+ /**
72
+ * Generate webhook payload for alerts.
73
+ */
74
+ export declare function exportAlertWebhook(report: AlertReport): Record<string, unknown>;
75
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/empirical/export.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAMjD,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IACnD,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,QAAQ,GAAG,YAAY,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,QAAQ,GAAG,YAAY,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAgCR;AAMD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA6BvE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA8BhE;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,aAAkB,GAC1B,YAAY,CA+Ed;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,CAuDrE;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,aAAkB,GAC1B,aAAa,CA4Gf;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAa/E"}