From 48a3e977227db9832b966dc89a797c43aea48b36 Mon Sep 17 00:00:00 2001 From: yashvanthange Date: Sat, 22 Aug 2026 12:37:56 +0530 Subject: [PATCH 1/5] .NET: expose OpenTelemetryAgent.DefaultSourceName The default ActivitySource name lives on the internal OpenTelemetryConsts class, so consumers cannot reference it when configuring a TracerProvider and must hardcode the literal "Experimental.Microsoft.Agents.AI" instead. ADR 0003 documents AgentOpenTelemetryConsts.DefaultSourceName for this, a type that no longer exists after the rename in #356. Expose the source name as a public const on OpenTelemetryAgent, the type that emits the spans, rather than making the whole constants class public. That keeps the gen_ai.* attribute keys internal, matching the Microsoft.Extensions.AI precedent, while making the documented AddSource call compile. Update the ADR snippet to the constant that now exists. --- .../0003-agent-opentelemetry-instrumentation.md | 2 +- dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgent.cs | 10 ++++++++++ .../OpenTelemetryAgentTests.cs | 10 ++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/docs/decisions/0003-agent-opentelemetry-instrumentation.md b/docs/decisions/0003-agent-opentelemetry-instrumentation.md index 863387b5cbd..61d4d2f0803 100644 --- a/docs/decisions/0003-agent-opentelemetry-instrumentation.md +++ b/docs/decisions/0003-agent-opentelemetry-instrumentation.md @@ -127,7 +127,7 @@ The implementation is validated through: ```csharp // Create TracerProvider using var tracerProvider = Sdk.CreateTracerProviderBuilder() - .AddSource(AgentOpenTelemetryConsts.DefaultSourceName) + .AddSource(OpenTelemetryAgent.DefaultSourceName) .AddConsoleExporter() .Build(); diff --git a/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgent.cs b/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgent.cs index 90c0ec59ebb..877fea103d1 100644 --- a/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgent.cs +++ b/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgent.cs @@ -41,6 +41,16 @@ public sealed class OpenTelemetryAgent : DelegatingAIAgent, IDisposable // inner agent not directly but rather via OpenTelemetryChatClient, which wraps a ForwardingChatClient that in turn // calls back into the inner agent. + /// + /// The default name used by when no source name + /// is supplied to the constructor. + /// + /// + /// Pass this value to the tracing pipeline (for example, TracerProviderBuilder.AddSource) to subscribe to + /// the spans emitted by agents that use the default source name, instead of hardcoding the literal name. + /// + public const string DefaultSourceName = OpenTelemetryConsts.DefaultSourceName; + /// The providing the bulk of the telemetry. private readonly OpenTelemetryChatClient _otelClient; /// The provider name extracted from . diff --git a/dotnet/tests/Microsoft.Agents.AI.UnitTests/OpenTelemetryAgentTests.cs b/dotnet/tests/Microsoft.Agents.AI.UnitTests/OpenTelemetryAgentTests.cs index 79e3418b862..9686fc3beef 100644 --- a/dotnet/tests/Microsoft.Agents.AI.UnitTests/OpenTelemetryAgentTests.cs +++ b/dotnet/tests/Microsoft.Agents.AI.UnitTests/OpenTelemetryAgentTests.cs @@ -873,6 +873,16 @@ public async Task AutoWireChatClient_UserFactoryAddsOwnOTel_CoexistsWithBelowFic Assert.Equal(2, activities.Count(a => string.Equals(a.GetTagItem("gen_ai.operation.name") as string, "chat", StringComparison.Ordinal))); } + [Fact] + public void DefaultSourceName_MatchesSourceOfEmittedActivities() + { + // Callers pass this constant to TracerProviderBuilder.AddSource, so it must stay in sync with the + // source name the agent actually emits spans under; comparing against the literal guards the rename. + + // Arrange & Act & Assert + Assert.Equal("Experimental.Microsoft.Agents.AI", OpenTelemetryAgent.DefaultSourceName); + } + [Theory] [InlineData(null)] [InlineData("")] From e9d0aa352bcd731fcd069e8dec1ce46d2b5bf813 Mon Sep 17 00:00:00 2001 From: yashvanthange Date: Sat, 22 Aug 2026 13:15:12 +0530 Subject: [PATCH 2/5] .NET: read DefaultSourceName at run time instead of inlining it A public const is baked into each consumer assembly at compile time, so a consumer built against one package version would keep subscribing to the old literal after upgrading to a version that changed the source name, and would silently stop receiving spans. That is the exact failure this API is meant to remove, so expose the value as a static property that is read at run time. Rename the test to describe what it actually asserts and point at the test that verifies emitted activities use the same source name. --- dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgent.cs | 10 ++++++---- .../OpenTelemetryAgentTests.cs | 7 ++++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgent.cs b/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgent.cs index 877fea103d1..c88b0086870 100644 --- a/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgent.cs +++ b/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgent.cs @@ -42,14 +42,16 @@ public sealed class OpenTelemetryAgent : DelegatingAIAgent, IDisposable // calls back into the inner agent. /// - /// The default name used by when no source name - /// is supplied to the constructor. + /// Gets the default name used by when no source + /// name is supplied to the constructor. /// /// /// Pass this value to the tracing pipeline (for example, TracerProviderBuilder.AddSource) to subscribe to - /// the spans emitted by agents that use the default source name, instead of hardcoding the literal name. + /// the spans emitted by agents that use the default source name, instead of hardcoding the literal name. This is + /// a property rather than a constant so that the value is read at run time: a consumer that upgrades the package + /// picks up the current source name without recompiling. /// - public const string DefaultSourceName = OpenTelemetryConsts.DefaultSourceName; + public static string DefaultSourceName => OpenTelemetryConsts.DefaultSourceName; /// The providing the bulk of the telemetry. private readonly OpenTelemetryChatClient _otelClient; diff --git a/dotnet/tests/Microsoft.Agents.AI.UnitTests/OpenTelemetryAgentTests.cs b/dotnet/tests/Microsoft.Agents.AI.UnitTests/OpenTelemetryAgentTests.cs index 9686fc3beef..e6a1c67077a 100644 --- a/dotnet/tests/Microsoft.Agents.AI.UnitTests/OpenTelemetryAgentTests.cs +++ b/dotnet/tests/Microsoft.Agents.AI.UnitTests/OpenTelemetryAgentTests.cs @@ -874,10 +874,11 @@ public async Task AutoWireChatClient_UserFactoryAddsOwnOTel_CoexistsWithBelowFic } [Fact] - public void DefaultSourceName_MatchesSourceOfEmittedActivities() + public void DefaultSourceName_ReturnsDocumentedSourceName() { - // Callers pass this constant to TracerProviderBuilder.AddSource, so it must stay in sync with the - // source name the agent actually emits spans under; comparing against the literal guards the rename. + // Callers pass this to TracerProviderBuilder.AddSource, so it must stay in sync with the source name the + // agent emits spans under, which Ctor_NullOrWhitespaceSourceName_AutoWiredChatClientUsesDefaultSource_Async + // pins to the same literal. Comparing against the literal here guards a rename of the internal constant. // Arrange & Act & Assert Assert.Equal("Experimental.Microsoft.Agents.AI", OpenTelemetryAgent.DefaultSourceName); From 2a44f9feed2b8bf561ce2adbee91888913c6bed2 Mon Sep 17 00:00:00 2001 From: yashvanthange Date: Mon, 24 Aug 2026 23:45:37 +0530 Subject: [PATCH 3/5] .NET: document that AddSource and the agent source name must match The tracing pipeline only receives agent spans when the name registered with TracerProviderBuilder.AddSource matches the source name the agent emits under; a mismatch fails silently. Spell that pairing out in the sourceName XML docs on UseOpenTelemetry and the OpenTelemetryAgent constructors, and in the ADR usage example, which now also shows the custom-source case and uses the AsBuilder().UseOpenTelemetry() API that actually exists. --- ...003-agent-opentelemetry-instrumentation.md | 23 ++++++++++++++++++- .../Microsoft.Agents.AI/OpenTelemetryAgent.cs | 10 ++++---- .../OpenTelemetryAgentBuilderExtensions.cs | 5 ++-- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/docs/decisions/0003-agent-opentelemetry-instrumentation.md b/docs/decisions/0003-agent-opentelemetry-instrumentation.md index 61d4d2f0803..e7c95c749cd 100644 --- a/docs/decisions/0003-agent-opentelemetry-instrumentation.md +++ b/docs/decisions/0003-agent-opentelemetry-instrumentation.md @@ -124,6 +124,10 @@ The implementation is validated through: ### Usage Example +The name passed to `TracerProviderBuilder.AddSource` must match the source name the agent emits under, otherwise the +provider silently receives no agent spans. When no source name is supplied to `UseOpenTelemetry`, the agent emits under +`OpenTelemetryAgent.DefaultSourceName`, so that is the value to register: + ```csharp // Create TracerProvider using var tracerProvider = Sdk.CreateTracerProviderBuilder() @@ -133,12 +137,29 @@ using var tracerProvider = Sdk.CreateTracerProviderBuilder() // Create and wrap agent with telemetry var baseAgent = new ChatClientAgent(chatClient, options); -using var telemetryAgent = baseAgent.WithOpenTelemetry(); +using var telemetryAgent = baseAgent.AsBuilder() + .UseOpenTelemetry() + .Build(); // Use agent normally - telemetry is captured automatically var response = await telemetryAgent.RunAsync(messages); ``` +To emit under a custom source name, pass the same value to both calls: + +```csharp +const string SourceName = "MyCompany.MyAgent"; + +using var tracerProvider = Sdk.CreateTracerProviderBuilder() + .AddSource(SourceName) + .AddConsoleExporter() + .Build(); + +using var telemetryAgent = baseAgent.AsBuilder() + .UseOpenTelemetry(sourceName: SourceName) + .Build(); +``` + ### Relationship to Microsoft.Extensions.AI This implementation follows the exact patterns established by Microsoft.Extensions.AI's OpenTelemetry instrumentation, ensuring consistency across the AI ecosystem and leveraging proven patterns for telemetry integration. diff --git a/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgent.cs b/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgent.cs index c88b0086870..fa221b81a0f 100644 --- a/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgent.cs +++ b/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgent.cs @@ -74,8 +74,9 @@ public sealed class OpenTelemetryAgent : DelegatingAIAgent, IDisposable /// Initializes a new instance of the class. /// The underlying to be augmented with telemetry capabilities. /// - /// An optional source name that will be used to identify telemetry data from this agent. - /// If not provided, a default source name will be used for telemetry identification. + /// An optional source name used to identify telemetry data from this agent. + /// When specified, register the same value with TracerProviderBuilder.AddSource so the tracing pipeline + /// subscribes to these spans. When omitted, is used. /// /// is . /// @@ -92,8 +93,9 @@ public OpenTelemetryAgent(AIAgent innerAgent, string? sourceName = null) /// Initializes a new instance of the class. /// The underlying to be augmented with telemetry capabilities. /// - /// An optional source name that will be used to identify telemetry data from this agent. - /// If not provided, a default source name will be used for telemetry identification. + /// An optional source name used to identify telemetry data from this agent. + /// When specified, register the same value with TracerProviderBuilder.AddSource so the tracing pipeline + /// subscribes to these spans. When omitted, is used. /// /// /// When and the inner agent is a , the underlying diff --git a/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgentBuilderExtensions.cs b/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgentBuilderExtensions.cs index 8f83a8dda1e..0d27ef8d178 100644 --- a/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgentBuilderExtensions.cs +++ b/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgentBuilderExtensions.cs @@ -15,8 +15,9 @@ public static class OpenTelemetryAgentBuilderExtensions /// /// The to which OpenTelemetry support will be added. /// - /// An optional source name that will be used to identify telemetry data from this agent. - /// If not specified, a default source name will be used. + /// An optional source name used to identify telemetry data from this agent. + /// When specified, register the same value with TracerProviderBuilder.AddSource so the tracing pipeline + /// subscribes to these spans. When omitted, is used. /// /// /// An optional callback that provides additional configuration of the instance. From 4d1f886ce7d4c985b642e9540d5a215f9f8d1254 Mon Sep 17 00:00:00 2001 From: yashvanthange Date: Sat, 29 Aug 2026 00:30:55 +0530 Subject: [PATCH 4/5] .NET: mark OpenTelemetryAgent.DefaultSourceName experimental DefaultSourceName is a new public API, so gate it behind MAAI001 and graduate it later if it proves useful. The ADR usage section notes that the diagnostic has to be suppressed to use the property. --- docs/decisions/0003-agent-opentelemetry-instrumentation.md | 3 ++- dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgent.cs | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/decisions/0003-agent-opentelemetry-instrumentation.md b/docs/decisions/0003-agent-opentelemetry-instrumentation.md index e7c95c749cd..527f364792a 100644 --- a/docs/decisions/0003-agent-opentelemetry-instrumentation.md +++ b/docs/decisions/0003-agent-opentelemetry-instrumentation.md @@ -126,7 +126,8 @@ The implementation is validated through: The name passed to `TracerProviderBuilder.AddSource` must match the source name the agent emits under, otherwise the provider silently receives no agent spans. When no source name is supplied to `UseOpenTelemetry`, the agent emits under -`OpenTelemetryAgent.DefaultSourceName`, so that is the value to register: +`OpenTelemetryAgent.DefaultSourceName`, so that is the value to register. That property is marked +`[Experimental("MAAI001")]`; suppress that diagnostic in your csproj to use it. ```csharp // Create TracerProvider diff --git a/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgent.cs b/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgent.cs index fa221b81a0f..bb94f4674a3 100644 --- a/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgent.cs +++ b/dotnet/src/Microsoft.Agents.AI/OpenTelemetryAgent.cs @@ -51,6 +51,7 @@ public sealed class OpenTelemetryAgent : DelegatingAIAgent, IDisposable /// a property rather than a constant so that the value is read at run time: a consumer that upgrades the package /// picks up the current source name without recompiling. /// + [Experimental(DiagnosticIds.Experiments.AgentsAIExperiments)] public static string DefaultSourceName => OpenTelemetryConsts.DefaultSourceName; /// The providing the bulk of the telemetry. From 3a72b50e62a75f752e633ad50162d9ebe9bf309c Mon Sep 17 00:00:00 2001 From: yashvanthange Date: Fri, 4 Sep 2026 21:43:52 +0530 Subject: [PATCH 5/5] .NET: declare DefaultSourceName in the public API baseline The public API analyzers added in #7935 require every public member of a released package to be listed in that package's PublicAPI baseline for each target framework. DefaultSourceName was added before those analyzers landed, so this branch built clean on its own but failed RS0016 once merged with main. Add the entry to all five Microsoft.Agents.AI baselines. Unshipped rather than Shipped, since the member has not been released yet; the promotion workflow moves it across after a release. --- .../PublicAPI/net10.0/PublicAPI.Unshipped.txt | 1 + .../Microsoft.Agents.AI/PublicAPI/net472/PublicAPI.Unshipped.txt | 1 + .../Microsoft.Agents.AI/PublicAPI/net8.0/PublicAPI.Unshipped.txt | 1 + .../Microsoft.Agents.AI/PublicAPI/net9.0/PublicAPI.Unshipped.txt | 1 + .../PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt | 1 + 5 files changed, 5 insertions(+) diff --git a/dotnet/src/Microsoft.Agents.AI/PublicAPI/net10.0/PublicAPI.Unshipped.txt b/dotnet/src/Microsoft.Agents.AI/PublicAPI/net10.0/PublicAPI.Unshipped.txt index 31d026ce287..b473d4bd163 100644 --- a/dotnet/src/Microsoft.Agents.AI/PublicAPI/net10.0/PublicAPI.Unshipped.txt +++ b/dotnet/src/Microsoft.Agents.AI/PublicAPI/net10.0/PublicAPI.Unshipped.txt @@ -7,5 +7,6 @@ [MAAI001]const Microsoft.Agents.AI.FileAccessProvider.ReadLinesToolName = "file_access_read_lines" -> string! [MAAI001]static Microsoft.Agents.AI.AgentFileStore.ScanContent(string! fileName, string! content, System.Text.RegularExpressions.Regex! regex) -> Microsoft.Agents.AI.FileSearchResult? [MAAI001]static Microsoft.Agents.AI.AgentFileStore.SplitLines(string! content) -> System.Collections.Generic.IReadOnlyList! +[MAAI001]static Microsoft.Agents.AI.OpenTelemetryAgent.DefaultSourceName.get -> string! [MAAI001]virtual Microsoft.Agents.AI.AgentFileStore.FindMatchingFilesAsync(string! directory, string! regexPattern, string? globPattern = null, bool recursive = false, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! [MAAI001]virtual Microsoft.Agents.AI.AgentFileStore.SearchAsync(string! directory, string! regexPattern, string? globPattern = null, bool recursive = false, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! diff --git a/dotnet/src/Microsoft.Agents.AI/PublicAPI/net472/PublicAPI.Unshipped.txt b/dotnet/src/Microsoft.Agents.AI/PublicAPI/net472/PublicAPI.Unshipped.txt index 31d026ce287..b473d4bd163 100644 --- a/dotnet/src/Microsoft.Agents.AI/PublicAPI/net472/PublicAPI.Unshipped.txt +++ b/dotnet/src/Microsoft.Agents.AI/PublicAPI/net472/PublicAPI.Unshipped.txt @@ -7,5 +7,6 @@ [MAAI001]const Microsoft.Agents.AI.FileAccessProvider.ReadLinesToolName = "file_access_read_lines" -> string! [MAAI001]static Microsoft.Agents.AI.AgentFileStore.ScanContent(string! fileName, string! content, System.Text.RegularExpressions.Regex! regex) -> Microsoft.Agents.AI.FileSearchResult? [MAAI001]static Microsoft.Agents.AI.AgentFileStore.SplitLines(string! content) -> System.Collections.Generic.IReadOnlyList! +[MAAI001]static Microsoft.Agents.AI.OpenTelemetryAgent.DefaultSourceName.get -> string! [MAAI001]virtual Microsoft.Agents.AI.AgentFileStore.FindMatchingFilesAsync(string! directory, string! regexPattern, string? globPattern = null, bool recursive = false, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! [MAAI001]virtual Microsoft.Agents.AI.AgentFileStore.SearchAsync(string! directory, string! regexPattern, string? globPattern = null, bool recursive = false, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! diff --git a/dotnet/src/Microsoft.Agents.AI/PublicAPI/net8.0/PublicAPI.Unshipped.txt b/dotnet/src/Microsoft.Agents.AI/PublicAPI/net8.0/PublicAPI.Unshipped.txt index 31d026ce287..b473d4bd163 100644 --- a/dotnet/src/Microsoft.Agents.AI/PublicAPI/net8.0/PublicAPI.Unshipped.txt +++ b/dotnet/src/Microsoft.Agents.AI/PublicAPI/net8.0/PublicAPI.Unshipped.txt @@ -7,5 +7,6 @@ [MAAI001]const Microsoft.Agents.AI.FileAccessProvider.ReadLinesToolName = "file_access_read_lines" -> string! [MAAI001]static Microsoft.Agents.AI.AgentFileStore.ScanContent(string! fileName, string! content, System.Text.RegularExpressions.Regex! regex) -> Microsoft.Agents.AI.FileSearchResult? [MAAI001]static Microsoft.Agents.AI.AgentFileStore.SplitLines(string! content) -> System.Collections.Generic.IReadOnlyList! +[MAAI001]static Microsoft.Agents.AI.OpenTelemetryAgent.DefaultSourceName.get -> string! [MAAI001]virtual Microsoft.Agents.AI.AgentFileStore.FindMatchingFilesAsync(string! directory, string! regexPattern, string? globPattern = null, bool recursive = false, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! [MAAI001]virtual Microsoft.Agents.AI.AgentFileStore.SearchAsync(string! directory, string! regexPattern, string? globPattern = null, bool recursive = false, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! diff --git a/dotnet/src/Microsoft.Agents.AI/PublicAPI/net9.0/PublicAPI.Unshipped.txt b/dotnet/src/Microsoft.Agents.AI/PublicAPI/net9.0/PublicAPI.Unshipped.txt index 31d026ce287..b473d4bd163 100644 --- a/dotnet/src/Microsoft.Agents.AI/PublicAPI/net9.0/PublicAPI.Unshipped.txt +++ b/dotnet/src/Microsoft.Agents.AI/PublicAPI/net9.0/PublicAPI.Unshipped.txt @@ -7,5 +7,6 @@ [MAAI001]const Microsoft.Agents.AI.FileAccessProvider.ReadLinesToolName = "file_access_read_lines" -> string! [MAAI001]static Microsoft.Agents.AI.AgentFileStore.ScanContent(string! fileName, string! content, System.Text.RegularExpressions.Regex! regex) -> Microsoft.Agents.AI.FileSearchResult? [MAAI001]static Microsoft.Agents.AI.AgentFileStore.SplitLines(string! content) -> System.Collections.Generic.IReadOnlyList! +[MAAI001]static Microsoft.Agents.AI.OpenTelemetryAgent.DefaultSourceName.get -> string! [MAAI001]virtual Microsoft.Agents.AI.AgentFileStore.FindMatchingFilesAsync(string! directory, string! regexPattern, string? globPattern = null, bool recursive = false, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! [MAAI001]virtual Microsoft.Agents.AI.AgentFileStore.SearchAsync(string! directory, string! regexPattern, string? globPattern = null, bool recursive = false, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! diff --git a/dotnet/src/Microsoft.Agents.AI/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/dotnet/src/Microsoft.Agents.AI/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt index 31d026ce287..b473d4bd163 100644 --- a/dotnet/src/Microsoft.Agents.AI/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt +++ b/dotnet/src/Microsoft.Agents.AI/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt @@ -7,5 +7,6 @@ [MAAI001]const Microsoft.Agents.AI.FileAccessProvider.ReadLinesToolName = "file_access_read_lines" -> string! [MAAI001]static Microsoft.Agents.AI.AgentFileStore.ScanContent(string! fileName, string! content, System.Text.RegularExpressions.Regex! regex) -> Microsoft.Agents.AI.FileSearchResult? [MAAI001]static Microsoft.Agents.AI.AgentFileStore.SplitLines(string! content) -> System.Collections.Generic.IReadOnlyList! +[MAAI001]static Microsoft.Agents.AI.OpenTelemetryAgent.DefaultSourceName.get -> string! [MAAI001]virtual Microsoft.Agents.AI.AgentFileStore.FindMatchingFilesAsync(string! directory, string! regexPattern, string? globPattern = null, bool recursive = false, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! [MAAI001]virtual Microsoft.Agents.AI.AgentFileStore.SearchAsync(string! directory, string! regexPattern, string? globPattern = null, bool recursive = false, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!