eve 0.78.0 → 0.79.0
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/CHANGELOG.md +14 -0
- package/dist/src/approval/definition.d.ts +42 -0
- package/dist/src/cli/commands/trace-detail.d.ts +2 -2
- package/dist/src/cli/commands/trace-detail.js +1 -1
- package/dist/src/cli/commands/trace.d.ts +1 -1
- package/dist/src/cli/commands/trace.js +1 -1
- package/dist/src/cli/dev/tui/traces/trace-conversation.d.ts +1 -1
- package/dist/src/cli/dev/tui/traces/trace-conversation.js +1 -1
- package/dist/src/cli/dev/tui/traces/trace-store.d.ts +1 -1
- package/dist/src/cli/dev/tui/traces/trace-store.js +1 -1
- package/dist/src/cli/dev/tui/traces/trace-view.d.ts +1 -1
- package/dist/src/cli/dev/tui/traces/trace-view.js +1 -1
- package/dist/src/cli/dev/tui/traces/trace-viewer-state.d.ts +1 -1
- package/dist/src/compiled/.vendor-stamp.json +3 -1
- package/dist/src/compiled/@eve/tracing/adapters/agent-transport.d.ts +8 -0
- package/dist/src/compiled/@eve/tracing/adapters/ai-sdk-payload.d.ts +15 -0
- package/dist/src/compiled/@eve/tracing/adapters/ai-sdk-telemetry.d.ts +14 -0
- package/dist/src/{tracing/agent-span-id-generator.d.ts → compiled/@eve/tracing/adapters/otel-ids.d.ts} +1 -1
- package/dist/src/compiled/@eve/tracing/adapters/otel.d.ts +33 -0
- package/dist/src/{tracing/agent-otel-content.d.ts → compiled/@eve/tracing/adapters/serialization.d.ts} +9 -3
- package/dist/src/compiled/@eve/tracing/agent-tracing.d.ts +84 -0
- package/dist/src/compiled/@eve/tracing/ai-sdk.d.ts +7 -0
- package/dist/src/compiled/@eve/tracing/ai-sdk.js +1 -0
- package/dist/src/compiled/@eve/tracing/capture.d.ts +5 -0
- package/dist/src/compiled/@eve/tracing/core/activation.d.ts +3 -0
- package/dist/src/compiled/@eve/tracing/core/attributes.d.ts +14 -0
- package/dist/src/{tracing/content-attributes.d.ts → compiled/@eve/tracing/core/content-policy.d.ts} +1 -1
- package/dist/src/compiled/@eve/tracing/core/context.d.ts +3 -0
- package/dist/src/compiled/@eve/tracing/core/delegation.d.ts +13 -0
- package/dist/src/compiled/@eve/tracing/core/mcp.d.ts +24 -0
- package/dist/src/compiled/@eve/tracing/core/scopes.d.ts +59 -0
- package/dist/src/compiled/@eve/tracing/core/snapshot.d.ts +7 -0
- package/dist/src/compiled/@eve/tracing/core/span-kinds.d.ts +12 -0
- package/dist/src/compiled/@eve/tracing/core/types.d.ts +292 -0
- package/dist/src/compiled/@eve/tracing/core/writer.d.ts +15 -0
- package/dist/src/compiled/@eve/tracing/delegation.d.ts +2 -0
- package/dist/src/compiled/@eve/tracing/delegation.js +1 -0
- package/dist/src/compiled/@eve/tracing/index.d.ts +6 -0
- package/dist/src/compiled/@eve/tracing/index.js +1 -0
- package/dist/src/compiled/@eve/tracing/operations.d.ts +96 -0
- package/dist/src/compiled/@eve/tracing/otel.d.ts +12 -0
- package/dist/src/compiled/@eve/tracing/otel.js +1 -0
- package/dist/src/compiled/@opentelemetry/api/index.d.ts +4 -0
- package/dist/src/compiled/@workflow/world-vercel/index.js +7 -7
- package/dist/src/compiled/_chunks/workflow/delegation-BqhZ398D.js +1 -0
- package/dist/src/compiled/_chunks/workflow/mcp-CrGp4EC8.js +5 -0
- package/dist/src/compiler/extension-compatibility.d.ts +6 -6
- package/dist/src/compiler/extension-compatibility.js +1 -1
- package/dist/src/context/build-dynamic-tools.js +1 -1
- package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
- package/dist/src/evals/assertions/collector.d.ts +4 -1
- package/dist/src/evals/assertions/collector.js +1 -1
- package/dist/src/evals/context.js +1 -1
- package/dist/src/evals/index.d.ts +1 -1
- package/dist/src/evals/runner/artifacts.js +1 -1
- package/dist/src/evals/runner/reporters/assertion-diagnostics.js +2 -2
- package/dist/src/evals/runner/reporters/assertion-scores.d.ts +11 -2
- package/dist/src/evals/runner/reporters/assertion-scores.js +1 -1
- package/dist/src/evals/runner/reporters/braintrust.js +1 -1
- package/dist/src/evals/runner/reporters/console.js +1 -1
- package/dist/src/evals/runner/reporters/datadog.js +2 -2
- package/dist/src/evals/runner/reporters/junit.js +1 -1
- package/dist/src/evals/runner/verdict.d.ts +2 -2
- package/dist/src/evals/runner/verdict.js +1 -1
- package/dist/src/evals/types.d.ts +22 -6
- package/dist/src/eve-channel/index.js +1 -1
- package/dist/src/eve-channel/stream-headers.d.ts +1 -0
- package/dist/src/eve-channel/stream-headers.js +1 -0
- package/dist/src/execution/agent-sessions/context.d.ts +1 -1
- package/dist/src/execution/agent-sessions/context.js +1 -1
- package/dist/src/execution/agent-sessions/remote.js +1 -1
- package/dist/src/execution/agent-sessions/steps.js +1 -1
- package/dist/src/execution/cancelled-model-call-batch.js +1 -1
- package/dist/src/execution/catalog/connection-entry.js +1 -1
- package/dist/src/execution/dynamic-workflow/tool.js +1 -1
- package/dist/src/execution/eve-workflow-attributes.js +1 -1
- package/dist/src/execution/invoke-tool.d.ts +1 -1
- package/dist/src/execution/invoke-tool.js +1 -1
- package/dist/src/execution/session/turn-step.js +1 -1
- package/dist/src/execution/tools/agent-router-workflow.js +1 -1
- package/dist/src/execution/workflow-runtime.js +1 -1
- package/dist/src/harness/execute-tool.d.ts +2 -2
- package/dist/src/harness/input-extraction.js +1 -1
- package/dist/src/instrumentation/ai-sdk-hook-bridge.js +1 -1
- package/dist/src/instrumentation/dispatch.js +1 -1
- package/dist/src/instrumentation/memory.d.ts +1 -4
- package/dist/src/instrumentation/memory.js +1 -1
- package/dist/src/instrumentation/principal-summary.js +1 -1
- package/dist/src/instrumentation/providers.js +1 -1
- package/dist/src/instrumentation/runtime-context.d.ts +1 -1
- package/dist/src/instrumentation/runtime.d.ts +3 -3
- package/dist/src/instrumentation/runtime.js +1 -1
- package/dist/src/instrumentation/session-init.js +1 -1
- package/dist/src/internal/application/stamped-package-version.js +1 -1
- package/dist/src/internal/authored-definition/approval.d.ts +3 -1
- package/dist/src/internal/authored-definition/approval.js +1 -1
- package/dist/src/internal/authored-definition/schema-backed.js +1 -1
- package/dist/src/internal/logging.js +1 -1
- package/dist/src/internal/nitro/host/local-tracing-runtime-plugin.js +1 -1
- package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
- package/dist/src/internal/nitro/routes/channel-request-instrumentation.d.ts +10 -31
- package/dist/src/internal/nitro/routes/channel-request-instrumentation.js +1 -1
- package/dist/src/internal/nitro/routes/route-invoke-tool.d.ts +1 -1
- package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +1 -1
- package/dist/src/public/channels/slack/hitl.js +1 -1
- package/dist/src/public/definitions/approval.d.ts +1 -1
- package/dist/src/public/instrumentation/otel.d.ts +2 -2
- package/dist/src/public/instrumentation/otel.js +1 -1
- package/dist/src/public/tools/approval/index.d.ts +1 -1
- package/dist/src/runtime/connections/mcp-tracing.d.ts +10 -18
- package/dist/src/runtime/connections/mcp-tracing.js +1 -1
- package/dist/src/runtime/resolve-tool.js +1 -1
- package/dist/src/runtime/types.d.ts +2 -2
- package/dist/src/self-modification/extension/subagents/agent/tools/inspect_trace.d.ts +12 -12
- package/dist/src/self-modification/extension/subagents/agent/tools/inspect_trace.js +1 -1
- package/dist/src/self-modification/extension/subagents/agent/tools/search_traces.d.ts +1 -1
- package/dist/src/self-modification/extension/subagents/agent/tools/search_traces.js +1 -1
- package/dist/src/self-modification/extension/trace-inspection.d.ts +1 -1
- package/dist/src/self-modification/extension/trace-inspection.js +1 -1
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/dist/src/shared/trace-policy.d.ts +3 -0
- package/dist/src/shared/trace-policy.js +1 -1
- package/dist/src/tools/definition.d.ts +3 -3
- package/dist/src/tools/durable-callbacks.d.ts +5 -3
- package/dist/src/tools/durable-callbacks.js +1 -1
- package/dist/src/tools/dynamic.d.ts +2 -2
- package/dist/src/tools/provided/ask-question-workflow.js +1 -1
- package/dist/src/tools/provided/sleep-workflow.js +1 -1
- package/dist/src/tools/workflow-definition.d.ts +2 -2
- package/dist/src/tracing/eve/agent-approval-instrumentation.d.ts +8 -0
- package/dist/src/tracing/eve/agent-approval-instrumentation.js +1 -0
- package/dist/src/tracing/{agent-channel-delivery-instrumentation.d.ts → eve/agent-channel-delivery-instrumentation.d.ts} +1 -1
- package/dist/src/tracing/{agent-channel-delivery-instrumentation.js → eve/agent-channel-delivery-instrumentation.js} +1 -1
- package/dist/src/tracing/eve/agent-invocation-coordinator.js +1 -0
- package/dist/src/tracing/eve/agent-memory-instrumentation.d.ts +12 -0
- package/dist/src/tracing/eve/agent-memory-instrumentation.js +1 -0
- package/dist/src/tracing/{agent-otel-provider.d.ts → eve/agent-otel-provider.d.ts} +6 -8
- package/dist/src/tracing/eve/agent-otel-provider.js +1 -0
- package/dist/src/tracing/eve/agent-tool-instrumentation.d.ts +44 -0
- package/dist/src/tracing/eve/agent-tool-instrumentation.js +1 -0
- package/dist/src/tracing/{agent-trace-context-store.d.ts → eve/agent-trace-context-store.d.ts} +8 -16
- package/dist/src/tracing/eve/agent-trace-context-store.js +1 -0
- package/dist/src/tracing/eve/agent-trace-context.js +1 -0
- package/dist/src/tracing/eve/agent-trace-state.d.ts +75 -0
- package/dist/src/tracing/{batch-span-processor.d.ts → eve/batch-span-processor.d.ts} +5 -1
- package/dist/src/tracing/eve/batch-span-processor.js +1 -0
- package/dist/src/tracing/{content-span-processor.d.ts → eve/content-span-processor.d.ts} +1 -1
- package/dist/src/tracing/eve/content-span-processor.js +1 -0
- package/dist/src/tracing/eve/delegation.d.ts +20 -0
- package/dist/src/tracing/eve/delegation.js +1 -0
- package/dist/src/tracing/eve/gateway.d.ts +16 -0
- package/dist/src/tracing/eve/gateway.js +1 -0
- package/dist/src/tracing/{install-instrumentation-runtime.d.ts → eve/install-instrumentation-runtime.d.ts} +1 -1
- package/dist/src/tracing/eve/install-instrumentation-runtime.js +1 -0
- package/dist/src/tracing/eve/invoke-tool-span.js +1 -0
- package/dist/src/tracing/eve/mcp.d.ts +29 -0
- package/dist/src/tracing/eve/mcp.js +1 -0
- package/dist/src/tracing/eve/metadata.d.ts +7 -0
- package/dist/src/tracing/eve/metadata.js +1 -0
- package/dist/src/tracing/eve/operation-input.d.ts +30 -0
- package/dist/src/tracing/eve/operation-input.js +1 -0
- package/dist/src/tracing/eve/otel-configuration.d.ts +70 -0
- package/dist/src/tracing/eve/otel-configuration.js +1 -0
- package/dist/src/tracing/{otel-declaration.d.ts → eve/otel-declaration.d.ts} +4 -11
- package/dist/src/tracing/eve/otel-declaration.js +1 -0
- package/dist/src/tracing/{otel-registration.d.ts → eve/otel-registration.d.ts} +12 -5
- package/dist/src/tracing/eve/otel-registration.js +1 -0
- package/dist/src/tracing/eve/policy.d.ts +15 -0
- package/dist/src/tracing/eve/policy.js +1 -0
- package/dist/src/tracing/eve/profile.d.ts +7 -0
- package/dist/src/tracing/eve/profile.js +1 -0
- package/dist/src/tracing/eve/session.d.ts +27 -0
- package/dist/src/tracing/eve/session.js +1 -0
- package/dist/src/tracing/{vercel-runtime-span-exporter.d.ts → eve/vercel-runtime-span-exporter.d.ts} +1 -1
- package/dist/src/tracing/local/agent-trace-span-processor.js +1 -0
- package/dist/src/tracing/local/inspection.d.ts +15 -0
- package/dist/src/tracing/local/inspection.js +1 -0
- package/dist/src/tracing/{local-instrumentation-runtime.d.ts → local/instrumentation-runtime.d.ts} +1 -1
- package/dist/src/tracing/local/instrumentation-runtime.js +1 -0
- package/dist/src/tracing/{local-trace-analysis.d.ts → local/trace-analysis.d.ts} +2 -2
- package/dist/src/tracing/{local-trace-analysis.js → local/trace-analysis.js} +1 -1
- package/dist/src/tracing/{local-trace-operations.d.ts → local/trace-operations.d.ts} +1 -1
- package/dist/src/tracing/{local-trace-query.d.ts → local/trace-query.d.ts} +1 -1
- package/dist/src/tracing/local/trace-reader.js +1 -0
- package/dist/src/tracing/{local-trace-retention.js → local/trace-retention.js} +1 -1
- package/dist/src/tracing/{local-trace-span-processor.js → local/trace-span-processor.js} +1 -1
- package/dist/src/tracing/{local-trace-summary.d.ts → local/trace-summary.d.ts} +1 -1
- package/dist/src/tracing/local/trace-summary.js +1 -0
- package/dist/src/tracing/{local-traces.d.ts → local/traces.d.ts} +1 -1
- package/dist/src/tracing/local/traces.js +1 -0
- package/docs/connections/mcp.mdx +22 -1
- package/docs/evals/assertions.mdx +50 -3
- package/docs/evals/overview.mdx +2 -1
- package/docs/evals/reporters.mdx +3 -1
- package/docs/tools/human-in-the-loop.md +23 -1
- package/package.json +2 -1
- package/dist/src/tracing/agent-approval-instrumentation.d.ts +0 -11
- package/dist/src/tracing/agent-approval-instrumentation.js +0 -1
- package/dist/src/tracing/agent-invocation-coordinator.js +0 -1
- package/dist/src/tracing/agent-memory-instrumentation.d.ts +0 -16
- package/dist/src/tracing/agent-memory-instrumentation.js +0 -1
- package/dist/src/tracing/agent-otel-attributes.d.ts +0 -10
- package/dist/src/tracing/agent-otel-attributes.js +0 -1
- package/dist/src/tracing/agent-otel-content.js +0 -4
- package/dist/src/tracing/agent-otel-provider.js +0 -2
- package/dist/src/tracing/agent-otel-runtime-context.d.ts +0 -36
- package/dist/src/tracing/agent-otel-runtime-context.js +0 -1
- package/dist/src/tracing/agent-otel-session-context.d.ts +0 -22
- package/dist/src/tracing/agent-otel-session-context.js +0 -1
- package/dist/src/tracing/agent-otel-turn-state.d.ts +0 -6
- package/dist/src/tracing/agent-otel-turn-state.js +0 -1
- package/dist/src/tracing/agent-otel-usage.d.ts +0 -10
- package/dist/src/tracing/agent-otel-usage.js +0 -1
- package/dist/src/tracing/agent-span-contract.d.ts +0 -34
- package/dist/src/tracing/agent-span-contract.js +0 -1
- package/dist/src/tracing/agent-span-error.js +0 -1
- package/dist/src/tracing/agent-span-id-generator.js +0 -1
- package/dist/src/tracing/agent-span-naming.d.ts +0 -1
- package/dist/src/tracing/agent-span-naming.js +0 -1
- package/dist/src/tracing/agent-tool-instrumentation.d.ts +0 -40
- package/dist/src/tracing/agent-tool-instrumentation.js +0 -1
- package/dist/src/tracing/agent-tool-span-context.d.ts +0 -16
- package/dist/src/tracing/agent-tool-span-context.js +0 -1
- package/dist/src/tracing/agent-trace-context-codec.d.ts +0 -15
- package/dist/src/tracing/agent-trace-context-codec.js +0 -1
- package/dist/src/tracing/agent-trace-context-store.js +0 -1
- package/dist/src/tracing/agent-trace-context.js +0 -1
- package/dist/src/tracing/agent-trace-span-processor.js +0 -1
- package/dist/src/tracing/agent-trace-state.d.ts +0 -91
- package/dist/src/tracing/batch-span-processor.js +0 -1
- package/dist/src/tracing/bounded-error.d.ts +0 -1
- package/dist/src/tracing/bounded-error.js +0 -1
- package/dist/src/tracing/content-attributes.js +0 -1
- package/dist/src/tracing/content-span-processor.js +0 -1
- package/dist/src/tracing/error-content-context.d.ts +0 -3
- package/dist/src/tracing/error-content-context.js +0 -1
- package/dist/src/tracing/install-instrumentation-runtime.js +0 -1
- package/dist/src/tracing/invoke-tool-span.js +0 -1
- package/dist/src/tracing/local-instrumentation-runtime.js +0 -1
- package/dist/src/tracing/local-trace-reader.js +0 -1
- package/dist/src/tracing/local-trace-summary.js +0 -1
- package/dist/src/tracing/local-traces.js +0 -1
- package/dist/src/tracing/otel-declaration.js +0 -1
- package/dist/src/tracing/otel-registration.js +0 -1
- package/dist/src/tracing/sampled-trace.d.ts +0 -4
- package/dist/src/tracing/sampled-trace.js +0 -1
- package/dist/src/tracing/suppress-tracing.d.ts +0 -2
- package/dist/src/tracing/suppress-tracing.js +0 -1
- package/dist/src/tracing/telemetry-budget.d.ts +0 -3
- package/dist/src/tracing/telemetry-budget.js +0 -1
- /package/dist/src/{tracing/agent-span-error.d.ts → compiled/@eve/tracing/adapters/otel-error.d.ts} +0 -0
- /package/dist/src/tracing/{agent-invocation-coordinator.d.ts → eve/agent-invocation-coordinator.d.ts} +0 -0
- /package/dist/src/tracing/{agent-trace-context.d.ts → eve/agent-trace-context.d.ts} +0 -0
- /package/dist/src/tracing/{agent-trace-state.js → eve/agent-trace-state.js} +0 -0
- /package/dist/src/tracing/{channel-audience-context.d.ts → eve/channel-audience-context.d.ts} +0 -0
- /package/dist/src/tracing/{channel-audience-context.js → eve/channel-audience-context.js} +0 -0
- /package/dist/src/tracing/{conversation-context.d.ts → eve/conversation-context.d.ts} +0 -0
- /package/dist/src/tracing/{conversation-context.js → eve/conversation-context.js} +0 -0
- /package/dist/src/tracing/{invoke-tool-span.d.ts → eve/invoke-tool-span.d.ts} +0 -0
- /package/dist/src/tracing/{span-export-policy.d.ts → eve/span-export-policy.d.ts} +0 -0
- /package/dist/src/tracing/{span-export-policy.js → eve/span-export-policy.js} +0 -0
- /package/dist/src/tracing/{vercel-runtime-span-exporter.js → eve/vercel-runtime-span-exporter.js} +0 -0
- /package/dist/src/tracing/{agent-trace-span-processor.d.ts → local/agent-trace-span-processor.d.ts} +0 -0
- /package/dist/src/tracing/{local-trace-discovery-index.d.ts → local/trace-discovery-index.d.ts} +0 -0
- /package/dist/src/tracing/{local-trace-discovery-index.js → local/trace-discovery-index.js} +0 -0
- /package/dist/src/tracing/{local-trace-operations.js → local/trace-operations.js} +0 -0
- /package/dist/src/tracing/{local-trace-query.js → local/trace-query.js} +0 -0
- /package/dist/src/tracing/{local-trace-reader.d.ts → local/trace-reader.d.ts} +0 -0
- /package/dist/src/tracing/{local-trace-retention.d.ts → local/trace-retention.d.ts} +0 -0
- /package/dist/src/tracing/{local-trace-span-processor.d.ts → local/trace-span-processor.d.ts} +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { SpanContext } from "#compiled/@opentelemetry/api/index.js";
|
|
2
|
+
import type { InstrumentationParentLineage, InstrumentationPrincipalSummary } from "#instrumentation/lifecycle.js";
|
|
3
|
+
import type { ChannelAudience } from "#shared/channel-audience.js";
|
|
4
|
+
import type { InstrumentationDecision } from "#shared/instrumentation-decision.js";
|
|
5
|
+
import type { TraceSnapshot } from "#compiled/@eve/tracing/index.js";
|
|
6
|
+
export interface AgentSessionTraceState {
|
|
7
|
+
readonly traceSessionId: string;
|
|
8
|
+
readonly channelAudience?: ChannelAudience;
|
|
9
|
+
readonly agentName?: string;
|
|
10
|
+
readonly channelKind?: string;
|
|
11
|
+
readonly channelType?: string;
|
|
12
|
+
readonly context: SpanContext;
|
|
13
|
+
readonly decision?: InstrumentationDecision;
|
|
14
|
+
readonly parentLineage?: InstrumentationParentLineage;
|
|
15
|
+
readonly rootSessionId: string;
|
|
16
|
+
readonly scheduleId?: string;
|
|
17
|
+
readonly title?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface AgentTurnTraceState {
|
|
20
|
+
readonly agentName?: string;
|
|
21
|
+
/** Recorded at the turn's terminal event; the span ends at the session transition. */
|
|
22
|
+
readonly terminal?: {
|
|
23
|
+
readonly outcome: "cancelled" | "completed" | "failed";
|
|
24
|
+
readonly errorName?: string;
|
|
25
|
+
readonly errorMessage?: string;
|
|
26
|
+
};
|
|
27
|
+
readonly traceSessionId: string;
|
|
28
|
+
readonly caller?: SpanContext;
|
|
29
|
+
readonly channelDelivery?: AgentTurnChannelDeliveryTraceState;
|
|
30
|
+
readonly context: SpanContext;
|
|
31
|
+
readonly currentPrincipal?: InstrumentationPrincipalSummary;
|
|
32
|
+
readonly initiatorPrincipal?: InstrumentationPrincipalSummary;
|
|
33
|
+
readonly parentLineage?: InstrumentationParentLineage;
|
|
34
|
+
readonly rootSessionId: string;
|
|
35
|
+
readonly sequence: number;
|
|
36
|
+
readonly startTimeMs: number;
|
|
37
|
+
readonly subagentName?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface AgentTurnChannelDeliveryTraceState {
|
|
40
|
+
readonly channelKind: string;
|
|
41
|
+
readonly channelName: string;
|
|
42
|
+
readonly deliveryId: string;
|
|
43
|
+
readonly inputAttribute?: string;
|
|
44
|
+
readonly requestId?: string;
|
|
45
|
+
readonly requestTraceContext?: SpanContext;
|
|
46
|
+
}
|
|
47
|
+
/** Locates a dispatched tool call in its turn's trace tree, after the turn's own state is gone. */
|
|
48
|
+
export interface AgentActionTraceState {
|
|
49
|
+
readonly attemptId?: string;
|
|
50
|
+
readonly attemptIndex: number;
|
|
51
|
+
readonly callId: string;
|
|
52
|
+
readonly channelAudience?: ChannelAudience;
|
|
53
|
+
readonly context: SpanContext;
|
|
54
|
+
readonly rootSessionId?: string;
|
|
55
|
+
readonly sessionId: string;
|
|
56
|
+
readonly stepIndex: number;
|
|
57
|
+
/** When the SDK execution finished, for dispatches that report no acceptance time. */
|
|
58
|
+
readonly toolEndTimeMs?: number;
|
|
59
|
+
readonly turnId: string;
|
|
60
|
+
}
|
|
61
|
+
/** Provider-owned serializable storage for durable agent trace state. */
|
|
62
|
+
export interface AgentTraceStateStore {
|
|
63
|
+
get<K extends keyof AgentTraceValues>(kind: K, key: string): AgentTraceValues[K] | undefined | PromiseLike<AgentTraceValues[K] | undefined>;
|
|
64
|
+
set<K extends keyof AgentTraceValues>(kind: K, key: string, value: AgentTraceValues[K]): void | PromiseLike<void>;
|
|
65
|
+
delete(kind: keyof AgentTraceValues, key: string): void | PromiseLike<void>;
|
|
66
|
+
update<K extends keyof AgentTraceValues>(kind: K, key: string, update: (value: AgentTraceValues[K]) => AgentTraceValues[K]): void | PromiseLike<void>;
|
|
67
|
+
entries<K extends keyof AgentTraceValues>(kind: K): readonly [string, AgentTraceValues[K]][] | PromiseLike<readonly [string, AgentTraceValues[K]][]>;
|
|
68
|
+
}
|
|
69
|
+
export interface AgentTraceValues {
|
|
70
|
+
session: AgentSessionTraceState;
|
|
71
|
+
turn: AgentTurnTraceState;
|
|
72
|
+
action: AgentActionTraceState;
|
|
73
|
+
anchor: AgentActionTraceState;
|
|
74
|
+
checkpoint: TraceSnapshot;
|
|
75
|
+
}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
import type { SpanExporter, SpanProcessor } from "
|
|
1
|
+
import type { SpanExporter, SpanProcessor } from "./otel-configuration.js";
|
|
2
2
|
/** @internal — exposed for tests; authors get the defaults. */
|
|
3
3
|
interface BatchSpanProcessorOptions {
|
|
4
|
+
readonly diagnostic?: (message: string, details: {
|
|
5
|
+
error?: unknown;
|
|
6
|
+
timeoutMillis?: number;
|
|
7
|
+
}) => void;
|
|
4
8
|
readonly exportTimeoutMillis?: number;
|
|
5
9
|
readonly maxExportBatchSize?: number;
|
|
6
10
|
readonly maxQueueSize?: number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{TraceFlags,context,createContextKey}from"#compiled/@opentelemetry/api/index.js";const SUPPRESS_TRACING_KEY=createContextKey(`OpenTelemetry SDK Context Key SUPPRESS_TRACING`),DEFAULTS={exportTimeoutMillis:3e4,maxExportBatchSize:512,maxQueueSize:2048,scheduledDelayMillis:5e3};function batchSpanProcessor(e,t={}){let report=(e,n)=>{try{t.diagnostic?.(e,n)}catch{}},n=t.exportTimeoutMillis??DEFAULTS.exportTimeoutMillis,r=t.maxExportBatchSize??DEFAULTS.maxExportBatchSize,i=t.maxQueueSize??DEFAULTS.maxQueueSize,a=t.scheduledDelayMillis??DEFAULTS.scheduledDelayMillis,o=[],s,c=Promise.resolve(),l=!1;function cancelTimer(){s!==void 0&&(clearTimeout(s),s=void 0)}function scheduleDrain(){s===void 0&&(s=setTimeout(()=>{s=void 0,drain()},a),s.unref?.())}function drain(){return waitForExporter(pendingDrain(),`span export`).then(()=>void 0)}async function exportBatch(t){try{await new Promise((n,r)=>{try{context.with(context.active().setValue(SUPPRESS_TRACING_KEY,!0),()=>{e.export(t,e=>{if(e.code===0){n();return}r(e.error??Error(`Span export failed.`))})})}catch(e){r(e instanceof Error?e:Error(String(e)))}})}catch(e){report(`span export failed`,{error:e})}}return{async forceFlush(){!l&&await waitForExporter(pendingDrain(),`span export`)&&e.forceFlush!==void 0&&await waitForExporter(settleExporter(`exporter flush`,e.forceFlush),`exporter flush`)},onEnd(e){if(!l&&isSampled(e)&&!(o.length>=i)){if(o.push(e),o.length>=r){drain();return}scheduleDrain()}},onStart(){},async shutdown(){l=!0;let t=pendingDrain();if(!await waitForExporter(t,`span export`)){t.then(()=>settleExporter(`exporter shutdown`,e.shutdown));return}await waitForExporter(settleExporter(`exporter shutdown`,e.shutdown),`exporter shutdown`)}};function pendingDrain(){return cancelTimer(),c=c.then(async()=>{for(;o.length>0;)await exportBatch(o.splice(0,r))}),c}async function waitForExporter(e,t){let r,i=new Promise(e=>{r=setTimeout(()=>{report(`${t} timed out; preserving exporter serialization`,{timeoutMillis:n}),e(!1)},n),r.unref?.()}),a=e.then(()=>!0);try{return await Promise.race([a,i])}finally{clearTimeout(r)}}async function settleExporter(t,n){try{await n.call(e)}catch(e){report(`${t} failed`,{error:e})}}}function isSampled(e){if(typeof e!=`object`||!e||!(`spanContext`in e))return!1;let t=e.spanContext;if(typeof t!=`function`)return!1;let n=Reflect.apply(t,e,[]);return typeof n.traceFlags==`number`&&(n.traceFlags&TraceFlags.SAMPLED)===TraceFlags.SAMPLED}export{batchSpanProcessor};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SpanProcessor } from "#compiled/@vercel/otel/index.js";
|
|
2
|
-
import { type SpanExportPolicy } from "#tracing/span-export-policy.js";
|
|
2
|
+
import { type SpanExportPolicy } from "#tracing/eve/span-export-policy.js";
|
|
3
3
|
/**
|
|
4
4
|
* Puts one destination's content policy in front of it.
|
|
5
5
|
*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{normalizeChannelAudience}from"#shared/channel-audience.js";import{withoutDeclinedContent}from"#compiled/@eve/tracing/otel.js";import{hasConversationRelease}from"#tracing/local/traces.js";import{channelAudienceFromContext}from"#tracing/eve/channel-audience-context.js";import{normalizeSpanExportPolicies}from"#tracing/eve/span-export-policy.js";function contentFilteringProcessor(e,t){let n=normalizeSpanExportPolicies(t);if(n.length===0)return e;let r=e;for(let e of n.toReversed())r=policyFilteringProcessor(r,e);return r}function policyFilteringProcessor(e,t){let n=new WeakMap,r=new WeakSet,i={forceFlush:()=>e.forceFlush(),onEnd:i=>{if(typeof i!=`object`||!i)return;let a=facadeFor(i,t,n);if(r.has(i)||!a.exported){r.delete(i),n.delete(i);return}a.refresh();try{e.onEnd(a.value)}finally{n.delete(i)}},onStart:(i,a)=>{if(typeof i!=`object`||!i)return;let o=facadeFor(i,t,n,channelAudienceFromContext(a));if(!o.exported){r.add(i);return}e.onStart(o.value,a)},shutdown:()=>e.shutdown()};return hasConversationRelease(e)?{...i,releaseConversation:t=>e.releaseConversation(t)}:i}function facadeFor(e,t,n,r){let i=n.get(e);if(i!==void 0)return i;let a=spanExportContext(e,r),o=spanExportDecision(a,t),s={recordInputs:!o.redactInputs,recordOutputs:!o.redactOutputs},c={},l=[],u={},d=Object.create(Reflect.getPrototypeOf(e)),f=new Map,refresh=()=>{refreshAttributes(c,e,s,a,t),refreshEvents(l,e,s),refreshStatus(u,e,s)},p,readOriginal=t=>{let n=Reflect.get(e,t,e);if(typeof n!=`function`||t===`constructor`)return n;let r=f.get(t);if(r!==void 0)return r;let created=(...t)=>{let r=Reflect.apply(n,e,t);return refresh(),r===e?p:r};return f.set(t,created),created};Object.defineProperty(d,"attributes",{configurable:!0,enumerable:!0,value:c}),Object.defineProperty(d,"events",{configurable:!0,enumerable:!0,value:l}),Object.defineProperty(d,"status",{configurable:!0,enumerable:!0,value:u});for(let t of Reflect.ownKeys(e)){if(t===`attributes`||t===`events`||t===`status`)continue;let n=Reflect.getOwnPropertyDescriptor(e,t);Object.defineProperty(d,t,{configurable:!0,enumerable:n?.enumerable??!1,get:()=>readOriginal(t)})}p=new Proxy(d,{get:(e,t,n)=>Object.hasOwn(e,t)?Reflect.get(e,t,n):readOriginal(t)});let m={context:a,exported:o.exported,refresh,value:p};return m.refresh(),n.set(e,m),m}function refreshAttributes(e,t,n,r,i){for(let t of Object.keys(e))delete e[t];let a=t.attributes;if(typeof a!=`object`||!a)return;let o=withoutDeclinedContent(a,n)??a;for(let[t,n]of Object.entries(o)){let a=attributeDecision(i,{key:t,span:r,value:n});typeof a==`object`&&a&&(`emit`in a&&`replace`in a||(`replace`in a&&a.replace===!0?a.value!==void 0&&(e[t]=a.value):`emit`in a&&a.emit===!0&&(e[t]=n)))}}function spanExportContext(e,t=`unknown`){let n=e.attributes,r=typeof n==`object`&&n?n:{},i=[r[`agent.channel.audience`],r[`ai.settings.context.eve.channel.audience`]].filter(e=>e!==void 0).map(normalizeChannelAudience),a=i.length>0&&i.every(e=>e===i[0])?i[0]:i.length>0?`unknown`:t,o=e.spanContext?.(),s=typeof o==`object`&&o?o:{},c=e.name;return{attributes:r,audience:a,name:typeof c==`string`?c:``,spanId:typeof s.spanId==`string`?s.spanId:``,traceId:typeof s.traceId==`string`?s.traceId:``}}function spanExportDecision(e,t){let n;try{n=t.span?.(e)??{emit:!0}}catch{return{exported:!1,redactInputs:!1,redactOutputs:!1}}if(typeof n!=`object`||!n)return{exported:!1,redactInputs:!1,redactOutputs:!1};if(`emit`in n)return`redact`in n?{exported:!1,redactInputs:!1,redactOutputs:!1}:{exported:typeof n.emit==`boolean`&&n.emit,redactInputs:!1,redactOutputs:!1};if(n.redact!==!0)return{exported:!1,redactInputs:!1,redactOutputs:!1};let r=n.inputs===!0,i=n.outputs===!0;return!r&&!i?{exported:!1,redactInputs:!1,redactOutputs:!1}:{exported:!0,redactInputs:r,redactOutputs:i}}function attributeDecision(e,t){if(e?.attribute===void 0)return{emit:!0};try{return e.attribute(t)}catch{return{emit:!1}}}function refreshEvents(e,t,n){e.length=0;let r=t.events;if(Array.isArray(r)){if(n.recordOutputs){e.push(...r);return}for(let t of r){if(typeof t!=`object`||!t)continue;let n=t;n.name!==`exception`&&e.push({...n,attributes:void 0})}}}function refreshStatus(e,t,n){for(let t of Object.keys(e))delete e[t];let r=t.status;if(typeof r!=`object`||!r)return;let i=r;i.code!==void 0&&(e.code=i.code),n.recordOutputs&&i.message!==void 0&&(e.message=i.message)}export{contentFilteringProcessor};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AgentSessionContext } from "#execution/agent-sessions/context.js";
|
|
2
|
+
import type { SessionParent, SessionTraceContext } from "#channel/types.js";
|
|
3
|
+
export declare const agentDelegation: {
|
|
4
|
+
fetch: typeof fetch;
|
|
5
|
+
resume<T>(input: {
|
|
6
|
+
context: Pick<AgentSessionContext, "trace" | "parent">;
|
|
7
|
+
agentName: string;
|
|
8
|
+
}, execute: () => T): T;
|
|
9
|
+
receive<T>(input: {
|
|
10
|
+
headers: Headers;
|
|
11
|
+
delegated: boolean;
|
|
12
|
+
trusted: boolean;
|
|
13
|
+
parent?: SessionParent;
|
|
14
|
+
callerTrace?: SessionTraceContext;
|
|
15
|
+
parentTraceContext?: SessionTraceContext;
|
|
16
|
+
}, execute: (context: {
|
|
17
|
+
conversationId?: string;
|
|
18
|
+
parentTraceContext?: SessionTraceContext;
|
|
19
|
+
}) => T): T;
|
|
20
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{readConversationBaggage}from"#tracing/eve/conversation-context.js";import{resolveConversationId}from"#shared/conversation-identity.js";import{intersectInstrumentationDecisions}from"#shared/instrumentation-decision.js";import{createAgentDelegationTransport}from"#compiled/@eve/tracing/delegation.js";const transport=createAgentDelegationTransport(),agentDelegation={fetch:transport.fetch,resume(e,t){let{context:n}=e,r=n.trace.parentTraceContext;if(r===void 0)return t();let i=r.decision;return transport.resume({caller:r,conversationId:n.trace.conversationId??resolveConversationId(n.parent.rootSessionId),parentRunId:n.parent.sessionId,parentCallId:n.parent.callId,agentName:e.agentName,capture:{emit:r.traceFlags===1&&i?.action!==`drop`,recordInputs:i?.action===`record`&&i.recordInputs,recordOutputs:i?.action===`record`&&i.recordOutputs}},t)},receive(e,t){return transport.receive(e.headers,t=>e.delegated&&e.trusted&&e.parent!==void 0&&t.parentRunId===e.parent.sessionId&&t.parentCallId===e.parent.callId&&e.callerTrace?.traceId===t.caller.traceId&&e.callerTrace.spanId===t.caller.spanId,n=>{let r=e.parentTraceContext,i=n?.capture.emit?{action:`record`,recordInputs:n.capture.recordInputs,recordOutputs:n.capture.recordOutputs}:{action:`drop`},a=n===void 0||r===void 0?r:{...r,decision:r.decision===void 0?i:intersectInstrumentationDecisions(r.decision,i),traceFlags:n.capture.emit?r.traceFlags:0};return t({conversationId:e.delegated?n?.conversationId??readConversationBaggage(e.headers.get(`baggage`)):void 0,parentTraceContext:a})})}};export{agentDelegation};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Converts Gateway response metadata to cost data. */
|
|
2
|
+
import type { Attributes } from "#compiled/@eve/tracing/index.js";
|
|
3
|
+
export declare function gatewayCostAttributes(input: {
|
|
4
|
+
cost?: number;
|
|
5
|
+
gatewayCost?: number;
|
|
6
|
+
inputCost?: number;
|
|
7
|
+
outputCost?: number;
|
|
8
|
+
generationId?: string;
|
|
9
|
+
}): Attributes;
|
|
10
|
+
export declare function readGatewayCostData(providerMetadata: Readonly<Record<string, unknown>> | undefined): {
|
|
11
|
+
cost: number | undefined;
|
|
12
|
+
gatewayCost: number | undefined;
|
|
13
|
+
inputCost: number | undefined;
|
|
14
|
+
outputCost: number | undefined;
|
|
15
|
+
generationId: string | undefined;
|
|
16
|
+
} | undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function gatewayCostAttributes(e){return{"gen_ai.usage.cost":e.cost,"gen_ai.usage.gateway_cost":e.gatewayCost,"gen_ai.usage.input_cost":e.inputCost,"gen_ai.usage.output_cost":e.outputCost,"gen_ai.generation.id":e.generationId}}function readGatewayCostData(e){if(e===void 0)return;let t=e.gateway;if(typeof t!=`object`||!t||Array.isArray(t))return;let n=t;return{cost:readUsd(n.cost),gatewayCost:readUsd(n.gatewayCost),inputCost:readUsd(n.inputInferenceCost),outputCost:readUsd(n.outputInferenceCost),generationId:typeof n.generationId==`string`&&n.generationId.length>0?n.generationId:void 0}}function readUsd(e){if(typeof e!=`string`||e.trim()===``)return;let t=Number(e);return Number.isFinite(t)?t:void 0}export{gatewayCostAttributes,readGatewayCostData};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type InstrumentationProviderDefinition } from "#instrumentation/lifecycle.js";
|
|
2
2
|
import { type InstrumentationRuntime } from "#instrumentation/runtime.js";
|
|
3
|
-
import type { CollectedOtel, RuntimeContextResolver } from "#tracing/otel-declaration.js";
|
|
3
|
+
import type { CollectedOtel, RuntimeContextResolver } from "#tracing/eve/otel-declaration.js";
|
|
4
4
|
/**
|
|
5
5
|
* Installs the process instrumentation runtime around a collected pipeline.
|
|
6
6
|
*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createLogger,formatError}from"#internal/logging.js";import{contextStorage}from"#context/container.js";import{ConversationIdKey}from"#context/keys.js";import{resolveInstrumentationEnvironment}from"#internal/application/dev-environment.js";import{readConversationId}from"#shared/conversation-identity.js";import{ContextAgentTraceStateStore}from"#tracing/eve/agent-trace-context-store.js";import{registerInstrumentationRuntime}from"#instrumentation/runtime.js";import{createInstrumentationHooks}from"#instrumentation/lifecycle.js";import{AgentSpanIdGenerator,otelTelemetry}from"#compiled/@eve/tracing/index.js";import{hasConversationRelease}from"#tracing/local/traces.js";import{createAgentOtelInstrumentation}from"#tracing/eve/agent-otel-provider.js";import{registerOtel}from"#tracing/eve/otel-registration.js";import{eveOutputMapping}from"#tracing/eve/profile.js";const log=createLogger(`tracing.install-instrumentation-runtime`);function installInstrumentationRuntime(e){let t=[],n=[],r,i,a,runInContext=(e,t)=>t(),o;if(e.collected.declared){r=registerOtel({serviceName:e.serviceName,otel:e.collected.configuration}),o=r.idGenerator;let s=createAgentOtelInstrumentation({environment:resolveInstrumentationEnvironment(),frameworkVersion:e.frameworkVersion,telemetry:otelTelemetry({provider:r.provider,tracerName:`eve.agent`,tracerVersion:e.frameworkVersion,idGenerator:o,samplesTrace:r.samplesTrace,mapping:eveOutputMapping()}),idGenerator:o,recordInputs:e.collected.settings.recordInputs,recordOutputs:e.collected.settings.recordOutputs,stateStore:new ContextAgentTraceStateStore,tracePolicy:e.collected.settings.tracePolicy});t.push({...s.hook,stateNamespace:`internal:otel`}),i=s.prepareSessionTrace,a=s.prepareTurnTrace,runInContext=s.runInContext;let c=e.collected.configuration.spanProcessors.filter(isSpanProcessor).filter(hasConversationRelease);c.length>0&&n.push(sessionReleaseProvider(c))}else o=new AgentSpanIdGenerator;let s=[...t,...e.providers,...n],c;return registerInstrumentationRuntime({forceFlush:async()=>{await settleAll(s.map(e=>()=>e.flush?.())),await settleAll(r===void 0?[]:[r.forceFlush])},hooks:createInstrumentationHooks({parallel:e.providers,serialAfter:n,serialBefore:t}),idGenerator:o,memoryOperations:r!==void 0||e.providers.some(hasMemoryOperationHandler),otelSettings:e.collected.declared?e.collected.settings:void 0,ownsAgentSpans:r!==void 0,prepareSessionTrace:i,prepareTurnTrace:a,runtimeContextResolvers:e.runtimeContextResolvers,runInContext,samplesTrace:r?.samplesTrace,shutdown:()=>(c??=(async()=>{await settleAll(s.map(e=>()=>e.shutdown?.())),await settleAll(r===void 0?[]:[r.shutdown])})(),c)})}function hasMemoryOperationHandler(e){return e.events?.[`memory.operation.started`]!==void 0||e.events?.[`memory.operation.completed`]!==void 0||e.events?.[`memory.operation.failed`]!==void 0}function isSpanProcessor(e){return e!==`auto`}function sessionReleaseProvider(e){let release=async t=>{let n=readConversationId(contextStorage.getStore()?.get(ConversationIdKey))??t.sessionId;n===t.sessionId&&await Promise.all(e.map(e=>e.releaseConversation(n)))};return{events:{"session.completed":release,"session.failed":release},name:`eve.conversation-release`,stateNamespace:`internal:conversation-release`}}async function settleAll(e){let t=await Promise.allSettled(e.map(async e=>e()));for(let e of t)e.status===`rejected`&&log.warn(`instrumentation drain failed`,{error:formatError(e.reason)})}export{installInstrumentationRuntime};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createLogger,formatError}from"#internal/logging.js";import{applyLiveDeliveryAudienceCeiling}from"#shared/forwarded-trace-policy.js";import{DIRECT_TOOL_CALL_ATTRIBUTE,DIRECT_TOOL_CALL_VALUE}from"#tracing/local/inspection.js";import{resolveInstrumentationEnvironment}from"#internal/application/dev-environment.js";import{operationConversationId}from"#tracing/eve/conversation-context.js";import{resolveTracePolicy}from"#shared/trace-policy.js";import{context}from"#compiled/@opentelemetry/api/index.js";import{buildConversationContext}from"#channel/conversation-context.js";import{markAgentTraceContext}from"#tracing/eve/agent-trace-context.js";import{toolCallIdempotencyKey}from"#instrumentation/lifecycle.js";import{contentAttribute,mcpLifecycle,withErrorContent}from"#compiled/@eve/tracing/otel.js";import{otelTelemetry}from"#compiled/@eve/tracing/index.js";import{getInstrumentationRuntime}from"#instrumentation/runtime-global.js";import{MCP_SERIALIZER}from"#tracing/eve/mcp.js";import{withChannelAudience}from"#tracing/eve/channel-audience-context.js";import{eveOutputMapping}from"#tracing/eve/profile.js";const log=createLogger(`invoke-tool`),agentTelemetry=()=>otelTelemetry({tracerName:`eve.agent`,mapping:eveOutputMapping()});async function withInvokeToolSpan(e,t){let n=withErrorContent(context.active(),!1);return await context.with(n,()=>traced(e,n,t))}async function traced(e,t,n){let r=getInstrumentationRuntime();if(r===void 0)return await n(silentObserver);let i=agentTelemetry(),a=buildConversationContext({adapter:e.origin?.adapter??{kind:`channel`},auth:e.auth,channelName:e.origin?.channelName},resolveInstrumentationEnvironment()),o=toolCallEvents(r.hooks.forTrace?.({agentName:e.agentName,...a})??r.hooks,{attemptId:e.callId,attemptIndex:0,channelAudience:a.audience,functionId:e.agentName,rootSessionId:e.sessionId,sessionId:e.sessionId,stepIndex:0,traceSessionId:e.sessionId,turnId:e.callId},e),s=r.otelSettings;if(s===void 0)return await n(o.observer(void 0));let c=resolveTracePolicy(s.tracePolicy,{agentName:e.agentName,...a},e=>log.warn(`tracePolicy threw; dropping the tool call's trace`,{error:formatError(e)}));if(c.action===`drop`)return await i.suppressed(()=>n(o.observer(void 0)));let l=applyLiveDeliveryAudienceCeiling({action:`record`,recordInputs:s.recordInputs&&c.recordInputs,recordOutputs:s.recordOutputs&&c.recordOutputs},a.audience,void 0,a.environment),u=l.action===`record`&&l.recordInputs,d=l.action===`record`&&l.recordOutputs,f=`execute_tool ${e.toolName}`,p=withChannelAudience(t,a.audience),m={"agent.tool.is_framework":!1,"gen_ai.agent.name":e.agentName,"gen_ai.operation.name":`execute_tool`,"gen_ai.tool.call.id":e.callId,"gen_ai.tool.name":e.toolName,"gen_ai.tool.type":`function`,[DIRECT_TOOL_CALL_ATTRIBUTE]:DIRECT_TOOL_CALL_VALUE,"operation.name":`execute_tool`,"resource.name":f,"agent.run.id":e.sessionId,"agent.trace.schema.version":4,"gen_ai.conversation.id":operationConversationId({sessionId:e.sessionId})};process.env.VERCEL_ENV!==void 0&&(m[`vercel.session_id`]=e.sessionId),e.origin!==void 0&&(m[`eve.channel.kind`]=a.channel.kind,m[`eve.channel.name`]=e.origin.channelName);let h=i.startSpan({type:`tool`,operationId:e.callId,name:f,kind:`INTERNAL`,attributes:m},{context:p}),g={emit:!0,recordInputs:u,recordOutputs:d},_=markAgentTraceContext(withErrorContent(p,d)),v=mcpLifecycle({serializer:MCP_SERIALIZER,...g,write:e=>setDefined(h,e),error:(e,t)=>h.fail(d?e:void 0,t)}),y,b=o.observer({failedWith:e=>{y={error:e}},recordInputs:u,span:h});try{let e=await i.run({type:`tool`,reference:h.reference,capture:g,mcp:v},()=>n(b),_);if(h.setAttribute(`eve.tool.outcome`,e.status),e.status===`completed`&&d){let t=contentAttribute(e.output);t!==void 0&&h.setAttribute(`gen_ai.tool.call.result`,t)}return e.status===`invalid-input`?h.fail(void 0,e.status):e.status===`failed`&&h.fail(d?y?.error:void 0,y===void 0?e.status:void 0),e}catch(e){throw h.fail(d?e:void 0),e}finally{h.end(),await r.forceFlush().catch(e=>{log.warn(`flushing a tool call's trace failed`,{error:formatError(e)})})}}const silentObserver={executed:async()=>{},executing:async()=>{},failedWith:()=>{}};function toolCallEvents(e,t,n){let r=e.capturesInputs??e.capturesContent,i=e.capturesOutputs??e.capturesContent,a=toolCallIdempotencyKey(t,n.callId,0);return{observer(o){return{async executing(i){if(o?.recordInputs){let e=contentAttribute(i);e!==void 0&&o.span.setAttribute(`gen_ai.tool.call.arguments`,e)}await e.publish(Object.freeze({callId:n.callId,idempotencyKey:a,input:r?i:void 0,scope:t,toolName:n.toolName,type:`tool.call.started`}))},async executed(n){o?.span.setAttribute(`gen_ai.execute_tool.duration`,n.durationMs/1e3);let r=n.type===`result`?i?{output:n.output,type:`result`}:{type:`result`}:i?{error:n.error,type:`error`}:{type:`error`};await e.publish(Object.freeze({durationMs:n.durationMs,idempotencyKey:a,output:Object.freeze(r),scope:t,type:`tool.call.completed`,outcome:n.type===`result`?`completed`:`failed`}))},failedWith(e){o?.failedWith(e)}}}}}function setDefined(e,t){for(let[n,r]of Object.entries(t))r!==void 0&&e.setAttribute(n,r)}export{withInvokeToolSpan};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type Context as OtelContext } from "#compiled/@opentelemetry/api/index.js";
|
|
2
|
+
import { type ContentSerializer } from "#compiled/@eve/tracing/index.js";
|
|
3
|
+
type Context = Pick<OtelContext, "getValue">;
|
|
4
|
+
export declare function createMcpTraceFetch(input: {
|
|
5
|
+
readonly connectionName: string;
|
|
6
|
+
readonly fetcher?: typeof fetch;
|
|
7
|
+
readonly getActiveContext?: () => Context;
|
|
8
|
+
readonly getProtocolVersion: () => string | undefined;
|
|
9
|
+
readonly injectContext?: McpTraceContextInjector;
|
|
10
|
+
readonly filterCarrier?: (carrier: Record<string, string>) => void;
|
|
11
|
+
}): typeof fetch;
|
|
12
|
+
/** Records only JSON tool arguments and results, as MCP spans carry no model content. */
|
|
13
|
+
export declare const MCP_SERIALIZER: ContentSerializer;
|
|
14
|
+
export declare function createMcpTracing(): {
|
|
15
|
+
list<T>(input: {
|
|
16
|
+
readonly connectionName: string;
|
|
17
|
+
readonly execute: () => Promise<T>;
|
|
18
|
+
readonly protocolVersion?: string;
|
|
19
|
+
}): Promise<T>;
|
|
20
|
+
call<T>(input: {
|
|
21
|
+
readonly arguments: unknown;
|
|
22
|
+
readonly connectionName: string;
|
|
23
|
+
readonly execute: () => Promise<T>;
|
|
24
|
+
readonly protocolVersion?: string;
|
|
25
|
+
readonly toolName: string;
|
|
26
|
+
}): Promise<T>;
|
|
27
|
+
};
|
|
28
|
+
type McpTraceContextInjector = (context: Context, carrier: Record<string, string>) => void;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{eveOutputMapping}from"./profile.js";import{context,propagation,trace}from"#compiled/@opentelemetry/api/index.js";import{activeTraceOperation,contentAttribute,mcpLifecycle,truncateTelemetryText}from"#compiled/@eve/tracing/otel.js";import{otelTelemetry}from"#compiled/@eve/tracing/index.js";function isObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const MAX_MCP_TRACE_REQUEST_BYTES=1048576,MAX_MCP_TRACE_CONTEXT_BYTES=8192,utf8Encoder=new TextEncoder,traceContextSetter={set(e,t,n){e[t]=n}};function createMcpTraceFetch(e){let t=e.fetcher??((e,t)=>globalThis.fetch(e,t)),n=e.getActiveContext??(()=>context.active()),r=e.injectContext??injectOpenTelemetryTraceContext;return async(i,a)=>{let o=readJsonRpcRequest(a?.body);if(o===void 0)return await t(i,a);let s=n(),c=injectMcpTraceContext(o,s,r,e.filterCarrier),l=o.method===`tools/call`||o.method===`tools/list`&&activeTraceOperation(s)?.type===`mcp`;l&&activeTraceOperation(s)?.mcp?.update(mcpRequestMetadata({connectionName:e.connectionName,message:o,params:isObject(o.params)?o.params:{},protocolVersion:headerValue(a?.headers,`mcp-protocol-version`)??e.getProtocolVersion()}));let u=await t(i,c===void 0?a:{...a,body:JSON.stringify(c)});if(l){let e=u.headers.get(`mcp-session-id`);e!==null&&activeTraceOperation(s)?.mcp?.update({sessionId:truncateTelemetryText(e,512)})}return u}}function injectMcpTraceContext(e,t,n=injectOpenTelemetryTraceContext,r){if(!withinTraceRequestLimit(JSON.stringify(e))||e.params!==void 0&&!isObject(e.params))return;let i={};if(n(t,i),!withinTraceContextLimit(i))return;r?.(i);let a=isObject(e.params)?e.params:{},o=isObject(a._meta)?a._meta:{};return{...e,params:{...a,_meta:{...o,...i}}}}const noContent=()=>void 0,MCP_SERIALIZER={json:contentAttribute,text:noContent,inputMessages:noContent,instructions:noContent,toolDefinitions:noContent,outputMessages:noContent,toolResults:noContent};function createMcpTracing(){let e=otelTelemetry({tracerName:`eve.mcp`,mapping:eveOutputMapping()});function start(t){let n=e.startSpan({type:`mcp`,operationId:`${t.connectionName}:${t.method}`,name:t.method===`tools/call`?`tools/call ${t.toolName??`unknown`}`:t.method,kind:`CLIENT`,parent:trace.getSpan(t.executionContext)?.spanContext(),attributes:{"agent.connection.name":t.connectionName,"mcp.method.name":t.method,"network.protocol.name":`http`,"network.transport":`tcp`,"mcp.protocol.version":t.protocolVersion,"gen_ai.operation.name":t.method===`tools/call`?`execute_tool`:void 0,"gen_ai.tool.name":t.toolName}},{context:t.executionContext}),r=mcpLifecycle({serializer:MCP_SERIALIZER,...t.capture,write(e){for(let[t,r]of Object.entries(e))r!==void 0&&n.setAttribute(t,r)},error:n.fail});return{...r,end:n.end,run(i){return e.run({type:`mcp`,reference:n.reference,capture:t.capture,mcp:r},i,t.executionContext)}}}return{async list(e){let t=context.active(),n=start({method:`tools/list`,connectionName:e.connectionName,protocolVersion:e.protocolVersion,executionContext:t,capture:activeTraceOperation()?.capture??{emit:!0,recordInputs:!1,recordOutputs:!1}});try{return await n.run(async()=>{try{return await e.execute()}catch(e){let t=jsonRpcErrorCode(e);throw t!==void 0&&n.update({statusCode:t}),n.error(e,errorType(e,t)),e}})}finally{n.end()}},async call(e){let t=context.active(),n=activeTraceOperation();if(n?.type===`tool`&&n.mcp!==void 0)return n.mcp.update({...e,method:`tools/call`}),await runMcpToolCall(e,void 0);let r=start({method:`tools/call`,connectionName:e.connectionName,toolName:truncateTelemetryText(e.toolName,128),protocolVersion:e.protocolVersion,executionContext:t,capture:n?.capture??{emit:!0,recordInputs:!1,recordOutputs:!1}});try{return await r.run(()=>runMcpToolCall(e,r))}finally{r.end()}}}}function runMcpToolCall(e,t){return t!==void 0&&t.arguments(e.arguments),e.execute().then(e=>(isToolErrorResult(e)&&activeTraceOperation()?.mcp?.error(void 0,`tool_error`),t!==void 0&&t.result(e),e)).catch(e=>{let n=jsonRpcErrorCode(e);throw n!==void 0&&activeTraceOperation()?.mcp?.update({statusCode:n}),t!==void 0&&activeTraceOperation()?.mcp?.error(e,errorType(e,n)),e})}function mcpRequestMetadata(e){let t=e.method??e.message?.method,n=e.params??(isObject(e.message?.params)?e.message.params:{}),r=e.toolName??(typeof n.name==`string`?n.name:void 0),i=e.message?.id,a=n._meta,o=e.protocolVersion??(isObject(a)&&typeof a[`io.modelcontextprotocol/protocolVersion`]==`string`?a[`io.modelcontextprotocol/protocolVersion`]:void 0);return{connectionName:e.connectionName,method:t??`unknown`,toolName:r,protocolVersion:o,requestId:typeof i==`number`||typeof i==`string`?String(i):void 0}}function injectOpenTelemetryTraceContext(e,t){propagation.inject(e,t,traceContextSetter)}function readJsonRpcRequest(e){if(typeof e==`string`&&withinTraceRequestLimit(e))try{let t=JSON.parse(e);return isObject(t)&&typeof t.method==`string`?t:void 0}catch{return}}function withinTraceRequestLimit(e){return e.length<=MAX_MCP_TRACE_REQUEST_BYTES&&utf8Encoder.encode(e).byteLength<=MAX_MCP_TRACE_REQUEST_BYTES}function withinTraceContextLimit(e){let t=0;for(let[n,r]of Object.entries(e))if(n.length+r.length>MAX_MCP_TRACE_CONTEXT_BYTES||(t+=utf8Encoder.encode(n).byteLength+utf8Encoder.encode(r).byteLength+2,t>MAX_MCP_TRACE_CONTEXT_BYTES))return!1;return t>0}function headerValue(e,t){if(e!==void 0)try{return new Headers(e).get(t)??void 0}catch{return}}function isToolErrorResult(e){return isObject(e)&&e.isError===!0}function jsonRpcErrorCode(e){if(!isObject(e))return;let t=e.code;return typeof t==`number`||typeof t==`string`?String(t):void 0}function errorType(e,t){return t===void 0?e instanceof Error?e.name||`Error`:void 0:t}export{MCP_SERIALIZER,createMcpTraceFetch,createMcpTracing};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AgentSessionTraceState, AgentTurnTraceState } from "#tracing/eve/agent-trace-state.js";
|
|
2
|
+
import type { TurnInput } from "#compiled/@eve/tracing/index.js";
|
|
3
|
+
export declare function eveActivationMetadata(input: {
|
|
4
|
+
readonly session?: AgentSessionTraceState;
|
|
5
|
+
readonly turn: AgentTurnTraceState;
|
|
6
|
+
readonly sessionId: string;
|
|
7
|
+
}): Pick<TurnInput, "sequence" | "lineage" | "channel" | "attributes">;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{normalizeInstrumentationChannelKind}from"#internal/instrumentation.js";import{checkpointContent}from"#tracing/eve/operation-input.js";function eveActivationMetadata(e){let{session:t,turn:n,sessionId:r}=e,i=n.parentLineage??t?.parentLineage,a=i===void 0||n.traceSessionId===r,o=n.channelDelivery,s=o?.channelKind??(a?t?.channelKind??(t?.channelType===void 0?void 0:normalizeInstrumentationChannelKind(t.channelType)):void 0);return{sequence:n.sequence,lineage:i===void 0?void 0:{agentName:n.subagentName,parentCallId:i.callId,parentRunId:i.sessionId},channel:{kind:s,origin:!a||s===void 0?void 0:t?.scheduleId===void 0?`channel`:`schedule`},attributes:{"agent.channel.audience":t?.channelAudience,"agent.session.title":a&&t?.decision?.action===`record`&&t.decision.recordInputs?t.title:void 0,"agent.schedule.id":i===void 0?t?.scheduleId:void 0,"agent.principal.current.type":n.currentPrincipal?.type,"agent.principal.current.id":n.currentPrincipal&&`id`in n.currentPrincipal?n.currentPrincipal.id:void 0,"agent.principal.initiator.type":n.initiatorPrincipal?.type,"agent.principal.initiator.id":n.initiatorPrincipal&&`id`in n.initiatorPrincipal?n.initiatorPrincipal.id:void 0,"agent.channel.name":o?.channelName,"agent.channel.delivery.id":o?.deliveryId,"agent.channel.request.id":o?.requestId,"agent.channel.delivery.input":o?.inputAttribute===void 0?void 0:JSON.stringify(checkpointContent(o.inputAttribute))}}}export{eveActivationMetadata};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { SpanContext } from "#compiled/@opentelemetry/api/index.js";
|
|
2
|
+
import type { AgentTraceStateStore } from "#tracing/eve/agent-trace-state.js";
|
|
3
|
+
import { type AgentTelemetry, type AgentTracing } from "#compiled/@eve/tracing/index.js";
|
|
4
|
+
export declare function traceSessionIdOf(scope: {
|
|
5
|
+
readonly traceSessionId?: string;
|
|
6
|
+
readonly rootSessionId?: string;
|
|
7
|
+
readonly sessionId: string;
|
|
8
|
+
}): string;
|
|
9
|
+
export declare function checkpointContent(value: string | undefined): unknown;
|
|
10
|
+
/** Identity of one eve turn within the shared tracing library. */
|
|
11
|
+
export declare function eveTurnIdentity(input: {
|
|
12
|
+
readonly sessionId: string;
|
|
13
|
+
readonly rootSessionId?: string;
|
|
14
|
+
readonly turnId: string;
|
|
15
|
+
}): {
|
|
16
|
+
conversationId: string;
|
|
17
|
+
runId: string;
|
|
18
|
+
turnId: string;
|
|
19
|
+
};
|
|
20
|
+
/** Content flags are recorded by eve's content processor, not withheld by the library. */
|
|
21
|
+
export declare function eveCapture(reference: SpanContext | undefined): {
|
|
22
|
+
emit: boolean;
|
|
23
|
+
recordInputs: boolean;
|
|
24
|
+
recordOutputs: boolean;
|
|
25
|
+
};
|
|
26
|
+
/** eve's agent tracing, checkpointed in its workflow-context trace state. */
|
|
27
|
+
export declare function createEveTracing(input: {
|
|
28
|
+
readonly telemetry: AgentTelemetry;
|
|
29
|
+
readonly stateStore: AgentTraceStateStore;
|
|
30
|
+
}): AgentTracing;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{resolveConversationId}from"#shared/conversation-identity.js";import{createAgentTracing}from"#compiled/@eve/tracing/index.js";function traceSessionIdOf(e){return e.traceSessionId??e.rootSessionId??e.sessionId}function checkpointContent(e){if(e!==void 0)try{return JSON.parse(e)}catch{return}}function eveTurnIdentity(e){return{conversationId:resolveConversationId(e.rootSessionId??e.sessionId),runId:e.sessionId,turnId:e.turnId}}function eveCapture(e){return{emit:!!((e?.traceFlags??1)&1),recordInputs:!0,recordOutputs:!0}}function createEveTracing(e){return createAgentTracing({telemetry:e.telemetry,checkpointer:{get:t=>e.stateStore.get(`checkpoint`,t),set:(t,n)=>e.stateStore.set(`checkpoint`,t,n),delete:t=>e.stateStore.delete(`checkpoint`,t)}})}export{checkpointContent,createEveTracing,eveCapture,eveTurnIdentity,traceSessionIdOf};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export interface SpanProcessor {
|
|
2
|
+
forceFlush(): Promise<void>;
|
|
3
|
+
onEnd(span: unknown): void;
|
|
4
|
+
onStart(span: unknown, parentContext: unknown): void;
|
|
5
|
+
shutdown(): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export type SpanProcessorOrName = SpanProcessor | "auto";
|
|
8
|
+
export interface IdGenerator {
|
|
9
|
+
generateSpanId(): string;
|
|
10
|
+
generateTraceId(): string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A `SpanExporter`. Structural for the same reason the propagator is: the
|
|
14
|
+
* instance comes from whichever `@opentelemetry/*` build the app installed, and
|
|
15
|
+
* the host only ever hands it spans and waits for the callback.
|
|
16
|
+
*
|
|
17
|
+
* `code` is `ExportResultCode`: `0` succeeded, `1` failed.
|
|
18
|
+
*/
|
|
19
|
+
export interface SpanExporter {
|
|
20
|
+
export(spans: readonly unknown[], resultCallback: (result: {
|
|
21
|
+
code: number;
|
|
22
|
+
error?: Error;
|
|
23
|
+
}) => void): void;
|
|
24
|
+
forceFlush?(): Promise<void>;
|
|
25
|
+
shutdown(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* A `TextMapPropagator`, or one of the names `@vercel/otel` resolves for you.
|
|
29
|
+
* Structural rather than imported: the instance comes from whichever
|
|
30
|
+
* `@opentelemetry/*` build the app installed, not from the host's.
|
|
31
|
+
*/
|
|
32
|
+
export type PropagatorOrName = {
|
|
33
|
+
inject(...args: never[]): void;
|
|
34
|
+
extract(...args: never[]): unknown;
|
|
35
|
+
fields(): string[];
|
|
36
|
+
} | "auto" | "none" | "tracecontext" | "baggage";
|
|
37
|
+
/** A `Sampler`, or one of the names `@vercel/otel` resolves for you. */
|
|
38
|
+
export type SamplerOrName = {
|
|
39
|
+
shouldSample(...args: never[]): unknown;
|
|
40
|
+
toString(): string;
|
|
41
|
+
} | "auto" | "always_off" | "always_on" | "parentbased_always_off" | "parentbased_always_on" | "parentbased_traceidratio" | "traceidratio";
|
|
42
|
+
/**
|
|
43
|
+
* A `MetricReader`. Structural for the same reason the exporter is: the
|
|
44
|
+
* instance comes from whichever `@opentelemetry/sdk-metrics` build the app
|
|
45
|
+
* installed, and the host only ever hands it to `registerOTel`.
|
|
46
|
+
*/
|
|
47
|
+
export interface MetricReader {
|
|
48
|
+
forceFlush(): Promise<void>;
|
|
49
|
+
shutdown(): Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
export interface Configuration {
|
|
52
|
+
readonly attributes?: Readonly<Record<string, unknown>>;
|
|
53
|
+
readonly autoDetectResources?: boolean;
|
|
54
|
+
readonly idGenerator?: IdGenerator;
|
|
55
|
+
readonly instrumentations?: readonly unknown[];
|
|
56
|
+
readonly metricReaders?: readonly MetricReader[];
|
|
57
|
+
readonly propagators?: readonly PropagatorOrName[];
|
|
58
|
+
readonly serviceName?: string;
|
|
59
|
+
readonly spanProcessors?: readonly SpanProcessorOrName[];
|
|
60
|
+
readonly traceSampler?: SamplerOrName;
|
|
61
|
+
}
|
|
62
|
+
/** Resolved process-wide settings. Hosts discover and merge their own declarations. */
|
|
63
|
+
export interface OtelConfiguration {
|
|
64
|
+
readonly instrumentations?: readonly unknown[];
|
|
65
|
+
readonly metricReaders?: readonly MetricReader[];
|
|
66
|
+
readonly propagators?: readonly PropagatorOrName[];
|
|
67
|
+
readonly resource?: Readonly<Record<string, unknown>>;
|
|
68
|
+
readonly sampler?: SamplerOrName;
|
|
69
|
+
readonly spanProcessors: readonly SpanProcessorOrName[];
|
|
70
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{};
|
|
@@ -2,10 +2,11 @@ import type { MetricReader, PropagatorOrName, SamplerOrName, SpanExporter, SpanP
|
|
|
2
2
|
import { type InstrumentationProvider } from "#public/instrumentation/provider.js";
|
|
3
3
|
import type { InstrumentationRuntimeContextInput } from "#public/instrumentation/index.js";
|
|
4
4
|
import type { JsonObject } from "#shared/json.js";
|
|
5
|
+
import type { OtelConfiguration } from "#tracing/eve/otel-configuration.js";
|
|
5
6
|
import type { TraceCapturePolicy } from "#shared/trace-policy.js";
|
|
6
7
|
export type { TraceCaptureContext, TraceCapturePolicy, TracePolicyDecision, } from "#shared/trace-policy.js";
|
|
7
|
-
import type { SpanExportPolicy } from "#tracing/span-export-policy.js";
|
|
8
|
-
export type { SpanAttributeDecision, SpanExportAttributeValue, SpanExportContext, SpanExportDecision, SpanExportPolicy, } from "#tracing/span-export-policy.js";
|
|
8
|
+
import type { SpanExportPolicy } from "#tracing/eve/span-export-policy.js";
|
|
9
|
+
export type { SpanAttributeDecision, SpanExportAttributeValue, SpanExportContext, SpanExportDecision, SpanExportPolicy, } from "#tracing/eve/span-export-policy.js";
|
|
9
10
|
/**
|
|
10
11
|
* The process-wide OpenTelemetry settings, declared by `otel()`.
|
|
11
12
|
*
|
|
@@ -139,14 +140,6 @@ export declare function agentRunsIntegration(options?: ManagedTraceOptions): Ote
|
|
|
139
140
|
export declare function isOtelDeclaration(value: unknown): value is OtelDeclaration;
|
|
140
141
|
export declare function isOtelIntegration(value: unknown): value is OtelIntegration;
|
|
141
142
|
/** The one pipeline a process can register. @internal */
|
|
142
|
-
export interface OtelPipeline {
|
|
143
|
-
readonly instrumentations?: readonly unknown[];
|
|
144
|
-
readonly metricReaders?: readonly MetricReader[];
|
|
145
|
-
readonly propagators?: readonly PropagatorOrName[];
|
|
146
|
-
readonly resource?: Readonly<Record<string, unknown>>;
|
|
147
|
-
readonly sampler?: SamplerOrName;
|
|
148
|
-
readonly spanProcessors: readonly SpanProcessorOrName[];
|
|
149
|
-
}
|
|
150
143
|
/** What the harness reads at turn time, as opposed to at registration. @internal */
|
|
151
144
|
export interface OtelHarnessSettings {
|
|
152
145
|
readonly functionId?: string;
|
|
@@ -166,7 +159,7 @@ export interface CollectedOtel {
|
|
|
166
159
|
* global tracer provider slot alone rather than register an empty pipeline.
|
|
167
160
|
*/
|
|
168
161
|
readonly declared: boolean;
|
|
169
|
-
readonly
|
|
162
|
+
readonly configuration: OtelConfiguration;
|
|
170
163
|
readonly runtimeContextResolvers: readonly RuntimeContextResolver[];
|
|
171
164
|
readonly settings: OtelHarnessSettings;
|
|
172
165
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createLogger,formatError}from"#internal/logging.js";import{PROVIDER}from"#public/instrumentation/provider.js";import{batchSpanProcessor}from"#tracing/eve/batch-span-processor.js";import{contentFilteringProcessor}from"#tracing/eve/content-span-processor.js";import{vercelRuntimeSpanProcessor}from"#tracing/eve/vercel-runtime-span-exporter.js";const log=createLogger(`tracing.export`),OTEL_DECLARATION=Symbol.for(`eve.instrumentation.otel`),OTEL_INTEGRATION=Symbol.for(`eve.instrumentation.otel-integration`);function otel(e={}){return{[OTEL_DECLARATION]:!0,[PROVIDER]:!0,options:e}}function otelIntegration(e={}){return createOtelIntegration(e)}function managedOtelIntegration(e={}){return createOtelIntegration(e)}function createOtelIntegration(e){assertNoRemovedContentOptions(e);let t=e.spanProcessors??[],n=e.traceExporter===void 0?t:[...t,batchSpanProcessor(e.traceExporter,{diagnostic:(e,t)=>log.warn(e,{...t,error:t.error===void 0?void 0:formatError(t.error)})})];return{[OTEL_INTEGRATION]:!0,[PROVIDER]:!0,metricReaders:e.metricReaders??[],runtimeContext:e.runtimeContext,spanProcessors:n.map(t=>contentFilteringProcessor(t,e.exportPolicy))}}function agentRunsIntegration(e={}){return assertNoRemovedContentOptions(e),{[OTEL_INTEGRATION]:!0,[PROVIDER]:!0,metricReaders:[],spanProcessors:[contentFilteringProcessor(vercelRuntimeSpanProcessor(),e.exportPolicy)]}}function assertNoRemovedContentOptions(e){if(Object.hasOwn(e,`recordInputs`)||Object.hasOwn(e,`recordOutputs`))throw Error("OpenTelemetry destination options no longer support `recordInputs` or `recordOutputs`. Use an `exportPolicy` span decision with `{ redact: true, inputs: true }`, `{ redact: true, outputs: true }`, or both.")}function isOtelDeclaration(e){return typeof e==`object`&&!!e&&e[OTEL_DECLARATION]===!0}function isOtelIntegration(e){return typeof e==`object`&&!!e&&e[OTEL_INTEGRATION]===!0}function collectOtelPipeline(e){let t=[],n=[],r=[],i,a=!1,o=!1;for(let s of e){if(isOtelIntegration(s)){a=!0,o=!0,t.push(...s.spanProcessors),n.push(...s.metricReaders),s.runtimeContext!==void 0&&r.push(s.runtimeContext);continue}if(isOtelDeclaration(s)){if(i!==void 0)throw Error("Instrumentation declares `otel()` more than once. One process has one OpenTelemetry tracer provider, so it has one resource, one sampler, and one propagator set — declare them in a single `otel()`.");a=!0,i=s}}let s=i?.options??{},c={functionId:s.functionId,recordInputs:o,recordOutputs:o,traceChannelRequests:s.traceChannelRequests===!0};return s.tracePolicy!==void 0&&Object.assign(c,{tracePolicy:s.tracePolicy}),{declared:a,configuration:{instrumentations:s.instrumentations,metricReaders:n.length>0?n:void 0,propagators:s.propagators,resource:s.resource,sampler:s.sampler,spanProcessors:t},runtimeContextResolvers:r,settings:c}}export{agentRunsIntegration,collectOtelPipeline,isOtelDeclaration,isOtelIntegration,managedOtelIntegration,otel,otelIntegration};
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
1
|
+
import { type TracerProvider } from "#compiled/@opentelemetry/api/index.js";
|
|
2
|
+
import { AgentSpanIdGenerator } from "#compiled/@eve/tracing/index.js";
|
|
3
|
+
import type { OtelConfiguration } from "./otel-configuration.js";
|
|
4
|
+
import { type Attributes } from "#compiled/@eve/tracing/index.js";
|
|
5
|
+
export type SamplingOperation = {
|
|
6
|
+
readonly name: string;
|
|
7
|
+
readonly attributes?: Attributes;
|
|
8
|
+
};
|
|
4
9
|
/**
|
|
5
10
|
* Builds the process's one OpenTelemetry tracer provider from a merged
|
|
6
11
|
* declaration, then proves it took the global slot.
|
|
@@ -11,14 +16,16 @@ import { type AgentSamplingOperation } from "#tracing/agent-span-contract.js";
|
|
|
11
16
|
* propagator, then verifies both through the global APIs.
|
|
12
17
|
*/
|
|
13
18
|
export declare function registerOtelPipeline(input: {
|
|
14
|
-
readonly
|
|
19
|
+
readonly otel: OtelConfiguration;
|
|
15
20
|
readonly serviceName: string;
|
|
16
21
|
}): RegisteredOtelPipeline;
|
|
17
22
|
/** Lifecycle retained from the providers that own every destination. */
|
|
18
23
|
export interface RegisteredOtelPipeline {
|
|
24
|
+
readonly provider: TracerProvider;
|
|
19
25
|
readonly forceFlush: () => Promise<void>;
|
|
20
26
|
readonly idGenerator: AgentSpanIdGenerator;
|
|
21
27
|
/** Whether the installed sampler would record a trace with this id. */
|
|
22
|
-
readonly samplesTrace: (traceId: string, operation?:
|
|
28
|
+
readonly samplesTrace: (traceId: string, operation?: SamplingOperation) => boolean;
|
|
23
29
|
readonly shutdown: () => Promise<void>;
|
|
24
30
|
}
|
|
31
|
+
export declare const registerOtel: typeof registerOtelPipeline;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createRequire}from"node:module";import{conversationIdFromContext}from"#tracing/eve/conversation-context.js";import{SpanKind,context,metrics,propagation,trace}from"#compiled/@opentelemetry/api/index.js";import{invocationName}from"#compiled/@eve/tracing/otel.js";import{AgentSpanIdGenerator}from"#compiled/@eve/tracing/index.js";import{registerOTel}from"#compiled/@vercel/otel/index.js";const REGISTRATION_SPAN_NAME=`eve.otel.registration`,REPLAY_DEDUPLICATION_LIMIT=1e5,REPLAY_DEDUPLICATION_KEY=Symbol.for(`eve.otel.replay-deduplication`),require=createRequire(import.meta.url),replayDeduplicationGlobal=globalThis;var RegistrationMarkerPropagator=class{#e=!1;extract(e){return e}fields(){return[]}inject(){this.#e=!0}isInstalled(){return this.#e=!1,propagation.inject(context.active(),{},{set:()=>{}}),this.#e}},PrivateSpanFilteringProcessor=class{endedSpans;forwardedSpans=new Set;pendingByParent=new Map;pendingSpanCount=0;processors;startedSpans=new Set;constructor(e,t){this.processors=e,this.endedSpans=t}async forceFlush(){this.drainPendingSpans(),await Promise.all(this.processors.map(e=>e.forceFlush()))}onEnd(e){if(isRegistrationSpan(e))return;let t=spanIdentity(e);if(t!==void 0){if(this.endedSpans.has(t))return;if(this.endedSpans.size>=REPLAY_DEDUPLICATION_LIMIT){let e=this.endedSpans.values().next().value;e!==void 0&&this.endedSpans.delete(e)}this.endedSpans.add(t)}let n=parentIdentity(e);if(n!==void 0&&this.startedSpans.has(n)&&!this.forwardedSpans.has(n)){let t=this.pendingByParent.get(n)??[];t.push(e),this.pendingByParent.set(n,t),this.pendingSpanCount+=1,this.pendingSpanCount>1e4&&this.releaseOldestPendingParent();return}this.forward(e,t)}onStart(e,t){if(isRegistrationSpan(e))return;let n=conversationIdFromContext(t);n!==void 0&&e.attributes?.[`gen_ai.conversation.id`]===void 0&&e.setAttribute(`gen_ai.conversation.id`,n);let r=spanIdentity(e);r!==void 0&&addBounded(this.startedSpans,r);for(let n of this.processors)n.onStart(e,t)}async shutdown(){this.drainPendingSpans(),await Promise.all(this.processors.map(e=>e.shutdown()))}drainPendingSpans(){for(;this.pendingByParent.size>0;)this.releaseOldestPendingParent()}releaseOldestPendingParent(){let e=this.pendingByParent.keys().next().value;e!==void 0&&this.releaseChildren(e)}releaseChildren(e){let t=this.pendingByParent.get(e);if(t!==void 0){this.pendingByParent.delete(e),this.pendingSpanCount-=t.length;for(let e of t)this.forward(e,spanIdentity(e))}}forward(e,t){for(let t of this.processors)t.onEnd(e);t!==void 0&&(addBounded(this.forwardedSpans,t),this.releaseChildren(t))}};function registerOtelPipeline(e){let t=e.otel,n=captureOptionalPeerTracerProxy(),r=new AgentSpanIdGenerator,i=new RegistrationMarkerPropagator,a=privateSpanProcessors(t.spanProcessors),o={attributes:t.resource,autoDetectResources:!1,idGenerator:r,instrumentations:t.instrumentations??[],metricReaders:t.metricReaders,propagators:[...t.propagators??[`auto`],i],serviceName:e.serviceName,spanProcessors:a};registerOTel(t.sampler===void 0?o:{...o,traceSampler:t.sampler});let s=globalTracerUses(r),c=i.isInstalled();if((!s||!c)&&rollbackRegistration({ownsPropagator:c,ownsTracer:s}),!s)throw Error("eve could not register OpenTelemetry because another runtime already owns the global tracer provider. Remove the other `registerOTel` call, or move its exporters into eve's `otelIntegration({ spanProcessors: [...] })`.");if(!c)throw Error("eve could not register OpenTelemetry because another runtime already owns the global propagator. Remove the other global propagator registration and declare propagators through eve's `otel()` instead.");let l=runtimeTracerProvider();if(typeof l.forceFlush!=`function`||typeof l.shutdown!=`function`)throw rollbackRegistration({ownsPropagator:c,ownsTracer:s}),Error(`The registered OpenTelemetry tracer provider has no lifecycle methods.`);n?.setDelegate(l);let u=runtimeMeterProvider();return{provider:trace.getTracerProvider(),forceFlush:async()=>{await Promise.all([l.forceFlush(),u.forceFlush?.()])},idGenerator:r,samplesTrace:(e,t)=>samplerAdmitsTrace(r,e,t),shutdown:async()=>{disableInstrumentations(t.instrumentations),await Promise.all([l.shutdown(),u.shutdown?.()])}}}function privateSpanProcessors(e){let t=e.filter(isSpanProcessor);if(t.length===0)return[...e];let n=new PrivateSpanFilteringProcessor(t,replayDeduplicationRegistry()),r=[],i=!1;for(let t of e){if(!isSpanProcessor(t)){r.push(t);continue}i||(i=!0,r.push(n))}return r}function replayDeduplicationRegistry(){let e=replayDeduplicationGlobal[REPLAY_DEDUPLICATION_KEY];if(e!==void 0)return e;let t=new Set;return replayDeduplicationGlobal[REPLAY_DEDUPLICATION_KEY]=t,t}const registerOtel=registerOtelPipeline;function samplerAdmitsTrace(e,t,n={name:invocationName(void 0)}){return(e.withTraceId(t,()=>trace.getTracer(`eve.registration`).startSpan(n.name,{attributes:n.attributes,kind:SpanKind.INTERNAL,root:!0})).spanContext().traceFlags&1)==1}function rollbackRegistration(e){if(e.ownsPropagator&&propagation.disable(),!e.ownsTracer)return;let t=runtimeTracerProvider();if(typeof t.shutdown==`function`)try{t.shutdown().catch(()=>{})}catch{}trace.disable()}function runtimeTracerProvider(){let e=trace.getTracerProvider();return e.getDelegate?.()??e}function runtimeMeterProvider(){let e=metrics.getMeterProvider();return{forceFlush:typeof e?.forceFlush==`function`?()=>e.forceFlush():void 0,shutdown:typeof e?.shutdown==`function`?()=>e.shutdown():void 0}}function disableInstrumentations(e){for(let t of e??[]){let e=t?.disable;if(typeof e==`function`)try{e.call(t)}catch{}}}function globalTracerUses(e){let t=e.allocateSpanId();return e.withSpanId(t,()=>trace.getTracer(`eve.registration`).startSpan(REGISTRATION_SPAN_NAME)).spanContext().spanId===t}function isRegistrationSpan(e){return typeof e==`object`&&!!e&&(`name`in e&&e.name===REGISTRATION_SPAN_NAME||`instrumentationScope`in e&&e.instrumentationScope?.name===`eve.registration`)}function spanIdentity(e){if(typeof e!=`object`||!e||!(`spanContext`in e)||typeof e.spanContext!=`function`)return;let t=e.spanContext();return typeof t.traceId==`string`&&typeof t.spanId==`string`?`${t.traceId}:${t.spanId}`:void 0}function parentIdentity(e){if(typeof e!=`object`||!e||!(`parentSpanContext`in e))return;let t=e.parentSpanContext;return typeof t?.traceId==`string`&&typeof t.spanId==`string`?`${t.traceId}:${t.spanId}`:void 0}function addBounded(e,t){if(e.size>=REPLAY_DEDUPLICATION_LIMIT){let t=e.values().next().value;t!==void 0&&e.delete(t)}e.add(t)}function isSpanProcessor(e){return e!==`auto`}function captureOptionalPeerTracerProxy(){try{let e=require("@opentelemetry/api"),t=e.trace.getTracerProvider();return t instanceof e.ProxyTracerProvider?t:void 0}catch{return}}export{registerOtel,registerOtelPipeline};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { InstrumentationEvent, InstrumentationAttemptScope } from "#instrumentation/lifecycle.js";
|
|
2
|
+
import type { AgentTraceStateStore } from "#tracing/eve/agent-trace-state.js";
|
|
3
|
+
import type { ConversationEnvironment } from "#shared/conversation-context.js";
|
|
4
|
+
export declare function createEveCapturePolicy(input: {
|
|
5
|
+
readonly stateStore: AgentTraceStateStore;
|
|
6
|
+
readonly environment: ConversationEnvironment;
|
|
7
|
+
readonly recordInputs: boolean;
|
|
8
|
+
readonly recordOutputs: boolean;
|
|
9
|
+
}): {
|
|
10
|
+
projectEvent(event: InstrumentationEvent): Promise<InstrumentationEvent>;
|
|
11
|
+
forOperation(scope: InstrumentationAttemptScope): Promise<{
|
|
12
|
+
recordInputs: boolean;
|
|
13
|
+
recordOutputs: boolean;
|
|
14
|
+
}>;
|
|
15
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{normalizeChannelAudience}from"#shared/channel-audience.js";import{applyLiveDeliveryAudienceCeiling,resolveForwardedTraceSeed}from"#shared/forwarded-trace-policy.js";import{contextStorage}from"#context/container.js";import{SessionTraceSeedKey}from"#context/keys.js";import{isSampledTrace,resolveTracePolicyDecision}from"#shared/trace-policy.js";import{withoutInstrumentationContent}from"#instrumentation/content.js";import{readInstrumentationDecision}from"#shared/instrumentation-decision.js";import{instrumentationEventForTraceDecision}from"#instrumentation/content-policy.js";function createEveCapturePolicy(e){return{async projectEvent(t){let n=await e.stateStore.get(`session`,`scope`in t?t.scope.sessionId:t.sessionId),r=audienceForEvent(t,n?.channelAudience),i=`traceSeed`in t?t.traceSeed:void 0,a=contextStorage.getStore()?.get(SessionTraceSeedKey),o=resolveForwardedTraceSeed(a),s=resolveForwardedTraceSeed(i,o?.forwardedTracePolicy),decisionForTrace=t=>t===void 0?void 0:resolveTracePolicyDecision(isSampledTrace(t),{audience:r,environment:e.environment}),c=s?.decision??o?.decision??readInstrumentationDecision(n?.decision)??decisionForTrace(i)??decisionForTrace(a)??decisionForTrace(n?.context);if(c===void 0)return withoutInstrumentationContent(t);let l=s===void 0||!(`traceSeed`in t)||t.traceSeed===void 0?t:{...t,traceSeed:{...t.traceSeed,decision:s.decision,traceFlags:s.traceFlags}};return instrumentationEventForTraceDecision(l,applyLiveDeliveryAudienceCeiling(c.action===`drop`?c:{action:`record`,recordInputs:e.recordInputs&&c.recordInputs,recordOutputs:e.recordOutputs&&c.recordOutputs},r,s?.forwardedTracePolicy??o?.forwardedTracePolicy,e.environment),{audience:r,environment:e.environment},{applyAudienceCeiling:!1})},async forOperation(t){let n=await e.stateStore.get(`session`,t.sessionId),r=resolveForwardedTraceSeed(contextStorage.getStore()?.get(SessionTraceSeedKey)),i=r?.decision??n?.decision,a=i===void 0?void 0:applyLiveDeliveryAudienceCeiling(i,normalizeChannelAudience(t.channelAudience),r?.forwardedTracePolicy,e.environment);return{recordInputs:e.recordInputs&&a?.action===`record`&&a.recordInputs,recordOutputs:e.recordOutputs&&a?.action===`record`&&a.recordOutputs}}}}function audienceForEvent(e,t){return`delivery`in e?normalizeChannelAudience(e.delivery.channelAudience):`scope`in e&&e.scope.channelAudience!==void 0?normalizeChannelAudience(e.scope.channelAudience):e.type===`session.started`?normalizeChannelAudience(e.channelAudience):normalizeChannelAudience(t)}export{createEveCapturePolicy};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { MappingContext, OutputMapping } from "#compiled/@eve/tracing/index.js";
|
|
2
|
+
export declare function eveOutputMapping(options?: {
|
|
3
|
+
readonly resolve: (span: MappingContext) => {
|
|
4
|
+
readonly traceSessionId?: string;
|
|
5
|
+
readonly platform: "vercel" | "other";
|
|
6
|
+
};
|
|
7
|
+
}): OutputMapping;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{currentTraceSessionId}from"#tracing/eve/agent-trace-context-store.js";function eveOutputMapping(e){return{attributes(t,n){let r={};for(let[e,i]of Object.entries(n))e===`agent.connection.name`?r[`eve.connection.name`]=i:t.type===`channelRequest`&&e===`agent.channel.name`?r[`eve.channel.name`]=i:t.type===`channelRequest`&&e===`agent.channel.kind`?r[`eve.channel.kind`]=i:r[e]=i;if(n[`agent.run.id`]!==void 0){let i=e?.resolve(t)??{platform:process.env.VERCEL_ENV===void 0?`other`:`vercel`,traceSessionId:typeof n[`agent.run.id`]==`string`?currentTraceSessionId(n[`agent.run.id`]):void 0};i?.platform===`vercel`&&i.traceSessionId!==void 0&&(r[`vercel.session_id`]=i.traceSessionId)}return r},link:(e,t)=>({"eve.link.type":t.relationship===`execution.delivery`?`workflow.delivery`:t.relationship})}}export{eveOutputMapping};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type InstrumentationSessionStartedEvent, type InstrumentationTraceSeed, type InstrumentationTurnStartedEvent, type InstrumentationTurnTerminalEvent, type InstrumentationSessionTransitionEvent } from "#instrumentation/lifecycle.js";
|
|
2
|
+
import type { TraceCapturePolicy } from "#tracing/eve/otel-declaration.js";
|
|
3
|
+
import type { AgentSessionTraceState, AgentTraceStateStore } from "#tracing/eve/agent-trace-state.js";
|
|
4
|
+
import type { ConversationEnvironment } from "#shared/conversation-context.js";
|
|
5
|
+
import type { AgentSpanIdGenerator, AgentTracing, ExecutionContext, TurnOperation } from "#compiled/@eve/tracing/index.js";
|
|
6
|
+
interface EveSessionTracingInput {
|
|
7
|
+
readonly tracing: AgentTracing;
|
|
8
|
+
readonly idGenerator: AgentSpanIdGenerator;
|
|
9
|
+
readonly environment: ConversationEnvironment;
|
|
10
|
+
readonly frameworkVersion: string;
|
|
11
|
+
readonly stateStore: AgentTraceStateStore;
|
|
12
|
+
readonly tracePolicy?: TraceCapturePolicy;
|
|
13
|
+
}
|
|
14
|
+
type SessionMetadata = Omit<InstrumentationSessionStartedEvent, "idempotencyKey" | "type">;
|
|
15
|
+
interface EveSessionTracing {
|
|
16
|
+
readonly ensureSessionContext: (event: SessionMetadata) => Promise<AgentSessionTraceState>;
|
|
17
|
+
readonly prepareSessionTrace: (event: InstrumentationSessionStartedEvent) => Promise<InstrumentationTraceSeed>;
|
|
18
|
+
readonly prepareTurnTrace: (event: InstrumentationTurnStartedEvent) => Promise<InstrumentationTraceSeed>;
|
|
19
|
+
/** Hydrates a turn this process or an earlier one started. */
|
|
20
|
+
turnFor(sessionId: string, turnId: string, context?: ExecutionContext): Promise<TurnOperation | undefined>;
|
|
21
|
+
/** Whether the trace policy dropped this turn, so its work must not record spans. */
|
|
22
|
+
dropped(sessionId: string, turnId: string): Promise<boolean>;
|
|
23
|
+
turnTerminal(event: InstrumentationTurnTerminalEvent): Promise<void>;
|
|
24
|
+
sessionTransition(event: InstrumentationSessionTransitionEvent): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export declare function createEveSessionTracing(input: EveSessionTracingInput): EveSessionTracing;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{normalizeChannelAudience}from"#shared/channel-audience.js";import{normalizeInstrumentationChannelKind}from"#internal/instrumentation.js";import{withOperationConversation}from"#tracing/eve/conversation-context.js";import{isSampledTrace,resolveTracePolicy,resolveTracePolicyDecision}from"#shared/trace-policy.js";import{ROOT_CONTEXT}from"#compiled/@opentelemetry/api/index.js";import"#instrumentation/lifecycle.js";import{readInstrumentationDecision}from"#shared/instrumentation-decision.js";import{applyPrincipalTraceDecision}from"#instrumentation/principal-summary.js";import{withChannelAudience}from"#tracing/eve/channel-audience-context.js";import{eveCapture,eveTurnIdentity,traceSessionIdOf}from"#tracing/eve/operation-input.js";import{eveActivationMetadata}from"#tracing/eve/metadata.js";function createEveSessionTracing(e){let ensureSessionContext=async t=>{let n=await e.stateStore.get(`session`,t.sessionId);if(n===void 0){let r=normalizeChannelAudience(t.channelAudience),i=resolveSessionTraceDecision(t,r,e.environment,e.tracePolicy);n={agentName:t.agentName,channelAudience:r,channelKind:t.channelKind,channelType:t.channelType,decision:i,context:initialSessionContext(e,t,i),parentLineage:t.parentLineage,rootSessionId:t.rootSessionId,traceSessionId:traceSessionIdOf(t),scheduleId:t.scheduleId,title:t.title},await e.stateStore.set(`session`,t.sessionId,n)}return n},prepareSessionTrace=async e=>{let t=await ensureSessionContext(e);return portableSpanContext(t.context,t.decision)},turnKey=(e,t)=>JSON.stringify([e,t]);async function turnFor(t,n,r){let i=await e.stateStore.get(`turn`,turnKey(t,n));if(i===void 0||!isSampledTrace(i.context))return;let a=await e.stateStore.get(`session`,t);return e.tracing.resume({identity:eveTurnIdentity({sessionId:t,rootSessionId:i.rootSessionId,turnId:n}),context:r??hostContext(a?.channelAudience,{sessionId:t,...i})})}async function dropped(t,n){let r=await e.stateStore.get(`turn`,turnKey(t,n));return r!==void 0&&!isSampledTrace(r.context)}let prepareTurnTrace=async t=>{let n=await e.stateStore.get(`turn`,turnKey(t.sessionId,t.turnId));if(n!==void 0){let r=await e.stateStore.get(`session`,t.sessionId);return portableSpanContext(n.context,r?.decision)}let r=await ensureSessionContext(t),i=t.sequence===0,a=i?t.parentTraceContext:void 0,o=r.decision?.action===`record`,s=a!==void 0&&!(`isRemote`in a&&a.isRemote===!0),c=i?{...r.context,traceId:s?a.traceId:r.context.traceId,isRemote:!1}:{traceId:e.idGenerator.deriveTraceId(`turn:${t.idempotencyKey}`),spanId:e.idGenerator.deriveSpanId(`turn:${t.idempotencyKey}`),traceFlags:+!!o,isRemote:!1},l=r.agentName??(t.parentLineage??r.parentLineage)?.subagentName,u={agentName:l,caller:a===void 0?void 0:adoptedSpanContext(a),context:c,currentPrincipal:applyPrincipalTraceDecision(t.currentPrincipal,r.decision),initiatorPrincipal:applyPrincipalTraceDecision(t.initiatorPrincipal,r.decision),parentLineage:t.parentLineage??r.parentLineage,rootSessionId:t.rootSessionId,traceSessionId:traceSessionIdOf(t),sequence:t.sequence,startTimeMs:Date.now(),subagentName:(t.parentLineage??r.parentLineage)?.subagentName};if(isSampledTrace(c)){let n=await e.tracing.turn({...eveActivationMetadata({session:r,turn:u,sessionId:t.sessionId}),agentName:l,identity:eveTurnIdentity({...t,sessionId:t.sessionId}),framework:{name:`eve`,version:e.frameworkVersion},capture:eveCapture(c),reference:c,parent:s?adoptedSpanContext(a):void 0,links:activationLinks(u),startTimeMs:u.startTimeMs,context:hostContext(r.channelAudience,t)});u={...u,context:{...c,traceFlags:n.reference.traceFlags}}}return await e.stateStore.set(`turn`,turnKey(t.sessionId,t.turnId),u),portableSpanContext(u.context,r.decision)};async function recordTerminal(t,n,r,i){await e.stateStore.update(`turn`,turnKey(t,n),e=>({...e,terminal:r.outcome===`failed`?{outcome:`failed`,errorName:i instanceof Error?i.name:void 0,errorMessage:i instanceof Error?i.message:void 0}:r}))}return{ensureSessionContext,prepareSessionTrace,prepareTurnTrace,turnFor,dropped,async turnTerminal(e){await recordTerminal(e.sessionId,e.turnId,{outcome:e.type===`turn.failed`?`failed`:e.type===`turn.cancelled`?`cancelled`:`completed`},e.type===`turn.failed`?e.error:void 0)},async sessionTransition(t){if(t.turnId===void 0)return;t.type===`session.failed`&&await recordTerminal(t.sessionId,t.turnId,{outcome:`failed`},t.error);let n=await e.stateStore.get(`turn`,turnKey(t.sessionId,t.turnId));if(n===void 0)return;let r=await e.stateStore.get(`session`,t.sessionId),i=await turnFor(t.sessionId,t.turnId);if(i!==void 0){let e=eveActivationMetadata({session:r,turn:n,sessionId:t.sessionId});i.attributes(e.attributes??{}),i.links(activationLinks(n)??[]);let a=n.terminal;if(a===void 0)await i.complete({outcomeUnknown:!0});else if(a.outcome===`failed`){let e=Error(a.errorMessage);e.name=a.errorName??`Error`,await i.complete({outcome:`failed`,failed:!0,error:e,errorType:a.errorName})}else await i.complete({outcome:a.outcome})}await e.stateStore.delete(`turn`,turnKey(t.sessionId,t.turnId))}}}function hostContext(e,t){return withOperationConversation(withChannelAudience(ROOT_CONTEXT,e),t)}function activationLinks(e){let t=[];return e.caller?.isRemote===!0&&t.push({context:e.caller,relationship:`agent.dispatch`}),e.channelDelivery?.requestTraceContext!==void 0&&t.push({context:e.channelDelivery.requestTraceContext,relationship:`channel.request`}),t.length===0?void 0:t}function portableSpanContext(e,t){return{decision:t,spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}function adoptedSpanContext(e){return{isRemote:`isRemote`in e&&e.isRemote===!0,spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}function initialSessionContext(e,t,n){let r=t.traceSeed;if(r!==void 0)return{...adoptedSpanContext(r),traceFlags:n.action===`drop`?0:r.traceFlags};let i=`session:${t.sessionId}`,a=t.parentTraceContext;return{traceId:a!==void 0&&!(`isRemote`in a&&a.isRemote===!0)?a.traceId:e.idGenerator.deriveTraceId(i),spanId:e.idGenerator.deriveSpanId(i),traceFlags:+(n.action===`record`)}}function resolveSessionTraceDecision(e,t,n,r){let i={audience:t,environment:n};return e.parentTraceContext!==void 0&&!isSampledTrace(e.parentTraceContext)?{action:`drop`}:e.traceSeed?.decision===void 0?e.traceSeed===void 0?e.parentTraceContext===void 0?e.agentName===void 0?r===void 0?resolveTracePolicyDecision(!0,i):{action:`drop`}:resolveTracePolicy(r,{agentName:e.agentName,audience:t,channel:{kind:normalizeInstrumentationChannelKind(e.channelKind??e.channelType)},environment:n,principalType:`unknown`}):resolveTracePolicyDecision(isSampledTrace(e.parentTraceContext),i):resolveTracePolicyDecision(isSampledTrace(e.traceSeed),i):readInstrumentationDecision(e.traceSeed.decision)??{action:`drop`}}export{createEveSessionTracing};
|
package/dist/src/tracing/{vercel-runtime-span-exporter.d.ts → eve/vercel-runtime-span-exporter.d.ts}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SpanExporter, SpanProcessor } from "
|
|
1
|
+
import type { SpanExporter, SpanProcessor } from "./otel-configuration.js";
|
|
2
2
|
/** The request-context transport behind @vercel/otel's automatic processor. */
|
|
3
3
|
export declare function vercelRuntimeSpanExporter(): SpanExporter;
|
|
4
4
|
/** Reports immediately so the span stays attached to its request context. */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{isAgentActivationSpan,isDirectToolCallSpan}from"#tracing/local/inspection.js";var AgentTraceSpanProcessor=class{#e;#t=new Set;#n=new Set;#r=new Set;#i=new Map;#a=new Map;constructor(e){this.#e=e}async forceFlush(){await Promise.all(this.#e.map(e=>e.forceFlush()))}onStart(e,t){if(!isSpanLike(e))return;isDirectToolCallSpan(e)&&this.#o(e);let n=e.attributes[`gen_ai.conversation.id`],r=e.attributes[`agent.run.id`];if(typeof n==`string`){let t=e.spanContext().traceId;this.#t.has(t)||this.#r.has(t)?this.#a.get(t)?.ownerRunId===void 0&&typeof r==`string`&&this.#a.set(t,{conversationId:n,ownerRunId:r}):(this.#t.add(t),this.#a.set(t,{conversationId:n,ownerRunId:typeof r==`string`?r:void 0}))}if(this.#c(e))for(let n of this.#e)n.onStart(e,t)}onEnd(e){if(!isSpanLike(e)||!this.#c(e))return;for(let t of this.#e)t.onEnd(e);let t=e.spanContext().traceId,n=this.#a.get(t);isAgentActivationSpan({name:e.name??``,attributes:e.attributes})&&n?.ownerRunId===e.attributes[`agent.run.id`]&&n?.conversationId===e.attributes[`gen_ai.conversation.id`]&&this.#n.add(t),isDirectToolCallSpan(e)&&this.#s(e)}activeTraceIds(){return this.#t}releaseCompletedTraces(){if(this.#n.size===0)return!1;for(let e of this.#n)this.#t.delete(e),this.#a.delete(e),this.#r.add(e);for(this.#n.clear();this.#r.size>2048;){let e=this.#r.values().next().value;this.#r.delete(e)}return!0}releaseConversation(e){let t=!1;for(let[n,r]of this.#a)r.conversationId===e&&(t=!0,this.#t.delete(n),this.#n.delete(n),this.#a.delete(n),this.#i.delete(n));return t}async shutdown(){await Promise.all(this.#e.map(e=>e.shutdown()))}#o(e){let{spanId:t,traceId:n}=e.spanContext();if(t===void 0)return;let r=this.#i.get(n);if(r!==void 0){r.add(t),this.#n.delete(n);return}if(this.#t.has(n)&&!this.#n.has(n))return;let i=e.attributes[`gen_ai.conversation.id`],a=e.attributes[`agent.run.id`];typeof i==`string`&&(this.#n.delete(n),this.#r.delete(n),this.#t.add(n),this.#a.set(n,{conversationId:i,ownerRunId:typeof a==`string`?a:void 0}),this.#i.set(n,new Set([t])))}#s(e){let{spanId:t,traceId:n}=e.spanContext(),r=this.#i.get(n);t!==void 0&&r!==void 0&&r.delete(t)&&(r.size>0||(this.#i.delete(n),this.#n.add(n)))}#c(e){return e.instrumentationScope?.name!==`workflow`&&(this.#t.has(e.spanContext().traceId)||this.#r.has(e.spanContext().traceId))}};function isSpanLike(e){return typeof e==`object`&&!!e&&`attributes`in e&&`spanContext`in e&&typeof e.spanContext==`function`}export{AgentTraceSpanProcessor};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
interface SpanRecord {
|
|
2
|
+
readonly name: string;
|
|
3
|
+
readonly attributes: Readonly<Record<string, unknown>>;
|
|
4
|
+
}
|
|
5
|
+
/** Marks the `execute_tool` span of a tool call made outside any conversation. */
|
|
6
|
+
export declare const DIRECT_TOOL_CALL_ATTRIBUTE = "eve.tool.invocation";
|
|
7
|
+
export declare const DIRECT_TOOL_CALL_VALUE = "direct";
|
|
8
|
+
/**
|
|
9
|
+
* A direct tool call has no turn, so its own span is what starts and ends
|
|
10
|
+
* its claim on the trace, the way an activation span does for a turn.
|
|
11
|
+
*/
|
|
12
|
+
export declare function isDirectToolCallSpan(span: Pick<SpanRecord, "attributes">): boolean;
|
|
13
|
+
export declare function isAgentActivationSpan(span: SpanRecord): boolean;
|
|
14
|
+
export declare function agentTurnIdentity(span: SpanRecord): string | undefined;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const DIRECT_TOOL_CALL_ATTRIBUTE=`eve.tool.invocation`,DIRECT_TOOL_CALL_VALUE=`direct`;function isDirectToolCallSpan(e){return e.attributes[DIRECT_TOOL_CALL_ATTRIBUTE]===DIRECT_TOOL_CALL_VALUE}function isAgentActivationSpan(e){return e.name===`agent.turn`||e.attributes[`gen_ai.operation.name`]===`invoke_agent`&&e.attributes[`agent.invocation.role`]!==`caller`&&typeof e.attributes[`agent.turn.id`]==`string`}function agentTurnIdentity(e){let t=e.attributes[`agent.run.id`],n=e.attributes[`agent.turn.id`];return typeof n==`string`?`${typeof t==`string`?t:``}\0${n}`:void 0}export{DIRECT_TOOL_CALL_ATTRIBUTE,DIRECT_TOOL_CALL_VALUE,agentTurnIdentity,isAgentActivationSpan,isDirectToolCallSpan};
|
package/dist/src/tracing/{local-instrumentation-runtime.d.ts → local/instrumentation-runtime.d.ts}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type InstrumentationRuntime } from "#instrumentation/runtime.js";
|
|
2
|
-
import { type TraceCapturePolicy } from "#tracing/otel-declaration.js";
|
|
2
|
+
import { type TraceCapturePolicy } from "#tracing/eve/otel-declaration.js";
|
|
3
3
|
/** Zero-config local tracing admits every session in the development worker. @internal */
|
|
4
4
|
export declare const localTracePolicy: TraceCapturePolicy;
|
|
5
5
|
/** Installs the zero-config local OTel runtime once in an `eve dev` worker. */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getInstrumentationRuntime}from"#instrumentation/runtime.js";import{installInstrumentationRuntime}from"#tracing/eve/install-instrumentation-runtime.js";import{collectOtelPipeline,managedOtelIntegration,otel}from"#tracing/eve/otel-declaration.js";import{createLocalTracesProcessor,resolveLocalTracesExportPolicy}from"#tracing/local/traces.js";const localTracePolicy=()=>!0;function installLocalInstrumentationRuntime(e){let t=getInstrumentationRuntime();if(t!==void 0)return t;let n=createLocalTracesProcessor({appRoot:e.appRoot});return installInstrumentationRuntime({collected:collectOtelPipeline([otel({tracePolicy:localTracePolicy}),managedOtelIntegration({exportPolicy:resolveLocalTracesExportPolicy(),spanProcessors:[n]})]),frameworkVersion:e.frameworkVersion,providers:[],serviceName:e.serviceName})}export{installLocalInstrumentationRuntime,localTracePolicy};
|