@assistant-ui/react 0.15.14 → 0.15.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/dist/assistant-transport.d.ts +32 -0
  2. package/dist/assistant-transport.d.ts.map +1 -0
  3. package/dist/assistant-transport.js +27 -0
  4. package/dist/assistant-transport.js.map +1 -0
  5. package/dist/context/providers/MessageProvider.js +1 -1
  6. package/dist/devtools/DevToolsHooks.d.ts +0 -2
  7. package/dist/devtools/DevToolsHooks.d.ts.map +1 -1
  8. package/dist/devtools/DevToolsHooks.js +10 -12
  9. package/dist/devtools/DevToolsHooks.js.map +1 -1
  10. package/dist/hooks/useMessageQuote.js +1 -1
  11. package/dist/hooks/useToolCallElapsed.js +1 -1
  12. package/dist/index.d.ts +4 -7
  13. package/dist/index.js +6 -8
  14. package/dist/legacy-runtime/AssistantRuntimeProvider.js +1 -1
  15. package/dist/mcp-apps/McpAppRenderer.js +1 -1
  16. package/dist/mcp-apps/McpAppsRemoteHost.d.ts.map +1 -1
  17. package/dist/mcp-apps/McpAppsRemoteHost.js +18 -2
  18. package/dist/mcp-apps/McpAppsRemoteHost.js.map +1 -1
  19. package/dist/mcp-apps/bridge.d.ts.map +1 -1
  20. package/dist/mcp-apps/bridge.js +33 -24
  21. package/dist/mcp-apps/bridge.js.map +1 -1
  22. package/dist/model-context/makeAssistantVisible.js +1 -1
  23. package/dist/primitives/actionBar/ActionBarCopy.js +1 -1
  24. package/dist/primitives/actionBar/ActionBarExportMarkdown.d.ts.map +1 -1
  25. package/dist/primitives/actionBar/ActionBarExportMarkdown.js +5 -2
  26. package/dist/primitives/actionBar/ActionBarExportMarkdown.js.map +1 -1
  27. package/dist/primitives/actionBar/ActionBarFeedbackNegative.js +1 -1
  28. package/dist/primitives/actionBar/ActionBarFeedbackPositive.js +1 -1
  29. package/dist/primitives/actionBar/ActionBarStopSpeaking.d.ts.map +1 -1
  30. package/dist/primitives/actionBar/ActionBarStopSpeaking.js +24 -37
  31. package/dist/primitives/actionBar/ActionBarStopSpeaking.js.map +1 -1
  32. package/dist/primitives/actionBar/useActionBarFloatStatus.js +1 -1
  33. package/dist/primitives/assistantModal/AssistantModalRoot.js +1 -1
  34. package/dist/primitives/attachment/AttachmentName.js +1 -1
  35. package/dist/primitives/attachment/AttachmentRemove.js +1 -1
  36. package/dist/primitives/attachment/AttachmentThumb.js +1 -1
  37. package/dist/primitives/branchPicker/BranchPickerCount.js +1 -1
  38. package/dist/primitives/branchPicker/BranchPickerNumber.js +1 -1
  39. package/dist/primitives/branchPicker/BranchPickerRoot.d.ts.map +1 -1
  40. package/dist/primitives/branchPicker/BranchPickerRoot.js +20 -15
  41. package/dist/primitives/branchPicker/BranchPickerRoot.js.map +1 -1
  42. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js +1 -1
  43. package/dist/primitives/composer/ComposerAddAttachment.js +1 -1
  44. package/dist/primitives/composer/ComposerAttachmentDropzone.js +1 -1
  45. package/dist/primitives/composer/ComposerDictationTranscript.d.ts +2 -2
  46. package/dist/primitives/composer/ComposerDictationTranscript.js +3 -3
  47. package/dist/primitives/composer/ComposerDictationTranscript.js.map +1 -1
  48. package/dist/primitives/composer/ComposerInput.js +2 -2
  49. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  50. package/dist/primitives/composer/ComposerQuote.js +1 -1
  51. package/dist/primitives/composer/ComposerRoot.js +1 -1
  52. package/dist/primitives/composer/ComposerStopDictation.js +1 -1
  53. package/dist/primitives/composer/trigger/TriggerPopover.js +1 -1
  54. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts.map +1 -1
  55. package/dist/primitives/composer/trigger/triggerSelectionResource.js +24 -20
  56. package/dist/primitives/composer/trigger/triggerSelectionResource.js.map +1 -1
  57. package/dist/primitives/composer/useComposerInputState.js +1 -1
  58. package/dist/primitives/message/MessageIf.js +1 -1
  59. package/dist/primitives/message/MessagePartsGrouped.js +1 -1
  60. package/dist/primitives/message/MessageRoot.js +1 -1
  61. package/dist/primitives/message.js +1 -1
  62. package/dist/primitives/queueItem/QueueItemRemove.js +1 -1
  63. package/dist/primitives/queueItem/QueueItemSteer.js +1 -1
  64. package/dist/primitives/queueItem/QueueItemText.js +1 -1
  65. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js +1 -1
  66. package/dist/primitives/suggestion/SuggestionDescription.js +1 -1
  67. package/dist/primitives/suggestion/SuggestionTitle.js +1 -1
  68. package/dist/primitives/suggestion/SuggestionTrigger.js +1 -1
  69. package/dist/primitives/thread/ThreadIf.js +1 -1
  70. package/dist/primitives/thread/ThreadRoot.d.ts +3 -0
  71. package/dist/primitives/thread/ThreadRoot.d.ts.map +1 -1
  72. package/dist/primitives/thread/ThreadRoot.js +44 -9
  73. package/dist/primitives/thread/ThreadRoot.js.map +1 -1
  74. package/dist/primitives/thread/ThreadViewport.d.ts.map +1 -1
  75. package/dist/primitives/thread/ThreadViewport.js +2 -13
  76. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  77. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
  78. package/dist/primitives/thread/useThreadViewportAutoScroll.js +23 -8
  79. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  80. package/dist/primitives/threadList/ThreadListNew.js +1 -1
  81. package/dist/sandbox-host/SandboxHost.d.ts.map +1 -1
  82. package/dist/sandbox-host/SandboxHost.js +6 -1
  83. package/dist/sandbox-host/SandboxHost.js.map +1 -1
  84. package/dist/unstable/useComposerInput.d.ts +2 -2
  85. package/dist/unstable/useComposerInput.js +1 -1
  86. package/dist/unstable/useComposerInput.js.map +1 -1
  87. package/dist/unstable/useComposerInputHistory.js +2 -2
  88. package/dist/unstable/useComposerInputHistory.js.map +1 -1
  89. package/dist/unstable/useLiveCompletionAdapter.d.ts +5 -0
  90. package/dist/unstable/useLiveCompletionAdapter.d.ts.map +1 -1
  91. package/dist/unstable/useLiveCompletionAdapter.js +16 -3
  92. package/dist/unstable/useLiveCompletionAdapter.js.map +1 -1
  93. package/dist/unstable/useMentionAdapter.d.ts +1 -1
  94. package/dist/utils/invokeCallbackSafely.d.ts +5 -0
  95. package/dist/utils/invokeCallbackSafely.d.ts.map +1 -0
  96. package/dist/utils/invokeCallbackSafely.js +15 -0
  97. package/dist/utils/invokeCallbackSafely.js.map +1 -0
  98. package/dist/utils/smooth/SmoothContext.d.ts +6 -6
  99. package/dist/utils/smooth/SmoothContext.js +1 -1
  100. package/dist/utils/smooth/useSmooth.d.ts +3 -0
  101. package/dist/utils/smooth/useSmooth.d.ts.map +1 -1
  102. package/dist/utils/smooth/useSmooth.js +16 -1
  103. package/dist/utils/smooth/useSmooth.js.map +1 -1
  104. package/dist/utils/useToolArgsFieldStatus.js +1 -1
  105. package/package.json +10 -10
  106. package/src/assistant-transport.ts +94 -0
  107. package/src/devtools/DevToolsHooks.test.ts +40 -0
  108. package/src/devtools/DevToolsHooks.ts +10 -15
  109. package/src/index.ts +8 -4
  110. package/src/mcp-apps/McpAppsRemoteHost.test.ts +29 -3
  111. package/src/mcp-apps/McpAppsRemoteHost.ts +42 -7
  112. package/src/mcp-apps/bridge.test.ts +153 -0
  113. package/src/mcp-apps/bridge.ts +42 -30
  114. package/src/model-context/frame/SPEC_AssistantFrame.md +1 -1
  115. package/src/primitives/actionBar/ActionBarExportMarkdown.test.tsx +67 -0
  116. package/src/primitives/actionBar/ActionBarExportMarkdown.tsx +3 -1
  117. package/src/primitives/actionBar/ActionBarStopSpeaking.tsx +0 -9
  118. package/src/primitives/branchPicker/BranchPickerRoot.tsx +5 -3
  119. package/src/primitives/composer/ComposerDictationTranscript.tsx +2 -2
  120. package/src/primitives/composer/ComposerInput.tsx +1 -1
  121. package/src/primitives/composer/trigger/triggerSelectionResource.test.ts +135 -0
  122. package/src/primitives/composer/trigger/triggerSelectionResource.ts +2 -0
  123. package/src/primitives/thread/ThreadRoot.test.tsx +251 -0
  124. package/src/primitives/thread/ThreadRoot.tsx +33 -0
  125. package/src/primitives/thread/ThreadViewport.tsx +1 -8
  126. package/src/primitives/thread/useThreadViewportAutoScroll.test.tsx +152 -0
  127. package/src/primitives/thread/useThreadViewportAutoScroll.ts +26 -19
  128. package/src/sandbox-host/SandboxHost.test.tsx +90 -0
  129. package/src/sandbox-host/SandboxHost.tsx +8 -2
  130. package/src/tests/RemoteThreadListRuntime.adapterProvider.test.tsx +24 -3
  131. package/src/tests/RemoteThreadListRuntime.reloadMainThread.test.tsx +1 -2
  132. package/src/tests/augmentations.test.ts +49 -0
  133. package/src/tests/in-memory-thread-list.test.tsx +1 -1
  134. package/src/tests/threadMessageById.test.tsx +61 -1
  135. package/src/unstable/useComposerInput.ts +2 -2
  136. package/src/unstable/useComposerInputHistory.test.tsx +4 -4
  137. package/src/unstable/useComposerInputHistory.ts +1 -1
  138. package/src/unstable/useLiveCompletionAdapter.test.tsx +157 -0
  139. package/src/unstable/useLiveCompletionAdapter.ts +41 -17
  140. package/src/utils/invokeCallbackSafely.ts +11 -0
  141. package/src/utils/smooth/useSmooth.test.tsx +110 -0
  142. package/src/utils/smooth/useSmooth.ts +20 -6
  143. package/dist/client/InMemoryThreadList.d.ts +0 -12
  144. package/dist/client/InMemoryThreadList.d.ts.map +0 -1
  145. package/dist/client/InMemoryThreadList.js +0 -374
  146. package/dist/client/InMemoryThreadList.js.map +0 -1
  147. package/dist/context/react/utils/ensureBinding.d.ts +0 -5
  148. package/dist/context/react/utils/ensureBinding.d.ts.map +0 -1
  149. package/dist/context/react/utils/ensureBinding.js +0 -24
  150. package/dist/context/react/utils/ensureBinding.js.map +0 -1
  151. package/dist/context/react/utils/useRuntimeState.d.ts +0 -13
  152. package/dist/context/react/utils/useRuntimeState.d.ts.map +0 -1
  153. package/dist/context/react/utils/useRuntimeState.js +0 -33
  154. package/dist/context/react/utils/useRuntimeState.js.map +0 -1
  155. package/dist/legacy-runtime/cloud/auiV0.d.ts +0 -119
  156. package/dist/legacy-runtime/cloud/auiV0.d.ts.map +0 -1
  157. package/dist/legacy-runtime/cloud/auiV0.js +0 -137
  158. package/dist/legacy-runtime/cloud/auiV0.js.map +0 -1
  159. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.d.ts +0 -16
  160. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.d.ts.map +0 -1
  161. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.js +0 -36
  162. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.js.map +0 -1
  163. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.d.ts +0 -17
  164. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.d.ts.map +0 -1
  165. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.js +0 -55
  166. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.js.map +0 -1
  167. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.d.ts +0 -11
  168. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.d.ts.map +0 -1
  169. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.js +0 -165
  170. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.js.map +0 -1
  171. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.d.ts +0 -15
  172. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.d.ts.map +0 -1
  173. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.js +0 -81
  174. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.js.map +0 -1
  175. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts +0 -126
  176. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts.map +0 -1
  177. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.js +0 -0
  178. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts +0 -14
  179. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts.map +0 -1
  180. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js +0 -290
  181. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js.map +0 -1
  182. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.d.ts +0 -7
  183. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.d.ts.map +0 -1
  184. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.js +0 -25
  185. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.js.map +0 -1
  186. package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.d.ts +0 -7
  187. package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.d.ts.map +0 -1
  188. package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.js +0 -27
  189. package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.js.map +0 -1
  190. package/dist/legacy-runtime/runtime-cores/assistant-transport/utils.d.ts +0 -2
  191. package/dist/legacy-runtime/runtime-cores/assistant-transport/utils.js +0 -2
  192. package/src/client/InMemoryThreadList.ts +0 -247
  193. package/src/context/react/utils/ensureBinding.ts +0 -46
  194. package/src/context/react/utils/useRuntimeState.ts +0 -46
  195. package/src/legacy-runtime/cloud/auiV0.ts +0 -331
  196. package/src/legacy-runtime/cloud/useCloudThreadListRuntime.ts +0 -31
  197. package/src/legacy-runtime/runtime-cores/assistant-transport/commandQueue.ts +0 -68
  198. package/src/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.test.ts +0 -455
  199. package/src/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.ts +0 -172
  200. package/src/legacy-runtime/runtime-cores/assistant-transport/runManager.ts +0 -113
  201. package/src/legacy-runtime/runtime-cores/assistant-transport/transport-delivery.test.tsx +0 -79
  202. package/src/legacy-runtime/runtime-cores/assistant-transport/transport-parentid.test.tsx +0 -97
  203. package/src/legacy-runtime/runtime-cores/assistant-transport/transport-scheduling.test.ts +0 -307
  204. package/src/legacy-runtime/runtime-cores/assistant-transport/types.ts +0 -170
  205. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransport.spec.md +0 -141
  206. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.test.tsx +0 -585
  207. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.ts +0 -476
  208. package/src/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.ts +0 -20
  209. package/src/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.ts +0 -9
  210. package/src/legacy-runtime/runtime-cores/assistant-transport/utils.ts +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"replayBoundaryStream.js","names":["c","_c","useCallback","useEffect","useRef","useState","REPLAY_CONTENT_LENGTH_HEADER","ReplayBoundaryStreamOptions","setReplaying","value","waitForRender","Promise","useReplayRenderWait","$","renderTicket","setRenderTicket","mountedRef","nextTicketRef","t0","Symbol","for","waitersRef","t1","committedTicket","pendingWaiters","waiter","current","undefined","ticket","resolve","push","resolveWaiters","t2","t3","t4","t5","t6","setTimeout","parseReplayContentLength","headers","Headers","raw","get","boundary","Number","isSafeInteger","createReplayBoundaryStream","response","Response","waitForReplayRender","ReadableStream","Uint8Array","body","replayContentLength","reader","getReader","bytesForwarded","replayFinished","readerCleanup","releaseReader","releaseLock","cancelReader","reason","cancel","finishReplay","pull","controller","done","read","close","enqueue","nextBytesForwarded","byteLength","replayBytesInChunk","subarray","error","catch","wasFinished"],"sources":["../../../../src/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport const REPLAY_CONTENT_LENGTH_HEADER = \"Aui-Replay-Content-Length\";\n\ntype ReplayBoundaryStreamOptions = {\n setReplaying: (value: boolean) => void;\n waitForRender: () => Promise<void>;\n};\n\nexport const useReplayRenderWait = () => {\n const [renderTicket, setRenderTicket] = useState(0);\n const mountedRef = useRef(true);\n const nextTicketRef = useRef(0);\n const waitersRef = useRef<Array<{ ticket: number; resolve: () => void }>>([]);\n\n const resolveWaiters = useCallback((committedTicket?: number) => {\n const pendingWaiters = [];\n\n for (const waiter of waitersRef.current) {\n if (committedTicket === undefined || waiter.ticket <= committedTicket) {\n waiter.resolve();\n } else {\n pendingWaiters.push(waiter);\n }\n }\n\n waitersRef.current = pendingWaiters;\n }, []);\n\n useEffect(() => {\n mountedRef.current = true;\n resolveWaiters(renderTicket);\n }, [renderTicket, resolveWaiters]);\n\n useEffect(\n () => () => {\n mountedRef.current = false;\n resolveWaiters();\n },\n [resolveWaiters],\n );\n\n return useCallback(\n () =>\n new Promise<void>((resolve) => {\n setTimeout(() => {\n if (!mountedRef.current) {\n resolve();\n return;\n }\n\n const ticket = nextTicketRef.current + 1;\n nextTicketRef.current = ticket;\n waitersRef.current.push({ ticket, resolve });\n setRenderTicket(ticket);\n }, 0);\n }),\n [],\n );\n};\n\nconst parseReplayContentLength = (headers: Headers): number => {\n const raw = headers.get(REPLAY_CONTENT_LENGTH_HEADER);\n if (raw == null) return 0;\n\n const boundary = Number(raw);\n return Number.isSafeInteger(boundary) && boundary > 0 ? boundary : 0;\n};\n\n// Gates replay bytes until isReplaying:true renders, then releases live bytes after isReplaying:false renders.\nexport const createReplayBoundaryStream = async (\n response: Response,\n {\n setReplaying,\n waitForRender: waitForReplayRender,\n }: ReplayBoundaryStreamOptions,\n): Promise<ReadableStream<Uint8Array>> => {\n const body = response.body as ReadableStream<Uint8Array>;\n const replayContentLength = parseReplayContentLength(response.headers);\n\n if (replayContentLength <= 0) {\n return body;\n }\n\n setReplaying(true);\n await waitForReplayRender();\n\n const reader = body.getReader();\n let bytesForwarded = 0;\n let replayFinished = false;\n let readerCleanup: Promise<void> | undefined;\n\n const releaseReader = () => {\n if (readerCleanup) return readerCleanup;\n reader.releaseLock();\n readerCleanup = Promise.resolve();\n return readerCleanup;\n };\n\n const cancelReader = (reason?: unknown) => {\n if (readerCleanup) return readerCleanup;\n readerCleanup = (async () => {\n try {\n await reader.cancel(reason);\n } finally {\n reader.releaseLock();\n }\n })();\n return readerCleanup;\n };\n\n const finishReplay = async () => {\n if (replayFinished) return;\n replayFinished = true;\n\n // Let replay bytes drain before rendering live mode, then render live mode before releasing live bytes.\n await waitForReplayRender();\n setReplaying(false);\n await waitForReplayRender();\n };\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n\n if (done) {\n await releaseReader();\n await finishReplay();\n controller.close();\n return;\n }\n\n if (replayFinished) {\n controller.enqueue(value);\n return;\n }\n\n const nextBytesForwarded = bytesForwarded + value.byteLength;\n\n if (nextBytesForwarded < replayContentLength) {\n bytesForwarded = nextBytesForwarded;\n controller.enqueue(value);\n return;\n }\n\n if (nextBytesForwarded === replayContentLength) {\n controller.enqueue(value);\n await finishReplay();\n return;\n }\n\n const replayBytesInChunk = replayContentLength - bytesForwarded;\n\n controller.enqueue(value.subarray(0, replayBytesInChunk));\n await finishReplay();\n controller.enqueue(value.subarray(replayBytesInChunk));\n } catch (error) {\n await cancelReader(error).catch(() => {});\n throw error;\n }\n },\n async cancel(reason) {\n const wasFinished = replayFinished;\n replayFinished = true;\n if (!wasFinished) setReplaying(false);\n await cancelReader(reason);\n },\n });\n};\n"],"mappings":";;;;AAIA,MAAaM,+BAA+B;AAO5C,MAAaM,4BAAsB;CAAA,MAAAC,IAAAZ,EAAA,CAAA;CACjC,MAAA,CAAAa,cAAAC,mBAAwCV,SAAS,CAAC;CAClD,MAAAW,aAAmBZ,OAAO,IAAI;CAC9B,MAAAa,gBAAsBb,OAAO,CAAC;CAAE,IAAAc;CAAA,IAAAL,EAAA,OAAAM,OAAAC,IAAA,2BAAA,GAAA;EAC0CF,KAAA,CAAA;EAAEL,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAA5E,MAAAQ,aAAmBjB,OAAuDc,EAAE;CAAE,IAAAI;CAAA,IAAAT,EAAA,OAAAM,OAAAC,IAAA,2BAAA,GAAA;EAE3CE,MAAAC,oBAAA;GACjC,MAAAC,iBAAuB,CAAA;GAEvB,KAAK,MAAAC,UAAgBJ,WAAUK,SAC7B,IAAIH,oBAAoBI,KAAAA,KAAaF,OAAMG,UAAWL,iBACpDE,OAAMI,QAAS;QAEfL,eAAcM,KAAML,MAAM;GAI9BJ,WAAUK,UAAWF;EAAH;EACnBX,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAZD,MAAAkB,iBAAuBT;CAYhB,IAAAU;CAAA,IAAAC;CAAA,IAAApB,EAAA,OAAAC,cAAA;EAEGkB,WAAA;GACRhB,WAAUU,UAAW;GACrBK,eAAejB,YAAY;EAAC;EAC3BmB,KAAA,CAACnB,cAAciB,cAAc;EAAClB,EAAA,KAAAC;EAAAD,EAAA,KAAAmB;EAAAnB,EAAA,KAAAoB;CAAA,OAAA;EAAAD,KAAAnB,EAAA;EAAAoB,KAAApB,EAAA;CAAA;CAHjCV,UAAU6B,IAGPC,EAA8B;CAAC,IAAAC;CAAA,IAAAC;CAAA,IAAAtB,EAAA,OAAAM,OAAAC,IAAA,2BAAA,GAAA;EAGhCc,iBAAM;GACJlB,WAAUU,UAAW;GACrBK,eAAe;EAAC;EAElBI,KAAA,CAACJ,cAAc;EAAClB,EAAA,KAAAqB;EAAArB,EAAA,KAAAsB;CAAA,OAAA;EAAAD,KAAArB,EAAA;EAAAsB,KAAAtB,EAAA;CAAA;CALlBV,UACE+B,IAIAC,EACF;CAAC,IAAAC;CAAA,IAAAvB,EAAA,OAAAM,OAAAC,IAAA,2BAAA,GAAA;EAGCgB,WACE,IAAIzB,SAAckB,YAAA;GAChBQ,iBAAW;IACT,IAAI,CAACrB,WAAUU,SAAQ;KACrBG,QAAQ;KAAC;IAAA;IAIX,MAAAD,SAAeX,cAAaS,UAAW;IACvCT,cAAaS,UAAWE;IACxBP,WAAUK,QAAQI,KAAM;KAAAF;KAAAC;IAAkB,CAAC;IAC3Cd,gBAAgBa,MAAM;GAAC,GACtB,CAAC;EAAC,CACN;EAACf,EAAA,KAAAuB;CAAA,OAAAA,KAAAvB,EAAA;CAAA,OAdCuB;AAgBN;AAGH,MAAME,4BAA4BC,YAA6B;CAC7D,MAAME,MAAMF,QAAQG,IAAIpC,4BAA4B;CACpD,IAAImC,OAAO,MAAM,OAAO;CAExB,MAAME,WAAWC,OAAOH,GAAG;CAC3B,OAAOG,OAAOC,cAAcF,QAAQ,KAAKA,WAAW,IAAIA,WAAW;AACrE;AAGA,MAAaG,6BAA6B,OACxCC,UACA,EACEvC,cACAE,eAAeuC,0BAEuB;CACxC,MAAMG,OAAOL,SAASK;CACtB,MAAMC,sBAAsBf,yBAAyBS,SAASR,OAAO;CAErE,IAAIc,uBAAuB,GACzB,OAAOD;CAGT5C,aAAa,IAAI;CACjB,MAAMyC,oBAAoB;CAE1B,MAAMK,SAASF,KAAKG,UAAU;CAC9B,IAAIC,iBAAiB;CACrB,IAAIC,iBAAiB;CACrB,IAAIC;CAEJ,MAAMC,sBAAsB;EAC1B,IAAID,eAAe,OAAOA;EAC1BJ,OAAOM,YAAY;EACnBF,gBAAgB/C,QAAQkB,QAAQ;EAChC,OAAO6B;CACT;CAEA,MAAMG,gBAAgBC,WAAqB;EACzC,IAAIJ,eAAe,OAAOA;EAC1BA,iBAAiB,YAAY;GAC3B,IAAI;IACF,MAAMJ,OAAOS,OAAOD,MAAM;GAC5B,UAAU;IACRR,OAAOM,YAAY;GACrB;EACF,EAAA,CAAG;EACH,OAAOF;CACT;CAEA,MAAMM,eAAe,YAAY;EAC/B,IAAIP,gBAAgB;EACpBA,iBAAiB;EAGjB,MAAMR,oBAAoB;EAC1BzC,aAAa,KAAK;EAClB,MAAMyC,oBAAoB;CAC5B;CAEA,OAAO,IAAIC,eAA2B;EACpC,MAAMe,KAAKC,YAAY;GACrB,IAAI;IACF,MAAM,EAAEC,MAAM1D,UAAU,MAAM6C,OAAOc,KAAK;IAE1C,IAAID,MAAM;KACR,MAAMR,cAAc;KACpB,MAAMK,aAAa;KACnBE,WAAWG,MAAM;KACjB;IACF;IAEA,IAAIZ,gBAAgB;KAClBS,WAAWI,QAAQ7D,KAAK;KACxB;IACF;IAEA,MAAM8D,qBAAqBf,iBAAiB/C,MAAM+D;IAElD,IAAID,qBAAqBlB,qBAAqB;KAC5CG,iBAAiBe;KACjBL,WAAWI,QAAQ7D,KAAK;KACxB;IACF;IAEA,IAAI8D,uBAAuBlB,qBAAqB;KAC9Ca,WAAWI,QAAQ7D,KAAK;KACxB,MAAMuD,aAAa;KACnB;IACF;IAEA,MAAMS,qBAAqBpB,sBAAsBG;IAEjDU,WAAWI,QAAQ7D,MAAMiE,SAAS,GAAGD,kBAAkB,CAAC;IACxD,MAAMT,aAAa;IACnBE,WAAWI,QAAQ7D,MAAMiE,SAASD,kBAAkB,CAAC;GACvD,SAASE,OAAO;IACd,MAAMd,aAAac,KAAK,CAAC,CAACC,YAAY,CAAC,CAAC;IACxC,MAAMD;GACR;EACF;EACA,MAAMZ,OAAOD,QAAQ;GACnB,MAAMe,cAAcpB;GACpBA,iBAAiB;GACjB,IAAI,CAACoB,aAAarE,aAAa,KAAK;GACpC,MAAMqD,aAAaC,MAAM;EAC3B;CACF,CAAC;AACH"}
@@ -1,15 +0,0 @@
1
- //#region src/legacy-runtime/runtime-cores/assistant-transport/runManager.d.ts
2
- type RunManager = Readonly<{
3
- isRunning: boolean;
4
- schedule: () => void;
5
- cancel: () => void;
6
- }>;
7
- declare function useRunManager(config: {
8
- onRun: (signal: AbortSignal) => Promise<void>;
9
- onFinish?: (() => void) | undefined;
10
- onCancel?: (() => void) | undefined;
11
- onError?: ((error: Error) => void | Promise<void>) | undefined;
12
- }): RunManager;
13
- //#endregion
14
- export { RunManager, useRunManager };
15
- //# sourceMappingURL=runManager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runManager.d.ts","names":[],"sources":["../../../../src/legacy-runtime/runtime-cores/assistant-transport/runManager.ts"],"mappings":";KAGY,aAAa;EACvB;EACA;EACA;;iBAYc,cAAc;EAC5B,QAAQ,QAAQ,gBAAgB;EAChC;EACA;EACA,YAAY,OAAO,iBAAiB;IAClC"}
@@ -1,81 +0,0 @@
1
- import { useLatestRef } from "./useLatestRef.js";
2
- import { useCallback, useEffect, useRef, useState } from "@assistant-ui/tap/react-shim";
3
- //#region src/legacy-runtime/runtime-cores/assistant-transport/runManager.ts
4
- const disposeReason = Symbol("assistant-transport-dispose");
5
- const reportFinishError = (error) => {
6
- console.error("[assistant-ui] Assistant transport onFinish callback threw an error", error);
7
- };
8
- function useRunManager(config) {
9
- const [isRunning, setIsRunning] = useState(false);
10
- const stateRef = useRef({
11
- pending: false,
12
- disposed: false,
13
- abortController: null
14
- });
15
- const onRunRef = useLatestRef(config.onRun);
16
- const onFinishRef = useLatestRef(config.onFinish);
17
- const onCancelRef = useLatestRef(config.onCancel);
18
- const onErrorRef = useLatestRef(config.onError);
19
- const startRun = useCallback(() => {
20
- setIsRunning(true);
21
- stateRef.current.pending = false;
22
- const ac = new AbortController();
23
- stateRef.current.abortController = ac;
24
- const disposeAborted = () => ac.signal.reason === disposeReason;
25
- queueMicrotask(async () => {
26
- try {
27
- if (!disposeAborted()) await onRunRef.current(ac.signal);
28
- } catch (error) {
29
- if (!disposeAborted() && !stateRef.current.disposed) {
30
- stateRef.current.pending = false;
31
- if (ac.signal.aborted) onCancelRef.current?.();
32
- else await onErrorRef.current?.(error);
33
- }
34
- } finally {
35
- if (!disposeAborted() && !stateRef.current.disposed) try {
36
- Promise.resolve(onFinishRef.current?.()).catch(reportFinishError);
37
- } catch (error) {
38
- reportFinishError(error);
39
- }
40
- if (!stateRef.current.disposed && stateRef.current.pending) startRun();
41
- else {
42
- setIsRunning(false);
43
- if (stateRef.current.abortController === ac) stateRef.current.abortController = null;
44
- }
45
- }
46
- });
47
- }, [
48
- onRunRef,
49
- onFinishRef,
50
- onErrorRef,
51
- onCancelRef
52
- ]);
53
- const schedule = useCallback(() => {
54
- if (stateRef.current.disposed) return;
55
- if (stateRef.current.abortController) {
56
- stateRef.current.pending = true;
57
- return;
58
- }
59
- startRun();
60
- }, [startRun]);
61
- useEffect(() => {
62
- stateRef.current.disposed = false;
63
- return () => {
64
- stateRef.current.disposed = true;
65
- stateRef.current.pending = false;
66
- stateRef.current.abortController?.abort(disposeReason);
67
- };
68
- }, []);
69
- return {
70
- isRunning,
71
- schedule,
72
- cancel: useCallback(() => {
73
- stateRef.current.pending = false;
74
- stateRef.current.abortController?.abort();
75
- }, [])
76
- };
77
- }
78
- //#endregion
79
- export { useRunManager };
80
-
81
- //# sourceMappingURL=runManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runManager.js","names":["useCallback","useEffect","useRef","useState","useLatestRef","RunManager","Readonly","isRunning","schedule","cancel","disposeReason","Symbol","reportFinishError","error","console","useRunManager","config","onRun","signal","AbortSignal","Promise","onFinish","onCancel","onError","Error","setIsRunning","stateRef","pending","disposed","abortController","AbortController","onRunRef","onFinishRef","onCancelRef","onErrorRef","startRun","current","ac","disposeAborted","reason","queueMicrotask","aborted","resolve","catch","abort"],"sources":["../../../../src/legacy-runtime/runtime-cores/assistant-transport/runManager.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useLatestRef } from \"./useLatestRef\";\n\nexport type RunManager = Readonly<{\n isRunning: boolean;\n schedule: () => void;\n cancel: () => void;\n}>;\n\nconst disposeReason = Symbol(\"assistant-transport-dispose\");\n\nconst reportFinishError = (error: unknown) => {\n console.error(\n \"[assistant-ui] Assistant transport onFinish callback threw an error\",\n error,\n );\n};\n\nexport function useRunManager(config: {\n onRun: (signal: AbortSignal) => Promise<void>;\n onFinish?: (() => void) | undefined;\n onCancel?: (() => void) | undefined;\n onError?: ((error: Error) => void | Promise<void>) | undefined;\n}): RunManager {\n const [isRunning, setIsRunning] = useState(false);\n const stateRef = useRef({\n pending: false,\n disposed: false,\n abortController: null as AbortController | null,\n });\n const onRunRef = useLatestRef(config.onRun);\n const onFinishRef = useLatestRef(config.onFinish);\n const onCancelRef = useLatestRef(config.onCancel);\n const onErrorRef = useLatestRef(config.onError);\n\n const startRun = useCallback(() => {\n setIsRunning(true);\n stateRef.current.pending = false;\n const ac = new AbortController();\n stateRef.current.abortController = ac;\n\n // The dispose marker rides on the abort reason so a settling run detects\n // its own disposal even after an effect cycle re-arms the manager.\n const disposeAborted = () => ac.signal.reason === disposeReason;\n\n queueMicrotask(async () => {\n try {\n if (!disposeAborted()) {\n await onRunRef.current(ac.signal);\n }\n } catch (error) {\n if (!disposeAborted() && !stateRef.current.disposed) {\n stateRef.current.pending = false;\n if (ac.signal.aborted) {\n onCancelRef.current?.();\n } else {\n await onErrorRef.current?.(error as Error);\n }\n }\n } finally {\n if (!disposeAborted() && !stateRef.current.disposed) {\n try {\n void Promise.resolve(onFinishRef.current?.()).catch(\n reportFinishError,\n );\n } catch (error) {\n reportFinishError(error);\n }\n }\n if (!stateRef.current.disposed && stateRef.current.pending) {\n startRun();\n } else {\n setIsRunning(false);\n if (stateRef.current.abortController === ac) {\n stateRef.current.abortController = null;\n }\n }\n }\n });\n }, [onRunRef, onFinishRef, onErrorRef, onCancelRef]);\n\n const schedule = useCallback(() => {\n if (stateRef.current.disposed) return;\n if (stateRef.current.abortController) {\n // Coalesce multiple schedules while running into a single follow-up run.\n stateRef.current.pending = true;\n return;\n }\n startRun();\n }, [startRun]);\n\n // Strict-mode effects run setup / cleanup / setup on the same instance;\n // arming on setup undoes the cleanup's dispose.\n useEffect(() => {\n stateRef.current.disposed = false;\n return () => {\n stateRef.current.disposed = true;\n stateRef.current.pending = false;\n stateRef.current.abortController?.abort(disposeReason);\n };\n }, []);\n\n const cancel = useCallback(() => {\n stateRef.current.pending = false;\n stateRef.current.abortController?.abort();\n }, []);\n\n return {\n isRunning,\n schedule,\n cancel,\n };\n}\n"],"mappings":";;;AASA,MAAMU,gBAAgBC,OAAO,6BAA6B;AAE1D,MAAMC,qBAAqBC,UAAmB;CAC5CC,QAAQD,MACN,uEACAA,KACF;AACF;AAEA,SAAgBE,cAAcC,QAKf;CACb,MAAM,CAACT,WAAWkB,gBAAgBtB,SAAS,KAAK;CAChD,MAAMuB,WAAWxB,OAAO;EACtByB,SAAS;EACTC,UAAU;EACVC,iBAAiB;CACnB,CAAC;CACD,MAAME,WAAW3B,aAAaY,OAAOC,KAAK;CAC1C,MAAMe,cAAc5B,aAAaY,OAAOK,QAAQ;CAChD,MAAMY,cAAc7B,aAAaY,OAAOM,QAAQ;CAChD,MAAMY,aAAa9B,aAAaY,OAAOO,OAAO;CAE9C,MAAMY,WAAWnC,kBAAkB;EACjCyB,aAAa,IAAI;EACjBC,SAASU,QAAQT,UAAU;EAC3B,MAAMU,KAAK,IAAIP,gBAAgB;EAC/BJ,SAASU,QAAQP,kBAAkBQ;EAInC,MAAMC,uBAAuBD,GAAGnB,OAAOqB,WAAW7B;EAElD8B,eAAe,YAAY;GACzB,IAAI;IACF,IAAI,CAACF,eAAe,GAClB,MAAMP,SAASK,QAAQC,GAAGnB,MAAM;GAEpC,SAASL,OAAO;IACd,IAAI,CAACyB,eAAe,KAAK,CAACZ,SAASU,QAAQR,UAAU;KACnDF,SAASU,QAAQT,UAAU;KAC3B,IAAIU,GAAGnB,OAAOuB,SACZR,YAAYG,UAAU;UAEtB,MAAMF,WAAWE,UAAUvB,KAAc;IAE7C;GACF,UAAU;IACR,IAAI,CAACyB,eAAe,KAAK,CAACZ,SAASU,QAAQR,UACzC,IAAI;KACF,QAAac,QAAQV,YAAYI,UAAU,CAAC,CAAC,CAACO,MAC5C/B,iBACF;IACF,SAASC,OAAO;KACdD,kBAAkBC,KAAK;IACzB;IAEF,IAAI,CAACa,SAASU,QAAQR,YAAYF,SAASU,QAAQT,SACjDQ,SAAS;SACJ;KACLV,aAAa,KAAK;KAClB,IAAIC,SAASU,QAAQP,oBAAoBQ,IACvCX,SAASU,QAAQP,kBAAkB;IAEvC;GACF;EACF,CAAC;CACH,GAAG;EAACE;EAAUC;EAAaE;EAAYD;CAAW,CAAC;CAEnD,MAAMzB,WAAWR,kBAAkB;EACjC,IAAI0B,SAASU,QAAQR,UAAU;EAC/B,IAAIF,SAASU,QAAQP,iBAAiB;GAEpCH,SAASU,QAAQT,UAAU;GAC3B;EACF;EACAQ,SAAS;CACX,GAAG,CAACA,QAAQ,CAAC;CAIblC,gBAAgB;EACdyB,SAASU,QAAQR,WAAW;EAC5B,aAAa;GACXF,SAASU,QAAQR,WAAW;GAC5BF,SAASU,QAAQT,UAAU;GAC3BD,SAASU,QAAQP,iBAAiBe,MAAMlC,aAAa;EACvD;CACF,GAAG,CAAA,CAAE;CAOL,OAAO;EACLH;EACAC;EACAC,QARaT,kBAAkB;GAC/B0B,SAASU,QAAQT,UAAU;GAC3BD,SAASU,QAAQP,iBAAiBe,MAAM;EAC1C,GAAG,CAAA,CAKDnC;CACF;AACF"}
@@ -1,126 +0,0 @@
1
- import { UserCommands } from "../../../augmentations.js";
2
- import { AttachmentAdapter, LanguageModelConfig, LanguageModelV1CallSettings, ThreadHistoryAdapter, ThreadMessage, ToolExecutionStatus } from "@assistant-ui/core";
3
- import { ReadonlyJSONValue } from "assistant-stream/utils";
4
- import { ToolModelContentPart } from "assistant-stream";
5
- //#region src/legacy-runtime/runtime-cores/assistant-transport/types.d.ts
6
- type TextPart = {
7
- readonly type: "text";
8
- readonly text: string;
9
- };
10
- type ImagePart = {
11
- readonly type: "image";
12
- readonly image: string;
13
- };
14
- type UserMessagePart = TextPart | ImagePart;
15
- type UserMessage = {
16
- readonly role: "user";
17
- readonly parts: readonly UserMessagePart[];
18
- };
19
- type AssistantMessage = {
20
- readonly role: "assistant";
21
- readonly parts: readonly TextPart[];
22
- };
23
- type AddMessageCommand = {
24
- readonly type: "add-message";
25
- readonly message: UserMessage | AssistantMessage;
26
- readonly parentId: string | null;
27
- readonly sourceId: string | null;
28
- };
29
- type AddToolResultCommand = {
30
- readonly type: "add-tool-result";
31
- readonly toolCallId: string;
32
- readonly toolName: string;
33
- readonly result: ReadonlyJSONValue;
34
- readonly isError: boolean;
35
- readonly artifact?: ReadonlyJSONValue;
36
- readonly modelContent?: readonly ToolModelContentPart[];
37
- };
38
- type AssistantTransportCommand = AddMessageCommand | AddToolResultCommand | UserCommands;
39
- type AssistantTransportState = {
40
- readonly messages: readonly ThreadMessage[];
41
- readonly state?: ReadonlyJSONValue;
42
- readonly isRunning: boolean;
43
- };
44
- type AssistantTransportConnectionMetadata = {
45
- pendingCommands: AssistantTransportCommand[];
46
- isSending: boolean;
47
- toolStatuses: Record<string, ToolExecutionStatus>;
48
- };
49
- type AssistantTransportStateConverter<T> = (state: T, connectionMetadata: AssistantTransportConnectionMetadata) => AssistantTransportState;
50
- type CommandQueueState = {
51
- queued: AssistantTransportCommand[];
52
- inTransit: AssistantTransportCommand[];
53
- };
54
- type QueuedCommand = AssistantTransportCommand;
55
- type HeadersValue = Record<string, string> | Headers;
56
- type AssistantTransportProtocol = "data-stream" | "assistant-transport";
57
- type SendCommandsRequestBody = {
58
- commands: QueuedCommand[];
59
- /** Absent on a resume with `resumeStateApi`; the server replays from its retained snapshot. */
60
- state?: unknown;
61
- runId?: string;
62
- system: string | undefined;
63
- tools: Record<string, unknown> | undefined;
64
- callSettings: LanguageModelV1CallSettings | undefined;
65
- config: LanguageModelConfig | undefined;
66
- threadId: string | null;
67
- parentId?: string | null;
68
- [key: string]: unknown;
69
- };
70
- type AssistantTransportOptions<T> = {
71
- initialState: T;
72
- api: string;
73
- resumeApi?: string;
74
- /** Endpoint that returns the retained initial state and run ID for a resume stream. A 204 response means no run is active and the resume is skipped. */
75
- resumeStateApi?: string;
76
- protocol?: AssistantTransportProtocol;
77
- /**
78
- * When `false`, stream decoding and state reconciliation tolerate malformed
79
- * input (invalid chunks are dropped with a console log) instead of throwing.
80
- * Resume runs always decode leniently. Defaults to `true`.
81
- */
82
- strict?: boolean;
83
- converter: AssistantTransportStateConverter<T>;
84
- headers: HeadersValue | (() => Promise<HeadersValue>);
85
- body?: object | (() => Promise<object | undefined>);
86
- /**
87
- * Transform the request body before it is sent to the API.
88
- * Receives the fully assembled body and returns the (potentially transformed) body.
89
- *
90
- * @example
91
- * ```ts
92
- * prepareSendCommandsRequest: (body) => ({
93
- * ...body,
94
- * trackingId: crypto.randomUUID(),
95
- * })
96
- * ```
97
- */
98
- prepareSendCommandsRequest?: (body: SendCommandsRequestBody) => Record<string, unknown> | Promise<Record<string, unknown>>;
99
- onResponse?: (response: Response) => void;
100
- onFinish?: () => void;
101
- onError?: (error: Error, params: {
102
- commands: AssistantTransportCommand[];
103
- updateState: (updater: (state: T) => T) => void;
104
- }) => void | Promise<void>;
105
- /**
106
- * Called when commands are cancelled.
107
- *
108
- * When an error occurs, queued commands are automatically cancelled after `onError` settles.
109
- * In this case, the `error` parameter contains the error that caused the cancellation.
110
- */
111
- onCancel?: (params: {
112
- commands: AssistantTransportCommand[];
113
- updateState: (updater: (state: T) => T) => void;
114
- error?: Error;
115
- }) => void;
116
- capabilities?: {
117
- edit?: boolean;
118
- };
119
- adapters?: {
120
- attachments?: AttachmentAdapter | undefined;
121
- history?: ThreadHistoryAdapter | undefined;
122
- };
123
- };
124
- //#endregion
125
- export { AddMessageCommand, AddToolResultCommand, AssistantMessage, AssistantTransportCommand, AssistantTransportConnectionMetadata, AssistantTransportOptions, AssistantTransportProtocol, AssistantTransportState, AssistantTransportStateConverter, CommandQueueState, HeadersValue, ImagePart, QueuedCommand, SendCommandsRequestBody, TextPart, UserMessage, UserMessagePart };
126
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../../../src/legacy-runtime/runtime-cores/assistant-transport/types.ts"],"mappings":";;;;;KAaY;WACD;WACA;;KAGC;WACD;WACA;;KAGC,kBAAkB,WAAW;KAE7B;WACD;WACA,gBAAgB;;KAGf;WACD;WACA,gBAAgB;;KAIf;WACD;WACA,SAAS,cAAc;WACvB;WACA;;KAGC;WACD;WACA;WACA;WACA,QAAQ;WACR;WACA,WAAW;WACX,wBAAwB;;KAGvB,4BACR,oBACA,uBACA;KAGQ;WACD,mBAAmB;WACnB,QAAQ;WACR;;KAGC;EACV,iBAAiB;EACjB;EACA,cAAc,eAAe;;KAGnB,iCAAiC,MAC3C,OAAO,GACP,oBAAoB,yCACjB;KAGO;EACV,QAAQ;EACR,WAAW;;KAID,gBAAgB;KAKhB,eAAe,yBAAyB;KAExC;KAEA;EACV,UAAU;;EAEV;EACA;EACA;EACA,OAAO;EACP,cAAc;EACd,QAAQ;EACR;EACA;GAIC;;KAGS,0BAA0B;EACpC,cAAc;EACd;EACA;;EAEA;EACA,WAAW;;;;;;EAMX;EACA,WAAW,iCAAiC;EAC5C,SAAS,sBAAsB,QAAQ;EACvC,uBAAuB;;;;;;;;;;;;;EAavB,8BACE,MAAM,4BACH,0BAA0B,QAAQ;EACvC,cAAc,UAAU;EACxB;EACA,WACE,OAAO,OACP;IACE,UAAU;IACV,cAAc,UAAU,OAAO,MAAM;eAE7B;;;;;;;EAOZ,YAAY;IACV,UAAU;IACV,cAAc,UAAU,OAAO,MAAM;IACrC,QAAQ;;EAEV;IACE;;EAEF;IACE,cAAc;IACd,UAAU"}
@@ -1,14 +0,0 @@
1
- import { UserExternalState } from "../../../augmentations.js";
2
- import { AssistantRuntime } from "../../runtime/AssistantRuntime.js";
3
- import { AssistantTransportCommand, AssistantTransportOptions } from "./types.js";
4
- //#region src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts
5
- declare const useAssistantTransportSendCommand: () => (command: AssistantTransportCommand) => void;
6
- declare function useAssistantTransportState(): UserExternalState;
7
- declare function useAssistantTransportState<T>(selector: (state: UserExternalState) => T): T;
8
- /**
9
- * @alpha This is an experimental API that is subject to change.
10
- */
11
- declare const useAssistantTransportRuntime: <T>(options: AssistantTransportOptions<T>) => AssistantRuntime;
12
- //#endregion
13
- export { useAssistantTransportRuntime, useAssistantTransportSendCommand, useAssistantTransportState };
14
- //# sourceMappingURL=useAssistantTransportRuntime.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useAssistantTransportRuntime.d.ts","names":[],"sources":["../../../../src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.ts"],"mappings":";;;;cA8Ha,yCAGH,SAAS;iBAOH,8BAA8B;iBAC9B,2BAA2B,GACzC,WAAW,OAAO,sBAAsB,IACvC;;;;cAqUU,+BAAgC,GAC3C,SAAS,0BAA0B,OAClC"}
@@ -1,290 +0,0 @@
1
- "use client";
2
- import { useRemoteThreadListRuntime } from "../remote-thread-list/useRemoteThreadListRuntime.js";
3
- import { useExternalStoreRuntime } from "../external-store/useExternalStoreRuntime.js";
4
- import { useCommandQueue } from "./commandQueue.js";
5
- import { createReplayBoundaryStream, useReplayRenderWait } from "./replayBoundaryStream.js";
6
- import { useRunManager } from "./runManager.js";
7
- import { useConvertedState } from "./useConvertedState.js";
8
- import { useAui, useAuiState } from "@assistant-ui/store";
9
- import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
10
- import { InMemoryThreadListAdapter, createRequestHeaders } from "@assistant-ui/core";
11
- import { asAsyncIterableStream } from "assistant-stream/utils";
12
- import { useMemo, useRef, useState } from "@assistant-ui/tap/react-shim";
13
- import { AssistantMessageAccumulator, AssistantTransportDecoder, DataStreamDecoder, toToolsJSONSchema, unstable_createInitialMessage } from "assistant-stream";
14
- //#region src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.ts
15
- const convertAppendMessageToCommand = (message) => {
16
- if (message.role !== "user") throw new Error("Only user messages are supported");
17
- const parts = [];
18
- const content = [...message.content, ...message.attachments?.flatMap((a) => a.content) ?? []];
19
- for (const contentPart of content) if (contentPart.type === "text") parts.push({
20
- type: "text",
21
- text: contentPart.text
22
- });
23
- else if (contentPart.type === "image") parts.push({
24
- type: "image",
25
- image: contentPart.image
26
- });
27
- if (parts.length === 0) return null;
28
- return {
29
- type: "add-message",
30
- message: {
31
- role: "user",
32
- parts
33
- },
34
- parentId: message.parentId,
35
- sourceId: message.sourceId
36
- };
37
- };
38
- const readResumeState = async (response) => {
39
- if (response.status === 204) return null;
40
- if (!response.ok) throw new Error(`Resume state request failed with status ${response.status}: ${await response.text()}`);
41
- let value;
42
- try {
43
- value = await response.json();
44
- } catch {
45
- throw new Error("Resume state response was not valid JSON");
46
- }
47
- if (typeof value !== "object" || value === null || !("state" in value) || !("runId" in value) || typeof value.runId !== "string") throw new Error("Resume state response must contain state and runId");
48
- return {
49
- runId: value.runId,
50
- state: value.state
51
- };
52
- };
53
- const symbolAssistantTransportExtras = Symbol("assistant-transport-extras");
54
- const asAssistantTransportExtras = (extras) => {
55
- if (typeof extras !== "object" || extras == null || !(symbolAssistantTransportExtras in extras)) throw new Error("This method can only be called when you are using useAssistantTransportRuntime");
56
- return extras;
57
- };
58
- const useAssistantTransportSendCommand = () => {
59
- const $ = c(2);
60
- const aui = useAui();
61
- let t0;
62
- if ($[0] !== aui.thread) {
63
- t0 = (command) => {
64
- const extras = aui.thread.getState().extras;
65
- asAssistantTransportExtras(extras).sendCommand(command);
66
- };
67
- $[0] = aui.thread;
68
- $[1] = t0;
69
- } else t0 = $[1];
70
- return t0;
71
- };
72
- function useAssistantTransportState(selector = (t) => t) {
73
- return useAuiState((s) => selector(asAssistantTransportExtras(s.thread.extras).state));
74
- }
75
- const useAssistantTransportThreadRuntime = (options) => {
76
- const agentStateRef = useRef(options.initialState);
77
- const [, rerender] = useState(0);
78
- const resumeFlagRef = useRef(false);
79
- const [isReplaying, setIsReplaying] = useState(false);
80
- const waitForReplayRender = useReplayRenderWait();
81
- const parentIdRef = useRef(void 0);
82
- const commandQueue = useCommandQueue({ onQueue: () => runManager.schedule() });
83
- const enqueueAppendMessage = (message) => {
84
- const command = convertAppendMessageToCommand(message);
85
- if (!command) {
86
- console.warn("[assistant-ui] Skipped add-message command with no supported parts");
87
- return;
88
- }
89
- parentIdRef.current = message.parentId;
90
- commandQueue.enqueue(command, { schedule: message.startRun ?? message.role === "user" });
91
- };
92
- const threadId = useAuiState((s) => s.threadListItem.remoteId);
93
- const runManager = useRunManager({
94
- onRun: async (signal) => {
95
- const isResume = resumeFlagRef.current;
96
- resumeFlagRef.current = false;
97
- setIsReplaying(false);
98
- const commands = isResume ? [] : commandQueue.flush();
99
- if (commands.length === 0 && !isResume) return;
100
- const parentId = isResume ? void 0 : parentIdRef.current;
101
- if (!isResume) parentIdRef.current = void 0;
102
- const headers = await createRequestHeaders(options.headers);
103
- let resumeState;
104
- if (isResume && options.resumeStateApi) {
105
- const resumeStateResponse = await fetch(options.resumeStateApi, {
106
- method: "POST",
107
- headers,
108
- body: JSON.stringify({ threadId }),
109
- signal
110
- });
111
- const retained = await readResumeState(resumeStateResponse);
112
- if (retained === null) {
113
- if (commandQueue.state.queued.length > 0) runManager.schedule();
114
- return;
115
- }
116
- resumeState = retained;
117
- }
118
- const bodyValue = typeof options.body === "function" ? await options.body() : options.body;
119
- const context = runtime.thread.getModelContext();
120
- let requestBody = {
121
- commands,
122
- ...resumeState === void 0 && { state: agentStateRef.current },
123
- system: context.system,
124
- tools: context.tools ? toToolsJSONSchema(context.tools) : void 0,
125
- threadId,
126
- ...parentId !== void 0 && { parentId },
127
- callSettings: context.callSettings,
128
- config: context.config,
129
- ...context.callSettings,
130
- ...context.config,
131
- ...bodyValue ?? {}
132
- };
133
- if (options.prepareSendCommandsRequest) requestBody = await options.prepareSendCommandsRequest(requestBody);
134
- if (resumeState !== void 0) {
135
- requestBody = {
136
- ...requestBody,
137
- runId: resumeState.runId
138
- };
139
- delete requestBody["state"];
140
- }
141
- const response = await fetch(isResume ? options.resumeApi : options.api, {
142
- method: "POST",
143
- headers,
144
- body: JSON.stringify(requestBody),
145
- signal
146
- });
147
- options.onResponse?.(response);
148
- if (!response.ok) throw new Error(`Status ${response.status}: ${await response.text()}`);
149
- if (!response.body) throw new Error("Response body is null");
150
- if (resumeState !== void 0) {
151
- agentStateRef.current = resumeState.state;
152
- rerender((prev) => prev + 1);
153
- }
154
- const body = await createReplayBoundaryStream(response, {
155
- setReplaying: setIsReplaying,
156
- waitForRender: waitForReplayRender
157
- });
158
- const protocol = options.protocol ?? "data-stream";
159
- const strict = isResume ? false : options.strict ?? true;
160
- const decoder = protocol === "assistant-transport" ? new AssistantTransportDecoder({ strict }) : new DataStreamDecoder({ strict });
161
- let err;
162
- const stream = body.pipeThrough(decoder).pipeThrough(new AssistantMessageAccumulator({
163
- initialMessage: unstable_createInitialMessage({ unstable_state: agentStateRef.current ?? null }),
164
- throttle: isResume,
165
- strict,
166
- onError: (error) => {
167
- err = error;
168
- }
169
- }));
170
- let markedDelivered = false;
171
- for await (const chunk of asAsyncIterableStream(stream)) {
172
- if (chunk.metadata.unstable_state === agentStateRef.current) continue;
173
- if (!markedDelivered) {
174
- commandQueue.markDelivered();
175
- markedDelivered = true;
176
- }
177
- agentStateRef.current = chunk.metadata.unstable_state;
178
- rerender((prev) => prev + 1);
179
- }
180
- if (err) throw new Error(err);
181
- if (!markedDelivered) commandQueue.markDelivered();
182
- if (isResume && commandQueue.state.queued.length > 0) runManager.schedule();
183
- },
184
- onFinish: options.onFinish,
185
- onCancel: () => {
186
- setIsReplaying(false);
187
- const cmds = [...commandQueue.state.inTransit, ...commandQueue.state.queued];
188
- commandQueue.reset();
189
- options.onCancel?.({
190
- commands: cmds,
191
- updateState: (updater) => {
192
- agentStateRef.current = updater(agentStateRef.current);
193
- rerender((prev_0) => prev_0 + 1);
194
- }
195
- });
196
- },
197
- onError: async (error_0) => {
198
- resumeFlagRef.current = false;
199
- setIsReplaying(false);
200
- const inTransitCmds = [...commandQueue.state.inTransit];
201
- const queuedCmds = [...commandQueue.state.queued];
202
- commandQueue.reset();
203
- try {
204
- await options.onError?.(error_0, {
205
- commands: inTransitCmds,
206
- updateState: (updater) => {
207
- agentStateRef.current = updater(agentStateRef.current);
208
- rerender((prev) => prev + 1);
209
- }
210
- });
211
- } finally {
212
- options.onCancel?.({
213
- commands: queuedCmds,
214
- updateState: (updater) => {
215
- agentStateRef.current = updater(agentStateRef.current);
216
- rerender((prev) => prev + 1);
217
- },
218
- error: error_0
219
- });
220
- }
221
- }
222
- });
223
- const [toolStatuses, setToolStatuses] = useState({});
224
- const pendingCommands = useMemo(() => [...commandQueue.state.inTransit, ...commandQueue.state.queued], [commandQueue.state]);
225
- const converted = useConvertedState(options.converter, agentStateRef.current, pendingCommands, runManager.isRunning, toolStatuses);
226
- const runtime = useExternalStoreRuntime({
227
- messages: converted.messages,
228
- state: converted.state,
229
- isRunning: converted.isRunning,
230
- isLoading: isReplaying,
231
- adapters: options.adapters,
232
- unstable_enableToolInvocations: true,
233
- setToolStatuses,
234
- extras: {
235
- [symbolAssistantTransportExtras]: true,
236
- sendCommand: (command_0) => {
237
- commandQueue.enqueue(command_0);
238
- },
239
- state: agentStateRef.current
240
- },
241
- onNew: async (message_0) => enqueueAppendMessage(message_0),
242
- ...options.capabilities?.edit && { onEdit: async (message_1) => enqueueAppendMessage(message_1) },
243
- ...commandQueue.state.queued.length > 0 && { onReload: async (parentId_0) => {
244
- parentIdRef.current = parentId_0;
245
- runManager.schedule();
246
- } },
247
- onCancel: async () => {
248
- resumeFlagRef.current = false;
249
- runManager.cancel();
250
- },
251
- onResume: async () => {
252
- if (!options.resumeApi) throw new Error("Must pass resumeApi to options to resume runs");
253
- resumeFlagRef.current = true;
254
- runManager.schedule();
255
- },
256
- onAddToolResult: async (toolOptions) => {
257
- const command_1 = {
258
- type: "add-tool-result",
259
- toolCallId: toolOptions.toolCallId,
260
- result: toolOptions.result,
261
- toolName: toolOptions.toolName,
262
- isError: toolOptions.isError,
263
- ...toolOptions.artifact && { artifact: toolOptions.artifact },
264
- ...toolOptions.modelContent !== void 0 && { modelContent: toolOptions.modelContent }
265
- };
266
- commandQueue.enqueue(command_1);
267
- },
268
- onLoadExternalState: async (state) => {
269
- agentStateRef.current = state;
270
- rerender((prev_1) => prev_1 + 1);
271
- }
272
- });
273
- return runtime;
274
- };
275
- /**
276
- * @alpha This is an experimental API that is subject to change.
277
- */
278
- const useAssistantTransportRuntime = (options) => {
279
- return useRemoteThreadListRuntime({
280
- runtimeHook: function RuntimeHook() {
281
- return useAssistantTransportThreadRuntime(options);
282
- },
283
- adapter: new InMemoryThreadListAdapter(),
284
- allowNesting: true
285
- });
286
- };
287
- //#endregion
288
- export { useAssistantTransportRuntime, useAssistantTransportSendCommand, useAssistantTransportState };
289
-
290
- //# sourceMappingURL=useAssistantTransportRuntime.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useAssistantTransportRuntime.js","names":["c","_c","AppendMessage","ReadonlyJSONObject","ReadonlyJSONValue","asAsyncIterableStream","useExternalStoreRuntime","AssistantRuntime","AddToolResultOptions","useMemo","useRef","useState","AssistantMessageAccumulator","DataStreamDecoder","AssistantTransportDecoder","unstable_createInitialMessage","createInitialMessage","toToolsJSONSchema","AssistantTransportOptions","AddMessageCommand","AddToolResultCommand","UserMessagePart","QueuedCommand","AssistantTransportCommand","SendCommandsRequestBody","useCommandQueue","createReplayBoundaryStream","useReplayRenderWait","useRunManager","useConvertedState","ToolExecutionStatus","createRequestHeaders","useRemoteThreadListRuntime","InMemoryThreadListAdapter","useAui","useAuiState","UserExternalState","convertAppendMessageToCommand","message","role","Error","parts","content","attachments","flatMap","a","contentPart","type","push","text","image","length","parentId","sourceId","readResumeState","response","Response","Promise","runId","state","T","status","ok","value","json","symbolAssistantTransportExtras","Symbol","AssistantTransportExtras","sendCommand","command","asAssistantTransportExtras","extras","useAssistantTransportSendCommand","$","aui","t0","thread","getState","transportExtras","useAssistantTransportState","selector","t","s","useAssistantTransportThreadRuntime","options","agentStateRef","initialState","rerender","resumeFlagRef","isReplaying","setIsReplaying","waitForReplayRender","parentIdRef","undefined","commandQueue","onQueue","runManager","schedule","enqueueAppendMessage","console","warn","current","enqueue","startRun","threadId","threadListItem","remoteId","onRun","signal","AbortSignal","isResume","commands","flush","headers","resumeState","resumeStateApi","resumeStateResponse","fetch","method","body","JSON","stringify","retained","queued","bodyValue","context","runtime","getModelContext","requestBody","Record","system","tools","callSettings","config","prepareSendCommandsRequest","resumeApi","api","onResponse","prev","setReplaying","waitForRender","protocol","strict","decoder","err","stream","pipeThrough","initialMessage","unstable_state","throttle","onError","error","markedDelivered","chunk","metadata","markDelivered","onFinish","onCancel","cmds","inTransit","reset","updateState","updater","inTransitCmds","queuedCmds","toolStatuses","setToolStatuses","pendingCommands","converted","converter","isRunning","messages","isLoading","adapters","unstable_enableToolInvocations","onNew","capabilities","edit","onEdit","onReload","cancel","onResume","onAddToolResult","toolOptions","toolCallId","result","toolName","isError","artifact","modelContent","onLoadExternalState","useAssistantTransportRuntime","runtimeHook","RuntimeHook","adapter","allowNesting"],"sources":["../../../../src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.ts"],"sourcesContent":["\"use client\";\n\nimport type { AppendMessage } from \"@assistant-ui/core\";\nimport {\n type ReadonlyJSONObject,\n type ReadonlyJSONValue,\n asAsyncIterableStream,\n} from \"assistant-stream/utils\";\nimport { useExternalStoreRuntime } from \"../external-store/useExternalStoreRuntime\";\nimport type { AssistantRuntime } from \"../../runtime/AssistantRuntime\";\nimport type { AddToolResultOptions } from \"@assistant-ui/core\";\nimport { useMemo, useRef, useState } from \"react\";\nimport {\n AssistantMessageAccumulator,\n DataStreamDecoder,\n AssistantTransportDecoder,\n unstable_createInitialMessage as createInitialMessage,\n toToolsJSONSchema,\n} from \"assistant-stream\";\nimport type {\n AssistantTransportOptions,\n AddMessageCommand,\n AddToolResultCommand,\n UserMessagePart,\n QueuedCommand,\n AssistantTransportCommand,\n SendCommandsRequestBody,\n} from \"./types\";\nimport { useCommandQueue } from \"./commandQueue\";\nimport {\n createReplayBoundaryStream,\n useReplayRenderWait,\n} from \"./replayBoundaryStream\";\nimport { useRunManager } from \"./runManager\";\nimport { useConvertedState } from \"./useConvertedState\";\nimport type { ToolExecutionStatus } from \"@assistant-ui/core\";\nimport { createRequestHeaders } from \"@assistant-ui/core\";\nimport { useRemoteThreadListRuntime } from \"../remote-thread-list/useRemoteThreadListRuntime\";\nimport { InMemoryThreadListAdapter } from \"@assistant-ui/core\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\nimport type { UserExternalState } from \"../../../augmentations\";\n\nconst convertAppendMessageToCommand = (\n message: AppendMessage,\n): AddMessageCommand | null => {\n if (message.role !== \"user\")\n throw new Error(\"Only user messages are supported\");\n\n const parts: UserMessagePart[] = [];\n const content = [\n ...message.content,\n ...(message.attachments?.flatMap((a) => a.content) ?? []),\n ];\n for (const contentPart of content) {\n if (contentPart.type === \"text\") {\n parts.push({ type: \"text\", text: contentPart.text });\n } else if (contentPart.type === \"image\") {\n parts.push({ type: \"image\", image: contentPart.image });\n }\n }\n\n if (parts.length === 0) return null;\n\n return {\n type: \"add-message\",\n message: {\n role: \"user\",\n parts,\n },\n parentId: message.parentId,\n sourceId: message.sourceId,\n };\n};\n\nconst readResumeState = async <T>(\n response: Response,\n): Promise<{ runId: string; state: T } | null> => {\n if (response.status === 204) return null;\n if (!response.ok) {\n throw new Error(\n `Resume state request failed with status ${response.status}: ${await response.text()}`,\n );\n }\n\n let value: unknown;\n try {\n value = await response.json();\n } catch {\n throw new Error(\"Resume state response was not valid JSON\");\n }\n\n if (\n typeof value !== \"object\" ||\n value === null ||\n !(\"state\" in value) ||\n !(\"runId\" in value) ||\n typeof value.runId !== \"string\"\n ) {\n throw new Error(\"Resume state response must contain state and runId\");\n }\n\n return { runId: value.runId, state: value.state as T };\n};\n\nconst symbolAssistantTransportExtras = Symbol(\"assistant-transport-extras\");\ntype AssistantTransportExtras = {\n [symbolAssistantTransportExtras]: true;\n sendCommand: (command: AssistantTransportCommand) => void;\n state: UserExternalState;\n};\n\nconst asAssistantTransportExtras = (\n extras: unknown,\n): AssistantTransportExtras => {\n if (\n typeof extras !== \"object\" ||\n extras == null ||\n !(symbolAssistantTransportExtras in extras)\n )\n throw new Error(\n \"This method can only be called when you are using useAssistantTransportRuntime\",\n );\n\n return extras as AssistantTransportExtras;\n};\n\nexport const useAssistantTransportSendCommand = () => {\n const aui = useAui();\n\n return (command: AssistantTransportCommand) => {\n const extras = aui.thread.getState().extras;\n const transportExtras = asAssistantTransportExtras(extras);\n transportExtras.sendCommand(command);\n };\n};\n\nexport function useAssistantTransportState(): UserExternalState;\nexport function useAssistantTransportState<T>(\n selector: (state: UserExternalState) => T,\n): T;\nexport function useAssistantTransportState<T>(\n selector: (state: UserExternalState) => T = (t) => t as T,\n): T | UserExternalState {\n return useAuiState((s) =>\n selector(asAssistantTransportExtras(s.thread.extras).state),\n );\n}\n\nconst useAssistantTransportThreadRuntime = <T>(\n options: AssistantTransportOptions<T>,\n): AssistantRuntime => {\n const agentStateRef = useRef(options.initialState);\n const [, rerender] = useState(0);\n const resumeFlagRef = useRef(false);\n const [isReplaying, setIsReplaying] = useState(false);\n const waitForReplayRender = useReplayRenderWait();\n const parentIdRef = useRef<string | null | undefined>(undefined);\n const commandQueue = useCommandQueue({\n onQueue: () => runManager.schedule(),\n });\n\n const enqueueAppendMessage = (message: AppendMessage) => {\n const command = convertAppendMessageToCommand(message);\n if (!command) {\n console.warn(\n \"[assistant-ui] Skipped add-message command with no supported parts\",\n );\n return;\n }\n parentIdRef.current = message.parentId;\n commandQueue.enqueue(command, {\n schedule: message.startRun ?? message.role === \"user\",\n });\n };\n\n const threadId = useAuiState((s) => s.threadListItem.remoteId);\n\n const runManager = useRunManager({\n onRun: async (signal: AbortSignal) => {\n const isResume = resumeFlagRef.current;\n resumeFlagRef.current = false;\n setIsReplaying(false);\n const commands: QueuedCommand[] = isResume ? [] : commandQueue.flush();\n if (commands.length === 0 && !isResume) return;\n\n // The flushed batch consumes the parentId; read it alongside the flush\n // (before any awaits) so a mid-run append keeps its own value. Resume\n // runs send no commands, so they neither send nor consume it.\n const parentId = isResume ? undefined : parentIdRef.current;\n if (!isResume) parentIdRef.current = undefined;\n\n const headers = await createRequestHeaders(options.headers);\n let resumeState: { runId: string; state: T } | undefined;\n if (isResume && options.resumeStateApi) {\n const resumeStateResponse = await fetch(options.resumeStateApi, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ threadId }),\n signal,\n });\n const retained = await readResumeState<T>(resumeStateResponse);\n if (retained === null) {\n if (commandQueue.state.queued.length > 0) {\n runManager.schedule();\n }\n return;\n }\n resumeState = retained;\n }\n\n const bodyValue =\n typeof options.body === \"function\"\n ? await options.body()\n : options.body;\n const context = runtime.thread.getModelContext();\n\n let requestBody: Record<string, unknown> = {\n commands,\n ...(resumeState === undefined && { state: agentStateRef.current }),\n system: context.system,\n tools: context.tools ? toToolsJSONSchema(context.tools) : undefined,\n threadId,\n ...(parentId !== undefined && {\n parentId,\n }),\n // nested (new format, aligned with AssistantChatTransport)\n callSettings: context.callSettings,\n config: context.config,\n // @deprecated spread at top level — use nested `callSettings`/`config` instead. Will be removed in a future version.\n ...context.callSettings,\n ...context.config,\n ...(bodyValue ?? {}),\n };\n\n if (options.prepareSendCommandsRequest) {\n requestBody = await options.prepareSendCommandsRequest(\n requestBody as SendCommandsRequestBody,\n );\n }\n\n if (resumeState !== undefined) {\n // The server replays a resume from the snapshot it retained for this\n // runId. Body overrides and prepare hooks can neither substitute a\n // state nor drop the ID the server validates against.\n requestBody = { ...requestBody, runId: resumeState.runId };\n delete requestBody[\"state\"];\n }\n\n const response = await fetch(\n isResume ? options.resumeApi! : options.api,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(requestBody),\n signal,\n },\n );\n\n options.onResponse?.(response);\n\n if (!response.ok) {\n throw new Error(`Status ${response.status}: ${await response.text()}`);\n }\n\n if (!response.body) {\n throw new Error(\"Response body is null\");\n }\n\n if (resumeState !== undefined) {\n agentStateRef.current = resumeState.state;\n rerender((prev) => prev + 1);\n }\n\n const body = await createReplayBoundaryStream(response, {\n setReplaying: setIsReplaying,\n waitForRender: waitForReplayRender,\n });\n\n // Select decoder based on protocol option\n const protocol = options.protocol ?? \"data-stream\";\n // Resume replays a best-effort buffer; always reconcile leniently.\n const strict = isResume ? false : (options.strict ?? true);\n const decoder =\n protocol === \"assistant-transport\"\n ? new AssistantTransportDecoder({ strict })\n : new DataStreamDecoder({ strict });\n\n let err: string | undefined;\n const stream = body.pipeThrough(decoder).pipeThrough(\n new AssistantMessageAccumulator({\n initialMessage: createInitialMessage({\n unstable_state:\n (agentStateRef.current as ReadonlyJSONValue) ?? null,\n }),\n throttle: isResume,\n strict,\n onError: (error) => {\n err = error;\n },\n }),\n );\n\n let markedDelivered = false;\n\n for await (const chunk of asAsyncIterableStream(stream)) {\n if (chunk.metadata.unstable_state === agentStateRef.current) continue;\n\n if (!markedDelivered) {\n commandQueue.markDelivered();\n markedDelivered = true;\n }\n\n agentStateRef.current = chunk.metadata.unstable_state as T;\n rerender((prev) => prev + 1);\n }\n\n if (err) {\n throw new Error(err);\n }\n\n // A successful run confirms delivery even when no state-changing\n // chunk was observed.\n if (!markedDelivered) {\n commandQueue.markDelivered();\n }\n\n // commands that coalesced into this resume run must not starve\n if (isResume && commandQueue.state.queued.length > 0) {\n runManager.schedule();\n }\n },\n onFinish: options.onFinish,\n onCancel: () => {\n setIsReplaying(false);\n const cmds = [\n ...commandQueue.state.inTransit,\n ...commandQueue.state.queued,\n ];\n\n commandQueue.reset();\n\n options.onCancel?.({\n commands: cmds,\n updateState: (updater) => {\n agentStateRef.current = updater(agentStateRef.current);\n rerender((prev) => prev + 1);\n },\n });\n },\n onError: async (error) => {\n resumeFlagRef.current = false;\n setIsReplaying(false);\n const inTransitCmds = [...commandQueue.state.inTransit];\n const queuedCmds = [...commandQueue.state.queued];\n\n commandQueue.reset();\n\n try {\n await options.onError?.(error as Error, {\n commands: inTransitCmds,\n updateState: (updater) => {\n agentStateRef.current = updater(agentStateRef.current);\n rerender((prev) => prev + 1);\n },\n });\n } finally {\n options.onCancel?.({\n commands: queuedCmds,\n updateState: (updater) => {\n agentStateRef.current = updater(agentStateRef.current);\n rerender((prev) => prev + 1);\n },\n error: error as Error,\n });\n }\n },\n });\n\n // Tool execution status state\n const [toolStatuses, setToolStatuses] = useState<\n Record<string, ToolExecutionStatus>\n >({});\n\n // Reactive conversion of agent state + connection metadata → UI state\n const pendingCommands = useMemo(\n () => [...commandQueue.state.inTransit, ...commandQueue.state.queued],\n [commandQueue.state],\n );\n const converted = useConvertedState(\n options.converter,\n agentStateRef.current,\n pendingCommands,\n runManager.isRunning,\n toolStatuses,\n );\n\n // Create runtime\n const runtime = useExternalStoreRuntime({\n messages: converted.messages,\n state: converted.state,\n isRunning: converted.isRunning,\n isLoading: isReplaying,\n adapters: options.adapters,\n unstable_enableToolInvocations: true,\n setToolStatuses,\n extras: {\n [symbolAssistantTransportExtras]: true,\n sendCommand: (command: AssistantTransportCommand) => {\n commandQueue.enqueue(command);\n },\n state: agentStateRef.current as UserExternalState,\n } satisfies AssistantTransportExtras,\n onNew: async (message: AppendMessage): Promise<void> =>\n enqueueAppendMessage(message),\n ...(options.capabilities?.edit && {\n onEdit: async (message: AppendMessage): Promise<void> =>\n enqueueAppendMessage(message),\n }),\n ...(commandQueue.state.queued.length > 0 && {\n onReload: async (parentId: string | null) => {\n parentIdRef.current = parentId;\n runManager.schedule();\n },\n }),\n onCancel: async () => {\n resumeFlagRef.current = false;\n runManager.cancel();\n },\n onResume: async () => {\n if (!options.resumeApi)\n throw new Error(\"Must pass resumeApi to options to resume runs\");\n\n resumeFlagRef.current = true;\n runManager.schedule();\n },\n onAddToolResult: async (\n toolOptions: AddToolResultOptions,\n ): Promise<void> => {\n const command: AddToolResultCommand = {\n type: \"add-tool-result\",\n toolCallId: toolOptions.toolCallId,\n result: toolOptions.result as ReadonlyJSONObject,\n toolName: toolOptions.toolName,\n isError: toolOptions.isError,\n ...(toolOptions.artifact && { artifact: toolOptions.artifact }),\n ...(toolOptions.modelContent !== undefined && {\n modelContent: toolOptions.modelContent,\n }),\n };\n\n commandQueue.enqueue(command);\n },\n onLoadExternalState: async (state) => {\n agentStateRef.current = state as T;\n rerender((prev) => prev + 1);\n },\n });\n\n return runtime;\n};\n\n/**\n * @alpha This is an experimental API that is subject to change.\n */\nexport const useAssistantTransportRuntime = <T>(\n options: AssistantTransportOptions<T>,\n): AssistantRuntime => {\n const runtime = useRemoteThreadListRuntime({\n runtimeHook: function RuntimeHook() {\n return useAssistantTransportThreadRuntime(options);\n },\n adapter: new InMemoryThreadListAdapter(),\n allowNesting: true,\n });\n return runtime;\n};\n"],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- import { AssistantTransportCommand, AssistantTransportState, AssistantTransportStateConverter } from "./types.js";
2
- import { ToolExecutionStatus } from "@assistant-ui/core";
3
- //#region src/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.d.ts
4
- declare function useConvertedState<T>(converter: AssistantTransportStateConverter<T>, agentState: T, pendingCommands: AssistantTransportCommand[], isSending: boolean, toolStatuses: Record<string, ToolExecutionStatus>): AssistantTransportState;
5
- //#endregion
6
- export { useConvertedState };
7
- //# sourceMappingURL=useConvertedState.d.ts.map