@assistant-ui/react-google-adk 0.0.15 → 0.0.16
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/AdkEventAccumulator.js +2 -2
- package/dist/AdkEventAccumulator.js.map +1 -1
- package/dist/adkExtras.d.ts +7 -0
- package/dist/adkExtras.d.ts.map +1 -0
- package/dist/adkExtras.js +7 -0
- package/dist/adkExtras.js.map +1 -0
- package/dist/hooks.d.ts +1 -17
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +48 -128
- package/dist/hooks.js.map +1 -1
- package/dist/types.d.ts +16 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/useAdkRuntime.d.ts +10 -0
- package/dist/useAdkRuntime.d.ts.map +1 -1
- package/dist/useAdkRuntime.js +66 -10
- package/dist/useAdkRuntime.js.map +1 -1
- package/package.json +7 -7
- package/src/adkExtras.ts +4 -0
- package/src/hooks.ts +46 -125
- package/src/types.ts +13 -0
- package/src/useAdkRuntime.ts +118 -20
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAdkRuntime.d.ts","names":[],"sources":["../src/useAdkRuntime.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"useAdkRuntime.d.ts","names":[],"sources":["../src/useAdkRuntime.ts"],"mappings":";;;;;KAsJY,oBAAA,GAAuB,0BAAA;EACjC,MAAA,EAAQ,iBAAA;EADsB;;;;;;;;EAU9B,gBAAA,KAAqB,QAAA;EACrB,0BAAA;EACA,0BAAA;EACA,eAAA,IACE,QAAA,UACA,cAAA,EAAgB,UAAA,OACb,OAAA;EACL,IAAA,IAAQ,QAAA,aAAqB,OAAA;IAAU,QAAA,EAAU,UAAA;EAAA;EACjD,MAAA,SAAe,OAAA;IAAU,UAAA;EAAA;EACzB,MAAA,IAAU,QAAA,aAAqB,OAAA;EAC/B,QAAA;IAEM,WAAA,GAAc,iBAAA;IACd,MAAA,GAAS,sBAAA;IACT,SAAA,GAAY,gBAAA;IACZ,KAAA,GAAQ,oBAAA;IACR,QAAA,GAAW,eAAA;EAAA;EAGjB,aAAA;IAEM,OAAA,GAAU,kBAAA;IACV,aAAA,GAAgB,wBAAA;IAChB,eAAA,GAAkB,0BAAA;EAAA;EAGxB,KAAA,GAAQ,cAAA;EArBN;;;;EA0BF,cAAA,GAAiB,uBAAA;AAAA;AAAA,cAmRN,aAAA;EAAiB,KAAA;EAAA,cAAA;EAAA,MAAA;EAAA,MAAA,EAAA,QAAA;EAAA,gBAAA;EAAA,GAAA;AAAA,GAO3B,oBAAA,kCAAoB,gBAAA"}
|
package/dist/useAdkRuntime.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import { adkExtras } from "./adkExtras.js";
|
|
1
2
|
import { convertAdkMessage } from "./convertAdkMessages.js";
|
|
2
|
-
import { symbolAdkRuntimeExtras } from "./hooks.js";
|
|
3
3
|
import { useAdkMessages } from "./useAdkMessages.js";
|
|
4
4
|
import { v4 } from "uuid";
|
|
5
5
|
import { useAui } from "@assistant-ui/store";
|
|
6
6
|
import { useEffect, useRef, useState } from "react";
|
|
7
|
-
import { getExternalStoreMessages, pickExternalStoreSharedOptions } from "@assistant-ui/core";
|
|
7
|
+
import { generateId, getExternalStoreMessages, pickExternalStoreSharedOptions } from "@assistant-ui/core";
|
|
8
8
|
import { useCloudThreadListAdapter, useExternalMessageConverter, useExternalStoreRuntime, useRemoteThreadListRuntime } from "@assistant-ui/core/react";
|
|
9
9
|
//#region src/useAdkRuntime.ts
|
|
10
10
|
/** @internal — exported for unit tests. */
|
|
@@ -70,10 +70,15 @@ const truncateAdkMessages = (threadMessages, parentId) => {
|
|
|
70
70
|
for (let i = 0; i <= parentIndex && i < threadMessages.length; i++) truncated.push(...getExternalStoreMessages(threadMessages[i]));
|
|
71
71
|
return truncated;
|
|
72
72
|
};
|
|
73
|
+
const toAdkUserMessage = (msg, id = generateId()) => ({
|
|
74
|
+
id,
|
|
75
|
+
type: "human",
|
|
76
|
+
content: getMessageContent(msg)
|
|
77
|
+
});
|
|
73
78
|
const useAdkRuntimeImpl = (options) => {
|
|
74
79
|
const { autoCancelPendingToolCalls, adapters: { attachments, dictation, feedback, speech, voice } = {}, unstable_allowCancellation, stream, load, getCheckpointId, eventHandlers } = options;
|
|
75
80
|
const aui = useAui();
|
|
76
|
-
const { messages, stateDelta, agentInfo, longRunningToolIds, artifactDelta, toolConfirmations, authRequests, escalated, messageMetadata, sendMessage, cancel, replaceMessages } = useAdkMessages({
|
|
81
|
+
const { messages, stateDelta, agentInfo, longRunningToolIds, artifactDelta, toolConfirmations, authRequests, escalated, messageMetadata, sendMessage, cancel, setMessages, replaceMessages } = useAdkMessages({
|
|
77
82
|
stream,
|
|
78
83
|
...eventHandlers && { eventHandlers }
|
|
79
84
|
});
|
|
@@ -96,6 +101,34 @@ const useAdkRuntimeImpl = (options) => {
|
|
|
96
101
|
});
|
|
97
102
|
const threadMessagesRef = useRef(threadMessages);
|
|
98
103
|
threadMessagesRef.current = threadMessages;
|
|
104
|
+
const adkMessagesRef = useRef(messages);
|
|
105
|
+
adkMessagesRef.current = messages;
|
|
106
|
+
const stagedMessagesRef = useRef(/* @__PURE__ */ new Map());
|
|
107
|
+
const [stagedMessageCount, setStagedMessageCount] = useState(0);
|
|
108
|
+
const hasStagedMessages = stagedMessageCount > 0;
|
|
109
|
+
const getStagedRun = (parentId) => {
|
|
110
|
+
if (!parentId || !stagedMessagesRef.current.has(parentId)) return null;
|
|
111
|
+
const staged = [];
|
|
112
|
+
for (const message of adkMessagesRef.current) {
|
|
113
|
+
if (message.id && stagedMessagesRef.current.has(message.id)) staged.push(stagedMessagesRef.current.get(message.id).message);
|
|
114
|
+
if (message.id === parentId) break;
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
messages: staged,
|
|
118
|
+
runConfig: stagedMessagesRef.current.get(parentId).runConfig
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
const stageUserMessage = (msg) => {
|
|
122
|
+
const stagedMessage = toAdkUserMessage(msg);
|
|
123
|
+
stagedMessagesRef.current.set(stagedMessage.id, {
|
|
124
|
+
message: stagedMessage,
|
|
125
|
+
runConfig: msg.runConfig
|
|
126
|
+
});
|
|
127
|
+
setStagedMessageCount(stagedMessagesRef.current.size);
|
|
128
|
+
const nextMessages = [...adkMessagesRef.current, stagedMessage];
|
|
129
|
+
adkMessagesRef.current = nextMessages;
|
|
130
|
+
setMessages(nextMessages);
|
|
131
|
+
};
|
|
99
132
|
const runtime = useExternalStoreRuntime({
|
|
100
133
|
...pickExternalStoreSharedOptions(options),
|
|
101
134
|
isRunning: effectiveIsRunning,
|
|
@@ -109,8 +142,7 @@ const useAdkRuntimeImpl = (options) => {
|
|
|
109
142
|
speech,
|
|
110
143
|
voice
|
|
111
144
|
},
|
|
112
|
-
extras: {
|
|
113
|
-
[symbolAdkRuntimeExtras]: true,
|
|
145
|
+
extras: adkExtras.provide({
|
|
114
146
|
agentInfo,
|
|
115
147
|
stateDelta,
|
|
116
148
|
artifactDelta,
|
|
@@ -120,8 +152,12 @@ const useAdkRuntimeImpl = (options) => {
|
|
|
120
152
|
escalated,
|
|
121
153
|
messageMetadata,
|
|
122
154
|
send: handleSendMessage
|
|
123
|
-
},
|
|
155
|
+
}),
|
|
124
156
|
onNew: async (msg) => {
|
|
157
|
+
if (!(msg.startRun ?? msg.role === "user")) {
|
|
158
|
+
stageUserMessage(msg);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
125
161
|
return handleSendMessage([...autoCancelPendingToolCalls !== false ? getPendingCancellations(messages, longRunningToolIds) : [], {
|
|
126
162
|
id: v4(),
|
|
127
163
|
type: "human",
|
|
@@ -131,6 +167,18 @@ const useAdkRuntimeImpl = (options) => {
|
|
|
131
167
|
onEdit: getCheckpointId ? async (msg) => {
|
|
132
168
|
const truncated = truncateAdkMessages(threadMessagesRef.current, msg.parentId);
|
|
133
169
|
replaceMessages(truncated);
|
|
170
|
+
if (!(msg.startRun ?? msg.role === "user")) {
|
|
171
|
+
const stagedMessage = toAdkUserMessage(msg);
|
|
172
|
+
stagedMessagesRef.current.set(stagedMessage.id, {
|
|
173
|
+
message: stagedMessage,
|
|
174
|
+
runConfig: msg.runConfig
|
|
175
|
+
});
|
|
176
|
+
setStagedMessageCount(stagedMessagesRef.current.size);
|
|
177
|
+
const nextMessages = [...truncated, stagedMessage];
|
|
178
|
+
adkMessagesRef.current = nextMessages;
|
|
179
|
+
setMessages(nextMessages);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
134
182
|
const externalId = aui.threadListItem().getState().externalId;
|
|
135
183
|
const checkpointId = externalId ? await getCheckpointId(externalId, truncated) : null;
|
|
136
184
|
return handleSendMessage([{
|
|
@@ -142,7 +190,14 @@ const useAdkRuntimeImpl = (options) => {
|
|
|
142
190
|
...checkpointId && { checkpointId }
|
|
143
191
|
});
|
|
144
192
|
} : void 0,
|
|
145
|
-
|
|
193
|
+
...getCheckpointId || hasStagedMessages ? { onReload: async (parentId, config) => {
|
|
194
|
+
const stagedRun = getStagedRun(parentId);
|
|
195
|
+
if (stagedRun) {
|
|
196
|
+
for (const message of stagedRun.messages) stagedMessagesRef.current.delete(message.id);
|
|
197
|
+
setStagedMessageCount(stagedMessagesRef.current.size);
|
|
198
|
+
return handleSendMessage(stagedRun.messages, { runConfig: config.runConfig ?? stagedRun.runConfig });
|
|
199
|
+
}
|
|
200
|
+
if (!getCheckpointId) throw new Error("Runtime does not support reloading messages.");
|
|
146
201
|
const truncated = truncateAdkMessages(threadMessagesRef.current, parentId);
|
|
147
202
|
replaceMessages(truncated);
|
|
148
203
|
const externalId = aui.threadListItem().getState().externalId;
|
|
@@ -151,7 +206,7 @@ const useAdkRuntimeImpl = (options) => {
|
|
|
151
206
|
runConfig: config.runConfig,
|
|
152
207
|
...checkpointId && { checkpointId }
|
|
153
208
|
});
|
|
154
|
-
} :
|
|
209
|
+
} } : {},
|
|
155
210
|
onAddToolResult: async ({ toolCallId, toolName, result, isError, artifact }) => {
|
|
156
211
|
await handleSendMessage([{
|
|
157
212
|
id: v4(),
|
|
@@ -186,7 +241,7 @@ const useAdkRuntimeImpl = (options) => {
|
|
|
186
241
|
}
|
|
187
242
|
return runtime;
|
|
188
243
|
};
|
|
189
|
-
const useAdkRuntime = ({ cloud, sessionAdapter, create, delete: deleteFn, ...options }) => {
|
|
244
|
+
const useAdkRuntime = ({ cloud, sessionAdapter, create, delete: deleteFn, onThreadIdChange, ...options }) => {
|
|
190
245
|
const aui = useAui();
|
|
191
246
|
const cloudAdapter = useCloudThreadListAdapter({
|
|
192
247
|
cloud,
|
|
@@ -202,7 +257,8 @@ const useAdkRuntime = ({ cloud, sessionAdapter, create, delete: deleteFn, ...opt
|
|
|
202
257
|
return useAdkRuntimeImpl(options);
|
|
203
258
|
},
|
|
204
259
|
adapter: sessionAdapter ?? cloudAdapter,
|
|
205
|
-
allowNesting: true
|
|
260
|
+
allowNesting: true,
|
|
261
|
+
onThreadIdChange
|
|
206
262
|
});
|
|
207
263
|
};
|
|
208
264
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAdkRuntime.js","names":["_exhaustiveCheck","uuidv4"],"sources":["../src/useAdkRuntime.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport {\n getExternalStoreMessages,\n pickExternalStoreSharedOptions,\n type AttachmentAdapter,\n type DictationAdapter,\n type ExternalStoreSharedOptions,\n type FeedbackAdapter,\n type RealtimeVoiceAdapter,\n type SpeechSynthesisAdapter,\n type AppendMessage,\n type ThreadMessage,\n type ToolExecutionStatus,\n} from \"@assistant-ui/core\";\nimport {\n useCloudThreadListAdapter,\n useRemoteThreadListRuntime,\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/core/react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type { AssistantCloud } from \"assistant-cloud\";\nimport type { RemoteThreadListAdapter } from \"@assistant-ui/core\";\nimport type {\n AdkMessage,\n AdkSendMessageConfig,\n AdkStreamCallback,\n OnAdkErrorCallback,\n OnAdkCustomEventCallback,\n OnAdkAgentTransferCallback,\n} from \"./types\";\nimport { useAdkMessages } from \"./useAdkMessages\";\nimport { convertAdkMessage } from \"./convertAdkMessages\";\nimport { symbolAdkRuntimeExtras, type AdkRuntimeExtras } from \"./hooks\";\nimport { v4 as uuidv4 } from \"uuid\";\n\n/** @internal — exported for unit tests. */\nexport const getMessageContent = (msg: AppendMessage) => {\n const allContent = [\n ...msg.content,\n ...(msg.attachments?.flatMap((a) => a.content) ?? []),\n ];\n const content = allContent.map((part) => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\" as const, text: part.text };\n case \"image\":\n return { type: \"image_url\" as const, url: part.image };\n case \"file\":\n return {\n type: \"file\" as const,\n mimeType: part.mimeType,\n data: part.data,\n ...(part.filename != null && { filename: part.filename }),\n };\n\n case \"tool-call\":\n throw new Error(\"Tool call appends are not supported.\");\n\n default: {\n const _exhaustiveCheck:\n | \"reasoning\"\n | \"source\"\n | \"audio\"\n | \"data\"\n | \"generative-ui\" = type;\n throw new Error(\n `Unsupported append message part type: ${_exhaustiveCheck}`,\n );\n }\n }\n });\n\n if (content.length === 1 && content[0]?.type === \"text\") {\n return content[0].text ?? \"\";\n }\n\n return content;\n};\n\n/** @internal — exported for unit tests. */\nexport const getPendingToolCalls = (messages: AdkMessage[]) => {\n const pending = new Map<string, { id: string; name: string }>();\n for (const msg of messages) {\n if (msg.type === \"ai\" && msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n pending.set(tc.id, tc);\n }\n }\n if (msg.type === \"tool\") {\n pending.delete(msg.tool_call_id);\n }\n }\n return [...pending.values()];\n};\n\n/**\n * @internal — exported for unit tests.\n *\n * Returns `{cancelled: true}` tool responses for pending tool calls when the\n * user sends a new turn, EXCEPT for HITL interrupts marked via\n * `long_running_tool_ids` (`adk_request_input`, `adk_request_confirmation`,\n * `adk_request_credential`). Those must be answered through a dedicated tool\n * UI + submit helper, not auto-cancelled.\n */\nexport const getPendingCancellations = (\n messages: AdkMessage[],\n longRunningToolIds: readonly string[],\n): Array<AdkMessage & { type: \"tool\" }> => {\n const longRunningSet = new Set(longRunningToolIds);\n return getPendingToolCalls(messages)\n .filter((t) => !longRunningSet.has(t.id))\n .map(\n (t) =>\n ({\n id: uuidv4(),\n type: \"tool\",\n name: t.name,\n tool_call_id: t.id,\n content: JSON.stringify({ cancelled: true }),\n status: \"error\",\n }) satisfies AdkMessage & { type: \"tool\" },\n );\n};\n\nconst truncateAdkMessages = (\n threadMessages: readonly ThreadMessage[],\n parentId: string | null,\n): AdkMessage[] => {\n if (parentId === null) return [];\n const parentIndex = threadMessages.findIndex((m) => m.id === parentId);\n if (parentIndex === -1) return [];\n const truncated: AdkMessage[] = [];\n for (let i = 0; i <= parentIndex && i < threadMessages.length; i++) {\n truncated.push(...getExternalStoreMessages<AdkMessage>(threadMessages[i]!));\n }\n return truncated;\n};\n\nexport type UseAdkRuntimeOptions = ExternalStoreSharedOptions & {\n stream: AdkStreamCallback;\n autoCancelPendingToolCalls?: boolean | undefined;\n unstable_allowCancellation?: boolean | undefined;\n getCheckpointId?: (\n threadId: string,\n parentMessages: AdkMessage[],\n ) => Promise<string | null>;\n load?: (threadId: string) => Promise<{ messages: AdkMessage[] }>;\n create?: () => Promise<{ externalId: string }>;\n delete?: (threadId: string) => Promise<void>;\n adapters?:\n | {\n attachments?: AttachmentAdapter;\n speech?: SpeechSynthesisAdapter;\n dictation?: DictationAdapter;\n voice?: RealtimeVoiceAdapter;\n feedback?: FeedbackAdapter;\n }\n | undefined;\n eventHandlers?:\n | {\n onError?: OnAdkErrorCallback;\n onCustomEvent?: OnAdkCustomEventCallback;\n onAgentTransfer?: OnAdkAgentTransferCallback;\n }\n | undefined;\n cloud?: AssistantCloud | undefined;\n /**\n * A `RemoteThreadListAdapter` to use instead of the cloud adapter.\n * Use with `createAdkSessionAdapter` for ADK session-backed persistence.\n */\n sessionAdapter?: RemoteThreadListAdapter | undefined;\n};\n\nconst useAdkRuntimeImpl = (options: UseAdkRuntimeOptions) => {\n const {\n autoCancelPendingToolCalls,\n adapters: { attachments, dictation, feedback, speech, voice } = {},\n unstable_allowCancellation,\n stream,\n load,\n getCheckpointId,\n eventHandlers,\n } = options;\n const aui = useAui();\n const {\n messages,\n stateDelta,\n agentInfo,\n longRunningToolIds,\n artifactDelta,\n toolConfirmations,\n authRequests,\n escalated,\n messageMetadata,\n sendMessage,\n cancel,\n replaceMessages,\n } = useAdkMessages({\n stream,\n ...(eventHandlers && { eventHandlers }),\n });\n\n const [isRunning, setIsRunning] = useState(false);\n const [toolStatuses, setToolStatuses] = useState<\n Record<string, ToolExecutionStatus>\n >({});\n const hasExecutingTools = Object.values(toolStatuses).some(\n (s) => s?.type === \"executing\",\n );\n const effectiveIsRunning = isRunning || hasExecutingTools;\n\n const handleSendMessage = async (\n msgs: AdkMessage[],\n config: AdkSendMessageConfig,\n ) => {\n try {\n setIsRunning(true);\n await sendMessage(msgs, config);\n } finally {\n setIsRunning(false);\n }\n };\n\n const threadMessages = useExternalMessageConverter({\n callback: convertAdkMessage,\n messages,\n isRunning: effectiveIsRunning,\n });\n\n const threadMessagesRef = useRef(threadMessages);\n threadMessagesRef.current = threadMessages;\n\n const runtime = useExternalStoreRuntime({\n ...pickExternalStoreSharedOptions(options),\n isRunning: effectiveIsRunning,\n messages: threadMessages,\n unstable_enableToolInvocations: true,\n setToolStatuses,\n adapters: { attachments, dictation, feedback, speech, voice },\n extras: {\n [symbolAdkRuntimeExtras]: true,\n agentInfo,\n stateDelta,\n artifactDelta,\n longRunningToolIds,\n toolConfirmations,\n authRequests,\n escalated,\n messageMetadata,\n send: handleSendMessage,\n } satisfies AdkRuntimeExtras,\n onNew: async (msg) => {\n const cancellations =\n autoCancelPendingToolCalls !== false\n ? getPendingCancellations(messages, longRunningToolIds)\n : [];\n\n return handleSendMessage(\n [\n ...cancellations,\n {\n id: uuidv4(),\n type: \"human\",\n content: getMessageContent(msg),\n },\n ],\n { runConfig: msg.runConfig },\n );\n },\n onEdit: getCheckpointId\n ? async (msg) => {\n const truncated = truncateAdkMessages(\n threadMessagesRef.current,\n msg.parentId,\n );\n replaceMessages(truncated);\n const externalId = aui.threadListItem().getState().externalId;\n const checkpointId = externalId\n ? await getCheckpointId(externalId, truncated)\n : null;\n return handleSendMessage(\n [\n {\n id: uuidv4(),\n type: \"human\",\n content: getMessageContent(msg),\n },\n ],\n {\n runConfig: msg.runConfig,\n ...(checkpointId && { checkpointId }),\n },\n );\n }\n : undefined,\n onReload: getCheckpointId\n ? async (parentId, config) => {\n const truncated = truncateAdkMessages(\n threadMessagesRef.current,\n parentId,\n );\n replaceMessages(truncated);\n const externalId = aui.threadListItem().getState().externalId;\n const checkpointId = externalId\n ? await getCheckpointId(externalId, truncated)\n : null;\n return handleSendMessage([], {\n runConfig: config.runConfig,\n ...(checkpointId && { checkpointId }),\n });\n }\n : undefined,\n onAddToolResult: async ({\n toolCallId,\n toolName,\n result,\n isError,\n artifact,\n }) => {\n await handleSendMessage(\n [\n {\n id: uuidv4(),\n type: \"tool\",\n name: toolName,\n tool_call_id: toolCallId,\n content: JSON.stringify(result),\n artifact,\n status: isError ? \"error\" : \"success\",\n },\n ],\n {},\n );\n },\n onCancel: unstable_allowCancellation\n ? async () => {\n cancel();\n }\n : undefined,\n });\n\n {\n const loadRef = useRef(load);\n useEffect(() => {\n loadRef.current = load;\n });\n\n useEffect(() => {\n const loadFn = loadRef.current;\n if (!loadFn) return;\n\n const externalId = aui.threadListItem().getState().externalId;\n if (externalId == null) return;\n\n loadFn(externalId).then(\n ({ messages: msgs }) => {\n replaceMessages(msgs);\n },\n (e) => {\n console.warn(\"Failed to load ADK session:\", e);\n },\n );\n }, [aui, replaceMessages]);\n }\n\n return runtime;\n};\n\nexport const useAdkRuntime = ({\n cloud,\n sessionAdapter,\n create,\n delete: deleteFn,\n ...options\n}: UseAdkRuntimeOptions) => {\n const aui = useAui();\n const cloudAdapter = useCloudThreadListAdapter({\n cloud,\n create: async () => {\n if (create) return create();\n if (aui.threadListItem.source) return aui.threadListItem().initialize();\n return { externalId: undefined };\n },\n delete: deleteFn,\n });\n\n const adapter = sessionAdapter ?? cloudAdapter;\n\n return useRemoteThreadListRuntime({\n runtimeHook: function RuntimeHook() {\n return useAdkRuntimeImpl(options);\n },\n adapter,\n allowNesting: true,\n });\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useAdkRuntime.js","names":["_exhaustiveCheck","uuidv4"],"sources":["../src/useAdkRuntime.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport {\n getExternalStoreMessages,\n pickExternalStoreSharedOptions,\n type AttachmentAdapter,\n type DictationAdapter,\n type ExternalStoreSharedOptions,\n type FeedbackAdapter,\n type RealtimeVoiceAdapter,\n type SpeechSynthesisAdapter,\n type AppendMessage,\n type ThreadMessage,\n type ToolExecutionStatus,\n generateId,\n} from \"@assistant-ui/core\";\nimport {\n useCloudThreadListAdapter,\n useRemoteThreadListRuntime,\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/core/react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type { AssistantCloud } from \"assistant-cloud\";\nimport type { RemoteThreadListAdapter } from \"@assistant-ui/core\";\nimport type {\n AdkMessage,\n AdkSendMessageConfig,\n AdkStreamCallback,\n OnAdkErrorCallback,\n OnAdkCustomEventCallback,\n OnAdkAgentTransferCallback,\n} from \"./types\";\nimport { useAdkMessages } from \"./useAdkMessages\";\nimport { convertAdkMessage } from \"./convertAdkMessages\";\nimport { adkExtras } from \"./adkExtras\";\nimport { v4 as uuidv4 } from \"uuid\";\n\n/** @internal — exported for unit tests. */\nexport const getMessageContent = (msg: AppendMessage) => {\n const allContent = [\n ...msg.content,\n ...(msg.attachments?.flatMap((a) => a.content) ?? []),\n ];\n const content = allContent.map((part) => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\" as const, text: part.text };\n case \"image\":\n return { type: \"image_url\" as const, url: part.image };\n case \"file\":\n return {\n type: \"file\" as const,\n mimeType: part.mimeType,\n data: part.data,\n ...(part.filename != null && { filename: part.filename }),\n };\n\n case \"tool-call\":\n throw new Error(\"Tool call appends are not supported.\");\n\n default: {\n const _exhaustiveCheck:\n | \"reasoning\"\n | \"source\"\n | \"audio\"\n | \"data\"\n | \"generative-ui\" = type;\n throw new Error(\n `Unsupported append message part type: ${_exhaustiveCheck}`,\n );\n }\n }\n });\n\n if (content.length === 1 && content[0]?.type === \"text\") {\n return content[0].text ?? \"\";\n }\n\n return content;\n};\n\n/** @internal — exported for unit tests. */\nexport const getPendingToolCalls = (messages: AdkMessage[]) => {\n const pending = new Map<string, { id: string; name: string }>();\n for (const msg of messages) {\n if (msg.type === \"ai\" && msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n pending.set(tc.id, tc);\n }\n }\n if (msg.type === \"tool\") {\n pending.delete(msg.tool_call_id);\n }\n }\n return [...pending.values()];\n};\n\n/**\n * @internal — exported for unit tests.\n *\n * Returns `{cancelled: true}` tool responses for pending tool calls when the\n * user sends a new turn, EXCEPT for HITL interrupts marked via\n * `long_running_tool_ids` (`adk_request_input`, `adk_request_confirmation`,\n * `adk_request_credential`). Those must be answered through a dedicated tool\n * UI + submit helper, not auto-cancelled.\n */\nexport const getPendingCancellations = (\n messages: AdkMessage[],\n longRunningToolIds: readonly string[],\n): Array<AdkMessage & { type: \"tool\" }> => {\n const longRunningSet = new Set(longRunningToolIds);\n return getPendingToolCalls(messages)\n .filter((t) => !longRunningSet.has(t.id))\n .map(\n (t) =>\n ({\n id: uuidv4(),\n type: \"tool\",\n name: t.name,\n tool_call_id: t.id,\n content: JSON.stringify({ cancelled: true }),\n status: \"error\",\n }) satisfies AdkMessage & { type: \"tool\" },\n );\n};\n\nconst truncateAdkMessages = (\n threadMessages: readonly ThreadMessage[],\n parentId: string | null,\n): AdkMessage[] => {\n if (parentId === null) return [];\n const parentIndex = threadMessages.findIndex((m) => m.id === parentId);\n if (parentIndex === -1) return [];\n const truncated: AdkMessage[] = [];\n for (let i = 0; i <= parentIndex && i < threadMessages.length; i++) {\n truncated.push(...getExternalStoreMessages<AdkMessage>(threadMessages[i]!));\n }\n return truncated;\n};\n\nconst toAdkUserMessage = (\n msg: AppendMessage,\n id = generateId(),\n): AdkMessage & { type: \"human\"; id: string } => ({\n id,\n type: \"human\",\n content: getMessageContent(msg),\n});\n\nexport type UseAdkRuntimeOptions = ExternalStoreSharedOptions & {\n stream: AdkStreamCallback;\n /**\n * Called whenever the active thread's canonical (remote) ID changes, so the\n * value can be treated as a managed/controlled variable (e.g. synced to a URL\n * query param). Only the settled remote ID is emitted: while a freshly created\n * thread is still optimistic the value is `undefined`, and the real ID is\n * emitted once the thread is initialized; the transient local ID is never\n * surfaced.\n */\n onThreadIdChange?: ((threadId: string | undefined) => void) | undefined;\n autoCancelPendingToolCalls?: boolean | undefined;\n unstable_allowCancellation?: boolean | undefined;\n getCheckpointId?: (\n threadId: string,\n parentMessages: AdkMessage[],\n ) => Promise<string | null>;\n load?: (threadId: string) => Promise<{ messages: AdkMessage[] }>;\n create?: () => Promise<{ externalId: string }>;\n delete?: (threadId: string) => Promise<void>;\n adapters?:\n | {\n attachments?: AttachmentAdapter;\n speech?: SpeechSynthesisAdapter;\n dictation?: DictationAdapter;\n voice?: RealtimeVoiceAdapter;\n feedback?: FeedbackAdapter;\n }\n | undefined;\n eventHandlers?:\n | {\n onError?: OnAdkErrorCallback;\n onCustomEvent?: OnAdkCustomEventCallback;\n onAgentTransfer?: OnAdkAgentTransferCallback;\n }\n | undefined;\n cloud?: AssistantCloud | undefined;\n /**\n * A `RemoteThreadListAdapter` to use instead of the cloud adapter.\n * Use with `createAdkSessionAdapter` for ADK session-backed persistence.\n */\n sessionAdapter?: RemoteThreadListAdapter | undefined;\n};\n\nconst useAdkRuntimeImpl = (options: UseAdkRuntimeOptions) => {\n const {\n autoCancelPendingToolCalls,\n adapters: { attachments, dictation, feedback, speech, voice } = {},\n unstable_allowCancellation,\n stream,\n load,\n getCheckpointId,\n eventHandlers,\n } = options;\n const aui = useAui();\n const {\n messages,\n stateDelta,\n agentInfo,\n longRunningToolIds,\n artifactDelta,\n toolConfirmations,\n authRequests,\n escalated,\n messageMetadata,\n sendMessage,\n cancel,\n setMessages,\n replaceMessages,\n } = useAdkMessages({\n stream,\n ...(eventHandlers && { eventHandlers }),\n });\n\n const [isRunning, setIsRunning] = useState(false);\n const [toolStatuses, setToolStatuses] = useState<\n Record<string, ToolExecutionStatus>\n >({});\n const hasExecutingTools = Object.values(toolStatuses).some(\n (s) => s?.type === \"executing\",\n );\n const effectiveIsRunning = isRunning || hasExecutingTools;\n\n const handleSendMessage = async (\n msgs: AdkMessage[],\n config: AdkSendMessageConfig,\n ) => {\n try {\n setIsRunning(true);\n await sendMessage(msgs, config);\n } finally {\n setIsRunning(false);\n }\n };\n\n const threadMessages = useExternalMessageConverter({\n callback: convertAdkMessage,\n messages,\n isRunning: effectiveIsRunning,\n });\n\n const threadMessagesRef = useRef(threadMessages);\n threadMessagesRef.current = threadMessages;\n\n const adkMessagesRef = useRef(messages);\n adkMessagesRef.current = messages;\n\n const stagedMessagesRef = useRef(\n new Map<\n string,\n {\n message: AdkMessage & { id: string };\n runConfig: AppendMessage[\"runConfig\"];\n }\n >(),\n );\n const [stagedMessageCount, setStagedMessageCount] = useState(0);\n const hasStagedMessages = stagedMessageCount > 0;\n\n const getStagedRun = (parentId: string | null) => {\n if (!parentId || !stagedMessagesRef.current.has(parentId)) return null;\n\n const staged: AdkMessage[] = [];\n for (const message of adkMessagesRef.current) {\n if (message.id && stagedMessagesRef.current.has(message.id)) {\n staged.push(stagedMessagesRef.current.get(message.id)!.message);\n }\n if (message.id === parentId) break;\n }\n\n return {\n messages: staged,\n runConfig: stagedMessagesRef.current.get(parentId)!.runConfig,\n };\n };\n\n const stageUserMessage = (msg: AppendMessage) => {\n const stagedMessage = toAdkUserMessage(msg);\n stagedMessagesRef.current.set(stagedMessage.id, {\n message: stagedMessage,\n runConfig: msg.runConfig,\n });\n setStagedMessageCount(stagedMessagesRef.current.size);\n const nextMessages = [...adkMessagesRef.current, stagedMessage];\n adkMessagesRef.current = nextMessages;\n setMessages(nextMessages);\n };\n\n const runtime = useExternalStoreRuntime({\n ...pickExternalStoreSharedOptions(options),\n isRunning: effectiveIsRunning,\n messages: threadMessages,\n unstable_enableToolInvocations: true,\n setToolStatuses,\n adapters: { attachments, dictation, feedback, speech, voice },\n extras: adkExtras.provide({\n agentInfo,\n stateDelta,\n artifactDelta,\n longRunningToolIds,\n toolConfirmations,\n authRequests,\n escalated,\n messageMetadata,\n send: handleSendMessage,\n }),\n onNew: async (msg) => {\n if (!(msg.startRun ?? msg.role === \"user\")) {\n stageUserMessage(msg);\n return;\n }\n\n const cancellations =\n autoCancelPendingToolCalls !== false\n ? getPendingCancellations(messages, longRunningToolIds)\n : [];\n\n return handleSendMessage(\n [\n ...cancellations,\n {\n id: uuidv4(),\n type: \"human\",\n content: getMessageContent(msg),\n },\n ],\n { runConfig: msg.runConfig },\n );\n },\n onEdit: getCheckpointId\n ? async (msg) => {\n const truncated = truncateAdkMessages(\n threadMessagesRef.current,\n msg.parentId,\n );\n replaceMessages(truncated);\n if (!(msg.startRun ?? msg.role === \"user\")) {\n const stagedMessage = toAdkUserMessage(msg);\n stagedMessagesRef.current.set(stagedMessage.id, {\n message: stagedMessage,\n runConfig: msg.runConfig,\n });\n setStagedMessageCount(stagedMessagesRef.current.size);\n const nextMessages = [...truncated, stagedMessage];\n adkMessagesRef.current = nextMessages;\n setMessages(nextMessages);\n return;\n }\n const externalId = aui.threadListItem().getState().externalId;\n const checkpointId = externalId\n ? await getCheckpointId(externalId, truncated)\n : null;\n return handleSendMessage(\n [\n {\n id: uuidv4(),\n type: \"human\",\n content: getMessageContent(msg),\n },\n ],\n {\n runConfig: msg.runConfig,\n ...(checkpointId && { checkpointId }),\n },\n );\n }\n : undefined,\n ...(getCheckpointId || hasStagedMessages\n ? {\n onReload: async (parentId, config) => {\n const stagedRun = getStagedRun(parentId);\n if (stagedRun) {\n for (const message of stagedRun.messages) {\n stagedMessagesRef.current.delete(message.id);\n }\n setStagedMessageCount(stagedMessagesRef.current.size);\n return handleSendMessage(stagedRun.messages, {\n runConfig: config.runConfig ?? stagedRun.runConfig,\n });\n }\n\n if (!getCheckpointId)\n throw new Error(\"Runtime does not support reloading messages.\");\n\n const truncated = truncateAdkMessages(\n threadMessagesRef.current,\n parentId,\n );\n replaceMessages(truncated);\n const externalId = aui.threadListItem().getState().externalId;\n const checkpointId = externalId\n ? await getCheckpointId(externalId, truncated)\n : null;\n return handleSendMessage([], {\n runConfig: config.runConfig,\n ...(checkpointId && { checkpointId }),\n });\n },\n }\n : {}),\n onAddToolResult: async ({\n toolCallId,\n toolName,\n result,\n isError,\n artifact,\n }) => {\n await handleSendMessage(\n [\n {\n id: uuidv4(),\n type: \"tool\",\n name: toolName,\n tool_call_id: toolCallId,\n content: JSON.stringify(result),\n artifact,\n status: isError ? \"error\" : \"success\",\n },\n ],\n {},\n );\n },\n onCancel: unstable_allowCancellation\n ? async () => {\n cancel();\n }\n : undefined,\n });\n\n {\n const loadRef = useRef(load);\n useEffect(() => {\n loadRef.current = load;\n });\n\n useEffect(() => {\n const loadFn = loadRef.current;\n if (!loadFn) return;\n\n const externalId = aui.threadListItem().getState().externalId;\n if (externalId == null) return;\n\n loadFn(externalId).then(\n ({ messages: msgs }) => {\n replaceMessages(msgs);\n },\n (e) => {\n console.warn(\"Failed to load ADK session:\", e);\n },\n );\n }, [aui, replaceMessages]);\n }\n\n return runtime;\n};\n\nexport const useAdkRuntime = ({\n cloud,\n sessionAdapter,\n create,\n delete: deleteFn,\n onThreadIdChange,\n ...options\n}: UseAdkRuntimeOptions) => {\n const aui = useAui();\n const cloudAdapter = useCloudThreadListAdapter({\n cloud,\n create: async () => {\n if (create) return create();\n if (aui.threadListItem.source) return aui.threadListItem().initialize();\n return { externalId: undefined };\n },\n delete: deleteFn,\n });\n\n const adapter = sessionAdapter ?? cloudAdapter;\n\n return useRemoteThreadListRuntime({\n runtimeHook: function RuntimeHook() {\n return useAdkRuntimeImpl(options);\n },\n adapter,\n allowNesting: true,\n onThreadIdChange,\n });\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assistant-ui/react-google-adk",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.16",
|
|
4
4
|
"description": "Google ADK adapter for assistant-ui",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"google-adk",
|
|
@@ -34,11 +34,11 @@
|
|
|
34
34
|
],
|
|
35
35
|
"sideEffects": false,
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@assistant-ui/core": "^0.2.
|
|
38
|
-
"@assistant-ui/store": "^0.2.
|
|
37
|
+
"@assistant-ui/core": "^0.2.19",
|
|
38
|
+
"@assistant-ui/store": "^0.2.19",
|
|
39
39
|
"assistant-cloud": "*",
|
|
40
|
-
"assistant-stream": "^0.3.
|
|
41
|
-
"uuid": "^14.0.
|
|
40
|
+
"assistant-stream": "^0.3.24",
|
|
41
|
+
"uuid": "^14.0.1"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
44
|
"@google/adk": ">=0.5.0",
|
|
@@ -57,8 +57,8 @@
|
|
|
57
57
|
"@types/react": "^19.2.17",
|
|
58
58
|
"@types/uuid": "^11.0.0",
|
|
59
59
|
"react": "^19.2.7",
|
|
60
|
-
"vitest": "^4.1.
|
|
61
|
-
"@assistant-ui/x-buildutils": "0.0.
|
|
60
|
+
"vitest": "^4.1.9",
|
|
61
|
+
"@assistant-ui/x-buildutils": "0.0.16"
|
|
62
62
|
},
|
|
63
63
|
"publishConfig": {
|
|
64
64
|
"access": "public",
|
package/src/adkExtras.ts
ADDED
package/src/hooks.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { useAui
|
|
1
|
+
import { useAui } from "@assistant-ui/store";
|
|
2
2
|
import { v4 as uuidv4 } from "uuid";
|
|
3
3
|
import type { ReadonlyJSONValue } from "assistant-stream/utils";
|
|
4
|
+
import { adkExtras } from "./adkExtras";
|
|
4
5
|
import type {
|
|
5
6
|
AdkMessage,
|
|
6
7
|
AdkSendMessageConfig,
|
|
@@ -10,115 +11,50 @@ import type {
|
|
|
10
11
|
AdkMessageMetadata,
|
|
11
12
|
} from "./types";
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
stateDelta: Record<string, unknown>;
|
|
20
|
-
artifactDelta: Record<string, number>;
|
|
21
|
-
longRunningToolIds: string[];
|
|
22
|
-
toolConfirmations: AdkToolConfirmation[];
|
|
23
|
-
authRequests: AdkAuthRequest[];
|
|
24
|
-
escalated: boolean;
|
|
25
|
-
messageMetadata: Map<string, AdkMessageMetadata>;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
const asAdkRuntimeExtras = (extras: unknown): AdkRuntimeExtras => {
|
|
29
|
-
if (
|
|
30
|
-
typeof extras !== "object" ||
|
|
31
|
-
extras == null ||
|
|
32
|
-
!(symbolAdkRuntimeExtras in extras)
|
|
33
|
-
)
|
|
34
|
-
throw new Error(
|
|
35
|
-
"This method can only be called when you are using useAdkRuntime",
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
return extras as AdkRuntimeExtras;
|
|
39
|
-
};
|
|
14
|
+
const EMPTY_STATE_DELTA: Record<string, unknown> = {};
|
|
15
|
+
const EMPTY_ARTIFACT_DELTA: Record<string, number> = {};
|
|
16
|
+
const EMPTY_LONG_RUNNING_TOOL_IDS: string[] = [];
|
|
17
|
+
const EMPTY_TOOL_CONFIRMATIONS: AdkToolConfirmation[] = [];
|
|
18
|
+
const EMPTY_AUTH_REQUESTS: AdkAuthRequest[] = [];
|
|
19
|
+
const EMPTY_MESSAGE_METADATA = new Map<string, AdkMessageMetadata>();
|
|
40
20
|
|
|
41
21
|
/** Returns the name and branch of the currently active ADK agent. */
|
|
42
|
-
export const useAdkAgentInfo = () =>
|
|
43
|
-
|
|
44
|
-
const extras = s.thread.extras;
|
|
45
|
-
if (!extras) return undefined;
|
|
46
|
-
return asAdkRuntimeExtras(extras).agentInfo;
|
|
47
|
-
});
|
|
48
|
-
};
|
|
22
|
+
export const useAdkAgentInfo = () =>
|
|
23
|
+
adkExtras.use((e) => e.agentInfo, undefined);
|
|
49
24
|
|
|
50
25
|
/** Returns the accumulated session state delta from ADK events. */
|
|
51
|
-
export const useAdkSessionState = () =>
|
|
52
|
-
|
|
53
|
-
const extras = s.thread.extras;
|
|
54
|
-
if (!extras) return {};
|
|
55
|
-
return asAdkRuntimeExtras(extras).stateDelta;
|
|
56
|
-
});
|
|
57
|
-
};
|
|
26
|
+
export const useAdkSessionState = () =>
|
|
27
|
+
adkExtras.use((e) => e.stateDelta, EMPTY_STATE_DELTA);
|
|
58
28
|
|
|
59
29
|
/** Returns a function to send raw ADK messages. */
|
|
60
30
|
export const useAdkSend = () => {
|
|
61
31
|
const aui = useAui();
|
|
62
|
-
return (messages: AdkMessage[], config: AdkSendMessageConfig) =>
|
|
63
|
-
|
|
64
|
-
const { send } = asAdkRuntimeExtras(extras);
|
|
65
|
-
return send(messages, config);
|
|
66
|
-
};
|
|
32
|
+
return (messages: AdkMessage[], config: AdkSendMessageConfig) =>
|
|
33
|
+
adkExtras.get(aui).send(messages, config);
|
|
67
34
|
};
|
|
68
35
|
|
|
69
36
|
/** Returns the IDs of long-running tools awaiting external input. */
|
|
70
|
-
export const useAdkLongRunningToolIds = () =>
|
|
71
|
-
|
|
72
|
-
const extras = s.thread.extras;
|
|
73
|
-
if (!extras) return [];
|
|
74
|
-
return asAdkRuntimeExtras(extras).longRunningToolIds;
|
|
75
|
-
});
|
|
76
|
-
};
|
|
37
|
+
export const useAdkLongRunningToolIds = () =>
|
|
38
|
+
adkExtras.use((e) => e.longRunningToolIds, EMPTY_LONG_RUNNING_TOOL_IDS);
|
|
77
39
|
|
|
78
40
|
/** Returns pending tool confirmation requests (from SecurityPlugin etc). */
|
|
79
|
-
export const useAdkToolConfirmations = () =>
|
|
80
|
-
|
|
81
|
-
const extras = s.thread.extras;
|
|
82
|
-
if (!extras) return [];
|
|
83
|
-
return asAdkRuntimeExtras(extras).toolConfirmations;
|
|
84
|
-
});
|
|
85
|
-
};
|
|
41
|
+
export const useAdkToolConfirmations = () =>
|
|
42
|
+
adkExtras.use((e) => e.toolConfirmations, EMPTY_TOOL_CONFIRMATIONS);
|
|
86
43
|
|
|
87
44
|
/** Returns pending auth credential requests from tools. */
|
|
88
|
-
export const useAdkAuthRequests = () =>
|
|
89
|
-
|
|
90
|
-
const extras = s.thread.extras;
|
|
91
|
-
if (!extras) return [];
|
|
92
|
-
return asAdkRuntimeExtras(extras).authRequests;
|
|
93
|
-
});
|
|
94
|
-
};
|
|
45
|
+
export const useAdkAuthRequests = () =>
|
|
46
|
+
adkExtras.use((e) => e.authRequests, EMPTY_AUTH_REQUESTS);
|
|
95
47
|
|
|
96
48
|
/** Returns the accumulated artifact delta (filename → version). */
|
|
97
|
-
export const useAdkArtifacts = () =>
|
|
98
|
-
|
|
99
|
-
const extras = s.thread.extras;
|
|
100
|
-
if (!extras) return {};
|
|
101
|
-
return asAdkRuntimeExtras(extras).artifactDelta;
|
|
102
|
-
});
|
|
103
|
-
};
|
|
49
|
+
export const useAdkArtifacts = () =>
|
|
50
|
+
adkExtras.use((e) => e.artifactDelta, EMPTY_ARTIFACT_DELTA);
|
|
104
51
|
|
|
105
52
|
/** Returns whether any agent has escalated (requested human handoff). */
|
|
106
|
-
export const useAdkEscalation = () =>
|
|
107
|
-
return useAuiState((s) => {
|
|
108
|
-
const extras = s.thread.extras;
|
|
109
|
-
if (!extras) return false;
|
|
110
|
-
return asAdkRuntimeExtras(extras).escalated;
|
|
111
|
-
});
|
|
112
|
-
};
|
|
53
|
+
export const useAdkEscalation = () => adkExtras.use((e) => e.escalated, false);
|
|
113
54
|
|
|
114
55
|
/** Returns per-message metadata (grounding, citation, usage). Keyed by message ID. */
|
|
115
|
-
export const useAdkMessageMetadata = () =>
|
|
116
|
-
|
|
117
|
-
const extras = s.thread.extras;
|
|
118
|
-
if (!extras) return new Map<string, AdkMessageMetadata>();
|
|
119
|
-
return asAdkRuntimeExtras(extras).messageMetadata;
|
|
120
|
-
});
|
|
121
|
-
};
|
|
56
|
+
export const useAdkMessageMetadata = () =>
|
|
57
|
+
adkExtras.use((e) => e.messageMetadata, EMPTY_MESSAGE_METADATA);
|
|
122
58
|
|
|
123
59
|
// ── Convenience helpers for interactive flows ──
|
|
124
60
|
|
|
@@ -129,10 +65,8 @@ export const useAdkConfirmTool = () => {
|
|
|
129
65
|
toolCallId: string,
|
|
130
66
|
confirmed: boolean,
|
|
131
67
|
payload?: ReadonlyJSONValue,
|
|
132
|
-
) =>
|
|
133
|
-
|
|
134
|
-
const { send } = asAdkRuntimeExtras(extras);
|
|
135
|
-
return send(
|
|
68
|
+
) =>
|
|
69
|
+
adkExtras.get(aui).send(
|
|
136
70
|
[
|
|
137
71
|
{
|
|
138
72
|
id: uuidv4(),
|
|
@@ -148,16 +82,13 @@ export const useAdkConfirmTool = () => {
|
|
|
148
82
|
],
|
|
149
83
|
{},
|
|
150
84
|
);
|
|
151
|
-
};
|
|
152
85
|
};
|
|
153
86
|
|
|
154
87
|
/** Returns a function to submit auth credentials for a pending auth request. */
|
|
155
88
|
export const useAdkSubmitAuth = () => {
|
|
156
89
|
const aui = useAui();
|
|
157
|
-
return (toolCallId: string, credential: AdkAuthCredential) =>
|
|
158
|
-
|
|
159
|
-
const { send } = asAdkRuntimeExtras(extras);
|
|
160
|
-
return send(
|
|
90
|
+
return (toolCallId: string, credential: AdkAuthCredential) =>
|
|
91
|
+
adkExtras.get(aui).send(
|
|
161
92
|
[
|
|
162
93
|
{
|
|
163
94
|
id: uuidv4(),
|
|
@@ -170,16 +101,13 @@ export const useAdkSubmitAuth = () => {
|
|
|
170
101
|
],
|
|
171
102
|
{},
|
|
172
103
|
);
|
|
173
|
-
};
|
|
174
104
|
};
|
|
175
105
|
|
|
176
106
|
/** Returns a function to submit the user's answer for a pending `adk_request_input` HITL interrupt. */
|
|
177
107
|
export const useAdkSubmitInput = () => {
|
|
178
108
|
const aui = useAui();
|
|
179
|
-
return (toolCallId: string, result: ReadonlyJSONValue) =>
|
|
180
|
-
|
|
181
|
-
const { send } = asAdkRuntimeExtras(extras);
|
|
182
|
-
return send(
|
|
109
|
+
return (toolCallId: string, result: ReadonlyJSONValue) =>
|
|
110
|
+
adkExtras.get(aui).send(
|
|
183
111
|
[
|
|
184
112
|
{
|
|
185
113
|
id: uuidv4(),
|
|
@@ -192,7 +120,6 @@ export const useAdkSubmitInput = () => {
|
|
|
192
120
|
],
|
|
193
121
|
{},
|
|
194
122
|
);
|
|
195
|
-
};
|
|
196
123
|
};
|
|
197
124
|
|
|
198
125
|
// ── State prefix helpers ──
|
|
@@ -215,28 +142,22 @@ const filterByPrefix = (
|
|
|
215
142
|
};
|
|
216
143
|
|
|
217
144
|
/** Returns app-level state (keys prefixed with `app:`, prefix stripped). */
|
|
218
|
-
export const useAdkAppState = () =>
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
});
|
|
224
|
-
};
|
|
145
|
+
export const useAdkAppState = () =>
|
|
146
|
+
adkExtras.use(
|
|
147
|
+
(e) => filterByPrefix(e.stateDelta, APP_PREFIX),
|
|
148
|
+
EMPTY_STATE_DELTA,
|
|
149
|
+
);
|
|
225
150
|
|
|
226
151
|
/** Returns user-level state (keys prefixed with `user:`, prefix stripped). */
|
|
227
|
-
export const useAdkUserState = () =>
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
});
|
|
233
|
-
};
|
|
152
|
+
export const useAdkUserState = () =>
|
|
153
|
+
adkExtras.use(
|
|
154
|
+
(e) => filterByPrefix(e.stateDelta, USER_PREFIX),
|
|
155
|
+
EMPTY_STATE_DELTA,
|
|
156
|
+
);
|
|
234
157
|
|
|
235
158
|
/** Returns temp state (keys prefixed with `temp:`, prefix stripped). Not persisted. */
|
|
236
|
-
export const useAdkTempState = () =>
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
});
|
|
242
|
-
};
|
|
159
|
+
export const useAdkTempState = () =>
|
|
160
|
+
adkExtras.use(
|
|
161
|
+
(e) => filterByPrefix(e.stateDelta, TEMP_PREFIX),
|
|
162
|
+
EMPTY_STATE_DELTA,
|
|
163
|
+
);
|
package/src/types.ts
CHANGED
|
@@ -274,3 +274,16 @@ export type OnAdkCustomEventCallback = (
|
|
|
274
274
|
export type OnAdkAgentTransferCallback = (
|
|
275
275
|
toAgent: string,
|
|
276
276
|
) => void | Promise<void>;
|
|
277
|
+
|
|
278
|
+
/** Private state and actions `useAdkRuntime` exposes through `thread.extras`. */
|
|
279
|
+
export type AdkRuntimeExtras = {
|
|
280
|
+
send: (messages: AdkMessage[], config: AdkSendMessageConfig) => Promise<void>;
|
|
281
|
+
agentInfo: { name?: string | undefined; branch?: string | undefined };
|
|
282
|
+
stateDelta: Record<string, unknown>;
|
|
283
|
+
artifactDelta: Record<string, number>;
|
|
284
|
+
longRunningToolIds: string[];
|
|
285
|
+
toolConfirmations: AdkToolConfirmation[];
|
|
286
|
+
authRequests: AdkAuthRequest[];
|
|
287
|
+
escalated: boolean;
|
|
288
|
+
messageMetadata: Map<string, AdkMessageMetadata>;
|
|
289
|
+
};
|