Skip to main content

systemprompt_analytics/
extension.rs

1//! Extension registration — wires analytics schemas (sessions, funnels,
2//! engagement events, fingerprint reputation, anomaly thresholds) and
3//! schema-evolution migrations into the extension framework.
4//!
5//! Copyright (c) systemprompt.io — Business Source License 1.1.
6//! See <https://systemprompt.io> for licensing details.
7
8use systemprompt_extension::prelude::*;
9
10#[derive(Debug, Clone, Copy, Default)]
11pub struct AnalyticsExtension;
12
13impl Extension for AnalyticsExtension {
14    fn metadata(&self) -> ExtensionMetadata {
15        ExtensionMetadata {
16            id: "analytics",
17            name: "Analytics",
18            version: env!("CARGO_PKG_VERSION"),
19        }
20    }
21
22    fn schemas(&self) -> Vec<SchemaDefinition> {
23        vec![
24            SchemaDefinition::new(
25                "engagement_events",
26                include_str!("../schema/engagement_events.sql"),
27            )
28            .with_required_columns(vec![
29                "id".into(),
30                "session_id".into(),
31                "created_at".into(),
32            ]),
33            SchemaDefinition::new(
34                "anomaly_thresholds",
35                include_str!("../schema/anomaly_thresholds.sql"),
36            )
37            .with_required_columns(vec!["metric_name".into()]),
38            SchemaDefinition::new(
39                "fingerprint_reputation",
40                include_str!("../schema/fingerprint_reputation.sql"),
41            )
42            .with_required_columns(vec!["fingerprint_hash".into()]),
43            SchemaDefinition::new("funnels", include_str!("../schema/funnels.sql"))
44                .with_required_columns(vec!["id".into(), "name".into()]),
45            SchemaDefinition::new(
46                "funnel_progress",
47                include_str!("../schema/funnel_progress.sql"),
48            )
49            .with_required_columns(vec![
50                "id".into(),
51                "funnel_id".into(),
52                "session_id".into(),
53            ]),
54        ]
55    }
56
57    fn dependencies(&self) -> Vec<&'static str> {
58        vec!["users"]
59    }
60
61    fn migrations(&self) -> Vec<Migration> {
62        extension_migrations!()
63    }
64}
65
66register_extension!(AnalyticsExtension);