@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.
- package/dist/AdkClient.d.ts +26 -29
- package/dist/AdkClient.d.ts.map +1 -1
- package/dist/AdkClient.js +5 -3
- package/dist/AdkClient.js.map +1 -1
- package/dist/AdkEventAccumulator.d.ts +41 -45
- package/dist/AdkEventAccumulator.d.ts.map +1 -1
- package/dist/AdkEventAccumulator.js +63 -99
- package/dist/AdkEventAccumulator.js.map +1 -1
- package/dist/AdkSessionAdapter.d.ts +41 -39
- package/dist/AdkSessionAdapter.d.ts.map +1 -1
- package/dist/AdkSessionAdapter.js +11 -7
- package/dist/AdkSessionAdapter.js.map +1 -1
- package/dist/adkAuthRequest.d.ts +17 -0
- package/dist/adkAuthRequest.d.ts.map +1 -0
- package/dist/adkAuthRequest.js +45 -0
- package/dist/adkAuthRequest.js.map +1 -0
- package/dist/adkExtras.d.ts +2 -5
- package/dist/adkExtras.d.ts.map +1 -1
- package/dist/adkToolApproval.d.ts +18 -21
- package/dist/adkToolApproval.d.ts.map +1 -1
- package/dist/adkToolApproval.js +1 -3
- package/dist/adkToolApproval.js.map +1 -1
- package/dist/contentToParts.d.ts +2 -5
- package/dist/contentToParts.d.ts.map +1 -1
- package/dist/convertAdkMessages.d.ts +5 -8
- package/dist/convertAdkMessages.d.ts.map +1 -1
- package/dist/convertAdkMessages.js +4 -3
- package/dist/convertAdkMessages.js.map +1 -1
- package/dist/convertToAdkMessages.d.ts +36 -39
- package/dist/convertToAdkMessages.d.ts.map +1 -1
- package/dist/hooks.d.ts +25 -23
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +12 -10
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +11 -10
- package/dist/index.d.ts.map +1 -0
- package/dist/normalizeAdkPart.d.ts +2 -0
- package/dist/normalizeAdkPart.d.ts.map +1 -0
- package/dist/normalizeAdkPart.js +31 -0
- package/dist/normalizeAdkPart.js.map +1 -0
- package/dist/parseAdkEvent.d.ts +2 -5
- package/dist/parseAdkEvent.d.ts.map +1 -1
- package/dist/raceWithAbortSignal.d.ts +2 -0
- package/dist/raceWithAbortSignal.d.ts.map +1 -0
- package/dist/raceWithAbortSignal.js +45 -0
- package/dist/raceWithAbortSignal.js.map +1 -0
- package/dist/sdkIdentity.d.ts +2 -5
- package/dist/sdkIdentity.d.ts.map +1 -1
- package/dist/sdkIdentity.js +1 -1
- package/dist/server/adkEventStream.d.ts +25 -27
- package/dist/server/adkEventStream.d.ts.map +1 -1
- package/dist/server/adkEventStream.js +23 -15
- package/dist/server/adkEventStream.js.map +1 -1
- package/dist/server/createAdkApiRoute.d.ts +23 -25
- package/dist/server/createAdkApiRoute.d.ts.map +1 -1
- package/dist/server/index.d.ts +4 -4
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/parseAdkRequest.d.ts +18 -20
- package/dist/server/parseAdkRequest.d.ts.map +1 -1
- package/dist/structuredEvents.d.ts +2 -5
- package/dist/structuredEvents.d.ts.map +1 -1
- package/dist/structuredEvents.js +1 -1
- package/dist/structuredEvents.js.map +1 -1
- package/dist/toAdkFunctionResponse.d.ts +2 -5
- package/dist/toAdkFunctionResponse.d.ts.map +1 -1
- package/dist/trimTrailingSlashes.d.ts +1 -4
- package/dist/trimTrailingSlashes.d.ts.map +1 -1
- package/dist/types.d.ts +253 -256
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/useAdkMessages.d.ts +26 -29
- package/dist/useAdkMessages.d.ts.map +1 -1
- package/dist/useAdkMessages.js +2 -0
- package/dist/useAdkMessages.js.map +1 -1
- package/dist/useAdkRuntime.d.ts +50 -52
- package/dist/useAdkRuntime.d.ts.map +1 -1
- package/dist/useAdkRuntime.js +1 -1
- package/package.json +10 -9
- package/src/AdkClient.test.ts +50 -0
- package/src/AdkClient.ts +10 -3
- package/src/AdkEventAccumulator.test.ts +312 -11
- package/src/AdkEventAccumulator.ts +68 -142
- package/src/AdkSessionAdapter.test.ts +284 -1
- package/src/AdkSessionAdapter.ts +32 -8
- package/src/adkAuthRequest.test.ts +101 -0
- package/src/adkAuthRequest.ts +50 -0
- package/src/adkToolApproval.test.ts +0 -4
- package/src/adkToolApproval.ts +1 -3
- package/src/convertAdkMessages.test.ts +41 -0
- package/src/convertAdkMessages.ts +19 -7
- package/src/hooks.render.test.tsx +95 -2
- package/src/hooks.ts +12 -13
- package/src/normalizeAdkPart.ts +35 -0
- package/src/raceWithAbortSignal.test.ts +73 -0
- package/src/raceWithAbortSignal.ts +48 -0
- package/src/server/adkEventStream.test.ts +147 -0
- package/src/server/adkEventStream.ts +27 -20
- package/src/structuredEvents.test.ts +69 -0
- package/src/structuredEvents.ts +4 -1
- package/src/types.ts +1 -1
- package/src/useAdkMessages.test.ts +102 -3
- package/src/useAdkMessages.ts +2 -0
- 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
|
-
}
|
|
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
|
},
|
package/src/useAdkMessages.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
135
|
+
await resumed[1]!.promise;
|
|
132
136
|
});
|
|
133
137
|
expect(
|
|
134
138
|
JSON.stringify(capture.runtime!.thread.getState().messages),
|