@google/adk 0.5.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 (139) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/a2a/a2a_event.js +53 -26
  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_processor_utils.js +180 -0
  10. package/dist/cjs/a2a/executor_context.js +1 -1
  11. package/dist/cjs/a2a/metadata_converter_utils.js +1 -0
  12. package/dist/cjs/a2a/part_converter_utils.js +24 -13
  13. package/dist/cjs/agents/llm_agent.js +17 -0
  14. package/dist/cjs/agents/{content_processor_utils.js → processors/content_processor_utils.js} +21 -2
  15. package/dist/cjs/agents/processors/content_request_processor.js +24 -3
  16. package/dist/cjs/agents/processors/context_compactor_request_processor.js +61 -0
  17. package/dist/cjs/agents/processors/instructions_llm_request_processor.js +1 -1
  18. package/dist/cjs/artifacts/file_artifact_service.js +35 -4
  19. package/dist/cjs/common.js +37 -0
  20. package/dist/cjs/context/base_context_compactor.js +27 -0
  21. package/dist/cjs/context/summarizers/base_summarizer.js +27 -0
  22. package/dist/cjs/context/summarizers/llm_summarizer.js +93 -0
  23. package/dist/cjs/context/token_based_context_compactor.js +135 -0
  24. package/dist/cjs/context/truncating_context_compactor.js +58 -0
  25. package/dist/cjs/events/compacted_event.js +53 -0
  26. package/dist/cjs/index.js +38 -14
  27. package/dist/cjs/index.js.map +4 -4
  28. package/dist/cjs/memory/in_memory_memory_service.js +1 -1
  29. package/dist/cjs/runner/runner.js +19 -10
  30. package/dist/cjs/sessions/db/operations.js +4 -14
  31. package/dist/cjs/sessions/state.js +2 -2
  32. package/dist/cjs/tools/agent_tool.js +6 -5
  33. package/dist/cjs/tools/load_artifacts_tool.js +188 -0
  34. package/dist/cjs/tools/load_memory_tool.js +107 -0
  35. package/dist/cjs/tools/preload_memory_tool.js +109 -0
  36. package/dist/cjs/utils/logger.js +1 -0
  37. package/dist/cjs/version.js +1 -1
  38. package/dist/esm/a2a/a2a_event.js +52 -26
  39. package/dist/esm/a2a/a2a_remote_agent.js +148 -0
  40. package/dist/esm/a2a/a2a_remote_agent_run_processor.js +175 -0
  41. package/dist/esm/a2a/a2a_remote_agent_utils.js +131 -0
  42. package/dist/esm/a2a/agent_card.js +340 -0
  43. package/dist/esm/a2a/agent_executor.js +202 -0
  44. package/dist/esm/a2a/agent_to_a2a.js +80 -0
  45. package/dist/esm/a2a/event_processor_utils.js +159 -0
  46. package/dist/esm/a2a/executor_context.js +1 -1
  47. package/dist/esm/a2a/metadata_converter_utils.js +1 -0
  48. package/dist/esm/a2a/part_converter_utils.js +24 -13
  49. package/dist/esm/agents/llm_agent.js +17 -0
  50. package/dist/esm/agents/{content_processor_utils.js → processors/content_processor_utils.js} +23 -2
  51. package/dist/esm/agents/processors/content_request_processor.js +25 -4
  52. package/dist/esm/agents/processors/context_compactor_request_processor.js +31 -0
  53. package/dist/esm/agents/processors/instructions_llm_request_processor.js +1 -1
  54. package/dist/esm/artifacts/file_artifact_service.js +30 -3
  55. package/dist/esm/common.js +33 -1
  56. package/dist/esm/context/base_context_compactor.js +5 -0
  57. package/dist/esm/context/summarizers/base_summarizer.js +5 -0
  58. package/dist/esm/context/summarizers/llm_summarizer.js +65 -0
  59. package/dist/esm/context/token_based_context_compactor.js +105 -0
  60. package/dist/esm/context/truncating_context_compactor.js +28 -0
  61. package/dist/esm/events/compacted_event.js +22 -0
  62. package/dist/esm/index.js +38 -14
  63. package/dist/esm/index.js.map +4 -4
  64. package/dist/esm/memory/in_memory_memory_service.js +1 -1
  65. package/dist/esm/runner/runner.js +17 -9
  66. package/dist/esm/sessions/db/operations.js +4 -14
  67. package/dist/esm/sessions/state.js +2 -2
  68. package/dist/esm/tools/agent_tool.js +6 -5
  69. package/dist/esm/tools/load_artifacts_tool.js +159 -0
  70. package/dist/esm/tools/load_memory_tool.js +78 -0
  71. package/dist/esm/tools/preload_memory_tool.js +80 -0
  72. package/dist/esm/utils/logger.js +1 -0
  73. package/dist/esm/version.js +1 -1
  74. package/dist/types/a2a/a2a_event.d.ts +23 -6
  75. package/dist/types/a2a/a2a_remote_agent.d.ts +63 -0
  76. package/dist/types/a2a/a2a_remote_agent_run_processor.d.ts +31 -0
  77. package/dist/types/a2a/a2a_remote_agent_utils.d.ts +38 -0
  78. package/dist/types/a2a/agent_card.d.ts +23 -0
  79. package/dist/types/a2a/agent_executor.d.ts +52 -0
  80. package/dist/types/a2a/agent_to_a2a.d.ts +45 -0
  81. package/dist/types/a2a/event_processor_utils.d.ts +24 -0
  82. package/dist/types/a2a/executor_context.d.ts +1 -1
  83. package/dist/types/a2a/metadata_converter_utils.d.ts +2 -1
  84. package/dist/types/agents/llm_agent.d.ts +6 -0
  85. package/dist/types/agents/loop_agent.d.ts +1 -1
  86. package/dist/types/agents/{content_processor_utils.d.ts → processors/content_processor_utils.d.ts} +1 -1
  87. package/dist/types/agents/processors/context_compactor_request_processor.d.ts +22 -0
  88. package/dist/types/artifacts/file_artifact_service.d.ts +4 -0
  89. package/dist/types/common.d.ts +16 -1
  90. package/dist/types/context/base_context_compactor.d.ts +24 -0
  91. package/dist/types/context/summarizers/base_summarizer.d.ts +19 -0
  92. package/dist/types/context/summarizers/llm_summarizer.d.ts +23 -0
  93. package/dist/types/context/token_based_context_compactor.d.ts +33 -0
  94. package/dist/types/context/truncating_context_compactor.d.ts +24 -0
  95. package/dist/types/events/compacted_event.d.ts +33 -0
  96. package/dist/types/index.d.ts +8 -0
  97. package/dist/types/runner/runner.d.ts +13 -0
  98. package/dist/types/sessions/db/operations.d.ts +2 -3
  99. package/dist/types/tools/load_artifacts_tool.d.ts +21 -0
  100. package/dist/types/tools/load_memory_tool.d.ts +22 -0
  101. package/dist/types/tools/preload_memory_tool.d.ts +23 -0
  102. package/dist/types/version.d.ts +1 -1
  103. package/dist/web/a2a/a2a_event.js +52 -26
  104. package/dist/web/a2a/a2a_remote_agent.js +193 -0
  105. package/dist/web/a2a/a2a_remote_agent_run_processor.js +175 -0
  106. package/dist/web/a2a/a2a_remote_agent_utils.js +131 -0
  107. package/dist/web/a2a/agent_card.js +340 -0
  108. package/dist/web/a2a/agent_executor.js +216 -0
  109. package/dist/web/a2a/agent_to_a2a.js +80 -0
  110. package/dist/web/a2a/event_processor_utils.js +168 -0
  111. package/dist/web/a2a/executor_context.js +1 -1
  112. package/dist/web/a2a/metadata_converter_utils.js +1 -0
  113. package/dist/web/a2a/part_converter_utils.js +24 -13
  114. package/dist/web/agents/llm_agent.js +17 -0
  115. package/dist/web/agents/{content_processor_utils.js → processors/content_processor_utils.js} +22 -2
  116. package/dist/web/agents/processors/content_request_processor.js +25 -4
  117. package/dist/web/agents/processors/context_compactor_request_processor.js +49 -0
  118. package/dist/web/agents/processors/instructions_llm_request_processor.js +1 -1
  119. package/dist/web/artifacts/file_artifact_service.js +30 -3
  120. package/dist/web/common.js +33 -1
  121. package/dist/web/context/base_context_compactor.js +5 -0
  122. package/dist/web/context/summarizers/base_summarizer.js +5 -0
  123. package/dist/web/context/summarizers/llm_summarizer.js +74 -0
  124. package/dist/web/context/token_based_context_compactor.js +105 -0
  125. package/dist/web/context/truncating_context_compactor.js +28 -0
  126. package/dist/web/events/compacted_event.js +40 -0
  127. package/dist/web/index.js +1 -1
  128. package/dist/web/index.js.map +4 -4
  129. package/dist/web/memory/in_memory_memory_service.js +1 -1
  130. package/dist/web/runner/runner.js +17 -9
  131. package/dist/web/sessions/db/operations.js +4 -14
  132. package/dist/web/sessions/state.js +2 -2
  133. package/dist/web/tools/agent_tool.js +6 -5
  134. package/dist/web/tools/load_artifacts_tool.js +150 -0
  135. package/dist/web/tools/load_memory_tool.js +77 -0
  136. package/dist/web/tools/preload_memory_tool.js +75 -0
  137. package/dist/web/utils/logger.js +1 -0
  138. package/dist/web/version.js +1 -1
  139. package/package.json +6 -4
@@ -9,6 +9,16 @@ var MessageRole = /* @__PURE__ */ ((MessageRole2) => {
9
9
  MessageRole2["AGENT"] = "agent";
10
10
  return MessageRole2;
11
11
  })(MessageRole || {});
12
+ var TaskState = /* @__PURE__ */ ((TaskState2) => {
13
+ TaskState2["SUBMITTED"] = "submitted";
14
+ TaskState2["WORKING"] = "working";
15
+ TaskState2["COMPLETED"] = "completed";
16
+ TaskState2["FAILED"] = "failed";
17
+ TaskState2["CANCELED"] = "canceled";
18
+ TaskState2["REJECTED"] = "rejected";
19
+ TaskState2["INPUT_REQUIRED"] = "input-required";
20
+ return TaskState2;
21
+ })(TaskState || {});
12
22
  function isTaskStatusUpdateEvent(event) {
13
23
  return (event == null ? void 0 : event.kind) === "status-update";
14
24
  }
@@ -31,13 +41,18 @@ function getEventMetadata(event) {
31
41
  return {};
32
42
  }
33
43
  function isFailedTaskStatusUpdateEvent(event) {
34
- return (isTaskStatusUpdateEvent(event) || isTask(event)) && event.status.state === "failed";
44
+ return (isTaskStatusUpdateEvent(event) || isTask(event)) && event.status.state === "failed" /* FAILED */;
35
45
  }
36
46
  function isTerminalTaskStatusUpdateEvent(event) {
37
- return (isTaskStatusUpdateEvent(event) || isTask(event)) && ["completed", "failed", "canceled", "rejected"].includes(event.status.state);
47
+ return (isTaskStatusUpdateEvent(event) || isTask(event)) && [
48
+ "completed" /* COMPLETED */,
49
+ "failed" /* FAILED */,
50
+ "canceled" /* CANCELED */,
51
+ "rejected" /* REJECTED */
52
+ ].includes(event.status.state);
38
53
  }
39
54
  function isInputRequiredTaskStatusUpdateEvent(event) {
40
- return (isTaskStatusUpdateEvent(event) || isTask(event)) && event.status.state === "input-required";
55
+ return (isTaskStatusUpdateEvent(event) || isTask(event)) && event.status.state === "input-required" /* INPUT_REQUIRED */;
41
56
  }
42
57
  function getFailedTaskStatusUpdateEventError(event) {
43
58
  var _a;
@@ -56,7 +71,8 @@ function getFailedTaskStatusUpdateEventError(event) {
56
71
  function createTaskSubmittedEvent({
57
72
  taskId,
58
73
  contextId,
59
- message
74
+ message,
75
+ metadata
60
76
  }) {
61
77
  return {
62
78
  kind: "status-update",
@@ -64,16 +80,18 @@ function createTaskSubmittedEvent({
64
80
  contextId,
65
81
  final: false,
66
82
  status: {
67
- state: "submitted",
83
+ state: "submitted" /* SUBMITTED */,
68
84
  message,
69
85
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
70
- }
86
+ },
87
+ metadata
71
88
  };
72
89
  }
73
90
  function createTask({
74
91
  contextId,
75
92
  message,
76
- taskId
93
+ taskId,
94
+ metadata
77
95
  }) {
78
96
  return {
79
97
  kind: "task",
@@ -81,15 +99,17 @@ function createTask({
81
99
  contextId,
82
100
  history: [message],
83
101
  status: {
84
- state: "submitted",
102
+ state: "submitted" /* SUBMITTED */,
85
103
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
86
- }
104
+ },
105
+ metadata
87
106
  };
88
107
  }
89
108
  function createTaskWorkingEvent({
90
109
  taskId,
91
110
  contextId,
92
- message
111
+ message,
112
+ metadata
93
113
  }) {
94
114
  return {
95
115
  kind: "status-update",
@@ -97,16 +117,17 @@ function createTaskWorkingEvent({
97
117
  contextId,
98
118
  final: false,
99
119
  status: {
100
- state: "working",
120
+ state: "working" /* WORKING */,
101
121
  message,
102
122
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
103
- }
123
+ },
124
+ metadata
104
125
  };
105
126
  }
106
127
  function createTaskCompletedEvent({
107
128
  taskId,
108
129
  contextId,
109
- metadata = {}
130
+ metadata
110
131
  }) {
111
132
  return {
112
133
  kind: "status-update",
@@ -114,7 +135,7 @@ function createTaskCompletedEvent({
114
135
  contextId,
115
136
  final: true,
116
137
  status: {
117
- state: "completed",
138
+ state: "completed" /* COMPLETED */,
118
139
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
119
140
  },
120
141
  metadata
@@ -137,9 +158,9 @@ function createTaskArtifactUpdateEvent({
137
158
  lastChunk,
138
159
  artifact: {
139
160
  artifactId: artifactId || randomUUID(),
140
- parts,
141
- metadata
142
- }
161
+ parts
162
+ },
163
+ metadata
143
164
  };
144
165
  }
145
166
  function createTaskFailedEvent({
@@ -152,8 +173,9 @@ function createTaskFailedEvent({
152
173
  kind: "status-update",
153
174
  taskId,
154
175
  contextId,
176
+ final: true,
155
177
  status: {
156
- state: "failed",
178
+ state: "failed" /* FAILED */,
157
179
  message: {
158
180
  kind: "message",
159
181
  messageId: randomUUID(),
@@ -169,14 +191,14 @@ function createTaskFailedEvent({
169
191
  },
170
192
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
171
193
  },
172
- metadata,
173
- final: true
194
+ metadata
174
195
  };
175
196
  }
176
197
  function createTaskInputRequiredEvent({
177
198
  taskId,
178
199
  contextId,
179
- parts
200
+ parts,
201
+ metadata
180
202
  }) {
181
203
  return {
182
204
  kind: "status-update",
@@ -184,7 +206,7 @@ function createTaskInputRequiredEvent({
184
206
  contextId,
185
207
  final: true,
186
208
  status: {
187
- state: "input-required",
209
+ state: "input-required" /* INPUT_REQUIRED */,
188
210
  message: {
189
211
  kind: "message",
190
212
  messageId: randomUUID(),
@@ -194,13 +216,15 @@ function createTaskInputRequiredEvent({
194
216
  parts
195
217
  },
196
218
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
197
- }
219
+ },
220
+ metadata
198
221
  };
199
222
  }
200
223
  function createInputMissingErrorEvent({
201
224
  taskId,
202
225
  contextId,
203
- parts
226
+ parts,
227
+ metadata
204
228
  }) {
205
229
  return {
206
230
  kind: "status-update",
@@ -208,7 +232,7 @@ function createInputMissingErrorEvent({
208
232
  contextId,
209
233
  final: true,
210
234
  status: {
211
- state: "input-required",
235
+ state: "input-required" /* INPUT_REQUIRED */,
212
236
  message: {
213
237
  kind: "message",
214
238
  messageId: randomUUID(),
@@ -218,11 +242,13 @@ function createInputMissingErrorEvent({
218
242
  parts
219
243
  },
220
244
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
221
- }
245
+ },
246
+ metadata
222
247
  };
223
248
  }
224
249
  export {
225
250
  MessageRole,
251
+ TaskState,
226
252
  createInputMissingErrorEvent,
227
253
  createTask,
228
254
  createTaskArtifactUpdateEvent,
@@ -0,0 +1,193 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
4
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
6
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
+ var __spreadValues = (a, b) => {
8
+ for (var prop in b || (b = {}))
9
+ if (__hasOwnProp.call(b, prop))
10
+ __defNormalProp(a, prop, b[prop]);
11
+ if (__getOwnPropSymbols)
12
+ for (var prop of __getOwnPropSymbols(b)) {
13
+ if (__propIsEnum.call(b, prop))
14
+ __defNormalProp(a, prop, b[prop]);
15
+ }
16
+ return a;
17
+ };
18
+ var __await = function(promise, isYieldStar) {
19
+ this[0] = promise;
20
+ this[1] = isYieldStar;
21
+ };
22
+ var __asyncGenerator = (__this, __arguments, generator) => {
23
+ var resume = (k, v, yes, no) => {
24
+ try {
25
+ var x = generator[k](v), isAwait = (v = x.value) instanceof __await, done = x.done;
26
+ Promise.resolve(isAwait ? v[0] : v).then((y) => isAwait ? resume(k === "return" ? k : "next", v[1] ? { done: y.done, value: y.value } : y, yes, no) : yes({ value: y, done })).catch((e) => resume("throw", e, yes, no));
27
+ } catch (e) {
28
+ no(e);
29
+ }
30
+ }, method = (k) => it[k] = (x) => new Promise((yes, no) => resume(k, x, yes, no)), it = {};
31
+ return generator = generator.apply(__this, __arguments), it[__knownSymbol("asyncIterator")] = () => it, method("next"), method("throw"), method("return"), it;
32
+ };
33
+ var __forAwait = (obj, it, method) => (it = obj[__knownSymbol("asyncIterator")]) ? it.call(obj) : (obj = obj[__knownSymbol("iterator")](), it = {}, method = (key, fn) => (fn = obj[key]) && (it[key] = (arg) => new Promise((yes, no, done) => (arg = fn.call(obj, arg), done = arg.done, Promise.resolve(arg.value).then((value) => yes({ value, done }), no)))), method("next"), method("return"), it);
34
+ /**
35
+ * @license
36
+ * Copyright 2026 Google LLC
37
+ * SPDX-License-Identifier: Apache-2.0
38
+ */
39
+ import {
40
+ AGENT_CARD_PATH
41
+ } from "@a2a-js/sdk";
42
+ import { ClientFactory } from "@a2a-js/sdk/client";
43
+ import { BaseAgent } from "../agents/base_agent.js";
44
+ import { createEvent } from "../events/event.js";
45
+ import { randomUUID } from "../utils/env_aware_utils.js";
46
+ import { logger } from "../utils/logger.js";
47
+ import { MessageRole } from "./a2a_event.js";
48
+ import { A2ARemoteAgentRunProcessor } from "./a2a_remote_agent_run_processor.js";
49
+ import {
50
+ getUserFunctionCallAt,
51
+ toMissingRemoteSessionParts
52
+ } from "./a2a_remote_agent_utils.js";
53
+ import { resolveAgentCard } from "./agent_card.js";
54
+ import { toAdkEvent } from "./event_converter_utils.js";
55
+ import { getA2ASessionMetadata } from "./metadata_converter_utils.js";
56
+ import { toA2AParts } from "./part_converter_utils.js";
57
+ class RemoteA2AAgent extends BaseAgent {
58
+ constructor(a2aConfig) {
59
+ super(a2aConfig);
60
+ this.a2aConfig = a2aConfig;
61
+ this.isInitialized = false;
62
+ if (!a2aConfig.agentCard) {
63
+ throw new Error("AgentCard must be provided");
64
+ }
65
+ }
66
+ async init() {
67
+ if (this.isInitialized) {
68
+ return;
69
+ }
70
+ this.card = await resolveAgentCard(this.a2aConfig.agentCard);
71
+ const factory = this.a2aConfig.clientFactory || new ClientFactory();
72
+ this.client = await factory.createFromAgentCard(this.card);
73
+ this.isInitialized = true;
74
+ }
75
+ runAsyncImpl(context) {
76
+ return __asyncGenerator(this, null, function* () {
77
+ var _a, _b;
78
+ yield new __await(this.init());
79
+ try {
80
+ const events = context.session.events;
81
+ if (events.length === 0) {
82
+ throw new Error("No events in session to send");
83
+ }
84
+ const userFnCall = getUserFunctionCallAt(
85
+ context.session,
86
+ events.length - 1
87
+ );
88
+ let parts;
89
+ let taskId = void 0;
90
+ let contextId = void 0;
91
+ if (userFnCall) {
92
+ const event = userFnCall.response;
93
+ parts = toA2AParts(
94
+ ((_a = event.content) == null ? void 0 : _a.parts) || [],
95
+ event.longRunningToolIds
96
+ );
97
+ taskId = userFnCall.taskId;
98
+ contextId = userFnCall.contextId;
99
+ } else {
100
+ const missing = toMissingRemoteSessionParts(context, context.session);
101
+ parts = missing.parts;
102
+ contextId = missing.contextId;
103
+ }
104
+ const message = {
105
+ kind: "message",
106
+ messageId: randomUUID(),
107
+ role: MessageRole.USER,
108
+ parts,
109
+ metadata: __spreadValues({}, getA2ASessionMetadata({
110
+ appName: context.session.appName,
111
+ userId: context.session.userId,
112
+ sessionId: context.session.id
113
+ }))
114
+ };
115
+ if (taskId) message.taskId = taskId;
116
+ if (contextId) message.contextId = contextId;
117
+ const params = {
118
+ message,
119
+ configuration: this.a2aConfig.messageSendConfig
120
+ };
121
+ const processor = new A2ARemoteAgentRunProcessor(params);
122
+ if (this.a2aConfig.beforeRequestCallbacks) {
123
+ for (const callback of this.a2aConfig.beforeRequestCallbacks) {
124
+ yield new __await(callback(context, params));
125
+ }
126
+ }
127
+ const useStreaming = ((_b = this.card.capabilities) == null ? void 0 : _b.streaming) !== false;
128
+ if (useStreaming) {
129
+ try {
130
+ for (var iter = __forAwait(this.client.sendMessageStream(params)), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
131
+ const chunk = temp.value;
132
+ if (this.a2aConfig.afterRequestCallbacks) {
133
+ for (const callback of this.a2aConfig.afterRequestCallbacks) {
134
+ yield new __await(callback(context, chunk));
135
+ }
136
+ }
137
+ const adkEvent = toAdkEvent(chunk, context.invocationId, this.name);
138
+ if (!adkEvent) {
139
+ continue;
140
+ }
141
+ processor.updateCustomMetadata(adkEvent, chunk);
142
+ const eventsToEmit = processor.aggregatePartial(
143
+ context,
144
+ chunk,
145
+ adkEvent
146
+ );
147
+ for (const ev of eventsToEmit) {
148
+ yield ev;
149
+ }
150
+ }
151
+ } catch (temp) {
152
+ error = [temp];
153
+ } finally {
154
+ try {
155
+ more && (temp = iter.return) && (yield new __await(temp.call(iter)));
156
+ } finally {
157
+ if (error)
158
+ throw error[0];
159
+ }
160
+ }
161
+ } else {
162
+ const result = yield new __await(this.client.sendMessage(params));
163
+ if (this.a2aConfig.afterRequestCallbacks) {
164
+ for (const callback of this.a2aConfig.afterRequestCallbacks) {
165
+ yield new __await(callback(context, result));
166
+ }
167
+ }
168
+ const adkEvent = toAdkEvent(result, context.invocationId, this.name);
169
+ if (adkEvent) {
170
+ processor.updateCustomMetadata(adkEvent, result);
171
+ yield adkEvent;
172
+ }
173
+ }
174
+ } catch (e) {
175
+ const error2 = e;
176
+ logger.error("A2ARemoteAgent ".concat(this.name, " failed:"), error2);
177
+ yield createEvent({
178
+ author: this.name,
179
+ invocationId: context.invocationId,
180
+ errorMessage: error2.message,
181
+ turnComplete: true
182
+ });
183
+ }
184
+ });
185
+ }
186
+ runLiveImpl(_context) {
187
+ throw new Error("Live mode is not supported in A2ARemoteAgent yet.");
188
+ }
189
+ }
190
+ export {
191
+ AGENT_CARD_PATH,
192
+ RemoteA2AAgent
193
+ };
@@ -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:".concat(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: "[".concat(agentEvent.author, "] said: ").concat(part.text)
102
+ });
103
+ } else if (part.functionCall) {
104
+ const call = part.functionCall;
105
+ parts.push({
106
+ text: "[".concat(agentEvent.author, "] called tool ").concat(call.name, " with parameters: ").concat(JSON.stringify(call.args))
107
+ });
108
+ } else if (part.functionResponse) {
109
+ const resp = part.functionResponse;
110
+ parts.push({
111
+ text: "[".concat(agentEvent.author, "] ").concat(resp.name, " tool returned result: ").concat(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
+ };