@google/adk 0.6.1 → 1.0.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/agents/base_agent.js +11 -2
- package/dist/cjs/agents/context.js +1 -0
- package/dist/cjs/agents/functions.js +1 -0
- package/dist/cjs/agents/invocation_context.js +1 -0
- package/dist/cjs/agents/llm_agent.js +70 -13
- package/dist/cjs/agents/loop_agent.js +4 -0
- package/dist/cjs/agents/parallel_agent.js +4 -0
- package/dist/cjs/agents/processors/code_execution_request_processor.js +2 -0
- package/dist/cjs/agents/processors/context_compactor_request_processor.js +9 -0
- package/dist/cjs/agents/processors/tool_filter_request_processor.js +73 -0
- package/dist/cjs/agents/routed_agent.js +97 -0
- package/dist/cjs/auth/auth_handler.js +66 -1
- package/dist/cjs/auth/auth_preprocessor.js +178 -0
- package/dist/cjs/auth/auth_provider_registry.js +61 -0
- package/dist/cjs/auth/base_auth_provider.js +27 -0
- package/dist/cjs/auth/credential_service/session_state_credential_service.js +51 -0
- package/dist/cjs/auth/oauth2/oauth2_credential_exchanger.js +198 -0
- package/dist/cjs/auth/oauth2/oauth2_credential_refresher.js +109 -0
- package/dist/cjs/auth/oauth2/oauth2_discovery.js +186 -0
- package/dist/cjs/auth/oauth2/oauth2_utils.js +119 -0
- package/dist/cjs/auth/refresher/base_credential_refresher.js +44 -0
- package/dist/cjs/auth/refresher/credential_refresher_registry.js +68 -0
- package/dist/cjs/code_executors/base_code_executor.js +9 -5
- package/dist/cjs/code_executors/code_execution_utils.js +19 -0
- package/dist/cjs/code_executors/unsafe_local_code_executor.js +241 -0
- package/dist/cjs/common.js +61 -0
- package/dist/cjs/features/feature_registry.js +141 -0
- package/dist/cjs/index.js +32 -20
- package/dist/cjs/index.js.map +4 -4
- package/dist/cjs/models/apigee_llm.js +2 -2
- package/dist/cjs/models/google_llm.js +18 -53
- package/dist/cjs/models/routed_llm.js +99 -0
- package/dist/cjs/plugins/base_plugin.js +39 -2
- package/dist/cjs/plugins/plugin_manager.js +39 -0
- package/dist/cjs/runner/runner.js +31 -3
- package/dist/cjs/sessions/db/operations.js +3 -10
- package/dist/cjs/skills/loader.js +283 -0
- package/dist/cjs/skills/prompt.js +58 -0
- package/dist/cjs/skills/skill.js +78 -0
- package/dist/cjs/tools/agent_tool.js +10 -3
- package/dist/cjs/tools/mcp/mcp_tool.js +4 -1
- package/dist/cjs/tools/skill/list_skills_tool.js +76 -0
- package/dist/cjs/tools/skill/load_skill_resource_tool.js +225 -0
- package/dist/cjs/tools/skill/load_skill_tool.js +108 -0
- package/dist/cjs/tools/skill/run_skill_inline_script_tool.js +146 -0
- package/dist/cjs/tools/skill/run_skill_script_tool.js +224 -0
- package/dist/cjs/tools/skill/skill_toolset.js +163 -0
- package/dist/cjs/utils/experimental.js +74 -0
- package/dist/cjs/utils/failover_utils.js +93 -0
- package/dist/cjs/utils/file_extension_utils.js +77 -0
- package/dist/cjs/utils/file_utils.js +94 -0
- package/dist/cjs/utils/streaming_utils.js +333 -0
- package/dist/cjs/version.js +1 -1
- package/dist/esm/a2a/a2a_event.js +2 -0
- package/dist/esm/a2a/a2a_remote_agent.js +2 -0
- package/dist/esm/a2a/a2a_remote_agent_run_processor.js +2 -0
- package/dist/esm/a2a/a2a_remote_agent_utils.js +2 -0
- package/dist/esm/a2a/agent_card.js +2 -0
- package/dist/esm/a2a/agent_executor.js +2 -0
- package/dist/esm/a2a/agent_to_a2a.js +2 -0
- package/dist/esm/a2a/event_converter_utils.js +2 -0
- package/dist/esm/a2a/event_processor_utils.js +2 -0
- package/dist/esm/a2a/executor_context.js +2 -0
- package/dist/esm/a2a/metadata_converter_utils.js +2 -0
- package/dist/esm/a2a/part_converter_utils.js +2 -0
- package/dist/esm/agents/active_streaming_tool.js +2 -0
- package/dist/esm/agents/base_agent.js +13 -2
- package/dist/esm/agents/context.js +3 -0
- package/dist/esm/agents/functions.js +3 -0
- package/dist/esm/agents/instructions.js +2 -0
- package/dist/esm/agents/invocation_context.js +3 -0
- package/dist/esm/agents/live_request_queue.js +2 -0
- package/dist/esm/agents/llm_agent.js +72 -13
- package/dist/esm/agents/loop_agent.js +6 -0
- package/dist/esm/agents/parallel_agent.js +6 -0
- package/dist/esm/agents/processors/agent_transfer_llm_request_processor.js +2 -0
- package/dist/esm/agents/processors/base_llm_processor.js +2 -0
- package/dist/esm/agents/processors/basic_llm_request_processor.js +2 -0
- package/dist/esm/agents/processors/code_execution_request_processor.js +5 -0
- package/dist/esm/agents/processors/content_processor_utils.js +2 -0
- package/dist/esm/agents/processors/content_request_processor.js +2 -0
- package/dist/esm/agents/processors/context_compactor_request_processor.js +11 -0
- package/dist/esm/agents/processors/identity_llm_request_processor.js +2 -0
- package/dist/esm/agents/processors/instructions_llm_request_processor.js +2 -0
- package/dist/esm/agents/processors/request_confirmation_llm_request_processor.js +2 -0
- package/dist/esm/agents/processors/tool_filter_request_processor.js +44 -0
- package/dist/esm/agents/readonly_context.js +2 -0
- package/dist/esm/agents/routed_agent.js +70 -0
- package/dist/esm/agents/run_config.js +2 -0
- package/dist/esm/agents/sequential_agent.js +2 -0
- package/dist/esm/agents/transcription_entry.js +2 -0
- package/dist/esm/artifacts/base_artifact_service.js +2 -0
- package/dist/esm/artifacts/file_artifact_service.js +2 -0
- package/dist/esm/artifacts/gcs_artifact_service.js +2 -0
- package/dist/esm/artifacts/in_memory_artifact_service.js +2 -0
- package/dist/esm/artifacts/registry.js +2 -0
- package/dist/esm/auth/auth_credential.js +2 -0
- package/dist/esm/auth/auth_handler.js +68 -1
- package/dist/esm/auth/auth_preprocessor.js +155 -0
- package/dist/esm/auth/auth_provider_registry.js +33 -0
- package/dist/esm/auth/auth_schemes.js +2 -0
- package/dist/esm/auth/auth_tool.js +2 -0
- package/dist/esm/auth/base_auth_provider.js +7 -0
- package/dist/esm/auth/credential_service/base_credential_service.js +2 -0
- package/dist/esm/auth/credential_service/in_memory_credential_service.js +2 -0
- package/dist/esm/auth/credential_service/session_state_credential_service.js +23 -0
- package/dist/esm/auth/exchanger/base_credential_exchanger.js +2 -0
- package/dist/esm/auth/exchanger/credential_exchanger_registry.js +2 -0
- package/dist/esm/auth/oauth2/oauth2_credential_exchanger.js +177 -0
- package/dist/esm/auth/oauth2/oauth2_credential_refresher.js +85 -0
- package/dist/esm/auth/oauth2/oauth2_discovery.js +156 -0
- package/dist/esm/auth/oauth2/oauth2_utils.js +87 -0
- package/dist/esm/auth/refresher/base_credential_refresher.js +16 -0
- package/dist/esm/auth/refresher/credential_refresher_registry.js +40 -0
- package/dist/esm/code_executors/base_code_executor.js +11 -5
- package/dist/esm/code_executors/built_in_code_executor.js +2 -0
- package/dist/esm/code_executors/code_execution_utils.js +19 -0
- package/dist/esm/code_executors/code_executor_context.js +2 -0
- package/dist/esm/code_executors/unsafe_local_code_executor.js +205 -0
- package/dist/esm/common.js +47 -3
- package/dist/esm/context/base_context_compactor.js +2 -0
- package/dist/esm/context/summarizers/base_summarizer.js +2 -0
- package/dist/esm/context/summarizers/llm_summarizer.js +2 -0
- package/dist/esm/context/token_based_context_compactor.js +2 -0
- package/dist/esm/context/truncating_context_compactor.js +2 -0
- package/dist/esm/events/compacted_event.js +2 -0
- package/dist/esm/events/event.js +2 -0
- package/dist/esm/events/event_actions.js +2 -0
- package/dist/esm/events/structured_events.js +2 -0
- package/dist/esm/examples/base_example_provider.js +2 -0
- package/dist/esm/examples/example.js +2 -0
- package/dist/esm/examples/example_util.js +2 -0
- package/dist/esm/features/feature_registry.js +107 -0
- package/dist/esm/index.js +34 -21
- package/dist/esm/index.js.map +4 -4
- package/dist/esm/index_web.js +2 -0
- package/dist/esm/memory/base_memory_service.js +2 -0
- package/dist/esm/memory/in_memory_memory_service.js +2 -0
- package/dist/esm/memory/memory_entry.js +2 -0
- package/dist/esm/models/apigee_llm.js +4 -2
- package/dist/esm/models/base_llm.js +2 -0
- package/dist/esm/models/base_llm_connection.js +2 -0
- package/dist/esm/models/gemini_llm_connection.js +2 -0
- package/dist/esm/models/google_llm.js +20 -54
- package/dist/esm/models/llm_request.js +2 -0
- package/dist/esm/models/llm_response.js +2 -0
- package/dist/esm/models/registry.js +2 -0
- package/dist/esm/models/routed_llm.js +73 -0
- package/dist/esm/plugins/base_plugin.js +41 -1
- package/dist/esm/plugins/logging_plugin.js +2 -0
- package/dist/esm/plugins/plugin_manager.js +41 -0
- package/dist/esm/plugins/security_plugin.js +2 -0
- package/dist/esm/runner/in_memory_runner.js +2 -0
- package/dist/esm/runner/runner.js +33 -3
- package/dist/esm/sessions/base_session_service.js +2 -0
- package/dist/esm/sessions/database_session_service.js +2 -0
- package/dist/esm/sessions/db/operations.js +5 -10
- package/dist/esm/sessions/db/schema.js +2 -0
- package/dist/esm/sessions/in_memory_session_service.js +2 -0
- package/dist/esm/sessions/registry.js +2 -0
- package/dist/esm/sessions/session.js +2 -0
- package/dist/esm/sessions/state.js +2 -0
- package/dist/esm/skills/loader.js +244 -0
- package/dist/esm/skills/prompt.js +30 -0
- package/dist/esm/skills/skill.js +49 -0
- package/dist/esm/telemetry/google_cloud.js +2 -0
- package/dist/esm/telemetry/setup.js +2 -0
- package/dist/esm/telemetry/tracing.js +2 -0
- package/dist/esm/tools/agent_tool.js +12 -3
- package/dist/esm/tools/base_tool.js +2 -0
- package/dist/esm/tools/base_toolset.js +2 -0
- package/dist/esm/tools/exit_loop_tool.js +2 -0
- package/dist/esm/tools/forwarding_artifact_service.js +2 -0
- package/dist/esm/tools/function_tool.js +2 -0
- package/dist/esm/tools/google_search_tool.js +2 -0
- package/dist/esm/tools/load_artifacts_tool.js +2 -0
- package/dist/esm/tools/load_memory_tool.js +2 -0
- package/dist/esm/tools/long_running_tool.js +2 -0
- package/dist/esm/tools/mcp/mcp_session_manager.js +2 -0
- package/dist/esm/tools/mcp/mcp_tool.js +6 -1
- package/dist/esm/tools/mcp/mcp_toolset.js +2 -0
- package/dist/esm/tools/preload_memory_tool.js +2 -0
- package/dist/esm/tools/skill/list_skills_tool.js +50 -0
- package/dist/esm/tools/skill/load_skill_resource_tool.js +191 -0
- package/dist/esm/tools/skill/load_skill_tool.js +82 -0
- package/dist/esm/tools/skill/run_skill_inline_script_tool.js +120 -0
- package/dist/esm/tools/skill/run_skill_script_tool.js +192 -0
- package/dist/esm/tools/skill/skill_toolset.js +137 -0
- package/dist/esm/tools/tool_confirmation.js +2 -0
- package/dist/esm/utils/client_labels.js +2 -0
- package/dist/esm/utils/env_aware_utils.js +2 -0
- package/dist/esm/utils/experimental.js +46 -0
- package/dist/esm/utils/failover_utils.js +65 -0
- package/dist/esm/utils/file_extension_utils.js +51 -0
- package/dist/esm/utils/file_utils.js +56 -0
- package/dist/esm/utils/gemini_schema_util.js +2 -0
- package/dist/esm/utils/logger.js +2 -0
- package/dist/esm/utils/model_name.js +2 -0
- package/dist/esm/utils/object_notation_utils.js +2 -0
- package/dist/esm/utils/simple_zod_to_json.js +2 -0
- package/dist/esm/utils/streaming_utils.js +307 -0
- package/dist/esm/utils/variant_utils.js +2 -0
- package/dist/esm/version.js +3 -1
- package/dist/types/agents/context.d.ts +1 -0
- package/dist/types/agents/invocation_context.d.ts +5 -0
- package/dist/types/agents/processors/tool_filter_request_processor.d.ts +14 -0
- package/dist/types/agents/routed_agent.d.ts +59 -0
- package/dist/types/auth/auth_credential.d.ts +17 -0
- package/dist/types/auth/auth_handler.d.ts +1 -0
- package/dist/types/auth/auth_preprocessor.d.ts +12 -0
- package/dist/types/auth/auth_provider_registry.d.ts +27 -0
- package/dist/types/auth/base_auth_provider.d.ts +20 -0
- package/dist/types/auth/credential_service/session_state_credential_service.d.ts +20 -0
- package/dist/types/auth/exchanger/base_credential_exchanger.d.ts +12 -5
- package/dist/types/auth/oauth2/oauth2_credential_exchanger.d.ts +26 -0
- package/dist/types/auth/oauth2/oauth2_credential_refresher.d.ts +29 -0
- package/dist/types/auth/oauth2/oauth2_discovery.d.ts +38 -0
- package/dist/types/auth/oauth2/oauth2_utils.d.ts +56 -0
- package/dist/types/auth/refresher/base_credential_refresher.d.ts +38 -0
- package/dist/types/auth/refresher/credential_refresher_registry.d.ts +27 -0
- package/dist/types/code_executors/base_code_executor.d.ts +4 -4
- package/dist/types/code_executors/code_execution_utils.d.ts +29 -1
- package/dist/types/code_executors/unsafe_local_code_executor.d.ts +48 -0
- package/dist/types/common.d.ts +26 -3
- package/dist/types/features/feature_registry.d.ts +66 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/memory/base_memory_service.d.ts +6 -0
- package/dist/types/memory/memory_entry.d.ts +11 -5
- package/dist/types/models/apigee_llm.d.ts +1 -1
- package/dist/types/models/base_llm.d.ts +1 -1
- package/dist/types/models/google_llm.d.ts +1 -1
- package/dist/types/models/llm_request.d.ts +4 -0
- package/dist/types/models/routed_llm.d.ts +38 -0
- package/dist/types/plugins/base_plugin.d.ts +49 -0
- package/dist/types/plugins/plugin_manager.d.ts +22 -1
- package/dist/types/runner/runner.d.ts +1 -0
- package/dist/types/skills/loader.d.ts +38 -0
- package/dist/types/skills/prompt.d.ts +13 -0
- package/dist/types/skills/skill.d.ts +48 -0
- package/dist/types/tools/skill/list_skills_tool.d.ts +14 -0
- package/dist/types/tools/skill/load_skill_resource_tool.d.ts +15 -0
- package/dist/types/tools/skill/load_skill_tool.d.ts +14 -0
- package/dist/types/tools/skill/run_skill_inline_script_tool.d.ts +14 -0
- package/dist/types/tools/skill/run_skill_script_tool.d.ts +17 -0
- package/dist/types/tools/skill/skill_toolset.d.ts +28 -0
- package/dist/types/utils/experimental.d.ts +11 -0
- package/dist/types/utils/failover_utils.d.ts +17 -0
- package/dist/types/utils/file_extension_utils.d.ts +21 -0
- package/dist/types/utils/file_utils.d.ts +11 -0
- package/dist/types/utils/streaming_utils.d.ts +40 -0
- package/dist/types/version.d.ts +1 -1
- package/dist/web/a2a/a2a_event.js +2 -0
- package/dist/web/a2a/a2a_remote_agent.js +2 -0
- package/dist/web/a2a/a2a_remote_agent_run_processor.js +2 -0
- package/dist/web/a2a/a2a_remote_agent_utils.js +2 -0
- package/dist/web/a2a/agent_card.js +2 -0
- package/dist/web/a2a/agent_executor.js +2 -0
- package/dist/web/a2a/agent_to_a2a.js +2 -0
- package/dist/web/a2a/event_converter_utils.js +2 -0
- package/dist/web/a2a/event_processor_utils.js +2 -0
- package/dist/web/a2a/executor_context.js +2 -0
- package/dist/web/a2a/metadata_converter_utils.js +2 -0
- package/dist/web/a2a/part_converter_utils.js +2 -0
- package/dist/web/agents/active_streaming_tool.js +2 -0
- package/dist/web/agents/base_agent.js +13 -2
- package/dist/web/agents/context.js +3 -0
- package/dist/web/agents/functions.js +3 -0
- package/dist/web/agents/instructions.js +2 -0
- package/dist/web/agents/invocation_context.js +3 -0
- package/dist/web/agents/live_request_queue.js +2 -0
- package/dist/web/agents/llm_agent.js +72 -13
- package/dist/web/agents/loop_agent.js +6 -0
- package/dist/web/agents/parallel_agent.js +6 -0
- package/dist/web/agents/processors/agent_transfer_llm_request_processor.js +2 -0
- package/dist/web/agents/processors/base_llm_processor.js +2 -0
- package/dist/web/agents/processors/basic_llm_request_processor.js +2 -0
- package/dist/web/agents/processors/code_execution_request_processor.js +5 -0
- package/dist/web/agents/processors/content_processor_utils.js +2 -0
- package/dist/web/agents/processors/content_request_processor.js +2 -0
- package/dist/web/agents/processors/context_compactor_request_processor.js +11 -0
- package/dist/web/agents/processors/identity_llm_request_processor.js +2 -0
- package/dist/web/agents/processors/instructions_llm_request_processor.js +2 -0
- package/dist/web/agents/processors/request_confirmation_llm_request_processor.js +2 -0
- package/dist/web/agents/processors/tool_filter_request_processor.js +62 -0
- package/dist/web/agents/readonly_context.js +2 -0
- package/dist/web/agents/routed_agent.js +138 -0
- package/dist/web/agents/run_config.js +2 -0
- package/dist/web/agents/sequential_agent.js +2 -0
- package/dist/web/agents/transcription_entry.js +2 -0
- package/dist/web/artifacts/base_artifact_service.js +2 -0
- package/dist/web/artifacts/file_artifact_service.js +2 -0
- package/dist/web/artifacts/gcs_artifact_service.js +2 -0
- package/dist/web/artifacts/in_memory_artifact_service.js +2 -0
- package/dist/web/artifacts/registry.js +2 -0
- package/dist/web/auth/auth_credential.js +2 -0
- package/dist/web/auth/auth_handler.js +85 -1
- package/dist/web/auth/auth_preprocessor.js +173 -0
- package/dist/web/auth/auth_provider_registry.js +33 -0
- package/dist/web/auth/auth_schemes.js +2 -0
- package/dist/web/auth/auth_tool.js +2 -0
- package/dist/web/auth/base_auth_provider.js +7 -0
- package/dist/web/auth/credential_service/base_credential_service.js +2 -0
- package/dist/web/auth/credential_service/in_memory_credential_service.js +2 -0
- package/dist/web/auth/credential_service/session_state_credential_service.js +23 -0
- package/dist/web/auth/exchanger/base_credential_exchanger.js +2 -0
- package/dist/web/auth/exchanger/credential_exchanger_registry.js +2 -0
- package/dist/web/auth/oauth2/oauth2_credential_exchanger.js +188 -0
- package/dist/web/auth/oauth2/oauth2_credential_refresher.js +102 -0
- package/dist/web/auth/oauth2/oauth2_discovery.js +156 -0
- package/dist/web/auth/oauth2/oauth2_utils.js +87 -0
- package/dist/web/auth/refresher/base_credential_refresher.js +16 -0
- package/dist/web/auth/refresher/credential_refresher_registry.js +40 -0
- package/dist/web/code_executors/base_code_executor.js +11 -5
- package/dist/web/code_executors/built_in_code_executor.js +2 -0
- package/dist/web/code_executors/code_execution_utils.js +19 -0
- package/dist/web/code_executors/code_executor_context.js +2 -0
- package/dist/web/code_executors/unsafe_local_code_executor.js +203 -0
- package/dist/web/common.js +47 -3
- package/dist/web/context/base_context_compactor.js +2 -0
- package/dist/web/context/summarizers/base_summarizer.js +2 -0
- package/dist/web/context/summarizers/llm_summarizer.js +2 -0
- package/dist/web/context/token_based_context_compactor.js +2 -0
- package/dist/web/context/truncating_context_compactor.js +2 -0
- package/dist/web/events/compacted_event.js +2 -0
- package/dist/web/events/event.js +2 -0
- package/dist/web/events/event_actions.js +2 -0
- package/dist/web/events/structured_events.js +2 -0
- package/dist/web/examples/base_example_provider.js +2 -0
- package/dist/web/examples/example.js +2 -0
- package/dist/web/examples/example_util.js +2 -0
- package/dist/web/features/feature_registry.js +107 -0
- package/dist/web/index.js +3 -2
- package/dist/web/index.js.map +4 -4
- package/dist/web/index_web.js +2 -0
- package/dist/web/memory/base_memory_service.js +2 -0
- package/dist/web/memory/in_memory_memory_service.js +2 -0
- package/dist/web/memory/memory_entry.js +2 -0
- package/dist/web/models/apigee_llm.js +4 -2
- package/dist/web/models/base_llm.js +2 -0
- package/dist/web/models/base_llm_connection.js +2 -0
- package/dist/web/models/gemini_llm_connection.js +2 -0
- package/dist/web/models/google_llm.js +37 -59
- package/dist/web/models/llm_request.js +2 -0
- package/dist/web/models/llm_response.js +2 -0
- package/dist/web/models/registry.js +2 -0
- package/dist/web/models/routed_llm.js +122 -0
- package/dist/web/plugins/base_plugin.js +41 -1
- package/dist/web/plugins/logging_plugin.js +2 -0
- package/dist/web/plugins/plugin_manager.js +41 -0
- package/dist/web/plugins/security_plugin.js +2 -0
- package/dist/web/runner/in_memory_runner.js +2 -0
- package/dist/web/runner/runner.js +33 -3
- package/dist/web/sessions/base_session_service.js +2 -0
- package/dist/web/sessions/database_session_service.js +2 -0
- package/dist/web/sessions/db/operations.js +5 -10
- package/dist/web/sessions/db/schema.js +2 -0
- package/dist/web/sessions/in_memory_session_service.js +2 -0
- package/dist/web/sessions/registry.js +2 -0
- package/dist/web/sessions/session.js +2 -0
- package/dist/web/sessions/state.js +2 -0
- package/dist/web/skills/loader.js +262 -0
- package/dist/web/skills/prompt.js +30 -0
- package/dist/web/skills/skill.js +67 -0
- package/dist/web/telemetry/google_cloud.js +2 -0
- package/dist/web/telemetry/setup.js +2 -0
- package/dist/web/telemetry/tracing.js +2 -0
- package/dist/web/tools/agent_tool.js +12 -3
- package/dist/web/tools/base_tool.js +2 -0
- package/dist/web/tools/base_toolset.js +2 -0
- package/dist/web/tools/exit_loop_tool.js +2 -0
- package/dist/web/tools/forwarding_artifact_service.js +2 -0
- package/dist/web/tools/function_tool.js +2 -0
- package/dist/web/tools/google_search_tool.js +2 -0
- package/dist/web/tools/load_artifacts_tool.js +2 -0
- package/dist/web/tools/load_memory_tool.js +2 -0
- package/dist/web/tools/long_running_tool.js +2 -0
- package/dist/web/tools/mcp/mcp_session_manager.js +2 -0
- package/dist/web/tools/mcp/mcp_tool.js +6 -1
- package/dist/web/tools/mcp/mcp_toolset.js +2 -0
- package/dist/web/tools/preload_memory_tool.js +2 -0
- package/dist/web/tools/skill/list_skills_tool.js +50 -0
- package/dist/web/tools/skill/load_skill_resource_tool.js +191 -0
- package/dist/web/tools/skill/load_skill_tool.js +82 -0
- package/dist/web/tools/skill/run_skill_inline_script_tool.js +120 -0
- package/dist/web/tools/skill/run_skill_script_tool.js +190 -0
- package/dist/web/tools/skill/skill_toolset.js +123 -0
- package/dist/web/tools/tool_confirmation.js +2 -0
- package/dist/web/utils/client_labels.js +2 -0
- package/dist/web/utils/env_aware_utils.js +2 -0
- package/dist/web/utils/experimental.js +46 -0
- package/dist/web/utils/failover_utils.js +96 -0
- package/dist/web/utils/file_extension_utils.js +51 -0
- package/dist/web/utils/file_utils.js +74 -0
- package/dist/web/utils/gemini_schema_util.js +2 -0
- package/dist/web/utils/logger.js +2 -0
- package/dist/web/utils/model_name.js +2 -0
- package/dist/web/utils/object_notation_utils.js +2 -0
- package/dist/web/utils/simple_zod_to_json.js +2 -0
- package/dist/web/utils/streaming_utils.js +325 -0
- package/dist/web/utils/variant_utils.js +2 -0
- package/dist/web/version.js +3 -1
- package/package.json +19 -17
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import {createRequire as topLevelCreateRequire} from 'module';
|
|
2
|
+
const require = topLevelCreateRequire(import.meta.url);
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __defProps = Object.defineProperties;
|
|
5
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
6
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
9
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
10
|
+
var __spreadValues = (a, b) => {
|
|
11
|
+
for (var prop in b || (b = {}))
|
|
12
|
+
if (__hasOwnProp.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
if (__getOwnPropSymbols)
|
|
15
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
16
|
+
if (__propIsEnum.call(b, prop))
|
|
17
|
+
__defNormalProp(a, prop, b[prop]);
|
|
18
|
+
}
|
|
19
|
+
return a;
|
|
20
|
+
};
|
|
21
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
22
|
+
/**
|
|
23
|
+
* @license
|
|
24
|
+
* Copyright 2026 Google LLC
|
|
25
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
26
|
+
*/
|
|
27
|
+
import { logger } from "../../utils/logger.js";
|
|
28
|
+
import {
|
|
29
|
+
fetchOAuth2Tokens,
|
|
30
|
+
getTokenEndpoint,
|
|
31
|
+
isTokenExpired
|
|
32
|
+
} from "./oauth2_utils.js";
|
|
33
|
+
class OAuth2CredentialRefresher {
|
|
34
|
+
/**
|
|
35
|
+
* Check if the OAuth2 credential needs to be refreshed.
|
|
36
|
+
*
|
|
37
|
+
* @param authCredential The OAuth2 credential to check.
|
|
38
|
+
* @param authScheme The OAuth2 authentication scheme (optional).
|
|
39
|
+
* @returns True if the credential needs to be refreshed, False otherwise.
|
|
40
|
+
*/
|
|
41
|
+
async isRefreshNeeded(authCredential) {
|
|
42
|
+
if (!authCredential.oauth2) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
if (authCredential.oauth2 && authCredential.oauth2.expiresAt) {
|
|
46
|
+
return isTokenExpired(authCredential.oauth2);
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Refresh the OAuth2 credential.
|
|
52
|
+
*
|
|
53
|
+
* @param authCredential The OAuth2 credential to refresh.
|
|
54
|
+
* @param authScheme The OAuth2 authentication scheme.
|
|
55
|
+
* @returns The refreshed credential.
|
|
56
|
+
*/
|
|
57
|
+
async refresh(authCredential, authScheme) {
|
|
58
|
+
if (!authCredential.oauth2 || !authScheme) {
|
|
59
|
+
return authCredential;
|
|
60
|
+
}
|
|
61
|
+
if (!authCredential.oauth2.refreshToken) {
|
|
62
|
+
logger.warn("No refresh token available to refresh credential");
|
|
63
|
+
return authCredential;
|
|
64
|
+
}
|
|
65
|
+
const isNeeded = await this.isRefreshNeeded(authCredential);
|
|
66
|
+
if (!isNeeded) {
|
|
67
|
+
return authCredential;
|
|
68
|
+
}
|
|
69
|
+
const tokenEndpoint = getTokenEndpoint(authScheme);
|
|
70
|
+
if (!tokenEndpoint) {
|
|
71
|
+
logger.warn("Token endpoint not found in auth scheme.");
|
|
72
|
+
return authCredential;
|
|
73
|
+
}
|
|
74
|
+
if (!authCredential.oauth2.clientId || !authCredential.oauth2.clientSecret) {
|
|
75
|
+
logger.warn("clientId and clientSecret are required for token refresh.");
|
|
76
|
+
return authCredential;
|
|
77
|
+
}
|
|
78
|
+
const body = new URLSearchParams();
|
|
79
|
+
body.set("grant_type", "refresh_token");
|
|
80
|
+
body.set("refresh_token", authCredential.oauth2.refreshToken);
|
|
81
|
+
body.set("client_id", authCredential.oauth2.clientId);
|
|
82
|
+
body.set("client_secret", authCredential.oauth2.clientSecret);
|
|
83
|
+
try {
|
|
84
|
+
const data = await fetchOAuth2Tokens(tokenEndpoint, body);
|
|
85
|
+
const updatedOAuth2 = __spreadProps(__spreadValues({}, authCredential.oauth2), {
|
|
86
|
+
accessToken: data.accessToken || authCredential.oauth2.accessToken,
|
|
87
|
+
refreshToken: data.refreshToken || authCredential.oauth2.refreshToken,
|
|
88
|
+
expiresIn: data.expiresIn,
|
|
89
|
+
expiresAt: data.expiresAt || authCredential.oauth2.expiresAt
|
|
90
|
+
});
|
|
91
|
+
return __spreadProps(__spreadValues({}, authCredential), {
|
|
92
|
+
oauth2: updatedOAuth2
|
|
93
|
+
});
|
|
94
|
+
} catch (error) {
|
|
95
|
+
logger.error("Failed to refresh tokens:", error);
|
|
96
|
+
return authCredential;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export {
|
|
101
|
+
OAuth2CredentialRefresher
|
|
102
|
+
};
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import {createRequire as topLevelCreateRequire} from 'module';
|
|
2
|
+
const require = topLevelCreateRequire(import.meta.url);
|
|
3
|
+
/**
|
|
4
|
+
* @license
|
|
5
|
+
* Copyright 2026 Google LLC
|
|
6
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
import { logger } from "../../utils/logger.js";
|
|
10
|
+
const AuthorizationServerMetadataSchema = z.object({
|
|
11
|
+
issuer: z.string(),
|
|
12
|
+
authorization_endpoint: z.string(),
|
|
13
|
+
token_endpoint: z.string(),
|
|
14
|
+
scopes_supported: z.array(z.string()).optional(),
|
|
15
|
+
registration_endpoint: z.string().optional()
|
|
16
|
+
});
|
|
17
|
+
const ProtectedResourceMetadataSchema = z.object({
|
|
18
|
+
resource: z.string(),
|
|
19
|
+
authorization_servers: z.array(z.string()).default([])
|
|
20
|
+
});
|
|
21
|
+
class OAuth2DiscoveryManager {
|
|
22
|
+
/**
|
|
23
|
+
* Discovers the OAuth2 authorization server metadata.
|
|
24
|
+
*/
|
|
25
|
+
async discoverAuthServerMetadata(issuerUrl) {
|
|
26
|
+
if (!validateDiscoveryUrl(issuerUrl)) {
|
|
27
|
+
return void 0;
|
|
28
|
+
}
|
|
29
|
+
let baseUrl;
|
|
30
|
+
let path;
|
|
31
|
+
try {
|
|
32
|
+
const url = new URL(issuerUrl);
|
|
33
|
+
baseUrl = "".concat(url.protocol, "//").concat(url.host);
|
|
34
|
+
path = url.pathname;
|
|
35
|
+
} catch (e) {
|
|
36
|
+
logger.warn("Failed to parse issuerUrl ".concat(issuerUrl, ": ").concat(e));
|
|
37
|
+
return void 0;
|
|
38
|
+
}
|
|
39
|
+
const endpointsToTry = [];
|
|
40
|
+
if (path && path !== "/") {
|
|
41
|
+
endpointsToTry.push(
|
|
42
|
+
"".concat(baseUrl, "/.well-known/oauth-authorization-server").concat(path),
|
|
43
|
+
"".concat(baseUrl, "/.well-known/openid-configuration").concat(path),
|
|
44
|
+
"".concat(baseUrl).concat(path, "/.well-known/openid-configuration")
|
|
45
|
+
);
|
|
46
|
+
} else {
|
|
47
|
+
endpointsToTry.push(
|
|
48
|
+
"".concat(baseUrl, "/.well-known/oauth-authorization-server"),
|
|
49
|
+
"".concat(baseUrl, "/.well-known/openid-configuration")
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
for (const endpoint of endpointsToTry) {
|
|
53
|
+
try {
|
|
54
|
+
const response = await fetch(endpoint, {
|
|
55
|
+
method: "GET",
|
|
56
|
+
headers: {
|
|
57
|
+
Accept: "application/json"
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
if (!response.ok) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const data = await response.json();
|
|
64
|
+
const metadata = AuthorizationServerMetadataSchema.parse(data);
|
|
65
|
+
if (metadata.issuer.replace(/\/$/, "") === issuerUrl.replace(/\/$/, "")) {
|
|
66
|
+
return metadata;
|
|
67
|
+
} else {
|
|
68
|
+
logger.warn(
|
|
69
|
+
"Issuer in metadata ".concat(metadata.issuer, " does not match issuerUrl ").concat(issuerUrl)
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
} catch (e) {
|
|
73
|
+
logger.debug("Failed to fetch metadata from ".concat(endpoint, ": ").concat(e));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return void 0;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Discovers the OAuth2 protected resource metadata.
|
|
80
|
+
*/
|
|
81
|
+
async discoverResourceMetadata(resourceUrl) {
|
|
82
|
+
if (!validateDiscoveryUrl(resourceUrl)) {
|
|
83
|
+
return void 0;
|
|
84
|
+
}
|
|
85
|
+
let baseUrl;
|
|
86
|
+
let path;
|
|
87
|
+
try {
|
|
88
|
+
const url = new URL(resourceUrl);
|
|
89
|
+
baseUrl = "".concat(url.protocol, "//").concat(url.host);
|
|
90
|
+
path = url.pathname;
|
|
91
|
+
} catch (e) {
|
|
92
|
+
logger.warn("Failed to parse resourceUrl ".concat(resourceUrl, ": ").concat(e));
|
|
93
|
+
return void 0;
|
|
94
|
+
}
|
|
95
|
+
let wellKnownEndpoint;
|
|
96
|
+
if (path && path !== "/") {
|
|
97
|
+
wellKnownEndpoint = "".concat(baseUrl, "/.well-known/oauth-protected-resource").concat(path);
|
|
98
|
+
} else {
|
|
99
|
+
wellKnownEndpoint = "".concat(baseUrl, "/.well-known/oauth-protected-resource");
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
const response = await fetch(wellKnownEndpoint, {
|
|
103
|
+
method: "GET",
|
|
104
|
+
headers: {
|
|
105
|
+
Accept: "application/json"
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
if (!response.ok) {
|
|
109
|
+
return void 0;
|
|
110
|
+
}
|
|
111
|
+
const data = await response.json();
|
|
112
|
+
const metadata = ProtectedResourceMetadataSchema.parse(data);
|
|
113
|
+
if (metadata.resource.replace(/\/$/, "") === resourceUrl.replace(/\/$/, "")) {
|
|
114
|
+
return metadata;
|
|
115
|
+
} else {
|
|
116
|
+
logger.warn(
|
|
117
|
+
"Resource in metadata ".concat(metadata.resource, " does not match resourceUrl ").concat(resourceUrl)
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
} catch (e) {
|
|
121
|
+
logger.debug("Failed to fetch metadata from ".concat(wellKnownEndpoint, ": ").concat(e));
|
|
122
|
+
}
|
|
123
|
+
return void 0;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function validateDiscoveryUrl(urlStr) {
|
|
127
|
+
try {
|
|
128
|
+
const url = new URL(urlStr);
|
|
129
|
+
if (url.protocol !== "https:") {
|
|
130
|
+
logger.warn("Unsafe protocol for discovery URL: ".concat(url.protocol));
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
const host = url.hostname.toLowerCase();
|
|
134
|
+
if (host === "localhost" || host === "127.0.0.1" || host === "[::1]" || host.startsWith("10.") || host.startsWith("192.168.") || host.startsWith("169.254.")) {
|
|
135
|
+
logger.warn("Unsafe host for discovery URL: ".concat(host));
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
const match = host.match(/^172\.(\d+)\./);
|
|
139
|
+
if (match) {
|
|
140
|
+
const secondOctet = parseInt(match[1], 10);
|
|
141
|
+
if (secondOctet >= 16 && secondOctet <= 31) {
|
|
142
|
+
logger.warn("Unsafe host for discovery URL: ".concat(host));
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return true;
|
|
147
|
+
} catch (e) {
|
|
148
|
+
logger.warn("Failed to parse URL for validation ".concat(urlStr, ": ").concat(e));
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
export {
|
|
153
|
+
AuthorizationServerMetadataSchema,
|
|
154
|
+
OAuth2DiscoveryManager,
|
|
155
|
+
ProtectedResourceMetadataSchema
|
|
156
|
+
};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import {createRequire as topLevelCreateRequire} from 'module';
|
|
2
|
+
const require = topLevelCreateRequire(import.meta.url);
|
|
3
|
+
/**
|
|
4
|
+
* @license
|
|
5
|
+
* Copyright 2026 Google LLC
|
|
6
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
7
|
+
*/
|
|
8
|
+
import { logger } from "../../utils/logger.js";
|
|
9
|
+
function getTokenEndpoint(authScheme) {
|
|
10
|
+
if (authScheme.type === "openIdConnect" && authScheme.tokenEndpoint) {
|
|
11
|
+
return authScheme.tokenEndpoint;
|
|
12
|
+
}
|
|
13
|
+
if (authScheme.type === "oauth2" && authScheme.flows) {
|
|
14
|
+
const flows = authScheme.flows;
|
|
15
|
+
const flow = flows.authorizationCode || flows.clientCredentials || flows.password || flows.implicit;
|
|
16
|
+
if (flow && "tokenUrl" in flow) {
|
|
17
|
+
return flow.tokenUrl;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return void 0;
|
|
21
|
+
}
|
|
22
|
+
async function fetchOAuth2Tokens(endpoint, body) {
|
|
23
|
+
try {
|
|
24
|
+
const response = await fetch(endpoint, {
|
|
25
|
+
method: "POST",
|
|
26
|
+
headers: {
|
|
27
|
+
"Content-Type": "application/x-www-form-urlencoded"
|
|
28
|
+
},
|
|
29
|
+
body: body.toString()
|
|
30
|
+
});
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
throw new Error("Token request failed with status ".concat(response.status));
|
|
33
|
+
}
|
|
34
|
+
const data = await response.json();
|
|
35
|
+
return {
|
|
36
|
+
accessToken: data.access_token,
|
|
37
|
+
refreshToken: data.refresh_token,
|
|
38
|
+
idToken: data.id_token,
|
|
39
|
+
expiresIn: data.expires_in,
|
|
40
|
+
expiresAt: data.expires_in ? Date.now() + data.expires_in * 1e3 : void 0
|
|
41
|
+
};
|
|
42
|
+
} catch (e) {
|
|
43
|
+
logger.error("Failed to fetch OAuth2 tokens: ".concat(e));
|
|
44
|
+
throw e;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function parseAuthorizationCode(uri) {
|
|
48
|
+
try {
|
|
49
|
+
const url = new URL(uri);
|
|
50
|
+
return url.searchParams.get("code") || void 0;
|
|
51
|
+
} catch (e) {
|
|
52
|
+
logger.warn("Failed to parse authorization URI ".concat(uri, ": ").concat(e));
|
|
53
|
+
return void 0;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function createOAuth2TokenRequestBody(params) {
|
|
57
|
+
const body = new URLSearchParams();
|
|
58
|
+
body.set("grant_type", params.grantType);
|
|
59
|
+
body.set("client_id", params.clientId);
|
|
60
|
+
body.set("client_secret", params.clientSecret);
|
|
61
|
+
if (params.grantType === "authorization_code") {
|
|
62
|
+
body.set("code", params.code);
|
|
63
|
+
if (params.redirectUri) {
|
|
64
|
+
body.set("redirect_uri", params.redirectUri);
|
|
65
|
+
}
|
|
66
|
+
if (params.codeVerifier) {
|
|
67
|
+
body.set("code_verifier", params.codeVerifier);
|
|
68
|
+
}
|
|
69
|
+
} else if (params.grantType === "refresh_token") {
|
|
70
|
+
body.set("refresh_token", params.refreshToken);
|
|
71
|
+
}
|
|
72
|
+
return body;
|
|
73
|
+
}
|
|
74
|
+
function isTokenExpired(token, leeway = 60) {
|
|
75
|
+
if (typeof token.expiresAt !== "number") {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
const expirationThreshold = token.expiresAt - leeway * 1e3;
|
|
79
|
+
return expirationThreshold < Date.now();
|
|
80
|
+
}
|
|
81
|
+
export {
|
|
82
|
+
createOAuth2TokenRequestBody,
|
|
83
|
+
fetchOAuth2Tokens,
|
|
84
|
+
getTokenEndpoint,
|
|
85
|
+
isTokenExpired,
|
|
86
|
+
parseAuthorizationCode
|
|
87
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import {createRequire as topLevelCreateRequire} from 'module';
|
|
2
|
+
const require = topLevelCreateRequire(import.meta.url);
|
|
3
|
+
/**
|
|
4
|
+
* @license
|
|
5
|
+
* Copyright 2026 Google LLC
|
|
6
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
7
|
+
*/
|
|
8
|
+
class CredentialRefresherError extends Error {
|
|
9
|
+
constructor(message) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = "CredentialRefresherError";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
CredentialRefresherError
|
|
16
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import {createRequire as topLevelCreateRequire} from 'module';
|
|
2
|
+
const require = topLevelCreateRequire(import.meta.url);
|
|
3
|
+
/**
|
|
4
|
+
* @license
|
|
5
|
+
* Copyright 2026 Google LLC
|
|
6
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
7
|
+
*/
|
|
8
|
+
import { AuthCredentialTypes } from "../auth_credential.js";
|
|
9
|
+
class CredentialRefresherRegistry {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.refreshers = {
|
|
12
|
+
[AuthCredentialTypes.API_KEY]: void 0,
|
|
13
|
+
[AuthCredentialTypes.HTTP]: void 0,
|
|
14
|
+
[AuthCredentialTypes.OAUTH2]: void 0,
|
|
15
|
+
[AuthCredentialTypes.OPEN_ID_CONNECT]: void 0,
|
|
16
|
+
[AuthCredentialTypes.SERVICE_ACCOUNT]: void 0
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Register a refresher instance for a credential type.
|
|
21
|
+
*
|
|
22
|
+
* @param credentialType The credential type to register for.
|
|
23
|
+
* @param refresherInstance The refresher instance to register.
|
|
24
|
+
*/
|
|
25
|
+
register(credentialType, refresherInstance) {
|
|
26
|
+
this.refreshers[credentialType] = refresherInstance;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get the refresher instance for a credential type.
|
|
30
|
+
*
|
|
31
|
+
* @param credentialType The credential type to get refresher for.
|
|
32
|
+
* @returns The refresher instance if registered, undefined otherwise.
|
|
33
|
+
*/
|
|
34
|
+
getRefresher(credentialType) {
|
|
35
|
+
return this.refreshers[credentialType];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export {
|
|
39
|
+
CredentialRefresherRegistry
|
|
40
|
+
};
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import {createRequire as topLevelCreateRequire} from 'module';
|
|
2
|
+
const require = topLevelCreateRequire(import.meta.url);
|
|
1
3
|
/**
|
|
2
4
|
* @license
|
|
3
5
|
* Copyright 2025 Google LLC
|
|
@@ -34,16 +36,20 @@ class BaseCodeExecutor {
|
|
|
34
36
|
this.errorRetryAttempts = 2;
|
|
35
37
|
/**
|
|
36
38
|
* The list of the enclosing delimiters to identify the code blocks.
|
|
37
|
-
* For example, the delimiter('```
|
|
38
|
-
* identify code blocks with the following format
|
|
39
|
+
* For example, the delimiter('```javascript\\n', '\\n```') can be used to
|
|
40
|
+
* identify code blocks with the following format:
|
|
39
41
|
*
|
|
40
|
-
* ```
|
|
41
|
-
*
|
|
42
|
+
* ```javascript
|
|
43
|
+
* console.log("hello")
|
|
42
44
|
* ```
|
|
43
45
|
*/
|
|
44
46
|
this.codeBlockDelimiters = [
|
|
45
47
|
["```tool_code\n", "\n```"],
|
|
46
|
-
["```python\n", "\n```"]
|
|
48
|
+
["```python\n", "\n```"],
|
|
49
|
+
["```javascript\n", "\n```"],
|
|
50
|
+
["```typescript\n", "\n```"],
|
|
51
|
+
["```bash\n", "\n```"],
|
|
52
|
+
["```sh\n", "\n```"]
|
|
47
53
|
];
|
|
48
54
|
/**
|
|
49
55
|
* The delimiters to format the code execution result.
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import {createRequire as topLevelCreateRequire} from 'module';
|
|
2
|
+
const require = topLevelCreateRequire(import.meta.url);
|
|
1
3
|
/**
|
|
2
4
|
* @license
|
|
3
5
|
* Copyright 2025 Google LLC
|
|
@@ -6,6 +8,21 @@
|
|
|
6
8
|
import { Language, Outcome } from "@google/genai";
|
|
7
9
|
import { cloneDeep } from "lodash-es";
|
|
8
10
|
import { base64Encode, isBase64Encoded } from "../utils/env_aware_utils.js";
|
|
11
|
+
var FileContentEncoding = /* @__PURE__ */ ((FileContentEncoding2) => {
|
|
12
|
+
FileContentEncoding2["UTF8"] = "utf-8";
|
|
13
|
+
FileContentEncoding2["BASE64"] = "base64";
|
|
14
|
+
return FileContentEncoding2;
|
|
15
|
+
})(FileContentEncoding || {});
|
|
16
|
+
var CodeExecutionLanguage = /* @__PURE__ */ ((CodeExecutionLanguage2) => {
|
|
17
|
+
CodeExecutionLanguage2["UNSPECIFIED"] = "unspecified";
|
|
18
|
+
CodeExecutionLanguage2["PYTHON"] = "python";
|
|
19
|
+
CodeExecutionLanguage2["JAVASCRIPT"] = "javascript";
|
|
20
|
+
CodeExecutionLanguage2["TYPESCRIPT"] = "typescript";
|
|
21
|
+
CodeExecutionLanguage2["SHELL"] = "shell";
|
|
22
|
+
CodeExecutionLanguage2["POWERSHELL"] = "powershell";
|
|
23
|
+
CodeExecutionLanguage2["WINDOWS_CMD"] = "cmd";
|
|
24
|
+
return CodeExecutionLanguage2;
|
|
25
|
+
})(CodeExecutionLanguage || {});
|
|
9
26
|
function getEncodedFileContent(data) {
|
|
10
27
|
return isBase64Encoded(data) ? data : base64Encode(data);
|
|
11
28
|
}
|
|
@@ -97,6 +114,8 @@ function convertCodeExecutionParts(content, codeBlockDelimiter, executionResultD
|
|
|
97
114
|
}
|
|
98
115
|
}
|
|
99
116
|
export {
|
|
117
|
+
CodeExecutionLanguage,
|
|
118
|
+
FileContentEncoding,
|
|
100
119
|
buildCodeExecutionResultPart,
|
|
101
120
|
buildExecutableCodePart,
|
|
102
121
|
convertCodeExecutionParts,
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import {createRequire as topLevelCreateRequire} from 'module';
|
|
2
|
+
const require = topLevelCreateRequire(import.meta.url);
|
|
3
|
+
/**
|
|
4
|
+
* @license
|
|
5
|
+
* Copyright 2026 Google LLC
|
|
6
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
7
|
+
*/
|
|
8
|
+
import { spawn } from "child_process";
|
|
9
|
+
import * as fs from "node:fs/promises";
|
|
10
|
+
import * as os from "node:os";
|
|
11
|
+
import * as path from "node:path";
|
|
12
|
+
import { getMimeTypeAndEncoding } from "../utils/file_extension_utils.js";
|
|
13
|
+
import { materializeFiles } from "../utils/file_utils.js";
|
|
14
|
+
import { logger } from "../utils/logger.js";
|
|
15
|
+
import { BaseCodeExecutor } from "./base_code_executor.js";
|
|
16
|
+
import {
|
|
17
|
+
CodeExecutionLanguage
|
|
18
|
+
} from "./code_execution_utils.js";
|
|
19
|
+
const IS_WINDOWS = os.platform() === "win32";
|
|
20
|
+
async function createTempScriptFile(code, language, shellCommandPath) {
|
|
21
|
+
const tempDir = path.join(
|
|
22
|
+
os.tmpdir(),
|
|
23
|
+
"adk_js_unsafe_code_executor",
|
|
24
|
+
Date.now().toString() + "_" + Math.random().toString(36).slice(2)
|
|
25
|
+
);
|
|
26
|
+
await fs.mkdir(tempDir, { recursive: true });
|
|
27
|
+
const ext = getExtensionForLanguage(language, shellCommandPath) || ".js";
|
|
28
|
+
const filePath = path.join(tempDir, "script".concat(ext));
|
|
29
|
+
await fs.writeFile(filePath, code);
|
|
30
|
+
return { filePath, tempDir };
|
|
31
|
+
}
|
|
32
|
+
function getExtensionForLanguage(language, shellCommandPath) {
|
|
33
|
+
if (language === CodeExecutionLanguage.JAVASCRIPT) {
|
|
34
|
+
return ".js";
|
|
35
|
+
}
|
|
36
|
+
if (language === CodeExecutionLanguage.PYTHON) {
|
|
37
|
+
return ".py";
|
|
38
|
+
}
|
|
39
|
+
if (language === CodeExecutionLanguage.POWERSHELL) {
|
|
40
|
+
return ".ps1";
|
|
41
|
+
}
|
|
42
|
+
if (language === CodeExecutionLanguage.WINDOWS_CMD) {
|
|
43
|
+
return ".bat";
|
|
44
|
+
}
|
|
45
|
+
if (language === CodeExecutionLanguage.SHELL) {
|
|
46
|
+
if (IS_WINDOWS) {
|
|
47
|
+
if (shellCommandPath && shellCommandPath.toLowerCase().includes("cmd")) {
|
|
48
|
+
return ".bat";
|
|
49
|
+
}
|
|
50
|
+
return ".ps1";
|
|
51
|
+
}
|
|
52
|
+
return ".sh";
|
|
53
|
+
}
|
|
54
|
+
return void 0;
|
|
55
|
+
}
|
|
56
|
+
class UnsafeLocalCodeExecutor extends BaseCodeExecutor {
|
|
57
|
+
constructor(options = {}) {
|
|
58
|
+
var _a, _b, _c, _d;
|
|
59
|
+
super();
|
|
60
|
+
this.timeoutSeconds = (_a = options.timeoutSeconds) != null ? _a : 30;
|
|
61
|
+
this.nodeCommandPath = (_b = options.commandPath) != null ? _b : process.execPath;
|
|
62
|
+
this.pythonCommandPath = (_c = options.pythonCommandPath) != null ? _c : IS_WINDOWS ? "python" : "python3";
|
|
63
|
+
this.shellCommandPath = (_d = options.shellCommandPath) != null ? _d : IS_WINDOWS ? "powershell" : "bash";
|
|
64
|
+
this.stateful = false;
|
|
65
|
+
this.optimizeDataFile = false;
|
|
66
|
+
}
|
|
67
|
+
async executeCode(params) {
|
|
68
|
+
var _a;
|
|
69
|
+
const { code, language } = params.codeExecutionInput;
|
|
70
|
+
if (![
|
|
71
|
+
CodeExecutionLanguage.JAVASCRIPT,
|
|
72
|
+
CodeExecutionLanguage.PYTHON,
|
|
73
|
+
CodeExecutionLanguage.SHELL,
|
|
74
|
+
CodeExecutionLanguage.WINDOWS_CMD,
|
|
75
|
+
CodeExecutionLanguage.POWERSHELL
|
|
76
|
+
].includes(language)) {
|
|
77
|
+
return {
|
|
78
|
+
stdout: "",
|
|
79
|
+
stderr: "Unsupported language: ".concat(language),
|
|
80
|
+
outputFiles: []
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
logger.warn(
|
|
84
|
+
"\n====================================================================================\n\u26A0\uFE0F DANGER: UnsafeLocalCodeExecutor is executing code locally on this host machine!\nThis component provides NO sandboxing or container isolation. Arbitrary shell/script\ncommands generated by AI or untrusted sources could lead to serious security risks.\n====================================================================================\n"
|
|
85
|
+
);
|
|
86
|
+
let tempDir;
|
|
87
|
+
try {
|
|
88
|
+
const res = await createTempScriptFile(
|
|
89
|
+
code,
|
|
90
|
+
language,
|
|
91
|
+
this.shellCommandPath
|
|
92
|
+
);
|
|
93
|
+
const filePath = res.filePath;
|
|
94
|
+
tempDir = res.tempDir;
|
|
95
|
+
if (params.codeExecutionInput.inputFiles) {
|
|
96
|
+
await materializeFiles(params.codeExecutionInput.inputFiles, tempDir);
|
|
97
|
+
}
|
|
98
|
+
let command = this.nodeCommandPath;
|
|
99
|
+
let args = [filePath];
|
|
100
|
+
if (language === CodeExecutionLanguage.PYTHON) {
|
|
101
|
+
command = this.pythonCommandPath;
|
|
102
|
+
} else if (language === CodeExecutionLanguage.SHELL) {
|
|
103
|
+
command = this.shellCommandPath;
|
|
104
|
+
if (this.shellCommandPath.toLowerCase().includes("powershell")) {
|
|
105
|
+
args = ["-NoLogo", "-ExecutionPolicy", "Bypass", "-File", filePath];
|
|
106
|
+
} else if (this.shellCommandPath.toLowerCase().includes("cmd")) {
|
|
107
|
+
args = ["/c", filePath];
|
|
108
|
+
}
|
|
109
|
+
} else if (language === CodeExecutionLanguage.POWERSHELL) {
|
|
110
|
+
command = IS_WINDOWS ? "powershell" : "pwsh";
|
|
111
|
+
args = ["-NoLogo", "-ExecutionPolicy", "Bypass", "-File", filePath];
|
|
112
|
+
} else if (language === CodeExecutionLanguage.WINDOWS_CMD) {
|
|
113
|
+
command = "cmd.exe";
|
|
114
|
+
args = ["/c", filePath];
|
|
115
|
+
}
|
|
116
|
+
if (params.codeExecutionInput.args) {
|
|
117
|
+
if (Array.isArray(params.codeExecutionInput.args)) {
|
|
118
|
+
args.push(...params.codeExecutionInput.args);
|
|
119
|
+
} else {
|
|
120
|
+
for (const [k, v] of Object.entries(params.codeExecutionInput.args)) {
|
|
121
|
+
args.push("--".concat(k), String(v));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const executionResult = await new Promise((resolve) => {
|
|
126
|
+
const child = spawn(command, args, {
|
|
127
|
+
timeout: this.timeoutSeconds * 1e3,
|
|
128
|
+
killSignal: "SIGKILL",
|
|
129
|
+
cwd: tempDir
|
|
130
|
+
});
|
|
131
|
+
let stdout = "";
|
|
132
|
+
let stderr = "";
|
|
133
|
+
if (child.stdout) {
|
|
134
|
+
child.stdout.on("data", (data) => {
|
|
135
|
+
stdout += data.toString();
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
if (child.stderr) {
|
|
139
|
+
child.stderr.on("data", (data) => {
|
|
140
|
+
stderr += data.toString();
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
child.on("error", (err) => {
|
|
144
|
+
stderr += "Process error: ".concat(err.message, "\n");
|
|
145
|
+
});
|
|
146
|
+
child.on("close", (exitCode, signal) => {
|
|
147
|
+
if (signal === "SIGKILL" || signal === "SIGTERM") {
|
|
148
|
+
stderr += "\nCode execution timed out after ".concat(this.timeoutSeconds, " seconds.");
|
|
149
|
+
} else if (exitCode !== 0 && exitCode !== null) {
|
|
150
|
+
if (!stderr) {
|
|
151
|
+
stderr = "Exit code ".concat(exitCode);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
resolve({ stdout, stderr, exitCode });
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
const outputFiles = [];
|
|
158
|
+
try {
|
|
159
|
+
const allFiles = await fs.readdir(tempDir, { recursive: true });
|
|
160
|
+
for (const relativeFilePath of allFiles) {
|
|
161
|
+
const fullPath = path.join(tempDir, relativeFilePath);
|
|
162
|
+
const stat = await fs.lstat(fullPath);
|
|
163
|
+
if (!stat.isFile()) {
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (relativeFilePath === path.basename(filePath)) {
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
const isInputFile = (_a = params.codeExecutionInput.inputFiles) == null ? void 0 : _a.some(
|
|
170
|
+
(f) => f.name === relativeFilePath
|
|
171
|
+
);
|
|
172
|
+
if (isInputFile) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
const fileContent = await fs.readFile(fullPath);
|
|
176
|
+
const { mimeType, encoding } = getMimeTypeAndEncoding(
|
|
177
|
+
path.extname(relativeFilePath)
|
|
178
|
+
);
|
|
179
|
+
outputFiles.push({
|
|
180
|
+
name: relativeFilePath,
|
|
181
|
+
content: fileContent.toString(encoding),
|
|
182
|
+
contentEncoding: encoding,
|
|
183
|
+
mimeType
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
} catch (e) {
|
|
187
|
+
logger.error("Error scanning output files: ".concat(e));
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
stdout: executionResult.stdout,
|
|
191
|
+
stderr: executionResult.stderr,
|
|
192
|
+
outputFiles
|
|
193
|
+
};
|
|
194
|
+
} finally {
|
|
195
|
+
if (tempDir) {
|
|
196
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
export {
|
|
202
|
+
UnsafeLocalCodeExecutor
|
|
203
|
+
};
|