@mongrov/analytics 0.6.0 → 0.7.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.
- package/README.md +23 -10
- package/UPGRADING.md +370 -0
- package/dist/core/device-events.d.ts +14 -0
- package/dist/core/device-events.d.ts.map +1 -0
- package/dist/core/device-events.js +13 -0
- package/dist/core/device-events.js.map +1 -0
- package/dist/core/errors.d.ts +1 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/core/extensions.d.ts +21 -4
- package/dist/core/extensions.d.ts.map +1 -1
- package/dist/core/extensions.js +21 -4
- package/dist/core/extensions.js.map +1 -1
- package/dist/core/factory.d.ts.map +1 -1
- package/dist/core/factory.js +125 -23
- package/dist/core/factory.js.map +1 -1
- package/dist/core/hooks.js +1 -1
- package/dist/core/hooks.js.map +1 -1
- package/dist/core/index.d.ts +11 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +14 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/insight.d.ts +44 -0
- package/dist/core/insight.d.ts.map +1 -0
- package/dist/core/insight.js +62 -0
- package/dist/core/insight.js.map +1 -0
- package/dist/core/metric_metadata.d.ts +55 -0
- package/dist/core/metric_metadata.d.ts.map +1 -1
- package/dist/core/metric_metadata.js +35 -7
- package/dist/core/metric_metadata.js.map +1 -1
- package/dist/core/migrations.d.ts.map +1 -1
- package/dist/core/migrations.js +64 -2
- package/dist/core/migrations.js.map +1 -1
- package/dist/core/retention.d.ts +44 -13
- package/dist/core/retention.d.ts.map +1 -1
- package/dist/core/retention.js +49 -22
- package/dist/core/retention.js.map +1 -1
- package/dist/core/schemas.d.ts +73 -2
- package/dist/core/schemas.d.ts.map +1 -1
- package/dist/core/schemas.js +154 -3
- package/dist/core/schemas.js.map +1 -1
- package/dist/core/table_metadata.d.ts.map +1 -1
- package/dist/core/table_metadata.js +3 -0
- package/dist/core/table_metadata.js.map +1 -1
- package/dist/core/types.d.ts +45 -10
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/warehouse.d.ts +28 -0
- package/dist/core/warehouse.d.ts.map +1 -1
- package/dist/core/warehouse.js +44 -0
- package/dist/core/warehouse.js.map +1 -1
- package/dist/core/watermark-cache.d.ts +75 -0
- package/dist/core/watermark-cache.d.ts.map +1 -0
- package/dist/core/watermark-cache.js +0 -0
- package/dist/core/watermark-cache.js.map +1 -0
- package/dist/rules/__fakes__/fakeEngine.d.ts +2 -0
- package/dist/rules/__fakes__/fakeEngine.d.ts.map +1 -1
- package/dist/rules/__fakes__/fakeEngine.js +4 -0
- package/dist/rules/__fakes__/fakeEngine.js.map +1 -1
- package/dist/rules/baseline-reader.d.ts +55 -0
- package/dist/rules/baseline-reader.d.ts.map +1 -0
- package/dist/rules/baseline-reader.js +111 -0
- package/dist/rules/baseline-reader.js.map +1 -0
- package/dist/rules/compiler.d.ts +36 -1
- package/dist/rules/compiler.d.ts.map +1 -1
- package/dist/rules/compiler.js +185 -39
- package/dist/rules/compiler.js.map +1 -1
- package/dist/rules/defaults/luminx.d.ts.map +1 -1
- package/dist/rules/defaults/luminx.js +8 -0
- package/dist/rules/defaults/luminx.js.map +1 -1
- package/dist/rules/defaults/viva.d.ts.map +1 -1
- package/dist/rules/defaults/viva.js +7 -0
- package/dist/rules/defaults/viva.js.map +1 -1
- package/dist/rules/defaults/yogaring.d.ts.map +1 -1
- package/dist/rules/defaults/yogaring.js +7 -0
- package/dist/rules/defaults/yogaring.js.map +1 -1
- package/dist/rules/defaults/ziva.d.ts.map +1 -1
- package/dist/rules/defaults/ziva.js +100 -24
- package/dist/rules/defaults/ziva.js.map +1 -1
- package/dist/rules/evaluator.d.ts +14 -3
- package/dist/rules/evaluator.d.ts.map +1 -1
- package/dist/rules/evaluator.js +157 -5
- package/dist/rules/evaluator.js.map +1 -1
- package/dist/rules/factory.d.ts.map +1 -1
- package/dist/rules/factory.js +5 -1
- package/dist/rules/factory.js.map +1 -1
- package/dist/rules/index.d.ts +2 -1
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +2 -1
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/schema.d.ts +75 -4
- package/dist/rules/schema.d.ts.map +1 -1
- package/dist/rules/schema.js +44 -0
- package/dist/rules/schema.js.map +1 -1
- package/dist/rules/types.d.ts +16 -1
- package/dist/rules/types.d.ts.map +1 -1
- package/dist/rules/validator.d.ts.map +1 -1
- package/dist/rules/validator.js +56 -0
- package/dist/rules/validator.js.map +1 -1
- package/dist/sync/baseline-compute.d.ts +63 -0
- package/dist/sync/baseline-compute.d.ts.map +1 -0
- package/dist/sync/baseline-compute.js +211 -0
- package/dist/sync/baseline-compute.js.map +1 -0
- package/dist/sync/events.d.ts +19 -5
- package/dist/sync/events.d.ts.map +1 -1
- package/dist/sync/events.js +17 -0
- package/dist/sync/events.js.map +1 -1
- package/dist/sync/factory.d.ts +25 -4
- package/dist/sync/factory.d.ts.map +1 -1
- package/dist/sync/factory.js +108 -15
- package/dist/sync/factory.js.map +1 -1
- package/dist/sync/fetcher.d.ts +15 -2
- package/dist/sync/fetcher.d.ts.map +1 -1
- package/dist/sync/fetcher.js +43 -7
- package/dist/sync/fetcher.js.map +1 -1
- package/dist/sync/flusher.d.ts +52 -2
- package/dist/sync/flusher.d.ts.map +1 -1
- package/dist/sync/flusher.js +78 -9
- package/dist/sync/flusher.js.map +1 -1
- package/dist/sync/index.d.ts +3 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +1 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/mapper/activity.d.ts.map +1 -1
- package/dist/sync/mapper/activity.js +2 -1
- package/dist/sync/mapper/activity.js.map +1 -1
- package/dist/sync/mapper/ring-config.js +1 -1
- package/dist/sync/mapper/ring-config.js.map +1 -1
- package/dist/sync/mapper/schema.d.ts +411 -0
- package/dist/sync/mapper/schema.d.ts.map +1 -0
- package/dist/sync/mapper/schema.js +128 -0
- package/dist/sync/mapper/schema.js.map +1 -0
- package/dist/sync/mapper/sleep.d.ts +58 -13
- package/dist/sync/mapper/sleep.d.ts.map +1 -1
- package/dist/sync/mapper/sleep.js +141 -44
- package/dist/sync/mapper/sleep.js.map +1 -1
- package/dist/sync/mapper/types.d.ts +66 -10
- package/dist/sync/mapper/types.d.ts.map +1 -1
- package/dist/sync/scheduler.d.ts +7 -0
- package/dist/sync/scheduler.d.ts.map +1 -1
- package/dist/sync/scheduler.js +14 -0
- package/dist/sync/scheduler.js.map +1 -1
- package/dist/tools/__fakes__/engine.d.ts +2 -0
- package/dist/tools/__fakes__/engine.d.ts.map +1 -1
- package/dist/tools/__fakes__/engine.js +10 -0
- package/dist/tools/__fakes__/engine.js.map +1 -1
- package/dist/tools/authorize.d.ts +19 -12
- package/dist/tools/authorize.d.ts.map +1 -1
- package/dist/tools/authorize.js +31 -40
- package/dist/tools/authorize.js.map +1 -1
- package/dist/tools/factory.d.ts +2 -0
- package/dist/tools/factory.d.ts.map +1 -1
- package/dist/tools/factory.js +12 -1
- package/dist/tools/factory.js.map +1 -1
- package/dist/tools/formatters/copy-guidelines.d.ts +57 -0
- package/dist/tools/formatters/copy-guidelines.d.ts.map +1 -0
- package/dist/tools/formatters/copy-guidelines.js +110 -0
- package/dist/tools/formatters/copy-guidelines.js.map +1 -0
- package/dist/tools/formatters/index.d.ts +14 -0
- package/dist/tools/formatters/index.d.ts.map +1 -0
- package/dist/tools/formatters/index.js +14 -0
- package/dist/tools/formatters/index.js.map +1 -0
- package/dist/tools/formatters/spo2.d.ts +21 -0
- package/dist/tools/formatters/spo2.d.ts.map +1 -0
- package/dist/tools/formatters/spo2.js +79 -0
- package/dist/tools/formatters/spo2.js.map +1 -0
- package/dist/tools/{formatters.d.ts → formatters/text.d.ts} +1 -1
- package/dist/tools/formatters/text.d.ts.map +1 -0
- package/dist/tools/{formatters.js → formatters/text.js} +1 -1
- package/dist/tools/formatters/text.js.map +1 -0
- package/dist/tools/impls/activity.d.ts +2 -2
- package/dist/tools/impls/activity.js +7 -3
- package/dist/tools/impls/activity.js.map +1 -1
- package/dist/tools/impls/anomaly.d.ts +2 -2
- package/dist/tools/impls/anomaly.js +8 -4
- package/dist/tools/impls/anomaly.js.map +1 -1
- package/dist/tools/impls/compare.d.ts +2 -2
- package/dist/tools/impls/compare.js +8 -4
- package/dist/tools/impls/compare.js.map +1 -1
- package/dist/tools/impls/hrv.d.ts +2 -2
- package/dist/tools/impls/hrv.js +6 -2
- package/dist/tools/impls/hrv.js.map +1 -1
- package/dist/tools/impls/insights.d.ts +4 -4
- package/dist/tools/impls/insights.d.ts.map +1 -1
- package/dist/tools/impls/insights.js +10 -3
- package/dist/tools/impls/insights.js.map +1 -1
- package/dist/tools/impls/sleep.d.ts +2 -2
- package/dist/tools/impls/sleep.js +6 -2
- package/dist/tools/impls/sleep.js.map +1 -1
- package/dist/tools/impls/spo2.d.ts +52 -0
- package/dist/tools/impls/spo2.d.ts.map +1 -0
- package/dist/tools/impls/spo2.js +65 -0
- package/dist/tools/impls/spo2.js.map +1 -0
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/mcp/guard.d.ts +28 -11
- package/dist/tools/mcp/guard.d.ts.map +1 -1
- package/dist/tools/mcp/guard.js +45 -15
- package/dist/tools/mcp/guard.js.map +1 -1
- package/dist/tools/mcp/index.d.ts +1 -1
- package/dist/tools/mcp/index.d.ts.map +1 -1
- package/dist/tools/mcp/index.js +1 -1
- package/dist/tools/mcp/index.js.map +1 -1
- package/dist/tools/mcp/server.d.ts.map +1 -1
- package/dist/tools/mcp/server.js +4 -0
- package/dist/tools/mcp/server.js.map +1 -1
- package/dist/tools/mcp/transports/http.d.ts.map +1 -1
- package/dist/tools/mcp/transports/http.js +4 -0
- package/dist/tools/mcp/transports/http.js.map +1 -1
- package/package.json +8 -5
- package/dist/tools/formatters.d.ts.map +0 -1
- package/dist/tools/formatters.js.map +0 -1
|
@@ -3,6 +3,13 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { parseCatalog } from './loader';
|
|
5
5
|
const TOML = `
|
|
6
|
+
# YogaRing brand default rules (placeholder set for v0.1.0).
|
|
7
|
+
#
|
|
8
|
+
# YogaRing focuses on session-adjacent metrics; v0.1.0 ships a stress
|
|
9
|
+
# nudge + a low-activity nudge derived from the shared metric surface.
|
|
10
|
+
#
|
|
11
|
+
# See \`yogaring.ts\` — this file is the source of truth.
|
|
12
|
+
|
|
6
13
|
[[rule]]
|
|
7
14
|
id = "yogaring.stress-elevated"
|
|
8
15
|
brand = "yogaring"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yogaring.js","sourceRoot":"","sources":["../../../src/rules/defaults/yogaring.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAGvC,MAAM,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"yogaring.js","sourceRoot":"","sources":["../../../src/rules/defaults/yogaring.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAGvC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CZ,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAW,YAAY,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ziva.d.ts","sourceRoot":"","sources":["../../../src/rules/defaults/ziva.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"ziva.d.ts","sourceRoot":"","sources":["../../../src/rules/defaults/ziva.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AA4JrC,eAAO,MAAM,YAAY,EAAE,IAAI,EAAyC,CAAA"}
|
|
@@ -7,11 +7,26 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { parseCatalog } from './loader';
|
|
9
9
|
const TOML = `
|
|
10
|
+
# Ziva brand default rules.
|
|
11
|
+
#
|
|
12
|
+
# Copied verbatim into \`ziva.ts\` as an inline template string. Do NOT edit
|
|
13
|
+
# the wrapper file directly — treat this .toml as the source of truth.
|
|
14
|
+
#
|
|
15
|
+
# Rules cover the core Ziva health surface: HRV drop, sleep deprivation,
|
|
16
|
+
# elevated stress, and low weekly activity. Verbatim from
|
|
17
|
+
# \`.specifica/features/analytics-rules/spec.md\` §Brand defaults.
|
|
18
|
+
#
|
|
19
|
+
# Two of these deliberately use relative targets rather than absolutes:
|
|
20
|
+
# \`baseline_percent\` (HRV) and \`baseline_stddev\` (stress). A fixed HRV
|
|
21
|
+
# threshold is meaningless across users — 30 ms is alarming for one person
|
|
22
|
+
# and unremarkable for another — so the shipped catalog exercises the
|
|
23
|
+
# compiler's baseline paths, not just the absolute path.
|
|
24
|
+
|
|
10
25
|
[[rule]]
|
|
11
26
|
id = "ziva.hrv-drop-30"
|
|
12
27
|
brand = "ziva"
|
|
13
|
-
name = "HRV drop
|
|
14
|
-
description = "
|
|
28
|
+
name = "Sudden HRV drop"
|
|
29
|
+
description = "HRV dropped 30% below 7-day baseline"
|
|
15
30
|
metric = "hrv_ms"
|
|
16
31
|
window = "24h"
|
|
17
32
|
aggregation = "avg"
|
|
@@ -19,65 +34,126 @@ compare = "less_than"
|
|
|
19
34
|
severity = "warn"
|
|
20
35
|
|
|
21
36
|
[rule.target]
|
|
22
|
-
type = "
|
|
23
|
-
|
|
37
|
+
type = "baseline_percent"
|
|
38
|
+
windowDays = 7
|
|
39
|
+
percent = 70
|
|
24
40
|
|
|
25
41
|
[rule.throttle]
|
|
26
|
-
minGapMinutes =
|
|
27
|
-
maxPerDay =
|
|
42
|
+
minGapMinutes = 720
|
|
43
|
+
maxPerDay = 1
|
|
28
44
|
|
|
29
45
|
[[rule]]
|
|
30
|
-
id = "ziva.sleep-deprivation-
|
|
46
|
+
id = "ziva.sleep-deprivation-3"
|
|
31
47
|
brand = "ziva"
|
|
32
|
-
name = "
|
|
33
|
-
description = "Average nightly sleep across 3 nights below
|
|
48
|
+
name = "Three nights short sleep"
|
|
49
|
+
description = "Average nightly sleep across 3 nights below 300 minutes."
|
|
34
50
|
metric = "sleep_total_minutes"
|
|
35
51
|
window = "3d"
|
|
36
52
|
aggregation = "avg"
|
|
37
53
|
compare = "less_than"
|
|
38
|
-
severity = "
|
|
54
|
+
severity = "info"
|
|
39
55
|
|
|
40
56
|
[rule.target]
|
|
41
57
|
type = "absolute"
|
|
42
|
-
value =
|
|
58
|
+
value = 300
|
|
43
59
|
|
|
44
60
|
[rule.throttle]
|
|
45
|
-
minGapMinutes =
|
|
61
|
+
minGapMinutes = 1440
|
|
46
62
|
maxPerDay = 1
|
|
47
63
|
|
|
48
64
|
[[rule]]
|
|
49
|
-
id = "ziva.stress-elevated"
|
|
65
|
+
id = "ziva.stress-elevated-day"
|
|
50
66
|
brand = "ziva"
|
|
51
|
-
name = "Elevated stress"
|
|
52
|
-
description = "
|
|
67
|
+
name = "Elevated stress today"
|
|
68
|
+
description = "Daily average stress rose 1.5 standard deviations above the 14-day baseline."
|
|
53
69
|
metric = "stress"
|
|
54
|
-
window = "
|
|
70
|
+
window = "24h"
|
|
55
71
|
aggregation = "avg"
|
|
56
72
|
compare = "greater_than"
|
|
57
73
|
severity = "info"
|
|
58
74
|
|
|
75
|
+
[rule.target]
|
|
76
|
+
type = "baseline_stddev"
|
|
77
|
+
windowDays = 14
|
|
78
|
+
stddevs = 1.5
|
|
79
|
+
|
|
80
|
+
[rule.throttle]
|
|
81
|
+
minGapMinutes = 1440
|
|
82
|
+
maxPerDay = 1
|
|
83
|
+
|
|
84
|
+
[[rule]]
|
|
85
|
+
id = "ziva.low-activity-week"
|
|
86
|
+
brand = "ziva"
|
|
87
|
+
name = "Low activity all week"
|
|
88
|
+
description = "Total steps across the last 7 days below 20,000."
|
|
89
|
+
metric = "activity_steps"
|
|
90
|
+
window = "7d"
|
|
91
|
+
aggregation = "sum"
|
|
92
|
+
compare = "less_than"
|
|
93
|
+
severity = "info"
|
|
94
|
+
|
|
59
95
|
[rule.target]
|
|
60
96
|
type = "absolute"
|
|
61
|
-
value =
|
|
97
|
+
value = 20000
|
|
62
98
|
|
|
63
99
|
[rule.throttle]
|
|
64
|
-
minGapMinutes =
|
|
100
|
+
minGapMinutes = 10080
|
|
101
|
+
maxPerDay = 1
|
|
102
|
+
|
|
103
|
+
# ─────────────────────────────────────────────────────────────────────────
|
|
104
|
+
# SpO₂ — two rules that coexist deliberately (Sprint 5 §4, Ziva #1).
|
|
105
|
+
#
|
|
106
|
+
# A is the LOUD one: the alert the user configured in the ⚙ sheet, firing
|
|
107
|
+
# on a single reading below their own safe level, day or night.
|
|
108
|
+
# B is a SECONDARY pattern insight: a sustained nightly dip, which is a
|
|
109
|
+
# different observation and belongs in the feed rather than as an alert.
|
|
110
|
+
# They fire independently and hold independent throttle state.
|
|
111
|
+
# ─────────────────────────────────────────────────────────────────────────
|
|
112
|
+
|
|
113
|
+
[[rule]]
|
|
114
|
+
id = "ziva.spo2-safe-level"
|
|
115
|
+
brand = "ziva"
|
|
116
|
+
name = "SpO₂ below your safe level"
|
|
117
|
+
description = "Alerts on any single reading below your configured safe level"
|
|
118
|
+
metric = "spo2"
|
|
119
|
+
# 24h, NOT 1h. Rules evaluate at batch:complete, and a morning sync
|
|
120
|
+
# delivers ~8 hours of overnight readings in one batch. A wall-clock 1h
|
|
121
|
+
# window would silently miss anything older than an hour before eval —
|
|
122
|
+
# including the exact overnight crossings the "day or night" promise
|
|
123
|
+
# exists for. 24h covers the batch delivery envelope; the throttle below
|
|
124
|
+
# prevents duplicate fires from re-scanned data.
|
|
125
|
+
window = "24h"
|
|
126
|
+
aggregation = "min"
|
|
127
|
+
compare = "less_than"
|
|
128
|
+
context = "any"
|
|
129
|
+
consecutive = 1
|
|
130
|
+
severity = "warn"
|
|
131
|
+
|
|
132
|
+
[rule.target]
|
|
133
|
+
type = "user_setting"
|
|
134
|
+
key = "user:spo2SafeLevel"
|
|
135
|
+
defaultValue = 90
|
|
136
|
+
|
|
137
|
+
[rule.throttle]
|
|
138
|
+
minGapMinutes = 60
|
|
65
139
|
maxPerDay = 3
|
|
66
140
|
|
|
67
141
|
[[rule]]
|
|
68
|
-
id = "ziva.
|
|
142
|
+
id = "ziva.spo2-desaturation-asleep"
|
|
69
143
|
brand = "ziva"
|
|
70
|
-
name = "
|
|
71
|
-
description = "
|
|
72
|
-
metric = "
|
|
144
|
+
name = "Nightly low SpO₂ pattern"
|
|
145
|
+
description = "Pattern of low SpO₂ during sleep — 3 consecutive samples below 88"
|
|
146
|
+
metric = "spo2"
|
|
73
147
|
window = "24h"
|
|
74
|
-
aggregation = "
|
|
148
|
+
aggregation = "min"
|
|
75
149
|
compare = "less_than"
|
|
150
|
+
context = "asleep"
|
|
151
|
+
consecutive = 3
|
|
76
152
|
severity = "info"
|
|
77
153
|
|
|
78
154
|
[rule.target]
|
|
79
155
|
type = "absolute"
|
|
80
|
-
value =
|
|
156
|
+
value = 88
|
|
81
157
|
|
|
82
158
|
[rule.throttle]
|
|
83
159
|
minGapMinutes = 720
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ziva.js","sourceRoot":"","sources":["../../../src/rules/defaults/ziva.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAGvC,MAAM,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"ziva.js","sourceRoot":"","sources":["../../../src/rules/defaults/ziva.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAGvC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwJZ,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAW,YAAY,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA"}
|
|
@@ -9,13 +9,17 @@
|
|
|
9
9
|
* every active brand-matching rule, fanned out over family members.
|
|
10
10
|
*
|
|
11
11
|
* Both funnel through `evaluateRule(rule, ctx)` which is the throttle-gated
|
|
12
|
-
* single-user check. A returned `RuleViolation` is
|
|
13
|
-
* the shared emitter and
|
|
12
|
+
* single-user check. A returned `RuleViolation` is (1) persisted to the
|
|
13
|
+
* `insight` table, (2) emitted synchronously via the shared emitter, and
|
|
14
|
+
* (3) echoed onto the app event bus (`threshold:violation` +
|
|
15
|
+
* `insight:insert`) when one is configured — principle 35 fire-and-forget:
|
|
16
|
+
* a failed insight INSERT is logged, never thrown into the eval loop, and
|
|
17
|
+
* the private `'violation'` emission still happens.
|
|
14
18
|
*
|
|
15
19
|
* `analytics.execute` throws are caught + logged; a failing rule never
|
|
16
20
|
* blocks the rest of the pass.
|
|
17
21
|
*/
|
|
18
|
-
import type { AnalyticsEngine } from '../core/types';
|
|
22
|
+
import type { AnalyticsEngine, EventBus, KVStore } from '../core/types';
|
|
19
23
|
import type { CompilerCache } from './compiler-cache';
|
|
20
24
|
import type { createEmitter } from './emitter';
|
|
21
25
|
import type { RulesRegistry } from './registry';
|
|
@@ -23,6 +27,11 @@ import type { createThrottleStore } from './throttle';
|
|
|
23
27
|
import type { Clock, RuleViolation, RulesLogger, FlushSummary } from './types';
|
|
24
28
|
export interface EvaluatorConfig {
|
|
25
29
|
registry: RulesRegistry;
|
|
30
|
+
/**
|
|
31
|
+
* KVStore for `target.type: 'user_setting'` threshold resolution
|
|
32
|
+
* (Sprint 5 T-23). Keys are `analytics:{userId}:{rule.target.key}`.
|
|
33
|
+
*/
|
|
34
|
+
storage?: KVStore;
|
|
26
35
|
cache: CompilerCache;
|
|
27
36
|
throttle: ReturnType<typeof createThrottleStore>;
|
|
28
37
|
emitter: ReturnType<typeof createEmitter>;
|
|
@@ -34,6 +43,8 @@ export interface EvaluatorConfig {
|
|
|
34
43
|
familyId: string;
|
|
35
44
|
}) => Promise<string[]>;
|
|
36
45
|
clock: Clock;
|
|
46
|
+
/** Optional app bus for `threshold:violation` / `insight:insert`. */
|
|
47
|
+
eventBus?: EventBus;
|
|
37
48
|
logger?: RulesLogger;
|
|
38
49
|
}
|
|
39
50
|
export interface Evaluator {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../src/rules/evaluator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../src/rules/evaluator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AACrD,OAAO,KAAK,EACV,KAAK,EACL,aAAa,EACb,WAAW,EACX,YAAY,EACb,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,aAAa,CAAA;IACvB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,EAAE,aAAa,CAAA;IACpB,QAAQ,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAA;IAChD,OAAO,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAA;IACzC,SAAS,EAAE,eAAe,CAAA;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,qBAAqB,EAAE,CAAC,GAAG,EAAE;QAC3B,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;KACjB,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACvB,KAAK,EAAE,KAAK,CAAA;IACZ,qEAAqE;IACrE,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAkBD,MAAM,WAAW,SAAS;IACxB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAA;IAC9D,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAA;CAC9C;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAkSlE"}
|
package/dist/rules/evaluator.js
CHANGED
|
@@ -9,16 +9,121 @@
|
|
|
9
9
|
* every active brand-matching rule, fanned out over family members.
|
|
10
10
|
*
|
|
11
11
|
* Both funnel through `evaluateRule(rule, ctx)` which is the throttle-gated
|
|
12
|
-
* single-user check. A returned `RuleViolation` is
|
|
13
|
-
* the shared emitter and
|
|
12
|
+
* single-user check. A returned `RuleViolation` is (1) persisted to the
|
|
13
|
+
* `insight` table, (2) emitted synchronously via the shared emitter, and
|
|
14
|
+
* (3) echoed onto the app event bus (`threshold:violation` +
|
|
15
|
+
* `insight:insert`) when one is configured — principle 35 fire-and-forget:
|
|
16
|
+
* a failed insight INSERT is logged, never thrown into the eval loop, and
|
|
17
|
+
* the private `'violation'` emission still happens.
|
|
14
18
|
*
|
|
15
19
|
* `analytics.execute` throws are caught + logged; a failing rule never
|
|
16
20
|
* blocks the rest of the pass.
|
|
17
21
|
*/
|
|
22
|
+
import { nanoid } from 'nanoid';
|
|
18
23
|
import { METRIC_METADATA } from '../core/metric_metadata';
|
|
19
24
|
import { AnalyticsError } from '../core/errors';
|
|
25
|
+
import { USER_SETTING_PARAM } from './compiler';
|
|
26
|
+
/**
|
|
27
|
+
* Rule severity → insight severity. The rule schema keeps the historical
|
|
28
|
+
* `'critical'` tier (TOML catalogs ship it); the `insight` table + registry
|
|
29
|
+
* contract use `'urgent'` (spec §Table schema).
|
|
30
|
+
*/
|
|
31
|
+
const INSIGHT_SEVERITY = {
|
|
32
|
+
info: 'info',
|
|
33
|
+
warn: 'warn',
|
|
34
|
+
critical: 'urgent',
|
|
35
|
+
};
|
|
20
36
|
export function createEvaluator(config) {
|
|
21
|
-
const { registry, cache, throttle, emitter, analytics, brand, familyId, familyMembersProvider, clock, logger, } = config;
|
|
37
|
+
const { registry, cache, throttle, emitter, analytics, brand, familyId, familyMembersProvider, clock, eventBus, logger, storage, } = config;
|
|
38
|
+
/**
|
|
39
|
+
* Per-eval-batch cache of resolved user settings. A batch may evaluate
|
|
40
|
+
* the same (user, key) across several rules; re-reading MMKV each time
|
|
41
|
+
* would be wasteful, and — worse — could resolve two different
|
|
42
|
+
* thresholds within one pass if the user saved mid-batch.
|
|
43
|
+
*/
|
|
44
|
+
let settingCache = new Map();
|
|
45
|
+
/**
|
|
46
|
+
* T-23 — resolve a `user_setting` threshold at eval time.
|
|
47
|
+
*
|
|
48
|
+
* Falls back to the rule's `defaultValue` when the user has never set
|
|
49
|
+
* one, or when the stored value is unusable. Never throws: a broken
|
|
50
|
+
* setting must not silence the alert the user explicitly asked for — the
|
|
51
|
+
* shipped default is the safer answer.
|
|
52
|
+
*/
|
|
53
|
+
async function resolveUserSetting(userId, key, defaultValue, ruleId) {
|
|
54
|
+
const cacheKey = `${userId} ${key}`;
|
|
55
|
+
const cached = settingCache.get(cacheKey);
|
|
56
|
+
if (cached !== undefined)
|
|
57
|
+
return cached;
|
|
58
|
+
let value = defaultValue;
|
|
59
|
+
let source = 'default';
|
|
60
|
+
if (storage) {
|
|
61
|
+
try {
|
|
62
|
+
const stored = await storage.get(`analytics:${userId}:${key}`);
|
|
63
|
+
const parsed = typeof stored === 'string' ? Number(stored) : stored;
|
|
64
|
+
if (typeof parsed === 'number' && Number.isFinite(parsed)) {
|
|
65
|
+
value = parsed;
|
|
66
|
+
source = 'kvstore';
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
logger?.warn('rules.evaluator: user_setting read failed, using default', {
|
|
71
|
+
ruleId,
|
|
72
|
+
userId,
|
|
73
|
+
key,
|
|
74
|
+
err: err.message,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (source === 'default') {
|
|
79
|
+
logger?.debug('rules.evaluator: user_setting fallback to defaultValue', {
|
|
80
|
+
ruleId, userId, key, defaultValue,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
settingCache.set(cacheKey, value);
|
|
84
|
+
return value;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Persist a violation as an `insight` row (spec parent §23 / principle
|
|
88
|
+
* 35). Returns the new insight_id, or null when the INSERT failed —
|
|
89
|
+
* failure is logged and swallowed so evaluation always continues.
|
|
90
|
+
* Unqualified `insight` resolves to the local catalog (insights are
|
|
91
|
+
* local-first; the pusher syncs the table to R2).
|
|
92
|
+
*/
|
|
93
|
+
async function persistInsight(rule, violation) {
|
|
94
|
+
const insightId = nanoid(24);
|
|
95
|
+
try {
|
|
96
|
+
await analytics.execute(`INSERT INTO insight (insight_id, ts, brand, family_id, user_id, rule_id, `
|
|
97
|
+
+ `metric, kind, severity, title, body, evidence, acknowledged_at, dismissed_at) `
|
|
98
|
+
+ `VALUES ($insightId, CAST($ts AS TIMESTAMP), $brand, $familyId, $userId, $ruleId, `
|
|
99
|
+
+ `$metric, 'threshold', $severity, $title, $body, $evidence, NULL, NULL)`, {
|
|
100
|
+
insightId,
|
|
101
|
+
ts: violation.observedAt.toISOString(),
|
|
102
|
+
brand: violation.brand,
|
|
103
|
+
familyId: violation.familyId,
|
|
104
|
+
userId: violation.userId,
|
|
105
|
+
ruleId: rule.id,
|
|
106
|
+
metric: rule.metric,
|
|
107
|
+
severity: INSIGHT_SEVERITY[rule.severity],
|
|
108
|
+
title: rule.name,
|
|
109
|
+
body: rule.description ?? null,
|
|
110
|
+
evidence: JSON.stringify({
|
|
111
|
+
...violation.evidence,
|
|
112
|
+
observedValue: violation.observedValue,
|
|
113
|
+
thresholdValue: violation.thresholdValue,
|
|
114
|
+
}),
|
|
115
|
+
});
|
|
116
|
+
return insightId;
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
logger?.error('rules.evaluator: insight insert failed', {
|
|
120
|
+
ruleId: rule.id,
|
|
121
|
+
userId: violation.userId,
|
|
122
|
+
err: err.message,
|
|
123
|
+
});
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
22
127
|
async function evaluateRule(rule, ctx) {
|
|
23
128
|
const throttled = await throttle.isThrottled(rule.id, ctx.userId, rule.throttle);
|
|
24
129
|
if (throttled) {
|
|
@@ -29,14 +134,21 @@ export function createEvaluator(config) {
|
|
|
29
134
|
return null;
|
|
30
135
|
}
|
|
31
136
|
let rows;
|
|
137
|
+
// Hoisted so the violation's evidence can report which threshold
|
|
138
|
+
// actually applied.
|
|
139
|
+
let compiled;
|
|
140
|
+
let params = {};
|
|
32
141
|
try {
|
|
33
|
-
|
|
34
|
-
|
|
142
|
+
compiled = cache.getCompiled(rule, registry.rev);
|
|
143
|
+
params = {
|
|
35
144
|
userId: ctx.userId,
|
|
36
145
|
brand,
|
|
37
146
|
familyId: ctx.familyId,
|
|
38
147
|
...compiled.params,
|
|
39
148
|
};
|
|
149
|
+
if (compiled.userSettingKey !== undefined) {
|
|
150
|
+
params[USER_SETTING_PARAM] = await resolveUserSetting(ctx.userId, compiled.userSettingKey, compiled.userSettingDefault ?? 0, rule.id);
|
|
151
|
+
}
|
|
40
152
|
rows = await analytics.execute(compiled.sql, params);
|
|
41
153
|
}
|
|
42
154
|
catch (err) {
|
|
@@ -66,11 +178,49 @@ export function createEvaluator(config) {
|
|
|
66
178
|
window: rule.window,
|
|
67
179
|
aggregation: rule.aggregation,
|
|
68
180
|
compare: rule.compare,
|
|
181
|
+
context: rule.context,
|
|
182
|
+
consecutive: rule.consecutive,
|
|
69
183
|
target: rule.target,
|
|
184
|
+
// T-23: which threshold actually applied, and where it came from.
|
|
185
|
+
// Without this a support ticket about "the alert fired at the
|
|
186
|
+
// wrong number" is unanswerable.
|
|
187
|
+
settingsUsed: compiled?.userSettingKey === undefined
|
|
188
|
+
? undefined
|
|
189
|
+
: { key: compiled.userSettingKey, value: params[USER_SETTING_PARAM] },
|
|
70
190
|
},
|
|
71
191
|
};
|
|
72
192
|
await throttle.recordFire(rule.id, ctx.userId);
|
|
193
|
+
const insightId = await persistInsight(rule, violation);
|
|
73
194
|
emitter.emit('violation', violation);
|
|
195
|
+
if (eventBus) {
|
|
196
|
+
// Bus handlers are app code — a throwing subscriber must not take
|
|
197
|
+
// down the eval loop (fire-and-forget, principle 35).
|
|
198
|
+
try {
|
|
199
|
+
eventBus.emit('threshold:violation', {
|
|
200
|
+
ruleId: rule.id,
|
|
201
|
+
userId: ctx.userId,
|
|
202
|
+
metric: rule.metric,
|
|
203
|
+
severity: INSIGHT_SEVERITY[rule.severity],
|
|
204
|
+
insightId,
|
|
205
|
+
observedValue: violation.observedValue,
|
|
206
|
+
thresholdValue: violation.thresholdValue,
|
|
207
|
+
});
|
|
208
|
+
// `insight:insert` means "a row landed" — skip it when the INSERT failed.
|
|
209
|
+
if (insightId) {
|
|
210
|
+
eventBus.emit('insight:insert', {
|
|
211
|
+
insightId,
|
|
212
|
+
userId: ctx.userId,
|
|
213
|
+
metric: rule.metric,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
logger?.error('rules.evaluator: event bus emit threw', {
|
|
219
|
+
ruleId: rule.id,
|
|
220
|
+
err: err.message,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
74
224
|
return violation;
|
|
75
225
|
}
|
|
76
226
|
function rulesForTables(rules, affectedTables) {
|
|
@@ -82,6 +232,7 @@ export function createEvaluator(config) {
|
|
|
82
232
|
}
|
|
83
233
|
return {
|
|
84
234
|
async evaluateOnBatch(batch) {
|
|
235
|
+
settingCache = new Map();
|
|
85
236
|
const active = registry.getByBrand(brand);
|
|
86
237
|
const relevant = rulesForTables(active, batch.affectedTables);
|
|
87
238
|
if (relevant.length === 0 || batch.affectedUserIds.length === 0) {
|
|
@@ -98,6 +249,7 @@ export function createEvaluator(config) {
|
|
|
98
249
|
return violations;
|
|
99
250
|
},
|
|
100
251
|
async evaluateScheduled() {
|
|
252
|
+
settingCache = new Map();
|
|
101
253
|
if (analytics.state !== 'attached') {
|
|
102
254
|
throw new AnalyticsError('not_attached', `evaluateScheduled requires an attached analytics engine (state=${analytics.state})`);
|
|
103
255
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../src/rules/evaluator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../src/rules/evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/rules/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAE7D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/rules/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAE7D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CA2ExE"}
|
package/dist/rules/factory.js
CHANGED
|
@@ -14,7 +14,7 @@ import { createEvaluator } from './evaluator';
|
|
|
14
14
|
import { createRulesRegistry } from './registry';
|
|
15
15
|
import { createThrottleStore } from './throttle';
|
|
16
16
|
export function createRulesEngine(config) {
|
|
17
|
-
const { analytics, storage, familyMembersProvider, brand, familyId, logger, clock = () => new Date(), } = config;
|
|
17
|
+
const { analytics, storage, familyMembersProvider, brand, familyId, eventBus, logger, clock = () => new Date(), } = config;
|
|
18
18
|
const emitter = createEmitter({ logger });
|
|
19
19
|
const throttle = createThrottleStore({ storage, clock, logger });
|
|
20
20
|
const cache = createCompilerCache();
|
|
@@ -33,7 +33,11 @@ export function createRulesEngine(config) {
|
|
|
33
33
|
familyId,
|
|
34
34
|
familyMembersProvider,
|
|
35
35
|
clock,
|
|
36
|
+
eventBus,
|
|
36
37
|
logger,
|
|
38
|
+
// Sprint 5 T-23 — same KVStore the throttle uses; user_setting
|
|
39
|
+
// thresholds live under `analytics:{userId}:{key}`.
|
|
40
|
+
storage,
|
|
37
41
|
});
|
|
38
42
|
let closed = false;
|
|
39
43
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/rules/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAGhD,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACzD,MAAM,EACJ,SAAS,EACT,OAAO,EACP,qBAAqB,EACrB,KAAK,EACL,QAAQ,EACR,MAAM,EACN,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,GACzB,GAAG,MAAM,CAAA;IAEV,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IACzC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;IAChE,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAA;IACnC,MAAM,QAAQ,GAAG,mBAAmB,CAAC;QACnC,OAAO;QACP,MAAM;QACN,YAAY,EAAE,KAAK;KACpB,CAAC,CAAA;IACF,MAAM,SAAS,GAAG,eAAe,CAAC;QAChC,QAAQ;QACR,KAAK;QACL,QAAQ;QACR,OAAO;QACP,SAAS;QACT,KAAK;QACL,QAAQ;QACR,qBAAqB;QACrB,KAAK;QACL,MAAM;
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/rules/factory.ts"],"names":[],"mappings":"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"}
|
package/dist/rules/index.d.ts
CHANGED
|
@@ -19,7 +19,8 @@ export { RuleSchema, RuleValidationError, TargetSchema, ThrottleSchema, AGGREGAT
|
|
|
19
19
|
export type { Aggregation, Compare, Rule, Severity, Target, Throttle, Window, } from './schema';
|
|
20
20
|
export type { Clock, CompiledRule, FlushSummary, RuleSeverity, RuleViolation, RulesEngine, RulesEngineConfig, RulesLogger, Unsubscribe, } from './types';
|
|
21
21
|
export { allowedWindowsFor, validateRule } from './validator';
|
|
22
|
-
export {
|
|
22
|
+
export { createBaselineReader, type Baseline, type BaselineReader, type BaselineReaderConfig, } from './baseline-reader';
|
|
23
|
+
export { USER_SETTING_PARAM, emitContextJoin, viewFor, compileRule, sanitizeIdent } from './compiler';
|
|
23
24
|
export { createCompilerCache, type CompilerCache } from './compiler-cache';
|
|
24
25
|
export { createRulesRegistry, type CreateRegistryConfig, type RulesRegistry, } from './registry';
|
|
25
26
|
export { createThrottleStore, type CreateThrottleConfig, type ThrottleStore, } from './throttle';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,OAAO,GACR,MAAM,UAAU,CAAA;AACjB,YAAY,EACV,WAAW,EACX,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,MAAM,GACP,MAAM,UAAU,CAAA;AAEjB,YAAY,EACV,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,WAAW,GACZ,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG7D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,OAAO,GACR,MAAM,UAAU,CAAA;AACjB,YAAY,EACV,WAAW,EACX,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,MAAM,GACP,MAAM,UAAU,CAAA;AAEjB,YAAY,EACV,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,WAAW,GACZ,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG7D,OAAO,EACL,oBAAoB,EACpB,KAAK,QAAQ,EACb,KAAK,cAAc,EACnB,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AACrG,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAI1E,OAAO,EACL,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,KAAK,aAAa,GACnB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,KAAK,aAAa,GACnB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,YAAY,GAClB,MAAM,WAAW,CAAA;AAGlB,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAG7C,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAA;AAGtC,OAAO,EACL,iBAAiB,EACjB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC7B,MAAM,2BAA2B,CAAA;AAClC,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,GAC3B,MAAM,yBAAyB,CAAA"}
|
package/dist/rules/index.js
CHANGED
|
@@ -20,7 +20,8 @@ export { RuleSchema, RuleValidationError, TargetSchema, ThrottleSchema, AGGREGAT
|
|
|
20
20
|
// R2 — validator
|
|
21
21
|
export { allowedWindowsFor, validateRule } from './validator';
|
|
22
22
|
// R3 — compiler + cache
|
|
23
|
-
export {
|
|
23
|
+
export { createBaselineReader, } from './baseline-reader';
|
|
24
|
+
export { USER_SETTING_PARAM, emitContextJoin, viewFor, compileRule, sanitizeIdent } from './compiler';
|
|
24
25
|
export { createCompilerCache } from './compiler-cache';
|
|
25
26
|
// R4-R6 — registry / throttle / emitter (exposed for advanced composition
|
|
26
27
|
// or test doubles; typical apps go through `createRulesEngine`).
|
package/dist/rules/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,sBAAsB;AACtB,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,OAAO,GACR,MAAM,UAAU,CAAA;AAuBjB,iBAAiB;AACjB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE7D,wBAAwB;AACxB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,sBAAsB;AACtB,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,OAAO,GACR,MAAM,UAAU,CAAA;AAuBjB,iBAAiB;AACjB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE7D,wBAAwB;AACxB,OAAO,EACL,oBAAoB,GAIrB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AACrG,OAAO,EAAE,mBAAmB,EAAsB,MAAM,kBAAkB,CAAA;AAE1E,0EAA0E;AAC1E,iEAAiE;AACjE,OAAO,EACL,mBAAmB,GAGpB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,mBAAmB,GAGpB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,aAAa,GAGd,MAAM,WAAW,CAAA;AAElB,eAAe;AACf,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAE7C,sBAAsB;AACtB,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAA;AAEtC,cAAc;AACd,OAAO,EACL,iBAAiB,GAGlB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EACL,eAAe,GAEhB,MAAM,yBAAyB,CAAA"}
|