@google/adk 0.5.0 → 0.6.1

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 (142) 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 +179 -0
  4. package/dist/cjs/a2a/a2a_remote_agent_run_processor.js +205 -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/gemini_schema_util.js +54 -12
  37. package/dist/cjs/utils/logger.js +1 -0
  38. package/dist/cjs/version.js +1 -1
  39. package/dist/esm/a2a/a2a_event.js +52 -26
  40. package/dist/esm/a2a/a2a_remote_agent.js +153 -0
  41. package/dist/esm/a2a/a2a_remote_agent_run_processor.js +182 -0
  42. package/dist/esm/a2a/a2a_remote_agent_utils.js +131 -0
  43. package/dist/esm/a2a/agent_card.js +340 -0
  44. package/dist/esm/a2a/agent_executor.js +202 -0
  45. package/dist/esm/a2a/agent_to_a2a.js +80 -0
  46. package/dist/esm/a2a/event_processor_utils.js +159 -0
  47. package/dist/esm/a2a/executor_context.js +1 -1
  48. package/dist/esm/a2a/metadata_converter_utils.js +1 -0
  49. package/dist/esm/a2a/part_converter_utils.js +24 -13
  50. package/dist/esm/agents/llm_agent.js +17 -0
  51. package/dist/esm/agents/{content_processor_utils.js → processors/content_processor_utils.js} +23 -2
  52. package/dist/esm/agents/processors/content_request_processor.js +25 -4
  53. package/dist/esm/agents/processors/context_compactor_request_processor.js +31 -0
  54. package/dist/esm/agents/processors/instructions_llm_request_processor.js +1 -1
  55. package/dist/esm/artifacts/file_artifact_service.js +30 -3
  56. package/dist/esm/common.js +33 -1
  57. package/dist/esm/context/base_context_compactor.js +5 -0
  58. package/dist/esm/context/summarizers/base_summarizer.js +5 -0
  59. package/dist/esm/context/summarizers/llm_summarizer.js +65 -0
  60. package/dist/esm/context/token_based_context_compactor.js +105 -0
  61. package/dist/esm/context/truncating_context_compactor.js +28 -0
  62. package/dist/esm/events/compacted_event.js +22 -0
  63. package/dist/esm/index.js +38 -14
  64. package/dist/esm/index.js.map +4 -4
  65. package/dist/esm/memory/in_memory_memory_service.js +1 -1
  66. package/dist/esm/runner/runner.js +17 -9
  67. package/dist/esm/sessions/db/operations.js +4 -14
  68. package/dist/esm/sessions/state.js +2 -2
  69. package/dist/esm/tools/agent_tool.js +6 -5
  70. package/dist/esm/tools/load_artifacts_tool.js +159 -0
  71. package/dist/esm/tools/load_memory_tool.js +78 -0
  72. package/dist/esm/tools/preload_memory_tool.js +80 -0
  73. package/dist/esm/utils/gemini_schema_util.js +54 -12
  74. package/dist/esm/utils/logger.js +1 -0
  75. package/dist/esm/version.js +1 -1
  76. package/dist/types/a2a/a2a_event.d.ts +23 -6
  77. package/dist/types/a2a/a2a_remote_agent.d.ts +67 -0
  78. package/dist/types/a2a/a2a_remote_agent_run_processor.d.ts +31 -0
  79. package/dist/types/a2a/a2a_remote_agent_utils.d.ts +38 -0
  80. package/dist/types/a2a/agent_card.d.ts +23 -0
  81. package/dist/types/a2a/agent_executor.d.ts +52 -0
  82. package/dist/types/a2a/agent_to_a2a.d.ts +45 -0
  83. package/dist/types/a2a/event_processor_utils.d.ts +24 -0
  84. package/dist/types/a2a/executor_context.d.ts +1 -1
  85. package/dist/types/a2a/metadata_converter_utils.d.ts +2 -1
  86. package/dist/types/agents/llm_agent.d.ts +6 -0
  87. package/dist/types/agents/loop_agent.d.ts +1 -1
  88. package/dist/types/agents/{content_processor_utils.d.ts → processors/content_processor_utils.d.ts} +1 -1
  89. package/dist/types/agents/processors/context_compactor_request_processor.d.ts +22 -0
  90. package/dist/types/artifacts/file_artifact_service.d.ts +4 -0
  91. package/dist/types/common.d.ts +16 -1
  92. package/dist/types/context/base_context_compactor.d.ts +24 -0
  93. package/dist/types/context/summarizers/base_summarizer.d.ts +19 -0
  94. package/dist/types/context/summarizers/llm_summarizer.d.ts +23 -0
  95. package/dist/types/context/token_based_context_compactor.d.ts +33 -0
  96. package/dist/types/context/truncating_context_compactor.d.ts +24 -0
  97. package/dist/types/events/compacted_event.d.ts +33 -0
  98. package/dist/types/index.d.ts +8 -0
  99. package/dist/types/runner/runner.d.ts +13 -0
  100. package/dist/types/sessions/db/operations.d.ts +2 -3
  101. package/dist/types/tools/load_artifacts_tool.d.ts +21 -0
  102. package/dist/types/tools/load_memory_tool.d.ts +22 -0
  103. package/dist/types/tools/preload_memory_tool.d.ts +23 -0
  104. package/dist/types/version.d.ts +1 -1
  105. package/dist/web/a2a/a2a_event.js +52 -26
  106. package/dist/web/a2a/a2a_remote_agent.js +184 -0
  107. package/dist/web/a2a/a2a_remote_agent_run_processor.js +182 -0
  108. package/dist/web/a2a/a2a_remote_agent_utils.js +131 -0
  109. package/dist/web/a2a/agent_card.js +340 -0
  110. package/dist/web/a2a/agent_executor.js +216 -0
  111. package/dist/web/a2a/agent_to_a2a.js +80 -0
  112. package/dist/web/a2a/event_processor_utils.js +168 -0
  113. package/dist/web/a2a/executor_context.js +1 -1
  114. package/dist/web/a2a/metadata_converter_utils.js +1 -0
  115. package/dist/web/a2a/part_converter_utils.js +24 -13
  116. package/dist/web/agents/llm_agent.js +17 -0
  117. package/dist/web/agents/{content_processor_utils.js → processors/content_processor_utils.js} +22 -2
  118. package/dist/web/agents/processors/content_request_processor.js +25 -4
  119. package/dist/web/agents/processors/context_compactor_request_processor.js +49 -0
  120. package/dist/web/agents/processors/instructions_llm_request_processor.js +1 -1
  121. package/dist/web/artifacts/file_artifact_service.js +30 -3
  122. package/dist/web/common.js +33 -1
  123. package/dist/web/context/base_context_compactor.js +5 -0
  124. package/dist/web/context/summarizers/base_summarizer.js +5 -0
  125. package/dist/web/context/summarizers/llm_summarizer.js +74 -0
  126. package/dist/web/context/token_based_context_compactor.js +105 -0
  127. package/dist/web/context/truncating_context_compactor.js +28 -0
  128. package/dist/web/events/compacted_event.js +40 -0
  129. package/dist/web/index.js +1 -1
  130. package/dist/web/index.js.map +4 -4
  131. package/dist/web/memory/in_memory_memory_service.js +1 -1
  132. package/dist/web/runner/runner.js +17 -9
  133. package/dist/web/sessions/db/operations.js +4 -14
  134. package/dist/web/sessions/state.js +2 -2
  135. package/dist/web/tools/agent_tool.js +6 -5
  136. package/dist/web/tools/load_artifacts_tool.js +150 -0
  137. package/dist/web/tools/load_memory_tool.js +77 -0
  138. package/dist/web/tools/preload_memory_tool.js +75 -0
  139. package/dist/web/utils/gemini_schema_util.js +85 -12
  140. package/dist/web/utils/logger.js +1 -0
  141. package/dist/web/version.js +1 -1
  142. package/package.json +7 -5
@@ -0,0 +1,80 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { AGENT_CARD_PATH } from "@a2a-js/sdk";
7
+ import { DefaultRequestHandler, InMemoryTaskStore } from "@a2a-js/sdk/server";
8
+ import {
9
+ agentCardHandler,
10
+ jsonRpcHandler,
11
+ restHandler,
12
+ UserBuilder
13
+ } from "@a2a-js/sdk/server/express";
14
+ import express from "express";
15
+ import { StreamingMode } from "../agents/run_config.js";
16
+ import { InMemorySessionService } from "../sessions/in_memory_session_service.js";
17
+ import { getA2AAgentCard, resolveAgentCard } from "./agent_card.js";
18
+ import { A2AAgentExecutor } from "./agent_executor.js";
19
+ async function toA2a(agent, options = {}) {
20
+ var _a, _b, _c, _d;
21
+ const host = (_a = options.host) != null ? _a : "localhost";
22
+ const port = (_b = options.port) != null ? _b : 8e3;
23
+ const protocol = (_c = options.protocol) != null ? _c : "http";
24
+ const basePath = options.basePath || "";
25
+ const rpcUrl = "".concat(protocol, "://").concat(host, ":").concat(port).concat(basePath);
26
+ const agentCard = options.agentCard ? await resolveAgentCard(options.agentCard) : await getA2AAgentCard(agent, [
27
+ {
28
+ url: "".concat(rpcUrl, "/jsonrpc"),
29
+ transport: "JSONRPC"
30
+ },
31
+ {
32
+ url: "".concat(rpcUrl, "/rest"),
33
+ transport: "HTTP+JSON"
34
+ }
35
+ ]);
36
+ const agentExecutor = new A2AAgentExecutor({
37
+ runner: options.runner || {
38
+ agent,
39
+ appName: agent.name,
40
+ sessionService: options.sessionService || new InMemorySessionService(),
41
+ memoryService: options.memoryService,
42
+ artifactService: options.artifactService
43
+ },
44
+ runConfig: {
45
+ streamingMode: StreamingMode.SSE
46
+ }
47
+ });
48
+ const requestHandler = new DefaultRequestHandler(
49
+ agentCard,
50
+ new InMemoryTaskStore(),
51
+ agentExecutor
52
+ );
53
+ const app = (_d = options.app) != null ? _d : express();
54
+ if (!options.app) {
55
+ app.use(express.urlencoded({ limit: "50mb", extended: true }));
56
+ app.use(express.json({ limit: "50mb" }));
57
+ }
58
+ app.use(
59
+ "".concat(basePath, "/").concat(AGENT_CARD_PATH),
60
+ agentCardHandler({ agentCardProvider: requestHandler })
61
+ );
62
+ app.use(
63
+ "".concat(basePath, "/rest"),
64
+ restHandler({
65
+ requestHandler,
66
+ userBuilder: UserBuilder.noAuthentication
67
+ })
68
+ );
69
+ app.use(
70
+ "".concat(basePath, "/jsonrpc"),
71
+ jsonRpcHandler({
72
+ requestHandler,
73
+ userBuilder: UserBuilder.noAuthentication
74
+ })
75
+ );
76
+ return app;
77
+ }
78
+ export {
79
+ toA2a
80
+ };
@@ -0,0 +1,168 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ /**
21
+ * @license
22
+ * Copyright 2026 Google LLC
23
+ * SPDX-License-Identifier: Apache-2.0
24
+ */
25
+ import { createEventActions } from "../events/event_actions.js";
26
+ import {
27
+ createInputMissingErrorEvent,
28
+ createTaskCompletedEvent,
29
+ createTaskFailedEvent,
30
+ createTaskInputRequiredEvent,
31
+ isInputRequiredTaskStatusUpdateEvent
32
+ } from "./a2a_event.js";
33
+ import {
34
+ getA2AEventMetadata,
35
+ getA2AEventMetadataFromActions,
36
+ getA2ASessionMetadata
37
+ } from "./metadata_converter_utils.js";
38
+ import { toA2AParts, toGenAIParts } from "./part_converter_utils.js";
39
+ function getFinalTaskStatusUpdate(adkEvents, context) {
40
+ var _a, _b;
41
+ const finalEventActions = createEventActions();
42
+ for (const adkEvent of adkEvents) {
43
+ if (adkEvent.errorCode || adkEvent.errorMessage) {
44
+ return createTaskFailedEvent({
45
+ taskId: context.requestContext.taskId,
46
+ contextId: context.requestContext.contextId,
47
+ error: new Error(adkEvent.errorMessage || adkEvent.errorCode),
48
+ metadata: __spreadValues(__spreadValues({}, getA2AEventMetadata(adkEvent, context)), getA2AEventMetadataFromActions(finalEventActions))
49
+ });
50
+ }
51
+ finalEventActions.escalate = finalEventActions.escalate || ((_a = adkEvent.actions) == null ? void 0 : _a.escalate);
52
+ if ((_b = adkEvent.actions) == null ? void 0 : _b.transferToAgent) {
53
+ finalEventActions.transferToAgent = adkEvent.actions.transferToAgent;
54
+ }
55
+ }
56
+ const inputRequiredEvent = scanForInputRequiredEvents(adkEvents, context);
57
+ if (inputRequiredEvent) {
58
+ return __spreadProps(__spreadValues({}, inputRequiredEvent), {
59
+ metadata: __spreadValues(__spreadValues({}, inputRequiredEvent.metadata), getA2AEventMetadataFromActions(finalEventActions))
60
+ });
61
+ }
62
+ return createTaskCompletedEvent({
63
+ taskId: context.requestContext.taskId,
64
+ contextId: context.requestContext.contextId,
65
+ metadata: __spreadValues(__spreadValues({}, getA2ASessionMetadata(context)), getA2AEventMetadataFromActions(finalEventActions))
66
+ });
67
+ }
68
+ function scanForInputRequiredEvents(adkEvents, context) {
69
+ var _a, _b;
70
+ const inputRequiredParts = [];
71
+ const inputRequiredFunctionCallIds = /* @__PURE__ */ new Set();
72
+ for (const adkEvent of adkEvents) {
73
+ if (!((_b = (_a = adkEvent.content) == null ? void 0 : _a.parts) == null ? void 0 : _b.length)) {
74
+ continue;
75
+ }
76
+ for (const genAIPart of adkEvent.content.parts) {
77
+ const longRunningFunctionCallId = getLongRunnningFunctionCallId(
78
+ genAIPart,
79
+ adkEvent.longRunningToolIds,
80
+ inputRequiredParts
81
+ );
82
+ if (!longRunningFunctionCallId) {
83
+ continue;
84
+ }
85
+ const isAlreadyAdded = inputRequiredFunctionCallIds.has(
86
+ longRunningFunctionCallId
87
+ );
88
+ if (isAlreadyAdded) {
89
+ continue;
90
+ }
91
+ inputRequiredParts.push(genAIPart);
92
+ inputRequiredFunctionCallIds.add(longRunningFunctionCallId);
93
+ }
94
+ }
95
+ if (inputRequiredParts.length > 0) {
96
+ return createTaskInputRequiredEvent({
97
+ taskId: context.requestContext.taskId,
98
+ contextId: context.requestContext.contextId,
99
+ parts: toA2AParts(inputRequiredParts, [...inputRequiredFunctionCallIds]),
100
+ metadata: getA2ASessionMetadata(context)
101
+ });
102
+ }
103
+ return void 0;
104
+ }
105
+ function getLongRunnningFunctionCallId(genAIPart, longRunningToolIds = [], inputRequiredParts = []) {
106
+ var _a, _b, _c;
107
+ const functionCallId = (_a = genAIPart.functionCall) == null ? void 0 : _a.id;
108
+ const functionResponseId = (_b = genAIPart.functionResponse) == null ? void 0 : _b.id;
109
+ if (!functionCallId && !functionResponseId) {
110
+ return;
111
+ }
112
+ if (functionCallId && longRunningToolIds.includes(functionCallId)) {
113
+ return functionCallId;
114
+ }
115
+ if (functionResponseId && longRunningToolIds.includes(functionResponseId)) {
116
+ return functionResponseId;
117
+ }
118
+ for (const part of inputRequiredParts) {
119
+ if (((_c = part.functionCall) == null ? void 0 : _c.id) === functionResponseId) {
120
+ return functionResponseId;
121
+ }
122
+ }
123
+ return;
124
+ }
125
+ function getTaskInputRequiredEvent(task, genAIContent) {
126
+ var _a;
127
+ if (!task || !isInputRequiredTaskStatusUpdateEvent(task) || !task.status.message) {
128
+ return void 0;
129
+ }
130
+ const statusMsg = task.status.message;
131
+ const taskParts = toGenAIParts(statusMsg.parts);
132
+ for (const taskPart of taskParts) {
133
+ const functionCallId = (_a = taskPart.functionCall) == null ? void 0 : _a.id;
134
+ if (!functionCallId) {
135
+ continue;
136
+ }
137
+ const hasMatchingResponse = ((genAIContent == null ? void 0 : genAIContent.parts) || []).some(
138
+ (p) => {
139
+ var _a2;
140
+ return ((_a2 = p.functionResponse) == null ? void 0 : _a2.id) === functionCallId;
141
+ }
142
+ );
143
+ if (!hasMatchingResponse) {
144
+ return createInputMissingErrorEvent({
145
+ taskId: task.id,
146
+ contextId: task.contextId,
147
+ parts: [
148
+ ...statusMsg.parts.filter((p) => {
149
+ var _a2;
150
+ return !((_a2 = p.metadata) == null ? void 0 : _a2.validation_error);
151
+ }),
152
+ {
153
+ kind: "text",
154
+ text: "No input provided for function call id ".concat(functionCallId),
155
+ metadata: {
156
+ validation_error: true
157
+ }
158
+ }
159
+ ]
160
+ });
161
+ }
162
+ }
163
+ return void 0;
164
+ }
165
+ export {
166
+ getFinalTaskStatusUpdate,
167
+ getTaskInputRequiredEvent
168
+ };
@@ -11,7 +11,7 @@ function createExecutorContext({
11
11
  return {
12
12
  userId: session.userId,
13
13
  sessionId: session.id,
14
- agentName: session.appName,
14
+ appName: session.appName,
15
15
  readonlyState: session.state,
16
16
  events: session.events,
17
17
  userContent,
@@ -44,6 +44,7 @@ var A2AMetadataKeys = ((A2AMetadataKeys2) => {
44
44
  A2AMetadataKeys2[A2AMetadataKeys2["GROUNDING_METADATA"] = "".concat(ADK_METADATA_KEY_PREFIX, "grounding_metadata")] = "GROUNDING_METADATA";
45
45
  A2AMetadataKeys2[A2AMetadataKeys2["USAGE_METADATA"] = "".concat(ADK_METADATA_KEY_PREFIX, "usage_metadata")] = "USAGE_METADATA";
46
46
  A2AMetadataKeys2[A2AMetadataKeys2["CUSTOM_METADATA"] = "".concat(ADK_METADATA_KEY_PREFIX, "custom_metadata")] = "CUSTOM_METADATA";
47
+ A2AMetadataKeys2[A2AMetadataKeys2["VIDEO_METADATA"] = "".concat(ADK_METADATA_KEY_PREFIX, "video_metadata")] = "VIDEO_METADATA";
47
48
  return A2AMetadataKeys2;
48
49
  })(A2AMetadataKeys || {});
49
50
  var AdkMetadataKeys = ((AdkMetadataKeys2) => {
@@ -37,6 +37,10 @@ function toA2ATextPart(part) {
37
37
  return a2aPart;
38
38
  }
39
39
  function toA2AFilePart(part) {
40
+ const metadata = {};
41
+ if (part.videoMetadata) {
42
+ metadata[A2AMetadataKeys.VIDEO_METADATA] = part.videoMetadata;
43
+ }
40
44
  if (part.fileData) {
41
45
  return {
42
46
  kind: "file",
@@ -44,7 +48,7 @@ function toA2AFilePart(part) {
44
48
  uri: part.fileData.fileUri || "",
45
49
  mimeType: part.fileData.mimeType
46
50
  },
47
- metadata: {}
51
+ metadata
48
52
  };
49
53
  }
50
54
  if (part.inlineData) {
@@ -54,7 +58,7 @@ function toA2AFilePart(part) {
54
58
  bytes: part.inlineData.data || "",
55
59
  mimeType: part.inlineData.mimeType
56
60
  },
57
- metadata: {}
61
+ metadata
58
62
  };
59
63
  }
60
64
  throw new Error("Not a file part: ".concat(JSON.stringify(part)));
@@ -75,7 +79,11 @@ function toA2ADataPart(part, longRunningToolIDs = []) {
75
79
  dataPartType = "code_execution_result" /* CODE_EXEC_RESULT */;
76
80
  data = part.codeExecutionResult;
77
81
  } else {
78
- throw new Error("Unknown part type: ".concat(JSON.stringify(part)));
82
+ return {
83
+ kind: "data",
84
+ data: {},
85
+ metadata: {}
86
+ };
79
87
  }
80
88
  const metadata = {
81
89
  [A2AMetadataKeys.DATA_PART_TYPE]: dataPartType
@@ -119,21 +127,24 @@ function toGenAIPartText(a2aPart) {
119
127
  };
120
128
  }
121
129
  function toGenAIPartFile(a2aPart) {
130
+ var _a;
131
+ const part = {};
132
+ if ((_a = a2aPart.metadata) == null ? void 0 : _a[A2AMetadataKeys.VIDEO_METADATA]) {
133
+ part.videoMetadata = a2aPart.metadata[A2AMetadataKeys.VIDEO_METADATA];
134
+ }
122
135
  if ("bytes" in a2aPart.file) {
123
- return {
124
- inlineData: {
125
- data: a2aPart.file.bytes,
126
- mimeType: a2aPart.file.mimeType || ""
127
- }
136
+ part.inlineData = {
137
+ data: a2aPart.file.bytes,
138
+ mimeType: a2aPart.file.mimeType || ""
128
139
  };
140
+ return part;
129
141
  }
130
142
  if ("uri" in a2aPart.file) {
131
- return {
132
- fileData: {
133
- fileUri: a2aPart.file.uri,
134
- mimeType: a2aPart.file.mimeType || ""
135
- }
143
+ part.fileData = {
144
+ fileUri: a2aPart.file.uri,
145
+ mimeType: a2aPart.file.mimeType || ""
136
146
  };
147
+ return part;
137
148
  }
138
149
  throw new Error("Not a file part: ".concat(JSON.stringify(a2aPart)));
139
150
  }
@@ -98,6 +98,7 @@ import { AGENT_TRANSFER_LLM_REQUEST_PROCESSOR } from "./processors/agent_transfe
98
98
  import { BASIC_LLM_REQUEST_PROCESSOR } from "./processors/basic_llm_request_processor.js";
99
99
  import { CODE_EXECUTION_REQUEST_PROCESSOR } from "./processors/code_execution_request_processor.js";
100
100
  import { CONTENT_REQUEST_PROCESSOR } from "./processors/content_request_processor.js";
101
+ import { ContextCompactorRequestProcessor } from "./processors/context_compactor_request_processor.js";
101
102
  import { IDENTITY_LLM_REQUEST_PROCESSOR } from "./processors/identity_llm_request_processor.js";
102
103
  import { INSTRUCTIONS_LLM_REQUEST_PROCESSOR } from "./processors/instructions_llm_request_processor.js";
103
104
  import { REQUEST_CONFIRMATION_LLM_REQUEST_PROCESSOR } from "./processors/request_confirmation_llm_request_processor.js";
@@ -144,6 +145,22 @@ class LlmAgent extends (_b = BaseAgent, _a = LLM_AGENT_SIGNATURE_SYMBOL, _b) {
144
145
  CONTENT_REQUEST_PROCESSOR,
145
146
  CODE_EXECUTION_REQUEST_PROCESSOR
146
147
  ];
148
+ if (!config.requestProcessors && config.contextCompactors && config.contextCompactors.length > 0) {
149
+ const contentIndex = this.requestProcessors.indexOf(
150
+ CONTENT_REQUEST_PROCESSOR
151
+ );
152
+ if (contentIndex !== -1) {
153
+ this.requestProcessors.splice(
154
+ contentIndex,
155
+ 0,
156
+ new ContextCompactorRequestProcessor(config.contextCompactors)
157
+ );
158
+ } else {
159
+ this.requestProcessors.push(
160
+ new ContextCompactorRequestProcessor(config.contextCompactors)
161
+ );
162
+ }
163
+ }
147
164
  this.responseProcessors = (_h = config.responseProcessors) != null ? _h : [];
148
165
  const agentTransferDisabled = this.disallowTransferToParent && this.disallowTransferToPeers && !((_i = this.subAgents) == null ? void 0 : _i.length);
149
166
  if (!agentTransferDisabled) {
@@ -3,21 +3,29 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
+ import { createUserContent } from "@google/genai";
6
7
  import { cloneDeep } from "lodash-es";
8
+ import {
9
+ isCompactedEvent
10
+ } from "../../events/compacted_event.js";
7
11
  import {
8
12
  createEvent,
9
13
  getFunctionCalls,
10
14
  getFunctionResponses
11
- } from "../events/event.js";
15
+ } from "../../events/event.js";
12
16
  import {
13
17
  removeClientFunctionCallId,
14
18
  REQUEST_CONFIRMATION_FUNCTION_CALL_NAME,
15
19
  REQUEST_EUC_FUNCTION_CALL_NAME
16
- } from "./functions.js";
20
+ } from "../functions.js";
17
21
  function getContents(events, agentName, currentBranch) {
18
22
  var _a, _b, _c;
19
23
  const filteredEvents = [];
20
24
  for (const event of events) {
25
+ if (isCompactedEvent(event)) {
26
+ filteredEvents.push(convertCompactedEvent(event));
27
+ continue;
28
+ }
21
29
  if (!((_a = event.content) == null ? void 0 : _a.role) || ((_c = (_b = event.content.parts) == null ? void 0 : _b[0]) == null ? void 0 : _c.text) === "") {
22
30
  continue;
23
31
  }
@@ -290,6 +298,18 @@ function safeStringify(obj) {
290
298
  return String(obj);
291
299
  }
292
300
  }
301
+ function convertCompactedEvent(event) {
302
+ const content = createUserContent(
303
+ "[Previous Context Summary]:\n".concat(event.compactedContent)
304
+ );
305
+ return createEvent({
306
+ invocationId: event.invocationId,
307
+ author: "user",
308
+ content,
309
+ branch: event.branch,
310
+ timestamp: event.timestamp
311
+ });
312
+ }
293
313
  export {
294
314
  getContents,
295
315
  getCurrentTurnContents
@@ -19,11 +19,12 @@ var __asyncGenerator = (__this, __arguments, generator) => {
19
19
  * Copyright 2025 Google LLC
20
20
  * SPDX-License-Identifier: Apache-2.0
21
21
  */
22
+ import { isCompactedEvent } from "../../events/compacted_event.js";
23
+ import { isLlmAgent } from "../llm_agent.js";
22
24
  import {
23
25
  getContents,
24
26
  getCurrentTurnContents
25
- } from "../content_processor_utils.js";
26
- import { isLlmAgent } from "../llm_agent.js";
27
+ } from "./content_processor_utils.js";
27
28
  class ContentRequestProcessor {
28
29
  // eslint-disable-next-line require-yield
29
30
  runAsync(invocationContext, llmRequest) {
@@ -32,15 +33,35 @@ class ContentRequestProcessor {
32
33
  if (!agent || !isLlmAgent(agent)) {
33
34
  return;
34
35
  }
36
+ let events = invocationContext.session.events;
37
+ const compactedEvents = events.filter(isCompactedEvent);
38
+ const latestCompactedEvent = compactedEvents.length > 0 ? compactedEvents.reduce(
39
+ (latest, current) => current.endTime > latest.endTime ? current : latest
40
+ ) : void 0;
41
+ if (latestCompactedEvent) {
42
+ const remainingEvents = events.filter((event) => {
43
+ if (event === latestCompactedEvent) {
44
+ return false;
45
+ }
46
+ if (isCompactedEvent(event)) {
47
+ return false;
48
+ }
49
+ if (event.timestamp <= latestCompactedEvent.endTime) {
50
+ return false;
51
+ }
52
+ return true;
53
+ });
54
+ events = [latestCompactedEvent, ...remainingEvents];
55
+ }
35
56
  if (agent.includeContents === "default") {
36
57
  llmRequest.contents = getContents(
37
- invocationContext.session.events,
58
+ events,
38
59
  agent.name,
39
60
  invocationContext.branch
40
61
  );
41
62
  } else {
42
63
  llmRequest.contents = getCurrentTurnContents(
43
- invocationContext.session.events,
64
+ events,
44
65
  agent.name,
45
66
  invocationContext.branch
46
67
  );
@@ -0,0 +1,49 @@
1
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
2
+ var __await = function(promise, isYieldStar) {
3
+ this[0] = promise;
4
+ this[1] = isYieldStar;
5
+ };
6
+ var __asyncGenerator = (__this, __arguments, generator) => {
7
+ var resume = (k, v, yes, no) => {
8
+ try {
9
+ var x = generator[k](v), isAwait = (v = x.value) instanceof __await, done = x.done;
10
+ 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));
11
+ } catch (e) {
12
+ no(e);
13
+ }
14
+ }, method = (k) => it[k] = (x) => new Promise((yes, no) => resume(k, x, yes, no)), it = {};
15
+ return generator = generator.apply(__this, __arguments), it[__knownSymbol("asyncIterator")] = () => it, method("next"), method("throw"), method("return"), it;
16
+ };
17
+ /**
18
+ * @license
19
+ * Copyright 2026 Google LLC
20
+ * SPDX-License-Identifier: Apache-2.0
21
+ */
22
+ class ContextCompactorRequestProcessor {
23
+ constructor(compactors) {
24
+ this.compactors = compactors;
25
+ }
26
+ runAsync(invocationContext, _llmRequest) {
27
+ return __asyncGenerator(this, null, function* () {
28
+ for (const compactor of this.compactors) {
29
+ const shouldCompact = yield new __await(Promise.resolve(
30
+ compactor.shouldCompact(invocationContext)
31
+ ));
32
+ if (shouldCompact) {
33
+ const oldEvents = new Set(invocationContext.session.events);
34
+ yield new __await(Promise.resolve(compactor.compact(invocationContext)));
35
+ const newEvents = invocationContext.session.events.filter(
36
+ (e) => !oldEvents.has(e)
37
+ );
38
+ for (const e of newEvents) {
39
+ yield e;
40
+ }
41
+ return;
42
+ }
43
+ }
44
+ });
45
+ }
46
+ }
47
+ export {
48
+ ContextCompactorRequestProcessor
49
+ };
@@ -32,7 +32,7 @@ class InstructionsLlmRequestProcessor extends BaseLlmRequestProcessor {
32
32
  runAsync(invocationContext, llmRequest) {
33
33
  return __asyncGenerator(this, null, function* () {
34
34
  const agent = invocationContext.agent;
35
- if (!isLlmAgent(agent) || !isLlmAgent(agent.rootAgent)) {
35
+ if (!isLlmAgent(agent)) {
36
36
  return;
37
37
  }
38
38
  const rootAgent = agent.rootAgent;
@@ -348,8 +348,28 @@ class FileArtifactService {
348
348
  }
349
349
  }
350
350
  }
351
+ const SAFE_SEGMENT_RE = /^[a-zA-Z0-9_@-][a-zA-Z0-9_.@-]{0,255}$/;
352
+ function assertSafeSegment(value, label) {
353
+ if (!value || !SAFE_SEGMENT_RE.test(value)) {
354
+ throw new Error(
355
+ "[FileArtifactService] Invalid ".concat(label, ": value contains disallowed characters.")
356
+ );
357
+ }
358
+ }
359
+ function assertInsideRoot(resolvedPath, rootDir, label) {
360
+ const root = path.resolve(rootDir);
361
+ const resolved = path.resolve(resolvedPath);
362
+ if (!resolved.startsWith(root + path.sep) && resolved !== root) {
363
+ throw new Error(
364
+ "[FileArtifactService] ".concat(label, " escapes storage root. Resolved: ").concat(resolved, ", Root: ").concat(root)
365
+ );
366
+ }
367
+ }
351
368
  function getUserRoot(rootDir, userId) {
352
- return path.join(rootDir, "users", userId);
369
+ assertSafeSegment(userId, "userId");
370
+ const result = path.join(rootDir, "users", userId);
371
+ assertInsideRoot(result, rootDir, "userRoot");
372
+ return result;
353
373
  }
354
374
  function isUserScoped(sessionId, filename) {
355
375
  return !sessionId || filename.startsWith(USER_NAMESPACE_PREFIX);
@@ -358,7 +378,10 @@ function getUserArtifactsDir(userRoot) {
358
378
  return path.join(userRoot, "artifacts");
359
379
  }
360
380
  function getSessionArtifactsDir(baseRoot, sessionId) {
361
- return path.join(baseRoot, "sessions", sessionId, "artifacts");
381
+ assertSafeSegment(sessionId, "sessionId");
382
+ const result = path.join(baseRoot, "sessions", sessionId, "artifacts");
383
+ assertInsideRoot(result, baseRoot, "sessionArtifactsDir");
384
+ return result;
362
385
  }
363
386
  function getVersionsDir(artifactDir) {
364
387
  return path.join(artifactDir, "versions");
@@ -502,5 +525,9 @@ function asPosixPath(p) {
502
525
  return p.split(path.sep).join("/");
503
526
  }
504
527
  export {
505
- FileArtifactService
528
+ FileArtifactService,
529
+ assertInsideRoot,
530
+ assertSafeSegment,
531
+ getSessionArtifactsDir,
532
+ getUserRoot
506
533
  };