@assistant-ui/react-google-adk 0.0.30 → 0.0.32

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 (103) hide show
  1. package/dist/AdkClient.d.ts +26 -29
  2. package/dist/AdkClient.d.ts.map +1 -1
  3. package/dist/AdkClient.js +5 -3
  4. package/dist/AdkClient.js.map +1 -1
  5. package/dist/AdkEventAccumulator.d.ts +41 -45
  6. package/dist/AdkEventAccumulator.d.ts.map +1 -1
  7. package/dist/AdkEventAccumulator.js +63 -99
  8. package/dist/AdkEventAccumulator.js.map +1 -1
  9. package/dist/AdkSessionAdapter.d.ts +41 -39
  10. package/dist/AdkSessionAdapter.d.ts.map +1 -1
  11. package/dist/AdkSessionAdapter.js +11 -7
  12. package/dist/AdkSessionAdapter.js.map +1 -1
  13. package/dist/adkAuthRequest.d.ts +17 -0
  14. package/dist/adkAuthRequest.d.ts.map +1 -0
  15. package/dist/adkAuthRequest.js +45 -0
  16. package/dist/adkAuthRequest.js.map +1 -0
  17. package/dist/adkExtras.d.ts +2 -5
  18. package/dist/adkExtras.d.ts.map +1 -1
  19. package/dist/adkToolApproval.d.ts +18 -21
  20. package/dist/adkToolApproval.d.ts.map +1 -1
  21. package/dist/adkToolApproval.js +1 -3
  22. package/dist/adkToolApproval.js.map +1 -1
  23. package/dist/contentToParts.d.ts +2 -5
  24. package/dist/contentToParts.d.ts.map +1 -1
  25. package/dist/convertAdkMessages.d.ts +5 -8
  26. package/dist/convertAdkMessages.d.ts.map +1 -1
  27. package/dist/convertAdkMessages.js +4 -3
  28. package/dist/convertAdkMessages.js.map +1 -1
  29. package/dist/convertToAdkMessages.d.ts +36 -39
  30. package/dist/convertToAdkMessages.d.ts.map +1 -1
  31. package/dist/hooks.d.ts +25 -23
  32. package/dist/hooks.d.ts.map +1 -1
  33. package/dist/hooks.js +12 -10
  34. package/dist/hooks.js.map +1 -1
  35. package/dist/index.d.ts +11 -10
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/normalizeAdkPart.d.ts +2 -0
  38. package/dist/normalizeAdkPart.d.ts.map +1 -0
  39. package/dist/normalizeAdkPart.js +31 -0
  40. package/dist/normalizeAdkPart.js.map +1 -0
  41. package/dist/parseAdkEvent.d.ts +2 -5
  42. package/dist/parseAdkEvent.d.ts.map +1 -1
  43. package/dist/raceWithAbortSignal.d.ts +2 -0
  44. package/dist/raceWithAbortSignal.d.ts.map +1 -0
  45. package/dist/raceWithAbortSignal.js +45 -0
  46. package/dist/raceWithAbortSignal.js.map +1 -0
  47. package/dist/sdkIdentity.d.ts +2 -5
  48. package/dist/sdkIdentity.d.ts.map +1 -1
  49. package/dist/sdkIdentity.js +1 -1
  50. package/dist/server/adkEventStream.d.ts +25 -27
  51. package/dist/server/adkEventStream.d.ts.map +1 -1
  52. package/dist/server/adkEventStream.js +23 -15
  53. package/dist/server/adkEventStream.js.map +1 -1
  54. package/dist/server/createAdkApiRoute.d.ts +23 -25
  55. package/dist/server/createAdkApiRoute.d.ts.map +1 -1
  56. package/dist/server/index.d.ts +4 -4
  57. package/dist/server/index.d.ts.map +1 -0
  58. package/dist/server/parseAdkRequest.d.ts +18 -20
  59. package/dist/server/parseAdkRequest.d.ts.map +1 -1
  60. package/dist/structuredEvents.d.ts +2 -5
  61. package/dist/structuredEvents.d.ts.map +1 -1
  62. package/dist/structuredEvents.js +1 -1
  63. package/dist/structuredEvents.js.map +1 -1
  64. package/dist/toAdkFunctionResponse.d.ts +2 -5
  65. package/dist/toAdkFunctionResponse.d.ts.map +1 -1
  66. package/dist/trimTrailingSlashes.d.ts +1 -4
  67. package/dist/trimTrailingSlashes.d.ts.map +1 -1
  68. package/dist/types.d.ts +253 -256
  69. package/dist/types.d.ts.map +1 -1
  70. package/dist/types.js.map +1 -1
  71. package/dist/useAdkMessages.d.ts +26 -29
  72. package/dist/useAdkMessages.d.ts.map +1 -1
  73. package/dist/useAdkMessages.js +2 -0
  74. package/dist/useAdkMessages.js.map +1 -1
  75. package/dist/useAdkRuntime.d.ts +50 -52
  76. package/dist/useAdkRuntime.d.ts.map +1 -1
  77. package/dist/useAdkRuntime.js +1 -1
  78. package/package.json +10 -9
  79. package/src/AdkClient.test.ts +50 -0
  80. package/src/AdkClient.ts +10 -3
  81. package/src/AdkEventAccumulator.test.ts +312 -11
  82. package/src/AdkEventAccumulator.ts +68 -142
  83. package/src/AdkSessionAdapter.test.ts +284 -1
  84. package/src/AdkSessionAdapter.ts +32 -8
  85. package/src/adkAuthRequest.test.ts +101 -0
  86. package/src/adkAuthRequest.ts +50 -0
  87. package/src/adkToolApproval.test.ts +0 -4
  88. package/src/adkToolApproval.ts +1 -3
  89. package/src/convertAdkMessages.test.ts +41 -0
  90. package/src/convertAdkMessages.ts +19 -7
  91. package/src/hooks.render.test.tsx +95 -2
  92. package/src/hooks.ts +12 -13
  93. package/src/normalizeAdkPart.ts +35 -0
  94. package/src/raceWithAbortSignal.test.ts +73 -0
  95. package/src/raceWithAbortSignal.ts +48 -0
  96. package/src/server/adkEventStream.test.ts +147 -0
  97. package/src/server/adkEventStream.ts +27 -20
  98. package/src/structuredEvents.test.ts +69 -0
  99. package/src/structuredEvents.ts +4 -1
  100. package/src/types.ts +1 -1
  101. package/src/useAdkMessages.test.ts +102 -3
  102. package/src/useAdkMessages.ts +2 -0
  103. package/src/useAdkRuntime.replacement.test.tsx +11 -7
@@ -17,7 +17,6 @@ import {
17
17
  messageToEvent,
18
18
  messagesToEvents,
19
19
  useAdkMessages,
20
- type UseAdkMessagesOptions,
21
20
  } from "./useAdkMessages";
22
21
  import { projectAdkToolApprovals } from "./adkToolApproval";
23
22
  import { createAdkStream } from "./AdkClient";
@@ -113,7 +112,7 @@ describe("ADK runtime callbacks", () => {
113
112
  };
114
113
  const eventHandlers = {
115
114
  [callbackName]: callback,
116
- } as UseAdkMessagesOptions["eventHandlers"];
115
+ };
117
116
  const { result } = renderHook(() =>
118
117
  useAdkMessages({ stream, eventHandlers }),
119
118
  );
@@ -466,6 +465,10 @@ describe("optimistic confirmation replies", () => {
466
465
  projectAdkToolApprovals(result.current.messages).approvals.values(),
467
466
  ),
468
467
  ]).toEqual([{ id: "conf-a" }, { id: "conf-b" }]);
468
+ expect(result.current.toolConfirmations.map((c) => c.toolCallId)).toEqual([
469
+ "conf-a",
470
+ "conf-b",
471
+ ]);
469
472
  });
470
473
 
471
474
  it("keeps both gates pending when an ai message sits between the replies", async () => {
@@ -522,6 +525,102 @@ describe("optimistic confirmation replies", () => {
522
525
  projectAdkToolApprovals(result.current.messages).approvals.values(),
523
526
  ),
524
527
  ]).toEqual([{ id: "conf-a", approved: true }, { id: "conf-b" }]);
528
+ expect(result.current.toolConfirmations.map((c) => c.toolCallId)).toEqual([
529
+ "conf-b",
530
+ ]);
531
+ });
532
+ });
533
+
534
+ describe("pending requests across sends", () => {
535
+ it("keeps an unanswered request listed across sends until its reply is sent", async () => {
536
+ let run = 0;
537
+ const stream: AdkStreamCallback = async function* () {
538
+ run += 1;
539
+ if (run === 1) {
540
+ yield {
541
+ id: "requests",
542
+ author: "agent",
543
+ longRunningToolIds: ["conf-1", "cred-1"],
544
+ content: {
545
+ role: "model",
546
+ parts: [
547
+ {
548
+ functionCall: {
549
+ id: "conf-1",
550
+ name: "adk_request_confirmation",
551
+ args: {
552
+ originalFunctionCall: { id: "gated-1", name: "transfer" },
553
+ toolConfirmation: { hint: "Transfer?" },
554
+ },
555
+ },
556
+ },
557
+ {
558
+ functionCall: {
559
+ id: "cred-1",
560
+ name: "adk_request_credential",
561
+ args: {
562
+ function_call_id: "gated-2",
563
+ auth_config: { credentialKey: "k" },
564
+ },
565
+ },
566
+ },
567
+ ],
568
+ },
569
+ } satisfies AdkEvent;
570
+ } else if (run === 2) {
571
+ yield {
572
+ id: "answer",
573
+ author: "agent",
574
+ content: { role: "model", parts: [{ text: "still waiting" }] },
575
+ } satisfies AdkEvent;
576
+ }
577
+ };
578
+ const { result } = renderHook(() => useAdkMessages({ stream }));
579
+ const pending = () => ({
580
+ confirmations: result.current.toolConfirmations.map((c) => c.toolCallId),
581
+ authRequests: result.current.authRequests.map((r) => r.toolCallId),
582
+ });
583
+
584
+ await act(async () => {
585
+ await result.current.sendMessage(
586
+ [{ id: "user-1", type: "human", content: "start" }],
587
+ {},
588
+ );
589
+ });
590
+ expect(pending()).toEqual({
591
+ confirmations: ["conf-1"],
592
+ authRequests: ["cred-1"],
593
+ });
594
+
595
+ await act(async () => {
596
+ await result.current.sendMessage(
597
+ [{ id: "user-2", type: "human", content: "any news?" }],
598
+ {},
599
+ );
600
+ });
601
+ expect(pending()).toEqual({
602
+ confirmations: ["conf-1"],
603
+ authRequests: ["cred-1"],
604
+ });
605
+
606
+ await act(async () => {
607
+ await result.current.sendMessage(
608
+ [
609
+ {
610
+ id: "reply",
611
+ type: "tool",
612
+ tool_call_id: "cred-1",
613
+ name: "adk_request_credential",
614
+ content: JSON.stringify({
615
+ exchangedAuthCredential: { authType: "apiKey" },
616
+ }),
617
+ status: "success",
618
+ },
619
+ ],
620
+ {},
621
+ );
622
+ });
623
+ expect(pending()).toEqual({ confirmations: ["conf-1"], authRequests: [] });
525
624
  });
526
625
  });
527
626
 
@@ -680,7 +779,7 @@ describe("messageToEvent (contentToParts)", () => {
680
779
  name: "search",
681
780
  });
682
781
 
683
- expect(event.content?.parts[0]?.functionResponse?.response).toEqual(
782
+ expect(event.content?.parts?.[0]?.functionResponse?.response).toEqual(
684
783
  response,
685
784
  );
686
785
  },
@@ -170,6 +170,8 @@ export const useAdkMessages = ({
170
170
  }
171
171
  setMessagesImmediate(accumulator.getMessages());
172
172
  setLongRunningToolIds(accumulator.getLongRunningToolIds());
173
+ setToolConfirmations(accumulator.getToolConfirmations());
174
+ setAuthRequests(accumulator.getAuthRequests());
173
175
 
174
176
  // Google ADK replaces active runs, while React LangGraph queues sends.
175
177
  abortControllerRef.current?.abort();
@@ -62,10 +62,12 @@ describe("useAdkRuntime replacement runs", () => {
62
62
  },
63
63
  ])("ignores superseded run $label", async ({ cancelFirst, failFirst }) => {
64
64
  const gates = [deferred(), deferred()];
65
+ const resumed = [deferred(), deferred()];
65
66
  let calls = 0;
66
67
  const stream = vi.fn(async function* (): AsyncGenerator<AdkEvent> {
67
68
  const call = calls++;
68
69
  await gates[call]!.promise;
70
+ resumed[call]!.resolve();
69
71
  if (call === 0 && failFirst) throw new Error("stale run failed");
70
72
  yield {
71
73
  id: `event-${call}`,
@@ -84,7 +86,11 @@ describe("useAdkRuntime replacement runs", () => {
84
86
  unstable_allowCancellation: true,
85
87
  });
86
88
  capture.runtime = runtime;
87
- return <AssistantRuntimeProvider runtime={runtime} />;
89
+ return (
90
+ <AssistantRuntimeProvider runtime={runtime}>
91
+ {null}
92
+ </AssistantRuntimeProvider>
93
+ );
88
94
  };
89
95
 
90
96
  await act(async () => {
@@ -95,19 +101,17 @@ describe("useAdkRuntime replacement runs", () => {
95
101
  await capture.runtime!.threads.switchToThread("adk-1");
96
102
  });
97
103
 
98
- let firstSend!: Promise<void>;
99
104
  act(() => {
100
- firstSend = capture.runtime!.thread.append({
105
+ capture.runtime!.thread.append({
101
106
  role: "user",
102
107
  content: [{ type: "text", text: "first" }],
103
108
  });
104
109
  });
105
110
  await waitFor(() => expect(stream).toHaveBeenCalledTimes(1));
106
111
 
107
- let secondSend!: Promise<void>;
108
112
  await act(async () => {
109
113
  if (cancelFirst) await capture.runtime!.thread.cancelRun();
110
- secondSend = capture.runtime!.thread.append({
114
+ capture.runtime!.thread.append({
111
115
  role: "user",
112
116
  content: [{ type: "text", text: "second" }],
113
117
  });
@@ -116,7 +120,7 @@ describe("useAdkRuntime replacement runs", () => {
116
120
 
117
121
  await act(async () => {
118
122
  gates[0]!.resolve();
119
- await firstSend;
123
+ await resumed[0]!.promise;
120
124
  });
121
125
 
122
126
  const messagesAfterFirstSettles = JSON.stringify(
@@ -128,7 +132,7 @@ describe("useAdkRuntime replacement runs", () => {
128
132
 
129
133
  await act(async () => {
130
134
  gates[1]!.resolve();
131
- await secondSend;
135
+ await resumed[1]!.promise;
132
136
  });
133
137
  expect(
134
138
  JSON.stringify(capture.runtime!.thread.getState().messages),