@google/adk 0.3.0 → 0.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 (265) hide show
  1. package/dist/cjs/a2a/a2a_event.js +290 -0
  2. package/dist/cjs/a2a/event_converter_utils.js +201 -0
  3. package/dist/cjs/a2a/executor_context.js +53 -0
  4. package/dist/cjs/a2a/metadata_converter_utils.js +125 -0
  5. package/dist/cjs/a2a/part_converter_utils.js +212 -0
  6. package/dist/cjs/agents/active_streaming_tool.js +1 -1
  7. package/dist/cjs/agents/base_agent.js +6 -6
  8. package/dist/cjs/agents/content_processor_utils.js +1 -1
  9. package/dist/cjs/{tools/tool_context.js → agents/context.js} +71 -16
  10. package/dist/cjs/agents/functions.js +4 -3
  11. package/dist/cjs/agents/instructions.js +1 -1
  12. package/dist/cjs/agents/invocation_context.js +1 -1
  13. package/dist/cjs/agents/live_request_queue.js +1 -1
  14. package/dist/cjs/agents/llm_agent.js +76 -711
  15. package/dist/cjs/agents/loop_agent.js +1 -1
  16. package/dist/cjs/agents/parallel_agent.js +1 -1
  17. package/dist/cjs/agents/processors/agent_transfer_llm_request_processor.js +132 -0
  18. package/dist/cjs/agents/{base_llm_processor.js → processors/base_llm_processor.js} +1 -1
  19. package/dist/cjs/agents/processors/basic_llm_request_processor.js +68 -0
  20. package/dist/cjs/agents/processors/code_execution_request_processor.js +389 -0
  21. package/dist/cjs/agents/processors/content_request_processor.js +66 -0
  22. package/dist/cjs/agents/processors/identity_llm_request_processor.js +54 -0
  23. package/dist/cjs/agents/processors/instructions_llm_request_processor.js +85 -0
  24. package/dist/cjs/agents/processors/request_confirmation_llm_request_processor.js +165 -0
  25. package/dist/cjs/agents/readonly_context.js +13 -1
  26. package/dist/cjs/agents/run_config.js +2 -1
  27. package/dist/cjs/agents/sequential_agent.js +1 -1
  28. package/dist/cjs/agents/transcription_entry.js +1 -1
  29. package/dist/cjs/artifacts/base_artifact_service.js +1 -1
  30. package/dist/cjs/artifacts/file_artifact_service.js +491 -0
  31. package/dist/cjs/artifacts/gcs_artifact_service.js +127 -48
  32. package/dist/cjs/artifacts/in_memory_artifact_service.js +54 -6
  33. package/dist/cjs/artifacts/registry.js +55 -0
  34. package/dist/cjs/auth/auth_credential.js +1 -1
  35. package/dist/cjs/auth/auth_handler.js +1 -1
  36. package/dist/cjs/auth/auth_schemes.js +1 -1
  37. package/dist/cjs/auth/auth_tool.js +1 -1
  38. package/dist/cjs/auth/credential_service/base_credential_service.js +1 -1
  39. package/dist/cjs/auth/credential_service/in_memory_credential_service.js +1 -1
  40. package/dist/cjs/auth/exchanger/base_credential_exchanger.js +1 -1
  41. package/dist/cjs/auth/exchanger/credential_exchanger_registry.js +1 -1
  42. package/dist/cjs/code_executors/base_code_executor.js +1 -1
  43. package/dist/cjs/code_executors/built_in_code_executor.js +1 -1
  44. package/dist/cjs/code_executors/code_execution_utils.js +1 -1
  45. package/dist/cjs/code_executors/code_executor_context.js +1 -1
  46. package/dist/cjs/common.js +25 -8
  47. package/dist/cjs/events/event.js +33 -4
  48. package/dist/cjs/events/event_actions.js +2 -2
  49. package/dist/cjs/events/structured_events.js +105 -0
  50. package/dist/cjs/examples/base_example_provider.js +1 -1
  51. package/dist/cjs/examples/example.js +1 -1
  52. package/dist/cjs/examples/example_util.js +1 -1
  53. package/dist/cjs/index.js +24 -17
  54. package/dist/cjs/index.js.map +4 -4
  55. package/dist/cjs/index_web.js +1 -1
  56. package/dist/cjs/memory/base_memory_service.js +1 -1
  57. package/dist/cjs/memory/in_memory_memory_service.js +1 -1
  58. package/dist/cjs/memory/memory_entry.js +1 -1
  59. package/dist/cjs/models/apigee_llm.js +182 -0
  60. package/dist/cjs/models/base_llm.js +1 -1
  61. package/dist/cjs/models/base_llm_connection.js +1 -1
  62. package/dist/cjs/models/gemini_llm_connection.js +1 -1
  63. package/dist/cjs/models/google_llm.js +70 -51
  64. package/dist/cjs/models/llm_request.js +1 -1
  65. package/dist/cjs/models/llm_response.js +3 -1
  66. package/dist/cjs/models/registry.js +3 -1
  67. package/dist/cjs/plugins/base_plugin.js +2 -2
  68. package/dist/cjs/plugins/logging_plugin.js +1 -1
  69. package/dist/cjs/plugins/plugin_manager.js +1 -1
  70. package/dist/cjs/plugins/security_plugin.js +1 -1
  71. package/dist/cjs/runner/in_memory_runner.js +1 -1
  72. package/dist/cjs/runner/runner.js +33 -2
  73. package/dist/cjs/sessions/base_session_service.js +53 -3
  74. package/dist/cjs/sessions/database_session_service.js +367 -0
  75. package/dist/cjs/sessions/db/operations.js +126 -0
  76. package/dist/cjs/sessions/db/schema.js +204 -0
  77. package/dist/cjs/sessions/in_memory_session_service.js +24 -22
  78. package/dist/cjs/sessions/registry.js +49 -0
  79. package/dist/cjs/sessions/session.js +1 -1
  80. package/dist/cjs/sessions/state.js +1 -1
  81. package/dist/cjs/telemetry/google_cloud.js +1 -1
  82. package/dist/cjs/telemetry/setup.js +1 -1
  83. package/dist/cjs/telemetry/tracing.js +1 -1
  84. package/dist/cjs/tools/agent_tool.js +1 -1
  85. package/dist/cjs/tools/base_tool.js +4 -1
  86. package/dist/cjs/tools/base_toolset.js +14 -4
  87. package/dist/cjs/tools/exit_loop_tool.js +63 -0
  88. package/dist/cjs/tools/forwarding_artifact_service.js +17 -1
  89. package/dist/cjs/tools/function_tool.js +1 -1
  90. package/dist/cjs/tools/google_search_tool.js +1 -1
  91. package/dist/cjs/tools/long_running_tool.js +1 -1
  92. package/dist/cjs/tools/mcp/mcp_session_manager.js +1 -1
  93. package/dist/cjs/tools/mcp/mcp_tool.js +1 -1
  94. package/dist/cjs/tools/mcp/mcp_toolset.js +10 -6
  95. package/dist/cjs/tools/tool_confirmation.js +1 -1
  96. package/dist/cjs/utils/client_labels.js +1 -1
  97. package/dist/cjs/utils/env_aware_utils.js +10 -1
  98. package/dist/cjs/utils/gemini_schema_util.js +1 -1
  99. package/dist/cjs/utils/logger.js +62 -55
  100. package/dist/cjs/utils/model_name.js +1 -1
  101. package/dist/cjs/utils/object_notation_utils.js +78 -0
  102. package/dist/cjs/utils/simple_zod_to_json.js +1 -1
  103. package/dist/cjs/utils/variant_utils.js +3 -9
  104. package/dist/cjs/version.js +2 -2
  105. package/dist/esm/a2a/a2a_event.js +243 -0
  106. package/dist/esm/a2a/event_converter_utils.js +187 -0
  107. package/dist/esm/a2a/executor_context.js +23 -0
  108. package/dist/esm/a2a/metadata_converter_utils.js +90 -0
  109. package/dist/esm/a2a/part_converter_utils.js +175 -0
  110. package/dist/esm/agents/base_agent.js +5 -5
  111. package/dist/esm/{tools/tool_context.js → agents/context.js} +66 -11
  112. package/dist/esm/agents/functions.js +3 -2
  113. package/dist/esm/agents/llm_agent.js +69 -720
  114. package/dist/esm/agents/processors/agent_transfer_llm_request_processor.js +101 -0
  115. package/dist/esm/agents/processors/basic_llm_request_processor.js +37 -0
  116. package/dist/esm/agents/processors/code_execution_request_processor.js +363 -0
  117. package/dist/esm/agents/processors/content_request_processor.js +38 -0
  118. package/dist/esm/agents/processors/identity_llm_request_processor.js +23 -0
  119. package/dist/esm/agents/processors/instructions_llm_request_processor.js +54 -0
  120. package/dist/esm/agents/processors/request_confirmation_llm_request_processor.js +140 -0
  121. package/dist/esm/agents/readonly_context.js +12 -0
  122. package/dist/esm/agents/run_config.js +1 -0
  123. package/dist/esm/artifacts/file_artifact_service.js +451 -0
  124. package/dist/esm/artifacts/gcs_artifact_service.js +126 -47
  125. package/dist/esm/artifacts/in_memory_artifact_service.js +51 -4
  126. package/dist/esm/artifacts/registry.js +28 -0
  127. package/dist/esm/common.js +20 -10
  128. package/dist/esm/events/event.js +29 -2
  129. package/dist/esm/events/event_actions.js +1 -1
  130. package/dist/esm/events/structured_events.js +74 -0
  131. package/dist/esm/index.js +24 -17
  132. package/dist/esm/index.js.map +4 -4
  133. package/dist/esm/models/apigee_llm.js +152 -0
  134. package/dist/esm/models/google_llm.js +67 -49
  135. package/dist/esm/models/llm_response.js +2 -0
  136. package/dist/esm/models/registry.js +2 -0
  137. package/dist/esm/plugins/base_plugin.js +1 -1
  138. package/dist/esm/runner/runner.js +32 -1
  139. package/dist/esm/sessions/base_session_service.js +49 -1
  140. package/dist/esm/sessions/database_session_service.js +353 -0
  141. package/dist/esm/sessions/db/operations.js +111 -0
  142. package/dist/esm/sessions/db/schema.js +172 -0
  143. package/dist/esm/sessions/in_memory_session_service.js +23 -21
  144. package/dist/esm/sessions/registry.js +25 -0
  145. package/dist/esm/tools/base_tool.js +3 -0
  146. package/dist/esm/tools/base_toolset.js +11 -2
  147. package/dist/esm/tools/exit_loop_tool.js +32 -0
  148. package/dist/esm/tools/forwarding_artifact_service.js +16 -0
  149. package/dist/esm/tools/mcp/mcp_toolset.js +9 -5
  150. package/dist/esm/utils/env_aware_utils.js +8 -0
  151. package/dist/esm/utils/logger.js +51 -54
  152. package/dist/esm/utils/object_notation_utils.js +47 -0
  153. package/dist/esm/utils/variant_utils.js +1 -7
  154. package/dist/esm/version.js +1 -1
  155. package/dist/types/a2a/a2a_event.d.ts +122 -0
  156. package/dist/types/a2a/event_converter_utils.d.ts +20 -0
  157. package/dist/types/a2a/executor_context.d.ts +33 -0
  158. package/dist/types/a2a/metadata_converter_utils.d.ts +62 -0
  159. package/dist/types/a2a/part_converter_utils.d.ts +48 -0
  160. package/dist/types/agents/base_agent.d.ts +2 -2
  161. package/dist/types/{tools/tool_context.d.ts → agents/context.d.ts} +43 -8
  162. package/dist/types/agents/llm_agent.d.ts +19 -42
  163. package/dist/types/agents/processors/agent_transfer_llm_request_processor.d.ts +18 -0
  164. package/dist/types/agents/{base_llm_processor.d.ts → processors/base_llm_processor.d.ts} +4 -4
  165. package/dist/types/agents/processors/basic_llm_request_processor.d.ts +13 -0
  166. package/dist/types/agents/processors/code_execution_request_processor.d.ts +34 -0
  167. package/dist/types/agents/processors/content_request_processor.d.ts +13 -0
  168. package/dist/types/agents/processors/identity_llm_request_processor.d.ts +13 -0
  169. package/dist/types/agents/processors/instructions_llm_request_processor.d.ts +16 -0
  170. package/dist/types/agents/processors/request_confirmation_llm_request_processor.d.ts +13 -0
  171. package/dist/types/agents/readonly_context.d.ts +8 -0
  172. package/dist/types/agents/run_config.d.ts +6 -0
  173. package/dist/types/artifacts/base_artifact_service.d.ts +31 -0
  174. package/dist/types/artifacts/file_artifact_service.d.ts +43 -0
  175. package/dist/types/artifacts/gcs_artifact_service.d.ts +3 -1
  176. package/dist/types/artifacts/in_memory_artifact_service.d.ts +5 -2
  177. package/dist/types/artifacts/registry.d.ts +7 -0
  178. package/dist/types/auth/credential_service/base_credential_service.d.ts +3 -3
  179. package/dist/types/auth/credential_service/in_memory_credential_service.d.ts +3 -3
  180. package/dist/types/common.d.ts +15 -6
  181. package/dist/types/events/event.d.ts +15 -1
  182. package/dist/types/events/event_actions.d.ts +1 -1
  183. package/dist/types/events/structured_events.d.ts +106 -0
  184. package/dist/types/index.d.ts +5 -1
  185. package/dist/types/models/apigee_llm.d.ts +59 -0
  186. package/dist/types/models/google_llm.d.ts +5 -2
  187. package/dist/types/models/llm_response.d.ts +5 -1
  188. package/dist/types/plugins/base_plugin.d.ts +12 -13
  189. package/dist/types/plugins/logging_plugin.d.ts +9 -10
  190. package/dist/types/plugins/plugin_manager.d.ts +9 -10
  191. package/dist/types/plugins/security_plugin.d.ts +2 -2
  192. package/dist/types/runner/runner.d.ts +15 -0
  193. package/dist/types/sessions/base_session_service.d.ts +20 -0
  194. package/dist/types/sessions/database_session_service.d.ts +32 -0
  195. package/dist/types/sessions/db/operations.d.ts +29 -0
  196. package/dist/types/sessions/db/schema.d.ts +45 -0
  197. package/dist/types/sessions/in_memory_session_service.d.ts +4 -1
  198. package/dist/types/sessions/registry.d.ts +7 -0
  199. package/dist/types/tools/base_tool.d.ts +3 -3
  200. package/dist/types/tools/base_toolset.d.ts +12 -3
  201. package/dist/types/tools/exit_loop_tool.d.ts +24 -0
  202. package/dist/types/tools/forwarding_artifact_service.d.ts +5 -3
  203. package/dist/types/tools/function_tool.d.ts +2 -2
  204. package/dist/types/tools/mcp/mcp_toolset.d.ts +1 -1
  205. package/dist/types/utils/env_aware_utils.d.ts +7 -0
  206. package/dist/types/utils/logger.d.ts +5 -9
  207. package/dist/types/utils/object_notation_utils.d.ts +21 -0
  208. package/dist/types/version.d.ts +1 -1
  209. package/dist/web/a2a/a2a_event.js +243 -0
  210. package/dist/web/a2a/event_converter_utils.js +201 -0
  211. package/dist/web/a2a/executor_context.js +23 -0
  212. package/dist/web/a2a/metadata_converter_utils.js +107 -0
  213. package/dist/web/a2a/part_converter_utils.js +175 -0
  214. package/dist/web/agents/base_agent.js +5 -5
  215. package/dist/web/{tools/tool_context.js → agents/context.js} +66 -11
  216. package/dist/web/agents/functions.js +3 -2
  217. package/dist/web/agents/llm_agent.js +90 -717
  218. package/dist/web/agents/processors/agent_transfer_llm_request_processor.js +100 -0
  219. package/dist/web/agents/processors/basic_llm_request_processor.js +71 -0
  220. package/dist/web/agents/processors/code_execution_request_processor.js +365 -0
  221. package/dist/web/agents/processors/content_request_processor.js +56 -0
  222. package/dist/web/agents/processors/identity_llm_request_processor.js +41 -0
  223. package/dist/web/agents/processors/instructions_llm_request_processor.js +72 -0
  224. package/dist/web/agents/processors/request_confirmation_llm_request_processor.js +158 -0
  225. package/dist/web/agents/readonly_context.js +12 -0
  226. package/dist/web/agents/run_config.js +2 -1
  227. package/dist/web/artifacts/file_artifact_service.js +506 -0
  228. package/dist/web/artifacts/gcs_artifact_service.js +123 -46
  229. package/dist/web/artifacts/in_memory_artifact_service.js +51 -4
  230. package/dist/web/artifacts/registry.js +28 -0
  231. package/dist/web/common.js +20 -10
  232. package/dist/web/events/event.js +29 -2
  233. package/dist/web/events/event_actions.js +1 -1
  234. package/dist/web/events/structured_events.js +74 -0
  235. package/dist/web/index.js +7 -2
  236. package/dist/web/index.js.map +4 -4
  237. package/dist/web/models/apigee_llm.js +219 -0
  238. package/dist/web/models/google_llm.js +67 -46
  239. package/dist/web/models/llm_response.js +2 -0
  240. package/dist/web/models/registry.js +2 -0
  241. package/dist/web/plugins/base_plugin.js +1 -1
  242. package/dist/web/runner/runner.js +34 -1
  243. package/dist/web/sessions/base_session_service.js +49 -1
  244. package/dist/web/sessions/database_session_service.js +371 -0
  245. package/dist/web/sessions/db/operations.js +111 -0
  246. package/dist/web/sessions/db/schema.js +172 -0
  247. package/dist/web/sessions/in_memory_session_service.js +23 -21
  248. package/dist/web/sessions/registry.js +25 -0
  249. package/dist/web/tools/base_tool.js +3 -0
  250. package/dist/web/tools/base_toolset.js +11 -2
  251. package/dist/web/tools/exit_loop_tool.js +32 -0
  252. package/dist/web/tools/forwarding_artifact_service.js +16 -0
  253. package/dist/web/tools/mcp/mcp_toolset.js +27 -5
  254. package/dist/web/utils/env_aware_utils.js +8 -0
  255. package/dist/web/utils/logger.js +51 -54
  256. package/dist/web/utils/object_notation_utils.js +47 -0
  257. package/dist/web/utils/variant_utils.js +1 -7
  258. package/dist/web/version.js +1 -1
  259. package/package.json +13 -3
  260. package/dist/cjs/agents/callback_context.js +0 -101
  261. package/dist/esm/agents/callback_context.js +0 -71
  262. package/dist/types/agents/callback_context.d.ts +0 -42
  263. package/dist/web/agents/callback_context.js +0 -71
  264. /package/dist/esm/agents/{base_llm_processor.js → processors/base_llm_processor.js} +0 -0
  265. /package/dist/web/agents/{base_llm_processor.js → processors/base_llm_processor.js} +0 -0
@@ -0,0 +1,353 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import {
7
+ LockMode,
8
+ MikroORM
9
+ } from "@mikro-orm/core";
10
+ import { randomUUID } from "../utils/env_aware_utils.js";
11
+ import {
12
+ BaseSessionService,
13
+ mergeStates,
14
+ trimTempDeltaState
15
+ } from "./base_session_service.js";
16
+ import {
17
+ ensureDatabaseCreated,
18
+ getConnectionOptionsFromUri,
19
+ validateDatabaseSchemaVersion
20
+ } from "./db/operations.js";
21
+ import {
22
+ ENTITIES,
23
+ StorageAppState,
24
+ StorageEvent,
25
+ StorageSession,
26
+ StorageUserState
27
+ } from "./db/schema.js";
28
+ import { createSession } from "./session.js";
29
+ import { State } from "./state.js";
30
+ function isDatabaseConnectionString(uri) {
31
+ if (!uri) {
32
+ return false;
33
+ }
34
+ return uri.startsWith("postgres://") || uri.startsWith("postgresql://") || uri.startsWith("mysql://") || uri.startsWith("mariadb://") || uri.startsWith("mssql://") || uri.startsWith("sqlite://");
35
+ }
36
+ class DatabaseSessionService extends BaseSessionService {
37
+ constructor(connectionStringOrOptions) {
38
+ super();
39
+ this.initialized = false;
40
+ if (typeof connectionStringOrOptions === "string") {
41
+ this.connectionString = connectionStringOrOptions;
42
+ } else {
43
+ if (!connectionStringOrOptions.driver) {
44
+ throw new Error("Driver is required when passing options object.");
45
+ }
46
+ this.options = {
47
+ ...connectionStringOrOptions,
48
+ entities: ENTITIES
49
+ };
50
+ }
51
+ }
52
+ async init() {
53
+ if (this.initialized) {
54
+ return;
55
+ }
56
+ if (this.connectionString && (!this.options || !this.options.driver)) {
57
+ this.options = await getConnectionOptionsFromUri(this.connectionString);
58
+ }
59
+ this.orm = await MikroORM.init(this.options);
60
+ await ensureDatabaseCreated(this.orm);
61
+ await validateDatabaseSchemaVersion(this.orm);
62
+ this.initialized = true;
63
+ }
64
+ async createSession({
65
+ appName,
66
+ userId,
67
+ state,
68
+ sessionId
69
+ }) {
70
+ await this.init();
71
+ const em = this.orm.em.fork();
72
+ const id = sessionId || randomUUID();
73
+ const now = /* @__PURE__ */ new Date();
74
+ const existing = await em.findOne(StorageSession, {
75
+ id,
76
+ appName,
77
+ userId
78
+ });
79
+ if (existing) {
80
+ throw new Error(`Session with id ${id} already exists.`);
81
+ }
82
+ let appStateModel = await em.findOne(StorageAppState, { appName });
83
+ if (!appStateModel) {
84
+ appStateModel = em.create(StorageAppState, {
85
+ appName,
86
+ state: {},
87
+ updateTime: now
88
+ });
89
+ em.persist(appStateModel);
90
+ }
91
+ let userStateModel = await em.findOne(StorageUserState, { appName, userId });
92
+ if (!userStateModel) {
93
+ userStateModel = em.create(StorageUserState, {
94
+ appName,
95
+ userId,
96
+ state: {}
97
+ });
98
+ em.persist(userStateModel);
99
+ }
100
+ const appStateDelta = {};
101
+ const userStateDelta = {};
102
+ const sessionState = {};
103
+ if (state) {
104
+ for (const [key, value] of Object.entries(state)) {
105
+ if (key.startsWith(State.APP_PREFIX)) {
106
+ appStateDelta[key.replace(State.APP_PREFIX, "")] = value;
107
+ } else if (key.startsWith(State.USER_PREFIX)) {
108
+ userStateDelta[key.replace(State.USER_PREFIX, "")] = value;
109
+ } else {
110
+ sessionState[key] = value;
111
+ }
112
+ }
113
+ }
114
+ if (Object.keys(appStateDelta).length > 0) {
115
+ appStateModel.state = { ...appStateModel.state, ...appStateDelta };
116
+ }
117
+ if (Object.keys(userStateDelta).length > 0) {
118
+ userStateModel.state = { ...userStateModel.state, ...userStateDelta };
119
+ }
120
+ const storageSession = em.create(StorageSession, {
121
+ id,
122
+ appName,
123
+ userId,
124
+ state: sessionState,
125
+ createTime: now,
126
+ updateTime: now
127
+ });
128
+ em.persist(storageSession);
129
+ await em.flush();
130
+ const mergedState = mergeStates(
131
+ appStateModel.state,
132
+ userStateModel.state,
133
+ sessionState
134
+ );
135
+ return createSession({
136
+ id,
137
+ appName,
138
+ userId,
139
+ state: mergedState,
140
+ events: [],
141
+ lastUpdateTime: storageSession.createTime.getTime()
142
+ });
143
+ }
144
+ async getSession({
145
+ appName,
146
+ userId,
147
+ sessionId,
148
+ config
149
+ }) {
150
+ await this.init();
151
+ const em = this.orm.em.fork();
152
+ const storageSession = await em.findOne(StorageSession, {
153
+ appName,
154
+ userId,
155
+ id: sessionId
156
+ });
157
+ if (!storageSession) {
158
+ return void 0;
159
+ }
160
+ const eventWhere = {
161
+ appName,
162
+ userId,
163
+ sessionId
164
+ };
165
+ if (config == null ? void 0 : config.afterTimestamp) {
166
+ eventWhere.timestamp = { $gt: new Date(config.afterTimestamp) };
167
+ }
168
+ const storageEvents = await em.find(StorageEvent, eventWhere, {
169
+ orderBy: { timestamp: "DESC" },
170
+ limit: config == null ? void 0 : config.numRecentEvents
171
+ });
172
+ storageEvents.reverse();
173
+ const appStateModel = await em.findOne(StorageAppState, { appName });
174
+ const userStateModel = await em.findOne(StorageUserState, {
175
+ appName,
176
+ userId
177
+ });
178
+ const mergedState = mergeStates(
179
+ (appStateModel == null ? void 0 : appStateModel.state) || {},
180
+ (userStateModel == null ? void 0 : userStateModel.state) || {},
181
+ storageSession.state
182
+ );
183
+ return createSession({
184
+ id: sessionId,
185
+ appName,
186
+ userId,
187
+ state: mergedState,
188
+ events: storageEvents.map((se) => se.eventData),
189
+ lastUpdateTime: storageSession.updateTime.getTime()
190
+ });
191
+ }
192
+ async listSessions({
193
+ appName,
194
+ userId
195
+ }) {
196
+ await this.init();
197
+ const em = this.orm.em.fork();
198
+ const where = { appName };
199
+ if (userId) {
200
+ where.userId = userId;
201
+ }
202
+ const storageSessions = await em.find(StorageSession, where);
203
+ const appStateModel = await em.findOne(StorageAppState, { appName });
204
+ const appState = (appStateModel == null ? void 0 : appStateModel.state) || {};
205
+ const userStateMap = {};
206
+ if (userId) {
207
+ const u = await em.findOne(StorageUserState, { appName, userId });
208
+ if (u) userStateMap[userId] = u.state;
209
+ } else {
210
+ const allUserStates = await em.find(StorageUserState, { appName });
211
+ for (const u of allUserStates) {
212
+ userStateMap[u.userId] = u.state;
213
+ }
214
+ }
215
+ const sessions = storageSessions.map((ss) => {
216
+ const uState = userStateMap[ss.userId] || {};
217
+ const merged = mergeStates(appState, uState, ss.state);
218
+ return createSession({
219
+ id: ss.id,
220
+ appName: ss.appName,
221
+ userId: ss.userId,
222
+ state: merged,
223
+ events: [],
224
+ lastUpdateTime: ss.updateTime.getTime()
225
+ });
226
+ });
227
+ return { sessions };
228
+ }
229
+ async deleteSession({
230
+ appName,
231
+ userId,
232
+ sessionId
233
+ }) {
234
+ await this.init();
235
+ const em = this.orm.em.fork();
236
+ await em.nativeDelete(StorageSession, { appName, userId, id: sessionId });
237
+ await em.nativeDelete(StorageEvent, { appName, userId, sessionId });
238
+ }
239
+ async appendEvent({
240
+ session,
241
+ event
242
+ }) {
243
+ await this.init();
244
+ const em = this.orm.em.fork();
245
+ if (event.partial) {
246
+ return event;
247
+ }
248
+ const trimmedEvent = trimTempDeltaState(event);
249
+ await em.transactional(async (txEm) => {
250
+ const storageSession = await txEm.findOne(
251
+ StorageSession,
252
+ {
253
+ appName: session.appName,
254
+ userId: session.userId,
255
+ id: session.id
256
+ },
257
+ { lockMode: LockMode.PESSIMISTIC_WRITE }
258
+ );
259
+ if (!storageSession) {
260
+ throw new Error(`Session ${session.id} not found for appendEvent`);
261
+ }
262
+ let appStateModel = await txEm.findOne(StorageAppState, {
263
+ appName: session.appName
264
+ });
265
+ if (!appStateModel) {
266
+ appStateModel = txEm.create(StorageAppState, {
267
+ appName: session.appName,
268
+ state: {},
269
+ updateTime: /* @__PURE__ */ new Date()
270
+ });
271
+ txEm.persist(appStateModel);
272
+ }
273
+ let userStateModel = await txEm.findOne(StorageUserState, {
274
+ appName: session.appName,
275
+ userId: session.userId
276
+ });
277
+ if (!userStateModel) {
278
+ userStateModel = txEm.create(StorageUserState, {
279
+ appName: session.appName,
280
+ userId: session.userId,
281
+ state: {}
282
+ });
283
+ txEm.persist(userStateModel);
284
+ }
285
+ if (storageSession.updateTime.getTime() > session.lastUpdateTime) {
286
+ const events = await txEm.find(
287
+ StorageEvent,
288
+ {
289
+ appName: session.appName,
290
+ userId: session.userId,
291
+ sessionId: session.id
292
+ },
293
+ { orderBy: { timestamp: "ASC" } }
294
+ );
295
+ const mergedState = mergeStates(
296
+ appStateModel.state,
297
+ userStateModel.state,
298
+ storageSession.state
299
+ );
300
+ session.state = mergedState;
301
+ session.events = events.map((e) => e.eventData);
302
+ }
303
+ if (event.actions && event.actions.stateDelta) {
304
+ const appDelta = {};
305
+ const userDelta = {};
306
+ const sessionDelta = {};
307
+ for (const [key, value] of Object.entries(event.actions.stateDelta)) {
308
+ if (key.startsWith(State.APP_PREFIX)) {
309
+ appDelta[key.replace(State.APP_PREFIX, "")] = value;
310
+ } else if (key.startsWith(State.USER_PREFIX)) {
311
+ userDelta[key.replace(State.USER_PREFIX, "")] = value;
312
+ } else {
313
+ sessionDelta[key] = value;
314
+ }
315
+ }
316
+ if (Object.keys(appDelta).length > 0) {
317
+ appStateModel.state = { ...appStateModel.state, ...appDelta };
318
+ }
319
+ if (Object.keys(userDelta).length > 0) {
320
+ userStateModel.state = { ...userStateModel.state, ...userDelta };
321
+ }
322
+ if (Object.keys(sessionDelta).length > 0) {
323
+ storageSession.state = { ...storageSession.state, ...sessionDelta };
324
+ }
325
+ }
326
+ const newStorageEvent = txEm.create(StorageEvent, {
327
+ id: trimmedEvent.id,
328
+ appName: session.appName,
329
+ userId: session.userId,
330
+ sessionId: session.id,
331
+ invocationId: trimmedEvent.invocationId,
332
+ timestamp: new Date(trimmedEvent.timestamp),
333
+ eventData: trimmedEvent
334
+ });
335
+ txEm.persist(newStorageEvent);
336
+ await txEm.commit();
337
+ storageSession.updateTime = new Date(event.timestamp);
338
+ const newMergedState = mergeStates(
339
+ appStateModel.state,
340
+ userStateModel.state,
341
+ storageSession.state
342
+ );
343
+ session.state = newMergedState;
344
+ session.events.push(event);
345
+ session.lastUpdateTime = storageSession.updateTime.getTime();
346
+ });
347
+ return event;
348
+ }
349
+ }
350
+ export {
351
+ DatabaseSessionService,
352
+ isDatabaseConnectionString
353
+ };
@@ -0,0 +1,111 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __copyProps = (to, from, except, desc) => {
8
+ if (from && typeof from === "object" || typeof from === "function") {
9
+ for (let key of __getOwnPropNames(from))
10
+ if (!__hasOwnProp.call(to, key) && key !== except)
11
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
12
+ }
13
+ return to;
14
+ };
15
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
16
+ // If the importer is in node compatibility mode or this is not an ESM
17
+ // file that has been converted to a CommonJS file using a Babel-
18
+ // compatible transform (i.e. "__esModule" has not been set), then set
19
+ // "default" to the CommonJS "module.exports" for node compatibility.
20
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
21
+ mod
22
+ ));
23
+ /**
24
+ * @license
25
+ * Copyright 2026 Google LLC
26
+ * SPDX-License-Identifier: Apache-2.0
27
+ */
28
+ import { MikroORM } from "@mikro-orm/core";
29
+ import {
30
+ ENTITIES,
31
+ SCHEMA_VERSION_1_JSON,
32
+ SCHEMA_VERSION_KEY,
33
+ StorageMetadata
34
+ } from "./schema.js";
35
+ async function getConnectionOptionsFromUri(uri) {
36
+ let driver;
37
+ if (uri.startsWith("postgres://") || uri.startsWith("postgresql://")) {
38
+ const { PostgreSqlDriver } = await Promise.resolve().then(() => __toESM(require("@mikro-orm/postgresql"), 1));
39
+ driver = PostgreSqlDriver;
40
+ } else if (uri.startsWith("mysql://")) {
41
+ const { MySqlDriver } = await Promise.resolve().then(() => __toESM(require("@mikro-orm/mysql"), 1));
42
+ driver = MySqlDriver;
43
+ } else if (uri.startsWith("mariadb://")) {
44
+ const { MariaDbDriver } = await Promise.resolve().then(() => __toESM(require("@mikro-orm/mariadb"), 1));
45
+ driver = MariaDbDriver;
46
+ } else if (uri.startsWith("sqlite://")) {
47
+ const { SqliteDriver } = await Promise.resolve().then(() => __toESM(require("@mikro-orm/sqlite"), 1));
48
+ driver = SqliteDriver;
49
+ } else if (uri.startsWith("mssql://")) {
50
+ const { MsSqlDriver } = await Promise.resolve().then(() => __toESM(require("@mikro-orm/mssql"), 1));
51
+ driver = MsSqlDriver;
52
+ } else {
53
+ throw new Error(`Unsupported database URI: ${uri}`);
54
+ }
55
+ if (uri === "sqlite://:memory:") {
56
+ return {
57
+ entities: ENTITIES,
58
+ dbName: ":memory:",
59
+ driver
60
+ };
61
+ }
62
+ const { host, port, username, password, pathname } = new URL(uri);
63
+ const hostName = host.split(":")[0];
64
+ return {
65
+ entities: ENTITIES,
66
+ dbName: pathname.slice(1),
67
+ host: hostName,
68
+ port: port ? parseInt(port) : void 0,
69
+ user: username,
70
+ password,
71
+ driver
72
+ };
73
+ }
74
+ async function ensureDatabaseCreated(ormOrUrlOrOptions) {
75
+ let orm;
76
+ if (ormOrUrlOrOptions instanceof MikroORM) {
77
+ orm = ormOrUrlOrOptions;
78
+ } else if (typeof ormOrUrlOrOptions === "string") {
79
+ orm = await MikroORM.init(
80
+ await getConnectionOptionsFromUri(ormOrUrlOrOptions)
81
+ );
82
+ } else {
83
+ orm = await MikroORM.init(ormOrUrlOrOptions);
84
+ }
85
+ await orm.schema.ensureDatabase();
86
+ await orm.schema.updateSchema();
87
+ }
88
+ async function validateDatabaseSchemaVersion(orm) {
89
+ const em = orm.em.fork();
90
+ const existing = await em.findOne(StorageMetadata, {
91
+ key: SCHEMA_VERSION_KEY
92
+ });
93
+ if (existing) {
94
+ if (existing.value !== SCHEMA_VERSION_1_JSON) {
95
+ throw new Error(
96
+ `ADK Database schema version ${existing.value} is not compatible.`
97
+ );
98
+ }
99
+ return;
100
+ }
101
+ const newVersion = em.create(StorageMetadata, {
102
+ key: SCHEMA_VERSION_KEY,
103
+ value: SCHEMA_VERSION_1_JSON
104
+ });
105
+ await em.persist(newVersion).flush();
106
+ }
107
+ export {
108
+ ensureDatabaseCreated,
109
+ getConnectionOptionsFromUri,
110
+ validateDatabaseSchemaVersion
111
+ };
@@ -0,0 +1,172 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators, target, key, kind) => {
4
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
6
+ if (decorator = decorators[i])
7
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
+ if (kind && result) __defProp(target, key, result);
9
+ return result;
10
+ };
11
+ /**
12
+ * @license
13
+ * Copyright 2026 Google LLC
14
+ * SPDX-License-Identifier: Apache-2.0
15
+ */
16
+ import { Entity, JsonType, PrimaryKey, Property } from "@mikro-orm/core";
17
+ import {
18
+ transformToCamelCaseEvent,
19
+ transformToSnakeCaseEvent
20
+ } from "../../events/event.js";
21
+ const SCHEMA_VERSION_KEY = "schema_version";
22
+ const SCHEMA_VERSION_1_JSON = "1";
23
+ class CamelCaseToSnakeCaseJsonType extends JsonType {
24
+ convertToDatabaseValue(value) {
25
+ return JSON.stringify(transformToSnakeCaseEvent(value));
26
+ }
27
+ convertToJSValue(value) {
28
+ if (typeof value === "string") {
29
+ return transformToCamelCaseEvent(JSON.parse(value));
30
+ }
31
+ return transformToCamelCaseEvent(value);
32
+ }
33
+ }
34
+ let StorageMetadata = class {
35
+ };
36
+ __decorateClass([
37
+ PrimaryKey({ type: "string" })
38
+ ], StorageMetadata.prototype, "key", 2);
39
+ __decorateClass([
40
+ Property({ type: "string" })
41
+ ], StorageMetadata.prototype, "value", 2);
42
+ StorageMetadata = __decorateClass([
43
+ Entity({ tableName: "adk_internal_metadata" })
44
+ ], StorageMetadata);
45
+ let StorageAppState = class {
46
+ constructor() {
47
+ this.updateTime = /* @__PURE__ */ new Date();
48
+ }
49
+ };
50
+ __decorateClass([
51
+ PrimaryKey({ type: "string", fieldName: "app_name" })
52
+ ], StorageAppState.prototype, "appName", 2);
53
+ __decorateClass([
54
+ Property({ type: "json" })
55
+ ], StorageAppState.prototype, "state", 2);
56
+ __decorateClass([
57
+ Property({
58
+ type: "datetime",
59
+ fieldName: "update_time",
60
+ onCreate: () => /* @__PURE__ */ new Date(),
61
+ onUpdate: () => /* @__PURE__ */ new Date()
62
+ })
63
+ ], StorageAppState.prototype, "updateTime", 2);
64
+ StorageAppState = __decorateClass([
65
+ Entity({ tableName: "app_states" })
66
+ ], StorageAppState);
67
+ PrimaryKey.name;
68
+ let StorageUserState = class {
69
+ constructor() {
70
+ this.updateTime = /* @__PURE__ */ new Date();
71
+ }
72
+ };
73
+ __decorateClass([
74
+ PrimaryKey({ type: "string", fieldName: "app_name" })
75
+ ], StorageUserState.prototype, "appName", 2);
76
+ __decorateClass([
77
+ PrimaryKey({ type: "string", fieldName: "user_id" })
78
+ ], StorageUserState.prototype, "userId", 2);
79
+ __decorateClass([
80
+ Property({ type: "json" })
81
+ ], StorageUserState.prototype, "state", 2);
82
+ __decorateClass([
83
+ Property({
84
+ type: "datetime",
85
+ fieldName: "update_time",
86
+ onCreate: () => /* @__PURE__ */ new Date(),
87
+ onUpdate: () => /* @__PURE__ */ new Date()
88
+ })
89
+ ], StorageUserState.prototype, "updateTime", 2);
90
+ StorageUserState = __decorateClass([
91
+ Entity({ tableName: "user_states" })
92
+ ], StorageUserState);
93
+ PrimaryKey.name;
94
+ let StorageSession = class {
95
+ constructor() {
96
+ this.createTime = /* @__PURE__ */ new Date();
97
+ this.updateTime = /* @__PURE__ */ new Date();
98
+ }
99
+ };
100
+ __decorateClass([
101
+ PrimaryKey({ type: "string" })
102
+ ], StorageSession.prototype, "id", 2);
103
+ __decorateClass([
104
+ PrimaryKey({ type: "string", fieldName: "app_name" })
105
+ ], StorageSession.prototype, "appName", 2);
106
+ __decorateClass([
107
+ PrimaryKey({ type: "string", fieldName: "user_id" })
108
+ ], StorageSession.prototype, "userId", 2);
109
+ __decorateClass([
110
+ Property({ type: "json" })
111
+ ], StorageSession.prototype, "state", 2);
112
+ __decorateClass([
113
+ Property({
114
+ type: "datetime",
115
+ fieldName: "create_time",
116
+ onCreate: () => /* @__PURE__ */ new Date()
117
+ })
118
+ ], StorageSession.prototype, "createTime", 2);
119
+ __decorateClass([
120
+ Property({
121
+ type: "datetime",
122
+ fieldName: "update_time",
123
+ onCreate: () => /* @__PURE__ */ new Date()
124
+ })
125
+ ], StorageSession.prototype, "updateTime", 2);
126
+ StorageSession = __decorateClass([
127
+ Entity({ tableName: "sessions" })
128
+ ], StorageSession);
129
+ PrimaryKey.name;
130
+ let StorageEvent = class {
131
+ };
132
+ __decorateClass([
133
+ PrimaryKey({ type: "string" })
134
+ ], StorageEvent.prototype, "id", 2);
135
+ __decorateClass([
136
+ PrimaryKey({ type: "string", fieldName: "app_name" })
137
+ ], StorageEvent.prototype, "appName", 2);
138
+ __decorateClass([
139
+ PrimaryKey({ type: "string", fieldName: "user_id" })
140
+ ], StorageEvent.prototype, "userId", 2);
141
+ __decorateClass([
142
+ PrimaryKey({ type: "string", fieldName: "session_id" })
143
+ ], StorageEvent.prototype, "sessionId", 2);
144
+ __decorateClass([
145
+ Property({ type: "string", fieldName: "invocation_id" })
146
+ ], StorageEvent.prototype, "invocationId", 2);
147
+ __decorateClass([
148
+ Property({ type: "datetime" })
149
+ ], StorageEvent.prototype, "timestamp", 2);
150
+ __decorateClass([
151
+ Property({ type: CamelCaseToSnakeCaseJsonType, fieldName: "event_data" })
152
+ ], StorageEvent.prototype, "eventData", 2);
153
+ StorageEvent = __decorateClass([
154
+ Entity({ tableName: "events" })
155
+ ], StorageEvent);
156
+ const ENTITIES = [
157
+ StorageMetadata,
158
+ StorageAppState,
159
+ StorageUserState,
160
+ StorageSession,
161
+ StorageEvent
162
+ ];
163
+ export {
164
+ ENTITIES,
165
+ SCHEMA_VERSION_1_JSON,
166
+ SCHEMA_VERSION_KEY,
167
+ StorageAppState,
168
+ StorageEvent,
169
+ StorageMetadata,
170
+ StorageSession,
171
+ StorageUserState
172
+ };