@assistant-ui/core 0.2.14 → 0.2.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) 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/voice.js.map +1 -1
  5. package/dist/index.d.ts +2 -2
  6. package/dist/index.js.map +1 -1
  7. package/dist/internal/duplicate-detection.js.map +1 -1
  8. package/dist/internal.d.ts +2 -1
  9. package/dist/internal.js +2 -1
  10. package/dist/model-context/frame/host.js.map +1 -1
  11. package/dist/model-context/frame/provider.js.map +1 -1
  12. package/dist/model-context/frame/types.js.map +1 -1
  13. package/dist/model-context/registry.js.map +1 -1
  14. package/dist/model-context/tool.js.map +1 -1
  15. package/dist/model-context/types.d.ts +1 -0
  16. package/dist/model-context/types.d.ts.map +1 -1
  17. package/dist/model-context/types.js.map +1 -1
  18. package/dist/react/AssistantProvider.js +1 -0
  19. package/dist/react/AssistantProvider.js.map +1 -1
  20. package/dist/react/AssistantRuntimeProvider.js +18 -6
  21. package/dist/react/AssistantRuntimeProvider.js.map +1 -1
  22. package/dist/react/RuntimeAdapter.js +26 -7
  23. package/dist/react/RuntimeAdapter.js.map +1 -1
  24. package/dist/react/adapters/LocalStorageThreadListAdapter.js +29 -7
  25. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  26. package/dist/react/adapters/TitleGenerationAdapter.js.map +1 -1
  27. package/dist/react/client/DataRenderers.js +54 -35
  28. package/dist/react/client/DataRenderers.js.map +1 -1
  29. package/dist/react/client/Interactables.js +67 -67
  30. package/dist/react/client/Interactables.js.map +1 -1
  31. package/dist/react/client/Tools.d.ts.map +1 -1
  32. package/dist/react/client/Tools.js +118 -55
  33. package/dist/react/client/Tools.js.map +1 -1
  34. package/dist/react/client/interactable-model-context.js.map +1 -1
  35. package/dist/react/model-context/define-mcp-toolkit.js.map +1 -1
  36. package/dist/react/model-context/define-toolkit.js.map +1 -1
  37. package/dist/react/model-context/external-tool.js.map +1 -1
  38. package/dist/react/model-context/human-tool.js.map +1 -1
  39. package/dist/react/model-context/makeAssistantDataUI.js.map +1 -1
  40. package/dist/react/model-context/makeAssistantTool.js.map +1 -1
  41. package/dist/react/model-context/makeAssistantToolUI.js.map +1 -1
  42. package/dist/react/model-context/provider-tool.js.map +1 -1
  43. package/dist/react/model-context/stub-tool.js.map +1 -1
  44. package/dist/react/model-context/toolbox.d.ts +3 -3
  45. package/dist/react/model-context/toolbox.d.ts.map +1 -1
  46. package/dist/react/model-context/toolbox.js.map +1 -1
  47. package/dist/react/model-context/useAssistantContext.js.map +1 -1
  48. package/dist/react/model-context/useAssistantDataUI.js +27 -8
  49. package/dist/react/model-context/useAssistantDataUI.js.map +1 -1
  50. package/dist/react/model-context/useAssistantInstructions.js +33 -10
  51. package/dist/react/model-context/useAssistantInstructions.js.map +1 -1
  52. package/dist/react/model-context/useAssistantInteractable.js.map +1 -1
  53. package/dist/react/model-context/useAssistantTool.js +59 -17
  54. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  55. package/dist/react/model-context/useAssistantToolUI.js +30 -9
  56. package/dist/react/model-context/useAssistantToolUI.js.map +1 -1
  57. package/dist/react/model-context/useAuiToolOverrides.js.map +1 -1
  58. package/dist/react/model-context/useInlineRender.js +35 -8
  59. package/dist/react/model-context/useInlineRender.js.map +1 -1
  60. package/dist/react/model-context/useInteractableState.js +65 -19
  61. package/dist/react/model-context/useInteractableState.js.map +1 -1
  62. package/dist/react/model-context/useToolArgsStatus.js +42 -14
  63. package/dist/react/model-context/useToolArgsStatus.js.map +1 -1
  64. package/dist/react/primitive-hooks/useActionBarCopy.js +59 -22
  65. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  66. package/dist/react/primitive-hooks/useActionBarEdit.js +25 -7
  67. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  68. package/dist/react/primitive-hooks/useActionBarFeedback.js +49 -13
  69. package/dist/react/primitive-hooks/useActionBarFeedback.js.map +1 -1
  70. package/dist/react/primitive-hooks/useActionBarReload.js +25 -7
  71. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  72. package/dist/react/primitive-hooks/useActionBarSpeak.js +28 -9
  73. package/dist/react/primitive-hooks/useActionBarSpeak.js.map +1 -1
  74. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js +25 -7
  75. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js.map +1 -1
  76. package/dist/react/primitive-hooks/useBranchPickerNext.js +27 -11
  77. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  78. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +27 -11
  79. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  80. package/dist/react/primitive-hooks/useComposerAddAttachment.js +24 -8
  81. package/dist/react/primitive-hooks/useComposerAddAttachment.js.map +1 -1
  82. package/dist/react/primitive-hooks/useComposerCancel.js +25 -7
  83. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  84. package/dist/react/primitive-hooks/useComposerDictate.js +25 -7
  85. package/dist/react/primitive-hooks/useComposerDictate.js.map +1 -1
  86. package/dist/react/primitive-hooks/useComposerSend.js +25 -7
  87. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  88. package/dist/react/primitive-hooks/useEditComposerCancel.js +18 -4
  89. package/dist/react/primitive-hooks/useEditComposerCancel.js.map +1 -1
  90. package/dist/react/primitive-hooks/useEditComposerSend.js +25 -7
  91. package/dist/react/primitive-hooks/useEditComposerSend.js.map +1 -1
  92. package/dist/react/primitive-hooks/useMessageBranching.js +41 -9
  93. package/dist/react/primitive-hooks/useMessageBranching.js.map +1 -1
  94. package/dist/react/primitive-hooks/useMessageError.js +4 -1
  95. package/dist/react/primitive-hooks/useMessageError.js.map +1 -1
  96. package/dist/react/primitive-hooks/useMessageReload.js +25 -7
  97. package/dist/react/primitive-hooks/useMessageReload.js.map +1 -1
  98. package/dist/react/primitive-hooks/useSuggestionTrigger.js +31 -13
  99. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  100. package/dist/react/primitive-hooks/useThreadIsEmpty.js +4 -1
  101. package/dist/react/primitive-hooks/useThreadIsEmpty.js.map +1 -1
  102. package/dist/react/primitive-hooks/useThreadIsRunning.js +4 -1
  103. package/dist/react/primitive-hooks/useThreadIsRunning.js.map +1 -1
  104. package/dist/react/primitive-hooks/useThreadListItemArchive.js +18 -4
  105. package/dist/react/primitive-hooks/useThreadListItemArchive.js.map +1 -1
  106. package/dist/react/primitive-hooks/useThreadListItemDelete.js +18 -4
  107. package/dist/react/primitive-hooks/useThreadListItemDelete.js.map +1 -1
  108. package/dist/react/primitive-hooks/useThreadListItemTrigger.js +18 -4
  109. package/dist/react/primitive-hooks/useThreadListItemTrigger.js.map +1 -1
  110. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js +18 -4
  111. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js.map +1 -1
  112. package/dist/react/primitive-hooks/useThreadListLoadMore.js +25 -7
  113. package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
  114. package/dist/react/primitive-hooks/useThreadListNew.js +18 -4
  115. package/dist/react/primitive-hooks/useThreadListNew.js.map +1 -1
  116. package/dist/react/primitive-hooks/useThreadMessages.js +4 -1
  117. package/dist/react/primitive-hooks/useThreadMessages.js.map +1 -1
  118. package/dist/react/primitive-hooks/useVoice.js +63 -13
  119. package/dist/react/primitive-hooks/useVoice.js.map +1 -1
  120. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js +42 -7
  121. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js.map +1 -1
  122. package/dist/react/primitives/composer/ComposerAttachments.js +67 -16
  123. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  124. package/dist/react/primitives/composer/ComposerIf.js +30 -9
  125. package/dist/react/primitives/composer/ComposerIf.js.map +1 -1
  126. package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
  127. package/dist/react/primitives/generativeUI/GenerativeUI.js +55 -13
  128. package/dist/react/primitives/generativeUI/GenerativeUI.js.map +1 -1
  129. package/dist/react/primitives/message/MessageAttachments.js +68 -16
  130. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  131. package/dist/react/primitives/message/MessageGroupedParts.js +3 -3
  132. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  133. package/dist/react/primitives/message/MessageParts.js +649 -181
  134. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  135. package/dist/react/primitives/message/MessageQuote.js +18 -2
  136. package/dist/react/primitives/message/MessageQuote.js.map +1 -1
  137. package/dist/react/primitives/messagePart/MessagePartInProgress.js +6 -2
  138. package/dist/react/primitives/messagePart/MessagePartInProgress.js.map +1 -1
  139. package/dist/react/primitives/part/PartMessages.js +46 -14
  140. package/dist/react/primitives/part/PartMessages.js.map +1 -1
  141. package/dist/react/primitives/thread/ThreadMessages.js +67 -10
  142. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  143. package/dist/react/primitives/thread/ThreadSuggestions.js +50 -10
  144. package/dist/react/primitives/thread/ThreadSuggestions.js.map +1 -1
  145. package/dist/react/primitives/threadList/ThreadListItems.js +55 -14
  146. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  147. package/dist/react/primitives/threadListItem/ThreadListItemTitle.js +15 -2
  148. package/dist/react/primitives/threadListItem/ThreadListItemTitle.js.map +1 -1
  149. package/dist/react/providers/AttachmentByIndexProvider.js +57 -12
  150. package/dist/react/providers/AttachmentByIndexProvider.js.map +1 -1
  151. package/dist/react/providers/ChainOfThoughtByIndicesProvider.js +33 -11
  152. package/dist/react/providers/ChainOfThoughtByIndicesProvider.js.map +1 -1
  153. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js +29 -6
  154. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js.map +1 -1
  155. package/dist/react/providers/MessageByIndexProvider.js +49 -19
  156. package/dist/react/providers/MessageByIndexProvider.js.map +1 -1
  157. package/dist/react/providers/PartByIndexProvider.js +29 -6
  158. package/dist/react/providers/PartByIndexProvider.js.map +1 -1
  159. package/dist/react/providers/QueueItemByIndexProvider.js +29 -6
  160. package/dist/react/providers/QueueItemByIndexProvider.js.map +1 -1
  161. package/dist/react/providers/ReadonlyThreadProvider.js +83 -28
  162. package/dist/react/providers/ReadonlyThreadProvider.js.map +1 -1
  163. package/dist/react/providers/SuggestionByIndexProvider.js +29 -6
  164. package/dist/react/providers/SuggestionByIndexProvider.js.map +1 -1
  165. package/dist/react/providers/TextMessagePartProvider.js +73 -25
  166. package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
  167. package/dist/react/providers/ThreadListItemByIndexProvider.js +30 -6
  168. package/dist/react/providers/ThreadListItemByIndexProvider.js.map +1 -1
  169. package/dist/react/providers/ThreadListItemRuntimeProvider.js +28 -5
  170. package/dist/react/providers/ThreadListItemRuntimeProvider.js.map +1 -1
  171. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +19 -4
  172. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  173. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  174. package/dist/react/runtimes/RuntimeAdapterProvider.js +27 -10
  175. package/dist/react/runtimes/RuntimeAdapterProvider.js.map +1 -1
  176. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +10 -1
  177. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  178. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  179. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  180. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +17 -17
  181. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  182. package/dist/react/runtimes/createMessageConverter.js.map +1 -1
  183. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  184. package/dist/react/runtimes/external-message-converter.js +67 -30
  185. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  186. package/dist/react/runtimes/useExternalStoreRuntime.js +44 -10
  187. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  188. package/dist/react/runtimes/useExternalStoreSharedOptions.js +17 -12
  189. package/dist/react/runtimes/useExternalStoreSharedOptions.js.map +1 -1
  190. package/dist/react/runtimes/useLocalRuntime.js.map +1 -1
  191. package/dist/react/runtimes/useRemoteThreadListRuntime.js +34 -6
  192. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  193. package/dist/react/types/MessagePartComponentTypes.d.ts +5 -6
  194. package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
  195. package/dist/react/utils/getMessageQuote.js.map +1 -1
  196. package/dist/react/utils/groupParts.js.map +1 -1
  197. package/dist/runtime/api/assistant-runtime.js.map +1 -1
  198. package/dist/runtime/api/attachment-runtime.js.map +1 -1
  199. package/dist/runtime/api/composer-runtime.js.map +1 -1
  200. package/dist/runtime/api/message-part-runtime.d.ts +3 -9
  201. package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
  202. package/dist/runtime/api/message-part-runtime.js +3 -6
  203. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  204. package/dist/runtime/api/message-runtime.js.map +1 -1
  205. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  206. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  207. package/dist/runtime/api/thread-runtime.js.map +1 -1
  208. package/dist/runtime/base/base-assistant-runtime-core.js.map +1 -1
  209. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  210. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  211. package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
  212. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  213. package/dist/runtime/interfaces/thread-runtime-core.d.ts +2 -1
  214. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  215. package/dist/runtime/queue/message-queue.js.map +1 -1
  216. package/dist/runtime/utils/auto-status.js.map +1 -1
  217. package/dist/runtime/utils/external-store-message.js.map +1 -1
  218. package/dist/runtime/utils/message-repository.js.map +1 -1
  219. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts +15 -0
  220. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts.map +1 -0
  221. package/dist/runtime/utils/resolveToolApprovalResponse.js +35 -0
  222. package/dist/runtime/utils/resolveToolApprovalResponse.js.map +1 -0
  223. package/dist/runtime/utils/thread-message-like.d.ts +5 -1
  224. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  225. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  226. package/dist/runtimes/assistant-transport/utils.js.map +1 -1
  227. package/dist/runtimes/external-store/external-store-runtime-core.js.map +1 -1
  228. package/dist/runtimes/external-store/external-store-shared-options.js.map +1 -1
  229. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  230. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  231. package/dist/runtimes/external-store/thread-message-converter.js.map +1 -1
  232. package/dist/runtimes/local/local-runtime-core.js.map +1 -1
  233. package/dist/runtimes/local/local-thread-list-runtime-core.js.map +1 -1
  234. package/dist/runtimes/local/local-thread-runtime-core.d.ts +1 -0
  235. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  236. package/dist/runtimes/local/local-thread-runtime-core.js +9 -7
  237. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  238. package/dist/runtimes/local/should-continue.js +1 -1
  239. package/dist/runtimes/local/should-continue.js.map +1 -1
  240. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  241. package/dist/runtimes/remote-thread-list/adapter/in-memory.js.map +1 -1
  242. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  243. package/dist/runtimes/remote-thread-list/optimistic-state.js.map +1 -1
  244. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  245. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  246. package/dist/store/clients/chain-of-thought-client.js +37 -19
  247. package/dist/store/clients/chain-of-thought-client.js.map +1 -1
  248. package/dist/store/clients/model-context-client.js +64 -14
  249. package/dist/store/clients/model-context-client.js.map +1 -1
  250. package/dist/store/clients/no-op-composer-client.js +94 -53
  251. package/dist/store/clients/no-op-composer-client.js.map +1 -1
  252. package/dist/store/clients/runtime-adapter.js.map +1 -1
  253. package/dist/store/clients/suggestions.d.ts.map +1 -1
  254. package/dist/store/clients/suggestions.js +59 -21
  255. package/dist/store/clients/suggestions.js.map +1 -1
  256. package/dist/store/clients/thread-message-client.d.ts.map +1 -1
  257. package/dist/store/clients/thread-message-client.js +176 -69
  258. package/dist/store/clients/thread-message-client.js.map +1 -1
  259. package/dist/store/runtime-clients/attachment-runtime-client.js +29 -6
  260. package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
  261. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  262. package/dist/store/runtime-clients/composer-runtime-client.js +188 -68
  263. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  264. package/dist/store/runtime-clients/liveRef.d.ts +7 -0
  265. package/dist/store/runtime-clients/liveRef.d.ts.map +1 -0
  266. package/dist/store/runtime-clients/liveRef.js +8 -0
  267. package/dist/store/runtime-clients/liveRef.js.map +1 -0
  268. package/dist/store/runtime-clients/message-part-runtime-client.js +47 -8
  269. package/dist/store/runtime-clients/message-part-runtime-client.js.map +1 -1
  270. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  271. package/dist/store/runtime-clients/message-runtime-client.js +214 -52
  272. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  273. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +69 -25
  274. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  275. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  276. package/dist/store/runtime-clients/thread-list-runtime-client.js +137 -34
  277. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  278. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  279. package/dist/store/runtime-clients/thread-runtime-client.js +192 -71
  280. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  281. package/dist/store/runtime-clients/useSubscribable.js +2 -9
  282. package/dist/store/runtime-clients/useSubscribable.js.map +1 -1
  283. package/dist/store/scopes/part.d.ts +5 -6
  284. package/dist/store/scopes/part.d.ts.map +1 -1
  285. package/dist/store/scopes/queue-item.js.map +1 -1
  286. package/dist/subscribable/subscribable.js.map +1 -1
  287. package/dist/tests/remote-thread-list-test-helpers.js.map +1 -1
  288. package/dist/types/message.d.ts +38 -5
  289. package/dist/types/message.d.ts.map +1 -1
  290. package/dist/types/message.js.map +1 -1
  291. package/dist/utils/composite-context-provider.js.map +1 -1
  292. package/dist/utils/id.js.map +1 -1
  293. package/dist/utils/json/is-json-equal.js.map +1 -1
  294. package/dist/utils/json/is-json.js.map +1 -1
  295. package/dist/utils/text.js.map +1 -1
  296. package/package.json +8 -8
  297. package/src/index.ts +4 -0
  298. package/src/internal.ts +1 -0
  299. package/src/model-context/types.ts +1 -0
  300. package/src/react/AssistantProvider.tsx +7 -0
  301. package/src/react/client/Tools.ts +3 -5
  302. package/src/react/model-context/toolbox.test.ts +2 -1
  303. package/src/react/model-context/toolbox.ts +2 -6
  304. package/src/react/runtimes/external-message-converter.ts +3 -1
  305. package/src/react/types/MessagePartComponentTypes.ts +5 -5
  306. package/src/runtime/api/message-part-runtime.ts +14 -11
  307. package/src/runtime/interfaces/thread-runtime-core.ts +2 -0
  308. package/src/runtime/utils/resolveToolApprovalResponse.test.ts +91 -0
  309. package/src/runtime/utils/resolveToolApprovalResponse.ts +55 -0
  310. package/src/runtime/utils/thread-message-like.ts +10 -1
  311. package/src/runtimes/local/local-thread-runtime-core.test.ts +61 -2
  312. package/src/runtimes/local/local-thread-runtime-core.ts +17 -8
  313. package/src/runtimes/local/should-continue.ts +2 -1
  314. package/src/store/clients/suggestions.ts +3 -5
  315. package/src/store/clients/thread-message-client.ts +13 -14
  316. package/src/store/runtime-clients/composer-runtime-client.ts +18 -21
  317. package/src/store/runtime-clients/liveRef.ts +5 -0
  318. package/src/store/runtime-clients/message-runtime-client.ts +16 -21
  319. package/src/store/runtime-clients/thread-list-runtime-client.ts +3 -5
  320. package/src/store/runtime-clients/thread-runtime-client.ts +9 -10
  321. package/src/store/runtime-clients/useSubscribable.ts +2 -10
  322. package/src/store/scopes/part.ts +5 -2
  323. package/src/types/message.ts +45 -3
@@ -1 +1 @@
1
- {"version":3,"file":"thread-list-item-runtime.js","names":[],"sources":["../../../src/runtime/api/thread-list-item-runtime.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { SubscribableWithState } from \"../../subscribable/subscribable\";\nimport type { ThreadListItemRuntimePath } from \"./paths\";\nimport type { ThreadListRuntimeCoreBinding } from \"./thread-list-runtime\";\n\nexport type ThreadListItemEventPayload = {\n /**\n * @deprecated State-derivable. Compare `s.threads.mainThreadId` against the\n * item's `s.threadListItem.id` via `useAuiState` instead. Kept for backward\n * compatibility.\n */\n switchedTo: Record<string, never>;\n /**\n * @deprecated State-derivable. Compare `s.threads.mainThreadId` against the\n * item's `s.threadListItem.id` via `useAuiState` instead. Kept for backward\n * compatibility.\n */\n switchedAway: Record<string, never>;\n};\n\nexport type ThreadListItemEventType = keyof ThreadListItemEventPayload;\n\nexport type ThreadListItemEventCallback<E extends ThreadListItemEventType> = (\n payload: ThreadListItemEventPayload[E],\n) => void;\n\nimport type { ThreadListItemState } from \"./bindings\";\nimport type { ThreadListItemStatus } from \"../interfaces/thread-list-runtime-core\";\n\nexport type { ThreadListItemState, ThreadListItemStatus };\n\nexport type ThreadListItemRuntime = {\n readonly path: ThreadListItemRuntimePath;\n getState(): ThreadListItemState;\n\n initialize(): Promise<{ remoteId: string; externalId: string | undefined }>;\n generateTitle(): Promise<void>;\n\n switchTo(options?: { unarchive?: boolean }): Promise<void>;\n rename(newTitle: string): Promise<void>;\n updateCustom(custom: Record<string, unknown> | undefined): Promise<void>;\n archive(): Promise<void>;\n unarchive(): Promise<void>;\n delete(): Promise<void>;\n\n detach(): void;\n\n subscribe(callback: () => void): Unsubscribe;\n\n unstable_on<E extends ThreadListItemEventType>(\n event: E,\n callback: ThreadListItemEventCallback<E>,\n ): Unsubscribe;\n\n __internal_getRuntime(): ThreadListItemRuntime;\n};\n\nexport type ThreadListItemStateBinding = SubscribableWithState<\n ThreadListItemState,\n ThreadListItemRuntimePath\n>;\n\nexport class ThreadListItemRuntimeImpl implements ThreadListItemRuntime {\n public get path() {\n return this._core.path;\n }\n\n constructor(\n private _core: ThreadListItemStateBinding,\n private _threadListBinding: ThreadListRuntimeCoreBinding,\n ) {\n this.__internal_bindMethods();\n }\n\n protected __internal_bindMethods() {\n this.switchTo = this.switchTo.bind(this);\n this.rename = this.rename.bind(this);\n this.updateCustom = this.updateCustom.bind(this);\n this.archive = this.archive.bind(this);\n this.unarchive = this.unarchive.bind(this);\n this.delete = this.delete.bind(this);\n this.initialize = this.initialize.bind(this);\n this.generateTitle = this.generateTitle.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.unstable_on = this.unstable_on.bind(this);\n this.getState = this.getState.bind(this);\n this.detach = this.detach.bind(this);\n }\n\n public getState(): ThreadListItemState {\n return this._core.getState();\n }\n\n public switchTo(options?: { unarchive?: boolean }): Promise<void> {\n const state = this._core.getState();\n return this._threadListBinding.switchToThread(state.id, options);\n }\n\n public rename(newTitle: string): Promise<void> {\n const state = this._core.getState();\n\n return this._threadListBinding.rename(state.id, newTitle);\n }\n\n public updateCustom(\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n const state = this._core.getState();\n if (!this._threadListBinding.updateCustom) {\n throw new Error(\n \"Thread list runtime does not support updating custom metadata\",\n );\n }\n\n return this._threadListBinding.updateCustom(state.id, custom);\n }\n\n public archive(): Promise<void> {\n const state = this._core.getState();\n\n return this._threadListBinding.archive(state.id);\n }\n\n public unarchive(): Promise<void> {\n const state = this._core.getState();\n\n return this._threadListBinding.unarchive(state.id);\n }\n\n public delete(): Promise<void> {\n const state = this._core.getState();\n\n return this._threadListBinding.delete(state.id);\n }\n\n public initialize(): Promise<{\n remoteId: string;\n externalId: string | undefined;\n }> {\n const state = this._core.getState();\n return this._threadListBinding.initialize(state.id);\n }\n\n public generateTitle(): Promise<void> {\n const state = this._core.getState();\n return this._threadListBinding.generateTitle(state.id);\n }\n\n public unstable_on<E extends ThreadListItemEventType>(\n event: E,\n callback: ThreadListItemEventCallback<E>,\n ) {\n let prevIsMain = this._core.getState().isMain;\n let prevThreadId = this._core.getState().id;\n return this.subscribe(() => {\n const currentState = this._core.getState();\n const newIsMain = currentState.isMain;\n const newThreadId = currentState.id;\n if (prevIsMain === newIsMain && prevThreadId === newThreadId) return;\n prevIsMain = newIsMain;\n prevThreadId = newThreadId;\n\n if (event === \"switchedTo\" && !newIsMain) return;\n if (event === \"switchedAway\" && newIsMain) return;\n (callback as (payload?: unknown) => void)({});\n });\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n return this._core.subscribe(callback);\n }\n\n public detach(): void {\n const state = this._core.getState();\n\n this._threadListBinding.detach(state.id);\n }\n\n public __internal_getRuntime(): ThreadListItemRuntime {\n return this;\n }\n}\n"],"mappings":";AA8DA,IAAa,4BAAb,MAAwE;CAM5D;CACA;CANV,IAAW,OAAO;EAChB,OAAO,KAAK,MAAM;CACpB;CAEA,YACE,OACA,oBACA;EAFQ,KAAA,QAAA;EACA,KAAA,qBAAA;EAER,KAAK,uBAAuB;CAC9B;CAEA,yBAAmC;EACjC,KAAK,WAAW,KAAK,SAAS,KAAK,IAAI;EACvC,KAAK,SAAS,KAAK,OAAO,KAAK,IAAI;EACnC,KAAK,eAAe,KAAK,aAAa,KAAK,IAAI;EAC/C,KAAK,UAAU,KAAK,QAAQ,KAAK,IAAI;EACrC,KAAK,YAAY,KAAK,UAAU,KAAK,IAAI;EACzC,KAAK,SAAS,KAAK,OAAO,KAAK,IAAI;EACnC,KAAK,aAAa,KAAK,WAAW,KAAK,IAAI;EAC3C,KAAK,gBAAgB,KAAK,cAAc,KAAK,IAAI;EACjD,KAAK,YAAY,KAAK,UAAU,KAAK,IAAI;EACzC,KAAK,cAAc,KAAK,YAAY,KAAK,IAAI;EAC7C,KAAK,WAAW,KAAK,SAAS,KAAK,IAAI;EACvC,KAAK,SAAS,KAAK,OAAO,KAAK,IAAI;CACrC;CAEA,WAAuC;EACrC,OAAO,KAAK,MAAM,SAAS;CAC7B;CAEA,SAAgB,SAAkD;EAChE,MAAM,QAAQ,KAAK,MAAM,SAAS;EAClC,OAAO,KAAK,mBAAmB,eAAe,MAAM,IAAI,OAAO;CACjE;CAEA,OAAc,UAAiC;EAC7C,MAAM,QAAQ,KAAK,MAAM,SAAS;EAElC,OAAO,KAAK,mBAAmB,OAAO,MAAM,IAAI,QAAQ;CAC1D;CAEA,aACE,QACe;EACf,MAAM,QAAQ,KAAK,MAAM,SAAS;EAClC,IAAI,CAAC,KAAK,mBAAmB,cAC3B,MAAM,IAAI,MACR,+DACF;EAGF,OAAO,KAAK,mBAAmB,aAAa,MAAM,IAAI,MAAM;CAC9D;CAEA,UAAgC;EAC9B,MAAM,QAAQ,KAAK,MAAM,SAAS;EAElC,OAAO,KAAK,mBAAmB,QAAQ,MAAM,EAAE;CACjD;CAEA,YAAkC;EAChC,MAAM,QAAQ,KAAK,MAAM,SAAS;EAElC,OAAO,KAAK,mBAAmB,UAAU,MAAM,EAAE;CACnD;CAEA,SAA+B;EAC7B,MAAM,QAAQ,KAAK,MAAM,SAAS;EAElC,OAAO,KAAK,mBAAmB,OAAO,MAAM,EAAE;CAChD;CAEA,aAGG;EACD,MAAM,QAAQ,KAAK,MAAM,SAAS;EAClC,OAAO,KAAK,mBAAmB,WAAW,MAAM,EAAE;CACpD;CAEA,gBAAsC;EACpC,MAAM,QAAQ,KAAK,MAAM,SAAS;EAClC,OAAO,KAAK,mBAAmB,cAAc,MAAM,EAAE;CACvD;CAEA,YACE,OACA,UACA;EACA,IAAI,aAAa,KAAK,MAAM,SAAS,CAAC,CAAC;EACvC,IAAI,eAAe,KAAK,MAAM,SAAS,CAAC,CAAC;EACzC,OAAO,KAAK,gBAAgB;GAC1B,MAAM,eAAe,KAAK,MAAM,SAAS;GACzC,MAAM,YAAY,aAAa;GAC/B,MAAM,cAAc,aAAa;GACjC,IAAI,eAAe,aAAa,iBAAiB,aAAa;GAC9D,aAAa;GACb,eAAe;GAEf,IAAI,UAAU,gBAAgB,CAAC,WAAW;GAC1C,IAAI,UAAU,kBAAkB,WAAW;GAC3C,SAA0C,CAAC,CAAC;EAC9C,CAAC;CACH;CAEA,UAAiB,UAAmC;EAClD,OAAO,KAAK,MAAM,UAAU,QAAQ;CACtC;CAEA,SAAsB;EACpB,MAAM,QAAQ,KAAK,MAAM,SAAS;EAElC,KAAK,mBAAmB,OAAO,MAAM,EAAE;CACzC;CAEA,wBAAsD;EACpD,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"thread-list-item-runtime.js","names":["Unsubscribe","SubscribableWithState","ThreadListItemRuntimePath","ThreadListRuntimeCoreBinding","ThreadListItemEventPayload","switchedTo","Record","switchedAway","ThreadListItemEventType","ThreadListItemEventCallback","payload","E","ThreadListItemState","ThreadListItemStatus","ThreadListItemRuntime","path","getState","initialize","Promise","remoteId","externalId","generateTitle","switchTo","options","unarchive","rename","newTitle","updateCustom","custom","archive","delete","detach","subscribe","callback","unstable_on","event","__internal_getRuntime","ThreadListItemStateBinding","ThreadListItemRuntimeImpl","_core","constructor","_threadListBinding","__internal_bindMethods","bind","state","switchToThread","id","Error","prevIsMain","isMain","prevThreadId","currentState","newIsMain","newThreadId"],"sources":["../../../src/runtime/api/thread-list-item-runtime.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { SubscribableWithState } from \"../../subscribable/subscribable\";\nimport type { ThreadListItemRuntimePath } from \"./paths\";\nimport type { ThreadListRuntimeCoreBinding } from \"./thread-list-runtime\";\n\nexport type ThreadListItemEventPayload = {\n /**\n * @deprecated State-derivable. Compare `s.threads.mainThreadId` against the\n * item's `s.threadListItem.id` via `useAuiState` instead. Kept for backward\n * compatibility.\n */\n switchedTo: Record<string, never>;\n /**\n * @deprecated State-derivable. Compare `s.threads.mainThreadId` against the\n * item's `s.threadListItem.id` via `useAuiState` instead. Kept for backward\n * compatibility.\n */\n switchedAway: Record<string, never>;\n};\n\nexport type ThreadListItemEventType = keyof ThreadListItemEventPayload;\n\nexport type ThreadListItemEventCallback<E extends ThreadListItemEventType> = (\n payload: ThreadListItemEventPayload[E],\n) => void;\n\nimport type { ThreadListItemState } from \"./bindings\";\nimport type { ThreadListItemStatus } from \"../interfaces/thread-list-runtime-core\";\n\nexport type { ThreadListItemState, ThreadListItemStatus };\n\nexport type ThreadListItemRuntime = {\n readonly path: ThreadListItemRuntimePath;\n getState(): ThreadListItemState;\n\n initialize(): Promise<{ remoteId: string; externalId: string | undefined }>;\n generateTitle(): Promise<void>;\n\n switchTo(options?: { unarchive?: boolean }): Promise<void>;\n rename(newTitle: string): Promise<void>;\n updateCustom(custom: Record<string, unknown> | undefined): Promise<void>;\n archive(): Promise<void>;\n unarchive(): Promise<void>;\n delete(): Promise<void>;\n\n detach(): void;\n\n subscribe(callback: () => void): Unsubscribe;\n\n unstable_on<E extends ThreadListItemEventType>(\n event: E,\n callback: ThreadListItemEventCallback<E>,\n ): Unsubscribe;\n\n __internal_getRuntime(): ThreadListItemRuntime;\n};\n\nexport type ThreadListItemStateBinding = SubscribableWithState<\n ThreadListItemState,\n ThreadListItemRuntimePath\n>;\n\nexport class ThreadListItemRuntimeImpl implements ThreadListItemRuntime {\n public get path() {\n return this._core.path;\n }\n\n constructor(\n private _core: ThreadListItemStateBinding,\n private _threadListBinding: ThreadListRuntimeCoreBinding,\n ) {\n this.__internal_bindMethods();\n }\n\n protected __internal_bindMethods() {\n this.switchTo = this.switchTo.bind(this);\n this.rename = this.rename.bind(this);\n this.updateCustom = this.updateCustom.bind(this);\n this.archive = this.archive.bind(this);\n this.unarchive = this.unarchive.bind(this);\n this.delete = this.delete.bind(this);\n this.initialize = this.initialize.bind(this);\n this.generateTitle = this.generateTitle.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.unstable_on = this.unstable_on.bind(this);\n this.getState = this.getState.bind(this);\n this.detach = this.detach.bind(this);\n }\n\n public getState(): ThreadListItemState {\n return this._core.getState();\n }\n\n public switchTo(options?: { unarchive?: boolean }): Promise<void> {\n const state = this._core.getState();\n return this._threadListBinding.switchToThread(state.id, options);\n }\n\n public rename(newTitle: string): Promise<void> {\n const state = this._core.getState();\n\n return this._threadListBinding.rename(state.id, newTitle);\n }\n\n public updateCustom(\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n const state = this._core.getState();\n if (!this._threadListBinding.updateCustom) {\n throw new Error(\n \"Thread list runtime does not support updating custom metadata\",\n );\n }\n\n return this._threadListBinding.updateCustom(state.id, custom);\n }\n\n public archive(): Promise<void> {\n const state = this._core.getState();\n\n return this._threadListBinding.archive(state.id);\n }\n\n public unarchive(): Promise<void> {\n const state = this._core.getState();\n\n return this._threadListBinding.unarchive(state.id);\n }\n\n public delete(): Promise<void> {\n const state = this._core.getState();\n\n return this._threadListBinding.delete(state.id);\n }\n\n public initialize(): Promise<{\n remoteId: string;\n externalId: string | undefined;\n }> {\n const state = this._core.getState();\n return this._threadListBinding.initialize(state.id);\n }\n\n public generateTitle(): Promise<void> {\n const state = this._core.getState();\n return this._threadListBinding.generateTitle(state.id);\n }\n\n public unstable_on<E extends ThreadListItemEventType>(\n event: E,\n callback: ThreadListItemEventCallback<E>,\n ) {\n let prevIsMain = this._core.getState().isMain;\n let prevThreadId = this._core.getState().id;\n return this.subscribe(() => {\n const currentState = this._core.getState();\n const newIsMain = currentState.isMain;\n const newThreadId = currentState.id;\n if (prevIsMain === newIsMain && prevThreadId === newThreadId) return;\n prevIsMain = newIsMain;\n prevThreadId = newThreadId;\n\n if (event === \"switchedTo\" && !newIsMain) return;\n if (event === \"switchedAway\" && newIsMain) return;\n (callback as (payload?: unknown) => void)({});\n });\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n return this._core.subscribe(callback);\n }\n\n public detach(): void {\n const state = this._core.getState();\n\n this._threadListBinding.detach(state.id);\n }\n\n public __internal_getRuntime(): ThreadListItemRuntime {\n return this;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"thread-list-runtime.js","names":[],"sources":["../../../src/runtime/api/thread-list-runtime.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport {\n LazyMemoizeSubject,\n NestedSubscriptionSubject,\n} from \"../../subscribable/subscribable\";\nimport {\n SKIP_UPDATE,\n ShallowMemoizeSubject,\n} from \"../../subscribable/subscribable\";\nimport type { ThreadListRuntimeCore } from \"../interfaces/thread-list-runtime-core\";\nimport {\n type ThreadListItemRuntime,\n ThreadListItemRuntimeImpl,\n type ThreadListItemState,\n} from \"./thread-list-item-runtime\";\nimport {\n type ThreadListItemRuntimeBinding,\n type ThreadRuntime,\n type ThreadRuntimeCoreBinding,\n ThreadRuntimeImpl,\n} from \"./thread-runtime\";\n\nconst RESOLVED_PROMISE = Promise.resolve();\n\nexport type ThreadListState = {\n readonly mainThreadId: string;\n readonly newThreadId: string | undefined;\n readonly threadIds: readonly string[];\n readonly archivedThreadIds: readonly string[];\n readonly isLoading: boolean;\n readonly isLoadingMore: boolean;\n readonly hasMore: boolean;\n readonly threadItems: Readonly<\n Record<string, Omit<ThreadListItemState, \"isMain\" | \"threadId\">>\n >;\n};\n\nexport type ThreadListRuntime = {\n getState(): ThreadListState;\n\n subscribe(callback: () => void): Unsubscribe;\n\n readonly main: ThreadRuntime;\n getById(threadId: string): ThreadRuntime;\n\n readonly mainItem: ThreadListItemRuntime;\n getItemById(threadId: string): ThreadListItemRuntime;\n getItemByIndex(idx: number): ThreadListItemRuntime;\n getArchivedItemByIndex(idx: number): ThreadListItemRuntime;\n\n switchToThread(\n threadId: string,\n options?: { unarchive?: boolean },\n ): Promise<void>;\n switchToNewThread(): Promise<void>;\n\n getLoadThreadsPromise(): Promise<void>;\n reload(): Promise<void>;\n loadMore(): Promise<void>;\n};\n\nconst getThreadListState = (\n threadList: ThreadListRuntimeCore,\n): ThreadListState => {\n return {\n mainThreadId: threadList.mainThreadId,\n newThreadId: threadList.newThreadId,\n threadIds: threadList.threadIds,\n archivedThreadIds: threadList.archivedThreadIds,\n isLoading: threadList.isLoading,\n isLoadingMore: threadList.isLoadingMore ?? false,\n hasMore: threadList.hasMore ?? false,\n threadItems: threadList.threadItems,\n };\n};\n\nconst getThreadListItemState = (\n threadList: ThreadListRuntimeCore,\n threadId: string | undefined,\n): ThreadListItemState | SKIP_UPDATE => {\n if (threadId === undefined) return SKIP_UPDATE;\n\n const threadData = threadList.getItemById(threadId);\n if (!threadData) return SKIP_UPDATE;\n return {\n id: threadData.id,\n remoteId: threadData.remoteId,\n externalId: threadData.externalId,\n title: threadData.title,\n status: threadData.status,\n lastMessageAt: threadData.lastMessageAt,\n custom: threadData.custom,\n isMain: threadData.id === threadList.mainThreadId,\n };\n};\n\nexport type ThreadListRuntimeCoreBinding = ThreadListRuntimeCore;\n\nexport class ThreadListRuntimeImpl implements ThreadListRuntime {\n private _getState;\n constructor(\n private _core: ThreadListRuntimeCoreBinding,\n private _runtimeFactory: new (\n binding: ThreadRuntimeCoreBinding,\n threadListItemBinding: ThreadListItemRuntimeBinding,\n ) => ThreadRuntime = ThreadRuntimeImpl,\n ) {\n const stateBinding = new LazyMemoizeSubject({\n path: {},\n getState: () => getThreadListState(_core),\n subscribe: (callback) => _core.subscribe(callback),\n });\n\n this._getState = stateBinding.getState.bind(stateBinding);\n\n this._mainThreadListItemRuntime = new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[main]`,\n threadSelector: { type: \"main\" },\n },\n getState: () => {\n return getThreadListItemState(this._core, this._core.mainThreadId);\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n\n this.main = new _runtimeFactory(\n new NestedSubscriptionSubject({\n path: {\n ref: \"threads.main\",\n threadSelector: { type: \"main\" },\n },\n getState: () => _core.getMainThreadRuntimeCore(),\n subscribe: (callback) => _core.subscribe(callback),\n }),\n this._mainThreadListItemRuntime,\n );\n\n this.__internal_bindMethods();\n }\n\n protected __internal_bindMethods() {\n this.switchToThread = this.switchToThread.bind(this);\n this.switchToNewThread = this.switchToNewThread.bind(this);\n this.getLoadThreadsPromise = this.getLoadThreadsPromise.bind(this);\n this.reload = this.reload.bind(this);\n this.loadMore = this.loadMore.bind(this);\n this.getState = this.getState.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.getById = this.getById.bind(this);\n this.getItemById = this.getItemById.bind(this);\n this.getItemByIndex = this.getItemByIndex.bind(this);\n this.getArchivedItemByIndex = this.getArchivedItemByIndex.bind(this);\n }\n\n public switchToThread(\n threadId: string,\n options?: { unarchive?: boolean },\n ): Promise<void> {\n return this._core.switchToThread(threadId, options);\n }\n\n public switchToNewThread(): Promise<void> {\n return this._core.switchToNewThread();\n }\n\n public getLoadThreadsPromise(): Promise<void> {\n return this._core.getLoadThreadsPromise();\n }\n\n public reload(): Promise<void> {\n return this._core.reload?.() ?? RESOLVED_PROMISE;\n }\n\n public loadMore(): Promise<void> {\n return this._core.loadMore?.() ?? RESOLVED_PROMISE;\n }\n\n public getState(): ThreadListState {\n return this._getState();\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n return this._core.subscribe(callback);\n }\n\n private _mainThreadListItemRuntime;\n\n public readonly main: ThreadRuntime;\n\n public get mainItem() {\n return this._mainThreadListItemRuntime;\n }\n\n public getById(threadId: string) {\n return new this._runtimeFactory(\n new NestedSubscriptionSubject({\n path: {\n ref: `threads[threadId=${JSON.stringify(threadId)}]`,\n threadSelector: { type: \"threadId\", threadId },\n },\n getState: () => this._core.getThreadRuntimeCore(threadId),\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this.mainItem,\n );\n }\n\n public getItemByIndex(idx: number) {\n return new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[${idx}]`,\n threadSelector: { type: \"index\", index: idx },\n },\n getState: () => {\n return getThreadListItemState(this._core, this._core.threadIds[idx]);\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n }\n\n public getArchivedItemByIndex(idx: number) {\n return new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `archivedThreadItems[${idx}]`,\n threadSelector: { type: \"archiveIndex\", index: idx },\n },\n getState: () => {\n return getThreadListItemState(\n this._core,\n this._core.archivedThreadIds[idx],\n );\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n }\n\n public getItemById(threadId: string) {\n return new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[threadId=${threadId}]`,\n threadSelector: { type: \"threadId\", threadId },\n },\n getState: () => {\n return getThreadListItemState(this._core, threadId);\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"thread-list-runtime.js","names":["Unsubscribe","LazyMemoizeSubject","NestedSubscriptionSubject","SKIP_UPDATE","ShallowMemoizeSubject","ThreadListRuntimeCore","ThreadListItemRuntime","ThreadListItemRuntimeImpl","ThreadListItemState","ThreadListItemRuntimeBinding","ThreadRuntime","ThreadRuntimeCoreBinding","ThreadRuntimeImpl","RESOLVED_PROMISE","Promise","resolve","ThreadListState","mainThreadId","newThreadId","threadIds","archivedThreadIds","isLoading","isLoadingMore","hasMore","threadItems","Readonly","Record","Omit","ThreadListRuntime","getState","subscribe","callback","main","getById","threadId","mainItem","getItemById","getItemByIndex","idx","getArchivedItemByIndex","switchToThread","options","unarchive","switchToNewThread","getLoadThreadsPromise","reload","loadMore","getThreadListState","threadList","getThreadListItemState","undefined","threadData","id","remoteId","externalId","title","status","lastMessageAt","custom","isMain","ThreadListRuntimeCoreBinding","ThreadListRuntimeImpl","_getState","constructor","_core","_runtimeFactory","binding","threadListItemBinding","stateBinding","path","bind","_mainThreadListItemRuntime","ref","threadSelector","type","getMainThreadRuntimeCore","__internal_bindMethods","JSON","stringify","getThreadRuntimeCore","index"],"sources":["../../../src/runtime/api/thread-list-runtime.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport {\n LazyMemoizeSubject,\n NestedSubscriptionSubject,\n} from \"../../subscribable/subscribable\";\nimport {\n SKIP_UPDATE,\n ShallowMemoizeSubject,\n} from \"../../subscribable/subscribable\";\nimport type { ThreadListRuntimeCore } from \"../interfaces/thread-list-runtime-core\";\nimport {\n type ThreadListItemRuntime,\n ThreadListItemRuntimeImpl,\n type ThreadListItemState,\n} from \"./thread-list-item-runtime\";\nimport {\n type ThreadListItemRuntimeBinding,\n type ThreadRuntime,\n type ThreadRuntimeCoreBinding,\n ThreadRuntimeImpl,\n} from \"./thread-runtime\";\n\nconst RESOLVED_PROMISE = Promise.resolve();\n\nexport type ThreadListState = {\n readonly mainThreadId: string;\n readonly newThreadId: string | undefined;\n readonly threadIds: readonly string[];\n readonly archivedThreadIds: readonly string[];\n readonly isLoading: boolean;\n readonly isLoadingMore: boolean;\n readonly hasMore: boolean;\n readonly threadItems: Readonly<\n Record<string, Omit<ThreadListItemState, \"isMain\" | \"threadId\">>\n >;\n};\n\nexport type ThreadListRuntime = {\n getState(): ThreadListState;\n\n subscribe(callback: () => void): Unsubscribe;\n\n readonly main: ThreadRuntime;\n getById(threadId: string): ThreadRuntime;\n\n readonly mainItem: ThreadListItemRuntime;\n getItemById(threadId: string): ThreadListItemRuntime;\n getItemByIndex(idx: number): ThreadListItemRuntime;\n getArchivedItemByIndex(idx: number): ThreadListItemRuntime;\n\n switchToThread(\n threadId: string,\n options?: { unarchive?: boolean },\n ): Promise<void>;\n switchToNewThread(): Promise<void>;\n\n getLoadThreadsPromise(): Promise<void>;\n reload(): Promise<void>;\n loadMore(): Promise<void>;\n};\n\nconst getThreadListState = (\n threadList: ThreadListRuntimeCore,\n): ThreadListState => {\n return {\n mainThreadId: threadList.mainThreadId,\n newThreadId: threadList.newThreadId,\n threadIds: threadList.threadIds,\n archivedThreadIds: threadList.archivedThreadIds,\n isLoading: threadList.isLoading,\n isLoadingMore: threadList.isLoadingMore ?? false,\n hasMore: threadList.hasMore ?? false,\n threadItems: threadList.threadItems,\n };\n};\n\nconst getThreadListItemState = (\n threadList: ThreadListRuntimeCore,\n threadId: string | undefined,\n): ThreadListItemState | SKIP_UPDATE => {\n if (threadId === undefined) return SKIP_UPDATE;\n\n const threadData = threadList.getItemById(threadId);\n if (!threadData) return SKIP_UPDATE;\n return {\n id: threadData.id,\n remoteId: threadData.remoteId,\n externalId: threadData.externalId,\n title: threadData.title,\n status: threadData.status,\n lastMessageAt: threadData.lastMessageAt,\n custom: threadData.custom,\n isMain: threadData.id === threadList.mainThreadId,\n };\n};\n\nexport type ThreadListRuntimeCoreBinding = ThreadListRuntimeCore;\n\nexport class ThreadListRuntimeImpl implements ThreadListRuntime {\n private _getState;\n constructor(\n private _core: ThreadListRuntimeCoreBinding,\n private _runtimeFactory: new (\n binding: ThreadRuntimeCoreBinding,\n threadListItemBinding: ThreadListItemRuntimeBinding,\n ) => ThreadRuntime = ThreadRuntimeImpl,\n ) {\n const stateBinding = new LazyMemoizeSubject({\n path: {},\n getState: () => getThreadListState(_core),\n subscribe: (callback) => _core.subscribe(callback),\n });\n\n this._getState = stateBinding.getState.bind(stateBinding);\n\n this._mainThreadListItemRuntime = new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[main]`,\n threadSelector: { type: \"main\" },\n },\n getState: () => {\n return getThreadListItemState(this._core, this._core.mainThreadId);\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n\n this.main = new _runtimeFactory(\n new NestedSubscriptionSubject({\n path: {\n ref: \"threads.main\",\n threadSelector: { type: \"main\" },\n },\n getState: () => _core.getMainThreadRuntimeCore(),\n subscribe: (callback) => _core.subscribe(callback),\n }),\n this._mainThreadListItemRuntime,\n );\n\n this.__internal_bindMethods();\n }\n\n protected __internal_bindMethods() {\n this.switchToThread = this.switchToThread.bind(this);\n this.switchToNewThread = this.switchToNewThread.bind(this);\n this.getLoadThreadsPromise = this.getLoadThreadsPromise.bind(this);\n this.reload = this.reload.bind(this);\n this.loadMore = this.loadMore.bind(this);\n this.getState = this.getState.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.getById = this.getById.bind(this);\n this.getItemById = this.getItemById.bind(this);\n this.getItemByIndex = this.getItemByIndex.bind(this);\n this.getArchivedItemByIndex = this.getArchivedItemByIndex.bind(this);\n }\n\n public switchToThread(\n threadId: string,\n options?: { unarchive?: boolean },\n ): Promise<void> {\n return this._core.switchToThread(threadId, options);\n }\n\n public switchToNewThread(): Promise<void> {\n return this._core.switchToNewThread();\n }\n\n public getLoadThreadsPromise(): Promise<void> {\n return this._core.getLoadThreadsPromise();\n }\n\n public reload(): Promise<void> {\n return this._core.reload?.() ?? RESOLVED_PROMISE;\n }\n\n public loadMore(): Promise<void> {\n return this._core.loadMore?.() ?? RESOLVED_PROMISE;\n }\n\n public getState(): ThreadListState {\n return this._getState();\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n return this._core.subscribe(callback);\n }\n\n private _mainThreadListItemRuntime;\n\n public readonly main: ThreadRuntime;\n\n public get mainItem() {\n return this._mainThreadListItemRuntime;\n }\n\n public getById(threadId: string) {\n return new this._runtimeFactory(\n new NestedSubscriptionSubject({\n path: {\n ref: `threads[threadId=${JSON.stringify(threadId)}]`,\n threadSelector: { type: \"threadId\", threadId },\n },\n getState: () => this._core.getThreadRuntimeCore(threadId),\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this.mainItem,\n );\n }\n\n public getItemByIndex(idx: number) {\n return new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[${idx}]`,\n threadSelector: { type: \"index\", index: idx },\n },\n getState: () => {\n return getThreadListItemState(this._core, this._core.threadIds[idx]);\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n }\n\n public getArchivedItemByIndex(idx: number) {\n return new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `archivedThreadItems[${idx}]`,\n threadSelector: { type: \"archiveIndex\", index: idx },\n },\n getState: () => {\n return getThreadListItemState(\n this._core,\n this._core.archivedThreadIds[idx],\n );\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n }\n\n public getItemById(threadId: string) {\n return new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[threadId=${threadId}]`,\n threadSelector: { type: \"threadId\", threadId },\n },\n getState: () => {\n return getThreadListItemState(this._core, threadId);\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"thread-runtime.js","names":[],"sources":["../../../src/runtime/api/thread-runtime.ts"],"sourcesContent":["import type {\n ThreadSuggestion,\n RuntimeCapabilities,\n ThreadRuntimeCore,\n SpeechState,\n VoiceSessionState,\n ThreadRuntimeEventCallback,\n ThreadRuntimeEventType,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../interfaces/thread-runtime-core\";\nimport type { ExportedMessageRepository } from \"../utils/message-repository\";\nimport type { ThreadMessageLike } from \"../utils/thread-message-like\";\nimport {\n type MessageRuntime,\n MessageRuntimeImpl,\n type MessageState,\n} from \"./message-runtime\";\nimport { NestedSubscriptionSubject } from \"../../subscribable/subscribable\";\nimport {\n ShallowMemoizeSubject,\n SKIP_UPDATE,\n} from \"../../subscribable/subscribable\";\nimport type { SubscribableWithState } from \"../../subscribable/subscribable\";\nimport {\n type ThreadComposerRuntime,\n ThreadComposerRuntimeImpl,\n} from \"./composer-runtime\";\nimport type {\n MessageRuntimePath,\n ThreadListItemRuntimePath,\n ThreadRuntimePath,\n} from \"./paths\";\nimport type { ThreadListItemState } from \"./bindings\";\nimport type { AppendMessage, ThreadMessage } from \"../../types/message\";\nimport type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { RunConfig } from \"../../types/message\";\nimport { EventSubscriptionSubject } from \"../../subscribable/subscribable\";\nimport { symbolInnerMessage } from \"../utils/external-store-message\";\nimport type { ModelContext } from \"../../model-context/types\";\nimport type {\n ChatModelRunOptions,\n ChatModelRunResult,\n} from \"../utils/chat-model-adapter\";\nimport type { ReadonlyJSONValue } from \"assistant-stream/utils\";\n\nexport type CreateStartRunConfig = {\n parentId: string | null;\n sourceId?: string | null | undefined;\n runConfig?: RunConfig | undefined;\n};\n\nexport type CreateResumeRunConfig = CreateStartRunConfig & {\n stream?: (\n options: ChatModelRunOptions,\n ) => AsyncGenerator<ChatModelRunResult, void, unknown>;\n};\n\nconst toResumeRunConfig = (message: CreateResumeRunConfig): ResumeRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n ...(message.stream ? { stream: message.stream } : {}),\n };\n};\n\nconst toStartRunConfig = (message: CreateStartRunConfig): StartRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n };\n};\n\nexport type CreateAppendMessage =\n | string\n | {\n parentId?: string | null | undefined;\n sourceId?: string | null | undefined;\n role?: AppendMessage[\"role\"] | undefined;\n content: AppendMessage[\"content\"];\n attachments?: AppendMessage[\"attachments\"] | undefined;\n metadata?: AppendMessage[\"metadata\"] | undefined;\n createdAt?: Date | undefined;\n runConfig?: AppendMessage[\"runConfig\"] | undefined;\n startRun?: boolean | undefined;\n };\n\nconst toAppendMessage = (\n messages: readonly ThreadMessage[],\n message: CreateAppendMessage,\n): AppendMessage => {\n if (typeof message === \"string\") {\n return {\n createdAt: new Date(),\n parentId: messages.at(-1)?.id ?? null,\n sourceId: null,\n runConfig: {},\n role: \"user\",\n content: [{ type: \"text\", text: message }],\n attachments: [],\n metadata: { custom: {} },\n };\n }\n\n return {\n createdAt: message.createdAt ?? new Date(),\n parentId: message.parentId ?? messages.at(-1)?.id ?? null,\n sourceId: message.sourceId ?? null,\n role: message.role ?? \"user\",\n content: message.content,\n attachments: message.attachments ?? [],\n metadata: message.metadata ?? { custom: {} },\n runConfig: message.runConfig ?? {},\n startRun: message.startRun,\n } as AppendMessage;\n};\n\nexport type ThreadRuntimeCoreBinding = SubscribableWithState<\n ThreadRuntimeCore,\n ThreadRuntimePath\n> & {\n outerSubscribe(callback: () => void): Unsubscribe;\n};\n\nexport type ThreadListItemRuntimeBinding = SubscribableWithState<\n ThreadListItemState,\n ThreadListItemRuntimePath\n>;\n\nexport type ThreadState = {\n /**\n * The thread ID.\n * @deprecated This field is deprecated and will be removed in 0.12.0. Use `useThreadListItem().id` instead.\n */\n readonly threadId: string;\n\n /**\n * The thread metadata.\n *\n * @deprecated Use `useThreadListItem()` instead. This field is deprecated and will be removed in 0.12.0.\n */\n readonly metadata: ThreadListItemState;\n\n /**\n * Whether the thread is disabled. Disabled threads cannot receive new messages.\n */\n readonly isDisabled: boolean;\n\n /**\n * Whether the thread is loading its history.\n */\n readonly isLoading: boolean;\n\n /**\n * Whether the thread is running. A thread is considered running when there is an active stream connection to the backend.\n */\n readonly isRunning: boolean;\n\n /**\n * The capabilities of the thread, such as whether the thread supports editing, branch switching, etc.\n */\n readonly capabilities: RuntimeCapabilities;\n\n /**\n * The messages in the currently selected branch of the thread.\n */\n readonly messages: readonly ThreadMessage[];\n\n /**\n * The thread state.\n *\n * @deprecated This feature is experimental\n */\n readonly state: ReadonlyJSONValue;\n\n /**\n * Follow up message suggestions to show the user.\n */\n readonly suggestions: readonly ThreadSuggestion[];\n\n /**\n * Custom extra information provided by the runtime.\n */\n readonly extras: unknown;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n readonly speech: SpeechState | undefined;\n\n readonly voice: VoiceSessionState | undefined;\n};\n\nexport const getThreadState = (\n runtime: ThreadRuntimeCore,\n threadListItemState: ThreadListItemState,\n): ThreadState => {\n const lastMessage = runtime.messages.at(-1);\n return Object.freeze({\n threadId: threadListItemState.id,\n metadata: threadListItemState,\n capabilities: runtime.capabilities,\n isDisabled: runtime.isDisabled,\n isLoading: runtime.isLoading,\n isRunning:\n runtime.isRunning ??\n (lastMessage?.role !== \"assistant\"\n ? false\n : lastMessage.status.type === \"running\"),\n messages: runtime.messages,\n state: runtime.state,\n suggestions: runtime.suggestions,\n extras: runtime.extras,\n speech: runtime.speech,\n voice: runtime.voice,\n });\n};\n\nexport type ThreadRuntime = {\n /**\n * The selector for the thread runtime.\n */\n readonly path: ThreadRuntimePath;\n\n /**\n * The thread composer runtime.\n */\n readonly composer: ThreadComposerRuntime;\n\n /**\n * Gets a snapshot of the thread state.\n */\n getState(): ThreadState;\n\n /**\n * Append a new message to the thread.\n *\n * @example ```ts\n * // append a new user message with the text \"Hello, world!\"\n * threadRuntime.append(\"Hello, world!\");\n * ```\n *\n * @example ```ts\n * // append a new assistant message with the text \"Hello, world!\"\n * threadRuntime.append({\n * role: \"assistant\",\n * content: [{ type: \"text\", text: \"Hello, world!\" }],\n * });\n * ```\n */\n append(message: CreateAppendMessage): void;\n\n deleteMessage(messageId: string): void | Promise<void>;\n\n /**\n * Start a new run with the given configuration.\n * @param config The configuration for starting the run\n */\n startRun(config: CreateStartRunConfig): void;\n\n /**\n * Resume a run with the given configuration.\n * @param config The configuration for resuming the run\n **/\n resumeRun(config: CreateResumeRunConfig): void;\n\n /**\n * Export the thread state in the external store format.\n * For AI SDK runtimes, this returns the AI SDK message format.\n * For other runtimes, this may return different formats or throw an error.\n * @returns The thread state in the external format (typed as any)\n */\n exportExternalState(): any;\n\n /**\n * Import thread state from the external store format.\n * For AI SDK runtimes, this accepts AI SDK messages.\n * For other runtimes, this may accept different formats or throw an error.\n * @param state The thread state in the external format (typed as any)\n */\n importExternalState(state: any): void;\n\n subscribe(callback: () => void): Unsubscribe;\n cancelRun(): void;\n getModelContext(): ModelContext;\n\n export(): ExportedMessageRepository;\n import(repository: ExportedMessageRepository): void;\n\n /**\n * Reset the thread with optional initial messages.\n *\n * @param initialMessages - Optional array of initial messages to populate the thread\n */\n reset(initialMessages?: readonly ThreadMessageLike[]): void;\n\n getMessageByIndex(idx: number): MessageRuntime;\n getMessageById(messageId: string): MessageRuntime;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n stopSpeaking(): void;\n\n connectVoice(): void;\n disconnectVoice(): void;\n getVoiceVolume(): number;\n subscribeVoiceVolume(callback: () => void): Unsubscribe;\n muteVoice(): void;\n unmuteVoice(): void;\n\n unstable_on<E extends ThreadRuntimeEventType>(\n event: E,\n callback: ThreadRuntimeEventCallback<E>,\n ): Unsubscribe;\n};\n\nexport class ThreadRuntimeImpl implements ThreadRuntime {\n public get path() {\n return this._threadBinding.path;\n }\n\n public get __internal_threadBinding() {\n return this._threadBinding;\n }\n\n private readonly _threadBinding: ThreadRuntimeCoreBinding & {\n getStateState(): ThreadState;\n };\n\n constructor(\n threadBinding: ThreadRuntimeCoreBinding,\n threadListItemBinding: ThreadListItemRuntimeBinding,\n ) {\n const stateBinding = new ShallowMemoizeSubject({\n path: threadBinding.path,\n getState: () =>\n getThreadState(\n threadBinding.getState(),\n threadListItemBinding.getState(),\n ),\n subscribe: (callback) => {\n const sub1 = threadBinding.subscribe(callback);\n const sub2 = threadListItemBinding.subscribe(callback);\n return () => {\n sub1();\n sub2();\n };\n },\n });\n\n this._threadBinding = {\n path: threadBinding.path,\n getState: () => threadBinding.getState(),\n getStateState: () => stateBinding.getState(),\n outerSubscribe: (callback) => threadBinding.outerSubscribe(callback),\n subscribe: (callback) => threadBinding.subscribe(callback),\n };\n\n this.composer = new ThreadComposerRuntimeImpl(\n new NestedSubscriptionSubject({\n path: {\n ...this.path,\n ref: `${this.path.ref}.composer`,\n composerSource: \"thread\",\n },\n getState: () => this._threadBinding.getState().composer,\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n );\n\n this.__internal_bindMethods();\n }\n\n protected __internal_bindMethods() {\n this.append = this.append.bind(this);\n this.deleteMessage = this.deleteMessage.bind(this);\n this.resumeRun = this.resumeRun.bind(this);\n this.importExternalState = this.importExternalState.bind(this);\n this.exportExternalState = this.exportExternalState.bind(this);\n this.startRun = this.startRun.bind(this);\n this.cancelRun = this.cancelRun.bind(this);\n this.stopSpeaking = this.stopSpeaking.bind(this);\n this.connectVoice = this.connectVoice.bind(this);\n this.disconnectVoice = this.disconnectVoice.bind(this);\n this.muteVoice = this.muteVoice.bind(this);\n this.unmuteVoice = this.unmuteVoice.bind(this);\n this.getVoiceVolume = this.getVoiceVolume.bind(this);\n this.subscribeVoiceVolume = this.subscribeVoiceVolume.bind(this);\n this.export = this.export.bind(this);\n this.import = this.import.bind(this);\n this.reset = this.reset.bind(this);\n this.getMessageByIndex = this.getMessageByIndex.bind(this);\n this.getMessageById = this.getMessageById.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.unstable_on = this.unstable_on.bind(this);\n this.getModelContext = this.getModelContext.bind(this);\n this.getState = this.getState.bind(this);\n }\n\n public readonly composer;\n\n public getState() {\n return this._threadBinding.getStateState();\n }\n\n public append(message: CreateAppendMessage) {\n this._threadBinding\n .getState()\n .append(\n toAppendMessage(this._threadBinding.getState().messages, message),\n );\n }\n\n public deleteMessage(messageId: string) {\n return this._threadBinding.getState().deleteMessage(messageId);\n }\n\n public subscribe(callback: () => void) {\n return this._threadBinding.subscribe(callback);\n }\n\n public getModelContext() {\n return this._threadBinding.getState().getModelContext();\n }\n\n public startRun(config: CreateStartRunConfig) {\n return this._threadBinding.getState().startRun(toStartRunConfig(config));\n }\n\n public resumeRun(config: CreateResumeRunConfig) {\n return this._threadBinding.getState().resumeRun(toResumeRunConfig(config));\n }\n\n public exportExternalState() {\n return this._threadBinding.getState().exportExternalState();\n }\n\n public importExternalState(state: any) {\n this._threadBinding.getState().importExternalState(state);\n }\n\n public cancelRun() {\n this._threadBinding.getState().cancelRun();\n }\n\n public stopSpeaking() {\n return this._threadBinding.getState().stopSpeaking();\n }\n\n public connectVoice() {\n this._threadBinding.getState().connectVoice();\n }\n\n public disconnectVoice() {\n this._threadBinding.getState().disconnectVoice();\n }\n\n public getVoiceVolume() {\n return this._threadBinding.getState().getVoiceVolume();\n }\n\n public subscribeVoiceVolume(callback: () => void) {\n return this._threadBinding.getState().subscribeVoiceVolume(callback);\n }\n\n public muteVoice() {\n this._threadBinding.getState().muteVoice();\n }\n\n public unmuteVoice() {\n this._threadBinding.getState().unmuteVoice();\n }\n\n public export() {\n return this._threadBinding.getState().export();\n }\n\n public import(data: ExportedMessageRepository) {\n this._threadBinding.getState().import(data);\n }\n\n public reset(initialMessages?: readonly ThreadMessageLike[]) {\n this._threadBinding.getState().reset(initialMessages);\n }\n\n public getMessageByIndex(idx: number) {\n if (idx < 0) throw new Error(\"Message index must be >= 0\");\n\n return this._getMessageRuntime(\n {\n ...this.path,\n ref: `${this.path.ref}.messages[${idx}]`,\n messageSelector: { type: \"index\", index: idx },\n },\n () => {\n const messages = this._threadBinding.getState().messages;\n const message = messages[idx];\n if (!message) return undefined;\n return {\n message,\n parentId: messages[idx - 1]?.id ?? null,\n index: idx,\n };\n },\n );\n }\n\n public getMessageById(messageId: string) {\n return this._getMessageRuntime(\n {\n ...this.path,\n ref: `${this.path.ref}.messages[messageId=${JSON.stringify(messageId)}]`,\n messageSelector: { type: \"messageId\", messageId: messageId },\n },\n () => this._threadBinding.getState().getMessageById(messageId),\n );\n }\n\n private _getMessageRuntime(\n path: MessageRuntimePath,\n callback: () =>\n | { parentId: string | null; message: ThreadMessage; index: number }\n | undefined,\n ) {\n return new MessageRuntimeImpl(\n new ShallowMemoizeSubject({\n path,\n getState: () => {\n const { message, parentId, index } = callback() ?? {};\n\n const { messages, speech: speechState } =\n this._threadBinding.getState();\n\n if (!message || parentId === undefined || index === undefined)\n return SKIP_UPDATE;\n\n const thread = this._threadBinding.getState();\n\n const branches = thread.getBranches(message.id);\n\n return {\n ...message,\n ...{ [symbolInnerMessage]: (message as any)[symbolInnerMessage] },\n\n index,\n isLast: messages.at(-1)?.id === message.id,\n parentId,\n\n branchNumber: branches.indexOf(message.id) + 1,\n branchCount: branches.length,\n\n speech:\n speechState?.messageId === message.id ? speechState : undefined,\n } satisfies MessageState;\n },\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n this._threadBinding,\n );\n }\n\n private _eventSubscriptionSubjects = new Map<\n string,\n EventSubscriptionSubject<ThreadRuntimeEventType>\n >();\n\n public unstable_on<E extends ThreadRuntimeEventType>(\n event: E,\n callback: ThreadRuntimeEventCallback<E>,\n ): Unsubscribe {\n let subject = this._eventSubscriptionSubjects.get(event);\n if (!subject) {\n subject = new EventSubscriptionSubject<ThreadRuntimeEventType>({\n event,\n binding: this._threadBinding,\n });\n this._eventSubscriptionSubjects.set(event, subject);\n }\n return subject.subscribe(callback as (payload?: unknown) => void);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"thread-runtime.js","names":["ThreadSuggestion","RuntimeCapabilities","ThreadRuntimeCore","SpeechState","VoiceSessionState","ThreadRuntimeEventCallback","ThreadRuntimeEventType","StartRunConfig","ResumeRunConfig","ExportedMessageRepository","ThreadMessageLike","MessageRuntime","MessageRuntimeImpl","MessageState","NestedSubscriptionSubject","ShallowMemoizeSubject","SKIP_UPDATE","SubscribableWithState","ThreadComposerRuntime","ThreadComposerRuntimeImpl","MessageRuntimePath","ThreadListItemRuntimePath","ThreadRuntimePath","ThreadListItemState","AppendMessage","ThreadMessage","Unsubscribe","RunConfig","EventSubscriptionSubject","symbolInnerMessage","ModelContext","ChatModelRunOptions","ChatModelRunResult","ReadonlyJSONValue","CreateStartRunConfig","parentId","sourceId","runConfig","CreateResumeRunConfig","stream","options","AsyncGenerator","toResumeRunConfig","message","toStartRunConfig","CreateAppendMessage","role","content","attachments","metadata","createdAt","Date","startRun","toAppendMessage","messages","at","id","type","text","custom","ThreadRuntimeCoreBinding","outerSubscribe","callback","ThreadListItemRuntimeBinding","ThreadState","threadId","isDisabled","isLoading","isRunning","capabilities","state","suggestions","extras","speech","voice","getThreadState","runtime","threadListItemState","lastMessage","Object","freeze","status","ThreadRuntime","path","composer","getState","append","deleteMessage","messageId","Promise","config","resumeRun","exportExternalState","importExternalState","subscribe","cancelRun","getModelContext","export","import","repository","reset","initialMessages","getMessageByIndex","idx","getMessageById","stopSpeaking","connectVoice","disconnectVoice","getVoiceVolume","subscribeVoiceVolume","muteVoice","unmuteVoice","unstable_on","event","E","ThreadRuntimeImpl","_threadBinding","__internal_threadBinding","getStateState","constructor","threadBinding","threadListItemBinding","stateBinding","sub1","sub2","ref","composerSource","__internal_bindMethods","bind","data","Error","_getMessageRuntime","messageSelector","index","undefined","JSON","stringify","speechState","thread","branches","getBranches","isLast","branchNumber","indexOf","branchCount","length","_eventSubscriptionSubjects","Map","subject","get","binding","set","payload"],"sources":["../../../src/runtime/api/thread-runtime.ts"],"sourcesContent":["import type {\n ThreadSuggestion,\n RuntimeCapabilities,\n ThreadRuntimeCore,\n SpeechState,\n VoiceSessionState,\n ThreadRuntimeEventCallback,\n ThreadRuntimeEventType,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../interfaces/thread-runtime-core\";\nimport type { ExportedMessageRepository } from \"../utils/message-repository\";\nimport type { ThreadMessageLike } from \"../utils/thread-message-like\";\nimport {\n type MessageRuntime,\n MessageRuntimeImpl,\n type MessageState,\n} from \"./message-runtime\";\nimport { NestedSubscriptionSubject } from \"../../subscribable/subscribable\";\nimport {\n ShallowMemoizeSubject,\n SKIP_UPDATE,\n} from \"../../subscribable/subscribable\";\nimport type { SubscribableWithState } from \"../../subscribable/subscribable\";\nimport {\n type ThreadComposerRuntime,\n ThreadComposerRuntimeImpl,\n} from \"./composer-runtime\";\nimport type {\n MessageRuntimePath,\n ThreadListItemRuntimePath,\n ThreadRuntimePath,\n} from \"./paths\";\nimport type { ThreadListItemState } from \"./bindings\";\nimport type { AppendMessage, ThreadMessage } from \"../../types/message\";\nimport type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { RunConfig } from \"../../types/message\";\nimport { EventSubscriptionSubject } from \"../../subscribable/subscribable\";\nimport { symbolInnerMessage } from \"../utils/external-store-message\";\nimport type { ModelContext } from \"../../model-context/types\";\nimport type {\n ChatModelRunOptions,\n ChatModelRunResult,\n} from \"../utils/chat-model-adapter\";\nimport type { ReadonlyJSONValue } from \"assistant-stream/utils\";\n\nexport type CreateStartRunConfig = {\n parentId: string | null;\n sourceId?: string | null | undefined;\n runConfig?: RunConfig | undefined;\n};\n\nexport type CreateResumeRunConfig = CreateStartRunConfig & {\n stream?: (\n options: ChatModelRunOptions,\n ) => AsyncGenerator<ChatModelRunResult, void, unknown>;\n};\n\nconst toResumeRunConfig = (message: CreateResumeRunConfig): ResumeRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n ...(message.stream ? { stream: message.stream } : {}),\n };\n};\n\nconst toStartRunConfig = (message: CreateStartRunConfig): StartRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n };\n};\n\nexport type CreateAppendMessage =\n | string\n | {\n parentId?: string | null | undefined;\n sourceId?: string | null | undefined;\n role?: AppendMessage[\"role\"] | undefined;\n content: AppendMessage[\"content\"];\n attachments?: AppendMessage[\"attachments\"] | undefined;\n metadata?: AppendMessage[\"metadata\"] | undefined;\n createdAt?: Date | undefined;\n runConfig?: AppendMessage[\"runConfig\"] | undefined;\n startRun?: boolean | undefined;\n };\n\nconst toAppendMessage = (\n messages: readonly ThreadMessage[],\n message: CreateAppendMessage,\n): AppendMessage => {\n if (typeof message === \"string\") {\n return {\n createdAt: new Date(),\n parentId: messages.at(-1)?.id ?? null,\n sourceId: null,\n runConfig: {},\n role: \"user\",\n content: [{ type: \"text\", text: message }],\n attachments: [],\n metadata: { custom: {} },\n };\n }\n\n return {\n createdAt: message.createdAt ?? new Date(),\n parentId: message.parentId ?? messages.at(-1)?.id ?? null,\n sourceId: message.sourceId ?? null,\n role: message.role ?? \"user\",\n content: message.content,\n attachments: message.attachments ?? [],\n metadata: message.metadata ?? { custom: {} },\n runConfig: message.runConfig ?? {},\n startRun: message.startRun,\n } as AppendMessage;\n};\n\nexport type ThreadRuntimeCoreBinding = SubscribableWithState<\n ThreadRuntimeCore,\n ThreadRuntimePath\n> & {\n outerSubscribe(callback: () => void): Unsubscribe;\n};\n\nexport type ThreadListItemRuntimeBinding = SubscribableWithState<\n ThreadListItemState,\n ThreadListItemRuntimePath\n>;\n\nexport type ThreadState = {\n /**\n * The thread ID.\n * @deprecated This field is deprecated and will be removed in 0.12.0. Use `useThreadListItem().id` instead.\n */\n readonly threadId: string;\n\n /**\n * The thread metadata.\n *\n * @deprecated Use `useThreadListItem()` instead. This field is deprecated and will be removed in 0.12.0.\n */\n readonly metadata: ThreadListItemState;\n\n /**\n * Whether the thread is disabled. Disabled threads cannot receive new messages.\n */\n readonly isDisabled: boolean;\n\n /**\n * Whether the thread is loading its history.\n */\n readonly isLoading: boolean;\n\n /**\n * Whether the thread is running. A thread is considered running when there is an active stream connection to the backend.\n */\n readonly isRunning: boolean;\n\n /**\n * The capabilities of the thread, such as whether the thread supports editing, branch switching, etc.\n */\n readonly capabilities: RuntimeCapabilities;\n\n /**\n * The messages in the currently selected branch of the thread.\n */\n readonly messages: readonly ThreadMessage[];\n\n /**\n * The thread state.\n *\n * @deprecated This feature is experimental\n */\n readonly state: ReadonlyJSONValue;\n\n /**\n * Follow up message suggestions to show the user.\n */\n readonly suggestions: readonly ThreadSuggestion[];\n\n /**\n * Custom extra information provided by the runtime.\n */\n readonly extras: unknown;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n readonly speech: SpeechState | undefined;\n\n readonly voice: VoiceSessionState | undefined;\n};\n\nexport const getThreadState = (\n runtime: ThreadRuntimeCore,\n threadListItemState: ThreadListItemState,\n): ThreadState => {\n const lastMessage = runtime.messages.at(-1);\n return Object.freeze({\n threadId: threadListItemState.id,\n metadata: threadListItemState,\n capabilities: runtime.capabilities,\n isDisabled: runtime.isDisabled,\n isLoading: runtime.isLoading,\n isRunning:\n runtime.isRunning ??\n (lastMessage?.role !== \"assistant\"\n ? false\n : lastMessage.status.type === \"running\"),\n messages: runtime.messages,\n state: runtime.state,\n suggestions: runtime.suggestions,\n extras: runtime.extras,\n speech: runtime.speech,\n voice: runtime.voice,\n });\n};\n\nexport type ThreadRuntime = {\n /**\n * The selector for the thread runtime.\n */\n readonly path: ThreadRuntimePath;\n\n /**\n * The thread composer runtime.\n */\n readonly composer: ThreadComposerRuntime;\n\n /**\n * Gets a snapshot of the thread state.\n */\n getState(): ThreadState;\n\n /**\n * Append a new message to the thread.\n *\n * @example ```ts\n * // append a new user message with the text \"Hello, world!\"\n * threadRuntime.append(\"Hello, world!\");\n * ```\n *\n * @example ```ts\n * // append a new assistant message with the text \"Hello, world!\"\n * threadRuntime.append({\n * role: \"assistant\",\n * content: [{ type: \"text\", text: \"Hello, world!\" }],\n * });\n * ```\n */\n append(message: CreateAppendMessage): void;\n\n deleteMessage(messageId: string): void | Promise<void>;\n\n /**\n * Start a new run with the given configuration.\n * @param config The configuration for starting the run\n */\n startRun(config: CreateStartRunConfig): void;\n\n /**\n * Resume a run with the given configuration.\n * @param config The configuration for resuming the run\n **/\n resumeRun(config: CreateResumeRunConfig): void;\n\n /**\n * Export the thread state in the external store format.\n * For AI SDK runtimes, this returns the AI SDK message format.\n * For other runtimes, this may return different formats or throw an error.\n * @returns The thread state in the external format (typed as any)\n */\n exportExternalState(): any;\n\n /**\n * Import thread state from the external store format.\n * For AI SDK runtimes, this accepts AI SDK messages.\n * For other runtimes, this may accept different formats or throw an error.\n * @param state The thread state in the external format (typed as any)\n */\n importExternalState(state: any): void;\n\n subscribe(callback: () => void): Unsubscribe;\n cancelRun(): void;\n getModelContext(): ModelContext;\n\n export(): ExportedMessageRepository;\n import(repository: ExportedMessageRepository): void;\n\n /**\n * Reset the thread with optional initial messages.\n *\n * @param initialMessages - Optional array of initial messages to populate the thread\n */\n reset(initialMessages?: readonly ThreadMessageLike[]): void;\n\n getMessageByIndex(idx: number): MessageRuntime;\n getMessageById(messageId: string): MessageRuntime;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n stopSpeaking(): void;\n\n connectVoice(): void;\n disconnectVoice(): void;\n getVoiceVolume(): number;\n subscribeVoiceVolume(callback: () => void): Unsubscribe;\n muteVoice(): void;\n unmuteVoice(): void;\n\n unstable_on<E extends ThreadRuntimeEventType>(\n event: E,\n callback: ThreadRuntimeEventCallback<E>,\n ): Unsubscribe;\n};\n\nexport class ThreadRuntimeImpl implements ThreadRuntime {\n public get path() {\n return this._threadBinding.path;\n }\n\n public get __internal_threadBinding() {\n return this._threadBinding;\n }\n\n private readonly _threadBinding: ThreadRuntimeCoreBinding & {\n getStateState(): ThreadState;\n };\n\n constructor(\n threadBinding: ThreadRuntimeCoreBinding,\n threadListItemBinding: ThreadListItemRuntimeBinding,\n ) {\n const stateBinding = new ShallowMemoizeSubject({\n path: threadBinding.path,\n getState: () =>\n getThreadState(\n threadBinding.getState(),\n threadListItemBinding.getState(),\n ),\n subscribe: (callback) => {\n const sub1 = threadBinding.subscribe(callback);\n const sub2 = threadListItemBinding.subscribe(callback);\n return () => {\n sub1();\n sub2();\n };\n },\n });\n\n this._threadBinding = {\n path: threadBinding.path,\n getState: () => threadBinding.getState(),\n getStateState: () => stateBinding.getState(),\n outerSubscribe: (callback) => threadBinding.outerSubscribe(callback),\n subscribe: (callback) => threadBinding.subscribe(callback),\n };\n\n this.composer = new ThreadComposerRuntimeImpl(\n new NestedSubscriptionSubject({\n path: {\n ...this.path,\n ref: `${this.path.ref}.composer`,\n composerSource: \"thread\",\n },\n getState: () => this._threadBinding.getState().composer,\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n );\n\n this.__internal_bindMethods();\n }\n\n protected __internal_bindMethods() {\n this.append = this.append.bind(this);\n this.deleteMessage = this.deleteMessage.bind(this);\n this.resumeRun = this.resumeRun.bind(this);\n this.importExternalState = this.importExternalState.bind(this);\n this.exportExternalState = this.exportExternalState.bind(this);\n this.startRun = this.startRun.bind(this);\n this.cancelRun = this.cancelRun.bind(this);\n this.stopSpeaking = this.stopSpeaking.bind(this);\n this.connectVoice = this.connectVoice.bind(this);\n this.disconnectVoice = this.disconnectVoice.bind(this);\n this.muteVoice = this.muteVoice.bind(this);\n this.unmuteVoice = this.unmuteVoice.bind(this);\n this.getVoiceVolume = this.getVoiceVolume.bind(this);\n this.subscribeVoiceVolume = this.subscribeVoiceVolume.bind(this);\n this.export = this.export.bind(this);\n this.import = this.import.bind(this);\n this.reset = this.reset.bind(this);\n this.getMessageByIndex = this.getMessageByIndex.bind(this);\n this.getMessageById = this.getMessageById.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.unstable_on = this.unstable_on.bind(this);\n this.getModelContext = this.getModelContext.bind(this);\n this.getState = this.getState.bind(this);\n }\n\n public readonly composer;\n\n public getState() {\n return this._threadBinding.getStateState();\n }\n\n public append(message: CreateAppendMessage) {\n this._threadBinding\n .getState()\n .append(\n toAppendMessage(this._threadBinding.getState().messages, message),\n );\n }\n\n public deleteMessage(messageId: string) {\n return this._threadBinding.getState().deleteMessage(messageId);\n }\n\n public subscribe(callback: () => void) {\n return this._threadBinding.subscribe(callback);\n }\n\n public getModelContext() {\n return this._threadBinding.getState().getModelContext();\n }\n\n public startRun(config: CreateStartRunConfig) {\n return this._threadBinding.getState().startRun(toStartRunConfig(config));\n }\n\n public resumeRun(config: CreateResumeRunConfig) {\n return this._threadBinding.getState().resumeRun(toResumeRunConfig(config));\n }\n\n public exportExternalState() {\n return this._threadBinding.getState().exportExternalState();\n }\n\n public importExternalState(state: any) {\n this._threadBinding.getState().importExternalState(state);\n }\n\n public cancelRun() {\n this._threadBinding.getState().cancelRun();\n }\n\n public stopSpeaking() {\n return this._threadBinding.getState().stopSpeaking();\n }\n\n public connectVoice() {\n this._threadBinding.getState().connectVoice();\n }\n\n public disconnectVoice() {\n this._threadBinding.getState().disconnectVoice();\n }\n\n public getVoiceVolume() {\n return this._threadBinding.getState().getVoiceVolume();\n }\n\n public subscribeVoiceVolume(callback: () => void) {\n return this._threadBinding.getState().subscribeVoiceVolume(callback);\n }\n\n public muteVoice() {\n this._threadBinding.getState().muteVoice();\n }\n\n public unmuteVoice() {\n this._threadBinding.getState().unmuteVoice();\n }\n\n public export() {\n return this._threadBinding.getState().export();\n }\n\n public import(data: ExportedMessageRepository) {\n this._threadBinding.getState().import(data);\n }\n\n public reset(initialMessages?: readonly ThreadMessageLike[]) {\n this._threadBinding.getState().reset(initialMessages);\n }\n\n public getMessageByIndex(idx: number) {\n if (idx < 0) throw new Error(\"Message index must be >= 0\");\n\n return this._getMessageRuntime(\n {\n ...this.path,\n ref: `${this.path.ref}.messages[${idx}]`,\n messageSelector: { type: \"index\", index: idx },\n },\n () => {\n const messages = this._threadBinding.getState().messages;\n const message = messages[idx];\n if (!message) return undefined;\n return {\n message,\n parentId: messages[idx - 1]?.id ?? null,\n index: idx,\n };\n },\n );\n }\n\n public getMessageById(messageId: string) {\n return this._getMessageRuntime(\n {\n ...this.path,\n ref: `${this.path.ref}.messages[messageId=${JSON.stringify(messageId)}]`,\n messageSelector: { type: \"messageId\", messageId: messageId },\n },\n () => this._threadBinding.getState().getMessageById(messageId),\n );\n }\n\n private _getMessageRuntime(\n path: MessageRuntimePath,\n callback: () =>\n | { parentId: string | null; message: ThreadMessage; index: number }\n | undefined,\n ) {\n return new MessageRuntimeImpl(\n new ShallowMemoizeSubject({\n path,\n getState: () => {\n const { message, parentId, index } = callback() ?? {};\n\n const { messages, speech: speechState } =\n this._threadBinding.getState();\n\n if (!message || parentId === undefined || index === undefined)\n return SKIP_UPDATE;\n\n const thread = this._threadBinding.getState();\n\n const branches = thread.getBranches(message.id);\n\n return {\n ...message,\n ...{ [symbolInnerMessage]: (message as any)[symbolInnerMessage] },\n\n index,\n isLast: messages.at(-1)?.id === message.id,\n parentId,\n\n branchNumber: branches.indexOf(message.id) + 1,\n branchCount: branches.length,\n\n speech:\n speechState?.messageId === message.id ? speechState : undefined,\n } satisfies MessageState;\n },\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n this._threadBinding,\n );\n }\n\n private _eventSubscriptionSubjects = new Map<\n string,\n EventSubscriptionSubject<ThreadRuntimeEventType>\n >();\n\n public unstable_on<E extends ThreadRuntimeEventType>(\n event: E,\n callback: ThreadRuntimeEventCallback<E>,\n ): Unsubscribe {\n let subject = this._eventSubscriptionSubjects.get(event);\n if (!subject) {\n subject = new EventSubscriptionSubject<ThreadRuntimeEventType>({\n event,\n binding: this._threadBinding,\n });\n this._eventSubscriptionSubjects.set(event, subject);\n }\n return subject.subscribe(callback as (payload?: unknown) => void);\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"base-assistant-runtime-core.js","names":[],"sources":["../../../src/runtime/base/base-assistant-runtime-core.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport { CompositeContextProvider } from \"../../utils/composite-context-provider\";\nimport type { AssistantRuntimeCore } from \"../interfaces/assistant-runtime-core\";\nimport type { ThreadListRuntimeCore } from \"../interfaces/thread-list-runtime-core\";\n\nexport abstract class BaseAssistantRuntimeCore implements AssistantRuntimeCore {\n protected readonly _contextProvider = new CompositeContextProvider();\n public abstract get threads(): ThreadListRuntimeCore;\n\n public registerModelContextProvider(\n provider: ModelContextProvider,\n ): Unsubscribe {\n return this._contextProvider.registerModelContextProvider(provider);\n }\n\n public getModelContextProvider(): ModelContextProvider {\n return this._contextProvider;\n }\n}\n"],"mappings":";;AAMA,IAAsB,2BAAtB,MAA+E;CAC7E,mBAAsC,IAAI,yBAAyB;CAGnE,6BACE,UACa;EACb,OAAO,KAAK,iBAAiB,6BAA6B,QAAQ;CACpE;CAEA,0BAAuD;EACrD,OAAO,KAAK;CACd;AACF"}
1
+ {"version":3,"file":"base-assistant-runtime-core.js","names":["Unsubscribe","ModelContextProvider","CompositeContextProvider","AssistantRuntimeCore","ThreadListRuntimeCore","BaseAssistantRuntimeCore","_contextProvider","threads","registerModelContextProvider","provider","getModelContextProvider"],"sources":["../../../src/runtime/base/base-assistant-runtime-core.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport { CompositeContextProvider } from \"../../utils/composite-context-provider\";\nimport type { AssistantRuntimeCore } from \"../interfaces/assistant-runtime-core\";\nimport type { ThreadListRuntimeCore } from \"../interfaces/thread-list-runtime-core\";\n\nexport abstract class BaseAssistantRuntimeCore implements AssistantRuntimeCore {\n protected readonly _contextProvider = new CompositeContextProvider();\n public abstract get threads(): ThreadListRuntimeCore;\n\n public registerModelContextProvider(\n provider: ModelContextProvider,\n ): Unsubscribe {\n return this._contextProvider.registerModelContextProvider(provider);\n }\n\n public getModelContextProvider(): ModelContextProvider {\n return this._contextProvider;\n }\n}\n"],"mappings":";;AAMA,IAAsBK,2BAAtB,MAA+E;CAC7E,mBAAsC,IAAIH,yBAAyB;CAGnE,6BACEO,UACa;EACb,OAAO,KAAKH,iBAAiBE,6BAA6BC,QAAQ;CACpE;CAEA,0BAAuD;EACrD,OAAO,KAAKH;CACd;AACF"}
@@ -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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"}
@@ -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 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
+ {"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"}
@@ -48,7 +48,8 @@ type ResumeToolCallOptions = {
48
48
  };
49
49
  type RespondToToolApprovalOptions = {
50
50
  approvalId: string;
51
- approved: boolean;
51
+ approved: boolean; /** The approval option that produced this decision, when the request carried options. */
52
+ optionId?: string;
52
53
  reason?: string;
53
54
  };
54
55
  type SubmitFeedbackOptions = {