@mongrov/analytics 0.1.0-alpha.7 → 0.1.0-alpha.9
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/dist/rules/__fakes__/fakeClock.d.ts +7 -0
- package/dist/rules/__fakes__/fakeClock.d.ts.map +1 -0
- package/dist/rules/__fakes__/fakeClock.js +13 -0
- package/dist/rules/__fakes__/fakeClock.js.map +1 -0
- package/dist/rules/__fakes__/fakeEngine.d.ts +12 -0
- package/dist/rules/__fakes__/fakeEngine.d.ts.map +1 -0
- package/dist/rules/__fakes__/fakeEngine.js +33 -0
- package/dist/rules/__fakes__/fakeEngine.js.map +1 -0
- package/dist/rules/__fakes__/fakeStorage.d.ts +7 -0
- package/dist/rules/__fakes__/fakeStorage.d.ts.map +1 -0
- package/dist/rules/__fakes__/fakeStorage.js +22 -0
- package/dist/rules/__fakes__/fakeStorage.js.map +1 -0
- package/dist/rules/compiler-cache.d.ts +16 -0
- package/dist/rules/compiler-cache.d.ts.map +1 -0
- package/dist/rules/compiler-cache.js +29 -0
- package/dist/rules/compiler-cache.js.map +1 -0
- package/dist/rules/compiler.d.ts +27 -0
- package/dist/rules/compiler.d.ts.map +1 -0
- package/dist/rules/compiler.js +210 -0
- package/dist/rules/compiler.js.map +1 -0
- package/dist/rules/defaults/index.d.ts +13 -0
- package/dist/rules/defaults/index.d.ts.map +1 -0
- package/dist/rules/defaults/index.js +13 -0
- package/dist/rules/defaults/index.js.map +1 -0
- package/dist/rules/defaults/loader.d.ts +18 -0
- package/dist/rules/defaults/loader.d.ts.map +1 -0
- package/dist/rules/defaults/loader.js +37 -0
- package/dist/rules/defaults/loader.js.map +1 -0
- package/dist/rules/defaults/luminx.d.ts +6 -0
- package/dist/rules/defaults/luminx.d.ts.map +1 -0
- package/dist/rules/defaults/luminx.js +64 -0
- package/dist/rules/defaults/luminx.js.map +1 -0
- package/dist/rules/defaults/viva.d.ts +6 -0
- package/dist/rules/defaults/viva.d.ts.map +1 -0
- package/dist/rules/defaults/viva.js +45 -0
- package/dist/rules/defaults/viva.js.map +1 -0
- package/dist/rules/defaults/yogaring.d.ts +6 -0
- package/dist/rules/defaults/yogaring.d.ts.map +1 -0
- package/dist/rules/defaults/yogaring.js +45 -0
- package/dist/rules/defaults/yogaring.js.map +1 -0
- package/dist/rules/defaults/ziva.d.ts +10 -0
- package/dist/rules/defaults/ziva.d.ts.map +1 -0
- package/dist/rules/defaults/ziva.js +87 -0
- package/dist/rules/defaults/ziva.js.map +1 -0
- package/dist/rules/emitter.d.ts +20 -0
- package/dist/rules/emitter.d.ts.map +1 -0
- package/dist/rules/emitter.js +32 -0
- package/dist/rules/emitter.js.map +1 -0
- package/dist/rules/evaluator.d.ts +44 -0
- package/dist/rules/evaluator.d.ts.map +1 -0
- package/dist/rules/evaluator.js +127 -0
- package/dist/rules/evaluator.js.map +1 -0
- package/dist/rules/factory.d.ts +13 -0
- package/dist/rules/factory.d.ts.map +1 -0
- package/dist/rules/factory.js +56 -0
- package/dist/rules/factory.js.map +1 -0
- package/dist/rules/hooks/useRuleRegistry.d.ts +16 -0
- package/dist/rules/hooks/useRuleRegistry.d.ts.map +1 -0
- package/dist/rules/hooks/useRuleRegistry.js +26 -0
- package/dist/rules/hooks/useRuleRegistry.js.map +1 -0
- package/dist/rules/hooks/useRuleViolations.d.ts +21 -0
- package/dist/rules/hooks/useRuleViolations.d.ts.map +1 -0
- package/dist/rules/hooks/useRuleViolations.js +32 -0
- package/dist/rules/hooks/useRuleViolations.js.map +1 -0
- package/dist/rules/index.d.ts +30 -1
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +36 -1
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/registry.d.ts +32 -0
- package/dist/rules/registry.d.ts.map +1 -0
- package/dist/rules/registry.js +98 -0
- package/dist/rules/registry.js.map +1 -0
- package/dist/rules/schema.d.ts +221 -0
- package/dist/rules/schema.d.ts.map +1 -0
- package/dist/rules/schema.js +80 -0
- package/dist/rules/schema.js.map +1 -0
- package/dist/rules/throttle.d.ts +27 -0
- package/dist/rules/throttle.d.ts.map +1 -0
- package/dist/rules/throttle.js +76 -0
- package/dist/rules/throttle.js.map +1 -0
- package/dist/rules/types.d.ts +88 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +9 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/rules/validator.d.ts +27 -0
- package/dist/rules/validator.d.ts.map +1 -0
- package/dist/rules/validator.js +97 -0
- package/dist/rules/validator.js.map +1 -0
- package/dist/sync/factory.d.ts +8 -0
- package/dist/sync/factory.d.ts.map +1 -1
- package/dist/sync/factory.js +31 -1
- package/dist/sync/factory.js.map +1 -1
- package/dist/sync/flusher.d.ts +6 -0
- package/dist/sync/flusher.d.ts.map +1 -1
- package/dist/sync/flusher.js +13 -1
- package/dist/sync/flusher.js.map +1 -1
- package/dist/tools/__fakes__/engine.d.ts +25 -0
- package/dist/tools/__fakes__/engine.d.ts.map +1 -0
- package/dist/tools/__fakes__/engine.js +37 -0
- package/dist/tools/__fakes__/engine.js.map +1 -0
- package/dist/tools/audit.d.ts +31 -0
- package/dist/tools/audit.d.ts.map +1 -0
- package/dist/tools/audit.js +157 -0
- package/dist/tools/audit.js.map +1 -0
- package/dist/tools/authorize.d.ts +36 -0
- package/dist/tools/authorize.d.ts.map +1 -0
- package/dist/tools/authorize.js +87 -0
- package/dist/tools/authorize.js.map +1 -0
- package/dist/tools/budget.d.ts +15 -0
- package/dist/tools/budget.d.ts.map +1 -0
- package/dist/tools/budget.js +64 -0
- package/dist/tools/budget.js.map +1 -0
- package/dist/tools/factory.d.ts +43 -0
- package/dist/tools/factory.d.ts.map +1 -0
- package/dist/tools/factory.js +137 -0
- package/dist/tools/factory.js.map +1 -0
- package/dist/tools/formatters.d.ts +17 -0
- package/dist/tools/formatters.d.ts.map +1 -0
- package/dist/tools/formatters.js +30 -0
- package/dist/tools/formatters.js.map +1 -0
- package/dist/tools/impls/activity.d.ts +15 -0
- package/dist/tools/impls/activity.d.ts.map +1 -0
- package/dist/tools/impls/activity.js +61 -0
- package/dist/tools/impls/activity.js.map +1 -0
- package/dist/tools/impls/anomaly.d.ts +21 -0
- package/dist/tools/impls/anomaly.d.ts.map +1 -0
- package/dist/tools/impls/anomaly.js +70 -0
- package/dist/tools/impls/anomaly.js.map +1 -0
- package/dist/tools/impls/compare.d.ts +21 -0
- package/dist/tools/impls/compare.d.ts.map +1 -0
- package/dist/tools/impls/compare.js +68 -0
- package/dist/tools/impls/compare.js.map +1 -0
- package/dist/tools/impls/hrv.d.ts +15 -0
- package/dist/tools/impls/hrv.d.ts.map +1 -0
- package/dist/tools/impls/hrv.js +36 -0
- package/dist/tools/impls/hrv.js.map +1 -0
- package/dist/tools/impls/insights.d.ts +18 -0
- package/dist/tools/impls/insights.d.ts.map +1 -0
- package/dist/tools/impls/insights.js +41 -0
- package/dist/tools/impls/insights.js.map +1 -0
- package/dist/tools/impls/sleep.d.ts +15 -0
- package/dist/tools/impls/sleep.d.ts.map +1 -0
- package/dist/tools/impls/sleep.js +43 -0
- package/dist/tools/impls/sleep.js.map +1 -0
- package/dist/tools/index.d.ts +13 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +21 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/rate-limit.d.ts +26 -0
- package/dist/tools/rate-limit.d.ts.map +1 -0
- package/dist/tools/rate-limit.js +67 -0
- package/dist/tools/rate-limit.js.map +1 -0
- package/dist/tools/types.d.ts +121 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +16 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/wrap.d.ts +53 -0
- package/dist/tools/wrap.d.ts.map +1 -0
- package/dist/tools/wrap.js +135 -0
- package/dist/tools/wrap.js.map +1 -0
- package/package.json +5 -1
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public runtime types for @mongrov/analytics/rules.
|
|
3
|
+
*
|
|
4
|
+
* Kept structural (no z.infer imports at value level) so downstream
|
|
5
|
+
* consumers don't need to pull the Zod schema module unless they
|
|
6
|
+
* validate rules themselves.
|
|
7
|
+
*/
|
|
8
|
+
import type { AnalyticsEngine, FamilyMembersProvider, KVStore, Unsubscribe } from '../core/types';
|
|
9
|
+
import type { MetricId } from '../core/metric_metadata';
|
|
10
|
+
import type { TableName } from '../core/schemas';
|
|
11
|
+
import type { Rule } from './schema';
|
|
12
|
+
export type { Unsubscribe };
|
|
13
|
+
/** Rule severity mirrors the `insight.severity` column. */
|
|
14
|
+
export type RuleSeverity = 'info' | 'warn' | 'critical';
|
|
15
|
+
/**
|
|
16
|
+
* Subset of a flushed batch that the rules engine reads to gate work.
|
|
17
|
+
* Sync produces this shape after a successful flush.
|
|
18
|
+
*
|
|
19
|
+
* Named `FlushSummary` to avoid collision with sync's own `SensorBatch`
|
|
20
|
+
* (which is the pre-flush push envelope, not the post-flush summary).
|
|
21
|
+
*/
|
|
22
|
+
export interface FlushSummary {
|
|
23
|
+
affectedUserIds: string[];
|
|
24
|
+
affectedTables: TableName[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Compiled artifact for a rule. `sql` uses `$name` placeholders bound
|
|
28
|
+
* via `analytics.execute(sql, params)`; identifiers are already inlined
|
|
29
|
+
* as sanitized literals inside `sql`.
|
|
30
|
+
*/
|
|
31
|
+
export interface CompiledRule {
|
|
32
|
+
ruleId: string;
|
|
33
|
+
metric: MetricId;
|
|
34
|
+
sql: string;
|
|
35
|
+
/** Statically-known params. Runtime binds `$userId`/`$brand`/`$familyId` on top. */
|
|
36
|
+
params: Record<string, string | number>;
|
|
37
|
+
description: string;
|
|
38
|
+
}
|
|
39
|
+
/** Structured violation delivered to `on('violation', handler)` subscribers. */
|
|
40
|
+
export interface RuleViolation {
|
|
41
|
+
ruleId: string;
|
|
42
|
+
ruleName: string;
|
|
43
|
+
severity: RuleSeverity;
|
|
44
|
+
userId: string;
|
|
45
|
+
familyId: string;
|
|
46
|
+
brand: string;
|
|
47
|
+
observedValue: number;
|
|
48
|
+
thresholdValue: number;
|
|
49
|
+
observedAt: Date;
|
|
50
|
+
evidence: Record<string, unknown>;
|
|
51
|
+
}
|
|
52
|
+
/** Structured logger (subset of AnalyticsLogger). */
|
|
53
|
+
export interface RulesLogger {
|
|
54
|
+
debug(message: string, meta?: Record<string, unknown>): void;
|
|
55
|
+
info(message: string, meta?: Record<string, unknown>): void;
|
|
56
|
+
warn(message: string, meta?: Record<string, unknown>): void;
|
|
57
|
+
error(message: string, meta?: Record<string, unknown>): void;
|
|
58
|
+
}
|
|
59
|
+
/** Injected by tests; production defaults to `new Date()`. */
|
|
60
|
+
export type Clock = () => Date;
|
|
61
|
+
/** Config for `createRulesEngine`. */
|
|
62
|
+
export interface RulesEngineConfig {
|
|
63
|
+
analytics: AnalyticsEngine;
|
|
64
|
+
storage: KVStore;
|
|
65
|
+
familyMembersProvider: FamilyMembersProvider;
|
|
66
|
+
brand: string;
|
|
67
|
+
/** Family id for `onSchedule` — v0.1.0 single-user apps pass the userId. */
|
|
68
|
+
familyId: string;
|
|
69
|
+
logger?: RulesLogger;
|
|
70
|
+
clock?: Clock;
|
|
71
|
+
}
|
|
72
|
+
/** Public rules engine surface. */
|
|
73
|
+
export interface RulesEngine {
|
|
74
|
+
register(rules: Rule[]): Promise<void>;
|
|
75
|
+
enable(ruleId: string): Promise<void>;
|
|
76
|
+
disable(ruleId: string): Promise<void>;
|
|
77
|
+
list(): Rule[];
|
|
78
|
+
getActive(): Rule[];
|
|
79
|
+
evaluateOnBatch(batch: FlushSummary): Promise<RuleViolation[]>;
|
|
80
|
+
evaluateScheduled(): Promise<RuleViolation[]>;
|
|
81
|
+
on(event: 'violation', handler: (v: RuleViolation) => void): Unsubscribe;
|
|
82
|
+
/**
|
|
83
|
+
* Subscribe to registry mutations (register / enable / disable). Backs the
|
|
84
|
+
* `useRuleRegistry` hook via `useSyncExternalStore`.
|
|
85
|
+
*/
|
|
86
|
+
subscribeRegistry(listener: () => void): Unsubscribe;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rules/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public runtime types for @mongrov/analytics/rules.
|
|
3
|
+
*
|
|
4
|
+
* Kept structural (no z.infer imports at value level) so downstream
|
|
5
|
+
* consumers don't need to pull the Zod schema module unless they
|
|
6
|
+
* validate rules themselves.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/rules/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static validation for rules — sampling-minimum + rawSql exposure check.
|
|
3
|
+
*
|
|
4
|
+
* Called at `register()` time (before compilation). Fails fast with a
|
|
5
|
+
* `RuleValidationError` whose message includes the metric's sampling
|
|
6
|
+
* cadence + the minimum viable window.
|
|
7
|
+
*/
|
|
8
|
+
import { type MetricId } from '../core/metric_metadata';
|
|
9
|
+
import type { RulesLogger } from './types';
|
|
10
|
+
import { type Rule, type Window } from './schema';
|
|
11
|
+
/**
|
|
12
|
+
* Allow-list of windows compatible with `metric.sampling_minutes`.
|
|
13
|
+
* A window is compatible iff its duration ≥ (2 × sampling cadence),
|
|
14
|
+
* i.e. the query is guaranteed to see at least two samples worst-case.
|
|
15
|
+
* `per_session` metrics (sleep_score, sleep_total_minutes) require ≥ 3d.
|
|
16
|
+
*/
|
|
17
|
+
export declare function allowedWindowsFor(metric: MetricId): Window[];
|
|
18
|
+
/**
|
|
19
|
+
* Validate a parsed rule. Throws `RuleValidationError` on any of:
|
|
20
|
+
* - window smaller than the metric sampling cadence allows,
|
|
21
|
+
* - rawSql references a `collected_only` column without `exposureOverride: true`.
|
|
22
|
+
* When rawSql is present with `exposureOverride: true`, emits a warn via `logger`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function validateRule(rule: Rule, logger?: RulesLogger): void;
|
|
25
|
+
/** Scan a rawSql body for whole-word references to collected-only columns. */
|
|
26
|
+
export declare function referencedCollectedOnlyColumns(sql: string): string[];
|
|
27
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/rules/validator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,KAAK,IAAI,EAAuB,KAAK,MAAM,EAAW,MAAM,UAAU,CAAA;AA4B/E;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,EAAE,CAS5D;AAgBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAwBnE;AAED,8EAA8E;AAC9E,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAOpE"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static validation for rules — sampling-minimum + rawSql exposure check.
|
|
3
|
+
*
|
|
4
|
+
* Called at `register()` time (before compilation). Fails fast with a
|
|
5
|
+
* `RuleValidationError` whose message includes the metric's sampling
|
|
6
|
+
* cadence + the minimum viable window.
|
|
7
|
+
*/
|
|
8
|
+
import { METRIC_METADATA } from '../core/metric_metadata';
|
|
9
|
+
import { RuleValidationError, WINDOWS } from './schema';
|
|
10
|
+
/** Window durations in minutes. */
|
|
11
|
+
const WINDOW_MINUTES = {
|
|
12
|
+
'1h': 60,
|
|
13
|
+
'6h': 6 * 60,
|
|
14
|
+
'24h': 24 * 60,
|
|
15
|
+
'3d': 3 * 24 * 60,
|
|
16
|
+
'7d': 7 * 24 * 60,
|
|
17
|
+
'30d': 30 * 24 * 60,
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Explicit table per spec §Sampling-minimum validator. The remaining
|
|
21
|
+
* exposed metrics fall through to a derived allow-list built from
|
|
22
|
+
* `METRIC_METADATA[id].sampling_minutes` (see `allowedWindowsFor`).
|
|
23
|
+
*/
|
|
24
|
+
const EXPLICIT_SAMPLING_MINIMUMS = {
|
|
25
|
+
hrv_ms: ['24h', '3d', '7d', '30d'],
|
|
26
|
+
stress: ['6h', '24h', '3d', '7d', '30d'],
|
|
27
|
+
hr_bpm: ['1h', '6h', '24h', '3d', '7d', '30d'],
|
|
28
|
+
spo2: ['6h', '24h', '3d', '7d', '30d'],
|
|
29
|
+
temp_c: ['24h', '3d', '7d', '30d'],
|
|
30
|
+
activity_steps: ['1h', '6h', '24h', '3d', '7d', '30d'],
|
|
31
|
+
sleep_total_minutes: ['3d', '7d'],
|
|
32
|
+
device_battery: ['1h', '6h', '24h'],
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Allow-list of windows compatible with `metric.sampling_minutes`.
|
|
36
|
+
* A window is compatible iff its duration ≥ (2 × sampling cadence),
|
|
37
|
+
* i.e. the query is guaranteed to see at least two samples worst-case.
|
|
38
|
+
* `per_session` metrics (sleep_score, sleep_total_minutes) require ≥ 3d.
|
|
39
|
+
*/
|
|
40
|
+
export function allowedWindowsFor(metric) {
|
|
41
|
+
const explicit = EXPLICIT_SAMPLING_MINIMUMS[metric];
|
|
42
|
+
if (explicit)
|
|
43
|
+
return explicit;
|
|
44
|
+
const cadence = METRIC_METADATA[metric].sampling_minutes;
|
|
45
|
+
if (cadence === 'per_session') {
|
|
46
|
+
return ['3d', '7d', '30d'];
|
|
47
|
+
}
|
|
48
|
+
const minWindow = cadence * 2;
|
|
49
|
+
return WINDOWS.filter(w => WINDOW_MINUTES[w] >= minWindow);
|
|
50
|
+
}
|
|
51
|
+
/** Columns whose metric is marked `collected_only`. */
|
|
52
|
+
const COLLECTED_ONLY_COLUMNS = new Set(Object.values(METRIC_METADATA)
|
|
53
|
+
.filter(entry => entry.exposure === 'collected_only')
|
|
54
|
+
.map(entry => entry.column));
|
|
55
|
+
function samplingLabel(metric) {
|
|
56
|
+
const cadence = METRIC_METADATA[metric].sampling_minutes;
|
|
57
|
+
return cadence === 'per_session'
|
|
58
|
+
? 'once per sleep session'
|
|
59
|
+
: `every ${cadence}min`;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Validate a parsed rule. Throws `RuleValidationError` on any of:
|
|
63
|
+
* - window smaller than the metric sampling cadence allows,
|
|
64
|
+
* - rawSql references a `collected_only` column without `exposureOverride: true`.
|
|
65
|
+
* When rawSql is present with `exposureOverride: true`, emits a warn via `logger`.
|
|
66
|
+
*/
|
|
67
|
+
export function validateRule(rule, logger) {
|
|
68
|
+
const allowed = allowedWindowsFor(rule.metric);
|
|
69
|
+
if (!allowed.includes(rule.window)) {
|
|
70
|
+
throw new RuleValidationError(`Rule ${rule.id}: metric ${rule.metric} sampled ${samplingLabel(rule.metric)}. `
|
|
71
|
+
+ `Window ${rule.window} too small. Minimum viable: ${allowed[0]}.`);
|
|
72
|
+
}
|
|
73
|
+
if (rule.rawSql) {
|
|
74
|
+
const references = referencedCollectedOnlyColumns(rule.rawSql);
|
|
75
|
+
if (references.length > 0 && !rule.exposureOverride) {
|
|
76
|
+
throw new RuleValidationError(`Rule ${rule.id}: rawSql references collected_only column(s) [${references.join(', ')}]. `
|
|
77
|
+
+ `Set exposureOverride: true to acknowledge.`);
|
|
78
|
+
}
|
|
79
|
+
if (rule.exposureOverride && logger) {
|
|
80
|
+
logger.warn('rules.validator: rawSql exposureOverride active', {
|
|
81
|
+
ruleId: rule.id,
|
|
82
|
+
columns: references,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** Scan a rawSql body for whole-word references to collected-only columns. */
|
|
88
|
+
export function referencedCollectedOnlyColumns(sql) {
|
|
89
|
+
const hits = new Set();
|
|
90
|
+
for (const col of COLLECTED_ONLY_COLUMNS) {
|
|
91
|
+
const pattern = new RegExp(`\\b${col}\\b`);
|
|
92
|
+
if (pattern.test(sql))
|
|
93
|
+
hits.add(col);
|
|
94
|
+
}
|
|
95
|
+
return Array.from(hits);
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/rules/validator.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/factory.d.ts
CHANGED
|
@@ -22,6 +22,7 @@ import type { PrefetchPolicy } from './fetcher';
|
|
|
22
22
|
import { type BackgroundTaskPort, type ConstraintPort, type SchedulerLogger } from './scheduler';
|
|
23
23
|
import type { SyncManager } from './manager';
|
|
24
24
|
import type { OverflowPolicy } from './types';
|
|
25
|
+
import type { RulesEngine } from '../rules/types';
|
|
25
26
|
export interface CreateSyncManagerConfig {
|
|
26
27
|
analytics: AnalyticsEngine;
|
|
27
28
|
storage: KVStore;
|
|
@@ -47,6 +48,13 @@ export interface CreateSyncManagerConfig {
|
|
|
47
48
|
requiresWifi?: boolean;
|
|
48
49
|
taskName?: string;
|
|
49
50
|
};
|
|
51
|
+
/**
|
|
52
|
+
* Optional rules engine wired into the flush pipeline. After a successful
|
|
53
|
+
* flush the manager calls `rulesEngine.evaluateOnBatch({ affectedUserIds,
|
|
54
|
+
* affectedTables: [table] })`. Fire-and-forget: the evaluator swallows its
|
|
55
|
+
* own errors, so we never block a sync cycle on rules.
|
|
56
|
+
*/
|
|
57
|
+
rulesEngine?: RulesEngine;
|
|
50
58
|
logger?: SchedulerLogger;
|
|
51
59
|
}
|
|
52
60
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/sync/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAG5E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAO/C,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,eAAe,EAGrB,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAc,WAAW,EAAkC,MAAM,WAAW,CAAA;AAExF,OAAO,KAAK,EAAe,cAAc,EAAe,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/sync/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAG5E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAO/C,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,eAAe,EAGrB,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAc,WAAW,EAAkC,MAAM,WAAW,CAAA;AAExF,OAAO,KAAK,EAAe,cAAc,EAAe,MAAM,SAAS,CAAA;AAIvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAkCjD,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,eAAe,CAAA;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,aAAa,CAAA;IAClB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;IACzB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAA;IAC9C,cAAc,EAAE,cAAc,CAAA;IAC9B,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,cAAc,CAAC,EAAE,kBAAkB,CAAA;IACnC,WAAW,CAAC,EAAE,cAAc,CAAA;IAC5B,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,WAAW,CAAC,EAAE,MAAM,CAAA;KACrB,CAAA;IACD,QAAQ,CAAC,EAAE;QACT,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,MAAM,CAAC,EAAE,cAAc,CAAA;KACxB,CAAA;IACD,SAAS,CAAC,EAAE;QACV,gBAAgB,CAAC,EAAE,OAAO,CAAA;QAC1B,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB,CAAA;IACD;;;;;OAKG;IACH,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,MAAM,CAAC,EAAE,eAAe,CAAA;CACzB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,uBAAuB,GAAG,WAAW,CA8J9E"}
|
package/dist/sync/factory.js
CHANGED
|
@@ -78,11 +78,26 @@ export function createSyncManager(config) {
|
|
|
78
78
|
const progress = { pendingByTable: {} };
|
|
79
79
|
const busFlushEmit = config.eventBus ? bindFlushEvents(config.eventBus) : undefined;
|
|
80
80
|
// Compose the flusher emitter with local progress tracking so hooks + the
|
|
81
|
-
// event bus both see every event.
|
|
81
|
+
// event bus both see every event. When a rules engine is provided, `flushed`
|
|
82
|
+
// events also drive `evaluateOnBatch` — fire-and-forget so a slow evaluator
|
|
83
|
+
// never stalls sync.
|
|
84
|
+
const rulesEngine = config.rulesEngine;
|
|
85
|
+
const rulesLogger = config.logger;
|
|
82
86
|
const flushEmitter = (event) => {
|
|
83
87
|
if (event.type === 'flushed') {
|
|
84
88
|
progress.pendingByTable[event.payload.table] = 0;
|
|
85
89
|
progress.lastFlushAt = Date.now();
|
|
90
|
+
if (rulesEngine && event.payload.affectedUserIds.length > 0) {
|
|
91
|
+
rulesEngine.evaluateOnBatch({
|
|
92
|
+
affectedUserIds: event.payload.affectedUserIds,
|
|
93
|
+
affectedTables: [event.payload.table],
|
|
94
|
+
}).catch((err) => {
|
|
95
|
+
rulesLogger?.warn('sync.factory: rulesEngine.evaluateOnBatch threw', {
|
|
96
|
+
table: event.payload.table,
|
|
97
|
+
err: err instanceof Error ? err.message : String(err),
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
}
|
|
86
101
|
}
|
|
87
102
|
busFlushEmit?.(event);
|
|
88
103
|
};
|
|
@@ -127,6 +142,21 @@ export function createSyncManager(config) {
|
|
|
127
142
|
},
|
|
128
143
|
pushAll: async (tables, ctx) => pusher.pushAll(tables, ctx),
|
|
129
144
|
fetchIncremental: async (ctx) => fetcher.fetchIncremental(ctx),
|
|
145
|
+
// Scheduled rules pass runs after the cycle's flush/push/fetch. Fire-
|
|
146
|
+
// and-forget — a throw here would surface as a cycle error, but the
|
|
147
|
+
// catch keeps the scheduler idle.
|
|
148
|
+
onCycleComplete: rulesEngine
|
|
149
|
+
? async () => {
|
|
150
|
+
try {
|
|
151
|
+
await rulesEngine.evaluateScheduled();
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
rulesLogger?.warn('sync.factory: rulesEngine.evaluateScheduled threw', {
|
|
155
|
+
err: err instanceof Error ? err.message : String(err),
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
: undefined,
|
|
130
160
|
},
|
|
131
161
|
tables: [...config.tables],
|
|
132
162
|
ctx: config.ctx,
|
package/dist/sync/factory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/sync/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAE1D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAKL,aAAa,GACd,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/sync/factory.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/flusher.d.ts
CHANGED
|
@@ -36,6 +36,12 @@ export interface FlushedEvent {
|
|
|
36
36
|
table: string;
|
|
37
37
|
rowsFlushed: number;
|
|
38
38
|
reason: FlushReason;
|
|
39
|
+
/**
|
|
40
|
+
* Distinct userIds observed across drained buffer entries. Empty when the
|
|
41
|
+
* flush drained zero rows. Consumed by the rules engine to gate
|
|
42
|
+
* `evaluateOnBatch`.
|
|
43
|
+
*/
|
|
44
|
+
affectedUserIds: string[];
|
|
39
45
|
}
|
|
40
46
|
export type SyncEmitter = (event: {
|
|
41
47
|
type: 'flushed';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flusher.d.ts","sourceRoot":"","sources":["../../src/sync/flusher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,SAAS,CAAA;AAEvD,MAAM,MAAM,WAAW,GACjB,WAAW,GACX,KAAK,GACL,YAAY,GACZ,YAAY,GACZ,QAAQ,GACR,WAAW,CAAA;AAajB,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAQhD,CAAA;AAED,eAAO,MAAM,wBAAwB,IAAI,CAAA;AACzC,eAAO,MAAM,gBAAgB,QAAS,CAAA;AAEtC,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAA;AAExD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"flusher.d.ts","sourceRoot":"","sources":["../../src/sync/flusher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,SAAS,CAAA;AAEvD,MAAM,MAAM,WAAW,GACjB,WAAW,GACX,KAAK,GACL,YAAY,GACZ,YAAY,GACZ,QAAQ,GACR,WAAW,CAAA;AAajB,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAQhD,CAAA;AAED,eAAO,MAAM,wBAAwB,IAAI,CAAA;AACzC,eAAO,MAAM,gBAAgB,QAAS,CAAA;AAEtC,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAA;AAExD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,WAAW,CAAA;IACnB;;;;OAIG;IACH,eAAe,EAAE,MAAM,EAAE,CAAA;CAC1B;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAC5B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,CAAA;KAAE,CAAA;CAAE,KACrE,IAAI,CAAA;AAET,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,YAAY,CAAA;IACpB,MAAM,EAAE,YAAY,CAAA;IACpB;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAA;IAC9C,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oDAAoD;IACpD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,WAAW,CAAA;CACnB;AAQD,qBAAa,YAAY;;gBAUX,MAAM,EAAE,kBAAkB;IAUtC,mEAAmE;IACnE,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IAIpC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIjD,mDAAmD;IACnD,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIrC;;;OAGG;IACG,KAAK,CACT,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,WAAsB,GAC7B,OAAO,CAAC,WAAW,CAAC;IAmCvB;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAQvE,yDAAyD;IACnD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC,2EAA2E;IAC3E,UAAU,IAAI,IAAI;IAIlB,6BAA6B;IAC7B,WAAW,IAAI,IAAI;CA0GpB"}
|
package/dist/sync/flusher.js
CHANGED
|
@@ -105,7 +105,11 @@ export class BatchFlusher {
|
|
|
105
105
|
state.failureCount = 0;
|
|
106
106
|
state.lastError = undefined;
|
|
107
107
|
state.state = 'idle';
|
|
108
|
-
|
|
108
|
+
const affectedUserIds = distinctUserIds(drained);
|
|
109
|
+
__classPrivateFieldGet(this, _BatchFlusher_emit, "f")?.call(this, {
|
|
110
|
+
type: 'flushed',
|
|
111
|
+
payload: { table, rowsFlushed, reason, affectedUserIds },
|
|
112
|
+
});
|
|
109
113
|
return { table, rowsFlushed, ok: true };
|
|
110
114
|
}
|
|
111
115
|
catch (cause) {
|
|
@@ -231,4 +235,12 @@ _BatchFlusher_engine = new WeakMap(), _BatchFlusher_buffer = new WeakMap(), _Bat
|
|
|
231
235
|
function defaultSleep(ms) {
|
|
232
236
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
233
237
|
}
|
|
238
|
+
function distinctUserIds(entries) {
|
|
239
|
+
const seen = new Set();
|
|
240
|
+
for (const entry of entries) {
|
|
241
|
+
if (entry.userId)
|
|
242
|
+
seen.add(entry.userId);
|
|
243
|
+
}
|
|
244
|
+
return Array.from(seen);
|
|
245
|
+
}
|
|
234
246
|
//# sourceMappingURL=flusher.js.map
|
package/dist/sync/flusher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flusher.js","sourceRoot":"","sources":["../../src/sync/flusher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;;;;;;;;;;;;;AAEH,OAAO,MAAM,MAAM,SAAS,CAAA;AAI5B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAWpC,4EAA4E;AAC5E,qCAAqC;AACrC,MAAM,kBAAkB,GAAgC;IACtD,UAAU,EAAE,GAAG;IACf,MAAM,EAAE,EAAE;IACV,WAAW,EAAE,EAAE;IACf,GAAG,EAAE,EAAE;IACP,SAAS,EAAE,EAAE;IACb,UAAU,EAAE,CAAC;CACd,CAAA;AAED,6EAA6E;AAC7E,MAAM,CAAC,MAAM,mBAAmB,GAAsB;IACpD,IAAK;IACL,IAAK;IACL,IAAK;IACL,IAAK;IACL,KAAM;IACN,KAAM;IACN,KAAM;CACP,CAAA;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAA;AACzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"flusher.js","sourceRoot":"","sources":["../../src/sync/flusher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AnalyticsEngine } from '../../core/types';
|
|
2
|
+
/**
|
|
3
|
+
* Scriptable AnalyticsEngine fake for tool tests.
|
|
4
|
+
*
|
|
5
|
+
* Unlike the rules-side fake (single global queue), this fake supports
|
|
6
|
+
* per-SQL-substring row queues so multi-query tools (compare, activity)
|
|
7
|
+
* can script distinct responses per call.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const engine = createFakeEngine()
|
|
11
|
+
* engine.queueRows('FROM hrv', [{ day: '2026-07-08', avg_hrv: 45 }])
|
|
12
|
+
* engine.queueRows('FROM sleep_session', [...])
|
|
13
|
+
* // ...invoke tool...
|
|
14
|
+
* engine.calls.forEach(c => ...)
|
|
15
|
+
*/
|
|
16
|
+
export interface FakeEngine extends AnalyticsEngine {
|
|
17
|
+
readonly calls: {
|
|
18
|
+
sql: string;
|
|
19
|
+
params: Record<string, unknown>;
|
|
20
|
+
}[];
|
|
21
|
+
queueRows: (sqlSubstring: string, rows: unknown[]) => void;
|
|
22
|
+
setError: (err: Error | null) => void;
|
|
23
|
+
}
|
|
24
|
+
export declare function createFakeEngine(): FakeEngine;
|
|
25
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/tools/__fakes__/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAEvD;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,UAAW,SAAQ,eAAe;IACjD,QAAQ,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE,CAAA;IAClE,SAAS,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;IAC1D,QAAQ,EAAE,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,CAAA;CACtC;AAED,wBAAgB,gBAAgB,IAAI,UAAU,CAkC7C"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export function createFakeEngine() {
|
|
2
|
+
const queues = [];
|
|
3
|
+
const calls = [];
|
|
4
|
+
let error = null;
|
|
5
|
+
const engine = {
|
|
6
|
+
async attach() { },
|
|
7
|
+
async detach() { },
|
|
8
|
+
async execute(sql, params) {
|
|
9
|
+
calls.push({ sql, params: params ?? {} });
|
|
10
|
+
if (error)
|
|
11
|
+
throw error;
|
|
12
|
+
const idx = queues.findIndex(q => sql.includes(q.substring));
|
|
13
|
+
if (idx === -1)
|
|
14
|
+
return [];
|
|
15
|
+
const [q] = queues.splice(idx, 1);
|
|
16
|
+
return q.rows;
|
|
17
|
+
},
|
|
18
|
+
stream() {
|
|
19
|
+
throw new Error('stream not implemented in fake');
|
|
20
|
+
},
|
|
21
|
+
createAppender() {
|
|
22
|
+
throw new Error('createAppender not implemented in fake');
|
|
23
|
+
},
|
|
24
|
+
state: 'attached',
|
|
25
|
+
lastError: null,
|
|
26
|
+
catalog: 'fake',
|
|
27
|
+
subscribe: () => () => { },
|
|
28
|
+
async setRetention() { },
|
|
29
|
+
async getLastAttach() { return null; },
|
|
30
|
+
async close() { },
|
|
31
|
+
calls,
|
|
32
|
+
queueRows(substring, rows) { queues.push({ substring, rows }); },
|
|
33
|
+
setError(err) { error = err; },
|
|
34
|
+
};
|
|
35
|
+
return engine;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/tools/__fakes__/engine.ts"],"names":[],"mappings":"AAsBA,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAA6C,EAAE,CAAA;IAC3D,MAAM,KAAK,GAAuD,EAAE,CAAA;IACpE,IAAI,KAAK,GAAiB,IAAI,CAAA;IAE9B,MAAM,MAAM,GAAe;QACzB,KAAK,CAAC,MAAM,KAAI,CAAC;QACjB,KAAK,CAAC,MAAM,KAAI,CAAC;QACjB,KAAK,CAAC,OAAO,CAAI,GAAW,EAAE,MAAgC;YAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC,CAAA;YACzC,IAAI,KAAK;gBAAE,MAAM,KAAK,CAAA;YACtB,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;YAC5D,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE,OAAO,EAAS,CAAA;YAChC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YACjC,OAAO,CAAC,CAAC,IAAW,CAAA;QACtB,CAAC;QACD,MAAM;YACJ,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;QACnD,CAAC;QACD,cAAc;YACZ,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;QAC3D,CAAC;QACD,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,MAAM;QACf,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC;QACzB,KAAK,CAAC,YAAY,KAAI,CAAC;QACvB,KAAK,CAAC,aAAa,KAAK,OAAO,IAAI,CAAA,CAAC,CAAC;QACrC,KAAK,CAAC,KAAK,KAAI,CAAC;QAChB,KAAK;QACL,SAAS,CAAC,SAAS,EAAE,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA,CAAC,CAAC;QAC/D,QAAQ,CAAC,GAAG,IAAI,KAAK,GAAG,GAAG,CAAA,CAAC,CAAC;KAC9B,CAAA;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batched writer for `tool_call_audit`.
|
|
3
|
+
*
|
|
4
|
+
* `record()` enqueues synchronously (non-blocking). The batch flushes
|
|
5
|
+
* whenever:
|
|
6
|
+
* - the pending queue reaches `batchSize` (default 10), or
|
|
7
|
+
* - the flush timer fires (`flushIntervalMs`, default 1000ms).
|
|
8
|
+
*
|
|
9
|
+
* `flush()` and `close()` are cooperative exit hooks — `close`
|
|
10
|
+
* additionally halts the timer.
|
|
11
|
+
*
|
|
12
|
+
* On flush failure the batch is retained and retried on the next
|
|
13
|
+
* tick. A defensive `MAX_CONSECUTIVE_FAILURES` cap drops the buffer
|
|
14
|
+
* after repeated errors to avoid unbounded growth on a stuck
|
|
15
|
+
* warehouse.
|
|
16
|
+
*
|
|
17
|
+
* SQL uses a single INSERT with a suffix-indexed VALUES tuple per
|
|
18
|
+
* row (`$p0_ts, $p0_brand, …, $p1_ts, …`). DuckDB honors named
|
|
19
|
+
* parameters in this form.
|
|
20
|
+
*/
|
|
21
|
+
import type { AnalyticsEngine } from '../core/types';
|
|
22
|
+
import type { AuditWriter, ToolsLogger } from './types';
|
|
23
|
+
export interface CreateAuditWriterConfig {
|
|
24
|
+
analytics: AnalyticsEngine;
|
|
25
|
+
enabled?: boolean;
|
|
26
|
+
batchSize?: number;
|
|
27
|
+
flushIntervalMs?: number;
|
|
28
|
+
logger?: ToolsLogger;
|
|
29
|
+
}
|
|
30
|
+
export declare function createAuditWriter(cfg: CreateAuditWriterConfig): AuditWriter;
|
|
31
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/tools/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,KAAK,EAAc,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAoBnE,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,eAAe,CAAA;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,uBAAuB,GAAG,WAAW,CA6F3E"}
|