kanmi-perf-revenue 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/README.md +196 -186
  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-session-query.d.ts +32 -0
  31. package/dist/empirical/datadog-session-query.d.ts.map +1 -1
  32. package/dist/empirical/datadog-session-query.js +238 -17
  33. package/dist/empirical/datadog-session-query.js.map +1 -1
  34. package/dist/empirical/engagement-analysis.d.ts +112 -0
  35. package/dist/empirical/engagement-analysis.d.ts.map +1 -0
  36. package/dist/empirical/engagement-analysis.js +354 -0
  37. package/dist/empirical/engagement-analysis.js.map +1 -0
  38. package/dist/empirical/export.d.ts +75 -0
  39. package/dist/empirical/export.d.ts.map +1 -0
  40. package/dist/empirical/export.js +392 -0
  41. package/dist/empirical/export.js.map +1 -0
  42. package/dist/empirical/forecasting.d.ts +80 -0
  43. package/dist/empirical/forecasting.d.ts.map +1 -0
  44. package/dist/empirical/forecasting.js +287 -0
  45. package/dist/empirical/forecasting.js.map +1 -0
  46. package/dist/empirical/funnel.d.ts +66 -0
  47. package/dist/empirical/funnel.d.ts.map +1 -0
  48. package/dist/empirical/funnel.js +293 -0
  49. package/dist/empirical/funnel.js.map +1 -0
  50. package/dist/empirical/history.d.ts +198 -0
  51. package/dist/empirical/history.d.ts.map +1 -0
  52. package/dist/empirical/history.js +396 -0
  53. package/dist/empirical/history.js.map +1 -0
  54. package/dist/empirical/index.d.ts +39 -16
  55. package/dist/empirical/index.d.ts.map +1 -1
  56. package/dist/empirical/index.js +95 -13
  57. package/dist/empirical/index.js.map +1 -1
  58. package/dist/empirical/interactions.d.ts +89 -0
  59. package/dist/empirical/interactions.d.ts.map +1 -0
  60. package/dist/empirical/interactions.js +346 -0
  61. package/dist/empirical/interactions.js.map +1 -0
  62. package/dist/empirical/opportunity-calculator.d.ts +6 -18
  63. package/dist/empirical/opportunity-calculator.d.ts.map +1 -1
  64. package/dist/empirical/opportunity-calculator.js +19 -1
  65. package/dist/empirical/opportunity-calculator.js.map +1 -1
  66. package/dist/empirical/report.d.ts +3 -11
  67. package/dist/empirical/report.d.ts.map +1 -1
  68. package/dist/empirical/report.js +11 -7
  69. package/dist/empirical/report.js.map +1 -1
  70. package/dist/empirical/roi-calculator.d.ts +104 -0
  71. package/dist/empirical/roi-calculator.d.ts.map +1 -0
  72. package/dist/empirical/roi-calculator.js +403 -0
  73. package/dist/empirical/roi-calculator.js.map +1 -0
  74. package/dist/empirical/seasonality.d.ts +80 -0
  75. package/dist/empirical/seasonality.d.ts.map +1 -0
  76. package/dist/empirical/seasonality.js +340 -0
  77. package/dist/empirical/seasonality.js.map +1 -0
  78. package/dist/empirical/segmentation.d.ts +135 -0
  79. package/dist/empirical/segmentation.d.ts.map +1 -0
  80. package/dist/empirical/segmentation.js +379 -0
  81. package/dist/empirical/segmentation.js.map +1 -0
  82. package/dist/empirical/statistics.d.ts +118 -0
  83. package/dist/empirical/statistics.d.ts.map +1 -0
  84. package/dist/empirical/statistics.js +344 -0
  85. package/dist/empirical/statistics.js.map +1 -0
  86. package/dist/empirical/sweet-spot.d.ts +81 -0
  87. package/dist/empirical/sweet-spot.d.ts.map +1 -0
  88. package/dist/empirical/sweet-spot.js +198 -0
  89. package/dist/empirical/sweet-spot.js.map +1 -0
  90. package/package.json +1 -1
@@ -0,0 +1,392 @@
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
+ // =============================================================================
13
+ // JSON EXPORT
14
+ // =============================================================================
15
+ /**
16
+ * Export analysis to JSON.
17
+ */
18
+ export function exportToJson(result, options = {}) {
19
+ const data = {
20
+ metadata: {
21
+ clientName: options.clientName,
22
+ generatedAt: new Date().toISOString(),
23
+ period: result.metadata.period,
24
+ totalSessions: result.metadata.totalSessions,
25
+ },
26
+ summary: {
27
+ sessionsWithLcp: result.metadata.sessionsWithLcp,
28
+ conversions: result.metadata.sessionsWithConversions,
29
+ topOpportunity: result.topOpportunity,
30
+ },
31
+ opportunities: Object.entries(result.opportunities).map(([metric, opp]) => ({
32
+ metric,
33
+ priority: opp.recommendation.priority,
34
+ targetMs: opp.recommendation.target_ms,
35
+ monthlyOpportunity: opp.recommendation.monthly_opportunity,
36
+ summary: opp.recommendation.summary,
37
+ })),
38
+ curves: options.includeRawData
39
+ ? Object.entries(result.curves).map(([metric, curve]) => ({
40
+ metric,
41
+ buckets: curve.buckets,
42
+ overallCvr: curve.summary.overall_cvr,
43
+ }))
44
+ : undefined,
45
+ };
46
+ return options.format === 'pretty'
47
+ ? JSON.stringify(data, null, 2)
48
+ : JSON.stringify(data);
49
+ }
50
+ // =============================================================================
51
+ // CSV EXPORT
52
+ // =============================================================================
53
+ /**
54
+ * Export opportunities to CSV.
55
+ */
56
+ export function exportOpportunitiesToCsv(result) {
57
+ const headers = [
58
+ 'Metric',
59
+ 'Priority',
60
+ 'Target (ms)',
61
+ 'Monthly Opportunity ($)',
62
+ 'Sessions to Improve',
63
+ 'Current CVR',
64
+ 'Target CVR',
65
+ 'Summary',
66
+ ];
67
+ const rows = [headers];
68
+ for (const [metric, opp] of Object.entries(result.opportunities)) {
69
+ const scenario = opp.scenarios[0];
70
+ rows.push([
71
+ metric.toUpperCase(),
72
+ opp.recommendation.priority,
73
+ opp.recommendation.target_ms.toString(),
74
+ opp.recommendation.monthly_opportunity.toLocaleString(),
75
+ scenario?.slow_sessions?.toString() || '',
76
+ ((scenario?.slow_cvr || 0) * 100).toFixed(2) + '%',
77
+ ((scenario?.fast_cvr || 0) * 100).toFixed(2) + '%',
78
+ `"${opp.recommendation.summary}"`,
79
+ ]);
80
+ }
81
+ return rows.map(row => row.join(',')).join('\n');
82
+ }
83
+ /**
84
+ * Export curve data to CSV.
85
+ */
86
+ export function exportCurvesToCsv(result) {
87
+ const headers = [
88
+ 'Metric',
89
+ 'Bucket',
90
+ 'Min',
91
+ 'Max',
92
+ 'Sessions',
93
+ 'Conversions',
94
+ 'CVR',
95
+ 'AOV',
96
+ ];
97
+ const rows = [headers];
98
+ for (const [metric, curve] of Object.entries(result.curves)) {
99
+ for (const bucket of curve.buckets) {
100
+ rows.push([
101
+ metric.toUpperCase(),
102
+ bucket.range,
103
+ bucket.lower_ms.toString(),
104
+ bucket.upper_ms.toString(),
105
+ bucket.sessions.toString(),
106
+ bucket.conversions.toString(),
107
+ (bucket.conversion_rate * 100).toFixed(4) + '%',
108
+ '$' + bucket.aov.toFixed(2),
109
+ ]);
110
+ }
111
+ }
112
+ return rows.map(row => row.join(',')).join('\n');
113
+ }
114
+ // =============================================================================
115
+ // SLACK EXPORT
116
+ // =============================================================================
117
+ /**
118
+ * Format analysis result for Slack.
119
+ */
120
+ export function exportToSlack(result, options = {}) {
121
+ const blocks = [];
122
+ // Header
123
+ blocks.push({
124
+ type: 'header',
125
+ text: {
126
+ type: 'plain_text',
127
+ text: `📊 Performance Revenue Analysis${options.clientName ? ` - ${options.clientName}` : ''}`,
128
+ },
129
+ });
130
+ // Divider
131
+ blocks.push({ type: 'divider' });
132
+ // Summary
133
+ blocks.push({
134
+ type: 'section',
135
+ fields: [
136
+ {
137
+ type: 'mrkdwn',
138
+ text: `*Sessions Analyzed*\n${result.metadata.totalSessions.toLocaleString()}`,
139
+ },
140
+ {
141
+ type: 'mrkdwn',
142
+ text: `*Conversions*\n${result.metadata.sessionsWithConversions.toLocaleString()}`,
143
+ },
144
+ ],
145
+ });
146
+ // Top Opportunity
147
+ if (result.topOpportunity) {
148
+ blocks.push({
149
+ type: 'section',
150
+ text: {
151
+ type: 'mrkdwn',
152
+ text: `*🎯 Top Opportunity*\n${result.topOpportunity.summary}\n\n*Potential Monthly Revenue:* $${result.topOpportunity.monthlyRevenue.toLocaleString()}`,
153
+ },
154
+ });
155
+ }
156
+ // Divider
157
+ blocks.push({ type: 'divider' });
158
+ // All opportunities
159
+ blocks.push({
160
+ type: 'section',
161
+ text: {
162
+ type: 'mrkdwn',
163
+ text: '*All Opportunities*',
164
+ },
165
+ });
166
+ for (const [metric, opp] of Object.entries(result.opportunities)) {
167
+ const priority = opp.recommendation.priority;
168
+ const emoji = priority === 'high' ? '🔴' : priority === 'medium' ? '🟡' : '🟢';
169
+ blocks.push({
170
+ type: 'section',
171
+ text: {
172
+ type: 'mrkdwn',
173
+ text: `${emoji} *${metric.toUpperCase()}*: $${opp.recommendation.monthly_opportunity.toLocaleString()}/month (${priority} priority)`,
174
+ },
175
+ });
176
+ }
177
+ // Context
178
+ blocks.push({
179
+ type: 'context',
180
+ text: {
181
+ type: 'mrkdwn',
182
+ text: `Analysis period: ${result.metadata.period.start} to ${result.metadata.period.end}`,
183
+ },
184
+ });
185
+ return {
186
+ blocks,
187
+ text: `Performance Revenue Analysis: $${result.topOpportunity?.monthlyRevenue.toLocaleString() || 0} monthly opportunity`,
188
+ };
189
+ }
190
+ /**
191
+ * Format alerts for Slack.
192
+ */
193
+ export function exportAlertsToSlack(report) {
194
+ const blocks = [];
195
+ // Header
196
+ const emoji = report.summary.critical > 0 ? '🚨' :
197
+ report.summary.warning > 0 ? '⚠️' : '✅';
198
+ blocks.push({
199
+ type: 'header',
200
+ text: {
201
+ type: 'plain_text',
202
+ text: `${emoji} Performance Alert Report`,
203
+ },
204
+ });
205
+ // Summary
206
+ blocks.push({
207
+ type: 'section',
208
+ fields: [
209
+ { type: 'mrkdwn', text: `*Critical*\n${report.summary.critical}` },
210
+ { type: 'mrkdwn', text: `*Warning*\n${report.summary.warning}` },
211
+ { type: 'mrkdwn', text: `*Info*\n${report.summary.info}` },
212
+ { type: 'mrkdwn', text: `*Total*\n${report.summary.total}` },
213
+ ],
214
+ });
215
+ if (report.alerts.length > 0) {
216
+ blocks.push({ type: 'divider' });
217
+ blocks.push({
218
+ type: 'section',
219
+ text: {
220
+ type: 'mrkdwn',
221
+ text: '*Active Alerts*',
222
+ },
223
+ });
224
+ for (const alert of report.alerts.slice(0, 10)) {
225
+ const alertEmoji = alert.severity === 'critical' ? '🚨' :
226
+ alert.severity === 'warning' ? '⚠️' : 'ℹ️';
227
+ blocks.push({
228
+ type: 'section',
229
+ text: {
230
+ type: 'mrkdwn',
231
+ text: `${alertEmoji} ${alert.message}`,
232
+ },
233
+ });
234
+ }
235
+ }
236
+ return {
237
+ blocks,
238
+ text: `${emoji} Performance Alert: ${report.summary.critical} critical, ${report.summary.warning} warning`,
239
+ };
240
+ }
241
+ // =============================================================================
242
+ // EMAIL EXPORT
243
+ // =============================================================================
244
+ /**
245
+ * Generate email template from analysis.
246
+ */
247
+ export function exportToEmail(result, options = {}) {
248
+ const subject = `Performance Revenue Report${options.clientName ? ` - ${options.clientName}` : ''} | ${result.metadata.period.start} to ${result.metadata.period.end}`;
249
+ const topOpp = result.topOpportunity;
250
+ const html = `
251
+ <!DOCTYPE html>
252
+ <html>
253
+ <head>
254
+ <style>
255
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px; }
256
+ h1 { color: #1a1a2e; border-bottom: 2px solid #4a47a3; padding-bottom: 10px; }
257
+ h2 { color: #4a47a3; }
258
+ .highlight { background: #f0f0ff; padding: 15px; border-radius: 8px; margin: 15px 0; }
259
+ .opportunity { background: #e8f5e9; padding: 15px; border-radius: 8px; margin: 10px 0; border-left: 4px solid #4caf50; }
260
+ .metric { display: inline-block; margin: 10px 20px 10px 0; }
261
+ .metric-value { font-size: 24px; font-weight: bold; color: #1a1a2e; }
262
+ .metric-label { color: #666; font-size: 14px; }
263
+ table { width: 100%; border-collapse: collapse; margin: 15px 0; }
264
+ th, td { padding: 10px; text-align: left; border-bottom: 1px solid #ddd; }
265
+ th { background: #f5f5f5; }
266
+ .priority-high { color: #d32f2f; }
267
+ .priority-medium { color: #f57c00; }
268
+ .priority-low { color: #388e3c; }
269
+ .footer { margin-top: 30px; padding-top: 20px; border-top: 1px solid #ddd; color: #666; font-size: 12px; }
270
+ </style>
271
+ </head>
272
+ <body>
273
+ <h1>📊 Performance Revenue Report</h1>
274
+ ${options.clientName ? `<p><strong>Client:</strong> ${options.clientName}</p>` : ''}
275
+ <p><strong>Period:</strong> ${result.metadata.period.start} to ${result.metadata.period.end}</p>
276
+
277
+ <div class="highlight">
278
+ <div class="metric">
279
+ <div class="metric-value">${result.metadata.totalSessions.toLocaleString()}</div>
280
+ <div class="metric-label">Sessions Analyzed</div>
281
+ </div>
282
+ <div class="metric">
283
+ <div class="metric-value">${result.metadata.sessionsWithConversions.toLocaleString()}</div>
284
+ <div class="metric-label">Conversions</div>
285
+ </div>
286
+ <div class="metric">
287
+ <div class="metric-value">${((result.metadata.sessionsWithConversions / result.metadata.totalSessions) * 100).toFixed(2)}%</div>
288
+ <div class="metric-label">Conversion Rate</div>
289
+ </div>
290
+ </div>
291
+
292
+ ${topOpp ? `
293
+ <div class="opportunity">
294
+ <h2>🎯 Top Opportunity</h2>
295
+ <p><strong>${topOpp.summary}</strong></p>
296
+ <p style="font-size: 24px; margin: 10px 0;"><strong>$${topOpp.monthlyRevenue.toLocaleString()}</strong> potential monthly revenue</p>
297
+ </div>
298
+ ` : ''}
299
+
300
+ <h2>All Opportunities</h2>
301
+ <table>
302
+ <tr>
303
+ <th>Metric</th>
304
+ <th>Priority</th>
305
+ <th>Monthly Opportunity</th>
306
+ </tr>
307
+ ${Object.entries(result.opportunities).map(([metric, opp]) => `
308
+ <tr>
309
+ <td>${metric.toUpperCase()}</td>
310
+ <td class="priority-${opp.recommendation.priority}">${opp.recommendation.priority.toUpperCase()}</td>
311
+ <td><strong>$${opp.recommendation.monthly_opportunity.toLocaleString()}</strong></td>
312
+ </tr>
313
+ `).join('')}
314
+ </table>
315
+
316
+ <div class="footer">
317
+ <p>Generated by Empirical Performance Revenue Engine</p>
318
+ <p>${new Date().toISOString()}</p>
319
+ </div>
320
+ </body>
321
+ </html>
322
+ `.trim();
323
+ const text = `
324
+ Performance Revenue Report
325
+ ${options.clientName ? `Client: ${options.clientName}` : ''}
326
+ Period: ${result.metadata.period.start} to ${result.metadata.period.end}
327
+
328
+ Summary:
329
+ - Sessions Analyzed: ${result.metadata.totalSessions.toLocaleString()}
330
+ - Conversions: ${result.metadata.sessionsWithConversions.toLocaleString()}
331
+ - CVR: ${((result.metadata.sessionsWithConversions / result.metadata.totalSessions) * 100).toFixed(2)}%
332
+
333
+ ${topOpp ? `
334
+ Top Opportunity:
335
+ ${topOpp.summary}
336
+ Potential Monthly Revenue: $${topOpp.monthlyRevenue.toLocaleString()}
337
+ ` : ''}
338
+
339
+ All Opportunities:
340
+ ${Object.entries(result.opportunities).map(([metric, opp]) => `- ${metric.toUpperCase()}: $${opp.recommendation.monthly_opportunity.toLocaleString()}/month (${opp.recommendation.priority} priority)`).join('\n')}
341
+
342
+ Generated by Empirical Performance Revenue Engine
343
+ `.trim();
344
+ return {
345
+ subject,
346
+ html,
347
+ text,
348
+ };
349
+ }
350
+ // =============================================================================
351
+ // WEBHOOK EXPORT
352
+ // =============================================================================
353
+ /**
354
+ * Generate webhook payload.
355
+ */
356
+ export function exportToWebhook(result, options = {}) {
357
+ return {
358
+ event: 'performance_analysis_complete',
359
+ timestamp: new Date().toISOString(),
360
+ client: options.clientName,
361
+ period: result.metadata.period,
362
+ summary: {
363
+ totalSessions: result.metadata.totalSessions,
364
+ conversions: result.metadata.sessionsWithConversions,
365
+ cvr: result.metadata.sessionsWithConversions / result.metadata.totalSessions,
366
+ },
367
+ topOpportunity: result.topOpportunity,
368
+ opportunities: Object.entries(result.opportunities).map(([metric, opp]) => ({
369
+ metric,
370
+ priority: opp.recommendation.priority,
371
+ monthlyOpportunity: opp.recommendation.monthly_opportunity,
372
+ })),
373
+ };
374
+ }
375
+ /**
376
+ * Generate webhook payload for alerts.
377
+ */
378
+ export function exportAlertWebhook(report) {
379
+ return {
380
+ event: 'performance_alert',
381
+ timestamp: new Date().toISOString(),
382
+ summary: report.summary,
383
+ alerts: report.alerts.map(a => ({
384
+ id: a.id,
385
+ type: a.type,
386
+ severity: a.severity,
387
+ metric: a.metric,
388
+ message: a.message,
389
+ })),
390
+ };
391
+ }
392
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/empirical/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Prediction & Forecasting
3
+ *
4
+ * Project future revenue based on planned performance improvements.
5
+ * Uses empirical data and improvement scenarios.
6
+ *
7
+ * @author Kanmi Obasa <i@kanmiobasa.com>
8
+ */
9
+ import type { SessionData } from './datadog-session-query.js';
10
+ import type { ConversionCurve } from './conversion-curve.js';
11
+ export interface ImprovementScenario {
12
+ /** Descriptive name */
13
+ name: string;
14
+ /** Metric to improve */
15
+ metric: 'lcp' | 'inp' | 'cls' | 'fcp' | 'ttfb';
16
+ /** Target p75 value */
17
+ targetP75: number;
18
+ /** Confidence level (0-1) */
19
+ confidence: number;
20
+ /** Expected implementation date */
21
+ implementationDate?: string;
22
+ }
23
+ export interface ForecastPeriod {
24
+ month: number;
25
+ monthName: string;
26
+ /** Baseline revenue (no improvement) */
27
+ baselineRevenue: number;
28
+ /** Forecasted revenue with improvement */
29
+ forecastedRevenue: number;
30
+ /** Additional revenue from improvement */
31
+ additionalRevenue: number;
32
+ /** Cumulative additional revenue */
33
+ cumulativeAdditional: number;
34
+ }
35
+ export interface RevenueForecast {
36
+ scenario: ImprovementScenario;
37
+ periods: ForecastPeriod[];
38
+ summary: {
39
+ /** 12-month total additional revenue */
40
+ totalAdditionalRevenue: number;
41
+ /** Average monthly lift */
42
+ avgMonthlyLift: number;
43
+ /** Revenue growth percentage */
44
+ revenueGrowthPercent: number;
45
+ };
46
+ assumptions: string[];
47
+ }
48
+ export interface MultiForecast {
49
+ forecasts: RevenueForecast[];
50
+ combined: {
51
+ periods: ForecastPeriod[];
52
+ totalAdditionalRevenue: number;
53
+ netImpact: number;
54
+ };
55
+ recommendations: string[];
56
+ }
57
+ /**
58
+ * Generate revenue forecast for a single improvement scenario.
59
+ */
60
+ export declare function forecastRevenue(scenario: ImprovementScenario, sessions: SessionData[], curve: ConversionCurve | null, config?: {
61
+ forecastMonths?: number;
62
+ seasonalityFactors?: number[];
63
+ growthRate?: number;
64
+ }): RevenueForecast;
65
+ /**
66
+ * Generate combined forecast for multiple improvements.
67
+ */
68
+ export declare function forecastMultipleImprovements(scenarios: ImprovementScenario[], sessions: SessionData[], curves: Record<string, ConversionCurve>, config?: {
69
+ forecastMonths?: number;
70
+ synergisticBonus?: number;
71
+ }): MultiForecast;
72
+ /**
73
+ * Generate markdown report for forecast.
74
+ */
75
+ export declare function generateForecastMarkdown(forecast: RevenueForecast): string;
76
+ /**
77
+ * Generate multi-scenario comparison markdown.
78
+ */
79
+ export declare function generateMultiForecastMarkdown(multiForecast: MultiForecast): string;
80
+ //# sourceMappingURL=forecasting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forecasting.d.ts","sourceRoot":"","sources":["../../src/empirical/forecasting.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAM7D,MAAM,WAAW,mBAAmB;IAClC,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC/C,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,0CAA0C;IAC1C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oCAAoC;IACpC,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,OAAO,EAAE;QACP,wCAAwC;QACxC,sBAAsB,EAAE,MAAM,CAAC;QAC/B,2BAA2B;QAC3B,cAAc,EAAE,MAAM,CAAC;QACvB,gCAAgC;QAChC,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,QAAQ,EAAE;QACR,OAAO,EAAE,cAAc,EAAE,CAAC;QAC1B,sBAAsB,EAAE,MAAM,CAAC;QAC/B,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAmHD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,mBAAmB,EAC7B,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,EAAE,eAAe,GAAG,IAAI,EAC7B,MAAM,GAAE;IACN,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;CAChB,GACL,eAAe,CA8DjB;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,mBAAmB,EAAE,EAChC,QAAQ,EAAE,WAAW,EAAE,EACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACvC,MAAM,GAAE;IACN,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACtB,GACL,aAAa,CAqEf;AAMD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CA0C1E;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,aAAa,EAAE,aAAa,GAAG,MAAM,CAiDlF"}