@assistant-ui/react-google-adk 0.0.1

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 (81) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +156 -0
  3. package/dist/AdkClient.d.ts +45 -0
  4. package/dist/AdkClient.d.ts.map +1 -0
  5. package/dist/AdkClient.js +204 -0
  6. package/dist/AdkClient.js.map +1 -0
  7. package/dist/AdkEventAccumulator.d.ts +45 -0
  8. package/dist/AdkEventAccumulator.d.ts.map +1 -0
  9. package/dist/AdkEventAccumulator.js +508 -0
  10. package/dist/AdkEventAccumulator.js.map +1 -0
  11. package/dist/AdkSessionAdapter.d.ts +61 -0
  12. package/dist/AdkSessionAdapter.d.ts.map +1 -0
  13. package/dist/AdkSessionAdapter.js +159 -0
  14. package/dist/AdkSessionAdapter.js.map +1 -0
  15. package/dist/convertAdkMessages.d.ts +4 -0
  16. package/dist/convertAdkMessages.d.ts.map +1 -0
  17. package/dist/convertAdkMessages.js +75 -0
  18. package/dist/convertAdkMessages.js.map +1 -0
  19. package/dist/hooks.d.ts +50 -0
  20. package/dist/hooks.d.ts.map +1 -0
  21. package/dist/hooks.js +173 -0
  22. package/dist/hooks.js.map +1 -0
  23. package/dist/index.d.ts +11 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +10 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/server/adkEventStream.d.ts +42 -0
  28. package/dist/server/adkEventStream.d.ts.map +1 -0
  29. package/dist/server/adkEventStream.js +135 -0
  30. package/dist/server/adkEventStream.js.map +1 -0
  31. package/dist/server/createAdkApiRoute.d.ts +47 -0
  32. package/dist/server/createAdkApiRoute.d.ts.map +1 -0
  33. package/dist/server/createAdkApiRoute.js +41 -0
  34. package/dist/server/createAdkApiRoute.js.map +1 -0
  35. package/dist/server/index.d.ts +4 -0
  36. package/dist/server/index.d.ts.map +1 -0
  37. package/dist/server/index.js +4 -0
  38. package/dist/server/index.js.map +1 -0
  39. package/dist/server/parseAdkRequest.d.ts +56 -0
  40. package/dist/server/parseAdkRequest.d.ts.map +1 -0
  41. package/dist/server/parseAdkRequest.js +93 -0
  42. package/dist/server/parseAdkRequest.js.map +1 -0
  43. package/dist/structuredEvents.d.ts +7 -0
  44. package/dist/structuredEvents.d.ts.map +1 -0
  45. package/dist/structuredEvents.js +79 -0
  46. package/dist/structuredEvents.js.map +1 -0
  47. package/dist/types.d.ts +253 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +14 -0
  50. package/dist/types.js.map +1 -0
  51. package/dist/useAdkMessages.d.ts +28 -0
  52. package/dist/useAdkMessages.d.ts.map +1 -0
  53. package/dist/useAdkMessages.js +198 -0
  54. package/dist/useAdkMessages.js.map +1 -0
  55. package/dist/useAdkRuntime.d.ts +36 -0
  56. package/dist/useAdkRuntime.d.ts.map +1 -0
  57. package/dist/useAdkRuntime.js +252 -0
  58. package/dist/useAdkRuntime.js.map +1 -0
  59. package/package.json +83 -0
  60. package/server/package.json +4 -0
  61. package/src/AdkClient.test.ts +662 -0
  62. package/src/AdkClient.ts +274 -0
  63. package/src/AdkEventAccumulator.test.ts +591 -0
  64. package/src/AdkEventAccumulator.ts +602 -0
  65. package/src/AdkSessionAdapter.test.ts +362 -0
  66. package/src/AdkSessionAdapter.ts +245 -0
  67. package/src/convertAdkMessages.test.ts +209 -0
  68. package/src/convertAdkMessages.ts +93 -0
  69. package/src/hooks.ts +217 -0
  70. package/src/index.ts +66 -0
  71. package/src/server/adkEventStream.test.ts +78 -0
  72. package/src/server/adkEventStream.ts +161 -0
  73. package/src/server/createAdkApiRoute.test.ts +370 -0
  74. package/src/server/createAdkApiRoute.ts +86 -0
  75. package/src/server/index.ts +6 -0
  76. package/src/server/parseAdkRequest.test.ts +152 -0
  77. package/src/server/parseAdkRequest.ts +122 -0
  78. package/src/structuredEvents.ts +81 -0
  79. package/src/types.ts +265 -0
  80. package/src/useAdkMessages.ts +259 -0
  81. package/src/useAdkRuntime.ts +398 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 AgentbaseAI Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,156 @@
1
+ # @assistant-ui/react-google-adk
2
+
3
+ Google ADK (Agent Development Kit) adapter for [assistant-ui](https://www.assistant-ui.com/).
4
+
5
+ Connects Google ADK JS agents to assistant-ui's React runtime with streaming, tool calls, multi-agent support, tool confirmations, auth flows, and session state management.
6
+
7
+ ## Installation
8
+
9
+ ```sh
10
+ npm install @assistant-ui/react @assistant-ui/react-google-adk
11
+ ```
12
+
13
+ ## Quick Start
14
+
15
+ ### Proxy Mode (with a Next.js API Route)
16
+
17
+ **Server** (`app/api/adk/route.ts`):
18
+
19
+ ```typescript
20
+ import { createAdkApiRoute } from "@assistant-ui/react-google-adk/server";
21
+ import { runner } from "./agent";
22
+
23
+ export const POST = createAdkApiRoute({
24
+ runner,
25
+ userId: "default-user",
26
+ sessionId: (req) =>
27
+ new URL(req.url).searchParams.get("sessionId") ?? "default",
28
+ });
29
+ ```
30
+
31
+ **Client:**
32
+
33
+ ```tsx
34
+ import { useAdkRuntime, createAdkStream } from "@assistant-ui/react-google-adk";
35
+
36
+ const runtime = useAdkRuntime({
37
+ stream: createAdkStream({ api: "/api/adk" }),
38
+ });
39
+ ```
40
+
41
+ ### Direct Mode (connecting to an ADK server)
42
+
43
+ ```tsx
44
+ import {
45
+ useAdkRuntime,
46
+ createAdkStream,
47
+ createAdkSessionAdapter,
48
+ } from "@assistant-ui/react-google-adk";
49
+
50
+ const { adapter, load } = createAdkSessionAdapter({
51
+ apiUrl: "http://localhost:8000",
52
+ appName: "my-app",
53
+ userId: "user-1",
54
+ });
55
+
56
+ const runtime = useAdkRuntime({
57
+ stream: createAdkStream({
58
+ api: "http://localhost:8000",
59
+ appName: "my-app",
60
+ userId: "user-1",
61
+ }),
62
+ sessionAdapter: adapter,
63
+ load,
64
+ });
65
+ ```
66
+
67
+ ## API Reference
68
+
69
+ ### Client Exports
70
+
71
+ #### `createAdkStream(options)`
72
+
73
+ Creates an `AdkStreamCallback` that connects to an ADK endpoint via SSE.
74
+
75
+ | Option | Type | Description |
76
+ |--------|------|-------------|
77
+ | `api` | `string` | URL to POST to (proxy route or ADK server base URL) |
78
+ | `appName` | `string?` | ADK app name (enables direct mode when set) |
79
+ | `userId` | `string?` | ADK user ID (required with `appName`) |
80
+ | `headers` | `Record<string, string> \| (() => ...)` | Static or dynamic request headers |
81
+
82
+ #### `createAdkSessionAdapter(options)`
83
+
84
+ Creates a `RemoteThreadListAdapter` backed by ADK's session REST API.
85
+
86
+ Returns `{ adapter, load }` where `load` reconstructs messages from session events.
87
+
88
+ | Option | Type | Description |
89
+ |--------|------|-------------|
90
+ | `apiUrl` | `string` | ADK server base URL |
91
+ | `appName` | `string` | ADK app name |
92
+ | `userId` | `string` | ADK user ID |
93
+ | `headers` | `Record<string, string> \| (() => ...)` | Static or dynamic request headers |
94
+
95
+ #### `useAdkRuntime(options)`
96
+
97
+ Main hook that creates a full `AssistantRuntime`.
98
+
99
+ | Option | Type | Description |
100
+ |--------|------|-------------|
101
+ | `stream` | `AdkStreamCallback` | Stream callback (use `createAdkStream`) |
102
+ | `sessionAdapter` | `RemoteThreadListAdapter?` | Alternative to `cloud` for thread persistence |
103
+ | `cloud` | `AssistantCloud?` | Cloud adapter for thread persistence |
104
+ | `load` | `(threadId: string) => Promise<{messages}>` | Load thread history |
105
+ | `autoCancelPendingToolCalls` | `boolean?` | Auto-cancel pending tools on new message (default: true) |
106
+ | `unstable_allowCancellation` | `boolean?` | Enable stream cancellation |
107
+ | `getCheckpointId` | `(threadId, messages) => Promise<string?>` | Enable edit/reload |
108
+ | `adapters` | `{attachments?, speech?, feedback?}` | Optional adapters |
109
+ | `eventHandlers` | `{onError?, onCustomEvent?, onAgentTransfer?}` | Event callbacks |
110
+
111
+ ### Hooks
112
+
113
+ | Hook | Description |
114
+ |------|-------------|
115
+ | `useAdkAgentInfo()` | Current agent name and branch path |
116
+ | `useAdkSessionState()` | Accumulated session state delta |
117
+ | `useAdkSend()` | Send raw ADK messages |
118
+ | `useAdkLongRunningToolIds()` | Pending tool IDs awaiting input |
119
+ | `useAdkToolConfirmations()` | Tool confirmation requests |
120
+ | `useAdkAuthRequests()` | Auth credential requests |
121
+ | `useAdkArtifacts()` | Artifact delta (filename → version) |
122
+ | `useAdkEscalation()` | Escalation flag |
123
+ | `useAdkMessageMetadata()` | Per-message grounding/citation/usage |
124
+
125
+ ### Server Exports (`/server`)
126
+
127
+ #### `createAdkApiRoute(options)`
128
+
129
+ One-liner API route handler combining request parsing and SSE streaming.
130
+
131
+ | Option | Type | Description |
132
+ |--------|------|-------------|
133
+ | `runner` | `AdkRunner` | ADK Runner instance |
134
+ | `userId` | `string \| (req) => string` | Static or dynamic user ID |
135
+ | `sessionId` | `string \| (req) => string` | Static or dynamic session ID |
136
+ | `onError` | `(error) => void` | Error handler |
137
+
138
+ #### `adkEventStream(events, options?)`
139
+
140
+ Converts an ADK event async generator into an SSE `Response`.
141
+
142
+ #### `parseAdkRequest(request)`
143
+
144
+ Parses an incoming HTTP request into a structured ADK request.
145
+
146
+ #### `toAdkContent(parsed)`
147
+
148
+ Converts a parsed request into a Google GenAI `Content` object.
149
+
150
+ ## Documentation
151
+
152
+ See the [full documentation](https://www.assistant-ui.com/docs/runtimes/google-adk) for setup guides, advanced APIs, and examples.
153
+
154
+ ## License
155
+
156
+ MIT
@@ -0,0 +1,45 @@
1
+ import type { AdkStreamCallback } from "./types.js";
2
+ export type CreateAdkStreamOptions = {
3
+ /**
4
+ * URL to POST to. Either a proxy route (e.g. "/api/adk") or
5
+ * an ADK server base URL (e.g. "http://localhost:8000").
6
+ *
7
+ * When `appName` and `userId` are provided, POSTs to `${api}/run_sse`
8
+ * in ADK-native format. Otherwise POSTs directly to `api` in proxy format
9
+ * (compatible with `parseAdkRequest`).
10
+ */
11
+ api: string;
12
+ /**
13
+ * ADK application name. When provided along with `userId`,
14
+ * enables direct connection to an ADK server.
15
+ */
16
+ appName?: string | undefined;
17
+ /**
18
+ * ADK user ID. Required when `appName` is provided.
19
+ */
20
+ userId?: string | undefined;
21
+ /**
22
+ * Extra headers to send with every request.
23
+ * Can be a static object or an async function for dynamic auth tokens.
24
+ */
25
+ headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>) | undefined;
26
+ };
27
+ /**
28
+ * Creates an `AdkStreamCallback` that connects to an ADK endpoint.
29
+ *
30
+ * @example Proxy mode (with a Next.js API route)
31
+ * ```ts
32
+ * const stream = createAdkStream({ api: "/api/adk" });
33
+ * ```
34
+ *
35
+ * @example Direct mode (connecting to ADK server)
36
+ * ```ts
37
+ * const stream = createAdkStream({
38
+ * api: "http://localhost:8000",
39
+ * appName: "my-app",
40
+ * userId: "user-1",
41
+ * });
42
+ * ```
43
+ */
44
+ export declare function createAdkStream(options: CreateAdkStreamOptions): AdkStreamCallback;
45
+ //# sourceMappingURL=AdkClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdkClient.d.ts","sourceRoot":"","sources":["../src/AdkClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,iBAAiB,EAClB,mBAAgB;AAEjB,MAAM,MAAM,sBAAsB,GAAG;IACnC;;;;;;;OAOG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE5B;;;OAGG;IACH,OAAO,CAAC,EACJ,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtB,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAChE,SAAS,CAAC;CACf,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,sBAAsB,GAC9B,iBAAiB,CA0CnB"}
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Creates an `AdkStreamCallback` that connects to an ADK endpoint.
3
+ *
4
+ * @example Proxy mode (with a Next.js API route)
5
+ * ```ts
6
+ * const stream = createAdkStream({ api: "/api/adk" });
7
+ * ```
8
+ *
9
+ * @example Direct mode (connecting to ADK server)
10
+ * ```ts
11
+ * const stream = createAdkStream({
12
+ * api: "http://localhost:8000",
13
+ * appName: "my-app",
14
+ * userId: "user-1",
15
+ * });
16
+ * ```
17
+ */
18
+ export function createAdkStream(options) {
19
+ const isDirect = options.appName != null;
20
+ return async function* (messages, config) {
21
+ const headers = await resolveHeaders(options.headers);
22
+ let url;
23
+ let body;
24
+ if (isDirect) {
25
+ // Direct mode: POST to ADK server's /run_sse
26
+ url = `${options.api}/run_sse`;
27
+ const { externalId } = await config.initialize();
28
+ body = {
29
+ appName: options.appName,
30
+ userId: options.userId,
31
+ sessionId: externalId,
32
+ newMessage: messagesToContent(messages),
33
+ streaming: true,
34
+ ...(config.stateDelta != null && { stateDelta: config.stateDelta }),
35
+ };
36
+ }
37
+ else {
38
+ // Proxy mode: POST in parseAdkRequest-compatible format
39
+ url = options.api;
40
+ body = messagesToProxyBody(messages, config);
41
+ }
42
+ const response = await fetch(url, {
43
+ method: "POST",
44
+ headers: { "Content-Type": "application/json", ...headers },
45
+ body: JSON.stringify(body),
46
+ signal: config.abortSignal,
47
+ });
48
+ if (!response.ok) {
49
+ throw new Error(`ADK request failed: ${response.status} ${response.statusText}`);
50
+ }
51
+ yield* parseSSEResponse(response);
52
+ };
53
+ }
54
+ // ── Internal helpers ──
55
+ async function resolveHeaders(headers) {
56
+ if (!headers)
57
+ return {};
58
+ if (typeof headers === "function")
59
+ return await headers();
60
+ return headers;
61
+ }
62
+ /**
63
+ * Converts AdkMessage[] (new messages) into ADK Content format
64
+ * for the direct `/run_sse` endpoint.
65
+ */
66
+ function messagesToContent(messages) {
67
+ const parts = [];
68
+ for (const msg of messages) {
69
+ if (msg.type === "human") {
70
+ for (const part of contentToParts(msg.content)) {
71
+ parts.push(part);
72
+ }
73
+ }
74
+ else if (msg.type === "tool") {
75
+ let response;
76
+ try {
77
+ response = JSON.parse(msg.content);
78
+ }
79
+ catch {
80
+ response = msg.content;
81
+ }
82
+ parts.push({
83
+ functionResponse: {
84
+ name: msg.name,
85
+ id: msg.tool_call_id,
86
+ response,
87
+ },
88
+ });
89
+ }
90
+ }
91
+ if (parts.length === 0) {
92
+ parts.push({ text: "" });
93
+ }
94
+ return { role: "user", parts };
95
+ }
96
+ /**
97
+ * Converts AdkMessage[] into the proxy request body format
98
+ * (compatible with `parseAdkRequest`).
99
+ */
100
+ function messagesToProxyBody(messages, config) {
101
+ const body = {};
102
+ if (config.runConfig != null)
103
+ body.runConfig = config.runConfig;
104
+ if (config.checkpointId != null)
105
+ body.checkpointId = config.checkpointId;
106
+ if (config.stateDelta != null)
107
+ body.stateDelta = config.stateDelta;
108
+ // Check if there's a tool result
109
+ const toolMsg = messages.find((m) => m.type === "tool");
110
+ if (toolMsg && toolMsg.type === "tool") {
111
+ // If there are also other messages (e.g. cancellations), send as parts
112
+ if (messages.length > 1) {
113
+ body.parts = messagesToContent(messages).parts;
114
+ return body;
115
+ }
116
+ let result;
117
+ try {
118
+ result = JSON.parse(toolMsg.content);
119
+ }
120
+ catch {
121
+ result = toolMsg.content;
122
+ }
123
+ body.type = "tool-result";
124
+ body.toolCallId = toolMsg.tool_call_id;
125
+ body.toolName = toolMsg.name;
126
+ body.result = result;
127
+ body.isError = toolMsg.status === "error";
128
+ return body;
129
+ }
130
+ // Human message(s) - possibly with cancellation tool results prepended
131
+ if (messages.length === 1 && messages[0].type === "human") {
132
+ const msg = messages[0];
133
+ if (typeof msg.content === "string") {
134
+ body.message = msg.content;
135
+ }
136
+ else {
137
+ body.parts = contentToParts(msg.content);
138
+ }
139
+ return body;
140
+ }
141
+ // Multiple messages (e.g. cancellations + human): send as parts array
142
+ body.parts = messagesToContent(messages).parts;
143
+ return body;
144
+ }
145
+ function contentToParts(content) {
146
+ if (typeof content === "string")
147
+ return [{ text: content }];
148
+ return content.map((part) => {
149
+ switch (part.type) {
150
+ case "text":
151
+ return { text: part.text };
152
+ case "reasoning":
153
+ return { text: part.text, thought: true };
154
+ case "image":
155
+ return { inlineData: { mimeType: part.mimeType, data: part.data } };
156
+ case "image_url":
157
+ return { fileData: { fileUri: part.url } };
158
+ case "code":
159
+ return {
160
+ executableCode: { code: part.code, language: part.language },
161
+ };
162
+ case "code_result":
163
+ return {
164
+ codeExecutionResult: { output: part.output, outcome: part.outcome },
165
+ };
166
+ default:
167
+ return { text: "" };
168
+ }
169
+ });
170
+ }
171
+ async function* parseSSEResponse(response) {
172
+ const reader = response.body.getReader();
173
+ const decoder = new TextDecoder();
174
+ let buffer = "";
175
+ try {
176
+ while (true) {
177
+ const { done, value } = await reader.read();
178
+ if (done)
179
+ break;
180
+ buffer += decoder.decode(value, { stream: true });
181
+ const parts = buffer.split("\n\n");
182
+ buffer = parts.pop() ?? "";
183
+ for (const part of parts) {
184
+ for (const line of part.split("\n")) {
185
+ if (line.startsWith("data: ")) {
186
+ yield JSON.parse(line.slice(6));
187
+ }
188
+ }
189
+ }
190
+ }
191
+ // Handle remaining buffer
192
+ if (buffer.trim()) {
193
+ for (const line of buffer.split("\n")) {
194
+ if (line.startsWith("data: ")) {
195
+ yield JSON.parse(line.slice(6));
196
+ }
197
+ }
198
+ }
199
+ }
200
+ finally {
201
+ reader.releaseLock();
202
+ }
203
+ }
204
+ //# sourceMappingURL=AdkClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdkClient.js","sourceRoot":"","sources":["../src/AdkClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { AdkEvent, AdkMessage, AdkToolConfirmation, AdkAuthRequest, AdkMessageMetadata } from "./types.js";
2
+ /**
3
+ * Checks if an event is a final response using the same logic as ADK's
4
+ * `isFinalResponse()`.
5
+ */
6
+ export declare const isFinalResponse: (event: AdkEvent) => boolean;
7
+ export declare class AdkEventAccumulator {
8
+ private messagesMap;
9
+ private currentMessageId;
10
+ private partialTextBuffer;
11
+ private partialReasoningBuffer;
12
+ private accumulatedStateDelta;
13
+ private accumulatedArtifactDelta;
14
+ private lastAgentInfo;
15
+ private lastTransferToAgent;
16
+ private pendingLongRunningToolIds;
17
+ private toolConfirmations;
18
+ private authRequests;
19
+ private escalated;
20
+ private messageMetadataMap;
21
+ constructor(initialMessages?: AdkMessage[]);
22
+ processEvent(rawEvent: AdkEvent): AdkMessage[];
23
+ private processPart;
24
+ private trackMessageMetadata;
25
+ private getContentArray;
26
+ private getOrCreateAiMessage;
27
+ private appendContent;
28
+ private replaceLastTextContent;
29
+ private replaceLastReasoningContent;
30
+ private finalizeCurrentMessage;
31
+ getMessages(): AdkMessage[];
32
+ getStateDelta(): Record<string, unknown>;
33
+ getArtifactDelta(): Record<string, number>;
34
+ getAgentInfo(): {
35
+ name?: string | undefined;
36
+ branch?: string | undefined;
37
+ };
38
+ getLastTransferToAgent(): string | undefined;
39
+ getLongRunningToolIds(): string[];
40
+ getToolConfirmations(): AdkToolConfirmation[];
41
+ getAuthRequests(): AdkAuthRequest[];
42
+ isEscalated(): boolean;
43
+ getMessageMetadata(): Map<string, AdkMessageMetadata>;
44
+ }
45
+ //# sourceMappingURL=AdkEventAccumulator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdkEventAccumulator.d.ts","sourceRoot":"","sources":["../src/AdkEventAccumulator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,QAAQ,EAER,UAAU,EAGV,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EACnB,mBAAgB;AAQjB;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,QAAQ,KAAG,OAgBjD,CAAC;AAqHF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,iBAAiB,CAAM;IAC/B,OAAO,CAAC,sBAAsB,CAAM;IACpC,OAAO,CAAC,qBAAqB,CAA+B;IAC5D,OAAO,CAAC,wBAAwB,CAA8B;IAC9D,OAAO,CAAC,aAAa,CAGd;IACP,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,yBAAyB,CAAgB;IACjD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,kBAAkB,CAAyC;gBACvD,eAAe,CAAC,EAAE,UAAU,EAAE;IAQ1C,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,UAAU,EAAE;IA8I9C,OAAO,CAAC,WAAW;IAqJnB,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,oBAAoB;IAuB5B,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,2BAA2B;IAenC,OAAO,CAAC,sBAAsB;IAM9B,WAAW,IAAI,UAAU,EAAE;IAI3B,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIxC,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAI1C,YAAY,IAAI;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE;IAI1E,sBAAsB,IAAI,MAAM,GAAG,SAAS;IAI5C,qBAAqB,IAAI,MAAM,EAAE;IAIjC,oBAAoB,IAAI,mBAAmB,EAAE;IAI7C,eAAe,IAAI,cAAc,EAAE;IAInC,WAAW,IAAI,OAAO;IAItB,kBAAkB,IAAI,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC;CAGtD"}