@contractspec/lib.personalization 1.57.0 → 1.58.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 (58) hide show
  1. package/dist/adapter.d.ts +15 -19
  2. package/dist/adapter.d.ts.map +1 -1
  3. package/dist/adapter.js +43 -38
  4. package/dist/analyzer.d.ts +15 -19
  5. package/dist/analyzer.d.ts.map +1 -1
  6. package/dist/analyzer.js +69 -51
  7. package/dist/browser/adapter.js +46 -0
  8. package/dist/browser/analyzer.js +72 -0
  9. package/dist/browser/docs/behavior-tracking.docblock.js +97 -0
  10. package/dist/browser/docs/index.js +271 -0
  11. package/dist/browser/docs/overlay-engine.docblock.js +98 -0
  12. package/dist/browser/docs/workflow-composition.docblock.js +83 -0
  13. package/dist/browser/index.js +555 -0
  14. package/dist/browser/store.js +75 -0
  15. package/dist/browser/tracker.js +94 -0
  16. package/dist/browser/types.js +0 -0
  17. package/dist/docs/behavior-tracking.docblock.d.ts +2 -6
  18. package/dist/docs/behavior-tracking.docblock.d.ts.map +1 -1
  19. package/dist/docs/behavior-tracking.docblock.js +95 -15
  20. package/dist/docs/index.d.ts +4 -3
  21. package/dist/docs/index.d.ts.map +1 -0
  22. package/dist/docs/index.js +272 -3
  23. package/dist/docs/overlay-engine.docblock.d.ts +2 -6
  24. package/dist/docs/overlay-engine.docblock.d.ts.map +1 -1
  25. package/dist/docs/overlay-engine.docblock.js +96 -15
  26. package/dist/docs/workflow-composition.docblock.d.ts +2 -6
  27. package/dist/docs/workflow-composition.docblock.d.ts.map +1 -1
  28. package/dist/docs/workflow-composition.docblock.js +81 -15
  29. package/dist/index.d.ts +7 -7
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +555 -6
  32. package/dist/node/adapter.js +46 -0
  33. package/dist/node/analyzer.js +72 -0
  34. package/dist/node/docs/behavior-tracking.docblock.js +97 -0
  35. package/dist/node/docs/index.js +271 -0
  36. package/dist/node/docs/overlay-engine.docblock.js +98 -0
  37. package/dist/node/docs/workflow-composition.docblock.js +83 -0
  38. package/dist/node/index.js +555 -0
  39. package/dist/node/store.js +75 -0
  40. package/dist/node/tracker.js +94 -0
  41. package/dist/node/types.js +0 -0
  42. package/dist/store.d.ts +14 -18
  43. package/dist/store.d.ts.map +1 -1
  44. package/dist/store.js +74 -57
  45. package/dist/tracker.d.ts +42 -46
  46. package/dist/tracker.d.ts.map +1 -1
  47. package/dist/tracker.js +93 -91
  48. package/dist/types.d.ts +48 -51
  49. package/dist/types.d.ts.map +1 -1
  50. package/dist/types.js +1 -0
  51. package/package.json +104 -37
  52. package/dist/adapter.js.map +0 -1
  53. package/dist/analyzer.js.map +0 -1
  54. package/dist/docs/behavior-tracking.docblock.js.map +0 -1
  55. package/dist/docs/overlay-engine.docblock.js.map +0 -1
  56. package/dist/docs/workflow-composition.docblock.js.map +0 -1
  57. package/dist/store.js.map +0 -1
  58. package/dist/tracker.js.map +0 -1
File without changes
package/dist/store.d.ts CHANGED
@@ -1,21 +1,17 @@
1
- import { BehaviorEvent, BehaviorQuery, BehaviorSummary } from "./types.js";
2
-
3
- //#region src/store.d.ts
4
- interface BehaviorStore {
5
- record(event: BehaviorEvent): Promise<void> | void;
6
- bulkRecord(events: BehaviorEvent[]): Promise<void> | void;
7
- query(query: BehaviorQuery): Promise<BehaviorEvent[]>;
8
- summarize(query: BehaviorQuery): Promise<BehaviorSummary>;
9
- clear?(): Promise<void> | void;
1
+ import type { BehaviorEvent, BehaviorQuery, BehaviorSummary } from './types';
2
+ export interface BehaviorStore {
3
+ record(event: BehaviorEvent): Promise<void> | void;
4
+ bulkRecord(events: BehaviorEvent[]): Promise<void> | void;
5
+ query(query: BehaviorQuery): Promise<BehaviorEvent[]>;
6
+ summarize(query: BehaviorQuery): Promise<BehaviorSummary>;
7
+ clear?(): Promise<void> | void;
10
8
  }
11
- declare class InMemoryBehaviorStore implements BehaviorStore {
12
- private events;
13
- record(event: BehaviorEvent): Promise<void>;
14
- bulkRecord(events: BehaviorEvent[]): Promise<void>;
15
- query(query: BehaviorQuery): Promise<BehaviorEvent[]>;
16
- summarize(query: BehaviorQuery): Promise<BehaviorSummary>;
17
- clear(): Promise<void>;
9
+ export declare class InMemoryBehaviorStore implements BehaviorStore {
10
+ private events;
11
+ record(event: BehaviorEvent): Promise<void>;
12
+ bulkRecord(events: BehaviorEvent[]): Promise<void>;
13
+ query(query: BehaviorQuery): Promise<BehaviorEvent[]>;
14
+ summarize(query: BehaviorQuery): Promise<BehaviorSummary>;
15
+ clear(): Promise<void>;
18
16
  }
19
- //#endregion
20
- export { BehaviorStore, InMemoryBehaviorStore };
21
17
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","names":[],"sources":["../src/store.ts"],"mappings":";;;UAEiB,aAAA;EACf,MAAA,CAAO,KAAA,EAAO,aAAA,GAAgB,OAAA;EAC9B,UAAA,CAAW,MAAA,EAAQ,aAAA,KAAkB,OAAA;EACrC,KAAA,CAAM,KAAA,EAAO,aAAA,GAAgB,OAAA,CAAQ,aAAA;EACrC,SAAA,CAAU,KAAA,EAAO,aAAA,GAAgB,OAAA,CAAQ,eAAA;EACzC,KAAA,KAAU,OAAA;AAAA;AAAA,cAGC,qBAAA,YAAiC,aAAA;EAAA,QACpC,MAAA;EAEF,MAAA,CAAO,KAAA,EAAO,aAAA,GAAgB,OAAA;EAI9B,UAAA,CAAW,MAAA,EAAQ,aAAA,KAAkB,OAAA;EAIrC,KAAA,CAAM,KAAA,EAAO,aAAA,GAAgB,OAAA,CAAQ,aAAA;EAIrC,SAAA,CAAU,KAAA,EAAO,aAAA,GAAgB,OAAA,CAAQ,eAAA;EAgCzC,KAAA,CAAA,GAAS,OAAA;AAAA"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE7E,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACnD,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1D,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACtD,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAChC;AAED,qBAAa,qBAAsB,YAAW,aAAa;IACzD,OAAO,CAAC,MAAM,CAAuB;IAE/B,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAIrD,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IAgCzD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
package/dist/store.js CHANGED
@@ -1,59 +1,76 @@
1
- //#region src/store.ts
2
- var InMemoryBehaviorStore = class {
3
- events = [];
4
- async record(event) {
5
- this.events.push(event);
6
- }
7
- async bulkRecord(events) {
8
- this.events.push(...events);
9
- }
10
- async query(query) {
11
- return filterEvents(this.events, query);
12
- }
13
- async summarize(query) {
14
- const events = await this.query(query);
15
- const summary = {
16
- fieldCounts: {},
17
- featureCounts: {},
18
- workflowStepCounts: {},
19
- totalEvents: events.length
20
- };
21
- events.forEach((event) => {
22
- switch (event.type) {
23
- case "field_access":
24
- summary.fieldCounts[event.field] = (summary.fieldCounts[event.field] ?? 0) + 1;
25
- break;
26
- case "feature_usage":
27
- summary.featureCounts[event.feature] = (summary.featureCounts[event.feature] ?? 0) + 1;
28
- break;
29
- case "workflow_step": {
30
- const workflow = summary.workflowStepCounts[event.workflow] ??= {};
31
- workflow[event.step] = (workflow[event.step] ?? 0) + 1;
32
- break;
33
- }
34
- default: break;
35
- }
36
- });
37
- return summary;
38
- }
39
- async clear() {
40
- this.events = [];
41
- }
42
- };
1
+ // @bun
2
+ // src/store.ts
3
+ class InMemoryBehaviorStore {
4
+ events = [];
5
+ async record(event) {
6
+ this.events.push(event);
7
+ }
8
+ async bulkRecord(events) {
9
+ this.events.push(...events);
10
+ }
11
+ async query(query) {
12
+ return filterEvents(this.events, query);
13
+ }
14
+ async summarize(query) {
15
+ const events = await this.query(query);
16
+ const summary = {
17
+ fieldCounts: {},
18
+ featureCounts: {},
19
+ workflowStepCounts: {},
20
+ totalEvents: events.length
21
+ };
22
+ events.forEach((event) => {
23
+ switch (event.type) {
24
+ case "field_access":
25
+ summary.fieldCounts[event.field] = (summary.fieldCounts[event.field] ?? 0) + 1;
26
+ break;
27
+ case "feature_usage":
28
+ summary.featureCounts[event.feature] = (summary.featureCounts[event.feature] ?? 0) + 1;
29
+ break;
30
+ case "workflow_step": {
31
+ const workflow = summary.workflowStepCounts[event.workflow] ??= {};
32
+ workflow[event.step] = (workflow[event.step] ?? 0) + 1;
33
+ break;
34
+ }
35
+ default:
36
+ break;
37
+ }
38
+ });
39
+ return summary;
40
+ }
41
+ async clear() {
42
+ this.events = [];
43
+ }
44
+ }
43
45
  function filterEvents(events, query) {
44
- return events.filter((event) => {
45
- if (query.tenantId && event.tenantId !== query.tenantId) return false;
46
- if (query.userId && event.userId !== query.userId) return false;
47
- if (query.role && event.role !== query.role) return false;
48
- if (query.since && event.timestamp < query.since) return false;
49
- if (query.until && event.timestamp > query.until) return false;
50
- if (query.operation && event.type === "field_access" && event.operation !== query.operation) return false;
51
- if (query.feature && event.type === "feature_usage" && event.feature !== query.feature) return false;
52
- if (query.workflow && event.type === "workflow_step" && event.workflow !== query.workflow) return false;
53
- return true;
54
- });
46
+ return events.filter((event) => {
47
+ if (query.tenantId && event.tenantId !== query.tenantId) {
48
+ return false;
49
+ }
50
+ if (query.userId && event.userId !== query.userId) {
51
+ return false;
52
+ }
53
+ if (query.role && event.role !== query.role) {
54
+ return false;
55
+ }
56
+ if (query.since && event.timestamp < query.since) {
57
+ return false;
58
+ }
59
+ if (query.until && event.timestamp > query.until) {
60
+ return false;
61
+ }
62
+ if (query.operation && event.type === "field_access" && event.operation !== query.operation) {
63
+ return false;
64
+ }
65
+ if (query.feature && event.type === "feature_usage" && event.feature !== query.feature) {
66
+ return false;
67
+ }
68
+ if (query.workflow && event.type === "workflow_step" && event.workflow !== query.workflow) {
69
+ return false;
70
+ }
71
+ return true;
72
+ });
55
73
  }
56
-
57
- //#endregion
58
- export { InMemoryBehaviorStore };
59
- //# sourceMappingURL=store.js.map
74
+ export {
75
+ InMemoryBehaviorStore
76
+ };
package/dist/tracker.d.ts CHANGED
@@ -1,53 +1,49 @@
1
- import { BehaviorStore } from "./store.js";
2
-
3
- //#region src/tracker.d.ts
4
- interface BehaviorTrackerContext {
5
- tenantId: string;
6
- userId?: string;
7
- role?: string;
8
- device?: string;
9
- metadata?: Record<string, unknown>;
1
+ import type { BehaviorStore } from './store';
2
+ export interface BehaviorTrackerContext {
3
+ tenantId: string;
4
+ userId?: string;
5
+ role?: string;
6
+ device?: string;
7
+ metadata?: Record<string, unknown>;
10
8
  }
11
- interface BehaviorTrackerOptions {
12
- store: BehaviorStore;
13
- context: BehaviorTrackerContext;
14
- tracerName?: string;
15
- autoFlushIntervalMs?: number;
16
- bufferSize?: number;
9
+ export interface BehaviorTrackerOptions {
10
+ store: BehaviorStore;
11
+ context: BehaviorTrackerContext;
12
+ tracerName?: string;
13
+ autoFlushIntervalMs?: number;
14
+ bufferSize?: number;
17
15
  }
18
- interface TrackFieldAccessInput {
19
- operation: string;
20
- field: string;
21
- metadata?: Record<string, unknown>;
16
+ export interface TrackFieldAccessInput {
17
+ operation: string;
18
+ field: string;
19
+ metadata?: Record<string, unknown>;
22
20
  }
23
- interface TrackFeatureUsageInput {
24
- feature: string;
25
- action: 'opened' | 'completed' | 'dismissed';
26
- metadata?: Record<string, unknown>;
21
+ export interface TrackFeatureUsageInput {
22
+ feature: string;
23
+ action: 'opened' | 'completed' | 'dismissed';
24
+ metadata?: Record<string, unknown>;
27
25
  }
28
- interface TrackWorkflowStepInput {
29
- workflow: string;
30
- step: string;
31
- status: 'entered' | 'completed' | 'skipped' | 'errored';
32
- metadata?: Record<string, unknown>;
26
+ export interface TrackWorkflowStepInput {
27
+ workflow: string;
28
+ step: string;
29
+ status: 'entered' | 'completed' | 'skipped' | 'errored';
30
+ metadata?: Record<string, unknown>;
33
31
  }
34
- declare class BehaviorTracker {
35
- private readonly store;
36
- private readonly context;
37
- private readonly tracer;
38
- private readonly counter;
39
- private buffer;
40
- private readonly bufferSize;
41
- private flushTimer?;
42
- constructor(options: BehaviorTrackerOptions);
43
- trackFieldAccess(input: TrackFieldAccessInput): void;
44
- trackFeatureUsage(input: TrackFeatureUsageInput): void;
45
- trackWorkflowStep(input: TrackWorkflowStepInput): void;
46
- flush(): Promise<void>;
47
- dispose(): Promise<void>;
48
- private enqueue;
32
+ export declare class BehaviorTracker {
33
+ private readonly store;
34
+ private readonly context;
35
+ private readonly tracer;
36
+ private readonly counter;
37
+ private buffer;
38
+ private readonly bufferSize;
39
+ private flushTimer?;
40
+ constructor(options: BehaviorTrackerOptions);
41
+ trackFieldAccess(input: TrackFieldAccessInput): void;
42
+ trackFeatureUsage(input: TrackFeatureUsageInput): void;
43
+ trackWorkflowStep(input: TrackWorkflowStepInput): void;
44
+ flush(): Promise<void>;
45
+ dispose(): Promise<void>;
46
+ private enqueue;
49
47
  }
50
- declare const createBehaviorTracker: (options: BehaviorTrackerOptions) => BehaviorTracker;
51
- //#endregion
52
- export { BehaviorTracker, BehaviorTrackerContext, BehaviorTrackerOptions, TrackFeatureUsageInput, TrackFieldAccessInput, TrackWorkflowStepInput, createBehaviorTracker };
48
+ export declare const createBehaviorTracker: (options: BehaviorTrackerOptions) => BehaviorTracker;
53
49
  //# sourceMappingURL=tracker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tracker.d.ts","names":[],"sources":["../src/tracker.ts"],"mappings":";;;UAIiB,sBAAA;EACf,QAAA;EACA,MAAA;EACA,IAAA;EACA,MAAA;EACA,QAAA,GAAW,MAAA;AAAA;AAAA,UAGI,sBAAA;EACf,KAAA,EAAO,aAAA;EACP,OAAA,EAAS,sBAAA;EACT,UAAA;EACA,mBAAA;EACA,UAAA;AAAA;AAAA,UAKe,qBAAA;EACf,SAAA;EACA,KAAA;EACA,QAAA,GAAW,MAAA;AAAA;AAAA,UAGI,sBAAA;EACf,OAAA;EACA,MAAA;EACA,QAAA,GAAW,MAAA;AAAA;AAAA,UAGI,sBAAA;EACf,QAAA;EACA,IAAA;EACA,MAAA;EACA,QAAA,GAAW,MAAA;AAAA;AAAA,cAGA,eAAA;EAAA,iBACM,KAAA;EAAA,iBACA,OAAA;EAAA,iBACA,MAAA;EAAA,iBACA,OAAA;EAAA,QAMT,MAAA;EAAA,iBACS,UAAA;EAAA,QACT,UAAA;cAEI,OAAA,EAAS,sBAAA;EAYrB,gBAAA,CAAiB,KAAA,EAAO,qBAAA;EAYxB,iBAAA,CAAkB,KAAA,EAAO,sBAAA;EAYzB,iBAAA,CAAkB,KAAA,EAAO,sBAAA;EAanB,KAAA,CAAA,GAAS,OAAA;EAOT,OAAA,CAAA,GAAW,OAAA;EAAA,QAOT,OAAA;AAAA;AAAA,cAqBG,qBAAA,GAAyB,OAAA,EAAS,sBAAA,KAAsB,eAAA"}
1
+ {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../src/tracker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,EAAE,sBAAsB,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoD;IAC3E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAInB;IAEL,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,UAAU,CAAC,CAAiC;gBAExC,OAAO,EAAE,sBAAsB;IAY3C,gBAAgB,CAAC,KAAK,EAAE,qBAAqB;IAY7C,iBAAiB,CAAC,KAAK,EAAE,sBAAsB;IAY/C,iBAAiB,CAAC,KAAK,EAAE,sBAAsB;IAazC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B,OAAO,CAAC,OAAO;CAmBhB;AAED,eAAO,MAAM,qBAAqB,GAAI,SAAS,sBAAsB,oBACvC,CAAC"}
package/dist/tracker.js CHANGED
@@ -1,93 +1,95 @@
1
- import { metrics, trace } from "@opentelemetry/api";
1
+ // @bun
2
+ // src/tracker.ts
3
+ import { trace, metrics } from "@opentelemetry/api";
4
+ var DEFAULT_BUFFER_SIZE = 25;
2
5
 
3
- //#region src/tracker.ts
4
- const DEFAULT_BUFFER_SIZE = 25;
5
- var BehaviorTracker = class {
6
- store;
7
- context;
8
- tracer = trace.getTracer("lssm.personalization", "1.0.0");
9
- counter = metrics.getMeter("lssm.personalization", "1.0.0").createCounter("lssm.personalization.events", { description: "Behavior events tracked for personalization" });
10
- buffer = [];
11
- bufferSize;
12
- flushTimer;
13
- constructor(options) {
14
- this.store = options.store;
15
- this.context = options.context;
16
- this.bufferSize = options.bufferSize ?? DEFAULT_BUFFER_SIZE;
17
- if (options.autoFlushIntervalMs) this.flushTimer = setInterval(() => {
18
- this.flush();
19
- }, options.autoFlushIntervalMs);
20
- }
21
- trackFieldAccess(input) {
22
- const event = {
23
- type: "field_access",
24
- operation: input.operation,
25
- field: input.field,
26
- timestamp: Date.now(),
27
- ...this.context,
28
- metadata: {
29
- ...this.context.metadata,
30
- ...input.metadata
31
- }
32
- };
33
- this.enqueue(event);
34
- }
35
- trackFeatureUsage(input) {
36
- const event = {
37
- type: "feature_usage",
38
- feature: input.feature,
39
- action: input.action,
40
- timestamp: Date.now(),
41
- ...this.context,
42
- metadata: {
43
- ...this.context.metadata,
44
- ...input.metadata
45
- }
46
- };
47
- this.enqueue(event);
48
- }
49
- trackWorkflowStep(input) {
50
- const event = {
51
- type: "workflow_step",
52
- workflow: input.workflow,
53
- step: input.step,
54
- status: input.status,
55
- timestamp: Date.now(),
56
- ...this.context,
57
- metadata: {
58
- ...this.context.metadata,
59
- ...input.metadata
60
- }
61
- };
62
- this.enqueue(event);
63
- }
64
- async flush() {
65
- if (!this.buffer.length) return;
66
- const events = this.buffer;
67
- this.buffer = [];
68
- await this.store.bulkRecord(events);
69
- }
70
- async dispose() {
71
- if (this.flushTimer) clearInterval(this.flushTimer);
72
- await this.flush();
73
- }
74
- enqueue(event) {
75
- this.buffer.push(event);
76
- this.counter.add(1, {
77
- tenantId: this.context.tenantId,
78
- type: event.type
79
- });
80
- this.tracer.startActiveSpan(`personalization.${event.type}`, (span) => {
81
- span.setAttribute("tenant.id", this.context.tenantId);
82
- if (this.context.userId) span.setAttribute("user.id", this.context.userId);
83
- span.setAttribute("personalization.event_type", event.type);
84
- span.end();
85
- });
86
- if (this.buffer.length >= this.bufferSize) this.flush();
87
- }
6
+ class BehaviorTracker {
7
+ store;
8
+ context;
9
+ tracer = trace.getTracer("lssm.personalization", "1.0.0");
10
+ counter = metrics.getMeter("lssm.personalization", "1.0.0").createCounter("lssm.personalization.events", {
11
+ description: "Behavior events tracked for personalization"
12
+ });
13
+ buffer = [];
14
+ bufferSize;
15
+ flushTimer;
16
+ constructor(options) {
17
+ this.store = options.store;
18
+ this.context = options.context;
19
+ this.bufferSize = options.bufferSize ?? DEFAULT_BUFFER_SIZE;
20
+ if (options.autoFlushIntervalMs) {
21
+ this.flushTimer = setInterval(() => {
22
+ this.flush();
23
+ }, options.autoFlushIntervalMs);
24
+ }
25
+ }
26
+ trackFieldAccess(input) {
27
+ const event = {
28
+ type: "field_access",
29
+ operation: input.operation,
30
+ field: input.field,
31
+ timestamp: Date.now(),
32
+ ...this.context,
33
+ metadata: { ...this.context.metadata, ...input.metadata }
34
+ };
35
+ this.enqueue(event);
36
+ }
37
+ trackFeatureUsage(input) {
38
+ const event = {
39
+ type: "feature_usage",
40
+ feature: input.feature,
41
+ action: input.action,
42
+ timestamp: Date.now(),
43
+ ...this.context,
44
+ metadata: { ...this.context.metadata, ...input.metadata }
45
+ };
46
+ this.enqueue(event);
47
+ }
48
+ trackWorkflowStep(input) {
49
+ const event = {
50
+ type: "workflow_step",
51
+ workflow: input.workflow,
52
+ step: input.step,
53
+ status: input.status,
54
+ timestamp: Date.now(),
55
+ ...this.context,
56
+ metadata: { ...this.context.metadata, ...input.metadata }
57
+ };
58
+ this.enqueue(event);
59
+ }
60
+ async flush() {
61
+ if (!this.buffer.length)
62
+ return;
63
+ const events = this.buffer;
64
+ this.buffer = [];
65
+ await this.store.bulkRecord(events);
66
+ }
67
+ async dispose() {
68
+ if (this.flushTimer) {
69
+ clearInterval(this.flushTimer);
70
+ }
71
+ await this.flush();
72
+ }
73
+ enqueue(event) {
74
+ this.buffer.push(event);
75
+ this.counter.add(1, {
76
+ tenantId: this.context.tenantId,
77
+ type: event.type
78
+ });
79
+ this.tracer.startActiveSpan(`personalization.${event.type}`, (span) => {
80
+ span.setAttribute("tenant.id", this.context.tenantId);
81
+ if (this.context.userId)
82
+ span.setAttribute("user.id", this.context.userId);
83
+ span.setAttribute("personalization.event_type", event.type);
84
+ span.end();
85
+ });
86
+ if (this.buffer.length >= this.bufferSize) {
87
+ this.flush();
88
+ }
89
+ }
90
+ }
91
+ var createBehaviorTracker = (options) => new BehaviorTracker(options);
92
+ export {
93
+ createBehaviorTracker,
94
+ BehaviorTracker
88
95
  };
89
- const createBehaviorTracker = (options) => new BehaviorTracker(options);
90
-
91
- //#endregion
92
- export { BehaviorTracker, createBehaviorTracker };
93
- //# sourceMappingURL=tracker.js.map
package/dist/types.d.ts CHANGED
@@ -1,59 +1,56 @@
1
- //#region src/types.d.ts
2
- type BehaviorEventType = 'field_access' | 'feature_usage' | 'workflow_step';
3
- interface BehaviorEventBase {
4
- id?: string;
5
- tenantId: string;
6
- userId?: string;
7
- role?: string;
8
- device?: string;
9
- timestamp: number;
10
- metadata?: Record<string, unknown>;
1
+ export type BehaviorEventType = 'field_access' | 'feature_usage' | 'workflow_step';
2
+ export interface BehaviorEventBase {
3
+ id?: string;
4
+ tenantId: string;
5
+ userId?: string;
6
+ role?: string;
7
+ device?: string;
8
+ timestamp: number;
9
+ metadata?: Record<string, unknown>;
11
10
  }
12
- interface FieldAccessEvent extends BehaviorEventBase {
13
- type: 'field_access';
14
- operation: string;
15
- field: string;
11
+ export interface FieldAccessEvent extends BehaviorEventBase {
12
+ type: 'field_access';
13
+ operation: string;
14
+ field: string;
16
15
  }
17
- interface FeatureUsageEvent extends BehaviorEventBase {
18
- type: 'feature_usage';
19
- feature: string;
20
- action: 'opened' | 'completed' | 'dismissed';
16
+ export interface FeatureUsageEvent extends BehaviorEventBase {
17
+ type: 'feature_usage';
18
+ feature: string;
19
+ action: 'opened' | 'completed' | 'dismissed';
21
20
  }
22
- interface WorkflowStepEvent extends BehaviorEventBase {
23
- type: 'workflow_step';
24
- workflow: string;
25
- step: string;
26
- status: 'entered' | 'completed' | 'skipped' | 'errored';
21
+ export interface WorkflowStepEvent extends BehaviorEventBase {
22
+ type: 'workflow_step';
23
+ workflow: string;
24
+ step: string;
25
+ status: 'entered' | 'completed' | 'skipped' | 'errored';
27
26
  }
28
- type BehaviorEvent = FieldAccessEvent | FeatureUsageEvent | WorkflowStepEvent;
29
- interface BehaviorQuery {
30
- tenantId?: string;
31
- userId?: string;
32
- role?: string;
33
- feature?: string;
34
- operation?: string;
35
- workflow?: string;
36
- since?: number;
37
- until?: number;
38
- limit?: number;
27
+ export type BehaviorEvent = FieldAccessEvent | FeatureUsageEvent | WorkflowStepEvent;
28
+ export interface BehaviorQuery {
29
+ tenantId?: string;
30
+ userId?: string;
31
+ role?: string;
32
+ feature?: string;
33
+ operation?: string;
34
+ workflow?: string;
35
+ since?: number;
36
+ until?: number;
37
+ limit?: number;
39
38
  }
40
- interface BehaviorSummary {
41
- fieldCounts: Record<string, number>;
42
- featureCounts: Record<string, number>;
43
- workflowStepCounts: Record<string, Record<string, number>>;
44
- totalEvents: number;
39
+ export interface BehaviorSummary {
40
+ fieldCounts: Record<string, number>;
41
+ featureCounts: Record<string, number>;
42
+ workflowStepCounts: Record<string, Record<string, number>>;
43
+ totalEvents: number;
45
44
  }
46
- interface BehaviorInsights {
47
- unusedFields: string[];
48
- frequentlyUsedFields: string[];
49
- suggestedHiddenFields: string[];
50
- workflowBottlenecks: {
51
- workflow: string;
52
- step: string;
53
- dropRate: number;
54
- }[];
55
- layoutPreference?: 'form' | 'grid' | 'list' | 'table';
45
+ export interface BehaviorInsights {
46
+ unusedFields: string[];
47
+ frequentlyUsedFields: string[];
48
+ suggestedHiddenFields: string[];
49
+ workflowBottlenecks: {
50
+ workflow: string;
51
+ step: string;
52
+ dropRate: number;
53
+ }[];
54
+ layoutPreference?: 'form' | 'grid' | 'list' | 'table';
56
55
  }
57
- //#endregion
58
- export { BehaviorEvent, BehaviorEventBase, BehaviorEventType, BehaviorInsights, BehaviorQuery, BehaviorSummary, FeatureUsageEvent, FieldAccessEvent, WorkflowStepEvent };
59
56
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";KAAY,iBAAA;AAAA,UAKK,iBAAA;EACf,EAAA;EACA,QAAA;EACA,MAAA;EACA,IAAA;EACA,MAAA;EACA,SAAA;EACA,QAAA,GAAW,MAAA;AAAA;AAAA,UAGI,gBAAA,SAAyB,iBAAA;EACxC,IAAA;EACA,SAAA;EACA,KAAA;AAAA;AAAA,UAGe,iBAAA,SAA0B,iBAAA;EACzC,IAAA;EACA,OAAA;EACA,MAAA;AAAA;AAAA,UAGe,iBAAA,SAA0B,iBAAA;EACzC,IAAA;EACA,QAAA;EACA,IAAA;EACA,MAAA;AAAA;AAAA,KAGU,aAAA,GACR,gBAAA,GACA,iBAAA,GACA,iBAAA;AAAA,UAEa,aAAA;EACf,QAAA;EACA,MAAA;EACA,IAAA;EACA,OAAA;EACA,SAAA;EACA,QAAA;EACA,KAAA;EACA,KAAA;EACA,KAAA;AAAA;AAAA,UAGe,eAAA;EACf,WAAA,EAAa,MAAA;EACb,aAAA,EAAe,MAAA;EACf,kBAAA,EAAoB,MAAA,SAAe,MAAA;EACnC,WAAA;AAAA;AAAA,UAGe,gBAAA;EACf,YAAA;EACA,oBAAA;EACA,qBAAA;EACA,mBAAA;IACE,QAAA;IACA,IAAA;IACA,QAAA;EAAA;EAEF,gBAAA;AAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GACzB,cAAc,GACd,eAAe,GACf,eAAe,CAAC;AAEpB,MAAM,WAAW,iBAAiB;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;CAC9C;AAED,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;CACzD;AAED,MAAM,MAAM,aAAa,GACrB,gBAAgB,GAChB,iBAAiB,GACjB,iBAAiB,CAAC;AAEtB,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,mBAAmB,EAAE;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;KAClB,EAAE,CAAC;IACJ,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CACvD"}
package/dist/types.js CHANGED
@@ -0,0 +1 @@
1
+ // @bun