# Profile v2 (/docs/a2a/profile/v2)



```http
POST /v1/a2a/agents/support
A2A-Version: 1.0
A2A-Extensions: https://docs.nylorun.com/a2a/interactions/v1, https://docs.nylorun.com/a2a/progress/v1
```

A2A 1.0 leaves some questions open, and keeps agents opaque by design. The
Nylorun profile answers those questions for every Agent the Runtime serves,
and its extensions carry what a client shows a person: approvals, plan steps,
cost, a trace id, and file versions.

The profile is versioned: a change to any row is a new version. Version 2
keeps every row of version 1, adds three extensions, and adds the rules marked
v2 below. Every extension is declared with `required: false`, so an Agent that
serves v2 also serves a v1 client and a plain A2A 1.0 client.

## The rules [#the-rules]

| Question A2A leaves open                 | Nylorun's answer                                                                                                                                                               | Since                       |
| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------- |
| Which interrupted state an approval uses | `AUTH_REQUIRED`. A question uses `INPUT_REQUIRED`. A missing connection uses `AUTH_REQUIRED` with kind `connection`.                                                           | v1; kind `connection` in v2 |
| How an approval is expressed             | Only through [`interactions/v1`](/docs/a2a/interactions/v1) metadata. Text never approves.                                                                                     | v1                          |
| A step whose outcome was lost            | The task stays `WORKING`, with `uncertain` under [`effects/v1`](/docs/a2a/effects/v1).                                                                                         | v1                          |
| A new message in a busy context          | Queued, and answered with the task that will take it. A message with `delivery: "reject"` in its `metadata` gets `UnsupportedOperationError`, reason `CONTEXT_BUSY`, as in v1. | v2                          |
| Task id                                  | One per turn, made from the context and the turn. Opaque to callers.                                                                                                           | v1                          |
| What is visible while working            | States, step text, and plan steps under [`progress/v1`](/docs/a2a/progress/v1). Never tool calls, arguments, results, or delegations.                                          | v1; plan steps in v2        |
| Who the caller acts for                  | The subject the caller authenticated as.                                                                                                                                       | v2                          |

## The extensions [#the-extensions]

The Agent Card declares each extension with `required: false`. A client
activates the ones it wants with the `A2A-Extensions` request header, a
comma-separated list of URIs, and the Agent echoes the ones it activated in
the same response header. Extension data travels in `metadata`, keyed by the
extension's URI. A message that carries extension data lists the URI in its
`extensions`.

| Extension URI                                                               | Carries                                                                                                                         | On                            | Since |
| --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | ----- |
| [`https://docs.nylorun.com/a2a/interactions/v1`](/docs/a2a/interactions/v1) | An open interaction (`interactionId`, `kind`, `prompt`, `detail`); the caller's answer (`interactionId`, `approved` or `value`) | Status message; reply message | v1    |
| [`https://docs.nylorun.com/a2a/effects/v1`](/docs/a2a/effects/v1)           | `uncertain`: the id of the effect whose outcome was lost                                                                        | Status update                 | v1    |
| [`https://docs.nylorun.com/a2a/progress/v1`](/docs/a2a/progress/v1)         | The agent's plan: up to 20 steps, each with a label, a state, and a note                                                        | Status update                 | v2    |
| [`https://docs.nylorun.com/a2a/telemetry/v1`](/docs/a2a/telemetry/v1)       | Totals (`steps`, `tokens`, `costUsd`) and the turn's trace id                                                                   | Terminal status update        | v2    |
| [`https://docs.nylorun.com/a2a/files/v1`](/docs/a2a/files/v1)               | Each artifact's kind, version, size, `sha256`, and its path in the agent's outputs                                              | Artifact                      | v2    |

## What a v2 Agent serves [#what-a-v2-agent-serves]

| A2A operation                             | v2                                                                                                                                                                                                   |
| ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Bindings                                  | JSON-RPC, A2A 1.0, listed in the card's `supportedInterfaces`. Not HTTP+JSON, gRPC, or 0.3.                                                                                                          |
| `SendMessage`, `GetTask`, `CancelTask`    | Yes. A blocking `SendMessage` waits up to the Runtime limit `a2aWaitMs`, 5 minutes by default, then answers with the task still `WORKING`.                                                           |
| `SendStreamingMessage`, `SubscribeToTask` | No: the card says `streaming: false`. Updates reach callers by push.                                                                                                                                 |
| `ListTasks`                               | Yes, scoped to the caller's subject and the Agent, filtered by `contextId`, state, and `statusTimestampAfter`, latest status change first.                                                           |
| Push notification configs                 | Yes, when the Runtime has a push secret: delivered at least once, signed with Standard Webhooks, to hosts the Runtime allows. Retries last up to 24 hours. See [Push notifications](/docs/a2a/push). |
| `url` file parts, in and out              | Yes. See [`files/v1`](/docs/a2a/files/v1).                                                                                                                                                           |
| `GetExtendedAgentCard`                    | No.                                                                                                                                                                                                  |

The full statement, with every documented choice, is on
[Conformance](/docs/a2a/conformance).

## What a client gets [#what-a-client-gets]

| Tier       | Agent                                                                              | What the client gets                                                                                                                           |
| ---------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| Profile v2 | An Agent on `@nylorun/runtime` 0.37.0-beta or later, with the extensions activated | Typed approvals and connections, plan steps, cost, a trace id, and file versions                                                               |
| Core       | Any A2A 1.0 agent, or an Agent called with no extension activated                  | States, messages, and artifacts. Approvals and connections arrive as text questions, and a text reply does not approve. No plan steps or cost. |

`createA2aClient()` from `@nylorun/agents/a2a` activates all five extensions by
default. See [A2A client](/docs/a2a/client).

## Next step [#next-step]

<Cards>
  <Card title="interactions/v1" description="Approvals, questions, and connections on a task." href="/docs/a2a/interactions/v1" />

  <Card title="Push notifications" description="Receive each update as a signed delivery." href="/docs/a2a/push" />
</Cards>
