Skip to content

feat(node): distributed tracing spans - #4579

Open
turnipdabeets wants to merge 7 commits into
mainfrom
feat/traces-node-mvp
Open

feat(node): distributed tracing spans#4579
turnipdabeets wants to merge 7 commits into
mainfrom
feat/traces-node-mvp

Conversation

@turnipdabeets

@turnipdabeets turnipdabeets commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Problem

Developers instrumenting a Node service with PostHog have no way to record spans. They can send events, logs and metrics, but nothing that shows where time went in a request or how work fans out across services. Pointing an OpenTelemetry SDK at PostHog works, but it means adding an OTel dependency and wiring the join to PostHog identity by hand — so traces end up disconnected from the person and session they belong to.

Part of a stacked series adding first-class tracing to the JS SDKs (Q3 Goal 4). Scoped to be releasable on its own, one commit, on top of the shared OTLP attribute encoder from #4708 (merged).

Changes

Adds startSpan, withSpan and getActiveSpan to posthog-node, behind a new traces client option. Spans are encoded as OpenTelemetry-shaped OTLP JSON and POSTed to /i/v1/traceswithout an OpenTelemetry dependency.

const posthog = new PostHog('phc_...', { traces: { serviceName: 'checkout-api' } })

await posthog.withSpan('POST /checkout', { parent: req.headers.traceparent }, async (span) => {
    span.setAttribute('plan', user.plan)
    return processOrder()
})
  • Off until configured. No traces option means no spans. Every span API still returns a working (inert) handle, so calling code never branches on whether tracing is on.
  • Identity join. Spans started inside a request context carry posthogDistinctId and sessionId, taken from withContext or the existing Express/NestJS middleware. This is what makes a trace reachable from a person or session.
  • W3C trace context. parent accepts an inbound traceparent string to continue a remote trace; span.traceparent() gives you the header to propagate onward. tracestate is preserved opaquely.
  • Nesting across await on Node, via AsyncLocalStorage injected at the Node entrypoint. Core stays runtime-agnostic (no node:async_hooks), so the edge build and future browser/RN hosts work off the same engine.
  • flush() drains spans, concurrently with the event queue. Serverless handlers call flush(), not shutdown(), so leaving spans on their own timer would silently lose them for the most common posthog-node deployment. A span ending also refreshes the waitUntil cycle, so a handler that only traces still holds its invocation open.
  • Bounded live spans. maxLiveSpans (default 10000) caps how many spans may be open at once and maxSpanAgeMs (default one hour) stops accounting for one that stays open longer, so code that starts spans and never ends them cannot grow the SDK's bookkeeping without limit. At the cap startSpan returns an inert handle; an evicted span is never exported. Both drops go through the existing span-drop warning.
  • Bounded retries. A batch the endpoint keeps refusing is retried with exponential backoff capped at 30s, then dropped after 8 consecutive failures, so a stuck batch cannot pin the queue while fresher spans are refused at the cap.

Reviewer notes

  • Edge runtime — the edge build restores the active span when a callback returns its promise, not when it settles, so spans started after an await there begin a new trace. Pass parent explicitly to nest them. This is the documented browser limitation too.
  • IPostHog gains three required members (startSpan, withSpan, getActiveSpan). Consumers using it as a type annotation are unaffected; anyone implementing it (hand-written test doubles, DI wrappers) will get a compile error. Same shape as metrics in feat(metrics): wire posthog.metrics into posthog-node #4117, which shipped under a minor bump.
  • JSON, not protobuf — and this is conformant, not a divergence. The spec makes protobuf canonical only "where the encoder adds no meaningful dependency or binary-size cost". A protobuf encoder is a real dependency for a zero-dependency package, so the condition does not fire and the SHOULD-send-JSON branch applies. It also matches what the shipped logs and metrics pipelines already send.
  • A 200 is not proof of correct configuration — the ingestion endpoint accepts a well-formed but unknown project key with a 200 and drops the spans.
  • The shared OTLP attribute encoder moved to refactor(core): share one OTLP attribute encoder across logs, metrics and traces #4708, which has merged. Spans reuse it rather than adding a third copy. Span batches likewise go through _sendOtlpBatch (from fix(core): send logs and metrics through one OTLP batch sender #4623) rather than a third copy of the retry policy — the bearer-auth branch is reintroduced there for traces.
  • Docs — the Node library page section is drafted in PostHog/posthog.com#19837, held as a draft until this PR merges and ships. It documents both flush() and shutdown() as span drains.
  • Live spans are bounded without retaining spans. The obvious way to implement the spec's Live span bounds requirement is a registry of live span objects, which would keep every leaked handle alive for the length of the age bound. Instead the engine keeps a Map of span id to monotonic start — ids and numbers, never the span — so a handle the caller drops is still collected like any other object, and the count bound can be generous because a slot costs tens of bytes rather than a whole span. packages/core/src/traces/live-spans.spec.ts keeps its WeakRef probe, now as the guard that stops a later change from turning this into a registry of spans. Eviction is lazy at startSpan, and sweeps before reading the bound, so a process that has leaked its way to the cap recovers on the first call after the leaks age out rather than losing tracing for the rest of its life.
  • Retry-After is not honoured — the backoff is purely exponential, capped at 30s. This is a shared gap with the logs and metrics senders rather than something this PR introduces, and the service does not emit 429 yet. Tracked separately.
  • Deliberately deferred to later PRs in this stack: beforeSpanSend and per-span caps (feat(node): beforeSpanSend hook and per-span limits #4584), OpenTelemetry soft-detect, browser host, and log/exception correlation.

Verification

End-to-end against a real project (381971), twice: first a scripted run, then a real Express app using setupExpressRequestContext with two routes, a genuine HTTP hop between them, and an error path. Spans read back out of the product assembled correctly — POST /checkout root with db.query and http.post payments beneath it, GET /payments/charge continued across the hop via traceparent, and a separate trace for the thrown route carrying status_code: 2. posthogDistinctId / sessionId came from the X-POSTHOG-* request headers on every in-context span, with no manual plumbing.

Also exercised against production ingestion: an oversized batch really does 413 (11.5 MB → 413, halved to 5.75 MB → 200 twice, all spans queryable afterwards), and 50k spans push through at ~310k/sec with 204 KB average batches — the first real evidence that the 512-span default sits under the body cap. With the endpoint down, 200k spans cost exactly 1 request rather than one per span.

packages/core 1305 pass (62 suites), packages/node 1000 pass (35 suites) — identical under the edge runtime environment — lint clean, public API references regenerated.

Release info Sub-libraries affected

Libraries affected

  • All of them
  • posthog-js (web)
  • posthog-js-lite (web lite)
  • posthog-node
  • posthog-react-native
  • @posthog/react-native-plugin
  • @posthog/react
  • @posthog/ai
  • @posthog/convex
  • @posthog/next
  • @posthog/nextjs-config
  • @posthog/nuxt
  • @posthog/openfeature-node-provider
  • @posthog/openfeature-web-provider
  • @posthog/rollup-plugin
  • @posthog/webpack-plugin
  • @posthog/types
  • @posthog/browser-common

@posthog/core is also bumped (minor); it has no checkbox above.

Checklist

  • Tests for new code
  • Accounted for the impact of any changes across different platforms
  • Accounted for backwards compatibility of any changes (no breaking changes!)
  • Took care not to unnecessarily increase the bundle size

Backwards compatibility caveat: all runtime surface is additive, but IPostHog gains three required members — a compile-time break for implementors only, matching the metrics precedent. Bundle: the traces module is core-resident and the browser is not wired up in this PR.

If releasing new changes

  • Ran pnpm changeset to generate a changeset file

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

Built with Claude Code, directed by @turnipdabeets, from the merged traces capability spec in sdk-specs.

Decisions worth flagging for review:

  • Top-level methods over a posthog.traces.* namespace — matches how the OTel API reads and keeps the common call short.
  • Vertical slice over a horizontal one. An earlier plan split encoding, transport and API into separate PRs; that was rejected because each merged PR is releasable, and a released half-feature isn't useful to anyone. Each PR in this stack is a feature a developer could adopt.
  • OtlpSpanKeyValue is an alias of the logs/metrics OtlpKeyValue rather than a separate declaration — one encoder produces all three payloads. The span-flavoured name stays so the span types read as span types.
  • Wire types live in @posthog/types only, matching how the logs and metrics wire types are already organised.

Put through five rounds of independent fresh-context review, each reviewer required to demonstrate a finding by running it rather than by reading. Bugs they caught, all fixed here and each now pinned by a test that fails when the fix is reverted:

  • a background flush trigger per span end, stacking an unbounded number of concurrent drain loops on a busy service (measured: 193 outstanding, 14× CPU degradation, linear heap growth)
  • the depth-based flush cancelling its own retry backoff, so an outage cost ~1,500 requests instead of one
  • span names, event names, status.message and traceState skipping the sanitiser attributes go through, so one lone surrogate would 400 an entire 512-span batch
  • the retry budget charging fresh spans to a batch's already-spent budget
  • a throwing accessor in resourceAttributes rethrowing on every flush, exporting nothing, forever
  • the waitUntil serverless path having no traces coverage at all, and a span-only handler never registering with it

Several of those were introduced by earlier rounds' own fixes, which is why the loop ran as long as it did.

@turnipdabeets turnipdabeets self-assigned this Aug 20, 2026
@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

posthog-node Compliance Report

Date: 2026-09-01 18:36:13 UTC
Duration: 198091ms

✅ All Tests Passed!

111/111 tests passed


Capture_V1 Tests

94/94 tests passed

View Details
Test Status Duration
Endpoint And Method.Targets V1 Endpoint 72ms
Endpoint And Method.Does Not Use Legacy Endpoints 11ms
Required Headers.Has Authorization Bearer Header 11ms
Required Headers.Has Content Type Json 10ms
Required Headers.Has Posthog Sdk Info Format 10ms
Required Headers.Has Posthog Attempt Header 9ms
Required Headers.Has Posthog Request Id 10ms
Required Headers.Has Posthog Request Timestamp 8ms
Required Headers.Has User Agent 9ms
Body Format.Body Has Created At And Batch 8ms
Body Format.No Api Key In Body 7ms
Body Format.No Sent At In Body 7ms
Event Format.Event Has Required Root Fields 6ms
Event Format.Event Uuid Is Valid 6ms
Event Format.Event Timestamp Is Rfc3339 6ms
Event Format.Distinct Id Is String 6ms
Event Format.Distinct Id At Root Not Properties 7ms
Event Format.Custom Properties Preserved 6ms
Event Format.Set Properties Preserved 6ms
Event Format.Set Once Properties Preserved 7ms
Event Format.Groups Properties Preserved 7ms
Event Format.Sdk Generates Uuid If Not Provided 8ms
Event Format.Event Has Required Root Fields Batch 9ms
Event Format.Event Uuid Is Valid Batch 9ms
Event Format.Event Timestamp Is Rfc3339 Batch 10ms
Event Format.Distinct Id Is String Batch 9ms
Event Format.Distinct Id At Root Not Properties Batch 10ms
Event Format.Custom Properties Preserved Batch 9ms
Event Format.Set Properties Preserved Batch 10ms
Event Format.Set Once Properties Preserved Batch 11ms
Event Format.Groups Properties Preserved Batch 10ms
Event Format.Sdk Generates Uuid If Not Provided Batch 8ms
Batch Behavior.Multiple Events In Single Batch 12ms
Batch Behavior.Batch Envelope Smoke 10ms
Batch Behavior.Flush With No Events Sends Nothing 4ms
Batch Behavior.Flush At Triggers Batch 1008ms
Batch Behavior.Created At Reflects Batch Creation Time 9ms
Deduplication.Generates Unique Uuids 17ms
Deduplication.Different Events Same Content Different Uuids 8ms
Deduplication.Preserves Uuid On Retry 6018ms
Deduplication.Preserves Timestamp On Retry 6021ms
Deduplication.Preserves Uuid And Timestamp On Batch Retry 6021ms
Deduplication.No Duplicate Events In Batch 15ms
Header Behavior On Retry.Attempt Header Starts At One 7ms
Header Behavior On Retry.Attempt Header Increments On Retry 12027ms
Header Behavior On Retry.Request Id Preserved On Retry 6020ms
Header Behavior On Retry.Different Requests Have Different Request Ids 2017ms
Header Behavior On Retry.Request Timestamp Changes On Retry 6015ms
Response Format Validation.Success Response Has Uuid Keyed Results 10ms
Response Format Validation.Success Response Has Ok For Each Event 10ms
Response Format Validation.Success No Retry After When All Ok 10ms
Response Format Validation.Success Retry After Present When Retry Events 1012ms
Response Format Validation.Success No Retry After When Drop Only 17ms
Response Format Validation.Response Echoes Request Id 8ms
Retry Behavior.Retries On 408 6016ms
Retry Behavior.Retries On 500 6020ms
Retry Behavior.Retries On 503 7023ms
Retry Behavior.Retries On 504 6021ms
Retry Behavior.Retryable Errors Have Retry After 3016ms
Retry Behavior.Respects Retry After On Retryable Error 11022ms
Retry Behavior.Does Not Retry On 400 2013ms
Retry Behavior.Does Not Retry On 401 2012ms
Retry Behavior.Does Not Retry On 402 2012ms
Retry Behavior.Does Not Retry On 413 2012ms
Retry Behavior.Does Not Retry On 415 2012ms
Retry Behavior.Non Retryable Errors Have No Retry After 2013ms
Retry Behavior.Implements Backoff 18037ms
Retry Behavior.Max Retries Respected 18041ms
Partial Batch Handling.Handles 200 Full Success 2010ms
Partial Batch Handling.Handles 200 With All Ok 3017ms
Partial Batch Handling.Does Not Retry Dropped Events 3014ms
Partial Batch Handling.Does Not Retry Limited Events 3015ms
Partial Batch Handling.Prunes Ok Events On Partial Retry 6019ms
Partial Batch Handling.Prunes Dropped Events On Partial Retry 6019ms
Partial Batch Handling.Retries Only Retry Events From Partial 6021ms
Partial Batch Handling.Partial Retry Preserves Uuids 6021ms
Partial Batch Handling.Partial Retry Attempt Header Increments 6020ms
Partial Batch Handling.Partial Retry Request Id Preserved 6022ms
Partial Batch Handling.Respects Retry After On Partial 8022ms
Partial Batch Handling.Unknown Result Treated As Terminal 3013ms
Partial Batch Handling.Mixed Ok Drop Limited No Retry 3018ms
Compression.Sends Gzip Content Encoding 9ms
Compression.No Content Encoding When Disabled 7ms
Compression.Compressed Body Is Decompressible 7ms
Error Handling.Does Not Retry On Unknown 4Xx 2011ms
Event Options.Cookieless Mode Override 10ms
Event Options.Disable Skew Correction Override 8ms
Event Options.Process Person Profile Override 8ms
Event Options.Product Tour Id Override 8ms
Event Options.Unset Options Omitted 8ms
Event Options.Options Override In Batch 10ms
Geoip And Historical Migration.Geoip Disable Injected Into Properties 6ms
Geoip And Historical Migration.Historical Migration Set In Body 7ms
Geoip And Historical Migration.Historical Migration Absent By Default 7ms

Feature_Flags Tests

17/17 tests passed

View Details
Test Status Duration
Request Payload.Request With Person Properties Device Id 10ms
Request Payload.Flags Request Uses V2 Query Param 9ms
Request Payload.Flags Request Hits Flags Path Not Decide 9ms
Request Payload.Flags Request Omits Authorization Header 8ms
Request Payload.Token In Flags Body Matches Init 9ms
Request Payload.Groups Round Trip 8ms
Request Payload.Groups Default To Empty Object 9ms
Request Payload.Disable Geoip False Propagates As Geoip Disable False 8ms
Request Payload.Disable Geoip Omitted Defaults To False 10ms
Request Payload.Flag Keys To Evaluate Contains Only Requested Key 8ms
Request Lifecycle.No Flags Request On Init Alone 2ms
Request Lifecycle.No Flags Request On Normal Capture 7ms
Request Lifecycle.Two Flag Calls Produce Two Remote Requests 12ms
Request Lifecycle.Mock Response Value Is Returned To Caller 8ms
Retry Behavior.Retries Flags On 502 265ms
Retry Behavior.Retries Flags On 504 264ms
Side Effect Events.Get Feature Flag Captures Feature Flag Called Event 10ms

@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

posthog-js Compliance Report

Date: 2026-09-01 18:43:32 UTC
Duration: 88807ms

✅ All Tests Passed!

26/26 tests passed


Capture Tests

26/26 tests passed

View Details
Test Status Duration
Format Validation.Event Has Required Fields Client 105ms
Format Validation.Event Has Uuid 17ms
Format Validation.Event Has Lib Properties 14ms
Format Validation.Distinct Id Is String Client 15ms
Format Validation.Token Is Present Client 16ms
Format Validation.Custom Properties Preserved 24ms
Format Validation.Event Has Timestamp 21ms
Retry Behavior.Retries On 503 5027ms
Retry Behavior.Does Not Retry On 400 2017ms
Retry Behavior.Does Not Retry On 401 2015ms
Retry Behavior.Respects Retry After Header 5018ms
Retry Behavior.Implements Backoff 15029ms
Retry Behavior.Retries On 500 5017ms
Retry Behavior.Retries On 502 5014ms
Retry Behavior.Retries On 504 5019ms
Retry Behavior.Max Retries Respected 15025ms
Deduplication.Generates Unique Uuids 21ms
Deduplication.Preserves Uuid On Retry 5013ms
Deduplication.Preserves Uuid And Timestamp On Retry 10022ms
Deduplication.Preserves Uuid And Timestamp On Batch Retry 5018ms
Deduplication.No Duplicate Events In Batch 20ms
Deduplication.Different Events Have Different Uuids 12ms
Batch Format.Flush With No Events Sends Nothing 6ms
Error Handling.Does Not Retry On 403 2012ms
Error Handling.Does Not Retry On 413 2013ms
Error Handling.Retries On 408 5013ms

@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Size Change: +88.6 kB (+0.43%)

Total Size: 20.9 MB

📦 View Changed
Filename Size Change
packages/core/dist/index.js 25.9 kB +1.84 kB (+7.65%) 🔍
packages/core/dist/index.mjs 2.84 kB +234 B (+8.98%) 🔍
packages/core/dist/posthog-core-stateless.js 47.3 kB +411 B (+0.88%)
packages/core/dist/posthog-core-stateless.mjs 44 kB +411 B (+0.94%)
packages/core/dist/traces/context.js 1.54 kB +1.54 kB (new file) 🆕
packages/core/dist/traces/context.mjs 318 B +318 B (new file) 🆕
packages/core/dist/traces/ids.js 3.1 kB +3.1 kB (new file) 🆕
packages/core/dist/traces/ids.mjs 1.52 kB +1.52 kB (new file) 🆕
packages/core/dist/traces/index.js 16.2 kB +16.2 kB (new file) 🆕
packages/core/dist/traces/index.mjs 14.3 kB +14.3 kB (new file) 🆕
packages/core/dist/traces/otlp.js 5.62 kB +5.62 kB (new file) 🆕
packages/core/dist/traces/otlp.mjs 3.61 kB +3.61 kB (new file) 🆕
packages/core/dist/traces/sanitize.js 4.11 kB +4.11 kB (new file) 🆕
packages/core/dist/traces/sanitize.mjs 2.32 kB +2.32 kB (new file) 🆕
packages/core/dist/traces/span.js 8.55 kB +8.55 kB (new file) 🆕
packages/core/dist/traces/span.mjs 6.37 kB +6.37 kB (new file) 🆕
packages/core/dist/traces/traceparent.js 3.25 kB +3.25 kB (new file) 🆕
packages/core/dist/traces/traceparent.mjs 1.6 kB +1.6 kB (new file) 🆕
packages/core/dist/traces/types.js 603 B +603 B (new file) 🆕
packages/node/dist/client.js 61.8 kB +2.21 kB (+3.71%)
packages/node/dist/client.mjs 58.2 kB +2.05 kB (+3.66%)
packages/node/dist/entrypoints/index.node.js 6.53 kB +474 B (+7.83%) 🔍
packages/node/dist/entrypoints/index.node.mjs 1.63 kB +200 B (+13.98%) ⚠️
packages/node/dist/extensions/context/span-context.node.js 1.7 kB +1.7 kB (new file) 🆕
packages/node/dist/extensions/context/span-context.node.mjs 355 B +355 B (new file) 🆕
packages/node/dist/traces-********.js 3.15 kB +3.15 kB (new file) 🆕
packages/node/dist/traces-********.mjs 1.94 kB +1.94 kB (new file) 🆕
packages/types/dist/traces.js 603 B +603 B (new file) 🆕
ℹ️ View Unchanged
Filename Size Change
packages/ai/dist/anthropic/index.cjs 42.5 kB 0 B
packages/ai/dist/anthropic/index.mjs 42.1 kB 0 B
packages/ai/dist/gemini/index.cjs 41.7 kB 0 B
packages/ai/dist/gemini/index.mjs 41.6 kB 0 B
packages/ai/dist/index.cjs 63.9 kB 0 B
packages/ai/dist/index.mjs 63.8 kB 0 B
packages/ai/dist/langchain/index.cjs 43.1 kB 0 B
packages/ai/dist/langchain/index.mjs 43.1 kB 0 B
packages/ai/dist/langchain/middleware/index.cjs 49.8 kB 0 B
packages/ai/dist/langchain/middleware/index.mjs 49.8 kB 0 B
packages/ai/dist/openai-agents/index.cjs 31.8 kB 0 B
packages/ai/dist/openai-agents/index.mjs 31.7 kB 0 B
packages/ai/dist/openai/index.cjs 94.9 kB 0 B
packages/ai/dist/openai/index.mjs 94.5 kB 0 B
packages/ai/dist/otel/index.cjs 18.4 kB 0 B
packages/ai/dist/otel/index.mjs 18.3 kB 0 B
packages/ai/dist/vercel/index.cjs 54 kB 0 B
packages/ai/dist/vercel/index.mjs 53.9 kB 0 B
packages/browser-common/dist/client.js 603 B 0 B
packages/browser-common/dist/client.mjs 0 B 0 B 🆕
packages/browser-common/dist/config.js 1.43 kB 0 B
packages/browser-common/dist/config.mjs 223 B 0 B
packages/browser-common/dist/constants.js 1.66 kB 0 B
packages/browser-common/dist/constants.mjs 219 B 0 B
packages/browser-common/dist/disposable.js 1.63 kB 0 B
packages/browser-common/dist/disposable.mjs 386 B 0 B
packages/browser-common/dist/extension-runtime.js 3.07 kB 0 B
packages/browser-common/dist/extension-runtime.mjs 1.83 kB 0 B
packages/browser-common/dist/extension.js 603 B 0 B
packages/browser-common/dist/extension.mjs 0 B 0 B 🆕
packages/browser-common/dist/index.js 3.08 kB 0 B
packages/browser-common/dist/index.mjs 170 B 0 B
packages/browser-common/dist/persistence.js 603 B 0 B
packages/browser-common/dist/persistence.mjs 0 B 0 B 🆕
packages/browser-common/dist/pubsub.js 2.53 kB 0 B
packages/browser-common/dist/pubsub.mjs 1.35 kB 0 B
packages/browser-common/dist/token.js 603 B 0 B
packages/browser-common/dist/token.mjs 0 B 0 B 🆕
packages/browser-common/dist/types/compression.js 1.28 kB 0 B
packages/browser-common/dist/types/compression.mjs 93 B 0 B
packages/browser-common/dist/types/index.js 4.11 kB 0 B
packages/browser-common/dist/types/index.mjs 144 B 0 B
packages/browser-common/dist/types/network-recording.js 603 B 0 B
packages/browser-common/dist/types/network-recording.mjs 0 B 0 B 🆕
packages/browser-common/dist/types/remote-config.js 603 B 0 B
packages/browser-common/dist/types/remote-config.mjs 0 B 0 B 🆕
packages/browser-common/dist/types/surveys.js 4.55 kB 0 B
packages/browser-common/dist/types/surveys.mjs 2.17 kB 0 B
packages/browser-common/dist/utils/array-at-********.js 628 B 0 B
packages/browser-common/dist/utils/array-at-********.mjs 425 B 0 B
packages/browser-common/dist/utils/autocapture-utils.js 24.2 kB 0 B
packages/browser-common/dist/utils/autocapture-utils.mjs 18.6 kB 0 B
packages/browser-common/dist/utils/blocked-uas.js 2.1 kB 0 B
packages/browser-common/dist/utils/blocked-uas.mjs 598 B 0 B
packages/browser-common/dist/utils/cookie-utils.js 1.89 kB 0 B
packages/browser-common/dist/utils/cookie-utils.mjs 673 B 0 B
packages/browser-common/dist/utils/device-model-utils.js 1.98 kB 0 B
packages/browser-common/dist/utils/device-model-utils.mjs 678 B 0 B
packages/browser-common/dist/utils/element-utils.js 2.46 kB 0 B
packages/browser-common/dist/utils/element-utils.mjs 804 B 0 B
packages/browser-common/dist/utils/elements-chain-utils.js 2.77 kB 0 B
packages/browser-common/dist/utils/elements-chain-utils.mjs 1.23 kB 0 B
packages/browser-common/dist/utils/encode-utils.js 1.4 kB 0 B
packages/browser-common/dist/utils/encode-utils.mjs 205 B 0 B
packages/browser-common/dist/utils/event-utils.js 15.7 kB 0 B
packages/browser-common/dist/utils/event-utils.mjs 10 kB 0 B
packages/browser-common/dist/utils/general-utils.js 7.31 kB 0 B
packages/browser-common/dist/utils/general-utils.mjs 4.49 kB 0 B
packages/browser-common/dist/utils/globals.js 2.78 kB 0 B
packages/browser-common/dist/utils/globals.mjs 860 B 0 B
packages/browser-common/dist/utils/logger.js 3.4 kB 0 B
packages/browser-common/dist/utils/logger.mjs 1.61 kB 0 B
packages/browser-common/dist/utils/matcher-utils.js 2.85 kB 0 B
packages/browser-common/dist/utils/matcher-utils.mjs 1.33 kB 0 B
packages/browser-common/dist/utils/promise-utils.js 1.36 kB 0 B
packages/browser-common/dist/utils/promise-utils.mjs 169 B 0 B
packages/browser-common/dist/utils/property-utils.js 3.53 kB 0 B
packages/browser-common/dist/utils/property-utils.mjs 1.6 kB 0 B
packages/browser-common/dist/utils/prototype-utils.js 3.51 kB 0 B
packages/browser-common/dist/utils/prototype-utils.mjs 1.86 kB 0 B
packages/browser-common/dist/utils/regex-utils.js 1.45 kB 0 B
packages/browser-common/dist/utils/regex-utils.mjs 113 B 0 B
packages/browser-common/dist/utils/request-utils.js 6.73 kB 0 B
packages/browser-common/dist/utils/request-utils.mjs 4.19 kB 0 B
packages/browser-common/dist/utils/simple-event-emitter.js 1.76 kB 0 B
packages/browser-common/dist/utils/simple-event-emitter.mjs 553 B 0 B
packages/browser-common/dist/utils/stylesheet-loader.js 2.13 kB 0 B
packages/browser-common/dist/utils/stylesheet-loader.mjs 823 B 0 B
packages/browser-common/dist/utils/type-utils.js 1.59 kB 0 B
packages/browser-common/dist/utils/type-utils.mjs 267 B 0 B
packages/browser-common/dist/utils/url-targeting-utils.js 2.35 kB 0 B
packages/browser-common/dist/utils/url-targeting-utils.mjs 863 B 0 B
packages/browser-common/dist/utils/uuidv7.js 6.66 kB 0 B
packages/browser-common/dist/utils/uuidv7.mjs 5.18 kB 0 B
packages/browser-next/dist/analytics-********.js 1.58 kB 0 B
packages/browser-next/dist/analytics-********.mjs 219 B 0 B
packages/browser-next/dist/analytics-options.js 603 B 0 B
packages/browser-next/dist/analytics-options.mjs 0 B 0 B 🆕
packages/browser-next/dist/analytics.js 6.52 kB 0 B
packages/browser-next/dist/analytics.mjs 5.15 kB 0 B
packages/browser-next/dist/bot-filter.js 2.28 kB 0 B
packages/browser-next/dist/bot-filter.mjs 1.09 kB 0 B
packages/browser-next/dist/capture-v1.js 27.7 kB 0 B
packages/browser-next/dist/capture-v1.mjs 25.3 kB 0 B
packages/browser-next/dist/core.js 1.59 kB 0 B
packages/browser-next/dist/core.mjs 194 B 0 B
packages/browser-next/dist/extensions/registry.js 3.32 kB 0 B
packages/browser-next/dist/extensions/registry.mjs 2.11 kB 0 B
packages/browser-next/dist/id.js 2.15 kB 0 B
packages/browser-next/dist/id.mjs 983 B 0 B
packages/browser-next/dist/index.js 3.38 kB 0 B
packages/browser-next/dist/index.mjs 1.19 kB 0 B
packages/browser-next/dist/lane.js 18 kB 0 B
packages/browser-next/dist/lane.mjs 16.9 kB 0 B
packages/browser-next/dist/logger.js 1.77 kB 0 B
packages/browser-next/dist/logger.mjs 581 B 0 B
packages/browser-next/dist/posthog.js 33.1 kB 0 B
packages/browser-next/dist/posthog.mjs 30.9 kB 0 B
packages/browser-next/dist/rate-limiter.js 2.79 kB 0 B
packages/browser-next/dist/rate-limiter.mjs 1.58 kB 0 B
packages/browser-next/dist/request.js 4.52 kB 0 B
packages/browser-next/dist/request.mjs 3.21 kB 0 B
packages/browser-next/dist/state.js 24.8 kB 0 B
packages/browser-next/dist/state.mjs 23.2 kB 0 B
packages/browser-next/dist/types.js 603 B 0 B
packages/browser-next/dist/types.mjs 0 B 0 B 🆕
packages/browser-next/dist/version.js 1.21 kB 0 B
packages/browser-next/dist/version.mjs 45 B 0 B
packages/browser/dist/all-external-dependencies.js 362 kB 0 B
packages/browser/dist/array.full.es5.js 493 kB 0 B
packages/browser/dist/array.full.js 603 kB 0 B
packages/browser/dist/array.full.no-********.js 661 kB 0 B
packages/browser/dist/array.js 279 kB 0 B
packages/browser/dist/array.no-********.js 317 kB 0 B
packages/browser/dist/conversations.js 69 kB 0 B
packages/browser/dist/crisp-chat-integration.js 2.03 kB 0 B
packages/browser/dist/customizations.full.js 16.1 kB 0 B
packages/browser/dist/customizations.js 16 kB 0 B
packages/browser/dist/dead-clicks-autocapture.js 18.3 kB 0 B
packages/browser/dist/default-extensions.js 276 kB 0 B
packages/browser/dist/element-inference.js 5.62 kB 0 B
packages/browser/dist/exception-autocapture.js 13.6 kB 0 B
packages/browser/dist/extension-bundles.js 155 kB 0 B
packages/browser/dist/external-scripts-loader.js 3.6 kB 0 B
packages/browser/dist/intercom-integration.js 2.08 kB 0 B
packages/browser/dist/lazy-********.js 202 kB 0 B
packages/browser/dist/logs.js 5.83 kB 0 B
packages/browser/dist/main.js 283 kB 0 B
packages/browser/dist/module.full.js 606 kB 0 B
packages/browser/dist/module.full.no-********.js 663 kB 0 B
packages/browser/dist/module.js 282 kB 0 B
packages/browser/dist/module.no-********.js 321 kB 0 B
packages/browser/dist/module.slim.js 140 kB 0 B
packages/browser/dist/module.slim.no-********.js 154 kB 0 B
packages/browser/dist/posthog-********.js 202 kB 0 B
packages/browser/dist/product-tours-preview.js 82.4 kB 0 B
packages/browser/dist/product-tours.js 124 kB 0 B
packages/browser/dist/recorder-v2.js 126 kB 0 B
packages/browser/dist/recorder.js 126 kB 0 B
packages/browser/dist/rrweb-plugin-console-record.js 7.05 kB 0 B
packages/browser/dist/rrweb-types.js 2.33 kB 0 B
packages/browser/dist/rrweb.js 318 kB 0 B
packages/browser/dist/surveys-preview.js 81.5 kB 0 B
packages/browser/dist/surveys.js 103 kB 0 B
packages/browser/dist/tracing-headers.js 3.76 kB 0 B
packages/browser/dist/web-vitals-soft-navs.js 9.96 kB 0 B
packages/browser/dist/web-vitals-with-attribution-soft-navs.js 25.4 kB 0 B
packages/browser/dist/web-vitals-with-attribution.js 25.3 kB 0 B
packages/browser/dist/web-vitals.js 9.94 kB 0 B
packages/browser/react/dist/esm/index.js 22.5 kB 0 B
packages/browser/react/dist/esm/slim/index.js 18.9 kB 0 B
packages/browser/react/dist/esm/surveys/index.js 4.75 kB 0 B
packages/browser/react/dist/umd/index.js 25.9 kB 0 B
packages/browser/react/dist/umd/slim/index.js 21.8 kB 0 B
packages/browser/react/dist/umd/surveys/index.js 5.52 kB 0 B
packages/convex/dist/client/feature-flags/crypto.js 76 B 0 B
packages/convex/dist/client/feature-flags/evaluator.js 14.9 kB 0 B
packages/convex/dist/client/feature-flags/index.js 196 B 0 B
packages/convex/dist/client/feature-flags/match-********.js 5.08 kB 0 B
packages/convex/dist/client/feature-flags/types.js 44 B 0 B
packages/convex/dist/client/index.js 14.8 kB 0 B
packages/convex/dist/component/_generated/api.js 712 B 0 B
packages/convex/dist/component/_generated/component.js 212 B 0 B
packages/convex/dist/component/_generated/dataModel.js 230 B 0 B
packages/convex/dist/component/_generated/server.js 3.74 kB 0 B
packages/convex/dist/component/convex.config.js 1.66 kB 0 B
packages/convex/dist/component/crons.js 969 B 0 B
packages/convex/dist/component/lib.js 24.8 kB 0 B
packages/convex/dist/component/schema.js 1.17 kB 0 B
packages/convex/dist/component/version.js 67 B 0 B
packages/core/dist/cookie.js 5.34 kB 0 B
packages/core/dist/cookie.mjs 3.12 kB 0 B
packages/core/dist/error-tracking/chunk-ids.js 2.54 kB 0 B
packages/core/dist/error-tracking/chunk-ids.mjs 1.31 kB 0 B
packages/core/dist/error-tracking/coercers/dom-exception-coercer.js 2.3 kB 0 B
packages/core/dist/error-tracking/coercers/dom-exception-coercer.mjs 993 B 0 B
packages/core/dist/error-tracking/coercers/error-coercer.js 2.13 kB 0 B
packages/core/dist/error-tracking/coercers/error-coercer.mjs 888 B 0 B
packages/core/dist/error-tracking/coercers/error-event-coercer.js 2.37 kB 0 B
packages/core/dist/error-tracking/coercers/error-event-coercer.mjs 1.07 kB 0 B
packages/core/dist/error-tracking/coercers/event-coercer.js 1.82 kB 0 B
packages/core/dist/error-tracking/coercers/event-coercer.mjs 548 B 0 B
packages/core/dist/error-tracking/coercers/index.js 6.79 kB 0 B
packages/core/dist/error-tracking/coercers/index.mjs 326 B 0 B
packages/core/dist/error-tracking/coercers/object-coercer.js 4.04 kB 0 B
packages/core/dist/error-tracking/coercers/object-coercer.mjs 2.53 kB 0 B
packages/core/dist/error-tracking/coercers/primitive-coercer.js 1.67 kB 0 B
packages/core/dist/error-tracking/coercers/primitive-coercer.mjs 419 B 0 B
packages/core/dist/error-tracking/coercers/promise-rejection-event.js 2.59 kB 0 B
packages/core/dist/error-tracking/coercers/promise-rejection-event.mjs 1.25 kB 0 B
packages/core/dist/error-tracking/coercers/string-coercer.js 2.01 kB 0 B
packages/core/dist/error-tracking/coercers/string-coercer.mjs 820 B 0 B
packages/core/dist/error-tracking/coercers/utils.js 2.06 kB 0 B
packages/core/dist/error-tracking/coercers/utils.mjs 716 B 0 B
packages/core/dist/error-tracking/error-properties-builder.js 5.56 kB 0 B
packages/core/dist/error-tracking/error-properties-builder.mjs 4.23 kB 0 B
packages/core/dist/error-tracking/exception-steps.js 6.01 kB 0 B
packages/core/dist/error-tracking/exception-steps.mjs 3.84 kB 0 B
packages/core/dist/error-tracking/index.js 5.32 kB 0 B
packages/core/dist/error-tracking/index.mjs 222 B 0 B
packages/core/dist/error-tracking/parsers/base.js 2 kB 0 B
packages/core/dist/error-tracking/parsers/base.mjs 627 B 0 B
packages/core/dist/error-tracking/parsers/chrome.js 2.73 kB 0 B
packages/core/dist/error-tracking/parsers/chrome.mjs 1.32 kB 0 B
packages/core/dist/error-tracking/parsers/gecko.js 2.47 kB 0 B
packages/core/dist/error-tracking/parsers/gecko.mjs 1.13 kB 0 B
packages/core/dist/error-tracking/parsers/index.js 4.75 kB 0 B
packages/core/dist/error-tracking/parsers/index.mjs 2.1 kB 0 B
packages/core/dist/error-tracking/parsers/node.js 4.21 kB 0 B
packages/core/dist/error-tracking/parsers/node.mjs 2.95 kB 0 B
packages/core/dist/error-tracking/parsers/opera.js 2.26 kB 0 B
packages/core/dist/error-tracking/parsers/opera.mjs 746 B 0 B
packages/core/dist/error-tracking/parsers/safari.js 1.88 kB 0 B
packages/core/dist/error-tracking/parsers/safari.mjs 574 B 0 B
packages/core/dist/error-tracking/parsers/winjs.js 1.72 kB 0 B
packages/core/dist/error-tracking/parsers/winjs.mjs 426 B 0 B
packages/core/dist/error-tracking/release.js 1.42 kB 0 B
packages/core/dist/error-tracking/release.mjs 203 B 0 B
packages/core/dist/error-tracking/types.js 1.33 kB 0 B
packages/core/dist/error-tracking/types.mjs 131 B 0 B
packages/core/dist/error-tracking/utils.js 1.8 kB 0 B
packages/core/dist/error-tracking/utils.mjs 604 B 0 B
packages/core/dist/eventemitter.js 1.78 kB 0 B
packages/core/dist/eventemitter.mjs 571 B 0 B
packages/core/dist/featureFlagLocalEvaluation.js 22.1 kB 0 B
packages/core/dist/featureFlagLocalEvaluation.mjs 19.6 kB 0 B
packages/core/dist/featureFlagUtils.js 8.52 kB 0 B
packages/core/dist/featureFlagUtils.mjs 5.48 kB 0 B
packages/core/dist/gzip.js 5.79 kB 0 B
packages/core/dist/gzip.mjs 3.87 kB 0 B
packages/core/dist/logs/index.js 10.8 kB 0 B
packages/core/dist/logs/index.mjs 9.17 kB 0 B
packages/core/dist/logs/logs-utils.js 6.59 kB 0 B
packages/core/dist/logs/logs-utils.mjs 4.51 kB 0 B
packages/core/dist/logs/types.js 603 B 0 B
packages/core/dist/logs/types.mjs 0 B 0 B 🆕
packages/core/dist/metrics/config.js 1.95 kB 0 B
packages/core/dist/metrics/config.mjs 735 B 0 B
packages/core/dist/metrics/index.js 14.4 kB 0 B
packages/core/dist/metrics/index.mjs 12 kB 0 B
packages/core/dist/metrics/metrics-utils.js 3.65 kB 0 B
packages/core/dist/metrics/metrics-utils.mjs 1.71 kB 0 B
packages/core/dist/metrics/types.js 603 B 0 B
packages/core/dist/metrics/types.mjs 0 B 0 B 🆕
packages/core/dist/posthog-core.js 49.5 kB 0 B
packages/core/dist/posthog-core.mjs 43.9 kB 0 B
packages/core/dist/surveys/activation.js 2.2 kB 0 B
packages/core/dist/surveys/activation.mjs 572 B 0 B
packages/core/dist/surveys/events.js 4.27 kB 0 B
packages/core/dist/surveys/events.mjs 2.05 kB 0 B
packages/core/dist/surveys/index.js 6.54 kB 0 B
packages/core/dist/surveys/index.mjs 1.4 kB 0 B
packages/core/dist/surveys/keys.js 1.7 kB 0 B
packages/core/dist/surveys/keys.mjs 350 B 0 B
packages/core/dist/surveys/property-********.js 3.69 kB 0 B
packages/core/dist/surveys/property-********.mjs 2.14 kB 0 B
packages/core/dist/surveys/translations.js 9.09 kB 0 B
packages/core/dist/surveys/translations.mjs 6.83 kB 0 B
packages/core/dist/surveys/validation.js 3.06 kB 0 B
packages/core/dist/surveys/validation.mjs 1.51 kB 0 B
packages/core/dist/testing/index.js 2.93 kB 0 B
packages/core/dist/testing/index.mjs 79 B 0 B
packages/core/dist/testing/PostHogCoreTestClient.js 3.24 kB 0 B
packages/core/dist/testing/PostHogCoreTestClient.mjs 1.83 kB 0 B
packages/core/dist/testing/test-utils.js 2.83 kB 0 B
packages/core/dist/testing/test-utils.mjs 1.15 kB 0 B
packages/core/dist/traces/types.mjs 0 B 0 B 🆕
packages/core/dist/tracing-headers.js 3.38 kB 0 B
packages/core/dist/tracing-headers.mjs 2.08 kB 0 B
packages/core/dist/types.js 8.35 kB 0 B
packages/core/dist/types.mjs 5.23 kB 0 B
packages/core/dist/utils/bot-detection.js 3.28 kB 0 B
packages/core/dist/utils/bot-detection.mjs 1.96 kB 0 B
packages/core/dist/utils/browser-utils.js 1.48 kB 0 B
packages/core/dist/utils/browser-utils.mjs 182 B 0 B
packages/core/dist/utils/bucketed-rate-limiter.js 4.23 kB 0 B
packages/core/dist/utils/bucketed-rate-limiter.mjs 2.22 kB 0 B
packages/core/dist/utils/index.js 16.6 kB 0 B
packages/core/dist/utils/index.mjs 3.36 kB 0 B
packages/core/dist/utils/json-utils.js 6.67 kB 0 B
packages/core/dist/utils/json-utils.mjs 4.45 kB 0 B
packages/core/dist/utils/logger.js 2.58 kB 0 B
packages/core/dist/utils/logger.mjs 1.29 kB 0 B
packages/core/dist/utils/number-utils.js 3.32 kB 0 B
packages/core/dist/utils/number-utils.mjs 1.68 kB 0 B
packages/core/dist/utils/otlp-********.js 2.66 kB 0 B
packages/core/dist/utils/otlp-********.mjs 1.18 kB 0 B
packages/core/dist/utils/otlp-any-value.js 7.87 kB 0 B
packages/core/dist/utils/otlp-any-value.mjs 5.78 kB 0 B
packages/core/dist/utils/promise-queue.js 2.48 kB 0 B
packages/core/dist/utils/promise-queue.mjs 1.25 kB 0 B
packages/core/dist/utils/string-utils.js 3.73 kB 0 B
packages/core/dist/utils/string-utils.mjs 1.97 kB 0 B
packages/core/dist/utils/type-utils.js 7.43 kB 0 B
packages/core/dist/utils/type-utils.mjs 3.28 kB 0 B
packages/core/dist/utils/user-agent-utils.js 18.4 kB 0 B
packages/core/dist/utils/user-agent-utils.mjs 14.7 kB 0 B
packages/core/dist/vendor/uuidv7.js 8.3 kB 0 B
packages/core/dist/vendor/uuidv7.mjs 6.72 kB 0 B
packages/mcp/dist/extensions/analytics-parameters.js 6.53 kB 0 B
packages/mcp/dist/extensions/analytics-parameters.mjs 4.27 kB 0 B
packages/mcp/dist/extensions/capture.js 3.94 kB 0 B
packages/mcp/dist/extensions/capture.mjs 2.58 kB 0 B
packages/mcp/dist/extensions/client-********.js 6.23 kB 0 B
packages/mcp/dist/extensions/client-********.mjs 3.71 kB 0 B
packages/mcp/dist/extensions/compatibility.js 5.36 kB 0 B
packages/mcp/dist/extensions/compatibility.mjs 3.4 kB 0 B
packages/mcp/dist/extensions/constants.js 5.39 kB 0 B
packages/mcp/dist/extensions/constants.mjs 2.95 kB 0 B
packages/mcp/dist/extensions/context-parameters.js 2.75 kB 0 B
packages/mcp/dist/extensions/context-parameters.mjs 893 B 0 B
packages/mcp/dist/extensions/conversation-id.js 6.31 kB 0 B
packages/mcp/dist/extensions/conversation-id.mjs 3.58 kB 0 B
packages/mcp/dist/extensions/detect.js 3.77 kB 0 B
packages/mcp/dist/extensions/detect.mjs 1.49 kB 0 B
packages/mcp/dist/extensions/event-types.js 1.68 kB 0 B
packages/mcp/dist/extensions/event-types.mjs 459 B 0 B
packages/mcp/dist/extensions/exceptions.js 2.57 kB 0 B
packages/mcp/dist/extensions/exceptions.mjs 1.19 kB 0 B
packages/mcp/dist/extensions/headers.js 1.98 kB 0 B
packages/mcp/dist/extensions/headers.mjs 643 B 0 B
packages/mcp/dist/extensions/ids.js 2.01 kB 0 B
packages/mcp/dist/extensions/ids.mjs 637 B 0 B
packages/mcp/dist/extensions/instrument-********.js 4.92 kB 0 B
packages/mcp/dist/extensions/instrument-********.mjs 3.18 kB 0 B
packages/mcp/dist/extensions/instrument-highlevel.js 12.7 kB 0 B
packages/mcp/dist/extensions/instrument-highlevel.mjs 10.2 kB 0 B
packages/mcp/dist/extensions/instrumentation.js 27.8 kB 0 B
packages/mcp/dist/extensions/instrumentation.mjs 21.9 kB 0 B
packages/mcp/dist/extensions/intent.js 3.2 kB 0 B
packages/mcp/dist/extensions/intent.mjs 1.64 kB 0 B
packages/mcp/dist/extensions/internal.js 7.54 kB 0 B
packages/mcp/dist/extensions/internal.mjs 5.23 kB 0 B
packages/mcp/dist/extensions/lib-********.js 1.6 kB 0 B
packages/mcp/dist/extensions/lib-********.mjs 267 B 0 B
packages/mcp/dist/extensions/logger.js 1.72 kB 0 B
packages/mcp/dist/extensions/logger.mjs 380 B 0 B
packages/mcp/dist/extensions/mcp-********.js 4.68 kB 0 B
packages/mcp/dist/extensions/mcp-********.mjs 3.3 kB 0 B
packages/mcp/dist/extensions/mcp-sdk-compat.js 5.04 kB 0 B
packages/mcp/dist/extensions/mcp-sdk-compat.mjs 2.9 kB 0 B
packages/mcp/dist/extensions/model-parameters.js 3.49 kB 0 B
packages/mcp/dist/extensions/model-parameters.mjs 1.41 kB 0 B
packages/mcp/dist/extensions/output-instructions.js 6.11 kB 0 B
packages/mcp/dist/extensions/output-instructions.mjs 3.91 kB 0 B
packages/mcp/dist/extensions/posthog-events.js 11.7 kB 0 B
packages/mcp/dist/extensions/posthog-events.mjs 7.98 kB 0 B
packages/mcp/dist/extensions/posthog-mcp.js 6.94 kB 0 B
packages/mcp/dist/extensions/posthog-mcp.mjs 4.93 kB 0 B
packages/mcp/dist/extensions/request-headers.js 2.17 kB 0 B
packages/mcp/dist/extensions/request-headers.mjs 963 B 0 B
packages/mcp/dist/extensions/sanitization.js 4.49 kB 0 B
packages/mcp/dist/extensions/sanitization.mjs 2.86 kB 0 B
packages/mcp/dist/extensions/session-token.js 5.39 kB 0 B
packages/mcp/dist/extensions/session-token.mjs 3.62 kB 0 B
packages/mcp/dist/extensions/session.js 6.64 kB 0 B
packages/mcp/dist/extensions/session.mjs 4.12 kB 0 B
packages/mcp/dist/extensions/sink.js 4.37 kB 0 B
packages/mcp/dist/extensions/sink.mjs 2.67 kB 0 B
packages/mcp/dist/extensions/tools.js 3.51 kB 0 B
packages/mcp/dist/extensions/tools.mjs 1.63 kB 0 B
packages/mcp/dist/extensions/tracing-helpers.js 2.41 kB 0 B
packages/mcp/dist/extensions/tracing-helpers.mjs 772 B 0 B
packages/mcp/dist/extensions/transport-********.js 2.91 kB 0 B
packages/mcp/dist/extensions/transport-********.mjs 1.09 kB 0 B
packages/mcp/dist/extensions/truncation.js 11.5 kB 0 B
packages/mcp/dist/extensions/truncation.mjs 9.79 kB 0 B
packages/mcp/dist/index.js 8.78 kB 0 B
packages/mcp/dist/index.mjs 4.96 kB 0 B
packages/mcp/dist/types.js 603 B 0 B
packages/mcp/dist/types.mjs 0 B 0 B 🆕
packages/mcp/dist/version.js 1.21 kB 0 B
packages/mcp/dist/version.mjs 46 B 0 B
packages/next/dist/app/PostHogProvider.js 5.37 kB 0 B
packages/next/dist/client/ClientPostHogProvider.js 2.28 kB 0 B
packages/next/dist/client/hooks.js 172 B 0 B
packages/next/dist/client/PostHogPageView.js 4.23 kB 0 B
packages/next/dist/index.client.js 401 B 0 B
packages/next/dist/index.edge.js 570 B 0 B
packages/next/dist/index.js 554 B 0 B
packages/next/dist/index.react-server.js 420 B 0 B
packages/next/dist/middleware/postHogMiddleware.js 4.08 kB 0 B
packages/next/dist/pages.client.js 225 B 0 B
packages/next/dist/pages.edge.js 294 B 0 B
packages/next/dist/pages.js 347 B 0 B
packages/next/dist/pages/createPostHog.js 1.48 kB 0 B
packages/next/dist/pages/getServerSidePostHog.js 1.48 kB 0 B
packages/next/dist/pages/PostHogPageView.js 1.77 kB 0 B
packages/next/dist/pages/PostHogProvider.js 1.58 kB 0 B
packages/next/dist/server.edge.js 795 B 0 B
packages/next/dist/server/captureRequestError.js 5.26 kB 0 B
packages/next/dist/server/clientCache.edge.js 305 B 0 B
packages/next/dist/server/clientCache.js 1.54 kB 0 B
packages/next/dist/server/clientCache.node.js 305 B 0 B
packages/next/dist/server/createPostHog.js 1.44 kB 0 B
packages/next/dist/server/getPostHog.js 3.45 kB 0 B
packages/next/dist/server/onRequestError.js 1.39 kB 0 B
packages/next/dist/server/onRequestError.types.js 59 B 0 B
packages/next/dist/shared/browser.js 195 B 0 B
packages/next/dist/shared/config.js 2.23 kB 0 B
packages/next/dist/shared/constants.js 201 B 0 B
packages/next/dist/shared/cookie.js 540 B 0 B
packages/next/dist/shared/identity.js 2.56 kB 0 B
packages/next/dist/shared/tracing-headers.js 2.18 kB 0 B
packages/nextjs-config/dist/config.js 6.1 kB 0 B
packages/nextjs-config/dist/config.mjs 4.53 kB 0 B
packages/nextjs-config/dist/index.js 2.24 kB 0 B
packages/nextjs-config/dist/index.mjs 30 B 0 B
packages/nextjs-config/dist/strip-sourcemap-********.js 3.63 kB 0 B
packages/nextjs-config/dist/strip-sourcemap-********.mjs 1.77 kB 0 B
packages/nextjs-config/dist/utils.js 2.94 kB 0 B
packages/nextjs-config/dist/utils.mjs 826 B 0 B
packages/node/dist/ai-capture/batching.js 2.61 kB 0 B
packages/node/dist/ai-capture/batching.mjs 1.21 kB 0 B
packages/node/dist/ai-capture/routing.js 1.87 kB 0 B
packages/node/dist/ai-capture/routing.mjs 264 B 0 B
packages/node/dist/capture-v1/config.js 1.5 kB 0 B
packages/node/dist/capture-v1/config.mjs 292 B 0 B
packages/node/dist/capture-v1/errors.js 1.89 kB 0 B
packages/node/dist/capture-v1/errors.mjs 694 B 0 B
packages/node/dist/capture-v1/routing.js 1.68 kB 0 B
packages/node/dist/capture-v1/routing.mjs 279 B 0 B
packages/node/dist/capture-v1/sender.js 11.4 kB 0 B
packages/node/dist/capture-v1/sender.mjs 9.94 kB 0 B
packages/node/dist/capture-v1/transform.js 5.13 kB 0 B
packages/node/dist/capture-v1/transform.mjs 3.65 kB 0 B
packages/node/dist/capture-v1/types.js 603 B 0 B
packages/node/dist/capture-v1/types.mjs 0 B 0 B 🆕
packages/node/dist/entrypoints/index.edge.js 3.85 kB 0 B
packages/node/dist/entrypoints/index.edge.mjs 720 B 0 B
packages/node/dist/entrypoints/nestjs.js 2.31 kB 0 B
packages/node/dist/entrypoints/nestjs.mjs 42 B 0 B
packages/node/dist/experimental.js 870 B 0 B
packages/node/dist/experimental.mjs 267 B 0 B
packages/node/dist/exports.js 6.75 kB 0 B
packages/node/dist/exports.mjs 582 B 0 B
packages/node/dist/extensions/context/context.js 2.13 kB 0 B
packages/node/dist/extensions/context/context.mjs 863 B 0 B
packages/node/dist/extensions/context/types.js 603 B 0 B
packages/node/dist/extensions/context/types.mjs 0 B 0 B 🆕
packages/node/dist/extensions/error-tracking/autocapture.js 5.19 kB 0 B
packages/node/dist/extensions/error-tracking/autocapture.mjs 3.62 kB 0 B
packages/node/dist/extensions/error-tracking/index.js 4.38 kB 0 B
packages/node/dist/extensions/error-tracking/index.mjs 3.17 kB 0 B
packages/node/dist/extensions/error-tracking/modifiers/context-lines.node.js 11.6 kB 0 B
packages/node/dist/extensions/error-tracking/modifiers/context-lines.node.mjs 9.64 kB 0 B
packages/node/dist/extensions/error-tracking/modifiers/module.node.js 2.78 kB 0 B
packages/node/dist/extensions/error-tracking/modifiers/module.node.mjs 1.45 kB 0 B
packages/node/dist/extensions/error-tracking/modifiers/relative-path.node.js 1.97 kB 0 B
packages/node/dist/extensions/error-tracking/modifiers/relative-path.node.mjs 624 B 0 B
packages/node/dist/extensions/express.js 4.97 kB 0 B
packages/node/dist/extensions/express.mjs 2.78 kB 0 B
packages/node/dist/extensions/feature-flags/cache.js 603 B 0 B
packages/node/dist/extensions/feature-flags/cache.mjs 0 B 0 B 🆕
packages/node/dist/extensions/feature-flags/crypto.js 1.27 kB 0 B
packages/node/dist/extensions/feature-flags/crypto.mjs 63 B 0 B
packages/node/dist/extensions/feature-flags/feature-flags.js 32.2 kB 0 B
packages/node/dist/extensions/feature-flags/feature-flags.mjs 29.8 kB 0 B
packages/node/dist/extensions/nestjs.js 5.62 kB 0 B
packages/node/dist/extensions/nestjs.mjs 3.42 kB 0 B
packages/node/dist/extensions/sentry-integration.js 4.88 kB 0 B
packages/node/dist/extensions/sentry-integration.mjs 3.36 kB 0 B
packages/node/dist/extensions/tracing-headers.js 3.31 kB 0 B
packages/node/dist/extensions/tracing-headers.mjs 1.53 kB 0 B
packages/node/dist/extensions/url-utils.js 2.22 kB 0 B
packages/node/dist/extensions/url-utils.mjs 785 B 0 B
packages/node/dist/feature-flag-evaluations.js 6.12 kB 0 B
packages/node/dist/feature-flag-evaluations.mjs 4.77 kB 0 B
packages/node/dist/gzip.node.js 1.74 kB 0 B
packages/node/dist/gzip.node.mjs 416 B 0 B
packages/node/dist/storage-memory.js 1.52 kB 0 B
packages/node/dist/storage-memory.mjs 297 B 0 B
packages/node/dist/types.js 1.43 kB 0 B
packages/node/dist/types.mjs 224 B 0 B
packages/node/dist/version.js 1.21 kB 0 B
packages/node/dist/version.mjs 46 B 0 B
packages/nuxt/dist/module.mjs 5.92 kB 0 B
packages/nuxt/dist/runtime/composables/useFeatureFlagEnabled.js 566 B 0 B
packages/nuxt/dist/runtime/composables/useFeatureFlagPayload.js 698 B 0 B
packages/nuxt/dist/runtime/composables/useFeatureFlagVariantKey.js 591 B 0 B
packages/nuxt/dist/runtime/composables/usePostHog.js 128 B 0 B
packages/nuxt/dist/runtime/nitro-plugin-v2.js 480 B 0 B
packages/nuxt/dist/runtime/nitro-plugin-v3.js 574 B 0 B
packages/nuxt/dist/runtime/nitro-plugin.js 1.03 kB 0 B
packages/nuxt/dist/runtime/vue-plugin.js 1.13 kB 0 B
packages/openfeature-node-provider/dist/index.js 1.76 kB 0 B
packages/openfeature-node-provider/dist/index.mjs 190 B 0 B
packages/openfeature-node-provider/dist/mapping.js 5.32 kB 0 B
packages/openfeature-node-provider/dist/mapping.mjs 3.21 kB 0 B
packages/openfeature-node-provider/dist/provider.js 3.99 kB 0 B
packages/openfeature-node-provider/dist/provider.mjs 2.6 kB 0 B
packages/openfeature-web-provider/dist/index.js 1.75 kB 0 B
packages/openfeature-web-provider/dist/index.mjs 184 B 0 B
packages/openfeature-web-provider/dist/mapping.js 5.29 kB 0 B
packages/openfeature-web-provider/dist/mapping.mjs 3.18 kB 0 B
packages/openfeature-web-provider/dist/provider.js 4.41 kB 0 B
packages/openfeature-web-provider/dist/provider.mjs 3.06 kB 0 B
packages/plugin-utils/dist/chunk-ids.js 3.86 kB 0 B
packages/plugin-utils/dist/chunk-ids.mjs 2.05 kB 0 B
packages/plugin-utils/dist/cli.js 4.37 kB 0 B
packages/plugin-utils/dist/cli.mjs 2.72 kB 0 B
packages/plugin-utils/dist/config.js 3.5 kB 0 B
packages/plugin-utils/dist/config.mjs 2.26 kB 0 B
packages/plugin-utils/dist/index.js 4.98 kB 0 B
packages/plugin-utils/dist/index.mjs 250 B 0 B
packages/plugin-utils/dist/spawn-local.js 3.08 kB 0 B
packages/plugin-utils/dist/spawn-local.mjs 1.66 kB 0 B
packages/plugin-utils/dist/utils.js 3.27 kB 0 B
packages/plugin-utils/dist/utils.mjs 1.3 kB 0 B
packages/react-native/dist/autocapture.js 8.31 kB 0 B
packages/react-native/dist/error-tracking/index.js 9.97 kB 0 B
packages/react-native/dist/error-tracking/utils.js 2.58 kB 0 B
packages/react-native/dist/frameworks/wix-navigation.js 1.3 kB 0 B
packages/react-native/dist/hooks/useFeatureFlag.js 1.86 kB 0 B
packages/react-native/dist/hooks/useFeatureFlagResult.js 983 B 0 B
packages/react-native/dist/hooks/useFeatureFlags.js 941 B 0 B
packages/react-native/dist/hooks/useNavigationTracker.js 2.45 kB 0 B
packages/react-native/dist/hooks/usePostHog.js 544 B 0 B
packages/react-native/dist/hooks/utils.js 988 B 0 B
packages/react-native/dist/index.js 4.33 kB 0 B
packages/react-native/dist/logs-********.js 3.66 kB 0 B
packages/react-native/dist/native-deps.js 8.73 kB 0 B
packages/react-native/dist/optional/OptionalAsyncStorage.js 299 B 0 B
packages/react-native/dist/optional/OptionalExpoApplication.js 377 B 0 B
packages/react-native/dist/optional/OptionalExpoDevice.js 347 B 0 B
packages/react-native/dist/optional/OptionalExpoFileSystem.js 386 B 0 B
packages/react-native/dist/optional/OptionalExpoFileSystemLegacy.js 423 B 0 B
packages/react-native/dist/optional/OptionalExpoLocalization.js 383 B 0 B
packages/react-native/dist/optional/OptionalPlugin.js 891 B 0 B
packages/react-native/dist/optional/OptionalReactNativeDeviceInfo.js 415 B 0 B
packages/react-native/dist/optional/OptionalReactNativeLocalize.js 303 B 0 B
packages/react-native/dist/optional/OptionalReactNativeNavigation.js 415 B 0 B
packages/react-native/dist/optional/OptionalReactNativeNavigationWix.js 443 B 0 B
packages/react-native/dist/optional/OptionalReactNativeSafeArea.js 644 B 0 B
packages/react-native/dist/optional/OptionalReactNativeSvg.js 872 B 0 B
packages/react-native/dist/posthog-rn.js 67.4 kB 0 B
packages/react-native/dist/PostHogContext.js 329 B 0 B
packages/react-native/dist/PostHogErrorBoundary.js 3.19 kB 0 B
packages/react-native/dist/PostHogMaskView.js 1.68 kB 0 B
packages/react-native/dist/PostHogProvider.js 6 kB 0 B
packages/react-native/dist/storage.js 5.76 kB 0 B
packages/react-native/dist/surveys/components/BottomSection.js 1.51 kB 0 B
packages/react-native/dist/surveys/components/Cancel.js 1.1 kB 0 B
packages/react-native/dist/surveys/components/ConfirmationMessage.js 1.76 kB 0 B
packages/react-native/dist/surveys/components/IntroMessage.js 1.65 kB 0 B
packages/react-native/dist/surveys/components/QuestionHeader.js 1.47 kB 0 B
packages/react-native/dist/surveys/components/QuestionTypes.js 14 kB 0 B
packages/react-native/dist/surveys/components/SurveyModal.js 7.24 kB 0 B
packages/react-native/dist/surveys/components/Surveys.js 6.58 kB 0 B
packages/react-native/dist/surveys/getActiveMatchingSurveys.js 2.69 kB 0 B
packages/react-native/dist/surveys/icons.js 10 kB 0 B
packages/react-native/dist/surveys/index.js 600 B 0 B
packages/react-native/dist/surveys/PostHogSurveyProvider.js 6.73 kB 0 B
packages/react-native/dist/surveys/safeStyleSheet.js 448 B 0 B
packages/react-native/dist/surveys/survey-translations.js 1.11 kB 0 B
packages/react-native/dist/surveys/surveys-utils.js 11.5 kB 0 B
packages/react-native/dist/surveys/useActivatedSurveys.js 3.68 kB 0 B
packages/react-native/dist/surveys/useSurveyStorage.js 2.48 kB 0 B
packages/react-native/dist/tooling/expoconfig.js 23.6 kB 0 B
packages/react-native/dist/tooling/metroconfig.js 2.32 kB 0 B
packages/react-native/dist/tooling/posthogMetroSerializer.js 7.74 kB 0 B
packages/react-native/dist/tooling/utils.js 4.2 kB 0 B
packages/react-native/dist/tooling/vendor/expo/expoconfig.js 70 B 0 B
packages/react-native/dist/tooling/vendor/metro/countLines.js 237 B 0 B
packages/react-native/dist/tooling/vendor/metro/utils.js 3.51 kB 0 B
packages/react-native/dist/types.js 70 B 0 B
packages/react-native/dist/utils.js 1.3 kB 0 B
packages/react-native/dist/version.js 130 B 0 B
packages/react/dist/esm/index.js 22.5 kB 0 B
packages/react/dist/esm/slim/index.js 18.9 kB 0 B
packages/react/dist/esm/surveys/index.js 4.75 kB 0 B
packages/react/dist/umd/index.js 25.9 kB 0 B
packages/react/dist/umd/slim/index.js 21.8 kB 0 B
packages/react/dist/umd/surveys/index.js 5.52 kB 0 B
packages/rollup-plugin/dist/index.js 7.6 kB 0 B
packages/rrweb/all/dist/rrweb-all.cjs 705 kB 0 B
packages/rrweb/all/dist/rrweb-all.js 705 kB 0 B
packages/rrweb/all/dist/rrweb-all.umd.cjs 708 kB 0 B
packages/rrweb/all/dist/rrweb-all.umd.min.cjs 328 kB 0 B
packages/rrweb/packer/dist/base-********.cjs 18.3 kB 0 B
packages/rrweb/packer/dist/base-********.js 18.2 kB 0 B
packages/rrweb/packer/dist/base-********.umd.cjs 18.7 kB 0 B
packages/rrweb/packer/dist/base-********.umd.min.cjs 9.5 kB 0 B
packages/rrweb/packer/dist/pack.cjs 347 B 0 B
packages/rrweb/packer/dist/pack.js 285 B 0 B
packages/rrweb/packer/dist/pack.umd.cjs 1.63 kB 0 B
packages/rrweb/packer/dist/pack.umd.min.cjs 1.11 kB 0 B
packages/rrweb/packer/dist/packer.cjs 257 B 0 B
packages/rrweb/packer/dist/packer.js 136 B 0 B
packages/rrweb/packer/dist/packer.umd.cjs 662 B 0 B
packages/rrweb/packer/dist/packer.umd.min.cjs 626 B 0 B
packages/rrweb/packer/dist/unpack.cjs 769 B 0 B
packages/rrweb/packer/dist/unpack.js 702 B 0 B
packages/rrweb/packer/dist/unpack.umd.cjs 1.17 kB 0 B
packages/rrweb/packer/dist/unpack.umd.min.cjs 955 B 0 B
packages/rrweb/plugins/rrweb-plugin-canvas-webrtc-record/dist/rrweb-plugin-canvas-webrtc-record.cjs 37.6 kB 0 B
packages/rrweb/plugins/rrweb-plugin-canvas-webrtc-record/dist/rrweb-plugin-canvas-webrtc-record.js 37.5 kB 0 B
packages/rrweb/plugins/rrweb-plugin-canvas-webrtc-record/dist/rrweb-plugin-canvas-webrtc-record.umd.cjs 38 kB 0 B
packages/rrweb/plugins/rrweb-plugin-canvas-webrtc-record/dist/rrweb-plugin-canvas-webrtc-record.umd.min.cjs 22.2 kB 0 B
packages/rrweb/plugins/rrweb-plugin-canvas-webrtc-replay/dist/rrweb-plugin-canvas-webrtc-replay.cjs 34.3 kB 0 B
packages/rrweb/plugins/rrweb-plugin-canvas-webrtc-replay/dist/rrweb-plugin-canvas-webrtc-replay.js 34.2 kB 0 B
packages/rrweb/plugins/rrweb-plugin-canvas-webrtc-replay/dist/rrweb-plugin-canvas-webrtc-replay.umd.cjs 34.7 kB 0 B
packages/rrweb/plugins/rrweb-plugin-canvas-webrtc-replay/dist/rrweb-plugin-canvas-webrtc-replay.umd.min.cjs 20.5 kB 0 B
packages/rrweb/plugins/rrweb-plugin-console-record/dist/rrweb-plugin-console-record.cjs 15.8 kB 0 B
packages/rrweb/plugins/rrweb-plugin-console-record/dist/rrweb-plugin-console-record.js 15.7 kB 0 B
packages/rrweb/plugins/rrweb-plugin-console-record/dist/rrweb-plugin-console-record.umd.cjs 16.3 kB 0 B
packages/rrweb/plugins/rrweb-plugin-console-record/dist/rrweb-plugin-console-record.umd.min.cjs 7.66 kB 0 B
packages/rrweb/plugins/rrweb-plugin-console-replay/dist/rrweb-plugin-console-replay.cjs 5.01 kB 0 B
packages/rrweb/plugins/rrweb-plugin-console-replay/dist/rrweb-plugin-console-replay.js 4.9 kB 0 B
packages/rrweb/plugins/rrweb-plugin-console-replay/dist/rrweb-plugin-console-replay.umd.cjs 5.44 kB 0 B
packages/rrweb/plugins/rrweb-plugin-console-replay/dist/rrweb-plugin-console-replay.umd.min.cjs 2.64 kB 0 B
packages/rrweb/plugins/rrweb-plugin-sequential-id-record/dist/rrweb-plugin-sequential-id-record.cjs 681 B 0 B
packages/rrweb/plugins/rrweb-plugin-sequential-id-record/dist/rrweb-plugin-sequential-id-record.js 548 B 0 B
packages/rrweb/plugins/rrweb-plugin-sequential-id-record/dist/rrweb-plugin-sequential-id-record.umd.cjs 1.12 kB 0 B
packages/rrweb/plugins/rrweb-plugin-sequential-id-record/dist/rrweb-plugin-sequential-id-record.umd.min.cjs 829 B 0 B
packages/rrweb/plugins/rrweb-plugin-sequential-id-replay/dist/rrweb-plugin-sequential-id-replay.cjs 933 B 0 B
packages/rrweb/plugins/rrweb-plugin-sequential-id-replay/dist/rrweb-plugin-sequential-id-replay.js 820 B 0 B
packages/rrweb/plugins/rrweb-plugin-sequential-id-replay/dist/rrweb-plugin-sequential-id-replay.umd.cjs 1.37 kB 0 B
packages/rrweb/plugins/rrweb-plugin-sequential-id-replay/dist/rrweb-plugin-sequential-id-replay.umd.min.cjs 968 B 0 B
packages/rrweb/record/dist/rrweb-record.cjs 234 kB 0 B
packages/rrweb/record/dist/rrweb-record.js 233 kB 0 B
packages/rrweb/record/dist/rrweb-record.umd.cjs 234 kB 0 B
packages/rrweb/record/dist/rrweb-record.umd.min.cjs 107 kB 0 B
packages/rrweb/replay/dist/rrweb-replay.cjs 476 kB 0 B
packages/rrweb/replay/dist/rrweb-replay.js 476 kB 0 B
packages/rrweb/replay/dist/rrweb-replay.umd.cjs 479 kB 0 B
packages/rrweb/replay/dist/rrweb-replay.umd.min.cjs 225 kB 0 B
packages/rrweb/rrdom-nodejs/dist/rrdom-nodejs.cjs 160 kB 0 B
packages/rrweb/rrdom-nodejs/dist/rrdom-nodejs.js 160 kB 0 B
packages/rrweb/rrdom-nodejs/dist/rrdom-nodejs.umd.cjs 162 kB 0 B
packages/rrweb/rrdom-nodejs/dist/rrdom-nodejs.umd.min.cjs 74.9 kB 0 B
packages/rrweb/rrdom/dist/rrdom.cjs 186 kB 0 B
packages/rrweb/rrdom/dist/rrdom.js 185 kB 0 B
packages/rrweb/rrdom/dist/rrdom.umd.cjs 187 kB 0 B
packages/rrweb/rrdom/dist/rrdom.umd.min.cjs 85.5 kB 0 B
packages/rrweb/rrweb-snapshot/dist/record.cjs 39 kB 0 B
packages/rrweb/rrweb-snapshot/dist/record.js 37.3 kB 0 B
packages/rrweb/rrweb-snapshot/dist/record.umd.cjs 83.2 kB 0 B
packages/rrweb/rrweb-snapshot/dist/record.umd.min.cjs 37.4 kB 0 B
packages/rrweb/rrweb-snapshot/dist/replay.cjs 149 kB 0 B
packages/rrweb/rrweb-snapshot/dist/replay.js 149 kB 0 B
packages/rrweb/rrweb-snapshot/dist/replay.umd.cjs 194 kB 0 B
packages/rrweb/rrweb-snapshot/dist/replay.umd.min.cjs 86.2 kB 0 B
packages/rrweb/rrweb-snapshot/dist/rrweb-********.cjs 3.95 kB 0 B
packages/rrweb/rrweb-snapshot/dist/rrweb-********.js 2.32 kB 0 B
packages/rrweb/rrweb-snapshot/dist/rrweb-********.umd.cjs 261 kB 0 B
packages/rrweb/rrweb-snapshot/dist/rrweb-********.umd.min.cjs 109 kB 0 B
packages/rrweb/rrweb-snapshot/dist/types-********.cjs 37.6 kB 0 B
packages/rrweb/rrweb-snapshot/dist/types-********.js 36.5 kB 0 B
packages/rrweb/rrweb-snapshot/dist/types-********.umd.cjs 39 kB 0 B
packages/rrweb/rrweb-snapshot/dist/types-********.umd.min.cjs 17.3 kB 0 B
packages/rrweb/rrweb/dist/rrweb.cjs 689 kB 0 B
packages/rrweb/rrweb/dist/rrweb.js 689 kB 0 B
packages/rrweb/rrweb/dist/rrweb.umd.cjs 689 kB 0 B
packages/rrweb/rrweb/dist/rrweb.umd.min.cjs 318 kB 0 B
packages/rrweb/types/dist/rrweb-types.cjs 5.75 kB 0 B
packages/rrweb/types/dist/rrweb-types.js 5.46 kB 0 B
packages/rrweb/types/dist/rrweb-types.umd.cjs 6.16 kB 0 B
packages/rrweb/types/dist/rrweb-types.umd.min.cjs 2.86 kB 0 B
packages/rrweb/utils/dist/rrweb-utils.cjs 7.76 kB 0 B
packages/rrweb/utils/dist/rrweb-utils.js 7.3 kB 0 B
packages/rrweb/utils/dist/rrweb-utils.umd.cjs 8.24 kB 0 B
packages/rrweb/utils/dist/rrweb-utils.umd.min.cjs 4.09 kB 0 B
packages/types/dist/capture-log.js 603 B 0 B
packages/types/dist/capture-log.mjs 0 B 0 B 🆕
packages/types/dist/capture-metric.js 1.37 kB 0 B
packages/types/dist/capture-metric.mjs 93 B 0 B
packages/types/dist/capture.js 603 B 0 B
packages/types/dist/capture.mjs 0 B 0 B 🆕
packages/types/dist/common.js 603 B 0 B
packages/types/dist/common.mjs 0 B 0 B 🆕
packages/types/dist/feature-flags.js 603 B 0 B
packages/types/dist/feature-flags.mjs 0 B 0 B 🆕
packages/types/dist/index.js 1.45 kB 0 B
packages/types/dist/index.mjs 122 B 0 B
packages/types/dist/posthog-config.js 603 B 0 B
packages/types/dist/posthog-config.mjs 0 B 0 B 🆕
packages/types/dist/posthog.js 603 B 0 B
packages/types/dist/posthog.mjs 0 B 0 B 🆕
packages/types/dist/request.js 603 B 0 B
packages/types/dist/request.mjs 0 B 0 B 🆕
packages/types/dist/segment.js 603 B 0 B
packages/types/dist/segment.mjs 0 B 0 B 🆕
packages/types/dist/session-recording.js 603 B 0 B
packages/types/dist/session-recording.mjs 0 B 0 B 🆕
packages/types/dist/survey.js 603 B 0 B
packages/types/dist/survey.mjs 0 B 0 B 🆕
packages/types/dist/toolbar.js 603 B 0 B
packages/types/dist/toolbar.mjs 0 B 0 B 🆕
packages/types/dist/traces.mjs 0 B 0 B 🆕
packages/types/dist/tree-shakeable.js 603 B 0 B
packages/types/dist/tree-shakeable.mjs 0 B 0 B 🆕
packages/web/dist/index.cjs 11.2 kB 0 B
packages/web/dist/index.mjs 11.1 kB 0 B
packages/webpack-plugin/dist/config.js 1.47 kB 0 B
packages/webpack-plugin/dist/config.mjs 480 B 0 B
packages/webpack-plugin/dist/index.js 7.39 kB 0 B
packages/webpack-plugin/dist/index.mjs 3.58 kB 0 B
tooling/changelog/dist/index.js 3.31 kB 0 B
tooling/rollup-utils/dist/index.js 1.17 kB 0 B

compressed-size-action

@turnipdabeets
turnipdabeets changed the base branch from main to posthog-watcher/issue-4570 August 24, 2026 11:27
Base automatically changed from posthog-watcher/issue-4570 to main August 24, 2026 17:19
@github-actions

github-actions Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor
⚠️ `posthog-react-native` is modified but not declared in any changeset

This is informational — the PR is not blocked. Click the triangle above to collapse, or push a fix and this comment will auto-delete.

Modified in this PR but not in any changeset:

  • posthog-react-native

If this package should ship the change, add it to the changeset frontmatter:

---
"posthog-react-native": patch
---

Changesets in this PR:

  • @posthog/core — minor
  • @posthog/types — minor
  • posthog-node — minor

@turnipdabeets
turnipdabeets force-pushed the feat/traces-node-mvp branch 4 times, most recently from bfb08e8 to cc7b6d8 Compare August 28, 2026 20:49
@turnipdabeets
turnipdabeets force-pushed the feat/traces-node-mvp branch 5 times, most recently from b946de6 to ab4048c Compare August 31, 2026 18:23
@turnipdabeets
turnipdabeets changed the base branch from main to refactor/shared-otlp-attribute-encoder August 31, 2026 18:45
Base automatically changed from refactor/shared-otlp-attribute-encoder to main August 31, 2026 20:04
@turnipdabeets
turnipdabeets force-pushed the feat/traces-node-mvp branch 9 times, most recently from 3554295 to bc7a0ba Compare August 31, 2026 22:51
@turnipdabeets
turnipdabeets marked this pull request as ready for review September 1, 2026 01:26
@turnipdabeets
turnipdabeets requested a review from a team as a code owner September 1, 2026 01:26
@greptile-apps

greptile-apps Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Security Review

Queued spans can still be exported after the user opts out because consent is checked when the span ends but not immediately before transmission.

Prompt To Fix All With AI
### Issue 1
packages/core/src/traces/index.ts:423-425
**Consent unchecked during export**

When a span is queued before `optOut()` or `disable()` and flushed afterward, this path sends it without rechecking consent, causing identity-linked span attributes to be exported after the user has opted out.

**How this was verified:** Consent transitions do not clear the trace queue, and the timer and flush paths reach `_sendTracesBatch` without another consent check.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Reviews (1): Last reviewed commit: "feat(node): distributed tracing spans" | Re-trigger Greptile

Comment thread packages/core/src/traces/index.ts
Adds startSpan, withSpan and getActiveSpan to posthog-node behind a new
traces client option, encoding spans as OTLP JSON without an OpenTelemetry
dependency.
@marandaneto
marandaneto requested a review from a team September 1, 2026 09:08
@marandaneto

Copy link
Copy Markdown
Member

@PostHog/team-apm i think it makes sense for you all to give an initial look to make sure this works well within the product/ui/ingestion

Adds maxLiveSpans and maxSpanAgeMs. Live accounting keeps a span id and a
monotonic timestamp, never the span, so leaked handles stay collectable.

@jonmcwest jonmcwest left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I could not review the full diff line by line, so I compared the design and the trace-context behavior against the OTel specification and OTel JS, and validated each comment against the code (at 5f7b2ff, re-checked at b07c9eb).

The implementation matches or exceeds the reference behavior on clocks, id generation, batching defaults, 413 handling, backpressure, and hostile input. No comment below blocks the MVP. Comments 1 and 2 are trace-context design questions, and comment 1 deserves an explicit decision before the API stabilizes. The rest are follow-ups and nits.

updateName(): this {
return this
}
traceparent(): string | null {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The SDK drops trace context when tracing is off. This severs distributed traces at services that do not have tracing enabled yet.

startSpan returns the shared NOOP_SPAN before it parses parent (packages/core/src/traces/index.ts:107, packages/node/src/client.ts:683 and :723). NoopSpan.traceparent() returns null. Thus a service in the middle of a traced chain, with traces unconfigured, forwards nothing. The propagation example in the withSpan docstring (getActiveSpan()?.traceparent()) sends no header there. Downstream services then start fresh traces.

This diverges from the OTel spec, which is normative here. With no SDK installed, "the API MUST return a non-recording Span with the SpanContext in the parent Context" (trace/api.md, "Behavior of the API in the absence of an installed SDK"). The propagated context then "will be propagated through to any child span and ultimately also Inject". The spec makes this the one exception to no-op behavior, exactly so that a pass-through service keeps the chain intact.

The NoopSpan comment gives this reason: null makes sure the SDK cannot propagate "an id that was never recorded". Pass-through does not do that. When the SDK forwards the inbound header unchanged, it propagates the span id of the upstream caller, and upstream recorded that id. The SDK invents no ids.

Suggestion: when parent is a valid traceparent string but tracing is off, return a per-call inert span. Make its traceparent() echo the inbound header, the tracestate, and the original flags. Activate it in withSpan so that getActiveSpan() works. The shared NOOP_SPAN can stay for the no-parent case.

If you keep the current behavior on purpose, add a test that passes parent on the disabled path, and add a docs note. Today no test covers this case.

This does not block an experimental MVP. A later move to pass-through is compatible with the documented traceparent ? ... : {} guard. Decide before the API becomes stable.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in bf5e7af — inert spans now pass the inbound traceparent through, and withSpan activates them so getActiveSpan() works.

* Builds the `traceparent` header value for a span. The sampled flag is always
* set, because a span we exported is by definition recorded.
*/
export function formatTraceparent(traceId: string, spanId: string): string {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The SDK drops the inbound sampled flag and always sends 01 outbound.

The spec position first: this is legal. W3C Trace Context lists "Update sampled" as a permitted mutation when parent-id changes, and it changes here. The spec also says a definitive recording decision "SHOULD be reflected in the sampled flag". PostHog records everything, so 01 is truthful. OTel with a bare AlwaysOnSampler does the same thing.

The cost is interop with parent-based samplers from other vendors. Service A samples a trace out (00). A PostHog-traced service B continues it and propagates 01. A downstream OTel service C with the default ParentBased sampler then records a trace that its own head sampler rejected. Its backend gets paid-for fragments with no root.

Suggestion, as a follow-up and not a blocker: use the OTel RECORD_ONLY shape for this case. Store the inbound flag on RemoteSpanContext. Record and export the span as now, but propagate the inbound byte in traceparent() and set OTLP flags from it. That keeps the header and the wire consistent. First make sure that ingestion does not treat flags=0 spans differently.

At minimum, document the current behavior. It will surprise users who integrate with head-sampled OTel fleets.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in a78b6c3, in #4728. Confirmed ingestion stores flags verbatim and nothing reads it, so the sampled-out byte is safe to propagate.

* Extracts the OTel `exception.type` / `exception.message` pair from whatever was
* thrown. Anything can be thrown in JS, so non-Errors are described by type.
*/
export function describeError(error: unknown): { type: string; message: string } {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

recordException and the withSpan error path record only exception.type and exception.message. Do you drop error.stack on purpose? OTel semconv marks exception.stacktrace as Recommended, and OTel JS captures it in recordException. People usually debug from the stack.

There is a case for a delay. No beforeSpanSend hook or attribute cap exists yet (both deferred to #4584), so users could not scrub or bound stacks. A deep async stack is a few KB per span. Also, if a later release adds stacks silently, it changes what leaves customer servers. Such a change must be visible either way.

Suggestion: if this is a deferral, say so in the recordException doc in packages/types/src/traces.ts and in the PR body. Land stack capture with #4584, so that the caps and the scrub hook ship first. If it is not deliberate, describeError can read error.stack behind the existing try/catch today.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in e6b77d3, in #4584 — stacks land there, after the caps and the scrub hook.

continue
}

if (outcome.kind === 'too-large') {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A span with one multi-MB attribute takes an expensive path here. The 413 halving retries the same head batch. Thus the SDK uploads the oversized body up to 11 times before it isolates and drops the span. To drain a full 512-span queue around it takes 35 to 47 POSTs (simulated against this exact loop). The sticky shrink then leaves _maxExportBatchSize near 22, and the +1 ramp needs about 480 successful batches to recover.

The OTel default is no better on the value itself. AttributeValueLengthLimit defaults to Infinity, and the OTel exporter drops the whole batch on failure. This path drops only the poison span, which is the right call. But #4584 adds count caps (128 attributes, 128 events) and no value-length cap, so a single huge attribute still lands here after it merges.

Ask: add a client-side size check before the POST. _sendOtlpBatch already serializes the payload, and the client knows the ~2MB server cap (see the comment in traces-defaults.ts). Treat a single span whose serialized size exceeds the cap as too-large, without a send. That removes every redundant upload and most of the halving churn. It can ship as a small follow-up.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Half addressed: f587e48 in #4584 adds maxAttributeValueLength (8192), which bounds the value that causes this. The pre-send size check still needs a number — the cap in the code comment says ~2 MB but this PR measured 5.75 MB accepted and 11.5 MB rejected, so I don't want to guess it. Tracking separately.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Second half now in 1f1c33f, in #4726 — found the cap in the monorepo (MAX_REQUEST_BODY_SIZE_BYTES, 2 MB, applied to the compressed body), so a batch over it is reported too-large without being sent.

}
}

function looksLikeSpan(value: unknown): boolean {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: an OTel span passed as parent has no traceparent method. It fails looksLikeSpan, and the SDK drops it silently with "Ignoring an unusable span parent". The new span then parents to the active PostHog span, or to a new root. That breaks the trace the caller expected. Inside withSpan this is wrong parentage, not just a fresh trace. A follow-up could duck-type spanContext() and adopt traceId/spanId after isValidTraceId/isValidSpanId. That fits the deferred soft-detect PR. The inline comment "Not a span at all" is also inaccurate for this case.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment fixed in bf5e7af — it now says a span from another tracer exposes spanContext() instead. The duck-typing itself stays with the soft-detect PR.

kind: spanKindToOtlp(record.kind),
startTimeUnixNano: msToUnixNanoString(record.startTime),
endTimeUnixNano: msToUnixNanoString(record.endTime),
flags: TRACE_FLAGS_SAMPLED,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Optional nit: flags is always 1, so bits 8-9 (parent-remoteness, 0x100/0x200) stay unset and the row records "unknown". OTel SDKs set these bits, and this SDK knows the answer: a traceparent-string parent is remote, a handle parent is local. The server stores flags verbatim but reads nothing from it today, so this is optional. If you set the bits now, you avoid a gap that no backfill can repair, in case service-entry detection ever uses them.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in a78b6c3, in #47280x100 always, 0x200 for a header parent.

if (record.traceState) {
span.traceState = wireString(record.traceState)
}
const attributes = toOtlpKeyValueList(record.attributes, logger)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: an empty attribute key passes assignUserAttributes and encodeKeyValueList unexamined and ships as { "key": "" }. The OTel spec requires non-empty keys. The server stores the key verbatim, so it surfaces as a nameless attribute in filters. Skip empty keys with a debug log in encodeKeyValueList (packages/core/src/utils/otlp-any-value.ts, outside this diff). The same fix covers logs and metrics, because all three signals share this encoder.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 1e8a151, in #4727 — fixed in the shared encoder, so logs and metrics get it too. Off main rather than this stack.

An inert span started with a `parent` header now echoes that header from
`traceparent()` and is activated by `withSpan`, so a service that records
nothing keeps a distributed trace whole instead of severing it.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants