@assistant-ui/react-google-adk 0.0.14 → 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/hooks.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","names":["uuidv4"],"sources":["../src/hooks.ts"],"sourcesContent":["import { useAui, useAuiState } from \"@assistant-ui/store\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type { ReadonlyJSONValue } from \"assistant-stream/utils\";\nimport type {\n AdkMessage,\n AdkSendMessageConfig,\n AdkToolConfirmation,\n AdkAuthCredential,\n AdkAuthRequest,\n AdkMessageMetadata,\n} from \"./types\";\n\nexport const symbolAdkRuntimeExtras = Symbol(\"adk-runtime-extras\");\n\nexport type AdkRuntimeExtras = {\n [symbolAdkRuntimeExtras]: true;\n send: (messages: AdkMessage[], config: AdkSendMessageConfig) => Promise<void>;\n agentInfo: { name?: string | undefined; branch?: string | undefined };\n stateDelta: Record<string, unknown>;\n artifactDelta: Record<string, number>;\n longRunningToolIds: string[];\n toolConfirmations: AdkToolConfirmation[];\n authRequests: AdkAuthRequest[];\n escalated: boolean;\n messageMetadata: Map<string, AdkMessageMetadata>;\n};\n\nconst asAdkRuntimeExtras = (extras: unknown): AdkRuntimeExtras => {\n if (\n typeof extras !== \"object\" ||\n extras == null ||\n !(symbolAdkRuntimeExtras in extras)\n )\n throw new Error(\n \"This method can only be called when you are using useAdkRuntime\",\n );\n\n return extras as AdkRuntimeExtras;\n};\n\n/** Returns the name and branch of the currently active ADK agent. */\nexport const useAdkAgentInfo = () => {\n return useAuiState((s) => {\n const extras = s.thread.extras;\n if (!extras) return undefined;\n return asAdkRuntimeExtras(extras).agentInfo;\n });\n};\n\n/** Returns the accumulated session state delta from ADK events. */\nexport const useAdkSessionState = () => {\n return useAuiState((s) => {\n const extras = s.thread.extras;\n if (!extras) return {};\n return asAdkRuntimeExtras(extras).stateDelta;\n });\n};\n\n/** Returns a function to send raw ADK messages. */\nexport const useAdkSend = () => {\n const aui = useAui();\n return (messages: AdkMessage[], config: AdkSendMessageConfig) => {\n const extras = aui.thread().getState().extras;\n const { send } = asAdkRuntimeExtras(extras);\n return send(messages, config);\n };\n};\n\n/** Returns the IDs of long-running tools awaiting external input. */\nexport const useAdkLongRunningToolIds = () => {\n return useAuiState((s) => {\n const extras = s.thread.extras;\n if (!extras) return [];\n return asAdkRuntimeExtras(extras).longRunningToolIds;\n });\n};\n\n/** Returns pending tool confirmation requests (from SecurityPlugin etc). */\nexport const useAdkToolConfirmations = () => {\n return useAuiState((s) => {\n const extras = s.thread.extras;\n if (!extras) return [];\n return asAdkRuntimeExtras(extras).toolConfirmations;\n });\n};\n\n/** Returns pending auth credential requests from tools. */\nexport const useAdkAuthRequests = () => {\n return useAuiState((s) => {\n const extras = s.thread.extras;\n if (!extras) return [];\n return asAdkRuntimeExtras(extras).authRequests;\n });\n};\n\n/** Returns the accumulated artifact delta (filename → version). */\nexport const useAdkArtifacts = () => {\n return useAuiState((s) => {\n const extras = s.thread.extras;\n if (!extras) return {};\n return asAdkRuntimeExtras(extras).artifactDelta;\n });\n};\n\n/** Returns whether any agent has escalated (requested human handoff). */\nexport const useAdkEscalation = () => {\n return useAuiState((s) => {\n const extras = s.thread.extras;\n if (!extras) return false;\n return asAdkRuntimeExtras(extras).escalated;\n });\n};\n\n/** Returns per-message metadata (grounding, citation, usage). Keyed by message ID. */\nexport const useAdkMessageMetadata = () => {\n return useAuiState((s) => {\n const extras = s.thread.extras;\n if (!extras) return new Map<string, AdkMessageMetadata>();\n return asAdkRuntimeExtras(extras).messageMetadata;\n });\n};\n\n// ── Convenience helpers for interactive flows ──\n\n/** Returns a function to confirm or deny a pending tool confirmation. */\nexport const useAdkConfirmTool = () => {\n const aui = useAui();\n return (\n toolCallId: string,\n confirmed: boolean,\n payload?: ReadonlyJSONValue,\n ) => {\n const extras = aui.thread().getState().extras;\n const { send } = asAdkRuntimeExtras(extras);\n return send(\n [\n {\n id: uuidv4(),\n type: \"tool\",\n tool_call_id: toolCallId,\n name: \"adk_request_confirmation\",\n content: JSON.stringify({\n confirmed,\n ...(payload != null && { payload }),\n }),\n status: \"success\",\n },\n ],\n {},\n );\n };\n};\n\n/** Returns a function to submit auth credentials for a pending auth request. */\nexport const useAdkSubmitAuth = () => {\n const aui = useAui();\n return (toolCallId: string, credential: AdkAuthCredential) => {\n const extras = aui.thread().getState().extras;\n const { send } = asAdkRuntimeExtras(extras);\n return send(\n [\n {\n id: uuidv4(),\n type: \"tool\",\n tool_call_id: toolCallId,\n name: \"adk_request_credential\",\n content: JSON.stringify(credential),\n status: \"success\",\n },\n ],\n {},\n );\n };\n};\n\n/** Returns a function to submit the user's answer for a pending `adk_request_input` HITL interrupt. */\nexport const useAdkSubmitInput = () => {\n const aui = useAui();\n return (toolCallId: string, result: ReadonlyJSONValue) => {\n const extras = aui.thread().getState().extras;\n const { send } = asAdkRuntimeExtras(extras);\n return send(\n [\n {\n id: uuidv4(),\n type: \"tool\",\n tool_call_id: toolCallId,\n name: \"adk_request_input\",\n content: JSON.stringify({ result }),\n status: \"success\",\n },\n ],\n {},\n );\n };\n};\n\n// ── State prefix helpers ──\n\nconst APP_PREFIX = \"app:\";\nconst USER_PREFIX = \"user:\";\nconst TEMP_PREFIX = \"temp:\";\n\nconst filterByPrefix = (\n state: Record<string, unknown>,\n prefix: string,\n): Record<string, unknown> => {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(state)) {\n if (key.startsWith(prefix)) {\n result[key.slice(prefix.length)] = state[key];\n }\n }\n return result;\n};\n\n/** Returns app-level state (keys prefixed with `app:`, prefix stripped). */\nexport const useAdkAppState = () => {\n return useAuiState((s) => {\n const extras = s.thread.extras;\n if (!extras) return {};\n return filterByPrefix(asAdkRuntimeExtras(extras).stateDelta, APP_PREFIX);\n });\n};\n\n/** Returns user-level state (keys prefixed with `user:`, prefix stripped). */\nexport const useAdkUserState = () => {\n return useAuiState((s) => {\n const extras = s.thread.extras;\n if (!extras) return {};\n return filterByPrefix(asAdkRuntimeExtras(extras).stateDelta, USER_PREFIX);\n });\n};\n\n/** Returns temp state (keys prefixed with `temp:`, prefix stripped). Not persisted. */\nexport const useAdkTempState = () => {\n return useAuiState((s) => {\n const extras = s.thread.extras;\n if (!extras) return {};\n return filterByPrefix(asAdkRuntimeExtras(extras).stateDelta, TEMP_PREFIX);\n });\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"hooks.js","names":["uuidv4"],"sources":["../src/hooks.ts"],"sourcesContent":["import { useAui } from \"@assistant-ui/store\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type { ReadonlyJSONValue } from \"assistant-stream/utils\";\nimport { adkExtras } from \"./adkExtras\";\nimport type {\n AdkMessage,\n AdkSendMessageConfig,\n AdkToolConfirmation,\n AdkAuthCredential,\n AdkAuthRequest,\n AdkMessageMetadata,\n} from \"./types\";\n\nconst EMPTY_STATE_DELTA: Record<string, unknown> = {};\nconst EMPTY_ARTIFACT_DELTA: Record<string, number> = {};\nconst EMPTY_LONG_RUNNING_TOOL_IDS: string[] = [];\nconst EMPTY_TOOL_CONFIRMATIONS: AdkToolConfirmation[] = [];\nconst EMPTY_AUTH_REQUESTS: AdkAuthRequest[] = [];\nconst EMPTY_MESSAGE_METADATA = new Map<string, AdkMessageMetadata>();\n\n/** Returns the name and branch of the currently active ADK agent. */\nexport const useAdkAgentInfo = () =>\n adkExtras.use((e) => e.agentInfo, undefined);\n\n/** Returns the accumulated session state delta from ADK events. */\nexport const useAdkSessionState = () =>\n adkExtras.use((e) => e.stateDelta, EMPTY_STATE_DELTA);\n\n/** Returns a function to send raw ADK messages. */\nexport const useAdkSend = () => {\n const aui = useAui();\n return (messages: AdkMessage[], config: AdkSendMessageConfig) =>\n adkExtras.get(aui).send(messages, config);\n};\n\n/** Returns the IDs of long-running tools awaiting external input. */\nexport const useAdkLongRunningToolIds = () =>\n adkExtras.use((e) => e.longRunningToolIds, EMPTY_LONG_RUNNING_TOOL_IDS);\n\n/** Returns pending tool confirmation requests (from SecurityPlugin etc). */\nexport const useAdkToolConfirmations = () =>\n adkExtras.use((e) => e.toolConfirmations, EMPTY_TOOL_CONFIRMATIONS);\n\n/** Returns pending auth credential requests from tools. */\nexport const useAdkAuthRequests = () =>\n adkExtras.use((e) => e.authRequests, EMPTY_AUTH_REQUESTS);\n\n/** Returns the accumulated artifact delta (filename → version). */\nexport const useAdkArtifacts = () =>\n adkExtras.use((e) => e.artifactDelta, EMPTY_ARTIFACT_DELTA);\n\n/** Returns whether any agent has escalated (requested human handoff). */\nexport const useAdkEscalation = () => adkExtras.use((e) => e.escalated, false);\n\n/** Returns per-message metadata (grounding, citation, usage). Keyed by message ID. */\nexport const useAdkMessageMetadata = () =>\n adkExtras.use((e) => e.messageMetadata, EMPTY_MESSAGE_METADATA);\n\n// ── Convenience helpers for interactive flows ──\n\n/** Returns a function to confirm or deny a pending tool confirmation. */\nexport const useAdkConfirmTool = () => {\n const aui = useAui();\n return (\n toolCallId: string,\n confirmed: boolean,\n payload?: ReadonlyJSONValue,\n ) =>\n adkExtras.get(aui).send(\n [\n {\n id: uuidv4(),\n type: \"tool\",\n tool_call_id: toolCallId,\n name: \"adk_request_confirmation\",\n content: JSON.stringify({\n confirmed,\n ...(payload != null && { payload }),\n }),\n status: \"success\",\n },\n ],\n {},\n );\n};\n\n/** Returns a function to submit auth credentials for a pending auth request. */\nexport const useAdkSubmitAuth = () => {\n const aui = useAui();\n return (toolCallId: string, credential: AdkAuthCredential) =>\n adkExtras.get(aui).send(\n [\n {\n id: uuidv4(),\n type: \"tool\",\n tool_call_id: toolCallId,\n name: \"adk_request_credential\",\n content: JSON.stringify(credential),\n status: \"success\",\n },\n ],\n {},\n );\n};\n\n/** Returns a function to submit the user's answer for a pending `adk_request_input` HITL interrupt. */\nexport const useAdkSubmitInput = () => {\n const aui = useAui();\n return (toolCallId: string, result: ReadonlyJSONValue) =>\n adkExtras.get(aui).send(\n [\n {\n id: uuidv4(),\n type: \"tool\",\n tool_call_id: toolCallId,\n name: \"adk_request_input\",\n content: JSON.stringify({ result }),\n status: \"success\",\n },\n ],\n {},\n );\n};\n\n// ── State prefix helpers ──\n\nconst APP_PREFIX = \"app:\";\nconst USER_PREFIX = \"user:\";\nconst TEMP_PREFIX = \"temp:\";\n\nconst filterByPrefix = (\n state: Record<string, unknown>,\n prefix: string,\n): Record<string, unknown> => {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(state)) {\n if (key.startsWith(prefix)) {\n result[key.slice(prefix.length)] = state[key];\n }\n }\n return result;\n};\n\n/** Returns app-level state (keys prefixed with `app:`, prefix stripped). */\nexport const useAdkAppState = () =>\n adkExtras.use(\n (e) => filterByPrefix(e.stateDelta, APP_PREFIX),\n EMPTY_STATE_DELTA,\n );\n\n/** Returns user-level state (keys prefixed with `user:`, prefix stripped). */\nexport const useAdkUserState = () =>\n adkExtras.use(\n (e) => filterByPrefix(e.stateDelta, USER_PREFIX),\n EMPTY_STATE_DELTA,\n );\n\n/** Returns temp state (keys prefixed with `temp:`, prefix stripped). Not persisted. */\nexport const useAdkTempState = () =>\n adkExtras.use(\n (e) => filterByPrefix(e.stateDelta, TEMP_PREFIX),\n EMPTY_STATE_DELTA,\n );\n"],"mappings":";;;;AAaA,MAAM,oBAA6C,CAAC;AACpD,MAAM,uBAA+C,CAAC;AACtD,MAAM,8BAAwC,CAAC;AAC/C,MAAM,2BAAkD,CAAC;AACzD,MAAM,sBAAwC,CAAC;AAC/C,MAAM,yCAAyB,IAAI,IAAgC;;AAGnE,MAAa,wBACX,UAAU,KAAK,MAAM,EAAE,WAAW,KAAA,CAAS;;AAG7C,MAAa,2BACX,UAAU,KAAK,MAAM,EAAE,YAAY,iBAAiB;;AAGtD,MAAa,mBAAmB;CAC9B,MAAM,MAAM,OAAO;CACnB,QAAQ,UAAwB,WAC9B,UAAU,IAAI,GAAG,CAAC,CAAC,KAAK,UAAU,MAAM;AAC5C;;AAGA,MAAa,iCACX,UAAU,KAAK,MAAM,EAAE,oBAAoB,2BAA2B;;AAGxE,MAAa,gCACX,UAAU,KAAK,MAAM,EAAE,mBAAmB,wBAAwB;;AAGpE,MAAa,2BACX,UAAU,KAAK,MAAM,EAAE,cAAc,mBAAmB;;AAG1D,MAAa,wBACX,UAAU,KAAK,MAAM,EAAE,eAAe,oBAAoB;;AAG5D,MAAa,yBAAyB,UAAU,KAAK,MAAM,EAAE,WAAW,KAAK;;AAG7E,MAAa,8BACX,UAAU,KAAK,MAAM,EAAE,iBAAiB,sBAAsB;;AAKhE,MAAa,0BAA0B;CACrC,MAAM,MAAM,OAAO;CACnB,QACE,YACA,WACA,YAEA,UAAU,IAAI,GAAG,CAAC,CAAC,KACjB,CACE;EACE,IAAIA,GAAO;EACX,MAAM;EACN,cAAc;EACd,MAAM;EACN,SAAS,KAAK,UAAU;GACtB;GACA,GAAI,WAAW,QAAQ,EAAE,QAAQ;EACnC,CAAC;EACD,QAAQ;CACV,CACF,GACA,CAAC,CACH;AACJ;;AAGA,MAAa,yBAAyB;CACpC,MAAM,MAAM,OAAO;CACnB,QAAQ,YAAoB,eAC1B,UAAU,IAAI,GAAG,CAAC,CAAC,KACjB,CACE;EACE,IAAIA,GAAO;EACX,MAAM;EACN,cAAc;EACd,MAAM;EACN,SAAS,KAAK,UAAU,UAAU;EAClC,QAAQ;CACV,CACF,GACA,CAAC,CACH;AACJ;;AAGA,MAAa,0BAA0B;CACrC,MAAM,MAAM,OAAO;CACnB,QAAQ,YAAoB,WAC1B,UAAU,IAAI,GAAG,CAAC,CAAC,KACjB,CACE;EACE,IAAIA,GAAO;EACX,MAAM;EACN,cAAc;EACd,MAAM;EACN,SAAS,KAAK,UAAU,EAAE,OAAO,CAAC;EAClC,QAAQ;CACV,CACF,GACA,CAAC,CACH;AACJ;AAIA,MAAM,aAAa;AACnB,MAAM,cAAc;AACpB,MAAM,cAAc;AAEpB,MAAM,kBACJ,OACA,WAC4B;CAC5B,MAAM,SAAkC,CAAC;CACzC,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,GACjC,IAAI,IAAI,WAAW,MAAM,GACvB,OAAO,IAAI,MAAM,OAAO,MAAM,KAAK,MAAM;CAG7C,OAAO;AACT;;AAGA,MAAa,uBACX,UAAU,KACP,MAAM,eAAe,EAAE,YAAY,UAAU,GAC9C,iBACF;;AAGF,MAAa,wBACX,UAAU,KACP,MAAM,eAAe,EAAE,YAAY,WAAW,GAC/C,iBACF;;AAGF,MAAa,wBACX,UAAU,KACP,MAAM,eAAe,EAAE,YAAY,WAAW,GAC/C,iBACF"}
package/dist/types.d.ts CHANGED
@@ -261,6 +261,21 @@ type AdkStreamCallback = (messages: AdkMessage[], config: AdkSendMessageConfig &
261
261
  type OnAdkErrorCallback = (error: unknown) => void | Promise<void>;
262
262
  type OnAdkCustomEventCallback = (type: string, data: unknown) => void | Promise<void>;
263
263
  type OnAdkAgentTransferCallback = (toAgent: string) => void | Promise<void>;
264
+ /** Private state and actions `useAdkRuntime` exposes through `thread.extras`. */
265
+ type AdkRuntimeExtras = {
266
+ send: (messages: AdkMessage[], config: AdkSendMessageConfig) => Promise<void>;
267
+ agentInfo: {
268
+ name?: string | undefined;
269
+ branch?: string | undefined;
270
+ };
271
+ stateDelta: Record<string, unknown>;
272
+ artifactDelta: Record<string, number>;
273
+ longRunningToolIds: string[];
274
+ toolConfirmations: AdkToolConfirmation[];
275
+ authRequests: AdkAuthRequest[];
276
+ escalated: boolean;
277
+ messageMetadata: Map<string, AdkMessageMetadata>;
278
+ };
264
279
  //#endregion
265
- export { AdkAuthCredential, AdkAuthCredentialType, AdkAuthRequest, AdkEvent, AdkEventActions, AdkEventPart, AdkEventType, AdkMessage, AdkMessageContentPart, AdkMessageMetadata, AdkRunConfig, AdkSendMessageConfig, AdkStreamCallback, AdkStructuredEvent, AdkToolCall, AdkToolConfirmation, OnAdkAgentTransferCallback, OnAdkCustomEventCallback, OnAdkErrorCallback };
280
+ export { AdkAuthCredential, AdkAuthCredentialType, AdkAuthRequest, AdkEvent, AdkEventActions, AdkEventPart, AdkEventType, AdkMessage, AdkMessageContentPart, AdkMessageMetadata, AdkRunConfig, AdkRuntimeExtras, AdkSendMessageConfig, AdkStreamCallback, AdkStructuredEvent, AdkToolCall, AdkToolConfirmation, OnAdkAgentTransferCallback, OnAdkCustomEventCallback, OnAdkErrorCallback };
266
281
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["import type { MessageStatus } from \"@assistant-ui/core\";\nimport type { ReadonlyJSONObject } from \"assistant-stream/utils\";\n\n// ── ADK Event wire types (lightweight, no @google/adk dependency) ──\n\nexport type AdkEventPart = {\n text?: string;\n thought?: boolean;\n functionCall?: {\n name: string;\n id?: string;\n args: Record<string, unknown>;\n };\n functionResponse?: {\n name: string;\n id?: string;\n response: unknown;\n };\n executableCode?: {\n code: string;\n language?: string;\n };\n codeExecutionResult?: {\n output: string;\n outcome?: string;\n };\n inlineData?: {\n mimeType: string;\n data: string;\n };\n fileData?: {\n fileUri: string;\n mimeType?: string;\n };\n};\n\nexport type AdkEventActions = {\n stateDelta?: Record<string, unknown> | undefined;\n artifactDelta?: Record<string, number> | undefined;\n transferToAgent?: string | undefined;\n escalate?: boolean | undefined;\n skipSummarization?: boolean | undefined;\n requestedAuthConfigs?: Record<string, unknown> | undefined;\n requestedToolConfirmations?: Record<string, unknown> | undefined;\n};\n\nexport type AdkEvent = {\n id: string;\n invocationId?: string | undefined;\n author?: string | undefined;\n branch?: string | undefined;\n partial?: boolean | undefined;\n turnComplete?: boolean | undefined;\n interrupted?: boolean | undefined;\n finishReason?: string | undefined;\n timestamp?: number | undefined;\n content?:\n | {\n role?: string | undefined;\n parts?: AdkEventPart[] | undefined;\n }\n | undefined;\n actions?: AdkEventActions | undefined;\n longRunningToolIds?: string[] | undefined;\n errorCode?: string | undefined;\n errorMessage?: string | undefined;\n groundingMetadata?: unknown;\n citationMetadata?: unknown;\n usageMetadata?: unknown;\n customMetadata?: Record<string, unknown> | undefined;\n};\n\n// ── ADK Message types (accumulated from events) ──\n\nexport type AdkToolCall = {\n id: string;\n name: string;\n args: ReadonlyJSONObject;\n argsText?: string;\n};\n\nexport type AdkMessage =\n | {\n id: string;\n type: \"human\";\n content: string | AdkMessageContentPart[];\n }\n | {\n id: string;\n type: \"ai\";\n content: string | AdkMessageContentPart[];\n tool_calls?: AdkToolCall[] | undefined;\n author?: string | undefined;\n branch?: string | undefined;\n status?: MessageStatus | undefined;\n }\n | {\n id: string;\n type: \"tool\";\n content: string;\n tool_call_id: string;\n name: string;\n status?: \"success\" | \"error\" | undefined;\n artifact?: unknown;\n };\n\nexport type AdkMessageContentPart =\n | { type: \"text\"; text: string }\n | { type: \"reasoning\"; text: string }\n | { type: \"image\"; mimeType: string; data: string }\n | { type: \"image_url\"; url: string }\n | {\n type: \"file\";\n mimeType: string;\n data: string;\n filename?: string | undefined;\n }\n | {\n type: \"file_url\";\n url: string;\n mimeType?: string | undefined;\n }\n | { type: \"code\"; code: string; language: string }\n | { type: \"code_result\"; output: string; outcome: string }\n | { type: \"activity\"; message: string };\n\n// ── ADK-specific state types ──\n\nexport type AdkToolConfirmation = {\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n hint: string;\n confirmed: boolean;\n payload?: unknown;\n};\n\nexport type AdkAuthCredentialType =\n | \"apiKey\"\n | \"http\"\n | \"oauth2\"\n | \"openIdConnect\"\n | \"serviceAccount\";\n\nexport type AdkAuthCredential = {\n authType: AdkAuthCredentialType;\n resourceRef?: string | undefined;\n apiKey?: string | undefined;\n http?:\n | {\n scheme: string;\n credentials: {\n username?: string;\n password?: string;\n token?: string;\n };\n }\n | undefined;\n oauth2?:\n | {\n clientId?: string;\n clientSecret?: string;\n authUri?: string;\n state?: string;\n redirectUri?: string;\n authResponseUri?: string;\n authCode?: string;\n accessToken?: string;\n refreshToken?: string;\n expiresAt?: number;\n expiresIn?: number;\n }\n | undefined;\n serviceAccount?: unknown;\n};\n\nexport type AdkAuthRequest = {\n toolCallId: string;\n authConfig: unknown;\n};\n\nexport type AdkMessageMetadata = {\n groundingMetadata?: unknown;\n citationMetadata?: unknown;\n usageMetadata?: unknown;\n};\n\n// ── RunConfig ──\n\nexport type AdkRunConfig = {\n streamingMode?: \"none\" | \"sse\" | \"bidi\" | undefined;\n pauseOnToolCalls?: boolean | undefined;\n maxLlmCalls?: number | undefined;\n saveInputBlobsAsArtifacts?: boolean | undefined;\n supportCfc?: boolean | undefined;\n speechConfig?: unknown;\n responseModalities?: string[] | undefined;\n outputAudioTranscription?: unknown;\n inputAudioTranscription?: unknown;\n enableAffectiveDialog?: boolean | undefined;\n proactivity?: unknown;\n realtimeInputConfig?: unknown;\n};\n\n// ── Stream callback types ──\n\nexport type AdkSendMessageConfig = {\n /**\n * ADK RunConfig. Typed as `unknown` for compatibility with\n * assistant-ui core's RunConfig type. Use `AdkRunConfig` when\n * constructing configs manually for type safety.\n */\n runConfig?: unknown;\n checkpointId?: string | undefined;\n stateDelta?: Record<string, unknown> | undefined;\n};\n\n// ── Structured events ──\n\nexport const AdkEventType = {\n THOUGHT: \"thought\",\n CONTENT: \"content\",\n TOOL_CALL: \"tool_call\",\n TOOL_RESULT: \"tool_result\",\n CALL_CODE: \"call_code\",\n CODE_RESULT: \"code_result\",\n ERROR: \"error\",\n ACTIVITY: \"activity\",\n TOOL_CONFIRMATION: \"tool_confirmation\",\n FINISHED: \"finished\",\n} as const;\n\nexport type AdkStructuredEvent =\n | { type: \"thought\"; content: string }\n | { type: \"content\"; content: string }\n | {\n type: \"tool_call\";\n call: { name: string; id?: string; args: Record<string, unknown> };\n }\n | {\n type: \"tool_result\";\n result: { name: string; id?: string; response: unknown };\n }\n | { type: \"call_code\"; code: { code: string; language?: string } }\n | { type: \"code_result\"; result: { output: string; outcome?: string } }\n | { type: \"error\"; errorCode?: string; errorMessage?: string }\n | { type: \"activity\"; message: string }\n | {\n type: \"tool_confirmation\";\n confirmations: Record<string, unknown>;\n }\n | { type: \"finished\" };\n\nexport type AdkStreamCallback = (\n messages: AdkMessage[],\n config: AdkSendMessageConfig & {\n abortSignal: AbortSignal;\n initialize: () => Promise<{\n remoteId: string;\n externalId: string | undefined;\n }>;\n },\n) => Promise<AsyncGenerator<AdkEvent>> | AsyncGenerator<AdkEvent>;\n\n// ── Event handler callbacks ──\n\nexport type OnAdkErrorCallback = (error: unknown) => void | Promise<void>;\n\nexport type OnAdkCustomEventCallback = (\n type: string,\n data: unknown,\n) => void | Promise<void>;\n\nexport type OnAdkAgentTransferCallback = (\n toAgent: string,\n) => void | Promise<void>;\n"],"mappings":";AA2NA,MAAa,eAAe;CAC1B,SAAS;CACT,SAAS;CACT,WAAW;CACX,aAAa;CACb,WAAW;CACX,aAAa;CACb,OAAO;CACP,UAAU;CACV,mBAAmB;CACnB,UAAU;AACZ"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["import type { MessageStatus } from \"@assistant-ui/core\";\nimport type { ReadonlyJSONObject } from \"assistant-stream/utils\";\n\n// ── ADK Event wire types (lightweight, no @google/adk dependency) ──\n\nexport type AdkEventPart = {\n text?: string;\n thought?: boolean;\n functionCall?: {\n name: string;\n id?: string;\n args: Record<string, unknown>;\n };\n functionResponse?: {\n name: string;\n id?: string;\n response: unknown;\n };\n executableCode?: {\n code: string;\n language?: string;\n };\n codeExecutionResult?: {\n output: string;\n outcome?: string;\n };\n inlineData?: {\n mimeType: string;\n data: string;\n };\n fileData?: {\n fileUri: string;\n mimeType?: string;\n };\n};\n\nexport type AdkEventActions = {\n stateDelta?: Record<string, unknown> | undefined;\n artifactDelta?: Record<string, number> | undefined;\n transferToAgent?: string | undefined;\n escalate?: boolean | undefined;\n skipSummarization?: boolean | undefined;\n requestedAuthConfigs?: Record<string, unknown> | undefined;\n requestedToolConfirmations?: Record<string, unknown> | undefined;\n};\n\nexport type AdkEvent = {\n id: string;\n invocationId?: string | undefined;\n author?: string | undefined;\n branch?: string | undefined;\n partial?: boolean | undefined;\n turnComplete?: boolean | undefined;\n interrupted?: boolean | undefined;\n finishReason?: string | undefined;\n timestamp?: number | undefined;\n content?:\n | {\n role?: string | undefined;\n parts?: AdkEventPart[] | undefined;\n }\n | undefined;\n actions?: AdkEventActions | undefined;\n longRunningToolIds?: string[] | undefined;\n errorCode?: string | undefined;\n errorMessage?: string | undefined;\n groundingMetadata?: unknown;\n citationMetadata?: unknown;\n usageMetadata?: unknown;\n customMetadata?: Record<string, unknown> | undefined;\n};\n\n// ── ADK Message types (accumulated from events) ──\n\nexport type AdkToolCall = {\n id: string;\n name: string;\n args: ReadonlyJSONObject;\n argsText?: string;\n};\n\nexport type AdkMessage =\n | {\n id: string;\n type: \"human\";\n content: string | AdkMessageContentPart[];\n }\n | {\n id: string;\n type: \"ai\";\n content: string | AdkMessageContentPart[];\n tool_calls?: AdkToolCall[] | undefined;\n author?: string | undefined;\n branch?: string | undefined;\n status?: MessageStatus | undefined;\n }\n | {\n id: string;\n type: \"tool\";\n content: string;\n tool_call_id: string;\n name: string;\n status?: \"success\" | \"error\" | undefined;\n artifact?: unknown;\n };\n\nexport type AdkMessageContentPart =\n | { type: \"text\"; text: string }\n | { type: \"reasoning\"; text: string }\n | { type: \"image\"; mimeType: string; data: string }\n | { type: \"image_url\"; url: string }\n | {\n type: \"file\";\n mimeType: string;\n data: string;\n filename?: string | undefined;\n }\n | {\n type: \"file_url\";\n url: string;\n mimeType?: string | undefined;\n }\n | { type: \"code\"; code: string; language: string }\n | { type: \"code_result\"; output: string; outcome: string }\n | { type: \"activity\"; message: string };\n\n// ── ADK-specific state types ──\n\nexport type AdkToolConfirmation = {\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n hint: string;\n confirmed: boolean;\n payload?: unknown;\n};\n\nexport type AdkAuthCredentialType =\n | \"apiKey\"\n | \"http\"\n | \"oauth2\"\n | \"openIdConnect\"\n | \"serviceAccount\";\n\nexport type AdkAuthCredential = {\n authType: AdkAuthCredentialType;\n resourceRef?: string | undefined;\n apiKey?: string | undefined;\n http?:\n | {\n scheme: string;\n credentials: {\n username?: string;\n password?: string;\n token?: string;\n };\n }\n | undefined;\n oauth2?:\n | {\n clientId?: string;\n clientSecret?: string;\n authUri?: string;\n state?: string;\n redirectUri?: string;\n authResponseUri?: string;\n authCode?: string;\n accessToken?: string;\n refreshToken?: string;\n expiresAt?: number;\n expiresIn?: number;\n }\n | undefined;\n serviceAccount?: unknown;\n};\n\nexport type AdkAuthRequest = {\n toolCallId: string;\n authConfig: unknown;\n};\n\nexport type AdkMessageMetadata = {\n groundingMetadata?: unknown;\n citationMetadata?: unknown;\n usageMetadata?: unknown;\n};\n\n// ── RunConfig ──\n\nexport type AdkRunConfig = {\n streamingMode?: \"none\" | \"sse\" | \"bidi\" | undefined;\n pauseOnToolCalls?: boolean | undefined;\n maxLlmCalls?: number | undefined;\n saveInputBlobsAsArtifacts?: boolean | undefined;\n supportCfc?: boolean | undefined;\n speechConfig?: unknown;\n responseModalities?: string[] | undefined;\n outputAudioTranscription?: unknown;\n inputAudioTranscription?: unknown;\n enableAffectiveDialog?: boolean | undefined;\n proactivity?: unknown;\n realtimeInputConfig?: unknown;\n};\n\n// ── Stream callback types ──\n\nexport type AdkSendMessageConfig = {\n /**\n * ADK RunConfig. Typed as `unknown` for compatibility with\n * assistant-ui core's RunConfig type. Use `AdkRunConfig` when\n * constructing configs manually for type safety.\n */\n runConfig?: unknown;\n checkpointId?: string | undefined;\n stateDelta?: Record<string, unknown> | undefined;\n};\n\n// ── Structured events ──\n\nexport const AdkEventType = {\n THOUGHT: \"thought\",\n CONTENT: \"content\",\n TOOL_CALL: \"tool_call\",\n TOOL_RESULT: \"tool_result\",\n CALL_CODE: \"call_code\",\n CODE_RESULT: \"code_result\",\n ERROR: \"error\",\n ACTIVITY: \"activity\",\n TOOL_CONFIRMATION: \"tool_confirmation\",\n FINISHED: \"finished\",\n} as const;\n\nexport type AdkStructuredEvent =\n | { type: \"thought\"; content: string }\n | { type: \"content\"; content: string }\n | {\n type: \"tool_call\";\n call: { name: string; id?: string; args: Record<string, unknown> };\n }\n | {\n type: \"tool_result\";\n result: { name: string; id?: string; response: unknown };\n }\n | { type: \"call_code\"; code: { code: string; language?: string } }\n | { type: \"code_result\"; result: { output: string; outcome?: string } }\n | { type: \"error\"; errorCode?: string; errorMessage?: string }\n | { type: \"activity\"; message: string }\n | {\n type: \"tool_confirmation\";\n confirmations: Record<string, unknown>;\n }\n | { type: \"finished\" };\n\nexport type AdkStreamCallback = (\n messages: AdkMessage[],\n config: AdkSendMessageConfig & {\n abortSignal: AbortSignal;\n initialize: () => Promise<{\n remoteId: string;\n externalId: string | undefined;\n }>;\n },\n) => Promise<AsyncGenerator<AdkEvent>> | AsyncGenerator<AdkEvent>;\n\n// ── Event handler callbacks ──\n\nexport type OnAdkErrorCallback = (error: unknown) => void | Promise<void>;\n\nexport type OnAdkCustomEventCallback = (\n type: string,\n data: unknown,\n) => void | Promise<void>;\n\nexport type OnAdkAgentTransferCallback = (\n toAgent: string,\n) => void | Promise<void>;\n\n/** Private state and actions `useAdkRuntime` exposes through `thread.extras`. */\nexport type AdkRuntimeExtras = {\n send: (messages: AdkMessage[], config: AdkSendMessageConfig) => Promise<void>;\n agentInfo: { name?: string | undefined; branch?: string | undefined };\n stateDelta: Record<string, unknown>;\n artifactDelta: Record<string, number>;\n longRunningToolIds: string[];\n toolConfirmations: AdkToolConfirmation[];\n authRequests: AdkAuthRequest[];\n escalated: boolean;\n messageMetadata: Map<string, AdkMessageMetadata>;\n};\n"],"mappings":";AA2NA,MAAa,eAAe;CAC1B,SAAS;CACT,SAAS;CACT,WAAW;CACX,aAAa;CACb,WAAW;CACX,aAAa;CACb,OAAO;CACP,UAAU;CACV,mBAAmB;CACnB,UAAU;AACZ"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAdkMessages.js","names":["uuidv4"],"sources":["../src/useAdkMessages.ts"],"sourcesContent":["import { useState, useCallback, useRef, useMemo } from \"react\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { AdkEventAccumulator } from \"./AdkEventAccumulator\";\nimport { contentToParts } from \"./contentToParts\";\nimport type {\n AdkEvent,\n AdkMessage,\n AdkMessageMetadata,\n AdkSendMessageConfig,\n AdkStreamCallback,\n AdkToolConfirmation,\n AdkAuthRequest,\n OnAdkErrorCallback,\n OnAdkCustomEventCallback,\n OnAdkAgentTransferCallback,\n} from \"./types\";\n\nexport type UseAdkMessagesOptions = {\n stream: AdkStreamCallback;\n eventHandlers?: {\n onError?: OnAdkErrorCallback;\n onCustomEvent?: OnAdkCustomEventCallback;\n onAgentTransfer?: OnAdkAgentTransferCallback;\n };\n};\n\nexport const useAdkMessages = ({\n stream,\n eventHandlers,\n}: UseAdkMessagesOptions) => {\n const [messages, _setMessages] = useState<AdkMessage[]>([]);\n const [stateDelta, setStateDelta] = useState<Record<string, unknown>>({});\n const [agentInfo, setAgentInfo] = useState<{\n name?: string | undefined;\n branch?: string | undefined;\n }>({});\n const [longRunningToolIds, setLongRunningToolIds] = useState<string[]>([]);\n const [artifactDelta, setArtifactDelta] = useState<Record<string, number>>(\n {},\n );\n const [toolConfirmations, setToolConfirmations] = useState<\n AdkToolConfirmation[]\n >([]);\n const [authRequests, setAuthRequests] = useState<AdkAuthRequest[]>([]);\n const [escalated, setEscalated] = useState(false);\n const [messageMetadata, setMessageMetadata] = useState<\n Map<string, AdkMessageMetadata>\n >(new Map());\n const lastTransferToAgentRef = useRef<string | undefined>(undefined);\n const messagesRef = useRef(messages);\n messagesRef.current = messages;\n const stateDeltaRef = useRef(stateDelta);\n stateDeltaRef.current = stateDelta;\n const artifactDeltaRef = useRef(artifactDelta);\n artifactDeltaRef.current = artifactDelta;\n const messageMetadataRef = useRef(messageMetadata);\n messageMetadataRef.current = messageMetadata;\n\n const setMessagesImmediate = useCallback((msgs: AdkMessage[]) => {\n messagesRef.current = msgs;\n _setMessages(msgs);\n }, []);\n\n // Replace the message list AND reset derived per-turn HITL state.\n // Used by truncation paths (edit, reload, load) so that stale interrupt\n // markers and per-message metadata from the removed messages don't leak\n // into the next turn.\n const replaceMessages = useCallback(\n (msgs: AdkMessage[]) => {\n setMessagesImmediate(msgs);\n setLongRunningToolIds([]);\n setToolConfirmations([]);\n setAuthRequests([]);\n setEscalated(false);\n setMessageMetadata(new Map());\n },\n [setMessagesImmediate],\n );\n\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const { onError, onCustomEvent, onAgentTransfer } = useMemo(\n () => eventHandlers ?? {},\n [eventHandlers],\n );\n\n const aui = useAui();\n const sendMessage = useCallback(\n async (newMessages: AdkMessage[], config: AdkSendMessageConfig) => {\n const newMessagesWithId = newMessages.map((m) =>\n m.id ? m : { ...m, id: uuidv4() },\n ) as AdkMessage[];\n\n const accumulator = new AdkEventAccumulator(messagesRef.current);\n for (const msg of newMessagesWithId) {\n accumulator.processEvent(messageToEvent(msg));\n }\n setMessagesImmediate(accumulator.getMessages());\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n const response = await stream(newMessagesWithId, {\n ...config,\n abortSignal: abortController.signal,\n initialize: async () => {\n return await aui.threadListItem().initialize();\n },\n });\n\n for await (const event of response) {\n const updatedMessages = accumulator.processEvent(event);\n setMessagesImmediate(updatedMessages);\n setStateDelta({\n ...stateDeltaRef.current,\n ...accumulator.getStateDelta(),\n });\n setAgentInfo(accumulator.getAgentInfo());\n setLongRunningToolIds(accumulator.getLongRunningToolIds());\n setArtifactDelta({\n ...artifactDeltaRef.current,\n ...accumulator.getArtifactDelta(),\n });\n setToolConfirmations(accumulator.getToolConfirmations());\n setAuthRequests(accumulator.getAuthRequests());\n setEscalated(accumulator.isEscalated());\n {\n const newMeta = accumulator.getMessageMetadata();\n if (newMeta.size > 0) {\n setMessageMetadata(\n new Map([...messageMetadataRef.current, ...newMeta]),\n );\n }\n }\n\n const transfer = accumulator.getLastTransferToAgent();\n if (transfer && transfer !== lastTransferToAgentRef.current) {\n lastTransferToAgentRef.current = transfer;\n onAgentTransfer?.(transfer);\n }\n\n // Fire custom event callback for events with customMetadata\n if (event.customMetadata && onCustomEvent) {\n for (const [key, value] of Object.entries(event.customMetadata)) {\n onCustomEvent(key, value);\n }\n }\n\n if (event.errorCode || event.errorMessage) {\n onError?.(event.errorMessage ?? event.errorCode);\n }\n }\n } catch (error) {\n if (\n !abortController.signal.aborted &&\n !(error instanceof Error && error.name === \"AbortError\")\n ) {\n throw error;\n }\n } finally {\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n }\n },\n [\n aui,\n setMessagesImmediate,\n stream,\n onError,\n onCustomEvent,\n onAgentTransfer,\n ],\n );\n\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n }, []);\n\n return {\n messages,\n stateDelta,\n agentInfo,\n longRunningToolIds,\n artifactDelta,\n toolConfirmations,\n authRequests,\n escalated,\n messageMetadata,\n sendMessage,\n cancel,\n setMessages: setMessagesImmediate,\n replaceMessages,\n };\n};\n\n/** @internal — exported for unit tests. */\nexport const messageToEvent = (msg: AdkMessage): AdkEvent => {\n if (msg.type === \"human\") {\n return {\n id: msg.id ?? uuidv4(),\n author: \"user\",\n content: { role: \"user\", parts: contentToParts(msg.content) },\n };\n }\n\n if (msg.type === \"tool\") {\n let response: unknown;\n try {\n response = JSON.parse(msg.content);\n } catch {\n response = msg.content;\n }\n return {\n id: msg.id ?? uuidv4(),\n content: {\n role: \"user\",\n parts: [\n {\n functionResponse: {\n name: msg.name,\n id: msg.tool_call_id,\n response,\n },\n },\n ],\n },\n };\n }\n\n const result: AdkEvent = { id: msg.id ?? uuidv4() };\n if (msg.author != null) result.author = msg.author;\n result.content = {\n role: \"model\",\n parts: [\n ...contentToParts(msg.content),\n ...(msg.tool_calls?.map((tc) => ({\n functionCall: { name: tc.name, id: tc.id, args: { ...tc.args } },\n })) ?? []),\n ],\n };\n return result;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"useAdkMessages.js","names":["uuidv4"],"sources":["../src/useAdkMessages.ts"],"sourcesContent":["import { useState, useCallback, useRef, useMemo } from \"react\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { AdkEventAccumulator } from \"./AdkEventAccumulator\";\nimport { contentToParts } from \"./contentToParts\";\nimport type {\n AdkEvent,\n AdkMessage,\n AdkMessageMetadata,\n AdkSendMessageConfig,\n AdkStreamCallback,\n AdkToolConfirmation,\n AdkAuthRequest,\n OnAdkErrorCallback,\n OnAdkCustomEventCallback,\n OnAdkAgentTransferCallback,\n} from \"./types\";\n\nexport type UseAdkMessagesOptions = {\n stream: AdkStreamCallback;\n eventHandlers?: {\n onError?: OnAdkErrorCallback;\n onCustomEvent?: OnAdkCustomEventCallback;\n onAgentTransfer?: OnAdkAgentTransferCallback;\n };\n};\n\nexport const useAdkMessages = ({\n stream,\n eventHandlers,\n}: UseAdkMessagesOptions) => {\n const [messages, _setMessages] = useState<AdkMessage[]>([]);\n const [stateDelta, setStateDelta] = useState<Record<string, unknown>>({});\n const [agentInfo, setAgentInfo] = useState<{\n name?: string | undefined;\n branch?: string | undefined;\n }>({});\n const [longRunningToolIds, setLongRunningToolIds] = useState<string[]>([]);\n const [artifactDelta, setArtifactDelta] = useState<Record<string, number>>(\n {},\n );\n const [toolConfirmations, setToolConfirmations] = useState<\n AdkToolConfirmation[]\n >([]);\n const [authRequests, setAuthRequests] = useState<AdkAuthRequest[]>([]);\n const [escalated, setEscalated] = useState(false);\n const [messageMetadata, setMessageMetadata] = useState<\n Map<string, AdkMessageMetadata>\n >(new Map());\n const lastTransferToAgentRef = useRef<string | undefined>(undefined);\n const messagesRef = useRef(messages);\n messagesRef.current = messages;\n const stateDeltaRef = useRef(stateDelta);\n stateDeltaRef.current = stateDelta;\n const artifactDeltaRef = useRef(artifactDelta);\n artifactDeltaRef.current = artifactDelta;\n const messageMetadataRef = useRef(messageMetadata);\n messageMetadataRef.current = messageMetadata;\n\n const setMessagesImmediate = useCallback((msgs: AdkMessage[]) => {\n messagesRef.current = msgs;\n _setMessages(msgs);\n }, []);\n\n // Replace the message list AND reset derived per-turn HITL state.\n // Used by truncation paths (edit, reload, load) so that stale interrupt\n // markers and per-message metadata from the removed messages don't leak\n // into the next turn.\n const replaceMessages = useCallback(\n (msgs: AdkMessage[]) => {\n setMessagesImmediate(msgs);\n setLongRunningToolIds([]);\n setToolConfirmations([]);\n setAuthRequests([]);\n setEscalated(false);\n setMessageMetadata(new Map());\n },\n [setMessagesImmediate],\n );\n\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const { onError, onCustomEvent, onAgentTransfer } = useMemo(\n () => eventHandlers ?? {},\n [eventHandlers],\n );\n\n const aui = useAui();\n const sendMessage = useCallback(\n async (newMessages: AdkMessage[], config: AdkSendMessageConfig) => {\n const newMessagesWithId = newMessages.map((m) =>\n m.id ? m : { ...m, id: uuidv4() },\n ) as AdkMessage[];\n\n const accumulator = new AdkEventAccumulator(messagesRef.current);\n for (const msg of newMessagesWithId) {\n accumulator.processEvent(messageToEvent(msg));\n }\n setMessagesImmediate(accumulator.getMessages());\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n const response = await stream(newMessagesWithId, {\n ...config,\n abortSignal: abortController.signal,\n initialize: async () => {\n return await aui.threadListItem().initialize();\n },\n });\n\n for await (const event of response) {\n const updatedMessages = accumulator.processEvent(event);\n setMessagesImmediate(updatedMessages);\n setStateDelta({\n ...stateDeltaRef.current,\n ...accumulator.getStateDelta(),\n });\n setAgentInfo(accumulator.getAgentInfo());\n setLongRunningToolIds(accumulator.getLongRunningToolIds());\n setArtifactDelta({\n ...artifactDeltaRef.current,\n ...accumulator.getArtifactDelta(),\n });\n setToolConfirmations(accumulator.getToolConfirmations());\n setAuthRequests(accumulator.getAuthRequests());\n setEscalated(accumulator.isEscalated());\n {\n const newMeta = accumulator.getMessageMetadata();\n if (newMeta.size > 0) {\n setMessageMetadata(\n new Map([...messageMetadataRef.current, ...newMeta]),\n );\n }\n }\n\n const transfer = accumulator.getLastTransferToAgent();\n if (transfer && transfer !== lastTransferToAgentRef.current) {\n lastTransferToAgentRef.current = transfer;\n onAgentTransfer?.(transfer);\n }\n\n // Fire custom event callback for events with customMetadata\n if (event.customMetadata && onCustomEvent) {\n for (const [key, value] of Object.entries(event.customMetadata)) {\n onCustomEvent(key, value);\n }\n }\n\n if (event.errorCode || event.errorMessage) {\n onError?.(event.errorMessage ?? event.errorCode);\n }\n }\n } catch (error) {\n if (\n !abortController.signal.aborted &&\n !(error instanceof Error && error.name === \"AbortError\")\n ) {\n throw error;\n }\n } finally {\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n }\n },\n [\n aui,\n setMessagesImmediate,\n stream,\n onError,\n onCustomEvent,\n onAgentTransfer,\n ],\n );\n\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n }, []);\n\n return {\n messages,\n stateDelta,\n agentInfo,\n longRunningToolIds,\n artifactDelta,\n toolConfirmations,\n authRequests,\n escalated,\n messageMetadata,\n sendMessage,\n cancel,\n setMessages: setMessagesImmediate,\n replaceMessages,\n };\n};\n\n/** @internal — exported for unit tests. */\nexport const messageToEvent = (msg: AdkMessage): AdkEvent => {\n if (msg.type === \"human\") {\n return {\n id: msg.id ?? uuidv4(),\n author: \"user\",\n content: { role: \"user\", parts: contentToParts(msg.content) },\n };\n }\n\n if (msg.type === \"tool\") {\n let response: unknown;\n try {\n response = JSON.parse(msg.content);\n } catch {\n response = msg.content;\n }\n return {\n id: msg.id ?? uuidv4(),\n content: {\n role: \"user\",\n parts: [\n {\n functionResponse: {\n name: msg.name,\n id: msg.tool_call_id,\n response,\n },\n },\n ],\n },\n };\n }\n\n const result: AdkEvent = { id: msg.id ?? uuidv4() };\n if (msg.author != null) result.author = msg.author;\n result.content = {\n role: \"model\",\n parts: [\n ...contentToParts(msg.content),\n ...(msg.tool_calls?.map((tc) => ({\n functionCall: { name: tc.name, id: tc.id, args: { ...tc.args } },\n })) ?? []),\n ],\n };\n return result;\n};\n"],"mappings":"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"}
@@ -5,6 +5,15 @@ import { AssistantCloud } from "assistant-cloud";
5
5
  //#region src/useAdkRuntime.d.ts
6
6
  type UseAdkRuntimeOptions = ExternalStoreSharedOptions & {
7
7
  stream: AdkStreamCallback;
8
+ /**
9
+ * Called whenever the active thread's canonical (remote) ID changes, so the
10
+ * value can be treated as a managed/controlled variable (e.g. synced to a URL
11
+ * query param). Only the settled remote ID is emitted: while a freshly created
12
+ * thread is still optimistic the value is `undefined`, and the real ID is
13
+ * emitted once the thread is initialized; the transient local ID is never
14
+ * surfaced.
15
+ */
16
+ onThreadIdChange?: ((threadId: string | undefined) => void) | undefined;
8
17
  autoCancelPendingToolCalls?: boolean | undefined;
9
18
  unstable_allowCancellation?: boolean | undefined;
10
19
  getCheckpointId?: (threadId: string, parentMessages: AdkMessage[]) => Promise<string | null>;
@@ -39,6 +48,7 @@ declare const useAdkRuntime: ({
39
48
  sessionAdapter,
40
49
  create,
41
50
  delete: deleteFn,
51
+ onThreadIdChange,
42
52
  ...options
43
53
  }: UseAdkRuntimeOptions) => import("@assistant-ui/core").AssistantRuntime;
44
54
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"useAdkRuntime.d.ts","names":[],"sources":["../src/useAdkRuntime.ts"],"mappings":";;;;;KA4IY,oBAAA,GAAuB,0BAAA;EACjC,MAAA,EAAQ,iBAAA;EACR,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;EA1BR;;;;EA+BA,cAAA,GAAiB,uBAAA;AAAA;AAAA,cAsMN,aAAA;EAAiB,KAAA;EAAA,cAAA;EAAA,MAAA;EAAA,MAAA,EAAA,QAAA;EAAA,GAAA;AAAA,GAM3B,oBAAA,kCAAoB,gBAAA"}
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"}
@@ -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
- onReload: getCheckpointId ? async (parentId, config) => {
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
- } : void 0,
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.14",
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.10",
38
- "@assistant-ui/store": "^0.2.13",
37
+ "@assistant-ui/core": "^0.2.19",
38
+ "@assistant-ui/store": "^0.2.19",
39
39
  "assistant-cloud": "*",
40
- "assistant-stream": "^0.3.20",
41
- "uuid": "^14.0.0"
40
+ "assistant-stream": "^0.3.24",
41
+ "uuid": "^14.0.1"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "@google/adk": ">=0.5.0",
@@ -54,11 +54,11 @@
54
54
  }
55
55
  },
56
56
  "devDependencies": {
57
- "@types/react": "^19.2.15",
57
+ "@types/react": "^19.2.17",
58
58
  "@types/uuid": "^11.0.0",
59
- "react": "^19.2.6",
60
- "vitest": "^4.1.7",
61
- "@assistant-ui/x-buildutils": "0.0.11"
59
+ "react": "^19.2.7",
60
+ "vitest": "^4.1.9",
61
+ "@assistant-ui/x-buildutils": "0.0.16"
62
62
  },
63
63
  "publishConfig": {
64
64
  "access": "public",
@@ -0,0 +1,4 @@
1
+ import { createRuntimeExtras } from "@assistant-ui/core/internal";
2
+ import type { AdkRuntimeExtras } from "./types";
3
+
4
+ export const adkExtras = createRuntimeExtras<AdkRuntimeExtras>("useAdkRuntime");