@interfere/react 0.0.1 → 0.0.2-alpha.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/dist/client.d.mts +15 -0
- package/dist/client.d.mts.map +1 -0
- package/dist/client.mjs +75 -0
- package/dist/client.mjs.map +1 -0
- package/dist/core/events/event-registry.d.mts +23 -0
- package/dist/core/events/event-registry.d.mts.map +1 -0
- package/dist/core/events/event-registry.mjs +32 -0
- package/dist/core/events/event-registry.mjs.map +1 -0
- package/dist/core/events/plugin-event-types.d.mts +92 -0
- package/dist/core/events/plugin-event-types.d.mts.map +1 -0
- package/dist/core/events/plugin-event-types.mjs +25 -0
- package/dist/core/events/plugin-event-types.mjs.map +1 -0
- package/dist/core/plugins/dom-utils.d.mts +9 -0
- package/dist/core/plugins/dom-utils.d.mts.map +1 -0
- package/dist/core/plugins/dom-utils.mjs +25 -0
- package/dist/core/plugins/dom-utils.mjs.map +1 -0
- package/dist/core/plugins/impl/ai-summary.d.mts +6 -0
- package/dist/core/plugins/impl/ai-summary.d.mts.map +1 -0
- package/dist/core/plugins/impl/ai-summary.mjs +122 -0
- package/dist/core/plugins/impl/ai-summary.mjs.map +1 -0
- package/dist/core/plugins/impl/errors.d.mts +9 -0
- package/dist/core/plugins/impl/errors.d.mts.map +1 -0
- package/dist/core/plugins/impl/errors.mjs +153 -0
- package/dist/core/plugins/impl/errors.mjs.map +1 -0
- package/dist/core/plugins/impl/page-events.d.mts +15 -0
- package/dist/core/plugins/impl/page-events.d.mts.map +1 -0
- package/dist/core/plugins/impl/page-events.mjs +131 -0
- package/dist/core/plugins/impl/page-events.mjs.map +1 -0
- package/dist/core/plugins/impl/rage-click.d.mts +6 -0
- package/dist/core/plugins/impl/rage-click.d.mts.map +1 -0
- package/dist/core/plugins/impl/rage-click.mjs +53 -0
- package/dist/core/plugins/impl/rage-click.mjs.map +1 -0
- package/dist/core/plugins/impl/replay.d.mts +9 -0
- package/dist/core/plugins/impl/replay.d.mts.map +1 -0
- package/dist/core/plugins/impl/replay.mjs +144 -0
- package/dist/core/plugins/impl/replay.mjs.map +1 -0
- package/dist/core/plugins/impl/server-tracing.d.mts +7 -0
- package/dist/core/plugins/impl/server-tracing.d.mts.map +1 -0
- package/dist/core/plugins/impl/server-tracing.mjs +160 -0
- package/dist/core/plugins/impl/server-tracing.mjs.map +1 -0
- package/dist/core/plugins/plugin-event-system.d.mts +47 -0
- package/dist/core/plugins/plugin-event-system.d.mts.map +1 -0
- package/dist/core/plugins/plugin-event-system.mjs +75 -0
- package/dist/core/plugins/plugin-event-system.mjs.map +1 -0
- package/dist/core/plugins/plugin-loader.d.mts +22 -0
- package/dist/core/plugins/plugin-loader.d.mts.map +1 -0
- package/dist/core/plugins/plugin-loader.mjs +142 -0
- package/dist/core/plugins/plugin-loader.mjs.map +1 -0
- package/dist/core/runtime/config.d.mts +14 -0
- package/dist/core/runtime/config.d.mts.map +1 -0
- package/dist/core/runtime/config.mjs +39 -0
- package/dist/core/runtime/config.mjs.map +1 -0
- package/dist/core/runtime/context.d.mts +25 -0
- package/dist/core/runtime/context.d.mts.map +1 -0
- package/dist/core/runtime/context.mjs +48 -0
- package/dist/core/runtime/context.mjs.map +1 -0
- package/dist/core/runtime/ingest-target.d.mts +10 -0
- package/dist/core/runtime/ingest-target.d.mts.map +1 -0
- package/dist/core/runtime/ingest-target.mjs +15 -0
- package/dist/core/runtime/ingest-target.mjs.map +1 -0
- package/dist/core/schemas.d.mts +85 -0
- package/dist/core/schemas.d.mts.map +1 -0
- package/dist/core/schemas.mjs +1 -0
- package/dist/effect/build-envelope.d.mts +9 -0
- package/dist/effect/build-envelope.d.mts.map +1 -0
- package/dist/effect/build-envelope.mjs +29 -0
- package/dist/effect/build-envelope.mjs.map +1 -0
- package/dist/effect/errors.d.mts +36 -0
- package/dist/effect/errors.d.mts.map +1 -0
- package/dist/effect/errors.mjs +10 -0
- package/dist/effect/errors.mjs.map +1 -0
- package/dist/effect/layers/config.layer.d.mts +13 -0
- package/dist/effect/layers/config.layer.d.mts.map +1 -0
- package/dist/effect/layers/config.layer.mjs +21 -0
- package/dist/effect/layers/config.layer.mjs.map +1 -0
- package/dist/effect/layers/context.layer.d.mts +12 -0
- package/dist/effect/layers/context.layer.d.mts.map +1 -0
- package/dist/effect/layers/context.layer.mjs +14 -0
- package/dist/effect/layers/context.layer.mjs.map +1 -0
- package/dist/effect/layers/http.layer.d.mts +21 -0
- package/dist/effect/layers/http.layer.d.mts.map +1 -0
- package/dist/effect/layers/http.layer.mjs +89 -0
- package/dist/effect/layers/http.layer.mjs.map +1 -0
- package/dist/effect/layers/queue.layer.d.mts +30 -0
- package/dist/effect/layers/queue.layer.d.mts.map +1 -0
- package/dist/effect/layers/queue.layer.mjs +232 -0
- package/dist/effect/layers/queue.layer.mjs.map +1 -0
- package/dist/effect/layers/session.layer.d.mts +26 -0
- package/dist/effect/layers/session.layer.d.mts.map +1 -0
- package/dist/effect/layers/session.layer.mjs +126 -0
- package/dist/effect/layers/session.layer.mjs.map +1 -0
- package/dist/effect/layers/storage.layer.d.mts +19 -0
- package/dist/effect/layers/storage.layer.d.mts.map +1 -0
- package/dist/effect/layers/storage.layer.mjs +200 -0
- package/dist/effect/layers/storage.layer.mjs.map +1 -0
- package/dist/effect/layers/tracer.layer.d.mts +9 -0
- package/dist/effect/layers/tracer.layer.d.mts.map +1 -0
- package/dist/effect/layers/tracer.layer.mjs +11 -0
- package/dist/effect/layers/tracer.layer.mjs.map +1 -0
- package/dist/effect/runtime-services.d.mts +22 -0
- package/dist/effect/runtime-services.d.mts.map +1 -0
- package/dist/effect/runtime-services.mjs +76 -0
- package/dist/effect/runtime-services.mjs.map +1 -0
- package/dist/effect/tags.d.mts +50 -0
- package/dist/effect/tags.d.mts.map +1 -0
- package/dist/effect/tags.mjs +7 -0
- package/dist/effect/tags.mjs.map +1 -0
- package/dist/hooks/use-runtime-and-plugins.d.mts +7 -0
- package/dist/hooks/use-runtime-and-plugins.d.mts.map +1 -0
- package/dist/hooks/use-runtime-and-plugins.mjs +153 -0
- package/dist/hooks/use-runtime-and-plugins.mjs.map +1 -0
- package/dist/hooks/use-session.d.mts +40 -0
- package/dist/hooks/use-session.d.mts.map +1 -0
- package/dist/hooks/use-session.mjs +96 -0
- package/dist/hooks/use-session.mjs.map +1 -0
- package/dist/package.mjs +99 -0
- package/dist/package.mjs.map +1 -0
- package/dist/provider.d.mts +17 -0
- package/dist/provider.d.mts.map +1 -0
- package/dist/provider.mjs +26 -0
- package/dist/provider.mjs.map +1 -0
- package/dist/server/auth.d.mts +11 -0
- package/dist/server/auth.d.mts.map +1 -0
- package/dist/server/auth.mjs +36 -0
- package/dist/server/auth.mjs.map +1 -0
- package/dist/server/capture.d.mts +18 -0
- package/dist/server/capture.d.mts.map +1 -0
- package/dist/server/capture.mjs +105 -0
- package/dist/server/capture.mjs.map +1 -0
- package/package.json +59 -27
- package/dist/__tests__/client.test.d.ts +0 -2
- package/dist/__tests__/client.test.d.ts.map +0 -1
- package/dist/__tests__/client.test.js +0 -447
- package/dist/__tests__/client.test.js.map +0 -1
- package/dist/__tests__/lib/core/error-handlers.test.d.ts +0 -2
- package/dist/__tests__/lib/core/error-handlers.test.d.ts.map +0 -1
- package/dist/__tests__/lib/core/error-handlers.test.js +0 -596
- package/dist/__tests__/lib/core/error-handlers.test.js.map +0 -1
- package/dist/__tests__/lib/core/event-queue.test.d.ts +0 -2
- package/dist/__tests__/lib/core/event-queue.test.d.ts.map +0 -1
- package/dist/__tests__/lib/core/event-queue.test.js +0 -290
- package/dist/__tests__/lib/core/event-queue.test.js.map +0 -1
- package/dist/__tests__/lib/core/runtime.test.d.ts +0 -2
- package/dist/__tests__/lib/core/runtime.test.d.ts.map +0 -1
- package/dist/__tests__/lib/core/runtime.test.js +0 -133
- package/dist/__tests__/lib/core/runtime.test.js.map +0 -1
- package/dist/__tests__/lib/core/session-manager.test.d.ts +0 -2
- package/dist/__tests__/lib/core/session-manager.test.d.ts.map +0 -1
- package/dist/__tests__/lib/core/session-manager.test.js +0 -356
- package/dist/__tests__/lib/core/session-manager.test.js.map +0 -1
- package/dist/__tests__/provider.test.d.ts +0 -2
- package/dist/__tests__/provider.test.d.ts.map +0 -1
- package/dist/__tests__/provider.test.js +0 -143
- package/dist/__tests__/provider.test.js.map +0 -1
- package/dist/client.d.ts +0 -78
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -219
- package/dist/client.js.map +0 -1
- package/dist/index.d.ts +0 -6
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -5
- package/dist/index.js.map +0 -1
- package/dist/lib/core/error-handlers.d.ts +0 -14
- package/dist/lib/core/error-handlers.d.ts.map +0 -1
- package/dist/lib/core/error-handlers.js +0 -191
- package/dist/lib/core/error-handlers.js.map +0 -1
- package/dist/lib/core/event-queue.d.ts +0 -90
- package/dist/lib/core/event-queue.d.ts.map +0 -1
- package/dist/lib/core/event-queue.js +0 -286
- package/dist/lib/core/event-queue.js.map +0 -1
- package/dist/lib/core/runtime.d.ts +0 -7
- package/dist/lib/core/runtime.d.ts.map +0 -1
- package/dist/lib/core/runtime.js +0 -16
- package/dist/lib/core/runtime.js.map +0 -1
- package/dist/lib/core/session-manager.d.ts +0 -96
- package/dist/lib/core/session-manager.d.ts.map +0 -1
- package/dist/lib/core/session-manager.js +0 -431
- package/dist/lib/core/session-manager.js.map +0 -1
- package/dist/lib/persistence/storage.d.ts +0 -5
- package/dist/lib/persistence/storage.d.ts.map +0 -1
- package/dist/lib/persistence/storage.js +0 -67
- package/dist/lib/persistence/storage.js.map +0 -1
- package/dist/lib/session/rage-click.d.ts +0 -2
- package/dist/lib/session/rage-click.d.ts.map +0 -1
- package/dist/lib/session/rage-click.js +0 -51
- package/dist/lib/session/rage-click.js.map +0 -1
- package/dist/lib/session/replay.d.ts +0 -3
- package/dist/lib/session/replay.d.ts.map +0 -1
- package/dist/lib/session/replay.js +0 -106
- package/dist/lib/session/replay.js.map +0 -1
- package/dist/lib/session/session-summary.d.ts +0 -3
- package/dist/lib/session/session-summary.d.ts.map +0 -1
- package/dist/lib/session/session-summary.js +0 -79
- package/dist/lib/session/session-summary.js.map +0 -1
- package/dist/provider.d.ts +0 -76
- package/dist/provider.d.ts.map +0 -1
- package/dist/provider.js +0 -138
- package/dist/provider.js.map +0 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { SessionServiceTag } from "./effect/layers/session.layer.mjs";
|
|
2
|
+
import { ConfigTag } from "./effect/tags.mjs";
|
|
3
|
+
import { EventPayload } from "./core/events/event-registry.mjs";
|
|
4
|
+
import { ValidationError } from "./effect/errors.mjs";
|
|
5
|
+
import { ContextServiceTag } from "./effect/layers/context.layer.mjs";
|
|
6
|
+
import { QueueServiceTag } from "./effect/layers/queue.layer.mjs";
|
|
7
|
+
import { Effect } from "effect";
|
|
8
|
+
import { EventType } from "@interfere/types/sdk/plugins/lib/types";
|
|
9
|
+
|
|
10
|
+
//#region src/client.d.ts
|
|
11
|
+
type CaptureFn = <T extends EventType>(type: T, payload: EventPayload<T>) => void;
|
|
12
|
+
declare function captureEffect<T extends EventType>(type: T, payload: EventPayload<T>): Effect.Effect<void, ValidationError, QueueServiceTag | SessionServiceTag | ConfigTag | ContextServiceTag>;
|
|
13
|
+
declare const capture: CaptureFn;
|
|
14
|
+
//#endregion
|
|
15
|
+
export { CaptureFn, capture, captureEffect };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.mts","names":[],"sources":["../src/client.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;KAaY,SAAA,cAAuB,iBAC3B,YACG,aAAa;iBA0BR,wBAAwB,iBAChC,YACG,aAAa,KAAE,MAAA,CAAA,aAAA,iBAAA,kBAAA,iBAAA,GAAA,SAAA,GAAA;cAqFb,SAAS"}
|
package/dist/client.mjs
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { dynamicRegistry } from "./core/events/event-registry.mjs";
|
|
2
|
+
import { buildEnvelopeEffect } from "./effect/build-envelope.mjs";
|
|
3
|
+
import { ValidationError } from "./effect/errors.mjs";
|
|
4
|
+
import { ContextServiceTag } from "./effect/layers/context.layer.mjs";
|
|
5
|
+
import { QueueServiceTag } from "./effect/layers/queue.layer.mjs";
|
|
6
|
+
import { withSpan } from "./effect/layers/tracer.layer.mjs";
|
|
7
|
+
import { forkWithSDK } from "./effect/runtime-services.mjs";
|
|
8
|
+
import { Effect } from "effect";
|
|
9
|
+
|
|
10
|
+
//#region src/client.ts
|
|
11
|
+
function enrichPayload(basePayload, properties) {
|
|
12
|
+
if (typeof basePayload === "object" && basePayload !== null) {
|
|
13
|
+
const merged = {
|
|
14
|
+
...basePayload.properties ?? {},
|
|
15
|
+
...properties
|
|
16
|
+
};
|
|
17
|
+
return {
|
|
18
|
+
...basePayload,
|
|
19
|
+
properties: merged
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return { properties };
|
|
23
|
+
}
|
|
24
|
+
function captureEffect(type, payload) {
|
|
25
|
+
const handler = dynamicRegistry.get(type);
|
|
26
|
+
if (!handler) return Effect.gen(function* () {
|
|
27
|
+
const queue = yield* QueueServiceTag;
|
|
28
|
+
const env = yield* buildEnvelopeEffect({
|
|
29
|
+
type,
|
|
30
|
+
payload
|
|
31
|
+
});
|
|
32
|
+
yield* queue.add(env);
|
|
33
|
+
yield* Effect.logTrace("Captured event with no handler", {
|
|
34
|
+
type,
|
|
35
|
+
envelopeId: env.uuid,
|
|
36
|
+
path: "fast"
|
|
37
|
+
});
|
|
38
|
+
}).pipe(Effect.withSpan("capture.fast", { attributes: { type } }));
|
|
39
|
+
return Effect.gen(function* () {
|
|
40
|
+
const queue = yield* QueueServiceTag;
|
|
41
|
+
const context = yield* ContextServiceTag;
|
|
42
|
+
const validated = yield* withSpan("capture.validate", Effect.sync(() => handler ? handler.schema.safeParse(payload) : {
|
|
43
|
+
success: false,
|
|
44
|
+
error: { issues: [{ message: "Missing handler" }] }
|
|
45
|
+
}).pipe(Effect.flatMap((result) => result.success === true ? Effect.succeed(result.data) : Effect.fail(new ValidationError({
|
|
46
|
+
message: "Invalid payload",
|
|
47
|
+
payload,
|
|
48
|
+
issues: result.error?.issues
|
|
49
|
+
})))), { attributes: { type } });
|
|
50
|
+
const transformed = handler && "transform" in handler && typeof handler.transform === "function" ? handler.transform(validated) : validated;
|
|
51
|
+
const env = yield* buildEnvelopeEffect({
|
|
52
|
+
type,
|
|
53
|
+
payload: handler?.enrich === true ? yield* withSpan("capture.enrich", context.getOnce().pipe(Effect.map((properties) => enrichPayload(transformed, properties))), { attributes: { type } }) : transformed
|
|
54
|
+
});
|
|
55
|
+
yield* queue.add(env);
|
|
56
|
+
yield* Effect.logTrace("Captured event with handler", {
|
|
57
|
+
type,
|
|
58
|
+
envelopeId: env.uuid
|
|
59
|
+
});
|
|
60
|
+
}).pipe(Effect.withSpan("capture.full", { attributes: { type } }));
|
|
61
|
+
}
|
|
62
|
+
const capture = (type, payload) => {
|
|
63
|
+
if (typeof window === "undefined") return;
|
|
64
|
+
forkWithSDK(captureEffect(type, payload).pipe(Effect.catchTag("ValidationError", (err) => Effect.logError("Invalid event payload", {
|
|
65
|
+
type,
|
|
66
|
+
payload,
|
|
67
|
+
issues: err.issues
|
|
68
|
+
})), Effect.catchAll((err) => Effect.logError("Failed to capture event", {
|
|
69
|
+
type,
|
|
70
|
+
error: String(err)
|
|
71
|
+
}))));
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
//#endregion
|
|
75
|
+
export { capture, captureEffect };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.mjs","names":["capture: CaptureFn"],"sources":["../src/client.ts"],"sourcesContent":["import type { EventType } from \"@interfere/types/sdk/plugins/lib/types\";\nimport { Effect } from \"effect\";\nimport {\n dynamicRegistry,\n type EventPayload,\n} from \"./core/events/event-registry.js\";\nimport { buildEnvelopeEffect } from \"./effect/build-envelope.js\";\nimport { ValidationError } from \"./effect/errors.js\";\nimport { ContextServiceTag } from \"./effect/layers/context.layer.js\";\nimport { QueueServiceTag } from \"./effect/layers/queue.layer.js\";\nimport { withSpan } from \"./effect/layers/tracer.layer.js\";\nimport { forkWithSDK } from \"./effect/runtime-services.js\";\n\nexport type CaptureFn = <T extends EventType>(\n type: T,\n payload: EventPayload<T>\n) => void;\n\ntype EnrichedPayload<T> =\n T extends Record<string, unknown>\n ? T & { properties?: Record<string, unknown> }\n : { properties: Record<string, unknown> };\n\nfunction enrichPayload<T>(\n basePayload: T,\n properties: Record<string, unknown>\n): EnrichedPayload<T> {\n if (typeof basePayload === \"object\" && basePayload !== null) {\n const existing = (basePayload as EnrichedPayload<T>).properties;\n\n const merged = { ...(existing ?? {}), ...properties };\n\n return {\n ...basePayload,\n properties: merged,\n } as EnrichedPayload<T>;\n }\n\n return { properties } as EnrichedPayload<T>;\n}\n\nexport function captureEffect<T extends EventType>(\n type: T,\n payload: EventPayload<T>\n) {\n const handler = dynamicRegistry.get(type);\n\n if (!handler) {\n return Effect.gen(function* () {\n const queue = yield* QueueServiceTag;\n const env = yield* buildEnvelopeEffect({ type, payload });\n\n yield* queue.add(env);\n\n yield* Effect.logTrace(\"Captured event with no handler\", {\n type,\n envelopeId: env.uuid,\n path: \"fast\",\n });\n }).pipe(Effect.withSpan(\"capture.fast\", { attributes: { type } }));\n }\n\n return Effect.gen(function* () {\n const queue = yield* QueueServiceTag;\n const context = yield* ContextServiceTag;\n\n const validated = yield* withSpan(\n \"capture.validate\",\n Effect.sync(() =>\n handler\n ? handler.schema.safeParse(payload)\n : {\n success: false,\n error: { issues: [{ message: \"Missing handler\" }] },\n }\n ).pipe(\n Effect.flatMap((result) =>\n result.success === true\n ? Effect.succeed((result as { data: unknown }).data)\n : Effect.fail(\n new ValidationError({\n message: \"Invalid payload\",\n payload,\n issues: (result as { error?: { issues?: unknown } }).error\n ?.issues,\n })\n )\n )\n ),\n { attributes: { type } }\n );\n\n const transformed =\n handler &&\n \"transform\" in handler &&\n typeof handler.transform === \"function\"\n ? (handler.transform as (input: unknown) => unknown)(validated)\n : validated;\n\n const finalPayload =\n handler?.enrich === true\n ? yield* withSpan(\n \"capture.enrich\",\n context\n .getOnce()\n .pipe(\n Effect.map((properties) =>\n enrichPayload(transformed, properties)\n )\n ),\n { attributes: { type } }\n )\n : transformed;\n\n const env = yield* buildEnvelopeEffect({\n type,\n payload: finalPayload as EventPayload<T>,\n });\n\n yield* queue.add(env);\n\n yield* Effect.logTrace(\"Captured event with handler\", {\n type,\n envelopeId: env.uuid,\n });\n }).pipe(Effect.withSpan(\"capture.full\", { attributes: { type } }));\n}\n\nexport const capture: CaptureFn = <T extends EventType>(\n type: T,\n payload: EventPayload<T>\n) => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n forkWithSDK(\n captureEffect(type, payload).pipe(\n Effect.catchTag(\"ValidationError\", (err) =>\n Effect.logError(\"Invalid event payload\", {\n type,\n payload,\n issues: err.issues,\n })\n ),\n Effect.catchAll((err) =>\n Effect.logError(\"Failed to capture event\", {\n type,\n error: String(err),\n })\n )\n )\n );\n};\n"],"mappings":";;;;;;;;;;AAuBA,SAAS,cACP,aACA,YACoB;AACpB,KAAI,OAAO,gBAAgB,YAAY,gBAAgB,MAAM;EAG3D,MAAM,SAAS;GAAE,GAFC,YAAmC,cAEpB,EAAE;GAAG,GAAG;GAAY;AAErD,SAAO;GACL,GAAG;GACH,YAAY;GACb;;AAGH,QAAO,EAAE,YAAY;;AAGvB,SAAgB,cACd,MACA,SACA;CACA,MAAM,UAAU,gBAAgB,IAAI,KAAK;AAEzC,KAAI,CAAC,QACH,QAAO,OAAO,IAAI,aAAa;EAC7B,MAAM,QAAQ,OAAO;EACrB,MAAM,MAAM,OAAO,oBAAoB;GAAE;GAAM;GAAS,CAAC;AAEzD,SAAO,MAAM,IAAI,IAAI;AAErB,SAAO,OAAO,SAAS,kCAAkC;GACvD;GACA,YAAY,IAAI;GAChB,MAAM;GACP,CAAC;GACF,CAAC,KAAK,OAAO,SAAS,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;AAGpE,QAAO,OAAO,IAAI,aAAa;EAC7B,MAAM,QAAQ,OAAO;EACrB,MAAM,UAAU,OAAO;EAEvB,MAAM,YAAY,OAAO,SACvB,oBACA,OAAO,WACL,UACI,QAAQ,OAAO,UAAU,QAAQ,GACjC;GACE,SAAS;GACT,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,mBAAmB,CAAC,EAAE;GACpD,CACN,CAAC,KACA,OAAO,SAAS,WACd,OAAO,YAAY,OACf,OAAO,QAAS,OAA6B,KAAK,GAClD,OAAO,KACL,IAAI,gBAAgB;GAClB,SAAS;GACT;GACA,QAAS,OAA4C,OACjD;GACL,CAAC,CACH,CACN,CACF,EACD,EAAE,YAAY,EAAE,MAAM,EAAE,CACzB;EAED,MAAM,cACJ,WACA,eAAe,WACf,OAAO,QAAQ,cAAc,aACxB,QAAQ,UAA0C,UAAU,GAC7D;EAiBN,MAAM,MAAM,OAAO,oBAAoB;GACrC;GACA,SAhBA,SAAS,WAAW,OAChB,OAAO,SACL,kBACA,QACG,SAAS,CACT,KACC,OAAO,KAAK,eACV,cAAc,aAAa,WAAW,CACvC,CACF,EACH,EAAE,YAAY,EAAE,MAAM,EAAE,CACzB,GACD;GAKL,CAAC;AAEF,SAAO,MAAM,IAAI,IAAI;AAErB,SAAO,OAAO,SAAS,+BAA+B;GACpD;GACA,YAAY,IAAI;GACjB,CAAC;GACF,CAAC,KAAK,OAAO,SAAS,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;;AAGpE,MAAaA,WACX,MACA,YACG;AACH,KAAI,OAAO,WAAW,YACpB;AAGF,aACE,cAAc,MAAM,QAAQ,CAAC,KAC3B,OAAO,SAAS,oBAAoB,QAClC,OAAO,SAAS,yBAAyB;EACvC;EACA;EACA,QAAQ,IAAI;EACb,CAAC,CACH,EACD,OAAO,UAAU,QACf,OAAO,SAAS,2BAA2B;EACzC;EACA,OAAO,OAAO,IAAI;EACnB,CAAC,CACH,CACF,CACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { AnyEventDefinition, EventHandlerConfig, EventSchemas } from "./plugin-event-types.mjs";
|
|
2
|
+
import { EventType } from "@interfere/types/sdk/plugins/lib/types";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
|
|
5
|
+
//#region src/core/events/event-registry.d.ts
|
|
6
|
+
type EventHandlerFor<T extends EventType> = T extends keyof EventSchemas ? EventHandlerConfig<EventSchemas[T]> : never;
|
|
7
|
+
type EventPayload<T extends EventType> = T extends keyof EventSchemas ? z.infer<EventSchemas[T]> : never;
|
|
8
|
+
declare function getEventHandler<T extends EventType>(type: T): EventHandlerFor<T> | undefined;
|
|
9
|
+
declare function hasEventHandler(type: EventType): type is keyof EventSchemas;
|
|
10
|
+
type PluginEventHandler<T extends EventType = EventType> = {
|
|
11
|
+
eventType: T;
|
|
12
|
+
handler: EventHandlerFor<T>;
|
|
13
|
+
};
|
|
14
|
+
declare class DynamicEventRegistry {
|
|
15
|
+
private readonly dynamicHandlers;
|
|
16
|
+
register<T extends EventType>(eventType: T, handler: EventHandlerFor<T>): void;
|
|
17
|
+
registerDefinition(def: AnyEventDefinition): void;
|
|
18
|
+
get<T extends EventType>(eventType: T): EventHandlerFor<T> | undefined;
|
|
19
|
+
merge(handlers: PluginEventHandler[]): void;
|
|
20
|
+
}
|
|
21
|
+
declare const dynamicRegistry: DynamicEventRegistry;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { DynamicEventRegistry, EventHandlerFor, EventPayload, PluginEventHandler, dynamicRegistry, getEventHandler, hasEventHandler };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-registry.d.mts","names":[],"sources":["../../../src/core/events/event-registry.ts"],"sourcesContent":[],"mappings":";;;;;KAUY,0BAA0B,aAAa,gBAAgB,eAC/D,mBAAmB,aAAa;KAIxB,uBAAuB,aAAa,gBAAgB,eAC5D,CAAA,CAAE,MAAM,aAAa;AANb,iBAUI,eAVW,CAAA,UAUe,SAVf,CAAA,CAAA,IAAA,EAWnB,CAXmB,CAAA,EAYxB,eAZwB,CAYR,CAZQ,CAAA,GAAA,SAAA;AAAW,iBAkBtB,eAAA,CAlBsB,IAAA,EAkBA,SAlBA,CAAA,EAAA,IAAA,IAAA,MAkB0B,YAlB1B;AAAa,KAuBvC,kBAvBuC,CAAA,UAuBV,SAvBU,GAuBE,SAvBF,CAAA,GAAA;EAAgB,SAAA,EAwBtD,CAxBsD;EAC5C,OAAA,EAwBZ,eAxBY,CAwBI,CAxBJ,CAAA;CAAa;AAAhC,cA4BS,oBAAA,CA5BT;EAAkB,iBAAA,eAAA;EAIV,QAAA,CAAA,UA8BS,SA9BG,CAAA,CAAA,SAAA,EA+BT,CA/BS,EAAA,OAAA,EAgCX,eAhCW,CAgCK,CAhCL,CAAA,CAAA,EAAA,IAAA;EAAW,kBAAA,CAAA,GAAA,EAwCT,kBAxCS,CAAA,EAAA,IAAA;EAAa,GAAA,CAAA,UAgDhC,SAhDgC,CAAA,CAAA,SAAA,EAgDV,CAhDU,CAAA,EAgDN,eAhDM,CAgDU,CAhDV,CAAA,GAAA,SAAA;EAAgB,KAAA,CAAA,QAAA,EAuD9C,kBAvD8C,EAAA,CAAA,EAAA,IAAA;;AACvC,cA8DZ,eA9DY,EA8DG,oBA9DH"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { eventSchemas } from "./plugin-event-types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/events/event-registry.ts
|
|
4
|
+
function getEventHandler(type) {
|
|
5
|
+
return dynamicRegistry.get(type);
|
|
6
|
+
}
|
|
7
|
+
function hasEventHandler(type) {
|
|
8
|
+
return type in eventSchemas;
|
|
9
|
+
}
|
|
10
|
+
var DynamicEventRegistry = class {
|
|
11
|
+
dynamicHandlers = /* @__PURE__ */ new Map();
|
|
12
|
+
register(eventType, handler) {
|
|
13
|
+
this.dynamicHandlers.set(eventType, handler);
|
|
14
|
+
}
|
|
15
|
+
registerDefinition(def) {
|
|
16
|
+
this.dynamicHandlers.set(def.type, {
|
|
17
|
+
schema: def.schema,
|
|
18
|
+
enrich: def.enrich,
|
|
19
|
+
transform: def.transform
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
get(eventType) {
|
|
23
|
+
return this.dynamicHandlers.get(eventType);
|
|
24
|
+
}
|
|
25
|
+
merge(handlers) {
|
|
26
|
+
for (const { eventType, handler } of handlers) this.register(eventType, handler);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const dynamicRegistry = new DynamicEventRegistry();
|
|
30
|
+
|
|
31
|
+
//#endregion
|
|
32
|
+
export { DynamicEventRegistry, dynamicRegistry, getEventHandler, hasEventHandler };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-registry.mjs","names":[],"sources":["../../../src/core/events/event-registry.ts"],"sourcesContent":["import type { EventType } from \"@interfere/types/sdk/plugins/lib/types\";\nimport type { z } from \"zod\";\nimport {\n type AnyEventDefinition,\n type EventHandlerConfig,\n type EventSchemas,\n eventSchemas,\n} from \"./plugin-event-types.js\";\n\n// Type to get the handler for a specific event type\nexport type EventHandlerFor<T extends EventType> = T extends keyof EventSchemas\n ? EventHandlerConfig<EventSchemas[T]>\n : never;\n\n// Type to get the schema input type for an event\nexport type EventPayload<T extends EventType> = T extends keyof EventSchemas\n ? z.infer<EventSchemas[T]>\n : never;\n\n// Runtime helper to get handler with full type information\nexport function getEventHandler<T extends EventType>(\n type: T\n): EventHandlerFor<T> | undefined {\n // All events are now plugin-registered\n return dynamicRegistry.get(type);\n}\n\n// Type guard to check if an event type has a handler\nexport function hasEventHandler(type: EventType): type is keyof EventSchemas {\n return type in eventSchemas;\n}\n\n// Plugin registration system for dynamic event handlers\nexport type PluginEventHandler<T extends EventType = EventType> = {\n eventType: T;\n handler: EventHandlerFor<T>;\n};\n\n// Advanced type for plugin-provided event handlers\nexport class DynamicEventRegistry {\n private readonly dynamicHandlers = new Map<\n EventType,\n EventHandlerConfig<z.ZodType>\n >();\n\n register<T extends EventType>(\n eventType: T,\n handler: EventHandlerFor<T>\n ): void {\n this.dynamicHandlers.set(\n eventType,\n handler as EventHandlerConfig<z.ZodType>\n );\n }\n\n registerDefinition(def: AnyEventDefinition): void {\n this.dynamicHandlers.set(def.type, {\n schema: def.schema,\n enrich: def.enrich,\n transform: def.transform,\n } as EventHandlerConfig<z.ZodType>);\n }\n\n get<T extends EventType>(eventType: T): EventHandlerFor<T> | undefined {\n // Only check dynamic handlers since all events are plugin-registered\n return this.dynamicHandlers.get(eventType) as\n | EventHandlerFor<T>\n | undefined;\n }\n\n merge(handlers: PluginEventHandler[]): void {\n for (const { eventType, handler } of handlers) {\n this.register(eventType, handler);\n }\n }\n}\n\n// Export a singleton instance for the dynamic registry\nexport const dynamicRegistry = new DynamicEventRegistry();\n"],"mappings":";;;AAoBA,SAAgB,gBACd,MACgC;AAEhC,QAAO,gBAAgB,IAAI,KAAK;;AAIlC,SAAgB,gBAAgB,MAA6C;AAC3E,QAAO,QAAQ;;AAUjB,IAAa,uBAAb,MAAkC;CAChC,AAAiB,kCAAkB,IAAI,KAGpC;CAEH,SACE,WACA,SACM;AACN,OAAK,gBAAgB,IACnB,WACA,QACD;;CAGH,mBAAmB,KAA+B;AAChD,OAAK,gBAAgB,IAAI,IAAI,MAAM;GACjC,QAAQ,IAAI;GACZ,QAAQ,IAAI;GACZ,WAAW,IAAI;GAChB,CAAkC;;CAGrC,IAAyB,WAA8C;AAErE,SAAO,KAAK,gBAAgB,IAAI,UAAU;;CAK5C,MAAM,UAAsC;AAC1C,OAAK,MAAM,EAAE,WAAW,aAAa,SACnC,MAAK,SAAS,WAAW,QAAQ;;;AAMvC,MAAa,kBAAkB,IAAI,sBAAsB"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { PluginManifest } from "@interfere/types/sdk/plugins/manifest";
|
|
2
|
+
import { EventType, PluginKey } from "@interfere/types/sdk/plugins/lib/types";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
|
|
5
|
+
//#region src/core/events/plugin-event-types.d.ts
|
|
6
|
+
type PluginRegistrationInManifest = PluginManifest[number];
|
|
7
|
+
type EventsForPlugin<K$1 extends PluginKey> = Extract<PluginRegistrationInManifest, {
|
|
8
|
+
name: K$1;
|
|
9
|
+
}>["events"][number]["name"];
|
|
10
|
+
declare const eventSchemas: {
|
|
11
|
+
readonly error: z.ZodObject<{
|
|
12
|
+
frames: z.ZodArray<z.ZodObject<{
|
|
13
|
+
file: z.ZodObject<{
|
|
14
|
+
reported: z.ZodNullable<z.ZodString>;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
line: z.ZodObject<{
|
|
17
|
+
reported: z.ZodNullable<z.ZodNumber>;
|
|
18
|
+
}, z.core.$strip>;
|
|
19
|
+
column: z.ZodObject<{
|
|
20
|
+
reported: z.ZodNullable<z.ZodNumber>;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
fn: z.ZodObject<{
|
|
23
|
+
reported: z.ZodNullable<z.ZodString>;
|
|
24
|
+
}, z.core.$strip>;
|
|
25
|
+
}, z.core.$strip>>;
|
|
26
|
+
message: z.ZodNullable<z.ZodString>;
|
|
27
|
+
name: z.ZodNullable<z.ZodString>;
|
|
28
|
+
stack: z.ZodNullable<z.ZodString>;
|
|
29
|
+
errorSource: z.ZodEnum<{
|
|
30
|
+
client: "client";
|
|
31
|
+
server: "server";
|
|
32
|
+
edge: "edge";
|
|
33
|
+
}>;
|
|
34
|
+
}, z.core.$strip>;
|
|
35
|
+
readonly rage_click: z.ZodObject<{
|
|
36
|
+
count: z.ZodNumber;
|
|
37
|
+
timeWindow: z.ZodNumber;
|
|
38
|
+
selector: z.ZodString;
|
|
39
|
+
text: z.ZodString;
|
|
40
|
+
x: z.ZodNumber;
|
|
41
|
+
y: z.ZodNumber;
|
|
42
|
+
timestamp: z.ZodNumber;
|
|
43
|
+
}, z.core.$strip>;
|
|
44
|
+
readonly ui_event: z.ZodObject<{
|
|
45
|
+
event: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
46
|
+
}, z.core.$strip>;
|
|
47
|
+
readonly replay_chunk: z.ZodObject<{
|
|
48
|
+
ts: z.ZodNumber;
|
|
49
|
+
count: z.ZodNumber;
|
|
50
|
+
events: z.ZodArray<z.ZodString>;
|
|
51
|
+
}, z.core.$strip>;
|
|
52
|
+
readonly session_summary: z.ZodObject<{
|
|
53
|
+
summary: z.ZodString;
|
|
54
|
+
pageTitle: z.ZodString;
|
|
55
|
+
pageUrl: z.ZodURL;
|
|
56
|
+
contentLength: z.ZodNumber;
|
|
57
|
+
timestamp: z.ZodNumber;
|
|
58
|
+
}, z.core.$strip>;
|
|
59
|
+
readonly pageview: z.ZodObject<{
|
|
60
|
+
url: z.ZodString;
|
|
61
|
+
title: z.ZodOptional<z.ZodString>;
|
|
62
|
+
}, z.core.$strip>;
|
|
63
|
+
readonly pageleave: z.ZodObject<{
|
|
64
|
+
url: z.ZodString;
|
|
65
|
+
durationMs: z.ZodOptional<z.ZodNumber>;
|
|
66
|
+
}, z.core.$strip>;
|
|
67
|
+
};
|
|
68
|
+
/** Per-event configuration derived from PLUGIN_MANIFEST. */
|
|
69
|
+
declare const eventConfigs: Record<"error" | "replay_chunk" | "rage_click" | "session_summary" | "pageview" | "pageleave" | "ui_event", {
|
|
70
|
+
enrich: boolean;
|
|
71
|
+
}>;
|
|
72
|
+
type EventSchemas = typeof eventSchemas;
|
|
73
|
+
type AnyEventDefinition = { [K in keyof EventSchemas]: {
|
|
74
|
+
type: K;
|
|
75
|
+
schema: EventSchemas[K];
|
|
76
|
+
enrich?: boolean;
|
|
77
|
+
transform?: (input: z.infer<EventSchemas[K]>) => unknown;
|
|
78
|
+
} }[keyof EventSchemas];
|
|
79
|
+
type EventDefinitionFor<T extends EventType> = T extends keyof EventSchemas ? {
|
|
80
|
+
type: T;
|
|
81
|
+
schema: EventSchemas[T];
|
|
82
|
+
enrich?: boolean;
|
|
83
|
+
transform?: (input: z.infer<EventSchemas[T]>) => unknown;
|
|
84
|
+
} : never;
|
|
85
|
+
type ValidatePluginEvents<K$1 extends PluginKey, Events extends readonly AnyEventDefinition[]> = Events extends readonly (infer E)[] ? E extends AnyEventDefinition ? E["type"] extends EventsForPlugin<K$1> ? Events : never : never : never;
|
|
86
|
+
type EventHandlerConfig<TSchema extends z.ZodType<unknown>, TInput = z.infer<TSchema>, TOutput = TInput> = {
|
|
87
|
+
schema: TSchema;
|
|
88
|
+
enrich: boolean;
|
|
89
|
+
transform?: (input: TInput) => TOutput;
|
|
90
|
+
};
|
|
91
|
+
//#endregion
|
|
92
|
+
export { AnyEventDefinition, EventDefinitionFor, EventHandlerConfig, EventSchemas, EventsForPlugin, ValidatePluginEvents, eventConfigs, eventSchemas };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-event-types.d.mts","names":[],"sources":["../../../src/core/events/plugin-event-types.ts"],"sourcesContent":[],"mappings":";;;;;KAmBK,4BAAA,GAA+B;KAExB,4BAA0B,aAAa,QACjD;EAHG,IAAA,EAIK,GAJL;AAEL,CAAA,CAAA,CAAA,QAAY,CAAA,CAAA,MAAA,CAAA,CAAA,MAAe,CAAA;AAAW,cAMzB,YANyB,EAAA;EACpC,SAAA,KAAA,aAAA,CAAA;IACQ,MAAA,YAAA,YAAA,CAAA;MAFyC,IAAA,aAAA,CAAA;QAAO,QAAA,eAAA,YAAA,CAAA;MAM7C,CAAA,eAQH,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAGG,cAAY;;;KAUb,YAAA,UAAsB;KAGtB,kBAAA,iBACE;QACJ;UACE,aAAa;;sBAED,CAAA,CAAE,MAAM,aAAa;UAErC;KAGI,6BAA6B,aACvC,gBAAgB;EAxBL,IAAA,EA0BC,CA1BD;EAUD,MAAA,EAiBI,YAjBQ,CAiBK,CAjBL,CAAA;EAGZ,MAAA,CAAA,EAAA,OAAA;EACE,SAAA,CAAA,EAAA,CAAA,KAAA,EAec,CAAA,CAAE,KAfhB,CAesB,YAftB,CAemC,CAfnC,CAAA,CAAA,EAAA,GAAA,OAAA;CACJ,GAAA,KAAA;AACE,KAkBA,oBAlBA,CAAA,YAmBA,SAnBA,EAAA,eAAA,SAoBc,kBApBd,EAAA,CAAA,GAqBR,MArBQ,SAAA,SAAA,CAAA,KAAA,EAAA,CAAA,EAAA,GAAA,CAAA,SAsBE,kBAtBF,GAuBN,CAvBM,CAAA,MAAA,CAAA,SAuBY,eAvBZ,CAuB4B,GAvB5B,CAAA,GAwBJ,MAxBI,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA;AAAa,KA8Bb,kBA9Ba,CAAA,gBA+BP,CAAA,CAAE,OA/BK,CAAA,OAAA,CAAA,EAAA,SAgCd,CAAA,CAAE,KAhCY,CAgCN,OAhCM,CAAA,EAAA,UAiCb,MAjCa,CAAA,GAAA;EAEO,MAAA,EAiCtB,OAjCsB;EAAa,MAAA,EAAA,OAAA;EAAnB,SAAA,CAAA,EAAA,CAAA,KAAA,EAmCJ,MAnCI,EAAA,GAmCO,OAnCP;CAElB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { PLUGIN_MANIFEST } from "@interfere/types/sdk/plugins/manifest";
|
|
2
|
+
import { sessionSummaryPayloadSchema } from "@interfere/types/sdk/plugins/payload/ai-summary";
|
|
3
|
+
import { errorEnvelopePayloadSchema } from "@interfere/types/sdk/plugins/payload/errors";
|
|
4
|
+
import { pageleavePayloadSchema, pageviewPayloadSchema, uiEventPayloadSchema } from "@interfere/types/sdk/plugins/payload/page-events";
|
|
5
|
+
import { rageClickPayloadSchema } from "@interfere/types/sdk/plugins/payload/rage-click";
|
|
6
|
+
import { replayChunkPayloadSchema } from "@interfere/types/sdk/plugins/payload/replay";
|
|
7
|
+
|
|
8
|
+
//#region src/core/events/plugin-event-types.ts
|
|
9
|
+
const eventSchemas = {
|
|
10
|
+
error: errorEnvelopePayloadSchema,
|
|
11
|
+
rage_click: rageClickPayloadSchema,
|
|
12
|
+
ui_event: uiEventPayloadSchema,
|
|
13
|
+
replay_chunk: replayChunkPayloadSchema,
|
|
14
|
+
session_summary: sessionSummaryPayloadSchema,
|
|
15
|
+
pageview: pageviewPayloadSchema,
|
|
16
|
+
pageleave: pageleavePayloadSchema
|
|
17
|
+
};
|
|
18
|
+
/** Per-event configuration derived from PLUGIN_MANIFEST. */
|
|
19
|
+
const eventConfigs = PLUGIN_MANIFEST.reduce((acc, plugin) => {
|
|
20
|
+
for (const event of plugin.events) acc[event.name] = { enrich: event.enrich };
|
|
21
|
+
return acc;
|
|
22
|
+
}, {});
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
export { eventConfigs, eventSchemas };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-event-types.mjs","names":[],"sources":["../../../src/core/events/plugin-event-types.ts"],"sourcesContent":["import type {\n EventType,\n PluginKey,\n} from \"@interfere/types/sdk/plugins/lib/types\";\nimport {\n PLUGIN_MANIFEST,\n type PluginManifest,\n} from \"@interfere/types/sdk/plugins/manifest\";\nimport { sessionSummaryPayloadSchema } from \"@interfere/types/sdk/plugins/payload/ai-summary\";\nimport { errorEnvelopePayloadSchema } from \"@interfere/types/sdk/plugins/payload/errors\";\nimport {\n pageleavePayloadSchema,\n pageviewPayloadSchema,\n uiEventPayloadSchema,\n} from \"@interfere/types/sdk/plugins/payload/page-events\";\nimport { rageClickPayloadSchema } from \"@interfere/types/sdk/plugins/payload/rage-click\";\nimport { replayChunkPayloadSchema } from \"@interfere/types/sdk/plugins/payload/replay\";\nimport type { z } from \"zod\";\n\ntype PluginRegistrationInManifest = PluginManifest[number];\n\nexport type EventsForPlugin<K extends PluginKey> = Extract<\n PluginRegistrationInManifest,\n { name: K }\n>[\"events\"][number][\"name\"];\n\n// Define the canonical event schemas and configurations\nexport const eventSchemas = {\n error: errorEnvelopePayloadSchema,\n rage_click: rageClickPayloadSchema,\n ui_event: uiEventPayloadSchema,\n replay_chunk: replayChunkPayloadSchema,\n session_summary: sessionSummaryPayloadSchema,\n pageview: pageviewPayloadSchema,\n pageleave: pageleavePayloadSchema,\n} as const;\n\n/** Per-event configuration derived from PLUGIN_MANIFEST. */\nexport const eventConfigs = PLUGIN_MANIFEST.reduce(\n (acc, plugin) => {\n for (const event of plugin.events) {\n acc[event.name as EventType] = { enrich: event.enrich };\n }\n return acc;\n },\n {} as Record<EventType, { enrich: boolean }>\n);\n\nexport type EventSchemas = typeof eventSchemas;\n\n// Discriminated union for all possible event definitions\nexport type AnyEventDefinition = {\n [K in keyof EventSchemas]: {\n type: K;\n schema: EventSchemas[K];\n enrich?: boolean;\n transform?: (input: z.infer<EventSchemas[K]>) => unknown;\n };\n}[keyof EventSchemas];\n\n// Strongly typed event definition for a specific event type\nexport type EventDefinitionFor<T extends EventType> =\n T extends keyof EventSchemas\n ? {\n type: T;\n schema: EventSchemas[T];\n enrich?: boolean;\n transform?: (input: z.infer<EventSchemas[T]>) => unknown;\n }\n : never;\n\n// Helper to validate that an array of event definitions matches a plugin's allowed events\nexport type ValidatePluginEvents<\n K extends PluginKey,\n Events extends readonly AnyEventDefinition[],\n> = Events extends readonly (infer E)[]\n ? E extends AnyEventDefinition\n ? E[\"type\"] extends EventsForPlugin<K>\n ? Events\n : never\n : never\n : never;\n\n// Type-safe event handler configuration\nexport type EventHandlerConfig<\n TSchema extends z.ZodType<unknown>,\n TInput = z.infer<TSchema>,\n TOutput = TInput,\n> = {\n schema: TSchema;\n enrich: boolean;\n transform?: (input: TInput) => TOutput;\n};\n"],"mappings":";;;;;;;;AA2BA,MAAa,eAAe;CAC1B,OAAO;CACP,YAAY;CACZ,UAAU;CACV,cAAc;CACd,iBAAiB;CACjB,UAAU;CACV,WAAW;CACZ;;AAGD,MAAa,eAAe,gBAAgB,QACzC,KAAK,WAAW;AACf,MAAK,MAAM,SAAS,OAAO,OACzB,KAAI,MAAM,QAAqB,EAAE,QAAQ,MAAM,QAAQ;AAEzD,QAAO;GAET,EAAE,CACH"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region src/core/plugins/dom-utils.d.ts
|
|
2
|
+
declare function getElementSelector(element: Element): string;
|
|
3
|
+
declare function getElementText(element: HTMLElement): string | null;
|
|
4
|
+
declare const DomUtils: {
|
|
5
|
+
getElementSelector: typeof getElementSelector;
|
|
6
|
+
getElementText: typeof getElementText;
|
|
7
|
+
};
|
|
8
|
+
//#endregion
|
|
9
|
+
export { DomUtils, getElementSelector, getElementText };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-utils.d.mts","names":[],"sources":["../../../src/core/plugins/dom-utils.ts"],"sourcesContent":[],"mappings":";iBAIgB,kBAAA,UAA4B;AAA5B,iBAgBA,cAAA,CAhB4B,OAAO,EAgBX,WAhBW,CAAA,EAAA,MAAA,GAAA,IAAA;AAgBnC,cAUH,QAViB,EAAA;EAUjB,kBAGZ,EAAA,OAAA,kBAAA;yBAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
//#region src/core/plugins/dom-utils.ts
|
|
2
|
+
const CLASS_REGEX = /\s+/;
|
|
3
|
+
function getElementSelector(element) {
|
|
4
|
+
const node = element;
|
|
5
|
+
if (node.id) return `#${node.id}`;
|
|
6
|
+
if (typeof node.className === "string" && node.className.trim().length > 0) {
|
|
7
|
+
const classes = node.className.trim().split(CLASS_REGEX).join(".");
|
|
8
|
+
return `${node.tagName?.toLowerCase() || "element"}.${classes}`;
|
|
9
|
+
}
|
|
10
|
+
return node.tagName?.toLowerCase() || "element";
|
|
11
|
+
}
|
|
12
|
+
function getElementText(element) {
|
|
13
|
+
if (element.tagName === "INPUT") {
|
|
14
|
+
const input = element;
|
|
15
|
+
return input.placeholder || input.value || null;
|
|
16
|
+
}
|
|
17
|
+
return element.textContent?.trim() || null;
|
|
18
|
+
}
|
|
19
|
+
const DomUtils = {
|
|
20
|
+
getElementSelector,
|
|
21
|
+
getElementText
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
export { DomUtils, getElementSelector, getElementText };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-utils.mjs","names":[],"sources":["../../../src/core/plugins/dom-utils.ts"],"sourcesContent":["// Shared DOM helpers for plugin implementations\n\nconst CLASS_REGEX = /\\s+/;\n\nexport function getElementSelector(element: Element): string {\n const node = element as HTMLElement;\n\n if (node.id) {\n return `#${node.id}`;\n }\n\n if (typeof node.className === \"string\" && node.className.trim().length > 0) {\n const classes = node.className.trim().split(CLASS_REGEX).join(\".\");\n const tag = node.tagName?.toLowerCase() || \"element\";\n return `${tag}.${classes}`;\n }\n\n return node.tagName?.toLowerCase() || \"element\";\n}\n\nexport function getElementText(element: HTMLElement): string | null {\n if (element.tagName === \"INPUT\") {\n const input = element as HTMLInputElement;\n return input.placeholder || input.value || null;\n }\n\n const text = element.textContent?.trim();\n return text || null;\n}\n\nexport const DomUtils = {\n getElementSelector,\n getElementText,\n};\n"],"mappings":";AAEA,MAAM,cAAc;AAEpB,SAAgB,mBAAmB,SAA0B;CAC3D,MAAM,OAAO;AAEb,KAAI,KAAK,GACP,QAAO,IAAI,KAAK;AAGlB,KAAI,OAAO,KAAK,cAAc,YAAY,KAAK,UAAU,MAAM,CAAC,SAAS,GAAG;EAC1E,MAAM,UAAU,KAAK,UAAU,MAAM,CAAC,MAAM,YAAY,CAAC,KAAK,IAAI;AAElE,SAAO,GADK,KAAK,SAAS,aAAa,IAAI,UAC7B,GAAG;;AAGnB,QAAO,KAAK,SAAS,aAAa,IAAI;;AAGxC,SAAgB,eAAe,SAAqC;AAClE,KAAI,QAAQ,YAAY,SAAS;EAC/B,MAAM,QAAQ;AACd,SAAO,MAAM,eAAe,MAAM,SAAS;;AAI7C,QADa,QAAQ,aAAa,MAAM,IACzB;;AAGjB,MAAa,WAAW;CACtB;CACA;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-summary.d.mts","names":[],"sources":["../../../../src/core/plugins/impl/ai-summary.ts"],"sourcesContent":[],"mappings":""}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { createEffectPlugin, defineEvent } from "../plugin-event-system.mjs";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
|
|
4
|
+
//#region src/core/plugins/impl/ai-summary.ts
|
|
5
|
+
var ai_summary_default = createEffectPlugin("aiSummary", {
|
|
6
|
+
name: "aiSummary",
|
|
7
|
+
events: [defineEvent("session_summary").value()],
|
|
8
|
+
setup: (ctx) => Effect.gen(function* () {
|
|
9
|
+
if (typeof window === "undefined" || typeof document === "undefined" || !("ai" in window) || !window.ai?.summarizer) {
|
|
10
|
+
ctx.log.debug("aiSummary: unsupported environment or missing API");
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const ai = window.ai;
|
|
14
|
+
const capabilities = yield* Effect.promise(() => ai.summarizer?.capabilities() ?? Promise.resolve({ available: "no" }));
|
|
15
|
+
if (capabilities?.available !== "readily") {
|
|
16
|
+
ctx.log.debug("aiSummary: summarizer not readily available", { available: capabilities?.available });
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (!ai.summarizer) {
|
|
20
|
+
ctx.log.debug("aiSummary: summarizer missing after capability check");
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
let isCapturing = false;
|
|
24
|
+
let lastCaptureTime = 0;
|
|
25
|
+
const MIN_CAPTURE_INTERVAL_MS = 3e4;
|
|
26
|
+
const INITIAL_CAPTURE_DELAY_MS = 5e3;
|
|
27
|
+
const DEBOUNCE_DELAY_MS = 2e3;
|
|
28
|
+
const MIN_TEXT_LENGTH = 100;
|
|
29
|
+
const MAX_TEXT_LENGTH = 5e4;
|
|
30
|
+
const MAX_CONTEXT_TEXT_LENGTH = 1e4;
|
|
31
|
+
const MIN_NODE_TEXT_LENGTH = 3;
|
|
32
|
+
const MIN_SUMMARY_LENGTH = 20;
|
|
33
|
+
const shouldSkipForLength = (text) => text.length < MIN_TEXT_LENGTH || text.length > MAX_TEXT_LENGTH;
|
|
34
|
+
const acceptTextNode = (textNode) => {
|
|
35
|
+
const parent = textNode.parentElement;
|
|
36
|
+
if (!parent) return NodeFilter.FILTER_REJECT;
|
|
37
|
+
const tagName = parent.tagName.toLowerCase();
|
|
38
|
+
if (tagName === "script" || tagName === "style" || tagName === "noscript") return NodeFilter.FILTER_REJECT;
|
|
39
|
+
const style = window.getComputedStyle(parent);
|
|
40
|
+
if (style.display === "none" || style.visibility === "hidden" || style.opacity === "0") return NodeFilter.FILTER_REJECT;
|
|
41
|
+
const text = textNode.textContent?.trim();
|
|
42
|
+
if (!text || text.length < MIN_NODE_TEXT_LENGTH) return NodeFilter.FILTER_REJECT;
|
|
43
|
+
return NodeFilter.FILTER_ACCEPT;
|
|
44
|
+
};
|
|
45
|
+
const extractVisibleText = () => {
|
|
46
|
+
const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, { acceptNode: acceptTextNode });
|
|
47
|
+
const parts = [];
|
|
48
|
+
let current = walker.nextNode();
|
|
49
|
+
while (current) {
|
|
50
|
+
const text = current.textContent?.trim();
|
|
51
|
+
if (text && text.length >= MIN_NODE_TEXT_LENGTH) parts.push(text);
|
|
52
|
+
current = walker.nextNode();
|
|
53
|
+
}
|
|
54
|
+
return parts.join(" ");
|
|
55
|
+
};
|
|
56
|
+
const buildContextText = (title, url, description, content) => {
|
|
57
|
+
return `Title: ${title}\nURL: ${url}\n${description ? `Description: ${description}\n` : ""}Content: ${content.substring(0, MAX_CONTEXT_TEXT_LENGTH)}`;
|
|
58
|
+
};
|
|
59
|
+
const getPageMetadata = () => {
|
|
60
|
+
return {
|
|
61
|
+
title: document.title || "Untitled",
|
|
62
|
+
url: window.location.href,
|
|
63
|
+
description: document.querySelector("meta[name=\"description\"]")?.getAttribute("content") || ""
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
const isSummaryMeaningful = (text) => Boolean(text && text.length > MIN_SUMMARY_LENGTH);
|
|
67
|
+
async function performSummaryFlow(nowTs) {
|
|
68
|
+
const fullText = extractVisibleText();
|
|
69
|
+
if (shouldSkipForLength(fullText)) return;
|
|
70
|
+
const { title, url, description } = getPageMetadata();
|
|
71
|
+
const contextualText = buildContextText(title, url, description, fullText);
|
|
72
|
+
const summarizer = ai.summarizer;
|
|
73
|
+
if (!summarizer) return;
|
|
74
|
+
const summary = await (await summarizer.create()).prompt(contextualText);
|
|
75
|
+
if (!isSummaryMeaningful(summary)) return;
|
|
76
|
+
ctx.span("plugin.ai.session_summary", ctx.capture("session_summary", {
|
|
77
|
+
summary,
|
|
78
|
+
pageTitle: title,
|
|
79
|
+
pageUrl: url,
|
|
80
|
+
contentLength: fullText.length,
|
|
81
|
+
timestamp: nowTs
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
const capturePageSummary = async () => {
|
|
85
|
+
const nowTs = Date.now();
|
|
86
|
+
if (isCapturing || nowTs - lastCaptureTime < MIN_CAPTURE_INTERVAL_MS) return;
|
|
87
|
+
isCapturing = true;
|
|
88
|
+
lastCaptureTime = nowTs;
|
|
89
|
+
try {
|
|
90
|
+
await performSummaryFlow(nowTs);
|
|
91
|
+
} catch (error) {
|
|
92
|
+
ctx.log.debug("Failed to capture AI session summary", { error });
|
|
93
|
+
} finally {
|
|
94
|
+
isCapturing = false;
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const observer = new MutationObserver(() => {
|
|
98
|
+
if (!isCapturing) setTimeout(capturePageSummary, DEBOUNCE_DELAY_MS);
|
|
99
|
+
});
|
|
100
|
+
observer.observe(document.body, {
|
|
101
|
+
childList: true,
|
|
102
|
+
subtree: true,
|
|
103
|
+
characterData: false,
|
|
104
|
+
attributes: false
|
|
105
|
+
});
|
|
106
|
+
const handleVisibilityChange = () => {
|
|
107
|
+
if (document.visibilityState === "visible") capturePageSummary();
|
|
108
|
+
};
|
|
109
|
+
document.addEventListener("visibilitychange", handleVisibilityChange);
|
|
110
|
+
setTimeout(capturePageSummary, INITIAL_CAPTURE_DELAY_MS);
|
|
111
|
+
return {
|
|
112
|
+
key: "aiSummary",
|
|
113
|
+
cleanup: () => {
|
|
114
|
+
observer.disconnect();
|
|
115
|
+
document.removeEventListener("visibilitychange", handleVisibilityChange);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
})
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
//#endregion
|
|
122
|
+
export { ai_summary_default as default };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-summary.mjs","names":["parts: string[]","current: Node | null","error: unknown"],"sources":["../../../../src/core/plugins/impl/ai-summary.ts"],"sourcesContent":["import { Effect } from \"effect\";\nimport { createEffectPlugin, defineEvent } from \"../plugin-event-system.js\";\n\ntype BrowserAITextSession = { prompt: (input: string) => Promise<string> };\n\nexport default createEffectPlugin(\"aiSummary\", {\n name: \"aiSummary\",\n events: [defineEvent(\"session_summary\").value()],\n setup: (ctx) =>\n Effect.gen(function* () {\n // Skip in SSR or unsupported environments\n if (\n typeof window === \"undefined\" ||\n typeof document === \"undefined\" ||\n !(\"ai\" in window) ||\n !(window.ai as { summarizer?: unknown })?.summarizer\n ) {\n ctx.log.debug(\"aiSummary: unsupported environment or missing API\");\n return;\n }\n\n const ai = window.ai as {\n summarizer?: {\n create: () => Promise<BrowserAITextSession>;\n capabilities: () => Promise<{ available: string }>;\n };\n };\n\n // Check if the summarizer is available\n const capabilities = yield* Effect.promise(\n () =>\n ai.summarizer?.capabilities() ?? Promise.resolve({ available: \"no\" })\n );\n if (capabilities?.available !== \"readily\") {\n ctx.log.debug(\"aiSummary: summarizer not readily available\", {\n available: capabilities?.available,\n });\n return;\n }\n\n if (!ai.summarizer) {\n ctx.log.debug(\"aiSummary: summarizer missing after capability check\");\n\n return;\n }\n\n let isCapturing = false;\n let lastCaptureTime = 0;\n const MIN_CAPTURE_INTERVAL_MS = 30_000;\n const INITIAL_CAPTURE_DELAY_MS = 5000;\n const DEBOUNCE_DELAY_MS = 2000;\n const MIN_TEXT_LENGTH = 100;\n const MAX_TEXT_LENGTH = 50_000;\n const MAX_CONTEXT_TEXT_LENGTH = 10_000;\n const MIN_NODE_TEXT_LENGTH = 3;\n const MIN_SUMMARY_LENGTH = 20;\n\n const shouldSkipForLength = (text: string) =>\n text.length < MIN_TEXT_LENGTH || text.length > MAX_TEXT_LENGTH;\n\n const acceptTextNode = (textNode: Node) => {\n const parent = textNode.parentElement;\n if (!parent) {\n return NodeFilter.FILTER_REJECT;\n }\n\n const tagName = parent.tagName.toLowerCase();\n if (\n tagName === \"script\" ||\n tagName === \"style\" ||\n tagName === \"noscript\"\n ) {\n return NodeFilter.FILTER_REJECT;\n }\n\n const style = window.getComputedStyle(parent);\n if (\n style.display === \"none\" ||\n style.visibility === \"hidden\" ||\n style.opacity === \"0\"\n ) {\n return NodeFilter.FILTER_REJECT;\n }\n\n const text = textNode.textContent?.trim();\n if (!text || text.length < MIN_NODE_TEXT_LENGTH) {\n return NodeFilter.FILTER_REJECT;\n }\n\n return NodeFilter.FILTER_ACCEPT;\n };\n\n const extractVisibleText = (): string => {\n const walker = document.createTreeWalker(\n document.body,\n NodeFilter.SHOW_TEXT,\n { acceptNode: acceptTextNode }\n );\n const parts: string[] = [];\n\n let current: Node | null = walker.nextNode();\n\n while (current) {\n const text = current.textContent?.trim();\n\n if (text && text.length >= MIN_NODE_TEXT_LENGTH) {\n parts.push(text);\n }\n\n current = walker.nextNode();\n }\n\n return parts.join(\" \");\n };\n\n const buildContextText = (\n title: string,\n url: string,\n description: string,\n content: string\n ): string => {\n const desc = description ? `Description: ${description}\\n` : \"\";\n\n return `Title: ${title}\\nURL: ${url}\\n${desc}Content: ${content.substring(0, MAX_CONTEXT_TEXT_LENGTH)}`;\n };\n\n const getPageMetadata = () => {\n const title = document.title || \"Untitled\";\n const url = window.location.href;\n const description =\n document\n .querySelector('meta[name=\"description\"]')\n ?.getAttribute(\"content\") || \"\";\n\n return { title, url, description };\n };\n\n const isSummaryMeaningful = (text: string | undefined) =>\n Boolean(text && text.length > MIN_SUMMARY_LENGTH);\n\n async function performSummaryFlow(nowTs: number) {\n const fullText = extractVisibleText();\n if (shouldSkipForLength(fullText)) {\n return;\n }\n\n const { title, url, description } = getPageMetadata();\n const contextualText = buildContextText(\n title,\n url,\n description,\n fullText\n );\n\n const summarizer = ai.summarizer;\n if (!summarizer) {\n return;\n }\n\n const session = await summarizer.create();\n const summary = await session.prompt(contextualText);\n if (!isSummaryMeaningful(summary)) {\n return;\n }\n\n ctx.span(\n \"plugin.ai.session_summary\",\n ctx.capture(\"session_summary\", {\n summary,\n pageTitle: title,\n pageUrl: url,\n contentLength: fullText.length,\n timestamp: nowTs,\n })\n );\n }\n\n const capturePageSummary = async () => {\n const nowTs = Date.now();\n if (isCapturing || nowTs - lastCaptureTime < MIN_CAPTURE_INTERVAL_MS) {\n return;\n }\n\n isCapturing = true;\n lastCaptureTime = nowTs;\n\n try {\n await performSummaryFlow(nowTs);\n } catch (error: unknown) {\n ctx.log.debug(\"Failed to capture AI session summary\", { error });\n } finally {\n isCapturing = false;\n }\n };\n\n // Set up observers for content changes and navigation\n const observer = new MutationObserver(() => {\n // Debounce captures\n if (!isCapturing) {\n setTimeout(capturePageSummary, DEBOUNCE_DELAY_MS);\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n characterData: false,\n attributes: false,\n });\n\n // Capture on significant events\n const handleVisibilityChange = () => {\n if (document.visibilityState === \"visible\") {\n capturePageSummary();\n }\n };\n\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n\n // Initial capture after a delay\n setTimeout(capturePageSummary, INITIAL_CAPTURE_DELAY_MS);\n\n // Return cleanup function\n return {\n key: \"aiSummary\",\n cleanup: () => {\n observer.disconnect();\n document.removeEventListener(\n \"visibilitychange\",\n handleVisibilityChange\n );\n },\n };\n }),\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Plugin } from "../../schemas.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/plugins/impl/errors.d.ts
|
|
4
|
+
type ErrorsAPI = {
|
|
5
|
+
captureError: (err: unknown, meta?: Record<string, unknown>) => void;
|
|
6
|
+
};
|
|
7
|
+
declare const _default: Plugin<"errors", unknown>;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { ErrorsAPI, _default as default };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.mts","names":[],"sources":["../../../../src/core/plugins/impl/errors.ts"],"sourcesContent":[],"mappings":";;;KAwEY,SAAA;sCAC0B;;AADtC,cAEE,QAFmB,EAEnB,MAD0C,CAAA,QAAA,EAAA,OAAA,CAAA"}
|