@wix/legends-platform-sdk 1.24.0 → 1.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.md +21 -3
  2. package/dist/cjs/hooks/useConversation/livekit/constants.js +3 -1
  3. package/dist/cjs/hooks/useConversation/livekit/constants.js.map +1 -1
  4. package/dist/cjs/hooks/useConversation/livekit/types.js.map +1 -1
  5. package/dist/cjs/hooks/useConversation/livekit/useConversation.js +34 -6
  6. package/dist/cjs/hooks/useConversation/livekit/useConversation.js.map +1 -1
  7. package/dist/cjs/hooks/useConversation/livekit/utils/dataChannel.js +0 -4
  8. package/dist/cjs/hooks/useConversation/livekit/utils/dataChannel.js.map +1 -1
  9. package/dist/cjs/hooks/useConversation/livekit/utils/index.js +10 -4
  10. package/dist/cjs/hooks/useConversation/livekit/utils/index.js.map +1 -1
  11. package/dist/cjs/hooks/useConversation/livekit/utils/rpc.js +16 -0
  12. package/dist/cjs/hooks/useConversation/livekit/utils/rpc.js.map +1 -0
  13. package/dist/cjs/hooks/useConversation/livekit/utils/toolDefinitions.js +22 -0
  14. package/dist/cjs/hooks/useConversation/livekit/utils/toolDefinitions.js.map +1 -0
  15. package/dist/cjs/hooks/useTextChat/streamChatMessage.js +18 -1
  16. package/dist/cjs/hooks/useTextChat/streamChatMessage.js.map +1 -1
  17. package/dist/cjs/hooks/useTextChat/useTextChatStream.js +5 -2
  18. package/dist/cjs/hooks/useTextChat/useTextChatStream.js.map +1 -1
  19. package/dist/cjs/hooks/useTools/index.js.map +1 -1
  20. package/dist/cjs/hooks/useTools/model/types.js.map +1 -1
  21. package/dist/cjs/hooks/useTools/runtime/executeToolCall.js +2 -1
  22. package/dist/cjs/hooks/useTools/runtime/executeToolCall.js.map +1 -1
  23. package/dist/cjs/hooks/useTools/runtime/useToolCallingRuntime.js +10 -1
  24. package/dist/cjs/hooks/useTools/runtime/useToolCallingRuntime.js.map +1 -1
  25. package/dist/esm/hooks/useConversation/livekit/constants.js +2 -0
  26. package/dist/esm/hooks/useConversation/livekit/constants.js.map +1 -1
  27. package/dist/esm/hooks/useConversation/livekit/types.js.map +1 -1
  28. package/dist/esm/hooks/useConversation/livekit/useConversation.js +37 -8
  29. package/dist/esm/hooks/useConversation/livekit/useConversation.js.map +1 -1
  30. package/dist/esm/hooks/useConversation/livekit/utils/dataChannel.js +0 -3
  31. package/dist/esm/hooks/useConversation/livekit/utils/dataChannel.js.map +1 -1
  32. package/dist/esm/hooks/useConversation/livekit/utils/index.js +2 -1
  33. package/dist/esm/hooks/useConversation/livekit/utils/index.js.map +1 -1
  34. package/dist/esm/hooks/useConversation/livekit/utils/rpc.js +12 -0
  35. package/dist/esm/hooks/useConversation/livekit/utils/rpc.js.map +1 -0
  36. package/dist/esm/hooks/useConversation/livekit/utils/toolDefinitions.js +20 -0
  37. package/dist/esm/hooks/useConversation/livekit/utils/toolDefinitions.js.map +1 -0
  38. package/dist/esm/hooks/useTextChat/streamChatMessage.js +17 -1
  39. package/dist/esm/hooks/useTextChat/streamChatMessage.js.map +1 -1
  40. package/dist/esm/hooks/useTextChat/useTextChatStream.js +5 -2
  41. package/dist/esm/hooks/useTextChat/useTextChatStream.js.map +1 -1
  42. package/dist/esm/hooks/useTools/index.js.map +1 -1
  43. package/dist/esm/hooks/useTools/model/types.js.map +1 -1
  44. package/dist/esm/hooks/useTools/runtime/executeToolCall.js +2 -1
  45. package/dist/esm/hooks/useTools/runtime/executeToolCall.js.map +1 -1
  46. package/dist/esm/hooks/useTools/runtime/useToolCallingRuntime.js +10 -1
  47. package/dist/esm/hooks/useTools/runtime/useToolCallingRuntime.js.map +1 -1
  48. package/dist/types/hooks/useConversation/livekit/constants.d.ts +2 -0
  49. package/dist/types/hooks/useConversation/livekit/constants.d.ts.map +1 -1
  50. package/dist/types/hooks/useConversation/livekit/types.d.ts +4 -14
  51. package/dist/types/hooks/useConversation/livekit/types.d.ts.map +1 -1
  52. package/dist/types/hooks/useConversation/livekit/useConversation.d.ts.map +1 -1
  53. package/dist/types/hooks/useConversation/livekit/utils/dataChannel.d.ts +1 -2
  54. package/dist/types/hooks/useConversation/livekit/utils/dataChannel.d.ts.map +1 -1
  55. package/dist/types/hooks/useConversation/livekit/utils/index.d.ts +2 -1
  56. package/dist/types/hooks/useConversation/livekit/utils/index.d.ts.map +1 -1
  57. package/dist/types/hooks/useConversation/livekit/utils/rpc.d.ts +3 -0
  58. package/dist/types/hooks/useConversation/livekit/utils/rpc.d.ts.map +1 -0
  59. package/dist/types/hooks/useConversation/livekit/utils/toolDefinitions.d.ts +4 -0
  60. package/dist/types/hooks/useConversation/livekit/utils/toolDefinitions.d.ts.map +1 -0
  61. package/dist/types/hooks/useTextChat/streamChatMessage.d.ts +2 -0
  62. package/dist/types/hooks/useTextChat/streamChatMessage.d.ts.map +1 -1
  63. package/dist/types/hooks/useTextChat/useTextChatStream.d.ts +1 -0
  64. package/dist/types/hooks/useTextChat/useTextChatStream.d.ts.map +1 -1
  65. package/dist/types/hooks/useTools/index.d.ts +1 -1
  66. package/dist/types/hooks/useTools/index.d.ts.map +1 -1
  67. package/dist/types/hooks/useTools/model/types.d.ts +6 -1
  68. package/dist/types/hooks/useTools/model/types.d.ts.map +1 -1
  69. package/dist/types/hooks/useTools/runtime/executeToolCall.d.ts.map +1 -1
  70. package/dist/types/hooks/useTools/runtime/useToolCallingRuntime.d.ts +1 -0
  71. package/dist/types/hooks/useTools/runtime/useToolCallingRuntime.d.ts.map +1 -1
  72. package/package.json +2 -2
  73. package/dist/cjs/hooks/useConversation/livekit/utils/toolAdapter.js +0 -18
  74. package/dist/cjs/hooks/useConversation/livekit/utils/toolAdapter.js.map +0 -1
  75. package/dist/esm/hooks/useConversation/livekit/utils/toolAdapter.js +0 -14
  76. package/dist/esm/hooks/useConversation/livekit/utils/toolAdapter.js.map +0 -1
  77. package/dist/types/hooks/useConversation/livekit/utils/toolAdapter.d.ts +0 -4
  78. package/dist/types/hooks/useConversation/livekit/utils/toolAdapter.d.ts.map +0 -1
@@ -32,6 +32,17 @@ export function extractContent(frame) {
32
32
  return null;
33
33
  }
34
34
 
35
+ // Same lookup order as extractContent: top level first, then the gateway body.
36
+ export function extractCanSendChatMessage(frame) {
37
+ try {
38
+ const parsed = JSON.parse(frame);
39
+ const payload = typeof parsed.canSendChatMessage === 'boolean' || typeof parsed.body !== 'string' ? parsed : JSON.parse(new TextDecoder().decode(Uint8Array.from(atob(parsed.body), char => char.charCodeAt(0))));
40
+ return typeof payload.canSendChatMessage === 'boolean' ? payload.canSendChatMessage : null;
41
+ } catch {
42
+ return null;
43
+ }
44
+ }
45
+
35
46
  // Feeds decoded text through a running scanner that emits each complete
36
47
  // top-level `{…}` object as its closing brace arrives.
37
48
  export function createObjectScanner(onObject) {
@@ -82,7 +93,8 @@ export async function streamChatMessage(params, callbacks, signal) {
82
93
  headers = params.headers;
83
94
  const onChunk = callbacks.onChunk,
84
95
  onDone = callbacks.onDone,
85
- onError = callbacks.onError;
96
+ onError = callbacks.onError,
97
+ onCanSendChatMessage = callbacks.onCanSendChatMessage;
86
98
  const xsrfToken = readCookie('XSRF-TOKEN');
87
99
  const autoXsrf = !(headers != null && headers['x-xsrf-token']) && xsrfToken ? {
88
100
  'x-xsrf-token': xsrfToken
@@ -116,6 +128,10 @@ export async function streamChatMessage(params, callbacks, signal) {
116
128
  if (content !== null) {
117
129
  onChunk(content);
118
130
  }
131
+ const canSend = extractCanSendChatMessage(frame);
132
+ if (canSend !== null) {
133
+ onCanSendChatMessage == null || onCanSendChatMessage(canSend);
134
+ }
119
135
  });
120
136
  const reader = response.body.getReader();
121
137
  const decoder = new TextDecoder();
@@ -1 +1 @@
1
- {"version":3,"names":["DEFAULT_STREAM_PATH","readCookie","name","_document$cookie$spli","document","undefined","cookie","split","map","part","trim","find","startsWith","slice","length","extractContent","frame","parsed","JSON","parse","content","body","decoded","TextDecoder","decode","Uint8Array","from","atob","char","charCodeAt","inner","createObjectScanner","onObject","buffer","cursor","braceDepth","objectStart","inString","escaped","feed","text","streamChatMessage","params","callbacks","signal","chatId","message","namespace","chatConfig","attachments","metadata","headers","onChunk","onDone","onError","xsrfToken","autoXsrf","response","fetch","method","credentials","stringify","ok","Error","status","scanForObjects","reader","getReader","decoder","_await$reader$read","read","done","value","stream","err"],"sources":["../../../../src/hooks/useTextChat/streamChatMessage.ts"],"sourcesContent":["// Same-origin Wix persona-chat gateway path. The transport always posts here\n// with `credentials: 'include'`, so the session cookie rides along and a\n// consumer needs no proxy route of its own.\nconst DEFAULT_STREAM_PATH =\n '/_api/persona-chat-service/v1/chat/messages/stream';\n\nexport type StreamCallbacks = {\n onChunk: (token: string) => void;\n onDone: () => void;\n onError: (err: Error) => void;\n};\n\nexport type StreamChatMessageParams = {\n chatId: string;\n message: string;\n namespace: string;\n chatConfig?: object;\n attachments?: object[];\n // Request metadata forwarded to the RPC (e.g. `additionalMetadata` carrying\n // opening-message context). Mirrors the top-level `metadata` object the unary\n // `sendChatMessage` request accepts, so a streamed send carries it identically.\n metadata?: object;\n // Extra request headers merged onto the POST. Lets the caller satisfy the\n // host's transport requirements the SDK can't know about — e.g. an\n // `x-xsrf-token` when the endpoint sits behind a CSRF-protected gateway.\n headers?: Record<string, string>;\n};\n\n// Read a cookie value by name in the browser. Returns undefined outside a\n// browser or when the cookie is absent.\nfunction readCookie(name: string): string | undefined {\n if (typeof document === 'undefined') {\n return undefined;\n }\n return document.cookie\n .split(';')\n .map((part) => part.trim())\n .find((part) => part.startsWith(`${name}=`))\n ?.slice(name.length + 1);\n}\n\n// Pull the assistant text out of one streamed frame. Two framings reach us: the\n// proxy route yields `{ content }` objects, while the gateway wraps each frame\n// as `{ body: base64(json) }`. Returns null for frames without content.\nexport function extractContent(frame: string): string | null {\n try {\n const parsed = JSON.parse(frame);\n if (typeof parsed.content === 'string') {\n return parsed.content;\n }\n if (typeof parsed.body === 'string') {\n const decoded = new TextDecoder().decode(\n Uint8Array.from(atob(parsed.body), (char) => char.charCodeAt(0)),\n );\n const inner = JSON.parse(decoded);\n return typeof inner.content === 'string' ? inner.content : null;\n }\n } catch {\n // Incomplete or non-object frame — skip it.\n }\n return null;\n}\n\n// Feeds decoded text through a running scanner that emits each complete\n// top-level `{…}` object as its closing brace arrives.\nexport function createObjectScanner(onObject: (frame: string) => void) {\n let buffer = '';\n let cursor = 0;\n let braceDepth = 0;\n let objectStart = -1;\n let inString = false;\n let escaped = false;\n\n return function feed(text: string) {\n buffer += text;\n for (; cursor < buffer.length; cursor++) {\n const char = buffer[cursor];\n if (inString) {\n if (escaped) {\n escaped = false;\n } else if (char === '\\\\') {\n escaped = true;\n } else if (char === '\"') {\n inString = false;\n }\n continue;\n }\n if (char === '\"') {\n inString = true;\n } else if (char === '{') {\n if (braceDepth === 0) {\n objectStart = cursor;\n }\n braceDepth++;\n } else if (char === '}' && braceDepth > 0) {\n braceDepth--;\n if (braceDepth === 0 && objectStart >= 0) {\n onObject(buffer.slice(objectStart, cursor + 1));\n objectStart = -1;\n }\n }\n }\n };\n}\n\nexport async function streamChatMessage(\n params: StreamChatMessageParams,\n callbacks: StreamCallbacks,\n signal?: AbortSignal,\n): Promise<void> {\n const {\n chatId,\n message,\n namespace,\n chatConfig,\n attachments,\n metadata,\n headers,\n } = params;\n const { onChunk, onDone, onError } = callbacks;\n\n const xsrfToken = readCookie('XSRF-TOKEN');\n const autoXsrf =\n !headers?.['x-xsrf-token'] && xsrfToken\n ? { 'x-xsrf-token': xsrfToken }\n : undefined;\n\n try {\n // eslint-disable-next-line no-undef\n const response = await fetch(DEFAULT_STREAM_PATH, {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json', ...autoXsrf, ...headers },\n body: JSON.stringify({\n chatId,\n message,\n namespace,\n chatConfig,\n attachments,\n metadata,\n }),\n signal,\n });\n\n if (!response.ok || !response.body) {\n onError(new Error(`Stream request failed: ${response.status}`));\n return;\n }\n\n const scanForObjects = createObjectScanner((frame) => {\n const content = extractContent(frame);\n if (content !== null) {\n onChunk(content);\n }\n });\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n scanForObjects(decoder.decode(value, { stream: true }));\n }\n scanForObjects(decoder.decode());\n onDone();\n } catch (err) {\n if ((err as Error).name !== 'AbortError') {\n onError(err as Error);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["DEFAULT_STREAM_PATH","readCookie","name","_document$cookie$spli","document","undefined","cookie","split","map","part","trim","find","startsWith","slice","length","extractContent","frame","parsed","JSON","parse","content","body","decoded","TextDecoder","decode","Uint8Array","from","atob","char","charCodeAt","inner","extractCanSendChatMessage","payload","canSendChatMessage","createObjectScanner","onObject","buffer","cursor","braceDepth","objectStart","inString","escaped","feed","text","streamChatMessage","params","callbacks","signal","chatId","message","namespace","chatConfig","attachments","metadata","headers","onChunk","onDone","onError","onCanSendChatMessage","xsrfToken","autoXsrf","response","fetch","method","credentials","stringify","ok","Error","status","scanForObjects","canSend","reader","getReader","decoder","_await$reader$read","read","done","value","stream","err"],"sources":["../../../../src/hooks/useTextChat/streamChatMessage.ts"],"sourcesContent":["// Same-origin Wix persona-chat gateway path. The transport always posts here\n// with `credentials: 'include'`, so the session cookie rides along and a\n// consumer needs no proxy route of its own.\nconst DEFAULT_STREAM_PATH =\n '/_api/persona-chat-service/v1/chat/messages/stream';\n\nexport type StreamCallbacks = {\n onChunk: (token: string) => void;\n onDone: () => void;\n onError: (err: Error) => void;\n onCanSendChatMessage?: (canSend: boolean) => void;\n};\n\nexport type StreamChatMessageParams = {\n chatId: string;\n message: string;\n namespace: string;\n chatConfig?: object;\n attachments?: object[];\n // Request metadata forwarded to the RPC (e.g. `additionalMetadata` carrying\n // opening-message context). Mirrors the top-level `metadata` object the unary\n // `sendChatMessage` request accepts, so a streamed send carries it identically.\n metadata?: object;\n // Extra request headers merged onto the POST. Lets the caller satisfy the\n // host's transport requirements the SDK can't know about — e.g. an\n // `x-xsrf-token` when the endpoint sits behind a CSRF-protected gateway.\n headers?: Record<string, string>;\n};\n\n// Read a cookie value by name in the browser. Returns undefined outside a\n// browser or when the cookie is absent.\nfunction readCookie(name: string): string | undefined {\n if (typeof document === 'undefined') {\n return undefined;\n }\n return document.cookie\n .split(';')\n .map((part) => part.trim())\n .find((part) => part.startsWith(`${name}=`))\n ?.slice(name.length + 1);\n}\n\n// Pull the assistant text out of one streamed frame. Two framings reach us: the\n// proxy route yields `{ content }` objects, while the gateway wraps each frame\n// as `{ body: base64(json) }`. Returns null for frames without content.\nexport function extractContent(frame: string): string | null {\n try {\n const parsed = JSON.parse(frame);\n if (typeof parsed.content === 'string') {\n return parsed.content;\n }\n if (typeof parsed.body === 'string') {\n const decoded = new TextDecoder().decode(\n Uint8Array.from(atob(parsed.body), (char) => char.charCodeAt(0)),\n );\n const inner = JSON.parse(decoded);\n return typeof inner.content === 'string' ? inner.content : null;\n }\n } catch {\n // Incomplete or non-object frame — skip it.\n }\n return null;\n}\n\n// Same lookup order as extractContent: top level first, then the gateway body.\nexport function extractCanSendChatMessage(frame: string): boolean | null {\n try {\n const parsed = JSON.parse(frame);\n const payload =\n typeof parsed.canSendChatMessage === 'boolean' ||\n typeof parsed.body !== 'string'\n ? parsed\n : JSON.parse(\n new TextDecoder().decode(\n Uint8Array.from(atob(parsed.body), (char) => char.charCodeAt(0)),\n ),\n );\n return typeof payload.canSendChatMessage === 'boolean'\n ? payload.canSendChatMessage\n : null;\n } catch {\n return null;\n }\n}\n\n// Feeds decoded text through a running scanner that emits each complete\n// top-level `{…}` object as its closing brace arrives.\nexport function createObjectScanner(onObject: (frame: string) => void) {\n let buffer = '';\n let cursor = 0;\n let braceDepth = 0;\n let objectStart = -1;\n let inString = false;\n let escaped = false;\n\n return function feed(text: string) {\n buffer += text;\n for (; cursor < buffer.length; cursor++) {\n const char = buffer[cursor];\n if (inString) {\n if (escaped) {\n escaped = false;\n } else if (char === '\\\\') {\n escaped = true;\n } else if (char === '\"') {\n inString = false;\n }\n continue;\n }\n if (char === '\"') {\n inString = true;\n } else if (char === '{') {\n if (braceDepth === 0) {\n objectStart = cursor;\n }\n braceDepth++;\n } else if (char === '}' && braceDepth > 0) {\n braceDepth--;\n if (braceDepth === 0 && objectStart >= 0) {\n onObject(buffer.slice(objectStart, cursor + 1));\n objectStart = -1;\n }\n }\n }\n };\n}\n\nexport async function streamChatMessage(\n params: StreamChatMessageParams,\n callbacks: StreamCallbacks,\n signal?: AbortSignal,\n): Promise<void> {\n const {\n chatId,\n message,\n namespace,\n chatConfig,\n attachments,\n metadata,\n headers,\n } = params;\n const { onChunk, onDone, onError, onCanSendChatMessage } = callbacks;\n\n const xsrfToken = readCookie('XSRF-TOKEN');\n const autoXsrf =\n !headers?.['x-xsrf-token'] && xsrfToken\n ? { 'x-xsrf-token': xsrfToken }\n : undefined;\n\n try {\n // eslint-disable-next-line no-undef\n const response = await fetch(DEFAULT_STREAM_PATH, {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json', ...autoXsrf, ...headers },\n body: JSON.stringify({\n chatId,\n message,\n namespace,\n chatConfig,\n attachments,\n metadata,\n }),\n signal,\n });\n\n if (!response.ok || !response.body) {\n onError(new Error(`Stream request failed: ${response.status}`));\n return;\n }\n\n const scanForObjects = createObjectScanner((frame) => {\n const content = extractContent(frame);\n if (content !== null) {\n onChunk(content);\n }\n const canSend = extractCanSendChatMessage(frame);\n if (canSend !== null) {\n onCanSendChatMessage?.(canSend);\n }\n });\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n scanForObjects(decoder.decode(value, { stream: true }));\n }\n scanForObjects(decoder.decode());\n onDone();\n } catch (err) {\n if ((err as Error).name !== 'AbortError') {\n onError(err as Error);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -141,6 +141,7 @@ export function useTextChatStream(options) {
141
141
  let lastFrameTime = 0;
142
142
  let receivedContent = false;
143
143
  let errored = false;
144
+ let canSendChatMessage;
144
145
  const settle = () => {
145
146
  stopRaf();
146
147
  const finalAssistantMsg = {
@@ -207,12 +208,14 @@ export function useTextChatStream(options) {
207
208
  stopRaf();
208
209
  onError == null || onError(err);
209
210
  setStreamingMessages([]);
210
- }
211
+ },
212
+ onCanSendChatMessage: canSend => canSendChatMessage = canSend
211
213
  }, controller.signal);
212
214
  return {
213
215
  ok: streamDone && !errored,
214
216
  producedContent: receivedContent,
215
- aborted: !streamDone && !errored
217
+ aborted: !streamDone && !errored,
218
+ canSendChatMessage
216
219
  };
217
220
  }, [chatId, namespace, headers, onError, refetch, revealMsPerChar, stopRaf]);
218
221
  return {
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useEffect","useMemo","useRef","useState","useInfiniteQuery","useSdkConsumer","streamChatMessage","messageKey","m","role","content","trim","useTextChatStream","options","_options","_options$limit","limit","headers","onError","_options$revealMsPerC","revealMsPerChar","_useSdkConsumer","chatId","namespace","personaChatService","_useInfiniteQuery","queryKey","queryFn","_ref","pageParam","messages","nextCursor","undefined","queryChatMessages","cursor","getNextPageParam","lastPage","initialPageParam","select","data","pages","flatMap","page","_useInfiniteQuery$dat","sdkMessages","status","fetchNextPage","refetch","_useState","streamingMessages","setStreamingMessages","_useState2","completedMessages","setCompletedMessages","abortRef","rafRef","lastConfirmedRef","sendSeqRef","stopRaf","current","cancelAnimationFrame","_abortRef$current","abort","converted","reverse","confirmedMessages","length","completedKeys","Set","map","confirmedShown","filter","has","chronological","send","_ref2","_abortRef$current2","message","chatConfig","attachments","metadata","controller","AbortController","seq","userMsgId","Date","now","assistantMsgId","optimisticUserMsg","id","streamingAssistantMsg","streamStatus","streamingText","accumulated","revealedLen","streamDone","carry","lastFrameTime","receivedContent","errored","settle","finalAssistantMsg","prev","frame","elapsedMs","step","Math","floor","min","slice","requestAnimationFrame","startRaf","onChunk","token","onDone","err","signal","ok","producedContent","aborted","pending","fetchNext"],"sources":["../../../../src/hooks/useTextChat/useTextChatStream.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport type { ChatMessage, ChatMessageAttachment } from '../../types';\nimport { useSdkConsumer } from '../../sdk-consumer';\nimport { streamChatMessage } from './streamChatMessage';\n\nexport type {\n StreamCallbacks,\n StreamChatMessageParams,\n} from './streamChatMessage';\n\n/**\n * A platform `ChatMessage` augmented with streaming metadata. The host renderer\n * uses `streamStatus`/`streamingText` to drive its typewriter; confirmed\n * (non-streamed) messages carry neither.\n */\nexport type StreamingChatMessage = ChatMessage & {\n streamingText?: string;\n streamStatus?: 'streaming' | 'settled';\n};\n\nexport interface UseTextChatStreamOptions {\n limit?: number;\n // Extra headers forwarded on every stream request — e.g. an `x-xsrf-token`\n // for the CSRF-protected persona-chat gateway.\n headers?: Record<string, string>;\n // Stream failures surfaced to the host (e.g. report to Sentry + toast).\n onError?: (err: Error) => void;\n // Milliseconds per character for the requestAnimationFrame reveal drip.\n // Default 16 (~62 chars/s).\n revealMsPerChar?: number;\n}\n\nexport interface SendStreamMessageParams {\n message: string;\n chatConfig?: object;\n attachments?: ChatMessageAttachment[];\n metadata?: object;\n}\n\n/**\n * Per-send outcome resolved by `send`. Reported at the transport level,\n * independent of the rAF reveal state — so a consumer can implement a\n * race-free, reveal-independent safe fallback.\n */\nexport type StreamSendResult = {\n ok: boolean; // stream completed successfully (reached onDone)\n producedContent: boolean; // at least one content chunk was received\n aborted: boolean; // the send was superseded/cancelled — not a real failure\n};\n\nconst messageKey = (m: StreamingChatMessage) =>\n `${m.role}::${(m.content ?? '').trim()}`;\n\n/**\n * Streaming counterpart to `useTextChat`. Sends a message over the SSE transport\n * and drips the accumulated reply into `streamingText` at a steady, time-paced\n * rate via requestAnimationFrame.\n *\n * Uses the same React Query key as `useTextChat` so mounting both hooks\n * does not double-fetch the message history.\n *\n * NOTE: uses `credentials: 'include'` + XSRF cookie auth — intended for\n * Wix-internal consumers where the persona-chat gateway is same-origin.\n */\nexport function useTextChatStream(options: UseTextChatStreamOptions = {}) {\n const { limit = 50, headers, onError, revealMsPerChar = 16 } = options;\n\n const { chatId, namespace, personaChatService } = useSdkConsumer();\n\n // Same query key as useTextChat — dedupes the history fetch when both are mounted.\n const {\n data: sdkMessages = [],\n status,\n fetchNextPage,\n refetch,\n } = useInfiniteQuery({\n queryKey: ['chat-messages', chatId, namespace],\n queryFn: async ({ pageParam }: { pageParam?: string }) => {\n if (!personaChatService) {\n return { messages: [], nextCursor: undefined };\n }\n return personaChatService.queryChatMessages({\n chatId,\n namespace,\n limit,\n cursor: pageParam,\n });\n },\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n initialPageParam: undefined as string | undefined,\n select: (data) =>\n data.pages.flatMap((page) => page.messages as ChatMessage[]),\n });\n\n const [streamingMessages, setStreamingMessages] = useState<\n StreamingChatMessage[]\n >([]);\n const [completedMessages, setCompletedMessages] = useState<\n StreamingChatMessage[]\n >([]);\n const abortRef = useRef<AbortController | null>(null);\n const rafRef = useRef<number | null>(null);\n const lastConfirmedRef = useRef<StreamingChatMessage[]>([]);\n const sendSeqRef = useRef(0);\n\n const stopRaf = useCallback(() => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n }, []);\n\n useEffect(() => {\n return () => {\n abortRef.current?.abort();\n stopRaf();\n };\n }, [stopRaf]);\n\n const messages = useMemo<StreamingChatMessage[]>(() => {\n const converted = [...sdkMessages].reverse() as StreamingChatMessage[];\n const confirmedMessages =\n converted.length > 0 ? converted : lastConfirmedRef.current;\n\n const completedKeys = new Set(completedMessages.map(messageKey));\n const confirmedShown = confirmedMessages.filter(\n (m) => !completedKeys.has(messageKey(m)),\n );\n const chronological = [\n ...confirmedShown,\n ...completedMessages,\n ...streamingMessages,\n ];\n return chronological.reverse();\n }, [sdkMessages, streamingMessages, completedMessages]);\n\n useEffect(() => {\n const converted = [...sdkMessages].reverse() as StreamingChatMessage[];\n if (converted.length > 0) {\n lastConfirmedRef.current = converted;\n }\n }, [sdkMessages]);\n\n const send = useCallback(\n async ({\n message,\n chatConfig,\n attachments,\n metadata,\n }: SendStreamMessageParams): Promise<StreamSendResult> => {\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n\n const seq = (sendSeqRef.current += 1);\n const userMsgId = `stream-user-${Date.now()}-${seq}`;\n const assistantMsgId = `stream-assistant-${Date.now()}-${seq}`;\n\n const optimisticUserMsg: StreamingChatMessage = {\n id: userMsgId,\n role: 'USER' as ChatMessage['role'],\n content: message,\n attachments: attachments as StreamingChatMessage['attachments'],\n };\n\n const streamingAssistantMsg: StreamingChatMessage = {\n id: assistantMsgId,\n role: 'ASSISTANT' as ChatMessage['role'],\n content: '',\n streamStatus: 'streaming',\n streamingText: '',\n };\n\n setStreamingMessages([optimisticUserMsg, streamingAssistantMsg]);\n\n let accumulated = '';\n let revealedLen = 0;\n let streamDone = false;\n let carry = 0;\n let lastFrameTime = 0;\n let receivedContent = false;\n let errored = false;\n\n const settle = () => {\n stopRaf();\n const finalAssistantMsg: StreamingChatMessage = {\n ...streamingAssistantMsg,\n content: accumulated,\n streamStatus: 'settled',\n streamingText: accumulated,\n };\n setCompletedMessages((prev) => [\n ...prev,\n optimisticUserMsg,\n finalAssistantMsg,\n ]);\n setStreamingMessages([]);\n void refetch();\n };\n\n const frame = (now: number) => {\n if (lastFrameTime === 0) {\n lastFrameTime = now;\n }\n const elapsedMs = now - lastFrameTime;\n lastFrameTime = now;\n\n if (revealedLen < accumulated.length) {\n carry += elapsedMs / revealMsPerChar;\n const step = Math.floor(carry);\n if (step > 0) {\n carry -= step;\n revealedLen = Math.min(accumulated.length, revealedLen + step);\n setStreamingMessages([\n optimisticUserMsg,\n {\n ...streamingAssistantMsg,\n streamStatus: 'streaming',\n streamingText: accumulated.slice(0, revealedLen),\n },\n ]);\n }\n rafRef.current = requestAnimationFrame(frame);\n } else if (streamDone) {\n settle();\n } else {\n stopRaf();\n }\n };\n\n const startRaf = () => {\n if (rafRef.current === null) {\n lastFrameTime = 0;\n rafRef.current = requestAnimationFrame(frame);\n }\n };\n\n await streamChatMessage(\n {\n chatId,\n message,\n namespace,\n chatConfig,\n attachments,\n metadata,\n headers,\n },\n {\n onChunk: (token) => {\n receivedContent = true;\n accumulated += token;\n startRaf();\n },\n onDone: () => {\n streamDone = true;\n startRaf();\n },\n onError: (err) => {\n errored = true;\n stopRaf();\n onError?.(err);\n setStreamingMessages([]);\n },\n },\n controller.signal,\n );\n\n return {\n ok: streamDone && !errored,\n producedContent: receivedContent,\n aborted: !streamDone && !errored,\n };\n },\n [chatId, namespace, headers, onError, refetch, revealMsPerChar, stopRaf],\n );\n\n return {\n status,\n pending: [] as never[],\n messages,\n fetchNext,\n refetch,\n send,\n };\n\n function fetchNext() {\n void fetchNextPage();\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useEffect","useMemo","useRef","useState","useInfiniteQuery","useSdkConsumer","streamChatMessage","messageKey","m","role","content","trim","useTextChatStream","options","_options","_options$limit","limit","headers","onError","_options$revealMsPerC","revealMsPerChar","_useSdkConsumer","chatId","namespace","personaChatService","_useInfiniteQuery","queryKey","queryFn","_ref","pageParam","messages","nextCursor","undefined","queryChatMessages","cursor","getNextPageParam","lastPage","initialPageParam","select","data","pages","flatMap","page","_useInfiniteQuery$dat","sdkMessages","status","fetchNextPage","refetch","_useState","streamingMessages","setStreamingMessages","_useState2","completedMessages","setCompletedMessages","abortRef","rafRef","lastConfirmedRef","sendSeqRef","stopRaf","current","cancelAnimationFrame","_abortRef$current","abort","converted","reverse","confirmedMessages","length","completedKeys","Set","map","confirmedShown","filter","has","chronological","send","_ref2","_abortRef$current2","message","chatConfig","attachments","metadata","controller","AbortController","seq","userMsgId","Date","now","assistantMsgId","optimisticUserMsg","id","streamingAssistantMsg","streamStatus","streamingText","accumulated","revealedLen","streamDone","carry","lastFrameTime","receivedContent","errored","canSendChatMessage","settle","finalAssistantMsg","prev","frame","elapsedMs","step","Math","floor","min","slice","requestAnimationFrame","startRaf","onChunk","token","onDone","err","onCanSendChatMessage","canSend","signal","ok","producedContent","aborted","pending","fetchNext"],"sources":["../../../../src/hooks/useTextChat/useTextChatStream.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport type { ChatMessage, ChatMessageAttachment } from '../../types';\nimport { useSdkConsumer } from '../../sdk-consumer';\nimport { streamChatMessage } from './streamChatMessage';\n\nexport type {\n StreamCallbacks,\n StreamChatMessageParams,\n} from './streamChatMessage';\n\n/**\n * A platform `ChatMessage` augmented with streaming metadata. The host renderer\n * uses `streamStatus`/`streamingText` to drive its typewriter; confirmed\n * (non-streamed) messages carry neither.\n */\nexport type StreamingChatMessage = ChatMessage & {\n streamingText?: string;\n streamStatus?: 'streaming' | 'settled';\n};\n\nexport interface UseTextChatStreamOptions {\n limit?: number;\n // Extra headers forwarded on every stream request — e.g. an `x-xsrf-token`\n // for the CSRF-protected persona-chat gateway.\n headers?: Record<string, string>;\n // Stream failures surfaced to the host (e.g. report to Sentry + toast).\n onError?: (err: Error) => void;\n // Milliseconds per character for the requestAnimationFrame reveal drip.\n // Default 16 (~62 chars/s).\n revealMsPerChar?: number;\n}\n\nexport interface SendStreamMessageParams {\n message: string;\n chatConfig?: object;\n attachments?: ChatMessageAttachment[];\n metadata?: object;\n}\n\n/**\n * Per-send outcome resolved by `send`. Reported at the transport level,\n * independent of the rAF reveal state — so a consumer can implement a\n * race-free, reveal-independent safe fallback.\n */\nexport type StreamSendResult = {\n ok: boolean; // stream completed successfully (reached onDone)\n producedContent: boolean; // at least one content chunk was received\n aborted: boolean; // the send was superseded/cancelled — not a real failure\n canSendChatMessage?: boolean; // set only when a frame reported it\n};\n\nconst messageKey = (m: StreamingChatMessage) =>\n `${m.role}::${(m.content ?? '').trim()}`;\n\n/**\n * Streaming counterpart to `useTextChat`. Sends a message over the SSE transport\n * and drips the accumulated reply into `streamingText` at a steady, time-paced\n * rate via requestAnimationFrame.\n *\n * Uses the same React Query key as `useTextChat` so mounting both hooks\n * does not double-fetch the message history.\n *\n * NOTE: uses `credentials: 'include'` + XSRF cookie auth — intended for\n * Wix-internal consumers where the persona-chat gateway is same-origin.\n */\nexport function useTextChatStream(options: UseTextChatStreamOptions = {}) {\n const { limit = 50, headers, onError, revealMsPerChar = 16 } = options;\n\n const { chatId, namespace, personaChatService } = useSdkConsumer();\n\n // Same query key as useTextChat — dedupes the history fetch when both are mounted.\n const {\n data: sdkMessages = [],\n status,\n fetchNextPage,\n refetch,\n } = useInfiniteQuery({\n queryKey: ['chat-messages', chatId, namespace],\n queryFn: async ({ pageParam }: { pageParam?: string }) => {\n if (!personaChatService) {\n return { messages: [], nextCursor: undefined };\n }\n return personaChatService.queryChatMessages({\n chatId,\n namespace,\n limit,\n cursor: pageParam,\n });\n },\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n initialPageParam: undefined as string | undefined,\n select: (data) =>\n data.pages.flatMap((page) => page.messages as ChatMessage[]),\n });\n\n const [streamingMessages, setStreamingMessages] = useState<\n StreamingChatMessage[]\n >([]);\n const [completedMessages, setCompletedMessages] = useState<\n StreamingChatMessage[]\n >([]);\n const abortRef = useRef<AbortController | null>(null);\n const rafRef = useRef<number | null>(null);\n const lastConfirmedRef = useRef<StreamingChatMessage[]>([]);\n const sendSeqRef = useRef(0);\n\n const stopRaf = useCallback(() => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n }, []);\n\n useEffect(() => {\n return () => {\n abortRef.current?.abort();\n stopRaf();\n };\n }, [stopRaf]);\n\n const messages = useMemo<StreamingChatMessage[]>(() => {\n const converted = [...sdkMessages].reverse() as StreamingChatMessage[];\n const confirmedMessages =\n converted.length > 0 ? converted : lastConfirmedRef.current;\n\n const completedKeys = new Set(completedMessages.map(messageKey));\n const confirmedShown = confirmedMessages.filter(\n (m) => !completedKeys.has(messageKey(m)),\n );\n const chronological = [\n ...confirmedShown,\n ...completedMessages,\n ...streamingMessages,\n ];\n return chronological.reverse();\n }, [sdkMessages, streamingMessages, completedMessages]);\n\n useEffect(() => {\n const converted = [...sdkMessages].reverse() as StreamingChatMessage[];\n if (converted.length > 0) {\n lastConfirmedRef.current = converted;\n }\n }, [sdkMessages]);\n\n const send = useCallback(\n async ({\n message,\n chatConfig,\n attachments,\n metadata,\n }: SendStreamMessageParams): Promise<StreamSendResult> => {\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n\n const seq = (sendSeqRef.current += 1);\n const userMsgId = `stream-user-${Date.now()}-${seq}`;\n const assistantMsgId = `stream-assistant-${Date.now()}-${seq}`;\n\n const optimisticUserMsg: StreamingChatMessage = {\n id: userMsgId,\n role: 'USER' as ChatMessage['role'],\n content: message,\n attachments: attachments as StreamingChatMessage['attachments'],\n };\n\n const streamingAssistantMsg: StreamingChatMessage = {\n id: assistantMsgId,\n role: 'ASSISTANT' as ChatMessage['role'],\n content: '',\n streamStatus: 'streaming',\n streamingText: '',\n };\n\n setStreamingMessages([optimisticUserMsg, streamingAssistantMsg]);\n\n let accumulated = '';\n let revealedLen = 0;\n let streamDone = false;\n let carry = 0;\n let lastFrameTime = 0;\n let receivedContent = false;\n let errored = false;\n let canSendChatMessage: boolean | undefined;\n\n const settle = () => {\n stopRaf();\n const finalAssistantMsg: StreamingChatMessage = {\n ...streamingAssistantMsg,\n content: accumulated,\n streamStatus: 'settled',\n streamingText: accumulated,\n };\n setCompletedMessages((prev) => [\n ...prev,\n optimisticUserMsg,\n finalAssistantMsg,\n ]);\n setStreamingMessages([]);\n void refetch();\n };\n\n const frame = (now: number) => {\n if (lastFrameTime === 0) {\n lastFrameTime = now;\n }\n const elapsedMs = now - lastFrameTime;\n lastFrameTime = now;\n\n if (revealedLen < accumulated.length) {\n carry += elapsedMs / revealMsPerChar;\n const step = Math.floor(carry);\n if (step > 0) {\n carry -= step;\n revealedLen = Math.min(accumulated.length, revealedLen + step);\n setStreamingMessages([\n optimisticUserMsg,\n {\n ...streamingAssistantMsg,\n streamStatus: 'streaming',\n streamingText: accumulated.slice(0, revealedLen),\n },\n ]);\n }\n rafRef.current = requestAnimationFrame(frame);\n } else if (streamDone) {\n settle();\n } else {\n stopRaf();\n }\n };\n\n const startRaf = () => {\n if (rafRef.current === null) {\n lastFrameTime = 0;\n rafRef.current = requestAnimationFrame(frame);\n }\n };\n\n await streamChatMessage(\n {\n chatId,\n message,\n namespace,\n chatConfig,\n attachments,\n metadata,\n headers,\n },\n {\n onChunk: (token) => {\n receivedContent = true;\n accumulated += token;\n startRaf();\n },\n onDone: () => {\n streamDone = true;\n startRaf();\n },\n onError: (err) => {\n errored = true;\n stopRaf();\n onError?.(err);\n setStreamingMessages([]);\n },\n onCanSendChatMessage: (canSend) => (canSendChatMessage = canSend),\n },\n controller.signal,\n );\n\n return {\n ok: streamDone && !errored,\n producedContent: receivedContent,\n aborted: !streamDone && !errored,\n canSendChatMessage,\n };\n },\n [chatId, namespace, headers, onError, refetch, revealMsPerChar, stopRaf],\n );\n\n return {\n status,\n pending: [] as never[],\n messages,\n fetchNext,\n refetch,\n send,\n };\n\n function fetchNext() {\n void fetchNextPage();\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["useTools","ToolExecutionInProgressError"],"sources":["../../../../src/hooks/useTools/index.ts"],"sourcesContent":["export { useTools } from './public/useTools';\nexport { ToolExecutionInProgressError } from './model/errors';\nexport type {\n ToolArguments,\n ToolCallResult,\n ToolCallSnapshot,\n ToolCallStatus,\n ToolsRegistry,\n} from './model/types';\n"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,mBAAmB;AAC5C,SAASC,4BAA4B,QAAQ,gBAAgB","ignoreList":[]}
1
+ {"version":3,"names":["useTools","ToolExecutionInProgressError"],"sources":["../../../../src/hooks/useTools/index.ts"],"sourcesContent":["export { useTools } from './public/useTools';\nexport { ToolExecutionInProgressError } from './model/errors';\nexport type {\n ToolArguments,\n ToolCallResult,\n ToolCallSnapshot,\n ToolCallStatus,\n ToolDefinition,\n ToolsRegistry,\n} from './model/types';\n"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,mBAAmB;AAC5C,SAASC,4BAA4B,QAAQ,gBAAgB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["../../../../../src/hooks/useTools/model/types.ts"],"sourcesContent":["import type { FunctionCall } from '../../../types/service';\n\nexport type ToolArguments = Record<string, unknown> | null;\n\nexport type ToolHandler = (\n arguments_?: ToolArguments,\n) => unknown | Promise<unknown>;\n\nexport type ToolsRegistry = Record<string, ToolHandler>;\n\nexport type ToolCallStatus = 'pending' | 'running' | 'completed';\n\nexport type ToolCallRequest = {\n id: string;\n name: string;\n arguments?: ToolArguments;\n};\n\nexport type ToolCallResult = {\n id: string;\n name: string;\n success: boolean;\n content: string;\n};\n\nexport type ToolCallSnapshot = {\n id: string;\n name: string;\n arguments: ToolArguments;\n status: ToolCallStatus;\n result: ToolCallResult | null;\n};\n\nexport type ToolCallSourceResponse = {\n functionCalls?: readonly FunctionCall[] | null;\n};\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["../../../../../src/hooks/useTools/model/types.ts"],"sourcesContent":["import type { FunctionCall } from '../../../types/service';\n\nexport type ToolArguments = Record<string, unknown> | null;\n\nexport type ToolHandler = (\n arguments_?: ToolArguments,\n) => unknown | Promise<unknown>;\n\nexport type ToolDefinition = {\n description?: string;\n parameters?: Record<string, unknown>;\n handler: ToolHandler;\n};\n\nexport type ToolsRegistry = Record<string, ToolHandler | ToolDefinition>;\n\nexport type ToolCallStatus = 'pending' | 'running' | 'completed';\n\nexport type ToolCallRequest = {\n id: string;\n name: string;\n arguments?: ToolArguments;\n};\n\nexport type ToolCallResult = {\n id: string;\n name: string;\n success: boolean;\n content: string;\n};\n\nexport type ToolCallSnapshot = {\n id: string;\n name: string;\n arguments: ToolArguments;\n status: ToolCallStatus;\n result: ToolCallResult | null;\n};\n\nexport type ToolCallSourceResponse = {\n functionCalls?: readonly FunctionCall[] | null;\n};\n"],"mappings":"","ignoreList":[]}
@@ -1,6 +1,7 @@
1
1
  import { extractToolErrorMessage, serializeToolContent } from '../utils/serialize';
2
2
  export async function executeToolCall(call, registry) {
3
- const handler = registry[call.name];
3
+ const entry = registry[call.name];
4
+ const handler = typeof entry === 'function' ? entry : entry == null ? void 0 : entry.handler;
4
5
  if (!handler) {
5
6
  return {
6
7
  id: call.id,
@@ -1 +1 @@
1
- {"version":3,"names":["extractToolErrorMessage","serializeToolContent","executeToolCall","call","registry","handler","name","id","success","content","output","arguments","error"],"sources":["../../../../../src/hooks/useTools/runtime/executeToolCall.ts"],"sourcesContent":["import type {\n ToolCallRequest,\n ToolCallResult,\n ToolsRegistry,\n} from '../model/types';\nimport {\n extractToolErrorMessage,\n serializeToolContent,\n} from '../utils/serialize';\n\nexport async function executeToolCall(\n call: ToolCallRequest,\n registry: ToolsRegistry,\n): Promise<ToolCallResult> {\n const handler = registry[call.name];\n\n if (!handler) {\n return {\n id: call.id,\n name: call.name,\n success: false,\n content: `Tool \"${call.name}\" is not registered.`,\n };\n }\n\n try {\n const output = await handler(call.arguments ?? null);\n\n return {\n id: call.id,\n name: call.name,\n success: true,\n content: serializeToolContent(output),\n };\n } catch (error) {\n return {\n id: call.id,\n name: call.name,\n success: false,\n content: extractToolErrorMessage(error),\n };\n }\n}\n"],"mappings":"AAKA,SACEA,uBAAuB,EACvBC,oBAAoB,QACf,oBAAoB;AAE3B,OAAO,eAAeC,eAAeA,CACnCC,IAAqB,EACrBC,QAAuB,EACE;EACzB,MAAMC,OAAO,GAAGD,QAAQ,CAACD,IAAI,CAACG,IAAI,CAAC;EAEnC,IAAI,CAACD,OAAO,EAAE;IACZ,OAAO;MACLE,EAAE,EAAEJ,IAAI,CAACI,EAAE;MACXD,IAAI,EAAEH,IAAI,CAACG,IAAI;MACfE,OAAO,EAAE,KAAK;MACdC,OAAO,EAAE,SAASN,IAAI,CAACG,IAAI;IAC7B,CAAC;EACH;EAEA,IAAI;IACF,MAAMI,MAAM,GAAG,MAAML,OAAO,CAACF,IAAI,CAACQ,SAAS,IAAI,IAAI,CAAC;IAEpD,OAAO;MACLJ,EAAE,EAAEJ,IAAI,CAACI,EAAE;MACXD,IAAI,EAAEH,IAAI,CAACG,IAAI;MACfE,OAAO,EAAE,IAAI;MACbC,OAAO,EAAER,oBAAoB,CAACS,MAAM;IACtC,CAAC;EACH,CAAC,CAAC,OAAOE,KAAK,EAAE;IACd,OAAO;MACLL,EAAE,EAAEJ,IAAI,CAACI,EAAE;MACXD,IAAI,EAAEH,IAAI,CAACG,IAAI;MACfE,OAAO,EAAE,KAAK;MACdC,OAAO,EAAET,uBAAuB,CAACY,KAAK;IACxC,CAAC;EACH;AACF","ignoreList":[]}
1
+ {"version":3,"names":["extractToolErrorMessage","serializeToolContent","executeToolCall","call","registry","entry","name","handler","id","success","content","output","arguments","error"],"sources":["../../../../../src/hooks/useTools/runtime/executeToolCall.ts"],"sourcesContent":["import type {\n ToolCallRequest,\n ToolCallResult,\n ToolsRegistry,\n} from '../model/types';\nimport {\n extractToolErrorMessage,\n serializeToolContent,\n} from '../utils/serialize';\n\nexport async function executeToolCall(\n call: ToolCallRequest,\n registry: ToolsRegistry,\n): Promise<ToolCallResult> {\n const entry = registry[call.name];\n const handler = typeof entry === 'function' ? entry : entry?.handler;\n\n if (!handler) {\n return {\n id: call.id,\n name: call.name,\n success: false,\n content: `Tool \"${call.name}\" is not registered.`,\n };\n }\n\n try {\n const output = await handler(call.arguments ?? null);\n\n return {\n id: call.id,\n name: call.name,\n success: true,\n content: serializeToolContent(output),\n };\n } catch (error) {\n return {\n id: call.id,\n name: call.name,\n success: false,\n content: extractToolErrorMessage(error),\n };\n }\n}\n"],"mappings":"AAKA,SACEA,uBAAuB,EACvBC,oBAAoB,QACf,oBAAoB;AAE3B,OAAO,eAAeC,eAAeA,CACnCC,IAAqB,EACrBC,QAAuB,EACE;EACzB,MAAMC,KAAK,GAAGD,QAAQ,CAACD,IAAI,CAACG,IAAI,CAAC;EACjC,MAAMC,OAAO,GAAG,OAAOF,KAAK,KAAK,UAAU,GAAGA,KAAK,GAAGA,KAAK,oBAALA,KAAK,CAAEE,OAAO;EAEpE,IAAI,CAACA,OAAO,EAAE;IACZ,OAAO;MACLC,EAAE,EAAEL,IAAI,CAACK,EAAE;MACXF,IAAI,EAAEH,IAAI,CAACG,IAAI;MACfG,OAAO,EAAE,KAAK;MACdC,OAAO,EAAE,SAASP,IAAI,CAACG,IAAI;IAC7B,CAAC;EACH;EAEA,IAAI;IACF,MAAMK,MAAM,GAAG,MAAMJ,OAAO,CAACJ,IAAI,CAACS,SAAS,IAAI,IAAI,CAAC;IAEpD,OAAO;MACLJ,EAAE,EAAEL,IAAI,CAACK,EAAE;MACXF,IAAI,EAAEH,IAAI,CAACG,IAAI;MACfG,OAAO,EAAE,IAAI;MACbC,OAAO,EAAET,oBAAoB,CAACU,MAAM;IACtC,CAAC;EACH,CAAC,CAAC,OAAOE,KAAK,EAAE;IACd,OAAO;MACLL,EAAE,EAAEL,IAAI,CAACK,EAAE;MACXF,IAAI,EAAEH,IAAI,CAACG,IAAI;MACfG,OAAO,EAAE,KAAK;MACdC,OAAO,EAAEV,uBAAuB,CAACa,KAAK;IACxC,CAAC;EACH;AACF","ignoreList":[]}
@@ -3,6 +3,7 @@ import { useSetAtom } from 'jotai';
3
3
  import { appendToolCallsAtom, markToolCallCompletedAtom, markToolCallRunningAtom } from '../store/state';
4
4
  import { useSdkConsumer } from '../../../sdk-consumer';
5
5
  import { createToolRuntimeSession } from './createToolRuntimeSession';
6
+ import { executeToolCallBatch } from './executeToolCallBatch';
6
7
  export function useToolCallingRuntime() {
7
8
  const _useSdkConsumer = useSdkConsumer(),
8
9
  _useSdkConsumer$tools = _useSdkConsumer.tools,
@@ -49,10 +50,18 @@ export function useToolCallingRuntime() {
49
50
  observer
50
51
  });
51
52
  }
53
+ function executeToolCalls(functionCalls) {
54
+ return executeToolCallBatch({
55
+ functionCalls,
56
+ registry,
57
+ observer
58
+ });
59
+ }
52
60
  return {
53
61
  isRunning,
54
62
  resolveResponseToolCalls,
55
- resolveIncomingToolCalls
63
+ resolveIncomingToolCalls,
64
+ executeToolCalls
56
65
  };
57
66
  }
58
67
  //# sourceMappingURL=useToolCallingRuntime.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useState","useSetAtom","appendToolCallsAtom","markToolCallCompletedAtom","markToolCallRunningAtom","useSdkConsumer","createToolRuntimeSession","useToolCallingRuntime","_useSdkConsumer","_useSdkConsumer$tools","tools","registry","appendCalls","markRunning","markCompleted","_useState","isRunning","setIsRunning","observer","onBatchDiscovered","calls","onCallStarted","callId","onCallCompleted","result","id","_useState2","onRunningChange","nextIsRunning","session","resolveResponseToolCalls","initialResponse","continueWithResults","resolveIncomingToolCalls","envelope","adapter"],"sources":["../../../../../src/hooks/useTools/runtime/useToolCallingRuntime.ts"],"sourcesContent":["import type { FunctionCallResult } from '../../../types';\nimport { useState } from 'react';\nimport { useSetAtom } from 'jotai';\n\nimport type { ToolCallSourceResponse } from '../model/types';\nimport {\n appendToolCallsAtom,\n markToolCallCompletedAtom,\n markToolCallRunningAtom,\n} from '../store/state';\nimport { useSdkConsumer } from '../../../sdk-consumer';\nimport { createToolRuntimeSession } from './createToolRuntimeSession';\nimport type {\n ToolCallEnvelope,\n ToolRuntimeAdapter,\n ToolRuntimeObserver,\n ToolRuntimeSession,\n} from './types';\n\nexport function useToolCallingRuntime<\n TResponse extends ToolCallSourceResponse,\n>() {\n const { tools: registry = {} } = useSdkConsumer();\n const appendCalls = useSetAtom(appendToolCallsAtom);\n const markRunning = useSetAtom(markToolCallRunningAtom);\n const markCompleted = useSetAtom(markToolCallCompletedAtom);\n const [isRunning, setIsRunning] = useState(false);\n\n const observer: ToolRuntimeObserver = {\n onBatchDiscovered(calls) {\n appendCalls(calls);\n },\n onCallStarted(callId) {\n markRunning(callId);\n },\n onCallCompleted(callId, result) {\n markCompleted({ id: callId, result });\n },\n };\n\n const [session] = useState<ToolRuntimeSession<TResponse>>(() =>\n createToolRuntimeSession<TResponse>({\n onRunningChange(nextIsRunning) {\n setIsRunning(nextIsRunning);\n },\n }),\n );\n\n function resolveResponseToolCalls(\n initialResponse: TResponse,\n continueWithResults: (results: FunctionCallResult[]) => Promise<TResponse>,\n ) {\n return session.resolveResponseToolCalls({\n initialResponse,\n continueWithResults,\n registry,\n observer,\n });\n }\n\n function resolveIncomingToolCalls(\n envelope: ToolCallEnvelope,\n adapter: ToolRuntimeAdapter,\n ) {\n return session.resolveIncomingToolCalls({\n envelope,\n adapter,\n registry,\n observer,\n });\n }\n\n return {\n isRunning,\n resolveResponseToolCalls,\n resolveIncomingToolCalls,\n };\n}\n"],"mappings":"AACA,SAASA,QAAQ,QAAQ,OAAO;AAChC,SAASC,UAAU,QAAQ,OAAO;AAGlC,SACEC,mBAAmB,EACnBC,yBAAyB,EACzBC,uBAAuB,QAClB,gBAAgB;AACvB,SAASC,cAAc,QAAQ,uBAAuB;AACtD,SAASC,wBAAwB,QAAQ,4BAA4B;AAQrE,OAAO,SAASC,qBAAqBA,CAAA,EAEjC;EACF,MAAAC,eAAA,GAAiCH,cAAc,CAAC,CAAC;IAAAI,qBAAA,GAAAD,eAAA,CAAzCE,KAAK;IAAEC,QAAQ,GAAAF,qBAAA,cAAG,CAAC,CAAC,GAAAA,qBAAA;EAC5B,MAAMG,WAAW,GAAGX,UAAU,CAACC,mBAAmB,CAAC;EACnD,MAAMW,WAAW,GAAGZ,UAAU,CAACG,uBAAuB,CAAC;EACvD,MAAMU,aAAa,GAAGb,UAAU,CAACE,yBAAyB,CAAC;EAC3D,MAAAY,SAAA,GAAkCf,QAAQ,CAAC,KAAK,CAAC;IAA1CgB,SAAS,GAAAD,SAAA;IAAEE,YAAY,GAAAF,SAAA;EAE9B,MAAMG,QAA6B,GAAG;IACpCC,iBAAiBA,CAACC,KAAK,EAAE;MACvBR,WAAW,CAACQ,KAAK,CAAC;IACpB,CAAC;IACDC,aAAaA,CAACC,MAAM,EAAE;MACpBT,WAAW,CAACS,MAAM,CAAC;IACrB,CAAC;IACDC,eAAeA,CAACD,MAAM,EAAEE,MAAM,EAAE;MAC9BV,aAAa,CAAC;QAAEW,EAAE,EAAEH,MAAM;QAAEE;MAAO,CAAC,CAAC;IACvC;EACF,CAAC;EAED,MAAAE,UAAA,GAAkB1B,QAAQ,CAAgC,MACxDM,wBAAwB,CAAY;MAClCqB,eAAeA,CAACC,aAAa,EAAE;QAC7BX,YAAY,CAACW,aAAa,CAAC;MAC7B;IACF,CAAC,CACH,CAAC;IANMC,OAAO,GAAAH,UAAA;EAQd,SAASI,wBAAwBA,CAC/BC,eAA0B,EAC1BC,mBAA0E,EAC1E;IACA,OAAOH,OAAO,CAACC,wBAAwB,CAAC;MACtCC,eAAe;MACfC,mBAAmB;MACnBrB,QAAQ;MACRO;IACF,CAAC,CAAC;EACJ;EAEA,SAASe,wBAAwBA,CAC/BC,QAA0B,EAC1BC,OAA2B,EAC3B;IACA,OAAON,OAAO,CAACI,wBAAwB,CAAC;MACtCC,QAAQ;MACRC,OAAO;MACPxB,QAAQ;MACRO;IACF,CAAC,CAAC;EACJ;EAEA,OAAO;IACLF,SAAS;IACTc,wBAAwB;IACxBG;EACF,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"names":["useState","useSetAtom","appendToolCallsAtom","markToolCallCompletedAtom","markToolCallRunningAtom","useSdkConsumer","createToolRuntimeSession","executeToolCallBatch","useToolCallingRuntime","_useSdkConsumer","_useSdkConsumer$tools","tools","registry","appendCalls","markRunning","markCompleted","_useState","isRunning","setIsRunning","observer","onBatchDiscovered","calls","onCallStarted","callId","onCallCompleted","result","id","_useState2","onRunningChange","nextIsRunning","session","resolveResponseToolCalls","initialResponse","continueWithResults","resolveIncomingToolCalls","envelope","adapter","executeToolCalls","functionCalls"],"sources":["../../../../../src/hooks/useTools/runtime/useToolCallingRuntime.ts"],"sourcesContent":["import type { FunctionCallResult } from '../../../types';\nimport { useState } from 'react';\nimport { useSetAtom } from 'jotai';\n\nimport type { ToolCallSourceResponse } from '../model/types';\nimport {\n appendToolCallsAtom,\n markToolCallCompletedAtom,\n markToolCallRunningAtom,\n} from '../store/state';\nimport { useSdkConsumer } from '../../../sdk-consumer';\nimport { createToolRuntimeSession } from './createToolRuntimeSession';\nimport { executeToolCallBatch } from './executeToolCallBatch';\nimport type {\n ToolCallEnvelope,\n ToolRuntimeAdapter,\n ToolRuntimeObserver,\n ToolRuntimeSession,\n} from './types';\n\nexport function useToolCallingRuntime<\n TResponse extends ToolCallSourceResponse,\n>() {\n const { tools: registry = {} } = useSdkConsumer();\n const appendCalls = useSetAtom(appendToolCallsAtom);\n const markRunning = useSetAtom(markToolCallRunningAtom);\n const markCompleted = useSetAtom(markToolCallCompletedAtom);\n const [isRunning, setIsRunning] = useState(false);\n\n const observer: ToolRuntimeObserver = {\n onBatchDiscovered(calls) {\n appendCalls(calls);\n },\n onCallStarted(callId) {\n markRunning(callId);\n },\n onCallCompleted(callId, result) {\n markCompleted({ id: callId, result });\n },\n };\n\n const [session] = useState<ToolRuntimeSession<TResponse>>(() =>\n createToolRuntimeSession<TResponse>({\n onRunningChange(nextIsRunning) {\n setIsRunning(nextIsRunning);\n },\n }),\n );\n\n function resolveResponseToolCalls(\n initialResponse: TResponse,\n continueWithResults: (results: FunctionCallResult[]) => Promise<TResponse>,\n ) {\n return session.resolveResponseToolCalls({\n initialResponse,\n continueWithResults,\n registry,\n observer,\n });\n }\n\n function resolveIncomingToolCalls(\n envelope: ToolCallEnvelope,\n adapter: ToolRuntimeAdapter,\n ) {\n return session.resolveIncomingToolCalls({\n envelope,\n adapter,\n registry,\n observer,\n });\n }\n\n function executeToolCalls(functionCalls: ToolCallEnvelope['functionCalls']) {\n return executeToolCallBatch({ functionCalls, registry, observer });\n }\n\n return {\n isRunning,\n resolveResponseToolCalls,\n resolveIncomingToolCalls,\n executeToolCalls,\n };\n}\n"],"mappings":"AACA,SAASA,QAAQ,QAAQ,OAAO;AAChC,SAASC,UAAU,QAAQ,OAAO;AAGlC,SACEC,mBAAmB,EACnBC,yBAAyB,EACzBC,uBAAuB,QAClB,gBAAgB;AACvB,SAASC,cAAc,QAAQ,uBAAuB;AACtD,SAASC,wBAAwB,QAAQ,4BAA4B;AACrE,SAASC,oBAAoB,QAAQ,wBAAwB;AAQ7D,OAAO,SAASC,qBAAqBA,CAAA,EAEjC;EACF,MAAAC,eAAA,GAAiCJ,cAAc,CAAC,CAAC;IAAAK,qBAAA,GAAAD,eAAA,CAAzCE,KAAK;IAAEC,QAAQ,GAAAF,qBAAA,cAAG,CAAC,CAAC,GAAAA,qBAAA;EAC5B,MAAMG,WAAW,GAAGZ,UAAU,CAACC,mBAAmB,CAAC;EACnD,MAAMY,WAAW,GAAGb,UAAU,CAACG,uBAAuB,CAAC;EACvD,MAAMW,aAAa,GAAGd,UAAU,CAACE,yBAAyB,CAAC;EAC3D,MAAAa,SAAA,GAAkChB,QAAQ,CAAC,KAAK,CAAC;IAA1CiB,SAAS,GAAAD,SAAA;IAAEE,YAAY,GAAAF,SAAA;EAE9B,MAAMG,QAA6B,GAAG;IACpCC,iBAAiBA,CAACC,KAAK,EAAE;MACvBR,WAAW,CAACQ,KAAK,CAAC;IACpB,CAAC;IACDC,aAAaA,CAACC,MAAM,EAAE;MACpBT,WAAW,CAACS,MAAM,CAAC;IACrB,CAAC;IACDC,eAAeA,CAACD,MAAM,EAAEE,MAAM,EAAE;MAC9BV,aAAa,CAAC;QAAEW,EAAE,EAAEH,MAAM;QAAEE;MAAO,CAAC,CAAC;IACvC;EACF,CAAC;EAED,MAAAE,UAAA,GAAkB3B,QAAQ,CAAgC,MACxDM,wBAAwB,CAAY;MAClCsB,eAAeA,CAACC,aAAa,EAAE;QAC7BX,YAAY,CAACW,aAAa,CAAC;MAC7B;IACF,CAAC,CACH,CAAC;IANMC,OAAO,GAAAH,UAAA;EAQd,SAASI,wBAAwBA,CAC/BC,eAA0B,EAC1BC,mBAA0E,EAC1E;IACA,OAAOH,OAAO,CAACC,wBAAwB,CAAC;MACtCC,eAAe;MACfC,mBAAmB;MACnBrB,QAAQ;MACRO;IACF,CAAC,CAAC;EACJ;EAEA,SAASe,wBAAwBA,CAC/BC,QAA0B,EAC1BC,OAA2B,EAC3B;IACA,OAAON,OAAO,CAACI,wBAAwB,CAAC;MACtCC,QAAQ;MACRC,OAAO;MACPxB,QAAQ;MACRO;IACF,CAAC,CAAC;EACJ;EAEA,SAASkB,gBAAgBA,CAACC,aAAgD,EAAE;IAC1E,OAAO/B,oBAAoB,CAAC;MAAE+B,aAAa;MAAE1B,QAAQ;MAAEO;IAAS,CAAC,CAAC;EACpE;EAEA,OAAO;IACLF,SAAS;IACTc,wBAAwB;IACxBG,wBAAwB;IACxBG;EACF,CAAC;AACH","ignoreList":[]}
@@ -4,4 +4,6 @@ export declare const SPEAKING_STATE_EVENT_MAP: Record<TurnDetectionData['partici
4
4
  export declare const ACOUSTIC_USER_THRESHOLD_RMS = 0.025;
5
5
  export declare const ACOUSTIC_USER_HANGOVER_MS = 400;
6
6
  export declare const ACOUSTIC_AGENT_HANGOVER_MS = 900;
7
+ export declare const GET_TOOLS_RPC_METHOD = "get_tools";
8
+ export declare const EXECUTE_TOOL_RPC_METHOD = "execute_tool";
7
9
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/useConversation/livekit/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAC3C,iBAAiB,CAAC,iBAAiB,CAAC,EACpC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC,CAUtD,CAAC;AAEF,eAAO,MAAM,2BAA2B,QAAQ,CAAC;AACjD,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,0BAA0B,MAAM,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/useConversation/livekit/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAC3C,iBAAiB,CAAC,iBAAiB,CAAC,EACpC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC,CAUtD,CAAC;AAEF,eAAO,MAAM,2BAA2B,QAAQ,CAAC;AACjD,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C,eAAO,MAAM,oBAAoB,cAAc,CAAC;AAChD,eAAO,MAAM,uBAAuB,iBAAiB,CAAC"}
@@ -1,5 +1,3 @@
1
- import type { FunctionCall, FunctionCallResult } from '../../../types/service';
2
- import type { ToolCallEnvelope, ToolRuntimeAdapter } from '../../useTools/runtime/types';
3
1
  export type InactivityWarningData = {
4
2
  type: 'inactivity_warning';
5
3
  grace_period_sec: number;
@@ -7,9 +5,6 @@ export type InactivityWarningData = {
7
5
  export type InactivityTimeoutData = {
8
6
  type: 'inactivity_timeout';
9
7
  };
10
- export type ToolRuntimeLike = {
11
- handleIncoming(envelope: ToolCallEnvelope, adapter: ToolRuntimeAdapter): Promise<void>;
12
- };
13
8
  export type TurnDetectionData = {
14
9
  createdAt: number;
15
10
  participantIdentity: string;
@@ -22,14 +17,9 @@ export type TurnDetectionData = {
22
17
  participantKind: 'STANDARD' | 'AGENT';
23
18
  speechId?: string;
24
19
  };
25
- export type ToolCallsData = {
26
- type: 'tool_calls';
27
- requestId: string;
28
- functionCalls: FunctionCall[];
29
- };
30
- export type ToolResultsData = {
31
- type: 'tool_results';
32
- requestId: string;
33
- functionCallResults: FunctionCallResult[];
20
+ export type ClientToolDefinition = {
21
+ name: string;
22
+ description: string;
23
+ parameters: Record<string, unknown>;
34
24
  };
35
25
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/useConversation/livekit/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,oBAAoB,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,cAAc,CACZ,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,GAAG,UAAU,CAAC;IAChC,qBAAqB,EAAE,uBAAuB,GAAG,YAAY,CAAC;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,UAAU,GAAG,OAAO,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,YAAY,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;CAC3C,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/useConversation/livekit/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,oBAAoB,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,GAAG,UAAU,CAAC;IAChC,qBAAqB,EAAE,uBAAuB,GAAG,YAAY,CAAC;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,UAAU,GAAG,OAAO,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useConversation.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/useConversation/livekit/useConversation.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EAEvB,MAAM,UAAU,CAAC;AAsClB,wBAAgB,eAAe,CAAC,EAC9B,QAAe,EACf,IAAI,EACJ,MAAM,EACN,mBAA2B,EAC3B,eAAuB,EACvB,iBAAiB,EACjB,qBAAqB,GACtB,EAAE,sBAAsB,GAAG,qBAAqB,CAugBhD"}
1
+ {"version":3,"file":"useConversation.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/useConversation/livekit/useConversation.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EAEvB,MAAM,UAAU,CAAC;AA0ClB,wBAAgB,eAAe,CAAC,EAC9B,QAAe,EACf,IAAI,EACJ,MAAM,EACN,mBAA2B,EAC3B,eAAuB,EACvB,iBAAiB,EACjB,qBAAqB,GACtB,EAAE,sBAAsB,GAAG,qBAAqB,CA+hBhD"}
@@ -1,7 +1,6 @@
1
- import type { InactivityWarningData, InactivityTimeoutData, ToolCallsData, TurnDetectionData } from '../types';
1
+ import type { InactivityWarningData, InactivityTimeoutData, TurnDetectionData } from '../types';
2
2
  export declare function decodeDataPayload(data: Uint8Array): unknown;
3
3
  export declare function checkIsTurnDetectionData(data: unknown): data is TurnDetectionData;
4
4
  export declare function checkIsInactivityWarningData(data: unknown): data is InactivityWarningData;
5
5
  export declare function checkIsInactivityTimeoutData(data: unknown): data is InactivityTimeoutData;
6
- export declare function checkIsToolCallsData(data: unknown): data is ToolCallsData;
7
6
  //# sourceMappingURL=dataChannel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dataChannel.d.ts","sourceRoot":"","sources":["../../../../../../src/hooks/useConversation/livekit/utils/dataChannel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAElB,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAO3D;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,iBAAiB,CAO3B;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,qBAAqB,CAS/B;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,qBAAqB,CAO/B;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,aAAa,CAWzE"}
1
+ {"version":3,"file":"dataChannel.d.ts","sourceRoot":"","sources":["../../../../../../src/hooks/useConversation/livekit/utils/dataChannel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAElB,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAO3D;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,iBAAiB,CAO3B;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,qBAAqB,CAS/B;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,qBAAqB,CAO/B"}
@@ -1,7 +1,8 @@
1
1
  export * from './dataChannel';
2
2
  export * from './messaging';
3
3
  export * from './participants';
4
+ export * from './rpc';
4
5
  export * from './serialization';
5
- export * from './toolAdapter';
6
+ export * from './toolDefinitions';
6
7
  export * from './transcriptions';
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/hooks/useConversation/livekit/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/hooks/useConversation/livekit/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,OAAO,CAAC;AACtB,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FunctionCall } from '../../../../types/service';
2
+ export declare function parseFunctionCallPayload(payload: string): FunctionCall | undefined;
3
+ //# sourceMappingURL=rpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../../../../../src/hooks/useConversation/livekit/utils/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAa9D,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,GACd,YAAY,GAAG,SAAS,CAO1B"}
@@ -0,0 +1,4 @@
1
+ import type { ToolsRegistry } from '../../../useTools/model/types';
2
+ import type { ClientToolDefinition } from '../types';
3
+ export declare function buildToolDefinitions(registry: ToolsRegistry): ClientToolDefinition[];
4
+ //# sourceMappingURL=toolDefinitions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolDefinitions.d.ts","sourceRoot":"","sources":["../../../../../../src/hooks/useConversation/livekit/utils/toolDefinitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAErD,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,aAAa,GACtB,oBAAoB,EAAE,CAexB"}
@@ -2,6 +2,7 @@ export type StreamCallbacks = {
2
2
  onChunk: (token: string) => void;
3
3
  onDone: () => void;
4
4
  onError: (err: Error) => void;
5
+ onCanSendChatMessage?: (canSend: boolean) => void;
5
6
  };
6
7
  export type StreamChatMessageParams = {
7
8
  chatId: string;
@@ -13,6 +14,7 @@ export type StreamChatMessageParams = {
13
14
  headers?: Record<string, string>;
14
15
  };
15
16
  export declare function extractContent(frame: string): string | null;
17
+ export declare function extractCanSendChatMessage(frame: string): boolean | null;
16
18
  export declare function createObjectScanner(onObject: (frame: string) => void): (text: string) => void;
17
19
  export declare function streamChatMessage(params: StreamChatMessageParams, callbacks: StreamCallbacks, signal?: AbortSignal): Promise<void>;
18
20
  //# sourceMappingURL=streamChatMessage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"streamChatMessage.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextChat/streamChatMessage.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAIvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAIlB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAkBF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB3D;AAID,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,UAQxC,MAAM,UA8BlC;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,uBAAuB,EAC/B,SAAS,EAAE,eAAe,EAC1B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CA+Df"}
1
+ {"version":3,"file":"streamChatMessage.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextChat/streamChatMessage.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAC9B,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACnD,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAIvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAIlB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAkBF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB3D;AAGD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAkBvE;AAID,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,UAQxC,MAAM,UA8BlC;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,uBAAuB,EAC/B,SAAS,EAAE,eAAe,EAC1B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAmEf"}
@@ -30,6 +30,7 @@ export type StreamSendResult = {
30
30
  ok: boolean;
31
31
  producedContent: boolean;
32
32
  aborted: boolean;
33
+ canSendChatMessage?: boolean;
33
34
  };
34
35
  /**
35
36
  * Streaming counterpart to `useTextChat`. Sends a message over the SSE transport
@@ -1 +1 @@
1
- {"version":3,"file":"useTextChatStream.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextChat/useTextChatStream.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAItE,YAAY,EACV,eAAe,EACf,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAE7B;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG;IAC/C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CACxC,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAG/B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAKF;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B;;aAsNrD,KAAK,EAAE;;;;4DAjInB,uBAAuB,KAAG,OAAO,CAAC,gBAAgB,CAAC;EA2IzD"}
1
+ {"version":3,"file":"useTextChatStream.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextChat/useTextChatStream.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAItE,YAAY,EACV,eAAe,EACf,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAE7B;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG;IAC/C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CACxC,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAG/B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAKF;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B;;aAyNrD,KAAK,EAAE;;;;4DApInB,uBAAuB,KAAG,OAAO,CAAC,gBAAgB,CAAC;EA8IzD"}
@@ -1,4 +1,4 @@
1
1
  export { useTools } from './public/useTools';
2
2
  export { ToolExecutionInProgressError } from './model/errors';
3
- export type { ToolArguments, ToolCallResult, ToolCallSnapshot, ToolCallStatus, ToolsRegistry, } from './model/types';
3
+ export type { ToolArguments, ToolCallResult, ToolCallSnapshot, ToolCallStatus, ToolDefinition, ToolsRegistry, } from './model/types';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAC9D,YAAY,EACV,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,aAAa,GACd,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAC9D,YAAY,EACV,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,aAAa,GACd,MAAM,eAAe,CAAC"}
@@ -1,7 +1,12 @@
1
1
  import type { FunctionCall } from '../../../types/service';
2
2
  export type ToolArguments = Record<string, unknown> | null;
3
3
  export type ToolHandler = (arguments_?: ToolArguments) => unknown | Promise<unknown>;
4
- export type ToolsRegistry = Record<string, ToolHandler>;
4
+ export type ToolDefinition = {
5
+ description?: string;
6
+ parameters?: Record<string, unknown>;
7
+ handler: ToolHandler;
8
+ };
9
+ export type ToolsRegistry = Record<string, ToolHandler | ToolDefinition>;
5
10
  export type ToolCallStatus = 'pending' | 'running' | 'completed';
6
11
  export type ToolCallRequest = {
7
12
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/useTools/model/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;AAE3D,MAAM,MAAM,WAAW,GAAG,CACxB,UAAU,CAAC,EAAE,aAAa,KACvB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhC,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAExD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;AAEjE,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,aAAa,CAAC;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,CAAC,EAAE,SAAS,YAAY,EAAE,GAAG,IAAI,CAAC;CAChD,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/useTools/model/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;AAE3D,MAAM,MAAM,WAAW,GAAG,CACxB,UAAU,CAAC,EAAE,aAAa,KACvB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhC,MAAM,MAAM,cAAc,GAAG;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,CAAC,CAAC;AAEzE,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;AAEjE,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,aAAa,CAAC;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,CAAC,EAAE,SAAS,YAAY,EAAE,GAAG,IAAI,CAAC;CAChD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"executeToolCall.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/useTools/runtime/executeToolCall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,aAAa,EACd,MAAM,gBAAgB,CAAC;AAMxB,wBAAsB,eAAe,CACnC,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,cAAc,CAAC,CA6BzB"}
1
+ {"version":3,"file":"executeToolCall.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/useTools/runtime/executeToolCall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,aAAa,EACd,MAAM,gBAAgB,CAAC;AAMxB,wBAAsB,eAAe,CACnC,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,cAAc,CAAC,CA8BzB"}
@@ -5,5 +5,6 @@ export declare function useToolCallingRuntime<TResponse extends ToolCallSourceRe
5
5
  isRunning: boolean;
6
6
  resolveResponseToolCalls: (initialResponse: TResponse, continueWithResults: (results: FunctionCallResult[]) => Promise<TResponse>) => Promise<TResponse>;
7
7
  resolveIncomingToolCalls: (envelope: ToolCallEnvelope, adapter: ToolRuntimeAdapter) => Promise<void>;
8
+ executeToolCalls: (functionCalls: ToolCallEnvelope["functionCalls"]) => Promise<FunctionCallResult[]>;
8
9
  };
9
10
  //# sourceMappingURL=useToolCallingRuntime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useToolCallingRuntime.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/useTools/runtime/useToolCallingRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAQ7D,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAGnB,MAAM,SAAS,CAAC;AAEjB,wBAAgB,qBAAqB,CACnC,SAAS,SAAS,sBAAsB;;gDA6BrB,SAAS,uBACL,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,OAAO,CAAC,SAAS,CAAC;yCAWhE,gBAAgB,WACjB,kBAAkB;EAe9B"}
1
+ {"version":3,"file":"useToolCallingRuntime.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/useTools/runtime/useToolCallingRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAS7D,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAGnB,MAAM,SAAS,CAAC;AAEjB,wBAAgB,qBAAqB,CACnC,SAAS,SAAS,sBAAsB;;gDA6BrB,SAAS,uBACL,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,OAAO,CAAC,SAAS,CAAC;yCAWhE,gBAAgB,WACjB,kBAAkB;sCAUY,gBAAgB,CAAC,eAAe,CAAC;EAU3E"}
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.24.0",
2
+ "version": "1.26.0",
3
3
  "name": "@wix/legends-platform-sdk",
4
4
  "license": "MIT",
5
5
  "author": {
@@ -103,5 +103,5 @@
103
103
  "wallaby": {
104
104
  "autoDetect": true
105
105
  },
106
- "falconPackageHash": "f2a22c8ce3066f461fc611d59056d3368619658bb0aaaff74a6bd311"
106
+ "falconPackageHash": "e79a376cad81d2f6e6c35e56d6c095adcd4b26694b23c2a581c8b9a6"
107
107
  }
@@ -1,18 +0,0 @@
1
- "use strict";
2
-
3
- exports.__esModule = true;
4
- exports.createLivekitToolAdapter = createLivekitToolAdapter;
5
- var _messaging = require("./messaging");
6
- function createLivekitToolAdapter(room) {
7
- return {
8
- async sendResults(envelope) {
9
- const payload = {
10
- type: 'tool_results',
11
- requestId: envelope.requestId,
12
- functionCallResults: envelope.functionCallResults
13
- };
14
- await (0, _messaging.publishConversationDataMessage)(room, payload, 'tool_results');
15
- }
16
- };
17
- }
18
- //# sourceMappingURL=toolAdapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_messaging","require","createLivekitToolAdapter","room","sendResults","envelope","payload","type","requestId","functionCallResults","publishConversationDataMessage"],"sources":["../../../../../../src/hooks/useConversation/livekit/utils/toolAdapter.ts"],"sourcesContent":["import type { Room } from 'livekit-client';\nimport type { ToolRuntimeAdapter } from '../../../useTools/runtime/types';\nimport type { ToolResultsData } from '../types';\n\nimport { publishConversationDataMessage } from './messaging';\n\nexport function createLivekitToolAdapter(\n room: Room | undefined,\n): ToolRuntimeAdapter {\n return {\n async sendResults(envelope) {\n const payload: ToolResultsData = {\n type: 'tool_results',\n requestId: envelope.requestId,\n functionCallResults: envelope.functionCallResults,\n };\n\n await publishConversationDataMessage(room, payload, 'tool_results');\n },\n };\n}\n"],"mappings":";;;;AAIA,IAAAA,UAAA,GAAAC,OAAA;AAEO,SAASC,wBAAwBA,CACtCC,IAAsB,EACF;EACpB,OAAO;IACL,MAAMC,WAAWA,CAACC,QAAQ,EAAE;MAC1B,MAAMC,OAAwB,GAAG;QAC/BC,IAAI,EAAE,cAAc;QACpBC,SAAS,EAAEH,QAAQ,CAACG,SAAS;QAC7BC,mBAAmB,EAAEJ,QAAQ,CAACI;MAChC,CAAC;MAED,MAAM,IAAAC,yCAA8B,EAACP,IAAI,EAAEG,OAAO,EAAE,cAAc,CAAC;IACrE;EACF,CAAC;AACH","ignoreList":[]}
@@ -1,14 +0,0 @@
1
- import { publishConversationDataMessage } from './messaging';
2
- export function createLivekitToolAdapter(room) {
3
- return {
4
- async sendResults(envelope) {
5
- const payload = {
6
- type: 'tool_results',
7
- requestId: envelope.requestId,
8
- functionCallResults: envelope.functionCallResults
9
- };
10
- await publishConversationDataMessage(room, payload, 'tool_results');
11
- }
12
- };
13
- }
14
- //# sourceMappingURL=toolAdapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["publishConversationDataMessage","createLivekitToolAdapter","room","sendResults","envelope","payload","type","requestId","functionCallResults"],"sources":["../../../../../../src/hooks/useConversation/livekit/utils/toolAdapter.ts"],"sourcesContent":["import type { Room } from 'livekit-client';\nimport type { ToolRuntimeAdapter } from '../../../useTools/runtime/types';\nimport type { ToolResultsData } from '../types';\n\nimport { publishConversationDataMessage } from './messaging';\n\nexport function createLivekitToolAdapter(\n room: Room | undefined,\n): ToolRuntimeAdapter {\n return {\n async sendResults(envelope) {\n const payload: ToolResultsData = {\n type: 'tool_results',\n requestId: envelope.requestId,\n functionCallResults: envelope.functionCallResults,\n };\n\n await publishConversationDataMessage(room, payload, 'tool_results');\n },\n };\n}\n"],"mappings":"AAIA,SAASA,8BAA8B,QAAQ,aAAa;AAE5D,OAAO,SAASC,wBAAwBA,CACtCC,IAAsB,EACF;EACpB,OAAO;IACL,MAAMC,WAAWA,CAACC,QAAQ,EAAE;MAC1B,MAAMC,OAAwB,GAAG;QAC/BC,IAAI,EAAE,cAAc;QACpBC,SAAS,EAAEH,QAAQ,CAACG,SAAS;QAC7BC,mBAAmB,EAAEJ,QAAQ,CAACI;MAChC,CAAC;MAED,MAAMR,8BAA8B,CAACE,IAAI,EAAEG,OAAO,EAAE,cAAc,CAAC;IACrE;EACF,CAAC;AACH","ignoreList":[]}
@@ -1,4 +0,0 @@
1
- import type { Room } from 'livekit-client';
2
- import type { ToolRuntimeAdapter } from '../../../useTools/runtime/types';
3
- export declare function createLivekitToolAdapter(room: Room | undefined): ToolRuntimeAdapter;
4
- //# sourceMappingURL=toolAdapter.d.ts.map