Skip to main content

HTTP+JSON routes

ess/http.yaml binds operations of the specification to A2A's HTTP+JSON paths (ess-http/1), and ess generate --kind openapi --http projects it to generated/openapi-http/openapi/a2a-agent.yaml. task check holds that document's (method, path) pairs to upstream/openapi/a2a.openapi.yaml, the paths A2A's a2a.proto declares, and fails on a difference ess/http-unmapped.tsv does not name, or on a named one that no longer differs.

9 of A2A's 22 routes are served at their path. The other 13 are listed below with the reason ESS cannot serve them there, and so are the 12 projected routes that are not A2A's.

Served at A2A's pathโ€‹

MethodPathOperation
POST/message:sendcommand a2a.tasks.SendMessage
POST/message:streamcommand a2a.tasks.SendStreamingMessage
GET/tasks/{id}command a2a.tasks.GetTask
GET/tasksview a2a.tasks.Tasks
POST/tasks/{taskId}/pushNotificationConfigscommand a2a.tasks.CreateTaskPushNotificationConfig
GET/tasks/{taskId}/pushNotificationConfigs/{id}command a2a.tasks.GetTaskPushNotificationConfig
GET/tasks/{taskId}/pushNotificationConfigscommand a2a.tasks.ListTaskPushNotificationConfigs
DELETE/tasks/{taskId}/pushNotificationConfigs/{id}command a2a.tasks.DeleteTaskPushNotificationConfig
GET/extendedAgentCardcommand a2a.discovery.GetExtendedAgentCard

A2A routes not served at their pathโ€‹

MethodPathReason
GET/{tenant}/extendedAgentCardUNMAPPED (ESS gap): the /{tenant}/ additional binding; ESS-HTTP-005 an operation has one route, ESS-HTTP-009 Optional<String> tenant cannot be a path segment, ESS-HTTP-011 since a literal takes no precedence over a variable: overlaps get /tasks/{id} (ess/http.yaml)
POST/{tenant}/message:sendUNMAPPED (ESS gap): the /{tenant}/ additional binding; ESS-HTTP-005 an operation has one route, ESS-HTTP-009 Optional<String> tenant cannot be a path segment (ess/http.yaml)
POST/{tenant}/message:streamUNMAPPED (ESS gap): the /{tenant}/ additional binding; ESS-HTTP-005 an operation has one route, ESS-HTTP-009 Optional<String> tenant cannot be a path segment (ess/http.yaml)
GET/{tenant}/tasksUNMAPPED (ESS gap): the /{tenant}/ additional binding; ESS-HTTP-005 an operation has one route, ESS-HTTP-009 Optional<String> tenant cannot be a path segment, ESS-HTTP-011 since a literal takes no precedence over a variable: overlaps get /tasks/{id} (ess/http.yaml)
GET/{tenant}/tasks/{id}UNMAPPED (ESS gap): the /{tenant}/ additional binding; ESS-HTTP-005 an operation has one route, ESS-HTTP-009 Optional<String> tenant cannot be a path segment, ESS-HTTP-011 since a literal takes no precedence over a variable: overlaps get /tasks/{taskId}/pushNotificationConfigs and get /views/tasks/pushNotificationConfigs (ess/http.yaml)
POST/{tenant}/tasks/{id}:cancelUNMAPPED (ESS gap): the /{tenant}/ additional binding; ESS-HTTP-005 an operation has one route, ESS-HTTP-009 Optional<String> tenant cannot be a path segment, ESS-HTTP-007 {id}:verb is not a whole variable (ess/http.yaml)
GET/{tenant}/tasks/{id}:subscribeUNMAPPED (ESS gap): the /{tenant}/ additional binding; ESS-HTTP-005 an operation has one route, ESS-HTTP-009 Optional<String> tenant cannot be a path segment, ESS-HTTP-007 {id}:verb is not a whole variable (ess/http.yaml)
GET/{tenant}/tasks/{taskId}/pushNotificationConfigsUNMAPPED (ESS gap): the /{tenant}/ additional binding; ESS-HTTP-005 an operation has one route, ESS-HTTP-009 Optional<String> tenant cannot be a path segment, ESS-HTTP-011 since a literal takes no precedence over a variable: overlaps get /tasks/{taskId}/pushNotificationConfigs/{id} (ess/http.yaml)
POST/{tenant}/tasks/{taskId}/pushNotificationConfigsUNMAPPED (ESS gap): the /{tenant}/ additional binding; ESS-HTTP-005 an operation has one route, ESS-HTTP-009 Optional<String> tenant cannot be a path segment (ess/http.yaml)
GET/{tenant}/tasks/{taskId}/pushNotificationConfigs/{id}UNMAPPED (ESS gap): the /{tenant}/ additional binding; ESS-HTTP-005 an operation has one route, ESS-HTTP-009 Optional<String> tenant cannot be a path segment (ess/http.yaml)
DELETE/{tenant}/tasks/{taskId}/pushNotificationConfigs/{id}UNMAPPED (ESS gap): the /{tenant}/ additional binding; ESS-HTTP-005 an operation has one route, ESS-HTTP-009 Optional<String> tenant cannot be a path segment (ess/http.yaml)
POST/tasks/{id}:cancelUNMAPPED (ESS gap): ESS-HTTP-007 a variable is a whole segment, so {id}:verb is refused; served on its derived route (ess/http.yaml)
GET/tasks/{id}:subscribeUNMAPPED (ESS gap): ESS-HTTP-007 a variable is a whole segment, so {id}:verb is refused; served on its derived route (ess/http.yaml)

Projected routes that are not A2A'sโ€‹

MethodPathReason
POST/tasks/commands/tasks:cancelStand-in for UNMAPPED post /tasks/{id}:cancel: derived route of a2a.tasks.CancelTask (ESS-HTTP-007)
POST/tasks/commands/tasks:subscribeStand-in for UNMAPPED get /tasks/{id}:subscribe: derived route of a2a.tasks.SubscribeToTask (ESS-HTTP-007)
POST/tasks/commands/tasks:completeNot an A2A operation: agent-side lifecycle command (ess/domains/tasks.yaml), on its derived route
POST/tasks/commands/tasks:failNot an A2A operation: agent-side lifecycle command (ess/domains/tasks.yaml), on its derived route
POST/tasks/commands/tasks:rejectNot an A2A operation: agent-side lifecycle command (ess/domains/tasks.yaml), on its derived route
POST/tasks/commands/tasks:require_authNot an A2A operation: agent-side lifecycle command (ess/domains/tasks.yaml), on its derived route
POST/tasks/commands/tasks:require_inputNot an A2A operation: agent-side lifecycle command (ess/domains/tasks.yaml), on its derived route
POST/tasks/commands/tasks:update_artifactNot an A2A operation: agent-side lifecycle command (ess/domains/tasks.yaml), on its derived route
POST/tasks/commands/tasks:workNot an A2A operation: agent-side lifecycle command (ess/domains/tasks.yaml), on its derived route
GET/tasks/views/allPushNotificationConfigsNot an A2A operation: observation view (ess/domains/tasks.yaml views), on its derived route
GET/tasks/views/allTasksNot an A2A operation: observation view (ess/domains/tasks.yaml views), on its derived route
GET/views/tasks/pushNotificationConfigsNot an A2A operation: view a2a.tasks.TaskPushNotificationConfigs, moved off its derived route, which overlaps get /tasks/{taskId}/pushNotificationConfigs (ESS-HTTP-011)