@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
@@ -0,0 +1,135 @@
1
+ const convertSdkPart = (part) => {
2
+ const result = {};
3
+ if ("text" in part && typeof part.text === "string")
4
+ result.text = part.text;
5
+ if ("thought" in part && typeof part.thought === "boolean")
6
+ result.thought = part.thought;
7
+ if ("functionCall" in part && part.functionCall)
8
+ result.functionCall = part.functionCall;
9
+ if ("functionResponse" in part && part.functionResponse)
10
+ result.functionResponse = part.functionResponse;
11
+ if ("executableCode" in part && part.executableCode)
12
+ result.executableCode = part.executableCode;
13
+ if ("codeExecutionResult" in part && part.codeExecutionResult)
14
+ result.codeExecutionResult = part.codeExecutionResult;
15
+ if ("inlineData" in part && part.inlineData)
16
+ result.inlineData = part.inlineData;
17
+ if ("fileData" in part && part.fileData)
18
+ result.fileData = part.fileData;
19
+ return result;
20
+ };
21
+ const convertSdkActions = (actions) => {
22
+ const result = {};
23
+ if (actions.stateDelta != null)
24
+ result.stateDelta = actions.stateDelta;
25
+ if (actions.artifactDelta != null)
26
+ result.artifactDelta = actions.artifactDelta;
27
+ if (actions.transferToAgent != null)
28
+ result.transferToAgent = actions.transferToAgent;
29
+ if (actions.escalate != null)
30
+ result.escalate = actions.escalate;
31
+ if (actions.skipSummarization != null)
32
+ result.skipSummarization = actions.skipSummarization;
33
+ if (actions.requestedAuthConfigs != null)
34
+ result.requestedAuthConfigs = actions.requestedAuthConfigs;
35
+ if (actions.requestedToolConfirmations != null)
36
+ result.requestedToolConfirmations = actions.requestedToolConfirmations;
37
+ return result;
38
+ };
39
+ const convertSdkEvent = (event) => {
40
+ const result = { id: event.id ?? "" };
41
+ if (event.invocationId != null)
42
+ result.invocationId = event.invocationId;
43
+ if (event.author != null)
44
+ result.author = event.author;
45
+ if (event.branch != null)
46
+ result.branch = event.branch;
47
+ if (event.partial != null)
48
+ result.partial = event.partial;
49
+ if (event.turnComplete != null)
50
+ result.turnComplete = event.turnComplete;
51
+ if (event.interrupted != null)
52
+ result.interrupted = event.interrupted;
53
+ if (event.finishReason != null)
54
+ result.finishReason = event.finishReason;
55
+ if (event.timestamp != null)
56
+ result.timestamp = event.timestamp;
57
+ if (event.content) {
58
+ const content = {};
59
+ if (event.content.role != null)
60
+ content.role = event.content.role;
61
+ if (event.content.parts)
62
+ content.parts = event.content.parts.map(convertSdkPart);
63
+ result.content = content;
64
+ }
65
+ if (event.actions)
66
+ result.actions = convertSdkActions(event.actions);
67
+ if (event.longRunningToolIds)
68
+ result.longRunningToolIds = event.longRunningToolIds;
69
+ if (event.errorCode != null)
70
+ result.errorCode = event.errorCode;
71
+ if (event.errorMessage != null)
72
+ result.errorMessage = event.errorMessage;
73
+ if (event.groundingMetadata != null)
74
+ result.groundingMetadata = event.groundingMetadata;
75
+ if (event.citationMetadata != null)
76
+ result.citationMetadata = event.citationMetadata;
77
+ if (event.usageMetadata != null)
78
+ result.usageMetadata = event.usageMetadata;
79
+ if (event.customMetadata != null)
80
+ result.customMetadata = event.customMetadata;
81
+ return result;
82
+ };
83
+ /**
84
+ * Converts an AsyncGenerator of ADK SDK Events into an SSE Response.
85
+ *
86
+ * @example
87
+ * ```ts
88
+ * import { adkEventStream } from '@assistant-ui/react-google-adk/server';
89
+ * const events = runner.runAsync({ userId, sessionId, newMessage });
90
+ * return adkEventStream(events);
91
+ * ```
92
+ */
93
+ export const adkEventStream = (events, options) => {
94
+ const encoder = new TextEncoder();
95
+ let cancelled = false;
96
+ const stream = new ReadableStream({
97
+ async start(controller) {
98
+ // Initial SSE comment to keep connection alive through proxies
99
+ controller.enqueue(encoder.encode(":ok\n\n"));
100
+ try {
101
+ for await (const event of events) {
102
+ if (cancelled)
103
+ break;
104
+ const wireEvent = convertSdkEvent(event);
105
+ controller.enqueue(encoder.encode(`data: ${JSON.stringify(wireEvent)}\n\n`));
106
+ }
107
+ }
108
+ catch (e) {
109
+ if (!cancelled) {
110
+ options?.onError?.(e);
111
+ const errorEvent = {
112
+ id: "",
113
+ errorCode: "STREAM_ERROR",
114
+ errorMessage: e instanceof Error ? e.message : "Unknown stream error",
115
+ };
116
+ controller.enqueue(encoder.encode(`data: ${JSON.stringify(errorEvent)}\n\n`));
117
+ }
118
+ }
119
+ finally {
120
+ controller.close();
121
+ }
122
+ },
123
+ async cancel() {
124
+ cancelled = true;
125
+ await events.return?.(undefined);
126
+ },
127
+ });
128
+ return new Response(stream, {
129
+ headers: {
130
+ "Content-Type": "text/event-stream",
131
+ "Cache-Control": "no-cache",
132
+ },
133
+ });
134
+ };
135
+ //# sourceMappingURL=adkEventStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adkEventStream.js","sourceRoot":"","sources":["../../src/server/adkEventStream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { type AdkEventStreamOptions } from "./adkEventStream.js";
2
+ /**
3
+ * Loose runner type matching the ADK SDK's Runner interface.
4
+ * Avoids requiring `@google/adk` as a dependency.
5
+ */
6
+ type AdkRunner = {
7
+ runAsync(options: Record<string, unknown>): AsyncGenerator<any, void, undefined>;
8
+ };
9
+ export type CreateAdkApiRouteOptions = {
10
+ /**
11
+ * ADK Runner instance.
12
+ */
13
+ runner: AdkRunner;
14
+ /**
15
+ * User ID to use for the ADK session. Can be a static string
16
+ * or a function that extracts it from the request.
17
+ */
18
+ userId: string | ((req: Request) => string | Promise<string>);
19
+ /**
20
+ * Session ID to use. Can be a static string or a function
21
+ * that extracts it from the request (e.g. from query params or headers).
22
+ */
23
+ sessionId: string | ((req: Request) => string | Promise<string>);
24
+ /**
25
+ * Error handler for stream errors.
26
+ */
27
+ onError?: AdkEventStreamOptions["onError"];
28
+ };
29
+ /**
30
+ * Creates a request handler that combines `parseAdkRequest`, `toAdkContent`,
31
+ * and `adkEventStream` into a single function.
32
+ *
33
+ * @example Next.js App Router
34
+ * ```ts
35
+ * import { createAdkApiRoute } from '@assistant-ui/react-google-adk/server';
36
+ * import { runner } from './agent';
37
+ *
38
+ * export const POST = createAdkApiRoute({
39
+ * runner,
40
+ * userId: "default-user",
41
+ * sessionId: (req) => new URL(req.url).searchParams.get("sessionId") ?? "default",
42
+ * });
43
+ * ```
44
+ */
45
+ export declare function createAdkApiRoute(options: CreateAdkApiRouteOptions): (req: Request) => Promise<Response>;
46
+ export {};
47
+ //# sourceMappingURL=createAdkApiRoute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createAdkApiRoute.d.ts","sourceRoot":"","sources":["../../src/server/createAdkApiRoute.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,qBAAqB,EAAE,4BAAyB;AAE9E;;;GAGG;AACH,KAAK,SAAS,GAAG;IACf,QAAQ,CACN,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC;;OAEG;IACH,MAAM,EAAE,SAAS,CAAC;IAElB;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9D;;;OAGG;IACH,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjE;;OAEG;IACH,OAAO,CAAC,EAAE,qBAAqB,CAAC,SAAS,CAAC,CAAC;CAC5C,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,wBAAwB,GAChC,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CA8BrC"}
@@ -0,0 +1,41 @@
1
+ import { parseAdkRequest, toAdkContent } from "./parseAdkRequest.js";
2
+ import { adkEventStream } from "./adkEventStream.js";
3
+ /**
4
+ * Creates a request handler that combines `parseAdkRequest`, `toAdkContent`,
5
+ * and `adkEventStream` into a single function.
6
+ *
7
+ * @example Next.js App Router
8
+ * ```ts
9
+ * import { createAdkApiRoute } from '@assistant-ui/react-google-adk/server';
10
+ * import { runner } from './agent';
11
+ *
12
+ * export const POST = createAdkApiRoute({
13
+ * runner,
14
+ * userId: "default-user",
15
+ * sessionId: (req) => new URL(req.url).searchParams.get("sessionId") ?? "default",
16
+ * });
17
+ * ```
18
+ */
19
+ export function createAdkApiRoute(options) {
20
+ return async (req) => {
21
+ const parsed = await parseAdkRequest(req);
22
+ const newMessage = toAdkContent(parsed);
23
+ const userId = typeof options.userId === "function"
24
+ ? await options.userId(req)
25
+ : options.userId;
26
+ const sessionId = typeof options.sessionId === "function"
27
+ ? await options.sessionId(req)
28
+ : options.sessionId;
29
+ const events = options.runner.runAsync({
30
+ userId,
31
+ sessionId,
32
+ newMessage,
33
+ ...(parsed.stateDelta != null && { stateDelta: parsed.stateDelta }),
34
+ ...(parsed.config.runConfig != null && {
35
+ runConfig: parsed.config.runConfig,
36
+ }),
37
+ });
38
+ return adkEventStream(events, options.onError ? { onError: options.onError } : undefined);
39
+ };
40
+ }
41
+ //# sourceMappingURL=createAdkApiRoute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createAdkApiRoute.js","sourceRoot":"","sources":["../../src/server/createAdkApiRoute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,6BAA0B;AAClE,OAAO,EAAE,cAAc,EAA8B,4BAAyB;AAoC9E;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAiC;IAEjC,OAAO,KAAK,EAAE,GAAY,EAAqB,EAAE;QAC/C,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAExC,MAAM,MAAM,GACV,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU;YAClC,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;YAC3B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QAErB,MAAM,SAAS,GACb,OAAO,OAAO,CAAC,SAAS,KAAK,UAAU;YACrC,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC;YAC9B,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QAExB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;YACrC,MAAM;YACN,SAAS;YACT,UAAU;YACV,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;YACnE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,IAAI;gBACrC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS;aACnC,CAAC;SACH,CAAC,CAAC;QAEH,OAAO,cAAc,CACnB,MAAM,EACN,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAC3D,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { adkEventStream, type AdkEventStreamOptions } from "./adkEventStream.js";
2
+ export { parseAdkRequest, toAdkContent } from "./parseAdkRequest.js";
3
+ export { createAdkApiRoute, type CreateAdkApiRouteOptions, } from "./createAdkApiRoute.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,4BAAyB;AAC9E,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,6BAA0B;AAClE,OAAO,EACL,iBAAiB,EACjB,KAAK,wBAAwB,GAC9B,+BAA4B"}
@@ -0,0 +1,4 @@
1
+ export { adkEventStream } from "./adkEventStream.js";
2
+ export { parseAdkRequest, toAdkContent } from "./parseAdkRequest.js";
3
+ export { createAdkApiRoute, } from "./createAdkApiRoute.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA8B,4BAAyB;AAC9E,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,6BAA0B;AAClE,OAAO,EACL,iBAAiB,GAElB,+BAA4B"}
@@ -0,0 +1,56 @@
1
+ import type { AdkSendMessageConfig } from "../types.js";
2
+ type ParsedAdkRequest = {
3
+ type: "message";
4
+ text: string;
5
+ parts?: Array<Record<string, unknown>> | undefined;
6
+ config: AdkSendMessageConfig;
7
+ stateDelta?: Record<string, unknown> | undefined;
8
+ } | {
9
+ type: "tool-result";
10
+ toolCallId: string;
11
+ toolName: string;
12
+ result: unknown;
13
+ isError: boolean;
14
+ config: AdkSendMessageConfig;
15
+ stateDelta?: Record<string, unknown> | undefined;
16
+ };
17
+ /**
18
+ * Parses an incoming HTTP request into a structured ADK request.
19
+ *
20
+ * Supports two request shapes:
21
+ *
22
+ * 1. User message:
23
+ * ```json
24
+ * { "message": "Hello", "runConfig": {}, "stateDelta": {} }
25
+ * ```
26
+ *
27
+ * 2. Tool result:
28
+ * ```json
29
+ * {
30
+ * "type": "tool-result",
31
+ * "toolCallId": "call_123",
32
+ * "toolName": "search",
33
+ * "result": { ... },
34
+ * "isError": false
35
+ * }
36
+ * ```
37
+ */
38
+ export declare const parseAdkRequest: (request: Request) => Promise<ParsedAdkRequest>;
39
+ /**
40
+ * Converts a parsed ADK request into a Google GenAI Content object
41
+ * suitable for `Runner.runAsync({ newMessage })`.
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * const parsed = await parseAdkRequest(req);
46
+ * const newMessage = toAdkContent(parsed);
47
+ * const events = runner.runAsync({ userId, sessionId, newMessage, stateDelta: parsed.stateDelta });
48
+ * return adkEventStream(events);
49
+ * ```
50
+ */
51
+ export declare const toAdkContent: (parsed: ParsedAdkRequest) => {
52
+ role: string;
53
+ parts: Array<Record<string, unknown>>;
54
+ };
55
+ export {};
56
+ //# sourceMappingURL=parseAdkRequest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseAdkRequest.d.ts","sourceRoot":"","sources":["../../src/server/parseAdkRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAiB;AAErD,KAAK,gBAAgB,GACjB;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IACnD,MAAM,EAAE,oBAAoB,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;CAClD,GACD;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;CAClD,CAAC;AAEN;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,eAAe,GAC1B,SAAS,OAAO,KACf,OAAO,CAAC,gBAAgB,CAwC1B,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,GACvB,QAAQ,gBAAgB,KACvB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAsBvD,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Parses an incoming HTTP request into a structured ADK request.
3
+ *
4
+ * Supports two request shapes:
5
+ *
6
+ * 1. User message:
7
+ * ```json
8
+ * { "message": "Hello", "runConfig": {}, "stateDelta": {} }
9
+ * ```
10
+ *
11
+ * 2. Tool result:
12
+ * ```json
13
+ * {
14
+ * "type": "tool-result",
15
+ * "toolCallId": "call_123",
16
+ * "toolName": "search",
17
+ * "result": { ... },
18
+ * "isError": false
19
+ * }
20
+ * ```
21
+ */
22
+ export const parseAdkRequest = async (request) => {
23
+ let body;
24
+ try {
25
+ body = (await request.json());
26
+ }
27
+ catch {
28
+ throw new Error("Invalid JSON in request body");
29
+ }
30
+ if (!body || typeof body !== "object" || Array.isArray(body)) {
31
+ throw new Error("Request body must be a JSON object");
32
+ }
33
+ const config = {};
34
+ if (body.runConfig !== undefined)
35
+ config.runConfig = body.runConfig;
36
+ if (body.checkpointId !== undefined)
37
+ config.checkpointId = body.checkpointId;
38
+ const stateDelta = body.stateDelta;
39
+ if (body.type === "tool-result") {
40
+ return {
41
+ type: "tool-result",
42
+ toolCallId: body.toolCallId ?? "",
43
+ toolName: body.toolName ?? "",
44
+ result: body.result,
45
+ isError: body.isError ?? false,
46
+ config,
47
+ ...(stateDelta != null && { stateDelta }),
48
+ };
49
+ }
50
+ return {
51
+ type: "message",
52
+ text: body.message ?? "",
53
+ ...(body.parts != null && {
54
+ parts: body.parts,
55
+ }),
56
+ config,
57
+ ...(stateDelta != null && { stateDelta }),
58
+ };
59
+ };
60
+ /**
61
+ * Converts a parsed ADK request into a Google GenAI Content object
62
+ * suitable for `Runner.runAsync({ newMessage })`.
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * const parsed = await parseAdkRequest(req);
67
+ * const newMessage = toAdkContent(parsed);
68
+ * const events = runner.runAsync({ userId, sessionId, newMessage, stateDelta: parsed.stateDelta });
69
+ * return adkEventStream(events);
70
+ * ```
71
+ */
72
+ export const toAdkContent = (parsed) => {
73
+ if (parsed.type === "tool-result") {
74
+ return {
75
+ role: "user",
76
+ parts: [
77
+ {
78
+ functionResponse: {
79
+ name: parsed.toolName,
80
+ id: parsed.toolCallId,
81
+ response: parsed.result,
82
+ },
83
+ },
84
+ ],
85
+ };
86
+ }
87
+ // If raw parts are provided (multimodal), use them directly
88
+ if (parsed.parts?.length) {
89
+ return { role: "user", parts: parsed.parts };
90
+ }
91
+ return { role: "user", parts: [{ text: parsed.text }] };
92
+ };
93
+ //# sourceMappingURL=parseAdkRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseAdkRequest.js","sourceRoot":"","sources":["../../src/server/parseAdkRequest.ts"],"names":[],"mappings":"AAoBA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,OAAgB,EACW,EAAE;IAC7B,IAAI,IAA6B,CAAC;IAClC,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAA4B,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACpE,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;QACjC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,YAAsB,CAAC;IAEpD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAiD,CAAC;IAE1E,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAChC,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,UAAU,EAAG,IAAI,CAAC,UAAqB,IAAI,EAAE;YAC7C,QAAQ,EAAG,IAAI,CAAC,QAAmB,IAAI,EAAE;YACzC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAG,IAAI,CAAC,OAAmB,IAAI,KAAK;YAC3C,MAAM;YACN,GAAG,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE,UAAU,EAAE,CAAC;SAC1C,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAG,IAAI,CAAC,OAAkB,IAAI,EAAE;QACpC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI;YACxB,KAAK,EAAE,IAAI,CAAC,KAAuC;SACpD,CAAC;QACF,MAAM;QACN,GAAG,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE,UAAU,EAAE,CAAC;KAC1C,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,MAAwB,EACiC,EAAE;IAC3D,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAClC,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE;gBACL;oBACE,gBAAgB,EAAE;wBAChB,IAAI,EAAE,MAAM,CAAC,QAAQ;wBACrB,EAAE,EAAE,MAAM,CAAC,UAAU;wBACrB,QAAQ,EAAE,MAAM,CAAC,MAAM;qBACxB;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAED,4DAA4D;IAC5D,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IAC/C,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;AAC1D,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { AdkEvent, AdkStructuredEvent } from "./types.js";
2
+ /**
3
+ * Converts a raw `AdkEvent` into an array of structured, typed events.
4
+ * Useful for building custom event renderers.
5
+ */
6
+ export declare function toAdkStructuredEvents(event: AdkEvent): AdkStructuredEvent[];
7
+ //# sourceMappingURL=structuredEvents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structuredEvents.d.ts","sourceRoot":"","sources":["../src/structuredEvents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,mBAAgB;AAG5D;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,QAAQ,GAAG,kBAAkB,EAAE,CAyE3E"}
@@ -0,0 +1,79 @@
1
+ import { isFinalResponse } from "./AdkEventAccumulator.js";
2
+ /**
3
+ * Converts a raw `AdkEvent` into an array of structured, typed events.
4
+ * Useful for building custom event renderers.
5
+ */
6
+ export function toAdkStructuredEvents(event) {
7
+ const result = [];
8
+ if (event.errorCode || event.errorMessage) {
9
+ const err = { type: "error" };
10
+ if (event.errorCode != null)
11
+ err.errorCode = event.errorCode;
12
+ if (event.errorMessage != null)
13
+ err.errorMessage = event.errorMessage;
14
+ result.push(err);
15
+ }
16
+ const parts = event.content?.parts;
17
+ if (parts) {
18
+ for (const part of parts) {
19
+ if (part.text != null) {
20
+ if (part.thought) {
21
+ result.push({ type: "thought", content: part.text });
22
+ }
23
+ else {
24
+ result.push({ type: "content", content: part.text });
25
+ }
26
+ }
27
+ if (part.functionCall) {
28
+ const call = {
29
+ type: "tool_call",
30
+ call: { name: part.functionCall.name, args: part.functionCall.args },
31
+ };
32
+ if (part.functionCall.id != null)
33
+ call.call.id = part.functionCall.id;
34
+ result.push(call);
35
+ }
36
+ if (part.functionResponse) {
37
+ const tr = {
38
+ type: "tool_result",
39
+ result: {
40
+ name: part.functionResponse.name,
41
+ response: part.functionResponse.response,
42
+ },
43
+ };
44
+ if (part.functionResponse.id != null)
45
+ tr.result.id = part.functionResponse.id;
46
+ result.push(tr);
47
+ }
48
+ if (part.executableCode) {
49
+ const ce = {
50
+ type: "call_code",
51
+ code: { code: part.executableCode.code },
52
+ };
53
+ if (part.executableCode.language != null)
54
+ ce.code.language = part.executableCode.language;
55
+ result.push(ce);
56
+ }
57
+ if (part.codeExecutionResult) {
58
+ const cr = {
59
+ type: "code_result",
60
+ result: { output: part.codeExecutionResult.output },
61
+ };
62
+ if (part.codeExecutionResult.outcome != null)
63
+ cr.result.outcome = part.codeExecutionResult.outcome;
64
+ result.push(cr);
65
+ }
66
+ }
67
+ }
68
+ if (event.actions?.requestedToolConfirmations) {
69
+ result.push({
70
+ type: "tool_confirmation",
71
+ confirmations: event.actions.requestedToolConfirmations,
72
+ });
73
+ }
74
+ if (isFinalResponse(event) && result.length === 0) {
75
+ result.push({ type: "finished" });
76
+ }
77
+ return result;
78
+ }
79
+ //# sourceMappingURL=structuredEvents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structuredEvents.js","sourceRoot":"","sources":["../src/structuredEvents.ts"],"names":[],"mappings":"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"}