@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.
Files changed (326) hide show
  1. package/dist/cjs/a2a/a2a_remote_agent.js +17 -2
  2. package/dist/cjs/a2a/a2a_remote_agent_utils.js +8 -4
  3. package/dist/cjs/a2a/agent_card.js +5 -81
  4. package/dist/cjs/a2a/agent_to_a2a.js +7 -0
  5. package/dist/cjs/a2a/event_converter_utils.js +10 -3
  6. package/dist/cjs/agents/agent_engine_client.js +282 -55
  7. package/dist/cjs/agents/base_agent.js +111 -68
  8. package/dist/cjs/agents/functions.js +62 -85
  9. package/dist/cjs/agents/instructions.js +7 -6
  10. package/dist/cjs/agents/invocation_context.js +2 -2
  11. package/dist/cjs/agents/llm_agent.js +105 -95
  12. package/dist/cjs/agents/processors/content_processor_utils.js +42 -15
  13. package/dist/cjs/agents/processors/content_request_processor.js +28 -11
  14. package/dist/cjs/agents/processors/context_compactor_request_processor.js +5 -1
  15. package/dist/cjs/agents/processors/instructions_llm_request_processor.js +1 -1
  16. package/dist/cjs/agents/processors/nl_planning_processor.js +2 -1
  17. package/dist/cjs/artifacts/file_artifact_service.js +1 -1
  18. package/dist/cjs/cli/cli_eval.js +884 -17
  19. package/dist/cjs/cli/utils/cleanup.js +84 -0
  20. package/dist/cjs/cli/utils/envs.js +33 -2
  21. package/dist/cjs/cli/utils/evals.js +75 -8
  22. package/dist/cjs/cli/utils/logs.js +128 -9
  23. package/dist/cjs/cli/utils/path_validation.js +83 -0
  24. package/dist/cjs/code_executors/container_code_executor.js +158 -36
  25. package/dist/cjs/common.js +50 -12
  26. package/dist/cjs/context/compaction_utils.js +19 -0
  27. package/dist/cjs/events/event.js +7 -3
  28. package/dist/cjs/features/feature_registry.js +5 -0
  29. package/dist/cjs/index.js +29 -14
  30. package/dist/cjs/models/google_llm.js +33 -2
  31. package/dist/cjs/models/interactions_utils.js +3 -0
  32. package/dist/cjs/plugins/base_plugin.js +45 -21
  33. package/dist/cjs/plugins/plugin_manager.js +27 -0
  34. package/dist/cjs/runner/runner.js +306 -189
  35. package/dist/cjs/sessions/base_session_service.js +1 -4
  36. package/dist/cjs/sessions/database_session_service.js +191 -19
  37. package/dist/cjs/sessions/db/operations.js +70 -1
  38. package/dist/cjs/sessions/db/schema.js +4 -0
  39. package/dist/cjs/sessions/in_memory_session_service.js +2 -2
  40. package/dist/cjs/sessions/vertex_ai_session_service.js +11 -3
  41. package/dist/cjs/skills/loader.js +29 -28
  42. package/dist/cjs/telemetry/api/instrumentation.js +632 -0
  43. package/dist/cjs/telemetry/api/internal/common/accumulators.js +169 -0
  44. package/dist/cjs/telemetry/api/internal/common/attributes.js +131 -0
  45. package/dist/cjs/telemetry/api/internal/common/config.js +159 -0
  46. package/dist/cjs/telemetry/api/internal/common/error.js +98 -0
  47. package/dist/cjs/telemetry/api/internal/common/finish_reason.js +63 -0
  48. package/dist/cjs/telemetry/api/internal/common/genai_messages.js +217 -0
  49. package/dist/cjs/telemetry/api/internal/common/http_exchange.js +169 -0
  50. package/dist/cjs/telemetry/api/internal/common/provider_name.js +87 -0
  51. package/dist/cjs/telemetry/api/internal/common/redaction.js +148 -0
  52. package/dist/cjs/telemetry/api/internal/common/serialization.js +58 -0
  53. package/dist/cjs/telemetry/api/internal/common/token_usage.js +118 -0
  54. package/dist/cjs/telemetry/api/internal/logs/inference.js +50 -0
  55. package/dist/cjs/telemetry/api/internal/logs/logger.js +46 -0
  56. package/dist/cjs/telemetry/api/internal/logs/mcp.js +141 -0
  57. package/dist/cjs/telemetry/api/internal/metrics/agent.js +128 -0
  58. package/dist/cjs/telemetry/api/internal/metrics/inference_start_hook.js +56 -0
  59. package/dist/cjs/telemetry/api/internal/metrics/meters.js +189 -0
  60. package/dist/cjs/telemetry/api/internal/metrics/tool.js +147 -0
  61. package/dist/cjs/telemetry/api/internal/metrics/workflow.js +132 -0
  62. package/dist/cjs/telemetry/api/internal/trace/agent.js +52 -0
  63. package/dist/cjs/telemetry/api/internal/trace/compaction.js +78 -0
  64. package/dist/cjs/telemetry/api/internal/trace/inference.js +132 -0
  65. package/dist/cjs/telemetry/api/internal/trace/live.js +52 -0
  66. package/dist/cjs/telemetry/api/internal/trace/node.js +73 -0
  67. package/dist/cjs/telemetry/api/internal/trace/propagation.js +67 -0
  68. package/dist/cjs/telemetry/api/internal/trace/tool.js +122 -0
  69. package/dist/cjs/telemetry/api/internal/trace/tracer.js +77 -0
  70. package/dist/cjs/telemetry/api/internal/trace/workflow.js +77 -0
  71. package/dist/cjs/telemetry/export/agent_engine.js +90 -0
  72. package/dist/cjs/telemetry/export/agent_runtime.js +73 -0
  73. package/dist/cjs/telemetry/export/google_cloud.js +763 -0
  74. package/dist/cjs/telemetry/export/request_driven_metric_reader.js +303 -0
  75. package/dist/cjs/telemetry/{setup.js → export/setup.js} +72 -5
  76. package/dist/cjs/tools/agent_tool.js +9 -1
  77. package/dist/cjs/tools/application_integration_tool/application_integration_toolset.js +22 -34
  78. package/dist/cjs/tools/application_integration_tool/clients/connections_client.js +60 -20
  79. package/dist/cjs/tools/application_integration_tool/clients/integration_client.js +26 -10
  80. package/dist/cjs/tools/application_integration_tool/integration_connector_tool.js +14 -23
  81. package/dist/cjs/tools/base_toolset.js +1 -1
  82. package/dist/cjs/tools/computer_use/base_computer.js +125 -0
  83. package/dist/cjs/tools/computer_use/computer_use_actions.js +502 -0
  84. package/dist/cjs/tools/computer_use/computer_use_tool.js +244 -0
  85. package/dist/cjs/tools/computer_use/computer_use_toolset.js +360 -0
  86. package/dist/cjs/tools/function_tool.js +15 -5
  87. package/dist/cjs/tools/google_api_tool/google_api_toolset.js +3 -2
  88. package/dist/cjs/tools/google_api_tool/googleapi_to_openapi_converter.js +3 -1
  89. package/dist/cjs/tools/load_artifacts_tool.js +15 -5
  90. package/dist/cjs/tools/load_memory_tool.js +2 -5
  91. package/dist/cjs/tools/mcp/mcp_session_manager.js +23 -3
  92. package/dist/cjs/tools/mcp/mcp_tool.js +7 -3
  93. package/dist/cjs/tools/mcp/mcp_toolset.js +18 -6
  94. package/dist/cjs/tools/openapi_tool/auth/auth_helpers.js +30 -29
  95. package/dist/cjs/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.js +2 -2
  96. package/dist/cjs/tools/openapi_tool/rest_api_tool.js +45 -14
  97. package/dist/cjs/tools/skill/load_skill_resource_tool.js +7 -0
  98. package/dist/cjs/tools/skill/load_skill_tool.js +3 -0
  99. package/dist/cjs/tools/skill/run_skill_script_tool.js +12 -2
  100. package/dist/cjs/tools/toolbox_toolset.js +47 -28
  101. package/dist/cjs/utils/async_queue.js +37 -3
  102. package/dist/cjs/utils/client_labels.js +9 -11
  103. package/dist/cjs/utils/env_aware_utils.js +13 -7
  104. package/dist/cjs/utils/error_utils.js +40 -2
  105. package/dist/cjs/utils/failover_utils.js +10 -9
  106. package/dist/cjs/utils/gemini_schema_util.js +125 -12
  107. package/dist/cjs/utils/id_provider.js +63 -0
  108. package/dist/cjs/utils/model_name.js +15 -0
  109. package/dist/cjs/utils/simple_zod_to_json.js +13 -31
  110. package/dist/cjs/utils/ssrf_guard.js +46 -16
  111. package/dist/cjs/version.js +1 -1
  112. package/dist/cjs/workflow/index.js +2 -0
  113. package/dist/cjs/workflow/node_runner.js +24 -80
  114. package/dist/cjs/workflow/nodes/parallel_worker.js +18 -7
  115. package/dist/cjs/workflow/run_llm_agent_as_node.js +19 -14
  116. package/dist/cjs/workflow/utils/retry_utils.js +2 -2
  117. package/dist/cjs/workflow/workflow.js +12 -12
  118. package/dist/esm/a2a/a2a_remote_agent.js +23 -3
  119. package/dist/esm/a2a/a2a_remote_agent_utils.js +8 -4
  120. package/dist/esm/a2a/agent_card.js +5 -83
  121. package/dist/esm/a2a/agent_to_a2a.js +7 -0
  122. package/dist/esm/a2a/event_converter_utils.js +10 -3
  123. package/dist/esm/agents/agent_engine_client.js +293 -55
  124. package/dist/esm/agents/base_agent.js +111 -72
  125. package/dist/esm/agents/functions.js +67 -89
  126. package/dist/esm/agents/instructions.js +7 -6
  127. package/dist/esm/agents/invocation_context.js +2 -2
  128. package/dist/esm/agents/llm_agent.js +111 -100
  129. package/dist/esm/agents/processors/content_processor_utils.js +42 -15
  130. package/dist/esm/agents/processors/content_request_processor.js +28 -11
  131. package/dist/esm/agents/processors/context_compactor_request_processor.js +5 -1
  132. package/dist/esm/agents/processors/instructions_llm_request_processor.js +1 -1
  133. package/dist/esm/agents/processors/nl_planning_processor.js +2 -1
  134. package/dist/esm/artifacts/file_artifact_service.js +1 -1
  135. package/dist/esm/cli/cli_eval.js +880 -17
  136. package/dist/esm/cli/utils/cleanup.js +56 -0
  137. package/dist/esm/cli/utils/envs.js +33 -2
  138. package/dist/esm/cli/utils/evals.js +74 -8
  139. package/dist/esm/cli/utils/logs.js +128 -9
  140. package/dist/esm/cli/utils/path_validation.js +45 -0
  141. package/dist/esm/code_executors/container_code_executor.js +158 -36
  142. package/dist/esm/common.js +49 -6
  143. package/dist/esm/context/compaction_utils.js +19 -0
  144. package/dist/esm/events/event.js +7 -3
  145. package/dist/esm/features/feature_registry.js +5 -0
  146. package/dist/esm/index.js +27 -15
  147. package/dist/esm/models/google_llm.js +33 -2
  148. package/dist/esm/models/interactions_utils.js +3 -0
  149. package/dist/esm/plugins/base_plugin.js +45 -21
  150. package/dist/esm/plugins/plugin_manager.js +27 -0
  151. package/dist/esm/runner/runner.js +310 -192
  152. package/dist/esm/sessions/base_session_service.js +1 -4
  153. package/dist/esm/sessions/database_session_service.js +191 -19
  154. package/dist/esm/sessions/db/operations.js +70 -1
  155. package/dist/esm/sessions/db/schema.js +4 -0
  156. package/dist/esm/sessions/in_memory_session_service.js +2 -2
  157. package/dist/esm/sessions/vertex_ai_session_service.js +11 -3
  158. package/dist/esm/skills/loader.js +29 -28
  159. package/dist/esm/telemetry/api/instrumentation.js +655 -0
  160. package/dist/esm/telemetry/api/internal/common/accumulators.js +139 -0
  161. package/dist/esm/telemetry/api/internal/common/attributes.js +94 -0
  162. package/dist/esm/telemetry/api/internal/common/config.js +128 -0
  163. package/dist/esm/telemetry/api/internal/common/error.js +69 -0
  164. package/dist/esm/telemetry/api/internal/common/finish_reason.js +35 -0
  165. package/dist/esm/telemetry/api/internal/common/genai_messages.js +188 -0
  166. package/dist/esm/telemetry/api/internal/common/http_exchange.js +142 -0
  167. package/dist/esm/telemetry/api/internal/common/provider_name.js +59 -0
  168. package/dist/esm/telemetry/api/internal/common/redaction.js +121 -0
  169. package/dist/esm/telemetry/api/internal/common/serialization.js +30 -0
  170. package/dist/esm/telemetry/api/internal/common/token_usage.js +85 -0
  171. package/dist/esm/telemetry/api/internal/logs/inference.js +23 -0
  172. package/dist/esm/telemetry/api/internal/logs/logger.js +19 -0
  173. package/dist/esm/telemetry/api/internal/logs/mcp.js +113 -0
  174. package/dist/esm/telemetry/api/internal/metrics/agent.js +107 -0
  175. package/dist/esm/telemetry/api/internal/metrics/inference_start_hook.js +29 -0
  176. package/dist/esm/telemetry/api/internal/metrics/meters.js +165 -0
  177. package/dist/esm/telemetry/api/internal/metrics/tool.js +119 -0
  178. package/dist/esm/telemetry/api/internal/metrics/workflow.js +112 -0
  179. package/dist/esm/telemetry/api/internal/trace/agent.js +25 -0
  180. package/dist/esm/telemetry/api/internal/trace/compaction.js +50 -0
  181. package/dist/esm/telemetry/api/internal/trace/inference.js +107 -0
  182. package/dist/esm/telemetry/api/internal/trace/live.js +28 -0
  183. package/dist/esm/telemetry/api/internal/trace/node.js +44 -0
  184. package/dist/esm/telemetry/api/internal/trace/propagation.js +39 -0
  185. package/dist/esm/telemetry/api/internal/trace/tool.js +96 -0
  186. package/dist/esm/telemetry/api/internal/trace/tracer.js +52 -0
  187. package/dist/esm/telemetry/api/internal/trace/workflow.js +54 -0
  188. package/dist/esm/telemetry/export/agent_engine.js +67 -0
  189. package/dist/esm/telemetry/export/agent_runtime.js +46 -0
  190. package/dist/esm/telemetry/export/google_cloud.js +733 -0
  191. package/dist/esm/telemetry/export/request_driven_metric_reader.js +276 -0
  192. package/dist/esm/telemetry/export/setup.js +160 -0
  193. package/dist/esm/tools/agent_tool.js +9 -1
  194. package/dist/esm/tools/application_integration_tool/application_integration_toolset.js +23 -35
  195. package/dist/esm/tools/application_integration_tool/clients/connections_client.js +64 -21
  196. package/dist/esm/tools/application_integration_tool/clients/integration_client.js +26 -10
  197. package/dist/esm/tools/application_integration_tool/integration_connector_tool.js +14 -23
  198. package/dist/esm/tools/base_toolset.js +1 -1
  199. package/dist/esm/tools/computer_use/base_computer.js +99 -0
  200. package/dist/esm/tools/computer_use/computer_use_actions.js +477 -0
  201. package/dist/esm/tools/computer_use/computer_use_tool.js +217 -0
  202. package/dist/esm/tools/computer_use/computer_use_toolset.js +344 -0
  203. package/dist/esm/tools/function_tool.js +15 -5
  204. package/dist/esm/tools/google_api_tool/google_api_toolset.js +3 -2
  205. package/dist/esm/tools/google_api_tool/googleapi_to_openapi_converter.js +3 -1
  206. package/dist/esm/tools/load_artifacts_tool.js +15 -5
  207. package/dist/esm/tools/load_memory_tool.js +2 -5
  208. package/dist/esm/tools/mcp/mcp_session_manager.js +23 -3
  209. package/dist/esm/tools/mcp/mcp_tool.js +7 -3
  210. package/dist/esm/tools/mcp/mcp_toolset.js +18 -6
  211. package/dist/esm/tools/openapi_tool/auth/auth_helpers.js +27 -26
  212. package/dist/esm/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.js +2 -2
  213. package/dist/esm/tools/openapi_tool/rest_api_tool.js +45 -14
  214. package/dist/esm/tools/skill/load_skill_resource_tool.js +7 -0
  215. package/dist/esm/tools/skill/load_skill_tool.js +3 -0
  216. package/dist/esm/tools/skill/run_skill_script_tool.js +12 -2
  217. package/dist/esm/tools/toolbox_toolset.js +47 -28
  218. package/dist/esm/utils/async_queue.js +37 -3
  219. package/dist/esm/utils/client_labels.js +9 -11
  220. package/dist/esm/utils/env_aware_utils.js +12 -7
  221. package/dist/esm/utils/error_utils.js +37 -1
  222. package/dist/esm/utils/failover_utils.js +10 -9
  223. package/dist/esm/utils/gemini_schema_util.js +124 -11
  224. package/dist/esm/utils/id_provider.js +33 -0
  225. package/dist/esm/utils/model_name.js +14 -0
  226. package/dist/esm/utils/simple_zod_to_json.js +13 -31
  227. package/dist/esm/utils/ssrf_guard.js +55 -15
  228. package/dist/esm/version.js +1 -1
  229. package/dist/esm/workflow/index.js +2 -1
  230. package/dist/esm/workflow/node_runner.js +26 -80
  231. package/dist/esm/workflow/nodes/parallel_worker.js +16 -6
  232. package/dist/esm/workflow/run_llm_agent_as_node.js +19 -14
  233. package/dist/esm/workflow/utils/retry_utils.js +2 -2
  234. package/dist/esm/workflow/workflow.js +12 -12
  235. package/dist/types/a2a/a2a_remote_agent.d.ts +6 -0
  236. package/dist/types/a2a/a2a_remote_agent_utils.d.ts +3 -2
  237. package/dist/types/agents/agent_engine_client.d.ts +121 -3
  238. package/dist/types/agents/base_agent.d.ts +2 -0
  239. package/dist/types/agents/processors/content_processor_utils.d.ts +9 -9
  240. package/dist/types/agents/run_config.d.ts +14 -0
  241. package/dist/types/cli/cli_eval.d.ts +172 -9
  242. package/dist/types/cli/utils/cleanup.d.ts +18 -0
  243. package/dist/types/cli/utils/envs.d.ts +13 -3
  244. package/dist/types/cli/utils/evals.d.ts +64 -1
  245. package/dist/types/cli/utils/logs.d.ts +19 -2
  246. package/dist/types/cli/utils/path_validation.d.ts +30 -0
  247. package/dist/types/code_executors/container_code_executor.d.ts +49 -8
  248. package/dist/types/common.d.ts +16 -9
  249. package/dist/types/context/compaction_utils.d.ts +13 -1
  250. package/dist/types/events/event.d.ts +3 -0
  251. package/dist/types/features/feature_registry.d.ts +1 -0
  252. package/dist/types/index.d.ts +9 -6
  253. package/dist/types/plugins/base_plugin.d.ts +50 -21
  254. package/dist/types/plugins/plugin_manager.d.ts +13 -0
  255. package/dist/types/runner/runner.d.ts +11 -0
  256. package/dist/types/sessions/base_session_service.d.ts +0 -2
  257. package/dist/types/sessions/db/operations.d.ts +2 -1
  258. package/dist/types/sessions/db/schema.d.ts +5 -3
  259. package/dist/types/telemetry/api/instrumentation.d.ts +259 -0
  260. package/dist/types/telemetry/api/internal/common/accumulators.d.ts +91 -0
  261. package/dist/types/telemetry/api/internal/common/attributes.d.ts +90 -0
  262. package/dist/types/telemetry/api/internal/common/config.d.ts +61 -0
  263. package/dist/types/telemetry/api/internal/common/error.d.ts +29 -0
  264. package/dist/types/telemetry/api/internal/common/finish_reason.d.ts +18 -0
  265. package/dist/types/telemetry/api/internal/common/genai_messages.d.ts +26 -0
  266. package/dist/types/telemetry/api/internal/common/http_exchange.d.ts +50 -0
  267. package/dist/types/telemetry/api/internal/common/provider_name.d.ts +16 -0
  268. package/dist/types/telemetry/api/internal/common/redaction.d.ts +14 -0
  269. package/dist/types/telemetry/api/internal/common/serialization.d.ts +18 -0
  270. package/dist/types/telemetry/api/internal/common/token_usage.d.ts +47 -0
  271. package/dist/types/telemetry/api/internal/logs/inference.d.ts +15 -0
  272. package/dist/types/telemetry/api/internal/logs/logger.d.ts +13 -0
  273. package/dist/types/telemetry/api/internal/logs/mcp.d.ts +31 -0
  274. package/dist/types/telemetry/api/internal/metrics/agent.d.ts +28 -0
  275. package/dist/types/telemetry/api/internal/metrics/inference_start_hook.d.ts +12 -0
  276. package/dist/types/telemetry/api/internal/metrics/meters.d.ts +57 -0
  277. package/dist/types/telemetry/api/internal/metrics/tool.d.ts +44 -0
  278. package/dist/types/telemetry/api/internal/metrics/workflow.d.ts +32 -0
  279. package/dist/types/telemetry/api/internal/trace/agent.d.ts +14 -0
  280. package/dist/types/telemetry/api/internal/trace/compaction.d.ts +20 -0
  281. package/dist/types/telemetry/api/internal/trace/inference.d.ts +31 -0
  282. package/dist/types/telemetry/api/internal/trace/live.d.ts +21 -0
  283. package/dist/types/telemetry/api/internal/trace/node.d.ts +22 -0
  284. package/dist/types/telemetry/api/internal/trace/propagation.d.ts +22 -0
  285. package/dist/types/telemetry/api/internal/trace/tool.d.ts +57 -0
  286. package/dist/types/telemetry/api/internal/trace/tracer.d.ts +31 -0
  287. package/dist/types/telemetry/api/internal/trace/workflow.d.ts +21 -0
  288. package/dist/types/telemetry/export/agent_engine.d.ts +23 -0
  289. package/dist/types/telemetry/export/agent_runtime.d.ts +40 -0
  290. package/dist/types/telemetry/export/google_cloud.d.ts +189 -0
  291. package/dist/types/telemetry/export/request_driven_metric_reader.d.ts +144 -0
  292. package/dist/types/telemetry/{setup.d.ts → export/setup.d.ts} +3 -0
  293. package/dist/types/tools/agent_tool.d.ts +1 -1
  294. package/dist/types/tools/application_integration_tool/clients/connections_client.d.ts +13 -4
  295. package/dist/types/tools/base_toolset.d.ts +1 -1
  296. package/dist/types/tools/computer_use/base_computer.d.ts +281 -0
  297. package/dist/types/tools/computer_use/computer_use_actions.d.ts +53 -0
  298. package/dist/types/tools/computer_use/computer_use_tool.d.ts +108 -0
  299. package/dist/types/tools/computer_use/computer_use_toolset.d.ts +132 -0
  300. package/dist/types/tools/google_api_tool/google_api_toolset.d.ts +2 -0
  301. package/dist/types/tools/load_artifacts_tool.d.ts +5 -1
  302. package/dist/types/tools/load_memory_tool.d.ts +13 -7
  303. package/dist/types/tools/mcp/mcp_session_manager.d.ts +16 -0
  304. package/dist/types/tools/openapi_tool/auth/auth_helpers.d.ts +8 -8
  305. package/dist/types/tools/openapi_tool/openapi_spec_parser/operation_parser.d.ts +7 -3
  306. package/dist/types/tools/toolbox_toolset.d.ts +15 -20
  307. package/dist/types/utils/async_queue.d.ts +14 -0
  308. package/dist/types/utils/env_aware_utils.d.ts +11 -0
  309. package/dist/types/utils/error_utils.d.ts +4 -0
  310. package/dist/types/utils/gemini_schema_util.d.ts +27 -6
  311. package/dist/types/utils/id_provider.d.ts +43 -0
  312. package/dist/types/utils/model_name.d.ts +8 -0
  313. package/dist/types/utils/ssrf_guard.d.ts +2 -0
  314. package/dist/types/version.d.ts +1 -1
  315. package/dist/types/workflow/index.d.ts +1 -1
  316. package/dist/types/workflow/nodes/parallel_worker.d.ts +8 -1
  317. package/dist/web/index_web.js +86 -88
  318. package/dist/web/index_web.js.map +4 -4
  319. package/package.json +13 -15
  320. package/dist/cjs/telemetry/google_cloud.js +0 -116
  321. package/dist/cjs/telemetry/tracing.js +0 -393
  322. package/dist/esm/telemetry/google_cloud.js +0 -99
  323. package/dist/esm/telemetry/setup.js +0 -88
  324. package/dist/esm/telemetry/tracing.js +0 -361
  325. package/dist/types/telemetry/google_cloud.d.ts +0 -9
  326. 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 { randomUUID } from "../utils/env_aware_utils.js";
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", " ").slice(0, 19);
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
- this.staleSession = (_a = options == null ? void 0 : options.staleSession) != null ? _a : "reject";
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
- if (!connectionStringOrOptions.driver) {
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
- const { staleSession, ...mikroOptions } = connectionStringOrOptions;
99
- this.options = mikroOptions;
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 ? await getConnectionOptionsFromUri(this.connectionString) : { ...this.options, entities: ENTITIES };
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 || randomUUID();
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
- return createSession({
274
+ const session = createSession({
187
275
  id,
188
276
  appName,
189
277
  userId,
190
278
  state: mergedState,
191
279
  events: [],
192
- lastUpdateTime: storageSession.createTime.getTime()
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
- return createSession({
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
- return createSession({
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
- if (storageSession.updateTime.getTime() > session.lastUpdateTime) {
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
- throw new StaleSessionError(
363
- `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.`
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
- await orm.schema.update({ safe: true });
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 { randomUUID } from "../utils/env_aware_utils.js";
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()) || randomUUID(),
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
- await this.sessions.delete({
318
- name: `reasoningEngines/${reasoningEngineId}/sessions/${sessionId}`
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 (!text.startsWith("---")) {
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
- try {
112
- const parsed = yaml.load(frontmatterStr);
113
- if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
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
- "SKILL.md frontmatter must be a YAML mapping"
121
+ `Invalid YAML in frontmatter: ${e.message}`,
122
+ { cause: e }
116
123
  );
117
124
  }
118
- return { raw: parsed, body };
119
- } catch (e) {
125
+ }
126
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
120
127
  throw new InputValidationError(
121
- `Invalid YAML in frontmatter: ${e.message}`,
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
- try {
200
- const keys = Object.keys(skill.frontmatter);
201
- const unknown = keys.filter((k) => !ALLOWED_FRONTMATTER_KEYS.has(k));
202
- if (unknown.length > 0) {
203
- problems.push(
204
- `Unknown frontmatter fields: [${unknown.sort().join(", ")}]`
205
- );
206
- }
207
- const dirName = path.basename(resolvedDir);
208
- if (dirName !== skill.frontmatter.name) {
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 (!skillMdContent) {
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);