@happyvertical/smrt-analytics 0.30.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 (72) hide show
  1. package/AGENTS.md +68 -0
  2. package/CLAUDE.md +1 -0
  3. package/LICENSE +7 -0
  4. package/README.md +131 -0
  5. package/dist/__smrt-register__.d.ts +2 -0
  6. package/dist/__smrt-register__.d.ts.map +1 -0
  7. package/dist/collections/AnalyticsDataStreamCollection.d.ts +69 -0
  8. package/dist/collections/AnalyticsDataStreamCollection.d.ts.map +1 -0
  9. package/dist/collections/AnalyticsEventCollection.d.ts +131 -0
  10. package/dist/collections/AnalyticsEventCollection.d.ts.map +1 -0
  11. package/dist/collections/AnalyticsPropertyCollection.d.ts +66 -0
  12. package/dist/collections/AnalyticsPropertyCollection.d.ts.map +1 -0
  13. package/dist/collections/AnalyticsReportCollection.d.ts +69 -0
  14. package/dist/collections/AnalyticsReportCollection.d.ts.map +1 -0
  15. package/dist/collections/index.d.ts +8 -0
  16. package/dist/collections/index.d.ts.map +1 -0
  17. package/dist/index.d.ts +6 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +1623 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/manifest.json +4161 -0
  22. package/dist/models/AnalyticsDataStream.d.ts +94 -0
  23. package/dist/models/AnalyticsDataStream.d.ts.map +1 -0
  24. package/dist/models/AnalyticsEvent.d.ts +142 -0
  25. package/dist/models/AnalyticsEvent.d.ts.map +1 -0
  26. package/dist/models/AnalyticsProperty.d.ts +142 -0
  27. package/dist/models/AnalyticsProperty.d.ts.map +1 -0
  28. package/dist/models/AnalyticsReport.d.ts +206 -0
  29. package/dist/models/AnalyticsReport.d.ts.map +1 -0
  30. package/dist/models/index.d.ts +8 -0
  31. package/dist/models/index.d.ts.map +1 -0
  32. package/dist/playground.d.ts +2 -0
  33. package/dist/playground.d.ts.map +1 -0
  34. package/dist/playground.js +99 -0
  35. package/dist/playground.js.map +1 -0
  36. package/dist/prompts.d.ts +57 -0
  37. package/dist/prompts.d.ts.map +1 -0
  38. package/dist/smrt-knowledge.json +1570 -0
  39. package/dist/svelte/AnalyticsSummary.svelte +63 -0
  40. package/dist/svelte/AnalyticsSummary.svelte.d.ts +8 -0
  41. package/dist/svelte/AnalyticsSummary.svelte.d.ts.map +1 -0
  42. package/dist/svelte/EventsTable.svelte +161 -0
  43. package/dist/svelte/EventsTable.svelte.d.ts +16 -0
  44. package/dist/svelte/EventsTable.svelte.d.ts.map +1 -0
  45. package/dist/svelte/PropertyInfo.svelte +139 -0
  46. package/dist/svelte/PropertyInfo.svelte.d.ts +12 -0
  47. package/dist/svelte/PropertyInfo.svelte.d.ts.map +1 -0
  48. package/dist/svelte/PropertyStatusBadge.svelte +65 -0
  49. package/dist/svelte/PropertyStatusBadge.svelte.d.ts +7 -0
  50. package/dist/svelte/PropertyStatusBadge.svelte.d.ts.map +1 -0
  51. package/dist/svelte/StatCard.svelte +63 -0
  52. package/dist/svelte/StatCard.svelte.d.ts +11 -0
  53. package/dist/svelte/StatCard.svelte.d.ts.map +1 -0
  54. package/dist/svelte/TrendBadge.svelte +49 -0
  55. package/dist/svelte/TrendBadge.svelte.d.ts +8 -0
  56. package/dist/svelte/TrendBadge.svelte.d.ts.map +1 -0
  57. package/dist/svelte/i18n.d.ts +10 -0
  58. package/dist/svelte/i18n.d.ts.map +1 -0
  59. package/dist/svelte/i18n.js +10 -0
  60. package/dist/svelte/index.d.ts +29 -0
  61. package/dist/svelte/index.d.ts.map +1 -0
  62. package/dist/svelte/index.js +39 -0
  63. package/dist/svelte/playground.d.ts +88 -0
  64. package/dist/svelte/playground.d.ts.map +1 -0
  65. package/dist/svelte/playground.js +95 -0
  66. package/dist/types/index.d.ts +267 -0
  67. package/dist/types/index.d.ts.map +1 -0
  68. package/dist/ui.d.ts +10 -0
  69. package/dist/ui.d.ts.map +1 -0
  70. package/dist/ui.js +79 -0
  71. package/dist/ui.js.map +1 -0
  72. package/package.json +95 -0
@@ -0,0 +1,99 @@
1
+ const sampleStats = {
2
+ todayPageviews: 18240,
3
+ yesterdayPageviews: 15980,
4
+ todayUsers: 3924,
5
+ yesterdayUsers: 3410,
6
+ trend: "up",
7
+ trendPercent: 14.1
8
+ };
9
+ const sampleEvents = [
10
+ {
11
+ id: "analytics-event-1",
12
+ eventName: "page_view",
13
+ clientId: "client_01HJQ9M4X0A8Q2D",
14
+ pagePath: "/guides/editorial-playbook",
15
+ eventTimestamp: "2026-03-21T16:14:00.000Z",
16
+ status: "sent"
17
+ },
18
+ {
19
+ id: "analytics-event-2",
20
+ eventName: "cta_click",
21
+ clientId: "client_01HJQ9M4X0A8Q2D",
22
+ pagePath: "/pricing",
23
+ eventTimestamp: "2026-03-21T16:10:00.000Z",
24
+ status: "sent"
25
+ },
26
+ {
27
+ id: "analytics-event-3",
28
+ eventName: "form_submit",
29
+ clientId: "client_01HJQ9NGH1J9Q8R",
30
+ pagePath: "/newsletter",
31
+ eventTimestamp: "2026-03-21T15:58:00.000Z",
32
+ status: "pending"
33
+ }
34
+ ];
35
+ const loadAnalyticsSummary = () => import("./svelte/AnalyticsSummary.svelte");
36
+ const loadEventsTable = () => import("./svelte/EventsTable.svelte");
37
+ const loadPropertyInfo = () => import("./svelte/PropertyInfo.svelte");
38
+ const playground = {
39
+ packageName: "@happyvertical/smrt-analytics",
40
+ displayName: "Analytics",
41
+ description: "Dashboard primitives for property health, traffic trends, and recent event delivery.",
42
+ entries: [
43
+ {
44
+ id: "analytics-summary",
45
+ title: "Analytics Summary",
46
+ description: "Traffic summary cards that surface today-vs-yesterday performance at a glance.",
47
+ loadComponent: loadAnalyticsSummary,
48
+ order: 1,
49
+ props: {
50
+ stats: sampleStats
51
+ },
52
+ modes: {
53
+ mock: {
54
+ label: "Mock"
55
+ }
56
+ }
57
+ },
58
+ {
59
+ id: "events-table",
60
+ title: "Events Table",
61
+ description: "Recent outbound analytics events with delivery status and page context.",
62
+ loadComponent: loadEventsTable,
63
+ order: 2,
64
+ props: {
65
+ events: sampleEvents,
66
+ maxRows: 8
67
+ },
68
+ modes: {
69
+ mock: {
70
+ label: "Mock"
71
+ }
72
+ }
73
+ },
74
+ {
75
+ id: "property-info",
76
+ title: "Property Info",
77
+ description: "Connection status and property metadata for a configured analytics destination.",
78
+ loadComponent: loadPropertyInfo,
79
+ order: 3,
80
+ props: {
81
+ propertyId: "properties/348920114",
82
+ measurementId: "G-9A4F2P7Q1C",
83
+ provider: "ga4",
84
+ status: "active",
85
+ lastSyncAt: "2026-03-21T16:05:00.000Z",
86
+ siteDomain: "newsroom.example.com"
87
+ },
88
+ modes: {
89
+ mock: {
90
+ label: "Mock"
91
+ }
92
+ }
93
+ }
94
+ ]
95
+ };
96
+ export {
97
+ playground as default
98
+ };
99
+ //# sourceMappingURL=playground.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playground.js","sources":["../src/svelte/playground.ts"],"sourcesContent":["const sampleStats = {\n todayPageviews: 18240,\n yesterdayPageviews: 15980,\n todayUsers: 3924,\n yesterdayUsers: 3410,\n trend: 'up',\n trendPercent: 14.1,\n};\n\nconst sampleEvents = [\n {\n id: 'analytics-event-1',\n eventName: 'page_view',\n clientId: 'client_01HJQ9M4X0A8Q2D',\n pagePath: '/guides/editorial-playbook',\n eventTimestamp: '2026-03-21T16:14:00.000Z',\n status: 'sent',\n },\n {\n id: 'analytics-event-2',\n eventName: 'cta_click',\n clientId: 'client_01HJQ9M4X0A8Q2D',\n pagePath: '/pricing',\n eventTimestamp: '2026-03-21T16:10:00.000Z',\n status: 'sent',\n },\n {\n id: 'analytics-event-3',\n eventName: 'form_submit',\n clientId: 'client_01HJQ9NGH1J9Q8R',\n pagePath: '/newsletter',\n eventTimestamp: '2026-03-21T15:58:00.000Z',\n status: 'pending',\n },\n];\n\nconst loadAnalyticsSummary = () => import('./AnalyticsSummary.svelte');\nconst loadEventsTable = () => import('./EventsTable.svelte');\nconst loadPropertyInfo = () => import('./PropertyInfo.svelte');\n\nexport default {\n packageName: '@happyvertical/smrt-analytics',\n displayName: 'Analytics',\n description:\n 'Dashboard primitives for property health, traffic trends, and recent event delivery.',\n entries: [\n {\n id: 'analytics-summary',\n title: 'Analytics Summary',\n description:\n 'Traffic summary cards that surface today-vs-yesterday performance at a glance.',\n loadComponent: loadAnalyticsSummary,\n order: 1,\n props: {\n stats: sampleStats,\n },\n modes: {\n mock: {\n label: 'Mock',\n },\n },\n },\n {\n id: 'events-table',\n title: 'Events Table',\n description:\n 'Recent outbound analytics events with delivery status and page context.',\n loadComponent: loadEventsTable,\n order: 2,\n props: {\n events: sampleEvents,\n maxRows: 8,\n },\n modes: {\n mock: {\n label: 'Mock',\n },\n },\n },\n {\n id: 'property-info',\n title: 'Property Info',\n description:\n 'Connection status and property metadata for a configured analytics destination.',\n loadComponent: loadPropertyInfo,\n order: 3,\n props: {\n propertyId: 'properties/348920114',\n measurementId: 'G-9A4F2P7Q1C',\n provider: 'ga4',\n status: 'active',\n lastSyncAt: '2026-03-21T16:05:00.000Z',\n siteDomain: 'newsroom.example.com',\n },\n modes: {\n mock: {\n label: 'Mock',\n },\n },\n },\n ],\n};\n"],"names":[],"mappings":"AAAA,MAAM,cAAc;AAAA,EAClB,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,cAAc;AAChB;AAEA,MAAM,eAAe;AAAA,EACnB;AAAA,IACE,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,QAAQ;AAAA,EAAA;AAAA,EAEV;AAAA,IACE,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,QAAQ;AAAA,EAAA;AAAA,EAEV;AAAA,IACE,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,QAAQ;AAAA,EAAA;AAEZ;AAEA,MAAM,uBAAuB,MAAM,OAAO,kCAA2B;AACrE,MAAM,kBAAkB,MAAM,OAAO,6BAAsB;AAC3D,MAAM,mBAAmB,MAAM,OAAO,8BAAuB;AAE7D,MAAA,aAAe;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aACE;AAAA,MACF,eAAe;AAAA,MACf,OAAO;AAAA,MACP,OAAO;AAAA,QACL,OAAO;AAAA,MAAA;AAAA,MAET,OAAO;AAAA,QACL,MAAM;AAAA,UACJ,OAAO;AAAA,QAAA;AAAA,MACT;AAAA,IACF;AAAA,IAEF;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aACE;AAAA,MACF,eAAe;AAAA,MACf,OAAO;AAAA,MACP,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS;AAAA,MAAA;AAAA,MAEX,OAAO;AAAA,QACL,MAAM;AAAA,UACJ,OAAO;AAAA,QAAA;AAAA,MACT;AAAA,IACF;AAAA,IAEF;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aACE;AAAA,MACF,eAAe;AAAA,MACf,OAAO;AAAA,MACP,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,YAAY;AAAA,MAAA;AAAA,MAEd,OAAO;AAAA,QACL,MAAM;AAAA,UACJ,OAAO;AAAA,QAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEJ;"}
@@ -0,0 +1,57 @@
1
+ import { ResolvedPromptAI } from '@happyvertical/smrt-prompts';
2
+ /**
3
+ * `AnalyticsProperty.analyzePerformance()` prompt. Only the human-readable
4
+ * display name, provider label, and the requested period reach the model;
5
+ * provider IDs, API secrets, and the providerMetadata blob are excluded.
6
+ */
7
+ export declare const smrtAnalyticsAnalyzePerformancePrompt: import('@happyvertical/smrt-prompts').PromptDefinition;
8
+ /**
9
+ * `AnalyticsReport.analyzeResults()` prompt. Surfaces report name, the
10
+ * dimension/metric labels (which are public GA4/Plausible/Matomo schema
11
+ * names — not user data), the date-range window, and the row count plus
12
+ * a JSON-stringified `resultData` blob.
13
+ *
14
+ * **`resultData` is forwarded verbatim.** This package does not strip PII
15
+ * from result rows — it cannot, because the row schema is determined by
16
+ * the dimensions/metrics the caller asked the analytics provider to
17
+ * return. If the caller persists rows containing a `userPseudoId`,
18
+ * `clientId`, IP-derived geolocation, or any other identifier, those
19
+ * fields WILL reach the AI provider. Either:
20
+ *
21
+ * - exclude PII-bearing dimensions before persisting `resultData`
22
+ * (e.g. don't request `userPseudoId` as a GA4 dimension), or
23
+ * - apply a column allowlist at the call site before invoking
24
+ * `analyzeResults()`, or
25
+ * - override the prompt template via `PromptOverride` to redact rows.
26
+ *
27
+ * The forwarding contract is pinned by a regression test in
28
+ * `__tests__/analytics-report-prompt.test.ts`.
29
+ */
30
+ export declare const smrtAnalyticsAnalyzeResultsPrompt: import('@happyvertical/smrt-prompts').PromptDefinition;
31
+ /**
32
+ * `AnalyticsReport.hasPositiveTrends()` boolean classifier prompt. Same
33
+ * variables as `analyzeResults` minus the descriptive name — only the
34
+ * provider-schema metric labels and the aggregate `resultData` payload are
35
+ * needed to decide whether the trend is positive.
36
+ *
37
+ * The template explicitly instructs the model to begin its response with
38
+ * either "yes" or "no" so the boolean coercion in `hasPositiveTrends()`
39
+ * (`/^\s*(yes|true)\b/i`) is reliable. Without the leading-word
40
+ * instruction the model commonly answers with prose that happens to
41
+ * describe positive trends but starts with a sentence like "The
42
+ * conversion rate is up..." — the parser would then treat that as
43
+ * `false` despite a positive analysis. Tenants overriding this template
44
+ * MUST preserve the leading yes/no convention.
45
+ */
46
+ export declare const smrtAnalyticsHasPositiveTrendsPrompt: import('@happyvertical/smrt-prompts').PromptDefinition;
47
+ /**
48
+ * Build the message-options object passed to `aiClient.message()` from a
49
+ * `ResolvedPromptAI` shape. Mirrors the helper in `smrt-properties` and
50
+ * `smrt-content` so behavior across packages is identical.
51
+ */
52
+ export declare function promptMessageOptions(ai: ResolvedPromptAI): {
53
+ maxTokens?: number | undefined;
54
+ temperature?: number | undefined;
55
+ model?: string | undefined;
56
+ };
57
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,6BAA6B,CAAC;AAErC;;;;GAIG;AACH,eAAO,MAAM,qCAAqC,wDAWhD,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,iCAAiC,wDAsB5C,CAAC;AAEH;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,oCAAoC,wDAkB/C,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,gBAAgB;;;;EASxD"}