@assistant-ui/core 0.2.12 → 0.2.15

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 (445) hide show
  1. package/dist/adapters/attachment.js.map +1 -1
  2. package/dist/adapters/directive-formatter.js.map +1 -1
  3. package/dist/adapters/speech.js.map +1 -1
  4. package/dist/adapters/thread-history.d.ts +3 -1
  5. package/dist/adapters/thread-history.d.ts.map +1 -1
  6. package/dist/adapters/voice.js.map +1 -1
  7. package/dist/index.d.ts +3 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/internal/duplicate-detection.js.map +1 -1
  10. package/dist/internal.d.ts +2 -1
  11. package/dist/internal.js +2 -1
  12. package/dist/model-context/frame/host.js.map +1 -1
  13. package/dist/model-context/frame/provider.js.map +1 -1
  14. package/dist/model-context/frame/types.js.map +1 -1
  15. package/dist/model-context/registry.js.map +1 -1
  16. package/dist/model-context/tool.js.map +1 -1
  17. package/dist/model-context/types.d.ts +1 -0
  18. package/dist/model-context/types.d.ts.map +1 -1
  19. package/dist/model-context/types.js.map +1 -1
  20. package/dist/react/AssistantProvider.js +7 -1
  21. package/dist/react/AssistantProvider.js.map +1 -1
  22. package/dist/react/AssistantRuntimeProvider.js +18 -6
  23. package/dist/react/AssistantRuntimeProvider.js.map +1 -1
  24. package/dist/react/RuntimeAdapter.d.ts +1 -1
  25. package/dist/react/RuntimeAdapter.d.ts.map +1 -1
  26. package/dist/react/RuntimeAdapter.js +35 -6
  27. package/dist/react/RuntimeAdapter.js.map +1 -1
  28. package/dist/react/adapters/LocalStorageThreadListAdapter.js +29 -7
  29. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  30. package/dist/react/adapters/TitleGenerationAdapter.js.map +1 -1
  31. package/dist/react/client/DataRenderers.d.ts +1 -8
  32. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  33. package/dist/react/client/DataRenderers.js +56 -36
  34. package/dist/react/client/DataRenderers.js.map +1 -1
  35. package/dist/react/client/Interactables.d.ts +1 -1
  36. package/dist/react/client/Interactables.d.ts.map +1 -1
  37. package/dist/react/client/Interactables.js +71 -70
  38. package/dist/react/client/Interactables.js.map +1 -1
  39. package/dist/react/client/Tools.d.ts +2 -13
  40. package/dist/react/client/Tools.d.ts.map +1 -1
  41. package/dist/react/client/Tools.js +121 -57
  42. package/dist/react/client/Tools.js.map +1 -1
  43. package/dist/react/client/interactable-model-context.js.map +1 -1
  44. package/dist/react/model-context/define-mcp-toolkit.js.map +1 -1
  45. package/dist/react/model-context/define-toolkit.js.map +1 -1
  46. package/dist/react/model-context/external-tool.js.map +1 -1
  47. package/dist/react/model-context/human-tool.js.map +1 -1
  48. package/dist/react/model-context/makeAssistantDataUI.js.map +1 -1
  49. package/dist/react/model-context/makeAssistantTool.js.map +1 -1
  50. package/dist/react/model-context/makeAssistantToolUI.js.map +1 -1
  51. package/dist/react/model-context/provider-tool.js.map +1 -1
  52. package/dist/react/model-context/stub-tool.js.map +1 -1
  53. package/dist/react/model-context/toolbox.js.map +1 -1
  54. package/dist/react/model-context/useAssistantContext.js.map +1 -1
  55. package/dist/react/model-context/useAssistantDataUI.js +27 -8
  56. package/dist/react/model-context/useAssistantDataUI.js.map +1 -1
  57. package/dist/react/model-context/useAssistantInstructions.js +33 -10
  58. package/dist/react/model-context/useAssistantInstructions.js.map +1 -1
  59. package/dist/react/model-context/useAssistantInteractable.js.map +1 -1
  60. package/dist/react/model-context/useAssistantTool.js +59 -17
  61. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  62. package/dist/react/model-context/useAssistantToolUI.js +30 -9
  63. package/dist/react/model-context/useAssistantToolUI.js.map +1 -1
  64. package/dist/react/model-context/useAuiToolOverrides.js.map +1 -1
  65. package/dist/react/model-context/useInlineRender.js +35 -8
  66. package/dist/react/model-context/useInlineRender.js.map +1 -1
  67. package/dist/react/model-context/useInteractableState.js +65 -19
  68. package/dist/react/model-context/useInteractableState.js.map +1 -1
  69. package/dist/react/model-context/useToolArgsStatus.js +42 -14
  70. package/dist/react/model-context/useToolArgsStatus.js.map +1 -1
  71. package/dist/react/primitive-hooks/useActionBarCopy.js +59 -22
  72. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  73. package/dist/react/primitive-hooks/useActionBarEdit.js +25 -7
  74. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  75. package/dist/react/primitive-hooks/useActionBarFeedback.js +49 -13
  76. package/dist/react/primitive-hooks/useActionBarFeedback.js.map +1 -1
  77. package/dist/react/primitive-hooks/useActionBarReload.js +25 -7
  78. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  79. package/dist/react/primitive-hooks/useActionBarSpeak.js +28 -9
  80. package/dist/react/primitive-hooks/useActionBarSpeak.js.map +1 -1
  81. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js +25 -7
  82. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js.map +1 -1
  83. package/dist/react/primitive-hooks/useBranchPickerNext.js +27 -11
  84. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  85. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +27 -11
  86. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  87. package/dist/react/primitive-hooks/useComposerAddAttachment.js +24 -8
  88. package/dist/react/primitive-hooks/useComposerAddAttachment.js.map +1 -1
  89. package/dist/react/primitive-hooks/useComposerCancel.js +25 -7
  90. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  91. package/dist/react/primitive-hooks/useComposerDictate.js +25 -7
  92. package/dist/react/primitive-hooks/useComposerDictate.js.map +1 -1
  93. package/dist/react/primitive-hooks/useComposerSend.js +25 -7
  94. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  95. package/dist/react/primitive-hooks/useEditComposerCancel.js +18 -4
  96. package/dist/react/primitive-hooks/useEditComposerCancel.js.map +1 -1
  97. package/dist/react/primitive-hooks/useEditComposerSend.js +25 -7
  98. package/dist/react/primitive-hooks/useEditComposerSend.js.map +1 -1
  99. package/dist/react/primitive-hooks/useMessageBranching.js +41 -9
  100. package/dist/react/primitive-hooks/useMessageBranching.js.map +1 -1
  101. package/dist/react/primitive-hooks/useMessageError.js +4 -1
  102. package/dist/react/primitive-hooks/useMessageError.js.map +1 -1
  103. package/dist/react/primitive-hooks/useMessageReload.js +25 -7
  104. package/dist/react/primitive-hooks/useMessageReload.js.map +1 -1
  105. package/dist/react/primitive-hooks/useSuggestionTrigger.js +31 -13
  106. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  107. package/dist/react/primitive-hooks/useThreadIsEmpty.js +4 -1
  108. package/dist/react/primitive-hooks/useThreadIsEmpty.js.map +1 -1
  109. package/dist/react/primitive-hooks/useThreadIsRunning.js +4 -1
  110. package/dist/react/primitive-hooks/useThreadIsRunning.js.map +1 -1
  111. package/dist/react/primitive-hooks/useThreadListItemArchive.js +18 -4
  112. package/dist/react/primitive-hooks/useThreadListItemArchive.js.map +1 -1
  113. package/dist/react/primitive-hooks/useThreadListItemDelete.js +18 -4
  114. package/dist/react/primitive-hooks/useThreadListItemDelete.js.map +1 -1
  115. package/dist/react/primitive-hooks/useThreadListItemTrigger.js +18 -4
  116. package/dist/react/primitive-hooks/useThreadListItemTrigger.js.map +1 -1
  117. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js +18 -4
  118. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js.map +1 -1
  119. package/dist/react/primitive-hooks/useThreadListLoadMore.js +25 -7
  120. package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
  121. package/dist/react/primitive-hooks/useThreadListNew.js +18 -4
  122. package/dist/react/primitive-hooks/useThreadListNew.js.map +1 -1
  123. package/dist/react/primitive-hooks/useThreadMessages.js +4 -1
  124. package/dist/react/primitive-hooks/useThreadMessages.js.map +1 -1
  125. package/dist/react/primitive-hooks/useVoice.js +63 -13
  126. package/dist/react/primitive-hooks/useVoice.js.map +1 -1
  127. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js +42 -7
  128. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js.map +1 -1
  129. package/dist/react/primitives/composer/ComposerAttachments.js +67 -16
  130. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  131. package/dist/react/primitives/composer/ComposerIf.js +30 -9
  132. package/dist/react/primitives/composer/ComposerIf.js.map +1 -1
  133. package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
  134. package/dist/react/primitives/generativeUI/GenerativeUI.js +55 -13
  135. package/dist/react/primitives/generativeUI/GenerativeUI.js.map +1 -1
  136. package/dist/react/primitives/message/MessageAttachments.js +68 -16
  137. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  138. package/dist/react/primitives/message/MessageGroupedParts.d.ts +3 -2
  139. package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
  140. package/dist/react/primitives/message/MessageGroupedParts.js +6 -6
  141. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  142. package/dist/react/primitives/message/MessageParts.d.ts +28 -1
  143. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  144. package/dist/react/primitives/message/MessageParts.js +665 -163
  145. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  146. package/dist/react/primitives/message/MessageQuote.js +18 -2
  147. package/dist/react/primitives/message/MessageQuote.js.map +1 -1
  148. package/dist/react/primitives/messagePart/MessagePartInProgress.js +6 -2
  149. package/dist/react/primitives/messagePart/MessagePartInProgress.js.map +1 -1
  150. package/dist/react/primitives/part/PartMessages.js +46 -14
  151. package/dist/react/primitives/part/PartMessages.js.map +1 -1
  152. package/dist/react/primitives/thread/ThreadMessages.js +67 -10
  153. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  154. package/dist/react/primitives/thread/ThreadSuggestions.js +50 -10
  155. package/dist/react/primitives/thread/ThreadSuggestions.js.map +1 -1
  156. package/dist/react/primitives/threadList/ThreadListItems.js +55 -14
  157. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  158. package/dist/react/primitives/threadListItem/ThreadListItemTitle.js +15 -2
  159. package/dist/react/primitives/threadListItem/ThreadListItemTitle.js.map +1 -1
  160. package/dist/react/providers/AttachmentByIndexProvider.js +57 -12
  161. package/dist/react/providers/AttachmentByIndexProvider.js.map +1 -1
  162. package/dist/react/providers/ChainOfThoughtByIndicesProvider.js +33 -11
  163. package/dist/react/providers/ChainOfThoughtByIndicesProvider.js.map +1 -1
  164. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js +29 -6
  165. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js.map +1 -1
  166. package/dist/react/providers/MessageByIndexProvider.js +49 -19
  167. package/dist/react/providers/MessageByIndexProvider.js.map +1 -1
  168. package/dist/react/providers/PartByIndexProvider.js +29 -6
  169. package/dist/react/providers/PartByIndexProvider.js.map +1 -1
  170. package/dist/react/providers/QueueItemByIndexProvider.js +29 -6
  171. package/dist/react/providers/QueueItemByIndexProvider.js.map +1 -1
  172. package/dist/react/providers/ReadonlyThreadProvider.js +83 -28
  173. package/dist/react/providers/ReadonlyThreadProvider.js.map +1 -1
  174. package/dist/react/providers/SuggestionByIndexProvider.js +29 -6
  175. package/dist/react/providers/SuggestionByIndexProvider.js.map +1 -1
  176. package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
  177. package/dist/react/providers/TextMessagePartProvider.js +75 -26
  178. package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
  179. package/dist/react/providers/ThreadListItemByIndexProvider.js +30 -6
  180. package/dist/react/providers/ThreadListItemByIndexProvider.js.map +1 -1
  181. package/dist/react/providers/ThreadListItemRuntimeProvider.js +28 -5
  182. package/dist/react/providers/ThreadListItemRuntimeProvider.js.map +1 -1
  183. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +2 -0
  184. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  185. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +19 -4
  186. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  187. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +2 -0
  188. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  189. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +1 -0
  190. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  191. package/dist/react/runtimes/RuntimeAdapterProvider.js +27 -10
  192. package/dist/react/runtimes/RuntimeAdapterProvider.js.map +1 -1
  193. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  194. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +16 -1
  195. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  196. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  197. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  198. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  199. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +19 -17
  200. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  201. package/dist/react/runtimes/createMessageConverter.js.map +1 -1
  202. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  203. package/dist/react/runtimes/external-message-converter.js +67 -30
  204. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  205. package/dist/react/runtimes/useExternalStoreRuntime.js +44 -10
  206. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  207. package/dist/react/runtimes/useExternalStoreSharedOptions.js +17 -12
  208. package/dist/react/runtimes/useExternalStoreSharedOptions.js.map +1 -1
  209. package/dist/react/runtimes/useLocalRuntime.js.map +1 -1
  210. package/dist/react/runtimes/useRemoteThreadListRuntime.js +34 -6
  211. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  212. package/dist/react/types/MessagePartComponentTypes.d.ts +5 -6
  213. package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
  214. package/dist/react/utils/getMessageQuote.js.map +1 -1
  215. package/dist/react/utils/groupParts.d.ts +13 -1
  216. package/dist/react/utils/groupParts.d.ts.map +1 -1
  217. package/dist/react/utils/groupParts.js +17 -5
  218. package/dist/react/utils/groupParts.js.map +1 -1
  219. package/dist/runtime/api/assistant-runtime.js.map +1 -1
  220. package/dist/runtime/api/attachment-runtime.js.map +1 -1
  221. package/dist/runtime/api/bindings.d.ts +1 -0
  222. package/dist/runtime/api/bindings.d.ts.map +1 -1
  223. package/dist/runtime/api/composer-runtime.js.map +1 -1
  224. package/dist/runtime/api/message-part-runtime.d.ts +3 -9
  225. package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
  226. package/dist/runtime/api/message-part-runtime.js +3 -6
  227. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  228. package/dist/runtime/api/message-runtime.d.ts +2 -0
  229. package/dist/runtime/api/message-runtime.d.ts.map +1 -1
  230. package/dist/runtime/api/message-runtime.js +5 -0
  231. package/dist/runtime/api/message-runtime.js.map +1 -1
  232. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  233. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  234. package/dist/runtime/api/thread-list-runtime.js +1 -0
  235. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  236. package/dist/runtime/api/thread-runtime.d.ts +3 -0
  237. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  238. package/dist/runtime/api/thread-runtime.js +4 -0
  239. package/dist/runtime/api/thread-runtime.js.map +1 -1
  240. package/dist/runtime/base/base-assistant-runtime-core.js.map +1 -1
  241. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  242. package/dist/runtime/base/base-thread-runtime-core.d.ts +1 -0
  243. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  244. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  245. package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
  246. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  247. package/dist/runtime/branch/external-thread-branch-adapter.d.ts +30 -0
  248. package/dist/runtime/branch/external-thread-branch-adapter.d.ts.map +1 -0
  249. package/dist/runtime/branch/external-thread-branch-adapter.js +0 -0
  250. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +1 -0
  251. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  252. package/dist/runtime/interfaces/thread-runtime-core.d.ts +4 -1
  253. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  254. package/dist/runtime/queue/message-queue.js.map +1 -1
  255. package/dist/runtime/utils/auto-status.js.map +1 -1
  256. package/dist/runtime/utils/external-store-message.js.map +1 -1
  257. package/dist/runtime/utils/message-repository.js.map +1 -1
  258. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts +15 -0
  259. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts.map +1 -0
  260. package/dist/runtime/utils/resolveToolApprovalResponse.js +35 -0
  261. package/dist/runtime/utils/resolveToolApprovalResponse.js.map +1 -0
  262. package/dist/runtime/utils/thread-message-like.d.ts +5 -1
  263. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  264. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  265. package/dist/runtimes/assistant-transport/utils.js.map +1 -1
  266. package/dist/runtimes/external-store/external-store-adapter.d.ts +1 -0
  267. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  268. package/dist/runtimes/external-store/external-store-runtime-core.js.map +1 -1
  269. package/dist/runtimes/external-store/external-store-shared-options.js.map +1 -1
  270. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  271. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +1 -0
  272. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  273. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +13 -0
  274. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  275. package/dist/runtimes/external-store/thread-message-converter.js.map +1 -1
  276. package/dist/runtimes/local/local-runtime-core.js.map +1 -1
  277. package/dist/runtimes/local/local-runtime-options.d.ts +1 -1
  278. package/dist/runtimes/local/local-thread-list-runtime-core.js.map +1 -1
  279. package/dist/runtimes/local/local-thread-runtime-core.d.ts +9 -1
  280. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  281. package/dist/runtimes/local/local-thread-runtime-core.js +65 -5
  282. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  283. package/dist/runtimes/local/should-continue.js +4 -2
  284. package/dist/runtimes/local/should-continue.js.map +1 -1
  285. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +2 -0
  286. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  287. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +4 -0
  288. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  289. package/dist/runtimes/remote-thread-list/adapter/in-memory.js.map +1 -1
  290. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  291. package/dist/runtimes/remote-thread-list/empty-thread-core.js +4 -0
  292. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  293. package/dist/runtimes/remote-thread-list/optimistic-state.js.map +1 -1
  294. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +1 -0
  295. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  296. package/dist/runtimes/remote-thread-list/remote-thread-state.js +1 -0
  297. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  298. package/dist/runtimes/remote-thread-list/types.d.ts +1 -0
  299. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  300. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  301. package/dist/store/clients/chain-of-thought-client.d.ts +2 -7
  302. package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
  303. package/dist/store/clients/chain-of-thought-client.js +39 -20
  304. package/dist/store/clients/chain-of-thought-client.js.map +1 -1
  305. package/dist/store/clients/model-context-client.d.ts +1 -1
  306. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  307. package/dist/store/clients/model-context-client.js +67 -16
  308. package/dist/store/clients/model-context-client.js.map +1 -1
  309. package/dist/store/clients/no-op-composer-client.d.ts +2 -4
  310. package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
  311. package/dist/store/clients/no-op-composer-client.js +96 -54
  312. package/dist/store/clients/no-op-composer-client.js.map +1 -1
  313. package/dist/store/clients/runtime-adapter.d.ts +1 -3
  314. package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
  315. package/dist/store/clients/runtime-adapter.js +2 -15
  316. package/dist/store/clients/runtime-adapter.js.map +1 -1
  317. package/dist/store/clients/suggestions.d.ts +1 -4
  318. package/dist/store/clients/suggestions.d.ts.map +1 -1
  319. package/dist/store/clients/suggestions.js +63 -23
  320. package/dist/store/clients/suggestions.js.map +1 -1
  321. package/dist/store/clients/thread-message-client.d.ts +1 -1
  322. package/dist/store/clients/thread-message-client.d.ts.map +1 -1
  323. package/dist/store/clients/thread-message-client.js +184 -73
  324. package/dist/store/clients/thread-message-client.js.map +1 -1
  325. package/dist/store/internal.d.ts +2 -2
  326. package/dist/store/internal.js +2 -2
  327. package/dist/store/runtime-clients/attachment-runtime-client.d.ts +2 -4
  328. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  329. package/dist/store/runtime-clients/attachment-runtime-client.js +31 -7
  330. package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
  331. package/dist/store/runtime-clients/composer-runtime-client.d.ts +2 -10
  332. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  333. package/dist/store/runtime-clients/composer-runtime-client.js +195 -72
  334. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  335. package/dist/store/runtime-clients/liveRef.d.ts +7 -0
  336. package/dist/store/runtime-clients/liveRef.d.ts.map +1 -0
  337. package/dist/store/runtime-clients/liveRef.js +8 -0
  338. package/dist/store/runtime-clients/liveRef.js.map +1 -0
  339. package/dist/store/runtime-clients/message-part-runtime-client.d.ts +2 -4
  340. package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
  341. package/dist/store/runtime-clients/message-part-runtime-client.js +49 -9
  342. package/dist/store/runtime-clients/message-part-runtime-client.js.map +1 -1
  343. package/dist/store/runtime-clients/message-runtime-client.d.ts +2 -7
  344. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  345. package/dist/store/runtime-clients/message-runtime-client.js +220 -54
  346. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  347. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts +2 -4
  348. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  349. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +71 -26
  350. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  351. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts +2 -5
  352. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  353. package/dist/store/runtime-clients/thread-list-runtime-client.js +141 -36
  354. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  355. package/dist/store/runtime-clients/thread-runtime-client.d.ts +2 -4
  356. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  357. package/dist/store/runtime-clients/thread-runtime-client.js +196 -72
  358. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  359. package/dist/store/runtime-clients/useSubscribable.js +2 -9
  360. package/dist/store/runtime-clients/useSubscribable.js.map +1 -1
  361. package/dist/store/scopes/message.d.ts +1 -0
  362. package/dist/store/scopes/message.d.ts.map +1 -1
  363. package/dist/store/scopes/part.d.ts +5 -6
  364. package/dist/store/scopes/part.d.ts.map +1 -1
  365. package/dist/store/scopes/queue-item.js.map +1 -1
  366. package/dist/store/scopes/thread-list-item.d.ts +1 -0
  367. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  368. package/dist/store/scopes/thread.d.ts +1 -0
  369. package/dist/store/scopes/thread.d.ts.map +1 -1
  370. package/dist/subscribable/subscribable.js.map +1 -1
  371. package/dist/tests/remote-thread-list-test-helpers.js.map +1 -1
  372. package/dist/types/message.d.ts +38 -5
  373. package/dist/types/message.d.ts.map +1 -1
  374. package/dist/types/message.js.map +1 -1
  375. package/dist/utils/composite-context-provider.js.map +1 -1
  376. package/dist/utils/id.js.map +1 -1
  377. package/dist/utils/json/is-json-equal.js.map +1 -1
  378. package/dist/utils/json/is-json.js.map +1 -1
  379. package/dist/utils/text.js.map +1 -1
  380. package/package.json +6 -6
  381. package/src/adapters/thread-history.ts +2 -0
  382. package/src/index.ts +5 -0
  383. package/src/internal.ts +1 -0
  384. package/src/model-context/types.ts +1 -0
  385. package/src/react/AssistantProvider.tsx +10 -1
  386. package/src/react/RuntimeAdapter.ts +25 -8
  387. package/src/react/client/DataRenderers.ts +42 -45
  388. package/src/react/client/Interactables.ts +261 -261
  389. package/src/react/client/Tools.ts +9 -9
  390. package/src/react/primitives/message/MessageGroupedParts.tsx +19 -7
  391. package/src/react/primitives/message/MessageParts.tsx +64 -13
  392. package/src/react/providers/TextMessagePartProvider.tsx +5 -3
  393. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +1 -0
  394. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +11 -0
  395. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +6 -0
  396. package/src/react/runtimes/external-message-converter.ts +3 -1
  397. package/src/react/types/MessagePartComponentTypes.ts +5 -5
  398. package/src/react/utils/groupParts.ts +27 -0
  399. package/src/runtime/api/bindings.ts +1 -0
  400. package/src/runtime/api/message-part-runtime.ts +14 -11
  401. package/src/runtime/api/message-runtime.ts +7 -0
  402. package/src/runtime/api/thread-list-runtime.ts +1 -0
  403. package/src/runtime/api/thread-runtime.ts +7 -0
  404. package/src/runtime/base/base-thread-runtime-core.ts +1 -0
  405. package/src/runtime/branch/external-thread-branch-adapter.ts +26 -0
  406. package/src/runtime/interfaces/thread-list-runtime-core.ts +1 -0
  407. package/src/runtime/interfaces/thread-runtime-core.ts +4 -0
  408. package/src/runtime/utils/resolveToolApprovalResponse.test.ts +91 -0
  409. package/src/runtime/utils/resolveToolApprovalResponse.ts +55 -0
  410. package/src/runtime/utils/thread-message-like.ts +10 -1
  411. package/src/runtimes/external-store/external-store-adapter.ts +1 -0
  412. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +24 -0
  413. package/src/runtimes/local/local-runtime-options.ts +1 -1
  414. package/src/runtimes/local/local-thread-runtime-core.test.ts +370 -0
  415. package/src/runtimes/local/local-thread-runtime-core.ts +113 -7
  416. package/src/runtimes/local/should-continue.ts +24 -13
  417. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +5 -0
  418. package/src/runtimes/remote-thread-list/empty-thread-core.ts +5 -0
  419. package/src/runtimes/remote-thread-list/remote-thread-state.ts +2 -0
  420. package/src/runtimes/remote-thread-list/types.ts +1 -0
  421. package/src/store/clients/chain-of-thought-client.ts +5 -3
  422. package/src/store/clients/model-context-client.test.ts +5 -4
  423. package/src/store/clients/model-context-client.ts +21 -21
  424. package/src/store/clients/no-op-composer-client.ts +5 -3
  425. package/src/store/clients/runtime-adapter.ts +0 -24
  426. package/src/store/clients/suggestions.ts +12 -23
  427. package/src/store/clients/thread-message-client.ts +42 -40
  428. package/src/store/internal.ts +1 -4
  429. package/src/store/runtime-clients/attachment-runtime-client.ts +14 -14
  430. package/src/store/runtime-clients/composer-runtime-client.ts +48 -45
  431. package/src/store/runtime-clients/liveRef.ts +5 -0
  432. package/src/store/runtime-clients/message-part-runtime-client.ts +5 -3
  433. package/src/store/runtime-clients/message-runtime-client.ts +42 -40
  434. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +5 -3
  435. package/src/store/runtime-clients/thread-list-runtime-client.ts +13 -11
  436. package/src/store/runtime-clients/thread-runtime-client.ts +20 -16
  437. package/src/store/runtime-clients/useSubscribable.ts +2 -10
  438. package/src/store/scopes/message.ts +1 -0
  439. package/src/store/scopes/part.ts +5 -2
  440. package/src/store/scopes/thread-list-item.ts +1 -0
  441. package/src/store/scopes/thread.ts +1 -0
  442. package/src/tests/external-store-thread-runtime-core.test.ts +57 -0
  443. package/src/tests/groupMessageParts.test.ts +84 -0
  444. package/src/tests/groupParts.test.ts +55 -0
  445. package/src/types/message.ts +45 -3
@@ -1 +1 @@
1
- {"version":3,"file":"base-composer-runtime-core.js","names":[],"sources":["../../../src/runtime/base/base-composer-runtime-core.ts"],"sourcesContent":["import type {\n Attachment,\n CompleteAttachment,\n CreateAttachment,\n PendingAttachment,\n} from \"../../types/attachment\";\nimport type { MessageRole, AppendMessage } from \"../../types/message\";\nimport type { QuoteInfo } from \"../../types/quote\";\nimport type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { RunConfig } from \"../../types/message\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport {\n type AttachmentAdapter,\n fileMatchesAccept,\n} from \"../../adapters/attachment\";\nimport type {\n AttachmentAddErrorReason,\n ComposerRuntimeCore,\n ComposerRuntimeEventCallback,\n ComposerRuntimeEventPayload,\n ComposerRuntimeEventType,\n DictationState,\n SendOptions,\n} from \"../interfaces/composer-runtime-core\";\nimport type { DictationAdapter } from \"../../adapters/speech\";\nimport {\n EMPTY_QUEUE_ITEMS,\n type QueueItemState,\n} from \"../../store/scopes/queue-item\";\nimport { generateId } from \"../../utils/id\";\n\nconst isAttachmentComplete = (a: Attachment): a is CompleteAttachment =>\n a.status.type === \"complete\";\n\nexport abstract class BaseComposerRuntimeCore\n extends BaseSubscribable\n implements ComposerRuntimeCore\n{\n public readonly isEditing = true;\n\n protected abstract getAttachmentAdapter(): AttachmentAdapter | undefined;\n protected abstract getDictationAdapter(): DictationAdapter | undefined;\n\n public get attachmentAccept(): string {\n return this.getAttachmentAdapter()?.accept ?? \"*\";\n }\n\n private _attachments: readonly Attachment[] = [];\n public get attachments() {\n return this._attachments;\n }\n\n protected setAttachments(value: readonly Attachment[]) {\n this._attachments = value;\n this._notifySubscribers();\n }\n\n public abstract get canCancel(): boolean;\n public abstract get canSend(): boolean;\n\n public get isEmpty() {\n return !this.text.trim() && !this.attachments.length;\n }\n\n private _text = \"\";\n\n get text() {\n return this._text;\n }\n\n private _role: MessageRole = \"user\";\n\n get role() {\n return this._role;\n }\n\n private _runConfig: RunConfig = {};\n\n get runConfig() {\n return this._runConfig;\n }\n\n private _quote: QuoteInfo | undefined = undefined;\n\n get quote() {\n return this._quote;\n }\n\n public setQuote(quote: QuoteInfo | undefined) {\n if (this._quote === quote) return;\n\n this._quote = quote;\n this._notifySubscribers();\n }\n\n public setText(value: string) {\n if (this._text === value) return;\n\n this._text = value;\n if (this._dictation) {\n this._dictationBaseText = value;\n this._currentInterimText = \"\";\n const { status, inputDisabled } = this._dictation;\n this._dictation = inputDisabled ? { status, inputDisabled } : { status };\n }\n this._notifySubscribers();\n }\n\n public setRole(role: MessageRole) {\n if (this._role === role) return;\n\n this._role = role;\n this._notifySubscribers();\n }\n\n public setRunConfig(runConfig: RunConfig) {\n if (this._runConfig === runConfig) return;\n\n this._runConfig = runConfig;\n this._notifySubscribers();\n }\n\n private _emptyTextAndAttachments() {\n this._attachments = [];\n this._text = \"\";\n this._notifySubscribers();\n }\n\n private async _onClearAttachments() {\n const adapter = this.getAttachmentAdapter();\n if (adapter) {\n const pending = this._attachments.filter((a) => !isAttachmentComplete(a));\n await Promise.all(pending.map((a) => adapter.remove(a)));\n }\n }\n\n public async reset() {\n if (\n this._attachments.length === 0 &&\n this._text === \"\" &&\n this._role === \"user\" &&\n Object.keys(this._runConfig).length === 0 &&\n this._quote === undefined\n ) {\n return;\n }\n\n this._role = \"user\";\n this._runConfig = {};\n this._quote = undefined;\n\n const task = this._onClearAttachments();\n this._emptyTextAndAttachments();\n await task;\n }\n\n public async clearAttachments() {\n const task = this._onClearAttachments();\n this.setAttachments([]);\n\n await task;\n }\n\n public async send(options?: SendOptions) {\n if (!this.canSend) return;\n\n if (this._dictationSession) {\n this._dictationSession.cancel();\n this._cleanupDictation();\n }\n\n const adapter = this.getAttachmentAdapter();\n const attachments =\n this.attachments.length > 0\n ? Promise.all(\n this.attachments.map(async (a) => {\n if (isAttachmentComplete(a)) return a;\n if (!adapter) throw new Error(\"Attachments are not supported\");\n const result = await adapter.send(a);\n return result as CompleteAttachment;\n }),\n )\n : [];\n\n const text = this.text;\n const quote = this._quote;\n this._quote = undefined;\n this._emptyTextAndAttachments();\n\n const message: Omit<AppendMessage, \"parentId\" | \"sourceId\"> = {\n createdAt: new Date(),\n role: this.role,\n content: text ? [{ type: \"text\", text }] : [],\n attachments: await attachments,\n runConfig: this.runConfig,\n metadata: { custom: { ...(quote ? { quote } : {}) } },\n };\n\n this.handleSend(message, options);\n this._notifyEventSubscribers(\"send\", {});\n }\n\n public cancel() {\n this.handleCancel();\n }\n\n public get queue(): readonly QueueItemState[] {\n return EMPTY_QUEUE_ITEMS;\n }\n\n public steerQueueItem(_queueItemId: string): void {}\n public removeQueueItem(_queueItemId: string): void {}\n\n protected abstract handleSend(\n message: Omit<AppendMessage, \"parentId\" | \"sourceId\">,\n options?: SendOptions,\n ): void;\n protected abstract handleCancel(): void;\n\n async addAttachment(fileOrAttachment: File | CreateAttachment) {\n if (!(fileOrAttachment instanceof File)) {\n const adapter = this.getAttachmentAdapter();\n if (\n adapter &&\n !fileMatchesAccept(\n {\n name: fileOrAttachment.name,\n type: fileOrAttachment.contentType ?? \"\",\n },\n adapter.accept,\n )\n ) {\n const message = `File type ${fileOrAttachment.contentType || \"unknown\"} is not accepted. Accepted types: ${adapter.accept}`;\n const err = new Error(message);\n this._safeEmitAttachmentAddError(\n \"not-accepted\",\n message,\n undefined,\n err,\n );\n throw err;\n }\n\n const a: CompleteAttachment = {\n id: fileOrAttachment.id ?? generateId(),\n type: fileOrAttachment.type ?? \"document\",\n name: fileOrAttachment.name,\n contentType: fileOrAttachment.contentType,\n content: fileOrAttachment.content,\n status: { type: \"complete\" },\n };\n this._attachments = [...this._attachments, a];\n this._notifySubscribers();\n this._notifyEventSubscribers(\"attachmentAdd\", {});\n return;\n }\n\n const upsertAttachment = (a: PendingAttachment) => {\n const idx = this._attachments.findIndex(\n (attachment) => attachment.id === a.id,\n );\n if (idx !== -1)\n this._attachments = [\n ...this._attachments.slice(0, idx),\n a,\n ...this._attachments.slice(idx + 1),\n ];\n else {\n this._attachments = [...this._attachments, a];\n }\n\n this._notifySubscribers();\n };\n\n const adapter = this.getAttachmentAdapter();\n if (!adapter) {\n const message = \"Attachments are not supported\";\n const err = new Error(message);\n this._safeEmitAttachmentAddError(\"no-adapter\", message, undefined, err);\n throw err;\n }\n\n if (\n !fileMatchesAccept(\n { name: fileOrAttachment.name, type: fileOrAttachment.type },\n adapter.accept,\n )\n ) {\n const message = `File type ${fileOrAttachment.type || \"unknown\"} is not accepted. Accepted types: ${adapter.accept}`;\n const err = new Error(message);\n this._safeEmitAttachmentAddError(\"not-accepted\", message, undefined, err);\n throw err;\n }\n\n let lastAttachment: PendingAttachment | undefined;\n try {\n const promiseOrGenerator = adapter.add({ file: fileOrAttachment });\n if (Symbol.asyncIterator in promiseOrGenerator) {\n for await (const r of promiseOrGenerator) {\n lastAttachment = r;\n upsertAttachment(r);\n }\n } else {\n lastAttachment = await promiseOrGenerator;\n upsertAttachment(lastAttachment);\n }\n } catch (e) {\n if (lastAttachment) {\n upsertAttachment({\n ...lastAttachment,\n status: { type: \"incomplete\", reason: \"error\" },\n });\n }\n this._safeEmitAttachmentAddError(\n \"adapter-error\",\n e instanceof Error ? e.message : String(e),\n lastAttachment?.id,\n e instanceof Error ? e : undefined,\n );\n throw e;\n }\n\n const hasError =\n lastAttachment?.status.type === \"incomplete\" &&\n lastAttachment.status.reason === \"error\";\n if (hasError) {\n this._safeEmitAttachmentAddError(\n \"adapter-error\",\n \"Attachment upload did not complete successfully.\",\n lastAttachment?.id,\n );\n } else {\n this._notifyEventSubscribers(\"attachmentAdd\", {});\n }\n }\n\n private _safeEmitAttachmentAddError(\n reason: AttachmentAddErrorReason,\n message: string,\n attachmentId?: string,\n error?: Error,\n ) {\n try {\n this._notifyEventSubscribers(\"attachmentAddError\", {\n reason,\n message,\n ...(attachmentId !== undefined && { attachmentId }),\n ...(error !== undefined && { error }),\n });\n } catch (subscriberError) {\n console.error(\n \"[assistant-ui] attachmentAddError subscriber threw:\",\n subscriberError,\n );\n }\n }\n\n async removeAttachment(attachmentId: string) {\n const index = this._attachments.findIndex((a) => a.id === attachmentId);\n if (index === -1) throw new Error(\"Attachment not found\");\n const attachment = this._attachments[index]!;\n\n if (!isAttachmentComplete(attachment)) {\n const adapter = this.getAttachmentAdapter();\n if (!adapter) throw new Error(\"Attachments are not supported\");\n await adapter.remove(attachment);\n }\n\n this._attachments = this._attachments.filter((a) => a.id !== attachmentId);\n this._notifySubscribers();\n }\n\n private _dictation: DictationState | undefined;\n private _dictationSession: DictationAdapter.Session | undefined;\n private _dictationUnsubscribes: Unsubscribe[] = [];\n private _dictationBaseText = \"\";\n private _currentInterimText = \"\";\n private _dictationSessionIdCounter = 0;\n private _activeDictationSessionId: number | undefined;\n private _isCleaningDictation = false;\n\n public get dictation(): DictationState | undefined {\n return this._dictation;\n }\n\n private _isActiveSession(\n sessionId: number,\n session: DictationAdapter.Session,\n ): boolean {\n return (\n this._activeDictationSessionId === sessionId &&\n this._dictationSession === session\n );\n }\n\n public startDictation(): void {\n const adapter = this.getDictationAdapter();\n if (!adapter) {\n throw new Error(\"Dictation adapter not configured\");\n }\n\n if (this._dictationSession) {\n for (const unsub of this._dictationUnsubscribes) {\n unsub();\n }\n this._dictationUnsubscribes = [];\n const oldSession = this._dictationSession;\n oldSession.stop().catch(() => {});\n this._dictationSession = undefined;\n }\n\n const inputDisabled = adapter.disableInputDuringDictation ?? false;\n\n this._dictationBaseText = this._text;\n this._currentInterimText = \"\";\n\n const session = adapter.listen();\n this._dictationSession = session;\n const sessionId = ++this._dictationSessionIdCounter;\n this._activeDictationSessionId = sessionId;\n this._dictation = { status: session.status, inputDisabled };\n this._notifySubscribers();\n\n const unsubSpeech = session.onSpeech((result) => {\n if (!this._isActiveSession(sessionId, session)) return;\n const isFinal = result.isFinal !== false;\n\n const needsSeparator =\n this._dictationBaseText &&\n !this._dictationBaseText.endsWith(\" \") &&\n result.transcript;\n const separator = needsSeparator ? \" \" : \"\";\n\n if (isFinal) {\n this._dictationBaseText =\n this._dictationBaseText + separator + result.transcript;\n this._currentInterimText = \"\";\n this._text = this._dictationBaseText;\n\n if (this._dictation) {\n const { transcript: _, ...rest } = this._dictation;\n this._dictation = rest;\n }\n this._notifySubscribers();\n } else {\n this._currentInterimText = separator + result.transcript;\n this._text = this._dictationBaseText + this._currentInterimText;\n\n if (this._dictation) {\n this._dictation = {\n ...this._dictation,\n transcript: result.transcript,\n };\n }\n this._notifySubscribers();\n }\n });\n this._dictationUnsubscribes.push(unsubSpeech);\n\n const unsubStart = session.onSpeechStart(() => {\n if (!this._isActiveSession(sessionId, session)) return;\n\n this._dictation = {\n status: { type: \"running\" },\n inputDisabled,\n ...(this._dictation?.transcript && {\n transcript: this._dictation.transcript,\n }),\n };\n this._notifySubscribers();\n });\n this._dictationUnsubscribes.push(unsubStart);\n\n const unsubEnd = session.onSpeechEnd(() => {\n this._cleanupDictation({ sessionId });\n });\n this._dictationUnsubscribes.push(unsubEnd);\n\n const statusInterval = setInterval(() => {\n if (!this._isActiveSession(sessionId, session)) return;\n\n if (session.status.type === \"ended\") {\n this._cleanupDictation({ sessionId });\n }\n }, 100);\n this._dictationUnsubscribes.push(() => clearInterval(statusInterval));\n }\n\n public stopDictation(): void {\n if (!this._dictationSession) return;\n\n const session = this._dictationSession;\n const sessionId = this._activeDictationSessionId;\n session.stop().finally(() => {\n this._cleanupDictation({ sessionId });\n });\n }\n\n private _cleanupDictation(options?: { sessionId: number | undefined }): void {\n const isStaleSession =\n options?.sessionId !== undefined &&\n options.sessionId !== this._activeDictationSessionId;\n if (isStaleSession || this._isCleaningDictation) return;\n\n this._isCleaningDictation = true;\n try {\n for (const unsub of this._dictationUnsubscribes) {\n unsub();\n }\n this._dictationUnsubscribes = [];\n this._dictationSession = undefined;\n this._activeDictationSessionId = undefined;\n this._dictation = undefined;\n this._dictationBaseText = \"\";\n this._currentInterimText = \"\";\n this._notifySubscribers();\n } finally {\n this._isCleaningDictation = false;\n }\n }\n\n private _eventSubscribers = new Map<\n ComposerRuntimeEventType,\n Set<(payload?: unknown) => void>\n >();\n\n protected _notifyEventSubscribers<E extends ComposerRuntimeEventType>(\n event: E,\n payload: ComposerRuntimeEventPayload[E],\n ) {\n const subscribers = this._eventSubscribers.get(event);\n if (!subscribers) return;\n\n for (const callback of subscribers) callback(payload);\n }\n\n public unstable_on<E extends ComposerRuntimeEventType>(\n event: E,\n callback: ComposerRuntimeEventCallback<E>,\n ) {\n const wrapped = callback as (payload?: unknown) => void;\n let subscribers = this._eventSubscribers.get(event);\n if (!subscribers) {\n subscribers = new Set();\n this._eventSubscribers.set(event, subscribers);\n }\n subscribers.add(wrapped);\n\n return () => {\n this._eventSubscribers.get(event)?.delete(wrapped);\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"base-composer-runtime-core.js","names":["Attachment","CompleteAttachment","CreateAttachment","PendingAttachment","MessageRole","AppendMessage","QuoteInfo","Unsubscribe","RunConfig","BaseSubscribable","AttachmentAdapter","fileMatchesAccept","AttachmentAddErrorReason","ComposerRuntimeCore","ComposerRuntimeEventCallback","ComposerRuntimeEventPayload","ComposerRuntimeEventType","DictationState","SendOptions","DictationAdapter","EMPTY_QUEUE_ITEMS","QueueItemState","generateId","isAttachmentComplete","a","status","type","BaseComposerRuntimeCore","isEditing","getAttachmentAdapter","getDictationAdapter","attachmentAccept","accept","_attachments","attachments","setAttachments","value","_notifySubscribers","canCancel","canSend","isEmpty","text","trim","length","_text","_role","role","_runConfig","runConfig","_quote","undefined","quote","setQuote","setText","_dictation","_dictationBaseText","_currentInterimText","inputDisabled","setRole","setRunConfig","_emptyTextAndAttachments","_onClearAttachments","adapter","pending","filter","Promise","all","map","remove","reset","Object","keys","task","clearAttachments","send","options","_dictationSession","cancel","_cleanupDictation","Error","result","message","Omit","createdAt","Date","content","metadata","custom","handleSend","_notifyEventSubscribers","handleCancel","queue","steerQueueItem","_queueItemId","removeQueueItem","addAttachment","fileOrAttachment","File","name","contentType","err","_safeEmitAttachmentAddError","id","upsertAttachment","idx","findIndex","attachment","slice","lastAttachment","promiseOrGenerator","add","file","Symbol","asyncIterator","r","e","reason","String","hasError","attachmentId","error","subscriberError","console","removeAttachment","index","Session","_dictationUnsubscribes","_dictationSessionIdCounter","_activeDictationSessionId","_isCleaningDictation","dictation","_isActiveSession","sessionId","session","startDictation","unsub","oldSession","stop","catch","disableInputDuringDictation","listen","unsubSpeech","onSpeech","isFinal","needsSeparator","endsWith","transcript","separator","_","rest","push","unsubStart","onSpeechStart","unsubEnd","onSpeechEnd","statusInterval","setInterval","clearInterval","stopDictation","finally","isStaleSession","_eventSubscribers","Map","Set","payload","event","E","subscribers","get","callback","unstable_on","wrapped","set","delete"],"sources":["../../../src/runtime/base/base-composer-runtime-core.ts"],"sourcesContent":["import type {\n Attachment,\n CompleteAttachment,\n CreateAttachment,\n PendingAttachment,\n} from \"../../types/attachment\";\nimport type { MessageRole, AppendMessage } from \"../../types/message\";\nimport type { QuoteInfo } from \"../../types/quote\";\nimport type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { RunConfig } from \"../../types/message\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport {\n type AttachmentAdapter,\n fileMatchesAccept,\n} from \"../../adapters/attachment\";\nimport type {\n AttachmentAddErrorReason,\n ComposerRuntimeCore,\n ComposerRuntimeEventCallback,\n ComposerRuntimeEventPayload,\n ComposerRuntimeEventType,\n DictationState,\n SendOptions,\n} from \"../interfaces/composer-runtime-core\";\nimport type { DictationAdapter } from \"../../adapters/speech\";\nimport {\n EMPTY_QUEUE_ITEMS,\n type QueueItemState,\n} from \"../../store/scopes/queue-item\";\nimport { generateId } from \"../../utils/id\";\n\nconst isAttachmentComplete = (a: Attachment): a is CompleteAttachment =>\n a.status.type === \"complete\";\n\nexport abstract class BaseComposerRuntimeCore\n extends BaseSubscribable\n implements ComposerRuntimeCore\n{\n public readonly isEditing = true;\n\n protected abstract getAttachmentAdapter(): AttachmentAdapter | undefined;\n protected abstract getDictationAdapter(): DictationAdapter | undefined;\n\n public get attachmentAccept(): string {\n return this.getAttachmentAdapter()?.accept ?? \"*\";\n }\n\n private _attachments: readonly Attachment[] = [];\n public get attachments() {\n return this._attachments;\n }\n\n protected setAttachments(value: readonly Attachment[]) {\n this._attachments = value;\n this._notifySubscribers();\n }\n\n public abstract get canCancel(): boolean;\n public abstract get canSend(): boolean;\n\n public get isEmpty() {\n return !this.text.trim() && !this.attachments.length;\n }\n\n private _text = \"\";\n\n get text() {\n return this._text;\n }\n\n private _role: MessageRole = \"user\";\n\n get role() {\n return this._role;\n }\n\n private _runConfig: RunConfig = {};\n\n get runConfig() {\n return this._runConfig;\n }\n\n private _quote: QuoteInfo | undefined = undefined;\n\n get quote() {\n return this._quote;\n }\n\n public setQuote(quote: QuoteInfo | undefined) {\n if (this._quote === quote) return;\n\n this._quote = quote;\n this._notifySubscribers();\n }\n\n public setText(value: string) {\n if (this._text === value) return;\n\n this._text = value;\n if (this._dictation) {\n this._dictationBaseText = value;\n this._currentInterimText = \"\";\n const { status, inputDisabled } = this._dictation;\n this._dictation = inputDisabled ? { status, inputDisabled } : { status };\n }\n this._notifySubscribers();\n }\n\n public setRole(role: MessageRole) {\n if (this._role === role) return;\n\n this._role = role;\n this._notifySubscribers();\n }\n\n public setRunConfig(runConfig: RunConfig) {\n if (this._runConfig === runConfig) return;\n\n this._runConfig = runConfig;\n this._notifySubscribers();\n }\n\n private _emptyTextAndAttachments() {\n this._attachments = [];\n this._text = \"\";\n this._notifySubscribers();\n }\n\n private async _onClearAttachments() {\n const adapter = this.getAttachmentAdapter();\n if (adapter) {\n const pending = this._attachments.filter((a) => !isAttachmentComplete(a));\n await Promise.all(pending.map((a) => adapter.remove(a)));\n }\n }\n\n public async reset() {\n if (\n this._attachments.length === 0 &&\n this._text === \"\" &&\n this._role === \"user\" &&\n Object.keys(this._runConfig).length === 0 &&\n this._quote === undefined\n ) {\n return;\n }\n\n this._role = \"user\";\n this._runConfig = {};\n this._quote = undefined;\n\n const task = this._onClearAttachments();\n this._emptyTextAndAttachments();\n await task;\n }\n\n public async clearAttachments() {\n const task = this._onClearAttachments();\n this.setAttachments([]);\n\n await task;\n }\n\n public async send(options?: SendOptions) {\n if (!this.canSend) return;\n\n if (this._dictationSession) {\n this._dictationSession.cancel();\n this._cleanupDictation();\n }\n\n const adapter = this.getAttachmentAdapter();\n const attachments =\n this.attachments.length > 0\n ? Promise.all(\n this.attachments.map(async (a) => {\n if (isAttachmentComplete(a)) return a;\n if (!adapter) throw new Error(\"Attachments are not supported\");\n const result = await adapter.send(a);\n return result as CompleteAttachment;\n }),\n )\n : [];\n\n const text = this.text;\n const quote = this._quote;\n this._quote = undefined;\n this._emptyTextAndAttachments();\n\n const message: Omit<AppendMessage, \"parentId\" | \"sourceId\"> = {\n createdAt: new Date(),\n role: this.role,\n content: text ? [{ type: \"text\", text }] : [],\n attachments: await attachments,\n runConfig: this.runConfig,\n metadata: { custom: { ...(quote ? { quote } : {}) } },\n };\n\n this.handleSend(message, options);\n this._notifyEventSubscribers(\"send\", {});\n }\n\n public cancel() {\n this.handleCancel();\n }\n\n public get queue(): readonly QueueItemState[] {\n return EMPTY_QUEUE_ITEMS;\n }\n\n public steerQueueItem(_queueItemId: string): void {}\n public removeQueueItem(_queueItemId: string): void {}\n\n protected abstract handleSend(\n message: Omit<AppendMessage, \"parentId\" | \"sourceId\">,\n options?: SendOptions,\n ): void;\n protected abstract handleCancel(): void;\n\n async addAttachment(fileOrAttachment: File | CreateAttachment) {\n if (!(fileOrAttachment instanceof File)) {\n const adapter = this.getAttachmentAdapter();\n if (\n adapter &&\n !fileMatchesAccept(\n {\n name: fileOrAttachment.name,\n type: fileOrAttachment.contentType ?? \"\",\n },\n adapter.accept,\n )\n ) {\n const message = `File type ${fileOrAttachment.contentType || \"unknown\"} is not accepted. Accepted types: ${adapter.accept}`;\n const err = new Error(message);\n this._safeEmitAttachmentAddError(\n \"not-accepted\",\n message,\n undefined,\n err,\n );\n throw err;\n }\n\n const a: CompleteAttachment = {\n id: fileOrAttachment.id ?? generateId(),\n type: fileOrAttachment.type ?? \"document\",\n name: fileOrAttachment.name,\n contentType: fileOrAttachment.contentType,\n content: fileOrAttachment.content,\n status: { type: \"complete\" },\n };\n this._attachments = [...this._attachments, a];\n this._notifySubscribers();\n this._notifyEventSubscribers(\"attachmentAdd\", {});\n return;\n }\n\n const upsertAttachment = (a: PendingAttachment) => {\n const idx = this._attachments.findIndex(\n (attachment) => attachment.id === a.id,\n );\n if (idx !== -1)\n this._attachments = [\n ...this._attachments.slice(0, idx),\n a,\n ...this._attachments.slice(idx + 1),\n ];\n else {\n this._attachments = [...this._attachments, a];\n }\n\n this._notifySubscribers();\n };\n\n const adapter = this.getAttachmentAdapter();\n if (!adapter) {\n const message = \"Attachments are not supported\";\n const err = new Error(message);\n this._safeEmitAttachmentAddError(\"no-adapter\", message, undefined, err);\n throw err;\n }\n\n if (\n !fileMatchesAccept(\n { name: fileOrAttachment.name, type: fileOrAttachment.type },\n adapter.accept,\n )\n ) {\n const message = `File type ${fileOrAttachment.type || \"unknown\"} is not accepted. Accepted types: ${adapter.accept}`;\n const err = new Error(message);\n this._safeEmitAttachmentAddError(\"not-accepted\", message, undefined, err);\n throw err;\n }\n\n let lastAttachment: PendingAttachment | undefined;\n try {\n const promiseOrGenerator = adapter.add({ file: fileOrAttachment });\n if (Symbol.asyncIterator in promiseOrGenerator) {\n for await (const r of promiseOrGenerator) {\n lastAttachment = r;\n upsertAttachment(r);\n }\n } else {\n lastAttachment = await promiseOrGenerator;\n upsertAttachment(lastAttachment);\n }\n } catch (e) {\n if (lastAttachment) {\n upsertAttachment({\n ...lastAttachment,\n status: { type: \"incomplete\", reason: \"error\" },\n });\n }\n this._safeEmitAttachmentAddError(\n \"adapter-error\",\n e instanceof Error ? e.message : String(e),\n lastAttachment?.id,\n e instanceof Error ? e : undefined,\n );\n throw e;\n }\n\n const hasError =\n lastAttachment?.status.type === \"incomplete\" &&\n lastAttachment.status.reason === \"error\";\n if (hasError) {\n this._safeEmitAttachmentAddError(\n \"adapter-error\",\n \"Attachment upload did not complete successfully.\",\n lastAttachment?.id,\n );\n } else {\n this._notifyEventSubscribers(\"attachmentAdd\", {});\n }\n }\n\n private _safeEmitAttachmentAddError(\n reason: AttachmentAddErrorReason,\n message: string,\n attachmentId?: string,\n error?: Error,\n ) {\n try {\n this._notifyEventSubscribers(\"attachmentAddError\", {\n reason,\n message,\n ...(attachmentId !== undefined && { attachmentId }),\n ...(error !== undefined && { error }),\n });\n } catch (subscriberError) {\n console.error(\n \"[assistant-ui] attachmentAddError subscriber threw:\",\n subscriberError,\n );\n }\n }\n\n async removeAttachment(attachmentId: string) {\n const index = this._attachments.findIndex((a) => a.id === attachmentId);\n if (index === -1) throw new Error(\"Attachment not found\");\n const attachment = this._attachments[index]!;\n\n if (!isAttachmentComplete(attachment)) {\n const adapter = this.getAttachmentAdapter();\n if (!adapter) throw new Error(\"Attachments are not supported\");\n await adapter.remove(attachment);\n }\n\n this._attachments = this._attachments.filter((a) => a.id !== attachmentId);\n this._notifySubscribers();\n }\n\n private _dictation: DictationState | undefined;\n private _dictationSession: DictationAdapter.Session | undefined;\n private _dictationUnsubscribes: Unsubscribe[] = [];\n private _dictationBaseText = \"\";\n private _currentInterimText = \"\";\n private _dictationSessionIdCounter = 0;\n private _activeDictationSessionId: number | undefined;\n private _isCleaningDictation = false;\n\n public get dictation(): DictationState | undefined {\n return this._dictation;\n }\n\n private _isActiveSession(\n sessionId: number,\n session: DictationAdapter.Session,\n ): boolean {\n return (\n this._activeDictationSessionId === sessionId &&\n this._dictationSession === session\n );\n }\n\n public startDictation(): void {\n const adapter = this.getDictationAdapter();\n if (!adapter) {\n throw new Error(\"Dictation adapter not configured\");\n }\n\n if (this._dictationSession) {\n for (const unsub of this._dictationUnsubscribes) {\n unsub();\n }\n this._dictationUnsubscribes = [];\n const oldSession = this._dictationSession;\n oldSession.stop().catch(() => {});\n this._dictationSession = undefined;\n }\n\n const inputDisabled = adapter.disableInputDuringDictation ?? false;\n\n this._dictationBaseText = this._text;\n this._currentInterimText = \"\";\n\n const session = adapter.listen();\n this._dictationSession = session;\n const sessionId = ++this._dictationSessionIdCounter;\n this._activeDictationSessionId = sessionId;\n this._dictation = { status: session.status, inputDisabled };\n this._notifySubscribers();\n\n const unsubSpeech = session.onSpeech((result) => {\n if (!this._isActiveSession(sessionId, session)) return;\n const isFinal = result.isFinal !== false;\n\n const needsSeparator =\n this._dictationBaseText &&\n !this._dictationBaseText.endsWith(\" \") &&\n result.transcript;\n const separator = needsSeparator ? \" \" : \"\";\n\n if (isFinal) {\n this._dictationBaseText =\n this._dictationBaseText + separator + result.transcript;\n this._currentInterimText = \"\";\n this._text = this._dictationBaseText;\n\n if (this._dictation) {\n const { transcript: _, ...rest } = this._dictation;\n this._dictation = rest;\n }\n this._notifySubscribers();\n } else {\n this._currentInterimText = separator + result.transcript;\n this._text = this._dictationBaseText + this._currentInterimText;\n\n if (this._dictation) {\n this._dictation = {\n ...this._dictation,\n transcript: result.transcript,\n };\n }\n this._notifySubscribers();\n }\n });\n this._dictationUnsubscribes.push(unsubSpeech);\n\n const unsubStart = session.onSpeechStart(() => {\n if (!this._isActiveSession(sessionId, session)) return;\n\n this._dictation = {\n status: { type: \"running\" },\n inputDisabled,\n ...(this._dictation?.transcript && {\n transcript: this._dictation.transcript,\n }),\n };\n this._notifySubscribers();\n });\n this._dictationUnsubscribes.push(unsubStart);\n\n const unsubEnd = session.onSpeechEnd(() => {\n this._cleanupDictation({ sessionId });\n });\n this._dictationUnsubscribes.push(unsubEnd);\n\n const statusInterval = setInterval(() => {\n if (!this._isActiveSession(sessionId, session)) return;\n\n if (session.status.type === \"ended\") {\n this._cleanupDictation({ sessionId });\n }\n }, 100);\n this._dictationUnsubscribes.push(() => clearInterval(statusInterval));\n }\n\n public stopDictation(): void {\n if (!this._dictationSession) return;\n\n const session = this._dictationSession;\n const sessionId = this._activeDictationSessionId;\n session.stop().finally(() => {\n this._cleanupDictation({ sessionId });\n });\n }\n\n private _cleanupDictation(options?: { sessionId: number | undefined }): void {\n const isStaleSession =\n options?.sessionId !== undefined &&\n options.sessionId !== this._activeDictationSessionId;\n if (isStaleSession || this._isCleaningDictation) return;\n\n this._isCleaningDictation = true;\n try {\n for (const unsub of this._dictationUnsubscribes) {\n unsub();\n }\n this._dictationUnsubscribes = [];\n this._dictationSession = undefined;\n this._activeDictationSessionId = undefined;\n this._dictation = undefined;\n this._dictationBaseText = \"\";\n this._currentInterimText = \"\";\n this._notifySubscribers();\n } finally {\n this._isCleaningDictation = false;\n }\n }\n\n private _eventSubscribers = new Map<\n ComposerRuntimeEventType,\n Set<(payload?: unknown) => void>\n >();\n\n protected _notifyEventSubscribers<E extends ComposerRuntimeEventType>(\n event: E,\n payload: ComposerRuntimeEventPayload[E],\n ) {\n const subscribers = this._eventSubscribers.get(event);\n if (!subscribers) return;\n\n for (const callback of subscribers) callback(payload);\n }\n\n public unstable_on<E extends ComposerRuntimeEventType>(\n event: E,\n callback: ComposerRuntimeEventCallback<E>,\n ) {\n const wrapped = callback as (payload?: unknown) => void;\n let subscribers = this._eventSubscribers.get(event);\n if (!subscribers) {\n subscribers = new Set();\n this._eventSubscribers.set(event, subscribers);\n }\n subscribers.add(wrapped);\n\n return () => {\n this._eventSubscribers.get(event)?.delete(wrapped);\n };\n }\n}\n"],"mappings":"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"}
@@ -30,6 +30,7 @@ declare abstract class BaseThreadRuntimeCore implements ThreadRuntimeCore {
30
30
  abstract get extras(): unknown;
31
31
  abstract get capabilities(): RuntimeCapabilities;
32
32
  abstract append(message: AppendMessage): void;
33
+ abstract deleteMessage(messageId: string): void | Promise<void>;
33
34
  abstract startRun(config: StartRunConfig): void;
34
35
  abstract resumeRun(config: ResumeRunConfig): void;
35
36
  abstract addToolResult(options: AddToolResultOptions): void;
@@ -1 +1 @@
1
- {"version":3,"file":"base-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/base/base-thread-runtime-core.ts"],"mappings":";;;;;;;;;;;;;KAqCK,kBAAA;EACH,MAAA,GAAS,sBAAA;EACT,QAAA,GAAW,eAAA;EACX,WAAA,GAAc,iBAAA;EACd,KAAA,GAAQ,oBAAA;AAAA;AAAA,uBAGY,qBAAA,YAAiC,iBAAA;EAAA,iBAqExB,gBAAA;EAAA,QApErB,cAAA;EAAA,QACA,cAAA;EAAA,mBAEW,UAAA,EAAU,iBAAA;EAAA,aACT,QAAA,IAAY,kBAAA;EAAA,aACZ,UAAA;EAAA,aACA,cAAA;EAAA,aACA,SAAA;EAAA,aACA,WAAA,aAAwB,gBAAA;EAAA,aACxB,MAAA;EAAA,aAEA,YAAA,IAAgB,mBAAA;EAAA,SACpB,MAAA,CAAO,OAAA,EAAS,aAAA;EAAA,SAChB,QAAA,CAAS,MAAA,EAAQ,cAAA;EAAA,SACjB,SAAA,CAAU,MAAA,EAAQ,eAAA;EAAA,SAClB,aAAA,CAAc,OAAA,EAAS,oBAAA;EAAA,SACvB,cAAA,CAAe,OAAA,EAAS,qBAAA;EAAA,SACxB,qBAAA,CACd,OAAA,EAAS,4BAAA;EAAA,SAEK,SAAA;EAAA,SACA,mBAAA;EAAA,SACA,mBAAA,CAAoB,KAAA;EAAA,UAE1B,cAAA,EAAgB,aAAA;EAAA,UAChB,gBAAA;EAAA,QACF,qBAAA;EAAA,QACA,sBAAA;EAAA,QACA,iBAAA;EAAA,UAEE,uBAAA;EAAA,UAKA,gBAAA,aAA6B,aAAA;EAAA,IAI5B,QAAA,aAAqB,aAAA;EAAA,IAgBrB,KAAA,iEAAK,kBAAA,oCAAA,iBAAA;EAAA,SAWA,QAAA,EAAQ,gCAAA;cAEK,gBAAA,EAAkB,oBAAA;EAExC,eAAA,IAF4D,YAAA;EAAA,QAM3D,cAAA;EACD,eAAA,CAAgB,SAAA,WAAiB,8BAAA;EAGjC,SAAA,CAAU,SAAA;EAeV,cAAA,CAAe,SAAA;;;;;EAsBf,WAAA,CAAY,SAAA;EAOZ,cAAA,CAAe,QAAA;EAAA,UAKZ,kBAAA;EAIH,uBAAA,WAAkC,sBAAA,EACvC,KAAA,EAAO,CAAA,EACP,OAAA,EAAS,yBAAA,CAA0B,CAAA;EAQ9B,SAAA,CAAU,QAAA,eAAuB,WAAA;EAKjC,cAAA;IAAiB,SAAA;IAAW;EAAA,GAAQ,qBAAA;EAAA,QAqBnC,aAAA;EACD,MAAA,EAAQ,WAAA;EAER,KAAA,CAAM,SAAA;EA8BN,YAAA;EAAA,QAMC,aAAA;EAAA,QACA,YAAA;EACD,KAAA,EAAO,iBAAA;EAAA,QAEN,YAAA;EAAA,QACA,uBAAA;EAED,cAAA;EAEA,oBAAA,GAAwB,QAAA,iBAAuB,WAAA;EAK/C,YAAA;EAAA,QA+DC,oBAAA;EAAA,QAEA,sBAAA;EAAA,QA8DA,4BAAA;EAaD,eAAA;EAeA,SAAA;EAUA,WAAA;EAAA,UAUG,iBAAA;EAOH,MAAA,IAAM,yBAAA;EAIN,MAAA,CAAO,IAAA,EAAM,yBAAA;EAOb,KAAA,CAAM,eAAA,YAA2B,iBAAA;EAAA,QAIhC,iBAAA;EAKD,WAAA,WAAsB,sBAAA,EAC3B,KAAA,EAAO,CAAA,EACP,QAAA,EAAU,0BAAA,CAA2B,CAAA,IAAE,WAAA;AAAA"}
1
+ {"version":3,"file":"base-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/base/base-thread-runtime-core.ts"],"mappings":";;;;;;;;;;;;;KAqCK,kBAAA;EACH,MAAA,GAAS,sBAAA;EACT,QAAA,GAAW,eAAA;EACX,WAAA,GAAc,iBAAA;EACd,KAAA,GAAQ,oBAAA;AAAA;AAAA,uBAGY,qBAAA,YAAiC,iBAAA;EAAA,iBAsExB,gBAAA;EAAA,QArErB,cAAA;EAAA,QACA,cAAA;EAAA,mBAEW,UAAA,EAAU,iBAAA;EAAA,aACT,QAAA,IAAY,kBAAA;EAAA,aACZ,UAAA;EAAA,aACA,cAAA;EAAA,aACA,SAAA;EAAA,aACA,WAAA,aAAwB,gBAAA;EAAA,aACxB,MAAA;EAAA,aAEA,YAAA,IAAgB,mBAAA;EAAA,SACpB,MAAA,CAAO,OAAA,EAAS,aAAA;EAAA,SAChB,aAAA,CAAc,SAAA,kBAA2B,OAAA;EAAA,SACzC,QAAA,CAAS,MAAA,EAAQ,cAAA;EAAA,SACjB,SAAA,CAAU,MAAA,EAAQ,eAAA;EAAA,SAClB,aAAA,CAAc,OAAA,EAAS,oBAAA;EAAA,SACvB,cAAA,CAAe,OAAA,EAAS,qBAAA;EAAA,SACxB,qBAAA,CACd,OAAA,EAAS,4BAAA;EAAA,SAEK,SAAA;EAAA,SACA,mBAAA;EAAA,SACA,mBAAA,CAAoB,KAAA;EAAA,UAE1B,cAAA,EAAgB,aAAA;EAAA,UAChB,gBAAA;EAAA,QACF,qBAAA;EAAA,QACA,sBAAA;EAAA,QACA,iBAAA;EAAA,UAEE,uBAAA;EAAA,UAKA,gBAAA,aAA6B,aAAA;EAAA,IAI5B,QAAA,aAAqB,aAAA;EAAA,IAgBrB,KAAA,iEAAK,kBAAA,oCAAA,iBAAA;EAAA,SAWA,QAAA,EAAQ,gCAAA;cAEK,gBAAA,EAAkB,oBAAA;EAExC,eAAA,IAF4D,YAAA;EAAA,QAM3D,cAAA;EACD,eAAA,CAAgB,SAAA,WAAiB,8BAAA;EAGjC,SAAA,CAAU,SAAA;EAeV,cAAA,CAAe,SAAA;;;;;EAsBf,WAAA,CAAY,SAAA;EAOZ,cAAA,CAAe,QAAA;EAAA,UAKZ,kBAAA;EAIH,uBAAA,WAAkC,sBAAA,EACvC,KAAA,EAAO,CAAA,EACP,OAAA,EAAS,yBAAA,CAA0B,CAAA;EAQ9B,SAAA,CAAU,QAAA,eAAuB,WAAA;EAKjC,cAAA;IAAiB,SAAA;IAAW;EAAA,GAAQ,qBAAA;EAAA,QAqBnC,aAAA;EACD,MAAA,EAAQ,WAAA;EAER,KAAA,CAAM,SAAA;EA8BN,YAAA;EAAA,QAMC,aAAA;EAAA,QACA,YAAA;EACD,KAAA,EAAO,iBAAA;EAAA,QAEN,YAAA;EAAA,QACA,uBAAA;EAED,cAAA;EAEA,oBAAA,GAAwB,QAAA,iBAAuB,WAAA;EAK/C,YAAA;EAAA,QA+DC,oBAAA;EAAA,QAEA,sBAAA;EAAA,QA8DA,4BAAA;EAaD,eAAA;EAeA,SAAA;EAUA,WAAA;EAAA,UAUG,iBAAA;EAOH,MAAA,IAAM,yBAAA;EAIN,MAAA,CAAO,IAAA,EAAM,yBAAA;EAOb,KAAA,CAAM,eAAA,YAA2B,iBAAA;EAAA,QAIhC,iBAAA;EAKD,WAAA,WAAsB,sBAAA,EAC3B,KAAA,EAAO,CAAA,EACP,QAAA,EAAU,0BAAA,CAA2B,CAAA,IAAE,WAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"base-thread-runtime-core.js","names":[],"sources":["../../../src/runtime/base/base-thread-runtime-core.ts"],"sourcesContent":["import type {\n AppendMessage,\n ThreadAssistantMessage,\n ThreadMessage,\n} from \"../../types/message\";\nimport type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport { generateId } from \"../../utils/id\";\nimport {\n ExportedMessageRepository,\n MessageRepository,\n} from \"../utils/message-repository\";\nimport { DefaultThreadComposerRuntimeCore } from \"./default-thread-composer-runtime-core\";\nimport type {\n AddToolResultOptions,\n ResumeToolCallOptions,\n RespondToToolApprovalOptions,\n ThreadSuggestion,\n SubmitFeedbackOptions,\n ThreadRuntimeCore,\n SpeechState,\n VoiceSessionState,\n RuntimeCapabilities,\n ThreadRuntimeEventCallback,\n ThreadRuntimeEventPayload,\n ThreadRuntimeEventType,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../interfaces/thread-runtime-core\";\nimport { DefaultEditComposerRuntimeCore } from \"./default-edit-composer-runtime-core\";\nimport type { SpeechSynthesisAdapter } from \"../../adapters/speech\";\nimport type { FeedbackAdapter } from \"../../adapters/feedback\";\nimport type { AttachmentAdapter } from \"../../adapters/attachment\";\nimport type { RealtimeVoiceAdapter } from \"../../adapters/voice\";\nimport type { ThreadMessageLike } from \"../utils/thread-message-like\";\n\ntype BaseThreadAdapters = {\n speech?: SpeechSynthesisAdapter | undefined;\n feedback?: FeedbackAdapter | undefined;\n attachments?: AttachmentAdapter | undefined;\n voice?: RealtimeVoiceAdapter | undefined;\n};\n\nexport abstract class BaseThreadRuntimeCore implements ThreadRuntimeCore {\n private _subscriptions = new Set<() => void>();\n private _isInitialized = false;\n\n protected readonly repository = new MessageRepository();\n public abstract get adapters(): BaseThreadAdapters | undefined;\n public abstract get isDisabled(): boolean;\n public abstract get isSendDisabled(): boolean;\n public abstract get isLoading(): boolean;\n public abstract get suggestions(): readonly ThreadSuggestion[];\n public abstract get extras(): unknown;\n\n public abstract get capabilities(): RuntimeCapabilities;\n public abstract append(message: AppendMessage): void;\n public abstract startRun(config: StartRunConfig): void;\n public abstract resumeRun(config: ResumeRunConfig): void;\n public abstract addToolResult(options: AddToolResultOptions): void;\n public abstract resumeToolCall(options: ResumeToolCallOptions): void;\n public abstract respondToToolApproval(\n options: RespondToToolApprovalOptions,\n ): void;\n public abstract cancelRun(): void;\n public abstract exportExternalState(): any;\n public abstract importExternalState(state: any): void;\n\n protected _voiceMessages: ThreadMessage[] = [];\n protected _voiceGeneration = 0;\n private _cachedMergedMessages: readonly ThreadMessage[] | null = null;\n private _cachedVoiceGeneration = -1;\n private _cachedMergedBase: readonly ThreadMessage[] | null = null;\n\n protected _markVoiceMessagesDirty() {\n this._voiceGeneration++;\n this._cachedMergedMessages = null;\n }\n\n protected _getBaseMessages(): readonly ThreadMessage[] {\n return this.repository.getMessages();\n }\n\n public get messages(): readonly ThreadMessage[] {\n if (this._voiceMessages.length === 0) {\n return this._getBaseMessages();\n }\n const base = this._getBaseMessages();\n if (\n this._cachedVoiceGeneration !== this._voiceGeneration ||\n this._cachedMergedBase !== base\n ) {\n this._cachedMergedMessages = [...base, ...this._voiceMessages];\n this._cachedVoiceGeneration = this._voiceGeneration;\n this._cachedMergedBase = base;\n }\n return this._cachedMergedMessages!;\n }\n\n public get state() {\n let mostRecentAssistantMessage: (typeof this.messages)[number] | undefined;\n for (const message of this.messages) {\n if (message.role === \"assistant\") {\n mostRecentAssistantMessage = message;\n }\n }\n\n return mostRecentAssistantMessage?.metadata.unstable_state ?? null;\n }\n\n public readonly composer = new DefaultThreadComposerRuntimeCore(this);\n\n constructor(private readonly _contextProvider: ModelContextProvider) {}\n\n public getModelContext() {\n return this._contextProvider.getModelContext();\n }\n\n private _editComposers = new Map<string, DefaultEditComposerRuntimeCore>();\n public getEditComposer(messageId: string) {\n return this._editComposers.get(messageId);\n }\n public beginEdit(messageId: string) {\n if (this._editComposers.has(messageId))\n throw new Error(\"Edit already in progress\");\n\n this._editComposers.set(\n messageId,\n new DefaultEditComposerRuntimeCore(\n this,\n () => this._editComposers.delete(messageId),\n this.repository.getMessage(messageId),\n ),\n );\n this._notifySubscribers();\n }\n\n public getMessageById(messageId: string) {\n try {\n return this.repository.getMessage(messageId);\n } catch {\n // Check voice messages\n const baseMessages = this.repository.getMessages();\n const voiceIdx = this._voiceMessages.findIndex((m) => m.id === messageId);\n if (voiceIdx !== -1) {\n const parentId =\n voiceIdx > 0\n ? this._voiceMessages[voiceIdx - 1]!.id\n : (baseMessages.at(-1)?.id ?? null);\n return {\n parentId,\n message: this._voiceMessages[voiceIdx]!,\n index: baseMessages.length + voiceIdx,\n };\n }\n return undefined;\n }\n }\n\n public getBranches(messageId: string): string[] {\n if (this._voiceMessages.some((m) => m.id === messageId)) {\n return [];\n }\n return this.repository.getBranches(messageId);\n }\n\n public switchToBranch(branchId: string): void {\n this.repository.switchToBranch(branchId);\n this._notifySubscribers();\n }\n\n protected _notifySubscribers() {\n for (const callback of this._subscriptions) callback();\n }\n\n public _notifyEventSubscribers<E extends ThreadRuntimeEventType>(\n event: E,\n payload: ThreadRuntimeEventPayload[E],\n ) {\n const subscribers = this._eventSubscribers.get(event);\n if (!subscribers) return;\n\n for (const callback of subscribers) callback(payload);\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n public submitFeedback({ messageId, type }: SubmitFeedbackOptions) {\n const adapter = this.adapters?.feedback;\n if (!adapter) throw new Error(\"Feedback adapter not configured\");\n\n const { message, parentId } = this.repository.getMessage(messageId);\n adapter.submit({ message, type });\n\n if (message.role === \"assistant\") {\n const updatedMessage: ThreadMessage = {\n ...message,\n metadata: {\n ...message.metadata,\n submittedFeedback: { type },\n },\n };\n this.repository.addOrUpdateMessage(parentId, updatedMessage);\n }\n\n this._notifySubscribers();\n }\n\n private _stopSpeaking: Unsubscribe | undefined;\n public speech: SpeechState | undefined;\n\n public speak(messageId: string) {\n const adapter = this.adapters?.speech;\n if (!adapter) throw new Error(\"Speech adapter not configured\");\n\n const { message } = this.repository.getMessage(messageId);\n\n this._stopSpeaking?.();\n\n const utterance = adapter.speak(getThreadMessageText(message));\n const unsub = utterance.subscribe(() => {\n if (utterance.status.type === \"ended\") {\n this._stopSpeaking = undefined;\n this.speech = undefined;\n } else {\n this.speech = { messageId, status: utterance.status };\n }\n this._notifySubscribers();\n });\n\n this.speech = { messageId, status: utterance.status };\n this._notifySubscribers();\n\n this._stopSpeaking = () => {\n utterance.cancel();\n unsub();\n this.speech = undefined;\n this._stopSpeaking = undefined;\n };\n }\n\n public stopSpeaking() {\n if (!this._stopSpeaking) throw new Error(\"No message is being spoken\");\n this._stopSpeaking();\n this._notifySubscribers();\n }\n\n private _voiceSession: RealtimeVoiceAdapter.Session | undefined;\n private _voiceUnsubs: Array<() => void> = [];\n public voice: VoiceSessionState | undefined;\n\n private _voiceVolume = 0;\n private _voiceVolumeSubscribers = new Set<() => void>();\n\n public getVoiceVolume = () => this._voiceVolume;\n\n public subscribeVoiceVolume = (callback: () => void): Unsubscribe => {\n this._voiceVolumeSubscribers.add(callback);\n return () => this._voiceVolumeSubscribers.delete(callback);\n };\n\n public connectVoice() {\n const adapter = this.adapters?.voice;\n if (!adapter) throw new Error(\"Voice adapter not configured\");\n\n this.disconnectVoice();\n\n const session = adapter.connect({});\n this._voiceSession = session;\n const unsubs: Array<() => void> = [];\n\n let currentMode: RealtimeVoiceAdapter.Mode = \"listening\";\n\n this.voice = {\n status: session.status,\n isMuted: session.isMuted,\n mode: currentMode,\n };\n this._voiceVolume = 0;\n this._notifySubscribers();\n\n unsubs.push(\n session.onStatusChange((status) => {\n if (status.type === \"ended\") {\n this._finishVoiceAssistantMessage();\n this._voiceSession = undefined;\n this.voice = undefined;\n } else {\n this.voice = {\n status,\n isMuted: session.isMuted,\n mode: currentMode,\n };\n }\n this._notifySubscribers();\n }),\n );\n\n unsubs.push(\n session.onModeChange((mode) => {\n currentMode = mode;\n if (this.voice) {\n this.voice = { ...this.voice, mode };\n this._notifySubscribers();\n }\n }),\n );\n\n unsubs.push(\n session.onVolumeChange((volume) => {\n this._voiceVolume = volume;\n for (const cb of this._voiceVolumeSubscribers) cb();\n }),\n );\n\n unsubs.push(\n session.onTranscript((transcript) => {\n this._handleVoiceTranscript(transcript);\n }),\n );\n\n this._voiceUnsubs = unsubs;\n }\n\n private _currentAssistantMsg: ThreadAssistantMessage | null = null;\n\n private _handleVoiceTranscript(\n transcript: RealtimeVoiceAdapter.TranscriptItem,\n ) {\n this.ensureInitialized();\n\n if (transcript.role === \"user\") {\n this._finishVoiceAssistantMessage();\n this._currentAssistantMsg = null;\n\n if (transcript.isFinal) {\n this._voiceMessages.push({\n id: generateId(),\n role: \"user\",\n content: [{ type: \"text\", text: transcript.text }],\n metadata: { custom: {} },\n createdAt: new Date(),\n status: { type: \"complete\", reason: \"unknown\" },\n attachments: [],\n });\n this._markVoiceMessagesDirty();\n this._notifySubscribers();\n }\n } else {\n if (!this._currentAssistantMsg) {\n this._currentAssistantMsg = {\n id: generateId(),\n role: \"assistant\",\n content: [{ type: \"text\", text: transcript.text }],\n metadata: {\n unstable_state: this.state,\n unstable_annotations: [],\n unstable_data: [],\n steps: [],\n custom: {},\n },\n status: { type: \"running\" },\n createdAt: new Date(),\n };\n this._voiceMessages.push(this._currentAssistantMsg);\n } else {\n const idx = this._voiceMessages.indexOf(this._currentAssistantMsg);\n if (idx === -1) return;\n const updated: ThreadAssistantMessage = {\n ...this._currentAssistantMsg,\n content: [{ type: \"text\", text: transcript.text }],\n ...(transcript.isFinal\n ? { status: { type: \"complete\", reason: \"stop\" } }\n : {}),\n };\n this._voiceMessages[idx] = updated;\n this._currentAssistantMsg = updated;\n }\n\n if (transcript.isFinal) {\n this._currentAssistantMsg = null;\n }\n\n this._markVoiceMessagesDirty();\n this._notifySubscribers();\n }\n }\n\n private _finishVoiceAssistantMessage() {\n const last = this._voiceMessages.at(-1);\n if (last?.role === \"assistant\" && last.status.type === \"running\") {\n const idx = this._voiceMessages.length - 1;\n this._voiceMessages[idx] = {\n ...(last as ThreadAssistantMessage),\n status: { type: \"complete\", reason: \"stop\" },\n };\n this._markVoiceMessagesDirty();\n this._notifySubscribers();\n }\n }\n\n public disconnectVoice() {\n this._finishVoiceAssistantMessage();\n this._currentAssistantMsg = null;\n for (const unsub of this._voiceUnsubs) unsub();\n this._voiceUnsubs = [];\n this._voiceSession?.disconnect();\n this._voiceSession = undefined;\n this.voice = undefined;\n this._voiceVolume = 0;\n for (const cb of this._voiceVolumeSubscribers) cb();\n this._voiceMessages = [];\n this._markVoiceMessagesDirty();\n this._notifySubscribers();\n }\n\n public muteVoice() {\n if (!this._voiceSession) throw new Error(\"No active voice session\");\n this._voiceSession.mute();\n this.voice = {\n ...this.voice!,\n isMuted: true,\n };\n this._notifySubscribers();\n }\n\n public unmuteVoice() {\n if (!this._voiceSession) throw new Error(\"No active voice session\");\n this._voiceSession.unmute();\n this.voice = {\n ...this.voice!,\n isMuted: false,\n };\n this._notifySubscribers();\n }\n\n protected ensureInitialized() {\n if (!this._isInitialized) {\n this._isInitialized = true;\n this._notifyEventSubscribers(\"initialize\", {});\n }\n }\n\n public export() {\n return this.repository.export();\n }\n\n public import(data: ExportedMessageRepository) {\n this.ensureInitialized();\n this.repository.clear();\n this.repository.import(data);\n this._notifySubscribers();\n }\n\n public reset(initialMessages?: readonly ThreadMessageLike[]) {\n this.import(ExportedMessageRepository.fromArray(initialMessages ?? []));\n }\n\n private _eventSubscribers = new Map<\n ThreadRuntimeEventType,\n Set<(payload?: unknown) => void>\n >();\n\n public unstable_on<E extends ThreadRuntimeEventType>(\n event: E,\n callback: ThreadRuntimeEventCallback<E>,\n ) {\n const wrapped = callback as (payload?: unknown) => void;\n if (event === \"modelContextUpdate\") {\n // provider.subscribe is `() => void`; pump the typed empty payload to the user callback.\n return this._contextProvider.subscribe?.(() => wrapped({})) ?? (() => {});\n }\n\n let subscribers = this._eventSubscribers.get(event);\n if (!subscribers) {\n subscribers = new Set();\n this._eventSubscribers.set(event, subscribers);\n }\n subscribers.add(wrapped);\n\n // `initialize` latches: replay it (deferred) to subscribers that attach\n // after the thread already initialized, mirroring a BehaviorSubject.\n if (event === \"initialize\" && this._isInitialized) {\n queueMicrotask(() => {\n if (subscribers.has(wrapped)) wrapped({});\n });\n }\n\n return () => {\n this._eventSubscribers.get(event)?.delete(wrapped);\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"base-thread-runtime-core.js","names":["AppendMessage","ThreadAssistantMessage","ThreadMessage","Unsubscribe","ModelContextProvider","getThreadMessageText","generateId","ExportedMessageRepository","MessageRepository","DefaultThreadComposerRuntimeCore","AddToolResultOptions","ResumeToolCallOptions","RespondToToolApprovalOptions","ThreadSuggestion","SubmitFeedbackOptions","ThreadRuntimeCore","SpeechState","VoiceSessionState","RuntimeCapabilities","ThreadRuntimeEventCallback","ThreadRuntimeEventPayload","ThreadRuntimeEventType","StartRunConfig","ResumeRunConfig","DefaultEditComposerRuntimeCore","SpeechSynthesisAdapter","FeedbackAdapter","AttachmentAdapter","RealtimeVoiceAdapter","ThreadMessageLike","BaseThreadAdapters","speech","feedback","attachments","voice","BaseThreadRuntimeCore","_subscriptions","Set","_isInitialized","repository","adapters","isDisabled","isSendDisabled","isLoading","suggestions","extras","capabilities","append","message","deleteMessage","messageId","Promise","startRun","config","resumeRun","addToolResult","options","resumeToolCall","respondToToolApproval","cancelRun","exportExternalState","importExternalState","state","_voiceMessages","_voiceGeneration","_cachedMergedMessages","_cachedVoiceGeneration","_cachedMergedBase","_markVoiceMessagesDirty","_getBaseMessages","getMessages","messages","length","base","mostRecentAssistantMessage","this","role","metadata","unstable_state","composer","constructor","_contextProvider","getModelContext","_editComposers","Map","getEditComposer","get","beginEdit","has","Error","set","delete","getMessage","_notifySubscribers","getMessageById","baseMessages","voiceIdx","findIndex","m","id","parentId","at","index","undefined","getBranches","some","switchToBranch","branchId","callback","_notifyEventSubscribers","event","E","payload","subscribers","_eventSubscribers","subscribe","add","submitFeedback","type","adapter","submit","updatedMessage","submittedFeedback","addOrUpdateMessage","_stopSpeaking","speak","utterance","unsub","status","cancel","stopSpeaking","_voiceSession","Session","_voiceUnsubs","Array","_voiceVolume","_voiceVolumeSubscribers","getVoiceVolume","subscribeVoiceVolume","connectVoice","disconnectVoice","session","connect","unsubs","currentMode","Mode","isMuted","mode","push","onStatusChange","_finishVoiceAssistantMessage","onModeChange","onVolumeChange","volume","cb","onTranscript","transcript","_handleVoiceTranscript","_currentAssistantMsg","TranscriptItem","ensureInitialized","isFinal","content","text","custom","createdAt","Date","reason","unstable_annotations","unstable_data","steps","idx","indexOf","updated","last","disconnect","muteVoice","mute","unmuteVoice","unmute","export","import","data","clear","reset","initialMessages","fromArray","unstable_on","wrapped","queueMicrotask"],"sources":["../../../src/runtime/base/base-thread-runtime-core.ts"],"sourcesContent":["import type {\n AppendMessage,\n ThreadAssistantMessage,\n ThreadMessage,\n} from \"../../types/message\";\nimport type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport { generateId } from \"../../utils/id\";\nimport {\n ExportedMessageRepository,\n MessageRepository,\n} from \"../utils/message-repository\";\nimport { DefaultThreadComposerRuntimeCore } from \"./default-thread-composer-runtime-core\";\nimport type {\n AddToolResultOptions,\n ResumeToolCallOptions,\n RespondToToolApprovalOptions,\n ThreadSuggestion,\n SubmitFeedbackOptions,\n ThreadRuntimeCore,\n SpeechState,\n VoiceSessionState,\n RuntimeCapabilities,\n ThreadRuntimeEventCallback,\n ThreadRuntimeEventPayload,\n ThreadRuntimeEventType,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../interfaces/thread-runtime-core\";\nimport { DefaultEditComposerRuntimeCore } from \"./default-edit-composer-runtime-core\";\nimport type { SpeechSynthesisAdapter } from \"../../adapters/speech\";\nimport type { FeedbackAdapter } from \"../../adapters/feedback\";\nimport type { AttachmentAdapter } from \"../../adapters/attachment\";\nimport type { RealtimeVoiceAdapter } from \"../../adapters/voice\";\nimport type { ThreadMessageLike } from \"../utils/thread-message-like\";\n\ntype BaseThreadAdapters = {\n speech?: SpeechSynthesisAdapter | undefined;\n feedback?: FeedbackAdapter | undefined;\n attachments?: AttachmentAdapter | undefined;\n voice?: RealtimeVoiceAdapter | undefined;\n};\n\nexport abstract class BaseThreadRuntimeCore implements ThreadRuntimeCore {\n private _subscriptions = new Set<() => void>();\n private _isInitialized = false;\n\n protected readonly repository = new MessageRepository();\n public abstract get adapters(): BaseThreadAdapters | undefined;\n public abstract get isDisabled(): boolean;\n public abstract get isSendDisabled(): boolean;\n public abstract get isLoading(): boolean;\n public abstract get suggestions(): readonly ThreadSuggestion[];\n public abstract get extras(): unknown;\n\n public abstract get capabilities(): RuntimeCapabilities;\n public abstract append(message: AppendMessage): void;\n public abstract deleteMessage(messageId: string): void | Promise<void>;\n public abstract startRun(config: StartRunConfig): void;\n public abstract resumeRun(config: ResumeRunConfig): void;\n public abstract addToolResult(options: AddToolResultOptions): void;\n public abstract resumeToolCall(options: ResumeToolCallOptions): void;\n public abstract respondToToolApproval(\n options: RespondToToolApprovalOptions,\n ): void;\n public abstract cancelRun(): void;\n public abstract exportExternalState(): any;\n public abstract importExternalState(state: any): void;\n\n protected _voiceMessages: ThreadMessage[] = [];\n protected _voiceGeneration = 0;\n private _cachedMergedMessages: readonly ThreadMessage[] | null = null;\n private _cachedVoiceGeneration = -1;\n private _cachedMergedBase: readonly ThreadMessage[] | null = null;\n\n protected _markVoiceMessagesDirty() {\n this._voiceGeneration++;\n this._cachedMergedMessages = null;\n }\n\n protected _getBaseMessages(): readonly ThreadMessage[] {\n return this.repository.getMessages();\n }\n\n public get messages(): readonly ThreadMessage[] {\n if (this._voiceMessages.length === 0) {\n return this._getBaseMessages();\n }\n const base = this._getBaseMessages();\n if (\n this._cachedVoiceGeneration !== this._voiceGeneration ||\n this._cachedMergedBase !== base\n ) {\n this._cachedMergedMessages = [...base, ...this._voiceMessages];\n this._cachedVoiceGeneration = this._voiceGeneration;\n this._cachedMergedBase = base;\n }\n return this._cachedMergedMessages!;\n }\n\n public get state() {\n let mostRecentAssistantMessage: (typeof this.messages)[number] | undefined;\n for (const message of this.messages) {\n if (message.role === \"assistant\") {\n mostRecentAssistantMessage = message;\n }\n }\n\n return mostRecentAssistantMessage?.metadata.unstable_state ?? null;\n }\n\n public readonly composer = new DefaultThreadComposerRuntimeCore(this);\n\n constructor(private readonly _contextProvider: ModelContextProvider) {}\n\n public getModelContext() {\n return this._contextProvider.getModelContext();\n }\n\n private _editComposers = new Map<string, DefaultEditComposerRuntimeCore>();\n public getEditComposer(messageId: string) {\n return this._editComposers.get(messageId);\n }\n public beginEdit(messageId: string) {\n if (this._editComposers.has(messageId))\n throw new Error(\"Edit already in progress\");\n\n this._editComposers.set(\n messageId,\n new DefaultEditComposerRuntimeCore(\n this,\n () => this._editComposers.delete(messageId),\n this.repository.getMessage(messageId),\n ),\n );\n this._notifySubscribers();\n }\n\n public getMessageById(messageId: string) {\n try {\n return this.repository.getMessage(messageId);\n } catch {\n // Check voice messages\n const baseMessages = this.repository.getMessages();\n const voiceIdx = this._voiceMessages.findIndex((m) => m.id === messageId);\n if (voiceIdx !== -1) {\n const parentId =\n voiceIdx > 0\n ? this._voiceMessages[voiceIdx - 1]!.id\n : (baseMessages.at(-1)?.id ?? null);\n return {\n parentId,\n message: this._voiceMessages[voiceIdx]!,\n index: baseMessages.length + voiceIdx,\n };\n }\n return undefined;\n }\n }\n\n public getBranches(messageId: string): string[] {\n if (this._voiceMessages.some((m) => m.id === messageId)) {\n return [];\n }\n return this.repository.getBranches(messageId);\n }\n\n public switchToBranch(branchId: string): void {\n this.repository.switchToBranch(branchId);\n this._notifySubscribers();\n }\n\n protected _notifySubscribers() {\n for (const callback of this._subscriptions) callback();\n }\n\n public _notifyEventSubscribers<E extends ThreadRuntimeEventType>(\n event: E,\n payload: ThreadRuntimeEventPayload[E],\n ) {\n const subscribers = this._eventSubscribers.get(event);\n if (!subscribers) return;\n\n for (const callback of subscribers) callback(payload);\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n public submitFeedback({ messageId, type }: SubmitFeedbackOptions) {\n const adapter = this.adapters?.feedback;\n if (!adapter) throw new Error(\"Feedback adapter not configured\");\n\n const { message, parentId } = this.repository.getMessage(messageId);\n adapter.submit({ message, type });\n\n if (message.role === \"assistant\") {\n const updatedMessage: ThreadMessage = {\n ...message,\n metadata: {\n ...message.metadata,\n submittedFeedback: { type },\n },\n };\n this.repository.addOrUpdateMessage(parentId, updatedMessage);\n }\n\n this._notifySubscribers();\n }\n\n private _stopSpeaking: Unsubscribe | undefined;\n public speech: SpeechState | undefined;\n\n public speak(messageId: string) {\n const adapter = this.adapters?.speech;\n if (!adapter) throw new Error(\"Speech adapter not configured\");\n\n const { message } = this.repository.getMessage(messageId);\n\n this._stopSpeaking?.();\n\n const utterance = adapter.speak(getThreadMessageText(message));\n const unsub = utterance.subscribe(() => {\n if (utterance.status.type === \"ended\") {\n this._stopSpeaking = undefined;\n this.speech = undefined;\n } else {\n this.speech = { messageId, status: utterance.status };\n }\n this._notifySubscribers();\n });\n\n this.speech = { messageId, status: utterance.status };\n this._notifySubscribers();\n\n this._stopSpeaking = () => {\n utterance.cancel();\n unsub();\n this.speech = undefined;\n this._stopSpeaking = undefined;\n };\n }\n\n public stopSpeaking() {\n if (!this._stopSpeaking) throw new Error(\"No message is being spoken\");\n this._stopSpeaking();\n this._notifySubscribers();\n }\n\n private _voiceSession: RealtimeVoiceAdapter.Session | undefined;\n private _voiceUnsubs: Array<() => void> = [];\n public voice: VoiceSessionState | undefined;\n\n private _voiceVolume = 0;\n private _voiceVolumeSubscribers = new Set<() => void>();\n\n public getVoiceVolume = () => this._voiceVolume;\n\n public subscribeVoiceVolume = (callback: () => void): Unsubscribe => {\n this._voiceVolumeSubscribers.add(callback);\n return () => this._voiceVolumeSubscribers.delete(callback);\n };\n\n public connectVoice() {\n const adapter = this.adapters?.voice;\n if (!adapter) throw new Error(\"Voice adapter not configured\");\n\n this.disconnectVoice();\n\n const session = adapter.connect({});\n this._voiceSession = session;\n const unsubs: Array<() => void> = [];\n\n let currentMode: RealtimeVoiceAdapter.Mode = \"listening\";\n\n this.voice = {\n status: session.status,\n isMuted: session.isMuted,\n mode: currentMode,\n };\n this._voiceVolume = 0;\n this._notifySubscribers();\n\n unsubs.push(\n session.onStatusChange((status) => {\n if (status.type === \"ended\") {\n this._finishVoiceAssistantMessage();\n this._voiceSession = undefined;\n this.voice = undefined;\n } else {\n this.voice = {\n status,\n isMuted: session.isMuted,\n mode: currentMode,\n };\n }\n this._notifySubscribers();\n }),\n );\n\n unsubs.push(\n session.onModeChange((mode) => {\n currentMode = mode;\n if (this.voice) {\n this.voice = { ...this.voice, mode };\n this._notifySubscribers();\n }\n }),\n );\n\n unsubs.push(\n session.onVolumeChange((volume) => {\n this._voiceVolume = volume;\n for (const cb of this._voiceVolumeSubscribers) cb();\n }),\n );\n\n unsubs.push(\n session.onTranscript((transcript) => {\n this._handleVoiceTranscript(transcript);\n }),\n );\n\n this._voiceUnsubs = unsubs;\n }\n\n private _currentAssistantMsg: ThreadAssistantMessage | null = null;\n\n private _handleVoiceTranscript(\n transcript: RealtimeVoiceAdapter.TranscriptItem,\n ) {\n this.ensureInitialized();\n\n if (transcript.role === \"user\") {\n this._finishVoiceAssistantMessage();\n this._currentAssistantMsg = null;\n\n if (transcript.isFinal) {\n this._voiceMessages.push({\n id: generateId(),\n role: \"user\",\n content: [{ type: \"text\", text: transcript.text }],\n metadata: { custom: {} },\n createdAt: new Date(),\n status: { type: \"complete\", reason: \"unknown\" },\n attachments: [],\n });\n this._markVoiceMessagesDirty();\n this._notifySubscribers();\n }\n } else {\n if (!this._currentAssistantMsg) {\n this._currentAssistantMsg = {\n id: generateId(),\n role: \"assistant\",\n content: [{ type: \"text\", text: transcript.text }],\n metadata: {\n unstable_state: this.state,\n unstable_annotations: [],\n unstable_data: [],\n steps: [],\n custom: {},\n },\n status: { type: \"running\" },\n createdAt: new Date(),\n };\n this._voiceMessages.push(this._currentAssistantMsg);\n } else {\n const idx = this._voiceMessages.indexOf(this._currentAssistantMsg);\n if (idx === -1) return;\n const updated: ThreadAssistantMessage = {\n ...this._currentAssistantMsg,\n content: [{ type: \"text\", text: transcript.text }],\n ...(transcript.isFinal\n ? { status: { type: \"complete\", reason: \"stop\" } }\n : {}),\n };\n this._voiceMessages[idx] = updated;\n this._currentAssistantMsg = updated;\n }\n\n if (transcript.isFinal) {\n this._currentAssistantMsg = null;\n }\n\n this._markVoiceMessagesDirty();\n this._notifySubscribers();\n }\n }\n\n private _finishVoiceAssistantMessage() {\n const last = this._voiceMessages.at(-1);\n if (last?.role === \"assistant\" && last.status.type === \"running\") {\n const idx = this._voiceMessages.length - 1;\n this._voiceMessages[idx] = {\n ...(last as ThreadAssistantMessage),\n status: { type: \"complete\", reason: \"stop\" },\n };\n this._markVoiceMessagesDirty();\n this._notifySubscribers();\n }\n }\n\n public disconnectVoice() {\n this._finishVoiceAssistantMessage();\n this._currentAssistantMsg = null;\n for (const unsub of this._voiceUnsubs) unsub();\n this._voiceUnsubs = [];\n this._voiceSession?.disconnect();\n this._voiceSession = undefined;\n this.voice = undefined;\n this._voiceVolume = 0;\n for (const cb of this._voiceVolumeSubscribers) cb();\n this._voiceMessages = [];\n this._markVoiceMessagesDirty();\n this._notifySubscribers();\n }\n\n public muteVoice() {\n if (!this._voiceSession) throw new Error(\"No active voice session\");\n this._voiceSession.mute();\n this.voice = {\n ...this.voice!,\n isMuted: true,\n };\n this._notifySubscribers();\n }\n\n public unmuteVoice() {\n if (!this._voiceSession) throw new Error(\"No active voice session\");\n this._voiceSession.unmute();\n this.voice = {\n ...this.voice!,\n isMuted: false,\n };\n this._notifySubscribers();\n }\n\n protected ensureInitialized() {\n if (!this._isInitialized) {\n this._isInitialized = true;\n this._notifyEventSubscribers(\"initialize\", {});\n }\n }\n\n public export() {\n return this.repository.export();\n }\n\n public import(data: ExportedMessageRepository) {\n this.ensureInitialized();\n this.repository.clear();\n this.repository.import(data);\n this._notifySubscribers();\n }\n\n public reset(initialMessages?: readonly ThreadMessageLike[]) {\n this.import(ExportedMessageRepository.fromArray(initialMessages ?? []));\n }\n\n private _eventSubscribers = new Map<\n ThreadRuntimeEventType,\n Set<(payload?: unknown) => void>\n >();\n\n public unstable_on<E extends ThreadRuntimeEventType>(\n event: E,\n callback: ThreadRuntimeEventCallback<E>,\n ) {\n const wrapped = callback as (payload?: unknown) => void;\n if (event === \"modelContextUpdate\") {\n // provider.subscribe is `() => void`; pump the typed empty payload to the user callback.\n return this._contextProvider.subscribe?.(() => wrapped({})) ?? (() => {});\n }\n\n let subscribers = this._eventSubscribers.get(event);\n if (!subscribers) {\n subscribers = new Set();\n this._eventSubscribers.set(event, subscribers);\n }\n subscribers.add(wrapped);\n\n // `initialize` latches: replay it (deferred) to subscribers that attach\n // after the thread already initialized, mirroring a BehaviorSubject.\n if (event === \"initialize\" && this._isInitialized) {\n queueMicrotask(() => {\n if (subscribers.has(wrapped)) wrapped({});\n });\n }\n\n return () => {\n this._eventSubscribers.get(event)?.delete(wrapped);\n };\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"default-edit-composer-runtime-core.js","names":[],"sources":["../../../src/runtime/base/default-edit-composer-runtime-core.ts"],"sourcesContent":["import type { AppendMessage, ThreadMessage } from \"../../types/message\";\nimport type { CompleteAttachment } from \"../../types/attachment\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport { attachmentsEqual, liftNonTextParts } from \"../../adapters/attachment\";\nimport type { AttachmentAdapter } from \"../../adapters/attachment\";\nimport type { DictationAdapter } from \"../../adapters/speech\";\nimport type { SendOptions } from \"../interfaces/composer-runtime-core\";\nimport type { ThreadRuntimeCore } from \"../interfaces/thread-runtime-core\";\nimport { BaseComposerRuntimeCore } from \"./base-composer-runtime-core\";\n\nexport class DefaultEditComposerRuntimeCore extends BaseComposerRuntimeCore {\n public get canCancel() {\n return true;\n }\n\n public get canSend() {\n return !this.isEmpty;\n }\n\n protected getAttachmentAdapter() {\n return this.runtime.adapters?.attachments;\n }\n\n protected getDictationAdapter() {\n return this.runtime.adapters?.dictation;\n }\n\n private _previousText;\n private _previousAttachments: readonly CompleteAttachment[];\n private _nonTextPassthrough: readonly ThreadMessage[\"content\"][number][];\n private _parentId: string | null;\n private _sourceId: string | null;\n constructor(\n private runtime: ThreadRuntimeCore & {\n adapters?:\n | {\n attachments?: AttachmentAdapter | undefined;\n dictation?: DictationAdapter | undefined;\n }\n | undefined;\n },\n private endEditCallback: () => void,\n { parentId, message }: { parentId: string | null; message: ThreadMessage },\n ) {\n super();\n this._parentId = parentId;\n this._sourceId = message.id;\n this._previousText = getThreadMessageText(message);\n this.setText(this._previousText);\n\n this.setRole(message.role);\n\n if (message.role === \"user\") {\n this._previousAttachments = [\n ...(message.attachments ?? []),\n ...liftNonTextParts(message.content),\n ];\n this._nonTextPassthrough = [];\n } else {\n this._previousAttachments = message.attachments ?? [];\n this._nonTextPassthrough = message.content.filter(\n (p) => p.type !== \"text\",\n );\n }\n this.setAttachments(this._previousAttachments);\n\n this.setRunConfig({ ...runtime.composer.runConfig });\n }\n\n public get parentId() {\n return this._parentId;\n }\n\n public get sourceId() {\n return this._sourceId;\n }\n\n public async handleSend(\n message: Omit<AppendMessage, \"parentId\" | \"sourceId\">,\n options?: SendOptions,\n ) {\n const text = getThreadMessageText(message as AppendMessage);\n const attachmentsChanged = !attachmentsEqual(\n message.attachments ?? [],\n this._previousAttachments,\n );\n\n if (\n text !== this._previousText ||\n attachmentsChanged ||\n options?.startRun\n ) {\n const content =\n this._nonTextPassthrough.length > 0\n ? ([\n ...message.content,\n ...this._nonTextPassthrough,\n ] as AppendMessage[\"content\"])\n : message.content;\n this.runtime.append({\n ...message,\n content,\n parentId: this._parentId,\n sourceId: this._sourceId,\n startRun: options?.startRun,\n });\n }\n\n this.handleCancel();\n }\n\n public handleCancel() {\n this.endEditCallback();\n this._notifySubscribers();\n }\n}\n"],"mappings":";;;;AAUA,IAAa,iCAAb,cAAoD,wBAAwB;CAuBhE;CAQA;CA9BV,IAAW,YAAY;EACrB,OAAO;CACT;CAEA,IAAW,UAAU;EACnB,OAAO,CAAC,KAAK;CACf;CAEA,uBAAiC;EAC/B,OAAO,KAAK,QAAQ,UAAU;CAChC;CAEA,sBAAgC;EAC9B,OAAO,KAAK,QAAQ,UAAU;CAChC;CAEA;CACA;CACA;CACA;CACA;CACA,YACE,SAQA,iBACA,EAAE,UAAU,WACZ;EACA,MAAM;EAXE,KAAA,UAAA;EAQA,KAAA,kBAAA;EAIR,KAAK,YAAY;EACjB,KAAK,YAAY,QAAQ;EACzB,KAAK,gBAAgB,qBAAqB,OAAO;EACjD,KAAK,QAAQ,KAAK,aAAa;EAE/B,KAAK,QAAQ,QAAQ,IAAI;EAEzB,IAAI,QAAQ,SAAS,QAAQ;GAC3B,KAAK,uBAAuB,CAC1B,GAAI,QAAQ,eAAe,CAAC,GAC5B,GAAG,iBAAiB,QAAQ,OAAO,CACrC;GACA,KAAK,sBAAsB,CAAC;EAC9B,OAAO;GACL,KAAK,uBAAuB,QAAQ,eAAe,CAAC;GACpD,KAAK,sBAAsB,QAAQ,QAAQ,QACxC,MAAM,EAAE,SAAS,MACpB;EACF;EACA,KAAK,eAAe,KAAK,oBAAoB;EAE7C,KAAK,aAAa,EAAE,GAAG,QAAQ,SAAS,UAAU,CAAC;CACrD;CAEA,IAAW,WAAW;EACpB,OAAO,KAAK;CACd;CAEA,IAAW,WAAW;EACpB,OAAO,KAAK;CACd;CAEA,MAAa,WACX,SACA,SACA;EACA,MAAM,OAAO,qBAAqB,OAAwB;EAC1D,MAAM,qBAAqB,CAAC,iBAC1B,QAAQ,eAAe,CAAC,GACxB,KAAK,oBACP;EAEA,IACE,SAAS,KAAK,iBACd,sBACA,SAAS,UACT;GACA,MAAM,UACJ,KAAK,oBAAoB,SAAS,IAC7B,CACC,GAAG,QAAQ,SACX,GAAG,KAAK,mBACV,IACA,QAAQ;GACd,KAAK,QAAQ,OAAO;IAClB,GAAG;IACH;IACA,UAAU,KAAK;IACf,UAAU,KAAK;IACf,UAAU,SAAS;GACrB,CAAC;EACH;EAEA,KAAK,aAAa;CACpB;CAEA,eAAsB;EACpB,KAAK,gBAAgB;EACrB,KAAK,mBAAmB;CAC1B;AACF"}
1
+ {"version":3,"file":"default-edit-composer-runtime-core.js","names":["AppendMessage","ThreadMessage","CompleteAttachment","getThreadMessageText","attachmentsEqual","liftNonTextParts","AttachmentAdapter","DictationAdapter","SendOptions","ThreadRuntimeCore","BaseComposerRuntimeCore","DefaultEditComposerRuntimeCore","canCancel","canSend","isEmpty","getAttachmentAdapter","runtime","adapters","attachments","getDictationAdapter","dictation","_previousText","_previousAttachments","_nonTextPassthrough","_parentId","_sourceId","constructor","endEditCallback","parentId","message","id","setText","setRole","role","content","filter","p","type","setAttachments","setRunConfig","composer","runConfig","sourceId","handleSend","Omit","options","text","attachmentsChanged","startRun","length","append","handleCancel","_notifySubscribers"],"sources":["../../../src/runtime/base/default-edit-composer-runtime-core.ts"],"sourcesContent":["import type { AppendMessage, ThreadMessage } from \"../../types/message\";\nimport type { CompleteAttachment } from \"../../types/attachment\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport { attachmentsEqual, liftNonTextParts } from \"../../adapters/attachment\";\nimport type { AttachmentAdapter } from \"../../adapters/attachment\";\nimport type { DictationAdapter } from \"../../adapters/speech\";\nimport type { SendOptions } from \"../interfaces/composer-runtime-core\";\nimport type { ThreadRuntimeCore } from \"../interfaces/thread-runtime-core\";\nimport { BaseComposerRuntimeCore } from \"./base-composer-runtime-core\";\n\nexport class DefaultEditComposerRuntimeCore extends BaseComposerRuntimeCore {\n public get canCancel() {\n return true;\n }\n\n public get canSend() {\n return !this.isEmpty;\n }\n\n protected getAttachmentAdapter() {\n return this.runtime.adapters?.attachments;\n }\n\n protected getDictationAdapter() {\n return this.runtime.adapters?.dictation;\n }\n\n private _previousText;\n private _previousAttachments: readonly CompleteAttachment[];\n private _nonTextPassthrough: readonly ThreadMessage[\"content\"][number][];\n private _parentId: string | null;\n private _sourceId: string | null;\n constructor(\n private runtime: ThreadRuntimeCore & {\n adapters?:\n | {\n attachments?: AttachmentAdapter | undefined;\n dictation?: DictationAdapter | undefined;\n }\n | undefined;\n },\n private endEditCallback: () => void,\n { parentId, message }: { parentId: string | null; message: ThreadMessage },\n ) {\n super();\n this._parentId = parentId;\n this._sourceId = message.id;\n this._previousText = getThreadMessageText(message);\n this.setText(this._previousText);\n\n this.setRole(message.role);\n\n if (message.role === \"user\") {\n this._previousAttachments = [\n ...(message.attachments ?? []),\n ...liftNonTextParts(message.content),\n ];\n this._nonTextPassthrough = [];\n } else {\n this._previousAttachments = message.attachments ?? [];\n this._nonTextPassthrough = message.content.filter(\n (p) => p.type !== \"text\",\n );\n }\n this.setAttachments(this._previousAttachments);\n\n this.setRunConfig({ ...runtime.composer.runConfig });\n }\n\n public get parentId() {\n return this._parentId;\n }\n\n public get sourceId() {\n return this._sourceId;\n }\n\n public async handleSend(\n message: Omit<AppendMessage, \"parentId\" | \"sourceId\">,\n options?: SendOptions,\n ) {\n const text = getThreadMessageText(message as AppendMessage);\n const attachmentsChanged = !attachmentsEqual(\n message.attachments ?? [],\n this._previousAttachments,\n );\n\n if (\n text !== this._previousText ||\n attachmentsChanged ||\n options?.startRun\n ) {\n const content =\n this._nonTextPassthrough.length > 0\n ? ([\n ...message.content,\n ...this._nonTextPassthrough,\n ] as AppendMessage[\"content\"])\n : message.content;\n this.runtime.append({\n ...message,\n content,\n parentId: this._parentId,\n sourceId: this._sourceId,\n startRun: options?.startRun,\n });\n }\n\n this.handleCancel();\n }\n\n public handleCancel() {\n this.endEditCallback();\n this._notifySubscribers();\n }\n}\n"],"mappings":";;;;AAUA,IAAaW,iCAAb,cAAoDD,wBAAwB;CAuBhEM;CAQAW;CA9BV,IAAWf,YAAY;EACrB,OAAO;CACT;CAEA,IAAWC,UAAU;EACnB,OAAO,CAAC,KAAKC;CACf;CAEA,uBAAiC;EAC/B,OAAO,KAAKE,QAAQC,UAAUC;CAChC;CAEA,sBAAgC;EAC9B,OAAO,KAAKF,QAAQC,UAAUG;CAChC;CAEA;CACA;CACA;CACA;CACA;CACAM,YACE,SAQA,iBACA,EAAEE,UAAUC,WACZ;EACA,MAAM;EAXEb,KAAAA,UAAAA;EAQAW,KAAAA,kBAAAA;EAIR,KAAKH,YAAYI;EACjB,KAAKH,YAAYI,QAAQC;EACzB,KAAKT,gBAAgBlB,qBAAqB0B,OAAO;EACjD,KAAKE,QAAQ,KAAKV,aAAa;EAE/B,KAAKW,QAAQH,QAAQI,IAAI;EAEzB,IAAIJ,QAAQI,SAAS,QAAQ;GAC3B,KAAKX,uBAAuB,CAC1B,GAAIO,QAAQX,eAAe,CAAA,GAC3B,GAAGb,iBAAiBwB,QAAQK,OAAO,CAAC;GAEtC,KAAKX,sBAAsB,CAAA;EAC7B,OAAO;GACL,KAAKD,uBAAuBO,QAAQX,eAAe,CAAA;GACnD,KAAKK,sBAAsBM,QAAQK,QAAQC,QACxCC,MAAMA,EAAEC,SAAS,MACpB;EACF;EACA,KAAKC,eAAe,KAAKhB,oBAAoB;EAE7C,KAAKiB,aAAa,EAAE,GAAGvB,QAAQwB,SAASC,UAAU,CAAC;CACrD;CAEA,IAAWb,WAAW;EACpB,OAAO,KAAKJ;CACd;CAEA,IAAWkB,WAAW;EACpB,OAAO,KAAKjB;CACd;CAEA,MAAakB,WACXd,SACAgB,SACA;EACA,MAAMC,OAAO3C,qBAAqB0B,OAAwB;EAC1D,MAAMkB,qBAAqB,CAAC3C,iBAC1ByB,QAAQX,eAAe,CAAA,GACvB,KAAKI,oBACP;EAEA,IACEwB,SAAS,KAAKzB,iBACd0B,sBACAF,SAASG,UACT;GACA,MAAMd,UACJ,KAAKX,oBAAoB0B,SAAS,IAC7B,CACC,GAAGpB,QAAQK,SACX,GAAG,KAAKX,mBAAmB,IAE7BM,QAAQK;GACd,KAAKlB,QAAQkC,OAAO;IAClB,GAAGrB;IACHK;IACAN,UAAU,KAAKJ;IACfkB,UAAU,KAAKjB;IACfuB,UAAUH,SAASG;GACrB,CAAC;EACH;EAEA,KAAKG,aAAa;CACpB;CAEA,eAAsB;EACpB,KAAKxB,gBAAgB;EACrB,KAAKyB,mBAAmB;CAC1B;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"default-thread-composer-runtime-core.js","names":[],"sources":["../../../src/runtime/base/default-thread-composer-runtime-core.ts"],"sourcesContent":["import type { AppendMessage } from \"../../types/message\";\nimport type { AttachmentAdapter } from \"../../adapters/attachment\";\nimport type { DictationAdapter } from \"../../adapters/speech\";\nimport type {\n SendOptions,\n ThreadComposerRuntimeCore,\n} from \"../interfaces/composer-runtime-core\";\nimport type { ThreadRuntimeCore } from \"../interfaces/thread-runtime-core\";\nimport {\n EMPTY_QUEUE_ITEMS,\n type QueueItemState,\n} from \"../../store/scopes/queue-item\";\nimport { BaseComposerRuntimeCore } from \"./base-composer-runtime-core\";\n\nexport class DefaultThreadComposerRuntimeCore\n extends BaseComposerRuntimeCore\n implements ThreadComposerRuntimeCore\n{\n private _canCancel = false;\n public get canCancel() {\n return this._canCancel;\n }\n\n public get canSend() {\n return !this.isEmpty && !this.runtime.isSendDisabled;\n }\n\n public override get queue(): readonly QueueItemState[] {\n return this.runtime.getQueueItems?.() ?? EMPTY_QUEUE_ITEMS;\n }\n\n public override steerQueueItem(queueItemId: string): void {\n this.runtime.steerQueueItem?.(queueItemId);\n }\n\n public override removeQueueItem(queueItemId: string): void {\n this.runtime.removeQueueItem?.(queueItemId);\n }\n\n protected getAttachmentAdapter() {\n return this.runtime.adapters?.attachments;\n }\n\n protected getDictationAdapter() {\n return this.runtime.adapters?.dictation;\n }\n\n constructor(\n private runtime: Omit<ThreadRuntimeCore, \"composer\"> & {\n adapters?:\n | {\n attachments?: AttachmentAdapter | undefined;\n dictation?: DictationAdapter | undefined;\n }\n | undefined;\n },\n ) {\n super();\n this.connect();\n }\n\n public connect() {\n let lastIsSendDisabled = this.runtime.isSendDisabled;\n let lastQueue = this.queue;\n return this.runtime.subscribe(() => {\n let changed = false;\n if (this.canCancel !== this.runtime.capabilities.cancel) {\n this._canCancel = this.runtime.capabilities.cancel;\n changed = true;\n }\n if (lastIsSendDisabled !== this.runtime.isSendDisabled) {\n lastIsSendDisabled = this.runtime.isSendDisabled;\n changed = true;\n }\n if (lastQueue !== this.queue) {\n lastQueue = this.queue;\n changed = true;\n }\n if (changed) this._notifySubscribers();\n });\n }\n\n public async handleSend(\n message: Omit<AppendMessage, \"parentId\" | \"sourceId\">,\n options?: SendOptions,\n ) {\n this.runtime.append({\n ...(message as AppendMessage),\n parentId: this.runtime.messages.at(-1)?.id ?? null,\n sourceId: null,\n startRun: options?.startRun,\n steer: options?.steer,\n });\n }\n\n public async handleCancel() {\n this.runtime.cancelRun();\n }\n}\n"],"mappings":";;;AAcA,IAAa,mCAAb,cACU,wBAEV;CA+BY;CA9BV,aAAqB;CACrB,IAAW,YAAY;EACrB,OAAO,KAAK;CACd;CAEA,IAAW,UAAU;EACnB,OAAO,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ;CACxC;CAEA,IAAoB,QAAmC;EACrD,OAAO,KAAK,QAAQ,gBAAgB,KAAK;CAC3C;CAEA,eAA+B,aAA2B;EACxD,KAAK,QAAQ,iBAAiB,WAAW;CAC3C;CAEA,gBAAgC,aAA2B;EACzD,KAAK,QAAQ,kBAAkB,WAAW;CAC5C;CAEA,uBAAiC;EAC/B,OAAO,KAAK,QAAQ,UAAU;CAChC;CAEA,sBAAgC;EAC9B,OAAO,KAAK,QAAQ,UAAU;CAChC;CAEA,YACE,SAQA;EACA,MAAM;EATE,KAAA,UAAA;EAUR,KAAK,QAAQ;CACf;CAEA,UAAiB;EACf,IAAI,qBAAqB,KAAK,QAAQ;EACtC,IAAI,YAAY,KAAK;EACrB,OAAO,KAAK,QAAQ,gBAAgB;GAClC,IAAI,UAAU;GACd,IAAI,KAAK,cAAc,KAAK,QAAQ,aAAa,QAAQ;IACvD,KAAK,aAAa,KAAK,QAAQ,aAAa;IAC5C,UAAU;GACZ;GACA,IAAI,uBAAuB,KAAK,QAAQ,gBAAgB;IACtD,qBAAqB,KAAK,QAAQ;IAClC,UAAU;GACZ;GACA,IAAI,cAAc,KAAK,OAAO;IAC5B,YAAY,KAAK;IACjB,UAAU;GACZ;GACA,IAAI,SAAS,KAAK,mBAAmB;EACvC,CAAC;CACH;CAEA,MAAa,WACX,SACA,SACA;EACA,KAAK,QAAQ,OAAO;GAClB,GAAI;GACJ,UAAU,KAAK,QAAQ,SAAS,GAAG,EAAE,CAAC,EAAE,MAAM;GAC9C,UAAU;GACV,UAAU,SAAS;GACnB,OAAO,SAAS;EAClB,CAAC;CACH;CAEA,MAAa,eAAe;EAC1B,KAAK,QAAQ,UAAU;CACzB;AACF"}
1
+ {"version":3,"file":"default-thread-composer-runtime-core.js","names":["AppendMessage","AttachmentAdapter","DictationAdapter","SendOptions","ThreadComposerRuntimeCore","ThreadRuntimeCore","EMPTY_QUEUE_ITEMS","QueueItemState","BaseComposerRuntimeCore","DefaultThreadComposerRuntimeCore","_canCancel","canCancel","canSend","isEmpty","runtime","isSendDisabled","queue","getQueueItems","steerQueueItem","queueItemId","removeQueueItem","getAttachmentAdapter","adapters","attachments","getDictationAdapter","dictation","constructor","Omit","connect","lastIsSendDisabled","lastQueue","subscribe","changed","capabilities","cancel","_notifySubscribers","handleSend","message","options","append","parentId","messages","at","id","sourceId","startRun","steer","handleCancel","cancelRun"],"sources":["../../../src/runtime/base/default-thread-composer-runtime-core.ts"],"sourcesContent":["import type { AppendMessage } from \"../../types/message\";\nimport type { AttachmentAdapter } from \"../../adapters/attachment\";\nimport type { DictationAdapter } from \"../../adapters/speech\";\nimport type {\n SendOptions,\n ThreadComposerRuntimeCore,\n} from \"../interfaces/composer-runtime-core\";\nimport type { ThreadRuntimeCore } from \"../interfaces/thread-runtime-core\";\nimport {\n EMPTY_QUEUE_ITEMS,\n type QueueItemState,\n} from \"../../store/scopes/queue-item\";\nimport { BaseComposerRuntimeCore } from \"./base-composer-runtime-core\";\n\nexport class DefaultThreadComposerRuntimeCore\n extends BaseComposerRuntimeCore\n implements ThreadComposerRuntimeCore\n{\n private _canCancel = false;\n public get canCancel() {\n return this._canCancel;\n }\n\n public get canSend() {\n return !this.isEmpty && !this.runtime.isSendDisabled;\n }\n\n public override get queue(): readonly QueueItemState[] {\n return this.runtime.getQueueItems?.() ?? EMPTY_QUEUE_ITEMS;\n }\n\n public override steerQueueItem(queueItemId: string): void {\n this.runtime.steerQueueItem?.(queueItemId);\n }\n\n public override removeQueueItem(queueItemId: string): void {\n this.runtime.removeQueueItem?.(queueItemId);\n }\n\n protected getAttachmentAdapter() {\n return this.runtime.adapters?.attachments;\n }\n\n protected getDictationAdapter() {\n return this.runtime.adapters?.dictation;\n }\n\n constructor(\n private runtime: Omit<ThreadRuntimeCore, \"composer\"> & {\n adapters?:\n | {\n attachments?: AttachmentAdapter | undefined;\n dictation?: DictationAdapter | undefined;\n }\n | undefined;\n },\n ) {\n super();\n this.connect();\n }\n\n public connect() {\n let lastIsSendDisabled = this.runtime.isSendDisabled;\n let lastQueue = this.queue;\n return this.runtime.subscribe(() => {\n let changed = false;\n if (this.canCancel !== this.runtime.capabilities.cancel) {\n this._canCancel = this.runtime.capabilities.cancel;\n changed = true;\n }\n if (lastIsSendDisabled !== this.runtime.isSendDisabled) {\n lastIsSendDisabled = this.runtime.isSendDisabled;\n changed = true;\n }\n if (lastQueue !== this.queue) {\n lastQueue = this.queue;\n changed = true;\n }\n if (changed) this._notifySubscribers();\n });\n }\n\n public async handleSend(\n message: Omit<AppendMessage, \"parentId\" | \"sourceId\">,\n options?: SendOptions,\n ) {\n this.runtime.append({\n ...(message as AppendMessage),\n parentId: this.runtime.messages.at(-1)?.id ?? null,\n sourceId: null,\n startRun: options?.startRun,\n steer: options?.steer,\n });\n }\n\n public async handleCancel() {\n this.runtime.cancelRun();\n }\n}\n"],"mappings":";;;AAcA,IAAaS,mCAAb,cACUD,wBAEV;CA+BYM;CA9BV,aAAqB;CACrB,IAAWH,YAAY;EACrB,OAAO,KAAKD;CACd;CAEA,IAAWE,UAAU;EACnB,OAAO,CAAC,KAAKC,WAAW,CAAC,KAAKC,QAAQC;CACxC;CAEA,IAAoBC,QAAmC;EACrD,OAAO,KAAKF,QAAQG,gBAAgB,KAAKX;CAC3C;CAEA,eAA+Ba,aAA2B;EACxD,KAAKL,QAAQI,iBAAiBC,WAAW;CAC3C;CAEA,gBAAgCA,aAA2B;EACzD,KAAKL,QAAQM,kBAAkBD,WAAW;CAC5C;CAEA,uBAAiC;EAC/B,OAAO,KAAKL,QAAQQ,UAAUC;CAChC;CAEA,sBAAgC;EAC9B,OAAO,KAAKT,QAAQQ,UAAUG;CAChC;CAEAC,YACE,SAQA;EACA,MAAM;EATEZ,KAAAA,UAAAA;EAUR,KAAKc,QAAQ;CACf;CAEA,UAAiB;EACf,IAAIC,qBAAqB,KAAKf,QAAQC;EACtC,IAAIe,YAAY,KAAKd;EACrB,OAAO,KAAKF,QAAQiB,gBAAgB;GAClC,IAAIC,UAAU;GACd,IAAI,KAAKrB,cAAc,KAAKG,QAAQmB,aAAaC,QAAQ;IACvD,KAAKxB,aAAa,KAAKI,QAAQmB,aAAaC;IAC5CF,UAAU;GACZ;GACA,IAAIH,uBAAuB,KAAKf,QAAQC,gBAAgB;IACtDc,qBAAqB,KAAKf,QAAQC;IAClCiB,UAAU;GACZ;GACA,IAAIF,cAAc,KAAKd,OAAO;IAC5Bc,YAAY,KAAKd;IACjBgB,UAAU;GACZ;GACA,IAAIA,SAAS,KAAKG,mBAAmB;EACvC,CAAC;CACH;CAEA,MAAaC,WACXC,SACAC,SACA;EACA,KAAKxB,QAAQyB,OAAO;GAClB,GAAIF;GACJG,UAAU,KAAK1B,QAAQ2B,SAASC,GAAG,EAAE,CAAC,EAAEC,MAAM;GAC9CC,UAAU;GACVC,UAAUP,SAASO;GACnBC,OAAOR,SAASQ;EAClB,CAAC;CACH;CAEA,MAAaC,eAAe;EAC1B,KAAKjC,QAAQkC,UAAU;CACzB;AACF"}
@@ -0,0 +1,30 @@
1
+ //#region src/runtime/branch/external-thread-branch-adapter.d.ts
2
+ /**
3
+ * The branch surface a runtime exposes so the branch picker can navigate
4
+ * between sibling variants of a message. Read during render; recreate the
5
+ * adapter object when branch data changes.
6
+ *
7
+ * Editing a message creates a branch only if the `onEdit` handler creates a
8
+ * sibling and `getBranches` reports it. Note that `ExternalThread`'s edit
9
+ * payload carries the edited message's own id as both `parentId` and
10
+ * `sourceId`.
11
+ */
12
+ type ExternalThreadBranchAdapter = {
13
+ /**
14
+ * Returns the sibling branch ids for a message in display order, including
15
+ * the message's own id. Return an empty array for messages without
16
+ * alternative branches.
17
+ */
18
+ getBranches: (messageId: string) => readonly string[];
19
+ /**
20
+ * Makes the given branch the visible one. The runtime is expected to swap
21
+ * the `messages` array to the selected branch. May be invoked
22
+ * programmatically while a run is in progress; pending queue items are not
23
+ * cleared, and reconciling them with the new branch is the runtime's
24
+ * responsibility.
25
+ */
26
+ switchToBranch: (branchId: string) => void;
27
+ };
28
+ //#endregion
29
+ export { ExternalThreadBranchAdapter };
30
+ //# sourceMappingURL=external-thread-branch-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-thread-branch-adapter.d.ts","names":[],"sources":["../../../src/runtime/branch/external-thread-branch-adapter.ts"],"mappings":";;AAUA;;;;;;;;;KAAY,2BAAA;;;;;;EAMV,WAAA,GAAc,SAAA;;;;;;;;EAQd,cAAA,GAAiB,QAAA;AAAA"}
@@ -9,6 +9,7 @@ type ThreadListItemCoreState = {
9
9
  readonly externalId: string | undefined;
10
10
  readonly status: ThreadListItemStatus;
11
11
  readonly title?: string | undefined;
12
+ readonly lastMessageAt?: Date | undefined;
12
13
  readonly custom?: Record<string, unknown> | undefined;
13
14
  readonly runtime?: ThreadRuntimeCore | undefined;
14
15
  };
@@ -1 +1 @@
1
- {"version":3,"file":"thread-list-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/interfaces/thread-list-runtime-core.ts"],"mappings":";;;;KAGY,oBAAA;AAAA,KAEA,uBAAA;EAAA,SACD,EAAA;EAAA,SACA,QAAA;EAAA,SACA,UAAA;EAAA,SAEA,MAAA,EAAQ,oBAAA;EAAA,SACR,KAAA;EAAA,SACA,MAAA,GAAS,MAAA;EAAA,SAET,OAAA,GAAU,iBAAA;AAAA;AAAA,KAGT,qBAAA;EAAA,SACD,SAAA;EAAA,SACA,aAAA;EAAA,SACA,OAAA;EACT,YAAA;EACA,WAAA;EAEA,SAAA;EACA,iBAAA;EAAA,SAES,WAAA,EAAa,QAAA,CAAS,MAAA,SAAe,uBAAA;EAE9C,wBAAA,IAA4B,iBAAA;EAC5B,oBAAA,CAAqB,QAAA,WAAmB,iBAAA;EAExC,WAAA,CAAY,QAAA,WAAmB,uBAAA;EAE/B,cAAA,CACE,QAAA,UACA,OAAA;IAAY,SAAA;EAAA,IACX,OAAA;EACH,iBAAA,IAAqB,OAAA;EAErB,qBAAA,IAAyB,OAAA;EACzB,MAAA,KAAW,OAAA;EACX,QAAA,KAAa,OAAA;EAEb,MAAA,CAAO,QAAA,WAAmB,OAAA;EAC1B,MAAA,CAAO,QAAA,UAAkB,QAAA,WAAmB,OAAA;EAC5C,YAAA,EACE,QAAA,UACA,MAAA,EAAQ,MAAA,gCACP,OAAA;EACH,OAAA,CAAQ,QAAA,WAAmB,OAAA;EAC3B,SAAA,CAAU,QAAA,WAAmB,OAAA;EAC7B,MAAA,CAAO,QAAA,WAAmB,OAAA;EAE1B,UAAA,CACE,QAAA,WACC,OAAA;IAAU,QAAA;IAAkB,UAAA;EAAA;EAC/B,aAAA,CAAc,QAAA,WAAmB,OAAA;EAEjC,SAAA,CAAU,QAAA,eAAuB,WAAA;AAAA"}
1
+ {"version":3,"file":"thread-list-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/interfaces/thread-list-runtime-core.ts"],"mappings":";;;;KAGY,oBAAA;AAAA,KAEA,uBAAA;EAAA,SACD,EAAA;EAAA,SACA,QAAA;EAAA,SACA,UAAA;EAAA,SAEA,MAAA,EAAQ,oBAAA;EAAA,SACR,KAAA;EAAA,SACA,aAAA,GAAgB,IAAA;EAAA,SAChB,MAAA,GAAS,MAAA;EAAA,SAET,OAAA,GAAU,iBAAA;AAAA;AAAA,KAGT,qBAAA;EAAA,SACD,SAAA;EAAA,SACA,aAAA;EAAA,SACA,OAAA;EACT,YAAA;EACA,WAAA;EAEA,SAAA;EACA,iBAAA;EAAA,SAES,WAAA,EAAa,QAAA,CAAS,MAAA,SAAe,uBAAA;EAE9C,wBAAA,IAA4B,iBAAA;EAC5B,oBAAA,CAAqB,QAAA,WAAmB,iBAAA;EAExC,WAAA,CAAY,QAAA,WAAmB,uBAAA;EAE/B,cAAA,CACE,QAAA,UACA,OAAA;IAAY,SAAA;EAAA,IACX,OAAA;EACH,iBAAA,IAAqB,OAAA;EAErB,qBAAA,IAAyB,OAAA;EACzB,MAAA,KAAW,OAAA;EACX,QAAA,KAAa,OAAA;EAEb,MAAA,CAAO,QAAA,WAAmB,OAAA;EAC1B,MAAA,CAAO,QAAA,UAAkB,QAAA,WAAmB,OAAA;EAC5C,YAAA,EACE,QAAA,UACA,MAAA,EAAQ,MAAA,gCACP,OAAA;EACH,OAAA,CAAQ,QAAA,WAAmB,OAAA;EAC3B,SAAA,CAAU,QAAA,WAAmB,OAAA;EAC7B,MAAA,CAAO,QAAA,WAAmB,OAAA;EAE1B,UAAA,CACE,QAAA,WACC,OAAA;IAAU,QAAA;IAAkB,UAAA;EAAA;EAC/B,aAAA,CAAc,QAAA,WAAmB,OAAA;EAEjC,SAAA,CAAU,QAAA,eAAuB,WAAA;AAAA"}
@@ -17,6 +17,7 @@ type RuntimeCapabilities = {
17
17
  readonly switchBranchDuringRun: boolean;
18
18
  readonly edit: boolean;
19
19
  readonly reload: boolean;
20
+ readonly delete: boolean;
20
21
  readonly cancel: boolean;
21
22
  readonly unstable_copy: boolean;
22
23
  readonly speech: boolean;
@@ -47,7 +48,8 @@ type ResumeToolCallOptions = {
47
48
  };
48
49
  type RespondToToolApprovalOptions = {
49
50
  approvalId: string;
50
- approved: boolean;
51
+ approved: boolean; /** The approval option that produced this decision, when the request carried options. */
52
+ optionId?: string;
51
53
  reason?: string;
52
54
  };
53
55
  type SubmitFeedbackOptions = {
@@ -118,6 +120,7 @@ type ThreadRuntimeCore = Readonly<{
118
120
  getBranches: (messageId: string) => readonly string[];
119
121
  switchToBranch: (branchId: string) => void;
120
122
  append: (message: AppendMessage) => void;
123
+ deleteMessage: (messageId: string) => void | Promise<void>;
121
124
  startRun: (config: StartRunConfig) => void;
122
125
  resumeRun: (config: ResumeRunConfig) => void;
123
126
  cancelRun: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/interfaces/thread-runtime-core.ts"],"mappings":"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"}
1
+ {"version":3,"file":"thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/interfaces/thread-runtime-core.ts"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"message-queue.js","names":[],"sources":["../../../src/runtime/queue/message-queue.ts"],"sourcesContent":["import type { AppendMessage } from \"../../types/message\";\nimport {\n EMPTY_QUEUE_ITEMS,\n type QueueItemState,\n} from \"../../store/scopes/queue-item\";\nimport { generateId } from \"../../utils/id\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport type { ExternalThreadQueueAdapter } from \"./external-thread-queue-adapter\";\n\nexport type MessageQueueDriver = {\n run: (message: AppendMessage, options: { steer: boolean }) => void;\n /** When omitted, `steer` degrades to \"process next\" instead of interrupting. */\n cancel?: (() => void) | undefined;\n};\n\nexport type MessageQueueController = {\n readonly adapter: ExternalThreadQueueAdapter;\n /** Mark a run as in flight so concurrent sends buffer; call on the rising edge. */\n notifyBusy: () => void;\n /** Advances to the next pending message; call on the run's falling edge. */\n notifyIdle: () => void;\n subscribe: (callback: () => void) => () => void;\n};\n\nexport const createMessageQueue = (\n driver: MessageQueueDriver,\n): MessageQueueController => {\n let items: readonly QueueItemState[] = EMPTY_QUEUE_ITEMS;\n const messages = new Map<string, AppendMessage>();\n const subscribers = new Set<() => void>();\n\n let running = false;\n // swallow the cancelled run's settle when steering so it does not double-advance\n let suppressIdle = 0;\n\n const notify = () => {\n for (const callback of subscribers) callback();\n };\n\n const setItems = (next: readonly QueueItemState[]) => {\n items = next;\n adapter.items = next;\n notify();\n };\n\n const advance = () => {\n if (running || items.length === 0) return;\n const head = items[0]!;\n const message = messages.get(head.id);\n messages.delete(head.id);\n setItems(items.slice(1));\n if (!message) return;\n running = true;\n driver.run(message, { steer: false });\n };\n\n const enqueue = (message: AppendMessage, { steer }: { steer: boolean }) => {\n const id = generateId();\n const prompt = getThreadMessageText(message);\n messages.set(id, message);\n setItems([...items, { id, prompt }]);\n if (steer) {\n steerItem(id);\n } else {\n advance();\n }\n };\n\n const steerItem = (queueItemId: string) => {\n if (!messages.has(queueItemId)) return;\n\n if (driver.cancel && running) {\n const message = messages.get(queueItemId)!;\n messages.delete(queueItemId);\n setItems(items.filter((item) => item.id !== queueItemId));\n suppressIdle++;\n driver.cancel();\n running = true;\n driver.run(message, { steer: true });\n return;\n }\n\n const target = items.find((item) => item.id === queueItemId);\n if (!target) return;\n setItems([target, ...items.filter((item) => item.id !== queueItemId)]);\n advance();\n };\n\n const remove = (queueItemId: string) => {\n if (!messages.delete(queueItemId)) return;\n setItems(items.filter((item) => item.id !== queueItemId));\n };\n\n const clear = () => {\n if (items.length === 0) return;\n messages.clear();\n setItems(EMPTY_QUEUE_ITEMS);\n };\n\n const adapter: ExternalThreadQueueAdapter = {\n items,\n enqueue,\n steer: steerItem,\n remove,\n clear,\n };\n\n return {\n adapter,\n notifyBusy: () => {\n running = true;\n },\n notifyIdle: () => {\n if (suppressIdle > 0) {\n suppressIdle--;\n return;\n }\n running = false;\n advance();\n },\n subscribe: (callback) => {\n subscribers.add(callback);\n return () => {\n subscribers.delete(callback);\n };\n },\n };\n};\n"],"mappings":";;;;AAwBA,MAAa,sBACX,WAC2B;CAC3B,IAAI,QAAmC;CACvC,MAAM,2BAAW,IAAI,IAA2B;CAChD,MAAM,8BAAc,IAAI,IAAgB;CAExC,IAAI,UAAU;CAEd,IAAI,eAAe;CAEnB,MAAM,eAAe;EACnB,KAAK,MAAM,YAAY,aAAa,SAAS;CAC/C;CAEA,MAAM,YAAY,SAAoC;EACpD,QAAQ;EACR,QAAQ,QAAQ;EAChB,OAAO;CACT;CAEA,MAAM,gBAAgB;EACpB,IAAI,WAAW,MAAM,WAAW,GAAG;EACnC,MAAM,OAAO,MAAM;EACnB,MAAM,UAAU,SAAS,IAAI,KAAK,EAAE;EACpC,SAAS,OAAO,KAAK,EAAE;EACvB,SAAS,MAAM,MAAM,CAAC,CAAC;EACvB,IAAI,CAAC,SAAS;EACd,UAAU;EACV,OAAO,IAAI,SAAS,EAAE,OAAO,MAAM,CAAC;CACtC;CAEA,MAAM,WAAW,SAAwB,EAAE,YAAgC;EACzE,MAAM,KAAK,WAAW;EACtB,MAAM,SAAS,qBAAqB,OAAO;EAC3C,SAAS,IAAI,IAAI,OAAO;EACxB,SAAS,CAAC,GAAG,OAAO;GAAE;GAAI;EAAO,CAAC,CAAC;EACnC,IAAI,OACF,UAAU,EAAE;OAEZ,QAAQ;CAEZ;CAEA,MAAM,aAAa,gBAAwB;EACzC,IAAI,CAAC,SAAS,IAAI,WAAW,GAAG;EAEhC,IAAI,OAAO,UAAU,SAAS;GAC5B,MAAM,UAAU,SAAS,IAAI,WAAW;GACxC,SAAS,OAAO,WAAW;GAC3B,SAAS,MAAM,QAAQ,SAAS,KAAK,OAAO,WAAW,CAAC;GACxD;GACA,OAAO,OAAO;GACd,UAAU;GACV,OAAO,IAAI,SAAS,EAAE,OAAO,KAAK,CAAC;GACnC;EACF;EAEA,MAAM,SAAS,MAAM,MAAM,SAAS,KAAK,OAAO,WAAW;EAC3D,IAAI,CAAC,QAAQ;EACb,SAAS,CAAC,QAAQ,GAAG,MAAM,QAAQ,SAAS,KAAK,OAAO,WAAW,CAAC,CAAC;EACrE,QAAQ;CACV;CAEA,MAAM,UAAU,gBAAwB;EACtC,IAAI,CAAC,SAAS,OAAO,WAAW,GAAG;EACnC,SAAS,MAAM,QAAQ,SAAS,KAAK,OAAO,WAAW,CAAC;CAC1D;CAEA,MAAM,cAAc;EAClB,IAAI,MAAM,WAAW,GAAG;EACxB,SAAS,MAAM;EACf,SAAS,iBAAiB;CAC5B;CAEA,MAAM,UAAsC;EAC1C;EACA;EACA,OAAO;EACP;EACA;CACF;CAEA,OAAO;EACL;EACA,kBAAkB;GAChB,UAAU;EACZ;EACA,kBAAkB;GAChB,IAAI,eAAe,GAAG;IACpB;IACA;GACF;GACA,UAAU;GACV,QAAQ;EACV;EACA,YAAY,aAAa;GACvB,YAAY,IAAI,QAAQ;GACxB,aAAa;IACX,YAAY,OAAO,QAAQ;GAC7B;EACF;CACF;AACF"}
1
+ {"version":3,"file":"message-queue.js","names":["AppendMessage","EMPTY_QUEUE_ITEMS","QueueItemState","generateId","getThreadMessageText","ExternalThreadQueueAdapter","MessageQueueDriver","run","message","options","steer","cancel","MessageQueueController","adapter","notifyBusy","notifyIdle","subscribe","callback","createMessageQueue","driver","items","messages","Map","subscribers","Set","running","suppressIdle","notify","setItems","next","advance","length","head","get","id","delete","slice","enqueue","prompt","set","steerItem","queueItemId","has","filter","item","target","find","remove","clear","add"],"sources":["../../../src/runtime/queue/message-queue.ts"],"sourcesContent":["import type { AppendMessage } from \"../../types/message\";\nimport {\n EMPTY_QUEUE_ITEMS,\n type QueueItemState,\n} from \"../../store/scopes/queue-item\";\nimport { generateId } from \"../../utils/id\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport type { ExternalThreadQueueAdapter } from \"./external-thread-queue-adapter\";\n\nexport type MessageQueueDriver = {\n run: (message: AppendMessage, options: { steer: boolean }) => void;\n /** When omitted, `steer` degrades to \"process next\" instead of interrupting. */\n cancel?: (() => void) | undefined;\n};\n\nexport type MessageQueueController = {\n readonly adapter: ExternalThreadQueueAdapter;\n /** Mark a run as in flight so concurrent sends buffer; call on the rising edge. */\n notifyBusy: () => void;\n /** Advances to the next pending message; call on the run's falling edge. */\n notifyIdle: () => void;\n subscribe: (callback: () => void) => () => void;\n};\n\nexport const createMessageQueue = (\n driver: MessageQueueDriver,\n): MessageQueueController => {\n let items: readonly QueueItemState[] = EMPTY_QUEUE_ITEMS;\n const messages = new Map<string, AppendMessage>();\n const subscribers = new Set<() => void>();\n\n let running = false;\n // swallow the cancelled run's settle when steering so it does not double-advance\n let suppressIdle = 0;\n\n const notify = () => {\n for (const callback of subscribers) callback();\n };\n\n const setItems = (next: readonly QueueItemState[]) => {\n items = next;\n adapter.items = next;\n notify();\n };\n\n const advance = () => {\n if (running || items.length === 0) return;\n const head = items[0]!;\n const message = messages.get(head.id);\n messages.delete(head.id);\n setItems(items.slice(1));\n if (!message) return;\n running = true;\n driver.run(message, { steer: false });\n };\n\n const enqueue = (message: AppendMessage, { steer }: { steer: boolean }) => {\n const id = generateId();\n const prompt = getThreadMessageText(message);\n messages.set(id, message);\n setItems([...items, { id, prompt }]);\n if (steer) {\n steerItem(id);\n } else {\n advance();\n }\n };\n\n const steerItem = (queueItemId: string) => {\n if (!messages.has(queueItemId)) return;\n\n if (driver.cancel && running) {\n const message = messages.get(queueItemId)!;\n messages.delete(queueItemId);\n setItems(items.filter((item) => item.id !== queueItemId));\n suppressIdle++;\n driver.cancel();\n running = true;\n driver.run(message, { steer: true });\n return;\n }\n\n const target = items.find((item) => item.id === queueItemId);\n if (!target) return;\n setItems([target, ...items.filter((item) => item.id !== queueItemId)]);\n advance();\n };\n\n const remove = (queueItemId: string) => {\n if (!messages.delete(queueItemId)) return;\n setItems(items.filter((item) => item.id !== queueItemId));\n };\n\n const clear = () => {\n if (items.length === 0) return;\n messages.clear();\n setItems(EMPTY_QUEUE_ITEMS);\n };\n\n const adapter: ExternalThreadQueueAdapter = {\n items,\n enqueue,\n steer: steerItem,\n remove,\n clear,\n };\n\n return {\n adapter,\n notifyBusy: () => {\n running = true;\n },\n notifyIdle: () => {\n if (suppressIdle > 0) {\n suppressIdle--;\n return;\n }\n running = false;\n advance();\n },\n subscribe: (callback) => {\n subscribers.add(callback);\n return () => {\n subscribers.delete(callback);\n };\n },\n };\n};\n"],"mappings":";;;;AAwBA,MAAakB,sBACXC,WAC2B;CAC3B,IAAIC,QAAmCnB;CACvC,MAAMoB,2BAAW,IAAIC,IAA2B;CAChD,MAAMC,8BAAc,IAAIC,IAAgB;CAExC,IAAIC,UAAU;CAEd,IAAIC,eAAe;CAEnB,MAAMC,eAAe;EACnB,KAAK,MAAMV,YAAYM,aAAaN,SAAS;CAC/C;CAEA,MAAMW,YAAYC,SAAoC;EACpDT,QAAQS;EACRhB,QAAQO,QAAQS;EAChBF,OAAO;CACT;CAEA,MAAMG,gBAAgB;EACpB,IAAIL,WAAWL,MAAMW,WAAW,GAAG;EACnC,MAAMC,OAAOZ,MAAM;EACnB,MAAMZ,UAAUa,SAASY,IAAID,KAAKE,EAAE;EACpCb,SAASc,OAAOH,KAAKE,EAAE;EACvBN,SAASR,MAAMgB,MAAM,CAAC,CAAC;EACvB,IAAI,CAAC5B,SAAS;EACdiB,UAAU;EACVN,OAAOZ,IAAIC,SAAS,EAAEE,OAAO,MAAM,CAAC;CACtC;CAEA,MAAM2B,WAAW7B,SAAwB,EAAEE,YAAgC;EACzE,MAAMwB,KAAK/B,WAAW;EACtB,MAAMmC,SAASlC,qBAAqBI,OAAO;EAC3Ca,SAASkB,IAAIL,IAAI1B,OAAO;EACxBoB,SAAS,CAAC,GAAGR,OAAO;GAAEc;GAAII;EAAO,CAAC,CAAC;EACnC,IAAI5B,OACF8B,UAAUN,EAAE;OAEZJ,QAAQ;CAEZ;CAEA,MAAMU,aAAaC,gBAAwB;EACzC,IAAI,CAACpB,SAASqB,IAAID,WAAW,GAAG;EAEhC,IAAItB,OAAOR,UAAUc,SAAS;GAC5B,MAAMjB,UAAUa,SAASY,IAAIQ,WAAW;GACxCpB,SAASc,OAAOM,WAAW;GAC3Bb,SAASR,MAAMuB,QAAQC,SAASA,KAAKV,OAAOO,WAAW,CAAC;GACxDf;GACAP,OAAOR,OAAO;GACdc,UAAU;GACVN,OAAOZ,IAAIC,SAAS,EAAEE,OAAO,KAAK,CAAC;GACnC;EACF;EAEA,MAAMmC,SAASzB,MAAM0B,MAAMF,SAASA,KAAKV,OAAOO,WAAW;EAC3D,IAAI,CAACI,QAAQ;EACbjB,SAAS,CAACiB,QAAQ,GAAGzB,MAAMuB,QAAQC,SAASA,KAAKV,OAAOO,WAAW,CAAC,CAAC;EACrEX,QAAQ;CACV;CAEA,MAAMiB,UAAUN,gBAAwB;EACtC,IAAI,CAACpB,SAASc,OAAOM,WAAW,GAAG;EACnCb,SAASR,MAAMuB,QAAQC,SAASA,KAAKV,OAAOO,WAAW,CAAC;CAC1D;CAEA,MAAMO,cAAc;EAClB,IAAI5B,MAAMW,WAAW,GAAG;EACxBV,SAAS2B,MAAM;EACfpB,SAAS3B,iBAAiB;CAC5B;CAEA,MAAMY,UAAsC;EAC1CO;EACAiB;EACA3B,OAAO8B;EACPO;EACAC;CACF;CAEA,OAAO;EACLnC;EACAC,kBAAkB;GAChBW,UAAU;EACZ;EACAV,kBAAkB;GAChB,IAAIW,eAAe,GAAG;IACpBA;IACA;GACF;GACAD,UAAU;GACVK,QAAQ;EACV;EACAd,YAAYC,aAAa;GACvBM,YAAY0B,IAAIhC,QAAQ;GACxB,aAAa;IACXM,YAAYY,OAAOlB,QAAQ;GAC7B;EACF;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"auto-status.js","names":[],"sources":["../../../src/runtime/utils/auto-status.ts"],"sourcesContent":["import type { MessageStatus } from \"../../types/message\";\nimport type { ReadonlyJSONValue } from \"assistant-stream/utils\";\n\nconst symbolAutoStatus = Symbol(\"autoStatus\");\n\nconst AUTO_STATUS_RUNNING = Object.freeze(\n Object.assign({ type: \"running\" as const }, { [symbolAutoStatus]: true }),\n);\nconst AUTO_STATUS_COMPLETE = Object.freeze(\n Object.assign(\n {\n type: \"complete\" as const,\n reason: \"unknown\" as const,\n },\n { [symbolAutoStatus]: true },\n ),\n);\n\nconst AUTO_STATUS_PENDING = Object.freeze(\n Object.assign(\n {\n type: \"requires-action\" as const,\n reason: \"tool-calls\" as const,\n },\n { [symbolAutoStatus]: true },\n ),\n);\n\nconst AUTO_STATUS_INTERRUPT = Object.freeze(\n Object.assign(\n {\n type: \"requires-action\" as const,\n reason: \"interrupt\" as const,\n },\n { [symbolAutoStatus]: true },\n ),\n);\n\nexport const isAutoStatus = (status: MessageStatus) =>\n (status as any)[symbolAutoStatus] === true;\n\nexport const getAutoStatus = (\n isLast: boolean,\n isRunning: boolean,\n hasInterruptedToolCalls: boolean,\n hasPendingToolCalls: boolean,\n error?: ReadonlyJSONValue,\n): MessageStatus => {\n if (isLast && error) {\n return Object.assign(\n {\n type: \"incomplete\" as const,\n reason: \"error\" as const,\n error: error,\n },\n { [symbolAutoStatus]: true },\n );\n }\n\n return isLast && isRunning\n ? AUTO_STATUS_RUNNING\n : hasInterruptedToolCalls\n ? AUTO_STATUS_INTERRUPT\n : hasPendingToolCalls\n ? AUTO_STATUS_PENDING\n : AUTO_STATUS_COMPLETE;\n};\n"],"mappings":";AAGA,MAAM,mBAAmB,OAAO,YAAY;AAE5C,MAAM,sBAAsB,OAAO,OACjC,OAAO,OAAO,EAAE,MAAM,UAAmB,GAAG,GAAG,mBAAmB,KAAK,CAAC,CAC1E;AACA,MAAM,uBAAuB,OAAO,OAClC,OAAO,OACL;CACE,MAAM;CACN,QAAQ;AACV,GACA,GAAG,mBAAmB,KAAK,CAC7B,CACF;AAEA,MAAM,sBAAsB,OAAO,OACjC,OAAO,OACL;CACE,MAAM;CACN,QAAQ;AACV,GACA,GAAG,mBAAmB,KAAK,CAC7B,CACF;AAEA,MAAM,wBAAwB,OAAO,OACnC,OAAO,OACL;CACE,MAAM;CACN,QAAQ;AACV,GACA,GAAG,mBAAmB,KAAK,CAC7B,CACF;AAEA,MAAa,gBAAgB,WAC1B,OAAe,sBAAsB;AAExC,MAAa,iBACX,QACA,WACA,yBACA,qBACA,UACkB;CAClB,IAAI,UAAU,OACZ,OAAO,OAAO,OACZ;EACE,MAAM;EACN,QAAQ;EACD;CACT,GACA,GAAG,mBAAmB,KAAK,CAC7B;CAGF,OAAO,UAAU,YACb,sBACA,0BACE,wBACA,sBACE,sBACA;AACV"}
1
+ {"version":3,"file":"auto-status.js","names":["MessageStatus","ReadonlyJSONValue","symbolAutoStatus","Symbol","AUTO_STATUS_RUNNING","Object","freeze","assign","type","const","AUTO_STATUS_COMPLETE","reason","AUTO_STATUS_PENDING","AUTO_STATUS_INTERRUPT","isAutoStatus","status","getAutoStatus","isLast","isRunning","hasInterruptedToolCalls","hasPendingToolCalls","error"],"sources":["../../../src/runtime/utils/auto-status.ts"],"sourcesContent":["import type { MessageStatus } from \"../../types/message\";\nimport type { ReadonlyJSONValue } from \"assistant-stream/utils\";\n\nconst symbolAutoStatus = Symbol(\"autoStatus\");\n\nconst AUTO_STATUS_RUNNING = Object.freeze(\n Object.assign({ type: \"running\" as const }, { [symbolAutoStatus]: true }),\n);\nconst AUTO_STATUS_COMPLETE = Object.freeze(\n Object.assign(\n {\n type: \"complete\" as const,\n reason: \"unknown\" as const,\n },\n { [symbolAutoStatus]: true },\n ),\n);\n\nconst AUTO_STATUS_PENDING = Object.freeze(\n Object.assign(\n {\n type: \"requires-action\" as const,\n reason: \"tool-calls\" as const,\n },\n { [symbolAutoStatus]: true },\n ),\n);\n\nconst AUTO_STATUS_INTERRUPT = Object.freeze(\n Object.assign(\n {\n type: \"requires-action\" as const,\n reason: \"interrupt\" as const,\n },\n { [symbolAutoStatus]: true },\n ),\n);\n\nexport const isAutoStatus = (status: MessageStatus) =>\n (status as any)[symbolAutoStatus] === true;\n\nexport const getAutoStatus = (\n isLast: boolean,\n isRunning: boolean,\n hasInterruptedToolCalls: boolean,\n hasPendingToolCalls: boolean,\n error?: ReadonlyJSONValue,\n): MessageStatus => {\n if (isLast && error) {\n return Object.assign(\n {\n type: \"incomplete\" as const,\n reason: \"error\" as const,\n error: error,\n },\n { [symbolAutoStatus]: true },\n );\n }\n\n return isLast && isRunning\n ? AUTO_STATUS_RUNNING\n : hasInterruptedToolCalls\n ? AUTO_STATUS_INTERRUPT\n : hasPendingToolCalls\n ? AUTO_STATUS_PENDING\n : AUTO_STATUS_COMPLETE;\n};\n"],"mappings":";AAGA,MAAME,mBAAmBC,OAAO,YAAY;AAE5C,MAAMC,sBAAsBC,OAAOC,OACjCD,OAAOE,OAAO,EAAEC,MAAM,UAAmB,GAAG,GAAGN,mBAAmB,KAAK,CAAC,CAC1E;AACA,MAAMQ,uBAAuBL,OAAOC,OAClCD,OAAOE,OACL;CACEC,MAAM;CACNG,QAAQ;AACV,GACA,GAAGT,mBAAmB,KAAK,CAC7B,CACF;AAEA,MAAMU,sBAAsBP,OAAOC,OACjCD,OAAOE,OACL;CACEC,MAAM;CACNG,QAAQ;AACV,GACA,GAAGT,mBAAmB,KAAK,CAC7B,CACF;AAEA,MAAMW,wBAAwBR,OAAOC,OACnCD,OAAOE,OACL;CACEC,MAAM;CACNG,QAAQ;AACV,GACA,GAAGT,mBAAmB,KAAK,CAC7B,CACF;AAEA,MAAaY,gBAAgBC,WAC1BA,OAAeb,sBAAsB;AAExC,MAAac,iBACXC,QACAC,WACAC,yBACAC,qBACAC,UACkB;CAClB,IAAIJ,UAAUI,OACZ,OAAOhB,OAAOE,OACZ;EACEC,MAAM;EACNG,QAAQ;EACDU;CACT,GACA,GAAGnB,mBAAmB,KAAK,CAC7B;CAGF,OAAOe,UAAUC,YACbd,sBACAe,0BACEN,wBACAO,sBACER,sBACAF;AACV"}
@@ -1 +1 @@
1
- {"version":3,"file":"external-store-message.js","names":[],"sources":["../../../src/runtime/utils/external-store-message.ts"],"sourcesContent":["import type { ThreadMessage } from \"../../types/message\";\n\nexport const symbolInnerMessage = Symbol(\"innerMessage\");\nconst symbolInnerMessages = Symbol(\"innerMessages\");\n\ntype WithInnerMessages<T> = {\n [symbolInnerMessage]?: T | T[];\n [symbolInnerMessages]?: T[];\n};\n\nconst EMPTY_ARRAY: never[] = [];\n\n/**\n * Attach the original external store message(s) to a ThreadMessage or message part.\n * This is a no-op if the target already has a bound message.\n * Use `getExternalStoreMessages` to retrieve the bound messages later.\n *\n * @deprecated This API is experimental and may change without notice.\n */\nexport const bindExternalStoreMessage = <T>(\n target: object,\n message: T | T[],\n): void => {\n if (symbolInnerMessage in target) return;\n (target as WithInnerMessages<T>)[symbolInnerMessage] = message;\n};\n\nexport const getExternalStoreMessages = <T>(\n input:\n | { messages: readonly ThreadMessage[] }\n | ThreadMessage\n | ThreadMessage[\"content\"][number],\n) => {\n const container = (\n \"messages\" in input ? input.messages : input\n ) as WithInnerMessages<T>;\n const value = container[symbolInnerMessages] || container[symbolInnerMessage];\n if (!value) return EMPTY_ARRAY;\n if (Array.isArray(value)) {\n return value;\n }\n container[symbolInnerMessages] = [value];\n return container[symbolInnerMessages];\n};\n"],"mappings":";AAEA,MAAa,qBAAqB,OAAO,cAAc;AACvD,MAAM,sBAAsB,OAAO,eAAe;AAOlD,MAAM,cAAuB,CAAC;;;;;;;;AAS9B,MAAa,4BACX,QACA,YACS;CACT,IAAI,sBAAsB,QAAQ;CAClC,OAAiC,sBAAsB;AACzD;AAEA,MAAa,4BACX,UAIG;CACH,MAAM,YACJ,cAAc,QAAQ,MAAM,WAAW;CAEzC,MAAM,QAAQ,UAAU,wBAAwB,UAAU;CAC1D,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO;CAET,UAAU,uBAAuB,CAAC,KAAK;CACvC,OAAO,UAAU;AACnB"}
1
+ {"version":3,"file":"external-store-message.js","names":["ThreadMessage","symbolInnerMessage","Symbol","symbolInnerMessages","WithInnerMessages","T","EMPTY_ARRAY","bindExternalStoreMessage","target","message","getExternalStoreMessages","input","messages","container","value","Array","isArray"],"sources":["../../../src/runtime/utils/external-store-message.ts"],"sourcesContent":["import type { ThreadMessage } from \"../../types/message\";\n\nexport const symbolInnerMessage = Symbol(\"innerMessage\");\nconst symbolInnerMessages = Symbol(\"innerMessages\");\n\ntype WithInnerMessages<T> = {\n [symbolInnerMessage]?: T | T[];\n [symbolInnerMessages]?: T[];\n};\n\nconst EMPTY_ARRAY: never[] = [];\n\n/**\n * Attach the original external store message(s) to a ThreadMessage or message part.\n * This is a no-op if the target already has a bound message.\n * Use `getExternalStoreMessages` to retrieve the bound messages later.\n *\n * @deprecated This API is experimental and may change without notice.\n */\nexport const bindExternalStoreMessage = <T>(\n target: object,\n message: T | T[],\n): void => {\n if (symbolInnerMessage in target) return;\n (target as WithInnerMessages<T>)[symbolInnerMessage] = message;\n};\n\nexport const getExternalStoreMessages = <T>(\n input:\n | { messages: readonly ThreadMessage[] }\n | ThreadMessage\n | ThreadMessage[\"content\"][number],\n) => {\n const container = (\n \"messages\" in input ? input.messages : input\n ) as WithInnerMessages<T>;\n const value = container[symbolInnerMessages] || container[symbolInnerMessage];\n if (!value) return EMPTY_ARRAY;\n if (Array.isArray(value)) {\n return value;\n }\n container[symbolInnerMessages] = [value];\n return container[symbolInnerMessages];\n};\n"],"mappings":";AAEA,MAAaC,qBAAqBC,OAAO,cAAc;AACvD,MAAMC,sBAAsBD,OAAO,eAAe;AAOlD,MAAMI,cAAuB,CAAA;;;;;;;;AAS7B,MAAaC,4BACXC,QACAC,YACS;CACT,IAAIR,sBAAsBO,QAAQ;CAClC,OAAiCP,sBAAsBQ;AACzD;AAEA,MAAaC,4BACXC,UAIG;CACH,MAAME,YACJ,cAAcF,QAAQA,MAAMC,WAAWD;CAEzC,MAAMG,QAAQD,UAAUV,wBAAwBU,UAAUZ;CAC1D,IAAI,CAACa,OAAO,OAAOR;CACnB,IAAIS,MAAMC,QAAQF,KAAK,GACrB,OAAOA;CAETD,UAAUV,uBAAuB,CAACW,KAAK;CACvC,OAAOD,UAAUV;AACnB"}