@assistant-ui/react-google-adk 0.0.30 → 0.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AdkClient.d.ts +2 -3
- package/dist/AdkClient.d.ts.map +1 -1
- package/dist/AdkEventAccumulator.d.ts +3 -5
- package/dist/AdkEventAccumulator.d.ts.map +1 -1
- package/dist/AdkEventAccumulator.js +63 -99
- package/dist/AdkEventAccumulator.js.map +1 -1
- package/dist/AdkSessionAdapter.d.ts +7 -4
- package/dist/AdkSessionAdapter.d.ts.map +1 -1
- package/dist/AdkSessionAdapter.js +7 -4
- package/dist/AdkSessionAdapter.js.map +1 -1
- package/dist/adkExtras.d.ts +1 -2
- package/dist/adkExtras.d.ts.map +1 -1
- package/dist/adkToolApproval.d.ts +6 -7
- package/dist/adkToolApproval.d.ts.map +1 -1
- package/dist/adkToolApproval.js +1 -3
- package/dist/adkToolApproval.js.map +1 -1
- package/dist/contentToParts.d.ts +1 -2
- package/dist/contentToParts.d.ts.map +1 -1
- package/dist/convertAdkMessages.d.ts +2 -3
- package/dist/convertAdkMessages.d.ts.map +1 -1
- package/dist/convertToAdkMessages.d.ts +5 -6
- package/dist/convertToAdkMessages.d.ts.map +1 -1
- package/dist/hooks.d.ts +15 -16
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +1 -1
- package/dist/normalizeAdkPart.d.ts +4 -0
- package/dist/normalizeAdkPart.d.ts.map +1 -0
- package/dist/normalizeAdkPart.js +31 -0
- package/dist/normalizeAdkPart.js.map +1 -0
- package/dist/parseAdkEvent.d.ts +1 -2
- package/dist/parseAdkEvent.d.ts.map +1 -1
- package/dist/sdkIdentity.d.ts +1 -2
- package/dist/sdkIdentity.d.ts.map +1 -1
- package/dist/sdkIdentity.js +1 -1
- package/dist/server/adkEventStream.d.ts +2 -3
- package/dist/server/adkEventStream.d.ts.map +1 -1
- package/dist/server/createAdkApiRoute.d.ts +2 -3
- package/dist/server/createAdkApiRoute.d.ts.map +1 -1
- package/dist/server/parseAdkRequest.d.ts +2 -3
- package/dist/server/parseAdkRequest.d.ts.map +1 -1
- package/dist/structuredEvents.d.ts +1 -2
- package/dist/structuredEvents.d.ts.map +1 -1
- package/dist/structuredEvents.js +1 -1
- package/dist/structuredEvents.js.map +1 -1
- package/dist/toAdkFunctionResponse.d.ts +2 -3
- package/dist/toAdkFunctionResponse.d.ts.map +1 -1
- package/dist/trimTrailingSlashes.d.ts +1 -2
- package/dist/trimTrailingSlashes.d.ts.map +1 -1
- package/dist/types.d.ts +22 -23
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/useAdkMessages.d.ts +2 -3
- package/dist/useAdkMessages.d.ts.map +1 -1
- package/dist/useAdkMessages.js +2 -0
- package/dist/useAdkMessages.js.map +1 -1
- package/dist/useAdkRuntime.d.ts +2 -3
- package/dist/useAdkRuntime.d.ts.map +1 -1
- package/dist/useAdkRuntime.js +1 -1
- package/package.json +10 -9
- package/src/AdkEventAccumulator.test.ts +312 -11
- package/src/AdkEventAccumulator.ts +68 -142
- package/src/AdkSessionAdapter.test.ts +267 -1
- package/src/AdkSessionAdapter.ts +24 -5
- package/src/adkToolApproval.test.ts +0 -4
- package/src/adkToolApproval.ts +1 -3
- package/src/normalizeAdkPart.ts +35 -0
- package/src/structuredEvents.test.ts +69 -0
- package/src/structuredEvents.ts +4 -1
- package/src/types.ts +1 -1
- package/src/useAdkMessages.test.ts +102 -3
- package/src/useAdkMessages.ts +2 -0
- package/src/useAdkRuntime.replacement.test.tsx +11 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdkSessionAdapter.js","names":[],"sources":["../src/AdkSessionAdapter.ts"],"sourcesContent":["import type { AssistantStream, AssistantStreamChunk } from \"assistant-stream\";\nimport type {\n RemoteThreadInitializeResponse,\n RemoteThreadListAdapter,\n RemoteThreadListResponse,\n RemoteThreadMetadata,\n} from \"@assistant-ui/core\";\nimport { AdkEventAccumulator } from \"./AdkEventAccumulator\";\nimport { parseAdkEventValue } from \"./parseAdkEvent\";\nimport type { AdkMessage, AdkThreadSnapshot } from \"./types\";\nimport { trimTrailingSlashes } from \"./trimTrailingSlashes\";\n\nexport type AdkSessionAdapterOptions = {\n /**\n * ADK server base URL (e.g. \"http://localhost:8000\").\n */\n apiUrl: string;\n\n /**\n * ADK application name.\n */\n appName: string;\n\n /**\n * ADK user ID.\n */\n userId: string;\n\n /**\n * Extra headers for API requests.\n */\n headers?:\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>)\n | undefined;\n};\n\nexport type AdkArtifactData = {\n inlineData?: { mimeType: string; data: string } | undefined;\n text?: string | undefined;\n};\n\ntype AdkSessionAdapterResult = {\n adapter: RemoteThreadListAdapter;\n load: (\n sessionId: string,\n options?: { signal?: AbortSignal | undefined },\n ) => Promise<AdkThreadSnapshot>;\n artifacts: {\n list: (sessionId: string) => Promise<string[]>;\n load: (\n sessionId: string,\n artifactName: string,\n version?: number,\n ) => Promise<AdkArtifactData>;\n listVersions: (\n sessionId: string,\n artifactName: string,\n ) => Promise<number[]>;\n delete: (sessionId: string, artifactName: string) => Promise<void>;\n };\n};\n\ntype AdkSessionResponse = {\n id: string;\n events?: unknown;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isAdkSessionResponse = (value: unknown): value is AdkSessionResponse => {\n if (!isRecord(value)) return false;\n\n const id = value.id;\n return typeof id === \"string\" && id.length > 0;\n};\n\nconst parseAdkSessionResponse = (\n value: unknown,\n operation: \"create\" | \"fetch\" | \"load\",\n): AdkSessionResponse => {\n if (!isAdkSessionResponse(value)) {\n throw new Error(\n `Invalid ADK session ${operation} response: expected an object with a non-empty string \"id\".`,\n );\n }\n return value;\n};\n\nconst parseAdkSessionListResponse = (value: unknown): AdkSessionResponse[] => {\n if (!Array.isArray(value)) {\n throw new Error(\n \"Invalid ADK session list response: expected an array of sessions.\",\n );\n }\n\n return value.map((session, index) => {\n if (!isAdkSessionResponse(session)) {\n throw new Error(\n `Invalid ADK session list response: session at index ${index} must have a non-empty string \"id\".`,\n );\n }\n return session;\n });\n};\n\nconst parseAdkArtifactListResponse = (value: unknown): string[] => {\n if (!Array.isArray(value)) {\n throw new Error(\n \"Invalid ADK artifact list response: expected an array of artifact names.\",\n );\n }\n\n return value.map((artifact, index) => {\n if (typeof artifact === \"string\" && artifact.length > 0) {\n return artifact;\n }\n\n if (isRecord(artifact)) {\n const filename = artifact.filename;\n if (typeof filename === \"string\" && filename.length > 0) {\n return filename;\n }\n }\n\n throw new Error(\n `Invalid ADK artifact list response: artifact at index ${index} must be a non-empty string or an object with a non-empty string \"filename\".`,\n );\n });\n};\n\nconst parseAdkArtifactResponse = (value: unknown): AdkArtifactData => {\n if (!isRecord(value)) {\n throw new Error(\n 'Invalid ADK artifact load response: expected an object containing \"text\" or \"inlineData\".',\n );\n }\n\n const { text, inlineData } = value;\n if (text === undefined && inlineData === undefined) {\n throw new Error(\n 'Invalid ADK artifact load response: expected an object containing \"text\" or \"inlineData\".',\n );\n }\n\n if (text !== undefined && typeof text !== \"string\") {\n throw new Error(\n 'Invalid ADK artifact load response: \"text\" must be a string when present.',\n );\n }\n\n if (\n inlineData !== undefined &&\n (!isRecord(inlineData) ||\n typeof inlineData.mimeType !== \"string\" ||\n typeof inlineData.data !== \"string\")\n ) {\n throw new Error(\n 'Invalid ADK artifact load response: \"inlineData\" must contain string \"mimeType\" and \"data\" fields.',\n );\n }\n\n return value as AdkArtifactData;\n};\n\nconst parseAdkArtifactVersionsResponse = (value: unknown): number[] => {\n if (!Array.isArray(value)) {\n throw new Error(\n \"Invalid ADK artifact versions response: expected an array of version numbers.\",\n );\n }\n\n return value.map((version, index) => {\n if (\n typeof version !== \"number\" ||\n !Number.isInteger(version) ||\n version < 0\n ) {\n throw new Error(\n `Invalid ADK artifact versions response: version at index ${index} must be a non-negative integer.`,\n );\n }\n return version;\n });\n};\n\n/**\n * Creates a `RemoteThreadListAdapter` backed by ADK's session REST API,\n * plus a `load` function that reconstructs messages from session events.\n *\n * @example\n * ```ts\n * const { adapter, load } = createAdkSessionAdapter({\n * apiUrl: \"http://localhost:8000\",\n * appName: \"my-app\",\n * userId: \"user-1\",\n * });\n *\n * const runtime = useAdkRuntime({\n * stream: createAdkStream({ ... }),\n * sessionAdapter: adapter,\n * load,\n * });\n * ```\n */\nexport function createAdkSessionAdapter(\n options: AdkSessionAdapterOptions,\n): AdkSessionAdapterResult {\n const { apiUrl, appName, userId } = options;\n const normalizedApiUrl = trimTrailingSlashes(apiUrl);\n const baseUrl = `${normalizedApiUrl}/apps/${encodeURIComponent(appName)}/users/${encodeURIComponent(userId)}/sessions`;\n\n const getHeaders = async (): Promise<Record<string, string>> => {\n if (!options.headers) return {};\n if (typeof options.headers === \"function\") return await options.headers();\n return options.headers;\n };\n\n const adapter: RemoteThreadListAdapter = {\n async list(): Promise<RemoteThreadListResponse> {\n const headers = await getHeaders();\n const res = await fetch(baseUrl, { headers });\n if (!res.ok) {\n throw new Error(`Failed to list sessions: ${res.status}`);\n }\n const data = parseAdkSessionListResponse(await res.json());\n\n const threads: RemoteThreadMetadata[] = data.map((session) => ({\n status: \"regular\" as const,\n remoteId: session.id,\n externalId: session.id,\n title: undefined,\n }));\n\n return { threads };\n },\n\n async initialize(\n _threadId: string,\n ): Promise<RemoteThreadInitializeResponse> {\n const headers = await getHeaders();\n const res = await fetch(baseUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...headers },\n body: JSON.stringify({}),\n });\n if (!res.ok) {\n throw new Error(`Failed to create session: ${res.status}`);\n }\n const session = parseAdkSessionResponse(await res.json(), \"create\");\n return { remoteId: session.id, externalId: session.id };\n },\n\n async delete(remoteId: string): Promise<void> {\n const headers = await getHeaders();\n const res = await fetch(`${baseUrl}/${encodeURIComponent(remoteId)}`, {\n method: \"DELETE\",\n headers,\n });\n if (!res.ok && res.status !== 404) {\n throw new Error(`Failed to delete session: ${res.status}`);\n }\n },\n\n async rename(): Promise<void> {\n // ADK sessions don't support titles\n },\n\n async archive(): Promise<void> {\n // ADK sessions don't support archiving\n },\n\n async unarchive(): Promise<void> {\n // ADK sessions don't support archiving\n },\n\n generateTitle(): Promise<AssistantStream> {\n // Title generation not supported without assistant-cloud\n return Promise.resolve(\n new ReadableStream<AssistantStreamChunk>({\n start(controller) {\n controller.close();\n },\n }),\n );\n },\n\n async fetch(threadId: string): Promise<RemoteThreadMetadata> {\n const headers = await getHeaders();\n const res = await fetch(`${baseUrl}/${encodeURIComponent(threadId)}`, {\n headers,\n });\n if (!res.ok) {\n throw new Error(`Session not found: ${res.status}`);\n }\n const session = parseAdkSessionResponse(await res.json(), \"fetch\");\n return {\n status: \"regular\",\n remoteId: session.id,\n externalId: session.id,\n title: undefined,\n };\n },\n };\n\n const load = async (\n sessionId: string,\n options?: { signal?: AbortSignal | undefined },\n ): Promise<AdkThreadSnapshot> => {\n const headers = await getHeaders();\n const res = await fetch(`${baseUrl}/${encodeURIComponent(sessionId)}`, {\n headers,\n ...(options?.signal ? { signal: options.signal } : {}),\n });\n if (!res.ok) {\n throw new Error(`Failed to load session: ${res.status}`);\n }\n const session = parseAdkSessionResponse(await res.json(), \"load\");\n\n if (session.events !== undefined && !Array.isArray(session.events)) {\n throw new Error(\n 'Invalid ADK session load response: expected \"events\" to be an array when present.',\n );\n }\n\n // Events carry ordered state and tool transitions, so partial replay can\n // produce a plausible but incorrect thread.\n const events = session.events?.map((event, index) =>\n parseAdkEventValue(event, `Invalid ADK session event at index ${index}`),\n );\n\n if (!events?.length) {\n return { messages: [] };\n }\n\n const accumulator = new AdkEventAccumulator();\n let messages: AdkMessage[] = [];\n for (const event of events) {\n messages = accumulator.processEvent(event);\n }\n // The per-turn state rides along, so a refetch can swap the thread over in\n // one commit instead of reconstructing it from the messages alone.\n return {\n messages,\n longRunningToolIds: accumulator.getLongRunningToolIds(),\n toolConfirmations: accumulator.getToolConfirmations(),\n authRequests: accumulator.getAuthRequests(),\n escalated: accumulator.isEscalated(),\n messageMetadata: accumulator.getMessageMetadata(),\n stateDelta: accumulator.getStateDelta(),\n artifactDelta: accumulator.getArtifactDelta(),\n agentInfo: accumulator.getAgentInfo(),\n };\n };\n\n const artifactBaseUrl = (sessionId: string) =>\n `${baseUrl}/${encodeURIComponent(sessionId)}/artifacts`;\n\n const artifacts: AdkSessionAdapterResult[\"artifacts\"] = {\n async list(sessionId) {\n const headers = await getHeaders();\n const res = await fetch(artifactBaseUrl(sessionId), { headers });\n if (!res.ok) throw new Error(`Failed to list artifacts: ${res.status}`);\n return parseAdkArtifactListResponse(await res.json());\n },\n\n async load(sessionId, artifactName, version?) {\n const headers = await getHeaders();\n let url = `${artifactBaseUrl(sessionId)}/${encodeURIComponent(artifactName)}`;\n if (version != null) url += `/versions/${version}`;\n const res = await fetch(url, { headers });\n if (!res.ok) throw new Error(`Failed to load artifact: ${res.status}`);\n return parseAdkArtifactResponse(await res.json());\n },\n\n async listVersions(sessionId, artifactName) {\n const headers = await getHeaders();\n const url = `${artifactBaseUrl(sessionId)}/${encodeURIComponent(artifactName)}/versions`;\n const res = await fetch(url, { headers });\n if (!res.ok) {\n throw new Error(`Failed to list artifact versions: ${res.status}`);\n }\n return parseAdkArtifactVersionsResponse(await res.json());\n },\n\n async delete(sessionId, artifactName) {\n const headers = await getHeaders();\n const url = `${artifactBaseUrl(sessionId)}/${encodeURIComponent(artifactName)}`;\n const res = await fetch(url, { method: \"DELETE\", headers });\n if (!res.ok && res.status !== 404) {\n throw new Error(`Failed to delete artifact: ${res.status}`);\n }\n },\n };\n\n return { adapter, load, artifacts };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AdkSessionAdapter.js","names":[],"sources":["../src/AdkSessionAdapter.ts"],"sourcesContent":["import type { AssistantStream, AssistantStreamChunk } from \"assistant-stream\";\nimport type {\n RemoteThreadInitializeResponse,\n RemoteThreadListAdapter,\n RemoteThreadListResponse,\n RemoteThreadMetadata,\n} from \"@assistant-ui/core\";\nimport { AdkEventAccumulator } from \"./AdkEventAccumulator\";\nimport { normalizeAdkPart } from \"./normalizeAdkPart\";\nimport { parseAdkEventValue } from \"./parseAdkEvent\";\nimport type { AdkMessage, AdkThreadSnapshot } from \"./types\";\nimport { trimTrailingSlashes } from \"./trimTrailingSlashes\";\n\nexport type AdkSessionAdapterOptions = {\n /**\n * ADK server base URL (e.g. \"http://localhost:8000\").\n */\n apiUrl: string;\n\n /**\n * ADK application name.\n */\n appName: string;\n\n /**\n * ADK user ID.\n */\n userId: string;\n\n /**\n * Extra headers for API requests.\n */\n headers?:\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>)\n | undefined;\n};\n\nexport type AdkArtifactData = {\n inlineData?: { mimeType: string; data: string } | undefined;\n fileData?: { fileUri: string; mimeType?: string | undefined } | undefined;\n text?: string | undefined;\n};\n\ntype AdkSessionAdapterResult = {\n adapter: RemoteThreadListAdapter;\n load: (\n sessionId: string,\n options?: { signal?: AbortSignal | undefined },\n ) => Promise<AdkThreadSnapshot>;\n artifacts: {\n list: (sessionId: string) => Promise<string[]>;\n load: (\n sessionId: string,\n artifactName: string,\n version?: number,\n ) => Promise<AdkArtifactData>;\n listVersions: (\n sessionId: string,\n artifactName: string,\n ) => Promise<number[]>;\n delete: (sessionId: string, artifactName: string) => Promise<void>;\n };\n};\n\ntype AdkSessionResponse = {\n id: string;\n events?: unknown;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isAdkSessionResponse = (value: unknown): value is AdkSessionResponse => {\n if (!isRecord(value)) return false;\n\n const id = value.id;\n return typeof id === \"string\" && id.length > 0;\n};\n\nconst parseAdkSessionResponse = (\n value: unknown,\n operation: \"create\" | \"fetch\" | \"load\",\n): AdkSessionResponse => {\n if (!isAdkSessionResponse(value)) {\n throw new Error(\n `Invalid ADK session ${operation} response: expected an object with a non-empty string \"id\".`,\n );\n }\n return value;\n};\n\nconst parseAdkSessionListResponse = (value: unknown): AdkSessionResponse[] => {\n if (!Array.isArray(value)) {\n throw new Error(\n \"Invalid ADK session list response: expected an array of sessions.\",\n );\n }\n\n return value.map((session, index) => {\n if (!isAdkSessionResponse(session)) {\n throw new Error(\n `Invalid ADK session list response: session at index ${index} must have a non-empty string \"id\".`,\n );\n }\n return session;\n });\n};\n\nconst parseAdkArtifactListResponse = (value: unknown): string[] => {\n if (!Array.isArray(value)) {\n throw new Error(\n \"Invalid ADK artifact list response: expected an array of artifact names.\",\n );\n }\n\n return value.map((artifact, index) => {\n if (typeof artifact === \"string\" && artifact.length > 0) {\n return artifact;\n }\n\n if (isRecord(artifact)) {\n const filename = artifact.filename;\n if (typeof filename === \"string\" && filename.length > 0) {\n return filename;\n }\n }\n\n throw new Error(\n `Invalid ADK artifact list response: artifact at index ${index} must be a non-empty string or an object with a non-empty string \"filename\".`,\n );\n });\n};\n\nconst parseAdkArtifactResponse = (value: unknown): AdkArtifactData => {\n if (!isRecord(value)) {\n throw new Error(\n 'Invalid ADK artifact load response: expected an object containing \"text\", \"inlineData\", or \"fileData\".',\n );\n }\n\n const normalizedValue = normalizeAdkPart(value);\n const { text, inlineData, fileData } = normalizedValue;\n if (\n text === undefined &&\n inlineData === undefined &&\n fileData === undefined\n ) {\n throw new Error(\n 'Invalid ADK artifact load response: expected an object containing \"text\", \"inlineData\", or \"fileData\".',\n );\n }\n\n if (text !== undefined && typeof text !== \"string\") {\n throw new Error(\n 'Invalid ADK artifact load response: \"text\" must be a string when present.',\n );\n }\n\n if (\n inlineData !== undefined &&\n (!isRecord(inlineData) ||\n typeof inlineData.mimeType !== \"string\" ||\n typeof inlineData.data !== \"string\")\n ) {\n throw new Error(\n 'Invalid ADK artifact load response: \"inlineData\" must contain string \"mimeType\" and \"data\" fields.',\n );\n }\n\n if (\n fileData !== undefined &&\n (!isRecord(fileData) ||\n typeof fileData.fileUri !== \"string\" ||\n (fileData.mimeType !== undefined &&\n typeof fileData.mimeType !== \"string\"))\n ) {\n throw new Error(\n 'Invalid ADK artifact load response: \"fileData\" must contain a string \"fileUri\" and an optional string \"mimeType\" field.',\n );\n }\n\n return normalizedValue as AdkArtifactData;\n};\n\nconst parseAdkArtifactVersionsResponse = (value: unknown): number[] => {\n if (!Array.isArray(value)) {\n throw new Error(\n \"Invalid ADK artifact versions response: expected an array of version numbers.\",\n );\n }\n\n return value.map((version, index) => {\n if (\n typeof version !== \"number\" ||\n !Number.isInteger(version) ||\n version < 0\n ) {\n throw new Error(\n `Invalid ADK artifact versions response: version at index ${index} must be a non-negative integer.`,\n );\n }\n return version;\n });\n};\n\n/**\n * Creates a `RemoteThreadListAdapter` backed by ADK's session REST API,\n * plus a `load` function that reconstructs messages from session events.\n *\n * @example\n * ```ts\n * const { adapter, load } = createAdkSessionAdapter({\n * apiUrl: \"http://localhost:8000\",\n * appName: \"my-app\",\n * userId: \"user-1\",\n * });\n *\n * const runtime = useAdkRuntime({\n * stream: createAdkStream({ ... }),\n * sessionAdapter: adapter,\n * load,\n * });\n * ```\n */\nexport function createAdkSessionAdapter(\n options: AdkSessionAdapterOptions,\n): AdkSessionAdapterResult {\n const { apiUrl, appName, userId } = options;\n const normalizedApiUrl = trimTrailingSlashes(apiUrl);\n const baseUrl = `${normalizedApiUrl}/apps/${encodeURIComponent(appName)}/users/${encodeURIComponent(userId)}/sessions`;\n\n const getHeaders = async (): Promise<Record<string, string>> => {\n if (!options.headers) return {};\n if (typeof options.headers === \"function\") return await options.headers();\n return options.headers;\n };\n\n const adapter: RemoteThreadListAdapter = {\n async list(): Promise<RemoteThreadListResponse> {\n const headers = await getHeaders();\n const res = await fetch(baseUrl, { headers });\n if (!res.ok) {\n throw new Error(`Failed to list sessions: ${res.status}`);\n }\n const data = parseAdkSessionListResponse(await res.json());\n\n const threads: RemoteThreadMetadata[] = data.map((session) => ({\n status: \"regular\" as const,\n remoteId: session.id,\n externalId: session.id,\n title: undefined,\n }));\n\n return { threads };\n },\n\n async initialize(\n _threadId: string,\n ): Promise<RemoteThreadInitializeResponse> {\n const headers = await getHeaders();\n const res = await fetch(baseUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...headers },\n body: JSON.stringify({}),\n });\n if (!res.ok) {\n throw new Error(`Failed to create session: ${res.status}`);\n }\n const session = parseAdkSessionResponse(await res.json(), \"create\");\n return { remoteId: session.id, externalId: session.id };\n },\n\n async delete(remoteId: string): Promise<void> {\n const headers = await getHeaders();\n const res = await fetch(`${baseUrl}/${encodeURIComponent(remoteId)}`, {\n method: \"DELETE\",\n headers,\n });\n if (!res.ok && res.status !== 404) {\n throw new Error(`Failed to delete session: ${res.status}`);\n }\n },\n\n async rename(): Promise<void> {\n // ADK sessions don't support titles\n },\n\n async archive(): Promise<void> {\n // ADK sessions don't support archiving\n },\n\n async unarchive(): Promise<void> {\n // ADK sessions don't support archiving\n },\n\n generateTitle(): Promise<AssistantStream> {\n // Title generation not supported without assistant-cloud\n return Promise.resolve(\n new ReadableStream<AssistantStreamChunk>({\n start(controller) {\n controller.close();\n },\n }),\n );\n },\n\n async fetch(threadId: string): Promise<RemoteThreadMetadata> {\n const headers = await getHeaders();\n const res = await fetch(`${baseUrl}/${encodeURIComponent(threadId)}`, {\n headers,\n });\n if (!res.ok) {\n throw new Error(`Session not found: ${res.status}`);\n }\n const session = parseAdkSessionResponse(await res.json(), \"fetch\");\n return {\n status: \"regular\",\n remoteId: session.id,\n externalId: session.id,\n title: undefined,\n };\n },\n };\n\n const load = async (\n sessionId: string,\n options?: { signal?: AbortSignal | undefined },\n ): Promise<AdkThreadSnapshot> => {\n const headers = await getHeaders();\n const res = await fetch(`${baseUrl}/${encodeURIComponent(sessionId)}`, {\n headers,\n ...(options?.signal ? { signal: options.signal } : {}),\n });\n if (!res.ok) {\n throw new Error(`Failed to load session: ${res.status}`);\n }\n const session = parseAdkSessionResponse(await res.json(), \"load\");\n\n if (session.events !== undefined && !Array.isArray(session.events)) {\n throw new Error(\n 'Invalid ADK session load response: expected \"events\" to be an array when present.',\n );\n }\n\n // Events carry ordered state and tool transitions, so partial replay can\n // produce a plausible but incorrect thread.\n const events = session.events?.map((event, index) =>\n parseAdkEventValue(event, `Invalid ADK session event at index ${index}`),\n );\n\n if (!events?.length) {\n return { messages: [] };\n }\n\n const accumulator = new AdkEventAccumulator();\n let messages: AdkMessage[] = [];\n for (const event of events) {\n messages = accumulator.processEvent(event);\n }\n // The per-turn state rides along, so a refetch can swap the thread over in\n // one commit instead of reconstructing it from the messages alone.\n return {\n messages,\n longRunningToolIds: accumulator.getLongRunningToolIds(),\n toolConfirmations: accumulator.getToolConfirmations(),\n authRequests: accumulator.getAuthRequests(),\n escalated: accumulator.isEscalated(),\n messageMetadata: accumulator.getMessageMetadata(),\n stateDelta: accumulator.getStateDelta(),\n artifactDelta: accumulator.getArtifactDelta(),\n agentInfo: accumulator.getAgentInfo(),\n };\n };\n\n const artifactBaseUrl = (sessionId: string) =>\n `${baseUrl}/${encodeURIComponent(sessionId)}/artifacts`;\n\n const artifacts: AdkSessionAdapterResult[\"artifacts\"] = {\n async list(sessionId) {\n const headers = await getHeaders();\n const res = await fetch(artifactBaseUrl(sessionId), { headers });\n if (!res.ok) throw new Error(`Failed to list artifacts: ${res.status}`);\n return parseAdkArtifactListResponse(await res.json());\n },\n\n async load(sessionId, artifactName, version?) {\n const headers = await getHeaders();\n let url = `${artifactBaseUrl(sessionId)}/${encodeURIComponent(artifactName)}`;\n if (version != null) url += `/versions/${version}`;\n const res = await fetch(url, { headers });\n if (!res.ok) throw new Error(`Failed to load artifact: ${res.status}`);\n return parseAdkArtifactResponse(await res.json());\n },\n\n async listVersions(sessionId, artifactName) {\n const headers = await getHeaders();\n const url = `${artifactBaseUrl(sessionId)}/${encodeURIComponent(artifactName)}/versions`;\n const res = await fetch(url, { headers });\n if (!res.ok) {\n throw new Error(`Failed to list artifact versions: ${res.status}`);\n }\n return parseAdkArtifactVersionsResponse(await res.json());\n },\n\n async delete(sessionId, artifactName) {\n const headers = await getHeaders();\n const url = `${artifactBaseUrl(sessionId)}/${encodeURIComponent(artifactName)}`;\n const res = await fetch(url, { method: \"DELETE\", headers });\n if (!res.ok && res.status !== 404) {\n throw new Error(`Failed to delete artifact: ${res.status}`);\n }\n },\n };\n\n return { adapter, load, artifacts };\n}\n"],"mappings":"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"}
|
package/dist/adkExtras.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { AdkRuntimeExtras } from "./types.js";
|
|
2
2
|
//#region src/adkExtras.d.ts
|
|
3
|
-
declare const adkExtras: import("@assistant-ui/core/react").RuntimeExtras<AdkRuntimeExtras>;
|
|
3
|
+
export declare const adkExtras: import("@assistant-ui/core/react").RuntimeExtras<AdkRuntimeExtras>;
|
|
4
4
|
//#endregion
|
|
5
|
-
export { adkExtras };
|
|
6
5
|
//# sourceMappingURL=adkExtras.d.ts.map
|
package/dist/adkExtras.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adkExtras.d.ts","names":[],"sources":["../src/adkExtras.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"adkExtras.d.ts","names":[],"sources":["../src/adkExtras.ts"],"mappings":";;qBAGa,8CAAS,cAAA"}
|
|
@@ -2,9 +2,9 @@ import { AdkMessage } from "./types.js";
|
|
|
2
2
|
import { ReadonlyJSONValue } from "assistant-stream/utils";
|
|
3
3
|
import { RespondToToolApprovalOptions, ToolCallMessagePart } from "@assistant-ui/core";
|
|
4
4
|
//#region src/adkToolApproval.d.ts
|
|
5
|
-
type AdkToolApproval = NonNullable<ToolCallMessagePart["approval"]>;
|
|
6
|
-
declare const ADK_REQUEST_CONFIRMATION = "adk_request_confirmation";
|
|
7
|
-
type AdkToolApprovalProjection = {
|
|
5
|
+
export type AdkToolApproval = NonNullable<ToolCallMessagePart["approval"]>;
|
|
6
|
+
export declare const ADK_REQUEST_CONFIRMATION = "adk_request_confirmation";
|
|
7
|
+
export type AdkToolApprovalProjection = {
|
|
8
8
|
approvals: ReadonlyMap<string, AdkToolApproval>;
|
|
9
9
|
/**
|
|
10
10
|
* Identity of the decision state. Core re-converts a cached message object
|
|
@@ -23,8 +23,8 @@ type AdkToolApprovalProjection = {
|
|
|
23
23
|
* rather than left bare, which would let it answer by writing a tool result the
|
|
24
24
|
* agent never produced.
|
|
25
25
|
*/
|
|
26
|
-
declare const projectAdkToolApprovals: (messages: readonly AdkMessage[]) => AdkToolApprovalProjection;
|
|
27
|
-
declare const toAdkConfirmationReply: (toolCallId: string, confirmed: boolean, payload?: ReadonlyJSONValue) => AdkMessage & {
|
|
26
|
+
export declare const projectAdkToolApprovals: (messages: readonly AdkMessage[]) => AdkToolApprovalProjection;
|
|
27
|
+
export declare const toAdkConfirmationReply: (toolCallId: string, confirmed: boolean, payload?: ReadonlyJSONValue) => AdkMessage & {
|
|
28
28
|
type: "tool";
|
|
29
29
|
};
|
|
30
30
|
/**
|
|
@@ -32,9 +32,8 @@ declare const toAdkConfirmationReply: (toolCallId: string, confirmed: boolean, p
|
|
|
32
32
|
* from core has a field to land in. An id that is not an open gate would send a
|
|
33
33
|
* reply ADK silently ignores, so it throws instead.
|
|
34
34
|
*/
|
|
35
|
-
declare const toAdkToolConfirmationReply: ({ approvalId, approved }: RespondToToolApprovalOptions, approvals: ReadonlyMap<string, AdkToolApproval>) => AdkMessage & {
|
|
35
|
+
export declare const toAdkToolConfirmationReply: ({ approvalId, approved }: RespondToToolApprovalOptions, approvals: ReadonlyMap<string, AdkToolApproval>) => AdkMessage & {
|
|
36
36
|
type: "tool";
|
|
37
37
|
};
|
|
38
38
|
//#endregion
|
|
39
|
-
export { ADK_REQUEST_CONFIRMATION, AdkToolApproval, AdkToolApprovalProjection, projectAdkToolApprovals, toAdkConfirmationReply, toAdkToolConfirmationReply };
|
|
40
39
|
//# sourceMappingURL=adkToolApproval.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adkToolApproval.d.ts","names":[],"sources":["../src/adkToolApproval.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"adkToolApproval.d.ts","names":[],"sources":["../src/adkToolApproval.ts"],"mappings":";;;;YAQY,kBAAkB,YAAY;qBAE7B;YA2FD;EACV,WAAW,oBAAoB;;;;;;EAM/B;;;;;;;;;;;;qBAaW,0BACX,mBAAmB,iBAClB;qBAyDU,yBACX,oBACA,oBACA,UAAU,sBACT;EAAe;;;;;;;qBAiBL,+BACX,YAAA,YAA0B,8BAC1B,WAAW,oBAAoB,qBAC9B;EAAe"}
|
package/dist/adkToolApproval.js
CHANGED
|
@@ -76,9 +76,7 @@ const readConfirmation = (content) => {
|
|
|
76
76
|
*/
|
|
77
77
|
const sourceEventOf = (toolMessageId) => toolMessageId.replace(/:\d+$/, "");
|
|
78
78
|
/**
|
|
79
|
-
* ADK builds the confirmation request around the call it gates, carrying that
|
|
80
|
-
* call verbatim in `originalFunctionCall` — spelled `original_function_call` by
|
|
81
|
-
* ADK Python, which the accumulator reads the same way.
|
|
79
|
+
* ADK builds the confirmation request around the call it gates, carrying that call verbatim in `originalFunctionCall`; `original_function_call` is accepted as well, matching the accumulator.
|
|
82
80
|
*/
|
|
83
81
|
const gatedCallIdOf = (args) => {
|
|
84
82
|
if (typeof args !== "object" || args === null) return void 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adkToolApproval.js","names":[],"sources":["../src/adkToolApproval.ts"],"sourcesContent":["import { generateId } from \"@assistant-ui/core\";\nimport type {\n RespondToToolApprovalOptions,\n ToolCallMessagePart,\n} from \"@assistant-ui/core\";\nimport type { ReadonlyJSONValue } from \"assistant-stream/utils\";\nimport type { AdkMessage } from \"./types\";\n\nexport type AdkToolApproval = NonNullable<ToolCallMessagePart[\"approval\"]>;\n\nexport const ADK_REQUEST_CONFIRMATION = \"adk_request_confirmation\";\n\nconst parseJson = (raw: string): unknown => {\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n};\n\ntype AdkConfirmationRead = {\n /**\n * False only where ADK raises reading the reply, which aborts every function\n * response in the same event rather than denying this one.\n */\n readable: boolean;\n /** Undefined where ADK records no confirmation and the gate stays open. */\n confirmed: boolean | undefined;\n};\n\n/**\n * The value the transport puts on `functionResponse.response`: the reply\n * content parsed, or the raw text where it is not JSON.\n */\nconst wireResponseOf = (content: string): unknown => {\n const parsed = parseJson(content);\n return parsed === undefined ? content : parsed;\n};\n\n/**\n * Mirrors ADK's own reading of a confirmation reply, whose three outcomes the\n * gate has to distinguish. A falsy response records nothing, so the gate stays\n * open and its siblings are untouched. Otherwise ADK either unwraps its client\n * wrapper — a lone `response` key whose value it parses as JSON text — or reads\n * `confirmed` off the response directly, and resumes the tool unconfirmed\n * (a denial) for anything that is not explicitly `true`; a bare string, number,\n * or array is such a denial, not an unreadable reply. Only where that reading\n * raises is the reply unreadable, and the raise is uncaught in ADK, so the\n * whole event it belongs to is abandoned.\n */\nconst readConfirmation = (content: unknown): AdkConfirmationRead => {\n if (typeof content !== \"string\")\n return { readable: false, confirmed: undefined };\n const response = wireResponseOf(content);\n try {\n if (!response) return { readable: true, confirmed: undefined };\n const record = response as Record<string, unknown>;\n const decide = (value: unknown) =>\n typeof value === \"object\" &&\n value !== null &&\n (value as { confirmed?: unknown }).confirmed === true;\n // `in` raises on a primitive response, as ADK's own wrapper test does.\n if (Object.keys(record).length === 1 && \"response\" in record) {\n const inner = parseJson(String(record.response));\n // ADK parses the wrapped text without a `try`, so it raises here.\n if (inner === undefined) return { readable: false, confirmed: undefined };\n if (!inner) return { readable: true, confirmed: undefined };\n return { readable: true, confirmed: decide(inner) };\n }\n return { readable: true, confirmed: decide(record) };\n } catch {\n return { readable: false, confirmed: undefined };\n }\n};\n\n/**\n * ADK's confirmation processor parses every function response in an event\n * before running any tool, so one unreadable reply aborts the event and none of\n * its siblings execute. The accumulator mints a tool message id of\n * `<eventId>:<partIndex>` per response, so that prefix is the batch ADK either\n * runs whole or not at all; a locally minted reply carries a bare uuid and is\n * its own batch.\n */\nconst sourceEventOf = (toolMessageId: string): string =>\n toolMessageId.replace(/:\\d+$/, \"\");\n\n/**\n * ADK builds the confirmation request around the call it gates, carrying that\n * call verbatim in `originalFunctionCall` — spelled `original_function_call` by\n * ADK Python, which the accumulator reads the same way.\n */\nconst gatedCallIdOf = (args: unknown): string | undefined => {\n if (typeof args !== \"object\" || args === null) return undefined;\n const record = args as {\n originalFunctionCall?: unknown;\n original_function_call?: unknown;\n };\n const original = record.originalFunctionCall ?? record.original_function_call;\n if (typeof original !== \"object\" || original === null) return undefined;\n const id = (original as { id?: unknown }).id;\n return typeof id === \"string\" && id.length > 0 ? id : undefined;\n};\n\nexport type AdkToolApprovalProjection = {\n approvals: ReadonlyMap<string, AdkToolApproval>;\n /**\n * Identity of the decision state. Core re-converts a cached message object\n * only when the converter callback changes, so the callback is rebuilt when\n * this key moves rather than on every render.\n */\n key: string;\n};\n\n/**\n * ADK requests a confirmation by emitting a synthetic `adk_request_confirmation`\n * tool call carrying a fresh id, and resumes only when a reply quotes that id.\n * The gated tool's own id is never answerable, so every approval carries the\n * synthetic id — but ADK yields the gated call to the client first, in its own\n * event, so both calls sit result-less in the transcript and both would render\n * an approval control. The gated call is therefore mapped to the same approval\n * rather than left bare, which would let it answer by writing a tool result the\n * agent never produced.\n */\nexport const projectAdkToolApprovals = (\n messages: readonly AdkMessage[],\n): AdkToolApprovalProjection => {\n const batches = new Map<\n string,\n { readable: boolean; entries: [string, boolean | undefined][] }\n >();\n for (const message of messages) {\n if (message.type !== \"tool\") continue;\n if (message.name !== ADK_REQUEST_CONFIRMATION) continue;\n const key = sourceEventOf(message.id);\n let batch = batches.get(key);\n if (batch === undefined) {\n batch = { readable: true, entries: [] };\n batches.set(key, batch);\n }\n const { readable, confirmed } = readConfirmation(message.content);\n if (!readable) batch.readable = false;\n batch.entries.push([message.tool_call_id, confirmed]);\n }\n\n const replies = new Map<string, boolean>();\n for (const batch of batches.values()) {\n for (const [toolCallId, confirmed] of batch.entries) {\n if (batch.readable && confirmed !== undefined)\n replies.set(toolCallId, confirmed);\n else replies.delete(toolCallId);\n }\n }\n\n const approvals = new Map<string, AdkToolApproval>();\n for (const message of messages) {\n if (message.type !== \"ai\") continue;\n for (const call of message.tool_calls ?? []) {\n if (call.name !== ADK_REQUEST_CONFIRMATION) continue;\n const approved = replies.get(call.id);\n const approval: AdkToolApproval = {\n id: call.id,\n ...(approved !== undefined && { approved }),\n };\n approvals.set(call.id, approval);\n // ADK yields the gated call in its own event before the confirmation is\n // requested, so that call is also in the transcript, result-less, and\n // inherits the message's `requires-action` status. Left ungated it\n // renders a second approval control with no approval behind it, which\n // answers by writing a tool result the agent never produced. The same\n // approval carries the synthetic id, so answering either one replies to\n // the gate ADK is actually waiting on.\n const gatedId = gatedCallIdOf(call.args);\n if (gatedId !== undefined) approvals.set(gatedId, approval);\n }\n }\n\n return {\n approvals,\n key: approvals.size === 0 ? \"\" : JSON.stringify([...approvals]),\n };\n};\n\nexport const toAdkConfirmationReply = (\n toolCallId: string,\n confirmed: boolean,\n payload?: ReadonlyJSONValue,\n): AdkMessage & { type: \"tool\" } => ({\n id: generateId(),\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 * ADK confirmations are a plain confirm/reject pair, so no option or reason\n * from core has a field to land in. An id that is not an open gate would send a\n * reply ADK silently ignores, so it throws instead.\n */\nexport const toAdkToolConfirmationReply = (\n { approvalId, approved }: RespondToToolApprovalOptions,\n approvals: ReadonlyMap<string, AdkToolApproval>,\n): AdkMessage & { type: \"tool\" } => {\n const approval = approvals.get(approvalId);\n if (approval === undefined || approval.approved !== undefined)\n throw new Error(\n `No pending ADK tool confirmation for approval id \"${approvalId}\"`,\n );\n\n return toAdkConfirmationReply(approvalId, approved);\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"adkToolApproval.js","names":[],"sources":["../src/adkToolApproval.ts"],"sourcesContent":["import { generateId } from \"@assistant-ui/core\";\nimport type {\n RespondToToolApprovalOptions,\n ToolCallMessagePart,\n} from \"@assistant-ui/core\";\nimport type { ReadonlyJSONValue } from \"assistant-stream/utils\";\nimport type { AdkMessage } from \"./types\";\n\nexport type AdkToolApproval = NonNullable<ToolCallMessagePart[\"approval\"]>;\n\nexport const ADK_REQUEST_CONFIRMATION = \"adk_request_confirmation\";\n\nconst parseJson = (raw: string): unknown => {\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n};\n\ntype AdkConfirmationRead = {\n /**\n * False only where ADK raises reading the reply, which aborts every function\n * response in the same event rather than denying this one.\n */\n readable: boolean;\n /** Undefined where ADK records no confirmation and the gate stays open. */\n confirmed: boolean | undefined;\n};\n\n/**\n * The value the transport puts on `functionResponse.response`: the reply\n * content parsed, or the raw text where it is not JSON.\n */\nconst wireResponseOf = (content: string): unknown => {\n const parsed = parseJson(content);\n return parsed === undefined ? content : parsed;\n};\n\n/**\n * Mirrors ADK's own reading of a confirmation reply, whose three outcomes the\n * gate has to distinguish. A falsy response records nothing, so the gate stays\n * open and its siblings are untouched. Otherwise ADK either unwraps its client\n * wrapper — a lone `response` key whose value it parses as JSON text — or reads\n * `confirmed` off the response directly, and resumes the tool unconfirmed\n * (a denial) for anything that is not explicitly `true`; a bare string, number,\n * or array is such a denial, not an unreadable reply. Only where that reading\n * raises is the reply unreadable, and the raise is uncaught in ADK, so the\n * whole event it belongs to is abandoned.\n */\nconst readConfirmation = (content: unknown): AdkConfirmationRead => {\n if (typeof content !== \"string\")\n return { readable: false, confirmed: undefined };\n const response = wireResponseOf(content);\n try {\n if (!response) return { readable: true, confirmed: undefined };\n const record = response as Record<string, unknown>;\n const decide = (value: unknown) =>\n typeof value === \"object\" &&\n value !== null &&\n (value as { confirmed?: unknown }).confirmed === true;\n // `in` raises on a primitive response, as ADK's own wrapper test does.\n if (Object.keys(record).length === 1 && \"response\" in record) {\n const inner = parseJson(String(record.response));\n // ADK parses the wrapped text without a `try`, so it raises here.\n if (inner === undefined) return { readable: false, confirmed: undefined };\n if (!inner) return { readable: true, confirmed: undefined };\n return { readable: true, confirmed: decide(inner) };\n }\n return { readable: true, confirmed: decide(record) };\n } catch {\n return { readable: false, confirmed: undefined };\n }\n};\n\n/**\n * ADK's confirmation processor parses every function response in an event\n * before running any tool, so one unreadable reply aborts the event and none of\n * its siblings execute. The accumulator mints a tool message id of\n * `<eventId>:<partIndex>` per response, so that prefix is the batch ADK either\n * runs whole or not at all; a locally minted reply carries a bare uuid and is\n * its own batch.\n */\nconst sourceEventOf = (toolMessageId: string): string =>\n toolMessageId.replace(/:\\d+$/, \"\");\n\n/**\n * ADK builds the confirmation request around the call it gates, carrying that call verbatim in `originalFunctionCall`; `original_function_call` is accepted as well, matching the accumulator.\n */\nconst gatedCallIdOf = (args: unknown): string | undefined => {\n if (typeof args !== \"object\" || args === null) return undefined;\n const record = args as {\n originalFunctionCall?: unknown;\n original_function_call?: unknown;\n };\n const original = record.originalFunctionCall ?? record.original_function_call;\n if (typeof original !== \"object\" || original === null) return undefined;\n const id = (original as { id?: unknown }).id;\n return typeof id === \"string\" && id.length > 0 ? id : undefined;\n};\n\nexport type AdkToolApprovalProjection = {\n approvals: ReadonlyMap<string, AdkToolApproval>;\n /**\n * Identity of the decision state. Core re-converts a cached message object\n * only when the converter callback changes, so the callback is rebuilt when\n * this key moves rather than on every render.\n */\n key: string;\n};\n\n/**\n * ADK requests a confirmation by emitting a synthetic `adk_request_confirmation`\n * tool call carrying a fresh id, and resumes only when a reply quotes that id.\n * The gated tool's own id is never answerable, so every approval carries the\n * synthetic id — but ADK yields the gated call to the client first, in its own\n * event, so both calls sit result-less in the transcript and both would render\n * an approval control. The gated call is therefore mapped to the same approval\n * rather than left bare, which would let it answer by writing a tool result the\n * agent never produced.\n */\nexport const projectAdkToolApprovals = (\n messages: readonly AdkMessage[],\n): AdkToolApprovalProjection => {\n const batches = new Map<\n string,\n { readable: boolean; entries: [string, boolean | undefined][] }\n >();\n for (const message of messages) {\n if (message.type !== \"tool\") continue;\n if (message.name !== ADK_REQUEST_CONFIRMATION) continue;\n const key = sourceEventOf(message.id);\n let batch = batches.get(key);\n if (batch === undefined) {\n batch = { readable: true, entries: [] };\n batches.set(key, batch);\n }\n const { readable, confirmed } = readConfirmation(message.content);\n if (!readable) batch.readable = false;\n batch.entries.push([message.tool_call_id, confirmed]);\n }\n\n const replies = new Map<string, boolean>();\n for (const batch of batches.values()) {\n for (const [toolCallId, confirmed] of batch.entries) {\n if (batch.readable && confirmed !== undefined)\n replies.set(toolCallId, confirmed);\n else replies.delete(toolCallId);\n }\n }\n\n const approvals = new Map<string, AdkToolApproval>();\n for (const message of messages) {\n if (message.type !== \"ai\") continue;\n for (const call of message.tool_calls ?? []) {\n if (call.name !== ADK_REQUEST_CONFIRMATION) continue;\n const approved = replies.get(call.id);\n const approval: AdkToolApproval = {\n id: call.id,\n ...(approved !== undefined && { approved }),\n };\n approvals.set(call.id, approval);\n // ADK yields the gated call in its own event before the confirmation is\n // requested, so that call is also in the transcript, result-less, and\n // inherits the message's `requires-action` status. Left ungated it\n // renders a second approval control with no approval behind it, which\n // answers by writing a tool result the agent never produced. The same\n // approval carries the synthetic id, so answering either one replies to\n // the gate ADK is actually waiting on.\n const gatedId = gatedCallIdOf(call.args);\n if (gatedId !== undefined) approvals.set(gatedId, approval);\n }\n }\n\n return {\n approvals,\n key: approvals.size === 0 ? \"\" : JSON.stringify([...approvals]),\n };\n};\n\nexport const toAdkConfirmationReply = (\n toolCallId: string,\n confirmed: boolean,\n payload?: ReadonlyJSONValue,\n): AdkMessage & { type: \"tool\" } => ({\n id: generateId(),\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 * ADK confirmations are a plain confirm/reject pair, so no option or reason\n * from core has a field to land in. An id that is not an open gate would send a\n * reply ADK silently ignores, so it throws instead.\n */\nexport const toAdkToolConfirmationReply = (\n { approvalId, approved }: RespondToToolApprovalOptions,\n approvals: ReadonlyMap<string, AdkToolApproval>,\n): AdkMessage & { type: \"tool\" } => {\n const approval = approvals.get(approvalId);\n if (approval === undefined || approval.approved !== undefined)\n throw new Error(\n `No pending ADK tool confirmation for approval id \"${approvalId}\"`,\n );\n\n return toAdkConfirmationReply(approvalId, approved);\n};\n"],"mappings":"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"}
|
package/dist/contentToParts.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { AdkEventPart, AdkMessage } from "./types.js";
|
|
2
2
|
//#region src/contentToParts.d.ts
|
|
3
|
-
declare const contentToParts: (content: AdkMessage["content"]) => AdkEventPart[];
|
|
3
|
+
export declare const contentToParts: (content: AdkMessage["content"]) => AdkEventPart[];
|
|
4
4
|
//#endregion
|
|
5
|
-
export { contentToParts };
|
|
6
5
|
//# sourceMappingURL=contentToParts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contentToParts.d.ts","names":[],"sources":["../src/contentToParts.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"contentToParts.d.ts","names":[],"sources":["../src/contentToParts.ts"],"mappings":";;qBAEa,iBACX,SAAS,0BACR"}
|
|
@@ -2,8 +2,7 @@ import { AdkMessage } from "./types.js";
|
|
|
2
2
|
import { AdkToolApproval } from "./adkToolApproval.js";
|
|
3
3
|
import { useExternalMessageConverter } from "@assistant-ui/core/react";
|
|
4
4
|
//#region src/convertAdkMessages.d.ts
|
|
5
|
-
declare const createAdkMessageConverter: (approvals: ReadonlyMap<string, AdkToolApproval>) => useExternalMessageConverter.Callback<AdkMessage>;
|
|
6
|
-
declare const convertAdkMessage: useExternalMessageConverter.Callback<AdkMessage>;
|
|
5
|
+
export declare const createAdkMessageConverter: (approvals: ReadonlyMap<string, AdkToolApproval>) => useExternalMessageConverter.Callback<AdkMessage>;
|
|
6
|
+
export declare const convertAdkMessage: useExternalMessageConverter.Callback<AdkMessage>;
|
|
7
7
|
//#endregion
|
|
8
|
-
export { convertAdkMessage, createAdkMessageConverter };
|
|
9
8
|
//# sourceMappingURL=convertAdkMessages.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertAdkMessages.d.ts","names":[],"sources":["../src/convertAdkMessages.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"convertAdkMessages.d.ts","names":[],"sources":["../src/convertAdkMessages.ts"],"mappings":";;;;qBAyFa,4BAET,WAAW,oBAAoB,qBAC9B,4BAA4B,SAAS;qBAiE7B,mBAAmB,4BAA4B,SAAS"}
|
|
@@ -2,7 +2,7 @@ import { AdkMessage, AdkToolCall } from "./types.js";
|
|
|
2
2
|
import { AppendMessage, ThreadMessage } from "@assistant-ui/core";
|
|
3
3
|
//#region src/convertToAdkMessages.d.ts
|
|
4
4
|
/** Exported for unit tests. */
|
|
5
|
-
declare const getMessageContent: (msg: AppendMessage) => string | ({
|
|
5
|
+
export declare const getMessageContent: (msg: AppendMessage) => string | ({
|
|
6
6
|
type: "text";
|
|
7
7
|
text: string;
|
|
8
8
|
mimeType?: never;
|
|
@@ -35,7 +35,7 @@ declare const getMessageContent: (msg: AppendMessage) => string | ({
|
|
|
35
35
|
url?: never;
|
|
36
36
|
})[];
|
|
37
37
|
/** Exported for unit tests. */
|
|
38
|
-
declare const getPendingToolCalls: (messages: AdkMessage[]) => AdkToolCall[];
|
|
38
|
+
export declare const getPendingToolCalls: (messages: AdkMessage[]) => AdkToolCall[];
|
|
39
39
|
/**
|
|
40
40
|
* Exported for unit tests.
|
|
41
41
|
*
|
|
@@ -45,14 +45,13 @@ declare const getPendingToolCalls: (messages: AdkMessage[]) => AdkToolCall[];
|
|
|
45
45
|
* `adk_request_credential`). Those must be answered through a dedicated tool
|
|
46
46
|
* UI + submit helper, not auto-cancelled.
|
|
47
47
|
*/
|
|
48
|
-
declare const getPendingCancellations: (messages: AdkMessage[], longRunningToolIds: readonly string[]) => Array<AdkMessage & {
|
|
48
|
+
export declare const getPendingCancellations: (messages: AdkMessage[], longRunningToolIds: readonly string[]) => Array<AdkMessage & {
|
|
49
49
|
type: "tool";
|
|
50
50
|
}>;
|
|
51
|
-
declare const truncateAdkMessages: (threadMessages: readonly ThreadMessage[], parentId: string | null) => AdkMessage[];
|
|
52
|
-
declare const toAdkUserMessage: (msg: AppendMessage, id?: string) => AdkMessage & {
|
|
51
|
+
export declare const truncateAdkMessages: (threadMessages: readonly ThreadMessage[], parentId: string | null) => AdkMessage[];
|
|
52
|
+
export declare const toAdkUserMessage: (msg: AppendMessage, id?: string) => AdkMessage & {
|
|
53
53
|
type: "human";
|
|
54
54
|
id: string;
|
|
55
55
|
};
|
|
56
56
|
//#endregion
|
|
57
|
-
export { getMessageContent, getPendingCancellations, getPendingToolCalls, toAdkUserMessage, truncateAdkMessages };
|
|
58
57
|
//# sourceMappingURL=convertToAdkMessages.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertToAdkMessages.d.ts","names":[],"sources":["../src/convertToAdkMessages.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"convertToAdkMessages.d.ts","names":[],"sources":["../src/convertToAdkMessages.ts"],"mappings":";;;;qBAgBa,oBAAqB,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA2E1B,sBAAuB,UAAU,iBAAA;;;;;;;;;;qBAyBjC,0BACX,UAAU,cACV,0CACC,MAAM;EAAe;;qBAaX,sBACX,yBAAyB,iBACzB,4BACC;qBAWU,mBACX,KAAK,eACL,gBACC;EAAe;EAAe"}
|
package/dist/hooks.d.ts
CHANGED
|
@@ -2,38 +2,37 @@ import { AdkAuthCredential, AdkAuthRequest, AdkMessage, AdkMessageMetadata, AdkS
|
|
|
2
2
|
import { ReadonlyJSONValue } from "assistant-stream/utils";
|
|
3
3
|
//#region src/hooks.d.ts
|
|
4
4
|
/** Returns the name and branch of the currently active ADK agent. */
|
|
5
|
-
declare const useAdkAgentInfo: () => {
|
|
5
|
+
export declare const useAdkAgentInfo: () => {
|
|
6
6
|
name?: string | undefined;
|
|
7
7
|
branch?: string | undefined;
|
|
8
8
|
} | undefined;
|
|
9
9
|
/** Returns the accumulated session state delta from ADK events. */
|
|
10
|
-
declare const useAdkSessionState: () => Record<string, unknown>;
|
|
10
|
+
export declare const useAdkSessionState: () => Record<string, unknown>;
|
|
11
11
|
/** Returns a function to send raw ADK messages. */
|
|
12
|
-
declare const useAdkSend: () => (messages: AdkMessage[], config: AdkSendMessageConfig) => Promise<void>;
|
|
12
|
+
export declare const useAdkSend: () => (messages: AdkMessage[], config: AdkSendMessageConfig) => Promise<void>;
|
|
13
13
|
/** Returns the IDs of long-running tools awaiting external input. */
|
|
14
|
-
declare const useAdkLongRunningToolIds: () => string[];
|
|
14
|
+
export declare const useAdkLongRunningToolIds: () => string[];
|
|
15
15
|
/** Returns pending tool confirmation requests (from SecurityPlugin etc). */
|
|
16
|
-
declare const useAdkToolConfirmations: () => AdkToolConfirmation[];
|
|
16
|
+
export declare const useAdkToolConfirmations: () => AdkToolConfirmation[];
|
|
17
17
|
/** Returns pending auth credential requests from tools. */
|
|
18
|
-
declare const useAdkAuthRequests: () => AdkAuthRequest[];
|
|
18
|
+
export declare const useAdkAuthRequests: () => AdkAuthRequest[];
|
|
19
19
|
/** Returns the accumulated artifact delta (filename → version). */
|
|
20
|
-
declare const useAdkArtifacts: () => Record<string, number>;
|
|
20
|
+
export declare const useAdkArtifacts: () => Record<string, number>;
|
|
21
21
|
/** Returns whether any agent has escalated (requested human handoff). */
|
|
22
|
-
declare const useAdkEscalation: () => boolean;
|
|
22
|
+
export declare const useAdkEscalation: () => boolean;
|
|
23
23
|
/** Returns per-message metadata (grounding, citation, usage). Keyed by message ID. */
|
|
24
|
-
declare const useAdkMessageMetadata: () => Map<string, AdkMessageMetadata>;
|
|
24
|
+
export declare const useAdkMessageMetadata: () => Map<string, AdkMessageMetadata>;
|
|
25
25
|
/** Returns a function to confirm or deny a pending tool confirmation. */
|
|
26
|
-
declare const useAdkConfirmTool: () => (toolCallId: string, confirmed: boolean, payload?: ReadonlyJSONValue) => Promise<void>;
|
|
26
|
+
export declare const useAdkConfirmTool: () => (toolCallId: string, confirmed: boolean, payload?: ReadonlyJSONValue) => Promise<void>;
|
|
27
27
|
/** Returns a function to submit auth credentials for a pending auth request. */
|
|
28
|
-
declare const useAdkSubmitAuth: () => (toolCallId: string, credential: AdkAuthCredential) => Promise<void>;
|
|
28
|
+
export declare const useAdkSubmitAuth: () => (toolCallId: string, credential: AdkAuthCredential) => Promise<void>;
|
|
29
29
|
/** Returns a function to submit the user's answer for a pending `adk_request_input` HITL interrupt. */
|
|
30
|
-
declare const useAdkSubmitInput: () => (toolCallId: string, result: ReadonlyJSONValue) => Promise<void>;
|
|
30
|
+
export declare const useAdkSubmitInput: () => (toolCallId: string, result: ReadonlyJSONValue) => Promise<void>;
|
|
31
31
|
/** Returns app-level state (keys prefixed with `app:`, prefix stripped). */
|
|
32
|
-
declare const useAdkAppState: () => Record<string, unknown>;
|
|
32
|
+
export declare const useAdkAppState: () => Record<string, unknown>;
|
|
33
33
|
/** Returns user-level state (keys prefixed with `user:`, prefix stripped). */
|
|
34
|
-
declare const useAdkUserState: () => Record<string, unknown>;
|
|
34
|
+
export declare const useAdkUserState: () => Record<string, unknown>;
|
|
35
35
|
/** Returns temp state (keys prefixed with `temp:`, prefix stripped). Not persisted. */
|
|
36
|
-
declare const useAdkTempState: () => Record<string, unknown>;
|
|
36
|
+
export declare const useAdkTempState: () => Record<string, unknown>;
|
|
37
37
|
//#endregion
|
|
38
|
-
export { useAdkAgentInfo, useAdkAppState, useAdkArtifacts, useAdkAuthRequests, useAdkConfirmTool, useAdkEscalation, useAdkLongRunningToolIds, useAdkMessageMetadata, useAdkSend, useAdkSessionState, useAdkSubmitAuth, useAdkSubmitInput, useAdkTempState, useAdkToolConfirmations, useAdkUserState };
|
|
39
38
|
//# sourceMappingURL=hooks.d.ts.map
|
package/dist/hooks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","names":[],"sources":["../src/hooks.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","names":[],"sources":["../src/hooks.ts"],"mappings":";;;;qBAwBa;EAAA;EAAA;;;qBAIA,0BAAkB;;qBAIlB,mBAEH,UAAU,cAAc,QAAQ,yBAAoB;;qBAKjD;;qBAIA,+BAAuB;;qBAIvB,0BAAkB;;qBAIlB,uBAAe;;qBAIf;;qBAGA,6BAAqB,YAAA;;qBAMrB,0BAGT,oBACA,oBACA,UAAU,sBAAiB;;qBAQlB,yBAEH,oBAAoB,YAAY,sBAAiB;;qBAiB9C,0BAEH,oBAAoB,QAAQ,sBAAiB;;qBAyC1C,sBAAc;;qBAGd,uBAAe;;qBAGf,uBAAe"}
|
package/dist/hooks.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { adkExtras } from "./adkExtras.js";
|
|
2
1
|
import { toAdkConfirmationReply } from "./adkToolApproval.js";
|
|
2
|
+
import { adkExtras } from "./adkExtras.js";
|
|
3
3
|
import { generateId } from "@assistant-ui/core";
|
|
4
4
|
import { useAui } from "@assistant-ui/store";
|
|
5
5
|
import { useShallowSelector } from "@assistant-ui/store/internal";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeAdkPart.d.ts","names":[],"sources":["../src/normalizeAdkPart.ts"],"mappings":";qBAEa,mBACX,MAAM,4BACL"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { isRecord } from "@assistant-ui/core/internal";
|
|
2
|
+
//#region src/normalizeAdkPart.ts
|
|
3
|
+
const normalizeAdkPart = (part) => {
|
|
4
|
+
const result = { ...part };
|
|
5
|
+
if ("function_call" in part && !("functionCall" in part)) result.functionCall = part.function_call;
|
|
6
|
+
if ("function_response" in part && !("functionResponse" in part)) result.functionResponse = part.function_response;
|
|
7
|
+
if ("inline_data" in part && !("inlineData" in part)) result.inlineData = part.inline_data;
|
|
8
|
+
if ("file_data" in part && !("fileData" in part)) result.fileData = part.file_data;
|
|
9
|
+
if (isRecord(result.inlineData)) {
|
|
10
|
+
const data = result.inlineData;
|
|
11
|
+
if ("mime_type" in data && !("mimeType" in data)) result.inlineData = {
|
|
12
|
+
...data,
|
|
13
|
+
mimeType: data.mime_type
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
if (isRecord(result.fileData)) {
|
|
17
|
+
const data = result.fileData;
|
|
18
|
+
result.fileData = {
|
|
19
|
+
...data,
|
|
20
|
+
..."mime_type" in data && !("mimeType" in data) && { mimeType: data.mime_type },
|
|
21
|
+
..."file_uri" in data && !("fileUri" in data) && { fileUri: data.file_uri }
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if ("executable_code" in part && !("executableCode" in part)) result.executableCode = part.executable_code;
|
|
25
|
+
if ("code_execution_result" in part && !("codeExecutionResult" in part)) result.codeExecutionResult = part.code_execution_result;
|
|
26
|
+
return result;
|
|
27
|
+
};
|
|
28
|
+
//#endregion
|
|
29
|
+
export { normalizeAdkPart };
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=normalizeAdkPart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeAdkPart.js","names":[],"sources":["../src/normalizeAdkPart.ts"],"sourcesContent":["import { isRecord } from \"@assistant-ui/core/internal\";\n\nexport const normalizeAdkPart = (\n part: Record<string, unknown>,\n): Record<string, unknown> => {\n const result: Record<string, unknown> = { ...part };\n if (\"function_call\" in part && !(\"functionCall\" in part))\n result.functionCall = part.function_call;\n if (\"function_response\" in part && !(\"functionResponse\" in part))\n result.functionResponse = part.function_response;\n if (\"inline_data\" in part && !(\"inlineData\" in part))\n result.inlineData = part.inline_data;\n if (\"file_data\" in part && !(\"fileData\" in part))\n result.fileData = part.file_data;\n if (isRecord(result.inlineData)) {\n const data = result.inlineData;\n if (\"mime_type\" in data && !(\"mimeType\" in data))\n result.inlineData = { ...data, mimeType: data.mime_type };\n }\n if (isRecord(result.fileData)) {\n const data = result.fileData;\n result.fileData = {\n ...data,\n ...(\"mime_type\" in data &&\n !(\"mimeType\" in data) && { mimeType: data.mime_type }),\n ...(\"file_uri\" in data &&\n !(\"fileUri\" in data) && { fileUri: data.file_uri }),\n };\n }\n if (\"executable_code\" in part && !(\"executableCode\" in part))\n result.executableCode = part.executable_code;\n if (\"code_execution_result\" in part && !(\"codeExecutionResult\" in part))\n result.codeExecutionResult = part.code_execution_result;\n return result;\n};\n"],"mappings":";;AAEA,MAAa,oBACX,SAC4B;CAC5B,MAAM,SAAkC,EAAE,GAAG,KAAK;CAClD,IAAI,mBAAmB,QAAQ,EAAE,kBAAkB,OACjD,OAAO,eAAe,KAAK;CAC7B,IAAI,uBAAuB,QAAQ,EAAE,sBAAsB,OACzD,OAAO,mBAAmB,KAAK;CACjC,IAAI,iBAAiB,QAAQ,EAAE,gBAAgB,OAC7C,OAAO,aAAa,KAAK;CAC3B,IAAI,eAAe,QAAQ,EAAE,cAAc,OACzC,OAAO,WAAW,KAAK;CACzB,IAAI,SAAS,OAAO,UAAU,GAAG;EAC/B,MAAM,OAAO,OAAO;EACpB,IAAI,eAAe,QAAQ,EAAE,cAAc,OACzC,OAAO,aAAa;GAAE,GAAG;GAAM,UAAU,KAAK;EAAU;CAC5D;CACA,IAAI,SAAS,OAAO,QAAQ,GAAG;EAC7B,MAAM,OAAO,OAAO;EACpB,OAAO,WAAW;GAChB,GAAG;GACH,GAAI,eAAe,QACjB,EAAE,cAAc,SAAS,EAAE,UAAU,KAAK,UAAU;GACtD,GAAI,cAAc,QAChB,EAAE,aAAa,SAAS,EAAE,SAAS,KAAK,SAAS;EACrD;CACF;CACA,IAAI,qBAAqB,QAAQ,EAAE,oBAAoB,OACrD,OAAO,iBAAiB,KAAK;CAC/B,IAAI,2BAA2B,QAAQ,EAAE,yBAAyB,OAChE,OAAO,sBAAsB,KAAK;CACpC,OAAO;AACT"}
|
package/dist/parseAdkEvent.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { AdkEvent } from "./types.js";
|
|
2
2
|
//#region src/parseAdkEvent.d.ts
|
|
3
|
-
declare function parseAdkEventValue(value: unknown, errorPrefix: string): AdkEvent;
|
|
3
|
+
export declare function parseAdkEventValue(value: unknown, errorPrefix: string): AdkEvent;
|
|
4
4
|
//#endregion
|
|
5
|
-
export { parseAdkEventValue };
|
|
6
5
|
//# sourceMappingURL=parseAdkEvent.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseAdkEvent.d.ts","names":[],"sources":["../src/parseAdkEvent.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"parseAdkEvent.d.ts","names":[],"sources":["../src/parseAdkEvent.ts"],"mappings":";;wBAUgB,mBACd,gBACA,sBACC"}
|
package/dist/sdkIdentity.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdkIdentity.d.ts","names":[],"sources":["../src/sdkIdentity.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"sdkIdentity.d.ts","names":[],"sources":["../src/sdkIdentity.ts"],"mappings":";;qBAEa,SAAS"}
|
package/dist/sdkIdentity.js
CHANGED
|
@@ -25,7 +25,7 @@ type AdkSdkEvent = {
|
|
|
25
25
|
usageMetadata?: unknown;
|
|
26
26
|
customMetadata?: Record<string, unknown>;
|
|
27
27
|
};
|
|
28
|
-
type AdkEventStreamOptions = {
|
|
28
|
+
export type AdkEventStreamOptions = {
|
|
29
29
|
onError?: (error: unknown) => void;
|
|
30
30
|
};
|
|
31
31
|
/**
|
|
@@ -38,7 +38,6 @@ type AdkEventStreamOptions = {
|
|
|
38
38
|
* return adkEventStream(events);
|
|
39
39
|
* ```
|
|
40
40
|
*/
|
|
41
|
-
declare const adkEventStream: (events: AsyncGenerator<AdkSdkEvent, void, undefined>, options?: AdkEventStreamOptions) => Response;
|
|
41
|
+
export declare const adkEventStream: (events: AsyncGenerator<AdkSdkEvent, void, undefined>, options?: AdkEventStreamOptions) => Response;
|
|
42
42
|
//#endregion
|
|
43
|
-
export { AdkEventStreamOptions, adkEventStream };
|
|
44
43
|
//# sourceMappingURL=adkEventStream.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adkEventStream.d.ts","names":[],"sources":["../../src/server/adkEventStream.ts"],"mappings":";;;;KAKK;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;IACE;IACA,QAAQ,MAAM;;EAEhB,UAAU;EACV;EACA;EACA;EACA;EACA;EACA;EACA,iBAAiB;;
|
|
1
|
+
{"version":3,"file":"adkEventStream.d.ts","names":[],"sources":["../../src/server/adkEventStream.ts"],"mappings":";;;;KAKK;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;IACE;IACA,QAAQ,MAAM;;EAEhB,UAAU;EACV;EACA;EACA;EACA;EACA;EACA;EACA,iBAAiB;;YAyEP;EACV,WAAW;;;;;;;;;;;;qBA4BA,iBACX,QAAQ,eAAe,+BACvB,UAAU,0BACT"}
|
|
@@ -7,7 +7,7 @@ import { AdkEventStreamOptions } from "./adkEventStream.js";
|
|
|
7
7
|
type AdkRunner = {
|
|
8
8
|
runAsync(options: Record<string, unknown>): AsyncGenerator<any, void, undefined>;
|
|
9
9
|
};
|
|
10
|
-
type CreateAdkApiRouteOptions = {
|
|
10
|
+
export type CreateAdkApiRouteOptions = {
|
|
11
11
|
/**
|
|
12
12
|
* ADK Runner instance.
|
|
13
13
|
*/
|
|
@@ -43,7 +43,6 @@ type CreateAdkApiRouteOptions = {
|
|
|
43
43
|
* });
|
|
44
44
|
* ```
|
|
45
45
|
*/
|
|
46
|
-
declare function createAdkApiRoute(options: CreateAdkApiRouteOptions): (req: Request) => Promise<Response>;
|
|
46
|
+
export declare function createAdkApiRoute(options: CreateAdkApiRouteOptions): (req: Request) => Promise<Response>;
|
|
47
47
|
//#endregion
|
|
48
|
-
export { CreateAdkApiRouteOptions, createAdkApiRoute };
|
|
49
48
|
//# sourceMappingURL=createAdkApiRoute.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createAdkApiRoute.d.ts","names":[],"sources":["../../src/server/createAdkApiRoute.ts"],"mappings":";;;;;;KAOK;EACH,SACE,SAAS,0BACR;;
|
|
1
|
+
{"version":3,"file":"createAdkApiRoute.d.ts","names":[],"sources":["../../src/server/createAdkApiRoute.ts"],"mappings":";;;;;;KAOK;EACH,SACE,SAAS,0BACR;;YAGO;;;;EAIV,QAAQ;;;;;EAMR,mBAAmB,KAAK,qBAAqB;;;;;EAM7C,sBAAsB,KAAK,qBAAqB;;;;EAKhD,UAAU;;;;;;;;;;;;;;;;;;wBAmBI,kBACd,SAAS,4BACP,KAAK,YAAY,QAAQ"}
|
|
@@ -36,7 +36,7 @@ type ParsedAdkRequest = {
|
|
|
36
36
|
* }
|
|
37
37
|
* ```
|
|
38
38
|
*/
|
|
39
|
-
declare const parseAdkRequest: (request: Request) => Promise<ParsedAdkRequest>;
|
|
39
|
+
export declare const parseAdkRequest: (request: Request) => Promise<ParsedAdkRequest>;
|
|
40
40
|
/**
|
|
41
41
|
* Converts a parsed ADK request into a Google GenAI Content object
|
|
42
42
|
* suitable for `Runner.runAsync({ newMessage })`.
|
|
@@ -49,10 +49,9 @@ declare const parseAdkRequest: (request: Request) => Promise<ParsedAdkRequest>;
|
|
|
49
49
|
* return adkEventStream(events);
|
|
50
50
|
* ```
|
|
51
51
|
*/
|
|
52
|
-
declare const toAdkContent: (parsed: ParsedAdkRequest) => {
|
|
52
|
+
export declare const toAdkContent: (parsed: ParsedAdkRequest) => {
|
|
53
53
|
role: string;
|
|
54
54
|
parts: Array<Record<string, unknown>>;
|
|
55
55
|
};
|
|
56
56
|
//#endregion
|
|
57
|
-
export { parseAdkRequest, toAdkContent };
|
|
58
57
|
//# sourceMappingURL=parseAdkRequest.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseAdkRequest.d.ts","names":[],"sources":["../../src/server/parseAdkRequest.ts"],"mappings":";;KAIK;EAEC;EACA;EACA,QAAQ,MAAM;EACd,QAAQ;EACR,aAAa;;EAGb;EACA;EACA;EACA;EACA;EACA,QAAQ;EACR,aAAa;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"parseAdkRequest.d.ts","names":[],"sources":["../../src/server/parseAdkRequest.ts"],"mappings":";;KAIK;EAEC;EACA;EACA,QAAQ,MAAM;EACd,QAAQ;EACR,aAAa;;EAGb;EACA;EACA;EACA;EACA;EACA,QAAQ;EACR,aAAa;;;;;;;;;;;;;;;;;;;;;;;qBA6HN,kBACX,SAAS,YACR,QAAQ;;;;;;;;;;;;;qBAsFE,eACX,QAAQ;EACL;EAAc,OAAO,MAAM"}
|
|
@@ -4,7 +4,6 @@ import { AdkEvent, AdkStructuredEvent } from "./types.js";
|
|
|
4
4
|
* Converts a raw `AdkEvent` into an array of structured, typed events.
|
|
5
5
|
* Useful for building custom event renderers.
|
|
6
6
|
*/
|
|
7
|
-
declare function toAdkStructuredEvents(event: AdkEvent): AdkStructuredEvent[];
|
|
7
|
+
export declare function toAdkStructuredEvents(event: AdkEvent): AdkStructuredEvent[];
|
|
8
8
|
//#endregion
|
|
9
|
-
export { toAdkStructuredEvents };
|
|
10
9
|
//# sourceMappingURL=structuredEvents.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structuredEvents.d.ts","names":[],"sources":["../src/structuredEvents.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"structuredEvents.d.ts","names":[],"sources":["../src/structuredEvents.ts"],"mappings":";;;;;;wBAOgB,sBAAsB,OAAO,WAAW"}
|
package/dist/structuredEvents.js
CHANGED
|
@@ -29,7 +29,7 @@ function toAdkStructuredEvents(event) {
|
|
|
29
29
|
type: "tool_call",
|
|
30
30
|
call: {
|
|
31
31
|
name: part.functionCall.name,
|
|
32
|
-
args: part.functionCall.args
|
|
32
|
+
args: part.functionCall.args ?? {}
|
|
33
33
|
}
|
|
34
34
|
};
|
|
35
35
|
if (part.functionCall.id != null) call.call.id = part.functionCall.id;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structuredEvents.js","names":[],"sources":["../src/structuredEvents.ts"],"sourcesContent":["import type { AdkEvent, AdkStructuredEvent } from \"./types\";\nimport { isFinalResponse } from \"./AdkEventAccumulator\";\n\n/**\n * Converts a raw `AdkEvent` into an array of structured, typed events.\n * Useful for building custom event renderers.\n */\nexport function toAdkStructuredEvents(event: AdkEvent): AdkStructuredEvent[] {\n const result: AdkStructuredEvent[] = [];\n\n if (event.errorCode || event.errorMessage) {\n const err: AdkStructuredEvent & { type: \"error\" } = { type: \"error\" };\n if (event.errorCode != null) err.errorCode = event.errorCode;\n if (event.errorMessage != null) err.errorMessage = event.errorMessage;\n result.push(err);\n }\n\n const parts = event.content?.parts;\n if (parts) {\n for (const part of parts) {\n if (part.text != null) {\n if (part.thought) {\n result.push({ type: \"thought\", content: part.text });\n } else {\n result.push({ type: \"content\", content: part.text });\n }\n }\n if (part.functionCall) {\n const call: AdkStructuredEvent & { type: \"tool_call\" } = {\n type: \"tool_call\",\n call: {
|
|
1
|
+
{"version":3,"file":"structuredEvents.js","names":[],"sources":["../src/structuredEvents.ts"],"sourcesContent":["import type { AdkEvent, AdkStructuredEvent } from \"./types\";\nimport { isFinalResponse } from \"./AdkEventAccumulator\";\n\n/**\n * Converts a raw `AdkEvent` into an array of structured, typed events.\n * Useful for building custom event renderers.\n */\nexport function toAdkStructuredEvents(event: AdkEvent): AdkStructuredEvent[] {\n const result: AdkStructuredEvent[] = [];\n\n if (event.errorCode || event.errorMessage) {\n const err: AdkStructuredEvent & { type: \"error\" } = { type: \"error\" };\n if (event.errorCode != null) err.errorCode = event.errorCode;\n if (event.errorMessage != null) err.errorMessage = event.errorMessage;\n result.push(err);\n }\n\n const parts = event.content?.parts;\n if (parts) {\n for (const part of parts) {\n if (part.text != null) {\n if (part.thought) {\n result.push({ type: \"thought\", content: part.text });\n } else {\n result.push({ type: \"content\", content: part.text });\n }\n }\n if (part.functionCall) {\n const call: AdkStructuredEvent & { type: \"tool_call\" } = {\n type: \"tool_call\",\n call: {\n name: part.functionCall.name,\n args: part.functionCall.args ?? {},\n },\n };\n if (part.functionCall.id != null) call.call.id = part.functionCall.id;\n result.push(call);\n }\n if (part.functionResponse) {\n const tr: AdkStructuredEvent & { type: \"tool_result\" } = {\n type: \"tool_result\",\n result: {\n name: part.functionResponse.name,\n response: part.functionResponse.response,\n },\n };\n if (part.functionResponse.id != null)\n tr.result.id = part.functionResponse.id;\n result.push(tr);\n }\n if (part.executableCode) {\n const ce: AdkStructuredEvent & { type: \"call_code\" } = {\n type: \"call_code\",\n code: { code: part.executableCode.code },\n };\n if (part.executableCode.language != null)\n ce.code.language = part.executableCode.language;\n result.push(ce);\n }\n if (part.codeExecutionResult) {\n const cr: AdkStructuredEvent & { type: \"code_result\" } = {\n type: \"code_result\",\n result: { output: part.codeExecutionResult.output },\n };\n if (part.codeExecutionResult.outcome != null)\n cr.result.outcome = part.codeExecutionResult.outcome;\n result.push(cr);\n }\n }\n }\n\n if (event.actions?.requestedToolConfirmations) {\n result.push({\n type: \"tool_confirmation\",\n confirmations: event.actions.requestedToolConfirmations,\n });\n }\n\n if (isFinalResponse(event) && result.length === 0) {\n result.push({ type: \"finished\" });\n }\n\n return result;\n}\n"],"mappings":";;;;;;AAOA,SAAgB,sBAAsB,OAAuC;CAC3E,MAAM,SAA+B,CAAC;CAEtC,IAAI,MAAM,aAAa,MAAM,cAAc;EACzC,MAAM,MAA8C,EAAE,MAAM,QAAQ;EACpE,IAAI,MAAM,aAAa,MAAM,IAAI,YAAY,MAAM;EACnD,IAAI,MAAM,gBAAgB,MAAM,IAAI,eAAe,MAAM;EACzD,OAAO,KAAK,GAAG;CACjB;CAEA,MAAM,QAAQ,MAAM,SAAS;CAC7B,IAAI,OACF,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,KAAK,QAAQ,MAAM;GACrB,IAAI,KAAK,SACP,OAAO,KAAK;IAAE,MAAM;IAAW,SAAS,KAAK;GAAK,CAAC;QAEnD,OAAO,KAAK;IAAE,MAAM;IAAW,SAAS,KAAK;GAAK,CAAC;EAEvD;EACA,IAAI,KAAK,cAAc;GACrB,MAAM,OAAmD;IACvD,MAAM;IACN,MAAM;KACJ,MAAM,KAAK,aAAa;KACxB,MAAM,KAAK,aAAa,QAAQ,CAAC;IACnC;GACF;GACA,IAAI,KAAK,aAAa,MAAM,MAAM,KAAK,KAAK,KAAK,KAAK,aAAa;GACnE,OAAO,KAAK,IAAI;EAClB;EACA,IAAI,KAAK,kBAAkB;GACzB,MAAM,KAAmD;IACvD,MAAM;IACN,QAAQ;KACN,MAAM,KAAK,iBAAiB;KAC5B,UAAU,KAAK,iBAAiB;IAClC;GACF;GACA,IAAI,KAAK,iBAAiB,MAAM,MAC9B,GAAG,OAAO,KAAK,KAAK,iBAAiB;GACvC,OAAO,KAAK,EAAE;EAChB;EACA,IAAI,KAAK,gBAAgB;GACvB,MAAM,KAAiD;IACrD,MAAM;IACN,MAAM,EAAE,MAAM,KAAK,eAAe,KAAK;GACzC;GACA,IAAI,KAAK,eAAe,YAAY,MAClC,GAAG,KAAK,WAAW,KAAK,eAAe;GACzC,OAAO,KAAK,EAAE;EAChB;EACA,IAAI,KAAK,qBAAqB;GAC5B,MAAM,KAAmD;IACvD,MAAM;IACN,QAAQ,EAAE,QAAQ,KAAK,oBAAoB,OAAO;GACpD;GACA,IAAI,KAAK,oBAAoB,WAAW,MACtC,GAAG,OAAO,UAAU,KAAK,oBAAoB;GAC/C,OAAO,KAAK,EAAE;EAChB;CACF;CAGF,IAAI,MAAM,SAAS,4BACjB,OAAO,KAAK;EACV,MAAM;EACN,eAAe,MAAM,QAAQ;CAC/B,CAAC;CAGH,IAAI,gBAAgB,KAAK,KAAK,OAAO,WAAW,GAC9C,OAAO,KAAK,EAAE,MAAM,WAAW,CAAC;CAGlC,OAAO;AACT"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
//#region src/toAdkFunctionResponse.d.ts
|
|
2
|
-
declare const isAdkFunctionError: (response: unknown) => boolean;
|
|
3
|
-
declare const toAdkFunctionResponse: (result: unknown, isError?: boolean) => Record<string, unknown>;
|
|
2
|
+
export declare const isAdkFunctionError: (response: unknown) => boolean;
|
|
3
|
+
export declare const toAdkFunctionResponse: (result: unknown, isError?: boolean) => Record<string, unknown>;
|
|
4
4
|
//#endregion
|
|
5
|
-
export { isAdkFunctionError, toAdkFunctionResponse };
|
|
6
5
|
//# sourceMappingURL=toAdkFunctionResponse.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toAdkFunctionResponse.d.ts","names":[],"sources":["../src/toAdkFunctionResponse.ts"],"mappings":";
|
|
1
|
+
{"version":3,"file":"toAdkFunctionResponse.d.ts","names":[],"sources":["../src/toAdkFunctionResponse.ts"],"mappings":";qBAEa,qBAAsB;qBAKtB,wBACX,iBACA,sBACC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
//#region src/trimTrailingSlashes.d.ts
|
|
2
|
-
declare const trimTrailingSlashes: (value: string) => string;
|
|
2
|
+
export declare const trimTrailingSlashes: (value: string) => string;
|
|
3
3
|
//#endregion
|
|
4
|
-
export { trimTrailingSlashes };
|
|
5
4
|
//# sourceMappingURL=trimTrailingSlashes.d.ts.map
|