Skip to content

Commit 230fd85

Browse files
author
David Montero
committed
Merge branch 'main' into feat/termination-conditions
# Conflicts: # core/src/agents/loop_agent.ts
2 parents 2712c84 + 1469329 commit 230fd85

40 files changed

Lines changed: 3956 additions & 1053 deletions

.release-please-manifest.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
".": "0.4.0",
3-
"core": "0.4.0",
4-
"dev": "0.4.0"
2+
".": "0.5.0",
3+
"core": "0.5.0",
4+
"dev": "0.5.0"
55
}

core/CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
# Changelog
22

3+
## [0.5.0](https://github.com/google/adk-js/compare/adk-v0.4.0...adk-v0.5.0) (2026-03-09)
4+
5+
6+
### Features
7+
8+
* Add ability to prefix toolsets to avoid tool name conflicts ([#184](https://github.com/google/adk-js/issues/184)) ([95837b2](https://github.com/google/adk-js/commit/95837b2d6e89a3455f104c352c5ef7e9077b989a))
9+
* implement ExitLoopTool similar to Python and Java ADK equivalent ([#170](https://github.com/google/adk-js/issues/170)) ([258998f](https://github.com/google/adk-js/commit/258998f7fbd086e2c6ecf894e15576f8a94481d4))
10+
* integrate with ADK conformance tests ([#168](https://github.com/google/adk-js/issues/168)) ([3a7c012](https://github.com/google/adk-js/commit/3a7c012e035f665dbf200640c10caa6e6dd82aa3))
11+
12+
13+
### Bug Fixes
14+
15+
* Lazy load MikroORM drivers to avoid errors when not used. ([#183](https://github.com/google/adk-js/issues/183)) ([9cb726f](https://github.com/google/adk-js/commit/9cb726ffc23d5da79f46605af11e3a4765dec3c0))
16+
317
## [0.4.0](https://github.com/google/adk-js/compare/adk-v0.3.0...adk-v0.4.0) (2026-02-25)
418

519
### Features

core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@google/adk",
3-
"version": "0.4.0",
3+
"version": "0.5.0",
44
"description": "Google ADK JS",
55
"author": "Google",
66
"license": "Apache-2.0",

core/src/a2a/a2a_event.ts

Lines changed: 47 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,19 @@ export enum MessageRole {
2121
AGENT = 'agent',
2222
}
2323

24+
/**
25+
* Task states.
26+
*/
27+
export enum TaskState {
28+
SUBMITTED = 'submitted',
29+
WORKING = 'working',
30+
COMPLETED = 'completed',
31+
FAILED = 'failed',
32+
CANCELED = 'canceled',
33+
REJECTED = 'rejected',
34+
INPUT_REQUIRED = 'input-required',
35+
}
36+
2437
/**
2538
* A2A event.
2639
*/
@@ -83,7 +96,7 @@ export function getEventMetadata(event: A2AEvent): Record<string, unknown> {
8396
export function isFailedTaskStatusUpdateEvent(event: unknown): boolean {
8497
return (
8598
(isTaskStatusUpdateEvent(event) || isTask(event)) &&
86-
event.status.state === 'failed'
99+
event.status.state === TaskState.FAILED
87100
);
88101
}
89102

@@ -93,7 +106,12 @@ export function isFailedTaskStatusUpdateEvent(event: unknown): boolean {
93106
export function isTerminalTaskStatusUpdateEvent(event: unknown): boolean {
94107
return (
95108
(isTaskStatusUpdateEvent(event) || isTask(event)) &&
96-
['completed', 'failed', 'canceled', 'rejected'].includes(event.status.state)
109+
[
110+
TaskState.COMPLETED,
111+
TaskState.FAILED,
112+
TaskState.CANCELED,
113+
TaskState.REJECTED,
114+
].includes(event.status.state as TaskState)
97115
);
98116
}
99117

@@ -103,7 +121,7 @@ export function isTerminalTaskStatusUpdateEvent(event: unknown): boolean {
103121
export function isInputRequiredTaskStatusUpdateEvent(event: unknown): boolean {
104122
return (
105123
(isTaskStatusUpdateEvent(event) || isTask(event)) &&
106-
event.status.state === 'input-required'
124+
event.status.state === TaskState.INPUT_REQUIRED
107125
);
108126
}
109127

@@ -136,21 +154,24 @@ export function createTaskSubmittedEvent({
136154
taskId,
137155
contextId,
138156
message,
157+
metadata,
139158
}: {
140159
taskId: string;
141160
contextId: string;
142161
message: Message;
162+
metadata?: Record<string, unknown>;
143163
}): TaskStatusUpdateEvent {
144164
return {
145165
kind: 'status-update',
146166
taskId,
147167
contextId,
148168
final: false,
149169
status: {
150-
state: 'submitted',
170+
state: TaskState.SUBMITTED,
151171
message,
152172
timestamp: new Date().toISOString(),
153173
},
174+
metadata,
154175
};
155176
}
156177

@@ -161,20 +182,23 @@ export function createTask({
161182
contextId,
162183
message,
163184
taskId,
185+
metadata,
164186
}: {
165187
taskId: string;
166188
contextId: string;
167189
message: Message;
190+
metadata?: Record<string, unknown>;
168191
}): Task {
169192
return {
170193
kind: 'task',
171194
id: taskId || randomUUID(),
172195
contextId,
173196
history: [message],
174197
status: {
175-
state: 'submitted',
198+
state: TaskState.SUBMITTED,
176199
timestamp: new Date().toISOString(),
177200
},
201+
metadata,
178202
};
179203
}
180204

@@ -185,21 +209,24 @@ export function createTaskWorkingEvent({
185209
taskId,
186210
contextId,
187211
message,
212+
metadata,
188213
}: {
189214
taskId: string;
190215
contextId: string;
191-
message: Message;
216+
message?: Message;
217+
metadata?: Record<string, unknown>;
192218
}): TaskStatusUpdateEvent {
193219
return {
194220
kind: 'status-update',
195221
taskId,
196222
contextId,
197223
final: false,
198224
status: {
199-
state: 'working',
225+
state: TaskState.WORKING,
200226
message,
201227
timestamp: new Date().toISOString(),
202228
},
229+
metadata,
203230
};
204231
}
205232

@@ -209,7 +236,7 @@ export function createTaskWorkingEvent({
209236
export function createTaskCompletedEvent({
210237
taskId,
211238
contextId,
212-
metadata = {},
239+
metadata,
213240
}: {
214241
taskId: string;
215242
contextId: string;
@@ -221,7 +248,7 @@ export function createTaskCompletedEvent({
221248
contextId,
222249
final: true,
223250
status: {
224-
state: 'completed',
251+
state: TaskState.COMPLETED,
225252
timestamp: new Date().toISOString(),
226253
},
227254
metadata,
@@ -257,8 +284,8 @@ export function createTaskArtifactUpdateEvent({
257284
artifact: {
258285
artifactId: artifactId || randomUUID(),
259286
parts,
260-
metadata,
261287
},
288+
metadata,
262289
};
263290
}
264291

@@ -280,8 +307,9 @@ export function createTaskFailedEvent({
280307
kind: 'status-update',
281308
taskId,
282309
contextId,
310+
final: true,
283311
status: {
284-
state: 'failed',
312+
state: TaskState.FAILED,
285313
message: {
286314
kind: 'message',
287315
messageId: randomUUID(),
@@ -298,7 +326,6 @@ export function createTaskFailedEvent({
298326
timestamp: new Date().toISOString(),
299327
},
300328
metadata,
301-
final: true,
302329
};
303330
}
304331

@@ -309,18 +336,20 @@ export function createTaskInputRequiredEvent({
309336
taskId,
310337
contextId,
311338
parts,
339+
metadata,
312340
}: {
313341
taskId: string;
314342
contextId: string;
315343
parts: A2APart[];
344+
metadata?: Record<string, unknown>;
316345
}): TaskStatusUpdateEvent {
317346
return {
318347
kind: 'status-update',
319348
taskId,
320349
contextId,
321350
final: true,
322351
status: {
323-
state: 'input-required',
352+
state: TaskState.INPUT_REQUIRED,
324353
message: {
325354
kind: 'message',
326355
messageId: randomUUID(),
@@ -331,6 +360,7 @@ export function createTaskInputRequiredEvent({
331360
},
332361
timestamp: new Date().toISOString(),
333362
},
363+
metadata,
334364
};
335365
}
336366

@@ -341,18 +371,20 @@ export function createInputMissingErrorEvent({
341371
taskId,
342372
contextId,
343373
parts,
374+
metadata,
344375
}: {
345376
parts: A2APart[];
346377
taskId: string;
347378
contextId: string;
379+
metadata?: Record<string, unknown>;
348380
}): TaskStatusUpdateEvent {
349381
return {
350382
kind: 'status-update',
351383
taskId,
352384
contextId,
353385
final: true,
354386
status: {
355-
state: 'input-required',
387+
state: TaskState.INPUT_REQUIRED,
356388
message: {
357389
kind: 'message',
358390
messageId: randomUUID(),
@@ -363,5 +395,6 @@ export function createInputMissingErrorEvent({
363395
},
364396
timestamp: new Date().toISOString(),
365397
},
398+
metadata,
366399
};
367400
}

0 commit comments

Comments
 (0)