Skip to content

Add AI agent hosting integration - #2249

Merged
aaronpowell merged 5 commits into
mainfrom
tommasodotnet-agent-integration-port
Nov 5, 2026
Merged

aaronpowell merged 5 commits into
mainfrom
tommasodotnet-agent-integration-port

Conversation

@tommasodotNET

@tommasodotNET tommasodotNET commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #2248

Ports microsoft/aspire#17757 into CommunityToolkit.Aspire.Hosting.Agents, using the standalone extraction at 8d93031b42666b353aee4a8370a8b5349703ad98. Original .NET Foundation MIT notices and provenance are retained.

The preview package models existing endpoint resources using AsAgent and provides run-only developer invocation commands for A2A v0.3/v1 (JSON-RPC and HTTP+JSON; streaming opt-in), OpenAI Responses, AG-UI, ACP, and explicit .WithMcpServer(...).WithMcpToolCommands(). Extension methods and metadata types use Toolkit-standard namespaces. No core Aspire.Hosting changes, generic WithReference dispatcher, or generic HTTP-command changes are needed.

The original test coverage and six examples are retained, with review-driven regression coverage and shared Toolkit test infrastructure. The former publish snapshot is covered by exact dictionary assertions. Packaging, framework targets, dependencies, and examples follow the repository's current Aspire 17 / net10.0 baseline. Dependency versions are centrally managed.

MCP SDK adoption

Following the maintainer review and an isolated comparison spike, MCP commands now use ModelContextProtocol.Core 1.4.1 instead of handwritten initialization, JSON/SSE parsing, response correlation, and session management. The MCP implementation is 268 lines smaller; public APIs, dashboard input controls, and endpoint resolution are unchanged. MCP package versions are aligned centrally at 1.4.1. Core was already present transitively through Aspire on this baseline.

A small HTTP adapter preserves the configured AppHost HTTP client, independent five-second session-cleanup timeout, and safe cleanup warnings. Guarded pagination and raw tool-result presentation remain integration responsibilities.

Accepted, documented SDK limitations: malformed initialization may leave an assigned server session unclosed; parse/correlation failures may leave an HTTP response undisposed; malformed raw bodies and arbitrary JSON-RPC error data are not preserved. Tests tagged SdkGap characterize these limitations rather than claim parity. These are experimental developer commands, not a durable client.

PR Checklist

  • Created a feature/dev branch
  • PR doesn't include merge commits
  • New integration: README and package description included
  • Tests for the changes have been added
  • Contains NO breaking changes to existing Toolkit packages
  • Public APIs have XML documentation
  • Follows Toolkit namespace and packaging conventions

Other information

Latest validation completed without paid services or provisioning:

  • Full agent suite: 310 passed, followed by 4/4 official-server smoke cases after adding two real-server failure/logging cases (312 cases now defined).
  • MCP Inspector .NET suite: 29 passed after central SDK alignment.
  • Agents AppHost and .NET samples build. Existing Aspire SDK staged-migration warning ASPIRE012 remains.
  • Live Aspire 17 dashboard walkthrough verified SDK-backed tool discovery, schema-driven input, JSON response display, useful tool-error details, and cancellation against a deterministic local official SDK server.
  • Command failures appear in notifications with View response, and command outcomes appear in resource console logs. The minimal fixture produced no dashboard traces without OpenTelemetry configuration; traces are not an automatic replacement for SDK-discarded error details.
  • Local fixture and browser stopped; whitespace checks pass.

Earlier port validation covered manifest-only output, deterministic Python cancellation/cleanup, AG-UI/ACP routes, Vercel type-checking, generated ATS exports and TypeScript signatures, gallery wiring, and test discovery. No public API shape changed during SDK adoption.

Commands execute in the AppHost process. They do not implement sign-in, token acquisition/refresh, or forwarding of dashboard-user identity. Authenticated endpoints should use a driver application; endpoint authentication must not be disabled. Examples default to existing Foundry connections, with provisioning behind explicit UseExistingFoundry=false opt-in. No live model calls, Azure provisioning, role changes, or package publication were performed.

Checked-in generated API/ATS compatibility baselines are left to the repository's review/release regeneration workflow; the ATS surface was generated separately for initial validation. The original upstream PR has not been modified or closed by this port.

Copilot AI balanced review requested due to automatic review settings October 14, 2026 18:19
@github-actions

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/CommunityToolkit/Aspire/main/eng/scripts/dogfood-pr.sh | bash -s -- 2249

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/CommunityToolkit/Aspire/main/eng/scripts/dogfood-pr.ps1) } 2249"

Copilot AI commented Oct 14, 2026

Copy link
Copy Markdown
Contributor

One or more custom setup steps configured for this repository failed during this Copilot code review run:

Restore .NET dependencies

Setup steps run before each review. If the review above is missing context, or no review was posted at all, the failing step above may be the cause. See the workflow run for failure details, fix your setup steps configuration, and re-request a review.

Note

You can configure setup steps for Copilot code review separately from Copilot cloud agent with a copilot-code-review.yml file. Read the docs for details.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Unresolved protocol request, response-validation, and command-handling defects prevent reliable agent invocation.

5 open findings
What changed in this PR

Adds a preview AI-agent hosting integration to the Toolkit, bringing endpoint metadata and local dashboard invocation commands without changing core Aspire behavior.

Changes:

  • Adds multi-protocol agent configuration and opt-in MCP tool commands.
  • Ports protocol tests, test helpers, and publish-expression snapshots.
  • Includes six examples, documentation, package metadata, and repository registration.
File Description
tests/​CommunityToolkit.Aspire.Hosting.Agents.Tests/​WithMcpToolCommandsTests.cs Tests MCP invocation and session cleanup.
tests/​CommunityToolkit.Aspire.Hosting.Agents.Tests/​TestServices/​TestServiceProvider.cs Supplies test configuration services.
tests/​CommunityToolkit.Aspire.Hosting.Agents.Tests/​TestServices/​TestInteractionService.cs Simulates dashboard interactions.
tests/​CommunityToolkit.Aspire.Hosting.Agents.Tests/​TestServices/​TestDistributedApplicationBuilder.cs Creates run/publish test builders.
tests/​CommunityToolkit.Aspire.Hosting.Agents.Tests/​TestServices/​McpTestResource.cs Provides a simulated MCP resource.
tests/​CommunityToolkit.Aspire.Hosting.Agents.Tests/​TestServices/​EnvironmentVariableEvaluator.cs Evaluates resource environment configuration.
tests/​CommunityToolkit.Aspire.Hosting.Agents.Tests/​TestServices/​AsyncTestHelpers.cs Bounds asynchronous test waits.
tests/​CommunityToolkit.Aspire.Hosting.Agents.Tests/​Snapshots/​AgentResourceBuilderExtensionsTests.AsAgent_PublishPreservesEndpointExpressionsWithoutCommands.verified.txt Records deferred endpoint expressions.
tests/​CommunityToolkit.Aspire.Hosting.Agents.Tests/​Directory.Packages.props Aligns local xUnit dependencies.
tests/​CommunityToolkit.Aspire.Hosting.Agents.Tests/​CommunityToolkit.Aspire.Hosting.Agents.Tests.csproj Configures the integration test project.
src/​CommunityToolkit.Aspire.Hosting.Agents/​README.md Documents APIs, scope, and authentication boundaries.
src/​CommunityToolkit.Aspire.Hosting.Agents/​McpToolCommandResourceBuilderExtensions.cs Implements MCP invocation commands.
src/​CommunityToolkit.Aspire.Hosting.Agents/​CommunityToolkit.Aspire.Hosting.Agents.csproj Defines the preview hosting package.
src/​CommunityToolkit.Aspire.Hosting.Agents/​AgentResourceBuilderExtensions.cs Implements agent configuration and protocol commands.
src/​CommunityToolkit.Aspire.Hosting.Agents/​AgentResourceAnnotation.cs Stores agent protocol metadata.
src/​CommunityToolkit.Aspire.Hosting.Agents/​AgentProtocol.cs Defines supported agent protocols.
src/​CommunityToolkit.Aspire.Hosting.Agents/​A2AInvocationMode.cs Defines A2A invocation modes.
README.md Adds the package to the gallery.
examples/​agents/​weather-agent-python/​weather_agent_python/​main.py Implements the Python A2A agent.
examples/​agents/​weather-agent-python/​weather_agent_python/​__init__.py Declares the A2A sample package.
examples/​agents/​weather-agent-python/​tests/​test_executor.py Tests executor cancellation and cleanup.
examples/​agents/​weather-agent-python/​pyproject.toml Defines A2A sample dependencies.
examples/​agents/​weather-agent-python/​.python-version Selects the Python runtime.
examples/​agents/​vercel-ai-responses-agent/​tsconfig.json Configures TypeScript checking.
examples/​agents/​vercel-ai-responses-agent/​package.json Defines Vercel sample dependencies and scripts.
examples/​agents/​vercel-ai-responses-agent/​app.ts Implements a Responses-compatible agent.
examples/​agents/​ResponsesAgent/​ResponsesAgent.csproj Configures the .NET Responses sample.
examples/​agents/​ResponsesAgent/​Program.cs Hosts Responses and MCP endpoints.
examples/​agents/​README.md Documents sample setup and validation.
examples/​agents/​McpAgent/​Program.cs Exposes a model-backed MCP tool.
examples/​agents/​McpAgent/​McpAgent.csproj Configures the MCP sample project.
examples/​agents/​Directory.Packages.props Scopes sample-specific .NET dependencies.
examples/​agents/​CommunityToolkit.Aspire.Hosting.Agents.AppHost/​Properties/​launchSettings.json Configures local dashboard launch profiles.
examples/​agents/​CommunityToolkit.Aspire.Hosting.Agents.AppHost/​CommunityToolkit.Aspire.Hosting.Agents.AppHost.csproj References hosting integrations and samples.
examples/​agents/​CommunityToolkit.Aspire.Hosting.Agents.AppHost/​AppHost.cs Connects six samples to Foundry resources.
examples/​agents/​aspire.config.json Identifies the example AppHost.
examples/​agents/​agui-acp-agent-python/​pyproject.toml Defines AG-UI/ACP sample dependencies.
examples/​agents/​agui-acp-agent-python/​agui_acp_agent/​main.py Hosts AG-UI and ACP endpoints.
examples/​agents/​agui-acp-agent-python/​agui_acp_agent/​__init__.py Declares the AG-UI/ACP package.
examples/​agents/​AgentEnvDump/​Program.cs Displays the injected agent-card URL.
examples/​agents/​AgentEnvDump/​AgentEnvDump.csproj Defines the diagnostic executable.
examples/​agents/​.gitignore Excludes Python cache files.
CommunityToolkit.Aspire.slnx Registers package, tests, and examples.
CODEOWNERS Assigns integration ownership.
Files not reviewed (1)
  • examples/agents/vercel-ai-responses-agent/package-lock.json: Generated file

🧠 Review effort: Balanced


💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@github-actions github-actions Bot added the Stale label Oct 28, 2026
@tommasodotNET
tommasodotNET force-pushed the tommasodotnet-agent-integration-port branch from e6b1911 to e61e810 Compare October 28, 2026 10:43
@github-actions github-actions Bot removed the Stale label Oct 29, 2026

@aaronpowell aaronpowell left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left a variety of comments throughout the files in the PR but probably the biggest thing I'm up against is that I'm not sure I really understand the workflow for this. If I'm understanding correctly, this makes it possible to expose via dashboard commands ways to interact with resources that are exposed as agents or MCP servers?

Would you be able to throw together a video in which it walks through the usage of this so I can get a better understanding of it?

Comment thread examples/agents/McpAgent/Program.cs Resolved
@tommasodotNET

tommasodotNET commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor Author

@aaronpowell Yes, that is the intended workflow: these APIs add dashboard invocation commands to agent and MCP endpoints the application already exposes. They do not create an agent or host a model.

Here is an 83-second walkthrough showing the AppHost configuration, a Responses invocation and its result, MCP tool discovery and generated arguments, the tool response, and cancellation. The recording uses a deterministic local Responses fixture and an official MCP SDK server, with no cloud resources or model calls. Requests execute in the AppHost process; authenticated endpoints still need a driver application that handles their authentication.

The review fixes are in 168d097: standard .NET configuration, repository-root package versions, shared test helpers, exact publish assertions instead of the Verify snapshot/local xUnit overrides, Toolkit-scoped diagnostics, and clearer protocol dispatch and failure diagnostics. The MCP client implementation is unchanged in this pass; its limited scope is now explicit in the README.

Validation: 301 agent tests and 29 MCP Inspector .NET tests passed; the examples build and the package packs for all three target frameworks. The additional MCP Inspector TypeScript check was blocked by a Yarn download timeout on this machine.

agents-dashboard-walkthrough.mp4

@aaronpowell aaronpowell added this to the 17.0 milestone Nov 3, 2026

@aaronpowell aaronpowell left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the video, it helps me understand the flow that this would be useful for.

There is a merge conflict and an outstanding question regarding the user of a custom MCP client or using the official SDK - can you spike that and see what the diff looks like, does it reduce or increase complexity? would it be more maintainable long term? that sort of stuff. It doesn't have to be directly on this PR (it could be branched off)

tommasodotNET and others added 4 commits November 3, 2026 08:30
Port microsoft/aspire#17757 via standalone source 8d93031b42666b353aee4a8370a8b5349703ad98. Preserve all protocols, MCP invocation, 277 tests and six examples, adapting Toolkit naming, packaging and test infrastructure.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Complete AG-UI inputs, preserve distinct protocol paths, correlate MCP tool responses, handle dialog cancellation and fall back to raw JSON for complex parameter schemas. Add regression coverage for all five review findings.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Reuse shared test helpers, centralize sample package versions, use application configuration, and document Toolkit diagnostics and the dashboard workflow. Preserve publish assertions without a local xUnit override and add safe agent-card failure diagnostics.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Use the shared test project's runtime setup, migrate sample .NET resources to AddDotnetProject, and retain explicit legacy ProjectResource regression coverage.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@tommasodotNET
tommasodotNET force-pushed the tommasodotnet-agent-integration-port branch from 168d097 to 4982971 Compare November 3, 2026 07:48
@tommasodotNET

Copy link
Copy Markdown
Contributor Author

Thanks for the video, it helps me understand the flow that this would be useful for.

There is a merge conflict and an outstanding question regarding the user of a custom MCP client or using the official SDK - can you spike that and see what the diff looks like, does it reduce or increase complexity? would it be more maintainable long term? that sort of stuff. It doesn't have to be directly on this PR (it could be branched off)

I tried the SDK: it removes about 59% of our transport/execution code, keeps the dashboard UI unchanged, and adds no resolved dependencies on the current Aspire baseline. The tradeoff is weaker cleanup on malformed responses (some failure paths can leave a session or response undisposed) and less detailed errors. For user-triggered developer commands, I think that’s worth accepting in exchange for SDK-owned protocol maintenance.
What do you think @aaronpowell? I can adopt it in current PR as well.

@aaronpowell

Copy link
Copy Markdown
Member

less detailed errors. For user-triggered developer commands,

But won't we have those errors in the Aspire dashboard as traces anyway?

Replace handwritten protocol handling with ModelContextProtocol.Core while preserving dashboard inputs, endpoint resolution, authentication boundaries, and bounded cleanup. Align MCP versions centrally and document accepted SDK failure-path limitations and actual dashboard diagnostics.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@tommasodotNET

Copy link
Copy Markdown
Contributor Author

yeah you r right @aaronpowell. i've pushed it.

@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

Code Coverage

Package Line Rate Branch Rate Complexity Health
CommunityToolkit.Aspire.Bitwarden.SecretManager 52% 38% 36 ❌
CommunityToolkit.Aspire.Chroma 62% 51% 211 ➖
CommunityToolkit.Aspire.DuckDB.NET.Data 64% 77% 28 ➖
CommunityToolkit.Aspire.GoFeatureFlag 100% 97% 36 ✔
CommunityToolkit.Aspire.Hosting.ActiveMQ 88% 48% 58 ✔
CommunityToolkit.Aspire.Hosting.ActiveMQ.MassTransit 0% 0% 217 ❌
CommunityToolkit.Aspire.Hosting.Adminer 98% 70% 12 ✔
CommunityToolkit.Aspire.Hosting.Agents 89% 78% 1223 ✔
CommunityToolkit.Aspire.Hosting.Azure.Dapr 29% 5% 35 ❌
CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis 56% 46% 26 ❌
CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder 86% 83% 18 ✔
CommunityToolkit.Aspire.Hosting.Azure.Extensions 64% 30% 27 ➖
CommunityToolkit.Aspire.Hosting.Bitwarden.SecretManager 59% 51% 700 ❌
CommunityToolkit.Aspire.Hosting.Chroma 100% 83% 13 ✔
CommunityToolkit.Aspire.Hosting.Dapr 47% 28% 447 ❌
CommunityToolkit.Aspire.Hosting.DbGate 97% 62% 12 ✔
CommunityToolkit.Aspire.Hosting.Dbx 92% 59% 22 ✔
CommunityToolkit.Aspire.Hosting.Deno 96% 85% 24 ✔
CommunityToolkit.Aspire.Hosting.DuckDB 98% 90% 10 ✔
CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions 100% 94% 21 ✔
CommunityToolkit.Aspire.Hosting.Flagd 100% 100% 16 ✔
CommunityToolkit.Aspire.Hosting.Floci 97% 86% 425 ✔
CommunityToolkit.Aspire.Hosting.Flyway 100% 100% 3 ✔
CommunityToolkit.Aspire.Hosting.GoFeatureFlag 80% 50% 24 ✔
CommunityToolkit.Aspire.Hosting.Java 87% 75% 164 ✔
CommunityToolkit.Aspire.Hosting.JavaScript.Extensions 92% 83% 185 ✔
CommunityToolkit.Aspire.Hosting.K3s 81% 71% 726 ✔
CommunityToolkit.Aspire.Hosting.k6 72% 44% 13 ➖
CommunityToolkit.Aspire.Hosting.Keycloak.Extensions 100% 100% 11 ✔
CommunityToolkit.Aspire.Hosting.Kind 91% 80% 525 ✔
CommunityToolkit.Aspire.Hosting.KurrentDB 97% 88% 19 ✔
CommunityToolkit.Aspire.Hosting.LavinMQ 91% 83% 18 ✔
CommunityToolkit.Aspire.Hosting.LavinMQ.MassTransit 0% 0% 217 ❌
CommunityToolkit.Aspire.Hosting.Listmonk 100% 100% 24 ✔
CommunityToolkit.Aspire.Hosting.Logto 73% 67% 24 ➖
CommunityToolkit.Aspire.Hosting.MailPit 92% 100% 13 ✔
CommunityToolkit.Aspire.Hosting.McpInspector 85% 60% 80 ✔
CommunityToolkit.Aspire.Hosting.Meilisearch 95% 80% 29 ✔
CommunityToolkit.Aspire.Hosting.MongoDB.Extensions 88% 81% 18 ✔
CommunityToolkit.Aspire.Hosting.Mosquitto 97% 67% 17 ✔
CommunityToolkit.Aspire.Hosting.MySql.Extensions 94% 88% 36 ✔
CommunityToolkit.Aspire.Hosting.Ngrok 56% 43% 95 ❌
CommunityToolkit.Aspire.Hosting.Ollama 79% 67% 265 ➖
CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector 90% 85% 28 ✔
CommunityToolkit.Aspire.Hosting.PapercutSmtp 100% 100% 9 ✔
CommunityToolkit.Aspire.Hosting.Perl 94% 86% 990 ✔
CommunityToolkit.Aspire.Hosting.Posta 98% 80% 78 ✔
CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions 91% 87% 46 ✔
CommunityToolkit.Aspire.Hosting.PowerShell 76% 59% 83 ➖
CommunityToolkit.Aspire.Hosting.Python.Extensions 46% 31% 44 ❌
CommunityToolkit.Aspire.Hosting.RavenDB 69% 49% 105 ➖
CommunityToolkit.Aspire.Hosting.Redis.Extensions 86% 67% 20 ✔
CommunityToolkit.Aspire.Hosting.RedPanda 99% 75% 46 ✔
CommunityToolkit.Aspire.Hosting.Rust 96% 90% 13 ✔
CommunityToolkit.Aspire.Hosting.RustFs 88% 66% 102 ✔
CommunityToolkit.Aspire.Hosting.SeaweedFS 88% 82% 44 ✔
CommunityToolkit.Aspire.Hosting.Sftp 91% 62% 15 ✔
CommunityToolkit.Aspire.Hosting.Solr 100% 100% 15 ✔
CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects 68% 59% 137 ➖
CommunityToolkit.Aspire.Hosting.Sqlite 99% 93% 21 ✔
CommunityToolkit.Aspire.Hosting.SqlServer.Extensions 85% 79% 40 ✔
CommunityToolkit.Aspire.Hosting.Squad 94% 80% 80 ✔
CommunityToolkit.Aspire.Hosting.StableDiffusionCpp 55% 47% 82 ❌
CommunityToolkit.Aspire.Hosting.Stripe 50% 17% 117 ❌
CommunityToolkit.Aspire.Hosting.SurrealDb 89% 74% 191 ✔
CommunityToolkit.Aspire.Hosting.Umami 100% 75% 7 ✔
CommunityToolkit.Aspire.Hosting.Zitadel 97% 86% 27 ✔
CommunityToolkit.Aspire.KurrentDB 97% 95% 25 ✔
CommunityToolkit.Aspire.Logto.Client 53% 62% 38 ❌
CommunityToolkit.Aspire.MassTransit.RabbitMQ 100% 100% 22 ✔
CommunityToolkit.Aspire.Meilisearch 97% 93% 30 ✔
CommunityToolkit.Aspire.Microsoft.Data.Sqlite 89% 85% 22 ✔
CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite 68% 68% 109 ➖
CommunityToolkit.Aspire.OllamaSharp 77% 74% 59 ➖
CommunityToolkit.Aspire.Posta 51% 61% 224 ❌
CommunityToolkit.Aspire.RavenDB.Client 90% 78% 67 ✔
CommunityToolkit.Aspire.SeaweedFS.Client 88% 84% 76 ✔
CommunityToolkit.Aspire.Sftp 87% 82% 38 ✔
CommunityToolkit.Aspire.SurrealDb 84% 75% 30 ✔
Summary 79% (18081 / 22939) 65% (5769 / 8853) 9203 ➖

@aaronpowell
aaronpowell merged commit c52896f into main Nov 5, 2026
169 checks passed
@aaronpowell
aaronpowell deleted the tommasodotnet-agent-integration-port branch November 5, 2026 22:45

This branch was previously deployed

1 inactive deployment
azure-artifacts — d33145c7 Deployed Nov 5, 2026 by tommasodotNET via publish-azure-artifacts #4876
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Aspire agent awareness

3 participants