Telemetry Events

The shared event union is:

type NgafEvent = NgafNodeEvent | NgafBrowserEvent;

#Node events

type NgafNodeEvent =
  | 'ngaf:postinstall'
  | 'ngaf:runtime_instance_created'
  | 'ngaf:stream_started'
  | 'ngaf:stream_ended'
  | 'ngaf:stream_errored';
EventSourceProperties from source
ngaf:postinstallpackage postinstall scriptpkg, version, node, node_version, os, arch, global_install, package-manager fields when npm exposes them
ngaf:runtime_instance_createdNode adapter helpertransport, provider, model, angularVersion; apiKey is removed
ngaf:stream_startedNode adapter helperprovider, model, optional fields in the input object
ngaf:stream_endedNode adapter helperprovider, model, durationMs when supplied
ngaf:stream_erroredNode adapter helperstream properties plus errorClass

captureEvent() also adds sample_weight to sent event properties.

#Browser events

The shared event file lists these browser-only events:

type NgafBrowserEvent = 'ngaf:browser_provided' | 'ngaf:browser_chat_init';

The browser Angular token broadens the local service event type to:

type NgafTelemetryEvent =
  | 'ngaf:browser_provided'
  | 'ngaf:browser_chat_init'
  | 'ngaf:runtime_instance_created'
  | 'ngaf:stream_started'
  | 'ngaf:stream_ended'
  | 'ngaf:stream_errored';

That means browser code can capture the browser-specific events plus runtime lifecycle events when telemetry is enabled.

#Browser payloads

Endpoint delivery sends:

{
  "event": "ngaf:stream_ended",
  "distinctId": "browser:<ephemeral-id>",
  "properties": {
    "transport": "langgraph",
    "provider": "openai",
    "model": "gpt-4.1",
    "durationMs": 1200,
    "sample_weight": 1
  }
}

When using sink, the sink receives the same event and properties values before endpoint formatting.

#Node payloads

Node delivery sends:

{
  "key": "phc_public_cacheplane_telemetry",
  "distinctId": "anon_<uuid>",
  "event": "ngaf:stream_started",
  "properties": {
    "provider": "openai",
    "model": "gpt-4.1",
    "sample_weight": 1
  }
}

The public ingest key is a routing identifier accepted by the ThreadPlane ingest proxy. It is not a secret.