Commit Graph

1014 Commits

  • .NET: Add Foundry Deployment docs to HA sample READMEs (#6365)
    * Add 'Deploying to Foundry (azd spec)' sections to all Foundry hosted agent samples
    
    This commit adds comprehensive deployment documentation to all 13 .NET Foundry hosted agent samples that were missing it. Each sample now includes:
    
    - Instructions to initialize an azd project from the sample's agent.manifest.yaml
    - Steps to deploy using 'azd deploy'
    - Example environment variable overrides for customization
    - Link to the official Foundry deployment guide
    
    Samples updated:
    - Hosted-LocalTools
    - Hosted-Files
    - Hosted-FoundryAgent
    - Hosted-McpTools
    - Hosted-Observability
    - Hosted-MemoryAgent
    - Hosted-TextRag
    - Hosted-ToolboxMcpSkills
    - Hosted-AzureSearchRag
    - Hosted-AgentSkills
    - Hosted-Workflow-Handoff
    - Hosted-Workflow-Simple
    - Hosted-Invocations-EchoAgent
    
    Each section includes the correct agent name from the sample's manifest and points to the correct GitHub URL for initializing the azd project.
    
    Fixes: https://github.com/microsoft/agent-framework/issues/6308
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Potential fix for pull request finding
    
    Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
    
    * docs(samples): fix Foundry hosted README consistency
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * docs(samples): address PR 6365 README review comments
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: Ben Thomas <25218250+alliscode@users.noreply.github.com>
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
  • Purview: Parallelize PSPC cold-cache scope refresh (#5832)
    * Parallelize Purview PSPC cold cache path
    
    * Cache Purview payment-required state for scope refresh
    
    * Cache Purview payment-required state for scope refresh
    
    * Align Purview policy action dedupe and 402 caching
    
     Deduplicate combined policy actions by action and restriction action so restriction-only actions are preserved
    without duplicating identical entries. Cache tenant-level payment-required state from background scope refresh so
    subsequent calls short-circuit consistently.
    
    * .NET: Implement best-effort caching for background job scope retrieval and add unit tests for cache write failures
    
    * Purview - feat: Enhance ScopedContentProcessor to queue ContentActivityJob when no applicable scopes are found and update related tests
    
    * docs: Update purview package README and AGENTS documentation to reflect caching optimizations and policy enforcement scenarios
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
  • .NET: Fix Magentic to share agent replies across team (#6222)
    * Fix Magentic to share agent replies across team
    
    The per-round instruction was sent untargeted (fan-out delivered it to
    every participant) and replies were never relayed, so a later speaker saw
    the prior speaker's instruction but not its response - inverted from
    GroupChatHost and the Python reference.
    
    - Target the instruction at the selected speaker only.
    - Broadcast each reply to the other participants (buffered, no TurnToken),
      excluding the responder via _currentSpeakerExecutorId, mirroring
      GroupChatHost.
    - Persist _currentSpeakerExecutorId across checkpoints.
    - Add a regression test.
    
    * Address review feedback: null-guard, explicit checkpoint key, drop vacuous assertion
    
    * Address review feedback: centralize checkpoint keys, clear current speaker
    
    - Move CurrentSpeakerStateKey into MagenticConstants as
      nameof(CurrentSpeakerStateKey)
    - Clear _currentSpeakerExecutorId in ResetAndReplanAsync and
      PrepareFinalAnswerAsync so a checkpoint taken in those windows does not
      persist a stale speaker
    - Add UTF-8 BOM to RecordingEchoAgent.cs to satisfy the format check.
  • .NET: Remove required token params from HarnessAgent, make compaction opt-in (#6409)
    * Move token params from HarnessAgent constructor to options
    
    Remove the required maxContextWindowTokens and maxOutputTokens
    constructor parameters from HarnessAgent and AsHarnessAgent, replacing
    them with optional MaxContextWindowTokens and MaxOutputTokens properties
    on HarnessAgentOptions.
    
    When both values are provided, compaction is enabled as before (in-loop
    CompactionProvider and chat reducer on the default InMemoryChatHistory
    Provider). When either is null, compaction is disabled entirely, making
    it opt-in.
    
    New constructor: HarnessAgent(IChatClient, HarnessAgentOptions?,
    ILoggerFactory?, IServiceProvider?)
    
    Closes #6333
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Improving comments.
    
    * feat: Add custom CompactionStrategy and DisableCompaction to HarnessAgentOptions
    
    Allow users to provide their own CompactionStrategy via options, with
    a clear priority system:
    1. DisableCompaction=true: no compaction regardless of other settings
    2. Custom CompactionStrategy provided: use it (token params ignored)
    3. Both MaxContextWindowTokens and MaxOutputTokens set: default strategy
    4. Otherwise: no compaction
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * fix: Address PR review comments on compaction opt-in
    
    - Update chatClient param XML doc to reflect compaction is opt-in
    - Strengthen compaction tests to assert ChatReducer is null/not-null
      rather than just asserting construction succeeds
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
  • .NET: Add Reasoning to ChatClientAgent ChatOptions merging (#5463)
    * Add reasoning option to request chat options in ChatClientAgent
    
    * Add tests for ChatOptions reasoning merging in ChatClientAgent
    
    ---------
    
    Co-authored-by: Roger Barreto <19890735+rogerbarreto@users.noreply.github.com>
  • .NET: fix: preserve AG-UI session history (#5904)
    * fix: preserve AG-UI session history
    
    * refactor: use static AG-UI provider check
  • .NET: [BREAKING] Migrate .NET GitHub Copilot SDK to v1.0.0 (#6381)
    * Migrate .NET GitHub Copilot SDK from 1.0.0-beta.2 to 1.0.0
    
    - Update namespace from GitHub.Copilot.SDK to GitHub.Copilot
    - Replace PermissionRequestResult/PermissionRequestResultKind with PermissionDecision
    - Remove ConnectionState check (StartAsync is now idempotent)
    - Rename ConfigDir to ConfigDirectory
    - Use SessionConfig.Clone() for CopySessionConfig
    - Update Tools type from List<AIFunction> to List<AIFunctionDeclaration>
    - Rename UserMessageAttachmentFile to AttachmentFile
    - Update usage data types (CacheWriteTokens: long, Duration: TimeSpan)
    - Add GHCP001 NoWarn for experimental SDK APIs (matches framework convention)
    - Specify type argument on CopilotSession.On<SessionEvent>()
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Fix formatting: remove unused using directive
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Skip AzureFunctions SamplesValidation tests pending func tools fix
    
    Azure Functions Core Tools v4 can no longer auto-detect the worker
    runtime in CI (local.settings.json is gitignored). All 7 active
    SamplesValidation tests fail with 'Worker runtime cannot be None'.
    
    Tracked by: https://github.com/microsoft/agent-framework/issues/6402
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Skip additional failing integration tests in CI
    
    WorkflowSamplesValidation (5 tests): same func tools issue as #6402.
    WorkflowConsoleAppSamplesValidation (4 tests): KeyNotFoundException
    during workflow execution, tracked by #6404.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
  • .NET: Add approval bypassing to harness as the default (#6387)
    * Add approval bypassing to harness as a default
    
    * Add tests
    
    * Address PR comments.
  • .NET: [BREAKING] Fix hosting bugs (#6388)
    * Fix hosting bugs
    
    * Address PR comments
  • .NET: Fix single-column value unwrap in declarative workflow (#6367)
    * Fix single-column value unwrap in declarative workflow
    
    * Added more tests
  • .NET: [BREAKING] Add auto-approval rules (heuristics) to ToolApprovalAgent (#6335)
    * Add support for approving tools via heuristic rules
    
    * Address PR comments
    
    * Address PR comments
    
    * Apply suggestion from @SergeyMenshykh
    
    Co-authored-by: SergeyMenshykh <68852919+SergeyMenshykh@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: SergeyMenshykh <68852919+SergeyMenshykh@users.noreply.github.com>
  • .NET: Allow storage of auto-approved functions (#4950)
    * Allow storage of auto-approved functions
    
    * Address PR comments
  • .NET: Restructure skill script schemas XML and remove resources from body (#6343)
    * Restore UTF-8 BOMs and fix BuildScriptSchemasBlock doc comment
    
    - Restore UTF-8 BOM on all changed files to match repo convention
    - Fix XML doc: <schema name=...> -> <schema script=...> to match emitted output
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Address PR review comments: fix doc remarks and rename tests
    
    - Update script doc remarks to clarify only parameter schemas are included
    - Fix grammar: 'arguments format' -> 'argument format'
    - Rename misleading test methods to match actual assertions
    - Clarify comment about removed wrapper element
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: SergeyMenshykh <SergeMenshikh@outlook.com>
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
  • .NET: Bug fixes for AGUI hosting and workflows (#6311)
    * Add mcp tool execution fix
    
    * Apply IsolationKeyScopedAgentSessionStore to MapAGUI by default if not yet set and improve comments in samples
    
    * Address PR comments
    
    * Fix formatting
  • .NET: Add ILoggerFactory and IServiceProvider to HarnessAgent constructor (#6273)
    * Add ILoggerFactory and IServiceProvider to HarnessAgent constructor
    
    Add optional ILoggerFactory and IServiceProvider parameters to the
    HarnessAgent constructor and AsHarnessAgent extension method, passing
    them to all downstream components that accept them:
    
    - FunctionInvokingChatClient (via UseFunctionInvocation)
    - CompactionProvider
    - AgentSkillsProvider
    - ChatClientAgent (via BuildAIAgent)
    - AIAgentBuilder.Build()
    
    Closes #6103
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Improve tests to verify ILoggerFactory and IServiceProvider propagation
    
    - Add test verifying ILoggerFactory.CreateLogger() is called by
      downstream components (CompactionProvider, AgentSkillsProvider)
    - Add test verifying IServiceProvider is queried during pipeline build
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
  • .NET: Promote Workflows.Declarative packages to stable versions (#6254)
    * Promote Workflows.Declarative packages to stable versions
    
    * Address PR feedback: enable package validation on GA declarative packages
    
    Both Workflows.Declarative and Workflows.Declarative.Mcp set IsReleased=true
    
    but were disabling package validation, bypassing the repo's GA convention
    
    (see dotnet/nuget/nuget-package.props which auto-enables validation when
    
    IsReleased=true).
    
    Re-enable validation by removing the local EnablePackageValidation=false
    
    overrides and pointing PackageValidationBaselineVersion at 1.8.0-rc1 (the
    
    latest published version of each package). This catches accidental breaking
    
    changes between RC and the first GA. Future GAs should bump the baseline to
    
    the previous GA version.
    
    Verified locally: dotnet build -c Release on both projects runs
    
    RunPackageValidation -> APICompat ran successfully without finding any
    
    breaking changes.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Update statement for the baseline validation.
    
    ---------
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
  • .NET: Add Hosted-ToolboxMcpSkills sample (#6175)
    * .NET: Add Hosted-ToolboxMcpSkills sample
    
    Adds a hosted Foundry Responses sample that discovers MCP-based skills from a Foundry Toolbox and makes them available to the agent via AgentSkillsProvider.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Align README and Program.cs default model to gpt-5
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Clarify MCP skills provider log to avoid implying eager discovery
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Drop redundant skills provider configured log
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Add Foundry Toolbox Skills tag to manifest
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Simplify BearerTokenHandler by deriving from HttpClientHandler
    
    Removes the need for an explicit InnerHandler. Enables CheckCertificateRevocationList to satisfy CA5399.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
  • .NET: Update hosted agents (#6243)
    * Updating to latest Foundry hosting packages.
    
    * Re-applying .gitignore.
    
    * Adding empty line at end of .gitignore
    
    ---------
    
    Co-authored-by: Ben Thomas <25218250+alliscode@users.noreply.github.com>
  • .NET - Fix missing id on function_call_output in Foundry Hosting (#6246)
    * Fix missing id on function_call_output in Foundry Hosting
    
    The Foundry storage layer was rejecting responses with
    "ID cannot be null or empty (Parameter 'id')" because
    function_call_output items emitted by OutputConverter had no id on
    the wire.
    
    OutputItemFunctionToolCallOutput's public ctor only sets CallId and
    Output; Id is read-only and only the SDK's internal ctor populates
    it. OutputItemBuilder<T>.ApplyAutoStamps fills ResponseId and
    AgentReference but not Id, so the itemId passed to
    AddOutputItem<T>(itemId) was used only for event sequencing and the
    serialized item went out with id=null.
    
    Switch to stream.OutputItemFunctionCallOutput(callId, output), the
    SDK convenience method that uses the internal ctor and stamps the
    id. Add a regression test asserting the added/done events carry a
    non-empty matching Id.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * ci: free disk space and relocate NuGet cache on ubuntu runners
    
    The ubuntu-latest dotnet-build/test jobs were hitting No space left on device because the runner image only ships ~14 GB free on /. The full multi-TFM build plus the dotnet pack + console-app install-check exhausts that easily.
    
    Add a reusable composite action .github/actions/free-runner-disk-space that runs on Linux runners only and:
    
    * removes pre-installed toolchains we never use here (Android SDK, GHC/Haskell, CodeQL, PyPy, Ruby, Go, boost, vcpkg, etc.), prunes docker images, and disables swap (reclaims ~25-30 GB on /)
    
    * relocates the NuGet package cache to /mnt/nuget via NUGET_PACKAGES env, since /mnt has ~75 GB free on hosted runners
    
    Wire the action into the four ubuntu-touching jobs in dotnet-build-and-test.yml (dotnet-build, dotnet-test, dotnet-foundry-hosted-it, dotnet-test-functions). The action self-guards with runner.os == 'Linux' so the matrix legs that run on windows are unaffected.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: alliscode <25218250+alliscode@users.noreply.github.com>
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
  • .NET: Preserve and propagate CreatedAt through workflows (#3930)
    * Preserve per-message CreatedAt attribute if it's available
    
    * Add unit test
    
    ---------
    
    Co-authored-by: Sam Chang <changsam@microsoft.com>
    Co-authored-by: samchang-msft <samchang.msft@gmail.com>
  • .NET: Forward Magentic participant replies to manager (#6156)
    MagenticOrchestrator.TakeTurnAsync dropped the `messages` parameter
    on subsequent turns, so participant replies never reached the manager's
    ChatHistory. The manager kept re-dispatching the same speaker every
    round until MaxRounds.
    
    Append the incoming messages to taskContext.ChatHistory before running
    the coordination round (matches Python's _handle_response).
    
    Adds RecordingReplayAgent + regression test that asserts the worker's
    reply reaches round-2's progress-ledger call.
    
    Co-authored-by: Jacob Alber <jaalber@microsoft.com>
  • Bump Azure.AI.AgentServer.* packages and align Azure.Core/System.ClientModel (#6178)
    * Bump Azure.AI.AgentServer.* package versions
    
    * Align Azure.Core/System.ClientModel to AgentServer transitive deps
    
    Bump Azure.Core 1.55->1.56 and System.ClientModel 1.11->1.12 to match Azure.AI.AgentServer.* requirements, and add explicit references in transitive-pinning-off Foundry consumers to avoid CS1705/MSB3277 version conflicts.
  • .NET: Fix InvokeMcpTool approval path for declarative workflows (#6177)
    * Fix InvokeMcpTool approval path for declarative workflows
    
    * Added more test for coverage.
  • .NET: Quarantine flaky DevUI test (#6159)
    * Bump Microsoft.Extensions.AI packages to 10.6.0
    
    * Align transitive package versions for Microsoft.Extensions.AI 10.6.0
    
    * Initial plan
    
    * Temporarily skip flaky DevUI keyed/default workflow test
    
    * Revert Microsoft.Extensions.AI package bumps, keep only flaky test quarantine
    
    ---------
    
    Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
    Co-authored-by: Roger Barreto <19890735+rogerbarreto@users.noreply.github.com>
  • .NET: Workflow Outputs Overhaul: Support Tagging, Filtering Agent Outputs (#6045)
    * test: reshuffle .NET Workflow tests in preparation for Outputs overhaul
    
    Phase 1 of the .NET Workflows outputs overhaul (see
    working/implementation-plan.md). Pure moves/renames in
    dotnet/tests/Microsoft.Agents.AI.Workflows.UnitTests; no production code
    changes, no new test cases. The split keeps each orchestration mode in
    its own source file so the upcoming tag-aware and orchestration-default
    test additions land on clean diffs.
    
    Renames:
    * WorkflowBuilderSmokeTests.cs -> WorkflowBuilderTests.cs (with class
      rename to match). The scope is no longer "smoke"-only once subsequent
      phases add tag-aware builder tests.
    * InputWaiterAndOutputFilterTests.cs -> InputWaiterTests.cs +
      OutputFilterTests.cs. The file already declared the two test classes
      separately; this split simply gives each its own file so the
      output-filter cases have a dedicated home for tag-aware additions.
    
    Split of AgentWorkflowBuilderTests.cs:
    * AgentWorkflowBuilderTests.cs is now the outer
      `public static partial class AgentWorkflowBuilderTests` holding the
      shared test helpers (DoubleEchoAgent + session + WithBarrier variant,
      WorkflowRunResult, RunWorkflow* methods) bumped from `private` to
      `internal` so the new top-level GroupChatWorkflowBuilderTests in the
      same assembly can reach them.
    * AgentWorkflowBuilder.SequentialTests.cs (nested SequentialTests):
      BuildSequential_InvalidArguments_Throws,
      BuildSequential_AgentsRunInOrderAsync.
    * AgentWorkflowBuilder.ConcurrentTests.cs (nested ConcurrentTests):
      BuildConcurrent_InvalidArguments_Throws,
      BuildConcurrent_AgentsRunInParallelAsync.
    
    Sequential and Concurrent are kept as nested classes because they're
    modes of the same `AgentWorkflowBuilder` static factory and do not
    produce dedicated builder types.
    
    New file:
    * GroupChatWorkflowBuilderTests.cs (top-level): the existing
      BuildGroupChat_* and GroupChatManager_* cases moved out of the old
      AgentWorkflowBuilderTests file. They exercise the
      `GroupChatWorkflowBuilder` type (returned by
      `AgentWorkflowBuilder.CreateGroupChatBuilderWith`), so a dedicated
      top-level test class - matching the convention reserved by the plan
      for HandoffWorkflowBuilderTests / MagenticWorkflowBuilderTests - is
      the right home. Cross-class helper references qualify with
      `AgentWorkflowBuilderTests.DoubleEchoAgent` and
      `AgentWorkflowBuilderTests.RunWorkflowAsync`.
    
    The outer partial class is `static` (and nested classes carry the
    instance test methods) because the outer holds only static helpers;
    this satisfies CA1052 without suppressions and is invisible to xUnit
    discovery, which finds tests on the nested classes as
    `AgentWorkflowBuilderTests.SequentialTests.*` etc.
    
    Validation: `dotnet build` clean on both target frameworks; all 547
    tests in Microsoft.Agents.AI.Workflows.UnitTests pass on net10.0.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * feat: introduce OutputTag, Futures, and tag-aware WorkflowBuilder API
    
    Phase 2 of the .NET Workflows outputs overhaul. Additive code change
    only - no observable runtime behavior change. The runner still uses the
    legacy bypass for AgentResponse / AgentResponseUpdate payloads, and the
    new `Futures.EnableAgentResponseOutputTaggingAndFiltering` flag defaults
    to false. Phase 3 will wire the flag into the runner; this commit only
    introduces the types and the builder API.
    
    New public surface:
    * `OutputTag` (readonly struct): wraps a string Value with ordinal
      equality (IEquatable, GetHashCode, == / !=) so it can participate as a
      HashSet element. Internal ctor closes the set. One public singleton:
      `OutputTag.Intermediate`. Terminal / regular outputs carry no tag
      (empty Tags set). JSON-serialized as a bare string via
      [JsonConverter(typeof(OutputTagJsonConverter))], with the converter
      rehydrating to the well-known singleton on read.
    * `Futures` (static class): hosts opt-in pre-GA behavior switches.
      First flag is `EnableAgentResponseOutputTaggingAndFiltering`; XML doc
      captures the v2.0.0 obsoletion / v3.0.0 removal lifecycle.
    * `WorkflowOutputEvent.Tags`: `HashSet<OutputTag>` exposed directly
      (concrete collection, matches the JSON-serialization convention used
      for `WorkflowInfo.OutputExecutorIds`). Never null; empty for legacy /
      terminal events. New ctors take a single `OutputTag` or
      `IEnumerable<OutputTag>?`; the existing (data, executorId) ctor
      remains and produces an untagged event. `HasTag(OutputTag)` helper.
      `AgentResponseEvent` and `AgentResponseUpdateEvent` gain matching
      tag-accepting ctors forwarding to the base.
    * `WorkflowOutputEventExtensions.IsIntermediate(this WorkflowOutputEvent)`:
      extension method returning `evt.HasTag(OutputTag.Intermediate)`. The
      preferred way to ask "is this an intermediate output?" without
      reaching into the Tags set.
    * `WorkflowBuilder.WithOutputFrom(IEnumerable<ExecutorBinding>, OutputTag)`
      and `WorkflowBuilder.WithOutputFrom(ExecutorBinding, OutputTag)`:
      forward-looking tagged overloads. The IEnumerable form is the primary
      tagged surface; the single-executor form is a convenience for the
      common one-executor case. Currently usable for the
      `OutputTag.Intermediate` singleton; will become the primary surface
      once the `OutputTag` constructor is opened to user-defined tags in
      a future release. Callers in this release should prefer the
      intent-specific `WithIntermediateOutputFrom` extension for the
      intermediate case. Tags accumulate across repeated calls; same tag
      repeated dedupes via the HashSet.
    * `WorkflowBuilderExtensions.WithIntermediateOutputFrom(this WorkflowBuilder, IEnumerable<ExecutorBinding>)`:
      helper that forwards to `WithOutputFrom(executors, OutputTag.Intermediate)`.
      Takes an IEnumerable (matching the tagged WithOutputFrom shape) -
      callers pass collection literals: `builder.WithIntermediateOutputFrom([a, b])`.
      XML doc remarks call out the Futures-flag interaction and the
      AIAgent-payload forwarding contract.
    
    Internal shape changes:
    * `WorkflowBuilder._outputExecutors`: HashSet<string> -> Dictionary<
      string, HashSet<OutputTag>>. The value set is empty for executors
      designated only via the untagged WithOutputFrom; contains Intermediate
      (and possibly future tags) otherwise.
    * `Workflow.OutputExecutors`: HashSet<string> -> Dictionary<string,
      HashSet<OutputTag>>.
    * `OutputFilter.CanOutput`: `Contains(id)` -> `ContainsKey(id)`.
    * `WorkflowInfo.OutputExecutorIds`: HashSet<string> -> Dictionary<
      string, HashSet<OutputTag>>, with a custom JsonConverter that reads
      both the new map shape (`{id: ["intermediate", ...]}`) and the legacy
      array shape (`[id1, id2]`, where each id is treated as an untagged
      output). Always writes the map shape. IsMatch updated to compare
      per-id tag sets.
    
    Tests landing in this commit (per the test-with-feature principle):
    * `OutputTagTests.cs` (6 tests): KnownValues, EqualityIsOrdinalOnValue,
      DefaultStructValueIsDistinct (default(OutputTag) does not collide
      with the Intermediate singleton in a HashSet),
      GetHashCodeMatchesEquals, JsonConverter_RoundtripsValueAsString,
      ConstructorIsInternal (reflection-based assertion that the (string)
      ctor is `internal`).
    * `WorkflowBuilderTests.cs` adds 7 new tests pinning the builder
      API contract: RegistersWithEmptyTagSet, AddsIntermediateTag,
      MultipleExecutorsAllUntagged, ThenIntermediate_AccumulatesTags,
      RepeatedDedupes, OnlyRegistersWithoutPriorWithOutputFrom,
      TracksExecutorBinding.
    * `BackwardsCompatibility/JsonCheckpointSerializationTests.cs`
      (new folder + file, 5 tests): event-level ctor contract tests
      (single-tag, no-tag, multi-tag — the last with a custom tag);
      IsIntermediate() asserted; load-bearing JSON BC tests for
      `WorkflowInfo.OutputExecutorIds` -
      `WorkflowOutputExecutorsReadsLegacyArrayShape` (legacy ids map to
      empty tag sets) and `WorkflowOutputExecutorsWritesMapShape`.
    
    The plan's three JSON round-trip tests for `WorkflowOutputEvent.Tags`
    were dropped: `WorkflowEvent` is not currently a serialized checkpoint
    shape (see the comment in WorkflowsJsonUtilities.cs about events not
    being persisted), so there is no real back-compat surface to pin
    through JSON. They are substituted with in-process ctor/property
    round-trip tests that exercise the `Tags` / `HasTag` / `IsIntermediate`
    contract.
    
    Validation: full `Microsoft.Agents.AI.Workflows.UnitTests` suite runs
    green on net10.0 (565 passing, 0 failing). Core library builds clean
    on net472, netstandard2.0, net8.0, net9.0, and net10.0. Test project
    builds clean on net472 + net10.0.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * feat: route AgentResponse(Update) through the output filter under a Futures flag
    
    `InProcessRunnerContext.YieldOutputAsync` historically special-cased AgentResponse and
    AgentResponseUpdate payloads: it built the typed event subclass and emitted it directly,
    bypassing the output filter. Rewrites the method so that:
    
    - When `Futures.EnableAgentResponseOutputTaggingAndFiltering` is `false` (the current
      default), AgentResponse(Update) keep the legacy bypass — emitted as
      AgentResponseEvent / AgentResponseUpdateEvent with no tags. Existing callers see no
      behavior change.
    - When the flag is `true`, AIAgent payloads flow through the output filter just like
      every other payload type: undesignated sources are dropped, and the emitted event
      carries the source's tag set (empty for terminal `WithOutputFrom`, `{Intermediate}`
      for `WithIntermediateOutputFrom`, the set union when both designations apply).
    
    Non-AIAgent (POCO) outputs also now carry the source's tag set on the emitted
    WorkflowOutputEvent unconditionally — additive, since no existing assertion inspected
    Tags. Subclass events (`AgentResponseEvent` / `AgentResponseUpdateEvent`) continue to
    be emitted under both modes so `switch (evt) { case AgentResponseEvent: ... }`
    consumer code keeps matching.
    
    Adds `OutputFilter.TryGetTags` as the tag-aware lookup used by the runner.
    `OutputFilter.CanOutput` is kept (still used by the existing sync tests in
    `OutputFilterTests.cs`).
    
    Tests
    -----
    - `Futures/Futures.AgentResponseOutputFilteringAndTaggingTests.cs` (new): the F1–F13
      matrix from the plan, covering every combination of `(flag on/off) × (designation)
      × (payload shape)`. Uses a `FuturesScope` IDisposable + a `FuturesSerial` xUnit
      collection (DisableParallelization = true) to keep the process-global flag from
      leaking across parallel tests.
    - `OutputFilterTests.cs`: four new `Test_OutputFilter_…` cases for the `TryGetTags`
      surface (empty-tag-set for terminal designation, `{Intermediate}` for intermediate
      designation, union for accumulated designation, `false` for unregistered).
    
    582/582 unit tests pass on net10.0 (565 baseline + 17 new).
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * feat: tag-aware defaults and designation API on orchestration builders
    
    Aligns the .NET orchestration builders with Python's output / intermediate-output
    distinction. Each builder either applies a Python-aligned default designation set or
    replays the user's explicit `WithOutputFrom` / `WithIntermediateOutputFrom` calls,
    never both.
    
    Static `AgentWorkflowBuilder.BuildSequential` / `BuildConcurrent` apply defaults
    unconditionally (no user-facing fluent surface to take control through):
    
    - Sequential: terminal `end` + every agent designated intermediate.
    - Concurrent: terminal `end` + every agent and per-agent accumulator designated
      intermediate.
    
    The three fluent instance builders memoize agent-typed designation calls in a
    `Dictionary<AIAgent, HashSet<OutputTag>>` (empty set = terminal-only, non-empty =
    intermediate tag(s)) so repeated calls dedupe naturally. They replay the entries
    at `Build()` time, suppressing defaults when any call has been made:
    
    - `HandoffWorkflowBuilder` / `HandoffWorkflowBuilderCore<TBuilder>` (also picked up
      by the obsolete `HandoffsWorkflowBuilder` via inheritance).
      Default: terminal `HandoffEnd` + every handoff agent intermediate.
      (Bug fix: legacy code relied on `WithOutputFrom(end)` to bind `HandoffEnd`. The
      new explicit-designation path bypasses that, so `Build()` now calls
      `BindExecutor(end)` unconditionally to keep validation happy.)
    - `GroupChatWorkflowBuilder` — default: terminal host + every participant intermediate.
    - `MagenticWorkflowBuilder` — default: terminal orchestrator + every team member
      intermediate.
    
    Designating a non-participant agent throws `InvalidOperationException`.
    
    The bare `WorkflowBuilder` default is unchanged — only the orchestration-style
    builders gain implicit defaults, matching the plan's non-goal.
    
    Tests
    -----
    - `AgentWorkflowBuilder.SequentialTests` / `.ConcurrentTests`: one default-spec
      assertion each.
    - `GroupChatWorkflowBuilderTests`: defaults-match-spec, explicit-replaces-defaults,
      non-participant throws.
    - `HandoffWorkflowBuilderTests` (new file): same three.
    - `MagenticWorkflowBuilderTests` (new file): same three.
    
    593/593 unit tests pass on net10.0 (582 baseline + 11 new).
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * feat: WorkflowHostAgent forwards AgentResponseEvent unconditionally under Futures-on
    
    Aligns the .NET Workflow-as-Agent surface with Python `as_agent`. Under
    `Futures.EnableAgentResponseOutputTaggingAndFiltering = true`,
    `WorkflowSession.InvokeStageAsync` now forwards `AgentResponseEvent`
    unconditionally — joining `AgentResponseUpdateEvent` in ignoring the host's
    `includeWorkflowOutputsInResponse` switch. That switch keeps governing the
    generic `WorkflowOutputEvent` path for non-AIAgent payloads, where it is
    further short-circuited by an `IsIntermediate()` check (tagged intermediate
    outputs always surface).
    
    Under Futures-off the legacy asymmetry is preserved: `AgentResponseUpdateEvent`
    always forwarded, `AgentResponseEvent` gated by `includeWorkflowOutputsInResponse`.
    
    Back-compat: with `Futures.EnableAgentResponseOutputTaggingAndFiltering` left at
    its default `false`, observable behavior is identical to before.
    
    `Futures` documentation gains a remark explaining the `Workflow.AsAIAgent()`
    interaction in both flag states.
    
    Runner fix
    ----------
    `InProcessRunnerContext.YieldOutputAsync` now skips `Executor.CanOutput` for
    AgentResponse-shaped payloads under both Futures branches. `AIAgentHostExecutor`
    doesn't declare AgentResponse(Update) in its `Yields` set, so the historical
    legacy bypass had silently skipped the check; Phase 3's Futures-on path was
    running it and would reject AIAgent payloads. AIAgent-shaped payloads are now
    always a valid output shape, matching the legacy bypass semantics.
    
    Phase 4 follow-on
    -----------------
    Switched the three orchestration-builder designation-replay loops to iterate
    `Dictionary.Keys` with a value lookup instead of constructing/destructuring
    `KeyValuePair<,>`. Cleaner shape and avoids the netstandard2.0 / net472
    `KeyValuePair<,>.Deconstruct` unavailability that surfaced when this branch
    multi-TFM-built.
    
    Tests
    -----
    `WorkflowHostSmokeTests.IntermediateForwarding` (new nested class, 6 tests):
    - intermediate AgentResponse forwarded past the include-outputs gate (Futures on)
    - terminal AgentResponse forwarded unconditionally (Futures on)
    - terminal AgentResponse gated by include flag (Futures off, legacy)
    - undesignated AIAgent executor emits no AgentResponseEvent under Futures-on
    - legacy bypass still emits AgentResponseEvent under Futures-off
    - intermediate tag is observable via `update.RawRepresentation`
    
    The class joins the `FuturesSerial` xUnit collection so the process-global flag
    is serialized against other Futures-toggling tests.
    
    599/599 unit tests pass on net10.0 (593 baseline + 6 new).
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * feat: SequentialWorkflowBuilder and ConcurrentWorkflowBuilder, OrchestrationBuilderBase
    
    Promotes the Sequential and Concurrent orchestration shapes to first-class fluent
    builder classes, matching Handoff / GroupChat / Magentic. Users can call
    `WithOutputFrom(agents)` / `WithIntermediateOutputFrom(agents)` to control which
    agents are designated output / intermediate sources; when no designation call is
    made, the Python-aligned defaults apply (terminal aggregator output + every agent
    intermediate; Concurrent also tags per-agent accumulators).
    
    `AgentWorkflowBuilder.BuildSequential(...)` and `BuildConcurrent(...)` are kept
    and now delegate to the new builders; observable behavior unchanged. Five static
    factories now mirror each other:
    
    - `AgentWorkflowBuilder.CreateSequentialBuilderWith(params IEnumerable<AIAgent>)`
    - `AgentWorkflowBuilder.CreateConcurrentBuilderWith(params IEnumerable<AIAgent>)`
    - `AgentWorkflowBuilder.CreateHandoffBuilderWith(AIAgent)`        (already existed)
    - `AgentWorkflowBuilder.CreateGroupChatBuilderWith(Func<...>)`    (already existed)
    - `AgentWorkflowBuilder.CreateMagenticBuilderWith(AIAgent)`       (new)
    
    OrchestrationBuilderBase
    ------------------------
    New abstract `OrchestrationBuilderBase<TBuilder>` unifies the shared fluent
    surface across all five orchestration builders: `WithName`, `WithDescription`,
    `WithOutputFrom`, `WithIntermediateOutputFrom`, and the
    `ApplyOutputDesignations(builder, agentMap, kind, applyDefaults)` helper that
    either replays the user's designations or invokes the orchestration-specific
    defaults.
    
    Removes ~150 LOC of duplicated designation-management code from the four
    non-Handoff builders, plus the equivalent from `HandoffWorkflowBuilderCore`.
    
    Tests
    -----
    - New `SequentialWorkflowBuilderTests.cs` / `ConcurrentWorkflowBuilderTests.cs`
      (replace the old `AgentWorkflowBuilder.{Sequential,Concurrent}Tests.cs`
      nested-class files). Method names normalized to
      `Test_<BuilderType>_<Scenario>[Async]`.
    - Shared helpers (`DoubleEchoAgent`, `DoubleEchoAgentWithBarrier`,
      `WorkflowRunResult`, `RunWorkflow*`) moved from the old
      `AgentWorkflowBuilderTests` partial class into a new
      `OrchestrationTestHelpers` static class in `OrchestrationTestHelpers.cs`.
      Downstream test files (Group Chat, Handoff, Sequential, Concurrent) updated
      to qualify with `OrchestrationTestHelpers.*`.
    - A new `AgentWorkflowBuilderTests.cs` covers the static surface directly:
      `BuildSequential` / `BuildConcurrent` invariants and aggregator wiring, plus
      null-rejection + round-trip checks for every `Create*BuilderWith` factory.
    - New AsAgent intermediate-suppression tests on a nested `AsAgentForwarding`
      class for each of Sequential and Concurrent: build with only the terminal
      agent designated via `WithOutputFrom`, run via `AsAIAgent(...)`, assert via
      `AgentResponseUpdate.AuthorName` that intermediate agents do not surface.
      Both join the `FuturesSerial` collection.
    - New `Test_<Builder>_WithDescriptionPropagatesToWorkflow` smoke tests on
      Sequential and Concurrent (newly available via the base class).
    
    625/625 unit tests pass on net10.0.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * chore: dotnet format
    
    * fixup: encoding
    
    * fixup: charset
    
    * fixup: Updates for PR feedback
    
    * fixup: format
    
    * fixup: merge issue
    
    * Fix intermediate filtering on .AsAgent()
    
    * fix filter logic
    
    * fix: Revert logic change and add comments
    
    ---------
    
    Co-authored-by: Jacob Alber <jalber@lokitoth.com>
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
  • .NET: feat: Update GroupChatManager semantics to match other Orchestration patterns (#6140)
    * Refactor group chat workflow to prevent message echoing and enhance checkpointing
    
    - Updated GroupChatWorkflowBuilder to disable forwarding incoming messages to prevent duplicates.
    - Enhanced RoundRobinGroupChatManager with checkpointing support to preserve state across executions.
    - Modified GroupChatHost to maintain a history of messages and track the current speaker for message broadcasting.
    - Implemented broadcasting logic to ensure participants receive messages from others while excluding their own responses.
    - Added comprehensive unit tests for group chat orchestration, including scenarios for tool approval and function calls.
    - Introduced a new ApprovalHarness for testing tool invocation and approval workflows.
    
    * fixup: format
    
    * Add JSON serialization support for GroupChatManagerState and RoundRobinGroupChatManagerState
    
    ---------
    
    Co-authored-by: Jacob Alber <jalber@lokitoth.com>
  • .NET: [Breaking] Refactor AgentFileSkillsSource for depth-based discovery and predicate filters (#6109)
    * Refactor AgentFileSkillsSource to use filter predicates and add AgentFileSkillFilterContext
    
    - Replace hardcoded script/resource directory lists with configurable ScriptFilter and ResourceFilter predicates
    - Add AgentFileSkillFilterContext class to provide contextual file information to filter predicates
    - Replace MaxSearchDepth constant with configurable SearchDepth option
    - Update AgentFileSkillsSourceOptions with new filter and search depth properties
    - Update tests to reflect the new filtering approach
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Log '(none)' instead of empty string for missing file extensions in debug output
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
  • .NET: feat: Bring Handoff Orchestration to parity with Python (#6138)
    * feat: implement autonomous mode and termination conditions in handoff workflow
    
    * fixup: format
    
    * feat: enhance autonomous mode with per-agent configurations and add unit tests
    
    * fixup: remove empty file
    
    ---------
    
    Co-authored-by: Jacob Alber <jalber@lokitoth.com>
  • .NET: Support ClaimsIdentity-based scoping of agent sessions (#5696)
    * feat: Add DelegatingAgentSessionStore
    
    Add helper for decorator pattern for AgentSessionStore
    
    * feat: Add UserIdentityScopedSessionStore
    
    Add support for using the ASP.Net Core ambient `ClaimsIdentity` User, along with a user-specified claim type to scope the session store based on authenticated identity.
    
    * fix: Harden scope mapping
    
    * fix: Add UserIdentityScopeSessionStoreOptions to avoid future breaking changes
    
    * Split UserIdentityScopedSessionStore into a separate IsolationKeyProvider and IsolationKeyScopedSessionStore
    
    * Add GetService<>() capabilities to interrogate AgentSessionStore delegation chain
    
    * Harden default for A2A hosting by using an IsolationKeyScopedAgentSessionStore when no store is available.
    
    * Pipe isolation through Hosting helper extension methods
    
    * Add comment to samples about adding SessionIsolationKeyProvider
    
    * Fix isolation key provider nullability semantics
    
    * fix A2A defaults
    
    * fixup
    
    * remove unneeded keyProvider requirement test
    
    * Add trust-model XML docs to AgentSessionStore, InMemoryAgentSessionStore, MapAGUI, A2A entry points
    
    Agent-Logs-Url: https://github.com/microsoft/agent-framework/sessions/e466c53a-faad-40a8-8b5f-83cf0dce0b1d
    
    Co-authored-by: lokitoth <6936551+lokitoth@users.noreply.github.com>
    
    * fix: Switch ClaimsBasedIsolationKeyProvider to be Singleton
    
       * matches HttpContextAccessor and related MAF services
    
    * release: Ensure new project is in the release filter
    
    * fixup: Integraitaon tests
    
    ---------
    
    Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
    Co-authored-by: lokitoth <6936551+lokitoth@users.noreply.github.com>
  • .NET: Fix render dupe and text input clear bugs, and improve guardrail error messaging (#6136)
    * Fix render dupe and text input clear bugs
    
    * Fix another text rendering issue and improve guardrails messaging
    
    * Address PR comments
    
    * Improve guardrail rendering and json error handling
    
    * Another tweak for input box render issue
    
    * Address PR comments
  • .NET: Add Foundry Toolbox MCP skills discovery sample (#6134)
    * feat: add Agent_Step26_FoundryToolboxMcpSkills sample
    
    Add a new sample demonstrating MCP-based skills discovery from a Foundry
    Toolbox endpoint using AgentSkillsProviderBuilder and AIContextProviders.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * fix: address PR review comments for Step26 sample
    
    - Add Foundry-Features: Toolboxes=V1Preview header to MCP transport
      options, matching the Step25 pattern
    - Document skill://index.json prerequisite in README
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Update dotnet/samples/02-agents/AgentsWithFoundry/Agent_Step26_FoundryToolboxMcpSkills/Program.cs
    
    Co-authored-by: Roger Barreto <19890735+rogerbarreto@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    Co-authored-by: Roger Barreto <19890735+rogerbarreto@users.noreply.github.com>
  • Python: Align c# and python TodoProvider tool names (#6107)
    * Align c# and python TodoProvider tool names
    
    * Potential fix for pull request finding
    
    Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
    
    * Address PR review: remove __slots__ and add typed schemas for tool params
    
    - Remove __slots__ from TodoItem, TodoInput, and TodoCompleteInput classes
      (not needed for low-instance-count objects and hinders dev scenarios)
    - Add _TodoAddItemSchema and _TodoCompleteItemSchema TypedDicts to provide
      proper JSON schema for todos_add and todos_complete tool parameters
    - Use typing_extensions for Python 3.10 compatibility
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
  • .NET: [BREAKING] Remove Support for Code-Gen in Declarative Workflows (#6095)
    * Removed
    
    * Remove sample
    
    * Remove orphaned code-gen related code path
    
    * Remove remaining references to code gen.
    
    ---------
    
    Co-authored-by: Chris Rickman <crickman@microsoft.com>
    Co-authored-by: Chris <66376200+crickman@users.noreply.github.com>
  • .NET: Add MCP-based skills support (skill-md type) (#6108)
    * Add MCP-based skills support
    
    - Add AgentMcpSkill, AgentMcpSkillResource, AgentMcpSkillsSource, and McpSkillIndex to Microsoft.Agents.AI.Mcp
    - Add AgentSkillsProviderBuilderMcpExtensions for DI integration
    - Add Agent_Step06_McpBasedSkills sample project
    - Add unit tests for AgentMcpSkillsSource
    - Update solution file and project references
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Remove unnecessary [Experimental] attributes from MCP package
    
    The package is already alpha, so the [Experimental] attribute is redundant.
    Removed from both AgentSkillsProviderBuilderMcpExtensions and
    AgentMcpSkillsSource classes.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Make Agent_Step06_McpBasedSkills self-contained and add to verify-samples
    
    Embed an internal MCP server (launched via --server flag as a child process)
    that serves skill://index.json and skill://unit-converter/SKILL.md resources,
    replacing the external MCP_SKILLS_ENDPOINT dependency. The sample now uses
    StdioClientTransport and a fixed prompt instead of an interactive loop.
    
    Added SampleDefinition to AgentsSamples.cs for automated verification.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Sort usings
    
    ---------
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
  • Python: Add a HarnessAgent with available features and sample (#6041)
    * Add a HarnessAgent with available features and sample
    
    * Fix formatting
    
    * Address PR comments and fix mypy error
    
    * Add web search support to HarnessAgent
    
    * Fix build warning
    
    * Apply suggestions from code review
    
    Co-authored-by: Eduard van Valkenburg <eavanvalkenburg@users.noreply.github.com>
    
    * Address PR comments
    
    * Address PR comments
    
    * Address further PR comments.
    
    * Fix markdown broken link
    
    ---------
    
    Co-authored-by: Eduard van Valkenburg <eavanvalkenburg@users.noreply.github.com>
  • .NET: Updating version for dotnet release 1.7.0 (#6093)
    * Updating version for dotnet release 1.6.3
    
    * Change to minor version bump.
    
    ---------
    
    Co-authored-by: Ben Thomas <25218250+alliscode@users.noreply.github.com>
  • Python: Align ModeProvider tool names and instructions (#6071)
    * Align ModeProvider tool names and instructions
    
    * Address PR comments
  • .NET: [Breaking] Refactor AgentSkill API to async resource and script lookup (#6030)
    * .NET: Refactor AgentSkill API to async resource and script lookup
    
    Replace property-based AgentSkill.Content, Resources, and Scripts with
    async-by-name lookup methods plus boolean availability flags:
    
    - Content (string getter) -> GetContentAsync(CancellationToken)
    - Resources (full list) -> HasResources + GetResourceAsync(name, ct)
    - Scripts (full list) -> HasScripts + GetScriptAsync(name, ct)
    
    This makes the API friendlier for sources like MCP where enumerating all
    resources up front is expensive or impossible, and allows skill implementations
    to fetch content lazily.
    
    Subclass changes:
    - AgentFileSkill and AgentInlineSkill implement the new async API while
      preserving content caching.
    - AgentClassSkill<TSelf> keeps virtual Resources/Scripts properties for
      reflection-based discovery and seals the new HasResources/HasScripts/
      GetResourceAsync/GetScriptAsync overrides. Its previously non-thread-safe
      lazy initialization is replaced with Lazy<T> (default thread-safety) wired
      up in a new protected constructor, so concurrent first-access from multiple
      threads is safe.
    - AgentSkillsProvider calls the new async API and exposes 
    ead_skill_resource
      / load_skill / 
    un_skill_script tools that await the per-name lookups.
    
    Includes baseline CompatibilitySuppressions.xml entries for the removed
    property getters.
    
    Tests:
    - Direct coverage for HasResources, HasScripts, GetResourceAsync, and
      GetScriptAsync on all three skill implementations (positive, missing-name,
      and no-resources/no-scripts cases).
    - Thread-safety regression test for AgentClassSkill<TSelf> that exercises
      concurrent first-access to Resources, Scripts, and GetContentAsync from
      many tasks and asserts all observers see the same cached instance.
    - Provider-level coverage for the 
    ead_skill_resource tool (invocation +
      error paths) and for the previously untested error paths of load_skill
      and 
    un_skill_script (empty names, skill/resource/script not found).
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Address PR review comments
    
    - Move GetScriptAsync inside try/catch in RunSkillScriptAsync for error-handling parity
    - Remove dead _reflectedResources branch from AgentSkillTestExtensions
    - Fix XML docs to reference virtual Resources/Scripts properties (not sealed methods)
    - Add Async suffix to async test methods per naming convention
    - Make no-await tests synchronous to eliminate CS1998
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Fix formatting: add UTF-8 BOM and remove unused using
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Fix XML cref: Resources/Scripts are on AgentClassSkill<TSelf>
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Remove HasResources and HasScripts properties from AgentSkill
    
    Drop the virtual HasResources and HasScripts properties from AgentSkill
    and all concrete subclasses (AgentFileSkill, AgentInlineSkill,
    AgentClassSkill). AgentSkillsProvider now always includes all three
    tools (load_skill, read_skill_resource, run_skill_script) and both
    instruction blocks, since the tools already handle missing
    resources/scripts gracefully.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Add blank line for readability in file-based skills sample
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * Fix HostedAgentSkillsPatternTests for always-included tools
    
    Update assertions to expect read_skill_resource and run_skill_script
    tools are always present, matching the new behavior.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
  • .NET: Add Hosted-AgentSkills sample with Foundry Skills integration (#6013)
    * .NET: Add Hosted-AgentSkills sample for Foundry Skills integration
    
    Add a new hosted agent sample that demonstrates how to load behavioral
    guidelines from Foundry Skills at startup using AgentSkillsProvider and
    the progressive disclosure pattern (advertise -> load on demand).
    
    The sample:
    - Downloads SKILL.md files from Foundry via ProjectAgentSkills SDK
    - Extracts ZIP archives with zip-slip protection
    - Wires skills into AgentSkillsProvider as an AIContextProvider
    - Hosts the agent via the Responses protocol
    
    Ships two Contoso Outdoors skills matching the Python sample (PR #5822):
    - support-style: tone, formatting, signature guidelines
    - escalation-policy: when and how to escalate tickets
    
    Includes convenience provisioning gated behind PROVISION_SAMPLE_SKILLS
    env var, clearly documented as NOT a production pattern.
    
    Closes #5776
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * .NET: Add unit tests and integration test for Hosted-AgentSkills
    
    Unit tests (14 tests, all passing):
    - ZIP extraction with zip-slip guard (valid archive, traversal attack,
      sibling-prefix attack, directory entries)
    - Skill name validation (rejects dots, separators, traversal patterns)
    - AgentSkillsProvider with downloaded skills (advertises both skills,
      load_skill returns canary tokens, unknown skill returns error)
    
    Container integration test:
    - New 'agent-skills' scenario in the test container that creates
      Contoso Outdoors skills on disk and wires AgentSkillsProvider
    - AgentSkillsHostedAgentFixture + 4 integration tests verifying:
      - Routine questions load support-style skill (STYLE-CANARY-3318)
      - Escalation triggers load escalation-policy (ESC-CANARY-7742)
      - Skills are advertised in system prompt
      - load_skill tool is invoked via FunctionCallContent
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * .NET: Add smoke test, bootstrap, and docs for agent-skills integration
    
    - Add scripts/smoke.ps1 for local Docker smoke testing: builds the
      contributor image, runs the container, verifies both skills are loaded
      via canary tokens (STYLE-CANARY-3318, ESC-CANARY-7742)
    - Add 'agent-skills' to the bootstrap script scenario list
    - Add agent-skills row to the integration test README scenarios table
    - Exclude HostedAgentSkillsPatternTests from net472 (uses net8.0+ APIs)
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * .NET: Update commented-out package versions to latest across all hosted samples
    
    Update the end-user PackageReference versions (in the commented-out
    sections) from 1.0.0 to the current latest NuGet versions:
    
    - Microsoft.Agents.AI: 1.6.1
    - Microsoft.Agents.AI.Foundry: 1.6.1-preview.260514.1
    - Microsoft.Agents.AI.Foundry.Hosting: 1.6.1-preview.260514.1
    - Microsoft.Agents.AI.Hosting: 1.6.1-preview.260514.1
    - Microsoft.Agents.AI.OpenAI: 1.6.1
    - Microsoft.Agents.AI.Workflows: 1.6.1
    
    Also adds explicit versions to Hosted-Workflow-Handoff which had bare
    PackageReference entries without Version attributes.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * .NET: Fix broken markdown links in Hosted-AgentSkills README
    
    Remove references to non-existent ../../README.md. Replace with
    inline instructions matching other hosted samples that don't have
    a parent README.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    * .NET: Use OS-appropriate string comparison in zip-slip guard
    
    Use Ordinal on Unix (case-sensitive FS) and OrdinalIgnoreCase on
    Windows to prevent case-based path bypass on Linux containers.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
  • .NET: fix parallel tool call rendering in AGUI translation layer (#6009)
    Fix three interlocked bugs that prevent parallel tool calls from rendering
    correctly in AG-UI protocol clients:
    
    Bug #1: Scope synthetic MessageId fallback to text events only. The shared
    streamingMessageId was leaking into ToolCallStartEvent.ParentMessageId,
    causing all parallel tool calls to collapse into one FE card.
    
    Bug #2: Make ToolCallResultEvent.MessageId deterministically unique using
    result-{CallId} format. MEAI's FunctionInvokingChatClient batches all
    results with a shared MessageId, collapsing them in FE reconciliation.
    
    Bug #3: Coalesce consecutive assistant-tool-call messages in AsChatMessages.
    Once Bug #1 is fixed, the FE produces separate AGUIAssistantMessage per
    tool call. On multi-turn replay these become consecutive assistant messages
    without intervening tool results, triggering HTTP 400 from Azure OpenAI.
    
    Remove the now-dead ContainsToolResult helper introduced by PR #5800.
    
    Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>