@google/adk 2.0.0 → 2.1.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.
- package/dist/cjs/a2a/a2a_event.js +0 -29
- package/dist/cjs/a2a/a2a_remote_agent.js +8 -5
- package/dist/cjs/a2a/a2a_remote_agent_utils.js +104 -2
- package/dist/cjs/a2a/agent_card.js +58 -6
- package/dist/cjs/a2a/agent_executor.js +10 -3
- package/dist/cjs/a2a/agent_to_a2a.js +6 -1
- package/dist/cjs/a2a/event_processor_utils.js +1 -1
- package/dist/cjs/a2a/executor_context.js +4 -2
- package/dist/cjs/a2a/index.js +4 -0
- package/dist/cjs/a2a/request_metadata.js +94 -0
- package/dist/cjs/agents/base_agent.js +9 -8
- package/dist/cjs/agents/context.js +7 -0
- package/dist/cjs/agents/functions.js +150 -47
- package/dist/cjs/agents/invocation_context.js +1 -0
- package/dist/cjs/agents/llm_agent.js +6 -5
- package/dist/cjs/agents/loop_agent.js +1 -1
- package/dist/cjs/agents/parallel_agent.js +1 -1
- package/dist/cjs/agents/processors/agent_transfer_llm_request_processor.js +26 -5
- package/dist/cjs/agents/processors/code_execution_request_processor.js +2 -2
- package/dist/cjs/agents/processors/content_processor_utils.js +5 -5
- package/dist/cjs/agents/processors/content_request_processor.js +4 -1
- package/dist/cjs/agents/processors/request_confirmation_llm_request_processor.js +19 -12
- package/dist/cjs/agents/processors/request_input_llm_request_processor.js +3 -7
- package/dist/cjs/agents/readonly_context.js +6 -0
- package/dist/cjs/agents/routed_agent.js +1 -1
- package/dist/cjs/agents/sequential_agent.js +1 -1
- package/dist/cjs/apps/app.js +1 -1
- package/dist/cjs/artifacts/file_artifact_service.js +1 -2
- package/dist/cjs/artifacts/scoped_artifact_service.js +9 -0
- package/dist/cjs/artifacts/session_artifact_service.js +19 -0
- package/dist/cjs/auth/auth_handler.js +44 -8
- package/dist/cjs/auth/oauth2/oauth2_credential_refresher.js +1 -1
- package/dist/cjs/auth/oauth2/oauth2_utils.js +17 -2
- package/dist/cjs/code_executors/base_code_executor.js +1 -1
- package/dist/cjs/code_executors/built_in_code_executor.js +1 -1
- package/dist/cjs/code_executors/code_execution_utils.js +2 -2
- package/dist/cjs/code_executors/container_code_executor.js +186 -0
- package/dist/cjs/code_executors/docker_container.js +282 -0
- package/dist/cjs/code_executors/unsafe_local_code_executor.js +11 -6
- package/dist/cjs/common.js +74 -45
- package/dist/cjs/context/agent_controlled_context_compactor.js +10 -5
- package/dist/cjs/context/anchored_context_compactor.js +41 -18
- package/dist/cjs/context/compaction_utils.js +15 -6
- package/dist/cjs/context/token_based_context_compactor.js +10 -2
- package/dist/cjs/context/trajectory_thought_pruning_compactor.js +17 -10
- package/dist/cjs/context/truncating_context_compactor.js +17 -5
- package/dist/cjs/errors/already_exists_error.js +50 -0
- package/dist/cjs/errors/input_validation_error.js +50 -0
- package/dist/cjs/errors/not_found_error.js +50 -0
- package/dist/cjs/errors/session_not_found_error.js +50 -0
- package/dist/cjs/errors/tool_execution_error.js +68 -0
- package/dist/cjs/events/event.js +1 -1
- package/dist/cjs/events/event_actions.js +7 -0
- package/dist/cjs/examples/base_example_provider.js +1 -1
- package/dist/cjs/index.js +47 -0
- package/dist/cjs/index_web.js +2 -0
- package/dist/cjs/integrations/agent_registry/agent_registry.js +3 -2
- package/dist/cjs/memory/rag_memory_transcript.js +136 -0
- package/dist/cjs/memory/vertex_ai_memory_bank_service.js +2 -2
- package/dist/cjs/memory/vertex_ai_rag_api.js +120 -0
- package/dist/cjs/memory/vertex_ai_rag_memory_service.js +228 -0
- package/dist/cjs/models/apigee_llm.js +1 -1
- package/dist/cjs/models/base_llm.js +1 -1
- package/dist/cjs/models/chrome_prompt_llm.js +304 -0
- package/dist/cjs/models/chrome_prompt_utils.js +229 -0
- package/dist/cjs/models/google_llm.js +9 -4
- package/dist/cjs/models/interactions_utils.js +2 -3
- package/dist/cjs/models/registry.js +2 -0
- package/dist/cjs/plugins/_reflect_retry_utils.js +142 -0
- package/dist/cjs/plugins/reflect_retry_model_plugin.js +274 -0
- package/dist/cjs/plugins/reflect_retry_tool_plugin.js +276 -0
- package/dist/cjs/runner/runner.js +29 -26
- package/dist/cjs/sessions/database_session_service.js +78 -43
- package/dist/cjs/sessions/db/operations.js +229 -22
- package/dist/cjs/sessions/db/schema.js +113 -159
- package/dist/cjs/sessions/registry.js +5 -1
- package/dist/cjs/sessions/vertex_ai_session_service.js +2 -2
- package/dist/cjs/telemetry/setup.js +1 -1
- package/dist/cjs/telemetry/tracing.js +11 -1
- package/dist/cjs/tools/agent_tool.js +4 -5
- package/dist/cjs/tools/base_tool.js +14 -4
- package/dist/cjs/tools/base_toolset.js +4 -4
- package/dist/cjs/tools/built_in_tool.js +75 -0
- package/dist/cjs/tools/enterprise_web_search_tool.js +3 -6
- package/dist/cjs/tools/forwarding_artifact_service.js +18 -13
- package/dist/cjs/tools/function_tool.js +6 -3
- package/dist/cjs/tools/google_maps_grounding_tool.js +3 -6
- package/dist/cjs/tools/google_search_tool.js +3 -6
- package/dist/cjs/tools/load_artifacts_tool.js +47 -23
- package/dist/cjs/tools/load_web_page.js +6 -172
- package/dist/cjs/tools/mcp/load_mcp_resource_tool.js +34 -5
- package/dist/cjs/tools/openapi_tool/auth/auth_helpers.js +11 -2
- package/dist/cjs/tools/openapi_tool/openapi_spec_parser/operation_parser.js +1 -1
- package/dist/cjs/tools/openapi_tool/rest_api_tool.js +16 -18
- package/dist/cjs/tools/preload_memory_tool.js +1 -1
- package/dist/cjs/tools/resume_inputs.js +27 -0
- package/dist/cjs/tools/retrieval/base_retrieval_tool.js +60 -0
- package/dist/cjs/tools/retrieval/files_retrieval.js +95 -0
- package/dist/cjs/tools/retrieval/llama_index_retrieval.js +57 -0
- package/dist/cjs/tools/url_context_tool.js +3 -6
- package/dist/cjs/tools/vertex_ai_search_tool.js +4 -8
- package/dist/cjs/tools/vertex_rag_retrieval_tool.js +3 -10
- package/dist/cjs/utils/crypto_shim.js +16 -0
- package/dist/cjs/utils/gemini_schema_util.js +0 -6
- package/dist/cjs/utils/logger.js +15 -50
- package/dist/cjs/utils/logger_browser.js +86 -0
- package/dist/cjs/utils/logger_node.js +119 -0
- package/dist/cjs/utils/redact_inline_data.js +46 -0
- package/dist/cjs/utils/redact_uri.js +15 -1
- package/dist/cjs/utils/schema.js +1 -1
- package/dist/cjs/utils/ssrf_guard.js +262 -0
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/workflow/base_node.js +1 -1
- package/dist/cjs/workflow/graph.js +1 -1
- package/dist/cjs/workflow/nodes/node_tool.js +2 -11
- package/dist/cjs/workflow/request_input.js +1 -1
- package/dist/cjs/workflow/run_llm_agent_as_node.js +1 -1
- package/dist/cjs/workflow/workflow.js +1 -1
- package/dist/esm/a2a/a2a_event.js +0 -28
- package/dist/esm/a2a/a2a_remote_agent.js +10 -5
- package/dist/esm/a2a/a2a_remote_agent_utils.js +102 -2
- package/dist/esm/a2a/agent_card.js +63 -6
- package/dist/esm/a2a/agent_executor.js +10 -3
- package/dist/esm/a2a/agent_to_a2a.js +8 -2
- package/dist/esm/a2a/event_processor_utils.js +1 -2
- package/dist/esm/a2a/executor_context.js +4 -2
- package/dist/esm/a2a/index.js +7 -1
- package/dist/esm/a2a/request_metadata.js +68 -0
- package/dist/esm/agents/base_agent.js +9 -8
- package/dist/esm/agents/context.js +7 -0
- package/dist/esm/agents/functions.js +152 -48
- package/dist/esm/agents/invocation_context.js +1 -0
- package/dist/esm/agents/llm_agent.js +6 -5
- package/dist/esm/agents/loop_agent.js +1 -1
- package/dist/esm/agents/parallel_agent.js +1 -1
- package/dist/esm/agents/processors/agent_transfer_llm_request_processor.js +26 -5
- package/dist/esm/agents/processors/code_execution_request_processor.js +2 -2
- package/dist/esm/agents/processors/content_processor_utils.js +5 -5
- package/dist/esm/agents/processors/content_request_processor.js +4 -1
- package/dist/esm/agents/processors/request_confirmation_llm_request_processor.js +19 -12
- package/dist/esm/agents/processors/request_input_llm_request_processor.js +3 -7
- package/dist/esm/agents/readonly_context.js +6 -0
- package/dist/esm/agents/routed_agent.js +1 -1
- package/dist/esm/agents/sequential_agent.js +1 -1
- package/dist/esm/apps/app.js +1 -1
- package/dist/esm/artifacts/file_artifact_service.js +1 -2
- package/dist/esm/artifacts/scoped_artifact_service.js +9 -0
- package/dist/esm/artifacts/session_artifact_service.js +12 -0
- package/dist/esm/auth/auth_handler.js +47 -8
- package/dist/esm/auth/oauth2/oauth2_credential_refresher.js +1 -1
- package/dist/esm/auth/oauth2/oauth2_utils.js +15 -2
- package/dist/esm/code_executors/base_code_executor.js +1 -1
- package/dist/esm/code_executors/built_in_code_executor.js +1 -1
- package/dist/esm/code_executors/code_execution_utils.js +2 -2
- package/dist/esm/code_executors/container_code_executor.js +155 -0
- package/dist/esm/code_executors/docker_container.js +265 -0
- package/dist/esm/code_executors/unsafe_local_code_executor.js +11 -6
- package/dist/esm/common.js +73 -38
- package/dist/esm/context/agent_controlled_context_compactor.js +10 -5
- package/dist/esm/context/anchored_context_compactor.js +45 -19
- package/dist/esm/context/compaction_utils.js +13 -5
- package/dist/esm/context/token_based_context_compactor.js +10 -2
- package/dist/esm/context/trajectory_thought_pruning_compactor.js +17 -10
- package/dist/esm/context/truncating_context_compactor.js +17 -5
- package/dist/esm/errors/already_exists_error.js +23 -0
- package/dist/esm/errors/input_validation_error.js +23 -0
- package/dist/{web/auth/refresher/base_credential_refresher.js → esm/errors/not_found_error.js} +9 -6
- package/dist/esm/errors/session_not_found_error.js +23 -0
- package/dist/esm/errors/tool_execution_error.js +40 -0
- package/dist/esm/events/event.js +1 -1
- package/dist/esm/events/event_actions.js +6 -0
- package/dist/esm/examples/base_example_provider.js +1 -1
- package/dist/esm/index.js +37 -0
- package/dist/esm/index_web.js +2 -0
- package/dist/esm/integrations/agent_registry/agent_registry.js +3 -2
- package/dist/esm/memory/rag_memory_transcript.js +106 -0
- package/dist/esm/memory/vertex_ai_memory_bank_service.js +2 -2
- package/dist/esm/memory/vertex_ai_rag_api.js +93 -0
- package/dist/esm/memory/vertex_ai_rag_memory_service.js +208 -0
- package/dist/esm/models/apigee_llm.js +1 -1
- package/dist/esm/models/base_llm.js +1 -1
- package/dist/esm/models/chrome_prompt_llm.js +285 -0
- package/dist/esm/models/chrome_prompt_utils.js +192 -0
- package/dist/esm/models/google_llm.js +9 -4
- package/dist/esm/models/interactions_utils.js +2 -3
- package/dist/esm/models/registry.js +2 -0
- package/dist/esm/plugins/_reflect_retry_utils.js +111 -0
- package/dist/esm/plugins/reflect_retry_model_plugin.js +250 -0
- package/dist/esm/plugins/reflect_retry_tool_plugin.js +254 -0
- package/dist/esm/runner/runner.js +35 -27
- package/dist/esm/sessions/database_session_service.js +58 -25
- package/dist/esm/sessions/db/operations.js +229 -22
- package/dist/esm/sessions/db/schema.js +111 -160
- package/dist/esm/sessions/registry.js +5 -1
- package/dist/esm/sessions/vertex_ai_session_service.js +1 -1
- package/dist/esm/telemetry/setup.js +1 -1
- package/dist/esm/telemetry/tracing.js +11 -1
- package/dist/esm/tools/agent_tool.js +4 -5
- package/dist/esm/tools/base_tool.js +11 -3
- package/dist/esm/tools/base_toolset.js +4 -4
- package/dist/esm/tools/built_in_tool.js +51 -0
- package/dist/esm/tools/enterprise_web_search_tool.js +3 -6
- package/dist/esm/tools/forwarding_artifact_service.js +18 -13
- package/dist/esm/tools/function_tool.js +6 -3
- package/dist/esm/tools/google_maps_grounding_tool.js +3 -6
- package/dist/esm/tools/google_search_tool.js +3 -6
- package/dist/esm/tools/load_artifacts_tool.js +48 -24
- package/dist/esm/tools/load_web_page.js +10 -170
- package/dist/esm/tools/mcp/load_mcp_resource_tool.js +34 -5
- package/dist/esm/tools/openapi_tool/auth/auth_helpers.js +13 -2
- package/dist/esm/tools/openapi_tool/openapi_spec_parser/operation_parser.js +1 -1
- package/dist/esm/tools/openapi_tool/rest_api_tool.js +16 -18
- package/dist/esm/tools/preload_memory_tool.js +1 -1
- package/dist/esm/tools/retrieval/base_retrieval_tool.js +33 -0
- package/dist/esm/tools/retrieval/files_retrieval.js +81 -0
- package/dist/esm/tools/retrieval/llama_index_retrieval.js +30 -0
- package/dist/esm/tools/url_context_tool.js +3 -6
- package/dist/esm/tools/vertex_ai_search_tool.js +4 -8
- package/dist/esm/tools/vertex_rag_retrieval_tool.js +3 -10
- package/dist/esm/utils/crypto_shim.js +14 -0
- package/dist/esm/utils/gemini_schema_util.js +0 -6
- package/dist/esm/utils/logger.js +14 -40
- package/dist/esm/utils/logger_browser.js +58 -0
- package/dist/esm/utils/logger_node.js +81 -0
- package/dist/esm/utils/redact_inline_data.js +19 -0
- package/dist/esm/utils/redact_uri.js +15 -1
- package/dist/esm/utils/schema.js +1 -1
- package/dist/{web/tools/load_web_page.js → esm/utils/ssrf_guard.js} +95 -107
- package/dist/esm/version.js +1 -1
- package/dist/esm/workflow/base_node.js +1 -1
- package/dist/esm/workflow/graph.js +1 -1
- package/dist/esm/workflow/nodes/node_tool.js +2 -11
- package/dist/esm/workflow/request_input.js +1 -1
- package/dist/esm/workflow/run_llm_agent_as_node.js +1 -1
- package/dist/esm/workflow/workflow.js +1 -1
- package/dist/types/a2a/a2a_event.d.ts +7 -10
- package/dist/types/a2a/a2a_remote_agent.d.ts +5 -0
- package/dist/types/a2a/a2a_remote_agent_utils.d.ts +25 -0
- package/dist/types/a2a/agent_card.d.ts +9 -0
- package/dist/types/a2a/agent_executor.d.ts +1 -1
- package/dist/types/a2a/agent_to_a2a.d.ts +2 -0
- package/dist/types/a2a/auth.d.ts +5 -1
- package/dist/types/a2a/executor_context.d.ts +7 -1
- package/dist/types/a2a/index.d.ts +1 -1
- package/dist/types/a2a/request_metadata.d.ts +22 -0
- package/dist/types/agents/base_agent.d.ts +19 -16
- package/dist/types/agents/context.d.ts +8 -0
- package/dist/types/agents/functions.d.ts +72 -6
- package/dist/types/agents/invocation_context.d.ts +11 -3
- package/dist/types/agents/llm_agent.d.ts +9 -7
- package/dist/types/agents/processors/agent_transfer_llm_request_processor.d.ts +16 -1
- package/dist/types/agents/readonly_context.d.ts +4 -0
- package/dist/types/agents/run_config.d.ts +21 -8
- package/dist/types/artifacts/scoped_artifact_service.d.ts +13 -0
- package/dist/types/artifacts/session_artifact_service.d.ts +8 -1
- package/dist/types/auth/auth_credential.d.ts +13 -8
- package/dist/types/auth/auth_handler.d.ts +12 -1
- package/dist/types/auth/oauth2/oauth2_credential_refresher.d.ts +1 -1
- package/dist/types/auth/oauth2/oauth2_utils.d.ts +9 -0
- package/dist/types/auth/refresher/base_credential_refresher.d.ts +1 -1
- package/dist/types/code_executors/code_execution_utils.d.ts +1 -1
- package/dist/types/code_executors/container_code_executor.d.ts +89 -0
- package/dist/types/code_executors/docker_container.d.ts +79 -0
- package/dist/types/common.d.ts +22 -20
- package/dist/types/context/compaction_utils.d.ts +9 -1
- package/dist/types/errors/already_exists_error.d.ts +14 -0
- package/dist/types/errors/input_validation_error.d.ts +14 -0
- package/dist/types/errors/not_found_error.d.ts +14 -0
- package/dist/types/errors/session_not_found_error.d.ts +14 -0
- package/dist/types/errors/tool_execution_error.d.ts +36 -0
- package/dist/types/events/event_actions.d.ts +13 -0
- package/dist/types/index.d.ts +22 -1
- package/dist/types/memory/rag_memory_transcript.d.ts +55 -0
- package/dist/types/memory/vertex_ai_rag_api.d.ts +89 -0
- package/dist/types/memory/vertex_ai_rag_memory_service.d.ts +68 -0
- package/dist/types/models/chrome_prompt_llm.d.ts +210 -0
- package/dist/types/models/chrome_prompt_utils.d.ts +68 -0
- package/dist/types/models/google_llm.d.ts +8 -3
- package/dist/types/models/registry.d.ts +3 -2
- package/dist/types/plugins/_reflect_retry_utils.d.ts +72 -0
- package/dist/types/plugins/base_plugin.d.ts +12 -10
- package/dist/types/plugins/logging_plugin.d.ts +3 -2
- package/dist/types/plugins/reflect_retry_model_plugin.d.ts +132 -0
- package/dist/types/plugins/reflect_retry_tool_plugin.d.ts +187 -0
- package/dist/types/runner/runner.d.ts +7 -8
- package/dist/types/sessions/database_session_service.d.ts +1 -1
- package/dist/types/sessions/db/operations.d.ts +13 -1
- package/dist/types/sessions/db/schema.d.ts +23 -9
- package/dist/types/tools/base_tool.d.ts +11 -0
- package/dist/types/tools/base_toolset.d.ts +3 -4
- package/dist/types/tools/built_in_tool.d.ts +41 -0
- package/dist/types/tools/enterprise_web_search_tool.d.ts +4 -4
- package/dist/types/tools/forwarding_artifact_service.d.ts +23 -10
- package/dist/types/tools/function_tool.d.ts +42 -9
- package/dist/types/tools/google_maps_grounding_tool.d.ts +4 -4
- package/dist/types/tools/google_search_tool.d.ts +4 -4
- package/dist/types/tools/long_running_tool.d.ts +1 -1
- package/dist/types/tools/mcp/mcp_toolset.d.ts +11 -10
- package/dist/types/tools/openapi_tool/auth/auth_helpers.d.ts +5 -0
- package/dist/types/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.d.ts +0 -1
- package/dist/types/tools/openapi_tool/auth/credential_exchangers/service_account_exchanger.d.ts +0 -1
- package/dist/types/tools/preload_memory_tool.d.ts +1 -1
- package/dist/types/tools/resume_inputs.d.ts +25 -0
- package/dist/types/tools/retrieval/base_retrieval_tool.d.ts +21 -0
- package/dist/types/tools/retrieval/files_retrieval.d.ts +50 -0
- package/dist/types/tools/retrieval/llama_index_retrieval.d.ts +62 -0
- package/dist/types/tools/url_context_tool.d.ts +4 -4
- package/dist/types/tools/vertex_ai_search_tool.d.ts +4 -4
- package/dist/types/tools/vertex_rag_retrieval_tool.d.ts +13 -12
- package/dist/types/utils/crypto_shim.d.ts +16 -0
- package/dist/types/utils/gemini_schema_util.d.ts +5 -7
- package/dist/types/utils/logger.d.ts +23 -1
- package/dist/types/utils/logger_browser.d.ts +28 -0
- package/dist/types/utils/logger_node.d.ts +20 -0
- package/dist/types/utils/output_schema_utils.d.ts +3 -3
- package/dist/types/utils/redact_inline_data.d.ts +16 -0
- package/dist/types/utils/redact_uri.d.ts +12 -8
- package/dist/types/utils/ssrf_guard.d.ts +32 -0
- package/dist/types/version.d.ts +1 -1
- package/dist/web/index_web.js +304 -3
- package/dist/web/index_web.js.map +7 -0
- package/package.json +17 -14
- package/dist/web/a2a/a2a_event.js +0 -290
- package/dist/web/a2a/a2a_remote_agent.js +0 -200
- package/dist/web/a2a/a2a_remote_agent_run_processor.js +0 -189
- package/dist/web/a2a/a2a_remote_agent_utils.js +0 -141
- package/dist/web/a2a/agent_card.js +0 -373
- package/dist/web/a2a/agent_executor.js +0 -246
- package/dist/web/a2a/agent_to_a2a.js +0 -126
- package/dist/web/a2a/auth.js +0 -41
- package/dist/web/a2a/event_converter_utils.js +0 -242
- package/dist/web/a2a/event_processor_utils.js +0 -209
- package/dist/web/a2a/executor_context.js +0 -28
- package/dist/web/a2a/index.js +0 -20
- package/dist/web/a2a/metadata_converter_utils.js +0 -115
- package/dist/web/a2a/part_converter_utils.js +0 -201
- package/dist/web/agents/active_streaming_tool.js +0 -25
- package/dist/web/agents/base_agent.js +0 -462
- package/dist/web/agents/context.js +0 -146
- package/dist/web/agents/framework_function_calls.js +0 -34
- package/dist/web/agents/functions.js +0 -462
- package/dist/web/agents/instructions.js +0 -188
- package/dist/web/agents/invocation_context.js +0 -126
- package/dist/web/agents/live_request_queue.js +0 -151
- package/dist/web/agents/llm_agent.js +0 -1514
- package/dist/web/agents/loop_agent.js +0 -131
- package/dist/web/agents/parallel_agent.js +0 -122
- package/dist/web/agents/processors/agent_transfer_llm_request_processor.js +0 -113
- package/dist/web/agents/processors/base_llm_processor.js +0 -21
- package/dist/web/agents/processors/basic_llm_request_processor.js +0 -84
- package/dist/web/agents/processors/code_execution_request_processor.js +0 -381
- package/dist/web/agents/processors/content_processor_utils.js +0 -432
- package/dist/web/agents/processors/content_request_processor.js +0 -73
- package/dist/web/agents/processors/context_compactor_request_processor.js +0 -78
- package/dist/web/agents/processors/identity_llm_request_processor.js +0 -59
- package/dist/web/agents/processors/instructions_llm_request_processor.js +0 -85
- package/dist/web/agents/processors/interactions_request_processor.js +0 -56
- package/dist/web/agents/processors/request_confirmation_llm_request_processor.js +0 -393
- package/dist/web/agents/processors/request_input_llm_request_processor.js +0 -228
- package/dist/web/agents/processors/tool_filter_request_processor.js +0 -72
- package/dist/web/agents/readonly_context.js +0 -60
- package/dist/web/agents/routed_agent.js +0 -161
- package/dist/web/agents/run_config.js +0 -74
- package/dist/web/agents/sequential_agent.js +0 -141
- package/dist/web/agents/transcription_entry.js +0 -7
- package/dist/web/agents/user_input_request.js +0 -135
- package/dist/web/apps/app.js +0 -52
- package/dist/web/apps/resumability_config.js +0 -33
- package/dist/web/artifacts/base_artifact_service.js +0 -7
- package/dist/web/artifacts/file_artifact_service.js +0 -568
- package/dist/web/artifacts/gcs_artifact_service.js +0 -298
- package/dist/web/artifacts/in_memory_artifact_service.js +0 -172
- package/dist/web/artifacts/registry.js +0 -36
- package/dist/web/artifacts/scoped_artifact_service.js +0 -89
- package/dist/web/auth/auth_credential.js +0 -18
- package/dist/web/auth/auth_handler.js +0 -151
- package/dist/web/auth/auth_preprocessor.js +0 -184
- package/dist/web/auth/auth_provider_registry.js +0 -37
- package/dist/web/auth/auth_schemes.js +0 -36
- package/dist/web/auth/auth_tool.js +0 -7
- package/dist/web/auth/base_auth_provider.js +0 -7
- package/dist/web/auth/credential_response_binding.js +0 -91
- package/dist/web/auth/credential_service/base_credential_service.js +0 -7
- package/dist/web/auth/credential_service/in_memory_credential_service.js +0 -50
- package/dist/web/auth/credential_service/session_state_credential_service.js +0 -27
- package/dist/web/auth/exchanger/base_credential_exchanger.js +0 -16
- package/dist/web/auth/exchanger/credential_exchanger_registry.js +0 -35
- package/dist/web/auth/oauth2/oauth2_credential_exchanger.js +0 -194
- package/dist/web/auth/oauth2/oauth2_credential_refresher.js +0 -105
- package/dist/web/auth/oauth2/oauth2_discovery.js +0 -196
- package/dist/web/auth/oauth2/oauth2_utils.js +0 -105
- package/dist/web/auth/refresher/credential_refresher_registry.js +0 -44
- package/dist/web/code_executors/agent_engine_sandbox_code_executor.js +0 -284
- package/dist/web/code_executors/base_code_executor.js +0 -68
- package/dist/web/code_executors/built_in_code_executor.js +0 -50
- package/dist/web/code_executors/code_execution_utils.js +0 -131
- package/dist/web/code_executors/code_executor_context.js +0 -174
- package/dist/web/code_executors/unsafe_local_code_executor.js +0 -221
- package/dist/web/common.js +0 -452
- package/dist/web/context/agent_controlled_context_compactor.js +0 -76
- package/dist/web/context/anchored_context_compactor.js +0 -120
- package/dist/web/context/base_context_compactor.js +0 -7
- package/dist/web/context/compaction_utils.js +0 -42
- package/dist/web/context/summarizers/base_summarizer.js +0 -7
- package/dist/web/context/summarizers/llm_summarizer.js +0 -91
- package/dist/web/context/token_based_context_compactor.js +0 -118
- package/dist/web/context/trajectory_thought_pruning_compactor.js +0 -47
- package/dist/web/context/truncating_context_compactor.js +0 -34
- package/dist/web/environment/base_environment.js +0 -71
- package/dist/web/environment/local_environment.js +0 -165
- package/dist/web/events/compacted_event.js +0 -51
- package/dist/web/events/event.js +0 -208
- package/dist/web/events/event_actions.js +0 -74
- package/dist/web/events/structured_events.js +0 -79
- package/dist/web/examples/base_example_provider.js +0 -32
- package/dist/web/examples/example.js +0 -7
- package/dist/web/examples/example_util.js +0 -83
- package/dist/web/features/feature_registry.js +0 -115
- package/dist/web/index.js +0 -57
- package/dist/web/integrations/agent_registry/agent_registry.js +0 -337
- package/dist/web/integrations/agent_registry/agent_registry_mcp_toolset.js +0 -120
- package/dist/web/integrations/agent_registry/helpers.js +0 -32
- package/dist/web/integrations/agent_registry/types.js +0 -20
- package/dist/web/memory/base_memory_service.js +0 -7
- package/dist/web/memory/in_memory_memory_service.js +0 -89
- package/dist/web/memory/memory_entry.js +0 -7
- package/dist/web/memory/vertex_ai_memory_bank_service.js +0 -496
- package/dist/web/models/apigee_llm.js +0 -227
- package/dist/web/models/base_llm.js +0 -78
- package/dist/web/models/base_llm_connection.js +0 -7
- package/dist/web/models/gemini_llm_connection.js +0 -183
- package/dist/web/models/google_llm.js +0 -396
- package/dist/web/models/interactions_utils.js +0 -745
- package/dist/web/models/llm_request.js +0 -57
- package/dist/web/models/llm_response.js +0 -48
- package/dist/web/models/registry.js +0 -100
- package/dist/web/models/routed_llm.js +0 -112
- package/dist/web/plugins/base_plugin.js +0 -305
- package/dist/web/plugins/global_instruction_plugin.js +0 -71
- package/dist/web/plugins/logging_plugin.js +0 -241
- package/dist/web/plugins/plugin_manager.js +0 -318
- package/dist/web/plugins/security_plugin.js +0 -148
- package/dist/web/runner/in_memory_runner.js +0 -50
- package/dist/web/runner/runner.js +0 -747
- package/dist/web/sessions/base_session_service.js +0 -123
- package/dist/web/sessions/database_session_service.js +0 -440
- package/dist/web/sessions/db/operations.js +0 -124
- package/dist/web/sessions/db/schema.js +0 -216
- package/dist/web/sessions/in_memory_session_service.js +0 -251
- package/dist/web/sessions/registry.js +0 -38
- package/dist/web/sessions/session.js +0 -23
- package/dist/web/sessions/state.js +0 -159
- package/dist/web/sessions/state_write_order.js +0 -74
- package/dist/web/sessions/vertex_ai_session_service.js +0 -546
- package/dist/web/skills/gcp_skill_registry.js +0 -80
- package/dist/web/skills/loader.js +0 -372
- package/dist/web/skills/prompt.js +0 -34
- package/dist/web/skills/skill.js +0 -67
- package/dist/web/skills/skill_registry.js +0 -7
- package/dist/web/telemetry/google_cloud.js +0 -99
- package/dist/web/telemetry/setup.js +0 -89
- package/dist/web/telemetry/tracing.js +0 -304
- package/dist/web/tools/agent_tool.js +0 -150
- package/dist/web/tools/base_tool.js +0 -116
- package/dist/web/tools/base_toolset.js +0 -62
- package/dist/web/tools/consolidate_context_tool.js +0 -55
- package/dist/web/tools/enterprise_web_search_tool.js +0 -60
- package/dist/web/tools/example_tool.js +0 -46
- package/dist/web/tools/exit_loop_tool.js +0 -47
- package/dist/web/tools/finish_task_tool.js +0 -92
- package/dist/web/tools/forwarding_artifact_service.js +0 -51
- package/dist/web/tools/function_tool.js +0 -151
- package/dist/web/tools/get_user_choice_tool.js +0 -27
- package/dist/web/tools/google_maps_grounding_tool.js +0 -59
- package/dist/web/tools/google_search_tool.js +0 -55
- package/dist/web/tools/load_artifacts_tool.js +0 -159
- package/dist/web/tools/load_memory_tool.js +0 -83
- package/dist/web/tools/long_running_tool.js +0 -58
- package/dist/web/tools/mcp/index.js +0 -11
- package/dist/web/tools/mcp/load_mcp_resource_tool.js +0 -111
- package/dist/web/tools/mcp/mcp_session_manager.js +0 -114
- package/dist/web/tools/mcp/mcp_tool.js +0 -47
- package/dist/web/tools/mcp/mcp_toolset.js +0 -144
- package/dist/web/tools/openapi_tool/auth/auth_helpers.js +0 -53
- package/dist/web/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.js +0 -62
- package/dist/web/tools/openapi_tool/auth/credential_exchangers/service_account_exchanger.js +0 -113
- package/dist/web/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.js +0 -242
- package/dist/web/tools/openapi_tool/openapi_spec_parser/operation_parser.js +0 -200
- package/dist/web/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.js +0 -98
- package/dist/web/tools/openapi_tool/openapi_toolset.js +0 -99
- package/dist/web/tools/openapi_tool/rest_api_tool.js +0 -247
- package/dist/web/tools/preload_memory_tool.js +0 -81
- package/dist/web/tools/request_input_tool.js +0 -29
- package/dist/web/tools/skill/list_skills_tool.js +0 -52
- package/dist/web/tools/skill/load_skill_resource_tool.js +0 -192
- package/dist/web/tools/skill/load_skill_tool.js +0 -96
- package/dist/web/tools/skill/run_skill_inline_script_tool.js +0 -191
- package/dist/web/tools/skill/run_skill_script_tool.js +0 -227
- package/dist/web/tools/skill/search_skills_tool.js +0 -84
- package/dist/web/tools/skill/skill_toolset.js +0 -185
- package/dist/web/tools/tool_confirmation.js +0 -43
- package/dist/web/tools/url_context_tool.js +0 -48
- package/dist/web/tools/vertex_ai_search_tool.js +0 -107
- package/dist/web/tools/vertex_rag_retrieval_tool.js +0 -40
- package/dist/web/utils/async_hooks_shim.js +0 -28
- package/dist/web/utils/async_queue.js +0 -88
- package/dist/web/utils/branch_trie.js +0 -16
- package/dist/web/utils/case_utils.js +0 -28
- package/dist/web/utils/client_labels.js +0 -70
- package/dist/web/utils/crypto_shim.js +0 -18
- package/dist/web/utils/deprecated.js +0 -40
- package/dist/web/utils/env_aware_utils.js +0 -115
- package/dist/web/utils/error_utils.js +0 -101
- package/dist/web/utils/experimental.js +0 -54
- package/dist/web/utils/failover_utils.js +0 -100
- package/dist/web/utils/file_extension_utils.js +0 -55
- package/dist/web/utils/file_utils.js +0 -108
- package/dist/web/utils/gemini_schema_util.js +0 -177
- package/dist/web/utils/genai_schema_to_json.js +0 -80
- package/dist/web/utils/live_connection_utils.js +0 -257
- package/dist/web/utils/logger.js +0 -140
- package/dist/web/utils/model_name.js +0 -75
- package/dist/web/utils/object_notation_utils.js +0 -54
- package/dist/web/utils/optional_peer.js +0 -38
- package/dist/web/utils/output_schema_utils.js +0 -18
- package/dist/web/utils/partial_copy.js +0 -26
- package/dist/web/utils/redact_uri.js +0 -39
- package/dist/web/utils/schema.js +0 -167
- package/dist/web/utils/simple_zod_to_json.js +0 -134
- package/dist/web/utils/streaming_utils.js +0 -438
- package/dist/web/utils/task.js +0 -38
- package/dist/web/utils/variant_utils.js +0 -23
- package/dist/web/utils/vertex_ai_utils.js +0 -27
- package/dist/web/version.js +0 -11
- package/dist/web/workflow/base_node.js +0 -215
- package/dist/web/workflow/branch_path.js +0 -77
- package/dist/web/workflow/dynamic_node_scheduler.js +0 -202
- package/dist/web/workflow/errors.js +0 -140
- package/dist/web/workflow/graph.js +0 -127
- package/dist/web/workflow/index.js +0 -80
- package/dist/web/workflow/node.js +0 -87
- package/dist/web/workflow/node_builders.js +0 -40
- package/dist/web/workflow/node_context.js +0 -236
- package/dist/web/workflow/node_error_event.js +0 -86
- package/dist/web/workflow/node_runner.js +0 -481
- package/dist/web/workflow/node_state.js +0 -43
- package/dist/web/workflow/node_status.js +0 -20
- package/dist/web/workflow/nodes/function_node.js +0 -221
- package/dist/web/workflow/nodes/join_node.js +0 -47
- package/dist/web/workflow/nodes/node_tool.js +0 -131
- package/dist/web/workflow/nodes/parallel_worker.js +0 -120
- package/dist/web/workflow/nodes/tool_node.js +0 -126
- package/dist/web/workflow/request_input.js +0 -36
- package/dist/web/workflow/retry_config.js +0 -43
- package/dist/web/workflow/run_llm_agent_as_node.js +0 -266
- package/dist/web/workflow/run_node_as_invocation.js +0 -170
- package/dist/web/workflow/schedule_dynamic_node.js +0 -26
- package/dist/web/workflow/trigger.js +0 -7
- package/dist/web/workflow/utils/graph_parser.js +0 -188
- package/dist/web/workflow/utils/graph_validation.js +0 -189
- package/dist/web/workflow/utils/hitl_utils.js +0 -239
- package/dist/web/workflow/utils/rehydration_utils.js +0 -342
- package/dist/web/workflow/utils/retry_utils.js +0 -82
- package/dist/web/workflow/utils/workflow_graph_utils.js +0 -115
- package/dist/web/workflow/workflow.js +0 -529
- /package/dist/{web/artifacts/session_artifact_service.js → esm/tools/resume_inputs.js} +0 -0
|
@@ -23,7 +23,7 @@ import { BaseAgent } from "./base_agent.js";
|
|
|
23
23
|
import { isLlmAgent } from "./llm_agent.js";
|
|
24
24
|
import { ReadonlyContext } from "./readonly_context.js";
|
|
25
25
|
const TASK_COMPLETED_TOOL_NAME = "task_completed";
|
|
26
|
-
const SEQUENTIAL_AGENT_SIGNATURE_SYMBOL = Symbol.for(
|
|
26
|
+
const SEQUENTIAL_AGENT_SIGNATURE_SYMBOL = /* @__PURE__ */ Symbol.for(
|
|
27
27
|
"google.adk.sequentialAgent"
|
|
28
28
|
);
|
|
29
29
|
function isSequentialAgent(obj) {
|
package/dist/esm/apps/app.js
CHANGED
|
@@ -23,7 +23,7 @@ function validateAppName(name) {
|
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
__name(validateAppName, "validateAppName");
|
|
26
|
-
const APP_SIGNATURE_SYMBOL = Symbol.for("google.adk.app");
|
|
26
|
+
const APP_SIGNATURE_SYMBOL = /* @__PURE__ */ Symbol.for("google.adk.app");
|
|
27
27
|
function isApp(obj) {
|
|
28
28
|
return typeof obj === "object" && obj !== null && APP_SIGNATURE_SYMBOL in obj && obj[APP_SIGNATURE_SYMBOL] === true;
|
|
29
29
|
}
|
|
@@ -474,10 +474,9 @@ async function* iterateArtifactDirs(dir) {
|
|
|
474
474
|
);
|
|
475
475
|
if (hasVersions) {
|
|
476
476
|
yield dir;
|
|
477
|
-
return;
|
|
478
477
|
}
|
|
479
478
|
for (const entry of entries) {
|
|
480
|
-
if (entry.isDirectory()) {
|
|
479
|
+
if (entry.isDirectory() && entry.name !== "versions") {
|
|
481
480
|
const subdir = path.join(dir, entry.name);
|
|
482
481
|
for await (const foundDir of iterateArtifactDirs(subdir)) {
|
|
483
482
|
yield foundDir;
|
|
@@ -7,12 +7,21 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
7
7
|
* Copyright 2026 Google LLC
|
|
8
8
|
* SPDX-License-Identifier: Apache-2.0
|
|
9
9
|
*/
|
|
10
|
+
var _a;
|
|
11
|
+
const SESSION_ARTIFACT_SERVICE_SIGNATURE_SYMBOL = /* @__PURE__ */ Symbol.for(
|
|
12
|
+
"google.adk.sessionArtifactService"
|
|
13
|
+
);
|
|
14
|
+
_a = SESSION_ARTIFACT_SERVICE_SIGNATURE_SYMBOL;
|
|
10
15
|
const _ScopedArtifactService = class _ScopedArtifactService {
|
|
11
16
|
constructor(delegate, appName, userId, sessionId) {
|
|
12
17
|
this.delegate = delegate;
|
|
13
18
|
this.appName = appName;
|
|
14
19
|
this.userId = userId;
|
|
15
20
|
this.sessionId = sessionId;
|
|
21
|
+
/**
|
|
22
|
+
* Brands this class as a session-scoped artifact service.
|
|
23
|
+
*/
|
|
24
|
+
this[_a] = true;
|
|
16
25
|
}
|
|
17
26
|
async saveArtifact(request) {
|
|
18
27
|
return this.delegate.saveArtifact({
|
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
import {createRequire as topLevelCreateRequire} from 'module';
|
|
2
2
|
const require = topLevelCreateRequire(import.meta.url);
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
5
|
/**
|
|
4
6
|
* @license
|
|
5
7
|
* Copyright 2026 Google LLC
|
|
6
8
|
* SPDX-License-Identifier: Apache-2.0
|
|
7
9
|
*/
|
|
10
|
+
const SESSION_ARTIFACT_SERVICE_SIGNATURE_SYMBOL = /* @__PURE__ */ Symbol.for(
|
|
11
|
+
"google.adk.sessionArtifactService"
|
|
12
|
+
);
|
|
13
|
+
function isSessionArtifactService(service) {
|
|
14
|
+
return typeof service === "object" && service !== null && SESSION_ARTIFACT_SERVICE_SIGNATURE_SYMBOL in service && service[SESSION_ARTIFACT_SERVICE_SIGNATURE_SYMBOL] === true;
|
|
15
|
+
}
|
|
16
|
+
__name(isSessionArtifactService, "isSessionArtifactService");
|
|
17
|
+
export {
|
|
18
|
+
isSessionArtifactService
|
|
19
|
+
};
|
|
@@ -9,6 +9,11 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
9
9
|
*/
|
|
10
10
|
import { randomUUID } from "../utils/env_aware_utils.js";
|
|
11
11
|
import { OAuth2CredentialExchanger } from "./oauth2/oauth2_credential_exchanger.js";
|
|
12
|
+
import {
|
|
13
|
+
createS256CodeChallenge,
|
|
14
|
+
generateCodeVerifier
|
|
15
|
+
} from "./oauth2/oauth2_utils.js";
|
|
16
|
+
const S256_CODE_CHALLENGE_METHOD = "S256";
|
|
12
17
|
const _AuthHandler = class _AuthHandler {
|
|
13
18
|
constructor(authConfig) {
|
|
14
19
|
this.authConfig = authConfig;
|
|
@@ -17,7 +22,16 @@ const _AuthHandler = class _AuthHandler {
|
|
|
17
22
|
const credentialKey = "temp:" + this.authConfig.credentialKey;
|
|
18
23
|
return state.get(credentialKey);
|
|
19
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Stores the exchanged credential in the session state.
|
|
27
|
+
*
|
|
28
|
+
* @param state The session state to store the credential in.
|
|
29
|
+
* @throws Error: If the auth config has no credentialKey.
|
|
30
|
+
*/
|
|
20
31
|
async parseAndStoreAuthResponse(state) {
|
|
32
|
+
if (!this.authConfig.credentialKey) {
|
|
33
|
+
throw new Error("credentialKey is empty.");
|
|
34
|
+
}
|
|
21
35
|
const credentialKey = "temp:" + this.authConfig.credentialKey;
|
|
22
36
|
const authSchemeType = this.authConfig.authScheme.type;
|
|
23
37
|
if (!["oauth2", "openIdConnect"].includes(authSchemeType)) {
|
|
@@ -73,9 +87,14 @@ const _AuthHandler = class _AuthHandler {
|
|
|
73
87
|
/**
|
|
74
88
|
* Generates an response containing the auth uri for user to sign in.
|
|
75
89
|
*
|
|
90
|
+
* When the credential requests PKCE, the URI also carries the S256 code
|
|
91
|
+
* challenge derived from the credential's code verifier, and the returned
|
|
92
|
+
* credential carries the verifier the later token exchange must send.
|
|
93
|
+
*
|
|
76
94
|
* @return An AuthCredential object containing the auth URI and state.
|
|
77
95
|
* @throws Error: If the authorization endpoint is not configured in the
|
|
78
|
-
* auth scheme
|
|
96
|
+
* auth scheme, or the credential requests a code challenge method other
|
|
97
|
+
* than 'S256'.
|
|
79
98
|
*/
|
|
80
99
|
generateAuthUri() {
|
|
81
100
|
const authScheme = this.authConfig.authScheme;
|
|
@@ -83,6 +102,13 @@ const _AuthHandler = class _AuthHandler {
|
|
|
83
102
|
if (!authCredential || !authCredential.oauth2) {
|
|
84
103
|
return authCredential;
|
|
85
104
|
}
|
|
105
|
+
const oauth2 = authCredential.oauth2;
|
|
106
|
+
const codeChallengeMethod = oauth2.codeChallengeMethod;
|
|
107
|
+
if (codeChallengeMethod && codeChallengeMethod !== S256_CODE_CHALLENGE_METHOD) {
|
|
108
|
+
throw new Error(
|
|
109
|
+
`Unsupported codeChallengeMethod: ${codeChallengeMethod}. Only '${S256_CODE_CHALLENGE_METHOD}' is supported.`
|
|
110
|
+
);
|
|
111
|
+
}
|
|
86
112
|
let authorizationEndpoint = "";
|
|
87
113
|
let scopes = [];
|
|
88
114
|
if ("authorizationEndpoint" in authScheme) {
|
|
@@ -107,22 +133,35 @@ const _AuthHandler = class _AuthHandler {
|
|
|
107
133
|
}
|
|
108
134
|
const state = randomUUID();
|
|
109
135
|
const url = new URL(authorizationEndpoint);
|
|
110
|
-
url.searchParams.set("client_id",
|
|
111
|
-
url.searchParams.set(
|
|
112
|
-
"redirect_uri",
|
|
113
|
-
authCredential.oauth2.redirectUri || ""
|
|
114
|
-
);
|
|
136
|
+
url.searchParams.set("client_id", oauth2.clientId || "");
|
|
137
|
+
url.searchParams.set("redirect_uri", oauth2.redirectUri || "");
|
|
115
138
|
url.searchParams.set("response_type", "code");
|
|
116
139
|
url.searchParams.set("scope", scopes.join(" "));
|
|
117
140
|
url.searchParams.set("state", state);
|
|
118
141
|
url.searchParams.set("access_type", "offline");
|
|
119
142
|
url.searchParams.set("prompt", "consent");
|
|
143
|
+
if (oauth2.audience) {
|
|
144
|
+
url.searchParams.set("audience", oauth2.audience);
|
|
145
|
+
}
|
|
146
|
+
if (oauth2.nonce) {
|
|
147
|
+
url.searchParams.set("nonce", oauth2.nonce);
|
|
148
|
+
}
|
|
149
|
+
let codeVerifier = oauth2.codeVerifier;
|
|
150
|
+
if (codeChallengeMethod) {
|
|
151
|
+
codeVerifier != null ? codeVerifier : codeVerifier = generateCodeVerifier();
|
|
152
|
+
url.searchParams.set(
|
|
153
|
+
"code_challenge",
|
|
154
|
+
createS256CodeChallenge(codeVerifier)
|
|
155
|
+
);
|
|
156
|
+
url.searchParams.set("code_challenge_method", codeChallengeMethod);
|
|
157
|
+
}
|
|
120
158
|
const exchangedAuthCredential = {
|
|
121
159
|
...authCredential,
|
|
122
160
|
oauth2: {
|
|
123
|
-
...
|
|
161
|
+
...oauth2,
|
|
124
162
|
authUri: url.toString(),
|
|
125
|
-
state
|
|
163
|
+
state,
|
|
164
|
+
codeVerifier
|
|
126
165
|
}
|
|
127
166
|
};
|
|
128
167
|
return exchangedAuthCredential;
|
|
@@ -19,7 +19,7 @@ const _OAuth2CredentialRefresher = class _OAuth2CredentialRefresher {
|
|
|
19
19
|
*
|
|
20
20
|
* @param authCredential The OAuth2 credential to check.
|
|
21
21
|
* @param authScheme The OAuth2 authentication scheme (optional).
|
|
22
|
-
* @returns True if the credential needs to be refreshed,
|
|
22
|
+
* @returns True if the credential needs to be refreshed, false otherwise.
|
|
23
23
|
*/
|
|
24
24
|
async isRefreshNeeded(authCredential) {
|
|
25
25
|
if (!authCredential.oauth2) {
|
|
@@ -7,8 +7,19 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
7
7
|
* Copyright 2026 Google LLC
|
|
8
8
|
* SPDX-License-Identifier: Apache-2.0
|
|
9
9
|
*/
|
|
10
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
10
11
|
import { logger } from "../../utils/logger.js";
|
|
12
|
+
import { redactUriPassword } from "../../utils/redact_uri.js";
|
|
11
13
|
import { validateDiscoveryUrl } from "./oauth2_discovery.js";
|
|
14
|
+
const CODE_VERIFIER_BYTES = 36;
|
|
15
|
+
function generateCodeVerifier() {
|
|
16
|
+
return randomBytes(CODE_VERIFIER_BYTES).toString("base64url");
|
|
17
|
+
}
|
|
18
|
+
__name(generateCodeVerifier, "generateCodeVerifier");
|
|
19
|
+
function createS256CodeChallenge(codeVerifier) {
|
|
20
|
+
return createHash("sha256").update(codeVerifier).digest("base64url");
|
|
21
|
+
}
|
|
22
|
+
__name(createS256CodeChallenge, "createS256CodeChallenge");
|
|
12
23
|
function getTokenEndpoint(authScheme) {
|
|
13
24
|
if (authScheme.type === "openIdConnect" && authScheme.tokenEndpoint) {
|
|
14
25
|
return authScheme.tokenEndpoint;
|
|
@@ -63,8 +74,8 @@ function parseAuthorizationCode(uri) {
|
|
|
63
74
|
try {
|
|
64
75
|
const url = new URL(uri);
|
|
65
76
|
return url.searchParams.get("code") || void 0;
|
|
66
|
-
} catch
|
|
67
|
-
logger.warn(`Failed to parse authorization URI ${uri}
|
|
77
|
+
} catch {
|
|
78
|
+
logger.warn(`Failed to parse authorization URI ${redactUriPassword(uri)}`);
|
|
68
79
|
return void 0;
|
|
69
80
|
}
|
|
70
81
|
}
|
|
@@ -98,7 +109,9 @@ function isTokenExpired(token, leeway = 60) {
|
|
|
98
109
|
__name(isTokenExpired, "isTokenExpired");
|
|
99
110
|
export {
|
|
100
111
|
createOAuth2TokenRequestBody,
|
|
112
|
+
createS256CodeChallenge,
|
|
101
113
|
fetchOAuth2Tokens,
|
|
114
|
+
generateCodeVerifier,
|
|
102
115
|
getTokenEndpoint,
|
|
103
116
|
isTokenExpired,
|
|
104
117
|
parseAuthorizationCode
|
|
@@ -8,7 +8,7 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
8
8
|
* SPDX-License-Identifier: Apache-2.0
|
|
9
9
|
*/
|
|
10
10
|
var _a;
|
|
11
|
-
const BASE_CODE_EXECUTOR_SIGNATURE_SYMBOL = Symbol.for(
|
|
11
|
+
const BASE_CODE_EXECUTOR_SIGNATURE_SYMBOL = /* @__PURE__ */ Symbol.for(
|
|
12
12
|
"google.adk.baseCodeExecutor"
|
|
13
13
|
);
|
|
14
14
|
function isBaseCodeExecutor(obj) {
|
|
@@ -10,7 +10,7 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
10
10
|
var _a, _b;
|
|
11
11
|
import { isGemini2OrAbove } from "../utils/model_name.js";
|
|
12
12
|
import { BaseCodeExecutor } from "./base_code_executor.js";
|
|
13
|
-
const BUILT_IN_CODE_EXECUTOR_SIGNATURE_SYMBOL = Symbol.for(
|
|
13
|
+
const BUILT_IN_CODE_EXECUTOR_SIGNATURE_SYMBOL = /* @__PURE__ */ Symbol.for(
|
|
14
14
|
"google.adk.builtInCodeExecutor"
|
|
15
15
|
);
|
|
16
16
|
function isBuiltInCodeExecutor(obj) {
|
|
@@ -38,7 +38,7 @@ function extractCodeAndTruncateContent(content, codeBlockDelimiters) {
|
|
|
38
38
|
const part = content.parts[i];
|
|
39
39
|
if (part.executableCode && (i === content.parts.length - 1 || !content.parts[i + 1].codeExecutionResult)) {
|
|
40
40
|
content.parts = content.parts.slice(0, i + 1);
|
|
41
|
-
return part.executableCode.code;
|
|
41
|
+
return part.executableCode.code || "";
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
const textParts = content.parts.filter((part) => part.text);
|
|
@@ -113,7 +113,7 @@ function convertCodeExecutionParts(content, codeBlockDelimiter, executionResultD
|
|
|
113
113
|
const lastPart = content.parts[content.parts.length - 1];
|
|
114
114
|
if (lastPart.executableCode) {
|
|
115
115
|
content.parts[content.parts.length - 1] = {
|
|
116
|
-
text: codeBlockDelimiter[0] + lastPart.executableCode.code + codeBlockDelimiter[1]
|
|
116
|
+
text: codeBlockDelimiter[0] + (lastPart.executableCode.code || "") + codeBlockDelimiter[1]
|
|
117
117
|
};
|
|
118
118
|
} else if (content.parts.length == 1 && lastPart.codeExecutionResult) {
|
|
119
119
|
content.parts[content.parts.length - 1] = {
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import {createRequire as topLevelCreateRequire} from 'module';
|
|
2
|
+
const require = topLevelCreateRequire(import.meta.url);
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
6
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
7
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
8
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
9
|
+
if (decorator = decorators[i])
|
|
10
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
11
|
+
if (kind && result) __defProp(target, key, result);
|
|
12
|
+
return result;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* @license
|
|
16
|
+
* Copyright 2026 Google LLC
|
|
17
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
18
|
+
*/
|
|
19
|
+
import * as path from "node:path";
|
|
20
|
+
import { experimental } from "../utils/experimental.js";
|
|
21
|
+
import { logger } from "../utils/logger.js";
|
|
22
|
+
import { BaseCodeExecutor } from "./base_code_executor.js";
|
|
23
|
+
import {
|
|
24
|
+
CodeExecutionLanguage
|
|
25
|
+
} from "./code_execution_utils.js";
|
|
26
|
+
import {
|
|
27
|
+
DockerContainer,
|
|
28
|
+
TIMEOUT_EXIT_CODE
|
|
29
|
+
} from "./docker_container.js";
|
|
30
|
+
const DEFAULT_IMAGE_TAG = "adk-code-executor:latest";
|
|
31
|
+
const DEFAULT_TIMEOUT_SECONDS = 300;
|
|
32
|
+
const TIMEOUT_COMMAND = ["timeout", "-s", "KILL"];
|
|
33
|
+
const LANGUAGE_RUNTIME_COMMAND_MAP = {
|
|
34
|
+
[CodeExecutionLanguage.PYTHON]: ["python3", "-c"],
|
|
35
|
+
[CodeExecutionLanguage.JAVASCRIPT]: ["node", "-e"],
|
|
36
|
+
[CodeExecutionLanguage.TYPESCRIPT]: ["tsx", "--eval"],
|
|
37
|
+
[CodeExecutionLanguage.SHELL]: ["sh", "-c"]
|
|
38
|
+
};
|
|
39
|
+
let ContainerCodeExecutor = class extends BaseCodeExecutor {
|
|
40
|
+
constructor(options = {}) {
|
|
41
|
+
var _a, _b, _c;
|
|
42
|
+
super();
|
|
43
|
+
if (!options.image && !options.dockerPath) {
|
|
44
|
+
throw new Error(
|
|
45
|
+
"Either image or dockerPath must be set for ContainerCodeExecutor."
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
this.timeoutSeconds = (_a = options.timeoutSeconds) != null ? _a : DEFAULT_TIMEOUT_SECONDS;
|
|
49
|
+
if (this.timeoutSeconds <= 0) {
|
|
50
|
+
throw new Error(
|
|
51
|
+
"timeoutSeconds must be greater than 0 for ContainerCodeExecutor."
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
this.dockerPath = options.dockerPath ? path.resolve(options.dockerPath) : void 0;
|
|
55
|
+
this.containerOptions = {
|
|
56
|
+
image: (_b = options.image) != null ? _b : DEFAULT_IMAGE_TAG,
|
|
57
|
+
networkEnabled: (_c = options.networkEnabled) != null ? _c : false,
|
|
58
|
+
baseUrl: options.baseUrl,
|
|
59
|
+
docker: options.docker
|
|
60
|
+
};
|
|
61
|
+
defineFrozenFalse(this, "stateful");
|
|
62
|
+
defineFrozenFalse(this, "optimizeDataFile");
|
|
63
|
+
}
|
|
64
|
+
async executeCode(params) {
|
|
65
|
+
const { code, language } = params.codeExecutionInput;
|
|
66
|
+
const command = LANGUAGE_RUNTIME_COMMAND_MAP[language];
|
|
67
|
+
if (!command) {
|
|
68
|
+
throw new Error(
|
|
69
|
+
`Unsupported language for ContainerCodeExecutor: ${language}. Supported: ${Object.keys(LANGUAGE_RUNTIME_COMMAND_MAP).join(", ")}.`
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
await this.ensureContainer();
|
|
73
|
+
const { stdout, stderr, exitCode } = await this.container.execute(
|
|
74
|
+
[...TIMEOUT_COMMAND, String(this.timeoutSeconds), ...command, code],
|
|
75
|
+
this.timeoutSeconds
|
|
76
|
+
);
|
|
77
|
+
logger.debug(`Executed ${language} code:
|
|
78
|
+
\`\`\`
|
|
79
|
+
${code}
|
|
80
|
+
\`\`\``);
|
|
81
|
+
return {
|
|
82
|
+
stdout,
|
|
83
|
+
stderr: this.describeExit(stderr, exitCode),
|
|
84
|
+
outputFiles: []
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Turns a non-zero exit into stderr the model can see. An empty stderr maps
|
|
89
|
+
* to `OUTCOME_OK` downstream, so a program that exits non-zero without
|
|
90
|
+
* writing stderr would otherwise look successful (matching
|
|
91
|
+
* `UnsafeLocalCodeExecutor`).
|
|
92
|
+
*/
|
|
93
|
+
describeExit(stderr, exitCode) {
|
|
94
|
+
if (exitCode === TIMEOUT_EXIT_CODE) {
|
|
95
|
+
const message = `Code execution timed out after ${this.timeoutSeconds} seconds.`;
|
|
96
|
+
return stderr ? `${stderr}
|
|
97
|
+
${message}` : message;
|
|
98
|
+
}
|
|
99
|
+
if (exitCode !== 0 && exitCode !== null && !stderr) {
|
|
100
|
+
return `Exit code ${exitCode}`;
|
|
101
|
+
}
|
|
102
|
+
return stderr;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Stops and removes the container. Safe to call when no container has been
|
|
106
|
+
* started; provided for deterministic teardown in tests and app shutdown.
|
|
107
|
+
*/
|
|
108
|
+
async close() {
|
|
109
|
+
const container = this.container;
|
|
110
|
+
this.container = void 0;
|
|
111
|
+
this.initPromise = void 0;
|
|
112
|
+
await (container == null ? void 0 : container.stop());
|
|
113
|
+
}
|
|
114
|
+
/** Lazily builds/starts the container exactly once. */
|
|
115
|
+
ensureContainer() {
|
|
116
|
+
if (!this.initPromise) {
|
|
117
|
+
this.initPromise = this.initContainer().catch((error) => {
|
|
118
|
+
this.initPromise = void 0;
|
|
119
|
+
throw error;
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return this.initPromise;
|
|
123
|
+
}
|
|
124
|
+
async initContainer() {
|
|
125
|
+
const container = new DockerContainer(this.containerOptions);
|
|
126
|
+
if (this.dockerPath) {
|
|
127
|
+
await container.build(this.dockerPath);
|
|
128
|
+
}
|
|
129
|
+
await container.start();
|
|
130
|
+
this.container = container;
|
|
131
|
+
const { exitCode } = await container.execute(
|
|
132
|
+
["which", "python3"],
|
|
133
|
+
this.timeoutSeconds
|
|
134
|
+
);
|
|
135
|
+
if (exitCode !== 0) {
|
|
136
|
+
throw new Error("python3 is not installed in the container.");
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
__name(ContainerCodeExecutor, "ContainerCodeExecutor");
|
|
141
|
+
ContainerCodeExecutor = __decorateClass([
|
|
142
|
+
experimental
|
|
143
|
+
], ContainerCodeExecutor);
|
|
144
|
+
function defineFrozenFalse(target, key) {
|
|
145
|
+
Object.defineProperty(target, key, {
|
|
146
|
+
value: false,
|
|
147
|
+
writable: false,
|
|
148
|
+
enumerable: true,
|
|
149
|
+
configurable: false
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
__name(defineFrozenFalse, "defineFrozenFalse");
|
|
153
|
+
export {
|
|
154
|
+
ContainerCodeExecutor
|
|
155
|
+
};
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import {createRequire as topLevelCreateRequire} from 'module';
|
|
2
|
+
const require = topLevelCreateRequire(import.meta.url);
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
19
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
20
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
21
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
22
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
23
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
24
|
+
mod
|
|
25
|
+
));
|
|
26
|
+
/**
|
|
27
|
+
* @license
|
|
28
|
+
* Copyright 2026 Google LLC
|
|
29
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
30
|
+
*/
|
|
31
|
+
import * as fs from "node:fs/promises";
|
|
32
|
+
import { PassThrough } from "node:stream";
|
|
33
|
+
import { text } from "node:stream/consumers";
|
|
34
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
35
|
+
import { logger } from "../utils/logger.js";
|
|
36
|
+
const TIMEOUT_EXIT_CODE = 124;
|
|
37
|
+
const STREAM_WAIT_GRACE_SECONDS = 5;
|
|
38
|
+
const MAX_INSPECT_ATTEMPTS = 50;
|
|
39
|
+
const INSPECT_POLL_MS = 100;
|
|
40
|
+
const KEEP_ALIVE_COMMAND = ["tail", "-f", "/dev/null"];
|
|
41
|
+
let dockerodeCtor;
|
|
42
|
+
function loadDockerodeCtor() {
|
|
43
|
+
dockerodeCtor != null ? dockerodeCtor : dockerodeCtor = Promise.resolve().then(() => __toESM(require("dockerode"), 1)).then(
|
|
44
|
+
(mod) => mod.default,
|
|
45
|
+
() => {
|
|
46
|
+
throw new Error(
|
|
47
|
+
"The `dockerode` package is required to use ContainerCodeExecutor. Install it with `npm install dockerode`."
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
);
|
|
51
|
+
return dockerodeCtor;
|
|
52
|
+
}
|
|
53
|
+
__name(loadDockerodeCtor, "loadDockerodeCtor");
|
|
54
|
+
const activeContainers = /* @__PURE__ */ new Set();
|
|
55
|
+
let exitHooksRegistered = false;
|
|
56
|
+
async function stopAndRemove(container) {
|
|
57
|
+
if (!container) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
await container.stop();
|
|
62
|
+
} catch (error) {
|
|
63
|
+
logger.debug(`Container ${container.id} was not running: ${error}`);
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
await container.remove({ force: true });
|
|
67
|
+
return true;
|
|
68
|
+
} catch (error) {
|
|
69
|
+
logger.error(`Failed to remove container ${container.id}: ${error}`);
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
__name(stopAndRemove, "stopAndRemove");
|
|
74
|
+
async function cleanupContainers() {
|
|
75
|
+
for (const container of activeContainers) {
|
|
76
|
+
if (await stopAndRemove(container)) {
|
|
77
|
+
activeContainers.delete(container);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
__name(cleanupContainers, "cleanupContainers");
|
|
82
|
+
async function handleTerminationSignal(signal) {
|
|
83
|
+
await cleanupContainers();
|
|
84
|
+
process.kill(process.pid, signal);
|
|
85
|
+
}
|
|
86
|
+
__name(handleTerminationSignal, "handleTerminationSignal");
|
|
87
|
+
function registerExitHooks() {
|
|
88
|
+
if (exitHooksRegistered) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
exitHooksRegistered = true;
|
|
92
|
+
process.once("beforeExit", cleanupContainers);
|
|
93
|
+
process.once("SIGINT", handleTerminationSignal);
|
|
94
|
+
process.once("SIGTERM", handleTerminationSignal);
|
|
95
|
+
}
|
|
96
|
+
__name(registerExitHooks, "registerExitHooks");
|
|
97
|
+
const PROTOCOL_BY_SCHEME = {
|
|
98
|
+
"https:": "https",
|
|
99
|
+
"ssh:": "ssh"
|
|
100
|
+
};
|
|
101
|
+
async function inspectExitCode(exec) {
|
|
102
|
+
for (let attempt = 0; attempt < MAX_INSPECT_ATTEMPTS; attempt++) {
|
|
103
|
+
const info = await exec.inspect();
|
|
104
|
+
if (!info.Running) {
|
|
105
|
+
return info.ExitCode;
|
|
106
|
+
}
|
|
107
|
+
await delay(INSPECT_POLL_MS);
|
|
108
|
+
}
|
|
109
|
+
return (await exec.inspect()).ExitCode;
|
|
110
|
+
}
|
|
111
|
+
__name(inspectExitCode, "inspectExitCode");
|
|
112
|
+
function parseBaseUrl(baseUrl) {
|
|
113
|
+
var _a;
|
|
114
|
+
const url = new URL(baseUrl);
|
|
115
|
+
if (url.protocol === "unix:") {
|
|
116
|
+
return { socketPath: url.pathname };
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
host: url.hostname,
|
|
120
|
+
port: url.port || void 0,
|
|
121
|
+
protocol: (_a = PROTOCOL_BY_SCHEME[url.protocol]) != null ? _a : "http"
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
__name(parseBaseUrl, "parseBaseUrl");
|
|
125
|
+
const _DockerContainer = class _DockerContainer {
|
|
126
|
+
constructor(options) {
|
|
127
|
+
this.options = options;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Builds the image from a directory containing a Dockerfile. `src` is the raw
|
|
131
|
+
* directory listing; unlike the Docker CLI this does not honor
|
|
132
|
+
* `.dockerignore`.
|
|
133
|
+
*/
|
|
134
|
+
async build(dockerPath) {
|
|
135
|
+
try {
|
|
136
|
+
await fs.access(dockerPath);
|
|
137
|
+
} catch {
|
|
138
|
+
throw new Error(`Invalid Docker path: ${dockerPath}`);
|
|
139
|
+
}
|
|
140
|
+
const client = await this.getClient();
|
|
141
|
+
logger.debug("Building Docker image...");
|
|
142
|
+
const stream = await client.buildImage(
|
|
143
|
+
{ context: dockerPath, src: await fs.readdir(dockerPath) },
|
|
144
|
+
{ t: this.options.image }
|
|
145
|
+
);
|
|
146
|
+
await new Promise((resolve, reject) => {
|
|
147
|
+
client.modem.followProgress(
|
|
148
|
+
stream,
|
|
149
|
+
(error) => error ? reject(error) : resolve()
|
|
150
|
+
);
|
|
151
|
+
});
|
|
152
|
+
logger.debug(`Docker image ${this.options.image} built.`);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Creates and starts the container, registering it for cleanup on process
|
|
156
|
+
* exit. Throws if already started: overwriting the handle would orphan the
|
|
157
|
+
* running container. Call {@link stop} first.
|
|
158
|
+
*/
|
|
159
|
+
async start() {
|
|
160
|
+
if (this.container) {
|
|
161
|
+
throw new Error("Container is already started.");
|
|
162
|
+
}
|
|
163
|
+
const client = await this.getClient();
|
|
164
|
+
logger.debug("Starting container...");
|
|
165
|
+
this.container = await client.createContainer({
|
|
166
|
+
Image: this.options.image,
|
|
167
|
+
Tty: true,
|
|
168
|
+
Cmd: KEEP_ALIVE_COMMAND,
|
|
169
|
+
NetworkDisabled: !this.options.networkEnabled,
|
|
170
|
+
HostConfig: { CapDrop: ["ALL"], SecurityOpt: ["no-new-privileges"] }
|
|
171
|
+
});
|
|
172
|
+
await this.container.start();
|
|
173
|
+
activeContainers.add(this.container);
|
|
174
|
+
registerExitHooks();
|
|
175
|
+
logger.debug(`Container ${this.container.id} started.`);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Runs a command inside the container and returns its decoded output. The
|
|
179
|
+
* exec is created without a TTY so the stream stays multiplexed and can be
|
|
180
|
+
* split into stdout and stderr via `modem.demuxStream`.
|
|
181
|
+
*
|
|
182
|
+
* `timeoutSeconds` bounds the wait, not the in-container run: a process that
|
|
183
|
+
* keeps the exec's stdio open (e.g. a surviving background child) means
|
|
184
|
+
* `'end'` never fires, so without this cap the promise never settles (the
|
|
185
|
+
* same hang #793 fixed in the local executor). Callers that need to bound the
|
|
186
|
+
* run itself must wrap the command (see {@link ContainerCodeExecutor}). On a
|
|
187
|
+
* cap breach the result carries {@link TIMEOUT_EXIT_CODE}.
|
|
188
|
+
*/
|
|
189
|
+
async execute(cmd, timeoutSeconds) {
|
|
190
|
+
if (!this.container) {
|
|
191
|
+
throw new Error("Container is not started.");
|
|
192
|
+
}
|
|
193
|
+
const client = await this.getClient();
|
|
194
|
+
const exec = await this.container.exec({
|
|
195
|
+
Cmd: cmd,
|
|
196
|
+
AttachStdout: true,
|
|
197
|
+
AttachStderr: true
|
|
198
|
+
});
|
|
199
|
+
const stream = await exec.start({ hijack: true, stdin: false });
|
|
200
|
+
const stdout = new PassThrough();
|
|
201
|
+
const stderr = new PassThrough();
|
|
202
|
+
client.modem.demuxStream(stream, stdout, stderr);
|
|
203
|
+
const collected = Promise.all([text(stdout), text(stderr)]);
|
|
204
|
+
let timedOut = false;
|
|
205
|
+
await new Promise((resolve, reject) => {
|
|
206
|
+
const timer = setTimeout(
|
|
207
|
+
() => {
|
|
208
|
+
timedOut = true;
|
|
209
|
+
stream.destroy();
|
|
210
|
+
resolve();
|
|
211
|
+
},
|
|
212
|
+
(timeoutSeconds + STREAM_WAIT_GRACE_SECONDS) * 1e3
|
|
213
|
+
);
|
|
214
|
+
timer.unref();
|
|
215
|
+
stream.on("end", () => {
|
|
216
|
+
clearTimeout(timer);
|
|
217
|
+
resolve();
|
|
218
|
+
});
|
|
219
|
+
stream.on("error", (error) => {
|
|
220
|
+
clearTimeout(timer);
|
|
221
|
+
reject(error);
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
stdout.end();
|
|
225
|
+
stderr.end();
|
|
226
|
+
const [stdoutText, stderrText] = await collected;
|
|
227
|
+
if (timedOut) {
|
|
228
|
+
return {
|
|
229
|
+
stdout: stdoutText,
|
|
230
|
+
stderr: stderrText,
|
|
231
|
+
exitCode: TIMEOUT_EXIT_CODE
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
const exitCode = await inspectExitCode(exec);
|
|
235
|
+
return { stdout: stdoutText, stderr: stderrText, exitCode };
|
|
236
|
+
}
|
|
237
|
+
/** Stops and removes the container. Safe to call when never started. */
|
|
238
|
+
async stop() {
|
|
239
|
+
const container = this.container;
|
|
240
|
+
if (!container) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (await stopAndRemove(container)) {
|
|
244
|
+
this.container = void 0;
|
|
245
|
+
activeContainers.delete(container);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Resolves the Docker client once, lazily loading dockerode when no client
|
|
250
|
+
* was injected.
|
|
251
|
+
*/
|
|
252
|
+
async getClient() {
|
|
253
|
+
var _a, _b;
|
|
254
|
+
(_b = this.client) != null ? _b : this.client = (_a = this.options.docker) != null ? _a : new (await loadDockerodeCtor())(
|
|
255
|
+
this.options.baseUrl ? parseBaseUrl(this.options.baseUrl) : void 0
|
|
256
|
+
);
|
|
257
|
+
return this.client;
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
__name(_DockerContainer, "DockerContainer");
|
|
261
|
+
let DockerContainer = _DockerContainer;
|
|
262
|
+
export {
|
|
263
|
+
DockerContainer,
|
|
264
|
+
TIMEOUT_EXIT_CODE
|
|
265
|
+
};
|