@interfere/react 0.1.0-alpha.6 → 0.2.0-alpha.2
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 +38 -64
- package/dist/client.d.mts +0 -8
- package/dist/client.d.mts.map +0 -1
- package/dist/client.mjs +0 -14
- package/dist/client.mjs.map +0 -1
- package/dist/core/events/define-event.d.mts +0 -12
- package/dist/core/events/define-event.d.mts.map +0 -1
- package/dist/core/events/define-event.mjs +0 -39
- package/dist/core/events/define-event.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 -130
- 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/define-plugin.d.mts +0 -43
- package/dist/core/plugins/define-plugin.d.mts.map +0 -1
- package/dist/core/plugins/define-plugin.mjs +0 -23
- package/dist/core/plugins/define-plugin.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/ai-summary-plugin-api.d.mts +0 -18
- package/dist/core/plugins/impl/ai-summary/ai-summary-plugin-api.d.mts.map +0 -1
- package/dist/core/plugins/impl/ai-summary/ai-summary-plugin-api.mjs +0 -17
- package/dist/core/plugins/impl/ai-summary/ai-summary-plugin-api.mjs.map +0 -1
- package/dist/core/plugins/impl/ai-summary/plugin.d.mts +0 -6
- package/dist/core/plugins/impl/ai-summary/plugin.d.mts.map +0 -1
- package/dist/core/plugins/impl/ai-summary/plugin.mjs +0 -151
- package/dist/core/plugins/impl/ai-summary/plugin.mjs.map +0 -1
- package/dist/core/plugins/impl/errors/errors-plugin-api.d.mts +0 -17
- package/dist/core/plugins/impl/errors/errors-plugin-api.d.mts.map +0 -1
- package/dist/core/plugins/impl/errors/errors-plugin-api.mjs +0 -58
- package/dist/core/plugins/impl/errors/errors-plugin-api.mjs.map +0 -1
- package/dist/core/plugins/impl/errors/logic.d.mts +0 -15
- package/dist/core/plugins/impl/errors/logic.d.mts.map +0 -1
- package/dist/core/plugins/impl/errors/logic.mjs +0 -48
- package/dist/core/plugins/impl/errors/logic.mjs.map +0 -1
- package/dist/core/plugins/impl/errors/patches.d.mts +0 -13
- package/dist/core/plugins/impl/errors/patches.d.mts.map +0 -1
- package/dist/core/plugins/impl/errors/patches.mjs +0 -43
- package/dist/core/plugins/impl/errors/patches.mjs.map +0 -1
- package/dist/core/plugins/impl/errors/plugin.d.mts +0 -9
- package/dist/core/plugins/impl/errors/plugin.d.mts.map +0 -1
- package/dist/core/plugins/impl/errors/plugin.mjs +0 -91
- package/dist/core/plugins/impl/errors/plugin.mjs.map +0 -1
- package/dist/core/plugins/impl/page-events/page-events-plugin-api.d.mts +0 -19
- package/dist/core/plugins/impl/page-events/page-events-plugin-api.d.mts.map +0 -1
- package/dist/core/plugins/impl/page-events/page-events-plugin-api.mjs +0 -38
- package/dist/core/plugins/impl/page-events/page-events-plugin-api.mjs.map +0 -1
- package/dist/core/plugins/impl/page-events/plugin.d.mts +0 -6
- package/dist/core/plugins/impl/page-events/plugin.d.mts.map +0 -1
- package/dist/core/plugins/impl/page-events/plugin.mjs +0 -95
- package/dist/core/plugins/impl/page-events/plugin.mjs.map +0 -1
- package/dist/core/plugins/impl/rage-click/plugin.d.mts +0 -6
- package/dist/core/plugins/impl/rage-click/plugin.d.mts.map +0 -1
- package/dist/core/plugins/impl/rage-click/plugin.mjs +0 -38
- package/dist/core/plugins/impl/rage-click/plugin.mjs.map +0 -1
- package/dist/core/plugins/impl/rage-click/rage-click.layer.d.mts +0 -9
- package/dist/core/plugins/impl/rage-click/rage-click.layer.d.mts.map +0 -1
- package/dist/core/plugins/impl/rage-click/rage-click.layer.mjs +0 -35
- package/dist/core/plugins/impl/rage-click/rage-click.layer.mjs.map +0 -1
- package/dist/core/plugins/impl/rage-click/rage-click.service.d.mts +0 -16
- package/dist/core/plugins/impl/rage-click/rage-click.service.d.mts.map +0 -1
- package/dist/core/plugins/impl/rage-click/rage-click.service.mjs +0 -7
- package/dist/core/plugins/impl/rage-click/rage-click.service.mjs.map +0 -1
- package/dist/core/plugins/impl/rage-click/rage-click.test-layer.d.mts +0 -16
- package/dist/core/plugins/impl/rage-click/rage-click.test-layer.d.mts.map +0 -1
- package/dist/core/plugins/impl/rage-click/rage-click.test-layer.mjs +0 -18
- package/dist/core/plugins/impl/rage-click/rage-click.test-layer.mjs.map +0 -1
- package/dist/core/plugins/impl/replay/plugin.d.mts +0 -9
- package/dist/core/plugins/impl/replay/plugin.d.mts.map +0 -1
- package/dist/core/plugins/impl/replay/plugin.mjs +0 -83
- package/dist/core/plugins/impl/replay/plugin.mjs.map +0 -1
- package/dist/core/plugins/impl/replay/replay-plugin-api.d.mts +0 -18
- package/dist/core/plugins/impl/replay/replay-plugin-api.d.mts.map +0 -1
- package/dist/core/plugins/impl/replay/replay-plugin-api.mjs +0 -50
- package/dist/core/plugins/impl/replay/replay-plugin-api.mjs.map +0 -1
- package/dist/core/plugins/impl/server-tracing/plugin.d.mts +0 -13
- package/dist/core/plugins/impl/server-tracing/plugin.d.mts.map +0 -1
- package/dist/core/plugins/impl/server-tracing/plugin.mjs +0 -75
- package/dist/core/plugins/impl/server-tracing/plugin.mjs.map +0 -1
- package/dist/core/plugins/impl/server-tracing/server-tracing-plugin-api.d.mts +0 -16
- package/dist/core/plugins/impl/server-tracing/server-tracing-plugin-api.d.mts.map +0 -1
- package/dist/core/plugins/impl/server-tracing/server-tracing-plugin-api.mjs +0 -17
- package/dist/core/plugins/impl/server-tracing/server-tracing-plugin-api.mjs.map +0 -1
- package/dist/core/plugins/impl/server-tracing/tracing-logic.d.mts +0 -29
- package/dist/core/plugins/impl/server-tracing/tracing-logic.d.mts.map +0 -1
- package/dist/core/plugins/impl/server-tracing/tracing-logic.mjs +0 -55
- package/dist/core/plugins/impl/server-tracing/tracing-logic.mjs.map +0 -1
- package/dist/core/plugins/plugin-loader.d.mts +0 -75
- package/dist/core/plugins/plugin-loader.d.mts.map +0 -1
- package/dist/core/plugins/plugin-loader.mjs +0 -79
- package/dist/core/plugins/plugin-loader.mjs.map +0 -1
- package/dist/core/plugins/services/event-capture.d.mts +0 -12
- package/dist/core/plugins/services/event-capture.d.mts.map +0 -1
- package/dist/core/plugins/services/event-capture.layer.d.mts +0 -11
- package/dist/core/plugins/services/event-capture.layer.d.mts.map +0 -1
- package/dist/core/plugins/services/event-capture.layer.mjs +0 -79
- package/dist/core/plugins/services/event-capture.layer.mjs.map +0 -1
- package/dist/core/plugins/services/event-capture.mjs +0 -7
- package/dist/core/plugins/services/event-capture.mjs.map +0 -1
- package/dist/core/plugins/services/event-capture.test-layer.d.mts +0 -17
- package/dist/core/plugins/services/event-capture.test-layer.d.mts.map +0 -1
- package/dist/core/plugins/services/event-capture.test-layer.mjs +0 -21
- package/dist/core/plugins/services/event-capture.test-layer.mjs.map +0 -1
- package/dist/core/plugins/services/plugin-config.d.mts +0 -11
- package/dist/core/plugins/services/plugin-config.d.mts.map +0 -1
- package/dist/core/plugins/services/plugin-config.mjs +0 -7
- package/dist/core/plugins/services/plugin-config.mjs.map +0 -1
- package/dist/core/plugins/services/plugin-config.test-layer.d.mts +0 -60
- package/dist/core/plugins/services/plugin-config.test-layer.d.mts.map +0 -1
- package/dist/core/plugins/services/plugin-config.test-layer.mjs +0 -8
- package/dist/core/plugins/services/plugin-config.test-layer.mjs.map +0 -1
- package/dist/core/plugins/services/plugin-logger.d.mts +0 -14
- package/dist/core/plugins/services/plugin-logger.d.mts.map +0 -1
- package/dist/core/plugins/services/plugin-logger.mjs +0 -7
- package/dist/core/plugins/services/plugin-logger.mjs.map +0 -1
- package/dist/core/plugins/services/plugin-logger.test-layer.d.mts +0 -18
- package/dist/core/plugins/services/plugin-logger.test-layer.d.mts.map +0 -1
- package/dist/core/plugins/services/plugin-logger.test-layer.mjs +0 -28
- package/dist/core/plugins/services/plugin-logger.test-layer.mjs.map +0 -1
- package/dist/core/plugins/services/plugin-runtime.d.mts +0 -10
- package/dist/core/plugins/services/plugin-runtime.d.mts.map +0 -1
- package/dist/core/plugins/services/plugin-runtime.mjs +0 -7
- package/dist/core/plugins/services/plugin-runtime.mjs.map +0 -1
- package/dist/core/plugins/services/plugin-runtime.test-layer.d.mts +0 -16
- package/dist/core/plugins/services/plugin-runtime.test-layer.d.mts.map +0 -1
- package/dist/core/plugins/services/plugin-runtime.test-layer.mjs +0 -21
- package/dist/core/plugins/services/plugin-runtime.test-layer.mjs.map +0 -1
- package/dist/core/plugins/services/session-info.d.mts +0 -11
- package/dist/core/plugins/services/session-info.d.mts.map +0 -1
- package/dist/core/plugins/services/session-info.mjs +0 -7
- package/dist/core/plugins/services/session-info.mjs.map +0 -1
- package/dist/core/plugins/services/session-info.test-layer.d.mts +0 -18
- package/dist/core/plugins/services/session-info.test-layer.d.mts.map +0 -1
- package/dist/core/plugins/services/session-info.test-layer.mjs +0 -20
- package/dist/core/plugins/services/session-info.test-layer.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 -33
- package/dist/core/runtime/config.mjs.map +0 -1
- package/dist/core/runtime/context.d.mts +0 -50
- package/dist/core/runtime/context.d.mts.map +0 -1
- package/dist/core/runtime/context.mjs +0 -46
- 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 -26
- package/dist/core/schemas.d.mts.map +0 -1
- package/dist/core/schemas.mjs +0 -1
- package/dist/effect/errors.d.mts +0 -22
- package/dist/effect/errors.d.mts.map +0 -1
- package/dist/effect/errors.mjs +0 -17
- package/dist/effect/errors.mjs.map +0 -1
- package/dist/effect/layers/circuit-breaker.layer.d.mts +0 -9
- package/dist/effect/layers/circuit-breaker.layer.d.mts.map +0 -1
- package/dist/effect/layers/circuit-breaker.layer.mjs +0 -9
- package/dist/effect/layers/circuit-breaker.layer.mjs.map +0 -1
- package/dist/effect/layers/circuit-breaker.layer.test-layer.d.mts +0 -18
- package/dist/effect/layers/circuit-breaker.layer.test-layer.d.mts.map +0 -1
- package/dist/effect/layers/circuit-breaker.layer.test-layer.mjs +0 -43
- package/dist/effect/layers/circuit-breaker.layer.test-layer.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 -118
- package/dist/effect/layers/http.layer.mjs.map +0 -1
- package/dist/effect/layers/queue.layer.d.mts +0 -31
- package/dist/effect/layers/queue.layer.d.mts.map +0 -1
- package/dist/effect/layers/queue.layer.mjs +0 -257
- package/dist/effect/layers/queue.layer.mjs.map +0 -1
- package/dist/effect/layers/queue.layer.test-layer.d.mts +0 -19
- package/dist/effect/layers/queue.layer.test-layer.d.mts.map +0 -1
- package/dist/effect/layers/queue.layer.test-layer.mjs +0 -44
- package/dist/effect/layers/queue.layer.test-layer.mjs.map +0 -1
- package/dist/effect/layers/session.layer.d.mts +0 -34
- package/dist/effect/layers/session.layer.d.mts.map +0 -1
- package/dist/effect/layers/session.layer.mjs +0 -127
- 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/test-utils.d.mts +0 -19
- package/dist/effect/layers/test-utils.d.mts.map +0 -1
- package/dist/effect/layers/test-utils.mjs +0 -32
- package/dist/effect/layers/test-utils.mjs.map +0 -1
- package/dist/effect/runtime-services.d.mts +0 -23
- package/dist/effect/runtime-services.d.mts.map +0 -1
- package/dist/effect/runtime-services.mjs +0 -79
- 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 -121
- 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 -103
- package/dist/package.mjs.map +0 -1
- package/dist/server/auth.d.mts +0 -15
- package/dist/server/auth.d.mts.map +0 -1
- package/dist/server/auth.mjs +0 -45
- package/dist/server/auth.mjs.map +0 -1
- package/dist/server/capture.d.mts +0 -34
- package/dist/server/capture.d.mts.map +0 -1
- package/dist/server/capture.mjs +0 -172
- package/dist/server/capture.mjs.map +0 -1
|
@@ -1,130 +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 extends PluginKey> = Extract<PluginRegistrationInManifest, {
|
|
8
|
-
name: K;
|
|
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
|
-
mechanism: z.ZodOptional<z.ZodObject<{
|
|
35
|
-
type: z.ZodString;
|
|
36
|
-
handled: z.ZodBoolean;
|
|
37
|
-
synthetic: z.ZodOptional<z.ZodBoolean>;
|
|
38
|
-
}, z.core.$strip>>;
|
|
39
|
-
nextjs: z.ZodOptional<z.ZodObject<{
|
|
40
|
-
routerKind: z.ZodOptional<z.ZodEnum<{
|
|
41
|
-
"Pages Router": "Pages Router";
|
|
42
|
-
"App Router": "App Router";
|
|
43
|
-
}>>;
|
|
44
|
-
routePath: z.ZodOptional<z.ZodString>;
|
|
45
|
-
routeType: z.ZodOptional<z.ZodEnum<{
|
|
46
|
-
render: "render";
|
|
47
|
-
route: "route";
|
|
48
|
-
action: "action";
|
|
49
|
-
middleware: "middleware";
|
|
50
|
-
proxy: "proxy";
|
|
51
|
-
}>>;
|
|
52
|
-
renderSource: z.ZodOptional<z.ZodEnum<{
|
|
53
|
-
"react-server-components": "react-server-components";
|
|
54
|
-
"react-server-components-payload": "react-server-components-payload";
|
|
55
|
-
"server-rendering": "server-rendering";
|
|
56
|
-
}>>;
|
|
57
|
-
revalidateReason: z.ZodOptional<z.ZodEnum<{
|
|
58
|
-
"on-demand": "on-demand";
|
|
59
|
-
stale: "stale";
|
|
60
|
-
}>>;
|
|
61
|
-
renderType: z.ZodOptional<z.ZodEnum<{
|
|
62
|
-
dynamic: "dynamic";
|
|
63
|
-
"dynamic-resume": "dynamic-resume";
|
|
64
|
-
}>>;
|
|
65
|
-
requestPath: z.ZodOptional<z.ZodString>;
|
|
66
|
-
requestMethod: z.ZodOptional<z.ZodString>;
|
|
67
|
-
errorDigest: z.ZodOptional<z.ZodString>;
|
|
68
|
-
}, z.core.$strip>>;
|
|
69
|
-
captureSource: z.ZodOptional<z.ZodString>;
|
|
70
|
-
}, z.core.$strip>;
|
|
71
|
-
readonly rage_click: z.ZodObject<{
|
|
72
|
-
count: z.ZodNumber;
|
|
73
|
-
timeWindow: z.ZodNumber;
|
|
74
|
-
selector: z.ZodString;
|
|
75
|
-
text: z.ZodString;
|
|
76
|
-
x: z.ZodNumber;
|
|
77
|
-
y: z.ZodNumber;
|
|
78
|
-
timestamp: z.ZodNumber;
|
|
79
|
-
}, z.core.$strip>;
|
|
80
|
-
readonly ui_event: z.ZodObject<{
|
|
81
|
-
event: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
82
|
-
}, z.core.$strip>;
|
|
83
|
-
readonly replay_chunk: z.ZodObject<{
|
|
84
|
-
ts: z.ZodNumber;
|
|
85
|
-
count: z.ZodNumber;
|
|
86
|
-
events: z.ZodArray<z.ZodString>;
|
|
87
|
-
first_event_ts: z.ZodOptional<z.ZodNumber>;
|
|
88
|
-
last_event_ts: z.ZodOptional<z.ZodNumber>;
|
|
89
|
-
}, z.core.$strip>;
|
|
90
|
-
readonly session_summary: z.ZodObject<{
|
|
91
|
-
summary: z.ZodString;
|
|
92
|
-
pageTitle: z.ZodString;
|
|
93
|
-
pageUrl: z.ZodURL;
|
|
94
|
-
contentLength: z.ZodNumber;
|
|
95
|
-
timestamp: z.ZodNumber;
|
|
96
|
-
}, z.core.$strip>;
|
|
97
|
-
readonly pageview: z.ZodObject<{
|
|
98
|
-
url: z.ZodString;
|
|
99
|
-
title: z.ZodOptional<z.ZodString>;
|
|
100
|
-
}, z.core.$strip>;
|
|
101
|
-
readonly pageleave: z.ZodObject<{
|
|
102
|
-
url: z.ZodString;
|
|
103
|
-
durationMs: z.ZodOptional<z.ZodNumber>;
|
|
104
|
-
}, z.core.$strip>;
|
|
105
|
-
};
|
|
106
|
-
/** Per-event configuration derived from PLUGIN_MANIFEST. */
|
|
107
|
-
declare const eventConfigs: Record<"error" | "rage_click" | "ui_event" | "replay_chunk" | "session_summary" | "pageview" | "pageleave", {
|
|
108
|
-
enrich: boolean;
|
|
109
|
-
}>;
|
|
110
|
-
type EventSchemas = typeof eventSchemas;
|
|
111
|
-
type AnyEventDefinition = { [K in keyof EventSchemas]: {
|
|
112
|
-
type: K;
|
|
113
|
-
schema: EventSchemas[K];
|
|
114
|
-
enrich?: boolean;
|
|
115
|
-
transform?: (input: z.infer<EventSchemas[K]>) => unknown;
|
|
116
|
-
} }[keyof EventSchemas];
|
|
117
|
-
type EventDefinitionFor<T extends EventType> = T extends keyof EventSchemas ? {
|
|
118
|
-
type: T;
|
|
119
|
-
schema: EventSchemas[T];
|
|
120
|
-
enrich?: boolean;
|
|
121
|
-
transform?: (input: z.infer<EventSchemas[T]>) => unknown;
|
|
122
|
-
} : never;
|
|
123
|
-
type ValidatePluginEvents<K extends PluginKey, Events extends readonly AnyEventDefinition[]> = Events extends readonly (infer E)[] ? E extends AnyEventDefinition ? E["type"] extends EventsForPlugin<K> ? Events : never : never : never;
|
|
124
|
-
interface EventHandlerConfig<TSchema extends z.ZodType<unknown>, TInput = z.infer<TSchema>, TOutput = TInput> {
|
|
125
|
-
enrich: boolean;
|
|
126
|
-
schema: TSchema;
|
|
127
|
-
transform?: (input: TInput) => TOutput;
|
|
128
|
-
}
|
|
129
|
-
//#endregion
|
|
130
|
-
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"],"mappings":";;;;;KAoBK,4BAAA,GAA+B,cAAA;AAAA,KAExB,eAAA,WAA0B,SAAA,IAAa,OAAA,CACjD,4BAAA;EACE,IAAA,EAAM,CAAA;AAAA;AAAA,cAIG,YAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAWA,YAAA,EAAY,MAAA;EAAA,MAAA;AAAA;AAAA,KAUb,YAAA,UAAsB,YAAA;AAAA,KAGtB,kBAAA,iBACE,YAAA;EACV,IAAA,EAAM,CAAA;EACN,MAAA,EAAQ,YAAA,CAAa,CAAA;EACrB,MAAA;EACA,SAAA,IAAa,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,YAAA,CAAa,CAAA;AAAA,UAErC,YAAA;AAAA,KAGI,kBAAA,WAA6B,SAAA,IACvC,CAAA,eAAgB,YAAA;EAEV,IAAA,EAAM,CAAA;EACN,MAAA,EAAQ,YAAA,CAAa,CAAA;EACrB,MAAA;EACA,SAAA,IAAa,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,YAAA,CAAa,CAAA;AAAA;AAAA,KAKrC,oBAAA,WACA,SAAA,0BACc,kBAAA,MACtB,MAAA,gCACA,CAAA,SAAU,kBAAA,GACR,CAAA,iBAAkB,eAAA,CAAgB,CAAA,IAChC,MAAA;AAAA,UAMS,kBAAA,iBACC,CAAA,CAAE,OAAA,oBACT,CAAA,CAAE,KAAA,CAAM,OAAA,aACP,MAAA;EAEV,MAAA;EACA,MAAA,EAAQ,OAAA;EACR,SAAA,IAAa,KAAA,EAAO,MAAA,KAAW,OAAA;AAAA"}
|
|
@@ -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 enrich: boolean;\n schema: TSchema;\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,43 +0,0 @@
|
|
|
1
|
-
import { AnyEventDefinition } from "../events/plugin-event-types.mjs";
|
|
2
|
-
import { EventCapture } from "./services/event-capture.mjs";
|
|
3
|
-
import { PluginConfig } from "./services/plugin-config.mjs";
|
|
4
|
-
import { PluginLogger } from "./services/plugin-logger.mjs";
|
|
5
|
-
import { PluginRuntime } from "./services/plugin-runtime.mjs";
|
|
6
|
-
import { SessionInfo } from "./services/session-info.mjs";
|
|
7
|
-
import { Effect, Layer } from "effect";
|
|
8
|
-
import { PluginKey } from "@interfere/types/sdk/plugins/lib/types";
|
|
9
|
-
|
|
10
|
-
//#region src/core/plugins/define-plugin.d.ts
|
|
11
|
-
type BasePluginServices = EventCapture | SessionInfo | PluginConfig | PluginLogger | PluginRuntime;
|
|
12
|
-
interface PluginSetupResult<API = unknown> {
|
|
13
|
-
readonly api?: API;
|
|
14
|
-
readonly cleanup?: () => void;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* A loadable plugin definition. The private layer type `RPrivate` is hidden
|
|
18
|
-
* by capturing it in the `load` closure, avoiding variance issues when storing
|
|
19
|
-
* heterogeneous plugins in collections.
|
|
20
|
-
*/
|
|
21
|
-
interface PluginDef<K extends string = string, API = unknown> {
|
|
22
|
-
readonly events?: readonly AnyEventDefinition[];
|
|
23
|
-
readonly key: K;
|
|
24
|
-
readonly load: <R>(baseLayer: Layer.Layer<BasePluginServices, never, R>) => Effect.Effect<PluginSetupResult<API>, never, R>;
|
|
25
|
-
readonly name: string;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Define a plugin with a private layer. The `RPrivate` type parameter is
|
|
29
|
-
* captured in the returned `load` function closure, so callers don't need
|
|
30
|
-
* to know about it.
|
|
31
|
-
*
|
|
32
|
-
* The setup Effect receives both the plugin's private services (RPrivate) and
|
|
33
|
-
* the base plugin services (PluginRuntime, PluginLogger, etc.) so it can fork
|
|
34
|
-
* Effects via PluginRuntime.
|
|
35
|
-
*/
|
|
36
|
-
declare function definePlugin<K extends PluginKey, API, RPrivate>(key: K, options: {
|
|
37
|
-
readonly name: string;
|
|
38
|
-
readonly events?: readonly AnyEventDefinition[];
|
|
39
|
-
readonly layer: Layer.Layer<RPrivate, never, BasePluginServices>;
|
|
40
|
-
readonly setup: Effect.Effect<PluginSetupResult<API>, never, RPrivate | BasePluginServices>;
|
|
41
|
-
}): PluginDef<K, API>;
|
|
42
|
-
//#endregion
|
|
43
|
-
export { BasePluginServices, PluginDef, PluginSetupResult, definePlugin };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"define-plugin.d.mts","names":[],"sources":["../../../src/core/plugins/define-plugin.ts"],"mappings":";;;;;;;;;;KAWY,kBAAA,GACR,YAAA,GACA,WAAA,GACA,YAAA,GACA,YAAA,GACA,aAAA;AAAA,UAEa,iBAAA;EAAA,SACN,GAAA,GAAM,GAAA;EAAA,SACN,OAAA;AAAA;;;;;;UAQM,SAAA;EAAA,SACN,MAAA,YAAkB,kBAAA;EAAA,SAClB,GAAA,EAAK,CAAA;EAAA,SACL,IAAA,MACP,SAAA,EAAW,KAAA,CAAM,KAAA,CAAM,kBAAA,SAA2B,CAAA,MAC/C,MAAA,CAAO,MAAA,CAAO,iBAAA,CAAkB,GAAA,UAAa,CAAA;EAAA,SACzC,IAAA;AAAA;;;;AAhBX;;;;;;iBA4BgB,YAAA,WAAuB,SAAA,gBAAA,CACrC,GAAA,EAAK,CAAA,EACL,OAAA;EAAA,SACW,IAAA;EAAA,SACA,MAAA,YAAkB,kBAAA;EAAA,SAClB,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,QAAA,SAAiB,kBAAA;EAAA,SACpC,KAAA,EAAO,MAAA,CAAO,MAAA,CACrB,iBAAA,CAAkB,GAAA,UAElB,QAAA,GAAW,kBAAA;AAAA,IAGd,SAAA,CAAU,CAAA,EAAG,GAAA"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { Effect, Layer } from "effect";
|
|
2
|
-
|
|
3
|
-
//#region src/core/plugins/define-plugin.ts
|
|
4
|
-
/**
|
|
5
|
-
* Define a plugin with a private layer. The `RPrivate` type parameter is
|
|
6
|
-
* captured in the returned `load` function closure, so callers don't need
|
|
7
|
-
* to know about it.
|
|
8
|
-
*
|
|
9
|
-
* The setup Effect receives both the plugin's private services (RPrivate) and
|
|
10
|
-
* the base plugin services (PluginRuntime, PluginLogger, etc.) so it can fork
|
|
11
|
-
* Effects via PluginRuntime.
|
|
12
|
-
*/
|
|
13
|
-
function definePlugin(key, options) {
|
|
14
|
-
return {
|
|
15
|
-
key,
|
|
16
|
-
name: options.name,
|
|
17
|
-
events: options.events,
|
|
18
|
-
load: (baseLayer) => options.setup.pipe(Effect.provide(Layer.merge(options.layer.pipe(Layer.provide(baseLayer)), baseLayer)))
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
//#endregion
|
|
23
|
-
export { definePlugin };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"define-plugin.mjs","names":[],"sources":["../../../src/core/plugins/define-plugin.ts"],"sourcesContent":["import type { PluginKey } from \"@interfere/types/sdk/plugins/lib/types\";\n\nimport { Effect, Layer } from \"effect\";\n\nimport type { AnyEventDefinition } from \"../events/plugin-event-types.js\";\nimport type { EventCapture } from \"./services/event-capture.js\";\nimport type { PluginConfig } from \"./services/plugin-config.js\";\nimport type { PluginLogger } from \"./services/plugin-logger.js\";\nimport type { PluginRuntime } from \"./services/plugin-runtime.js\";\nimport type { SessionInfo } from \"./services/session-info.js\";\n\nexport type BasePluginServices =\n | EventCapture\n | SessionInfo\n | PluginConfig\n | PluginLogger\n | PluginRuntime;\n\nexport interface PluginSetupResult<API = unknown> {\n readonly api?: API;\n readonly cleanup?: () => void;\n}\n\n/**\n * A loadable plugin definition. The private layer type `RPrivate` is hidden\n * by capturing it in the `load` closure, avoiding variance issues when storing\n * heterogeneous plugins in collections.\n */\nexport interface PluginDef<K extends string = string, API = unknown> {\n readonly events?: readonly AnyEventDefinition[];\n readonly key: K;\n readonly load: <R>(\n baseLayer: Layer.Layer<BasePluginServices, never, R>\n ) => Effect.Effect<PluginSetupResult<API>, never, R>;\n readonly name: string;\n}\n\n/**\n * Define a plugin with a private layer. The `RPrivate` type parameter is\n * captured in the returned `load` function closure, so callers don't need\n * to know about it.\n *\n * The setup Effect receives both the plugin's private services (RPrivate) and\n * the base plugin services (PluginRuntime, PluginLogger, etc.) so it can fork\n * Effects via PluginRuntime.\n */\nexport function definePlugin<K extends PluginKey, API, RPrivate>(\n key: K,\n options: {\n readonly name: string;\n readonly events?: readonly AnyEventDefinition[];\n readonly layer: Layer.Layer<RPrivate, never, BasePluginServices>;\n readonly setup: Effect.Effect<\n PluginSetupResult<API>,\n never,\n RPrivate | BasePluginServices\n >;\n }\n): PluginDef<K, API> {\n return {\n key,\n name: options.name,\n events: options.events,\n load: (baseLayer) =>\n options.setup.pipe(\n Effect.provide(\n Layer.merge(options.layer.pipe(Layer.provide(baseLayer)), baseLayer)\n )\n ),\n };\n}\n"],"mappings":";;;;;;;;;;;;AA8CA,SAAgB,aACd,KACA,SAUmB;AACnB,QAAO;EACL;EACA,MAAM,QAAQ;EACd,QAAQ,QAAQ;EAChB,OAAO,cACL,QAAQ,MAAM,KACZ,OAAO,QACL,MAAM,MAAM,QAAQ,MAAM,KAAK,MAAM,QAAQ,UAAU,CAAC,EAAE,UAAU,CACrE,CACF;EACJ"}
|
|
@@ -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"],"mappings":";iBAIgB,kBAAA,CAAmB,OAAA,EAAS,OAAA;AAAA,iBAgB5B,cAAA,CAAe,OAAA,EAAS,WAAA;AAAA,cAU3B,QAAA;6BAGZ,kBAAA;yBAAA,cAAA;AAAA"}
|
|
@@ -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,18 +0,0 @@
|
|
|
1
|
-
import { EventPayload } from "../../../events/event-registry.mjs";
|
|
2
|
-
import { EventCapture } from "../../services/event-capture.mjs";
|
|
3
|
-
import { PluginLogger } from "../../services/plugin-logger.mjs";
|
|
4
|
-
import { Context, Effect, Layer } from "effect";
|
|
5
|
-
|
|
6
|
-
//#region src/core/plugins/impl/ai-summary/ai-summary-plugin-api.d.ts
|
|
7
|
-
type SessionSummaryPayload = EventPayload<"session_summary">;
|
|
8
|
-
interface AiSummaryPluginApiService {
|
|
9
|
-
readonly captureSessionSummary: (payload: SessionSummaryPayload) => Effect.Effect<void>;
|
|
10
|
-
readonly log: {
|
|
11
|
-
readonly debug: (message: string) => Effect.Effect<void>;
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
declare const AiSummaryPluginApi_base: Context.TagClass<AiSummaryPluginApi, "@interfere/plugins/ai-summary/AiSummaryPluginApi", AiSummaryPluginApiService>;
|
|
15
|
-
declare class AiSummaryPluginApi extends AiSummaryPluginApi_base {}
|
|
16
|
-
declare const AiSummaryPluginApiLayer: Layer.Layer<AiSummaryPluginApi, never, EventCapture | PluginLogger>;
|
|
17
|
-
//#endregion
|
|
18
|
-
export { AiSummaryPluginApi, AiSummaryPluginApiLayer };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ai-summary-plugin-api.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/ai-summary/ai-summary-plugin-api.ts"],"mappings":";;;;;;KAMK,qBAAA,GAAwB,YAAA;AAAA,UAEnB,yBAAA;EAAA,SACC,qBAAA,GACP,OAAA,EAAS,qBAAA,KACN,MAAA,CAAO,MAAA;EAAA,SACH,GAAA;IAAA,SACE,KAAA,GAAQ,OAAA,aAAoB,MAAA,CAAO,MAAA;EAAA;AAAA;AAAA,cAAM,uBAAA;cAIzC,kBAAA,SAA2B,uBAAA;AAAA,cAI3B,uBAAA,EAAuB,KAAA,CAAA,KAAA,CAAA,kBAAA,SAAA,YAAA,GAAA,YAAA"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { EventCapture } from "../../services/event-capture.mjs";
|
|
2
|
-
import { PluginLogger } from "../../services/plugin-logger.mjs";
|
|
3
|
-
import { Context, Effect, Layer } from "effect";
|
|
4
|
-
|
|
5
|
-
//#region src/core/plugins/impl/ai-summary/ai-summary-plugin-api.ts
|
|
6
|
-
var AiSummaryPluginApi = class extends Context.Tag("@interfere/plugins/ai-summary/AiSummaryPluginApi")() {};
|
|
7
|
-
const AiSummaryPluginApiLayer = Layer.effect(AiSummaryPluginApi, Effect.gen(function* () {
|
|
8
|
-
const capture = yield* EventCapture;
|
|
9
|
-
const logger = yield* PluginLogger;
|
|
10
|
-
return AiSummaryPluginApi.of({
|
|
11
|
-
captureSessionSummary: (payload) => capture.capture("session_summary", payload).pipe(Effect.withSpan("plugin.ai.session_summary")),
|
|
12
|
-
log: { debug: logger.debug }
|
|
13
|
-
});
|
|
14
|
-
}));
|
|
15
|
-
|
|
16
|
-
//#endregion
|
|
17
|
-
export { AiSummaryPluginApi, AiSummaryPluginApiLayer };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ai-summary-plugin-api.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/ai-summary/ai-summary-plugin-api.ts"],"sourcesContent":["import { Context, Effect, Layer } from \"effect\";\n\nimport type { EventPayload } from \"../../../events/event-registry.js\";\nimport { EventCapture } from \"../../services/event-capture.js\";\nimport { PluginLogger } from \"../../services/plugin-logger.js\";\n\ntype SessionSummaryPayload = EventPayload<\"session_summary\">;\n\ninterface AiSummaryPluginApiService {\n readonly captureSessionSummary: (\n payload: SessionSummaryPayload\n ) => Effect.Effect<void>;\n readonly log: {\n readonly debug: (message: string) => Effect.Effect<void>;\n };\n}\n\nexport class AiSummaryPluginApi extends Context.Tag(\n \"@interfere/plugins/ai-summary/AiSummaryPluginApi\"\n)<AiSummaryPluginApi, AiSummaryPluginApiService>() {}\n\nexport const AiSummaryPluginApiLayer = Layer.effect(\n AiSummaryPluginApi,\n Effect.gen(function* () {\n const capture = yield* EventCapture;\n const logger = yield* PluginLogger;\n\n return AiSummaryPluginApi.of({\n captureSessionSummary: (payload) =>\n capture\n .capture(\"session_summary\", payload)\n .pipe(Effect.withSpan(\"plugin.ai.session_summary\")),\n log: {\n debug: logger.debug,\n },\n });\n })\n);\n"],"mappings":";;;;;AAiBA,IAAa,qBAAb,cAAwC,QAAQ,IAC9C,mDACD,EAAiD,CAAC;AAEnD,MAAa,0BAA0B,MAAM,OAC3C,oBACA,OAAO,IAAI,aAAa;CACtB,MAAM,UAAU,OAAO;CACvB,MAAM,SAAS,OAAO;AAEtB,QAAO,mBAAmB,GAAG;EAC3B,wBAAwB,YACtB,QACG,QAAQ,mBAAmB,QAAQ,CACnC,KAAK,OAAO,SAAS,4BAA4B,CAAC;EACvD,KAAK,EACH,OAAO,OAAO,OACf;EACF,CAAC;EACF,CACH"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/ai-summary/plugin.ts"],"mappings":""}
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import { PluginRuntime } from "../../services/plugin-runtime.mjs";
|
|
2
|
-
import { definePlugin } from "../../define-plugin.mjs";
|
|
3
|
-
import { defineEvent } from "../../../events/define-event.mjs";
|
|
4
|
-
import { AiSummaryPluginApi, AiSummaryPluginApiLayer } from "./ai-summary-plugin-api.mjs";
|
|
5
|
-
import { Data, Duration, Effect, Fiber, Ref } from "effect";
|
|
6
|
-
|
|
7
|
-
//#region src/core/plugins/impl/ai-summary/plugin.ts
|
|
8
|
-
const MIN_CAPTURE_INTERVAL_MS = 3e4;
|
|
9
|
-
const INITIAL_CAPTURE_DELAY_MS = 5e3;
|
|
10
|
-
const DEBOUNCE_DELAY_MS = 2e3;
|
|
11
|
-
const MIN_TEXT_LENGTH = 100;
|
|
12
|
-
const MAX_TEXT_LENGTH = 5e4;
|
|
13
|
-
const MAX_CONTEXT_TEXT_LENGTH = 1e4;
|
|
14
|
-
const MIN_NODE_TEXT_LENGTH = 3;
|
|
15
|
-
const MIN_SUMMARY_LENGTH = 20;
|
|
16
|
-
var AiSummaryCreateFailed = class extends Data.TaggedError("AiSummaryCreateFailed") {};
|
|
17
|
-
var AiSummaryPromptFailed = class extends Data.TaggedError("AiSummaryPromptFailed") {};
|
|
18
|
-
var plugin_default = definePlugin("aiSummary", {
|
|
19
|
-
name: "aiSummary",
|
|
20
|
-
events: [defineEvent("session_summary").value()],
|
|
21
|
-
layer: AiSummaryPluginApiLayer,
|
|
22
|
-
setup: Effect.gen(function* () {
|
|
23
|
-
const api = yield* AiSummaryPluginApi;
|
|
24
|
-
const runtime = yield* PluginRuntime;
|
|
25
|
-
if (typeof window === "undefined" || typeof document === "undefined" || !("ai" in window) || !window.ai?.summarizer) {
|
|
26
|
-
yield* api.log.debug("aiSummary: unsupported environment or missing API");
|
|
27
|
-
return {};
|
|
28
|
-
}
|
|
29
|
-
const ai = window.ai;
|
|
30
|
-
if ((yield* Effect.promise(() => ai.summarizer?.capabilities() ?? Promise.resolve({ available: "no" })))?.available !== "readily") {
|
|
31
|
-
yield* api.log.debug("aiSummary: summarizer not readily available");
|
|
32
|
-
return {};
|
|
33
|
-
}
|
|
34
|
-
if (!ai.summarizer) {
|
|
35
|
-
yield* api.log.debug("aiSummary: summarizer missing after capability check");
|
|
36
|
-
return {};
|
|
37
|
-
}
|
|
38
|
-
const isCapturingRef = yield* Ref.make(false);
|
|
39
|
-
const lastCaptureTimeRef = yield* Ref.make(0);
|
|
40
|
-
const scheduledFiberRef = yield* Ref.make(null);
|
|
41
|
-
const shouldSkipForLength = (text) => text.length < MIN_TEXT_LENGTH || text.length > MAX_TEXT_LENGTH;
|
|
42
|
-
const acceptTextNode = (textNode) => {
|
|
43
|
-
const parent = textNode.parentElement;
|
|
44
|
-
if (!parent) return NodeFilter.FILTER_REJECT;
|
|
45
|
-
const tagName = parent.tagName.toLowerCase();
|
|
46
|
-
if (tagName === "script" || tagName === "style" || tagName === "noscript") return NodeFilter.FILTER_REJECT;
|
|
47
|
-
const style = window.getComputedStyle(parent);
|
|
48
|
-
if (style.display === "none" || style.visibility === "hidden" || style.opacity === "0") return NodeFilter.FILTER_REJECT;
|
|
49
|
-
const text = textNode.textContent?.trim();
|
|
50
|
-
if (!text || text.length < MIN_NODE_TEXT_LENGTH) return NodeFilter.FILTER_REJECT;
|
|
51
|
-
return NodeFilter.FILTER_ACCEPT;
|
|
52
|
-
};
|
|
53
|
-
const extractVisibleText = () => {
|
|
54
|
-
const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, { acceptNode: acceptTextNode });
|
|
55
|
-
const parts = [];
|
|
56
|
-
let current = walker.nextNode();
|
|
57
|
-
while (current) {
|
|
58
|
-
const text = current.textContent?.trim();
|
|
59
|
-
if (text && text.length >= MIN_NODE_TEXT_LENGTH) parts.push(text);
|
|
60
|
-
current = walker.nextNode();
|
|
61
|
-
}
|
|
62
|
-
return parts.join(" ");
|
|
63
|
-
};
|
|
64
|
-
const buildContextText = (title, url, description, content) => {
|
|
65
|
-
return `Title: ${title}\nURL: ${url}\n${description ? `Description: ${description}\n` : ""}Content: ${content.substring(0, MAX_CONTEXT_TEXT_LENGTH)}`;
|
|
66
|
-
};
|
|
67
|
-
const getPageMetadata = () => {
|
|
68
|
-
return {
|
|
69
|
-
title: document.title || "Untitled",
|
|
70
|
-
url: window.location.href,
|
|
71
|
-
description: document.querySelector("meta[name=\"description\"]")?.getAttribute("content") || ""
|
|
72
|
-
};
|
|
73
|
-
};
|
|
74
|
-
const isSummaryMeaningful = (text) => Boolean(text && text.length > MIN_SUMMARY_LENGTH);
|
|
75
|
-
const performSummaryFlow = Effect.fn("AiSummary.performSummaryFlow")((nowTs) => Effect.gen(function* () {
|
|
76
|
-
const fullText = extractVisibleText();
|
|
77
|
-
if (shouldSkipForLength(fullText)) return;
|
|
78
|
-
const { title, url, description } = getPageMetadata();
|
|
79
|
-
const contextualText = buildContextText(title, url, description, fullText);
|
|
80
|
-
const summarizer = ai.summarizer;
|
|
81
|
-
if (!summarizer) return;
|
|
82
|
-
const session = yield* Effect.tryPromise({
|
|
83
|
-
try: () => summarizer.create(),
|
|
84
|
-
catch: (cause) => new AiSummaryCreateFailed({
|
|
85
|
-
message: "AI summarizer create() failed",
|
|
86
|
-
cause
|
|
87
|
-
})
|
|
88
|
-
}).pipe(Effect.catchAll((error) => api.log.debug(`AI summarizer create() failed: ${error.message}`).pipe(Effect.as(null))));
|
|
89
|
-
if (!session) return;
|
|
90
|
-
const summary = yield* Effect.tryPromise({
|
|
91
|
-
try: () => session.prompt(contextualText),
|
|
92
|
-
catch: (cause) => new AiSummaryPromptFailed({
|
|
93
|
-
message: "AI summarizer prompt() failed",
|
|
94
|
-
cause
|
|
95
|
-
})
|
|
96
|
-
}).pipe(Effect.catchAll((error) => api.log.debug(`AI summarizer prompt() failed: ${error.message}`).pipe(Effect.as(null))));
|
|
97
|
-
if (!(typeof summary === "string" && isSummaryMeaningful(summary))) return;
|
|
98
|
-
yield* api.captureSessionSummary({
|
|
99
|
-
summary,
|
|
100
|
-
pageTitle: title,
|
|
101
|
-
pageUrl: url,
|
|
102
|
-
contentLength: fullText.length,
|
|
103
|
-
timestamp: nowTs
|
|
104
|
-
});
|
|
105
|
-
}));
|
|
106
|
-
const captureNow = Effect.fn("AiSummary.captureNow")(function* () {
|
|
107
|
-
const nowTs = Date.now();
|
|
108
|
-
const isCapturing = yield* Ref.get(isCapturingRef);
|
|
109
|
-
const lastCaptureTime = yield* Ref.get(lastCaptureTimeRef);
|
|
110
|
-
if (isCapturing || nowTs - lastCaptureTime < MIN_CAPTURE_INTERVAL_MS) return;
|
|
111
|
-
yield* Ref.set(isCapturingRef, true);
|
|
112
|
-
yield* Ref.set(lastCaptureTimeRef, nowTs);
|
|
113
|
-
yield* performSummaryFlow(nowTs).pipe(Effect.ensuring(Ref.set(isCapturingRef, false)));
|
|
114
|
-
});
|
|
115
|
-
const scheduleCapture = Effect.fn("AiSummary.scheduleCapture")((delayMs) => Effect.gen(function* () {
|
|
116
|
-
if (yield* Ref.get(isCapturingRef)) return;
|
|
117
|
-
const previousFiber = yield* Ref.get(scheduledFiberRef);
|
|
118
|
-
if (previousFiber) yield* Fiber.interrupt(previousFiber);
|
|
119
|
-
const fiber = yield* Effect.sleep(Duration.millis(delayMs)).pipe(Effect.zipRight(captureNow()), Effect.forkDaemon);
|
|
120
|
-
yield* Ref.set(scheduledFiberRef, fiber);
|
|
121
|
-
}));
|
|
122
|
-
const observer = new MutationObserver(() => {
|
|
123
|
-
runtime.fork(scheduleCapture(DEBOUNCE_DELAY_MS));
|
|
124
|
-
});
|
|
125
|
-
observer.observe(document.body, {
|
|
126
|
-
childList: true,
|
|
127
|
-
subtree: true,
|
|
128
|
-
characterData: false,
|
|
129
|
-
attributes: false
|
|
130
|
-
});
|
|
131
|
-
const handleVisibilityChange = () => {
|
|
132
|
-
if (document.visibilityState === "visible") runtime.fork(captureNow());
|
|
133
|
-
};
|
|
134
|
-
document.addEventListener("visibilitychange", handleVisibilityChange);
|
|
135
|
-
yield* scheduleCapture(INITIAL_CAPTURE_DELAY_MS);
|
|
136
|
-
return { cleanup: () => {
|
|
137
|
-
observer.disconnect();
|
|
138
|
-
document.removeEventListener("visibilitychange", handleVisibilityChange);
|
|
139
|
-
runtime.fork(Effect.gen(function* () {
|
|
140
|
-
const fiber = yield* Ref.get(scheduledFiberRef);
|
|
141
|
-
if (fiber) {
|
|
142
|
-
yield* Fiber.interrupt(fiber);
|
|
143
|
-
yield* Ref.set(scheduledFiberRef, null);
|
|
144
|
-
}
|
|
145
|
-
}));
|
|
146
|
-
} };
|
|
147
|
-
}).pipe(Effect.withSpan("plugins.aiSummary.setup"))
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
//#endregion
|
|
151
|
-
export { plugin_default as default };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/ai-summary/plugin.ts"],"sourcesContent":["import { Data, Duration, Effect, Fiber, Ref } from \"effect\";\n\nimport { defineEvent } from \"../../../events/define-event.js\";\nimport { definePlugin } from \"../../define-plugin.js\";\nimport { PluginRuntime } from \"../../services/plugin-runtime.js\";\nimport {\n AiSummaryPluginApi,\n AiSummaryPluginApiLayer,\n} from \"./ai-summary-plugin-api.js\";\n\ninterface BrowserAITextSession {\n prompt: (input: string) => Promise<string>;\n}\n\nconst MIN_CAPTURE_INTERVAL_MS = 30_000;\nconst INITIAL_CAPTURE_DELAY_MS = 5000;\nconst DEBOUNCE_DELAY_MS = 2000;\nconst MIN_TEXT_LENGTH = 100;\nconst MAX_TEXT_LENGTH = 50_000;\nconst MAX_CONTEXT_TEXT_LENGTH = 10_000;\nconst MIN_NODE_TEXT_LENGTH = 3;\nconst MIN_SUMMARY_LENGTH = 20;\n\nclass AiSummaryCreateFailed extends Data.TaggedError(\"AiSummaryCreateFailed\")<{\n readonly message: string;\n readonly cause: unknown;\n}> {}\n\nclass AiSummaryPromptFailed extends Data.TaggedError(\"AiSummaryPromptFailed\")<{\n readonly message: string;\n readonly cause: unknown;\n}> {}\n\nexport default definePlugin(\"aiSummary\", {\n name: \"aiSummary\",\n events: [defineEvent(\"session_summary\").value()],\n layer: AiSummaryPluginApiLayer,\n setup: Effect.gen(function* () {\n const api = yield* AiSummaryPluginApi;\n const runtime = yield* PluginRuntime;\n\n if (\n typeof window === \"undefined\" ||\n typeof document === \"undefined\" ||\n !(\"ai\" in window) ||\n !(window.ai as { summarizer?: unknown })?.summarizer\n ) {\n yield* api.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 const capabilities = yield* Effect.promise(\n () =>\n ai.summarizer?.capabilities() ?? Promise.resolve({ available: \"no\" })\n );\n\n if (capabilities?.available !== \"readily\") {\n yield* api.log.debug(\"aiSummary: summarizer not readily available\");\n return {};\n }\n\n if (!ai.summarizer) {\n yield* api.log.debug(\n \"aiSummary: summarizer missing after capability check\"\n );\n return {};\n }\n\n const isCapturingRef = yield* Ref.make(false);\n const lastCaptureTimeRef = yield* Ref.make(0);\n const scheduledFiberRef = yield* Ref.make<Fiber.RuntimeFiber<void> | null>(\n null\n );\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 {\n acceptNode: acceptTextNode,\n }\n );\n\n const parts: string[] = [];\n let current: Node | null = walker.nextNode();\n\n while (current) {\n const text = current.textContent?.trim();\n if (text && text.length >= MIN_NODE_TEXT_LENGTH) {\n parts.push(text);\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 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 return { title, url, description };\n };\n\n const isSummaryMeaningful = (text: string | undefined) =>\n Boolean(text && text.length > MIN_SUMMARY_LENGTH);\n\n const performSummaryFlow = Effect.fn(\"AiSummary.performSummaryFlow\")(\n (nowTs: number) =>\n Effect.gen(function* () {\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 = yield* Effect.tryPromise({\n try: () => summarizer.create(),\n catch: (cause) =>\n new AiSummaryCreateFailed({\n message: \"AI summarizer create() failed\",\n cause,\n }),\n }).pipe(\n Effect.catchAll((error) =>\n api.log\n .debug(`AI summarizer create() failed: ${error.message}`)\n .pipe(Effect.as(null))\n )\n );\n if (!session) {\n return;\n }\n\n const summary = yield* Effect.tryPromise({\n try: () => session.prompt(contextualText),\n catch: (cause) =>\n new AiSummaryPromptFailed({\n message: \"AI summarizer prompt() failed\",\n cause,\n }),\n }).pipe(\n Effect.catchAll((error) =>\n api.log\n .debug(`AI summarizer prompt() failed: ${error.message}`)\n .pipe(Effect.as(null))\n )\n );\n\n if (!(typeof summary === \"string\" && isSummaryMeaningful(summary))) {\n return;\n }\n\n yield* api.captureSessionSummary({\n summary,\n pageTitle: title,\n pageUrl: url,\n contentLength: fullText.length,\n timestamp: nowTs,\n });\n })\n );\n\n const captureNow = Effect.fn(\"AiSummary.captureNow\")(function* () {\n const nowTs = Date.now();\n const isCapturing = yield* Ref.get(isCapturingRef);\n const lastCaptureTime = yield* Ref.get(lastCaptureTimeRef);\n\n if (isCapturing || nowTs - lastCaptureTime < MIN_CAPTURE_INTERVAL_MS) {\n return;\n }\n\n yield* Ref.set(isCapturingRef, true);\n yield* Ref.set(lastCaptureTimeRef, nowTs);\n\n yield* performSummaryFlow(nowTs).pipe(\n Effect.ensuring(Ref.set(isCapturingRef, false))\n );\n });\n\n const scheduleCapture = Effect.fn(\"AiSummary.scheduleCapture\")(\n (delayMs: number) =>\n Effect.gen(function* () {\n const isCapturing = yield* Ref.get(isCapturingRef);\n if (isCapturing) {\n return;\n }\n\n const previousFiber = yield* Ref.get(scheduledFiberRef);\n if (previousFiber) {\n yield* Fiber.interrupt(previousFiber);\n }\n\n const fiber = yield* Effect.sleep(Duration.millis(delayMs)).pipe(\n Effect.zipRight(captureNow()),\n Effect.forkDaemon\n );\n\n yield* Ref.set(scheduledFiberRef, fiber);\n })\n );\n\n const observer = new MutationObserver(() => {\n runtime.fork(scheduleCapture(DEBOUNCE_DELAY_MS));\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n characterData: false,\n attributes: false,\n });\n\n const handleVisibilityChange = () => {\n if (document.visibilityState === \"visible\") {\n runtime.fork(captureNow());\n }\n };\n\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n yield* scheduleCapture(INITIAL_CAPTURE_DELAY_MS);\n\n return {\n cleanup: () => {\n observer.disconnect();\n document.removeEventListener(\n \"visibilitychange\",\n handleVisibilityChange\n );\n runtime.fork(\n Effect.gen(function* () {\n const fiber = yield* Ref.get(scheduledFiberRef);\n if (fiber) {\n yield* Fiber.interrupt(fiber);\n yield* Ref.set(scheduledFiberRef, null);\n }\n })\n );\n },\n };\n }).pipe(Effect.withSpan(\"plugins.aiSummary.setup\")),\n});\n"],"mappings":"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"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { EventCapture } from "../../services/event-capture.mjs";
|
|
2
|
-
import { PluginLogger } from "../../services/plugin-logger.mjs";
|
|
3
|
-
import { ErrorInfo } from "./logic.mjs";
|
|
4
|
-
import { Context, Effect, Layer } from "effect";
|
|
5
|
-
import { ErrorEnvelopePayload } from "@interfere/types/sdk/plugins/payload/errors";
|
|
6
|
-
|
|
7
|
-
//#region src/core/plugins/impl/errors/errors-plugin-api.d.ts
|
|
8
|
-
interface ErrorsPluginApiService {
|
|
9
|
-
readonly captureConsoleArgsOnce: (span: string, args: readonly unknown[]) => Effect.Effect<void>;
|
|
10
|
-
readonly captureErrorInfoOnce: (span: string, info: ErrorInfo, meta?: Record<string, unknown>) => Effect.Effect<void>;
|
|
11
|
-
readonly capturePayloadOnce: (span: string, payload: ErrorEnvelopePayload) => Effect.Effect<void>;
|
|
12
|
-
}
|
|
13
|
-
declare const ErrorsPluginApi_base: Context.TagClass<ErrorsPluginApi, "@interfere/plugins/errors/ErrorsPluginApi", ErrorsPluginApiService>;
|
|
14
|
-
declare class ErrorsPluginApi extends ErrorsPluginApi_base {}
|
|
15
|
-
declare const ErrorsPluginApiLayer: Layer.Layer<ErrorsPluginApi, never, EventCapture | PluginLogger>;
|
|
16
|
-
//#endregion
|
|
17
|
-
export { ErrorsPluginApi, ErrorsPluginApiLayer };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors-plugin-api.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/errors/errors-plugin-api.ts"],"mappings":";;;;;;;UASU,sBAAA;EAAA,SACC,sBAAA,GACP,IAAA,UACA,IAAA,yBACG,MAAA,CAAO,MAAA;EAAA,SACH,oBAAA,GACP,IAAA,UACA,IAAA,EAAM,SAAA,EACN,IAAA,GAAO,MAAA,sBACJ,MAAA,CAAO,MAAA;EAAA,SACH,kBAAA,GACP,IAAA,UACA,OAAA,EAAS,oBAAA,KACN,MAAA,CAAO,MAAA;AAAA;AAAA,cAAM,oBAAA;cAGP,eAAA,SAAwB,oBAAA;AAAA,cAcxB,oBAAA,EAAoB,KAAA,CAAA,KAAA,CAAA,eAAA,SAAA,YAAA,GAAA,YAAA"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { EventCapture } from "../../services/event-capture.mjs";
|
|
2
|
-
import { PluginLogger } from "../../services/plugin-logger.mjs";
|
|
3
|
-
import { buildErrorPayload, toStringSafe } from "./logic.mjs";
|
|
4
|
-
import { Context, Duration, Effect, Layer, Ref } from "effect";
|
|
5
|
-
|
|
6
|
-
//#region src/core/plugins/impl/errors/errors-plugin-api.ts
|
|
7
|
-
var ErrorsPluginApi = class extends Context.Tag("@interfere/plugins/errors/ErrorsPluginApi")() {};
|
|
8
|
-
const DEDUPE_TTL_MS = 2e3;
|
|
9
|
-
const STACK_PREFIX_SLICE = 120;
|
|
10
|
-
const makeDedupeKey = (input) => `${input.name ?? ""}|${input.message ?? ""}|${input.stack?.slice(0, STACK_PREFIX_SLICE) ?? ""}`;
|
|
11
|
-
const ErrorsPluginApiLayer = Layer.effect(ErrorsPluginApi, Effect.gen(function* () {
|
|
12
|
-
const capture = yield* EventCapture;
|
|
13
|
-
const logger = yield* PluginLogger;
|
|
14
|
-
const recentRef = yield* Ref.make(/* @__PURE__ */ new Set());
|
|
15
|
-
const markIfNew = (key) => Ref.modify(recentRef, (previous) => {
|
|
16
|
-
if (previous.has(key)) return [false, previous];
|
|
17
|
-
const next = new Set(previous);
|
|
18
|
-
next.add(key);
|
|
19
|
-
return [true, next];
|
|
20
|
-
});
|
|
21
|
-
const scheduleDelete = (key) => Effect.sleep(Duration.millis(DEDUPE_TTL_MS)).pipe(Effect.zipRight(Ref.update(recentRef, (previous) => {
|
|
22
|
-
if (!previous.has(key)) return previous;
|
|
23
|
-
const next = new Set(previous);
|
|
24
|
-
next.delete(key);
|
|
25
|
-
return next;
|
|
26
|
-
})), Effect.forkDaemon, Effect.asVoid);
|
|
27
|
-
const capturePayloadOnce = Effect.fn("ErrorsPluginApi.capturePayloadOnce")((span, payload) => Effect.gen(function* () {
|
|
28
|
-
const key = makeDedupeKey(payload);
|
|
29
|
-
if (!(yield* markIfNew(key))) return;
|
|
30
|
-
yield* scheduleDelete(key);
|
|
31
|
-
yield* capture.capture("error", payload).pipe(Effect.withSpan(span));
|
|
32
|
-
}));
|
|
33
|
-
const captureErrorInfoOnce = Effect.fn("ErrorsPluginApi.captureErrorInfoOnce")((span, info, meta) => Effect.gen(function* () {
|
|
34
|
-
const payload = buildErrorPayload(info);
|
|
35
|
-
yield* capturePayloadOnce(span, meta ? {
|
|
36
|
-
...payload,
|
|
37
|
-
...meta
|
|
38
|
-
} : payload);
|
|
39
|
-
}));
|
|
40
|
-
const captureConsoleArgsOnce = Effect.fn("ErrorsPluginApi.captureConsoleArgsOnce")((span, args) => Effect.gen(function* () {
|
|
41
|
-
const firstError = args.find((a) => a instanceof Error);
|
|
42
|
-
const message = args.map(toStringSafe).join(" ");
|
|
43
|
-
yield* logger.debug("Captured console.error");
|
|
44
|
-
yield* captureErrorInfoOnce(span, {
|
|
45
|
-
message,
|
|
46
|
-
name: firstError?.name ?? "ConsoleError",
|
|
47
|
-
stack: firstError?.stack
|
|
48
|
-
}, void 0);
|
|
49
|
-
}));
|
|
50
|
-
return ErrorsPluginApi.of({
|
|
51
|
-
capturePayloadOnce,
|
|
52
|
-
captureErrorInfoOnce,
|
|
53
|
-
captureConsoleArgsOnce
|
|
54
|
-
});
|
|
55
|
-
}));
|
|
56
|
-
|
|
57
|
-
//#endregion
|
|
58
|
-
export { ErrorsPluginApi, ErrorsPluginApiLayer };
|