@abto-app/event 0.1.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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +273 -0
  3. package/dist/autocapture.d.ts +68 -0
  4. package/dist/autocapture.d.ts.map +1 -0
  5. package/dist/autocapture.js +269 -0
  6. package/dist/autocapture.js.map +1 -0
  7. package/dist/click-signals.d.ts +18 -0
  8. package/dist/click-signals.d.ts.map +1 -0
  9. package/dist/click-signals.js +66 -0
  10. package/dist/click-signals.js.map +1 -0
  11. package/dist/client.d.ts +37 -0
  12. package/dist/client.d.ts.map +1 -0
  13. package/dist/client.js +439 -0
  14. package/dist/client.js.map +1 -0
  15. package/dist/context.d.ts +52 -0
  16. package/dist/context.d.ts.map +1 -0
  17. package/dist/context.js +146 -0
  18. package/dist/context.js.map +1 -0
  19. package/dist/elements-chain.d.ts +8 -0
  20. package/dist/elements-chain.d.ts.map +1 -0
  21. package/dist/elements-chain.js +84 -0
  22. package/dist/elements-chain.js.map +1 -0
  23. package/dist/event-registry.d.ts +37 -0
  24. package/dist/event-registry.d.ts.map +1 -0
  25. package/dist/event-registry.js +59 -0
  26. package/dist/event-registry.js.map +1 -0
  27. package/dist/events.generated.d.ts +769 -0
  28. package/dist/events.generated.d.ts.map +1 -0
  29. package/dist/events.generated.js +3 -0
  30. package/dist/events.generated.js.map +1 -0
  31. package/dist/identity.d.ts +44 -0
  32. package/dist/identity.d.ts.map +1 -0
  33. package/dist/identity.js +148 -0
  34. package/dist/identity.js.map +1 -0
  35. package/dist/index.d.ts +16 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +23 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/privacy.d.ts +46 -0
  40. package/dist/privacy.d.ts.map +1 -0
  41. package/dist/privacy.js +140 -0
  42. package/dist/privacy.js.map +1 -0
  43. package/dist/scroll-depth.d.ts +24 -0
  44. package/dist/scroll-depth.d.ts.map +1 -0
  45. package/dist/scroll-depth.js +74 -0
  46. package/dist/scroll-depth.js.map +1 -0
  47. package/dist/system-events.generated.d.ts +17 -0
  48. package/dist/system-events.generated.d.ts.map +1 -0
  49. package/dist/system-events.generated.js +29 -0
  50. package/dist/system-events.generated.js.map +1 -0
  51. package/dist/transport.d.ts +27 -0
  52. package/dist/transport.d.ts.map +1 -0
  53. package/dist/transport.js +264 -0
  54. package/dist/transport.js.map +1 -0
  55. package/dist/types.d.ts +156 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +3 -0
  58. package/dist/types.js.map +1 -0
  59. package/dist/uuid.d.ts +12 -0
  60. package/dist/uuid.d.ts.map +1 -0
  61. package/dist/uuid.js +39 -0
  62. package/dist/uuid.js.map +1 -0
  63. package/package.json +59 -0
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Browser identifier context.
3
+ *
4
+ * Gateway-aligned identifier model:
5
+ * - node_key: "feature.node" dot-notation dimension (e.g. "resume.make"); feature is the prefix.
6
+ * - trace_id: one user action/task execution. Carried as W3C `traceparent`.
7
+ * - request_id: gateway-issued call PK (returned as `x-request-id`); the call-instance join key.
8
+ * The browser does not mint call ids; per-call correlation uses the gateway `request_id`.
9
+ */
10
+ import { BrowserIdentityStore } from './identity.js';
11
+ import { newUuidV7, newUuidV7TraceId, randomHex } from './uuid.js';
12
+ /** 32-hex-character W3C-compatible trace id. */
13
+ export function newTraceId() {
14
+ return newUuidV7TraceId();
15
+ }
16
+ export function newSpanId() {
17
+ return randomHex(8);
18
+ }
19
+ /** Build a W3C `traceparent` value for the given trace id. */
20
+ export function toTraceparent(traceId, spanId = newSpanId()) {
21
+ return `00-${traceId}-${spanId}-01`;
22
+ }
23
+ /** Client-side id for an emitted event (dedup / ordering only — not a join key). */
24
+ export function newEventId() {
25
+ return newUuidV7();
26
+ }
27
+ export class ContextStore {
28
+ constructor(options) {
29
+ this.identity = new BrowserIdentityStore(options);
30
+ this.state = {
31
+ userId: undefined,
32
+ tenantId: undefined,
33
+ pageviewId: newUuidV7(),
34
+ nodeId: undefined,
35
+ traceId: undefined,
36
+ taskType: undefined,
37
+ surface: undefined,
38
+ entryPoint: undefined,
39
+ conversationId: undefined,
40
+ messageId: undefined,
41
+ promptTemplateId: undefined,
42
+ };
43
+ }
44
+ identify(userId, tenantId) {
45
+ this.state.userId = userId;
46
+ this.state.tenantId = tenantId;
47
+ }
48
+ reset() {
49
+ this.clearScopedContext();
50
+ this.identity.resetSession();
51
+ this.state.pageviewId = newUuidV7();
52
+ }
53
+ forgetDevice() {
54
+ this.clearScopedContext();
55
+ this.identity.forgetDevice();
56
+ this.state.pageviewId = newUuidV7();
57
+ }
58
+ clearScopedContext() {
59
+ this.state.userId = undefined;
60
+ this.state.tenantId = undefined;
61
+ this.state.nodeId = undefined;
62
+ this.state.traceId = undefined;
63
+ this.state.taskType = undefined;
64
+ this.state.surface = undefined;
65
+ this.state.entryPoint = undefined;
66
+ this.state.conversationId = undefined;
67
+ this.state.messageId = undefined;
68
+ this.state.promptTemplateId = undefined;
69
+ }
70
+ newPageview() {
71
+ this.state.pageviewId = newUuidV7();
72
+ return this.state.pageviewId;
73
+ }
74
+ /** Set the "feature.node" node id (e.g. "resume.make"). */
75
+ setNode(nodeId) {
76
+ this.state.nodeId = nodeId;
77
+ }
78
+ newTrace() {
79
+ this.state.traceId = newTraceId();
80
+ return this.state.traceId;
81
+ }
82
+ startLlmTrace(options) {
83
+ this.state.nodeId = options.nodeId;
84
+ this.state.traceId = options.traceId ?? newTraceId();
85
+ this.state.taskType = options.taskType;
86
+ this.state.surface = options.surface;
87
+ this.state.entryPoint = options.entryPoint;
88
+ this.state.conversationId = options.conversationId;
89
+ this.state.messageId = options.messageId;
90
+ this.state.promptTemplateId = options.promptTemplateId;
91
+ return { ...options, traceId: this.state.traceId };
92
+ }
93
+ get traceId() {
94
+ return this.state.traceId;
95
+ }
96
+ getIdentity() {
97
+ return this.identity.current();
98
+ }
99
+ getTraceHeaders(overrides = {}) {
100
+ const nodeId = overrides.node_key ?? this.state.nodeId;
101
+ const traceId = overrides.trace_id ?? this.state.traceId;
102
+ const headers = {};
103
+ headers['x-abto-device-id'] = this.identity.current().deviceId;
104
+ if (this.state.userId)
105
+ headers['x-abto-user-id'] = this.state.userId;
106
+ if (nodeId)
107
+ headers['x-abto-node-key'] = nodeId;
108
+ if (traceId) {
109
+ headers['x-abto-trace-id'] = traceId;
110
+ headers.traceparent = toTraceparent(traceId);
111
+ }
112
+ return headers;
113
+ }
114
+ toCommonProperties() {
115
+ const identity = this.identity.current();
116
+ const common = {
117
+ device_id: identity.deviceId,
118
+ anonymous_id: identity.anonymousId,
119
+ session_id: identity.sessionId,
120
+ window_id: identity.windowId,
121
+ pageview_id: this.state.pageviewId,
122
+ };
123
+ if (this.state.userId)
124
+ common.user_id = this.state.userId;
125
+ if (this.state.tenantId)
126
+ common.tenant_id = this.state.tenantId;
127
+ if (this.state.nodeId)
128
+ common.node_key = this.state.nodeId;
129
+ if (this.state.traceId)
130
+ common.trace_id = this.state.traceId;
131
+ if (this.state.taskType)
132
+ common.task_type = this.state.taskType;
133
+ if (this.state.surface)
134
+ common.surface = this.state.surface;
135
+ if (this.state.entryPoint)
136
+ common.entry_point = this.state.entryPoint;
137
+ if (this.state.conversationId)
138
+ common.conversation_id = this.state.conversationId;
139
+ if (this.state.messageId)
140
+ common.message_id = this.state.messageId;
141
+ if (this.state.promptTemplateId)
142
+ common.prompt_template_id = this.state.promptTemplateId;
143
+ return common;
144
+ }
145
+ }
146
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * elements_chain serialization — the backbone for post-hoc analysis without pre-tagging.
3
+ * Walks an element up its ancestors into `tag.class#id:attr="value"` segments joined by ';'.
4
+ */
5
+ import type { MaskMode } from './types.js';
6
+ export declare function elementText(el: Element, cap?: number): string;
7
+ export declare function serializeElementsChain(el: Element | null, mask?: MaskMode): string;
8
+ //# sourceMappingURL=elements-chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elements-chain.d.ts","sourceRoot":"","sources":["../src/elements-chain.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAS3C,wBAAgB,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,SAAW,GAAG,MAAM,CAO/D;AAiDD,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,EAAE,IAAI,GAAE,QAAgB,GAAG,MAAM,CAYzF"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * elements_chain serialization — the backbone for post-hoc analysis without pre-tagging.
3
+ * Walks an element up its ancestors into `tag.class#id:attr="value"` segments joined by ';'.
4
+ */
5
+ import { maskText } from './privacy.js';
6
+ const MAX_DEPTH = 20;
7
+ const TEXT_CAP = 255;
8
+ const HREF_CAP = 2048;
9
+ const CLASS_CAP = 10;
10
+ const CHAIN_CAP = 8192;
11
+ const TEXT_NODE = 3;
12
+ export function elementText(el, cap = TEXT_CAP) {
13
+ let text = '';
14
+ for (const node of Array.from(el.childNodes)) {
15
+ if (node.nodeType === TEXT_NODE)
16
+ text += node.textContent ?? '';
17
+ }
18
+ const normalized = text.trim().replace(/\s+/g, ' ');
19
+ return normalized.length > cap ? normalized.slice(0, cap) : normalized;
20
+ }
21
+ function nthChild(el) {
22
+ let position = 1;
23
+ for (let sibling = el.previousElementSibling; sibling; sibling = sibling.previousElementSibling) {
24
+ position++;
25
+ }
26
+ return position;
27
+ }
28
+ function nthOfType(el) {
29
+ let position = 1;
30
+ for (let sibling = el.previousElementSibling; sibling; sibling = sibling.previousElementSibling) {
31
+ if (sibling.tagName === el.tagName)
32
+ position++;
33
+ }
34
+ return position;
35
+ }
36
+ function escapeAttr(value) {
37
+ return value.replace(/"/g, '\\"');
38
+ }
39
+ function serializeElement(el, mask) {
40
+ let head = el.tagName.toLowerCase();
41
+ const rawMetadataAllowed = mask === 'off';
42
+ if (rawMetadataAllowed) {
43
+ const id = el.getAttribute('id');
44
+ if (id)
45
+ head += `#${id}`;
46
+ const classes = (el.getAttribute('class') ?? '').split(/\s+/).filter(Boolean).slice(0, CLASS_CAP);
47
+ for (const cls of classes)
48
+ head += `.${cls}`;
49
+ }
50
+ const attrs = [];
51
+ const text = elementText(el);
52
+ if (text)
53
+ attrs.push(`text="${escapeAttr(maskText(text, mask))}"`);
54
+ if (rawMetadataAllowed) {
55
+ const href = el.getAttribute('href');
56
+ if (href)
57
+ attrs.push(`href="${escapeAttr(href.slice(0, HREF_CAP))}"`);
58
+ const role = el.getAttribute('role');
59
+ if (role)
60
+ attrs.push(`role="${escapeAttr(role)}"`);
61
+ for (const attr of Array.from(el.attributes)) {
62
+ if (attr.name.startsWith('data-abto-'))
63
+ attrs.push(`${attr.name}="${escapeAttr(attr.value)}"`);
64
+ }
65
+ }
66
+ attrs.push(`nth-child="${nthChild(el)}"`, `nth-of-type="${nthOfType(el)}"`);
67
+ return `${head}:${attrs.join(':')}`;
68
+ }
69
+ export function serializeElementsChain(el, mask = 'off') {
70
+ const segments = [];
71
+ let node = el;
72
+ for (let depth = 0; node && depth < MAX_DEPTH; depth++) {
73
+ const tag = node.tagName.toLowerCase();
74
+ if (tag === 'html')
75
+ break;
76
+ segments.push(serializeElement(node, mask));
77
+ if (tag === 'body')
78
+ break;
79
+ node = node.parentElement;
80
+ }
81
+ const chain = segments.join(';');
82
+ return chain.length > CHAIN_CAP ? chain.slice(0, CHAIN_CAP) : chain;
83
+ }
84
+ //# sourceMappingURL=elements-chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elements-chain.js","sourceRoot":"","sources":["../src/elements-chain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export type CustomPropertyType = 'string' | 'number' | 'boolean';
2
+ export type CustomPropertyScalar = string | number | boolean;
3
+ export interface CustomPropertyDefinition<T extends CustomPropertyType = CustomPropertyType, E extends readonly CustomPropertyScalar[] | undefined = readonly CustomPropertyScalar[] | undefined> {
4
+ type: T;
5
+ required?: boolean;
6
+ enum?: E;
7
+ description?: string;
8
+ }
9
+ export interface CustomEventDefinition<P extends Record<string, CustomPropertyDefinition> = Record<string, CustomPropertyDefinition>> {
10
+ description?: string;
11
+ properties: P;
12
+ }
13
+ export type EventRegistry = Record<string, CustomEventDefinition>;
14
+ type ScalarForType<T extends CustomPropertyType> = T extends 'string' ? string : T extends 'number' ? number : boolean;
15
+ type ValueForDefinition<D extends CustomPropertyDefinition> = D['enum'] extends readonly (infer E)[] ? E : ScalarForType<D['type']>;
16
+ type RequiredPropertyKeys<P extends Record<string, CustomPropertyDefinition>> = {
17
+ [K in keyof P]-?: P[K]['required'] extends true ? K : never;
18
+ }[keyof P];
19
+ type OptionalPropertyKeys<P extends Record<string, CustomPropertyDefinition>> = Exclude<keyof P, RequiredPropertyKeys<P>>;
20
+ export type InferCustomEventProperties<D extends CustomEventDefinition> = {
21
+ [K in RequiredPropertyKeys<D['properties']>]: ValueForDefinition<D['properties'][K]>;
22
+ } & {
23
+ [K in OptionalPropertyKeys<D['properties']>]?: ValueForDefinition<D['properties'][K]>;
24
+ };
25
+ export type CustomEventPayloadMap<R extends EventRegistry> = {
26
+ [K in keyof R]: InferCustomEventProperties<R[K]>;
27
+ };
28
+ export declare function validateCustomEventName(name: string): string | undefined;
29
+ export declare function defineEvents<const R extends EventRegistry>(registry: R): R;
30
+ export interface EventValidationResult {
31
+ valid: boolean;
32
+ issues: string[];
33
+ }
34
+ export declare function validateCustomPropertyNames(properties: Record<string, unknown>): string[];
35
+ export declare function validateEventProperties(definition: CustomEventDefinition, properties: Record<string, unknown>): EventValidationResult;
36
+ export {};
37
+ //# sourceMappingURL=event-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-registry.d.ts","sourceRoot":"","sources":["../src/event-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { ABTO_EVENT_NAME_MAX_LENGTH, BROWSER_SYSTEM_EVENT_WIRE_NAMES, } from './system-events.generated.js';
2
+ const SYSTEM_EVENT_WIRE_NAMES = new Set(Object.values(BROWSER_SYSTEM_EVENT_WIRE_NAMES));
3
+ export function validateCustomEventName(name) {
4
+ if (name.trim() === '')
5
+ return 'must not be empty';
6
+ if (name.includes('\u0000'))
7
+ return 'must not contain U+0000';
8
+ if (name.startsWith('$'))
9
+ return 'is reserved; $ names belong to ABTO';
10
+ if (name.length > ABTO_EVENT_NAME_MAX_LENGTH) {
11
+ return `must be at most ${ABTO_EVENT_NAME_MAX_LENGTH} UTF-16 code units`;
12
+ }
13
+ if (SYSTEM_EVENT_WIRE_NAMES.has(name)) {
14
+ return 'is reserved for an ABTO system event on the wire';
15
+ }
16
+ return undefined;
17
+ }
18
+ export function defineEvents(registry) {
19
+ for (const name of Object.keys(registry)) {
20
+ const event = registry[name];
21
+ if (event === undefined)
22
+ continue;
23
+ const eventNameIssue = validateCustomEventName(name);
24
+ if (eventNameIssue !== undefined) {
25
+ throw new Error(`[abto] custom event name "${name}" ${eventNameIssue}.`);
26
+ }
27
+ for (const property of Object.keys(event.properties)) {
28
+ if (property.startsWith('$')) {
29
+ throw new Error(`[abto] custom property name "${property}" is reserved; $ properties belong to ABTO.`);
30
+ }
31
+ }
32
+ }
33
+ return registry;
34
+ }
35
+ export function validateCustomPropertyNames(properties) {
36
+ return Object.keys(properties)
37
+ .filter((name) => name.startsWith('$'))
38
+ .map((name) => `${name} is reserved; $ properties belong to ABTO`);
39
+ }
40
+ export function validateEventProperties(definition, properties) {
41
+ const issues = validateCustomPropertyNames(properties);
42
+ for (const [name, property] of Object.entries(definition.properties)) {
43
+ const value = properties[name];
44
+ if (value === undefined) {
45
+ if (property.required === true)
46
+ issues.push(`${name} is required`);
47
+ continue;
48
+ }
49
+ if (typeof value !== property.type) {
50
+ issues.push(`${name} must be ${property.type}`);
51
+ continue;
52
+ }
53
+ if (property.enum !== undefined && !property.enum.includes(value)) {
54
+ issues.push(`${name} must be one of ${property.enum.join(', ')}`);
55
+ }
56
+ }
57
+ return { valid: issues.length === 0, issues };
58
+ }
59
+ //# sourceMappingURL=event-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-registry.js","sourceRoot":"","sources":["../src/event-registry.ts"],"names":[],"mappings":"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"}