@assistant-ui/core 0.2.9 → 0.2.11

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 (437) hide show
  1. package/dist/adapters/attachment.d.ts.map +1 -1
  2. package/dist/adapters/attachment.js +22 -12
  3. package/dist/adapters/attachment.js.map +1 -1
  4. package/dist/adapters/directive-formatter.js.map +1 -1
  5. package/dist/adapters/speech.js.map +1 -1
  6. package/dist/index.d.ts +3 -1
  7. package/dist/index.js +2 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/internal.js +1 -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/registry.js.map +1 -1
  13. package/dist/model-context/tool.d.ts +1 -1
  14. package/dist/model-context/tool.js +1 -1
  15. package/dist/model-context/tool.js.map +1 -1
  16. package/dist/model-context/types.js +17 -2
  17. package/dist/model-context/types.js.map +1 -1
  18. package/dist/react/AssistantProvider.js +1 -1
  19. package/dist/react/AssistantRuntimeProvider.d.ts +1 -1
  20. package/dist/react/AssistantRuntimeProvider.d.ts.map +1 -1
  21. package/dist/react/AssistantRuntimeProvider.js +1 -1
  22. package/dist/react/RuntimeAdapter.js +4 -2
  23. package/dist/react/RuntimeAdapter.js.map +1 -1
  24. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  25. package/dist/react/adapters/LocalStorageThreadListAdapter.js +13 -3
  26. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  27. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  28. package/dist/react/client/DataRenderers.js +6 -5
  29. package/dist/react/client/DataRenderers.js.map +1 -1
  30. package/dist/react/client/Interactables.d.ts.map +1 -1
  31. package/dist/react/client/Interactables.js +30 -29
  32. package/dist/react/client/Interactables.js.map +1 -1
  33. package/dist/react/client/Tools.d.ts.map +1 -1
  34. package/dist/react/client/Tools.js +19 -12
  35. package/dist/react/client/Tools.js.map +1 -1
  36. package/dist/react/index.d.ts +10 -5
  37. package/dist/react/index.js +7 -2
  38. package/dist/react/model-context/define-mcp-toolkit.d.ts +12 -0
  39. package/dist/react/model-context/define-mcp-toolkit.d.ts.map +1 -0
  40. package/dist/react/model-context/define-mcp-toolkit.js +14 -0
  41. package/dist/react/model-context/define-mcp-toolkit.js.map +1 -0
  42. package/dist/react/model-context/define-toolkit.d.ts +10 -12
  43. package/dist/react/model-context/define-toolkit.d.ts.map +1 -1
  44. package/dist/react/model-context/define-toolkit.js +2 -15
  45. package/dist/react/model-context/define-toolkit.js.map +1 -1
  46. package/dist/react/model-context/external-tool.d.ts +14 -0
  47. package/dist/react/model-context/external-tool.d.ts.map +1 -0
  48. package/dist/react/model-context/external-tool.js +17 -0
  49. package/dist/react/model-context/external-tool.js.map +1 -0
  50. package/dist/react/model-context/human-tool.d.ts +27 -0
  51. package/dist/react/model-context/human-tool.d.ts.map +1 -0
  52. package/dist/react/model-context/human-tool.js +30 -0
  53. package/dist/react/model-context/human-tool.js.map +1 -0
  54. package/dist/react/model-context/makeAssistantTool.d.ts +8 -0
  55. package/dist/react/model-context/makeAssistantTool.d.ts.map +1 -1
  56. package/dist/react/model-context/makeAssistantTool.js +4 -0
  57. package/dist/react/model-context/makeAssistantTool.js.map +1 -1
  58. package/dist/react/model-context/makeAssistantToolUI.d.ts +8 -0
  59. package/dist/react/model-context/makeAssistantToolUI.d.ts.map +1 -1
  60. package/dist/react/model-context/makeAssistantToolUI.js +4 -0
  61. package/dist/react/model-context/makeAssistantToolUI.js.map +1 -1
  62. package/dist/react/model-context/provider-tool.d.ts +15 -0
  63. package/dist/react/model-context/provider-tool.d.ts.map +1 -0
  64. package/dist/react/model-context/provider-tool.js +12 -0
  65. package/dist/react/model-context/provider-tool.js.map +1 -0
  66. package/dist/react/model-context/stub-tool.d.ts +12 -0
  67. package/dist/react/model-context/stub-tool.d.ts.map +1 -0
  68. package/dist/react/model-context/stub-tool.js +15 -0
  69. package/dist/react/model-context/stub-tool.js.map +1 -0
  70. package/dist/react/model-context/toolbox.d.ts +64 -17
  71. package/dist/react/model-context/toolbox.d.ts.map +1 -1
  72. package/dist/react/model-context/toolbox.js +19 -1
  73. package/dist/react/model-context/toolbox.js.map +1 -1
  74. package/dist/react/model-context/useAssistantContext.js +1 -1
  75. package/dist/react/model-context/useAssistantContext.js.map +1 -1
  76. package/dist/react/model-context/useAssistantDataUI.js +1 -1
  77. package/dist/react/model-context/useAssistantDataUI.js.map +1 -1
  78. package/dist/react/model-context/useAssistantInstructions.js +1 -1
  79. package/dist/react/model-context/useAssistantInstructions.js.map +1 -1
  80. package/dist/react/model-context/useAssistantInteractable.js +1 -1
  81. package/dist/react/model-context/useAssistantInteractable.js.map +1 -1
  82. package/dist/react/model-context/useAssistantTool.d.ts +11 -1
  83. package/dist/react/model-context/useAssistantTool.d.ts.map +1 -1
  84. package/dist/react/model-context/useAssistantTool.js +12 -6
  85. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  86. package/dist/react/model-context/useAssistantToolUI.d.ts +13 -4
  87. package/dist/react/model-context/useAssistantToolUI.d.ts.map +1 -1
  88. package/dist/react/model-context/useAssistantToolUI.js +7 -4
  89. package/dist/react/model-context/useAssistantToolUI.js.map +1 -1
  90. package/dist/react/model-context/useAuiToolOverrides.d.ts +22 -0
  91. package/dist/react/model-context/useAuiToolOverrides.d.ts.map +1 -0
  92. package/dist/react/model-context/useAuiToolOverrides.js +31 -0
  93. package/dist/react/model-context/useAuiToolOverrides.js.map +1 -0
  94. package/dist/react/model-context/useInlineRender.js +1 -1
  95. package/dist/react/model-context/useInlineRender.js.map +1 -1
  96. package/dist/react/model-context/useInteractableState.js +1 -1
  97. package/dist/react/model-context/useInteractableState.js.map +1 -1
  98. package/dist/react/model-context/useToolArgsStatus.js +1 -1
  99. package/dist/react/primitive-hooks/useActionBarCopy.js +1 -1
  100. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  101. package/dist/react/primitive-hooks/useActionBarEdit.js +1 -1
  102. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  103. package/dist/react/primitive-hooks/useActionBarFeedback.js +1 -1
  104. package/dist/react/primitive-hooks/useActionBarFeedback.js.map +1 -1
  105. package/dist/react/primitive-hooks/useActionBarReload.js +1 -1
  106. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  107. package/dist/react/primitive-hooks/useActionBarSpeak.js +1 -1
  108. package/dist/react/primitive-hooks/useActionBarSpeak.js.map +1 -1
  109. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js +1 -1
  110. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js.map +1 -1
  111. package/dist/react/primitive-hooks/useBranchPickerNext.js +1 -1
  112. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  113. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +1 -1
  114. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  115. package/dist/react/primitive-hooks/useComposerAddAttachment.js +1 -1
  116. package/dist/react/primitive-hooks/useComposerAddAttachment.js.map +1 -1
  117. package/dist/react/primitive-hooks/useComposerCancel.js +1 -1
  118. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  119. package/dist/react/primitive-hooks/useComposerDictate.js +1 -1
  120. package/dist/react/primitive-hooks/useComposerDictate.js.map +1 -1
  121. package/dist/react/primitive-hooks/useComposerSend.js +1 -1
  122. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  123. package/dist/react/primitive-hooks/useEditComposerCancel.js +1 -1
  124. package/dist/react/primitive-hooks/useEditComposerCancel.js.map +1 -1
  125. package/dist/react/primitive-hooks/useEditComposerSend.js +1 -1
  126. package/dist/react/primitive-hooks/useEditComposerSend.js.map +1 -1
  127. package/dist/react/primitive-hooks/useMessageBranching.js +1 -1
  128. package/dist/react/primitive-hooks/useMessageBranching.js.map +1 -1
  129. package/dist/react/primitive-hooks/useMessageReload.js +1 -1
  130. package/dist/react/primitive-hooks/useMessageReload.js.map +1 -1
  131. package/dist/react/primitive-hooks/useSuggestionTrigger.js +1 -1
  132. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  133. package/dist/react/primitive-hooks/useThreadListItemArchive.js +1 -1
  134. package/dist/react/primitive-hooks/useThreadListItemArchive.js.map +1 -1
  135. package/dist/react/primitive-hooks/useThreadListItemDelete.js +1 -1
  136. package/dist/react/primitive-hooks/useThreadListItemDelete.js.map +1 -1
  137. package/dist/react/primitive-hooks/useThreadListItemTrigger.js +1 -1
  138. package/dist/react/primitive-hooks/useThreadListItemTrigger.js.map +1 -1
  139. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js +1 -1
  140. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js.map +1 -1
  141. package/dist/react/primitive-hooks/useThreadListLoadMore.js +1 -1
  142. package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
  143. package/dist/react/primitive-hooks/useThreadListNew.js +1 -1
  144. package/dist/react/primitive-hooks/useThreadListNew.js.map +1 -1
  145. package/dist/react/primitive-hooks/useVoice.js +1 -1
  146. package/dist/react/primitive-hooks/useVoice.js.map +1 -1
  147. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts +1 -1
  148. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js +1 -1
  149. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js.map +1 -1
  150. package/dist/react/primitives/composer/ComposerAttachments.js +1 -1
  151. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  152. package/dist/react/primitives/composer/ComposerQueue.js +1 -1
  153. package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
  154. package/dist/react/primitives/generativeUI/GenerativeUI.js +1 -1
  155. package/dist/react/primitives/generativeUI/GenerativeUI.js.map +1 -1
  156. package/dist/react/primitives/message/MessageAttachments.js +1 -1
  157. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  158. package/dist/react/primitives/message/MessageGroupedParts.js +1 -1
  159. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  160. package/dist/react/primitives/message/MessageParts.d.ts +1 -1
  161. package/dist/react/primitives/message/MessageParts.js +1 -1
  162. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  163. package/dist/react/primitives/message/MessageQuote.js +1 -1
  164. package/dist/react/primitives/part/PartMessages.d.ts +12 -10
  165. package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
  166. package/dist/react/primitives/part/PartMessages.js +13 -11
  167. package/dist/react/primitives/part/PartMessages.js.map +1 -1
  168. package/dist/react/primitives/thread/ThreadMessages.js +1 -1
  169. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  170. package/dist/react/primitives/thread/ThreadSuggestions.js +1 -1
  171. package/dist/react/primitives/thread/ThreadSuggestions.js.map +1 -1
  172. package/dist/react/primitives/threadList/ThreadListItems.js +1 -1
  173. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  174. package/dist/react/providers/AttachmentByIndexProvider.js.map +1 -1
  175. package/dist/react/providers/ChainOfThoughtByIndicesProvider.js.map +1 -1
  176. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js.map +1 -1
  177. package/dist/react/providers/MessageByIndexProvider.js.map +1 -1
  178. package/dist/react/providers/PartByIndexProvider.js.map +1 -1
  179. package/dist/react/providers/QueueItemByIndexProvider.js.map +1 -1
  180. package/dist/react/providers/ReadonlyThreadProvider.js +1 -1
  181. package/dist/react/providers/ReadonlyThreadProvider.js.map +1 -1
  182. package/dist/react/providers/SuggestionByIndexProvider.js.map +1 -1
  183. package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
  184. package/dist/react/providers/TextMessagePartProvider.js +4 -3
  185. package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
  186. package/dist/react/providers/ThreadListItemByIndexProvider.js.map +1 -1
  187. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +7 -0
  188. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  189. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +1 -1
  190. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  191. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +8 -0
  192. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  193. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +29 -1
  194. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  195. package/dist/react/runtimes/RuntimeAdapterProvider.js +1 -1
  196. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +1 -1
  197. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  198. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  199. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +10 -3
  200. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  201. package/dist/react/runtimes/createMessageConverter.d.ts +2 -2
  202. package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
  203. package/dist/react/runtimes/createMessageConverter.js.map +1 -1
  204. package/dist/react/runtimes/external-message-converter.d.ts +4 -3
  205. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  206. package/dist/react/runtimes/external-message-converter.js +1 -1
  207. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  208. package/dist/react/runtimes/useExternalStoreRuntime.js +1 -1
  209. package/dist/react/runtimes/useExternalStoreSharedOptions.js +1 -1
  210. package/dist/react/runtimes/useLocalRuntime.d.ts +2 -1
  211. package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
  212. package/dist/react/runtimes/useLocalRuntime.js +4 -3
  213. package/dist/react/runtimes/useLocalRuntime.js.map +1 -1
  214. package/dist/react/runtimes/useRemoteThreadListRuntime.js +1 -1
  215. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  216. package/dist/react/utils/groupParts.d.ts +1 -1
  217. package/dist/react/utils/groupParts.js.map +1 -1
  218. package/dist/runtime/api/attachment-runtime.js.map +1 -1
  219. package/dist/runtime/api/composer-runtime.d.ts +8 -2
  220. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  221. package/dist/runtime/api/composer-runtime.js +14 -0
  222. package/dist/runtime/api/composer-runtime.js.map +1 -1
  223. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  224. package/dist/runtime/api/message-runtime.js +1 -1
  225. package/dist/runtime/api/message-runtime.js.map +1 -1
  226. package/dist/runtime/api/thread-list-item-runtime.d.ts +2 -0
  227. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  228. package/dist/runtime/api/thread-list-item-runtime.js +6 -0
  229. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  230. package/dist/runtime/api/thread-runtime.d.ts +7 -0
  231. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  232. package/dist/runtime/api/thread-runtime.js.map +1 -1
  233. package/dist/runtime/base/base-composer-runtime-core.d.ts +4 -0
  234. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  235. package/dist/runtime/base/base-composer-runtime-core.js +7 -1
  236. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  237. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  238. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +4 -0
  239. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  240. package/dist/runtime/base/default-thread-composer-runtime-core.js +17 -1
  241. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  242. package/dist/runtime/interfaces/composer-runtime-core.d.ts +6 -1
  243. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
  244. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +1 -0
  245. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  246. package/dist/runtime/interfaces/thread-runtime-core.d.ts +4 -0
  247. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  248. package/dist/runtime/queue/external-thread-queue-adapter.d.ts +20 -0
  249. package/dist/runtime/queue/external-thread-queue-adapter.d.ts.map +1 -0
  250. package/dist/runtime/queue/external-thread-queue-adapter.js +0 -0
  251. package/dist/runtime/queue/message-queue.d.ts +20 -0
  252. package/dist/runtime/queue/message-queue.d.ts.map +1 -0
  253. package/dist/runtime/queue/message-queue.js +97 -0
  254. package/dist/runtime/queue/message-queue.js.map +1 -0
  255. package/dist/runtime/utils/message-repository.js.map +1 -1
  256. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  257. package/dist/runtimes/external-store/external-store-adapter.d.ts +5 -1
  258. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  259. package/dist/runtimes/external-store/external-store-runtime-core.js.map +1 -1
  260. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +1 -0
  261. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  262. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +5 -0
  263. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  264. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +4 -0
  265. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  266. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +20 -2
  267. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  268. package/dist/runtimes/local/local-runtime-core.js.map +1 -1
  269. package/dist/runtimes/local/local-runtime-options.d.ts +5 -0
  270. package/dist/runtimes/local/local-runtime-options.d.ts.map +1 -1
  271. package/dist/runtimes/local/local-thread-runtime-core.d.ts +7 -0
  272. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  273. package/dist/runtimes/local/local-thread-runtime-core.js +45 -0
  274. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  275. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +3 -0
  276. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  277. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +3 -0
  278. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  279. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts +1 -0
  280. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts.map +1 -1
  281. package/dist/runtimes/remote-thread-list/adapter/in-memory.js +3 -0
  282. package/dist/runtimes/remote-thread-list/adapter/in-memory.js.map +1 -1
  283. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  284. package/dist/runtimes/remote-thread-list/empty-thread-core.js +3 -0
  285. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  286. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  287. package/dist/runtimes/remote-thread-list/types.d.ts +1 -0
  288. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  289. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  290. package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
  291. package/dist/store/clients/chain-of-thought-client.js +6 -5
  292. package/dist/store/clients/chain-of-thought-client.js.map +1 -1
  293. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  294. package/dist/store/clients/model-context-client.js +6 -5
  295. package/dist/store/clients/model-context-client.js.map +1 -1
  296. package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
  297. package/dist/store/clients/no-op-composer-client.js +4 -3
  298. package/dist/store/clients/no-op-composer-client.js.map +1 -1
  299. package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
  300. package/dist/store/clients/runtime-adapter.js +7 -6
  301. package/dist/store/clients/runtime-adapter.js.map +1 -1
  302. package/dist/store/clients/suggestions.d.ts.map +1 -1
  303. package/dist/store/clients/suggestions.js +7 -6
  304. package/dist/store/clients/suggestions.js.map +1 -1
  305. package/dist/store/clients/thread-message-client.d.ts.map +1 -1
  306. package/dist/store/clients/thread-message-client.js +13 -12
  307. package/dist/store/clients/thread-message-client.js.map +1 -1
  308. package/dist/store/index.d.ts +1 -1
  309. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  310. package/dist/store/runtime-clients/attachment-runtime-client.js +3 -3
  311. package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
  312. package/dist/store/runtime-clients/composer-runtime-client.d.ts +12 -5
  313. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  314. package/dist/store/runtime-clients/composer-runtime-client.js +32 -16
  315. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  316. package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
  317. package/dist/store/runtime-clients/message-part-runtime-client.js +3 -3
  318. package/dist/store/runtime-clients/message-part-runtime-client.js.map +1 -1
  319. package/dist/store/runtime-clients/message-runtime-client.d.ts +6 -3
  320. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  321. package/dist/store/runtime-clients/message-runtime-client.js +17 -16
  322. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  323. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  324. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +9 -7
  325. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  326. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  327. package/dist/store/runtime-clients/thread-list-runtime-client.js +11 -10
  328. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  329. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  330. package/dist/store/runtime-clients/thread-runtime-client.js +15 -14
  331. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  332. package/dist/store/runtime-clients/useSubscribable.d.ts +7 -0
  333. package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -0
  334. package/dist/store/runtime-clients/useSubscribable.js +16 -0
  335. package/dist/store/runtime-clients/useSubscribable.js.map +1 -0
  336. package/dist/store/scope-registration.d.ts +1 -1
  337. package/dist/store/scopes/composer.d.ts +1 -1
  338. package/dist/store/scopes/queue-item.d.ts +2 -1
  339. package/dist/store/scopes/queue-item.d.ts.map +1 -1
  340. package/dist/store/scopes/queue-item.js +6 -0
  341. package/dist/store/scopes/queue-item.js.map +1 -0
  342. package/dist/store/scopes/thread-list-item.d.ts +1 -0
  343. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  344. package/dist/store/scopes/thread.d.ts +1 -1
  345. package/dist/store/scopes/threads.d.ts +1 -1
  346. package/dist/types/message.d.ts +2 -1
  347. package/dist/types/message.d.ts.map +1 -1
  348. package/dist/types/message.js.map +1 -1
  349. package/dist/utils/composite-context-provider.d.ts +1 -1
  350. package/dist/utils/composite-context-provider.js +3 -1
  351. package/dist/utils/composite-context-provider.js.map +1 -1
  352. package/dist/utils/json/is-json.js.map +1 -1
  353. package/dist/utils/text.js.map +1 -1
  354. package/package.json +15 -11
  355. package/src/adapters/attachment.ts +24 -4
  356. package/src/index.ts +8 -0
  357. package/src/model-context/tool.ts +1 -1
  358. package/src/model-context/types.ts +21 -3
  359. package/src/react/RuntimeAdapter.ts +6 -4
  360. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +15 -2
  361. package/src/react/client/DataRenderers.ts +48 -42
  362. package/src/react/client/Interactables.ts +263 -267
  363. package/src/react/client/Tools.ts +123 -115
  364. package/src/react/index.ts +16 -3
  365. package/src/react/model-context/define-mcp-toolkit.ts +16 -0
  366. package/src/react/model-context/define-toolkit.test.ts +101 -6
  367. package/src/react/model-context/define-toolkit.ts +35 -18
  368. package/src/react/model-context/external-tool.ts +16 -0
  369. package/src/react/model-context/human-tool.ts +32 -0
  370. package/src/react/model-context/makeAssistantTool.ts +8 -0
  371. package/src/react/model-context/makeAssistantToolUI.ts +8 -0
  372. package/src/react/model-context/provider-tool.ts +30 -0
  373. package/src/react/model-context/stub-tool.ts +14 -0
  374. package/src/react/model-context/toolbox.test.ts +182 -0
  375. package/src/react/model-context/toolbox.ts +191 -23
  376. package/src/react/model-context/useAssistantTool.ts +28 -8
  377. package/src/react/model-context/useAssistantToolUI.ts +13 -4
  378. package/src/react/model-context/useAuiToolOverrides.ts +38 -0
  379. package/src/react/primitives/message/MessageGroupedParts.tsx +1 -1
  380. package/src/react/primitives/part/PartMessages.tsx +12 -10
  381. package/src/react/providers/TextMessagePartProvider.tsx +31 -32
  382. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +43 -0
  383. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +9 -0
  384. package/src/react/runtimes/createMessageConverter.ts +2 -1
  385. package/src/react/runtimes/external-message-converter.ts +5 -3
  386. package/src/react/runtimes/useLocalRuntime.ts +2 -0
  387. package/src/runtime/api/composer-runtime.ts +26 -0
  388. package/src/runtime/api/thread-list-item-runtime.ts +15 -0
  389. package/src/runtime/base/base-composer-runtime-core.ts +11 -0
  390. package/src/runtime/base/default-thread-composer-runtime-core.ts +22 -0
  391. package/src/runtime/interfaces/composer-runtime-core.ts +7 -0
  392. package/src/runtime/interfaces/thread-list-runtime-core.ts +4 -0
  393. package/src/runtime/interfaces/thread-runtime-core.ts +5 -0
  394. package/src/runtime/queue/external-thread-queue-adapter.ts +14 -0
  395. package/src/runtime/queue/message-queue.ts +128 -0
  396. package/src/runtimes/external-store/external-store-adapter.ts +10 -0
  397. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +13 -0
  398. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +31 -2
  399. package/src/runtimes/local/local-runtime-options.ts +6 -0
  400. package/src/runtimes/local/local-thread-runtime-core.ts +70 -0
  401. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +4 -0
  402. package/src/runtimes/remote-thread-list/adapter/in-memory.ts +4 -0
  403. package/src/runtimes/remote-thread-list/empty-thread-core.ts +4 -0
  404. package/src/runtimes/remote-thread-list/types.ts +4 -0
  405. package/src/store/clients/chain-of-thought-client.ts +24 -25
  406. package/src/store/clients/model-context-client.test.ts +87 -2
  407. package/src/store/clients/model-context-client.ts +22 -19
  408. package/src/store/clients/no-op-composer-client.ts +69 -66
  409. package/src/store/clients/runtime-adapter.ts +9 -6
  410. package/src/store/clients/suggestions.ts +41 -40
  411. package/src/store/clients/thread-message-client.ts +127 -132
  412. package/src/store/runtime-clients/attachment-runtime-client.ts +7 -3
  413. package/src/store/runtime-clients/composer-runtime-client.ts +142 -113
  414. package/src/store/runtime-clients/message-part-runtime-client.ts +16 -14
  415. package/src/store/runtime-clients/message-runtime-client.ts +124 -122
  416. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +44 -44
  417. package/src/store/runtime-clients/thread-list-runtime-client.ts +83 -80
  418. package/src/store/runtime-clients/thread-runtime-client.ts +113 -119
  419. package/src/store/runtime-clients/{tap-subscribable.ts → useSubscribable.ts} +4 -4
  420. package/src/store/scopes/queue-item.ts +2 -0
  421. package/src/store/scopes/thread-list-item.ts +1 -0
  422. package/src/tests/RemoteThreadListThreadListRuntimeCore-custom-metadata.test.ts +69 -1
  423. package/src/tests/attachment-adapters.test.ts +86 -0
  424. package/src/tests/external-store-thread-runtime-core.test.ts +125 -0
  425. package/src/tests/message-queue.test.ts +168 -0
  426. package/src/tests/thread-list-runtime-getLoadThreadsPromise.test.ts +1 -0
  427. package/src/types/message.ts +2 -0
  428. package/src/utils/composite-context-provider.ts +3 -1
  429. package/dist/react/model-context/hitl.d.ts +0 -19
  430. package/dist/react/model-context/hitl.d.ts.map +0 -1
  431. package/dist/react/model-context/hitl.js +0 -22
  432. package/dist/react/model-context/hitl.js.map +0 -1
  433. package/dist/store/runtime-clients/tap-subscribable.d.ts +0 -7
  434. package/dist/store/runtime-clients/tap-subscribable.d.ts.map +0 -1
  435. package/dist/store/runtime-clients/tap-subscribable.js +0 -16
  436. package/dist/store/runtime-clients/tap-subscribable.js.map +0 -1
  437. package/src/react/model-context/hitl.ts +0 -22
@@ -1 +1 @@
1
- {"version":3,"file":"message-repository.js","names":[],"sources":["../../../src/runtime/utils/message-repository.ts"],"sourcesContent":["import type { ThreadMessage } from \"../../types/message\";\nimport type { RunConfig } from \"../../types/message\";\nimport { generateId } from \"../../utils/id\";\nimport type { ThreadMessageLike } from \"./thread-message-like\";\nimport { getAutoStatus } from \"./auto-status\";\nimport { fromThreadMessageLike } from \"./thread-message-like\";\n\nexport type ExportedMessageRepositoryItem = {\n message: ThreadMessage;\n parentId: string | null;\n runConfig?: RunConfig;\n};\n\nexport type ExportedMessageRepository = {\n headId?: string | null;\n messages: Array<{\n message: ThreadMessage;\n parentId: string | null;\n runConfig?: RunConfig;\n }>;\n};\n\nexport const ExportedMessageRepository = {\n fromArray: (\n messages: readonly ThreadMessageLike[],\n ): ExportedMessageRepository => {\n const conv = messages.map((m) =>\n fromThreadMessageLike(\n m,\n generateId(),\n getAutoStatus(false, false, false, false, undefined),\n ),\n );\n\n return {\n messages: conv.map((m, idx) => ({\n parentId: idx > 0 ? conv[idx - 1]!.id : null,\n message: m,\n })),\n };\n },\n\n fromBranchableArray: (\n items: readonly {\n message: ThreadMessageLike;\n parentId: string | null;\n }[],\n options?: { headId?: string | null },\n ): ExportedMessageRepository => {\n const fallbackStatus = getAutoStatus(false, false, false, false, undefined);\n return {\n ...(options?.headId !== undefined\n ? { headId: options.headId }\n : undefined),\n messages: items.map(({ message, parentId }) => {\n if (!message.id) {\n throw new Error(\n \"ExportedMessageRepository.fromBranchableArray: Each message must have an 'id' field set.\",\n );\n }\n return {\n parentId,\n message: fromThreadMessageLike(message, message.id, fallbackStatus),\n };\n }),\n };\n },\n};\n\ntype RepositoryParent = {\n children: string[];\n next: RepositoryMessage | null;\n};\n\ntype RepositoryMessage = RepositoryParent & {\n prev: RepositoryMessage | null;\n current: ThreadMessage;\n level: number;\n};\n\nconst findHead = (\n message: RepositoryMessage | RepositoryParent,\n): RepositoryMessage | null => {\n if (message.next) return findHead(message.next);\n if (\"current\" in message) return message;\n return null;\n};\n\nclass CachedValue<T> {\n private _value: T | null = null;\n\n constructor(private func: () => T) {}\n\n get value() {\n if (this._value === null) {\n this._value = this.func();\n }\n return this._value;\n }\n\n dirty() {\n this._value = null;\n }\n}\n\nexport class MessageRepository {\n private messages = new Map<string, RepositoryMessage>();\n private head: RepositoryMessage | null = null;\n private root: RepositoryParent = {\n children: [],\n next: null,\n };\n\n private updateLevels(message: RepositoryMessage, newLevel: number) {\n message.level = newLevel;\n for (const childId of message.children) {\n const childMessage = this.messages.get(childId);\n if (childMessage) {\n this.updateLevels(childMessage, newLevel + 1);\n }\n }\n }\n\n private performOp(\n newParent: RepositoryMessage | null,\n child: RepositoryMessage,\n operation: \"cut\" | \"link\" | \"relink\",\n ) {\n const parentOrRoot = child.prev ?? this.root;\n const newParentOrRoot = newParent ?? this.root;\n\n if (operation === \"relink\" && parentOrRoot === newParentOrRoot) return;\n\n if (operation !== \"link\") {\n parentOrRoot.children = parentOrRoot.children.filter(\n (m) => m !== child.current.id,\n );\n\n if (parentOrRoot.next === child) {\n const fallbackId = parentOrRoot.children.at(-1);\n const fallback = fallbackId ? this.messages.get(fallbackId) : null;\n if (fallback === undefined) {\n throw new Error(\n \"MessageRepository(performOp/cut): Fallback sibling message not found. This is likely an internal bug in assistant-ui.\",\n );\n }\n parentOrRoot.next = fallback;\n }\n }\n\n if (operation !== \"cut\") {\n for (\n let current: RepositoryMessage | null = newParent;\n current;\n current = current.prev\n ) {\n if (current.current.id === child.current.id) {\n throw new Error(\n \"MessageRepository(performOp/link): A message with the same id already exists in the parent tree. This error occurs if the same message id is found multiple times. This is likely an internal bug in assistant-ui.\",\n );\n }\n }\n\n newParentOrRoot.children = [\n ...newParentOrRoot.children,\n child.current.id,\n ];\n\n if (findHead(child) === this.head || newParentOrRoot.next === null) {\n newParentOrRoot.next = child;\n }\n\n child.prev = newParent;\n\n const newLevel = newParent ? newParent.level + 1 : 0;\n this.updateLevels(child, newLevel);\n }\n }\n\n private _messages = new CachedValue<readonly ThreadMessage[]>(() => {\n const messages = new Array<ThreadMessage>((this.head?.level ?? -1) + 1);\n for (let current = this.head; current; current = current.prev) {\n messages[current.level] = current.current;\n }\n return messages;\n });\n\n get headId() {\n return this.head?.current.id ?? null;\n }\n\n getMessages(headId?: string) {\n if (headId === undefined || headId === this.head?.current.id) {\n return this._messages.value;\n }\n\n const headMessage = this.messages.get(headId);\n if (!headMessage) {\n throw new Error(\n \"MessageRepository(getMessages): Head message not found. This is likely an internal bug in assistant-ui.\",\n );\n }\n\n const messages = new Array<ThreadMessage>(headMessage.level + 1);\n for (\n let current: RepositoryMessage | null = headMessage;\n current;\n current = current.prev\n ) {\n messages[current.level] = current.current;\n }\n return messages;\n }\n\n addOrUpdateMessage(parentId: string | null, message: ThreadMessage) {\n const existingItem = this.messages.get(message.id);\n const prev = parentId ? this.messages.get(parentId) : null;\n if (prev === undefined)\n throw new Error(\n \"MessageRepository(addOrUpdateMessage): Parent message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n if (existingItem) {\n existingItem.current = message;\n this.performOp(prev, existingItem, \"relink\");\n this._messages.dirty();\n return;\n }\n\n const newItem: RepositoryMessage = {\n prev,\n current: message,\n next: null,\n children: [],\n level: prev ? prev.level + 1 : 0,\n };\n\n this.messages.set(message.id, newItem);\n this.performOp(prev, newItem, \"link\");\n\n if (this.head === prev) {\n this.head = newItem;\n }\n\n this._messages.dirty();\n }\n\n getMessage(messageId: string) {\n const message = this.messages.get(messageId);\n if (!message)\n throw new Error(\n \"MessageRepository(updateMessage): Message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n return {\n parentId: message.prev?.current.id ?? null,\n message: message.current,\n index: message.level,\n };\n }\n\n deleteMessage(messageId: string, replacementId?: string | null | undefined) {\n const message = this.messages.get(messageId);\n\n if (!message)\n throw new Error(\n \"MessageRepository(deleteMessage): Message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n const replacement =\n replacementId === undefined\n ? message.prev\n : replacementId === null\n ? null\n : this.messages.get(replacementId);\n if (replacement === undefined)\n throw new Error(\n \"MessageRepository(deleteMessage): Replacement not found. This is likely an internal bug in assistant-ui.\",\n );\n\n for (const child of message.children) {\n const childMessage = this.messages.get(child);\n if (!childMessage)\n throw new Error(\n \"MessageRepository(deleteMessage): Child message not found. This is likely an internal bug in assistant-ui.\",\n );\n this.performOp(replacement, childMessage, \"relink\");\n }\n\n this.performOp(null, message, \"cut\");\n this.messages.delete(messageId);\n\n if (this.head === message) {\n this.head = findHead(replacement ?? this.root);\n }\n\n this._messages.dirty();\n }\n\n getBranches(messageId: string) {\n const message = this.messages.get(messageId);\n if (!message)\n throw new Error(\n \"MessageRepository(getBranches): Message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n const { children } = message.prev ?? this.root;\n return children;\n }\n\n /**\n * Evicts optimistic messages (`metadata.isOptimistic`) the head just moved\n * away from. Since eviction runs on every head move, the only optimistic\n * messages in the repository live on the branch the head previously pointed\n * at — so we walk just that branch rather than the whole repository. Keeps a\n * client→server id swap from leaving a phantom sibling, and drops off-branch\n * placeholders.\n */\n private evictOffBranchOptimisticMessages(\n previousHead: RepositoryMessage | null,\n currentHead: RepositoryMessage | null,\n ) {\n if (!previousHead) return;\n\n const onHeadBranch = new Set<string>();\n for (let current = currentHead; current; current = current.prev) {\n onHeadBranch.add(current.current.id);\n }\n\n const stale: string[] = [];\n for (\n let current: RepositoryMessage | null = previousHead;\n current;\n current = current.prev\n ) {\n // Stop at the first node shared with the current head branch: every\n // ancestor above it is shared too, so nothing further can be off-branch.\n if (onHeadBranch.has(current.current.id)) break;\n if (current.current.metadata?.isOptimistic) {\n stale.push(current.current.id);\n }\n }\n\n for (const id of stale) {\n // A prior deletion may have already removed this node.\n if (this.messages.has(id)) this.deleteMessage(id);\n }\n }\n\n switchToBranch(messageId: string) {\n const message = this.messages.get(messageId);\n if (!message)\n throw new Error(\n \"MessageRepository(switchToBranch): Branch not found. This is likely an internal bug in assistant-ui.\",\n );\n\n const previousHead = this.head;\n const prevOrRoot = message.prev ?? this.root;\n prevOrRoot.next = message;\n\n this.head = findHead(message);\n\n this.evictOffBranchOptimisticMessages(previousHead, this.head);\n\n this._messages.dirty();\n }\n\n resetHead(messageId: string | null) {\n if (messageId === null) {\n this.clear();\n return;\n }\n\n const message = this.messages.get(messageId);\n if (!message)\n throw new Error(\n \"MessageRepository(resetHead): Branch not found. This is likely an internal bug in assistant-ui.\",\n );\n\n const previousHead = this.head;\n\n if (message.children.length > 0) {\n const deleteDescendants = (msg: RepositoryMessage) => {\n for (const childId of msg.children) {\n const childMessage = this.messages.get(childId);\n if (childMessage) {\n deleteDescendants(childMessage);\n this.messages.delete(childId);\n }\n }\n };\n deleteDescendants(message);\n\n message.children = [];\n message.next = null;\n }\n\n this.head = message;\n for (\n let current: RepositoryMessage | null = message;\n current;\n current = current.prev\n ) {\n if (current.prev) {\n current.prev.next = current;\n } else {\n this.root.next = current;\n }\n }\n\n this.evictOffBranchOptimisticMessages(previousHead, this.head);\n\n this._messages.dirty();\n }\n\n clear(): void {\n this.messages.clear();\n this.head = null;\n this.root = {\n children: [],\n next: null,\n };\n this._messages.dirty();\n }\n\n export(): ExportedMessageRepository {\n const exportItems: ExportedMessageRepository[\"messages\"] = [];\n\n // Optimistic messages are ephemeral and never persisted. They're always\n // leaf nodes, so skipping them can't orphan a persisted child.\n for (const [, message] of this.messages) {\n if (message.current.metadata?.isOptimistic) continue;\n exportItems.push({\n message: message.current,\n parentId: message.prev?.current.id ?? null,\n });\n }\n\n // The head may itself be optimistic; walk up to the nearest persisted ancestor.\n let head = this.head;\n while (head?.current.metadata?.isOptimistic) {\n head = head.prev;\n }\n\n return {\n headId: head?.current.id ?? null,\n messages: exportItems,\n };\n }\n\n import({ headId, messages }: ExportedMessageRepository) {\n for (const { message, parentId } of messages) {\n this.addOrUpdateMessage(parentId, message);\n }\n\n this.resetHead(headId ?? messages.at(-1)?.message.id ?? null);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"message-repository.js","names":[],"sources":["../../../src/runtime/utils/message-repository.ts"],"sourcesContent":["import type { ThreadMessage } from \"../../types/message\";\nimport type { RunConfig } from \"../../types/message\";\nimport { generateId } from \"../../utils/id\";\nimport type { ThreadMessageLike } from \"./thread-message-like\";\nimport { getAutoStatus } from \"./auto-status\";\nimport { fromThreadMessageLike } from \"./thread-message-like\";\n\nexport type ExportedMessageRepositoryItem = {\n message: ThreadMessage;\n parentId: string | null;\n runConfig?: RunConfig;\n};\n\nexport type ExportedMessageRepository = {\n headId?: string | null;\n messages: Array<{\n message: ThreadMessage;\n parentId: string | null;\n runConfig?: RunConfig;\n }>;\n};\n\nexport const ExportedMessageRepository = {\n fromArray: (\n messages: readonly ThreadMessageLike[],\n ): ExportedMessageRepository => {\n const conv = messages.map((m) =>\n fromThreadMessageLike(\n m,\n generateId(),\n getAutoStatus(false, false, false, false, undefined),\n ),\n );\n\n return {\n messages: conv.map((m, idx) => ({\n parentId: idx > 0 ? conv[idx - 1]!.id : null,\n message: m,\n })),\n };\n },\n\n fromBranchableArray: (\n items: readonly {\n message: ThreadMessageLike;\n parentId: string | null;\n }[],\n options?: { headId?: string | null },\n ): ExportedMessageRepository => {\n const fallbackStatus = getAutoStatus(false, false, false, false, undefined);\n return {\n ...(options?.headId !== undefined\n ? { headId: options.headId }\n : undefined),\n messages: items.map(({ message, parentId }) => {\n if (!message.id) {\n throw new Error(\n \"ExportedMessageRepository.fromBranchableArray: Each message must have an 'id' field set.\",\n );\n }\n return {\n parentId,\n message: fromThreadMessageLike(message, message.id, fallbackStatus),\n };\n }),\n };\n },\n};\n\ntype RepositoryParent = {\n children: string[];\n next: RepositoryMessage | null;\n};\n\ntype RepositoryMessage = RepositoryParent & {\n prev: RepositoryMessage | null;\n current: ThreadMessage;\n level: number;\n};\n\nconst findHead = (\n message: RepositoryMessage | RepositoryParent,\n): RepositoryMessage | null => {\n if (message.next) return findHead(message.next);\n if (\"current\" in message) return message;\n return null;\n};\n\nclass CachedValue<T> {\n private _value: T | null = null;\n\n constructor(private func: () => T) {}\n\n get value() {\n if (this._value === null) {\n this._value = this.func();\n }\n return this._value;\n }\n\n dirty() {\n this._value = null;\n }\n}\n\nexport class MessageRepository {\n private messages = new Map<string, RepositoryMessage>();\n private head: RepositoryMessage | null = null;\n private root: RepositoryParent = {\n children: [],\n next: null,\n };\n\n private updateLevels(message: RepositoryMessage, newLevel: number) {\n message.level = newLevel;\n for (const childId of message.children) {\n const childMessage = this.messages.get(childId);\n if (childMessage) {\n this.updateLevels(childMessage, newLevel + 1);\n }\n }\n }\n\n private performOp(\n newParent: RepositoryMessage | null,\n child: RepositoryMessage,\n operation: \"cut\" | \"link\" | \"relink\",\n ) {\n const parentOrRoot = child.prev ?? this.root;\n const newParentOrRoot = newParent ?? this.root;\n\n if (operation === \"relink\" && parentOrRoot === newParentOrRoot) return;\n\n if (operation !== \"link\") {\n parentOrRoot.children = parentOrRoot.children.filter(\n (m) => m !== child.current.id,\n );\n\n if (parentOrRoot.next === child) {\n const fallbackId = parentOrRoot.children.at(-1);\n const fallback = fallbackId ? this.messages.get(fallbackId) : null;\n if (fallback === undefined) {\n throw new Error(\n \"MessageRepository(performOp/cut): Fallback sibling message not found. This is likely an internal bug in assistant-ui.\",\n );\n }\n parentOrRoot.next = fallback;\n }\n }\n\n if (operation !== \"cut\") {\n for (\n let current: RepositoryMessage | null = newParent;\n current;\n current = current.prev\n ) {\n if (current.current.id === child.current.id) {\n throw new Error(\n \"MessageRepository(performOp/link): A message with the same id already exists in the parent tree. This error occurs if the same message id is found multiple times. This is likely an internal bug in assistant-ui.\",\n );\n }\n }\n\n newParentOrRoot.children = [\n ...newParentOrRoot.children,\n child.current.id,\n ];\n\n if (findHead(child) === this.head || newParentOrRoot.next === null) {\n newParentOrRoot.next = child;\n }\n\n child.prev = newParent;\n\n const newLevel = newParent ? newParent.level + 1 : 0;\n this.updateLevels(child, newLevel);\n }\n }\n\n private _messages = new CachedValue<readonly ThreadMessage[]>(() => {\n const messages = new Array<ThreadMessage>((this.head?.level ?? -1) + 1);\n for (let current = this.head; current; current = current.prev) {\n messages[current.level] = current.current;\n }\n return messages;\n });\n\n get headId() {\n return this.head?.current.id ?? null;\n }\n\n getMessages(headId?: string) {\n if (headId === undefined || headId === this.head?.current.id) {\n return this._messages.value;\n }\n\n const headMessage = this.messages.get(headId);\n if (!headMessage) {\n throw new Error(\n \"MessageRepository(getMessages): Head message not found. This is likely an internal bug in assistant-ui.\",\n );\n }\n\n const messages = new Array<ThreadMessage>(headMessage.level + 1);\n for (\n let current: RepositoryMessage | null = headMessage;\n current;\n current = current.prev\n ) {\n messages[current.level] = current.current;\n }\n return messages;\n }\n\n addOrUpdateMessage(parentId: string | null, message: ThreadMessage) {\n const existingItem = this.messages.get(message.id);\n const prev = parentId ? this.messages.get(parentId) : null;\n if (prev === undefined)\n throw new Error(\n \"MessageRepository(addOrUpdateMessage): Parent message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n if (existingItem) {\n existingItem.current = message;\n this.performOp(prev, existingItem, \"relink\");\n this._messages.dirty();\n return;\n }\n\n const newItem: RepositoryMessage = {\n prev,\n current: message,\n next: null,\n children: [],\n level: prev ? prev.level + 1 : 0,\n };\n\n this.messages.set(message.id, newItem);\n this.performOp(prev, newItem, \"link\");\n\n if (this.head === prev) {\n this.head = newItem;\n }\n\n this._messages.dirty();\n }\n\n getMessage(messageId: string) {\n const message = this.messages.get(messageId);\n if (!message)\n throw new Error(\n \"MessageRepository(updateMessage): Message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n return {\n parentId: message.prev?.current.id ?? null,\n message: message.current,\n index: message.level,\n };\n }\n\n deleteMessage(messageId: string, replacementId?: string | null | undefined) {\n const message = this.messages.get(messageId);\n\n if (!message)\n throw new Error(\n \"MessageRepository(deleteMessage): Message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n const replacement =\n replacementId === undefined\n ? message.prev\n : replacementId === null\n ? null\n : this.messages.get(replacementId);\n if (replacement === undefined)\n throw new Error(\n \"MessageRepository(deleteMessage): Replacement not found. This is likely an internal bug in assistant-ui.\",\n );\n\n for (const child of message.children) {\n const childMessage = this.messages.get(child);\n if (!childMessage)\n throw new Error(\n \"MessageRepository(deleteMessage): Child message not found. This is likely an internal bug in assistant-ui.\",\n );\n this.performOp(replacement, childMessage, \"relink\");\n }\n\n this.performOp(null, message, \"cut\");\n this.messages.delete(messageId);\n\n if (this.head === message) {\n this.head = findHead(replacement ?? this.root);\n }\n\n this._messages.dirty();\n }\n\n getBranches(messageId: string) {\n const message = this.messages.get(messageId);\n if (!message)\n throw new Error(\n \"MessageRepository(getBranches): Message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n const { children } = message.prev ?? this.root;\n return children;\n }\n\n /**\n * Evicts optimistic messages (`metadata.isOptimistic`) the head just moved\n * away from. Since eviction runs on every head move, the only optimistic\n * messages in the repository live on the branch the head previously pointed\n * at — so we walk just that branch rather than the whole repository. Keeps a\n * client→server id swap from leaving a phantom sibling, and drops off-branch\n * placeholders.\n */\n private evictOffBranchOptimisticMessages(\n previousHead: RepositoryMessage | null,\n currentHead: RepositoryMessage | null,\n ) {\n if (!previousHead) return;\n\n const onHeadBranch = new Set<string>();\n for (let current = currentHead; current; current = current.prev) {\n onHeadBranch.add(current.current.id);\n }\n\n const stale: string[] = [];\n for (\n let current: RepositoryMessage | null = previousHead;\n current;\n current = current.prev\n ) {\n // Stop at the first node shared with the current head branch: every\n // ancestor above it is shared too, so nothing further can be off-branch.\n if (onHeadBranch.has(current.current.id)) break;\n if (current.current.metadata?.isOptimistic) {\n stale.push(current.current.id);\n }\n }\n\n for (const id of stale) {\n // A prior deletion may have already removed this node.\n if (this.messages.has(id)) this.deleteMessage(id);\n }\n }\n\n switchToBranch(messageId: string) {\n const message = this.messages.get(messageId);\n if (!message)\n throw new Error(\n \"MessageRepository(switchToBranch): Branch not found. This is likely an internal bug in assistant-ui.\",\n );\n\n const previousHead = this.head;\n const prevOrRoot = message.prev ?? this.root;\n prevOrRoot.next = message;\n\n this.head = findHead(message);\n\n this.evictOffBranchOptimisticMessages(previousHead, this.head);\n\n this._messages.dirty();\n }\n\n resetHead(messageId: string | null) {\n if (messageId === null) {\n this.clear();\n return;\n }\n\n const message = this.messages.get(messageId);\n if (!message)\n throw new Error(\n \"MessageRepository(resetHead): Branch not found. This is likely an internal bug in assistant-ui.\",\n );\n\n const previousHead = this.head;\n\n if (message.children.length > 0) {\n const deleteDescendants = (msg: RepositoryMessage) => {\n for (const childId of msg.children) {\n const childMessage = this.messages.get(childId);\n if (childMessage) {\n deleteDescendants(childMessage);\n this.messages.delete(childId);\n }\n }\n };\n deleteDescendants(message);\n\n message.children = [];\n message.next = null;\n }\n\n this.head = message;\n for (\n let current: RepositoryMessage | null = message;\n current;\n current = current.prev\n ) {\n if (current.prev) {\n current.prev.next = current;\n } else {\n this.root.next = current;\n }\n }\n\n this.evictOffBranchOptimisticMessages(previousHead, this.head);\n\n this._messages.dirty();\n }\n\n clear(): void {\n this.messages.clear();\n this.head = null;\n this.root = {\n children: [],\n next: null,\n };\n this._messages.dirty();\n }\n\n export(): ExportedMessageRepository {\n const exportItems: ExportedMessageRepository[\"messages\"] = [];\n\n // Optimistic messages are ephemeral and never persisted. They're always\n // leaf nodes, so skipping them can't orphan a persisted child.\n for (const [, message] of this.messages) {\n if (message.current.metadata?.isOptimistic) continue;\n exportItems.push({\n message: message.current,\n parentId: message.prev?.current.id ?? null,\n });\n }\n\n // The head may itself be optimistic; walk up to the nearest persisted ancestor.\n let head = this.head;\n while (head?.current.metadata?.isOptimistic) {\n head = head.prev;\n }\n\n return {\n headId: head?.current.id ?? null,\n messages: exportItems,\n };\n }\n\n import({ headId, messages }: ExportedMessageRepository) {\n for (const { message, parentId } of messages) {\n this.addOrUpdateMessage(parentId, message);\n }\n\n this.resetHead(headId ?? messages.at(-1)?.message.id ?? null);\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"thread-message-like.js","names":["unsupportedRole"],"sources":["../../../src/runtime/utils/thread-message-like.ts"],"sourcesContent":["import { parsePartialJsonObject } from \"assistant-stream/utils\";\nimport { generateId } from \"../../utils/id\";\nimport type {\n ReasoningMessagePart,\n SourceMessagePart,\n ThreadStep,\n MessageStatus,\n ImageMessagePart,\n ThreadMessage,\n ThreadAssistantMessagePart,\n ThreadAssistantMessage,\n ThreadUserMessagePart,\n ThreadUserMessage,\n ThreadSystemMessage,\n FileMessagePart,\n DataMessagePart,\n GenerativeUIMessagePart,\n Unstable_AudioMessagePart,\n} from \"../../types/message\";\nimport type { CompleteAttachment } from \"../../types/attachment\";\nimport type { MessageTiming, TextMessagePart } from \"../../types/message\";\nimport type {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"assistant-stream/utils\";\n\ntype DataPrefixedPart = {\n readonly type: `data-${string}`;\n readonly data: any;\n};\n\nexport type ThreadMessageLike = {\n readonly role: \"assistant\" | \"user\" | \"system\";\n readonly content:\n | string\n | readonly (\n | TextMessagePart\n | ReasoningMessagePart\n | SourceMessagePart\n | ImageMessagePart\n | FileMessagePart\n | DataMessagePart\n | GenerativeUIMessagePart\n | Unstable_AudioMessagePart\n | DataPrefixedPart\n | {\n readonly type: \"tool-call\";\n readonly toolCallId?: string;\n readonly toolName: string;\n readonly args?: ReadonlyJSONObject;\n readonly argsText?: string;\n readonly artifact?: any;\n readonly result?: any | undefined;\n readonly isError?: boolean | undefined;\n readonly parentId?: string | undefined;\n readonly messages?: readonly ThreadMessage[] | undefined;\n readonly interrupt?: { type: \"human\"; payload: unknown };\n readonly approval?: {\n readonly id: string;\n readonly approved?: boolean;\n readonly reason?: string;\n readonly isAutomatic?: boolean;\n };\n }\n )[];\n readonly id?: string | undefined;\n readonly createdAt?: Date | undefined;\n readonly status?: MessageStatus | undefined;\n readonly attachments?:\n | readonly (Omit<CompleteAttachment, \"content\"> & {\n readonly content: readonly (ThreadUserMessagePart | DataPrefixedPart)[];\n })[]\n | undefined;\n readonly metadata?:\n | {\n readonly unstable_state?: ReadonlyJSONValue;\n readonly unstable_annotations?:\n | readonly ReadonlyJSONValue[]\n | undefined;\n readonly unstable_data?: readonly ReadonlyJSONValue[] | undefined;\n readonly steps?: readonly ThreadStep[] | undefined;\n readonly timing?: MessageTiming | undefined;\n readonly submittedFeedback?: { readonly type: \"positive\" | \"negative\" };\n readonly isOptimistic?: boolean | undefined;\n readonly custom?: Record<string, unknown> | undefined;\n }\n | undefined;\n};\n\nconst convertDataPrefixedPart = (\n type: string,\n data: unknown,\n): DataMessagePart | undefined => {\n if (!type.startsWith(\"data-\")) return undefined;\n return { type: \"data\", name: type.substring(5), data };\n};\n\nexport const fromThreadMessageLike = (\n like: ThreadMessageLike,\n fallbackId: string,\n fallbackStatus: MessageStatus,\n): ThreadMessage => {\n const { role, id, createdAt, attachments, status, metadata } = like;\n const common = {\n id: id ?? fallbackId,\n createdAt: createdAt ?? new Date(),\n };\n\n const content =\n typeof like.content === \"string\"\n ? [{ type: \"text\" as const, text: like.content }]\n : like.content;\n\n const sanitizeImageContent = ({\n image,\n ...rest\n }: ImageMessagePart): ImageMessagePart | null => {\n const dataUri = image.match(\n /^data:image\\/(png|jpeg|jpg|gif|webp|svg\\+xml);base64,(.*)$/,\n );\n if (dataUri) {\n return { ...rest, image };\n }\n if (/^(https:\\/\\/|blob:)/.test(image)) {\n return { ...rest, image };\n }\n console.warn(`Invalid image data format detected`);\n return null;\n };\n\n if (role !== \"user\" && attachments?.length)\n throw new Error(\"attachments are only supported for user messages\");\n\n if (role !== \"assistant\" && status)\n throw new Error(\"status is only supported for assistant messages\");\n\n if (role !== \"assistant\" && metadata?.steps)\n throw new Error(\"metadata.steps is only supported for assistant messages\");\n\n switch (role) {\n case \"assistant\":\n return {\n ...common,\n role,\n content: content\n .map((part): ThreadAssistantMessagePart | null => {\n const type = part.type;\n switch (type) {\n case \"text\":\n case \"reasoning\":\n if (part.text.trim().length === 0) return null;\n return part;\n\n case \"file\":\n case \"source\":\n return part;\n\n case \"image\":\n return sanitizeImageContent(part);\n\n case \"data\":\n return part;\n\n case \"generative-ui\":\n return part;\n\n case \"tool-call\": {\n const { parentId, messages, ...basePart } = part;\n const commonProps = {\n ...basePart,\n toolCallId: part.toolCallId ?? `tool-${generateId()}`,\n ...(parentId !== undefined && { parentId }),\n ...(messages !== undefined && { messages }),\n };\n\n if (part.args) {\n return {\n ...commonProps,\n args: part.args,\n argsText: part.argsText ?? JSON.stringify(part.args),\n };\n }\n return {\n ...commonProps,\n args: parsePartialJsonObject(part.argsText ?? \"\") ?? {},\n argsText: part.argsText ?? \"\",\n };\n }\n\n default: {\n const converted = convertDataPrefixedPart(\n type,\n (part as DataPrefixedPart).data,\n );\n if (converted) return converted;\n throw new Error(\n `Unsupported assistant message part type: ${type}`,\n );\n }\n }\n })\n .filter((c) => !!c),\n status: status ?? fallbackStatus,\n metadata: {\n unstable_state: metadata?.unstable_state ?? null,\n unstable_annotations: metadata?.unstable_annotations ?? [],\n unstable_data: metadata?.unstable_data ?? [],\n custom: metadata?.custom ?? {},\n steps: metadata?.steps ?? [],\n ...(metadata?.timing && { timing: metadata.timing }),\n ...(metadata?.submittedFeedback && {\n submittedFeedback: metadata.submittedFeedback,\n }),\n ...(metadata?.isOptimistic && { isOptimistic: true }),\n },\n } satisfies ThreadAssistantMessage;\n\n case \"user\":\n return {\n ...common,\n role,\n content: content.map((part): ThreadUserMessagePart => {\n const type = part.type;\n switch (type) {\n case \"text\":\n case \"image\":\n case \"audio\":\n case \"file\":\n case \"data\":\n return part;\n\n default: {\n const converted = convertDataPrefixedPart(\n type,\n (part as DataPrefixedPart).data,\n );\n if (converted) return converted;\n throw new Error(`Unsupported user message part type: ${type}`);\n }\n }\n }),\n attachments: (attachments ?? []).map((att) => ({\n ...att,\n content: att.content.map((part): ThreadUserMessagePart => {\n const converted = convertDataPrefixedPart(\n part.type,\n (part as DataPrefixedPart).data,\n );\n return converted ?? (part as ThreadUserMessagePart);\n }),\n })),\n metadata: {\n custom: metadata?.custom ?? {},\n },\n } satisfies ThreadUserMessage;\n\n case \"system\":\n if (content.length !== 1 || content[0]!.type !== \"text\")\n throw new Error(\n \"System messages must have exactly one text message part.\",\n );\n\n return {\n ...common,\n role,\n content: content as [TextMessagePart],\n metadata: {\n custom: metadata?.custom ?? {},\n },\n } satisfies ThreadSystemMessage;\n\n default: {\n const unsupportedRole: never = role;\n throw new Error(`Unknown message role: ${unsupportedRole}`);\n }\n }\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"thread-message-like.js","names":["unsupportedRole"],"sources":["../../../src/runtime/utils/thread-message-like.ts"],"sourcesContent":["import { parsePartialJsonObject } from \"assistant-stream/utils\";\nimport { generateId } from \"../../utils/id\";\nimport type {\n ReasoningMessagePart,\n SourceMessagePart,\n ThreadStep,\n MessageStatus,\n ImageMessagePart,\n ThreadMessage,\n ThreadAssistantMessagePart,\n ThreadAssistantMessage,\n ThreadUserMessagePart,\n ThreadUserMessage,\n ThreadSystemMessage,\n FileMessagePart,\n DataMessagePart,\n GenerativeUIMessagePart,\n Unstable_AudioMessagePart,\n} from \"../../types/message\";\nimport type { CompleteAttachment } from \"../../types/attachment\";\nimport type { MessageTiming, TextMessagePart } from \"../../types/message\";\nimport type {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"assistant-stream/utils\";\n\ntype DataPrefixedPart = {\n readonly type: `data-${string}`;\n readonly data: any;\n};\n\nexport type ThreadMessageLike = {\n readonly role: \"assistant\" | \"user\" | \"system\";\n readonly content:\n | string\n | readonly (\n | TextMessagePart\n | ReasoningMessagePart\n | SourceMessagePart\n | ImageMessagePart\n | FileMessagePart\n | DataMessagePart\n | GenerativeUIMessagePart\n | Unstable_AudioMessagePart\n | DataPrefixedPart\n | {\n readonly type: \"tool-call\";\n readonly toolCallId?: string;\n readonly toolName: string;\n readonly args?: ReadonlyJSONObject;\n readonly argsText?: string;\n readonly artifact?: any;\n readonly result?: any | undefined;\n readonly isError?: boolean | undefined;\n readonly parentId?: string | undefined;\n readonly messages?: readonly ThreadMessage[] | undefined;\n readonly interrupt?: { type: \"human\"; payload: unknown };\n readonly approval?: {\n readonly id: string;\n readonly approved?: boolean;\n readonly reason?: string;\n readonly isAutomatic?: boolean;\n };\n }\n )[];\n readonly id?: string | undefined;\n readonly createdAt?: Date | undefined;\n readonly status?: MessageStatus | undefined;\n readonly attachments?:\n | readonly (Omit<CompleteAttachment, \"content\"> & {\n readonly content: readonly (ThreadUserMessagePart | DataPrefixedPart)[];\n })[]\n | undefined;\n readonly metadata?:\n | {\n readonly unstable_state?: ReadonlyJSONValue;\n readonly unstable_annotations?:\n | readonly ReadonlyJSONValue[]\n | undefined;\n readonly unstable_data?: readonly ReadonlyJSONValue[] | undefined;\n readonly steps?: readonly ThreadStep[] | undefined;\n readonly timing?: MessageTiming | undefined;\n readonly submittedFeedback?: { readonly type: \"positive\" | \"negative\" };\n readonly isOptimistic?: boolean | undefined;\n readonly custom?: Record<string, unknown> | undefined;\n }\n | undefined;\n};\n\nconst convertDataPrefixedPart = (\n type: string,\n data: unknown,\n): DataMessagePart | undefined => {\n if (!type.startsWith(\"data-\")) return undefined;\n return { type: \"data\", name: type.substring(5), data };\n};\n\nexport const fromThreadMessageLike = (\n like: ThreadMessageLike,\n fallbackId: string,\n fallbackStatus: MessageStatus,\n): ThreadMessage => {\n const { role, id, createdAt, attachments, status, metadata } = like;\n const common = {\n id: id ?? fallbackId,\n createdAt: createdAt ?? new Date(),\n };\n\n const content =\n typeof like.content === \"string\"\n ? [{ type: \"text\" as const, text: like.content }]\n : like.content;\n\n const sanitizeImageContent = ({\n image,\n ...rest\n }: ImageMessagePart): ImageMessagePart | null => {\n const dataUri = image.match(\n /^data:image\\/(png|jpeg|jpg|gif|webp|svg\\+xml);base64,(.*)$/,\n );\n if (dataUri) {\n return { ...rest, image };\n }\n if (/^(https:\\/\\/|blob:)/.test(image)) {\n return { ...rest, image };\n }\n console.warn(`Invalid image data format detected`);\n return null;\n };\n\n if (role !== \"user\" && attachments?.length)\n throw new Error(\"attachments are only supported for user messages\");\n\n if (role !== \"assistant\" && status)\n throw new Error(\"status is only supported for assistant messages\");\n\n if (role !== \"assistant\" && metadata?.steps)\n throw new Error(\"metadata.steps is only supported for assistant messages\");\n\n switch (role) {\n case \"assistant\":\n return {\n ...common,\n role,\n content: content\n .map((part): ThreadAssistantMessagePart | null => {\n const type = part.type;\n switch (type) {\n case \"text\":\n case \"reasoning\":\n if (part.text.trim().length === 0) return null;\n return part;\n\n case \"file\":\n case \"source\":\n return part;\n\n case \"image\":\n return sanitizeImageContent(part);\n\n case \"data\":\n return part;\n\n case \"generative-ui\":\n return part;\n\n case \"tool-call\": {\n const { parentId, messages, ...basePart } = part;\n const commonProps = {\n ...basePart,\n toolCallId: part.toolCallId ?? `tool-${generateId()}`,\n ...(parentId !== undefined && { parentId }),\n ...(messages !== undefined && { messages }),\n };\n\n if (part.args) {\n return {\n ...commonProps,\n args: part.args,\n argsText: part.argsText ?? JSON.stringify(part.args),\n };\n }\n return {\n ...commonProps,\n args: parsePartialJsonObject(part.argsText ?? \"\") ?? {},\n argsText: part.argsText ?? \"\",\n };\n }\n\n default: {\n const converted = convertDataPrefixedPart(\n type,\n (part as DataPrefixedPart).data,\n );\n if (converted) return converted;\n throw new Error(\n `Unsupported assistant message part type: ${type}`,\n );\n }\n }\n })\n .filter((c) => !!c),\n status: status ?? fallbackStatus,\n metadata: {\n unstable_state: metadata?.unstable_state ?? null,\n unstable_annotations: metadata?.unstable_annotations ?? [],\n unstable_data: metadata?.unstable_data ?? [],\n custom: metadata?.custom ?? {},\n steps: metadata?.steps ?? [],\n ...(metadata?.timing && { timing: metadata.timing }),\n ...(metadata?.submittedFeedback && {\n submittedFeedback: metadata.submittedFeedback,\n }),\n ...(metadata?.isOptimistic && { isOptimistic: true }),\n },\n } satisfies ThreadAssistantMessage;\n\n case \"user\":\n return {\n ...common,\n role,\n content: content.map((part): ThreadUserMessagePart => {\n const type = part.type;\n switch (type) {\n case \"text\":\n case \"image\":\n case \"audio\":\n case \"file\":\n case \"data\":\n return part;\n\n default: {\n const converted = convertDataPrefixedPart(\n type,\n (part as DataPrefixedPart).data,\n );\n if (converted) return converted;\n throw new Error(`Unsupported user message part type: ${type}`);\n }\n }\n }),\n attachments: (attachments ?? []).map((att) => ({\n ...att,\n content: att.content.map((part): ThreadUserMessagePart => {\n const converted = convertDataPrefixedPart(\n part.type,\n (part as DataPrefixedPart).data,\n );\n return converted ?? (part as ThreadUserMessagePart);\n }),\n })),\n metadata: {\n custom: metadata?.custom ?? {},\n },\n } satisfies ThreadUserMessage;\n\n case \"system\":\n if (content.length !== 1 || content[0]!.type !== \"text\")\n throw new Error(\n \"System messages must have exactly one text message part.\",\n );\n\n return {\n ...common,\n role,\n content: content as [TextMessagePart],\n metadata: {\n custom: metadata?.custom ?? {},\n },\n } satisfies ThreadSystemMessage;\n\n default: {\n const unsupportedRole: never = role;\n throw new Error(`Unknown message role: ${unsupportedRole}`);\n }\n }\n};\n"],"mappings":"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"}
@@ -7,6 +7,7 @@ import { ThreadMessageLike } from "../../runtime/utils/thread-message-like.js";
7
7
  import { ExportedMessageRepository } from "../../runtime/utils/message-repository.js";
8
8
  import { AddToolResultOptions, RespondToToolApprovalOptions, ResumeRunConfig, StartRunConfig, ThreadSuggestion } from "../../runtime/interfaces/thread-runtime-core.js";
9
9
  import { ToolExecutionStatus } from "../tool-invocations/ToolInvocationTracker.js";
10
+ import { ExternalThreadQueueAdapter } from "../../runtime/queue/external-thread-queue-adapter.js";
10
11
  import { ReadonlyJSONValue } from "assistant-stream/utils";
11
12
 
12
13
  //#region src/runtimes/external-store/external-store-adapter.d.ts
@@ -16,6 +17,7 @@ type ExternalStoreThreadData<TState extends "regular" | "archived"> = {
16
17
  remoteId?: string | undefined;
17
18
  externalId?: string | undefined;
18
19
  title?: string | undefined;
20
+ custom?: Record<string, unknown> | undefined;
19
21
  };
20
22
  type ExternalStoreThreadListAdapter = {
21
23
  /**
@@ -34,6 +36,7 @@ type ExternalStoreThreadListAdapter = {
34
36
  */
35
37
  onSwitchToThread?: ((threadId: string) => Promise<void> | void) | undefined;
36
38
  onRename?: (threadId: string, newTitle: string) => (Promise<void> | void) | undefined;
39
+ onUpdateCustom?: ((threadId: string, custom: Record<string, unknown> | undefined) => Promise<void> | void) | undefined;
37
40
  onArchive?: ((threadId: string) => Promise<void> | void) | undefined;
38
41
  onUnarchive?: ((threadId: string) => Promise<void> | void) | undefined;
39
42
  onDelete?: ((threadId: string) => Promise<void> | void) | undefined;
@@ -78,7 +81,8 @@ type ExternalStoreAdapterBase<T> = {
78
81
  onImport?: ((messages: readonly ThreadMessage[]) => void) | undefined;
79
82
  onExportExternalState?: (() => any) | undefined;
80
83
  onLoadExternalState?: ((state: any) => void) | undefined;
81
- onNew: (message: AppendMessage) => Promise<void>;
84
+ onNew: (message: AppendMessage) => Promise<void>; /** Opt in to message queuing. Typically produced by `createMessageQueue`. */
85
+ queue?: ExternalThreadQueueAdapter | undefined;
82
86
  onEdit?: ((message: AppendMessage) => Promise<void>) | undefined;
83
87
  onReload?: ((parentId: string | null, config: StartRunConfig) => Promise<void>) | undefined;
84
88
  onResume?: ((config: ResumeRunConfig) => Promise<void>) | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"external-store-adapter.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-adapter.ts"],"mappings":";;;;;;;;;;;;KAoBY,uBAAA;EACV,MAAA,EAAQ,MAAM;EACd,EAAA;EACA,QAAA;EACA,UAAA;EACA,KAAA;AAAA;AAAA,KAGU,8BAAA;EAPF;;;EAWR,QAAA;EACA,SAAA;EACA,OAAA,YAAmB,uBAAA;EACnB,eAAA,YAA2B,uBAAA;EAPjB;;;EAWV,mBAAA,UAA6B,OAAA;EAJF;;;EAQ3B,gBAAA,KAAqB,QAAA,aAAqB,OAAA;EAC1C,QAAA,IACE,QAAA,UACA,QAAA,cACI,OAAA;EACN,SAAA,KAAc,QAAA,aAAqB,OAAA;EACnC,WAAA,KAAgB,QAAA,aAAqB,OAAA;EACrC,QAAA,KAAa,QAAA,aAAqB,OAAA;AAAA;AAAA,KAGxB,6BAAA,OACV,OAAA,EAAS,CAAA,EACT,GAAA,aACG,iBAAiB;AAAA,KAEjB,oCAAA;EACH,cAAA,EAAgB,6BAA6B,CAAC,CAAA;AAAA;AAAA,KAG3C,wBAAA;EA3BwB;;;;;;EAkC3B,UAAA;EAxBE;;;;;;;;EAiCF,cAAA;EA5BA;;;;AAAyC;AAG3C;;;EAkCE,SAAA;EACA,SAAA;EACA,QAAA,YAAoB,CAAA;EACpB,iBAAA,GAAoB,yBAAA;EACpB,WAAA,YAAuB,gBAAA;EACvB,KAAA,GAAQ,iBAAA;EACR,MAAA;EAEA,WAAA,KAAgB,QAAA,WAAmB,CAAA;EACnC,QAAA,KAAa,QAAA,WAAmB,aAAA;EAChC,qBAAA;EACA,mBAAA,KAAwB,KAAA;EACxB,KAAA,GAAQ,OAAA,EAAS,aAAA,KAAkB,OAAA;EACnC,MAAA,KAAW,OAAA,EAAS,aAAA,KAAkB,OAAA;EACtC,QAAA,KACM,QAAA,iBAAyB,MAAA,EAAQ,cAAA,KAAmB,OAAA;EAE1D,QAAA,KAAa,MAAA,EAAQ,eAAA,KAAoB,OAAA;EACzC,QAAA,UAAkB,OAAA;EAClB,eAAA,KACM,OAAA,EAAS,oBAAA,KAAyB,OAAA;EAExC,gBAAA,KACM,OAAA;IAAW,UAAA;IAAoB,OAAA;EAAA;EAErC,uBAAA,KACM,OAAA,EAAS,4BAAA,KAAiC,OAAA;EAEhD,cAAA,GAAiB,6BAAA,CAA8B,CAAA;EAC/C,QAAA;IAEM,WAAA,GAAc,iBAAA;IACd,MAAA,GAAS,sBAAA;IACT,SAAA,GAAY,gBAAA;IACZ,KAAA,GAAQ,oBAAA;IACR,QAAA,GAAW,eAAA;IAtBG;;;IA0Bd,UAAA,GAAa,8BAAA;EAAA;EAGnB,qBAAA;IAEM,IAAA;EAAA;EAxBkC;;;;;;;;;;;;;;;;;;;EA8CxC,8BAAA;EAhEA;;;;;;;;;EA0EA,eAAA,KACM,QAAA,EAAU,MAAA,SAAe,mBAAA;AAAA;AAAA,KAIrB,oBAAA,KAAyB,aAAA,IACnC,wBAAA,CAAyB,CAAA,KACtB,CAAA,SAAU,aAAA,YAEP,oCAAA,CAAqC,CAAA"}
1
+ {"version":3,"file":"external-store-adapter.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-adapter.ts"],"mappings":";;;;;;;;;;;;;KAqBY,uBAAA;EACV,MAAA,EAAQ,MAAA;EACR,EAAA;EACA,QAAA;EACA,UAAA;EACA,KAAA;EACA,MAAA,GAAS,MAAM;AAAA;AAAA,KAGL,8BAAA;EAPV;;;EAWA,QAAA;EACA,SAAA;EACA,OAAA,YAAmB,uBAAA;EACnB,eAAA,YAA2B,uBAAA;EAVZ;AAGjB;;EAWE,mBAAA,UAA6B,OAAA;EALV;;;EASnB,gBAAA,KAAqB,QAAA,aAAqB,OAAA;EAC1C,QAAA,IACE,QAAA,UACA,QAAA,cACI,OAAA;EACN,cAAA,KAEM,QAAA,UACA,MAAA,EAAQ,MAAA,kCACL,OAAA;EAET,SAAA,KAAc,QAAA,aAAqB,OAAA;EACnC,WAAA,KAAgB,QAAA,aAAqB,OAAA;EACrC,QAAA,KAAa,QAAA,aAAqB,OAAA;AAAA;AAAA,KAGxB,6BAAA,OACV,OAAA,EAAS,CAAA,EACT,GAAA,aACG,iBAAiB;AAAA,KAEjB,oCAAA;EACH,cAAA,EAAgB,6BAA6B,CAAC,CAAA;AAAA;AAAA,KAG3C,wBAAA;EAlCgB;;;;;;EAyCnB,UAAA;EAhC0C;;;;;;;;EAyC1C,cAAA;EAhCS;;;;;;;;EAyCT,SAAA;EACA,SAAA;EACA,QAAA,YAAoB,CAAA;EACpB,iBAAA,GAAoB,yBAAA;EACpB,WAAA,YAAuB,gBAAA;EACvB,KAAA,GAAQ,iBAAA;EACR,MAAA;EAEA,WAAA,KAAgB,QAAA,WAAmB,CAAA;EACnC,QAAA,KAAa,QAAA,WAAmB,aAAA;EAChC,qBAAA;EACA,mBAAA,KAAwB,KAAA;EACxB,KAAA,GAAQ,OAAA,EAAS,aAAA,KAAkB,OAAA,QA3ChC;EA6CH,KAAA,GAAQ,0BAAA;EACR,MAAA,KAAW,OAAA,EAAS,aAAA,KAAkB,OAAA;EACtC,QAAA,KACM,QAAA,iBAAyB,MAAA,EAAQ,cAAA,KAAmB,OAAA;EAE1D,QAAA,KAAa,MAAA,EAAQ,eAAA,KAAoB,OAAA;EACzC,QAAA,UAAkB,OAAA;EAClB,eAAA,KACM,OAAA,EAAS,oBAAA,KAAyB,OAAA;EAExC,gBAAA,KACM,OAAA;IAAW,UAAA;IAAoB,OAAA;EAAA;EAErC,uBAAA,KACM,OAAA,EAAS,4BAAA,KAAiC,OAAA;EAEhD,cAAA,GAAiB,6BAAA,CAA8B,CAAA;EAC/C,QAAA;IAEM,WAAA,GAAc,iBAAA;IACd,MAAA,GAAS,sBAAA;IACT,SAAA,GAAY,gBAAA;IACZ,KAAA,GAAQ,oBAAA;IACR,QAAA,GAAW,eAAA;IAhCT;;;IAoCF,UAAA,GAAa,8BAAA;EAAA;EAGnB,qBAAA;IAEM,IAAA;EAAA;EA7BiC;;;;;;;;;;;;;;;;;;;EAmDvC,8BAAA;EAWsB;;;;;;;;;EADtB,eAAA,KACM,QAAA,EAAU,MAAA,SAAe,mBAAA;AAAA;AAAA,KAIrB,oBAAA,KAAyB,aAAA,IACnC,wBAAA,CAAyB,CAAA,KACtB,CAAA,SAAU,aAAA,YAEP,oCAAA,CAAqC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"external-store-runtime-core.js","names":[],"sources":["../../../src/runtimes/external-store/external-store-runtime-core.ts"],"sourcesContent":["import { BaseAssistantRuntimeCore } from \"../../runtime/base/base-assistant-runtime-core\";\nimport { ExternalStoreThreadListRuntimeCore } from \"./external-store-thread-list-runtime-core\";\nimport type { ExternalStoreAdapter } from \"./external-store-adapter\";\nimport { ExternalStoreThreadRuntimeCore } from \"./external-store-thread-runtime-core\";\n\nconst getThreadListAdapter = (store: ExternalStoreAdapter<any>) => {\n return store.adapters?.threadList ?? {};\n};\n\nexport class ExternalStoreRuntimeCore extends BaseAssistantRuntimeCore {\n public readonly threads;\n\n constructor(adapter: ExternalStoreAdapter<any>) {\n super();\n this.threads = new ExternalStoreThreadListRuntimeCore(\n getThreadListAdapter(adapter),\n () => new ExternalStoreThreadRuntimeCore(this._contextProvider, adapter),\n );\n }\n\n public setAdapter(adapter: ExternalStoreAdapter<any>) {\n // Update the thread list adapter and propagate store changes to the main thread\n this.threads.__internal_setAdapter(getThreadListAdapter(adapter));\n this.threads.getMainThreadRuntimeCore().__internal_setAdapter(adapter);\n }\n}\n"],"mappings":";;;;AAKA,MAAM,wBAAwB,UAAqC;CACjE,OAAO,MAAM,UAAU,cAAc,CAAC;AACxC;AAEA,IAAa,2BAAb,cAA8C,yBAAyB;CACrE;CAEA,YAAY,SAAoC;EAC9C,MAAM;EACN,KAAK,UAAU,IAAI,mCACjB,qBAAqB,OAAO,SACtB,IAAI,+BAA+B,KAAK,kBAAkB,OAAO,CACzE;CACF;CAEA,WAAkB,SAAoC;EAEpD,KAAK,QAAQ,sBAAsB,qBAAqB,OAAO,CAAC;EAChE,KAAK,QAAQ,yBAAyB,EAAE,sBAAsB,OAAO;CACvE;AACF"}
1
+ {"version":3,"file":"external-store-runtime-core.js","names":[],"sources":["../../../src/runtimes/external-store/external-store-runtime-core.ts"],"sourcesContent":["import { BaseAssistantRuntimeCore } from \"../../runtime/base/base-assistant-runtime-core\";\nimport { ExternalStoreThreadListRuntimeCore } from \"./external-store-thread-list-runtime-core\";\nimport type { ExternalStoreAdapter } from \"./external-store-adapter\";\nimport { ExternalStoreThreadRuntimeCore } from \"./external-store-thread-runtime-core\";\n\nconst getThreadListAdapter = (store: ExternalStoreAdapter<any>) => {\n return store.adapters?.threadList ?? {};\n};\n\nexport class ExternalStoreRuntimeCore extends BaseAssistantRuntimeCore {\n public readonly threads;\n\n constructor(adapter: ExternalStoreAdapter<any>) {\n super();\n this.threads = new ExternalStoreThreadListRuntimeCore(\n getThreadListAdapter(adapter),\n () => new ExternalStoreThreadRuntimeCore(this._contextProvider, adapter),\n );\n }\n\n public setAdapter(adapter: ExternalStoreAdapter<any>) {\n // Update the thread list adapter and propagate store changes to the main thread\n this.threads.__internal_setAdapter(getThreadListAdapter(adapter));\n this.threads.getMainThreadRuntimeCore().__internal_setAdapter(adapter);\n }\n}\n"],"mappings":";;;;AAKA,MAAM,wBAAwB,UAAqC;CACjE,OAAO,MAAM,UAAU,cAAc,CAAC;AACxC;AAEA,IAAa,2BAAb,cAA8C,yBAAyB;CACrE;CAEA,YAAY,SAAoC;EAC9C,MAAM;EACN,KAAK,UAAU,IAAI,mCACjB,qBAAqB,OAAO,SACtB,IAAI,+BAA+B,KAAK,kBAAkB,OAAO,CACzE;CACF;CAEA,WAAkB,SAAoC;EAEpD,KAAK,QAAQ,sBAAsB,qBAAqB,OAAO,CAAC;EAChE,KAAK,QAAQ,yBAAyB,CAAC,CAAC,sBAAsB,OAAO;CACvE;AACF"}
@@ -30,6 +30,7 @@ declare class ExternalStoreThreadListRuntimeCore implements ThreadListRuntimeCor
30
30
  }): Promise<void>;
31
31
  switchToNewThread(): Promise<void>;
32
32
  rename(threadId: string, newTitle: string): Promise<void>;
33
+ updateCustom(threadId: string, custom: Record<string, unknown> | undefined): Promise<void>;
33
34
  detach(): Promise<void>;
34
35
  archive(threadId: string): Promise<void>;
35
36
  unarchive(threadId: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"external-store-thread-list-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-list-runtime-core.ts"],"mappings":";;;;;;KAQY,0BAAA,SAAmC,8BAA8B;AAAA,cAgBhE,kCAAA,YAA8C,qBAAA;EAAA,QAwC/C,aAAA;EAAA,QAvCF,aAAA;EAAA,QACA,QAAA;EAAA,QACA,gBAAA;EAAA,QACA,WAAA;EAAA,QAEA,OAAA;EAAA,IAEG,SAAA;EAAA,IAIA,WAAA;EAAA,IAIA,SAAA;EAAA,IAIA,iBAAA;EAAA,IAIA,WAAA,IAAW,QAAA,CAAA,MAAA,SAAA,uBAAA;EAIf,qBAAA,IAAqB,OAAA;EAAA,QAIpB,WAAA;EAAA,IAEG,YAAA;cAKT,OAAA,EAAS,8BAAA,cACD,aAAA,EAAe,0BAAA;EAKlB,wBAAA,IAAwB,8BAAA;EAIxB,oBAAA;EAIA,WAAA,CAAY,QAAA,WAAgB,uBAAA;EAI5B,qBAAA,CACL,OAAA,EAAS,8BAAA,EACT,WAAA;EAqFW,cAAA,CACX,QAAA,UACA,QAAA;IAAa,SAAA;EAAA,IACZ,OAAA;EAUU,iBAAA,IAAqB,OAAA;EAUrB,MAAA,CAAO,QAAA,UAAkB,QAAA,WAAmB,OAAA;EAQ5C,MAAA,IAAU,OAAA;EAIV,OAAA,CAAQ,QAAA,WAAmB,OAAA;EAQ3B,SAAA,CAAU,QAAA,WAAmB,OAAA;EAQ7B,MAAA,CAAO,QAAA,WAAmB,OAAA;EAQhC,UAAA,CACL,QAAA,WACC,OAAA;IAAU,QAAA;IAAkB,UAAA;EAAA;EAIxB,aAAA;EAAA,QAIC,cAAA;EAED,SAAA,CAAU,QAAA,eAAuB,WAAA;EAAA,QAKhC,kBAAA;AAAA"}
1
+ {"version":3,"file":"external-store-thread-list-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-list-runtime-core.ts"],"mappings":";;;;;;KAQY,0BAAA,SAAmC,8BAA8B;AAAA,cAgBhE,kCAAA,YAA8C,qBAAA;EAAA,QAwC/C,aAAA;EAAA,QAvCF,aAAA;EAAA,QACA,QAAA;EAAA,QACA,gBAAA;EAAA,QACA,WAAA;EAAA,QAEA,OAAA;EAAA,IAEG,SAAA;EAAA,IAIA,WAAA;EAAA,IAIA,SAAA;EAAA,IAIA,iBAAA;EAAA,IAIA,WAAA,IAAW,QAAA,CAAA,MAAA,SAAA,uBAAA;EAIf,qBAAA,IAAqB,OAAA;EAAA,QAIpB,WAAA;EAAA,IAEG,YAAA;cAKT,OAAA,EAAS,8BAAA,cACD,aAAA,EAAe,0BAAA;EAKlB,wBAAA,IAAwB,8BAAA;EAIxB,oBAAA;EAIA,WAAA,CAAY,QAAA,WAAgB,uBAAA;EAI5B,qBAAA,CACL,OAAA,EAAS,8BAAA,EACT,WAAA;EAqFW,cAAA,CACX,QAAA,UACA,QAAA;IAAa,SAAA;EAAA,IACZ,OAAA;EAUU,iBAAA,IAAqB,OAAA;EAUrB,MAAA,CAAO,QAAA,UAAkB,QAAA,WAAmB,OAAA;EAQ5C,YAAA,CACX,QAAA,UACA,MAAA,EAAQ,MAAA,gCACP,OAAA;EAUU,MAAA,IAAU,OAAA;EAIV,OAAA,CAAQ,QAAA,WAAmB,OAAA;EAQ3B,SAAA,CAAU,QAAA,WAAmB,OAAA;EAQ7B,MAAA,CAAO,QAAA,WAAmB,OAAA;EAQhC,UAAA,CACL,QAAA,WACC,OAAA;IAAU,QAAA;IAAkB,UAAA;EAAA;EAIxB,aAAA;EAAA,QAIC,cAAA;EAED,SAAA,CAAU,QAAA,eAAuB,WAAA;EAAA,QAKhC,kBAAA;AAAA"}
@@ -108,6 +108,11 @@ var ExternalStoreThreadListRuntimeCore = class {
108
108
  if (!onRename) throw new Error("External store adapter does not support renaming");
109
109
  await onRename(threadId, newTitle);
110
110
  }
111
+ async updateCustom(threadId, custom) {
112
+ const onUpdateCustom = this.adapter.onUpdateCustom;
113
+ if (!onUpdateCustom) throw new Error("External store adapter does not support updating custom metadata");
114
+ await onUpdateCustom(threadId, custom);
115
+ }
111
116
  async detach() {}
112
117
  async archive(threadId) {
113
118
  const onArchive = this.adapter.onArchive;
@@ -1 +1 @@
1
- {"version":3,"file":"external-store-thread-list-runtime-core.js","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-list-runtime-core.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { ExternalStoreThreadRuntimeCore } from \"./external-store-thread-runtime-core\";\nimport type {\n ThreadListItemCoreState,\n ThreadListRuntimeCore,\n} from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport type { ExternalStoreThreadListAdapter } from \"./external-store-adapter\";\n\nexport type ExternalStoreThreadFactory = () => ExternalStoreThreadRuntimeCore;\n\nconst EMPTY_ARRAY = Object.freeze([]);\nconst DEFAULT_THREAD_ID = \"DEFAULT_THREAD_ID\";\nconst DEFAULT_THREADS = Object.freeze([DEFAULT_THREAD_ID]);\nconst DEFAULT_THREAD = Object.freeze({\n id: DEFAULT_THREAD_ID,\n remoteId: undefined,\n externalId: undefined,\n status: \"regular\",\n});\nconst RESOLVED_PROMISE = Promise.resolve();\nconst DEFAULT_THREAD_DATA = Object.freeze({\n [DEFAULT_THREAD_ID]: DEFAULT_THREAD,\n});\n\nexport class ExternalStoreThreadListRuntimeCore implements ThreadListRuntimeCore {\n private _mainThreadId: string = DEFAULT_THREAD_ID;\n private _threads: readonly string[] = DEFAULT_THREADS;\n private _archivedThreads: readonly string[] = EMPTY_ARRAY;\n private _threadData: Readonly<Record<string, ThreadListItemCoreState>> =\n DEFAULT_THREAD_DATA;\n private adapter: ExternalStoreThreadListAdapter = {};\n\n public get isLoading() {\n return this.adapter.isLoading ?? false;\n }\n\n public get newThreadId() {\n return undefined;\n }\n\n public get threadIds() {\n return this._threads;\n }\n\n public get archivedThreadIds() {\n return this._archivedThreads;\n }\n\n public get threadItems() {\n return this._threadData;\n }\n\n public getLoadThreadsPromise() {\n return RESOLVED_PROMISE;\n }\n\n private _mainThread!: ExternalStoreThreadRuntimeCore;\n\n public get mainThreadId() {\n return this._mainThreadId;\n }\n\n constructor(\n adapter: ExternalStoreThreadListAdapter = {},\n private threadFactory: ExternalStoreThreadFactory,\n ) {\n this.__internal_setAdapter(adapter, true);\n }\n\n public getMainThreadRuntimeCore() {\n return this._mainThread;\n }\n\n public getThreadRuntimeCore(): never {\n throw new Error(\"Method not implemented.\");\n }\n\n public getItemById(threadId: string) {\n return this._threadData[threadId];\n }\n\n public __internal_setAdapter(\n adapter: ExternalStoreThreadListAdapter,\n initialLoad = false,\n ) {\n const previousAdapter = this.adapter;\n this.adapter = adapter;\n\n const newThreadId = adapter.threadId ?? DEFAULT_THREAD_ID;\n const newThreads = adapter.threads ?? EMPTY_ARRAY;\n const newArchivedThreads = adapter.archivedThreads ?? EMPTY_ARRAY;\n\n const previousThreadId = previousAdapter.threadId ?? DEFAULT_THREAD_ID;\n const previousThreads = previousAdapter.threads ?? EMPTY_ARRAY;\n const previousArchivedThreads =\n previousAdapter.archivedThreads ?? EMPTY_ARRAY;\n\n if (\n !initialLoad &&\n previousThreadId === newThreadId &&\n previousThreads === newThreads &&\n previousArchivedThreads === newArchivedThreads\n ) {\n return;\n }\n\n if (\n previousThreads !== newThreads ||\n previousArchivedThreads !== newArchivedThreads ||\n previousThreadId !== newThreadId\n ) {\n this._threadData = {\n ...DEFAULT_THREAD_DATA,\n ...Object.fromEntries(\n adapter.threads?.map((t) => [\n t.id,\n {\n ...t,\n remoteId: t.remoteId,\n externalId: t.externalId,\n status: \"regular\",\n },\n ]) ?? [],\n ),\n ...Object.fromEntries(\n adapter.archivedThreads?.map((t) => [\n t.id,\n {\n ...t,\n remoteId: t.remoteId,\n externalId: t.externalId,\n status: \"archived\",\n },\n ]) ?? [],\n ),\n };\n }\n\n if (previousThreads !== newThreads) {\n this._threads = this.adapter.threads?.map((t) => t.id) ?? EMPTY_ARRAY;\n }\n\n if (previousArchivedThreads !== newArchivedThreads) {\n this._archivedThreads =\n this.adapter.archivedThreads?.map((t) => t.id) ?? EMPTY_ARRAY;\n }\n\n // `initialLoad ||`: `_mainThread!` must be assigned on construction.\n if (initialLoad || previousThreadId !== newThreadId) {\n this._mainThreadId = newThreadId;\n this._mainThread = this.threadFactory();\n }\n\n if (!this._threadData[this._mainThreadId]) {\n this._threadData = {\n ...this._threadData,\n [this._mainThreadId]: {\n id: this._mainThreadId,\n remoteId: undefined,\n externalId: undefined,\n status: \"regular\",\n },\n };\n }\n\n this._notifySubscribers();\n }\n\n public async switchToThread(\n threadId: string,\n _options?: { unarchive?: boolean },\n ): Promise<void> {\n if (this._mainThreadId === threadId) return;\n const onSwitchToThread = this.adapter.onSwitchToThread;\n if (!onSwitchToThread)\n throw new Error(\n \"External store adapter does not support switching to thread\",\n );\n await onSwitchToThread(threadId);\n }\n\n public async switchToNewThread(): Promise<void> {\n const onSwitchToNewThread = this.adapter.onSwitchToNewThread;\n if (!onSwitchToNewThread)\n throw new Error(\n \"External store adapter does not support switching to new thread\",\n );\n\n await onSwitchToNewThread();\n }\n\n public async rename(threadId: string, newTitle: string): Promise<void> {\n const onRename = this.adapter.onRename;\n if (!onRename)\n throw new Error(\"External store adapter does not support renaming\");\n\n await onRename(threadId, newTitle);\n }\n\n public async detach(): Promise<void> {\n // no-op\n }\n\n public async archive(threadId: string): Promise<void> {\n const onArchive = this.adapter.onArchive;\n if (!onArchive)\n throw new Error(\"External store adapter does not support archiving\");\n\n await onArchive(threadId);\n }\n\n public async unarchive(threadId: string): Promise<void> {\n const onUnarchive = this.adapter.onUnarchive;\n if (!onUnarchive)\n throw new Error(\"External store adapter does not support unarchiving\");\n\n await onUnarchive(threadId);\n }\n\n public async delete(threadId: string): Promise<void> {\n const onDelete = this.adapter.onDelete;\n if (!onDelete)\n throw new Error(\"External store adapter does not support deleting\");\n\n await onDelete(threadId);\n }\n\n public initialize(\n threadId: string,\n ): Promise<{ remoteId: string; externalId: string | undefined }> {\n return Promise.resolve({ remoteId: threadId, externalId: undefined });\n }\n\n public generateTitle(): never {\n throw new Error(\"Method not implemented.\");\n }\n\n private _subscriptions = new Set<() => void>();\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n private _notifySubscribers() {\n for (const callback of this._subscriptions) callback();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"external-store-thread-list-runtime-core.js","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-list-runtime-core.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { ExternalStoreThreadRuntimeCore } from \"./external-store-thread-runtime-core\";\nimport type {\n ThreadListItemCoreState,\n ThreadListRuntimeCore,\n} from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport type { ExternalStoreThreadListAdapter } from \"./external-store-adapter\";\n\nexport type ExternalStoreThreadFactory = () => ExternalStoreThreadRuntimeCore;\n\nconst EMPTY_ARRAY = Object.freeze([]);\nconst DEFAULT_THREAD_ID = \"DEFAULT_THREAD_ID\";\nconst DEFAULT_THREADS = Object.freeze([DEFAULT_THREAD_ID]);\nconst DEFAULT_THREAD = Object.freeze({\n id: DEFAULT_THREAD_ID,\n remoteId: undefined,\n externalId: undefined,\n status: \"regular\",\n});\nconst RESOLVED_PROMISE = Promise.resolve();\nconst DEFAULT_THREAD_DATA = Object.freeze({\n [DEFAULT_THREAD_ID]: DEFAULT_THREAD,\n});\n\nexport class ExternalStoreThreadListRuntimeCore implements ThreadListRuntimeCore {\n private _mainThreadId: string = DEFAULT_THREAD_ID;\n private _threads: readonly string[] = DEFAULT_THREADS;\n private _archivedThreads: readonly string[] = EMPTY_ARRAY;\n private _threadData: Readonly<Record<string, ThreadListItemCoreState>> =\n DEFAULT_THREAD_DATA;\n private adapter: ExternalStoreThreadListAdapter = {};\n\n public get isLoading() {\n return this.adapter.isLoading ?? false;\n }\n\n public get newThreadId() {\n return undefined;\n }\n\n public get threadIds() {\n return this._threads;\n }\n\n public get archivedThreadIds() {\n return this._archivedThreads;\n }\n\n public get threadItems() {\n return this._threadData;\n }\n\n public getLoadThreadsPromise() {\n return RESOLVED_PROMISE;\n }\n\n private _mainThread!: ExternalStoreThreadRuntimeCore;\n\n public get mainThreadId() {\n return this._mainThreadId;\n }\n\n constructor(\n adapter: ExternalStoreThreadListAdapter = {},\n private threadFactory: ExternalStoreThreadFactory,\n ) {\n this.__internal_setAdapter(adapter, true);\n }\n\n public getMainThreadRuntimeCore() {\n return this._mainThread;\n }\n\n public getThreadRuntimeCore(): never {\n throw new Error(\"Method not implemented.\");\n }\n\n public getItemById(threadId: string) {\n return this._threadData[threadId];\n }\n\n public __internal_setAdapter(\n adapter: ExternalStoreThreadListAdapter,\n initialLoad = false,\n ) {\n const previousAdapter = this.adapter;\n this.adapter = adapter;\n\n const newThreadId = adapter.threadId ?? DEFAULT_THREAD_ID;\n const newThreads = adapter.threads ?? EMPTY_ARRAY;\n const newArchivedThreads = adapter.archivedThreads ?? EMPTY_ARRAY;\n\n const previousThreadId = previousAdapter.threadId ?? DEFAULT_THREAD_ID;\n const previousThreads = previousAdapter.threads ?? EMPTY_ARRAY;\n const previousArchivedThreads =\n previousAdapter.archivedThreads ?? EMPTY_ARRAY;\n\n if (\n !initialLoad &&\n previousThreadId === newThreadId &&\n previousThreads === newThreads &&\n previousArchivedThreads === newArchivedThreads\n ) {\n return;\n }\n\n if (\n previousThreads !== newThreads ||\n previousArchivedThreads !== newArchivedThreads ||\n previousThreadId !== newThreadId\n ) {\n this._threadData = {\n ...DEFAULT_THREAD_DATA,\n ...Object.fromEntries(\n adapter.threads?.map((t) => [\n t.id,\n {\n ...t,\n remoteId: t.remoteId,\n externalId: t.externalId,\n status: \"regular\",\n },\n ]) ?? [],\n ),\n ...Object.fromEntries(\n adapter.archivedThreads?.map((t) => [\n t.id,\n {\n ...t,\n remoteId: t.remoteId,\n externalId: t.externalId,\n status: \"archived\",\n },\n ]) ?? [],\n ),\n };\n }\n\n if (previousThreads !== newThreads) {\n this._threads = this.adapter.threads?.map((t) => t.id) ?? EMPTY_ARRAY;\n }\n\n if (previousArchivedThreads !== newArchivedThreads) {\n this._archivedThreads =\n this.adapter.archivedThreads?.map((t) => t.id) ?? EMPTY_ARRAY;\n }\n\n // `initialLoad ||`: `_mainThread!` must be assigned on construction.\n if (initialLoad || previousThreadId !== newThreadId) {\n this._mainThreadId = newThreadId;\n this._mainThread = this.threadFactory();\n }\n\n if (!this._threadData[this._mainThreadId]) {\n this._threadData = {\n ...this._threadData,\n [this._mainThreadId]: {\n id: this._mainThreadId,\n remoteId: undefined,\n externalId: undefined,\n status: \"regular\",\n },\n };\n }\n\n this._notifySubscribers();\n }\n\n public async switchToThread(\n threadId: string,\n _options?: { unarchive?: boolean },\n ): Promise<void> {\n if (this._mainThreadId === threadId) return;\n const onSwitchToThread = this.adapter.onSwitchToThread;\n if (!onSwitchToThread)\n throw new Error(\n \"External store adapter does not support switching to thread\",\n );\n await onSwitchToThread(threadId);\n }\n\n public async switchToNewThread(): Promise<void> {\n const onSwitchToNewThread = this.adapter.onSwitchToNewThread;\n if (!onSwitchToNewThread)\n throw new Error(\n \"External store adapter does not support switching to new thread\",\n );\n\n await onSwitchToNewThread();\n }\n\n public async rename(threadId: string, newTitle: string): Promise<void> {\n const onRename = this.adapter.onRename;\n if (!onRename)\n throw new Error(\"External store adapter does not support renaming\");\n\n await onRename(threadId, newTitle);\n }\n\n public async updateCustom(\n threadId: string,\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n const onUpdateCustom = this.adapter.onUpdateCustom;\n if (!onUpdateCustom)\n throw new Error(\n \"External store adapter does not support updating custom metadata\",\n );\n\n await onUpdateCustom(threadId, custom);\n }\n\n public async detach(): Promise<void> {\n // no-op\n }\n\n public async archive(threadId: string): Promise<void> {\n const onArchive = this.adapter.onArchive;\n if (!onArchive)\n throw new Error(\"External store adapter does not support archiving\");\n\n await onArchive(threadId);\n }\n\n public async unarchive(threadId: string): Promise<void> {\n const onUnarchive = this.adapter.onUnarchive;\n if (!onUnarchive)\n throw new Error(\"External store adapter does not support unarchiving\");\n\n await onUnarchive(threadId);\n }\n\n public async delete(threadId: string): Promise<void> {\n const onDelete = this.adapter.onDelete;\n if (!onDelete)\n throw new Error(\"External store adapter does not support deleting\");\n\n await onDelete(threadId);\n }\n\n public initialize(\n threadId: string,\n ): Promise<{ remoteId: string; externalId: string | undefined }> {\n return Promise.resolve({ remoteId: threadId, externalId: undefined });\n }\n\n public generateTitle(): never {\n throw new Error(\"Method not implemented.\");\n }\n\n private _subscriptions = new Set<() => void>();\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n private _notifySubscribers() {\n for (const callback of this._subscriptions) callback();\n }\n}\n"],"mappings":"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"}
@@ -6,6 +6,7 @@ import { RealtimeVoiceAdapter } from "../../adapters/voice.js";
6
6
  import { ModelContextProvider } from "../../model-context/types.js";
7
7
  import { ThreadMessageLike } from "../../runtime/utils/thread-message-like.js";
8
8
  import { ExportedMessageRepository } from "../../runtime/utils/message-repository.js";
9
+ import { QueueItemState } from "../../store/scopes/queue-item.js";
9
10
  import { AddToolResultOptions, RespondToToolApprovalOptions, ResumeRunConfig, ResumeToolCallOptions, RuntimeCapabilities, StartRunConfig, ThreadRuntimeCore, ThreadSuggestion } from "../../runtime/interfaces/thread-runtime-core.js";
10
11
  import { BaseThreadRuntimeCore } from "../../runtime/base/base-thread-runtime-core.js";
11
12
  import { ExternalStoreAdapter, ExternalStoreThreadListAdapter } from "./external-store-adapter.js";
@@ -63,6 +64,9 @@ declare class ExternalStoreThreadRuntimeCore extends BaseThreadRuntimeCore imple
63
64
  private _findMessageIdForToolCall;
64
65
  switchToBranch(branchId: string): void;
65
66
  append(message: AppendMessage): Promise<void>;
67
+ getQueueItems(): readonly QueueItemState[];
68
+ steerQueueItem(queueItemId: string): void;
69
+ removeQueueItem(queueItemId: string): void;
66
70
  startRun(config: StartRunConfig): Promise<void>;
67
71
  resumeRun(config: ResumeRunConfig): Promise<void>;
68
72
  exportExternalState(): any;
@@ -1 +1 @@
1
- {"version":3,"file":"external-store-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-runtime-core.ts"],"mappings":";;;;;;;;;;;;cA8Ca,kBAAA,GACX,SAAA,WACA,QAAA,WAAmB,aAAa;AAAA,cAKrB,8BAAA,SACH,qBAAA,YACG,iBAAA;EAAA,QAEH,aAAA;EAAA,IAeG,YAAA,IAAY,mBAAA;EAAA,QAIf,SAAA;EACD,UAAA;EACA,cAAA;EAAA,IACI,SAAA;EAAA,IAIA,SAAA;EAAA,UAIQ,gBAAA,aAA6B,aAAA;EAAA,IAI5B,KAAA,iEAAK,kBAAA,oCAAA,iBAAA;EAAA,IAId,QAAA;kBARkD,iBAAA;;;;;;;EAYtD,WAAA,WAAsB,gBAAA;EACtB,MAAA;EAAA,QAEC,UAAA;EAAA,QAEA,MAAA;;;;;UAMA,gBAAA;EAEQ,SAAA,CAAU,SAAA;cAQxB,eAAA,EAAiB,oBAAA,EACjB,KAAA,EAAO,oBAAA;EAMF,qBAAA,CAAsB,KAAA,EAAO,oBAAA;EAuQS;;;;;;EAAA,QA5GrC,qBAAA;EA+O8B;;;;EAAA,QA5K9B,oBAAA;EAAA,QACA,yBAAA;EAvSoB;;;;;;EAAA,QA+SpB,yBAAA;EAmBQ,cAAA,CAAe,QAAA;EAalB,MAAA,CAAO,OAAA,EAAS,aAAA,GAAgB,OAAA;EAoBhC,QAAA,CAAS,MAAA,EAAQ,cAAA,GAAiB,OAAA;EAYlC,SAAA,CAAU,MAAA,EAAQ,eAAA,GAAkB,OAAA;EAO1C,mBAAA;EAOA,mBAAA,CAAoB,KAAA;EAmBpB,SAAA;EAwCA,aAAA,CAAc,OAAA,EAAS,oBAAA;EAMvB,cAAA,CAAe,OAAA,EAAS,qBAAA;EAoBxB,qBAAA,CAAsB,OAAA,EAAS,4BAAA;EAMtB,KAAA,CAAM,eAAA,YAA2B,iBAAA;EAMjC,MAAA,CAAO,IAAA,EAAM,yBAAA;EAAA,QAQrB,cAAA;AAAA"}
1
+ {"version":3,"file":"external-store-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-runtime-core.ts"],"mappings":";;;;;;;;;;;;;cA+Ca,kBAAA,GACX,SAAA,WACA,QAAA,WAAmB,aAAa;AAAA,cAKrB,8BAAA,SACH,qBAAA,YACG,iBAAA;EAAA,QAEH,aAAA;EAAA,IAeG,YAAA,IAAY,mBAAA;EAAA,QAIf,SAAA;EACD,UAAA;EACA,cAAA;EAAA,IACI,SAAA;EAAA,IAIA,SAAA;EAAA,UAIQ,gBAAA,aAA6B,aAAA;EAAA,IAI5B,KAAA,iEAAK,kBAAA,oCAAA,iBAAA;EAAA,IAId,QAAA;kBARkD,iBAAA;;;;;;;EAYtD,WAAA,WAAsB,gBAAA;EACtB,MAAA;EAAA,QAEC,UAAA;EAAA,QAEA,MAAA;;;;;UAMA,gBAAA;EAEQ,SAAA,CAAU,SAAA;cAQxB,eAAA,EAAiB,oBAAA,EACjB,KAAA,EAAO,oBAAA;EAMF,qBAAA,CAAsB,KAAA,EAAO,oBAAA;EAAA;;;;;;EAAA,QA2J5B,qBAAA;EAsKyC;;;;EAAA,QAnGzC,oBAAA;EAAA,QACA,yBAAA;EAxSA;;;;;;EAAA,QAgTA,yBAAA;EAmBQ,cAAA,CAAe,QAAA;EAalB,MAAA,CAAO,OAAA,EAAS,aAAA,GAAgB,OAAA;EA8BtC,aAAA,aA9B6C,cAAA;EAoC7C,cAAA,CAAe,WAAA;EAIf,eAAA,CAAgB,WAAA;EAIV,QAAA,CAAS,MAAA,EAAQ,cAAA,GAAiB,OAAA;EAclC,SAAA,CAAU,MAAA,EAAQ,eAAA,GAAkB,OAAA;EAO1C,mBAAA;EAOA,mBAAA,CAAoB,KAAA;EAmBpB,SAAA;EA0CA,aAAA,CAAc,OAAA,EAAS,oBAAA;EAMvB,cAAA,CAAe,OAAA,EAAS,qBAAA;EAoBxB,qBAAA,CAAsB,OAAA,EAAS,4BAAA;EAMtB,KAAA,CAAM,eAAA,YAA2B,iBAAA;EAMjC,MAAA,CAAO,IAAA,EAAM,yBAAA;EAAA,QAQrB,cAAA;AAAA"}
@@ -3,6 +3,7 @@ import { bindExternalStoreMessage, getExternalStoreMessages } from "../../runtim
3
3
  import { getAutoStatus, isAutoStatus } from "../../runtime/utils/auto-status.js";
4
4
  import { fromThreadMessageLike } from "../../runtime/utils/thread-message-like.js";
5
5
  import { ExportedMessageRepository, MessageRepository } from "../../runtime/utils/message-repository.js";
6
+ import { EMPTY_QUEUE_ITEMS } from "../../store/scopes/queue-item.js";
6
7
  import { getThreadMessageText } from "../../utils/text.js";
7
8
  import { BaseThreadRuntimeCore } from "../../runtime/base/base-thread-runtime-core.js";
8
9
  import { ThreadMessageConverter } from "./thread-message-converter.js";
@@ -93,7 +94,7 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
93
94
  unstable_copy: this._store.unstable_capabilities?.copy !== false,
94
95
  attachments: !!this._store.adapters?.attachments,
95
96
  feedback: !!this._store.adapters?.feedback,
96
- queue: false
97
+ queue: this._store.queue !== void 0
97
98
  };
98
99
  if (!shallowEqual(this._capabilities, newCapabilities)) this._capabilities = newCapabilities;
99
100
  let messages;
@@ -224,14 +225,30 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
224
225
  this.updateMessages(this.repository.getMessages());
225
226
  }
226
227
  async append(message) {
228
+ const isEdit = message.parentId !== (this.messages.at(-1)?.id ?? null);
229
+ if (!isEdit && this._store.queue) {
230
+ this._store.queue.enqueue(message, { steer: message.steer ?? false });
231
+ return;
232
+ }
227
233
  if (message.startRun ?? message.role === "user") await this._toolInvocations?.abort();
228
- if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {
234
+ if (isEdit) {
229
235
  if (!this._store.onEdit) throw new Error("Runtime does not support editing messages.");
236
+ this._store.queue?.clear("edit");
230
237
  await this._store.onEdit(message);
231
238
  } else await this._store.onNew(message);
232
239
  }
240
+ getQueueItems() {
241
+ return this._store?.queue?.items ?? EMPTY_QUEUE_ITEMS;
242
+ }
243
+ steerQueueItem(queueItemId) {
244
+ this._store?.queue?.steer(queueItemId);
245
+ }
246
+ removeQueueItem(queueItemId) {
247
+ this._store?.queue?.remove(queueItemId);
248
+ }
233
249
  async startRun(config) {
234
250
  if (!this._store.onReload) throw new Error("Runtime does not support reloading messages.");
251
+ this._store.queue?.clear("reload");
235
252
  await this._toolInvocations?.abort();
236
253
  await this._store.onReload(config.parentId, config);
237
254
  }
@@ -253,6 +270,7 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
253
270
  }
254
271
  cancelRun() {
255
272
  if (!this._store.onCancel) throw new Error("Runtime does not support cancelling runs.");
273
+ this._store.queue?.clear("cancel-run");
256
274
  this._toolInvocations?.abort();
257
275
  this._store.onCancel();
258
276
  const head = this.repository.getMessages().at(-1);
@@ -1 +1 @@
1
- {"version":3,"file":"external-store-thread-runtime-core.js","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-runtime-core.ts"],"sourcesContent":["import type { AppendMessage, ThreadMessage } from \"../../types/message\";\nimport type {\n AddToolResultOptions,\n ResumeRunConfig,\n ResumeToolCallOptions,\n RespondToToolApprovalOptions,\n StartRunConfig,\n ThreadSuggestion,\n} from \"../../runtime/interfaces/thread-runtime-core\";\n\nimport type { ExternalStoreAdapter } from \"./external-store-adapter\";\nimport {\n getExternalStoreMessages,\n bindExternalStoreMessage,\n} from \"../../runtime/utils/external-store-message\";\nimport { ThreadMessageConverter } from \"./thread-message-converter\";\nimport { getAutoStatus, isAutoStatus } from \"../../runtime/utils/auto-status\";\nimport {\n fromThreadMessageLike,\n type ThreadMessageLike,\n} from \"../../runtime/utils/thread-message-like\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport type {\n RuntimeCapabilities,\n ThreadRuntimeCore,\n} from \"../../runtime/interfaces/thread-runtime-core\";\nimport { BaseThreadRuntimeCore } from \"../../runtime/base/base-thread-runtime-core\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport {\n ExportedMessageRepository,\n MessageRepository,\n} from \"../../runtime/utils/message-repository\";\nimport { generateId } from \"../../utils/id\";\nimport { ToolInvocationTracker } from \"../tool-invocations/ToolInvocationTracker\";\n\nconst EMPTY_ARRAY: readonly ThreadSuggestion[] = Object.freeze([]);\n\nconst shallowEqual = (a: object, b: object): boolean => {\n const aKeys = Object.keys(a);\n if (aKeys.length !== Object.keys(b).length) return false;\n for (const key of aKeys) {\n if ((a as any)[key] !== (b as any)[key]) return false;\n }\n return true;\n};\n\nexport const hasUpcomingMessage = (\n isRunning: boolean,\n messages: readonly ThreadMessage[],\n) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nexport class ExternalStoreThreadRuntimeCore\n extends BaseThreadRuntimeCore\n implements ThreadRuntimeCore\n{\n private _capabilities: RuntimeCapabilities = {\n switchToBranch: false,\n switchBranchDuringRun: false,\n edit: false,\n reload: false,\n cancel: false,\n unstable_copy: false,\n speech: false,\n dictation: false,\n voice: false,\n attachments: false,\n feedback: false,\n queue: false,\n };\n\n public get capabilities() {\n return this._capabilities;\n }\n\n private _messages!: readonly ThreadMessage[];\n public isDisabled!: boolean;\n public isSendDisabled!: boolean;\n public get isLoading() {\n return this._store.isLoading ?? false;\n }\n // Unlike `isLoading`: pass `undefined` through to preserve the `getThreadState` fallback.\n public get isRunning(): boolean | undefined {\n return this._store.isRunning;\n }\n\n protected override _getBaseMessages(): readonly ThreadMessage[] {\n return this._messages;\n }\n\n public override get state() {\n return this._store.state ?? super.state;\n }\n\n public get adapters() {\n return this._store.adapters;\n }\n\n public suggestions: readonly ThreadSuggestion[] = [];\n public extras: unknown = undefined;\n\n private _converter = new ThreadMessageConverter();\n\n private _store!: ExternalStoreAdapter<any>;\n\n /**\n * Client-side tool-invocations pipeline. Constructed lazily on first\n * snapshot — only when `adapter.unstable_enableToolInvocations === true`.\n */\n private _toolInvocations: ToolInvocationTracker | null = null;\n\n public override beginEdit(messageId: string) {\n if (!this._store.onEdit)\n throw new Error(\"Runtime does not support editing.\");\n\n super.beginEdit(messageId);\n }\n\n constructor(\n contextProvider: ModelContextProvider,\n store: ExternalStoreAdapter<any>,\n ) {\n super(contextProvider);\n this.__internal_setAdapter(store);\n }\n\n public __internal_setAdapter(store: ExternalStoreAdapter<any>) {\n if (this._store === store) return;\n\n const isRunning = store.isRunning ?? false;\n this.isDisabled = store.isDisabled ?? false;\n this.isSendDisabled = store.isSendDisabled ?? false;\n\n const oldStore = this._store as ExternalStoreAdapter<any> | undefined;\n this._store = store;\n if (this.extras !== store.extras) {\n this.extras = store.extras;\n }\n\n const newSuggestions = store.suggestions ?? EMPTY_ARRAY;\n if (!shallowEqual(this.suggestions, newSuggestions)) {\n this.suggestions = newSuggestions;\n }\n\n const newCapabilities: RuntimeCapabilities = {\n switchToBranch: this._store.setMessages !== undefined,\n switchBranchDuringRun: false,\n edit: this._store.onEdit !== undefined,\n reload: this._store.onReload !== undefined,\n cancel: this._store.onCancel !== undefined,\n speech: this._store.adapters?.speech !== undefined,\n dictation: this._store.adapters?.dictation !== undefined,\n voice: this._store.adapters?.voice !== undefined,\n unstable_copy: this._store.unstable_capabilities?.copy !== false,\n attachments: !!this._store.adapters?.attachments,\n feedback: !!this._store.adapters?.feedback,\n queue: false,\n };\n if (!shallowEqual(this._capabilities, newCapabilities)) {\n this._capabilities = newCapabilities;\n }\n\n let messages: readonly ThreadMessage[];\n\n if (store.messageRepository) {\n // Handle messageRepository\n if (\n oldStore &&\n oldStore.isRunning === store.isRunning &&\n oldStore.messageRepository === store.messageRepository\n ) {\n this._notifySubscribers();\n return;\n }\n\n this.repository.clear();\n this.repository.import(store.messageRepository);\n\n messages = this.repository.getMessages();\n } else if (store.messages) {\n // Handle messages array\n\n if (oldStore) {\n // flush the converter cache when the convertMessage prop changes\n if (oldStore.convertMessage !== store.convertMessage) {\n this._converter = new ThreadMessageConverter();\n } else if (\n oldStore.isRunning === store.isRunning &&\n oldStore.messages === store.messages\n ) {\n this._notifySubscribers();\n // no conversion update\n return;\n }\n }\n\n messages = !store.convertMessage\n ? store.messages\n : this._converter.convertMessages(store.messages, (cache, m, idx) => {\n if (!store.convertMessage) return m;\n\n const isLast = idx === (store.messages?.length ?? 0) - 1;\n const autoStatus = getAutoStatus(\n isLast,\n isRunning,\n false,\n false,\n undefined,\n );\n\n if (\n cache &&\n (cache.role !== \"assistant\" ||\n !isAutoStatus(cache.status) ||\n cache.status === autoStatus)\n )\n return cache;\n\n const messageLike = store.convertMessage(m, idx);\n const newMessage = fromThreadMessageLike(\n messageLike,\n idx.toString(),\n autoStatus,\n );\n bindExternalStoreMessage(newMessage, m);\n return newMessage;\n });\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i]!;\n const parent = messages[i - 1];\n this.repository.addOrUpdateMessage(parent?.id ?? null, message);\n }\n } else {\n throw new Error(\n \"ExternalStoreAdapter must provide either 'messages' or 'messageRepository'\",\n );\n }\n\n // Common logic for both paths\n if (messages.length > 0) this.ensureInitialized();\n\n if ((oldStore?.isRunning ?? false) !== (store.isRunning ?? false)) {\n if (store.isRunning) {\n this._notifyEventSubscribers(\"runStart\", {});\n } else {\n this._notifyEventSubscribers(\"runEnd\", {});\n }\n }\n\n // Append an optimistic placeholder while running but before a trailing\n // assistant message exists. resetHead evicts off-branch optimistic messages\n // (prior placeholders, mid-run id-swap siblings); export() never persists them.\n let optimisticId: string | null = null;\n if (hasUpcomingMessage(isRunning, messages)) {\n optimisticId = generateId();\n this.repository.addOrUpdateMessage(\n messages.at(-1)?.id ?? null,\n fromThreadMessageLike(\n { role: \"assistant\", content: [], metadata: { isOptimistic: true } },\n optimisticId,\n { type: \"running\" },\n ),\n );\n }\n\n this.repository.resetHead(optimisticId ?? messages.at(-1)?.id ?? null);\n\n this._messages = this.repository.getMessages();\n\n this._driveToolInvocations();\n\n this._notifySubscribers();\n }\n\n /**\n * Feed the current message snapshot into the tool-invocations tracker.\n * Opt-in via `adapter.unstable_enableToolInvocations: true`. The tracker\n * itself is fail-silent — see ToolInvocationTracker for the\n * state-transition contract.\n */\n private _driveToolInvocations(): void {\n if (!this._store.unstable_enableToolInvocations) {\n // Adapter did not opt in (default). If a tracker was previously\n // constructed (e.g. the adapter just toggled the flag off via a\n // dynamic swap), drop it so subsequent snapshots are no-ops.\n if (this._toolInvocations) {\n this._toolInvocations.reset();\n this._toolInvocations = null;\n this._store.setToolStatuses?.({});\n }\n return;\n }\n\n if (!this._toolInvocations) {\n this._toolInvocations = new ToolInvocationTracker(\n () => this.getModelContext().tools,\n {\n onResult: (command) => {\n try {\n const messageId = this._findMessageIdForToolCall(\n command.toolCallId,\n );\n if (messageId === undefined) {\n // The tool call no longer exists in the snapshot (e.g.\n // rolled back). Drop the result.\n return;\n }\n this._store.onAddToolResult?.({\n messageId,\n toolCallId: command.toolCallId,\n toolName: command.toolName,\n result: command.result,\n isError: command.isError,\n ...(command.artifact !== undefined && {\n artifact: command.artifact,\n }),\n ...(command.modelContent !== undefined && {\n modelContent: command.modelContent,\n }),\n });\n } catch (err) {\n console.error(\n \"[ExternalStoreThreadRuntimeCore] onAddToolResult dispatch failed\",\n err,\n );\n }\n },\n onStatusesChange: (statuses) => {\n this._store.setToolStatuses?.(Object.fromEntries(statuses));\n },\n },\n );\n }\n\n this._toolInvocations.setState({\n messages: this._messages,\n isRunning: this._store.isRunning ?? false,\n ...(this._store.isLoading !== undefined && {\n isLoading: this._store.isLoading,\n }),\n });\n }\n\n /**\n * Lookup table from `toolCallId` to the owning assistant message's `id`,\n * rebuilt lazily when `_messages` changes (see `_messagesForToolCallIndex`).\n */\n private _toolCallToMessageId = new Map<string, string>();\n private _messagesForToolCallIndex: readonly ThreadMessage[] | null = null;\n\n /**\n * Look up the assistant message that owns a tool-call part. Lazily builds\n * (and caches) a `toolCallId → messageId` map keyed off the current\n * `_messages` reference, so onResult dispatches stay O(1) instead of\n * walking the full thread on every result.\n */\n private _findMessageIdForToolCall(toolCallId: string): string | undefined {\n if (this._messagesForToolCallIndex !== this._messages) {\n this._toolCallToMessageId.clear();\n const visit = (messages: readonly ThreadMessage[]): void => {\n for (const message of messages) {\n if (!Array.isArray(message.content)) continue;\n for (const part of message.content) {\n if (!part || part.type !== \"tool-call\") continue;\n this._toolCallToMessageId.set(part.toolCallId, message.id);\n if (part.messages) visit(part.messages);\n }\n }\n };\n visit(this._messages);\n this._messagesForToolCallIndex = this._messages;\n }\n return this._toolCallToMessageId.get(toolCallId);\n }\n\n public override switchToBranch(branchId: string): void {\n if (!this._store.setMessages)\n throw new Error(\"Runtime does not support switching branches.\");\n\n // Silently ignore branch switches while running\n if (this._store.isRunning) {\n return;\n }\n\n this.repository.switchToBranch(branchId);\n this.updateMessages(this.repository.getMessages());\n }\n\n public async append(message: AppendMessage): Promise<void> {\n // Auto-abort in-flight client-side tool executions when a new run is\n // about to start. Without this, a tool that finishes after the new turn\n // begins would feed a stale result into `onAddToolResult`, racing with\n // the new turn the user just initiated. `startRun` defaults to true for\n // user messages — matches the satellites' historical opt-in cancel\n // behavior, which is now built in.\n if (message.startRun ?? message.role === \"user\") {\n await this._toolInvocations?.abort();\n }\n\n if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {\n if (!this._store.onEdit)\n throw new Error(\"Runtime does not support editing messages.\");\n await this._store.onEdit(message);\n } else {\n await this._store.onNew(message);\n }\n }\n\n public async startRun(config: StartRunConfig): Promise<void> {\n if (!this._store.onReload)\n throw new Error(\"Runtime does not support reloading messages.\");\n\n // Auto-abort in-flight client-side tool executions when a run reloads;\n // any results that land afterward would target a turn that no longer\n // exists. See `append` above for full rationale.\n await this._toolInvocations?.abort();\n\n await this._store.onReload(config.parentId, config);\n }\n\n public async resumeRun(config: ResumeRunConfig): Promise<void> {\n if (!this._store.onResume)\n throw new Error(\"Runtime does not support resuming runs.\");\n\n await this._store.onResume(config);\n }\n\n public exportExternalState(): any {\n if (!this._store.onExportExternalState)\n throw new Error(\"Runtime does not support exporting external states.\");\n\n return this._store.onExportExternalState();\n }\n\n public importExternalState(state: any): void {\n if (!this._store.onLoadExternalState)\n throw new Error(\"Runtime does not support importing external states.\");\n\n // Re-arm the tracker so the next adapter snapshot (containing the\n // imported state) is treated as historical — no streamCall/execute\n // fires for the loaded tool calls. The adapter is expected to update\n // its messages in response to onLoadExternalState; that update flows\n // back here via __internal_setAdapter. We only clear adapter-side\n // tool statuses when the tracker is the source of truth — otherwise\n // we'd wipe statuses the adapter is managing on its own.\n if (this._toolInvocations) {\n this._toolInvocations.reset();\n this._store.setToolStatuses?.({});\n }\n\n this._store.onLoadExternalState(state);\n }\n\n public cancelRun(): void {\n if (!this._store.onCancel)\n throw new Error(\"Runtime does not support cancelling runs.\");\n\n // Abort any in-flight client-side tool executions. Fire-and-forget —\n // the abort resolves once executions settle, but we don't gate the\n // cancel on it.\n void this._toolInvocations?.abort();\n\n this._store.onCancel();\n\n // Drop an empty optimistic head (placeholder or pre-stream message); a\n // partially-streamed one is kept and re-supplied by the store on resync.\n const head = this.repository.getMessages().at(-1);\n if (head && head.metadata.isOptimistic && head.content.length === 0) {\n this.repository.deleteMessage(head.id);\n }\n\n let messages = this.repository.getMessages();\n const previousMessage = messages[messages.length - 1];\n if (\n previousMessage?.role === \"user\" &&\n previousMessage.id === messages.at(-1)?.id // ensure the previous message is a leaf node\n ) {\n this.repository.deleteMessage(previousMessage.id);\n if (!this.composer.text.trim()) {\n this.composer.setText(getThreadMessageText(previousMessage));\n }\n\n messages = this.repository.getMessages();\n } else {\n this._notifySubscribers();\n }\n\n // resync messages (for reloading, to restore the previous branch)\n setTimeout(() => {\n this.updateMessages(messages);\n }, 0);\n }\n\n public addToolResult(options: AddToolResultOptions) {\n if (!this._store.onAddToolResult)\n throw new Error(\"Runtime does not support tool results.\");\n this._store.onAddToolResult?.(options);\n }\n\n public resumeToolCall(options: ResumeToolCallOptions) {\n // Tracker owns its own human-input handlers — let it resume in-process\n // tool calls without round-tripping through the adapter. Falls back to\n // the adapter's onResumeToolCall (if any) for tool calls the tracker\n // doesn't know about.\n const handled =\n this._toolInvocations?.resume(options.toolCallId, options.payload) ??\n false;\n if (handled) return;\n\n if (this._store.onResumeToolCall) {\n this._store.onResumeToolCall(options);\n return;\n }\n\n throw new Error(\n `Tool call ${options.toolCallId} is not waiting for resume.`,\n );\n }\n\n public respondToToolApproval(options: RespondToToolApprovalOptions) {\n if (!this._store.onRespondToToolApproval)\n throw new Error(\"Runtime does not support tool approvals.\");\n this._store.onRespondToToolApproval(options);\n }\n\n public override reset(initialMessages?: readonly ThreadMessageLike[]) {\n const repo = new MessageRepository();\n repo.import(ExportedMessageRepository.fromArray(initialMessages ?? []));\n this.updateMessages(repo.getMessages());\n }\n\n public override import(data: ExportedMessageRepository) {\n super.import(data);\n\n if (this._store.onImport) {\n this._store.onImport(this.repository.getMessages());\n }\n }\n\n private updateMessages = (messages: readonly ThreadMessage[]) => {\n const hasConverter = this._store.convertMessage !== undefined;\n if (hasConverter) {\n this._store.setMessages?.(messages.flatMap(getExternalStoreMessages));\n } else {\n // TODO mark this as readonly in v0.12.0\n this._store.setMessages?.(messages as ThreadMessage[]);\n }\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"external-store-thread-runtime-core.js","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-runtime-core.ts"],"sourcesContent":["import type { AppendMessage, ThreadMessage } from \"../../types/message\";\nimport type {\n AddToolResultOptions,\n ResumeRunConfig,\n ResumeToolCallOptions,\n RespondToToolApprovalOptions,\n StartRunConfig,\n ThreadSuggestion,\n} from \"../../runtime/interfaces/thread-runtime-core\";\n\nimport type { ExternalStoreAdapter } from \"./external-store-adapter\";\nimport {\n getExternalStoreMessages,\n bindExternalStoreMessage,\n} from \"../../runtime/utils/external-store-message\";\nimport { ThreadMessageConverter } from \"./thread-message-converter\";\nimport { getAutoStatus, isAutoStatus } from \"../../runtime/utils/auto-status\";\nimport {\n fromThreadMessageLike,\n type ThreadMessageLike,\n} from \"../../runtime/utils/thread-message-like\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport type {\n RuntimeCapabilities,\n ThreadRuntimeCore,\n} from \"../../runtime/interfaces/thread-runtime-core\";\nimport { BaseThreadRuntimeCore } from \"../../runtime/base/base-thread-runtime-core\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport {\n ExportedMessageRepository,\n MessageRepository,\n} from \"../../runtime/utils/message-repository\";\nimport { generateId } from \"../../utils/id\";\nimport { ToolInvocationTracker } from \"../tool-invocations/ToolInvocationTracker\";\nimport { EMPTY_QUEUE_ITEMS } from \"../../store/scopes/queue-item\";\n\nconst EMPTY_ARRAY: readonly ThreadSuggestion[] = Object.freeze([]);\n\nconst shallowEqual = (a: object, b: object): boolean => {\n const aKeys = Object.keys(a);\n if (aKeys.length !== Object.keys(b).length) return false;\n for (const key of aKeys) {\n if ((a as any)[key] !== (b as any)[key]) return false;\n }\n return true;\n};\n\nexport const hasUpcomingMessage = (\n isRunning: boolean,\n messages: readonly ThreadMessage[],\n) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nexport class ExternalStoreThreadRuntimeCore\n extends BaseThreadRuntimeCore\n implements ThreadRuntimeCore\n{\n private _capabilities: RuntimeCapabilities = {\n switchToBranch: false,\n switchBranchDuringRun: false,\n edit: false,\n reload: false,\n cancel: false,\n unstable_copy: false,\n speech: false,\n dictation: false,\n voice: false,\n attachments: false,\n feedback: false,\n queue: false,\n };\n\n public get capabilities() {\n return this._capabilities;\n }\n\n private _messages!: readonly ThreadMessage[];\n public isDisabled!: boolean;\n public isSendDisabled!: boolean;\n public get isLoading() {\n return this._store.isLoading ?? false;\n }\n // Unlike `isLoading`: pass `undefined` through to preserve the `getThreadState` fallback.\n public get isRunning(): boolean | undefined {\n return this._store.isRunning;\n }\n\n protected override _getBaseMessages(): readonly ThreadMessage[] {\n return this._messages;\n }\n\n public override get state() {\n return this._store.state ?? super.state;\n }\n\n public get adapters() {\n return this._store.adapters;\n }\n\n public suggestions: readonly ThreadSuggestion[] = [];\n public extras: unknown = undefined;\n\n private _converter = new ThreadMessageConverter();\n\n private _store!: ExternalStoreAdapter<any>;\n\n /**\n * Client-side tool-invocations pipeline. Constructed lazily on first\n * snapshot — only when `adapter.unstable_enableToolInvocations === true`.\n */\n private _toolInvocations: ToolInvocationTracker | null = null;\n\n public override beginEdit(messageId: string) {\n if (!this._store.onEdit)\n throw new Error(\"Runtime does not support editing.\");\n\n super.beginEdit(messageId);\n }\n\n constructor(\n contextProvider: ModelContextProvider,\n store: ExternalStoreAdapter<any>,\n ) {\n super(contextProvider);\n this.__internal_setAdapter(store);\n }\n\n public __internal_setAdapter(store: ExternalStoreAdapter<any>) {\n if (this._store === store) return;\n\n const isRunning = store.isRunning ?? false;\n this.isDisabled = store.isDisabled ?? false;\n this.isSendDisabled = store.isSendDisabled ?? false;\n\n const oldStore = this._store as ExternalStoreAdapter<any> | undefined;\n this._store = store;\n if (this.extras !== store.extras) {\n this.extras = store.extras;\n }\n\n const newSuggestions = store.suggestions ?? EMPTY_ARRAY;\n if (!shallowEqual(this.suggestions, newSuggestions)) {\n this.suggestions = newSuggestions;\n }\n\n const newCapabilities: RuntimeCapabilities = {\n switchToBranch: this._store.setMessages !== undefined,\n switchBranchDuringRun: false,\n edit: this._store.onEdit !== undefined,\n reload: this._store.onReload !== undefined,\n cancel: this._store.onCancel !== undefined,\n speech: this._store.adapters?.speech !== undefined,\n dictation: this._store.adapters?.dictation !== undefined,\n voice: this._store.adapters?.voice !== undefined,\n unstable_copy: this._store.unstable_capabilities?.copy !== false,\n attachments: !!this._store.adapters?.attachments,\n feedback: !!this._store.adapters?.feedback,\n queue: this._store.queue !== undefined,\n };\n if (!shallowEqual(this._capabilities, newCapabilities)) {\n this._capabilities = newCapabilities;\n }\n\n let messages: readonly ThreadMessage[];\n\n if (store.messageRepository) {\n // Handle messageRepository\n if (\n oldStore &&\n oldStore.isRunning === store.isRunning &&\n oldStore.messageRepository === store.messageRepository\n ) {\n this._notifySubscribers();\n return;\n }\n\n this.repository.clear();\n this.repository.import(store.messageRepository);\n\n messages = this.repository.getMessages();\n } else if (store.messages) {\n // Handle messages array\n\n if (oldStore) {\n // flush the converter cache when the convertMessage prop changes\n if (oldStore.convertMessage !== store.convertMessage) {\n this._converter = new ThreadMessageConverter();\n } else if (\n oldStore.isRunning === store.isRunning &&\n oldStore.messages === store.messages\n ) {\n this._notifySubscribers();\n // no conversion update\n return;\n }\n }\n\n messages = !store.convertMessage\n ? store.messages\n : this._converter.convertMessages(store.messages, (cache, m, idx) => {\n if (!store.convertMessage) return m;\n\n const isLast = idx === (store.messages?.length ?? 0) - 1;\n const autoStatus = getAutoStatus(\n isLast,\n isRunning,\n false,\n false,\n undefined,\n );\n\n if (\n cache &&\n (cache.role !== \"assistant\" ||\n !isAutoStatus(cache.status) ||\n cache.status === autoStatus)\n )\n return cache;\n\n const messageLike = store.convertMessage(m, idx);\n const newMessage = fromThreadMessageLike(\n messageLike,\n idx.toString(),\n autoStatus,\n );\n bindExternalStoreMessage(newMessage, m);\n return newMessage;\n });\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i]!;\n const parent = messages[i - 1];\n this.repository.addOrUpdateMessage(parent?.id ?? null, message);\n }\n } else {\n throw new Error(\n \"ExternalStoreAdapter must provide either 'messages' or 'messageRepository'\",\n );\n }\n\n // Common logic for both paths\n if (messages.length > 0) this.ensureInitialized();\n\n if ((oldStore?.isRunning ?? false) !== (store.isRunning ?? false)) {\n if (store.isRunning) {\n this._notifyEventSubscribers(\"runStart\", {});\n } else {\n this._notifyEventSubscribers(\"runEnd\", {});\n }\n }\n\n // Append an optimistic placeholder while running but before a trailing\n // assistant message exists. resetHead evicts off-branch optimistic messages\n // (prior placeholders, mid-run id-swap siblings); export() never persists them.\n let optimisticId: string | null = null;\n if (hasUpcomingMessage(isRunning, messages)) {\n optimisticId = generateId();\n this.repository.addOrUpdateMessage(\n messages.at(-1)?.id ?? null,\n fromThreadMessageLike(\n { role: \"assistant\", content: [], metadata: { isOptimistic: true } },\n optimisticId,\n { type: \"running\" },\n ),\n );\n }\n\n this.repository.resetHead(optimisticId ?? messages.at(-1)?.id ?? null);\n\n this._messages = this.repository.getMessages();\n\n this._driveToolInvocations();\n\n this._notifySubscribers();\n }\n\n /**\n * Feed the current message snapshot into the tool-invocations tracker.\n * Opt-in via `adapter.unstable_enableToolInvocations: true`. The tracker\n * itself is fail-silent — see ToolInvocationTracker for the\n * state-transition contract.\n */\n private _driveToolInvocations(): void {\n if (!this._store.unstable_enableToolInvocations) {\n // Adapter did not opt in (default). If a tracker was previously\n // constructed (e.g. the adapter just toggled the flag off via a\n // dynamic swap), drop it so subsequent snapshots are no-ops.\n if (this._toolInvocations) {\n this._toolInvocations.reset();\n this._toolInvocations = null;\n this._store.setToolStatuses?.({});\n }\n return;\n }\n\n if (!this._toolInvocations) {\n this._toolInvocations = new ToolInvocationTracker(\n () => this.getModelContext().tools,\n {\n onResult: (command) => {\n try {\n const messageId = this._findMessageIdForToolCall(\n command.toolCallId,\n );\n if (messageId === undefined) {\n // The tool call no longer exists in the snapshot (e.g.\n // rolled back). Drop the result.\n return;\n }\n this._store.onAddToolResult?.({\n messageId,\n toolCallId: command.toolCallId,\n toolName: command.toolName,\n result: command.result,\n isError: command.isError,\n ...(command.artifact !== undefined && {\n artifact: command.artifact,\n }),\n ...(command.modelContent !== undefined && {\n modelContent: command.modelContent,\n }),\n });\n } catch (err) {\n console.error(\n \"[ExternalStoreThreadRuntimeCore] onAddToolResult dispatch failed\",\n err,\n );\n }\n },\n onStatusesChange: (statuses) => {\n this._store.setToolStatuses?.(Object.fromEntries(statuses));\n },\n },\n );\n }\n\n this._toolInvocations.setState({\n messages: this._messages,\n isRunning: this._store.isRunning ?? false,\n ...(this._store.isLoading !== undefined && {\n isLoading: this._store.isLoading,\n }),\n });\n }\n\n /**\n * Lookup table from `toolCallId` to the owning assistant message's `id`,\n * rebuilt lazily when `_messages` changes (see `_messagesForToolCallIndex`).\n */\n private _toolCallToMessageId = new Map<string, string>();\n private _messagesForToolCallIndex: readonly ThreadMessage[] | null = null;\n\n /**\n * Look up the assistant message that owns a tool-call part. Lazily builds\n * (and caches) a `toolCallId → messageId` map keyed off the current\n * `_messages` reference, so onResult dispatches stay O(1) instead of\n * walking the full thread on every result.\n */\n private _findMessageIdForToolCall(toolCallId: string): string | undefined {\n if (this._messagesForToolCallIndex !== this._messages) {\n this._toolCallToMessageId.clear();\n const visit = (messages: readonly ThreadMessage[]): void => {\n for (const message of messages) {\n if (!Array.isArray(message.content)) continue;\n for (const part of message.content) {\n if (!part || part.type !== \"tool-call\") continue;\n this._toolCallToMessageId.set(part.toolCallId, message.id);\n if (part.messages) visit(part.messages);\n }\n }\n };\n visit(this._messages);\n this._messagesForToolCallIndex = this._messages;\n }\n return this._toolCallToMessageId.get(toolCallId);\n }\n\n public override switchToBranch(branchId: string): void {\n if (!this._store.setMessages)\n throw new Error(\"Runtime does not support switching branches.\");\n\n // Silently ignore branch switches while running\n if (this._store.isRunning) {\n return;\n }\n\n this.repository.switchToBranch(branchId);\n this.updateMessages(this.repository.getMessages());\n }\n\n public async append(message: AppendMessage): Promise<void> {\n const isEdit = message.parentId !== (this.messages.at(-1)?.id ?? null);\n\n // Buffering does not start a run, so the tool-abort below must wait until\n // the queue flushes. By then the prior run (and its tools) has settled.\n if (!isEdit && this._store.queue) {\n this._store.queue.enqueue(message, { steer: message.steer ?? false });\n return;\n }\n\n // Auto-abort in-flight client-side tool executions when a new run is\n // about to start. Without this, a tool that finishes after the new turn\n // begins would feed a stale result into `onAddToolResult`, racing with\n // the new turn the user just initiated. `startRun` defaults to true for\n // user messages — matches the satellites' historical opt-in cancel\n // behavior, which is now built in.\n if (message.startRun ?? message.role === \"user\") {\n await this._toolInvocations?.abort();\n }\n\n if (isEdit) {\n if (!this._store.onEdit)\n throw new Error(\"Runtime does not support editing messages.\");\n this._store.queue?.clear(\"edit\");\n await this._store.onEdit(message);\n } else {\n await this._store.onNew(message);\n }\n }\n\n public getQueueItems() {\n // The composer reads this during base-thread construction, before the\n // constructor assigns `_store`, so guard against the unset field.\n return this._store?.queue?.items ?? EMPTY_QUEUE_ITEMS;\n }\n\n public steerQueueItem(queueItemId: string) {\n this._store?.queue?.steer(queueItemId);\n }\n\n public removeQueueItem(queueItemId: string) {\n this._store?.queue?.remove(queueItemId);\n }\n\n public async startRun(config: StartRunConfig): Promise<void> {\n if (!this._store.onReload)\n throw new Error(\"Runtime does not support reloading messages.\");\n\n this._store.queue?.clear(\"reload\");\n\n // Auto-abort in-flight client-side tool executions when a run reloads;\n // any results that land afterward would target a turn that no longer\n // exists. See `append` above for full rationale.\n await this._toolInvocations?.abort();\n\n await this._store.onReload(config.parentId, config);\n }\n\n public async resumeRun(config: ResumeRunConfig): Promise<void> {\n if (!this._store.onResume)\n throw new Error(\"Runtime does not support resuming runs.\");\n\n await this._store.onResume(config);\n }\n\n public exportExternalState(): any {\n if (!this._store.onExportExternalState)\n throw new Error(\"Runtime does not support exporting external states.\");\n\n return this._store.onExportExternalState();\n }\n\n public importExternalState(state: any): void {\n if (!this._store.onLoadExternalState)\n throw new Error(\"Runtime does not support importing external states.\");\n\n // Re-arm the tracker so the next adapter snapshot (containing the\n // imported state) is treated as historical — no streamCall/execute\n // fires for the loaded tool calls. The adapter is expected to update\n // its messages in response to onLoadExternalState; that update flows\n // back here via __internal_setAdapter. We only clear adapter-side\n // tool statuses when the tracker is the source of truth — otherwise\n // we'd wipe statuses the adapter is managing on its own.\n if (this._toolInvocations) {\n this._toolInvocations.reset();\n this._store.setToolStatuses?.({});\n }\n\n this._store.onLoadExternalState(state);\n }\n\n public cancelRun(): void {\n if (!this._store.onCancel)\n throw new Error(\"Runtime does not support cancelling runs.\");\n\n this._store.queue?.clear(\"cancel-run\");\n\n // Abort any in-flight client-side tool executions. Fire-and-forget —\n // the abort resolves once executions settle, but we don't gate the\n // cancel on it.\n void this._toolInvocations?.abort();\n\n this._store.onCancel();\n\n // Drop an empty optimistic head (placeholder or pre-stream message); a\n // partially-streamed one is kept and re-supplied by the store on resync.\n const head = this.repository.getMessages().at(-1);\n if (head && head.metadata.isOptimistic && head.content.length === 0) {\n this.repository.deleteMessage(head.id);\n }\n\n let messages = this.repository.getMessages();\n const previousMessage = messages[messages.length - 1];\n if (\n previousMessage?.role === \"user\" &&\n previousMessage.id === messages.at(-1)?.id // ensure the previous message is a leaf node\n ) {\n this.repository.deleteMessage(previousMessage.id);\n if (!this.composer.text.trim()) {\n this.composer.setText(getThreadMessageText(previousMessage));\n }\n\n messages = this.repository.getMessages();\n } else {\n this._notifySubscribers();\n }\n\n // resync messages (for reloading, to restore the previous branch)\n setTimeout(() => {\n this.updateMessages(messages);\n }, 0);\n }\n\n public addToolResult(options: AddToolResultOptions) {\n if (!this._store.onAddToolResult)\n throw new Error(\"Runtime does not support tool results.\");\n this._store.onAddToolResult?.(options);\n }\n\n public resumeToolCall(options: ResumeToolCallOptions) {\n // Tracker owns its own human-input handlers — let it resume in-process\n // tool calls without round-tripping through the adapter. Falls back to\n // the adapter's onResumeToolCall (if any) for tool calls the tracker\n // doesn't know about.\n const handled =\n this._toolInvocations?.resume(options.toolCallId, options.payload) ??\n false;\n if (handled) return;\n\n if (this._store.onResumeToolCall) {\n this._store.onResumeToolCall(options);\n return;\n }\n\n throw new Error(\n `Tool call ${options.toolCallId} is not waiting for resume.`,\n );\n }\n\n public respondToToolApproval(options: RespondToToolApprovalOptions) {\n if (!this._store.onRespondToToolApproval)\n throw new Error(\"Runtime does not support tool approvals.\");\n this._store.onRespondToToolApproval(options);\n }\n\n public override reset(initialMessages?: readonly ThreadMessageLike[]) {\n const repo = new MessageRepository();\n repo.import(ExportedMessageRepository.fromArray(initialMessages ?? []));\n this.updateMessages(repo.getMessages());\n }\n\n public override import(data: ExportedMessageRepository) {\n super.import(data);\n\n if (this._store.onImport) {\n this._store.onImport(this.repository.getMessages());\n }\n }\n\n private updateMessages = (messages: readonly ThreadMessage[]) => {\n const hasConverter = this._store.convertMessage !== undefined;\n if (hasConverter) {\n this._store.setMessages?.(messages.flatMap(getExternalStoreMessages));\n } else {\n // TODO mark this as readonly in v0.12.0\n this._store.setMessages?.(messages as ThreadMessage[]);\n }\n };\n}\n"],"mappings":";;;;;;;;;;;AAoCA,MAAM,cAA2C,OAAO,OAAO,CAAC,CAAC;AAEjE,MAAM,gBAAgB,GAAW,MAAuB;CACtD,MAAM,QAAQ,OAAO,KAAK,CAAC;CAC3B,IAAI,MAAM,WAAW,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,OAAO;CACnD,KAAK,MAAM,OAAO,OAChB,IAAK,EAAU,SAAU,EAAU,MAAM,OAAO;CAElD,OAAO;AACT;AAEA,MAAa,sBACX,WACA,aACG;CACH,OAAO,aAAa,SAAS,SAAS,SAAS,EAAE,EAAE,SAAS;AAC9D;AAEA,IAAa,iCAAb,cACU,sBAEV;CACE,gBAA6C;EAC3C,gBAAgB;EAChB,uBAAuB;EACvB,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,eAAe;EACf,QAAQ;EACR,WAAW;EACX,OAAO;EACP,aAAa;EACb,UAAU;EACV,OAAO;CACT;CAEA,IAAW,eAAe;EACxB,OAAO,KAAK;CACd;CAEA;CACA;CACA;CACA,IAAW,YAAY;EACrB,OAAO,KAAK,OAAO,aAAa;CAClC;CAEA,IAAW,YAAiC;EAC1C,OAAO,KAAK,OAAO;CACrB;CAEA,mBAAgE;EAC9D,OAAO,KAAK;CACd;CAEA,IAAoB,QAAQ;EAC1B,OAAO,KAAK,OAAO,SAAS,MAAM;CACpC;CAEA,IAAW,WAAW;EACpB,OAAO,KAAK,OAAO;CACrB;CAEA,cAAkD,CAAC;CACnD,SAAyB,KAAA;CAEzB,aAAqB,IAAI,uBAAuB;CAEhD;;;;;CAMA,mBAAyD;CAEzD,UAA0B,WAAmB;EAC3C,IAAI,CAAC,KAAK,OAAO,QACf,MAAM,IAAI,MAAM,mCAAmC;EAErD,MAAM,UAAU,SAAS;CAC3B;CAEA,YACE,iBACA,OACA;EACA,MAAM,eAAe;EACrB,KAAK,sBAAsB,KAAK;CAClC;CAEA,sBAA6B,OAAkC;EAC7D,IAAI,KAAK,WAAW,OAAO;EAE3B,MAAM,YAAY,MAAM,aAAa;EACrC,KAAK,aAAa,MAAM,cAAc;EACtC,KAAK,iBAAiB,MAAM,kBAAkB;EAE9C,MAAM,WAAW,KAAK;EACtB,KAAK,SAAS;EACd,IAAI,KAAK,WAAW,MAAM,QACxB,KAAK,SAAS,MAAM;EAGtB,MAAM,iBAAiB,MAAM,eAAe;EAC5C,IAAI,CAAC,aAAa,KAAK,aAAa,cAAc,GAChD,KAAK,cAAc;EAGrB,MAAM,kBAAuC;GAC3C,gBAAgB,KAAK,OAAO,gBAAgB,KAAA;GAC5C,uBAAuB;GACvB,MAAM,KAAK,OAAO,WAAW,KAAA;GAC7B,QAAQ,KAAK,OAAO,aAAa,KAAA;GACjC,QAAQ,KAAK,OAAO,aAAa,KAAA;GACjC,QAAQ,KAAK,OAAO,UAAU,WAAW,KAAA;GACzC,WAAW,KAAK,OAAO,UAAU,cAAc,KAAA;GAC/C,OAAO,KAAK,OAAO,UAAU,UAAU,KAAA;GACvC,eAAe,KAAK,OAAO,uBAAuB,SAAS;GAC3D,aAAa,CAAC,CAAC,KAAK,OAAO,UAAU;GACrC,UAAU,CAAC,CAAC,KAAK,OAAO,UAAU;GAClC,OAAO,KAAK,OAAO,UAAU,KAAA;EAC/B;EACA,IAAI,CAAC,aAAa,KAAK,eAAe,eAAe,GACnD,KAAK,gBAAgB;EAGvB,IAAI;EAEJ,IAAI,MAAM,mBAAmB;GAE3B,IACE,YACA,SAAS,cAAc,MAAM,aAC7B,SAAS,sBAAsB,MAAM,mBACrC;IACA,KAAK,mBAAmB;IACxB;GACF;GAEA,KAAK,WAAW,MAAM;GACtB,KAAK,WAAW,OAAO,MAAM,iBAAiB;GAE9C,WAAW,KAAK,WAAW,YAAY;EACzC,OAAO,IAAI,MAAM,UAAU;GAGzB,IAAI;QAEE,SAAS,mBAAmB,MAAM,gBACpC,KAAK,aAAa,IAAI,uBAAuB;SACxC,IACL,SAAS,cAAc,MAAM,aAC7B,SAAS,aAAa,MAAM,UAC5B;KACA,KAAK,mBAAmB;KAExB;IACF;;GAGF,WAAW,CAAC,MAAM,iBACd,MAAM,WACN,KAAK,WAAW,gBAAgB,MAAM,WAAW,OAAO,GAAG,QAAQ;IACjE,IAAI,CAAC,MAAM,gBAAgB,OAAO;IAGlC,MAAM,aAAa,cADJ,SAAS,MAAM,UAAU,UAAU,KAAK,GAGrD,WACA,OACA,OACA,KAAA,CACF;IAEA,IACE,UACC,MAAM,SAAS,eACd,CAAC,aAAa,MAAM,MAAM,KAC1B,MAAM,WAAW,aAEnB,OAAO;IAGT,MAAM,aAAa,sBADC,MAAM,eAAe,GAAG,GAEhC,GACV,IAAI,SAAS,GACb,UACF;IACA,yBAAyB,YAAY,CAAC;IACtC,OAAO;GACT,CAAC;GAEL,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;IACxC,MAAM,UAAU,SAAS;IACzB,MAAM,SAAS,SAAS,IAAI;IAC5B,KAAK,WAAW,mBAAmB,QAAQ,MAAM,MAAM,OAAO;GAChE;EACF,OACE,MAAM,IAAI,MACR,4EACF;EAIF,IAAI,SAAS,SAAS,GAAG,KAAK,kBAAkB;EAEhD,KAAK,UAAU,aAAa,YAAY,MAAM,aAAa,QACzD,IAAI,MAAM,WACR,KAAK,wBAAwB,YAAY,CAAC,CAAC;OAE3C,KAAK,wBAAwB,UAAU,CAAC,CAAC;EAO7C,IAAI,eAA8B;EAClC,IAAI,mBAAmB,WAAW,QAAQ,GAAG;GAC3C,eAAe,WAAW;GAC1B,KAAK,WAAW,mBACd,SAAS,GAAG,EAAE,CAAC,EAAE,MAAM,MACvB,sBACE;IAAE,MAAM;IAAa,SAAS,CAAC;IAAG,UAAU,EAAE,cAAc,KAAK;GAAE,GACnE,cACA,EAAE,MAAM,UAAU,CACpB,CACF;EACF;EAEA,KAAK,WAAW,UAAU,gBAAgB,SAAS,GAAG,EAAE,CAAC,EAAE,MAAM,IAAI;EAErE,KAAK,YAAY,KAAK,WAAW,YAAY;EAE7C,KAAK,sBAAsB;EAE3B,KAAK,mBAAmB;CAC1B;;;;;;;CAQA,wBAAsC;EACpC,IAAI,CAAC,KAAK,OAAO,gCAAgC;GAI/C,IAAI,KAAK,kBAAkB;IACzB,KAAK,iBAAiB,MAAM;IAC5B,KAAK,mBAAmB;IACxB,KAAK,OAAO,kBAAkB,CAAC,CAAC;GAClC;GACA;EACF;EAEA,IAAI,CAAC,KAAK,kBACR,KAAK,mBAAmB,IAAI,4BACpB,KAAK,gBAAgB,CAAC,CAAC,OAC7B;GACE,WAAW,YAAY;IACrB,IAAI;KACF,MAAM,YAAY,KAAK,0BACrB,QAAQ,UACV;KACA,IAAI,cAAc,KAAA,GAGhB;KAEF,KAAK,OAAO,kBAAkB;MAC5B;MACA,YAAY,QAAQ;MACpB,UAAU,QAAQ;MAClB,QAAQ,QAAQ;MAChB,SAAS,QAAQ;MACjB,GAAI,QAAQ,aAAa,KAAA,KAAa,EACpC,UAAU,QAAQ,SACpB;MACA,GAAI,QAAQ,iBAAiB,KAAA,KAAa,EACxC,cAAc,QAAQ,aACxB;KACF,CAAC;IACH,SAAS,KAAK;KACZ,QAAQ,MACN,oEACA,GACF;IACF;GACF;GACA,mBAAmB,aAAa;IAC9B,KAAK,OAAO,kBAAkB,OAAO,YAAY,QAAQ,CAAC;GAC5D;EACF,CACF;EAGF,KAAK,iBAAiB,SAAS;GAC7B,UAAU,KAAK;GACf,WAAW,KAAK,OAAO,aAAa;GACpC,GAAI,KAAK,OAAO,cAAc,KAAA,KAAa,EACzC,WAAW,KAAK,OAAO,UACzB;EACF,CAAC;CACH;;;;;CAMA,uCAA+B,IAAI,IAAoB;CACvD,4BAAqE;;;;;;;CAQrE,0BAAkC,YAAwC;EACxE,IAAI,KAAK,8BAA8B,KAAK,WAAW;GACrD,KAAK,qBAAqB,MAAM;GAChC,MAAM,SAAS,aAA6C;IAC1D,KAAK,MAAM,WAAW,UAAU;KAC9B,IAAI,CAAC,MAAM,QAAQ,QAAQ,OAAO,GAAG;KACrC,KAAK,MAAM,QAAQ,QAAQ,SAAS;MAClC,IAAI,CAAC,QAAQ,KAAK,SAAS,aAAa;MACxC,KAAK,qBAAqB,IAAI,KAAK,YAAY,QAAQ,EAAE;MACzD,IAAI,KAAK,UAAU,MAAM,KAAK,QAAQ;KACxC;IACF;GACF;GACA,MAAM,KAAK,SAAS;GACpB,KAAK,4BAA4B,KAAK;EACxC;EACA,OAAO,KAAK,qBAAqB,IAAI,UAAU;CACjD;CAEA,eAA+B,UAAwB;EACrD,IAAI,CAAC,KAAK,OAAO,aACf,MAAM,IAAI,MAAM,8CAA8C;EAGhE,IAAI,KAAK,OAAO,WACd;EAGF,KAAK,WAAW,eAAe,QAAQ;EACvC,KAAK,eAAe,KAAK,WAAW,YAAY,CAAC;CACnD;CAEA,MAAa,OAAO,SAAuC;EACzD,MAAM,SAAS,QAAQ,cAAc,KAAK,SAAS,GAAG,EAAE,CAAC,EAAE,MAAM;EAIjE,IAAI,CAAC,UAAU,KAAK,OAAO,OAAO;GAChC,KAAK,OAAO,MAAM,QAAQ,SAAS,EAAE,OAAO,QAAQ,SAAS,MAAM,CAAC;GACpE;EACF;EAQA,IAAI,QAAQ,YAAY,QAAQ,SAAS,QACvC,MAAM,KAAK,kBAAkB,MAAM;EAGrC,IAAI,QAAQ;GACV,IAAI,CAAC,KAAK,OAAO,QACf,MAAM,IAAI,MAAM,4CAA4C;GAC9D,KAAK,OAAO,OAAO,MAAM,MAAM;GAC/B,MAAM,KAAK,OAAO,OAAO,OAAO;EAClC,OACE,MAAM,KAAK,OAAO,MAAM,OAAO;CAEnC;CAEA,gBAAuB;EAGrB,OAAO,KAAK,QAAQ,OAAO,SAAS;CACtC;CAEA,eAAsB,aAAqB;EACzC,KAAK,QAAQ,OAAO,MAAM,WAAW;CACvC;CAEA,gBAAuB,aAAqB;EAC1C,KAAK,QAAQ,OAAO,OAAO,WAAW;CACxC;CAEA,MAAa,SAAS,QAAuC;EAC3D,IAAI,CAAC,KAAK,OAAO,UACf,MAAM,IAAI,MAAM,8CAA8C;EAEhE,KAAK,OAAO,OAAO,MAAM,QAAQ;EAKjC,MAAM,KAAK,kBAAkB,MAAM;EAEnC,MAAM,KAAK,OAAO,SAAS,OAAO,UAAU,MAAM;CACpD;CAEA,MAAa,UAAU,QAAwC;EAC7D,IAAI,CAAC,KAAK,OAAO,UACf,MAAM,IAAI,MAAM,yCAAyC;EAE3D,MAAM,KAAK,OAAO,SAAS,MAAM;CACnC;CAEA,sBAAkC;EAChC,IAAI,CAAC,KAAK,OAAO,uBACf,MAAM,IAAI,MAAM,qDAAqD;EAEvE,OAAO,KAAK,OAAO,sBAAsB;CAC3C;CAEA,oBAA2B,OAAkB;EAC3C,IAAI,CAAC,KAAK,OAAO,qBACf,MAAM,IAAI,MAAM,qDAAqD;EASvE,IAAI,KAAK,kBAAkB;GACzB,KAAK,iBAAiB,MAAM;GAC5B,KAAK,OAAO,kBAAkB,CAAC,CAAC;EAClC;EAEA,KAAK,OAAO,oBAAoB,KAAK;CACvC;CAEA,YAAyB;EACvB,IAAI,CAAC,KAAK,OAAO,UACf,MAAM,IAAI,MAAM,2CAA2C;EAE7D,KAAK,OAAO,OAAO,MAAM,YAAY;EAKrC,KAAU,kBAAkB,MAAM;EAElC,KAAK,OAAO,SAAS;EAIrB,MAAM,OAAO,KAAK,WAAW,YAAY,CAAC,CAAC,GAAG,EAAE;EAChD,IAAI,QAAQ,KAAK,SAAS,gBAAgB,KAAK,QAAQ,WAAW,GAChE,KAAK,WAAW,cAAc,KAAK,EAAE;EAGvC,IAAI,WAAW,KAAK,WAAW,YAAY;EAC3C,MAAM,kBAAkB,SAAS,SAAS,SAAS;EACnD,IACE,iBAAiB,SAAS,UAC1B,gBAAgB,OAAO,SAAS,GAAG,EAAE,CAAC,EAAE,IACxC;GACA,KAAK,WAAW,cAAc,gBAAgB,EAAE;GAChD,IAAI,CAAC,KAAK,SAAS,KAAK,KAAK,GAC3B,KAAK,SAAS,QAAQ,qBAAqB,eAAe,CAAC;GAG7D,WAAW,KAAK,WAAW,YAAY;EACzC,OACE,KAAK,mBAAmB;EAI1B,iBAAiB;GACf,KAAK,eAAe,QAAQ;EAC9B,GAAG,CAAC;CACN;CAEA,cAAqB,SAA+B;EAClD,IAAI,CAAC,KAAK,OAAO,iBACf,MAAM,IAAI,MAAM,wCAAwC;EAC1D,KAAK,OAAO,kBAAkB,OAAO;CACvC;CAEA,eAAsB,SAAgC;EAQpD,IAFE,KAAK,kBAAkB,OAAO,QAAQ,YAAY,QAAQ,OAAO,KACjE,OACW;EAEb,IAAI,KAAK,OAAO,kBAAkB;GAChC,KAAK,OAAO,iBAAiB,OAAO;GACpC;EACF;EAEA,MAAM,IAAI,MACR,aAAa,QAAQ,WAAW,4BAClC;CACF;CAEA,sBAA6B,SAAuC;EAClE,IAAI,CAAC,KAAK,OAAO,yBACf,MAAM,IAAI,MAAM,0CAA0C;EAC5D,KAAK,OAAO,wBAAwB,OAAO;CAC7C;CAEA,MAAsB,iBAAgD;EACpE,MAAM,OAAO,IAAI,kBAAkB;EACnC,KAAK,OAAO,0BAA0B,UAAU,mBAAmB,CAAC,CAAC,CAAC;EACtE,KAAK,eAAe,KAAK,YAAY,CAAC;CACxC;CAEA,OAAuB,MAAiC;EACtD,MAAM,OAAO,IAAI;EAEjB,IAAI,KAAK,OAAO,UACd,KAAK,OAAO,SAAS,KAAK,WAAW,YAAY,CAAC;CAEtD;CAEA,kBAA0B,aAAuC;EAE/D,IADqB,KAAK,OAAO,mBAAmB,KAAA,GAElD,KAAK,OAAO,cAAc,SAAS,QAAQ,wBAAwB,CAAC;OAGpE,KAAK,OAAO,cAAc,QAA2B;CAEzD;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"local-runtime-core.js","names":[],"sources":["../../../src/runtimes/local/local-runtime-core.ts"],"sourcesContent":["import { BaseAssistantRuntimeCore } from \"../../runtime/base/base-assistant-runtime-core\";\nimport { LocalThreadRuntimeCore } from \"./local-thread-runtime-core\";\nimport type { LocalRuntimeOptionsBase } from \"./local-runtime-options\";\nimport { LocalThreadListRuntimeCore } from \"./local-thread-list-runtime-core\";\nimport { ExportedMessageRepository } from \"../../runtime/utils/message-repository\";\nimport type { ThreadMessageLike } from \"../../runtime/utils/thread-message-like\";\n\nexport class LocalRuntimeCore extends BaseAssistantRuntimeCore {\n public readonly threads;\n public readonly Provider = undefined;\n\n private _options: LocalRuntimeOptionsBase;\n\n constructor(\n options: LocalRuntimeOptionsBase,\n initialMessages: readonly ThreadMessageLike[] | undefined,\n ) {\n super();\n\n this._options = options;\n\n this.threads = new LocalThreadListRuntimeCore(() => {\n return new LocalThreadRuntimeCore(this._contextProvider, this._options);\n });\n\n if (initialMessages) {\n this.threads\n .getMainThreadRuntimeCore()\n .import(ExportedMessageRepository.fromArray(initialMessages));\n }\n }\n}\n"],"mappings":";;;;;AAOA,IAAa,mBAAb,cAAsC,yBAAyB;CAC7D;CACA,WAA2B,KAAA;CAE3B;CAEA,YACE,SACA,iBACA;EACA,MAAM;EAEN,KAAK,WAAW;EAEhB,KAAK,UAAU,IAAI,iCAAiC;GAClD,OAAO,IAAI,uBAAuB,KAAK,kBAAkB,KAAK,QAAQ;EACxE,CAAC;EAED,IAAI,iBACF,KAAK,QACF,yBAAyB,EACzB,OAAO,0BAA0B,UAAU,eAAe,CAAC;CAElE;AACF"}
1
+ {"version":3,"file":"local-runtime-core.js","names":[],"sources":["../../../src/runtimes/local/local-runtime-core.ts"],"sourcesContent":["import { BaseAssistantRuntimeCore } from \"../../runtime/base/base-assistant-runtime-core\";\nimport { LocalThreadRuntimeCore } from \"./local-thread-runtime-core\";\nimport type { LocalRuntimeOptionsBase } from \"./local-runtime-options\";\nimport { LocalThreadListRuntimeCore } from \"./local-thread-list-runtime-core\";\nimport { ExportedMessageRepository } from \"../../runtime/utils/message-repository\";\nimport type { ThreadMessageLike } from \"../../runtime/utils/thread-message-like\";\n\nexport class LocalRuntimeCore extends BaseAssistantRuntimeCore {\n public readonly threads;\n public readonly Provider = undefined;\n\n private _options: LocalRuntimeOptionsBase;\n\n constructor(\n options: LocalRuntimeOptionsBase,\n initialMessages: readonly ThreadMessageLike[] | undefined,\n ) {\n super();\n\n this._options = options;\n\n this.threads = new LocalThreadListRuntimeCore(() => {\n return new LocalThreadRuntimeCore(this._contextProvider, this._options);\n });\n\n if (initialMessages) {\n this.threads\n .getMainThreadRuntimeCore()\n .import(ExportedMessageRepository.fromArray(initialMessages));\n }\n }\n}\n"],"mappings":";;;;;AAOA,IAAa,mBAAb,cAAsC,yBAAyB;CAC7D;CACA,WAA2B,KAAA;CAE3B;CAEA,YACE,SACA,iBACA;EACA,MAAM;EAEN,KAAK,WAAW;EAEhB,KAAK,UAAU,IAAI,iCAAiC;GAClD,OAAO,IAAI,uBAAuB,KAAK,kBAAkB,KAAK,QAAQ;EACxE,CAAC;EAED,IAAI,iBACF,KAAK,QACF,yBAAyB,CAAC,CAC1B,OAAO,0BAA0B,UAAU,eAAe,CAAC;CAElE;AACF"}
@@ -23,6 +23,11 @@ type LocalRuntimeOptionsBase = {
23
23
  * Names of tools that are allowed to interrupt the run in order to wait for human/external approval.
24
24
  */
25
25
  unstable_humanToolNames?: string[] | undefined;
26
+ /**
27
+ * Opt in to message queuing: a message sent during a run is held in
28
+ * `composer.queue` and sent once the run settles. Steering runs it next.
29
+ */
30
+ unstable_enableMessageQueue?: boolean | undefined;
26
31
  };
27
32
  //#endregion
28
33
  export { LocalRuntimeOptionsBase };
@@ -1 +1 @@
1
- {"version":3,"file":"local-runtime-options.d.ts","names":[],"sources":["../../../src/runtimes/local/local-runtime-options.ts"],"mappings":";;;;;;;;;KAWY,uBAAA;EACV,QAAA;EACA,QAAA;IACE,SAAA,EAAW,gBAAA;IACX,OAAA,GAAU,oBAAA;IACV,WAAA,GAAc,iBAAA;IACd,MAAA,GAAS,sBAAA;IACT,SAAA,GAAY,gBAAA;IACZ,KAAA,GAAQ,oBAAA;IACR,QAAA,GAAW,eAAA;IACX,UAAA,GAAa,iBAAA;EAAA;EAAA;;;EAMf,uBAAA;AAAA"}
1
+ {"version":3,"file":"local-runtime-options.d.ts","names":[],"sources":["../../../src/runtimes/local/local-runtime-options.ts"],"mappings":";;;;;;;;;KAWY,uBAAA;EACV,QAAA;EACA,QAAA;IACE,SAAA,EAAW,gBAAA;IACX,OAAA,GAAU,oBAAA;IACV,WAAA,GAAc,iBAAA;IACd,MAAA,GAAS,sBAAA;IACT,SAAA,GAAY,gBAAA;IACZ,KAAA,GAAQ,oBAAA;IACR,QAAA,GAAW,eAAA;IACX,UAAA,GAAa,iBAAA;EAAA;EAAA;;;EAMf,uBAAA;EAdA;;;;EAoBA,2BAAA;AAAA"}
@@ -5,6 +5,7 @@ import { DictationAdapter, SpeechSynthesisAdapter } from "../../adapters/speech.
5
5
  import { RealtimeVoiceAdapter } from "../../adapters/voice.js";
6
6
  import { ModelContextProvider } from "../../model-context/types.js";
7
7
  import { ChatModelAdapter } from "../../runtime/utils/chat-model-adapter.js";
8
+ import { QueueItemState } from "../../store/scopes/queue-item.js";
8
9
  import { AddToolResultOptions, RespondToToolApprovalOptions, ResumeRunConfig, ResumeToolCallOptions, StartRunConfig, ThreadRuntimeCore, ThreadSuggestion } from "../../runtime/interfaces/thread-runtime-core.js";
9
10
  import { SuggestionAdapter } from "../../adapters/suggestion.js";
10
11
  import { ThreadHistoryAdapter } from "../../adapters/thread-history.js";
@@ -27,6 +28,8 @@ declare class LocalThreadRuntimeCore extends BaseThreadRuntimeCore implements Th
27
28
  queue: boolean;
28
29
  };
29
30
  private abortController;
31
+ private _queue;
32
+ private _queueRunInFlight;
30
33
  readonly isDisabled = false;
31
34
  readonly isSendDisabled = false;
32
35
  private _isLoading;
@@ -56,6 +59,10 @@ declare class LocalThreadRuntimeCore extends BaseThreadRuntimeCore implements Th
56
59
  private _loadPromise;
57
60
  __internal_load(): Promise<void>;
58
61
  append(message: AppendMessage): Promise<void>;
62
+ getQueueItems(): readonly QueueItemState[];
63
+ steerQueueItem(queueItemId: string): void;
64
+ removeQueueItem(queueItemId: string): void;
65
+ private _runAppend;
59
66
  resumeRun({
60
67
  stream,
61
68
  ...startConfig
@@ -1 +1 @@
1
- {"version":3,"file":"local-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/local/local-thread-runtime-core.ts"],"mappings":";;;;;;;;;;;;;cAmCa,sBAAA,SACH,qBAAA,YACG,iBAAA;EAAA,SAEK,YAAA;;;;;;;;;;;;;;UAeR,eAAA;EAAA,SAEQ,UAAA;EAAA,SACA,cAAA;EAAA,QAER,UAAA;EAAA,IACG,SAAA;EAAA,QAIH,YAAA;EAAA,QACA,sBAAA;EAAA,IACG,WAAA,aAAwB,gBAAA;EAAA,IAIxB,QAAA;;;;;;;;;;cAKT,eAAA,EAAiB,oBAAA,EACjB,OAAA,EAAS,uBAAA;EAAA,QAMH,QAAA;EAAA,QAEA,cAAA;EAAA,QAEA,YAAA;EAED,yBAAA,CAA0B,WAAA;EAAA,QAIzB,qBAAA;EAED,kCAAA,CACL,UAAA,QAAkB,OAAA;EAAA,IAKT,MAAA;EAIJ,qBAAA,CAAsB,OAAA,EAAS,uBAAA;EAAA,QAwC9B,YAAA;EACD,eAAA,IAAe,OAAA;EAuCT,MAAA,CAAO,OAAA,EAAS,aAAA,GAAgB,OAAA;EAgCtC,SAAA;IAAY,MAAA;IAAA,GAAW;EAAA,GAAe,eAAA,GAAkB,OAAA;EAMxD,mBAAA;EAIA,mBAAA;EAIM,QAAA;IACT,QAAA;IAAU;EAAA,GAAa,cAAA,EACzB,WAAA,GAAc,gBAAA,UACb,OAAA;EAAA,QAkEW,gBAAA;EAgLP,MAAA;EAMA,SAAA;EAMA,aAAA;IACL,SAAA;IACA,UAAA;IACA,MAAA;IACA,OAAA;IACA;EAAA,GACC,oBAAA;EA0CI,cAAA,CAAe,QAAA,EAAU,qBAAA;EAIzB,qBAAA,CAAsB,QAAA,EAAU,4BAAA;AAAA"}
1
+ {"version":3,"file":"local-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/local/local-thread-runtime-core.ts"],"mappings":";;;;;;;;;;;;;;cA2Ca,sBAAA,SACH,qBAAA,YACG,iBAAA;EAAA,SAEK,YAAA;;;;;;;;;;;;;;UAeR,eAAA;EAAA,QAEA,MAAA;EAAA,QACA,iBAAA;EAAA,SAEQ,UAAA;EAAA,SACA,cAAA;EAAA,QAER,UAAA;EAAA,IACG,SAAA;EAAA,QAIH,YAAA;EAAA,QACA,sBAAA;EAAA,IACG,WAAA,aAAwB,gBAAA;EAAA,IAIxB,QAAA;;;;;;;;;;cAKT,eAAA,EAAiB,oBAAA,EACjB,OAAA,EAAS,uBAAA;EAAA,QAMH,QAAA;EAAA,QAEA,cAAA;EAAA,QAEA,YAAA;EAED,yBAAA,CAA0B,WAAA;EAAA,QAIzB,qBAAA;EAED,kCAAA,CACL,UAAA,QAAkB,OAAA;EAAA,IAKT,MAAA;EAIJ,qBAAA,CAAsB,OAAA,EAAS,uBAAA;EAAA,QAiE9B,YAAA;EACD,eAAA,IAAe,OAAA;EAuCT,MAAA,CAAO,OAAA,EAAS,aAAA,GAAgB,OAAA;EAWtC,aAAA,aAA0B,cAAA;EAM1B,cAAA,CAAe,WAAA;EAIf,eAAA,CAAgB,WAAA;EAAA,QAIT,UAAA;EAgCP,SAAA;IAAY,MAAA;IAAA,GAAW;EAAA,GAAe,eAAA,GAAkB,OAAA;EAMxD,mBAAA;EAIA,mBAAA;EAIM,QAAA;IACT,QAAA;IAAU;EAAA,GAAa,cAAA,EACzB,WAAA,GAAc,gBAAA,UACb,OAAA;EAAA,QAyEW,gBAAA;EAgLP,MAAA;EAOA,SAAA;EAOA,aAAA;IACL,SAAA;IACA,UAAA;IACA,MAAA;IACA,OAAA;IACA;EAAA,GACC,oBAAA;EA0CI,cAAA,CAAe,QAAA,EAAU,qBAAA;EAIzB,qBAAA,CAAsB,QAAA,EAAU,4BAAA;AAAA"}