@google/adk 2.2.1 → 2.4.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 (298) hide show
  1. package/dist/cjs/a2a/a2a_remote_agent.js +4 -1
  2. package/dist/cjs/a2a/agent_card.js +102 -26
  3. package/dist/cjs/a2a/agent_to_a2a.js +1 -1
  4. package/dist/cjs/agents/agent_engine_client.js +172 -0
  5. package/dist/cjs/agents/base_agent.js +20 -4
  6. package/dist/cjs/agents/functions.js +227 -25
  7. package/dist/cjs/agents/instructions.js +6 -2
  8. package/dist/cjs/agents/invocation_context.js +26 -4
  9. package/dist/cjs/agents/langgraph_agent.js +152 -0
  10. package/dist/cjs/agents/llm_agent.js +194 -107
  11. package/dist/cjs/agents/processors/basic_llm_request_processor.js +1 -1
  12. package/dist/cjs/agents/processors/code_execution_request_processor.js +18 -6
  13. package/dist/cjs/agents/processors/content_processor_utils.js +38 -10
  14. package/dist/cjs/agents/processors/content_request_processor.js +34 -2
  15. package/dist/cjs/agents/processors/instructions_llm_request_processor.js +1 -1
  16. package/dist/cjs/agents/processors/nl_planning_processor.js +12 -3
  17. package/dist/cjs/artifacts/in_memory_artifact_service.js +14 -0
  18. package/dist/cjs/auth/auth_handler.js +37 -5
  19. package/dist/cjs/auth/auth_schemes.js +9 -0
  20. package/dist/cjs/cli/cli_eval.js +532 -0
  21. package/dist/cjs/cli/utils/envs.js +116 -0
  22. package/dist/cjs/cli/utils/evals.js +137 -0
  23. package/dist/cjs/cli/utils/logs.js +150 -0
  24. package/dist/cjs/code_executors/agent_engine_sandbox_code_executor.js +7 -2
  25. package/dist/cjs/code_executors/code_execution_utils.js +48 -16
  26. package/dist/cjs/code_executors/code_executor_context.js +6 -2
  27. package/dist/cjs/code_executors/container_code_executor.js +27 -16
  28. package/dist/cjs/code_executors/unsafe_local_code_executor.js +6 -1
  29. package/dist/cjs/common.js +61 -0
  30. package/dist/cjs/context/summarizers/llm_summarizer.js +12 -10
  31. package/dist/cjs/context/token_based_context_compactor.js +2 -1
  32. package/dist/cjs/errors/input_validation_error.js +3 -2
  33. package/dist/cjs/events/event.js +4 -2
  34. package/dist/cjs/examples/example_util.js +23 -2
  35. package/dist/cjs/flows/llm_flows/audio_transcriber.js +170 -0
  36. package/dist/cjs/index.js +104 -1
  37. package/dist/cjs/integrations/agent_registry/helpers.js +1 -1
  38. package/dist/cjs/models/gemini_llm_connection.js +16 -8
  39. package/dist/cjs/models/google_llm.js +13 -16
  40. package/dist/cjs/models/llm_response.js +9 -1
  41. package/dist/cjs/models/registry.js +1 -1
  42. package/dist/cjs/models/routed_llm.js +9 -8
  43. package/dist/cjs/planners/plan_re_act_planner.js +1 -1
  44. package/dist/cjs/plugins/base_plugin.js +13 -23
  45. package/dist/cjs/runner/in_memory_runner.js +6 -11
  46. package/dist/cjs/runner/runner.js +105 -33
  47. package/dist/cjs/sessions/base_session_service.js +14 -8
  48. package/dist/cjs/sessions/database_session_service.js +50 -28
  49. package/dist/cjs/sessions/db/operations.js +1 -1
  50. package/dist/cjs/sessions/in_memory_session_service.js +3 -1
  51. package/dist/cjs/sessions/stale_session_error.js +59 -0
  52. package/dist/cjs/sessions/state.js +8 -4
  53. package/dist/cjs/sessions/vertex_ai_session_service.js +34 -15
  54. package/dist/cjs/skills/loader.js +52 -18
  55. package/dist/cjs/telemetry/setup.js +0 -1
  56. package/dist/cjs/telemetry/tracing.js +147 -73
  57. package/dist/cjs/tools/agent_tool.js +44 -0
  58. package/dist/cjs/tools/apihub_tool/apihub_toolset.js +137 -0
  59. package/dist/cjs/tools/apihub_tool/clients/apihub_client.js +272 -0
  60. package/dist/cjs/tools/apihub_tool/clients/secret_client.js +148 -0
  61. package/dist/cjs/tools/apihub_tool/clients/service_account.js +48 -0
  62. package/dist/cjs/tools/application_integration_tool/application_integration_toolset.js +263 -0
  63. package/dist/cjs/tools/application_integration_tool/clients/cloud_request.js +133 -0
  64. package/dist/cjs/tools/application_integration_tool/clients/connections_client.js +671 -0
  65. package/dist/cjs/tools/application_integration_tool/clients/integration_client.js +223 -0
  66. package/dist/cjs/tools/application_integration_tool/integration_connector_tool.js +184 -0
  67. package/dist/cjs/tools/example_tool.js +10 -0
  68. package/dist/cjs/tools/function_tool.js +319 -0
  69. package/dist/cjs/tools/google_api_tool/google_api_tool.js +100 -0
  70. package/dist/cjs/tools/google_api_tool/google_api_toolset.js +173 -0
  71. package/dist/cjs/tools/google_api_tool/google_api_toolsets.js +124 -0
  72. package/dist/cjs/tools/google_api_tool/googleapi_to_openapi_converter.js +440 -0
  73. package/dist/cjs/tools/google_api_tool/index.js +61 -0
  74. package/dist/cjs/tools/load_artifacts_tool.js +12 -6
  75. package/dist/cjs/tools/load_memory_tool.js +12 -10
  76. package/dist/cjs/tools/mcp/index.js +12 -0
  77. package/dist/cjs/tools/mcp/mcp_session_manager.js +25 -0
  78. package/dist/cjs/tools/mcp/mcp_toolset.js +1 -14
  79. package/dist/cjs/tools/openapi_tool/auth/auth_helpers.js +1 -2
  80. package/dist/cjs/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.js +46 -2
  81. package/dist/cjs/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.js +4 -3
  82. package/dist/cjs/tools/openapi_tool/auth/credential_exchangers/service_account_exchanger.js +94 -10
  83. package/dist/cjs/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.js +20 -6
  84. package/dist/cjs/tools/openapi_tool/openapi_spec_parser/operation_parser.js +17 -6
  85. package/dist/cjs/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.js +14 -2
  86. package/dist/cjs/tools/openapi_tool/openapi_toolset.js +7 -13
  87. package/dist/cjs/tools/openapi_tool/rest_api_tool.js +17 -1
  88. package/dist/cjs/tools/retrieval/base_retrieval_tool.js +18 -3
  89. package/dist/cjs/tools/toolbox_toolset.js +174 -0
  90. package/dist/cjs/tools/webmcp/webmcp_toolset.js +1 -14
  91. package/dist/cjs/utils/client_labels.js +19 -2
  92. package/dist/cjs/utils/env_aware_utils.js +6 -8
  93. package/dist/cjs/utils/error_utils.js +11 -11
  94. package/dist/cjs/utils/failover_utils.js +1 -1
  95. package/dist/cjs/utils/file_extension_utils.js +11 -0
  96. package/dist/cjs/utils/file_utils.js +2 -24
  97. package/dist/cjs/utils/gemini_schema_util.js +28 -7
  98. package/dist/cjs/utils/json_utils.js +49 -0
  99. package/dist/cjs/utils/live_connection_utils.js +4 -5
  100. package/dist/cjs/utils/logger_node.js +11 -1
  101. package/dist/cjs/utils/object_notation_utils.js +6 -3
  102. package/dist/cjs/utils/output_schema_utils.js +5 -2
  103. package/dist/cjs/utils/streaming_utils.js +12 -12
  104. package/dist/cjs/utils/task.js +1 -1
  105. package/dist/cjs/version.js +1 -1
  106. package/dist/esm/a2a/a2a_remote_agent.js +4 -1
  107. package/dist/esm/a2a/agent_card.js +103 -27
  108. package/dist/esm/a2a/agent_to_a2a.js +5 -2
  109. package/dist/esm/agents/agent_engine_client.js +144 -0
  110. package/dist/esm/agents/base_agent.js +20 -4
  111. package/dist/esm/agents/functions.js +226 -25
  112. package/dist/esm/agents/instructions.js +6 -2
  113. package/dist/esm/agents/invocation_context.js +24 -4
  114. package/dist/esm/agents/langgraph_agent.js +123 -0
  115. package/dist/esm/agents/llm_agent.js +204 -110
  116. package/dist/esm/agents/processors/basic_llm_request_processor.js +1 -1
  117. package/dist/esm/agents/processors/code_execution_request_processor.js +21 -8
  118. package/dist/esm/agents/processors/content_processor_utils.js +38 -10
  119. package/dist/esm/agents/processors/content_request_processor.js +34 -2
  120. package/dist/esm/agents/processors/instructions_llm_request_processor.js +1 -1
  121. package/dist/esm/agents/processors/nl_planning_processor.js +12 -3
  122. package/dist/esm/artifacts/in_memory_artifact_service.js +14 -0
  123. package/dist/esm/auth/auth_handler.js +37 -5
  124. package/dist/esm/auth/auth_schemes.js +8 -0
  125. package/dist/esm/cli/cli_eval.js +510 -0
  126. package/dist/esm/cli/utils/envs.js +78 -0
  127. package/dist/esm/cli/utils/evals.js +109 -0
  128. package/dist/esm/cli/utils/logs.js +111 -0
  129. package/dist/esm/code_executors/agent_engine_sandbox_code_executor.js +7 -2
  130. package/dist/esm/code_executors/code_execution_utils.js +46 -16
  131. package/dist/esm/code_executors/code_executor_context.js +5 -2
  132. package/dist/esm/code_executors/container_code_executor.js +27 -16
  133. package/dist/esm/code_executors/unsafe_local_code_executor.js +6 -1
  134. package/dist/esm/common.js +65 -4
  135. package/dist/esm/context/summarizers/llm_summarizer.js +12 -10
  136. package/dist/esm/context/token_based_context_compactor.js +2 -1
  137. package/dist/esm/errors/input_validation_error.js +3 -2
  138. package/dist/esm/events/event.js +4 -2
  139. package/dist/esm/examples/example_util.js +21 -1
  140. package/dist/esm/flows/llm_flows/audio_transcriber.js +142 -0
  141. package/dist/esm/index.js +114 -2
  142. package/dist/esm/integrations/agent_registry/helpers.js +1 -1
  143. package/dist/esm/models/gemini_llm_connection.js +16 -8
  144. package/dist/esm/models/google_llm.js +14 -17
  145. package/dist/esm/models/llm_response.js +9 -1
  146. package/dist/esm/models/registry.js +1 -1
  147. package/dist/esm/models/routed_llm.js +9 -8
  148. package/dist/esm/planners/plan_re_act_planner.js +1 -1
  149. package/dist/esm/plugins/base_plugin.js +13 -23
  150. package/dist/esm/runner/in_memory_runner.js +6 -11
  151. package/dist/esm/runner/runner.js +105 -33
  152. package/dist/esm/sessions/base_session_service.js +12 -7
  153. package/dist/esm/sessions/database_session_service.js +49 -28
  154. package/dist/esm/sessions/db/operations.js +1 -1
  155. package/dist/esm/sessions/in_memory_session_service.js +3 -1
  156. package/dist/esm/sessions/stale_session_error.js +31 -0
  157. package/dist/esm/sessions/state.js +8 -4
  158. package/dist/esm/sessions/vertex_ai_session_service.js +34 -15
  159. package/dist/esm/skills/loader.js +51 -17
  160. package/dist/esm/telemetry/setup.js +1 -2
  161. package/dist/esm/telemetry/tracing.js +151 -74
  162. package/dist/esm/tools/agent_tool.js +44 -0
  163. package/dist/esm/tools/apihub_tool/apihub_toolset.js +101 -0
  164. package/dist/esm/tools/apihub_tool/clients/apihub_client.js +244 -0
  165. package/dist/esm/tools/apihub_tool/clients/secret_client.js +132 -0
  166. package/dist/esm/tools/apihub_tool/clients/service_account.js +21 -0
  167. package/dist/esm/tools/application_integration_tool/application_integration_toolset.js +245 -0
  168. package/dist/esm/tools/application_integration_tool/clients/cloud_request.js +103 -0
  169. package/dist/esm/tools/application_integration_tool/clients/connections_client.js +629 -0
  170. package/dist/esm/tools/application_integration_tool/clients/integration_client.js +219 -0
  171. package/dist/esm/tools/application_integration_tool/integration_connector_tool.js +158 -0
  172. package/dist/esm/tools/example_tool.js +13 -1
  173. package/dist/esm/tools/function_tool.js +316 -0
  174. package/dist/esm/tools/google_api_tool/google_api_tool.js +73 -0
  175. package/dist/esm/tools/google_api_tool/google_api_toolset.js +146 -0
  176. package/dist/esm/tools/google_api_tool/google_api_toolsets.js +94 -0
  177. package/dist/esm/tools/google_api_tool/googleapi_to_openapi_converter.js +393 -0
  178. package/dist/esm/tools/google_api_tool/index.js +31 -0
  179. package/dist/esm/tools/load_artifacts_tool.js +10 -5
  180. package/dist/esm/tools/load_memory_tool.js +12 -10
  181. package/dist/esm/tools/mcp/index.js +6 -0
  182. package/dist/esm/tools/mcp/mcp_session_manager.js +25 -0
  183. package/dist/esm/tools/mcp/mcp_toolset.js +1 -14
  184. package/dist/esm/tools/openapi_tool/auth/auth_helpers.js +1 -2
  185. package/dist/esm/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.js +50 -3
  186. package/dist/esm/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.js +4 -3
  187. package/dist/esm/tools/openapi_tool/auth/credential_exchangers/service_account_exchanger.js +94 -10
  188. package/dist/esm/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.js +20 -6
  189. package/dist/esm/tools/openapi_tool/openapi_spec_parser/operation_parser.js +17 -6
  190. package/dist/esm/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.js +15 -2
  191. package/dist/esm/tools/openapi_tool/openapi_toolset.js +6 -12
  192. package/dist/esm/tools/openapi_tool/rest_api_tool.js +17 -1
  193. package/dist/esm/tools/retrieval/base_retrieval_tool.js +16 -2
  194. package/dist/esm/tools/toolbox_toolset.js +148 -0
  195. package/dist/esm/tools/webmcp/webmcp_toolset.js +1 -14
  196. package/dist/esm/utils/client_labels.js +19 -2
  197. package/dist/esm/utils/env_aware_utils.js +6 -8
  198. package/dist/esm/utils/error_utils.js +9 -10
  199. package/dist/esm/utils/failover_utils.js +1 -1
  200. package/dist/esm/utils/file_extension_utils.js +11 -0
  201. package/dist/esm/utils/file_utils.js +2 -23
  202. package/dist/esm/utils/gemini_schema_util.js +27 -7
  203. package/dist/esm/utils/json_utils.js +21 -0
  204. package/dist/esm/utils/live_connection_utils.js +4 -5
  205. package/dist/esm/utils/logger_node.js +11 -1
  206. package/dist/esm/utils/object_notation_utils.js +4 -2
  207. package/dist/esm/utils/output_schema_utils.js +5 -2
  208. package/dist/esm/utils/streaming_utils.js +11 -11
  209. package/dist/esm/utils/task.js +1 -1
  210. package/dist/esm/version.js +1 -1
  211. package/dist/types/a2a/a2a_remote_agent.d.ts +9 -0
  212. package/dist/types/a2a/agent_card.d.ts +44 -1
  213. package/dist/types/a2a/agent_to_a2a.d.ts +9 -0
  214. package/dist/types/a2a/index.d.ts +1 -0
  215. package/dist/types/agents/agent_engine_client.d.ts +37 -0
  216. package/dist/types/agents/base_agent.d.ts +12 -0
  217. package/dist/types/agents/functions.d.ts +33 -1
  218. package/dist/types/agents/invocation_context.d.ts +20 -1
  219. package/dist/types/agents/langgraph_agent.d.ts +153 -0
  220. package/dist/types/agents/llm_agent.d.ts +5 -1
  221. package/dist/types/agents/processors/content_processor_utils.d.ts +4 -2
  222. package/dist/types/agents/processors/nl_planning_processor.d.ts +2 -1
  223. package/dist/types/auth/auth_handler.d.ts +28 -1
  224. package/dist/types/auth/auth_schemes.d.ts +13 -0
  225. package/dist/types/cli/cli_eval.d.ts +173 -0
  226. package/dist/types/cli/utils/envs.d.ts +23 -0
  227. package/dist/types/cli/utils/evals.d.ts +47 -0
  228. package/dist/types/cli/utils/logs.d.ts +38 -0
  229. package/dist/types/code_executors/code_execution_utils.d.ts +39 -0
  230. package/dist/types/code_executors/code_executor_context.d.ts +1 -0
  231. package/dist/types/code_executors/container_code_executor.d.ts +17 -5
  232. package/dist/types/common.d.ts +24 -5
  233. package/dist/types/errors/input_validation_error.d.ts +2 -1
  234. package/dist/types/events/event.d.ts +4 -0
  235. package/dist/types/examples/example_util.d.ts +17 -0
  236. package/dist/types/flows/llm_flows/audio_transcriber.d.ts +85 -0
  237. package/dist/types/index.d.ts +19 -2
  238. package/dist/types/models/gemini_llm_connection.d.ts +6 -7
  239. package/dist/types/models/routed_llm.d.ts +1 -1
  240. package/dist/types/plugins/base_plugin.d.ts +0 -10
  241. package/dist/types/runner/in_memory_runner.d.ts +2 -1
  242. package/dist/types/runner/runner.d.ts +34 -0
  243. package/dist/types/sessions/base_session_service.d.ts +5 -0
  244. package/dist/types/sessions/database_session_service.d.ts +17 -1
  245. package/dist/types/sessions/stale_session_error.d.ts +21 -0
  246. package/dist/types/sessions/state.d.ts +5 -1
  247. package/dist/types/sessions/vertex_ai_session_service.d.ts +8 -0
  248. package/dist/types/skills/loader.d.ts +3 -2
  249. package/dist/types/skills/skill.d.ts +1 -1
  250. package/dist/types/telemetry/tracing.d.ts +20 -4
  251. package/dist/types/tools/apihub_tool/apihub_toolset.d.ts +115 -0
  252. package/dist/types/tools/apihub_tool/clients/apihub_client.d.ts +142 -0
  253. package/dist/types/tools/apihub_tool/clients/secret_client.d.ts +55 -0
  254. package/dist/types/tools/apihub_tool/clients/service_account.d.ts +11 -0
  255. package/dist/types/tools/application_integration_tool/application_integration_toolset.d.ts +109 -0
  256. package/dist/types/tools/application_integration_tool/clients/cloud_request.d.ts +53 -0
  257. package/dist/types/tools/application_integration_tool/clients/connections_client.d.ts +229 -0
  258. package/dist/types/tools/application_integration_tool/clients/integration_client.d.ts +72 -0
  259. package/dist/types/tools/application_integration_tool/integration_connector_tool.d.ts +70 -0
  260. package/dist/types/tools/base_toolset.d.ts +6 -5
  261. package/dist/types/tools/example_tool.d.ts +10 -0
  262. package/dist/types/tools/function_tool.d.ts +32 -0
  263. package/dist/types/tools/google_api_tool/google_api_tool.d.ts +37 -0
  264. package/dist/types/tools/google_api_tool/google_api_toolset.d.ts +55 -0
  265. package/dist/types/tools/google_api_tool/google_api_toolsets.d.ts +48 -0
  266. package/dist/types/tools/google_api_tool/googleapi_to_openapi_converter.d.ts +165 -0
  267. package/dist/types/tools/google_api_tool/index.d.ts +10 -0
  268. package/dist/types/tools/load_artifacts_tool.d.ts +14 -1
  269. package/dist/types/tools/load_memory_tool.d.ts +23 -1
  270. package/dist/types/tools/mcp/index.d.ts +3 -0
  271. package/dist/types/tools/mcp/mcp_session_manager.d.ts +34 -1
  272. package/dist/types/tools/mcp/mcp_toolset.d.ts +15 -0
  273. package/dist/types/tools/openapi_tool/auth/auth_helpers.d.ts +19 -0
  274. package/dist/types/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.d.ts +18 -1
  275. package/dist/types/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.d.ts +12 -0
  276. package/dist/types/tools/openapi_tool/openapi_spec_parser/operation_parser.d.ts +8 -0
  277. package/dist/types/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.d.ts +2 -1
  278. package/dist/types/tools/openapi_tool/openapi_toolset.d.ts +5 -0
  279. package/dist/types/tools/openapi_tool/rest_api_tool.d.ts +10 -0
  280. package/dist/types/tools/retrieval/base_retrieval_tool.d.ts +15 -0
  281. package/dist/types/tools/toolbox_toolset.d.ts +159 -0
  282. package/dist/types/utils/client_labels.d.ts +2 -1
  283. package/dist/types/utils/env_aware_utils.d.ts +18 -2
  284. package/dist/types/utils/error_utils.d.ts +7 -0
  285. package/dist/types/utils/file_utils.d.ts +6 -1
  286. package/dist/types/utils/gemini_schema_util.d.ts +9 -2
  287. package/dist/types/utils/json_utils.d.ts +11 -0
  288. package/dist/types/utils/object_notation_utils.d.ts +7 -0
  289. package/dist/types/utils/output_schema_utils.d.ts +3 -2
  290. package/dist/types/utils/simple_zod_to_json.d.ts +1 -2
  291. package/dist/types/utils/streaming_utils.d.ts +11 -4
  292. package/dist/types/version.d.ts +1 -1
  293. package/dist/web/index_web.js +117 -110
  294. package/dist/web/index_web.js.map +4 -4
  295. package/package.json +38 -26
  296. package/dist/cjs/models/gemini_continuation.js +0 -232
  297. package/dist/esm/models/gemini_continuation.js +0 -205
  298. package/dist/types/models/gemini_continuation.d.ts +0 -59
@@ -0,0 +1,137 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ "use strict";
8
+ var __defProp = Object.defineProperty;
9
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
10
+ var __getOwnPropNames = Object.getOwnPropertyNames;
11
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
12
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
13
+ var __export = (target, all) => {
14
+ for (var name in all)
15
+ __defProp(target, name, { get: all[name], enumerable: true });
16
+ };
17
+ var __copyProps = (to, from, except, desc) => {
18
+ if (from && typeof from === "object" || typeof from === "function") {
19
+ for (let key of __getOwnPropNames(from))
20
+ if (!__hasOwnProp.call(to, key) && key !== except)
21
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
22
+ }
23
+ return to;
24
+ };
25
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
26
+ var evals_exports = {};
27
+ __export(evals_exports, {
28
+ convertSessionToEvalFormat: () => convertSessionToEvalFormat,
29
+ createEmptyState: () => createEmptyState
30
+ });
31
+ module.exports = __toCommonJS(evals_exports);
32
+ var import_llm_agent = require("../../agents/llm_agent.js");
33
+ /**
34
+ * @license
35
+ * Copyright 2026 Google LLC
36
+ * SPDX-License-Identifier: Apache-2.0
37
+ */
38
+ function convertSessionToEvalFormat(session) {
39
+ var _a, _b, _c;
40
+ const events = session && session.events ? session.events : [];
41
+ const evalCases = [];
42
+ let i = 0;
43
+ while (i < events.length) {
44
+ const event = events[i];
45
+ if (event.author === "user") {
46
+ let userQuery = "";
47
+ if (event.content && event.content.parts) {
48
+ for (const part of event.content.parts) {
49
+ if (part.text) {
50
+ userQuery = part.text;
51
+ break;
52
+ }
53
+ }
54
+ }
55
+ const expectedToolUse = [];
56
+ const expectedIntermediateAgentResponses = [];
57
+ let finalResponse = "";
58
+ let j = i + 1;
59
+ while (j < events.length) {
60
+ const subsequentEvent = events[j];
61
+ if (subsequentEvent.author === "user") {
62
+ break;
63
+ }
64
+ if (subsequentEvent.content && subsequentEvent.content.parts) {
65
+ let hasToolAction = false;
66
+ for (const part of subsequentEvent.content.parts) {
67
+ if (part.functionCall) {
68
+ expectedToolUse.push({
69
+ tool_name: (_a = part.functionCall.name) != null ? _a : "",
70
+ tool_input: (_b = part.functionCall.args) != null ? _b : {}
71
+ });
72
+ hasToolAction = true;
73
+ } else if (part.functionResponse) {
74
+ hasToolAction = true;
75
+ }
76
+ }
77
+ if (!hasToolAction) {
78
+ expectedIntermediateAgentResponses.push([
79
+ (_c = subsequentEvent.author) != null ? _c : "",
80
+ subsequentEvent.content.parts
81
+ ]);
82
+ }
83
+ }
84
+ j += 1;
85
+ }
86
+ if (expectedIntermediateAgentResponses.length > 0) {
87
+ const lastResponse = expectedIntermediateAgentResponses.pop();
88
+ if (lastResponse) {
89
+ const [, lastParts] = lastResponse;
90
+ finalResponse = lastParts.filter((part) => Boolean(part.text)).map((part) => {
91
+ var _a2;
92
+ return (_a2 = part.text) != null ? _a2 : "";
93
+ }).join("");
94
+ }
95
+ }
96
+ evalCases.push({
97
+ query: userQuery,
98
+ expected_tool_use: expectedToolUse,
99
+ expected_intermediate_agent_responses: expectedIntermediateAgentResponses,
100
+ reference: finalResponse
101
+ });
102
+ i = j;
103
+ } else {
104
+ i += 1;
105
+ }
106
+ }
107
+ return evalCases;
108
+ }
109
+ __name(convertSessionToEvalFormat, "convertSessionToEvalFormat");
110
+ function populateEmptyState(agent, allState) {
111
+ for (const subAgent of agent.subAgents) {
112
+ populateEmptyState(subAgent, allState);
113
+ }
114
+ if ((0, import_llm_agent.isLlmAgent)(agent) && agent.instruction && typeof agent.instruction === "string") {
115
+ const matches = agent.instruction.matchAll(/\{([\w]+)\}/g);
116
+ for (const match of matches) {
117
+ allState[match[1]] = "";
118
+ }
119
+ }
120
+ }
121
+ __name(populateEmptyState, "populateEmptyState");
122
+ function createEmptyState(agent, initializedStates) {
123
+ const subAgentsState = {};
124
+ populateEmptyState(agent, subAgentsState);
125
+ if (initializedStates) {
126
+ for (const [k, v] of Object.entries(initializedStates)) {
127
+ subAgentsState[k] = v;
128
+ }
129
+ }
130
+ return subAgentsState;
131
+ }
132
+ __name(createEmptyState, "createEmptyState");
133
+ // Annotate the CommonJS export names for ESM import in node:
134
+ 0 && (module.exports = {
135
+ convertSessionToEvalFormat,
136
+ createEmptyState
137
+ });
@@ -0,0 +1,150 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ "use strict";
8
+ var __create = Object.create;
9
+ var __defProp = Object.defineProperty;
10
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
11
+ var __getOwnPropNames = Object.getOwnPropertyNames;
12
+ var __getProtoOf = Object.getPrototypeOf;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
15
+ var __export = (target, all) => {
16
+ for (var name in all)
17
+ __defProp(target, name, { get: all[name], enumerable: true });
18
+ };
19
+ var __copyProps = (to, from, except, desc) => {
20
+ if (from && typeof from === "object" || typeof from === "function") {
21
+ for (let key of __getOwnPropNames(from))
22
+ if (!__hasOwnProp.call(to, key) && key !== except)
23
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
24
+ }
25
+ return to;
26
+ };
27
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
28
+ // If the importer is in node compatibility mode or this is not an ESM
29
+ // file that has been converted to a CommonJS file using a Babel-
30
+ // compatible transform (i.e. "__esModule" has not been set), then set
31
+ // "default" to the CommonJS "module.exports" for node compatibility.
32
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
33
+ mod
34
+ ));
35
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
36
+ var logs_exports = {};
37
+ __export(logs_exports, {
38
+ LOGGING_FORMAT: () => LOGGING_FORMAT,
39
+ logToTmpFolder: () => logToTmpFolder,
40
+ setupAdkLogger: () => setupAdkLogger
41
+ });
42
+ module.exports = __toCommonJS(logs_exports);
43
+ var fs = __toESM(require("node:fs"), 1);
44
+ var os = __toESM(require("node:os"), 1);
45
+ var path = __toESM(require("node:path"), 1);
46
+ var util = __toESM(require("node:util"), 1);
47
+ var import_logger = require("../../utils/logger.js");
48
+ /**
49
+ * @license
50
+ * Copyright 2026 Google LLC
51
+ * SPDX-License-Identifier: Apache-2.0
52
+ */
53
+ const LOGGING_FORMAT = "%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s";
54
+ const LOG_LEVEL_NAMES = {
55
+ [import_logger.LogLevel.DEBUG]: "DEBUG",
56
+ [import_logger.LogLevel.INFO]: "INFO",
57
+ [import_logger.LogLevel.WARN]: "WARNING",
58
+ [import_logger.LogLevel.ERROR]: "ERROR"
59
+ };
60
+ function formatDateTimestamp(date) {
61
+ const pad = /* @__PURE__ */ __name((n) => String(n).padStart(2, "0"), "pad");
62
+ return `${date.getFullYear()}${pad(date.getMonth() + 1)}${pad(date.getDate())}_${pad(date.getHours())}${pad(date.getMinutes())}${pad(date.getSeconds())}`;
63
+ }
64
+ __name(formatDateTimestamp, "formatDateTimestamp");
65
+ function formatLogLine(level, messages) {
66
+ var _a;
67
+ const iso = (/* @__PURE__ */ new Date()).toISOString();
68
+ const levelName = (_a = LOG_LEVEL_NAMES[level]) != null ? _a : "INFO";
69
+ const formattedMessage = messages.map((m) => typeof m === "string" ? m : util.inspect(m, { depth: null })).join(" ");
70
+ return `${iso} - ${levelName} - ${formattedMessage}`;
71
+ }
72
+ __name(formatLogLine, "formatLogLine");
73
+ function createWriterLogger(initialLevel, writeLine) {
74
+ let currentLevel = initialLevel;
75
+ const logAt = /* @__PURE__ */ __name((targetLevel, messages) => {
76
+ if (currentLevel <= targetLevel) {
77
+ writeLine(formatLogLine(targetLevel, messages));
78
+ }
79
+ }, "logAt");
80
+ return {
81
+ setLogLevel(level) {
82
+ currentLevel = level;
83
+ },
84
+ log(level, ...messages) {
85
+ logAt(level, messages);
86
+ },
87
+ debug(...messages) {
88
+ logAt(import_logger.LogLevel.DEBUG, messages);
89
+ },
90
+ info(...messages) {
91
+ logAt(import_logger.LogLevel.INFO, messages);
92
+ },
93
+ warn(...messages) {
94
+ logAt(import_logger.LogLevel.WARN, messages);
95
+ },
96
+ error(...messages) {
97
+ logAt(import_logger.LogLevel.ERROR, messages);
98
+ }
99
+ };
100
+ }
101
+ __name(createWriterLogger, "createWriterLogger");
102
+ function setupAdkLogger(level = import_logger.LogLevel.INFO) {
103
+ (0, import_logger.setLogLevel)(level);
104
+ (0, import_logger.setLogger)(
105
+ createWriterLogger(level, (line) => {
106
+ process.stderr.write(`${line}
107
+ `);
108
+ })
109
+ );
110
+ }
111
+ __name(setupAdkLogger, "setupAdkLogger");
112
+ function logToTmpFolder(options = {}) {
113
+ const {
114
+ level = import_logger.LogLevel.INFO,
115
+ subFolder = "agents_log",
116
+ logFilePrefix = "agent",
117
+ logFileTimestamp = formatDateTimestamp(/* @__PURE__ */ new Date())
118
+ } = options;
119
+ const logDir = path.join(os.tmpdir(), subFolder);
120
+ fs.mkdirSync(logDir, { recursive: true });
121
+ const logFilename = `${logFilePrefix}.${logFileTimestamp}.log`;
122
+ const logFilepath = path.join(logDir, logFilename);
123
+ fs.writeFileSync(logFilepath, "", "utf-8");
124
+ (0, import_logger.setLogLevel)(level);
125
+ const fileLogger = createWriterLogger(level, (line) => {
126
+ fs.appendFileSync(logFilepath, `${line}
127
+ `, "utf-8");
128
+ });
129
+ (0, import_logger.setLogger)(fileLogger);
130
+ const latestLogLink = path.join(logDir, `${logFilePrefix}.latest.log`);
131
+ try {
132
+ try {
133
+ fs.lstatSync(latestLogLink);
134
+ fs.unlinkSync(latestLogLink);
135
+ } catch {
136
+ }
137
+ fs.symlinkSync(logFilepath, latestLogLink);
138
+ } catch (e) {
139
+ fileLogger.warn(`Failed to create symlink to latest log: ${String(e)}`);
140
+ }
141
+ fileLogger.info(`Log setup complete: ${logFilepath}`);
142
+ return logFilepath;
143
+ }
144
+ __name(logToTmpFolder, "logToTmpFolder");
145
+ // Annotate the CommonJS export names for ESM import in node:
146
+ 0 && (module.exports = {
147
+ LOGGING_FORMAT,
148
+ logToTmpFolder,
149
+ setupAdkLogger
150
+ });
@@ -43,6 +43,7 @@ var import_file_utils = require("../utils/file_utils.js");
43
43
  var import_logger = require("../utils/logger.js");
44
44
  var import_base_code_executor = require("./base_code_executor.js");
45
45
  var import_code_execution_utils = require("./code_execution_utils.js");
46
+ var import_code_executor_context = require("./code_executor_context.js");
46
47
  /**
47
48
  * @license
48
49
  * Copyright 2026 Google LLC
@@ -231,12 +232,14 @@ let AgentEngineSandboxCodeExecutor = class extends import_base_code_executor.Bas
231
232
  return this.agentEngineCreationPromise;
232
233
  }
233
234
  async getOrCreateSandbox(invocationContext, agentEngineName, language) {
234
- var _a, _b;
235
+ var _a, _b, _c, _d, _e;
235
236
  if (this.sandboxResourceName) {
236
237
  return this.sandboxResourceName;
237
238
  }
238
239
  const stateKey = `sandbox_name_${language.toLowerCase()}`;
239
- let sandboxName = (_b = (_a = invocationContext.session) == null ? void 0 : _a.state) == null ? void 0 : _b[stateKey];
240
+ const state = (_a = invocationContext.session) == null ? void 0 : _a.state;
241
+ const codeExecutionContext = state == null ? void 0 : state[import_code_executor_context.CONTEXT_KEY];
242
+ let sandboxName = (_b = state == null ? void 0 : state[stateKey]) != null ? _b : codeExecutionContext == null ? void 0 : codeExecutionContext[stateKey];
240
243
  let createNewSandbox = false;
241
244
  if (!sandboxName) {
242
245
  createNewSandbox = true;
@@ -293,6 +296,8 @@ let AgentEngineSandboxCodeExecutor = class extends import_base_code_executor.Bas
293
296
  invocationContext.session.state = {};
294
297
  }
295
298
  invocationContext.session.state[stateKey] = sandboxName;
299
+ const context = (_e = (_c = invocationContext.session.state)[_d = import_code_executor_context.CONTEXT_KEY]) != null ? _e : _c[_d] = {};
300
+ context[stateKey] = sandboxName;
296
301
  }
297
302
  }
298
303
  return sandboxName;
@@ -31,6 +31,8 @@ __export(code_execution_utils_exports, {
31
31
  buildExecutableCodePart: () => buildExecutableCodePart,
32
32
  convertCodeExecutionParts: () => convertCodeExecutionParts,
33
33
  extractCodeAndTruncateContent: () => extractCodeAndTruncateContent,
34
+ extractCodeBlockAndTruncateContent: () => extractCodeBlockAndTruncateContent,
35
+ getCodeBlockLanguage: () => getCodeBlockLanguage,
34
36
  getEncodedFileContent: () => getEncodedFileContent
35
37
  });
36
38
  module.exports = __toCommonJS(code_execution_utils_exports);
@@ -61,33 +63,62 @@ function getEncodedFileContent(data) {
61
63
  return (0, import_env_aware_utils.isBase64Encoded)(data) ? data : (0, import_env_aware_utils.base64Encode)(data);
62
64
  }
63
65
  __name(getEncodedFileContent, "getEncodedFileContent");
66
+ const FENCE_TAG_LANGUAGE_MAP = {
67
+ tool_code: "python" /* PYTHON */,
68
+ python: "python" /* PYTHON */,
69
+ py: "python" /* PYTHON */,
70
+ javascript: "javascript" /* JAVASCRIPT */,
71
+ js: "javascript" /* JAVASCRIPT */,
72
+ typescript: "typescript" /* TYPESCRIPT */,
73
+ ts: "typescript" /* TYPESCRIPT */,
74
+ bash: "shell" /* SHELL */,
75
+ sh: "shell" /* SHELL */,
76
+ shell: "shell" /* SHELL */
77
+ };
78
+ const NO_CODE_BLOCK = Object.freeze({
79
+ code: "",
80
+ language: "unspecified" /* UNSPECIFIED */
81
+ });
82
+ function getCodeBlockLanguage(leadingDelimiter) {
83
+ var _a;
84
+ const tag = leadingDelimiter.trim().replace(/^`+/, "").toLowerCase();
85
+ return (_a = FENCE_TAG_LANGUAGE_MAP[tag]) != null ? _a : "unspecified" /* UNSPECIFIED */;
86
+ }
87
+ __name(getCodeBlockLanguage, "getCodeBlockLanguage");
64
88
  function extractCodeAndTruncateContent(content, codeBlockDelimiters) {
89
+ return extractCodeBlockAndTruncateContent(content, codeBlockDelimiters).code;
90
+ }
91
+ __name(extractCodeAndTruncateContent, "extractCodeAndTruncateContent");
92
+ function extractCodeBlockAndTruncateContent(content, codeBlockDelimiters) {
65
93
  var _a;
66
94
  if (!((_a = content.parts) == null ? void 0 : _a.length)) {
67
- return "";
95
+ return { ...NO_CODE_BLOCK };
68
96
  }
69
97
  for (let i = 0; i < content.parts.length; i++) {
70
98
  const part = content.parts[i];
71
99
  if (part.executableCode && (i === content.parts.length - 1 || !content.parts[i + 1].codeExecutionResult)) {
72
100
  content.parts = content.parts.slice(0, i + 1);
73
- return part.executableCode.code || "";
101
+ return {
102
+ code: part.executableCode.code || "",
103
+ language: "python" /* PYTHON */
104
+ };
74
105
  }
75
106
  }
76
107
  const textParts = content.parts.filter((part) => part.text);
77
108
  if (!textParts.length) {
78
- return "";
109
+ return { ...NO_CODE_BLOCK };
79
110
  }
80
111
  const firstTextPart = (0, import_lodash_es.cloneDeep)(textParts[0]);
81
112
  const responseText = textParts.map((part) => part.text).join("\n");
82
113
  const leadingDelimiterPattern = codeBlockDelimiters.map((d) => d[0]).join("|");
83
114
  const trailingDelimiterPattern = codeBlockDelimiters.map((d) => d[1]).join("|");
84
115
  const match = new RegExp(
85
- `(?<prefix>.*?)(${leadingDelimiterPattern})(?<codeStr>.*?)(${trailingDelimiterPattern})(?<suffix>.*?)$`,
116
+ `(?<prefix>.*?)(?<leading>${leadingDelimiterPattern})(?<codeStr>.*?)(${trailingDelimiterPattern})(?<suffix>.*?)$`,
86
117
  "s"
87
118
  ).exec(responseText);
88
- const { prefix, codeStr } = (match == null ? void 0 : match.groups) || {};
119
+ const { prefix, leading, codeStr } = (match == null ? void 0 : match.groups) || {};
89
120
  if (!codeStr) {
90
- return "";
121
+ return { ...NO_CODE_BLOCK };
91
122
  }
92
123
  content.parts = [];
93
124
  if (prefix) {
@@ -95,12 +126,11 @@ function extractCodeAndTruncateContent(content, codeBlockDelimiters) {
95
126
  content.parts.push(firstTextPart);
96
127
  }
97
128
  content.parts.push(buildExecutableCodePart(codeStr));
98
- return codeStr;
129
+ return { code: codeStr, language: getCodeBlockLanguage(leading != null ? leading : "") };
99
130
  }
100
- __name(extractCodeAndTruncateContent, "extractCodeAndTruncateContent");
131
+ __name(extractCodeBlockAndTruncateContent, "extractCodeBlockAndTruncateContent");
101
132
  function buildExecutableCodePart(code) {
102
133
  return {
103
- text: code,
104
134
  executableCode: {
105
135
  code,
106
136
  language: import_genai.Language.PYTHON
@@ -111,28 +141,28 @@ __name(buildExecutableCodePart, "buildExecutableCodePart");
111
141
  function buildCodeExecutionResultPart(codeExecutionResult) {
112
142
  if (codeExecutionResult.stderr) {
113
143
  return {
114
- text: codeExecutionResult.stderr,
115
144
  codeExecutionResult: {
116
- outcome: import_genai.Outcome.OUTCOME_FAILED
145
+ outcome: import_genai.Outcome.OUTCOME_FAILED,
146
+ output: codeExecutionResult.stderr
117
147
  }
118
148
  };
119
149
  }
120
150
  const finalResult = [];
121
- if (codeExecutionResult.stdout || !codeExecutionResult.outputFiles) {
151
+ if (codeExecutionResult.stdout || !codeExecutionResult.outputFiles.length) {
122
152
  finalResult.push(`Code execution result:
123
153
  ${codeExecutionResult.stdout}
124
154
  `);
125
155
  }
126
- if (codeExecutionResult.outputFiles) {
156
+ if (codeExecutionResult.outputFiles.length) {
127
157
  finalResult.push(
128
158
  `Saved artifacts:
129
- ` + codeExecutionResult.outputFiles.map((f) => f.name).join(", ")
159
+ ` + codeExecutionResult.outputFiles.map((f) => `\`${f.name}\``).join(",")
130
160
  );
131
161
  }
132
162
  return {
133
- text: finalResult.join("\n\n"),
134
163
  codeExecutionResult: {
135
- outcome: import_genai.Outcome.OUTCOME_OK
164
+ outcome: import_genai.Outcome.OUTCOME_OK,
165
+ output: finalResult.join("\n\n")
136
166
  }
137
167
  };
138
168
  }
@@ -163,5 +193,7 @@ __name(convertCodeExecutionParts, "convertCodeExecutionParts");
163
193
  buildExecutableCodePart,
164
194
  convertCodeExecutionParts,
165
195
  extractCodeAndTruncateContent,
196
+ extractCodeBlockAndTruncateContent,
197
+ getCodeBlockLanguage,
166
198
  getEncodedFileContent
167
199
  });
@@ -25,6 +25,7 @@ var __copyProps = (to, from, except, desc) => {
25
25
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
26
26
  var code_executor_context_exports = {};
27
27
  __export(code_executor_context_exports, {
28
+ CONTEXT_KEY: () => CONTEXT_KEY,
28
29
  CodeExecutorContext: () => CodeExecutorContext
29
30
  });
30
31
  module.exports = __toCommonJS(code_executor_context_exports);
@@ -43,8 +44,10 @@ const CODE_EXECUTION_RESULTS_KEY = "_code_execution_results";
43
44
  const _CodeExecutorContext = class _CodeExecutorContext {
44
45
  constructor(sessionState) {
45
46
  this.sessionState = sessionState;
46
- var _a;
47
- this.context = (_a = sessionState.get(CONTEXT_KEY)) != null ? _a : {};
47
+ if (!sessionState.has(CONTEXT_KEY)) {
48
+ sessionState.set(CONTEXT_KEY, {});
49
+ }
50
+ this.context = sessionState.get(CONTEXT_KEY);
48
51
  this.sessionState = sessionState;
49
52
  }
50
53
  /**
@@ -197,5 +200,6 @@ __name(_CodeExecutorContext, "CodeExecutorContext");
197
200
  let CodeExecutorContext = _CodeExecutorContext;
198
201
  // Annotate the CommonJS export names for ESM import in node:
199
202
  0 && (module.exports = {
203
+ CONTEXT_KEY,
200
204
  CodeExecutorContext
201
205
  });
@@ -70,6 +70,8 @@ let ContainerCodeExecutor = class extends import_base_code_executor.BaseCodeExec
70
70
  constructor(options = {}) {
71
71
  var _a, _b, _c;
72
72
  super();
73
+ this.containers = /* @__PURE__ */ new Map();
74
+ this.initPromises = /* @__PURE__ */ new Map();
73
75
  if (!options.image && !options.dockerPath) {
74
76
  throw new Error(
75
77
  "Either image or dockerPath must be set for ContainerCodeExecutor."
@@ -99,8 +101,9 @@ let ContainerCodeExecutor = class extends import_base_code_executor.BaseCodeExec
99
101
  `Unsupported language for ContainerCodeExecutor: ${language}. Supported: ${Object.keys(LANGUAGE_RUNTIME_COMMAND_MAP).join(", ")}.`
100
102
  );
101
103
  }
102
- await this.ensureContainer();
103
- const { stdout, stderr, exitCode } = await this.container.execute(
104
+ const key = sessionKey(params.invocationContext);
105
+ const container = await this.ensureContainer(key);
106
+ const { stdout, stderr, exitCode } = await container.execute(
104
107
  [...TIMEOUT_COMMAND, String(this.timeoutSeconds), ...command, code],
105
108
  this.timeoutSeconds
106
109
  );
@@ -132,32 +135,35 @@ ${message}` : message;
132
135
  return stderr;
133
136
  }
134
137
  /**
135
- * Stops and removes the container. Safe to call when no container has been
136
- * started; provided for deterministic teardown in tests and app shutdown.
138
+ * Stops and removes every session's container. Safe to call when none has
139
+ * been started; provided for deterministic teardown in tests and app
140
+ * shutdown.
137
141
  */
138
142
  async close() {
139
- const container = this.container;
140
- this.container = void 0;
141
- this.initPromise = void 0;
142
- await (container == null ? void 0 : container.stop());
143
+ const containers = [...this.containers.values()];
144
+ this.containers.clear();
145
+ this.initPromises.clear();
146
+ await Promise.all(containers.map((container) => container.stop()));
143
147
  }
144
- /** Lazily builds/starts the container exactly once. */
145
- ensureContainer() {
146
- if (!this.initPromise) {
147
- this.initPromise = this.initContainer().catch((error) => {
148
- this.initPromise = void 0;
148
+ /** Lazily builds/starts the given session's container exactly once. */
149
+ ensureContainer(key) {
150
+ let initPromise = this.initPromises.get(key);
151
+ if (!initPromise) {
152
+ initPromise = this.initContainer(key).catch((error) => {
153
+ this.initPromises.delete(key);
149
154
  throw error;
150
155
  });
156
+ this.initPromises.set(key, initPromise);
151
157
  }
152
- return this.initPromise;
158
+ return initPromise.then(() => this.containers.get(key));
153
159
  }
154
- async initContainer() {
160
+ async initContainer(key) {
155
161
  const container = new import_docker_container.DockerContainer(this.containerOptions);
156
162
  if (this.dockerPath) {
157
163
  await container.build(this.dockerPath);
158
164
  }
159
165
  await container.start();
160
- this.container = container;
166
+ this.containers.set(key, container);
161
167
  const { exitCode } = await container.execute(
162
168
  ["which", "python3"],
163
169
  this.timeoutSeconds
@@ -171,6 +177,11 @@ __name(ContainerCodeExecutor, "ContainerCodeExecutor");
171
177
  ContainerCodeExecutor = __decorateClass([
172
178
  import_experimental.experimental
173
179
  ], ContainerCodeExecutor);
180
+ function sessionKey(invocationContext) {
181
+ const session = invocationContext.session;
182
+ return JSON.stringify([session.appName, session.userId, session.id]);
183
+ }
184
+ __name(sessionKey, "sessionKey");
174
185
  function defineFrozenFalse(target, key) {
175
186
  Object.defineProperty(target, key, {
176
187
  value: false,
@@ -250,7 +250,12 @@ Code execution timed out after ${this.timeoutSeconds} seconds.`;
250
250
  };
251
251
  } finally {
252
252
  if (tempDir) {
253
- await fs.rm(tempDir, { recursive: true, force: true });
253
+ await fs.rm(tempDir, {
254
+ recursive: true,
255
+ force: true,
256
+ maxRetries: 10,
257
+ retryDelay: 500
258
+ });
254
259
  }
255
260
  }
256
261
  }