@senpi/runtime 3.0.6-dev.runtime-phase-2.20260630134327 → 3.0.6-dev.runtime-phase-2.20260630134451
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/{tracking-helpers.d.ts → action-events.d.ts} +24 -23
- package/dist/actions/action-events.d.ts.map +1 -0
- package/dist/actions/{tracking-helpers.js → action-events.js} +25 -77
- package/dist/actions/action-events.js.map +1 -0
- package/dist/actions/close-position/close-position.action.d.ts.map +1 -1
- package/dist/actions/close-position/close-position.action.js +8 -17
- package/dist/actions/close-position/close-position.action.js.map +1 -1
- package/dist/actions/event-derivation.d.ts +5 -6
- package/dist/actions/event-derivation.d.ts.map +1 -1
- package/dist/actions/event-derivation.js +4 -5
- package/dist/actions/event-derivation.js.map +1 -1
- package/dist/actions/llm-decision/anthropic-llm-decision.d.ts +5 -9
- package/dist/actions/llm-decision/anthropic-llm-decision.d.ts.map +1 -1
- package/dist/actions/llm-decision/anthropic-llm-decision.js +6 -86
- package/dist/actions/llm-decision/anthropic-llm-decision.js.map +1 -1
- package/dist/actions/llm-decision/factory.d.ts +0 -6
- package/dist/actions/llm-decision/factory.d.ts.map +1 -1
- package/dist/actions/llm-decision/factory.js +0 -2
- package/dist/actions/llm-decision/factory.js.map +1 -1
- package/dist/actions/llm-decision/openclaw-llm-decision.d.ts.map +1 -1
- package/dist/actions/llm-decision/openclaw-llm-decision.js +25 -5
- package/dist/actions/llm-decision/openclaw-llm-decision.js.map +1 -1
- package/dist/actions/open-position/open-position.action.d.ts.map +1 -1
- package/dist/actions/open-position/open-position.action.js +9 -17
- package/dist/actions/open-position/open-position.action.js.map +1 -1
- package/dist/actions/position-tracker/position-tracker.action.d.ts.map +1 -1
- package/dist/actions/position-tracker/position-tracker.action.js +1 -2
- package/dist/actions/position-tracker/position-tracker.action.js.map +1 -1
- package/dist/dsl/engine-client/event-mapping.d.ts.map +1 -1
- package/dist/dsl/engine-client/event-mapping.js +0 -3
- package/dist/dsl/engine-client/event-mapping.js.map +1 -1
- package/dist/dsl/events/build-closed-event.d.ts.map +1 -1
- package/dist/dsl/events/build-closed-event.js +0 -1
- package/dist/dsl/events/build-closed-event.js.map +1 -1
- package/dist/dsl/events/handlers.d.ts.map +1 -1
- package/dist/dsl/events/handlers.js +2 -4
- package/dist/dsl/events/handlers.js.map +1 -1
- package/dist/dsl/monitor/create-monitor.d.ts +1 -1
- package/dist/dsl/monitor/create-monitor.d.ts.map +1 -1
- package/dist/dsl/monitor/create-monitor.js +0 -30
- package/dist/dsl/monitor/create-monitor.js.map +1 -1
- package/dist/dsl/monitor/process-one-position.d.ts.map +1 -1
- package/dist/dsl/monitor/process-one-position.js +0 -121
- package/dist/dsl/monitor/process-one-position.js.map +1 -1
- package/dist/dsl/plugin/index.js +3 -3
- package/dist/dsl/plugin/index.js.map +1 -1
- package/dist/dsl/plugin/options.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -60
- package/dist/index.js.map +1 -1
- package/dist/runtime/__tests__/helpers/runtime-gateway-harness.d.ts +2 -0
- package/dist/runtime/__tests__/helpers/runtime-gateway-harness.d.ts.map +1 -1
- package/dist/runtime/__tests__/helpers/runtime-gateway-harness.js +24 -3
- package/dist/runtime/__tests__/helpers/runtime-gateway-harness.js.map +1 -1
- package/dist/runtime/create-runtime-context.d.ts +1 -1
- package/dist/runtime/create-runtime-context.d.ts.map +1 -1
- package/dist/runtime/create-scanner-module.d.ts +1 -1
- package/dist/runtime/domain-events.d.ts +4 -4
- package/dist/runtime/domain-events.d.ts.map +1 -1
- package/dist/runtime/domain-events.js +4 -4
- package/dist/runtime/domain-events.js.map +1 -1
- package/dist/runtime/lifecycle-events.d.ts +3 -3
- package/dist/runtime/lifecycle-events.js +5 -5
- package/dist/runtime/lifecycle-events.js.map +1 -1
- package/dist/{tracking → runtime}/position-id-registry.d.ts +14 -1
- package/dist/runtime/position-id-registry.d.ts.map +1 -0
- package/dist/{tracking → runtime}/position-id-registry.js +20 -3
- package/dist/runtime/position-id-registry.js.map +1 -0
- package/dist/runtime/run.d.ts +2 -4
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js.map +1 -1
- package/dist/runtime/runtime-schema.d.ts +120 -486
- package/dist/runtime/runtime-schema.d.ts.map +1 -1
- package/dist/runtime/runtime-schema.js +0 -27
- package/dist/runtime/runtime-schema.js.map +1 -1
- package/dist/runtime/runtime.d.ts +4 -9
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +33 -190
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/scanners/engine/data-providers.d.ts +1 -1
- package/dist/scanners/runtime-module.d.ts +1 -1
- package/dist/senpi/client.d.ts +10 -0
- package/dist/senpi/client.d.ts.map +1 -1
- package/dist/senpi/client.js +70 -50
- package/dist/senpi/client.js.map +1 -1
- package/dist/telemetry/attributes.d.ts +13 -0
- package/dist/telemetry/attributes.d.ts.map +1 -0
- package/dist/telemetry/attributes.js +22 -0
- package/dist/telemetry/attributes.js.map +1 -0
- package/dist/{tracking → telemetry}/context.d.ts +6 -5
- package/dist/telemetry/context.d.ts.map +1 -0
- package/dist/{tracking → telemetry}/context.js +4 -4
- package/dist/telemetry/context.js.map +1 -0
- package/dist/{recording/records.d.ts → telemetry/event-builders.d.ts} +138 -30
- package/dist/telemetry/event-builders.d.ts.map +1 -0
- package/dist/{recording/wiring/record-builders.js → telemetry/event-builders.js} +90 -39
- package/dist/telemetry/event-builders.js.map +1 -0
- package/dist/telemetry/identity.d.ts +62 -0
- package/dist/telemetry/identity.d.ts.map +1 -0
- package/dist/{recording/wiring → telemetry}/identity.js +5 -2
- package/dist/telemetry/identity.js.map +1 -0
- package/dist/telemetry/metrics.d.ts +47 -0
- package/dist/telemetry/metrics.d.ts.map +1 -0
- package/dist/telemetry/metrics.js +154 -0
- package/dist/telemetry/metrics.js.map +1 -0
- package/dist/telemetry/otel-sdk.d.ts +21 -33
- package/dist/telemetry/otel-sdk.d.ts.map +1 -1
- package/dist/telemetry/otel-sdk.js +77 -50
- package/dist/telemetry/otel-sdk.js.map +1 -1
- package/dist/telemetry/spans/constants.d.ts +12 -0
- package/dist/telemetry/spans/constants.d.ts.map +1 -0
- package/dist/telemetry/spans/constants.js +12 -0
- package/dist/telemetry/spans/constants.js.map +1 -0
- package/dist/telemetry/spans/gen-ai.d.ts +70 -0
- package/dist/telemetry/spans/gen-ai.d.ts.map +1 -0
- package/dist/telemetry/spans/gen-ai.js +330 -0
- package/dist/telemetry/spans/gen-ai.js.map +1 -0
- package/dist/telemetry/spans/index.d.ts +11 -0
- package/dist/telemetry/spans/index.d.ts.map +1 -0
- package/dist/telemetry/spans/index.js +11 -0
- package/dist/telemetry/spans/index.js.map +1 -0
- package/dist/{tracking → telemetry}/spans/redact-pii.d.ts +18 -20
- package/dist/telemetry/spans/redact-pii.d.ts.map +1 -0
- package/dist/{tracking → telemetry}/spans/redact-pii.js +30 -29
- package/dist/telemetry/spans/redact-pii.js.map +1 -0
- package/dist/telemetry/spans/sanitize-payload.d.ts.map +1 -0
- package/dist/telemetry/spans/sanitize-payload.js.map +1 -0
- package/dist/telemetry/spans/span-hooks.d.ts +11 -0
- package/dist/telemetry/spans/span-hooks.d.ts.map +1 -0
- package/dist/telemetry/spans/span-hooks.js +609 -0
- package/dist/telemetry/spans/span-hooks.js.map +1 -0
- package/dist/telemetry/trace-identity.d.ts +1 -1
- package/dist/telemetry/tracing.d.ts +2 -1
- package/dist/telemetry/tracing.d.ts.map +1 -1
- package/dist/telemetry/tracing.js +1 -1
- package/dist/telemetry/tracing.js.map +1 -1
- package/dist/types/dsl/index.d.ts +2 -9
- package/dist/types/dsl/index.d.ts.map +1 -1
- package/dist/types/runtime.d.ts +1 -1
- package/dist/types/runtime.d.ts.map +1 -1
- package/dist/utils/event-catalog.d.ts +2 -2
- package/dist/utils/event-catalog.js +2 -2
- package/dist/utils/logger.js +3 -4
- package/dist/utils/logger.js.map +1 -1
- package/package.json +1 -1
- package/dist/actions/tracking-helpers.d.ts.map +0 -1
- package/dist/actions/tracking-helpers.js.map +0 -1
- package/dist/recording/emitter.d.ts +0 -27
- package/dist/recording/emitter.d.ts.map +0 -1
- package/dist/recording/emitter.js +0 -2
- package/dist/recording/emitter.js.map +0 -1
- package/dist/recording/identity.d.ts +0 -34
- package/dist/recording/identity.d.ts.map +0 -1
- package/dist/recording/identity.js +0 -2
- package/dist/recording/identity.js.map +0 -1
- package/dist/recording/index.d.ts +0 -11
- package/dist/recording/index.d.ts.map +0 -1
- package/dist/recording/index.js +0 -2
- package/dist/recording/index.js.map +0 -1
- package/dist/recording/noop-emitter.d.ts +0 -23
- package/dist/recording/noop-emitter.d.ts.map +0 -1
- package/dist/recording/noop-emitter.js +0 -22
- package/dist/recording/noop-emitter.js.map +0 -1
- package/dist/recording/otel/attributes.d.ts +0 -37
- package/dist/recording/otel/attributes.d.ts.map +0 -1
- package/dist/recording/otel/attributes.js +0 -131
- package/dist/recording/otel/attributes.js.map +0 -1
- package/dist/recording/otel/constants.d.ts +0 -123
- package/dist/recording/otel/constants.d.ts.map +0 -1
- package/dist/recording/otel/constants.js +0 -172
- package/dist/recording/otel/constants.js.map +0 -1
- package/dist/recording/otel/ids.d.ts +0 -25
- package/dist/recording/otel/ids.d.ts.map +0 -1
- package/dist/recording/otel/ids.js +0 -37
- package/dist/recording/otel/ids.js.map +0 -1
- package/dist/recording/otel/index.d.ts +0 -13
- package/dist/recording/otel/index.d.ts.map +0 -1
- package/dist/recording/otel/index.js +0 -9
- package/dist/recording/otel/index.js.map +0 -1
- package/dist/recording/otel/mappers.d.ts +0 -100
- package/dist/recording/otel/mappers.d.ts.map +0 -1
- package/dist/recording/otel/mappers.js +0 -684
- package/dist/recording/otel/mappers.js.map +0 -1
- package/dist/recording/otel/otel-emitter.d.ts +0 -43
- package/dist/recording/otel/otel-emitter.d.ts.map +0 -1
- package/dist/recording/otel/otel-emitter.js +0 -99
- package/dist/recording/otel/otel-emitter.js.map +0 -1
- package/dist/recording/otel/redaction.d.ts +0 -47
- package/dist/recording/otel/redaction.d.ts.map +0 -1
- package/dist/recording/otel/redaction.js +0 -88
- package/dist/recording/otel/redaction.js.map +0 -1
- package/dist/recording/records.d.ts.map +0 -1
- package/dist/recording/records.js +0 -14
- package/dist/recording/records.js.map +0 -1
- package/dist/recording/transport/batcher.d.ts +0 -59
- package/dist/recording/transport/batcher.d.ts.map +0 -1
- package/dist/recording/transport/batcher.js +0 -234
- package/dist/recording/transport/batcher.js.map +0 -1
- package/dist/recording/transport/client.d.ts +0 -41
- package/dist/recording/transport/client.d.ts.map +0 -1
- package/dist/recording/transport/client.js +0 -69
- package/dist/recording/transport/client.js.map +0 -1
- package/dist/recording/transport/config.d.ts +0 -53
- package/dist/recording/transport/config.d.ts.map +0 -1
- package/dist/recording/transport/config.js +0 -41
- package/dist/recording/transport/config.js.map +0 -1
- package/dist/recording/transport/index.d.ts +0 -16
- package/dist/recording/transport/index.d.ts.map +0 -1
- package/dist/recording/transport/index.js +0 -12
- package/dist/recording/transport/index.js.map +0 -1
- package/dist/recording/transport/rows.d.ts +0 -88
- package/dist/recording/transport/rows.d.ts.map +0 -1
- package/dist/recording/transport/rows.js +0 -15
- package/dist/recording/transport/rows.js.map +0 -1
- package/dist/recording/wiring/emitter-factory.d.ts +0 -39
- package/dist/recording/wiring/emitter-factory.d.ts.map +0 -1
- package/dist/recording/wiring/emitter-factory.js +0 -62
- package/dist/recording/wiring/emitter-factory.js.map +0 -1
- package/dist/recording/wiring/identity.d.ts +0 -27
- package/dist/recording/wiring/identity.d.ts.map +0 -1
- package/dist/recording/wiring/identity.js.map +0 -1
- package/dist/recording/wiring/index.d.ts +0 -12
- package/dist/recording/wiring/index.d.ts.map +0 -1
- package/dist/recording/wiring/index.js +0 -9
- package/dist/recording/wiring/index.js.map +0 -1
- package/dist/recording/wiring/record-builders.d.ts +0 -107
- package/dist/recording/wiring/record-builders.d.ts.map +0 -1
- package/dist/recording/wiring/record-builders.js.map +0 -1
- package/dist/recording/wiring/subscriber.d.ts +0 -28
- package/dist/recording/wiring/subscriber.d.ts.map +0 -1
- package/dist/recording/wiring/subscriber.js +0 -173
- package/dist/recording/wiring/subscriber.js.map +0 -1
- package/dist/recording/wiring/values.d.ts +0 -19
- package/dist/recording/wiring/values.d.ts.map +0 -1
- package/dist/recording/wiring/values.js +0 -49
- package/dist/recording/wiring/values.js.map +0 -1
- package/dist/tracking/build-rehydrate-items.d.ts +0 -15
- package/dist/tracking/build-rehydrate-items.d.ts.map +0 -1
- package/dist/tracking/build-rehydrate-items.js +0 -19
- package/dist/tracking/build-rehydrate-items.js.map +0 -1
- package/dist/tracking/constants.d.ts +0 -24
- package/dist/tracking/constants.d.ts.map +0 -1
- package/dist/tracking/constants.js +0 -52
- package/dist/tracking/constants.js.map +0 -1
- package/dist/tracking/context.d.ts.map +0 -1
- package/dist/tracking/context.js.map +0 -1
- package/dist/tracking/index.d.ts +0 -16
- package/dist/tracking/index.d.ts.map +0 -1
- package/dist/tracking/index.js +0 -11
- package/dist/tracking/index.js.map +0 -1
- package/dist/tracking/plugin-event-tracker.d.ts +0 -13
- package/dist/tracking/plugin-event-tracker.d.ts.map +0 -1
- package/dist/tracking/plugin-event-tracker.js +0 -27
- package/dist/tracking/plugin-event-tracker.js.map +0 -1
- package/dist/tracking/position-id-registry.d.ts.map +0 -1
- package/dist/tracking/position-id-registry.js.map +0 -1
- package/dist/tracking/spans/constants.d.ts +0 -19
- package/dist/tracking/spans/constants.d.ts.map +0 -1
- package/dist/tracking/spans/constants.js +0 -31
- package/dist/tracking/spans/constants.js.map +0 -1
- package/dist/tracking/spans/fan-out-span-transport.d.ts +0 -22
- package/dist/tracking/spans/fan-out-span-transport.d.ts.map +0 -1
- package/dist/tracking/spans/fan-out-span-transport.js +0 -49
- package/dist/tracking/spans/fan-out-span-transport.js.map +0 -1
- package/dist/tracking/spans/index.d.ts +0 -13
- package/dist/tracking/spans/index.d.ts.map +0 -1
- package/dist/tracking/spans/index.js +0 -16
- package/dist/tracking/spans/index.js.map +0 -1
- package/dist/tracking/spans/otel/fit-row-budget.d.ts +0 -22
- package/dist/tracking/spans/otel/fit-row-budget.d.ts.map +0 -1
- package/dist/tracking/spans/otel/fit-row-budget.js +0 -91
- package/dist/tracking/spans/otel/fit-row-budget.js.map +0 -1
- package/dist/tracking/spans/otel/map-span-to-trace-row.d.ts +0 -16
- package/dist/tracking/spans/otel/map-span-to-trace-row.d.ts.map +0 -1
- package/dist/tracking/spans/otel/map-span-to-trace-row.js +0 -227
- package/dist/tracking/spans/otel/map-span-to-trace-row.js.map +0 -1
- package/dist/tracking/spans/otel/recording-span-transport.d.ts +0 -43
- package/dist/tracking/spans/otel/recording-span-transport.d.ts.map +0 -1
- package/dist/tracking/spans/otel/recording-span-transport.js +0 -67
- package/dist/tracking/spans/otel/recording-span-transport.js.map +0 -1
- package/dist/tracking/spans/otel/span-ids.d.ts +0 -22
- package/dist/tracking/spans/otel/span-ids.d.ts.map +0 -1
- package/dist/tracking/spans/otel/span-ids.js +0 -32
- package/dist/tracking/spans/otel/span-ids.js.map +0 -1
- package/dist/tracking/spans/plugin-span-tracker.d.ts +0 -9
- package/dist/tracking/spans/plugin-span-tracker.d.ts.map +0 -1
- package/dist/tracking/spans/plugin-span-tracker.js +0 -115
- package/dist/tracking/spans/plugin-span-tracker.js.map +0 -1
- package/dist/tracking/spans/redact-pii.d.ts.map +0 -1
- package/dist/tracking/spans/redact-pii.js.map +0 -1
- package/dist/tracking/spans/sanitize-payload.d.ts.map +0 -1
- package/dist/tracking/spans/sanitize-payload.js.map +0 -1
- package/dist/tracking/spans/span-hooks.d.ts +0 -28
- package/dist/tracking/spans/span-hooks.d.ts.map +0 -1
- package/dist/tracking/spans/span-hooks.js +0 -409
- package/dist/tracking/spans/span-hooks.js.map +0 -1
- package/dist/tracking/spans/span-tracker.d.ts +0 -133
- package/dist/tracking/spans/span-tracker.d.ts.map +0 -1
- package/dist/tracking/spans/span-tracker.js +0 -721
- package/dist/tracking/spans/span-tracker.js.map +0 -1
- package/dist/tracking/spans/span-transport.d.ts +0 -71
- package/dist/tracking/spans/span-transport.d.ts.map +0 -1
- package/dist/tracking/spans/span-transport.js +0 -240
- package/dist/tracking/spans/span-transport.js.map +0 -1
- package/dist/tracking/spans/types.d.ts +0 -101
- package/dist/tracking/spans/types.d.ts.map +0 -1
- package/dist/tracking/spans/types.js +0 -6
- package/dist/tracking/spans/types.js.map +0 -1
- package/dist/tracking/tracker.d.ts +0 -30
- package/dist/tracking/tracker.d.ts.map +0 -1
- package/dist/tracking/tracker.js +0 -66
- package/dist/tracking/tracker.js.map +0 -1
- package/dist/tracking/tracking-handler.d.ts +0 -12
- package/dist/tracking/tracking-handler.d.ts.map +0 -1
- package/dist/tracking/tracking-handler.js +0 -148
- package/dist/tracking/tracking-handler.js.map +0 -1
- package/dist/tracking/transport.d.ts +0 -35
- package/dist/tracking/transport.d.ts.map +0 -1
- package/dist/tracking/transport.js +0 -133
- package/dist/tracking/transport.js.map +0 -1
- package/dist/tracking/types.d.ts +0 -21
- package/dist/tracking/types.d.ts.map +0 -1
- package/dist/tracking/types.js +0 -6
- package/dist/tracking/types.js.map +0 -1
- /package/dist/{tracking → telemetry}/spans/sanitize-payload.d.ts +0 -0
- /package/dist/{tracking → telemetry}/spans/sanitize-payload.js +0 -0
|
@@ -1,32 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* OpenTelemetry SDK stand-up:
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* standardised resource-attribute set.
|
|
2
|
+
* OpenTelemetry SDK stand-up: HyperDX's OTel distribution (`@hyperdx/node-opentelemetry`)
|
|
3
|
+
* — auto-instrumentation + uncaught-exception capture — against a self-hosted OTLP collector,
|
|
4
|
+
* with a process-stable resource-attribute set.
|
|
6
5
|
*
|
|
7
|
-
* Init runs from `
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* On Node >= 22 the diagnostics_channel HTTP instrumentation hooks lazily, so
|
|
11
|
-
* deferring init still instruments outbound HTTP.
|
|
6
|
+
* Init runs from plugin `register()` (process scope): the agent hooks register there, before
|
|
7
|
+
* any runtime, and emit through this SDK's tracer. Only process-stable values ride the resource
|
|
8
|
+
* (`service.*`, `deployment.environment`, `user.id`), so init need not wait for a runtime.
|
|
12
9
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
10
|
+
* Gated by OTLP-config presence: inits iff an OTLP endpoint env is set (no enable flag, no
|
|
11
|
+
* localhost default). No endpoint ⇒ no SDK and the global tracer/logger no-op. If a non-noop
|
|
12
|
+
* global `TracerProvider` already exists (the gateway's `diagnostics-otel` owns it), we stand
|
|
13
|
+
* down and emit through the global API — one SDK per process, first writer wins.
|
|
17
14
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* OTEL_EXPORTER_OTLP_METRICS_ENDPOINT (.../v1/metrics)
|
|
24
|
-
* OTEL_EXPORTER_OTLP_HEADERS (e.g. Authorization=<collector-token>)
|
|
25
|
-
* See docs/runtime-docs/runtime-api.md (Tracing) for why each is required.
|
|
15
|
+
* The package is imported dynamically: it reads `OTEL_EXPORTER_OTLP_*` at module-load and
|
|
16
|
+
* exposes no init() option for them, so the env must be set first. Under openclaw the operator
|
|
17
|
+
* sets all of these (the SDK derives none):
|
|
18
|
+
* OTEL_EXPORTER_OTLP_ENDPOINT / _TRACES_ENDPOINT / _LOGS_ENDPOINT / _METRICS_ENDPOINT / _HEADERS
|
|
19
|
+
* See docs/runtime-docs/runtime-api.md (Tracing).
|
|
26
20
|
*/
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
export declare const DEFAULT_OTLP_ENDPOINT = "http://localhost:4318";
|
|
21
|
+
/** True when any OTLP endpoint env is set — the gate for standing up the plugin's SDK. */
|
|
22
|
+
export declare function isOtlpEndpointConfigured(): boolean;
|
|
30
23
|
/**
|
|
31
24
|
* Whether {@link initOtelSdk} has completed. Code that loads `@hyperdx/node-opentelemetry`
|
|
32
25
|
* lazily (e.g. per-trace attribute stamping) gates on this so the package — which captures
|
|
@@ -72,22 +65,17 @@ export interface OtelResourceExtras {
|
|
|
72
65
|
* emit-time identity stamp (both reading the same per-runtime identity context).
|
|
73
66
|
*/
|
|
74
67
|
export declare function buildOtelResourceAttributes(serviceName: string, extras: OtelResourceExtras): string;
|
|
75
|
-
/**
|
|
76
|
-
* Resolve the OTLP endpoint: `OTEL_EXPORTER_OTLP_ENDPOINT` env >
|
|
77
|
-
* {@link DEFAULT_OTLP_ENDPOINT}.
|
|
78
|
-
*/
|
|
79
|
-
export declare function resolveOtlpEndpoint(): string;
|
|
80
68
|
export interface InitOtelSdkParams {
|
|
81
|
-
readonly enabled: boolean;
|
|
82
|
-
/** Built only on the live path to preserve laziness. */
|
|
83
|
-
readonly identity: () => IdentityEnvelope;
|
|
84
69
|
/** SENPI_API_KEY JWT (the MCP bearer) — decoded locally for `user.id`. */
|
|
85
70
|
readonly userToken?: string;
|
|
71
|
+
/** Plugin version → `service.version`. */
|
|
86
72
|
readonly serviceVersion: string;
|
|
87
73
|
}
|
|
88
74
|
/**
|
|
89
75
|
* Initialise the OTel SDK. Idempotent, side-effecting, and never crashes boot:
|
|
90
|
-
* no-ops when
|
|
76
|
+
* no-ops when no OTLP endpoint is configured, when a real global TracerProvider
|
|
77
|
+
* already exists (the gateway owns it — we emit through the global API instead),
|
|
78
|
+
* when already initialised, or under test.
|
|
91
79
|
*/
|
|
92
80
|
export declare function initOtelSdk(params: InitOtelSdkParams): Promise<void>;
|
|
93
81
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otel-sdk.d.ts","sourceRoot":"","sources":["../../src/telemetry/otel-sdk.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"otel-sdk.d.ts","sourceRoot":"","sources":["../../src/telemetry/otel-sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAgBH,0FAA0F;AAC1F,wBAAgB,wBAAwB,IAAI,OAAO,CAKlD;AAoGD;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAkB/E;AAED,qEAAqE;AACrE,MAAM,WAAW,kBAAkB;IACjC,uFAAuF;IACvF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,2BAA2B;IAC3B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,kCAAkC;IAClC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,2CAA2C;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,kBAAkB,GACzB,MAAM,CAaR;AAED,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,0CAA0C;IAC1C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAKD;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuF1E;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAcrD"}
|
|
@@ -1,34 +1,66 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* OpenTelemetry SDK stand-up:
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* standardised resource-attribute set.
|
|
2
|
+
* OpenTelemetry SDK stand-up: HyperDX's OTel distribution (`@hyperdx/node-opentelemetry`)
|
|
3
|
+
* — auto-instrumentation + uncaught-exception capture — against a self-hosted OTLP collector,
|
|
4
|
+
* with a process-stable resource-attribute set.
|
|
6
5
|
*
|
|
7
|
-
* Init runs from `
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* On Node >= 22 the diagnostics_channel HTTP instrumentation hooks lazily, so
|
|
11
|
-
* deferring init still instruments outbound HTTP.
|
|
6
|
+
* Init runs from plugin `register()` (process scope): the agent hooks register there, before
|
|
7
|
+
* any runtime, and emit through this SDK's tracer. Only process-stable values ride the resource
|
|
8
|
+
* (`service.*`, `deployment.environment`, `user.id`), so init need not wait for a runtime.
|
|
12
9
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
10
|
+
* Gated by OTLP-config presence: inits iff an OTLP endpoint env is set (no enable flag, no
|
|
11
|
+
* localhost default). No endpoint ⇒ no SDK and the global tracer/logger no-op. If a non-noop
|
|
12
|
+
* global `TracerProvider` already exists (the gateway's `diagnostics-otel` owns it), we stand
|
|
13
|
+
* down and emit through the global API — one SDK per process, first writer wins.
|
|
17
14
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* OTEL_EXPORTER_OTLP_METRICS_ENDPOINT (.../v1/metrics)
|
|
24
|
-
* OTEL_EXPORTER_OTLP_HEADERS (e.g. Authorization=<collector-token>)
|
|
25
|
-
* See docs/runtime-docs/runtime-api.md (Tracing) for why each is required.
|
|
15
|
+
* The package is imported dynamically: it reads `OTEL_EXPORTER_OTLP_*` at module-load and
|
|
16
|
+
* exposes no init() option for them, so the env must be set first. Under openclaw the operator
|
|
17
|
+
* sets all of these (the SDK derives none):
|
|
18
|
+
* OTEL_EXPORTER_OTLP_ENDPOINT / _TRACES_ENDPOINT / _LOGS_ENDPOINT / _METRICS_ENDPOINT / _HEADERS
|
|
19
|
+
* See docs/runtime-docs/runtime-api.md (Tracing).
|
|
26
20
|
*/
|
|
27
21
|
import { randomUUID } from "node:crypto";
|
|
22
|
+
import { trace } from "@opentelemetry/api";
|
|
28
23
|
import { createLogger } from "../utils/logger.js";
|
|
29
24
|
const logger = createLogger("telemetry/otel-sdk");
|
|
30
|
-
/**
|
|
31
|
-
|
|
25
|
+
/** Per-signal OTLP endpoint env vars; presence of any (or the base) is the on-switch. */
|
|
26
|
+
const OTLP_ENDPOINT_ENV_VARS = [
|
|
27
|
+
"OTEL_EXPORTER_OTLP_ENDPOINT",
|
|
28
|
+
"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
|
|
29
|
+
"OTEL_EXPORTER_OTLP_LOGS_ENDPOINT",
|
|
30
|
+
"OTEL_EXPORTER_OTLP_METRICS_ENDPOINT",
|
|
31
|
+
];
|
|
32
|
+
/** True when any OTLP endpoint env is set — the gate for standing up the plugin's SDK. */
|
|
33
|
+
export function isOtlpEndpointConfigured() {
|
|
34
|
+
return OTLP_ENDPOINT_ENV_VARS.some((name) => {
|
|
35
|
+
const value = process.env[name];
|
|
36
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* True when a real (non-noop) global `TracerProvider` is already registered — i.e.
|
|
41
|
+
* another SDK (the gateway's `diagnostics-otel`) owns the slot. The global API hands
|
|
42
|
+
* back a `ProxyTracerProvider` until `setGlobalTracerProvider` runs; before that its
|
|
43
|
+
* delegate is the no-op provider. We detect "real" by checking whether a delegate
|
|
44
|
+
* provider has been set: `getDelegate()` exists on the proxy and differs from the
|
|
45
|
+
* no-op. Best-effort — on any uncertainty we treat it as "not owned" and init our own.
|
|
46
|
+
*/
|
|
47
|
+
function globalTracerProviderIsReal() {
|
|
48
|
+
try {
|
|
49
|
+
const provider = trace.getTracerProvider();
|
|
50
|
+
if (typeof provider?.getDelegate !== "function") {
|
|
51
|
+
// Not a ProxyTracerProvider — a concrete provider is registered directly.
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
const delegate = provider.getDelegate();
|
|
55
|
+
if (delegate == null)
|
|
56
|
+
return false;
|
|
57
|
+
// The proxy's default delegate is the NoopTracerProvider; anything else is real.
|
|
58
|
+
return delegate.constructor?.name !== "NoopTracerProvider";
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
32
64
|
/**
|
|
33
65
|
* Process-level instance id for `service.instance.id`. Distinct from the
|
|
34
66
|
* per-runtime `IdentityEnvelope.bootId`: resource attributes are process-global,
|
|
@@ -50,7 +82,7 @@ const PROCESS_INSTANCE_ID = randomUUID();
|
|
|
50
82
|
* Fix: enable our own `UndiciInstrumentation`; with no provider set it resolves the
|
|
51
83
|
* global one `init()` registered, and HyperDX's instance stays disabled (no double
|
|
52
84
|
* instrumentation). Best-effort — a failure must not fail boot. Also a prerequisite
|
|
53
|
-
* for the manual `mcp.*`/`dsl.*` spans
|
|
85
|
+
* for the manual `mcp.*`/`dsl.*` spans, which assume outbound `fetch` calls
|
|
54
86
|
* auto-nest as HTTP children.
|
|
55
87
|
*
|
|
56
88
|
* Seen with `@hyperdx/node-opentelemetry` 0.11 / `instrumentation-undici` 0.28, Node 24
|
|
@@ -147,38 +179,37 @@ export function buildOtelResourceAttributes(serviceName, extras) {
|
|
|
147
179
|
.map(([key, value]) => `${key}=${encodeURIComponent(String(value))}`)
|
|
148
180
|
.join(",");
|
|
149
181
|
}
|
|
150
|
-
/**
|
|
151
|
-
|
|
152
|
-
* {@link DEFAULT_OTLP_ENDPOINT}.
|
|
153
|
-
*/
|
|
154
|
-
export function resolveOtlpEndpoint() {
|
|
155
|
-
const envOverride = process.env.OTEL_EXPORTER_OTLP_ENDPOINT?.trim();
|
|
156
|
-
if (envOverride)
|
|
157
|
-
return envOverride;
|
|
158
|
-
return DEFAULT_OTLP_ENDPOINT;
|
|
159
|
-
}
|
|
182
|
+
/** `service.name` for the plugin-owned resource; matches the tracer/logger scope. */
|
|
183
|
+
const SERVICE_NAME = "senpi-trading-runtime";
|
|
160
184
|
/**
|
|
161
185
|
* Initialise the OTel SDK. Idempotent, side-effecting, and never crashes boot:
|
|
162
|
-
* no-ops when
|
|
186
|
+
* no-ops when no OTLP endpoint is configured, when a real global TracerProvider
|
|
187
|
+
* already exists (the gateway owns it — we emit through the global API instead),
|
|
188
|
+
* when already initialised, or under test.
|
|
163
189
|
*/
|
|
164
190
|
export async function initOtelSdk(params) {
|
|
165
191
|
if (initialized)
|
|
166
192
|
return;
|
|
167
|
-
|
|
168
|
-
|
|
193
|
+
// Presence of OTLP config is the on-switch — no endpoint means telemetry off.
|
|
194
|
+
if (!isOtlpEndpointConfigured()) {
|
|
195
|
+
logger.debug("OTel SDK init skipped: no OTLP endpoint configured");
|
|
169
196
|
return;
|
|
170
197
|
}
|
|
171
|
-
//
|
|
172
|
-
//
|
|
198
|
+
// Stand down if another SDK (the gateway's diagnostics-otel) already owns the
|
|
199
|
+
// global provider — a second registration drops spans and splits resource identity.
|
|
200
|
+
if (globalTracerProviderIsReal()) {
|
|
201
|
+
logger.info("OTel SDK init skipped: a global TracerProvider already exists; emitting through the global API");
|
|
202
|
+
initialized = true;
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
// Skip under test: the SDK would start exporters and patch core modules during vitest.
|
|
173
206
|
if (process.env.VITEST || process.env.NODE_ENV === "test") {
|
|
174
207
|
logger.debug("OTel SDK init skipped: running under test");
|
|
175
208
|
return;
|
|
176
209
|
}
|
|
177
210
|
try {
|
|
178
|
-
const identity = params.identity();
|
|
179
211
|
// Commit the guard before any fallible work: a failed init must not let a
|
|
180
|
-
// later
|
|
181
|
-
// identity() above threw before this, so env is still untouched on that path.
|
|
212
|
+
// later caller re-enter and double-append OTEL_RESOURCE_ATTRIBUTES.
|
|
182
213
|
initialized = true;
|
|
183
214
|
// Source the environment label from NODE_ENV (Node-standard). Pass the value
|
|
184
215
|
// through verbatim (so `staging`/custom envs are faithful), defaulting to
|
|
@@ -188,7 +219,7 @@ export async function initOtelSdk(params) {
|
|
|
188
219
|
const deploymentEnvironment = nodeEnv && nodeEnv.length > 0 ? nodeEnv : "development";
|
|
189
220
|
const userId = decodeSenpiUserId(params.userToken);
|
|
190
221
|
// Append to any host-set value rather than clobber operator attrs.
|
|
191
|
-
const ourAttrs = buildOtelResourceAttributes(
|
|
222
|
+
const ourAttrs = buildOtelResourceAttributes(SERVICE_NAME, {
|
|
192
223
|
serviceInstanceId: PROCESS_INSTANCE_ID,
|
|
193
224
|
serviceVersion: params.serviceVersion,
|
|
194
225
|
deploymentEnvironment,
|
|
@@ -198,18 +229,14 @@ export async function initOtelSdk(params) {
|
|
|
198
229
|
process.env.OTEL_RESOURCE_ATTRIBUTES = existingAttrs
|
|
199
230
|
? `${existingAttrs},${ourAttrs}`
|
|
200
231
|
: ourAttrs;
|
|
201
|
-
//
|
|
202
|
-
if (!process.env.OTEL_EXPORTER_OTLP_ENDPOINT) {
|
|
203
|
-
process.env.OTEL_EXPORTER_OTLP_ENDPOINT = resolveOtlpEndpoint();
|
|
204
|
-
}
|
|
205
|
-
// Dynamic import: loads only now, after the env var above is set.
|
|
232
|
+
// Dynamic import: loads only now, after the endpoint env is confirmed set.
|
|
206
233
|
const hyperdx = (await import("@hyperdx/node-opentelemetry"));
|
|
207
234
|
hyperdxModule = hyperdx;
|
|
208
235
|
hyperdx.init({
|
|
209
236
|
// No apiKey on init(): the exporter authenticates to the collector via the
|
|
210
237
|
// Authorization header in OTEL_EXPORTER_OTLP_HEADERS (read from env at
|
|
211
238
|
// module-load), not through the SDK's HyperDX apiKey field.
|
|
212
|
-
service:
|
|
239
|
+
service: SERVICE_NAME,
|
|
213
240
|
// Off: createLogger() emits structured LogRecords through the OTel Logs API directly,
|
|
214
241
|
// so capturing console.* would duplicate every log (flattened, lossy) into the collector.
|
|
215
242
|
// stdout is untouched — the local human line still prints.
|
|
@@ -228,7 +255,7 @@ export async function initOtelSdk(params) {
|
|
|
228
255
|
});
|
|
229
256
|
await reinstrumentUndici();
|
|
230
257
|
logger.info("OTel SDK initialised", {
|
|
231
|
-
service:
|
|
258
|
+
service: SERVICE_NAME,
|
|
232
259
|
endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,
|
|
233
260
|
deploymentEnvironment,
|
|
234
261
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otel-sdk.js","sourceRoot":"","sources":["../../src/telemetry/otel-sdk.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"otel-sdk.js","sourceRoot":"","sources":["../../src/telemetry/otel-sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Span telemetry constants.
|
|
3
|
+
*
|
|
4
|
+
* Header names used to cross the runtime → OpenClaw HTTP boundary so the
|
|
5
|
+
* gateway-side hooks can stamp senpi identity onto the gen_ai spans.
|
|
6
|
+
*/
|
|
7
|
+
export declare const HEADER_CORRELATION_ID = "x-senpi-correlation-id";
|
|
8
|
+
export declare const HEADER_ADDRESS = "x-senpi-address";
|
|
9
|
+
export declare const HEADER_RECIPE_NAME = "x-senpi-recipe-name";
|
|
10
|
+
export declare const HEADER_RUNTIME_ID = "x-senpi-runtime-id";
|
|
11
|
+
export declare const HEADER_RUNTIME_VERSION = "x-senpi-runtime-version";
|
|
12
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/telemetry/spans/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAC9D,eAAO,MAAM,cAAc,oBAAoB,CAAC;AAChD,eAAO,MAAM,kBAAkB,wBAAwB,CAAC;AACxD,eAAO,MAAM,iBAAiB,uBAAuB,CAAC;AACtD,eAAO,MAAM,sBAAsB,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Span telemetry constants.
|
|
3
|
+
*
|
|
4
|
+
* Header names used to cross the runtime → OpenClaw HTTP boundary so the
|
|
5
|
+
* gateway-side hooks can stamp senpi identity onto the gen_ai spans.
|
|
6
|
+
*/
|
|
7
|
+
export const HEADER_CORRELATION_ID = "x-senpi-correlation-id";
|
|
8
|
+
export const HEADER_ADDRESS = "x-senpi-address";
|
|
9
|
+
export const HEADER_RECIPE_NAME = "x-senpi-recipe-name";
|
|
10
|
+
export const HEADER_RUNTIME_ID = "x-senpi-runtime-id";
|
|
11
|
+
export const HEADER_RUNTIME_VERSION = "x-senpi-runtime-version";
|
|
12
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/telemetry/spans/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,wBAAwB,CAAC;AAC9D,MAAM,CAAC,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAChD,MAAM,CAAC,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AACxD,MAAM,CAAC,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AACtD,MAAM,CAAC,MAAM,sBAAsB,GAAG,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* gen_ai / MCP span mapping — the one place that turns extracted hook content (or on-site
|
|
3
|
+
* MCP call data) into OpenTelemetry GenAI/MCP semantic-convention span attributes (the
|
|
4
|
+
* `GEN_AI` keys below). Standard keys only — no OpenClaw `openclaw.content.*` mirror, no
|
|
5
|
+
* OpenInference `input.value`/`output.value` aliases; `gen_ai.system_instructions` is the
|
|
6
|
+
* spec's underscore form.
|
|
7
|
+
*
|
|
8
|
+
* Content (messages, system instructions, tool args/result) is the highest-PII surface, so
|
|
9
|
+
* it is always redacted *before* stamping and capped *after* (sanitize → redact → cap) so a
|
|
10
|
+
* truncated value can't re-expose a partial secret. If the redactor fails to load, content is
|
|
11
|
+
* dropped rather than emitted unredacted.
|
|
12
|
+
*/
|
|
13
|
+
import type { Attributes, Span } from "@opentelemetry/api";
|
|
14
|
+
/**
|
|
15
|
+
* Max chars per content attribute value, applied after redaction. A transport-safety
|
|
16
|
+
* cap that sits far under the OTLP/HTTP request-body limit (~20 MiB), not a backend
|
|
17
|
+
* storage limit — content this size is rare and we'd rather truncate than risk a
|
|
18
|
+
* rejected export.
|
|
19
|
+
*/
|
|
20
|
+
export declare const MAX_OTEL_CONTENT_ATTRIBUTE_CHARS: number;
|
|
21
|
+
/** Max items per message / tool-definition array, applied after redaction. */
|
|
22
|
+
export declare const MAX_OTEL_CONTENT_ARRAY_ITEMS = 200;
|
|
23
|
+
export declare const GEN_AI: {
|
|
24
|
+
readonly OPERATION_NAME: "gen_ai.operation.name";
|
|
25
|
+
readonly PROVIDER_NAME: "gen_ai.provider.name";
|
|
26
|
+
readonly REQUEST_MODEL: "gen_ai.request.model";
|
|
27
|
+
readonly REQUEST_TEMPERATURE: "gen_ai.request.temperature";
|
|
28
|
+
readonly REQUEST_MAX_TOKENS: "gen_ai.request.max_tokens";
|
|
29
|
+
readonly RESPONSE_MODEL: "gen_ai.response.model";
|
|
30
|
+
readonly RESPONSE_FINISH_REASONS: "gen_ai.response.finish_reasons";
|
|
31
|
+
readonly USAGE_INPUT_TOKENS: "gen_ai.usage.input_tokens";
|
|
32
|
+
readonly USAGE_OUTPUT_TOKENS: "gen_ai.usage.output_tokens";
|
|
33
|
+
readonly SYSTEM_INSTRUCTIONS: "gen_ai.system_instructions";
|
|
34
|
+
readonly INPUT_MESSAGES: "gen_ai.input.messages";
|
|
35
|
+
readonly OUTPUT_MESSAGES: "gen_ai.output.messages";
|
|
36
|
+
readonly TOOL_DEFINITIONS: "gen_ai.tool.definitions";
|
|
37
|
+
readonly AGENT_NAME: "gen_ai.agent.name";
|
|
38
|
+
readonly TOOL_NAME: "gen_ai.tool.name";
|
|
39
|
+
readonly TOOL_CALL_ID: "gen_ai.tool.call.id";
|
|
40
|
+
readonly TOOL_CALL_ARGUMENTS: "gen_ai.tool.call.arguments";
|
|
41
|
+
readonly TOOL_CALL_RESULT: "gen_ai.tool.call.result";
|
|
42
|
+
};
|
|
43
|
+
/** Reset the cached redactor (tests only). */
|
|
44
|
+
export declare function __resetContentRedactorForTest(): void;
|
|
45
|
+
/**
|
|
46
|
+
* Turn a content value into a capped JSON string with PII redacted: sanitize framework
|
|
47
|
+
* metadata, redact (when a redactor is available), then serialize within the caps.
|
|
48
|
+
* Array content keeps the newest items (dropping oldest with a visible elision marker,
|
|
49
|
+
* so the result stays valid JSON); non-array content is tail-truncated with a suffix.
|
|
50
|
+
* Returns `undefined` when the value is empty. Never throws — a failure drops the value.
|
|
51
|
+
*/
|
|
52
|
+
export declare function redactAndCapContent(value: unknown): Promise<string | undefined>;
|
|
53
|
+
/** Redact + cap a content value and stamp it onto the span (when capture is on and non-empty). */
|
|
54
|
+
export declare function setGenAiContentAttribute(span: Span, key: string, value: unknown): Promise<void>;
|
|
55
|
+
/** Set every defined value in `attrs` on the span, skipping undefined/null. Never throws. */
|
|
56
|
+
export declare function setDefinedAttributes(span: Span, attrs: Attributes): void;
|
|
57
|
+
/** Low-cardinality `error.type` for the spec: error.name, the string itself, else "_OTHER". */
|
|
58
|
+
export declare function errorTypeOf(error: unknown): string;
|
|
59
|
+
/**
|
|
60
|
+
* Mark a span as failed: record the exception, set ERROR status, and stamp the spec's
|
|
61
|
+
* low-cardinality `error.type`. Never throws.
|
|
62
|
+
*/
|
|
63
|
+
export declare function recordSpanError(span: Span, error: unknown): void;
|
|
64
|
+
/** First finite number among the candidates, else undefined. */
|
|
65
|
+
export declare function firstNumber(...values: unknown[]): number | undefined;
|
|
66
|
+
/** Normalize a finish-reason value to a string array (gen_ai.response.finish_reasons is an array). */
|
|
67
|
+
export declare function toFinishReasons(value: unknown): string[] | undefined;
|
|
68
|
+
/** Normalize a list of raw provider messages into spec `{ role, parts }` objects. */
|
|
69
|
+
export declare function normalizeGenAiMessages(value: unknown, fallbackRole: "user" | "assistant"): Array<Record<string, unknown>> | undefined;
|
|
70
|
+
//# sourceMappingURL=gen-ai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gen-ai.d.ts","sourceRoot":"","sources":["../../../src/telemetry/spans/gen-ai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAc3D;;;;;GAKG;AACH,eAAO,MAAM,gCAAgC,QAAa,CAAC;AAC3D,8EAA8E;AAC9E,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAMhD,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;CAmBT,CAAC;AAyBX,8CAA8C;AAC9C,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD;AA+CD;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAyBrF;AAED,kGAAkG;AAClG,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,IAAI,CAAC,CASf;AAID,6FAA6F;AAC7F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAQxE;AAED,+FAA+F;AAC/F,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIlD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAWhE;AAID,gEAAgE;AAChE,wBAAgB,WAAW,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,GAAG,SAAS,CAKpE;AAED,sGAAsG;AACtG,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAQpE;AAgGD,qFAAqF;AACrF,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,EACd,YAAY,EAAE,MAAM,GAAG,WAAW,GACjC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAQ5C"}
|