@google/adk 2.4.0 → 2.5.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_remote_agent.js +17 -2
- package/dist/cjs/a2a/a2a_remote_agent_utils.js +8 -4
- package/dist/cjs/a2a/agent_card.js +5 -81
- package/dist/cjs/a2a/agent_to_a2a.js +7 -0
- package/dist/cjs/a2a/event_converter_utils.js +10 -3
- package/dist/cjs/agents/agent_engine_client.js +282 -55
- package/dist/cjs/agents/base_agent.js +111 -68
- package/dist/cjs/agents/functions.js +62 -85
- package/dist/cjs/agents/instructions.js +7 -6
- package/dist/cjs/agents/invocation_context.js +2 -2
- package/dist/cjs/agents/llm_agent.js +105 -95
- package/dist/cjs/agents/processors/content_processor_utils.js +42 -15
- package/dist/cjs/agents/processors/content_request_processor.js +28 -11
- package/dist/cjs/agents/processors/context_compactor_request_processor.js +5 -1
- package/dist/cjs/agents/processors/instructions_llm_request_processor.js +1 -1
- package/dist/cjs/agents/processors/nl_planning_processor.js +2 -1
- package/dist/cjs/artifacts/file_artifact_service.js +1 -1
- package/dist/cjs/cli/cli_eval.js +884 -17
- package/dist/cjs/cli/utils/cleanup.js +84 -0
- package/dist/cjs/cli/utils/envs.js +33 -2
- package/dist/cjs/cli/utils/evals.js +75 -8
- package/dist/cjs/cli/utils/logs.js +128 -9
- package/dist/cjs/cli/utils/path_validation.js +83 -0
- package/dist/cjs/code_executors/container_code_executor.js +158 -36
- package/dist/cjs/common.js +50 -12
- package/dist/cjs/context/compaction_utils.js +19 -0
- package/dist/cjs/events/event.js +7 -3
- package/dist/cjs/features/feature_registry.js +5 -0
- package/dist/cjs/index.js +29 -14
- package/dist/cjs/models/google_llm.js +33 -2
- package/dist/cjs/models/interactions_utils.js +3 -0
- package/dist/cjs/plugins/base_plugin.js +45 -21
- package/dist/cjs/plugins/plugin_manager.js +27 -0
- package/dist/cjs/runner/runner.js +306 -189
- package/dist/cjs/sessions/base_session_service.js +1 -4
- package/dist/cjs/sessions/database_session_service.js +191 -19
- package/dist/cjs/sessions/db/operations.js +70 -1
- package/dist/cjs/sessions/db/schema.js +4 -0
- package/dist/cjs/sessions/in_memory_session_service.js +2 -2
- package/dist/cjs/sessions/vertex_ai_session_service.js +11 -3
- package/dist/cjs/skills/loader.js +29 -28
- package/dist/cjs/telemetry/api/instrumentation.js +632 -0
- package/dist/cjs/telemetry/api/internal/common/accumulators.js +169 -0
- package/dist/cjs/telemetry/api/internal/common/attributes.js +131 -0
- package/dist/cjs/telemetry/api/internal/common/config.js +159 -0
- package/dist/cjs/telemetry/api/internal/common/error.js +98 -0
- package/dist/cjs/telemetry/api/internal/common/finish_reason.js +63 -0
- package/dist/cjs/telemetry/api/internal/common/genai_messages.js +217 -0
- package/dist/cjs/telemetry/api/internal/common/http_exchange.js +169 -0
- package/dist/cjs/telemetry/api/internal/common/provider_name.js +87 -0
- package/dist/cjs/telemetry/api/internal/common/redaction.js +148 -0
- package/dist/cjs/telemetry/api/internal/common/serialization.js +58 -0
- package/dist/cjs/telemetry/api/internal/common/token_usage.js +118 -0
- package/dist/cjs/telemetry/api/internal/logs/inference.js +50 -0
- package/dist/cjs/telemetry/api/internal/logs/logger.js +46 -0
- package/dist/cjs/telemetry/api/internal/logs/mcp.js +141 -0
- package/dist/cjs/telemetry/api/internal/metrics/agent.js +128 -0
- package/dist/cjs/telemetry/api/internal/metrics/inference_start_hook.js +56 -0
- package/dist/cjs/telemetry/api/internal/metrics/meters.js +189 -0
- package/dist/cjs/telemetry/api/internal/metrics/tool.js +147 -0
- package/dist/cjs/telemetry/api/internal/metrics/workflow.js +132 -0
- package/dist/cjs/telemetry/api/internal/trace/agent.js +52 -0
- package/dist/cjs/telemetry/api/internal/trace/compaction.js +78 -0
- package/dist/cjs/telemetry/api/internal/trace/inference.js +132 -0
- package/dist/cjs/telemetry/api/internal/trace/live.js +52 -0
- package/dist/cjs/telemetry/api/internal/trace/node.js +73 -0
- package/dist/cjs/telemetry/api/internal/trace/propagation.js +67 -0
- package/dist/cjs/telemetry/api/internal/trace/tool.js +122 -0
- package/dist/cjs/telemetry/api/internal/trace/tracer.js +77 -0
- package/dist/cjs/telemetry/api/internal/trace/workflow.js +77 -0
- package/dist/cjs/telemetry/export/agent_engine.js +90 -0
- package/dist/cjs/telemetry/export/agent_runtime.js +73 -0
- package/dist/cjs/telemetry/export/google_cloud.js +763 -0
- package/dist/cjs/telemetry/export/request_driven_metric_reader.js +303 -0
- package/dist/cjs/telemetry/{setup.js → export/setup.js} +72 -5
- package/dist/cjs/tools/agent_tool.js +9 -1
- package/dist/cjs/tools/application_integration_tool/application_integration_toolset.js +22 -34
- package/dist/cjs/tools/application_integration_tool/clients/connections_client.js +60 -20
- package/dist/cjs/tools/application_integration_tool/clients/integration_client.js +26 -10
- package/dist/cjs/tools/application_integration_tool/integration_connector_tool.js +14 -23
- package/dist/cjs/tools/base_toolset.js +1 -1
- package/dist/cjs/tools/computer_use/base_computer.js +125 -0
- package/dist/cjs/tools/computer_use/computer_use_actions.js +502 -0
- package/dist/cjs/tools/computer_use/computer_use_tool.js +244 -0
- package/dist/cjs/tools/computer_use/computer_use_toolset.js +360 -0
- package/dist/cjs/tools/function_tool.js +15 -5
- package/dist/cjs/tools/google_api_tool/google_api_toolset.js +3 -2
- package/dist/cjs/tools/google_api_tool/googleapi_to_openapi_converter.js +3 -1
- package/dist/cjs/tools/load_artifacts_tool.js +15 -5
- package/dist/cjs/tools/load_memory_tool.js +2 -5
- package/dist/cjs/tools/mcp/mcp_session_manager.js +23 -3
- package/dist/cjs/tools/mcp/mcp_tool.js +7 -3
- package/dist/cjs/tools/mcp/mcp_toolset.js +18 -6
- package/dist/cjs/tools/openapi_tool/auth/auth_helpers.js +30 -29
- package/dist/cjs/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.js +2 -2
- package/dist/cjs/tools/openapi_tool/rest_api_tool.js +45 -14
- package/dist/cjs/tools/skill/load_skill_resource_tool.js +7 -0
- package/dist/cjs/tools/skill/load_skill_tool.js +3 -0
- package/dist/cjs/tools/skill/run_skill_script_tool.js +12 -2
- package/dist/cjs/tools/toolbox_toolset.js +47 -28
- package/dist/cjs/utils/async_queue.js +37 -3
- package/dist/cjs/utils/client_labels.js +9 -11
- package/dist/cjs/utils/env_aware_utils.js +13 -7
- package/dist/cjs/utils/error_utils.js +40 -2
- package/dist/cjs/utils/failover_utils.js +10 -9
- package/dist/cjs/utils/gemini_schema_util.js +125 -12
- package/dist/cjs/utils/id_provider.js +63 -0
- package/dist/cjs/utils/model_name.js +15 -0
- package/dist/cjs/utils/simple_zod_to_json.js +13 -31
- package/dist/cjs/utils/ssrf_guard.js +46 -16
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/workflow/index.js +2 -0
- package/dist/cjs/workflow/node_runner.js +24 -80
- package/dist/cjs/workflow/nodes/parallel_worker.js +18 -7
- package/dist/cjs/workflow/run_llm_agent_as_node.js +19 -14
- package/dist/cjs/workflow/utils/retry_utils.js +2 -2
- package/dist/cjs/workflow/workflow.js +12 -12
- package/dist/esm/a2a/a2a_remote_agent.js +23 -3
- package/dist/esm/a2a/a2a_remote_agent_utils.js +8 -4
- package/dist/esm/a2a/agent_card.js +5 -83
- package/dist/esm/a2a/agent_to_a2a.js +7 -0
- package/dist/esm/a2a/event_converter_utils.js +10 -3
- package/dist/esm/agents/agent_engine_client.js +293 -55
- package/dist/esm/agents/base_agent.js +111 -72
- package/dist/esm/agents/functions.js +67 -89
- package/dist/esm/agents/instructions.js +7 -6
- package/dist/esm/agents/invocation_context.js +2 -2
- package/dist/esm/agents/llm_agent.js +111 -100
- package/dist/esm/agents/processors/content_processor_utils.js +42 -15
- package/dist/esm/agents/processors/content_request_processor.js +28 -11
- package/dist/esm/agents/processors/context_compactor_request_processor.js +5 -1
- package/dist/esm/agents/processors/instructions_llm_request_processor.js +1 -1
- package/dist/esm/agents/processors/nl_planning_processor.js +2 -1
- package/dist/esm/artifacts/file_artifact_service.js +1 -1
- package/dist/esm/cli/cli_eval.js +880 -17
- package/dist/esm/cli/utils/cleanup.js +56 -0
- package/dist/esm/cli/utils/envs.js +33 -2
- package/dist/esm/cli/utils/evals.js +74 -8
- package/dist/esm/cli/utils/logs.js +128 -9
- package/dist/esm/cli/utils/path_validation.js +45 -0
- package/dist/esm/code_executors/container_code_executor.js +158 -36
- package/dist/esm/common.js +49 -6
- package/dist/esm/context/compaction_utils.js +19 -0
- package/dist/esm/events/event.js +7 -3
- package/dist/esm/features/feature_registry.js +5 -0
- package/dist/esm/index.js +27 -15
- package/dist/esm/models/google_llm.js +33 -2
- package/dist/esm/models/interactions_utils.js +3 -0
- package/dist/esm/plugins/base_plugin.js +45 -21
- package/dist/esm/plugins/plugin_manager.js +27 -0
- package/dist/esm/runner/runner.js +310 -192
- package/dist/esm/sessions/base_session_service.js +1 -4
- package/dist/esm/sessions/database_session_service.js +191 -19
- package/dist/esm/sessions/db/operations.js +70 -1
- package/dist/esm/sessions/db/schema.js +4 -0
- package/dist/esm/sessions/in_memory_session_service.js +2 -2
- package/dist/esm/sessions/vertex_ai_session_service.js +11 -3
- package/dist/esm/skills/loader.js +29 -28
- package/dist/esm/telemetry/api/instrumentation.js +655 -0
- package/dist/esm/telemetry/api/internal/common/accumulators.js +139 -0
- package/dist/esm/telemetry/api/internal/common/attributes.js +94 -0
- package/dist/esm/telemetry/api/internal/common/config.js +128 -0
- package/dist/esm/telemetry/api/internal/common/error.js +69 -0
- package/dist/esm/telemetry/api/internal/common/finish_reason.js +35 -0
- package/dist/esm/telemetry/api/internal/common/genai_messages.js +188 -0
- package/dist/esm/telemetry/api/internal/common/http_exchange.js +142 -0
- package/dist/esm/telemetry/api/internal/common/provider_name.js +59 -0
- package/dist/esm/telemetry/api/internal/common/redaction.js +121 -0
- package/dist/esm/telemetry/api/internal/common/serialization.js +30 -0
- package/dist/esm/telemetry/api/internal/common/token_usage.js +85 -0
- package/dist/esm/telemetry/api/internal/logs/inference.js +23 -0
- package/dist/esm/telemetry/api/internal/logs/logger.js +19 -0
- package/dist/esm/telemetry/api/internal/logs/mcp.js +113 -0
- package/dist/esm/telemetry/api/internal/metrics/agent.js +107 -0
- package/dist/esm/telemetry/api/internal/metrics/inference_start_hook.js +29 -0
- package/dist/esm/telemetry/api/internal/metrics/meters.js +165 -0
- package/dist/esm/telemetry/api/internal/metrics/tool.js +119 -0
- package/dist/esm/telemetry/api/internal/metrics/workflow.js +112 -0
- package/dist/esm/telemetry/api/internal/trace/agent.js +25 -0
- package/dist/esm/telemetry/api/internal/trace/compaction.js +50 -0
- package/dist/esm/telemetry/api/internal/trace/inference.js +107 -0
- package/dist/esm/telemetry/api/internal/trace/live.js +28 -0
- package/dist/esm/telemetry/api/internal/trace/node.js +44 -0
- package/dist/esm/telemetry/api/internal/trace/propagation.js +39 -0
- package/dist/esm/telemetry/api/internal/trace/tool.js +96 -0
- package/dist/esm/telemetry/api/internal/trace/tracer.js +52 -0
- package/dist/esm/telemetry/api/internal/trace/workflow.js +54 -0
- package/dist/esm/telemetry/export/agent_engine.js +67 -0
- package/dist/esm/telemetry/export/agent_runtime.js +46 -0
- package/dist/esm/telemetry/export/google_cloud.js +733 -0
- package/dist/esm/telemetry/export/request_driven_metric_reader.js +276 -0
- package/dist/esm/telemetry/export/setup.js +160 -0
- package/dist/esm/tools/agent_tool.js +9 -1
- package/dist/esm/tools/application_integration_tool/application_integration_toolset.js +23 -35
- package/dist/esm/tools/application_integration_tool/clients/connections_client.js +64 -21
- package/dist/esm/tools/application_integration_tool/clients/integration_client.js +26 -10
- package/dist/esm/tools/application_integration_tool/integration_connector_tool.js +14 -23
- package/dist/esm/tools/base_toolset.js +1 -1
- package/dist/esm/tools/computer_use/base_computer.js +99 -0
- package/dist/esm/tools/computer_use/computer_use_actions.js +477 -0
- package/dist/esm/tools/computer_use/computer_use_tool.js +217 -0
- package/dist/esm/tools/computer_use/computer_use_toolset.js +344 -0
- package/dist/esm/tools/function_tool.js +15 -5
- package/dist/esm/tools/google_api_tool/google_api_toolset.js +3 -2
- package/dist/esm/tools/google_api_tool/googleapi_to_openapi_converter.js +3 -1
- package/dist/esm/tools/load_artifacts_tool.js +15 -5
- package/dist/esm/tools/load_memory_tool.js +2 -5
- package/dist/esm/tools/mcp/mcp_session_manager.js +23 -3
- package/dist/esm/tools/mcp/mcp_tool.js +7 -3
- package/dist/esm/tools/mcp/mcp_toolset.js +18 -6
- package/dist/esm/tools/openapi_tool/auth/auth_helpers.js +27 -26
- package/dist/esm/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.js +2 -2
- package/dist/esm/tools/openapi_tool/rest_api_tool.js +45 -14
- package/dist/esm/tools/skill/load_skill_resource_tool.js +7 -0
- package/dist/esm/tools/skill/load_skill_tool.js +3 -0
- package/dist/esm/tools/skill/run_skill_script_tool.js +12 -2
- package/dist/esm/tools/toolbox_toolset.js +47 -28
- package/dist/esm/utils/async_queue.js +37 -3
- package/dist/esm/utils/client_labels.js +9 -11
- package/dist/esm/utils/env_aware_utils.js +12 -7
- package/dist/esm/utils/error_utils.js +37 -1
- package/dist/esm/utils/failover_utils.js +10 -9
- package/dist/esm/utils/gemini_schema_util.js +124 -11
- package/dist/esm/utils/id_provider.js +33 -0
- package/dist/esm/utils/model_name.js +14 -0
- package/dist/esm/utils/simple_zod_to_json.js +13 -31
- package/dist/esm/utils/ssrf_guard.js +55 -15
- package/dist/esm/version.js +1 -1
- package/dist/esm/workflow/index.js +2 -1
- package/dist/esm/workflow/node_runner.js +26 -80
- package/dist/esm/workflow/nodes/parallel_worker.js +16 -6
- package/dist/esm/workflow/run_llm_agent_as_node.js +19 -14
- package/dist/esm/workflow/utils/retry_utils.js +2 -2
- package/dist/esm/workflow/workflow.js +12 -12
- package/dist/types/a2a/a2a_remote_agent.d.ts +6 -0
- package/dist/types/a2a/a2a_remote_agent_utils.d.ts +3 -2
- package/dist/types/agents/agent_engine_client.d.ts +121 -3
- package/dist/types/agents/base_agent.d.ts +2 -0
- package/dist/types/agents/processors/content_processor_utils.d.ts +9 -9
- package/dist/types/agents/run_config.d.ts +14 -0
- package/dist/types/cli/cli_eval.d.ts +172 -9
- package/dist/types/cli/utils/cleanup.d.ts +18 -0
- package/dist/types/cli/utils/envs.d.ts +13 -3
- package/dist/types/cli/utils/evals.d.ts +64 -1
- package/dist/types/cli/utils/logs.d.ts +19 -2
- package/dist/types/cli/utils/path_validation.d.ts +30 -0
- package/dist/types/code_executors/container_code_executor.d.ts +49 -8
- package/dist/types/common.d.ts +16 -9
- package/dist/types/context/compaction_utils.d.ts +13 -1
- package/dist/types/events/event.d.ts +3 -0
- package/dist/types/features/feature_registry.d.ts +1 -0
- package/dist/types/index.d.ts +9 -6
- package/dist/types/plugins/base_plugin.d.ts +50 -21
- package/dist/types/plugins/plugin_manager.d.ts +13 -0
- package/dist/types/runner/runner.d.ts +11 -0
- package/dist/types/sessions/base_session_service.d.ts +0 -2
- package/dist/types/sessions/db/operations.d.ts +2 -1
- package/dist/types/sessions/db/schema.d.ts +5 -3
- package/dist/types/telemetry/api/instrumentation.d.ts +259 -0
- package/dist/types/telemetry/api/internal/common/accumulators.d.ts +91 -0
- package/dist/types/telemetry/api/internal/common/attributes.d.ts +90 -0
- package/dist/types/telemetry/api/internal/common/config.d.ts +61 -0
- package/dist/types/telemetry/api/internal/common/error.d.ts +29 -0
- package/dist/types/telemetry/api/internal/common/finish_reason.d.ts +18 -0
- package/dist/types/telemetry/api/internal/common/genai_messages.d.ts +26 -0
- package/dist/types/telemetry/api/internal/common/http_exchange.d.ts +50 -0
- package/dist/types/telemetry/api/internal/common/provider_name.d.ts +16 -0
- package/dist/types/telemetry/api/internal/common/redaction.d.ts +14 -0
- package/dist/types/telemetry/api/internal/common/serialization.d.ts +18 -0
- package/dist/types/telemetry/api/internal/common/token_usage.d.ts +47 -0
- package/dist/types/telemetry/api/internal/logs/inference.d.ts +15 -0
- package/dist/types/telemetry/api/internal/logs/logger.d.ts +13 -0
- package/dist/types/telemetry/api/internal/logs/mcp.d.ts +31 -0
- package/dist/types/telemetry/api/internal/metrics/agent.d.ts +28 -0
- package/dist/types/telemetry/api/internal/metrics/inference_start_hook.d.ts +12 -0
- package/dist/types/telemetry/api/internal/metrics/meters.d.ts +57 -0
- package/dist/types/telemetry/api/internal/metrics/tool.d.ts +44 -0
- package/dist/types/telemetry/api/internal/metrics/workflow.d.ts +32 -0
- package/dist/types/telemetry/api/internal/trace/agent.d.ts +14 -0
- package/dist/types/telemetry/api/internal/trace/compaction.d.ts +20 -0
- package/dist/types/telemetry/api/internal/trace/inference.d.ts +31 -0
- package/dist/types/telemetry/api/internal/trace/live.d.ts +21 -0
- package/dist/types/telemetry/api/internal/trace/node.d.ts +22 -0
- package/dist/types/telemetry/api/internal/trace/propagation.d.ts +22 -0
- package/dist/types/telemetry/api/internal/trace/tool.d.ts +57 -0
- package/dist/types/telemetry/api/internal/trace/tracer.d.ts +31 -0
- package/dist/types/telemetry/api/internal/trace/workflow.d.ts +21 -0
- package/dist/types/telemetry/export/agent_engine.d.ts +23 -0
- package/dist/types/telemetry/export/agent_runtime.d.ts +40 -0
- package/dist/types/telemetry/export/google_cloud.d.ts +189 -0
- package/dist/types/telemetry/export/request_driven_metric_reader.d.ts +144 -0
- package/dist/types/telemetry/{setup.d.ts → export/setup.d.ts} +3 -0
- package/dist/types/tools/agent_tool.d.ts +1 -1
- package/dist/types/tools/application_integration_tool/clients/connections_client.d.ts +13 -4
- package/dist/types/tools/base_toolset.d.ts +1 -1
- package/dist/types/tools/computer_use/base_computer.d.ts +281 -0
- package/dist/types/tools/computer_use/computer_use_actions.d.ts +53 -0
- package/dist/types/tools/computer_use/computer_use_tool.d.ts +108 -0
- package/dist/types/tools/computer_use/computer_use_toolset.d.ts +132 -0
- package/dist/types/tools/google_api_tool/google_api_toolset.d.ts +2 -0
- package/dist/types/tools/load_artifacts_tool.d.ts +5 -1
- package/dist/types/tools/load_memory_tool.d.ts +13 -7
- package/dist/types/tools/mcp/mcp_session_manager.d.ts +16 -0
- package/dist/types/tools/openapi_tool/auth/auth_helpers.d.ts +8 -8
- package/dist/types/tools/openapi_tool/openapi_spec_parser/operation_parser.d.ts +7 -3
- package/dist/types/tools/toolbox_toolset.d.ts +15 -20
- package/dist/types/utils/async_queue.d.ts +14 -0
- package/dist/types/utils/env_aware_utils.d.ts +11 -0
- package/dist/types/utils/error_utils.d.ts +4 -0
- package/dist/types/utils/gemini_schema_util.d.ts +27 -6
- package/dist/types/utils/id_provider.d.ts +43 -0
- package/dist/types/utils/model_name.d.ts +8 -0
- package/dist/types/utils/ssrf_guard.d.ts +2 -0
- package/dist/types/version.d.ts +1 -1
- package/dist/types/workflow/index.d.ts +1 -1
- package/dist/types/workflow/nodes/parallel_worker.d.ts +8 -1
- package/dist/web/index_web.js +86 -88
- package/dist/web/index_web.js.map +4 -4
- package/package.json +13 -15
- package/dist/cjs/telemetry/google_cloud.js +0 -116
- package/dist/cjs/telemetry/tracing.js +0 -393
- package/dist/esm/telemetry/google_cloud.js +0 -99
- package/dist/esm/telemetry/setup.js +0 -88
- package/dist/esm/telemetry/tracing.js +0 -361
- package/dist/types/telemetry/google_cloud.d.ts +0 -9
- package/dist/types/telemetry/tracing.d.ts +0 -143
|
@@ -28,7 +28,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
28
28
|
* Copyright 2026 Google LLC
|
|
29
29
|
* SPDX-License-Identifier: Apache-2.0
|
|
30
30
|
*/
|
|
31
|
-
import {
|
|
31
|
+
import { newId } from "../utils/id_provider.js";
|
|
32
32
|
import { logger } from "../utils/logger.js";
|
|
33
33
|
import {
|
|
34
34
|
BaseSessionService,
|
|
@@ -71,9 +71,82 @@ async function importMikroOrm() {
|
|
|
71
71
|
}
|
|
72
72
|
__name(importMikroOrm, "importMikroOrm");
|
|
73
73
|
import { isStaleSessionError, StaleSessionError as StaleSessionError2 } from "./stale_session_error.js";
|
|
74
|
+
const STORAGE_UPDATE_MARKER_SYMBOL = /* @__PURE__ */ Symbol.for(
|
|
75
|
+
"google.adk.session.storageUpdateMarker"
|
|
76
|
+
);
|
|
77
|
+
function setStorageRevisionMarker(session, revision) {
|
|
78
|
+
Object.defineProperty(session, STORAGE_UPDATE_MARKER_SYMBOL, {
|
|
79
|
+
value: revision,
|
|
80
|
+
writable: true,
|
|
81
|
+
configurable: true,
|
|
82
|
+
enumerable: false
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
__name(setStorageRevisionMarker, "setStorageRevisionMarker");
|
|
86
|
+
function getStorageRevisionMarker(session) {
|
|
87
|
+
return session[STORAGE_UPDATE_MARKER_SYMBOL];
|
|
88
|
+
}
|
|
89
|
+
__name(getStorageRevisionMarker, "getStorageRevisionMarker");
|
|
90
|
+
const MAX_IN_QUERY_IDS = 500;
|
|
91
|
+
async function sessionMatchesStorageRevision(txEm, session, eventsComplete, totalEventCount) {
|
|
92
|
+
const sessionWhere = {
|
|
93
|
+
appName: session.appName,
|
|
94
|
+
userId: session.userId,
|
|
95
|
+
sessionId: session.id
|
|
96
|
+
};
|
|
97
|
+
const latestStorageEvent = await txEm.findOne(StorageEvent, sessionWhere, {
|
|
98
|
+
orderBy: { timestamp: "DESC", id: "DESC" }
|
|
99
|
+
});
|
|
100
|
+
if (session.events.length === 0) {
|
|
101
|
+
if (latestStorageEvent !== null) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
if (totalEventCount !== void 0 && totalEventCount !== 0) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
if ((latestStorageEvent == null ? void 0 : latestStorageEvent.id) !== session.events[session.events.length - 1].id) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
if (totalEventCount !== void 0) {
|
|
113
|
+
const totalStored = await txEm.count(StorageEvent, sessionWhere);
|
|
114
|
+
if (totalStored !== totalEventCount) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const knownIds = session.events.map((e) => e.id);
|
|
119
|
+
if (knownIds.length <= MAX_IN_QUERY_IDS) {
|
|
120
|
+
const unknownEventWhere = {
|
|
121
|
+
...sessionWhere,
|
|
122
|
+
id: { $nin: knownIds }
|
|
123
|
+
};
|
|
124
|
+
if (!eventsComplete) {
|
|
125
|
+
unknownEventWhere.timestamp = {
|
|
126
|
+
$gte: new Date(session.events[0].timestamp)
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
return await txEm.count(StorageEvent, unknownEventWhere) === 0;
|
|
130
|
+
}
|
|
131
|
+
const filter = { ...sessionWhere };
|
|
132
|
+
if (!eventsComplete) {
|
|
133
|
+
filter.timestamp = { $gte: new Date(session.events[0].timestamp) };
|
|
134
|
+
}
|
|
135
|
+
const storedEvents = await txEm.find(StorageEvent, filter, {
|
|
136
|
+
fields: ["id"]
|
|
137
|
+
});
|
|
138
|
+
const knownSet = new Set(knownIds);
|
|
139
|
+
for (const stored of storedEvents) {
|
|
140
|
+
if (!knownSet.has(stored.id)) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
__name(sessionMatchesStorageRevision, "sessionMatchesStorageRevision");
|
|
74
147
|
function formatDateTime(dateOrEpochMs) {
|
|
75
148
|
const date = typeof dateOrEpochMs === "number" ? new Date(dateOrEpochMs) : dateOrEpochMs;
|
|
76
|
-
return date.toISOString().replace("T", " ").
|
|
149
|
+
return date.toISOString().replace("T", " ").replace("Z", "");
|
|
77
150
|
}
|
|
78
151
|
__name(formatDateTime, "formatDateTime");
|
|
79
152
|
function isDatabaseConnectionString(uri) {
|
|
@@ -90,14 +163,25 @@ const _DatabaseSessionService = class _DatabaseSessionService extends BaseSessio
|
|
|
90
163
|
this.initialized = false;
|
|
91
164
|
if (typeof connectionStringOrOptions === "string") {
|
|
92
165
|
this.connectionString = connectionStringOrOptions;
|
|
93
|
-
|
|
166
|
+
if (options) {
|
|
167
|
+
const { staleSession, ...mikroOptions } = options;
|
|
168
|
+
this.options = mikroOptions;
|
|
169
|
+
this.staleSession = staleSession != null ? staleSession : "reject";
|
|
170
|
+
} else {
|
|
171
|
+
this.staleSession = "reject";
|
|
172
|
+
}
|
|
94
173
|
} else {
|
|
95
|
-
|
|
174
|
+
const { staleSession: firstStaleSession, ...firstMikroOptions } = connectionStringOrOptions;
|
|
175
|
+
const { staleSession: secondStaleSession, ...secondMikroOptions } = options != null ? options : {};
|
|
176
|
+
const mergedMikroOptions = {
|
|
177
|
+
...firstMikroOptions,
|
|
178
|
+
...secondMikroOptions
|
|
179
|
+
};
|
|
180
|
+
if (!mergedMikroOptions.driver) {
|
|
96
181
|
throw new Error("Driver is required when passing options object.");
|
|
97
182
|
}
|
|
98
|
-
|
|
99
|
-
this.
|
|
100
|
-
this.staleSession = staleSession != null ? staleSession : "reject";
|
|
183
|
+
this.options = mergedMikroOptions;
|
|
184
|
+
this.staleSession = (_a = secondStaleSession != null ? secondStaleSession : firstStaleSession) != null ? _a : "reject";
|
|
101
185
|
}
|
|
102
186
|
}
|
|
103
187
|
async init() {
|
|
@@ -105,7 +189,11 @@ const _DatabaseSessionService = class _DatabaseSessionService extends BaseSessio
|
|
|
105
189
|
return;
|
|
106
190
|
}
|
|
107
191
|
await loadMikroOrm();
|
|
108
|
-
const options = this.connectionString ?
|
|
192
|
+
const options = this.connectionString ? {
|
|
193
|
+
...await getConnectionOptionsFromUri(this.connectionString),
|
|
194
|
+
...this.options,
|
|
195
|
+
entities: ENTITIES
|
|
196
|
+
} : { ...this.options, entities: ENTITIES };
|
|
109
197
|
this.options = options;
|
|
110
198
|
this.orm = await MikroORM.init(options);
|
|
111
199
|
await ensureDatabaseCreated(this.orm);
|
|
@@ -120,7 +208,7 @@ const _DatabaseSessionService = class _DatabaseSessionService extends BaseSessio
|
|
|
120
208
|
}) {
|
|
121
209
|
await this.init();
|
|
122
210
|
const em = this.orm.em.fork();
|
|
123
|
-
const id = sessionId ||
|
|
211
|
+
const id = sessionId || newId();
|
|
124
212
|
const now = /* @__PURE__ */ new Date();
|
|
125
213
|
const existing = await em.findOne(StorageSession, {
|
|
126
214
|
id,
|
|
@@ -183,14 +271,22 @@ const _DatabaseSessionService = class _DatabaseSessionService extends BaseSessio
|
|
|
183
271
|
userStateModel.state,
|
|
184
272
|
sessionState
|
|
185
273
|
);
|
|
186
|
-
|
|
274
|
+
const session = createSession({
|
|
187
275
|
id,
|
|
188
276
|
appName,
|
|
189
277
|
userId,
|
|
190
278
|
state: mergedState,
|
|
191
279
|
events: [],
|
|
192
|
-
lastUpdateTime: storageSession.
|
|
280
|
+
lastUpdateTime: storageSession.updateTime.getTime()
|
|
281
|
+
});
|
|
282
|
+
setStorageRevisionMarker(session, {
|
|
283
|
+
marker: storageSession.updateTime.toISOString(),
|
|
284
|
+
recordedLastUpdateTime: session.lastUpdateTime,
|
|
285
|
+
unverifiedWrite: true,
|
|
286
|
+
eventsComplete: true,
|
|
287
|
+
totalEventCount: 0
|
|
193
288
|
});
|
|
289
|
+
return session;
|
|
194
290
|
}
|
|
195
291
|
async getSession({
|
|
196
292
|
appName,
|
|
@@ -231,7 +327,7 @@ const _DatabaseSessionService = class _DatabaseSessionService extends BaseSessio
|
|
|
231
327
|
(userStateModel == null ? void 0 : userStateModel.state) || {},
|
|
232
328
|
storageSession.state
|
|
233
329
|
);
|
|
234
|
-
|
|
330
|
+
const session = createSession({
|
|
235
331
|
id: sessionId,
|
|
236
332
|
appName,
|
|
237
333
|
userId,
|
|
@@ -239,6 +335,16 @@ const _DatabaseSessionService = class _DatabaseSessionService extends BaseSessio
|
|
|
239
335
|
events: storageEvents.map((se) => se.eventData),
|
|
240
336
|
lastUpdateTime: storageSession.updateTime.getTime()
|
|
241
337
|
});
|
|
338
|
+
const eventsComplete = (config == null ? void 0 : config.numRecentEvents) === void 0 && (config == null ? void 0 : config.afterTimestamp) === void 0;
|
|
339
|
+
const totalEventCount = eventsComplete ? session.events.length : await em.count(StorageEvent, { appName, userId, sessionId });
|
|
340
|
+
setStorageRevisionMarker(session, {
|
|
341
|
+
marker: storageSession.updateTime.toISOString(),
|
|
342
|
+
recordedLastUpdateTime: session.lastUpdateTime,
|
|
343
|
+
unverifiedWrite: false,
|
|
344
|
+
eventsComplete,
|
|
345
|
+
totalEventCount
|
|
346
|
+
});
|
|
347
|
+
return session;
|
|
242
348
|
}
|
|
243
349
|
async listSessions({
|
|
244
350
|
appName,
|
|
@@ -251,7 +357,7 @@ const _DatabaseSessionService = class _DatabaseSessionService extends BaseSessio
|
|
|
251
357
|
await this.init();
|
|
252
358
|
const em = this.orm.em.fork();
|
|
253
359
|
const where = { appName };
|
|
254
|
-
if (userId) {
|
|
360
|
+
if (userId !== void 0) {
|
|
255
361
|
where.userId = userId;
|
|
256
362
|
}
|
|
257
363
|
const orderBy = order === "asc" ? { updateTime: "ASC", id: "ASC" } : order === "desc" ? { updateTime: "DESC", id: "ASC" } : void 0;
|
|
@@ -300,7 +406,7 @@ const _DatabaseSessionService = class _DatabaseSessionService extends BaseSessio
|
|
|
300
406
|
const appStateModel = await em.findOne(StorageAppState, { appName });
|
|
301
407
|
const appState = (appStateModel == null ? void 0 : appStateModel.state) || {};
|
|
302
408
|
const userStateMap = {};
|
|
303
|
-
if (userId) {
|
|
409
|
+
if (userId !== void 0) {
|
|
304
410
|
const u = await em.findOne(StorageUserState, { appName, userId });
|
|
305
411
|
if (u) userStateMap[userId] = u.state;
|
|
306
412
|
} else {
|
|
@@ -312,7 +418,7 @@ const _DatabaseSessionService = class _DatabaseSessionService extends BaseSessio
|
|
|
312
418
|
const sessions = storageSessions.map((ss) => {
|
|
313
419
|
const uState = userStateMap[ss.userId] || {};
|
|
314
420
|
const merged = mergeStates(appState, uState, ss.state);
|
|
315
|
-
|
|
421
|
+
const session = createSession({
|
|
316
422
|
id: ss.id,
|
|
317
423
|
appName: ss.appName,
|
|
318
424
|
userId: ss.userId,
|
|
@@ -320,6 +426,13 @@ const _DatabaseSessionService = class _DatabaseSessionService extends BaseSessio
|
|
|
320
426
|
events: [],
|
|
321
427
|
lastUpdateTime: ss.updateTime.getTime()
|
|
322
428
|
});
|
|
429
|
+
setStorageRevisionMarker(session, {
|
|
430
|
+
marker: ss.updateTime.toISOString(),
|
|
431
|
+
recordedLastUpdateTime: session.lastUpdateTime,
|
|
432
|
+
unverifiedWrite: false,
|
|
433
|
+
eventsComplete: false
|
|
434
|
+
});
|
|
435
|
+
return session;
|
|
323
436
|
});
|
|
324
437
|
return { sessions, ...paginationMeta };
|
|
325
438
|
}
|
|
@@ -337,11 +450,13 @@ const _DatabaseSessionService = class _DatabaseSessionService extends BaseSessio
|
|
|
337
450
|
session,
|
|
338
451
|
event
|
|
339
452
|
}) {
|
|
453
|
+
var _a, _b;
|
|
340
454
|
await this.init();
|
|
341
455
|
const em = this.orm.em.fork();
|
|
342
456
|
if (event.partial) {
|
|
343
457
|
return event;
|
|
344
458
|
}
|
|
459
|
+
const stateDelta = (_b = (_a = event.actions) == null ? void 0 : _a.stateDelta) != null ? _b : {};
|
|
345
460
|
const trimmedEvent = trimTempDeltaState(event);
|
|
346
461
|
let sessionWasStale = false;
|
|
347
462
|
await em.transactional(async (txEm) => {
|
|
@@ -357,11 +472,37 @@ const _DatabaseSessionService = class _DatabaseSessionService extends BaseSessio
|
|
|
357
472
|
if (!storageSession) {
|
|
358
473
|
throw new Error(`Session ${session.id} not found for appendEvent`);
|
|
359
474
|
}
|
|
360
|
-
|
|
475
|
+
const storageUpdateTime = storageSession.updateTime.getTime();
|
|
476
|
+
const storageUpdateMarker = storageSession.updateTime.toISOString();
|
|
477
|
+
const rev = getStorageRevisionMarker(session);
|
|
478
|
+
const callerMutatedLastUpdateTime = rev !== void 0 && rev.recordedLastUpdateTime !== session.lastUpdateTime;
|
|
479
|
+
let isStale = false;
|
|
480
|
+
if (rev !== void 0 && !callerMutatedLastUpdateTime) {
|
|
481
|
+
if (rev.marker === storageUpdateMarker) {
|
|
482
|
+
session.lastUpdateTime = storageUpdateTime;
|
|
483
|
+
} else if (rev.unverifiedWrite && storageUpdateTime % 1e3 === 0 && Math.abs(storageUpdateTime - rev.recordedLastUpdateTime) < 1e3 && await sessionMatchesStorageRevision(
|
|
484
|
+
txEm,
|
|
485
|
+
session,
|
|
486
|
+
rev.eventsComplete,
|
|
487
|
+
rev.totalEventCount
|
|
488
|
+
)) {
|
|
489
|
+
session.lastUpdateTime = storageUpdateTime;
|
|
490
|
+
} else {
|
|
491
|
+
isStale = true;
|
|
492
|
+
}
|
|
493
|
+
} else if (rev !== void 0) {
|
|
494
|
+
isStale = storageUpdateTime > session.lastUpdateTime;
|
|
495
|
+
} else if (storageUpdateTime > session.lastUpdateTime) {
|
|
496
|
+
if (await sessionMatchesStorageRevision(txEm, session, false)) {
|
|
497
|
+
session.lastUpdateTime = storageUpdateTime;
|
|
498
|
+
} else {
|
|
499
|
+
isStale = true;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
if (isStale) {
|
|
361
503
|
if (this.staleSession === "reject") {
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
);
|
|
504
|
+
const message = storageUpdateTime > session.lastUpdateTime ? `The last_update_time provided in the session object ${formatDateTime(session.lastUpdateTime)} is earlier than the update_time in the storage_session ${formatDateTime(storageSession.updateTime)}. Please check if it is a stale session.` : `The session object with last_update_time ${formatDateTime(session.lastUpdateTime)} does not match the storage_session revision with update_time ${formatDateTime(storageSession.updateTime)}. Please check if it is a stale session.`;
|
|
505
|
+
throw new StaleSessionError(message);
|
|
365
506
|
}
|
|
366
507
|
sessionWasStale = true;
|
|
367
508
|
}
|
|
@@ -440,9 +581,32 @@ const _DatabaseSessionService = class _DatabaseSessionService extends BaseSessio
|
|
|
440
581
|
userStateModel.state,
|
|
441
582
|
storageSession.state
|
|
442
583
|
);
|
|
584
|
+
for (const source of [session.state, stateDelta]) {
|
|
585
|
+
for (const [key, value] of Object.entries(source)) {
|
|
586
|
+
if (key.startsWith(State.TEMP_PREFIX)) {
|
|
587
|
+
newMergedState[key] = value;
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
}
|
|
443
591
|
session.state = newMergedState;
|
|
592
|
+
const isNewEvent = !existingStorageEvent;
|
|
444
593
|
upsertSessionEvent(session, event);
|
|
445
594
|
session.lastUpdateTime = storageSession.updateTime.getTime();
|
|
595
|
+
let nextTotalEventCount;
|
|
596
|
+
if (!callerMutatedLastUpdateTime && !isStale) {
|
|
597
|
+
if ((rev == null ? void 0 : rev.totalEventCount) !== void 0) {
|
|
598
|
+
nextTotalEventCount = rev.totalEventCount + (isNewEvent ? 1 : 0);
|
|
599
|
+
} else if ((rev == null ? void 0 : rev.eventsComplete) === true) {
|
|
600
|
+
nextTotalEventCount = session.events.length;
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
setStorageRevisionMarker(session, {
|
|
604
|
+
marker: storageSession.updateTime.toISOString(),
|
|
605
|
+
recordedLastUpdateTime: session.lastUpdateTime,
|
|
606
|
+
unverifiedWrite: true,
|
|
607
|
+
eventsComplete: !callerMutatedLastUpdateTime && (rev == null ? void 0 : rev.eventsComplete) === true && !isStale,
|
|
608
|
+
totalEventCount: nextTotalEventCount
|
|
609
|
+
});
|
|
446
610
|
});
|
|
447
611
|
if (sessionWasStale) {
|
|
448
612
|
try {
|
|
@@ -457,6 +621,14 @@ const _DatabaseSessionService = class _DatabaseSessionService extends BaseSessio
|
|
|
457
621
|
);
|
|
458
622
|
session.events = storageEvents.map((se) => se.eventData);
|
|
459
623
|
upsertSessionEvent(session, event);
|
|
624
|
+
const lastRev = getStorageRevisionMarker(session);
|
|
625
|
+
if (lastRev) {
|
|
626
|
+
setStorageRevisionMarker(session, {
|
|
627
|
+
...lastRev,
|
|
628
|
+
eventsComplete: true,
|
|
629
|
+
totalEventCount: session.events.length
|
|
630
|
+
});
|
|
631
|
+
}
|
|
460
632
|
} catch (e) {
|
|
461
633
|
const message = e instanceof Error ? e.message : String(e);
|
|
462
634
|
logger.warn(
|
|
@@ -300,8 +300,77 @@ async function getConnectionOptionsFromUri(uri) {
|
|
|
300
300
|
}
|
|
301
301
|
__name(getConnectionOptionsFromUri, "getConnectionOptionsFromUri");
|
|
302
302
|
async function ensureDatabaseCreated(orm) {
|
|
303
|
+
var _a;
|
|
303
304
|
await orm.schema.ensureDatabase();
|
|
304
|
-
|
|
305
|
+
const entityMetadata = [...orm.getMetadata().getAll().values()].filter(
|
|
306
|
+
(meta) => !meta.embeddable && !meta.virtual && !meta.view
|
|
307
|
+
);
|
|
308
|
+
if (entityMetadata.length === 0) {
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
const platform = orm.driver.getPlatform();
|
|
312
|
+
const schemaHelper = platform.getSchemaHelper();
|
|
313
|
+
if (typeof (schemaHelper == null ? void 0 : schemaHelper.getAllTables) !== "function") {
|
|
314
|
+
await orm.schema.create();
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
const connection = orm.driver.getConnection();
|
|
318
|
+
const defaultSchema = platform.getDefaultSchemaName();
|
|
319
|
+
const configSchema = orm.config.get("schema");
|
|
320
|
+
const dbName = orm.config.get("dbName");
|
|
321
|
+
const isCurrentSchema = /* @__PURE__ */ __name((schemaName) => !schemaName || schemaName === defaultSchema || defaultSchema === void 0 && schemaName === dbName, "isCurrentSchema");
|
|
322
|
+
const tableKey = /* @__PURE__ */ __name((tableName, schemaName) => {
|
|
323
|
+
const schemaPart = !schemaName || isCurrentSchema(schemaName) ? "" : schemaName;
|
|
324
|
+
return `${schemaPart}.${tableName}`.toLowerCase();
|
|
325
|
+
}, "tableKey");
|
|
326
|
+
const listedTables = await schemaHelper.getAllTables(connection);
|
|
327
|
+
const listedTableKeys = new Set(
|
|
328
|
+
listedTables.map((table) => tableKey(table.table_name, table.schema_name))
|
|
329
|
+
);
|
|
330
|
+
const seenTableKeys = /* @__PURE__ */ new Set();
|
|
331
|
+
const existingTableNames = [];
|
|
332
|
+
let missingCount = 0;
|
|
333
|
+
for (const meta of entityMetadata) {
|
|
334
|
+
const schemaName = (_a = meta.schema) != null ? _a : configSchema;
|
|
335
|
+
const key = tableKey(meta.tableName, schemaName);
|
|
336
|
+
if (seenTableKeys.has(key)) {
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
seenTableKeys.add(key);
|
|
340
|
+
let exists = listedTableKeys.has(key);
|
|
341
|
+
if (!exists && defaultSchema === void 0 && !isCurrentSchema(schemaName) && typeof schemaHelper.tableExists === "function") {
|
|
342
|
+
exists = await schemaHelper.tableExists(
|
|
343
|
+
connection,
|
|
344
|
+
meta.tableName,
|
|
345
|
+
schemaName
|
|
346
|
+
);
|
|
347
|
+
}
|
|
348
|
+
if (exists) {
|
|
349
|
+
existingTableNames.push(
|
|
350
|
+
schemaName && schemaName !== defaultSchema ? `${schemaName}.${meta.tableName}` : meta.tableName
|
|
351
|
+
);
|
|
352
|
+
} else {
|
|
353
|
+
missingCount++;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
if (missingCount === 0) {
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
if (existingTableNames.length === 0) {
|
|
360
|
+
await orm.schema.create();
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
const schemaGenConfig = orm.config.get("schemaGenerator");
|
|
364
|
+
const previousSkipTables = schemaGenConfig.skipTables;
|
|
365
|
+
schemaGenConfig.skipTables = [
|
|
366
|
+
...previousSkipTables != null ? previousSkipTables : [],
|
|
367
|
+
...existingTableNames
|
|
368
|
+
];
|
|
369
|
+
try {
|
|
370
|
+
await orm.schema.create();
|
|
371
|
+
} finally {
|
|
372
|
+
schemaGenConfig.skipTables = previousSkipTables;
|
|
373
|
+
}
|
|
305
374
|
}
|
|
306
375
|
__name(ensureDatabaseCreated, "ensureDatabaseCreated");
|
|
307
376
|
async function validateDatabaseSchemaVersion(orm) {
|
|
@@ -65,6 +65,7 @@ const storageAppStateSchema = new EntitySchema({
|
|
|
65
65
|
state: { type: "json" },
|
|
66
66
|
updateTime: {
|
|
67
67
|
type: "datetime",
|
|
68
|
+
length: EVENT_TIMESTAMP_PRECISION,
|
|
68
69
|
fieldName: "update_time",
|
|
69
70
|
onCreate: /* @__PURE__ */ __name(() => /* @__PURE__ */ new Date(), "onCreate"),
|
|
70
71
|
onUpdate: /* @__PURE__ */ __name(() => /* @__PURE__ */ new Date(), "onUpdate")
|
|
@@ -88,6 +89,7 @@ const storageUserStateSchema = new EntitySchema({
|
|
|
88
89
|
state: { type: "json" },
|
|
89
90
|
updateTime: {
|
|
90
91
|
type: "datetime",
|
|
92
|
+
length: EVENT_TIMESTAMP_PRECISION,
|
|
91
93
|
fieldName: "update_time",
|
|
92
94
|
onCreate: /* @__PURE__ */ __name(() => /* @__PURE__ */ new Date(), "onCreate"),
|
|
93
95
|
onUpdate: /* @__PURE__ */ __name(() => /* @__PURE__ */ new Date(), "onUpdate")
|
|
@@ -113,11 +115,13 @@ const storageSessionSchema = new EntitySchema({
|
|
|
113
115
|
state: { type: "json" },
|
|
114
116
|
createTime: {
|
|
115
117
|
type: "datetime",
|
|
118
|
+
length: EVENT_TIMESTAMP_PRECISION,
|
|
116
119
|
fieldName: "create_time",
|
|
117
120
|
onCreate: /* @__PURE__ */ __name(() => /* @__PURE__ */ new Date(), "onCreate")
|
|
118
121
|
},
|
|
119
122
|
updateTime: {
|
|
120
123
|
type: "datetime",
|
|
124
|
+
length: EVENT_TIMESTAMP_PRECISION,
|
|
121
125
|
fieldName: "update_time",
|
|
122
126
|
onCreate: /* @__PURE__ */ __name(() => /* @__PURE__ */ new Date(), "onCreate")
|
|
123
127
|
}
|
|
@@ -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
|
import { cloneDeep } from "lodash-es";
|
|
11
|
-
import {
|
|
11
|
+
import { newId } from "../utils/id_provider.js";
|
|
12
12
|
import { logger } from "../utils/logger.js";
|
|
13
13
|
import {
|
|
14
14
|
BaseSessionService,
|
|
@@ -49,7 +49,7 @@ const _InMemorySessionService = class _InMemorySessionService extends BaseSessio
|
|
|
49
49
|
const session = createSession({
|
|
50
50
|
// Surrounding whitespace is dropped so that a later lookup by the bare
|
|
51
51
|
// id finds the session, and a blank id gets a generated one.
|
|
52
|
-
id: (sessionId == null ? void 0 : sessionId.trim()) ||
|
|
52
|
+
id: (sessionId == null ? void 0 : sessionId.trim()) || newId(),
|
|
53
53
|
appName,
|
|
54
54
|
userId,
|
|
55
55
|
state: filteredState,
|
|
@@ -19,6 +19,7 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
19
19
|
import { Client } from "@google-cloud/vertexai";
|
|
20
20
|
import { isCompactedEvent } from "../events/compacted_event.js";
|
|
21
21
|
import { experimental } from "../utils/experimental.js";
|
|
22
|
+
import { formatError } from "../utils/error_utils.js";
|
|
22
23
|
import { logger } from "../utils/logger.js";
|
|
23
24
|
import {
|
|
24
25
|
EXPRESS_MODE_UNSUPPORTED_MESSAGE,
|
|
@@ -314,9 +315,16 @@ let VertexAiSessionService = class extends BaseSessionService {
|
|
|
314
315
|
if (!session) {
|
|
315
316
|
return;
|
|
316
317
|
}
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
318
|
+
try {
|
|
319
|
+
await this.sessions.delete({
|
|
320
|
+
name: `reasoningEngines/${reasoningEngineId}/sessions/${sessionId}`
|
|
321
|
+
});
|
|
322
|
+
} catch (error) {
|
|
323
|
+
logger.error(
|
|
324
|
+
`Error deleting session ${sessionId}: ${formatError(error)}`
|
|
325
|
+
);
|
|
326
|
+
throw error;
|
|
327
|
+
}
|
|
320
328
|
}
|
|
321
329
|
async appendEvent({
|
|
322
330
|
session,
|
|
@@ -67,7 +67,7 @@ async function loadDir(directoryPath) {
|
|
|
67
67
|
}
|
|
68
68
|
await walk(fullPath);
|
|
69
69
|
} else if (entry.isFile()) {
|
|
70
|
-
const relativePath = path.relative(directoryPath, fullPath);
|
|
70
|
+
const relativePath = path.relative(directoryPath, fullPath).split(path.sep).join("/");
|
|
71
71
|
if (IGNORED_EXTENSIONS.has(path.extname(entry.name))) {
|
|
72
72
|
continue;
|
|
73
73
|
}
|
|
@@ -95,7 +95,7 @@ const FRONTMATTER_PATTERN = /^---[ \t]*\r?\n(?:([\s\S]*?)\r?\n)??---[ \t]*(?:\r?
|
|
|
95
95
|
function parseFrontmatterYaml(content) {
|
|
96
96
|
var _a;
|
|
97
97
|
const text = content.startsWith(FRONTMATTER_BOM) ? content.slice(FRONTMATTER_BOM.length) : content;
|
|
98
|
-
if (
|
|
98
|
+
if (!/^---[ \t]*(?:\r?\n|$)/.test(text)) {
|
|
99
99
|
throw new InputValidationError(
|
|
100
100
|
"SKILL.md must start with YAML frontmatter (---)"
|
|
101
101
|
);
|
|
@@ -108,20 +108,27 @@ function parseFrontmatterYaml(content) {
|
|
|
108
108
|
}
|
|
109
109
|
const frontmatterStr = (_a = match[1]) != null ? _a : "";
|
|
110
110
|
const body = text.slice(match[0].length).trim();
|
|
111
|
-
|
|
112
|
-
const
|
|
113
|
-
|
|
111
|
+
const hasYamlContent = frontmatterStr.split(/\r?\n/).some((line) => {
|
|
112
|
+
const trimmed = line.trim();
|
|
113
|
+
return trimmed.length > 0 && !trimmed.startsWith("#");
|
|
114
|
+
});
|
|
115
|
+
let parsed = null;
|
|
116
|
+
if (hasYamlContent) {
|
|
117
|
+
try {
|
|
118
|
+
parsed = yaml.load(frontmatterStr);
|
|
119
|
+
} catch (e) {
|
|
114
120
|
throw new InputValidationError(
|
|
115
|
-
|
|
121
|
+
`Invalid YAML in frontmatter: ${e.message}`,
|
|
122
|
+
{ cause: e }
|
|
116
123
|
);
|
|
117
124
|
}
|
|
118
|
-
|
|
119
|
-
|
|
125
|
+
}
|
|
126
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
120
127
|
throw new InputValidationError(
|
|
121
|
-
|
|
122
|
-
{ cause: e }
|
|
128
|
+
"Invalid YAML in frontmatter: SKILL.md frontmatter must be a YAML mapping"
|
|
123
129
|
);
|
|
124
130
|
}
|
|
131
|
+
return { raw: parsed, body };
|
|
125
132
|
}
|
|
126
133
|
__name(parseFrontmatterYaml, "parseFrontmatterYaml");
|
|
127
134
|
function validateFrontmatter(raw) {
|
|
@@ -196,22 +203,16 @@ async function validateSkillDir(skillDir) {
|
|
|
196
203
|
} catch (e) {
|
|
197
204
|
return [e.message];
|
|
198
205
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
problems.push(
|
|
210
|
-
`Skill name '${skill.frontmatter.name}' does not match directory name '${dirName}'.`
|
|
211
|
-
);
|
|
212
|
-
}
|
|
213
|
-
} catch (e) {
|
|
214
|
-
problems.push(e.message);
|
|
206
|
+
const keys = Object.keys(skill.frontmatter);
|
|
207
|
+
const unknown = keys.filter((k) => !ALLOWED_FRONTMATTER_KEYS.has(k));
|
|
208
|
+
if (unknown.length > 0) {
|
|
209
|
+
problems.push(`Unknown frontmatter fields: [${unknown.sort().join(", ")}]`);
|
|
210
|
+
}
|
|
211
|
+
const dirName = path.basename(resolvedDir);
|
|
212
|
+
if (dirName !== skill.frontmatter.name) {
|
|
213
|
+
problems.push(
|
|
214
|
+
`Skill name '${skill.frontmatter.name}' does not match directory name '${dirName}'.`
|
|
215
|
+
);
|
|
215
216
|
}
|
|
216
217
|
return problems;
|
|
217
218
|
}
|
|
@@ -314,7 +315,7 @@ function loadSkillFromZipBuffer(zipBuffer) {
|
|
|
314
315
|
);
|
|
315
316
|
}
|
|
316
317
|
}
|
|
317
|
-
let skillMdContent
|
|
318
|
+
let skillMdContent;
|
|
318
319
|
for (const entry of entries) {
|
|
319
320
|
if (entry.isDirectory) continue;
|
|
320
321
|
if (entry.entryName.toLowerCase() === "skill.md") {
|
|
@@ -322,7 +323,7 @@ function loadSkillFromZipBuffer(zipBuffer) {
|
|
|
322
323
|
break;
|
|
323
324
|
}
|
|
324
325
|
}
|
|
325
|
-
if (
|
|
326
|
+
if (skillMdContent === void 0) {
|
|
326
327
|
throw new NotFoundError("SKILL.md not found in zipped filesystem.");
|
|
327
328
|
}
|
|
328
329
|
const { raw, body } = parseFrontmatterYaml(skillMdContent);
|