@genn-inc/cluebase-frontend-sdk 0.0.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.
Files changed (140) hide show
  1. package/README.md +222 -0
  2. package/dist/_generated/correlation-attribute-keys.d.ts +2 -0
  3. package/dist/_generated/correlation-attribute-keys.js +33 -0
  4. package/dist/_generated/identity-pii-policy.d.ts +38 -0
  5. package/dist/_generated/identity-pii-policy.js +103 -0
  6. package/dist/_generated/ingest-privacy-tables.d.ts +120 -0
  7. package/dist/_generated/ingest-privacy-tables.js +890 -0
  8. package/dist/_generated/otel-resource-keys.d.ts +21 -0
  9. package/dist/_generated/otel-resource-keys.js +72 -0
  10. package/dist/_generated/otel-span-conversion.d.ts +48 -0
  11. package/dist/_generated/otel-span-conversion.js +69 -0
  12. package/dist/_generated/parameter-snapshot-leaf.d.ts +11 -0
  13. package/dist/_generated/parameter-snapshot-leaf.js +37 -0
  14. package/dist/_generated/sdk-runtime-policy.d.ts +7 -0
  15. package/dist/_generated/sdk-runtime-policy.js +14 -0
  16. package/dist/_generated/usage-governor-tables.d.ts +15 -0
  17. package/dist/_generated/usage-governor-tables.js +44 -0
  18. package/dist/context/browser-storage.d.ts +15 -0
  19. package/dist/context/browser-storage.js +38 -0
  20. package/dist/context/environment.d.ts +37 -0
  21. package/dist/context/environment.js +229 -0
  22. package/dist/context/identity.d.ts +16 -0
  23. package/dist/context/identity.js +139 -0
  24. package/dist/context/organization.d.ts +16 -0
  25. package/dist/context/organization.js +60 -0
  26. package/dist/context/session.d.ts +28 -0
  27. package/dist/context/session.js +130 -0
  28. package/dist/context/tab.d.ts +22 -0
  29. package/dist/context/tab.js +117 -0
  30. package/dist/context/trace.d.ts +76 -0
  31. package/dist/context/trace.js +163 -0
  32. package/dist/exporter/batch.d.ts +94 -0
  33. package/dist/exporter/batch.js +485 -0
  34. package/dist/exporter/browser-outbox-records.d.ts +159 -0
  35. package/dist/exporter/browser-outbox-records.js +341 -0
  36. package/dist/exporter/browser-outbox.d.ts +112 -0
  37. package/dist/exporter/browser-outbox.js +876 -0
  38. package/dist/exporter/client.d.ts +92 -0
  39. package/dist/exporter/client.js +541 -0
  40. package/dist/exporter/delivery-response-contract.d.ts +103 -0
  41. package/dist/exporter/delivery-response-contract.js +147 -0
  42. package/dist/exporter/delivery-response.d.ts +37 -0
  43. package/dist/exporter/delivery-response.js +151 -0
  44. package/dist/exporter/diagnostics.d.ts +42 -0
  45. package/dist/exporter/diagnostics.js +148 -0
  46. package/dist/exporter/event-id.d.ts +10 -0
  47. package/dist/exporter/event-id.js +75 -0
  48. package/dist/exporter/frontend-resource.d.ts +20 -0
  49. package/dist/exporter/frontend-resource.js +52 -0
  50. package/dist/exporter/local-minimization.d.ts +29 -0
  51. package/dist/exporter/local-minimization.js +87 -0
  52. package/dist/exporter/observation-source-event-exporter.d.ts +69 -0
  53. package/dist/exporter/observation-source-event-exporter.js +154 -0
  54. package/dist/exporter/parameter-snapshot.d.ts +14 -0
  55. package/dist/exporter/parameter-snapshot.js +215 -0
  56. package/dist/exporter/path-template.d.ts +1 -0
  57. package/dist/exporter/path-template.js +67 -0
  58. package/dist/exporter/raw-event-to-source-signal.d.ts +12 -0
  59. package/dist/exporter/raw-event-to-source-signal.js +297 -0
  60. package/dist/exporter/retry.d.ts +8 -0
  61. package/dist/exporter/retry.js +8 -0
  62. package/dist/exporter/sanitize.d.ts +30 -0
  63. package/dist/exporter/sanitize.js +177 -0
  64. package/dist/exporter/schema-evidence.d.ts +20 -0
  65. package/dist/exporter/schema-evidence.js +232 -0
  66. package/dist/exporter/source-event.d.ts +99 -0
  67. package/dist/exporter/source-event.js +13 -0
  68. package/dist/exporter/span-to-source-signal.d.ts +8 -0
  69. package/dist/exporter/span-to-source-signal.js +174 -0
  70. package/dist/exporter/text-fingerprint.d.ts +9 -0
  71. package/dist/exporter/text-fingerprint.js +16 -0
  72. package/dist/index.d.ts +25 -0
  73. package/dist/index.js +158 -0
  74. package/dist/instrumentation/action.d.ts +2 -0
  75. package/dist/instrumentation/action.js +171 -0
  76. package/dist/instrumentation/cluebase-authored-attributes.d.ts +4 -0
  77. package/dist/instrumentation/cluebase-authored-attributes.js +32 -0
  78. package/dist/instrumentation/common.d.ts +73 -0
  79. package/dist/instrumentation/common.js +90 -0
  80. package/dist/instrumentation/dom.d.ts +63 -0
  81. package/dist/instrumentation/dom.js +640 -0
  82. package/dist/instrumentation/drag.d.ts +2 -0
  83. package/dist/instrumentation/drag.js +82 -0
  84. package/dist/instrumentation/error.d.ts +2 -0
  85. package/dist/instrumentation/error.js +318 -0
  86. package/dist/instrumentation/form.d.ts +2 -0
  87. package/dist/instrumentation/form.js +132 -0
  88. package/dist/instrumentation/input.d.ts +2 -0
  89. package/dist/instrumentation/input.js +180 -0
  90. package/dist/instrumentation/location.d.ts +11 -0
  91. package/dist/instrumentation/location.js +69 -0
  92. package/dist/instrumentation/naming-evidence.d.ts +20 -0
  93. package/dist/instrumentation/naming-evidence.js +11 -0
  94. package/dist/instrumentation/navigation.d.ts +2 -0
  95. package/dist/instrumentation/navigation.js +144 -0
  96. package/dist/instrumentation/network-request.d.ts +103 -0
  97. package/dist/instrumentation/network-request.js +285 -0
  98. package/dist/instrumentation/network-span-attributes.d.ts +25 -0
  99. package/dist/instrumentation/network-span-attributes.js +153 -0
  100. package/dist/instrumentation/network.d.ts +16 -0
  101. package/dist/instrumentation/network.js +502 -0
  102. package/dist/instrumentation/page.d.ts +2 -0
  103. package/dist/instrumentation/page.js +56 -0
  104. package/dist/instrumentation/performance.d.ts +2 -0
  105. package/dist/instrumentation/performance.js +365 -0
  106. package/dist/integrations/next-router.d.ts +16 -0
  107. package/dist/integrations/next-router.js +18 -0
  108. package/dist/integrations/react-router.d.ts +7 -0
  109. package/dist/integrations/react-router.js +61 -0
  110. package/dist/internal/internal-log.d.ts +23 -0
  111. package/dist/internal/internal-log.js +47 -0
  112. package/dist/internal/metrics.d.ts +10 -0
  113. package/dist/internal/metrics.js +50 -0
  114. package/dist/provider/_version.d.ts +1 -0
  115. package/dist/provider/_version.js +3 -0
  116. package/dist/provider/config.d.ts +12 -0
  117. package/dist/provider/config.js +177 -0
  118. package/dist/provider/constants.d.ts +62 -0
  119. package/dist/provider/constants.js +118 -0
  120. package/dist/provider/contracts.d.ts +51 -0
  121. package/dist/provider/contracts.js +46 -0
  122. package/dist/provider/privacy-policy-store.d.ts +20 -0
  123. package/dist/provider/privacy-policy-store.js +56 -0
  124. package/dist/provider/sampling.d.ts +2 -0
  125. package/dist/provider/sampling.js +17 -0
  126. package/dist/provider/sdk-event-pipeline.d.ts +60 -0
  127. package/dist/provider/sdk-event-pipeline.js +478 -0
  128. package/dist/provider/sdk-input-normalization.d.ts +7 -0
  129. package/dist/provider/sdk-input-normalization.js +113 -0
  130. package/dist/provider/sdk-otel-pipeline.d.ts +14 -0
  131. package/dist/provider/sdk-otel-pipeline.js +148 -0
  132. package/dist/provider/sdk-runtime-surfaces.d.ts +49 -0
  133. package/dist/provider/sdk-runtime-surfaces.js +216 -0
  134. package/dist/provider/sdk.d.ts +2 -0
  135. package/dist/provider/sdk.js +614 -0
  136. package/dist/provider/types.d.ts +323 -0
  137. package/dist/provider/types.js +1 -0
  138. package/dist/provider/usage-governor.d.ts +7 -0
  139. package/dist/provider/usage-governor.js +116 -0
  140. package/package.json +59 -0
@@ -0,0 +1,163 @@
1
+ import { generateEventId, generateInteractionId, generateRequestId, generateRequestSpanId, generateTraceId, } from "../exporter/event-id.js";
2
+ const generateSpanId = () => {
3
+ return `span_${generateEventId()}`;
4
+ };
5
+ export class TraceManager {
6
+ constructor() {
7
+ this.traceId = generateTraceId();
8
+ this.activeSpanId = null;
9
+ this.activeInteraction = null;
10
+ this.recentInteraction = null;
11
+ this.latestTrigger = null;
12
+ }
13
+ reset(options) {
14
+ this.traceId = generateTraceId();
15
+ this.activeSpanId = null;
16
+ if (!options?.preserveActiveInteraction) {
17
+ this.activeInteraction = null;
18
+ this.recentInteraction = null;
19
+ this.latestTrigger = null;
20
+ }
21
+ }
22
+ getSnapshot() {
23
+ return {
24
+ traceId: this.traceId,
25
+ activeSpanId: this.activeSpanId,
26
+ };
27
+ }
28
+ startRootSpan() {
29
+ const spanId = generateSpanId();
30
+ this.activeSpanId = spanId;
31
+ return {
32
+ traceId: this.traceId,
33
+ spanId,
34
+ };
35
+ }
36
+ setActiveSpan(spanId) {
37
+ this.activeSpanId = spanId;
38
+ }
39
+ startFrontendAction(input = {}) {
40
+ const nowMs = input.nowMs ?? Date.now();
41
+ const interactionId = input.interactionId ?? generateInteractionId();
42
+ this.traceId = generateTraceId();
43
+ this.activeInteraction = {
44
+ interactionId,
45
+ interactionInitiator: input.interactionInitiator ?? null,
46
+ interactionStartEventKind: input.interactionStartEventKind ?? null,
47
+ targetStableKey: input.targetStableKey ?? null,
48
+ formKey: input.formKey ?? null,
49
+ interactionScopeKind: input.interactionScopeKind ?? null,
50
+ interactionScopeKey: input.interactionScopeKey ?? null,
51
+ viewId: input.viewId ?? null,
52
+ };
53
+ this.recentInteraction = {
54
+ ...this.snapshotOf(this.activeInteraction),
55
+ lastSeenAtMs: nowMs,
56
+ };
57
+ this.latestTrigger = null;
58
+ return interactionId;
59
+ }
60
+ endFrontendAction(interactionId) {
61
+ if (!this.activeInteraction)
62
+ return;
63
+ if (interactionId && this.activeInteraction.interactionId !== interactionId) {
64
+ return;
65
+ }
66
+ this.recentInteraction = {
67
+ ...this.snapshotOf(this.activeInteraction),
68
+ lastSeenAtMs: Date.now(),
69
+ };
70
+ this.activeInteraction = null;
71
+ this.latestTrigger = null;
72
+ }
73
+ getOrStartFrontendAction(input) {
74
+ if (!this.activeInteraction) {
75
+ return this.startFrontendAction(input);
76
+ }
77
+ if (input.viewId && this.activeInteraction.viewId !== input.viewId) {
78
+ return this.startFrontendAction(input);
79
+ }
80
+ return this.activeInteraction.interactionId;
81
+ }
82
+ recordTrigger(input) {
83
+ this.latestTrigger = {
84
+ interactionInitiator: input.interactionInitiator ?? null,
85
+ interactionStartEventKind: input.interactionStartEventKind ?? null,
86
+ targetStableKey: input.targetStableKey ?? null,
87
+ formKey: input.formKey ?? null,
88
+ interactionScopeKind: input.interactionScopeKind ?? null,
89
+ interactionScopeKey: input.interactionScopeKey ?? null,
90
+ };
91
+ }
92
+ // UI 操作はページ visit interaction に参加する。request はこの id を共有せず、
93
+ // createRequestContext() で request ごとに fresh な interaction_id を持つ。
94
+ startInteraction(input) {
95
+ const interactionId = this.getOrStartFrontendAction(input);
96
+ this.recordTrigger(input);
97
+ return interactionId;
98
+ }
99
+ joinOrStartInteraction(input) {
100
+ return this.startInteraction(input);
101
+ }
102
+ joinClickInteractionForSubmit(input) {
103
+ if (!this.activeInteraction)
104
+ return null;
105
+ this.recordTrigger({
106
+ formKey: input.formKey,
107
+ interactionInitiator: "submit",
108
+ interactionStartEventKind: "submit",
109
+ nowMs: input.nowMs,
110
+ });
111
+ return this.activeInteraction.interactionId;
112
+ }
113
+ getActiveInteractionId() {
114
+ return this.getActiveInteractionSnapshot()?.interactionId ?? null;
115
+ }
116
+ getActiveInteractionSnapshot() {
117
+ const active = this.getActiveInteractionState();
118
+ return active ? this.snapshotOf(active) : null;
119
+ }
120
+ getRecentInteractionSnapshot(nowMs = Date.now(), maxAgeMs) {
121
+ const active = this.getActiveInteractionSnapshot();
122
+ if (active) {
123
+ return active;
124
+ }
125
+ if (!this.recentInteraction) {
126
+ return null;
127
+ }
128
+ if (nowMs - this.recentInteraction.lastSeenAtMs > maxAgeMs) {
129
+ this.recentInteraction = null;
130
+ return null;
131
+ }
132
+ const { lastSeenAtMs: _lastSeenAtMs, ...snapshot } = this.recentInteraction;
133
+ return snapshot;
134
+ }
135
+ createRequestContext(input) {
136
+ const active = this.getActiveInteractionState();
137
+ const trigger = this.latestTrigger;
138
+ return {
139
+ traceId: generateTraceId(),
140
+ parentSpanId: this.activeSpanId,
141
+ requestId: input?.requestId ?? generateRequestId(),
142
+ requestSpanId: generateRequestSpanId(),
143
+ interactionId: generateInteractionId(),
144
+ interactionInitiator: trigger?.interactionInitiator ?? "background",
145
+ interactionStartEventKind: trigger?.interactionStartEventKind ?? "background_request",
146
+ originFrontendInteractionId: active?.interactionId ?? null,
147
+ };
148
+ }
149
+ getActiveInteractionState() {
150
+ return this.activeInteraction;
151
+ }
152
+ snapshotOf(state) {
153
+ return {
154
+ interactionId: state.interactionId,
155
+ interactionInitiator: state.interactionInitiator,
156
+ interactionStartEventKind: state.interactionStartEventKind,
157
+ targetStableKey: state.targetStableKey,
158
+ formKey: state.formKey,
159
+ interactionScopeKind: state.interactionScopeKind,
160
+ interactionScopeKey: state.interactionScopeKey,
161
+ };
162
+ }
163
+ }
@@ -0,0 +1,94 @@
1
+ import type { InternalMetricsStore } from "../internal/metrics.js";
2
+ import type { CluebaseConsentState, IngestUsageGovernorFeedback } from "../provider/types.js";
3
+ import { type CollectionPermit } from "./browser-outbox.js";
4
+ import { DiagnosticStore, type DiagnosticsSnapshot } from "./diagnostics.js";
5
+ import type { IngestClient } from "./client.js";
6
+ import type { BrowserSourceEvent } from "./source-event.js";
7
+ /**
8
+ * 束ねて送る側が、送信の口に実際に求めるもの。
9
+ *
10
+ * **`IngestClient` 全体(26 member)を求めていました。** ここで使うのは 4 つだけ
11
+ * なので、試験の作り物は残り 22 個を持てず、`as unknown as IngestClient` で
12
+ * 嘘をつくしかない状態でした(`tests/README.md` §10)。求める口を実際に使うものへ
13
+ * 狭めると、作り物は嘘なしで満たせます。**5 つ目を使い始めたら、ここが変わって
14
+ * 作り物が落ちます。** それが狙いです。
15
+ *
16
+ * 一覧は `Pick` で本体から引きます。**member の形を書き写しません**
17
+ * (`CLAUDE.md` §0.2)。
18
+ */
19
+ export type BatchIngestClient = Pick<IngestClient, "send" | "hasUsableBrowserToken" | "createBatchEnvelopeMetadata" | "measurePayloadBytes">;
20
+ export type BatchTransportOptions = {
21
+ enabled: boolean;
22
+ flushIntervalMs: number;
23
+ maxPayloadBytes: number;
24
+ flushThresholdBytes?: number;
25
+ client: BatchIngestClient;
26
+ metrics?: InternalMetricsStore;
27
+ queueMaxBytes?: number;
28
+ queueMaxItems?: number;
29
+ projectKey?: string;
30
+ initialConsent?: CluebaseConsentState;
31
+ diagnostics?: DiagnosticStore;
32
+ onGovernorFeedback?: (feedback: IngestUsageGovernorFeedback) => void;
33
+ };
34
+ export type FlushDeadline = {
35
+ readonly signal: AbortSignal;
36
+ readonly deadlineAt: number;
37
+ };
38
+ export declare class BatchTransport {
39
+ private readonly outbox;
40
+ private readonly client;
41
+ private readonly enabled;
42
+ private readonly flushIntervalMs;
43
+ private readonly maxPayloadBytes;
44
+ private readonly flushThresholdBytes;
45
+ private readonly metrics;
46
+ private readonly diagnostics;
47
+ private readonly onGovernorFeedback;
48
+ private idleHandle;
49
+ private flushing;
50
+ private flushAgainAfterCurrent;
51
+ private activeSendController;
52
+ private closeDeadlineController;
53
+ private closeDeadlineTimer;
54
+ private closeDeadlineAt;
55
+ private closePermitOrdinal;
56
+ private flushDeadlineController;
57
+ private flushDeadlineTimer;
58
+ private flushDeadlineAt;
59
+ private lifecycle;
60
+ private closeHadTerminalDisposition;
61
+ private activeFlushPromise;
62
+ private enqueueTail;
63
+ private readonly seenEventIds;
64
+ private static readonly DEDUP_CAPACITY;
65
+ constructor(options: BatchTransportOptions);
66
+ getDiagnostics(): DiagnosticsSnapshot;
67
+ start(): void;
68
+ stop(): void;
69
+ dispose(): void;
70
+ currentConsent(): CluebaseConsentState;
71
+ capturePermit(): CollectionPermit;
72
+ setConsent(consent: CluebaseConsentState): void;
73
+ enqueue(event: BrowserSourceEvent, permit?: CollectionPermit): void;
74
+ private scheduleFlushDeadline;
75
+ beginFlushDeadline(): FlushDeadline | null;
76
+ endFlushDeadline(deadline: FlushDeadline | null | undefined): void;
77
+ flush(deadline?: FlushDeadline | null): Promise<void>;
78
+ private runFlushUntilIdle;
79
+ beginClose(): AbortSignal | null;
80
+ close(): Promise<void>;
81
+ private runFlushCycle;
82
+ private sendBatchWhilePermitted;
83
+ private applyDeliveryResult;
84
+ private applyFailedDelivery;
85
+ private applySuccessfulDelivery;
86
+ flushOnUnload(): void;
87
+ clear(): void;
88
+ private abortActiveSendForConsent;
89
+ private recordPendingBatchCount;
90
+ private clearCloseDeadline;
91
+ private currentDeadline;
92
+ private queueOutboxMutation;
93
+ private shouldRetainFailedBatch;
94
+ }