@interfere/react 0.1.0-alpha.5 → 0.2.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -0
- package/dist/error-boundary.d.mts +27 -0
- package/dist/error-boundary.d.mts.map +1 -0
- package/dist/error-boundary.mjs +42 -0
- package/dist/error-boundary.mjs.map +1 -0
- package/dist/internal/client.d.mts +13 -0
- package/dist/internal/client.d.mts.map +1 -0
- package/dist/internal/client.mjs +80 -0
- package/dist/internal/client.mjs.map +1 -0
- package/dist/internal/config.d.mts +9 -0
- package/dist/internal/config.d.mts.map +1 -0
- package/dist/internal/config.mjs +27 -0
- package/dist/internal/config.mjs.map +1 -0
- package/dist/internal/context.d.mts +6 -0
- package/dist/internal/context.d.mts.map +1 -0
- package/dist/internal/context.mjs +32 -0
- package/dist/internal/context.mjs.map +1 -0
- package/dist/internal/envelope.d.mts +14 -0
- package/dist/internal/envelope.d.mts.map +1 -0
- package/dist/internal/envelope.mjs +20 -0
- package/dist/internal/envelope.mjs.map +1 -0
- package/dist/internal/errors.d.mts +4 -0
- package/dist/internal/errors.d.mts.map +1 -0
- package/dist/internal/errors.mjs +4 -0
- package/dist/internal/errors.mjs.map +1 -0
- package/dist/internal/sw.d.mts +4 -0
- package/dist/internal/sw.d.mts.map +1 -0
- package/dist/internal/sw.mjs +10 -0
- package/dist/internal/sw.mjs.map +1 -0
- package/dist/plugins/errors.d.mts +6 -0
- package/dist/plugins/errors.d.mts.map +1 -0
- package/dist/plugins/errors.mjs +59 -0
- package/dist/plugins/errors.mjs.map +1 -0
- package/dist/plugins/lib/loader.d.mts +9 -0
- package/dist/plugins/lib/loader.d.mts.map +1 -0
- package/dist/plugins/lib/loader.mjs +47 -0
- package/dist/plugins/lib/loader.mjs.map +1 -0
- package/dist/plugins/lib/types.d.mts +14 -0
- package/dist/plugins/lib/types.d.mts.map +1 -0
- package/dist/plugins/lib/types.mjs +1 -0
- package/dist/plugins/pages.d.mts +6 -0
- package/dist/plugins/pages.d.mts.map +1 -0
- package/dist/plugins/pages.mjs +102 -0
- package/dist/plugins/pages.mjs.map +1 -0
- package/dist/plugins/rage-clicks.d.mts +6 -0
- package/dist/plugins/rage-clicks.d.mts.map +1 -0
- package/dist/plugins/rage-clicks.mjs +53 -0
- package/dist/plugins/rage-clicks.mjs.map +1 -0
- package/dist/plugins/replay.d.mts +6 -0
- package/dist/plugins/replay.d.mts.map +1 -0
- package/dist/plugins/replay.mjs +62 -0
- package/dist/plugins/replay.mjs.map +1 -0
- package/dist/provider.d.mts +17 -11
- package/dist/provider.d.mts.map +1 -1
- package/dist/provider.mjs +18 -17
- package/dist/provider.mjs.map +1 -1
- package/dist/tracking/api.d.mts +22 -0
- package/dist/tracking/api.d.mts.map +1 -0
- package/dist/tracking/api.mjs +88 -0
- package/dist/tracking/api.mjs.map +1 -0
- package/dist/tracking/session.d.mts +19 -0
- package/dist/tracking/session.d.mts.map +1 -0
- package/dist/tracking/session.mjs +92 -0
- package/dist/tracking/session.mjs.map +1 -0
- package/dist/tracking/visitor.d.mts +6 -0
- package/dist/tracking/visitor.d.mts.map +1 -0
- package/dist/tracking/visitor.mjs +35 -0
- package/dist/tracking/visitor.mjs.map +1 -0
- package/dist/transport/http.d.mts +15 -0
- package/dist/transport/http.d.mts.map +1 -0
- package/dist/transport/http.mjs +56 -0
- package/dist/transport/http.mjs.map +1 -0
- package/dist/transport/queue.d.mts +25 -0
- package/dist/transport/queue.d.mts.map +1 -0
- package/dist/transport/queue.mjs +60 -0
- package/dist/transport/queue.mjs.map +1 -0
- package/dist/util/log.d.mts +13 -0
- package/dist/util/log.d.mts.map +1 -0
- package/dist/util/log.mjs +37 -0
- package/dist/util/log.mjs.map +1 -0
- package/package.json +43 -66
- package/dist/client.d.mts +0 -15
- package/dist/client.d.mts.map +0 -1
- package/dist/client.mjs +0 -75
- package/dist/client.mjs.map +0 -1
- package/dist/core/events/event-registry.d.mts +0 -23
- package/dist/core/events/event-registry.d.mts.map +0 -1
- package/dist/core/events/event-registry.mjs +0 -32
- package/dist/core/events/event-registry.mjs.map +0 -1
- package/dist/core/events/plugin-event-types.d.mts +0 -92
- package/dist/core/events/plugin-event-types.d.mts.map +0 -1
- package/dist/core/events/plugin-event-types.mjs +0 -25
- package/dist/core/events/plugin-event-types.mjs.map +0 -1
- package/dist/core/plugins/dom-utils.d.mts +0 -9
- package/dist/core/plugins/dom-utils.d.mts.map +0 -1
- package/dist/core/plugins/dom-utils.mjs +0 -25
- package/dist/core/plugins/dom-utils.mjs.map +0 -1
- package/dist/core/plugins/impl/ai-summary.d.mts +0 -6
- package/dist/core/plugins/impl/ai-summary.d.mts.map +0 -1
- package/dist/core/plugins/impl/ai-summary.mjs +0 -122
- package/dist/core/plugins/impl/ai-summary.mjs.map +0 -1
- package/dist/core/plugins/impl/errors.d.mts +0 -9
- package/dist/core/plugins/impl/errors.d.mts.map +0 -1
- package/dist/core/plugins/impl/errors.mjs +0 -160
- package/dist/core/plugins/impl/errors.mjs.map +0 -1
- package/dist/core/plugins/impl/page-events.d.mts +0 -15
- package/dist/core/plugins/impl/page-events.d.mts.map +0 -1
- package/dist/core/plugins/impl/page-events.mjs +0 -131
- package/dist/core/plugins/impl/page-events.mjs.map +0 -1
- package/dist/core/plugins/impl/rage-click.d.mts +0 -6
- package/dist/core/plugins/impl/rage-click.d.mts.map +0 -1
- package/dist/core/plugins/impl/rage-click.mjs +0 -53
- package/dist/core/plugins/impl/rage-click.mjs.map +0 -1
- package/dist/core/plugins/impl/replay.d.mts +0 -9
- package/dist/core/plugins/impl/replay.d.mts.map +0 -1
- package/dist/core/plugins/impl/replay.mjs +0 -144
- package/dist/core/plugins/impl/replay.mjs.map +0 -1
- package/dist/core/plugins/impl/server-tracing.d.mts +0 -7
- package/dist/core/plugins/impl/server-tracing.d.mts.map +0 -1
- package/dist/core/plugins/impl/server-tracing.mjs +0 -160
- package/dist/core/plugins/impl/server-tracing.mjs.map +0 -1
- package/dist/core/plugins/plugin-event-system.d.mts +0 -47
- package/dist/core/plugins/plugin-event-system.d.mts.map +0 -1
- package/dist/core/plugins/plugin-event-system.mjs +0 -75
- package/dist/core/plugins/plugin-event-system.mjs.map +0 -1
- package/dist/core/plugins/plugin-loader.d.mts +0 -22
- package/dist/core/plugins/plugin-loader.d.mts.map +0 -1
- package/dist/core/plugins/plugin-loader.mjs +0 -142
- package/dist/core/plugins/plugin-loader.mjs.map +0 -1
- package/dist/core/runtime/config.d.mts +0 -14
- package/dist/core/runtime/config.d.mts.map +0 -1
- package/dist/core/runtime/config.mjs +0 -39
- package/dist/core/runtime/config.mjs.map +0 -1
- package/dist/core/runtime/context.d.mts +0 -25
- package/dist/core/runtime/context.d.mts.map +0 -1
- package/dist/core/runtime/context.mjs +0 -48
- package/dist/core/runtime/context.mjs.map +0 -1
- package/dist/core/runtime/ingest-target.d.mts +0 -10
- package/dist/core/runtime/ingest-target.d.mts.map +0 -1
- package/dist/core/runtime/ingest-target.mjs +0 -15
- package/dist/core/runtime/ingest-target.mjs.map +0 -1
- package/dist/core/runtime/native-fetch.d.mts +0 -32
- package/dist/core/runtime/native-fetch.d.mts.map +0 -1
- package/dist/core/runtime/native-fetch.mjs +0 -49
- package/dist/core/runtime/native-fetch.mjs.map +0 -1
- package/dist/core/schemas.d.mts +0 -85
- package/dist/core/schemas.d.mts.map +0 -1
- package/dist/core/schemas.mjs +0 -1
- package/dist/effect/build-envelope.d.mts +0 -9
- package/dist/effect/build-envelope.d.mts.map +0 -1
- package/dist/effect/build-envelope.mjs +0 -29
- package/dist/effect/build-envelope.mjs.map +0 -1
- package/dist/effect/errors.d.mts +0 -36
- package/dist/effect/errors.d.mts.map +0 -1
- package/dist/effect/errors.mjs +0 -10
- package/dist/effect/errors.mjs.map +0 -1
- package/dist/effect/layers/config.layer.d.mts +0 -13
- package/dist/effect/layers/config.layer.d.mts.map +0 -1
- package/dist/effect/layers/config.layer.mjs +0 -21
- package/dist/effect/layers/config.layer.mjs.map +0 -1
- package/dist/effect/layers/context.layer.d.mts +0 -12
- package/dist/effect/layers/context.layer.d.mts.map +0 -1
- package/dist/effect/layers/context.layer.mjs +0 -14
- package/dist/effect/layers/context.layer.mjs.map +0 -1
- package/dist/effect/layers/http.layer.d.mts +0 -21
- package/dist/effect/layers/http.layer.d.mts.map +0 -1
- package/dist/effect/layers/http.layer.mjs +0 -114
- package/dist/effect/layers/http.layer.mjs.map +0 -1
- package/dist/effect/layers/queue.layer.d.mts +0 -30
- package/dist/effect/layers/queue.layer.d.mts.map +0 -1
- package/dist/effect/layers/queue.layer.mjs +0 -258
- package/dist/effect/layers/queue.layer.mjs.map +0 -1
- package/dist/effect/layers/session.layer.d.mts +0 -26
- package/dist/effect/layers/session.layer.d.mts.map +0 -1
- package/dist/effect/layers/session.layer.mjs +0 -126
- package/dist/effect/layers/session.layer.mjs.map +0 -1
- package/dist/effect/layers/storage.layer.d.mts +0 -50
- package/dist/effect/layers/storage.layer.d.mts.map +0 -1
- package/dist/effect/layers/storage.layer.mjs +0 -180
- package/dist/effect/layers/storage.layer.mjs.map +0 -1
- package/dist/effect/layers/tracer.layer.d.mts +0 -9
- package/dist/effect/layers/tracer.layer.d.mts.map +0 -1
- package/dist/effect/layers/tracer.layer.mjs +0 -11
- package/dist/effect/layers/tracer.layer.mjs.map +0 -1
- package/dist/effect/runtime-services.d.mts +0 -22
- package/dist/effect/runtime-services.d.mts.map +0 -1
- package/dist/effect/runtime-services.mjs +0 -76
- package/dist/effect/runtime-services.mjs.map +0 -1
- package/dist/effect/tags.d.mts +0 -58
- package/dist/effect/tags.d.mts.map +0 -1
- package/dist/effect/tags.mjs +0 -7
- package/dist/effect/tags.mjs.map +0 -1
- package/dist/hooks/use-runtime-and-plugins.d.mts +0 -7
- package/dist/hooks/use-runtime-and-plugins.d.mts.map +0 -1
- package/dist/hooks/use-runtime-and-plugins.mjs +0 -153
- package/dist/hooks/use-runtime-and-plugins.mjs.map +0 -1
- package/dist/hooks/use-session.d.mts +0 -40
- package/dist/hooks/use-session.d.mts.map +0 -1
- package/dist/hooks/use-session.mjs +0 -96
- package/dist/hooks/use-session.mjs.map +0 -1
- package/dist/package.mjs +0 -100
- package/dist/package.mjs.map +0 -1
- package/dist/server/auth.d.mts +0 -11
- package/dist/server/auth.d.mts.map +0 -1
- package/dist/server/auth.mjs +0 -36
- package/dist/server/auth.mjs.map +0 -1
- package/dist/server/capture.d.mts +0 -18
- package/dist/server/capture.d.mts.map +0 -1
- package/dist/server/capture.mjs +0 -105
- package/dist/server/capture.mjs.map +0 -1
|
@@ -1,92 +0,0 @@
|
|
|
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
|
-
interface 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 };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-event-types.d.mts","names":[],"sources":["../../../src/core/events/plugin-event-types.ts"],"sourcesContent":[],"mappings":";;;;;KAoBK,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,UA8BR,kBA9BQ,CAAA,gBA+BP,CAAA,CAAE,OA/BK,CAAA,OAAA,CAAA,EAAA,SAgCd,CAAA,CAAE,KAhCY,CAgCN,OAhCM,CAAA,EAAA,UAiCb,MAjCa,CAAA,CAAA;EAEO,MAAA,EAiCtB,OAjCsB;EAAa,MAAA,EAAA,OAAA;EAAnB,SAAA,CAAA,EAAA,CAAA,KAAA,EAmCJ,MAnCI,EAAA,GAmCO,OAnCP"}
|
|
@@ -1,25 +0,0 @@
|
|
|
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 };
|
|
@@ -1 +0,0 @@
|
|
|
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\";\n\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 interface 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":";;;;;;;;AA4BA,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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
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 };
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
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 };
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ai-summary.d.mts","names":[],"sources":["../../../../src/core/plugins/impl/ai-summary.ts"],"sourcesContent":[],"mappings":""}
|
|
@@ -1,122 +0,0 @@
|
|
|
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 };
|
|
@@ -1 +0,0 @@
|
|
|
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\";\n\nimport { createEffectPlugin, defineEvent } from \"../plugin-event-system.js\";\n\ninterface BrowserAITextSession {\n prompt: (input: string) => Promise<string>;\n}\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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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { Plugin } from "../../schemas.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/core/plugins/impl/errors.d.ts
|
|
4
|
-
interface 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 };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.mts","names":[],"sources":["../../../../src/core/plugins/impl/errors.ts"],"sourcesContent":[],"mappings":";;;UA2EiB,SAAA;sCACqB;;AADtC,cAEC,QAFyB,EAEzB,MAD2C,CAAA,QAAA,EAAA,OAAA,CAAA"}
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import { isInterfereInternalError } from "../../runtime/native-fetch.mjs";
|
|
2
|
-
import { createEffectPlugin, defineEvent } from "../plugin-event-system.mjs";
|
|
3
|
-
import { Effect } from "effect";
|
|
4
|
-
|
|
5
|
-
//#region src/core/plugins/impl/errors.ts
|
|
6
|
-
const STACK_TRACE_REGEX = /at\s+(?:(.+?)\s+\()?(.+?):(\d+):(\d+)\)?/;
|
|
7
|
-
function parseStackTrace(stack) {
|
|
8
|
-
if (!stack) return [];
|
|
9
|
-
const lines = stack.split("\n");
|
|
10
|
-
const frames = [];
|
|
11
|
-
for (const line of lines) {
|
|
12
|
-
const match = line.match(STACK_TRACE_REGEX);
|
|
13
|
-
if (match) frames.push({
|
|
14
|
-
file: { reported: match[2] || null },
|
|
15
|
-
line: { reported: match[3] ? Number.parseInt(match[3], 10) : null },
|
|
16
|
-
column: { reported: match[4] ? Number.parseInt(match[4], 10) : null },
|
|
17
|
-
fn: { reported: match[1] || null }
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
return frames.length > 0 ? frames : [{
|
|
21
|
-
file: { reported: null },
|
|
22
|
-
line: { reported: null },
|
|
23
|
-
column: { reported: null },
|
|
24
|
-
fn: { reported: null }
|
|
25
|
-
}];
|
|
26
|
-
}
|
|
27
|
-
function buildErrorPayload(error) {
|
|
28
|
-
return {
|
|
29
|
-
frames: error.stack ? parseStackTrace(error.stack) : [{
|
|
30
|
-
file: { reported: error.filename || null },
|
|
31
|
-
line: { reported: error.lineno || null },
|
|
32
|
-
column: { reported: error.colno || null },
|
|
33
|
-
fn: { reported: null }
|
|
34
|
-
}],
|
|
35
|
-
message: error.message || null,
|
|
36
|
-
name: error.name || null,
|
|
37
|
-
stack: error.stack || null,
|
|
38
|
-
errorSource: "client"
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
var errors_default = createEffectPlugin("errors", {
|
|
42
|
-
name: "errors",
|
|
43
|
-
events: [defineEvent("error").value()],
|
|
44
|
-
setup: (ctx) => Effect.gen(function* () {
|
|
45
|
-
if (typeof window === "undefined") {
|
|
46
|
-
ctx.log.debug("errors: SSR - skipping setup");
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
const recent = /* @__PURE__ */ new Set();
|
|
50
|
-
const DEDUPE_TTL_MS = 2e3;
|
|
51
|
-
const STACK_PREFIX_SLICE = 120;
|
|
52
|
-
const makeKey = (input) => `${input.name ?? ""}|${input.message ?? ""}|${input.stack?.slice(0, STACK_PREFIX_SLICE) ?? ""}`;
|
|
53
|
-
const recordOnce = (payload, span) => {
|
|
54
|
-
const key = makeKey(payload);
|
|
55
|
-
if (recent.has(key)) return;
|
|
56
|
-
recent.add(key);
|
|
57
|
-
setTimeout(() => recent.delete(key), DEDUPE_TTL_MS);
|
|
58
|
-
ctx.span(span, ctx.capture("error", payload));
|
|
59
|
-
};
|
|
60
|
-
const api = { captureError: (err, meta) => {
|
|
61
|
-
if (isInterfereInternalError(err)) return;
|
|
62
|
-
const payload = buildErrorPayload(err instanceof Error ? {
|
|
63
|
-
message: err.message,
|
|
64
|
-
stack: err.stack,
|
|
65
|
-
name: err.name
|
|
66
|
-
} : {
|
|
67
|
-
message: String(err),
|
|
68
|
-
name: "UnknownError"
|
|
69
|
-
});
|
|
70
|
-
recordOnce(meta ? {
|
|
71
|
-
...payload,
|
|
72
|
-
...meta
|
|
73
|
-
} : payload, "plugin.error.capture");
|
|
74
|
-
} };
|
|
75
|
-
const errorHandler = (event) => {
|
|
76
|
-
if (isInterfereInternalError(event.error)) return;
|
|
77
|
-
recordOnce(buildErrorPayload({
|
|
78
|
-
message: event.message,
|
|
79
|
-
stack: event.error?.stack,
|
|
80
|
-
filename: event.filename,
|
|
81
|
-
lineno: event.lineno,
|
|
82
|
-
colno: event.colno,
|
|
83
|
-
name: event.error?.name
|
|
84
|
-
}), "plugin.error.window");
|
|
85
|
-
};
|
|
86
|
-
const rejectionHandler = (event) => {
|
|
87
|
-
const reason = event.reason;
|
|
88
|
-
if (isInterfereInternalError(reason)) return;
|
|
89
|
-
recordOnce(buildErrorPayload(reason instanceof Error ? {
|
|
90
|
-
message: `Unhandled Promise Rejection: ${reason.message}`,
|
|
91
|
-
stack: reason.stack,
|
|
92
|
-
name: reason.name
|
|
93
|
-
} : {
|
|
94
|
-
message: `Unhandled Promise Rejection: ${String(reason)}`,
|
|
95
|
-
name: "UnhandledRejection"
|
|
96
|
-
}), "plugin.error.rejection");
|
|
97
|
-
};
|
|
98
|
-
const originalFetch = window.fetch.bind(window);
|
|
99
|
-
const patchedFetch = (...args) => originalFetch(...args).catch((err) => {
|
|
100
|
-
if (isInterfereInternalError(err)) throw err;
|
|
101
|
-
recordOnce(buildErrorPayload(err instanceof Error ? {
|
|
102
|
-
message: `Fetch failed: ${err.message}`,
|
|
103
|
-
stack: err.stack,
|
|
104
|
-
name: err.name
|
|
105
|
-
} : {
|
|
106
|
-
message: `Fetch failed: ${String(err)}`,
|
|
107
|
-
name: "FetchError"
|
|
108
|
-
}), "plugin.error.fetch");
|
|
109
|
-
throw err;
|
|
110
|
-
});
|
|
111
|
-
window.fetch = patchedFetch;
|
|
112
|
-
let inConsoleCapture = false;
|
|
113
|
-
const originalConsoleError = console.error.bind(console);
|
|
114
|
-
console.error = (...args) => {
|
|
115
|
-
try {
|
|
116
|
-
originalConsoleError(...args);
|
|
117
|
-
} finally {
|
|
118
|
-
if (!inConsoleCapture) {
|
|
119
|
-
inConsoleCapture = true;
|
|
120
|
-
try {
|
|
121
|
-
const firstError = args.find((a) => a instanceof Error);
|
|
122
|
-
if (!(firstError && isInterfereInternalError(firstError))) {
|
|
123
|
-
const toStringSafe = (a) => {
|
|
124
|
-
if (typeof a === "string") return a;
|
|
125
|
-
if (a instanceof Error) return a.message;
|
|
126
|
-
try {
|
|
127
|
-
return JSON.stringify(a);
|
|
128
|
-
} catch {
|
|
129
|
-
return String(a);
|
|
130
|
-
}
|
|
131
|
-
};
|
|
132
|
-
recordOnce(buildErrorPayload({
|
|
133
|
-
message: args.map(toStringSafe).join(" "),
|
|
134
|
-
name: firstError?.name ?? "ConsoleError",
|
|
135
|
-
stack: firstError?.stack
|
|
136
|
-
}), "plugin.error.console_error");
|
|
137
|
-
}
|
|
138
|
-
} finally {
|
|
139
|
-
inConsoleCapture = false;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
};
|
|
144
|
-
window.addEventListener("error", errorHandler, { capture: true });
|
|
145
|
-
window.addEventListener("unhandledrejection", rejectionHandler);
|
|
146
|
-
return {
|
|
147
|
-
key: "errors",
|
|
148
|
-
api,
|
|
149
|
-
cleanup: () => {
|
|
150
|
-
window.removeEventListener("error", errorHandler, { capture: true });
|
|
151
|
-
window.removeEventListener("unhandledrejection", rejectionHandler);
|
|
152
|
-
window.fetch = originalFetch;
|
|
153
|
-
console.error = originalConsoleError;
|
|
154
|
-
}
|
|
155
|
-
};
|
|
156
|
-
})
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
//#endregion
|
|
160
|
-
export { errors_default as default };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.mjs","names":["frames: IngestedFrame[]","api: ErrorsAPI","originalFetch: typeof window.fetch","patchedFetch: typeof window.fetch","originalConsoleError: typeof console.error"],"sources":["../../../../src/core/plugins/impl/errors.ts"],"sourcesContent":["import type { IngestedFrame } from \"@interfere/types/data/frame\";\nimport type { ErrorEnvelopePayload } from \"@interfere/types/sdk/plugins/payload/errors\";\n\nimport { Effect } from \"effect\";\n\nimport { isInterfereInternalError } from \"../../runtime/native-fetch.js\";\nimport { createEffectPlugin, defineEvent } from \"../plugin-event-system.js\";\n\n// Regex defined at top level for performance\nconst STACK_TRACE_REGEX = /at\\s+(?:(.+?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?/;\n\nfunction parseStackTrace(stack?: string): IngestedFrame[] {\n if (!stack) {\n return [];\n }\n\n // Basic stack trace parsing - can be enhanced with error-stack-parser library\n const lines = stack.split(\"\\n\");\n const frames: IngestedFrame[] = [];\n\n for (const line of lines) {\n // Match patterns like: \"at functionName (file:line:column)\" or \"at file:line:column\"\n const match = line.match(STACK_TRACE_REGEX);\n\n if (match) {\n frames.push({\n file: { reported: match[2] || null },\n line: { reported: match[3] ? Number.parseInt(match[3], 10) : null },\n column: { reported: match[4] ? Number.parseInt(match[4], 10) : null },\n fn: { reported: match[1] || null },\n });\n }\n }\n\n return frames.length > 0\n ? frames\n : [\n // Fallback frame if we can't parse the stack\n {\n file: { reported: null },\n line: { reported: null },\n column: { reported: null },\n fn: { reported: null },\n },\n ];\n}\n\nfunction buildErrorPayload(error: {\n message?: string;\n name?: string;\n stack?: string;\n filename?: string;\n lineno?: number;\n colno?: number;\n}): ErrorEnvelopePayload {\n const frames = error.stack\n ? parseStackTrace(error.stack)\n : [\n {\n file: { reported: error.filename || null },\n line: { reported: error.lineno || null },\n column: { reported: error.colno || null },\n fn: { reported: null },\n },\n ];\n\n return {\n frames,\n message: error.message || null,\n name: error.name || null,\n stack: error.stack || null,\n errorSource: \"client\",\n };\n}\n\nexport interface ErrorsAPI {\n captureError: (err: unknown, meta?: Record<string, unknown>) => void;\n}\n\nexport default createEffectPlugin(\"errors\", {\n name: \"errors\",\n events: [defineEvent(\"error\").value()],\n setup: (ctx) =>\n Effect.gen(function* () {\n if (typeof window === \"undefined\") {\n ctx.log.debug(\"errors: SSR - skipping setup\");\n return;\n }\n\n // Simple in-memory de-dupe to avoid double reports from multiple hooks\n const recent = new Set<string>();\n\n const DEDUPE_TTL_MS = 2000;\n const STACK_PREFIX_SLICE = 120;\n\n const makeKey = (input: {\n message?: string | null;\n stack?: string | null;\n name?: string | null;\n }) =>\n `${input.name ?? \"\"}|${input.message ?? \"\"}|${input.stack?.slice(0, STACK_PREFIX_SLICE) ?? \"\"}`;\n\n const recordOnce = (\n payload: ReturnType<typeof buildErrorPayload>,\n span: string\n ) => {\n const key = makeKey(payload);\n\n if (recent.has(key)) {\n return;\n }\n\n recent.add(key);\n\n setTimeout(() => recent.delete(key), DEDUPE_TTL_MS);\n\n ctx.span(span, ctx.capture(\"error\", payload));\n };\n\n const api: ErrorsAPI = {\n captureError: (err: unknown, meta?: Record<string, unknown>) => {\n // Skip SDK-internal errors to prevent infinite recursion\n if (isInterfereInternalError(err)) {\n return;\n }\n\n const errorInfo =\n err instanceof Error\n ? { message: err.message, stack: err.stack, name: err.name }\n : { message: String(err), name: \"UnknownError\" };\n\n const payload = buildErrorPayload(errorInfo);\n recordOnce(\n (meta\n ? ({ ...payload, ...meta } as unknown)\n : payload) as ErrorEnvelopePayload,\n \"plugin.error.capture\"\n );\n },\n };\n\n const errorHandler = (event: ErrorEvent) => {\n // Skip SDK-internal errors to prevent infinite recursion\n if (isInterfereInternalError(event.error)) {\n return;\n }\n\n const payload = buildErrorPayload({\n message: event.message,\n stack: event.error?.stack,\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n name: event.error?.name,\n });\n\n recordOnce(payload, \"plugin.error.window\");\n };\n\n const rejectionHandler = (event: PromiseRejectionEvent) => {\n const reason = event.reason;\n\n // Skip SDK-internal errors to prevent infinite recursion\n if (isInterfereInternalError(reason)) {\n return;\n }\n\n const payload = buildErrorPayload(\n reason instanceof Error\n ? {\n message: `Unhandled Promise Rejection: ${reason.message}`,\n stack: reason.stack,\n name: reason.name,\n }\n : {\n message: `Unhandled Promise Rejection: ${String(reason)}`,\n name: \"UnhandledRejection\",\n }\n );\n\n recordOnce(payload, \"plugin.error.rejection\");\n };\n\n // Network errors: patch fetch to capture rejected requests\n const originalFetch: typeof window.fetch = window.fetch.bind(window);\n\n const patchedFetch: typeof window.fetch = (...args) =>\n originalFetch(...args).catch((err: unknown) => {\n // Skip SDK-internal errors to prevent infinite recursion\n // This is a secondary safety net; the primary protection is that\n // the HTTP layer uses nativeFetch which bypasses this wrapper entirely.\n if (isInterfereInternalError(err)) {\n throw err;\n }\n\n const errorInfo =\n err instanceof Error\n ? {\n message: `Fetch failed: ${err.message}`,\n stack: err.stack,\n name: err.name,\n }\n : { message: `Fetch failed: ${String(err)}`, name: \"FetchError\" };\n const payload = buildErrorPayload(errorInfo);\n recordOnce(payload, \"plugin.error.fetch\");\n throw err;\n });\n\n window.fetch = patchedFetch;\n\n let inConsoleCapture = false;\n\n const originalConsoleError: typeof console.error =\n console.error.bind(console);\n\n console.error = (...args: unknown[]) => {\n try {\n originalConsoleError(...(args as Parameters<typeof console.error>));\n } finally {\n if (!inConsoleCapture) {\n inConsoleCapture = true;\n try {\n const firstError = args.find(\n (a): a is Error => a instanceof Error\n );\n\n // Skip SDK-internal errors to prevent infinite recursion\n const isInternalError =\n firstError && isInterfereInternalError(firstError);\n\n if (!isInternalError) {\n const toStringSafe = (a: unknown): string => {\n if (typeof a === \"string\") {\n return a;\n }\n if (a instanceof Error) {\n return a.message;\n }\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n };\n const message = args.map(toStringSafe).join(\" \");\n\n const payload = buildErrorPayload({\n message,\n name: firstError?.name ?? \"ConsoleError\",\n stack: firstError?.stack,\n });\n\n recordOnce(payload, \"plugin.error.console_error\");\n }\n } finally {\n inConsoleCapture = false;\n }\n }\n }\n };\n\n window.addEventListener(\"error\", errorHandler, {\n capture: true,\n });\n\n window.addEventListener(\"unhandledrejection\", rejectionHandler);\n\n return {\n key: \"errors\",\n api,\n cleanup: () => {\n window.removeEventListener(\"error\", errorHandler, {\n capture: true,\n } as EventListenerOptions);\n\n window.removeEventListener(\"unhandledrejection\", rejectionHandler);\n\n window.fetch = originalFetch;\n console.error = originalConsoleError as typeof console.error;\n },\n };\n }),\n});\n"],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { Plugin } from "../../schemas.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/core/plugins/impl/page-events.d.ts
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Page Events Plugin
|
|
7
|
-
*
|
|
8
|
-
* Handles tracking of page navigation and UI interaction events:
|
|
9
|
-
* - pageview: When a user views a page
|
|
10
|
-
* - pageleave: When a user leaves a page
|
|
11
|
-
* - ui_event: General UI interaction events (clicks, form submits, etc.)
|
|
12
|
-
*/
|
|
13
|
-
declare const _default: Plugin<"pageEvents", unknown>;
|
|
14
|
-
//#endregion
|
|
15
|
-
export { _default as default };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"page-events.d.mts","names":[],"sources":["../../../../src/core/plugins/impl/page-events.ts"],"sourcesContent":[],"mappings":""}
|