@google/adk 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/a2a/a2a_event.js +317 -0
  3. package/dist/cjs/a2a/a2a_remote_agent.js +174 -0
  4. package/dist/cjs/a2a/a2a_remote_agent_run_processor.js +198 -0
  5. package/dist/cjs/a2a/a2a_remote_agent_utils.js +165 -0
  6. package/dist/cjs/a2a/agent_card.js +380 -0
  7. package/dist/cjs/a2a/agent_executor.js +221 -0
  8. package/dist/cjs/a2a/agent_to_a2a.js +115 -0
  9. package/dist/cjs/a2a/event_converter_utils.js +201 -0
  10. package/dist/cjs/a2a/event_processor_utils.js +180 -0
  11. package/dist/cjs/a2a/executor_context.js +53 -0
  12. package/dist/cjs/a2a/metadata_converter_utils.js +126 -0
  13. package/dist/cjs/a2a/part_converter_utils.js +47 -34
  14. package/dist/cjs/agents/base_agent.js +3 -3
  15. package/dist/cjs/{tools/tool_context.js → agents/context.js} +70 -15
  16. package/dist/cjs/agents/functions.js +2 -2
  17. package/dist/cjs/agents/llm_agent.js +38 -674
  18. package/dist/cjs/agents/processors/agent_transfer_llm_request_processor.js +132 -0
  19. package/dist/cjs/agents/processors/basic_llm_request_processor.js +68 -0
  20. package/dist/cjs/agents/processors/code_execution_request_processor.js +389 -0
  21. package/dist/cjs/agents/{content_processor_utils.js → processors/content_processor_utils.js} +21 -2
  22. package/dist/cjs/agents/processors/content_request_processor.js +87 -0
  23. package/dist/cjs/agents/processors/context_compactor_request_processor.js +61 -0
  24. package/dist/cjs/agents/processors/identity_llm_request_processor.js +54 -0
  25. package/dist/cjs/agents/processors/instructions_llm_request_processor.js +85 -0
  26. package/dist/cjs/agents/processors/request_confirmation_llm_request_processor.js +165 -0
  27. package/dist/cjs/artifacts/file_artifact_service.js +35 -4
  28. package/dist/cjs/common.js +48 -7
  29. package/dist/cjs/context/base_context_compactor.js +27 -0
  30. package/dist/cjs/context/summarizers/base_summarizer.js +27 -0
  31. package/dist/cjs/context/summarizers/llm_summarizer.js +93 -0
  32. package/dist/cjs/context/token_based_context_compactor.js +135 -0
  33. package/dist/cjs/context/truncating_context_compactor.js +58 -0
  34. package/dist/cjs/events/compacted_event.js +53 -0
  35. package/dist/cjs/index.js +113 -53
  36. package/dist/cjs/index.js.map +7 -0
  37. package/dist/cjs/memory/in_memory_memory_service.js +1 -1
  38. package/dist/cjs/models/llm_response.js +2 -0
  39. package/dist/cjs/plugins/base_plugin.js +1 -1
  40. package/dist/cjs/runner/runner.js +20 -11
  41. package/dist/cjs/sessions/database_session_service.js +4 -1
  42. package/dist/cjs/sessions/db/operations.js +25 -23
  43. package/dist/cjs/sessions/state.js +2 -2
  44. package/dist/cjs/tools/agent_tool.js +6 -5
  45. package/dist/cjs/tools/base_tool.js +3 -0
  46. package/dist/cjs/tools/base_toolset.js +13 -3
  47. package/dist/cjs/tools/exit_loop_tool.js +63 -0
  48. package/dist/cjs/tools/load_artifacts_tool.js +188 -0
  49. package/dist/cjs/tools/load_memory_tool.js +107 -0
  50. package/dist/cjs/tools/mcp/mcp_toolset.js +9 -5
  51. package/dist/cjs/tools/preload_memory_tool.js +109 -0
  52. package/dist/cjs/utils/logger.js +62 -54
  53. package/dist/cjs/version.js +1 -1
  54. package/dist/esm/a2a/a2a_event.js +269 -0
  55. package/dist/esm/a2a/a2a_remote_agent.js +148 -0
  56. package/dist/esm/a2a/a2a_remote_agent_run_processor.js +175 -0
  57. package/dist/esm/a2a/a2a_remote_agent_utils.js +131 -0
  58. package/dist/esm/a2a/agent_card.js +340 -0
  59. package/dist/esm/a2a/agent_executor.js +202 -0
  60. package/dist/esm/a2a/agent_to_a2a.js +80 -0
  61. package/dist/esm/a2a/event_converter_utils.js +187 -0
  62. package/dist/esm/a2a/event_processor_utils.js +159 -0
  63. package/dist/esm/a2a/executor_context.js +23 -0
  64. package/dist/esm/a2a/metadata_converter_utils.js +91 -0
  65. package/dist/esm/a2a/part_converter_utils.js +49 -34
  66. package/dist/esm/agents/base_agent.js +3 -3
  67. package/dist/{web/tools/tool_context.js → esm/agents/context.js} +66 -11
  68. package/dist/esm/agents/functions.js +2 -2
  69. package/dist/esm/agents/llm_agent.js +31 -683
  70. package/dist/esm/agents/processors/agent_transfer_llm_request_processor.js +101 -0
  71. package/dist/esm/agents/processors/basic_llm_request_processor.js +37 -0
  72. package/dist/esm/agents/processors/code_execution_request_processor.js +363 -0
  73. package/dist/esm/agents/{content_processor_utils.js → processors/content_processor_utils.js} +23 -2
  74. package/dist/esm/agents/processors/content_request_processor.js +59 -0
  75. package/dist/esm/agents/processors/context_compactor_request_processor.js +31 -0
  76. package/dist/esm/agents/processors/identity_llm_request_processor.js +23 -0
  77. package/dist/esm/agents/processors/instructions_llm_request_processor.js +54 -0
  78. package/dist/esm/agents/processors/request_confirmation_llm_request_processor.js +140 -0
  79. package/dist/esm/artifacts/file_artifact_service.js +30 -3
  80. package/dist/esm/common.js +44 -10
  81. package/dist/esm/context/base_context_compactor.js +5 -0
  82. package/dist/esm/context/summarizers/base_summarizer.js +5 -0
  83. package/dist/esm/context/summarizers/llm_summarizer.js +65 -0
  84. package/dist/esm/context/token_based_context_compactor.js +105 -0
  85. package/dist/esm/context/truncating_context_compactor.js +28 -0
  86. package/dist/esm/events/compacted_event.js +22 -0
  87. package/dist/esm/index.js +119 -18
  88. package/dist/esm/index.js.map +7 -0
  89. package/dist/esm/memory/in_memory_memory_service.js +1 -1
  90. package/dist/esm/models/llm_response.js +2 -0
  91. package/dist/esm/plugins/base_plugin.js +1 -1
  92. package/dist/esm/runner/runner.js +18 -10
  93. package/dist/esm/sessions/database_session_service.js +4 -1
  94. package/dist/esm/sessions/db/operations.js +32 -18
  95. package/dist/esm/sessions/state.js +2 -2
  96. package/dist/esm/tools/agent_tool.js +6 -5
  97. package/dist/esm/tools/base_tool.js +3 -0
  98. package/dist/esm/tools/base_toolset.js +11 -2
  99. package/dist/esm/tools/exit_loop_tool.js +32 -0
  100. package/dist/esm/tools/load_artifacts_tool.js +159 -0
  101. package/dist/esm/tools/load_memory_tool.js +78 -0
  102. package/dist/esm/tools/mcp/mcp_toolset.js +9 -5
  103. package/dist/esm/tools/preload_memory_tool.js +80 -0
  104. package/dist/esm/utils/logger.js +52 -54
  105. package/dist/esm/version.js +1 -1
  106. package/dist/types/a2a/a2a_event.d.ts +139 -0
  107. package/dist/types/a2a/a2a_remote_agent.d.ts +63 -0
  108. package/dist/types/a2a/a2a_remote_agent_run_processor.d.ts +31 -0
  109. package/dist/types/a2a/a2a_remote_agent_utils.d.ts +38 -0
  110. package/dist/types/a2a/agent_card.d.ts +23 -0
  111. package/dist/types/a2a/agent_executor.d.ts +52 -0
  112. package/dist/types/a2a/agent_to_a2a.d.ts +45 -0
  113. package/dist/types/a2a/event_converter_utils.d.ts +20 -0
  114. package/dist/types/a2a/event_processor_utils.d.ts +24 -0
  115. package/dist/types/a2a/executor_context.d.ts +33 -0
  116. package/dist/types/a2a/metadata_converter_utils.d.ts +63 -0
  117. package/dist/types/a2a/part_converter_utils.d.ts +4 -3
  118. package/dist/types/agents/base_agent.d.ts +2 -2
  119. package/dist/types/{tools/tool_context.d.ts → agents/context.d.ts} +43 -8
  120. package/dist/types/agents/llm_agent.d.ts +14 -31
  121. package/dist/types/agents/loop_agent.d.ts +1 -1
  122. package/dist/types/agents/processors/agent_transfer_llm_request_processor.d.ts +18 -0
  123. package/dist/types/agents/{base_llm_processor.d.ts → processors/base_llm_processor.d.ts} +4 -4
  124. package/dist/types/agents/processors/basic_llm_request_processor.d.ts +13 -0
  125. package/dist/types/agents/processors/code_execution_request_processor.d.ts +34 -0
  126. package/dist/types/agents/{content_processor_utils.d.ts → processors/content_processor_utils.d.ts} +1 -1
  127. package/dist/types/agents/processors/content_request_processor.d.ts +13 -0
  128. package/dist/types/agents/processors/context_compactor_request_processor.d.ts +22 -0
  129. package/dist/types/agents/processors/identity_llm_request_processor.d.ts +13 -0
  130. package/dist/types/agents/processors/instructions_llm_request_processor.d.ts +16 -0
  131. package/dist/types/agents/processors/request_confirmation_llm_request_processor.d.ts +13 -0
  132. package/dist/types/artifacts/file_artifact_service.d.ts +4 -0
  133. package/dist/types/auth/credential_service/base_credential_service.d.ts +3 -3
  134. package/dist/types/auth/credential_service/in_memory_credential_service.d.ts +3 -3
  135. package/dist/types/common.d.ts +20 -5
  136. package/dist/types/context/base_context_compactor.d.ts +24 -0
  137. package/dist/types/context/summarizers/base_summarizer.d.ts +19 -0
  138. package/dist/types/context/summarizers/llm_summarizer.d.ts +23 -0
  139. package/dist/types/context/token_based_context_compactor.d.ts +33 -0
  140. package/dist/types/context/truncating_context_compactor.d.ts +24 -0
  141. package/dist/types/events/compacted_event.d.ts +33 -0
  142. package/dist/types/index.d.ts +8 -0
  143. package/dist/types/models/llm_response.d.ts +5 -1
  144. package/dist/types/plugins/base_plugin.d.ts +12 -13
  145. package/dist/types/plugins/logging_plugin.d.ts +9 -10
  146. package/dist/types/plugins/plugin_manager.d.ts +9 -10
  147. package/dist/types/plugins/security_plugin.d.ts +2 -2
  148. package/dist/types/runner/runner.d.ts +13 -0
  149. package/dist/types/sessions/database_session_service.d.ts +2 -1
  150. package/dist/types/sessions/db/operations.d.ts +3 -4
  151. package/dist/types/tools/base_tool.d.ts +3 -3
  152. package/dist/types/tools/base_toolset.d.ts +12 -3
  153. package/dist/types/tools/exit_loop_tool.d.ts +24 -0
  154. package/dist/types/tools/forwarding_artifact_service.d.ts +2 -2
  155. package/dist/types/tools/function_tool.d.ts +2 -2
  156. package/dist/types/tools/load_artifacts_tool.d.ts +21 -0
  157. package/dist/types/tools/load_memory_tool.d.ts +22 -0
  158. package/dist/types/tools/mcp/mcp_toolset.d.ts +1 -1
  159. package/dist/types/tools/preload_memory_tool.d.ts +23 -0
  160. package/dist/types/utils/logger.d.ts +5 -9
  161. package/dist/types/version.d.ts +1 -1
  162. package/dist/web/a2a/a2a_event.js +269 -0
  163. package/dist/web/a2a/a2a_remote_agent.js +193 -0
  164. package/dist/web/a2a/a2a_remote_agent_run_processor.js +175 -0
  165. package/dist/web/a2a/a2a_remote_agent_utils.js +131 -0
  166. package/dist/web/a2a/agent_card.js +340 -0
  167. package/dist/web/a2a/agent_executor.js +216 -0
  168. package/dist/web/a2a/agent_to_a2a.js +80 -0
  169. package/dist/web/a2a/event_converter_utils.js +201 -0
  170. package/dist/web/a2a/event_processor_utils.js +168 -0
  171. package/dist/web/a2a/executor_context.js +23 -0
  172. package/dist/web/a2a/metadata_converter_utils.js +108 -0
  173. package/dist/web/a2a/part_converter_utils.js +49 -34
  174. package/dist/web/agents/base_agent.js +3 -3
  175. package/dist/{esm/tools/tool_context.js → web/agents/context.js} +66 -11
  176. package/dist/web/agents/functions.js +2 -2
  177. package/dist/web/agents/llm_agent.js +31 -661
  178. package/dist/web/agents/processors/agent_transfer_llm_request_processor.js +100 -0
  179. package/dist/web/agents/processors/basic_llm_request_processor.js +71 -0
  180. package/dist/web/agents/processors/code_execution_request_processor.js +365 -0
  181. package/dist/web/agents/{content_processor_utils.js → processors/content_processor_utils.js} +22 -2
  182. package/dist/web/agents/processors/content_request_processor.js +77 -0
  183. package/dist/web/agents/processors/context_compactor_request_processor.js +49 -0
  184. package/dist/web/agents/processors/identity_llm_request_processor.js +41 -0
  185. package/dist/web/agents/processors/instructions_llm_request_processor.js +72 -0
  186. package/dist/web/agents/processors/request_confirmation_llm_request_processor.js +158 -0
  187. package/dist/web/artifacts/file_artifact_service.js +30 -3
  188. package/dist/web/common.js +44 -10
  189. package/dist/web/context/base_context_compactor.js +5 -0
  190. package/dist/web/context/summarizers/base_summarizer.js +5 -0
  191. package/dist/web/context/summarizers/llm_summarizer.js +74 -0
  192. package/dist/web/context/token_based_context_compactor.js +105 -0
  193. package/dist/web/context/truncating_context_compactor.js +28 -0
  194. package/dist/web/events/compacted_event.js +40 -0
  195. package/dist/web/index.js +13 -18
  196. package/dist/web/index.js.map +7 -0
  197. package/dist/web/memory/in_memory_memory_service.js +1 -1
  198. package/dist/web/models/llm_response.js +2 -0
  199. package/dist/web/plugins/base_plugin.js +1 -1
  200. package/dist/web/runner/runner.js +18 -10
  201. package/dist/web/sessions/database_session_service.js +4 -1
  202. package/dist/web/sessions/db/operations.js +32 -18
  203. package/dist/web/sessions/state.js +2 -2
  204. package/dist/web/tools/agent_tool.js +6 -5
  205. package/dist/web/tools/base_tool.js +3 -0
  206. package/dist/web/tools/base_toolset.js +11 -2
  207. package/dist/web/tools/exit_loop_tool.js +32 -0
  208. package/dist/web/tools/load_artifacts_tool.js +150 -0
  209. package/dist/web/tools/load_memory_tool.js +77 -0
  210. package/dist/web/tools/mcp/mcp_toolset.js +27 -5
  211. package/dist/web/tools/preload_memory_tool.js +75 -0
  212. package/dist/web/utils/logger.js +52 -54
  213. package/dist/web/version.js +1 -1
  214. package/package.json +7 -4
  215. package/dist/cjs/agents/callback_context.js +0 -101
  216. package/dist/esm/agents/callback_context.js +0 -71
  217. package/dist/types/agents/callback_context.d.ts +0 -42
  218. package/dist/web/agents/callback_context.js +0 -71
  219. /package/dist/cjs/agents/{base_llm_processor.js → processors/base_llm_processor.js} +0 -0
  220. /package/dist/esm/agents/{base_llm_processor.js → processors/base_llm_processor.js} +0 -0
  221. /package/dist/web/agents/{base_llm_processor.js → processors/base_llm_processor.js} +0 -0
@@ -0,0 +1,148 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import {
7
+ AGENT_CARD_PATH
8
+ } from "@a2a-js/sdk";
9
+ import { ClientFactory } from "@a2a-js/sdk/client";
10
+ import { BaseAgent } from "../agents/base_agent.js";
11
+ import { createEvent } from "../events/event.js";
12
+ import { randomUUID } from "../utils/env_aware_utils.js";
13
+ import { logger } from "../utils/logger.js";
14
+ import { MessageRole } from "./a2a_event.js";
15
+ import { A2ARemoteAgentRunProcessor } from "./a2a_remote_agent_run_processor.js";
16
+ import {
17
+ getUserFunctionCallAt,
18
+ toMissingRemoteSessionParts
19
+ } from "./a2a_remote_agent_utils.js";
20
+ import { resolveAgentCard } from "./agent_card.js";
21
+ import { toAdkEvent } from "./event_converter_utils.js";
22
+ import { getA2ASessionMetadata } from "./metadata_converter_utils.js";
23
+ import { toA2AParts } from "./part_converter_utils.js";
24
+ class RemoteA2AAgent extends BaseAgent {
25
+ constructor(a2aConfig) {
26
+ super(a2aConfig);
27
+ this.a2aConfig = a2aConfig;
28
+ this.isInitialized = false;
29
+ if (!a2aConfig.agentCard) {
30
+ throw new Error("AgentCard must be provided");
31
+ }
32
+ }
33
+ async init() {
34
+ if (this.isInitialized) {
35
+ return;
36
+ }
37
+ this.card = await resolveAgentCard(this.a2aConfig.agentCard);
38
+ const factory = this.a2aConfig.clientFactory || new ClientFactory();
39
+ this.client = await factory.createFromAgentCard(this.card);
40
+ this.isInitialized = true;
41
+ }
42
+ async *runAsyncImpl(context) {
43
+ var _a, _b;
44
+ await this.init();
45
+ try {
46
+ const events = context.session.events;
47
+ if (events.length === 0) {
48
+ throw new Error("No events in session to send");
49
+ }
50
+ const userFnCall = getUserFunctionCallAt(
51
+ context.session,
52
+ events.length - 1
53
+ );
54
+ let parts;
55
+ let taskId = void 0;
56
+ let contextId = void 0;
57
+ if (userFnCall) {
58
+ const event = userFnCall.response;
59
+ parts = toA2AParts(
60
+ ((_a = event.content) == null ? void 0 : _a.parts) || [],
61
+ event.longRunningToolIds
62
+ );
63
+ taskId = userFnCall.taskId;
64
+ contextId = userFnCall.contextId;
65
+ } else {
66
+ const missing = toMissingRemoteSessionParts(context, context.session);
67
+ parts = missing.parts;
68
+ contextId = missing.contextId;
69
+ }
70
+ const message = {
71
+ kind: "message",
72
+ messageId: randomUUID(),
73
+ role: MessageRole.USER,
74
+ parts,
75
+ metadata: {
76
+ ...getA2ASessionMetadata({
77
+ appName: context.session.appName,
78
+ userId: context.session.userId,
79
+ sessionId: context.session.id
80
+ })
81
+ }
82
+ };
83
+ if (taskId) message.taskId = taskId;
84
+ if (contextId) message.contextId = contextId;
85
+ const params = {
86
+ message,
87
+ configuration: this.a2aConfig.messageSendConfig
88
+ };
89
+ const processor = new A2ARemoteAgentRunProcessor(params);
90
+ if (this.a2aConfig.beforeRequestCallbacks) {
91
+ for (const callback of this.a2aConfig.beforeRequestCallbacks) {
92
+ await callback(context, params);
93
+ }
94
+ }
95
+ const useStreaming = ((_b = this.card.capabilities) == null ? void 0 : _b.streaming) !== false;
96
+ if (useStreaming) {
97
+ for await (const chunk of this.client.sendMessageStream(params)) {
98
+ if (this.a2aConfig.afterRequestCallbacks) {
99
+ for (const callback of this.a2aConfig.afterRequestCallbacks) {
100
+ await callback(context, chunk);
101
+ }
102
+ }
103
+ const adkEvent = toAdkEvent(chunk, context.invocationId, this.name);
104
+ if (!adkEvent) {
105
+ continue;
106
+ }
107
+ processor.updateCustomMetadata(adkEvent, chunk);
108
+ const eventsToEmit = processor.aggregatePartial(
109
+ context,
110
+ chunk,
111
+ adkEvent
112
+ );
113
+ for (const ev of eventsToEmit) {
114
+ yield ev;
115
+ }
116
+ }
117
+ } else {
118
+ const result = await this.client.sendMessage(params);
119
+ if (this.a2aConfig.afterRequestCallbacks) {
120
+ for (const callback of this.a2aConfig.afterRequestCallbacks) {
121
+ await callback(context, result);
122
+ }
123
+ }
124
+ const adkEvent = toAdkEvent(result, context.invocationId, this.name);
125
+ if (adkEvent) {
126
+ processor.updateCustomMetadata(adkEvent, result);
127
+ yield adkEvent;
128
+ }
129
+ }
130
+ } catch (e) {
131
+ const error = e;
132
+ logger.error(`A2ARemoteAgent ${this.name} failed:`, error);
133
+ yield createEvent({
134
+ author: this.name,
135
+ invocationId: context.invocationId,
136
+ errorMessage: error.message,
137
+ turnComplete: true
138
+ });
139
+ }
140
+ }
141
+ runLiveImpl(_context) {
142
+ throw new Error("Live mode is not supported in A2ARemoteAgent yet.");
143
+ }
144
+ }
145
+ export {
146
+ AGENT_CARD_PATH,
147
+ RemoteA2AAgent
148
+ };
@@ -0,0 +1,175 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import {
7
+ createModelContent
8
+ } from "@google/genai";
9
+ import { createEvent } from "../events/event.js";
10
+ import {
11
+ getEventMetadata,
12
+ isTask,
13
+ isTaskArtifactUpdateEvent,
14
+ isTaskStatusUpdateEvent
15
+ } from "./a2a_event.js";
16
+ import { A2AMetadataKeys } from "./metadata_converter_utils.js";
17
+ class A2ARemoteAgentRunProcessor {
18
+ constructor(request) {
19
+ this.request = request;
20
+ this.aggregations = /* @__PURE__ */ new Map();
21
+ this.aggregationOrder = [];
22
+ }
23
+ /**
24
+ * aggregatePartial stores contents of partial events to emit them with the terminal event.
25
+ * It can return multiple events to emit instead of just the provided one.
26
+ */
27
+ aggregatePartial(context, a2aEvent, adkEvent) {
28
+ const metadata = getEventMetadata(a2aEvent);
29
+ if (metadata[A2AMetadataKeys.PARTIAL]) {
30
+ return [adkEvent];
31
+ }
32
+ if (isTaskStatusUpdateEvent(a2aEvent) && a2aEvent.final) {
33
+ const events = [];
34
+ for (const aid of this.aggregationOrder) {
35
+ const agg = this.aggregations.get(aid);
36
+ if (agg) {
37
+ events.push(this.buildNonPartialAggregation(context, agg));
38
+ }
39
+ }
40
+ this.aggregations.clear();
41
+ this.aggregationOrder = [];
42
+ return [...events, adkEvent];
43
+ }
44
+ if (isTask(a2aEvent)) {
45
+ this.aggregations.clear();
46
+ this.aggregationOrder = [];
47
+ return [adkEvent];
48
+ }
49
+ if (!isTaskArtifactUpdateEvent(a2aEvent)) {
50
+ return [adkEvent];
51
+ }
52
+ const artifactId = a2aEvent.artifact.artifactId;
53
+ if (!a2aEvent.append) {
54
+ this.removeAggregation(artifactId);
55
+ if (a2aEvent.lastChunk) {
56
+ adkEvent.partial = false;
57
+ return [adkEvent];
58
+ }
59
+ }
60
+ let aggregation = this.aggregations.get(artifactId);
61
+ if (!aggregation) {
62
+ aggregation = {
63
+ aggregatedText: "",
64
+ aggregatedThoughts: "",
65
+ parts: []
66
+ };
67
+ this.aggregations.set(artifactId, aggregation);
68
+ this.aggregationOrder.push(artifactId);
69
+ } else {
70
+ this.aggregationOrder = this.aggregationOrder.filter(
71
+ (id) => id !== artifactId
72
+ );
73
+ this.aggregationOrder.push(artifactId);
74
+ }
75
+ this.updateAggregation(aggregation, adkEvent);
76
+ if (!a2aEvent.lastChunk) {
77
+ return [adkEvent];
78
+ }
79
+ this.removeAggregation(artifactId);
80
+ return [adkEvent, this.buildNonPartialAggregation(context, aggregation)];
81
+ }
82
+ removeAggregation(artifactId) {
83
+ this.aggregations.delete(artifactId);
84
+ this.aggregationOrder = this.aggregationOrder.filter(
85
+ (id) => id !== artifactId
86
+ );
87
+ }
88
+ updateAggregation(agg, event) {
89
+ var _a;
90
+ const parts = ((_a = event.content) == null ? void 0 : _a.parts) || [];
91
+ for (const part of parts) {
92
+ if (part.text && part.text !== "") {
93
+ if (part.thought) {
94
+ agg.aggregatedThoughts += part.text;
95
+ } else {
96
+ agg.aggregatedText += part.text;
97
+ }
98
+ } else {
99
+ this.promoteTextBlocksToParts(agg);
100
+ agg.parts.push(part);
101
+ }
102
+ }
103
+ if (event.citationMetadata) {
104
+ if (!agg.citations) {
105
+ agg.citations = { citations: [] };
106
+ }
107
+ if (!agg.citations.citations) {
108
+ agg.citations.citations = [];
109
+ }
110
+ agg.citations.citations.push(...event.citationMetadata.citations || []);
111
+ }
112
+ if (event.customMetadata) {
113
+ if (!agg.customMeta) {
114
+ agg.customMeta = {};
115
+ }
116
+ Object.assign(agg.customMeta, event.customMetadata);
117
+ }
118
+ if (event.groundingMetadata) {
119
+ agg.grounding = event.groundingMetadata;
120
+ }
121
+ if (event.usageMetadata) {
122
+ agg.usage = event.usageMetadata;
123
+ }
124
+ }
125
+ buildNonPartialAggregation(context, agg) {
126
+ this.promoteTextBlocksToParts(agg);
127
+ const result = createEvent({
128
+ author: context.agent.name,
129
+ invocationId: context.invocationId,
130
+ content: agg.parts.length > 0 ? createModelContent([...agg.parts]) : void 0,
131
+ customMetadata: agg.customMeta,
132
+ groundingMetadata: agg.grounding,
133
+ citationMetadata: agg.citations,
134
+ usageMetadata: agg.usage,
135
+ turnComplete: false,
136
+ partial: false
137
+ });
138
+ return result;
139
+ }
140
+ promoteTextBlocksToParts(agg) {
141
+ if (agg.aggregatedThoughts !== "") {
142
+ agg.parts.push({ thought: true, text: agg.aggregatedThoughts });
143
+ agg.aggregatedThoughts = "";
144
+ }
145
+ if (agg.aggregatedText !== "") {
146
+ agg.parts.push({ text: agg.aggregatedText });
147
+ agg.aggregatedText = "";
148
+ }
149
+ }
150
+ /**
151
+ * Adds request and response metadata to the event.
152
+ */
153
+ updateCustomMetadata(event, response) {
154
+ const toAdd = {};
155
+ if (this.request && event.turnComplete) {
156
+ toAdd["request"] = this.request;
157
+ }
158
+ if (response) {
159
+ toAdd["response"] = response;
160
+ }
161
+ if (Object.keys(toAdd).length === 0) {
162
+ return;
163
+ }
164
+ if (!event.customMetadata) {
165
+ event.customMetadata = {};
166
+ }
167
+ for (const [k, v] of Object.entries(toAdd)) {
168
+ if (v === void 0 || v === null) continue;
169
+ event.customMetadata[`a2a:${k}`] = v;
170
+ }
171
+ }
172
+ }
173
+ export {
174
+ A2ARemoteAgentRunProcessor
175
+ };
@@ -0,0 +1,131 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { createEvent } from "../events/event.js";
7
+ import { AdkMetadataKeys } from "./metadata_converter_utils.js";
8
+ import { toA2AParts } from "./part_converter_utils.js";
9
+ function getUserFunctionCallAt(session, index) {
10
+ const events = session.events;
11
+ if (index < 0 || index >= events.length) {
12
+ return void 0;
13
+ }
14
+ const candidate = events[index];
15
+ if (candidate.author !== "user") {
16
+ return void 0;
17
+ }
18
+ const fnCallId = getFunctionResponseCallId(candidate);
19
+ if (!fnCallId) {
20
+ return void 0;
21
+ }
22
+ for (let i = index - 1; i >= 0; i--) {
23
+ const request = events[i];
24
+ if (!isFunctionCallEvent(request, fnCallId)) {
25
+ continue;
26
+ }
27
+ const metadata = request.customMetadata || {};
28
+ const taskId = metadata[AdkMetadataKeys.TASK_ID] || "";
29
+ const contextId = metadata[AdkMetadataKeys.CONTEXT_ID] || "";
30
+ return {
31
+ response: candidate,
32
+ taskId,
33
+ contextId
34
+ };
35
+ }
36
+ return void 0;
37
+ }
38
+ function isFunctionCallEvent(event, callId) {
39
+ if (!event || !event.content || !event.content.parts) {
40
+ return false;
41
+ }
42
+ return event.content.parts.some(
43
+ (part) => part.functionCall && part.functionCall.id === callId
44
+ );
45
+ }
46
+ function getFunctionResponseCallId(event) {
47
+ var _a;
48
+ if (!event || !event.content || !event.content.parts) {
49
+ return void 0;
50
+ }
51
+ const responsePart = event.content.parts.find(
52
+ (part) => part.functionResponse
53
+ );
54
+ return (_a = responsePart == null ? void 0 : responsePart.functionResponse) == null ? void 0 : _a.id;
55
+ }
56
+ function toMissingRemoteSessionParts(ctx, session) {
57
+ const events = session.events;
58
+ let contextId = void 0;
59
+ let lastRemoteResponseIndex = -1;
60
+ for (let i = events.length - 1; i >= 0; i--) {
61
+ const event = events[i];
62
+ if (event.author === ctx.agent.name) {
63
+ lastRemoteResponseIndex = i;
64
+ const metadata = event.customMetadata || {};
65
+ contextId = metadata[AdkMetadataKeys.CONTEXT_ID];
66
+ break;
67
+ }
68
+ }
69
+ const missingParts = [];
70
+ for (let i = lastRemoteResponseIndex + 1; i < events.length; i++) {
71
+ let event = events[i];
72
+ if (event.author !== "user" && event.author !== ctx.agent.name) {
73
+ event = presentAsUserMessage(ctx, event);
74
+ }
75
+ if (!event.content || !event.content.parts || event.content.parts.length === 0) {
76
+ continue;
77
+ }
78
+ const parts = toA2AParts(event.content.parts, event.longRunningToolIds);
79
+ missingParts.push(...parts);
80
+ }
81
+ return {
82
+ parts: missingParts,
83
+ contextId
84
+ };
85
+ }
86
+ function presentAsUserMessage(ctx, agentEvent) {
87
+ const event = createEvent({
88
+ author: "user",
89
+ invocationId: ctx.invocationId
90
+ });
91
+ if (!agentEvent.content || !agentEvent.content.parts) {
92
+ return event;
93
+ }
94
+ const parts = [{ text: "For context:" }];
95
+ for (const part of agentEvent.content.parts) {
96
+ if (part.thought) {
97
+ continue;
98
+ }
99
+ if (part.text) {
100
+ parts.push({
101
+ text: `[${agentEvent.author}] said: ${part.text}`
102
+ });
103
+ } else if (part.functionCall) {
104
+ const call = part.functionCall;
105
+ parts.push({
106
+ text: `[${agentEvent.author}] called tool ${call.name} with parameters: ${JSON.stringify(call.args)}`
107
+ });
108
+ } else if (part.functionResponse) {
109
+ const resp = part.functionResponse;
110
+ parts.push({
111
+ text: `[${agentEvent.author}] ${resp.name} tool returned result: ${JSON.stringify(resp.response)}`
112
+ });
113
+ } else {
114
+ parts.push(part);
115
+ }
116
+ }
117
+ if (parts.length > 1) {
118
+ event.content = {
119
+ role: "user",
120
+ parts
121
+ };
122
+ }
123
+ return event;
124
+ }
125
+ export {
126
+ getFunctionResponseCallId,
127
+ getUserFunctionCallAt,
128
+ isFunctionCallEvent,
129
+ presentAsUserMessage,
130
+ toMissingRemoteSessionParts
131
+ };