@assistant-ui/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (599) hide show
  1. package/dist/adapters/attachment.d.ts +36 -0
  2. package/dist/adapters/attachment.d.ts.map +1 -0
  3. package/dist/adapters/attachment.js +148 -0
  4. package/dist/adapters/attachment.js.map +1 -0
  5. package/dist/adapters/feedback.d.ts +10 -0
  6. package/dist/adapters/feedback.d.ts.map +1 -0
  7. package/dist/adapters/feedback.js +2 -0
  8. package/dist/adapters/feedback.js.map +1 -0
  9. package/dist/adapters/index.d.ts +8 -0
  10. package/dist/adapters/index.d.ts.map +1 -0
  11. package/dist/adapters/index.js +3 -0
  12. package/dist/adapters/index.js.map +1 -0
  13. package/dist/adapters/speech.d.ts +76 -0
  14. package/dist/adapters/speech.d.ts.map +1 -0
  15. package/dist/adapters/speech.js +179 -0
  16. package/dist/adapters/speech.js.map +1 -0
  17. package/dist/adapters/suggestion.d.ts +10 -0
  18. package/dist/adapters/suggestion.d.ts.map +1 -0
  19. package/dist/adapters/suggestion.js +2 -0
  20. package/dist/adapters/suggestion.js.map +1 -0
  21. package/dist/adapters/thread-history.d.ts +43 -0
  22. package/dist/adapters/thread-history.d.ts.map +1 -0
  23. package/dist/adapters/thread-history.js +2 -0
  24. package/dist/adapters/thread-history.js.map +1 -0
  25. package/dist/index.d.ts +6 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +7 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/internal.d.ts +5 -0
  30. package/dist/internal.d.ts.map +1 -0
  31. package/dist/internal.js +7 -0
  32. package/dist/internal.js.map +1 -0
  33. package/dist/model-context/frame/host.d.ts +21 -0
  34. package/dist/model-context/frame/host.d.ts.map +1 -0
  35. package/dist/model-context/frame/host.js +141 -0
  36. package/dist/model-context/frame/host.js.map +1 -0
  37. package/dist/model-context/frame/index.d.ts +5 -0
  38. package/dist/model-context/frame/index.d.ts.map +1 -0
  39. package/dist/model-context/frame/index.js +4 -0
  40. package/dist/model-context/frame/index.js.map +1 -0
  41. package/dist/model-context/frame/provider.d.ts +18 -0
  42. package/dist/model-context/frame/provider.d.ts.map +1 -0
  43. package/dist/model-context/frame/provider.js +133 -0
  44. package/dist/model-context/frame/provider.js.map +1 -0
  45. package/dist/model-context/frame/types.d.ts +29 -0
  46. package/dist/model-context/frame/types.d.ts.map +1 -0
  47. package/dist/model-context/frame/types.js +2 -0
  48. package/dist/model-context/frame/types.js.map +1 -0
  49. package/dist/model-context/index.d.ts +8 -0
  50. package/dist/model-context/index.d.ts.map +1 -0
  51. package/dist/model-context/index.js +9 -0
  52. package/dist/model-context/index.js.map +1 -0
  53. package/dist/model-context/registry-handles.d.ts +13 -0
  54. package/dist/model-context/registry-handles.d.ts.map +1 -0
  55. package/dist/model-context/registry-handles.js +2 -0
  56. package/dist/model-context/registry-handles.js.map +1 -0
  57. package/dist/model-context/registry.d.ts +17 -0
  58. package/dist/model-context/registry.d.ts.map +1 -0
  59. package/dist/model-context/registry.js +108 -0
  60. package/dist/model-context/registry.js.map +1 -0
  61. package/dist/model-context/tool.d.ts +3 -0
  62. package/dist/model-context/tool.d.ts.map +1 -0
  63. package/dist/model-context/tool.js +5 -0
  64. package/dist/model-context/tool.js.map +1 -0
  65. package/dist/model-context/types.d.ts +37 -0
  66. package/dist/model-context/types.d.ts.map +1 -0
  67. package/dist/model-context/types.js +43 -0
  68. package/dist/model-context/types.js.map +1 -0
  69. package/dist/runtime/api/assistant-runtime.d.ts +64 -0
  70. package/dist/runtime/api/assistant-runtime.d.ts.map +1 -0
  71. package/dist/runtime/api/assistant-runtime.js +46 -0
  72. package/dist/runtime/api/assistant-runtime.js.map +1 -0
  73. package/dist/runtime/api/attachment-runtime.d.ts +63 -0
  74. package/dist/runtime/api/attachment-runtime.d.ts.map +1 -0
  75. package/dist/runtime/api/attachment-runtime.js +56 -0
  76. package/dist/runtime/api/attachment-runtime.js.map +1 -0
  77. package/dist/runtime/api/bindings.d.ts +31 -0
  78. package/dist/runtime/api/bindings.d.ts.map +1 -0
  79. package/dist/runtime/api/bindings.js +2 -0
  80. package/dist/runtime/api/bindings.js.map +1 -0
  81. package/dist/runtime/api/composer-runtime.d.ts +181 -0
  82. package/dist/runtime/api/composer-runtime.d.ts.map +1 -0
  83. package/dist/runtime/api/composer-runtime.js +247 -0
  84. package/dist/runtime/api/composer-runtime.js.map +1 -0
  85. package/dist/runtime/api/message-part-runtime.d.ts +31 -0
  86. package/dist/runtime/api/message-part-runtime.d.ts.map +1 -0
  87. package/dist/runtime/api/message-part-runtime.js +67 -0
  88. package/dist/runtime/api/message-part-runtime.js.map +1 -0
  89. package/dist/runtime/api/message-runtime.d.ts +91 -0
  90. package/dist/runtime/api/message-runtime.d.ts.map +1 -0
  91. package/dist/runtime/api/message-runtime.js +199 -0
  92. package/dist/runtime/api/message-runtime.js.map +1 -0
  93. package/dist/runtime/api/paths.d.ts +64 -0
  94. package/dist/runtime/api/paths.d.ts.map +1 -0
  95. package/dist/runtime/api/paths.js +2 -0
  96. package/dist/runtime/api/paths.js.map +1 -0
  97. package/dist/runtime/api/thread-list-item-runtime.d.ts +50 -0
  98. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -0
  99. package/dist/runtime/api/thread-list-item-runtime.js +85 -0
  100. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -0
  101. package/dist/runtime/api/thread-list-runtime.d.ts +44 -0
  102. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -0
  103. package/dist/runtime/api/thread-list-runtime.js +136 -0
  104. package/dist/runtime/api/thread-list-runtime.js.map +1 -0
  105. package/dist/runtime/api/thread-runtime.d.ts +272 -0
  106. package/dist/runtime/api/thread-runtime.d.ts.map +1 -0
  107. package/dist/runtime/api/thread-runtime.js +240 -0
  108. package/dist/runtime/api/thread-runtime.js.map +1 -0
  109. package/dist/runtime/base/base-assistant-runtime-core.d.ts +12 -0
  110. package/dist/runtime/base/base-assistant-runtime-core.d.ts.map +1 -0
  111. package/dist/runtime/base/base-assistant-runtime-core.js +11 -0
  112. package/dist/runtime/base/base-assistant-runtime-core.js.map +1 -0
  113. package/dist/runtime/base/base-composer-runtime-core.d.ts +55 -0
  114. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -0
  115. package/dist/runtime/base/base-composer-runtime-core.js +320 -0
  116. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -0
  117. package/dist/runtime/base/base-thread-runtime-core.d.ts +67 -0
  118. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -0
  119. package/dist/runtime/base/base-thread-runtime-core.js +157 -0
  120. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -0
  121. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts +28 -0
  122. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts.map +1 -0
  123. package/dist/runtime/base/default-edit-composer-runtime-core.js +49 -0
  124. package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -0
  125. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +24 -0
  126. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -0
  127. package/dist/runtime/base/default-thread-composer-runtime-core.js +41 -0
  128. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -0
  129. package/dist/runtime/index.d.ts +20 -0
  130. package/dist/runtime/index.d.ts.map +1 -0
  131. package/dist/runtime/index.js +7 -0
  132. package/dist/runtime/index.js.map +1 -0
  133. package/dist/runtime/interfaces/assistant-runtime-core.d.ts +10 -0
  134. package/dist/runtime/interfaces/assistant-runtime-core.d.ts.map +1 -0
  135. package/dist/runtime/interfaces/assistant-runtime-core.js +2 -0
  136. package/dist/runtime/interfaces/assistant-runtime-core.js.map +1 -0
  137. package/dist/runtime/interfaces/composer-runtime-core.d.ts +38 -0
  138. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -0
  139. package/dist/runtime/interfaces/composer-runtime-core.js +2 -0
  140. package/dist/runtime/interfaces/composer-runtime-core.js.map +1 -0
  141. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +37 -0
  142. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -0
  143. package/dist/runtime/interfaces/thread-list-runtime-core.js +2 -0
  144. package/dist/runtime/interfaces/thread-list-runtime-core.js.map +1 -0
  145. package/dist/runtime/interfaces/thread-runtime-core.d.ts +97 -0
  146. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -0
  147. package/dist/runtime/interfaces/thread-runtime-core.js +2 -0
  148. package/dist/runtime/interfaces/thread-runtime-core.js.map +1 -0
  149. package/dist/runtime/internal.d.ts +23 -0
  150. package/dist/runtime/internal.d.ts.map +1 -0
  151. package/dist/runtime/internal.js +25 -0
  152. package/dist/runtime/internal.js.map +1 -0
  153. package/dist/runtime/utils/auto-status.d.ts +5 -0
  154. package/dist/runtime/utils/auto-status.d.ts.map +1 -0
  155. package/dist/runtime/utils/auto-status.js +32 -0
  156. package/dist/runtime/utils/auto-status.js.map +1 -0
  157. package/dist/runtime/utils/chat-model-adapter.d.ts +40 -0
  158. package/dist/runtime/utils/chat-model-adapter.d.ts.map +1 -0
  159. package/dist/runtime/utils/chat-model-adapter.js +2 -0
  160. package/dist/runtime/utils/chat-model-adapter.js.map +1 -0
  161. package/dist/runtime/utils/external-store-message.d.ts +10 -0
  162. package/dist/runtime/utils/external-store-message.d.ts.map +1 -0
  163. package/dist/runtime/utils/external-store-message.js +22 -0
  164. package/dist/runtime/utils/external-store-message.js.map +1 -0
  165. package/dist/runtime/utils/message-repository.d.ts +43 -0
  166. package/dist/runtime/utils/message-repository.d.ts.map +1 -0
  167. package/dist/runtime/utils/message-repository.js +257 -0
  168. package/dist/runtime/utils/message-repository.js.map +1 -0
  169. package/dist/runtime/utils/thread-message-like.d.ts +34 -0
  170. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -0
  171. package/dist/runtime/utils/thread-message-like.js +129 -0
  172. package/dist/runtime/utils/thread-message-like.js.map +1 -0
  173. package/dist/runtimes/assistant-transport/utils.d.ts +11 -0
  174. package/dist/runtimes/assistant-transport/utils.d.ts.map +1 -0
  175. package/dist/runtimes/assistant-transport/utils.js +20 -0
  176. package/dist/runtimes/assistant-transport/utils.js.map +1 -0
  177. package/dist/runtimes/external-store/external-store-adapter.d.ts +81 -0
  178. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -0
  179. package/dist/runtimes/external-store/external-store-adapter.js +2 -0
  180. package/dist/runtimes/external-store/external-store-adapter.js.map +1 -0
  181. package/dist/runtimes/external-store/external-store-runtime-core.d.ts +9 -0
  182. package/dist/runtimes/external-store/external-store-runtime-core.d.ts.map +1 -0
  183. package/dist/runtimes/external-store/external-store-runtime-core.js +19 -0
  184. package/dist/runtimes/external-store/external-store-runtime-core.js.map +1 -0
  185. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +42 -0
  186. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -0
  187. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +174 -0
  188. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -0
  189. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +47 -0
  190. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -0
  191. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +260 -0
  192. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -0
  193. package/dist/runtimes/external-store/index.d.ts +8 -0
  194. package/dist/runtimes/external-store/index.d.ts.map +1 -0
  195. package/dist/runtimes/external-store/index.js +5 -0
  196. package/dist/runtimes/external-store/index.js.map +1 -0
  197. package/dist/runtimes/external-store/thread-message-converter.d.ts +7 -0
  198. package/dist/runtimes/external-store/thread-message-converter.d.ts.map +1 -0
  199. package/dist/runtimes/external-store/thread-message-converter.js +12 -0
  200. package/dist/runtimes/external-store/thread-message-converter.js.map +1 -0
  201. package/dist/runtimes/index.d.ts +6 -0
  202. package/dist/runtimes/index.d.ts.map +1 -0
  203. package/dist/runtimes/index.js +4 -0
  204. package/dist/runtimes/index.js.map +1 -0
  205. package/dist/runtimes/internal.d.ts +18 -0
  206. package/dist/runtimes/internal.d.ts.map +1 -0
  207. package/dist/runtimes/internal.js +15 -0
  208. package/dist/runtimes/internal.js.map +1 -0
  209. package/dist/runtimes/local/index.d.ts +7 -0
  210. package/dist/runtimes/local/index.d.ts.map +1 -0
  211. package/dist/runtimes/local/index.js +5 -0
  212. package/dist/runtimes/local/index.js.map +1 -0
  213. package/dist/runtimes/local/local-runtime-core.d.ts +11 -0
  214. package/dist/runtimes/local/local-runtime-core.d.ts.map +1 -0
  215. package/dist/runtimes/local/local-runtime-core.js +22 -0
  216. package/dist/runtimes/local/local-runtime-core.js.map +1 -0
  217. package/dist/runtimes/local/local-runtime-options.d.ts +23 -0
  218. package/dist/runtimes/local/local-runtime-options.d.ts.map +1 -0
  219. package/dist/runtimes/local/local-runtime-options.js +2 -0
  220. package/dist/runtimes/local/local-runtime-options.js.map +1 -0
  221. package/dist/runtimes/local/local-thread-list-runtime-core.d.ts +46 -0
  222. package/dist/runtimes/local/local-thread-list-runtime-core.d.ts.map +1 -0
  223. package/dist/runtimes/local/local-thread-list-runtime-core.js +87 -0
  224. package/dist/runtimes/local/local-thread-list-runtime-core.js.map +1 -0
  225. package/dist/runtimes/local/local-thread-runtime-core.d.ts +59 -0
  226. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -0
  227. package/dist/runtimes/local/local-thread-runtime-core.js +423 -0
  228. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -0
  229. package/dist/runtimes/local/should-continue.d.ts +3 -0
  230. package/dist/runtimes/local/should-continue.d.ts.map +1 -0
  231. package/dist/runtimes/local/should-continue.js +14 -0
  232. package/dist/runtimes/local/should-continue.js.map +1 -0
  233. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts +13 -0
  234. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts.map +1 -0
  235. package/dist/runtimes/remote-thread-list/adapter/in-memory.js +29 -0
  236. package/dist/runtimes/remote-thread-list/adapter/in-memory.js.map +1 -0
  237. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts +3 -0
  238. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -0
  239. package/dist/runtimes/remote-thread-list/empty-thread-core.js +146 -0
  240. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -0
  241. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts +23 -0
  242. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts.map +1 -0
  243. package/dist/runtimes/remote-thread-list/optimistic-state.js +57 -0
  244. package/dist/runtimes/remote-thread-list/optimistic-state.js.map +1 -0
  245. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +37 -0
  246. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -0
  247. package/dist/runtimes/remote-thread-list/remote-thread-state.js +62 -0
  248. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -0
  249. package/dist/runtimes/remote-thread-list/types.d.ts +38 -0
  250. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -0
  251. package/dist/runtimes/remote-thread-list/types.js +2 -0
  252. package/dist/runtimes/remote-thread-list/types.js.map +1 -0
  253. package/dist/store/clients/chain-of-thought-client.d.ts +15 -0
  254. package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -0
  255. package/dist/store/clients/chain-of-thought-client.js +18 -0
  256. package/dist/store/clients/chain-of-thought-client.js.map +1 -0
  257. package/dist/store/clients/index.d.ts +6 -0
  258. package/dist/store/clients/index.d.ts.map +1 -0
  259. package/dist/store/clients/index.js +6 -0
  260. package/dist/store/clients/index.js.map +1 -0
  261. package/dist/store/clients/model-context-client.d.ts +3 -0
  262. package/dist/store/clients/model-context-client.d.ts.map +1 -0
  263. package/dist/store/clients/model-context-client.js +14 -0
  264. package/dist/store/clients/model-context-client.js.map +1 -0
  265. package/dist/store/clients/no-op-composer-client.d.ts +7 -0
  266. package/dist/store/clients/no-op-composer-client.d.ts.map +1 -0
  267. package/dist/store/clients/no-op-composer-client.js +61 -0
  268. package/dist/store/clients/no-op-composer-client.js.map +1 -0
  269. package/dist/store/clients/suggestions.d.ts +11 -0
  270. package/dist/store/clients/suggestions.d.ts.map +1 -0
  271. package/dist/store/clients/suggestions.js +37 -0
  272. package/dist/store/clients/suggestions.js.map +1 -0
  273. package/dist/store/clients/thread-message-client.d.ts +11 -0
  274. package/dist/store/clients/thread-message-client.d.ts.map +1 -0
  275. package/dist/store/clients/thread-message-client.js +112 -0
  276. package/dist/store/clients/thread-message-client.js.map +1 -0
  277. package/dist/store/index.d.ts +14 -0
  278. package/dist/store/index.d.ts.map +1 -0
  279. package/dist/store/index.js +14 -0
  280. package/dist/store/index.js.map +1 -0
  281. package/dist/store/internal.d.ts +11 -0
  282. package/dist/store/internal.d.ts.map +1 -0
  283. package/dist/store/internal.js +12 -0
  284. package/dist/store/internal.js.map +1 -0
  285. package/dist/store/runtime-clients/attachment-runtime-client.d.ts +8 -0
  286. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -0
  287. package/dist/store/runtime-clients/attachment-runtime-client.js +11 -0
  288. package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -0
  289. package/dist/store/runtime-clients/composer-runtime-client.d.ts +13 -0
  290. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -0
  291. package/dist/store/runtime-clients/composer-runtime-client.js +83 -0
  292. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -0
  293. package/dist/store/runtime-clients/index.d.ts +8 -0
  294. package/dist/store/runtime-clients/index.d.ts.map +1 -0
  295. package/dist/store/runtime-clients/index.js +8 -0
  296. package/dist/store/runtime-clients/index.js.map +1 -0
  297. package/dist/store/runtime-clients/message-part-runtime-client.d.ts +8 -0
  298. package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -0
  299. package/dist/store/runtime-clients/message-part-runtime-client.js +12 -0
  300. package/dist/store/runtime-clients/message-part-runtime-client.js.map +1 -0
  301. package/dist/store/runtime-clients/message-runtime-client.d.ts +11 -0
  302. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -0
  303. package/dist/store/runtime-clients/message-runtime-client.js +78 -0
  304. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -0
  305. package/dist/store/runtime-clients/tap-subscribable.d.ts +3 -0
  306. package/dist/store/runtime-clients/tap-subscribable.d.ts.map +1 -0
  307. package/dist/store/runtime-clients/tap-subscribable.js +12 -0
  308. package/dist/store/runtime-clients/tap-subscribable.js.map +1 -0
  309. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts +8 -0
  310. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -0
  311. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +41 -0
  312. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -0
  313. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts +10 -0
  314. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -0
  315. package/dist/store/runtime-clients/thread-list-runtime-client.js +54 -0
  316. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -0
  317. package/dist/store/runtime-clients/thread-runtime-client.d.ts +8 -0
  318. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -0
  319. package/dist/store/runtime-clients/thread-runtime-client.js +91 -0
  320. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -0
  321. package/dist/store/scopes/attachment.d.ts +23 -0
  322. package/dist/store/scopes/attachment.d.ts.map +1 -0
  323. package/dist/store/scopes/attachment.js +2 -0
  324. package/dist/store/scopes/attachment.js.map +1 -0
  325. package/dist/store/scopes/chain-of-thought.d.ts +39 -0
  326. package/dist/store/scopes/chain-of-thought.d.ts.map +1 -0
  327. package/dist/store/scopes/chain-of-thought.js +2 -0
  328. package/dist/store/scopes/chain-of-thought.js.map +1 -0
  329. package/dist/store/scopes/composer.d.ts +75 -0
  330. package/dist/store/scopes/composer.d.ts.map +1 -0
  331. package/dist/store/scopes/composer.js +2 -0
  332. package/dist/store/scopes/composer.js.map +1 -0
  333. package/dist/store/scopes/index.d.ts +12 -0
  334. package/dist/store/scopes/index.d.ts.map +1 -0
  335. package/dist/store/scopes/index.js +2 -0
  336. package/dist/store/scopes/index.js.map +1 -0
  337. package/dist/store/scopes/message.d.ts +86 -0
  338. package/dist/store/scopes/message.d.ts.map +1 -0
  339. package/dist/store/scopes/message.js +2 -0
  340. package/dist/store/scopes/message.js.map +1 -0
  341. package/dist/store/scopes/model-context.d.ts +11 -0
  342. package/dist/store/scopes/model-context.d.ts.map +1 -0
  343. package/dist/store/scopes/model-context.js +2 -0
  344. package/dist/store/scopes/model-context.js.map +1 -0
  345. package/dist/store/scopes/part.d.ts +44 -0
  346. package/dist/store/scopes/part.d.ts.map +1 -0
  347. package/dist/store/scopes/part.js +2 -0
  348. package/dist/store/scopes/part.js.map +1 -0
  349. package/dist/store/scopes/suggestion.d.ts +19 -0
  350. package/dist/store/scopes/suggestion.d.ts.map +1 -0
  351. package/dist/store/scopes/suggestion.js +2 -0
  352. package/dist/store/scopes/suggestion.js.map +1 -0
  353. package/dist/store/scopes/suggestions.d.ts +19 -0
  354. package/dist/store/scopes/suggestions.d.ts.map +1 -0
  355. package/dist/store/scopes/suggestions.js +2 -0
  356. package/dist/store/scopes/suggestions.js.map +1 -0
  357. package/dist/store/scopes/thread-list-item.d.ts +50 -0
  358. package/dist/store/scopes/thread-list-item.d.ts.map +1 -0
  359. package/dist/store/scopes/thread-list-item.js +2 -0
  360. package/dist/store/scopes/thread-list-item.js.map +1 -0
  361. package/dist/store/scopes/thread.d.ts +135 -0
  362. package/dist/store/scopes/thread.d.ts.map +1 -0
  363. package/dist/store/scopes/thread.js +2 -0
  364. package/dist/store/scopes/thread.js.map +1 -0
  365. package/dist/store/scopes/threads.d.ts +29 -0
  366. package/dist/store/scopes/threads.d.ts.map +1 -0
  367. package/dist/store/scopes/threads.js +2 -0
  368. package/dist/store/scopes/threads.js.map +1 -0
  369. package/dist/store/types/client.d.ts +137 -0
  370. package/dist/store/types/client.d.ts.map +1 -0
  371. package/dist/store/types/client.js +2 -0
  372. package/dist/store/types/client.js.map +1 -0
  373. package/dist/store/types/events.d.ts +33 -0
  374. package/dist/store/types/events.d.ts.map +1 -0
  375. package/dist/store/types/events.js +8 -0
  376. package/dist/store/types/events.js.map +1 -0
  377. package/dist/store/types/index.d.ts +3 -0
  378. package/dist/store/types/index.d.ts.map +1 -0
  379. package/dist/store/types/index.js +2 -0
  380. package/dist/store/types/index.js.map +1 -0
  381. package/dist/store/utils/attach-transform-scopes.d.ts +11 -0
  382. package/dist/store/utils/attach-transform-scopes.d.ts.map +1 -0
  383. package/dist/store/utils/attach-transform-scopes.js +12 -0
  384. package/dist/store/utils/attach-transform-scopes.js.map +1 -0
  385. package/dist/store/utils/base-proxy-handler.d.ts +23 -0
  386. package/dist/store/utils/base-proxy-handler.d.ts.map +1 -0
  387. package/dist/store/utils/base-proxy-handler.js +46 -0
  388. package/dist/store/utils/base-proxy-handler.js.map +1 -0
  389. package/dist/store/utils/derived.d.ts +34 -0
  390. package/dist/store/utils/derived.d.ts.map +1 -0
  391. package/dist/store/utils/derived.js +24 -0
  392. package/dist/store/utils/derived.js.map +1 -0
  393. package/dist/store/utils/index.d.ts +7 -0
  394. package/dist/store/utils/index.d.ts.map +1 -0
  395. package/dist/store/utils/index.js +7 -0
  396. package/dist/store/utils/index.js.map +1 -0
  397. package/dist/store/utils/notification-manager.d.ts +11 -0
  398. package/dist/store/utils/notification-manager.d.ts.map +1 -0
  399. package/dist/store/utils/notification-manager.js +84 -0
  400. package/dist/store/utils/notification-manager.js.map +1 -0
  401. package/dist/store/utils/proxied-assistant-state.d.ts +8 -0
  402. package/dist/store/utils/proxied-assistant-state.d.ts.map +1 -0
  403. package/dist/store/utils/proxied-assistant-state.js +33 -0
  404. package/dist/store/utils/proxied-assistant-state.js.map +1 -0
  405. package/dist/store/utils/split-clients.d.ts +10 -0
  406. package/dist/store/utils/split-clients.d.ts.map +1 -0
  407. package/dist/store/utils/split-clients.js +53 -0
  408. package/dist/store/utils/split-clients.js.map +1 -0
  409. package/dist/store/utils/tap-assistant-context.d.ts +19 -0
  410. package/dist/store/utils/tap-assistant-context.d.ts.map +1 -0
  411. package/dist/store/utils/tap-assistant-context.js +23 -0
  412. package/dist/store/utils/tap-assistant-context.js.map +1 -0
  413. package/dist/store/utils/tap-client-list.d.ts +28 -0
  414. package/dist/store/utils/tap-client-list.d.ts.map +1 -0
  415. package/dist/store/utils/tap-client-list.js +68 -0
  416. package/dist/store/utils/tap-client-list.js.map +1 -0
  417. package/dist/store/utils/tap-client-lookup.d.ts +15 -0
  418. package/dist/store/utils/tap-client-lookup.d.ts.map +1 -0
  419. package/dist/store/utils/tap-client-lookup.js +42 -0
  420. package/dist/store/utils/tap-client-lookup.js.map +1 -0
  421. package/dist/store/utils/tap-client-resource.d.ts +13 -0
  422. package/dist/store/utils/tap-client-resource.d.ts.map +1 -0
  423. package/dist/store/utils/tap-client-resource.js +114 -0
  424. package/dist/store/utils/tap-client-resource.js.map +1 -0
  425. package/dist/store/utils/tap-client-stack-context.d.ts +23 -0
  426. package/dist/store/utils/tap-client-stack-context.d.ts.map +1 -0
  427. package/dist/store/utils/tap-client-stack-context.js +28 -0
  428. package/dist/store/utils/tap-client-stack-context.js.map +1 -0
  429. package/dist/store/utils/wrapper-resource.d.ts +3 -0
  430. package/dist/store/utils/wrapper-resource.d.ts.map +1 -0
  431. package/dist/store/utils/wrapper-resource.js +11 -0
  432. package/dist/store/utils/wrapper-resource.js.map +1 -0
  433. package/dist/subscribable/index.d.ts +3 -0
  434. package/dist/subscribable/index.d.ts.map +1 -0
  435. package/dist/subscribable/index.js +8 -0
  436. package/dist/subscribable/index.js.map +1 -0
  437. package/dist/subscribable/subscribable.d.ts +68 -0
  438. package/dist/subscribable/subscribable.d.ts.map +1 -0
  439. package/dist/subscribable/subscribable.js +237 -0
  440. package/dist/subscribable/subscribable.js.map +1 -0
  441. package/dist/types/attachment.d.ts +35 -0
  442. package/dist/types/attachment.d.ts.map +1 -0
  443. package/dist/types/attachment.js +2 -0
  444. package/dist/types/attachment.js.map +1 -0
  445. package/dist/types/index.d.ts +5 -0
  446. package/dist/types/index.d.ts.map +1 -0
  447. package/dist/types/index.js +2 -0
  448. package/dist/types/index.js.map +1 -0
  449. package/dist/types/message.d.ts +179 -0
  450. package/dist/types/message.d.ts.map +1 -0
  451. package/dist/types/message.js +2 -0
  452. package/dist/types/message.js.map +1 -0
  453. package/dist/types/quote.d.ts +5 -0
  454. package/dist/types/quote.d.ts.map +1 -0
  455. package/dist/types/quote.js +2 -0
  456. package/dist/types/quote.js.map +1 -0
  457. package/dist/types/unsubscribe.d.ts +2 -0
  458. package/dist/types/unsubscribe.d.ts.map +1 -0
  459. package/dist/types/unsubscribe.js +2 -0
  460. package/dist/types/unsubscribe.js.map +1 -0
  461. package/dist/utils/composite-context-provider.d.ts +10 -0
  462. package/dist/utils/composite-context-provider.d.ts.map +1 -0
  463. package/dist/utils/composite-context-provider.js +29 -0
  464. package/dist/utils/composite-context-provider.js.map +1 -0
  465. package/dist/utils/id.d.ts +6 -0
  466. package/dist/utils/id.d.ts.map +1 -0
  467. package/dist/utils/id.js +9 -0
  468. package/dist/utils/id.js.map +1 -0
  469. package/dist/utils/index.d.ts +4 -0
  470. package/dist/utils/index.d.ts.map +1 -0
  471. package/dist/utils/index.js +7 -0
  472. package/dist/utils/index.js.map +1 -0
  473. package/dist/utils/text.d.ts +3 -0
  474. package/dist/utils/text.d.ts.map +1 -0
  475. package/dist/utils/text.js +5 -0
  476. package/dist/utils/text.js.map +1 -0
  477. package/package.json +85 -0
  478. package/src/adapters/attachment.ts +209 -0
  479. package/src/adapters/feedback.ts +10 -0
  480. package/src/adapters/index.ts +30 -0
  481. package/src/adapters/speech.ts +338 -0
  482. package/src/adapters/suggestion.ts +14 -0
  483. package/src/adapters/thread-history.ts +72 -0
  484. package/src/index.ts +7 -0
  485. package/src/internal.ts +7 -0
  486. package/src/model-context/frame/host.ts +195 -0
  487. package/src/model-context/frame/index.ts +10 -0
  488. package/src/model-context/frame/provider.ts +193 -0
  489. package/src/model-context/frame/types.ts +40 -0
  490. package/src/model-context/index.ts +35 -0
  491. package/src/model-context/registry-handles.ts +18 -0
  492. package/src/model-context/registry.ts +159 -0
  493. package/src/model-context/tool.ts +9 -0
  494. package/src/model-context/types.ts +104 -0
  495. package/src/runtime/api/assistant-runtime.ts +115 -0
  496. package/src/runtime/api/attachment-runtime.ts +119 -0
  497. package/src/runtime/api/bindings.ts +49 -0
  498. package/src/runtime/api/composer-runtime.ts +505 -0
  499. package/src/runtime/api/message-part-runtime.ts +108 -0
  500. package/src/runtime/api/message-runtime.ts +335 -0
  501. package/src/runtime/api/paths.ts +61 -0
  502. package/src/runtime/api/thread-list-item-runtime.ts +145 -0
  503. package/src/runtime/api/thread-list-runtime.ts +227 -0
  504. package/src/runtime/api/thread-runtime.ts +568 -0
  505. package/src/runtime/base/base-assistant-runtime-core.ts +20 -0
  506. package/src/runtime/base/base-composer-runtime-core.ts +418 -0
  507. package/src/runtime/base/base-thread-runtime-core.ts +234 -0
  508. package/src/runtime/base/default-edit-composer-runtime-core.ts +71 -0
  509. package/src/runtime/base/default-thread-composer-runtime-core.ts +65 -0
  510. package/src/runtime/index.ts +108 -0
  511. package/src/runtime/interfaces/assistant-runtime-core.ts +12 -0
  512. package/src/runtime/interfaces/composer-runtime-core.ts +64 -0
  513. package/src/runtime/interfaces/thread-list-runtime-core.ts +49 -0
  514. package/src/runtime/interfaces/thread-runtime-core.ts +142 -0
  515. package/src/runtime/internal.ts +64 -0
  516. package/src/runtime/utils/auto-status.ts +67 -0
  517. package/src/runtime/utils/chat-model-adapter.ts +66 -0
  518. package/src/runtime/utils/external-store-message.ts +37 -0
  519. package/src/runtime/utils/message-repository.ts +390 -0
  520. package/src/runtime/utils/thread-message-like.ts +225 -0
  521. package/src/runtimes/assistant-transport/utils.ts +37 -0
  522. package/src/runtimes/external-store/external-store-adapter.ts +111 -0
  523. package/src/runtimes/external-store/external-store-runtime-core.ts +26 -0
  524. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +235 -0
  525. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +368 -0
  526. package/src/runtimes/external-store/index.ts +15 -0
  527. package/src/runtimes/external-store/thread-message-converter.ts +23 -0
  528. package/src/runtimes/index.ts +28 -0
  529. package/src/runtimes/internal.ts +36 -0
  530. package/src/runtimes/local/index.ts +6 -0
  531. package/src/runtimes/local/local-runtime-core.ts +32 -0
  532. package/src/runtimes/local/local-runtime-options.ts +27 -0
  533. package/src/runtimes/local/local-thread-list-runtime-core.ts +116 -0
  534. package/src/runtimes/local/local-thread-runtime-core.ts +534 -0
  535. package/src/runtimes/local/should-continue.ts +26 -0
  536. package/src/runtimes/remote-thread-list/adapter/in-memory.ts +43 -0
  537. package/src/runtimes/remote-thread-list/empty-thread-core.ts +200 -0
  538. package/src/runtimes/remote-thread-list/optimistic-state.ts +89 -0
  539. package/src/runtimes/remote-thread-list/remote-thread-state.ts +123 -0
  540. package/src/runtimes/remote-thread-list/types.ts +48 -0
  541. package/src/store/clients/chain-of-thought-client.ts +40 -0
  542. package/src/store/clients/index.ts +8 -0
  543. package/src/store/clients/model-context-client.ts +20 -0
  544. package/src/store/clients/no-op-composer-client.ts +66 -0
  545. package/src/store/clients/suggestions.ts +69 -0
  546. package/src/store/clients/thread-message-client.ts +170 -0
  547. package/src/store/index.ts +44 -0
  548. package/src/store/internal.ts +32 -0
  549. package/src/store/runtime-clients/attachment-runtime-client.ts +16 -0
  550. package/src/store/runtime-clients/composer-runtime-client.ts +131 -0
  551. package/src/store/runtime-clients/index.ts +7 -0
  552. package/src/store/runtime-clients/message-part-runtime-client.ts +17 -0
  553. package/src/store/runtime-clients/message-runtime-client.ts +141 -0
  554. package/src/store/runtime-clients/tap-subscribable.ts +16 -0
  555. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +53 -0
  556. package/src/store/runtime-clients/thread-list-runtime-client.ts +86 -0
  557. package/src/store/runtime-clients/thread-runtime-client.ts +141 -0
  558. package/src/store/scopes/attachment.ts +20 -0
  559. package/src/store/scopes/chain-of-thought.ts +38 -0
  560. package/src/store/scopes/composer.ts +80 -0
  561. package/src/store/scopes/index.ts +68 -0
  562. package/src/store/scopes/message.ts +75 -0
  563. package/src/store/scopes/model-context.ts +13 -0
  564. package/src/store/scopes/part.ts +47 -0
  565. package/src/store/scopes/suggestion.ts +19 -0
  566. package/src/store/scopes/suggestions.ts +20 -0
  567. package/src/store/scopes/thread-list-item.ts +44 -0
  568. package/src/store/scopes/thread.ts +135 -0
  569. package/src/store/scopes/threads.ts +34 -0
  570. package/src/store/types/client.ts +203 -0
  571. package/src/store/types/events.ts +77 -0
  572. package/src/store/types/index.ts +23 -0
  573. package/src/store/utils/attach-transform-scopes.ts +38 -0
  574. package/src/store/utils/base-proxy-handler.ts +50 -0
  575. package/src/store/utils/derived.ts +46 -0
  576. package/src/store/utils/index.ts +28 -0
  577. package/src/store/utils/notification-manager.ts +114 -0
  578. package/src/store/utils/proxied-assistant-state.ts +55 -0
  579. package/src/store/utils/split-clients.ts +82 -0
  580. package/src/store/utils/tap-assistant-context.ts +58 -0
  581. package/src/store/utils/tap-client-list.ts +121 -0
  582. package/src/store/utils/tap-client-lookup.ts +79 -0
  583. package/src/store/utils/tap-client-resource.ts +187 -0
  584. package/src/store/utils/tap-client-stack-context.ts +51 -0
  585. package/src/store/utils/wrapper-resource.ts +17 -0
  586. package/src/subscribable/index.ts +21 -0
  587. package/src/subscribable/subscribable.ts +317 -0
  588. package/src/tests/BaseSubscribable.test.ts +54 -0
  589. package/src/tests/MessageRepository.test.ts +607 -0
  590. package/src/tests/OptimisticState-delete-crash.test.ts +206 -0
  591. package/src/types/attachment.ts +45 -0
  592. package/src/types/index.ts +39 -0
  593. package/src/types/message.ts +248 -0
  594. package/src/types/quote.ts +4 -0
  595. package/src/types/unsubscribe.ts +1 -0
  596. package/src/utils/composite-context-provider.ts +36 -0
  597. package/src/utils/id.ts +14 -0
  598. package/src/utils/index.ts +14 -0
  599. package/src/utils/text.ts +11 -0
@@ -0,0 +1,206 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { OptimisticState } from "../runtimes/remote-thread-list/optimistic-state";
3
+ import {
4
+ type RemoteThreadState,
5
+ createThreadMappingId,
6
+ updateStatusReducer,
7
+ getThreadData,
8
+ } from "../runtimes/remote-thread-list/remote-thread-state";
9
+
10
+ /**
11
+ * This test reproduces the crash from issue #3346:
12
+ * "Entry not available in the store" when deleting the active thread.
13
+ *
14
+ * Root cause: optimisticUpdate's `optimistic` callback runs synchronously
15
+ * and removes the thread from threadData, but mainThreadId still points to
16
+ * the deleted thread. Subscribers that fire during _notifySubscribers() see
17
+ * this inconsistent state and crash.
18
+ */
19
+
20
+ const createThreadState = (
21
+ threadId: string,
22
+ status: "regular" | "archived" = "regular",
23
+ ): RemoteThreadState => {
24
+ const mappingId = createThreadMappingId(threadId);
25
+ return {
26
+ isLoading: false,
27
+ newThreadId: undefined,
28
+ threadIds: status === "regular" ? [threadId] : [],
29
+ archivedThreadIds: status === "archived" ? [threadId] : [],
30
+ threadIdMap: { [threadId]: mappingId },
31
+ threadData: {
32
+ [mappingId]: {
33
+ id: threadId,
34
+ remoteId: threadId,
35
+ externalId: undefined,
36
+ status,
37
+ title: undefined,
38
+ initializeTask: Promise.resolve({
39
+ remoteId: threadId,
40
+ externalId: undefined,
41
+ }),
42
+ },
43
+ },
44
+ };
45
+ };
46
+
47
+ describe("OptimisticState delete crash (#3346)", () => {
48
+ it("optimistic callback runs synchronously before execute completes", async () => {
49
+ const state = new OptimisticState(createThreadState("thread-1"));
50
+ const events: string[] = [];
51
+
52
+ state.subscribe(() => {
53
+ events.push("subscriber-notified");
54
+ });
55
+
56
+ const executeStarted = vi.fn();
57
+ const executeCompleted = vi.fn();
58
+
59
+ const promise = state.optimisticUpdate({
60
+ execute: async () => {
61
+ executeStarted();
62
+ // simulate async work like _ensureThreadIsNotMain
63
+ await Promise.resolve();
64
+ executeCompleted();
65
+ },
66
+ optimistic: (s) => {
67
+ events.push("optimistic-ran");
68
+ return updateStatusReducer(s, "thread-1", "deleted");
69
+ },
70
+ });
71
+
72
+ // After calling optimisticUpdate but before awaiting:
73
+ // - optimistic callback has already run (synchronous)
74
+ // - execute has started but not completed (async)
75
+ expect(events).toEqual(["optimistic-ran", "subscriber-notified"]);
76
+ expect(executeStarted).toHaveBeenCalled();
77
+ expect(executeCompleted).not.toHaveBeenCalled();
78
+
79
+ // Thread data is already gone from the optimistic value
80
+ expect(getThreadData(state.value, "thread-1")).toBeUndefined();
81
+
82
+ await promise;
83
+ });
84
+
85
+ it("BUG SCENARIO: subscriber sees deleted thread data while mainThreadId still references it", async () => {
86
+ const state = new OptimisticState(createThreadState("thread-1"));
87
+
88
+ // Simulate what happens in the real code:
89
+ // mainThreadId is external state that _ensureThreadIsNotMain would update
90
+ let mainThreadId = "thread-1";
91
+ let subscriberSawInconsistentState = false;
92
+
93
+ state.subscribe(() => {
94
+ // This fires synchronously during optimisticUpdate.
95
+ // In the real code, React components would re-render here and try to
96
+ // access the main thread's data.
97
+ const threadData = getThreadData(state.value, mainThreadId);
98
+ if (threadData === undefined && mainThreadId === "thread-1") {
99
+ // mainThreadId points to a deleted thread — this is the crash condition
100
+ subscriberSawInconsistentState = true;
101
+ }
102
+ });
103
+
104
+ // OLD CODE: _ensureThreadIsNotMain inside execute
105
+ // The optimistic callback deletes thread data BEFORE execute can update mainThreadId
106
+ const promise = state.optimisticUpdate({
107
+ execute: async () => {
108
+ // In old code, _ensureThreadIsNotMain was here.
109
+ // It would switch mainThreadId, but this runs AFTER optimistic callback
110
+ await Promise.resolve();
111
+ mainThreadId = "thread-2"; // too late — subscriber already fired
112
+ },
113
+ optimistic: (s) => {
114
+ return updateStatusReducer(s, "thread-1", "deleted");
115
+ },
116
+ });
117
+
118
+ // The subscriber saw inconsistent state — mainThreadId points to deleted thread
119
+ expect(subscriberSawInconsistentState).toBe(true);
120
+
121
+ await promise;
122
+ });
123
+
124
+ it("FIX: switching mainThreadId before optimisticUpdate prevents inconsistency", async () => {
125
+ const state = new OptimisticState(createThreadState("thread-1"));
126
+
127
+ let mainThreadId = "thread-1";
128
+ let subscriberSawInconsistentState = false;
129
+
130
+ state.subscribe(() => {
131
+ const threadData = getThreadData(state.value, mainThreadId);
132
+ if (threadData === undefined) {
133
+ subscriberSawInconsistentState = true;
134
+ }
135
+ });
136
+
137
+ // FIX: _ensureThreadIsNotMain runs BEFORE optimisticUpdate.
138
+ // switchToNewThread() both creates the new thread in state AND updates mainThreadId.
139
+ const newThreadId = "thread-2";
140
+ const mappingId = createThreadMappingId(newThreadId);
141
+ const currentState = state.value;
142
+ state.update({
143
+ ...currentState,
144
+ newThreadId: newThreadId,
145
+ threadIdMap: {
146
+ ...currentState.threadIdMap,
147
+ [newThreadId]: mappingId,
148
+ },
149
+ threadData: {
150
+ ...currentState.threadData,
151
+ [mappingId]: {
152
+ status: "new" as const,
153
+ id: newThreadId,
154
+ remoteId: undefined,
155
+ externalId: undefined,
156
+ title: undefined,
157
+ },
158
+ },
159
+ });
160
+ mainThreadId = newThreadId;
161
+
162
+ // Reset flag — the state.update above triggered the subscriber
163
+ subscriberSawInconsistentState = false;
164
+
165
+ const promise = state.optimisticUpdate({
166
+ execute: async () => {
167
+ // _ensureThreadIsNotMain no longer here
168
+ return undefined;
169
+ },
170
+ optimistic: (s) => {
171
+ return updateStatusReducer(s, "thread-1", "deleted");
172
+ },
173
+ });
174
+
175
+ // mainThreadId was already switched to thread-2 which exists in state
176
+ // — subscriber sees consistent state, no crash
177
+ expect(subscriberSawInconsistentState).toBe(false);
178
+
179
+ await promise;
180
+ });
181
+
182
+ it("archive does NOT remove threadData (no crash even without fix)", async () => {
183
+ const state = new OptimisticState(createThreadState("thread-1"));
184
+
185
+ let threadDataMissingDuringNotify = false;
186
+
187
+ state.subscribe(() => {
188
+ const threadData = getThreadData(state.value, "thread-1");
189
+ if (threadData === undefined) {
190
+ threadDataMissingDuringNotify = true;
191
+ }
192
+ });
193
+
194
+ await state.optimisticUpdate({
195
+ execute: async () => undefined,
196
+ optimistic: (s) => {
197
+ return updateStatusReducer(s, "thread-1", "archived");
198
+ },
199
+ });
200
+
201
+ // Archive keeps threadData — no SKIP_UPDATE, no crash
202
+ expect(threadDataMissingDuringNotify).toBe(false);
203
+ expect(getThreadData(state.value, "thread-1")).toBeDefined();
204
+ expect(getThreadData(state.value, "thread-1")?.status).toBe("archived");
205
+ });
206
+ });
@@ -0,0 +1,45 @@
1
+ import type { ThreadUserMessagePart } from "./message";
2
+
3
+ export type PendingAttachmentStatus =
4
+ | {
5
+ type: "running";
6
+ reason: "uploading";
7
+ progress: number;
8
+ }
9
+ | {
10
+ type: "requires-action";
11
+ reason: "composer-send";
12
+ }
13
+ | {
14
+ type: "incomplete";
15
+ reason: "error" | "upload-paused";
16
+ };
17
+
18
+ export type CompleteAttachmentStatus = {
19
+ type: "complete";
20
+ };
21
+
22
+ export type AttachmentStatus =
23
+ | PendingAttachmentStatus
24
+ | CompleteAttachmentStatus;
25
+
26
+ type BaseAttachment = {
27
+ id: string;
28
+ type: "image" | "document" | "file";
29
+ name: string;
30
+ contentType: string;
31
+ file?: File;
32
+ content?: ThreadUserMessagePart[];
33
+ };
34
+
35
+ export type PendingAttachment = BaseAttachment & {
36
+ status: PendingAttachmentStatus;
37
+ file: File;
38
+ };
39
+
40
+ export type CompleteAttachment = BaseAttachment & {
41
+ status: CompleteAttachmentStatus;
42
+ content: ThreadUserMessagePart[];
43
+ };
44
+
45
+ export type Attachment = PendingAttachment | CompleteAttachment;
@@ -0,0 +1,39 @@
1
+ export type {
2
+ // Message parts
3
+ TextMessagePart,
4
+ ReasoningMessagePart,
5
+ SourceMessagePart,
6
+ ImageMessagePart,
7
+ FileMessagePart,
8
+ DataMessagePart,
9
+ Unstable_AudioMessagePart,
10
+ ToolCallMessagePart,
11
+ ThreadUserMessagePart,
12
+ ThreadAssistantMessagePart,
13
+ // Message status
14
+ MessagePartStatus,
15
+ ToolCallMessagePartStatus,
16
+ MessageStatus,
17
+ // Thread messages
18
+ MessageTiming,
19
+ ThreadStep,
20
+ ThreadSystemMessage,
21
+ ThreadUserMessage,
22
+ ThreadAssistantMessage,
23
+ ThreadMessage,
24
+ MessageRole,
25
+ // Config
26
+ RunConfig,
27
+ AppendMessage,
28
+ } from "./message";
29
+
30
+ export type {
31
+ Attachment,
32
+ PendingAttachment,
33
+ CompleteAttachment,
34
+ AttachmentStatus,
35
+ } from "./attachment";
36
+
37
+ export type { Unsubscribe } from "./unsubscribe";
38
+
39
+ export type { QuoteInfo } from "./quote";
@@ -0,0 +1,248 @@
1
+ import type {
2
+ ReadonlyJSONObject,
3
+ ReadonlyJSONValue,
4
+ } from "assistant-stream/utils";
5
+ import type { CompleteAttachment } from "./attachment";
6
+
7
+ // =============================================================================
8
+ // Message Parts
9
+ // =============================================================================
10
+
11
+ export type TextMessagePart = {
12
+ readonly type: "text";
13
+ readonly text: string;
14
+ readonly parentId?: string;
15
+ };
16
+
17
+ export type ReasoningMessagePart = {
18
+ readonly type: "reasoning";
19
+ readonly text: string;
20
+ readonly parentId?: string;
21
+ };
22
+
23
+ export type SourceMessagePart = {
24
+ readonly type: "source";
25
+ readonly sourceType: "url";
26
+ readonly id: string;
27
+ readonly url: string;
28
+ readonly title?: string;
29
+ readonly parentId?: string;
30
+ };
31
+
32
+ export type ImageMessagePart = {
33
+ readonly type: "image";
34
+ readonly image: string;
35
+ readonly filename?: string;
36
+ };
37
+
38
+ export type FileMessagePart = {
39
+ readonly type: "file";
40
+ readonly filename?: string;
41
+ readonly data: string;
42
+ readonly mimeType: string;
43
+ };
44
+
45
+ export type Unstable_AudioMessagePart = {
46
+ readonly type: "audio";
47
+ readonly audio: {
48
+ readonly data: string;
49
+ readonly format: "mp3" | "wav";
50
+ };
51
+ };
52
+
53
+ export type DataMessagePart<T = any> = {
54
+ readonly type: "data";
55
+ readonly name: string;
56
+ readonly data: T;
57
+ };
58
+
59
+ export type ToolCallMessagePart<
60
+ TArgs = ReadonlyJSONObject,
61
+ TResult = unknown,
62
+ > = {
63
+ readonly type: "tool-call";
64
+ readonly toolCallId: string;
65
+ readonly toolName: string;
66
+ readonly args: TArgs;
67
+ readonly result?: TResult | undefined;
68
+ readonly isError?: boolean | undefined;
69
+ readonly argsText: string;
70
+ readonly artifact?: unknown;
71
+ readonly interrupt?: { type: "human"; payload: unknown };
72
+ readonly parentId?: string;
73
+ readonly messages?: readonly ThreadMessage[];
74
+ };
75
+
76
+ export type ThreadUserMessagePart =
77
+ | TextMessagePart
78
+ | ImageMessagePart
79
+ | FileMessagePart
80
+ | DataMessagePart
81
+ | Unstable_AudioMessagePart;
82
+
83
+ export type ThreadAssistantMessagePart =
84
+ | TextMessagePart
85
+ | ReasoningMessagePart
86
+ | ToolCallMessagePart
87
+ | SourceMessagePart
88
+ | FileMessagePart
89
+ | ImageMessagePart
90
+ | DataMessagePart;
91
+
92
+ // =============================================================================
93
+ // Message Status
94
+ // =============================================================================
95
+
96
+ export type MessagePartStatus =
97
+ | {
98
+ readonly type: "running";
99
+ }
100
+ | {
101
+ readonly type: "complete";
102
+ }
103
+ | {
104
+ readonly type: "incomplete";
105
+ readonly reason:
106
+ | "cancelled"
107
+ | "length"
108
+ | "content-filter"
109
+ | "other"
110
+ | "error";
111
+ readonly error?: unknown;
112
+ };
113
+
114
+ export type ToolCallMessagePartStatus =
115
+ | {
116
+ readonly type: "requires-action";
117
+ readonly reason: "interrupt";
118
+ }
119
+ | MessagePartStatus;
120
+
121
+ export type MessageStatus =
122
+ | {
123
+ readonly type: "running";
124
+ }
125
+ | {
126
+ readonly type: "requires-action";
127
+ readonly reason: "tool-calls" | "interrupt";
128
+ }
129
+ | {
130
+ readonly type: "complete";
131
+ readonly reason: "stop" | "unknown";
132
+ }
133
+ | {
134
+ readonly type: "incomplete";
135
+ readonly reason:
136
+ | "cancelled"
137
+ | "tool-calls"
138
+ | "length"
139
+ | "content-filter"
140
+ | "other"
141
+ | "error";
142
+ readonly error?: ReadonlyJSONValue;
143
+ };
144
+
145
+ // =============================================================================
146
+ // Thread Messages
147
+ // =============================================================================
148
+
149
+ export type MessageTiming = {
150
+ readonly streamStartTime: number;
151
+ readonly firstTokenTime?: number;
152
+ readonly totalStreamTime?: number;
153
+ readonly tokenCount?: number;
154
+ readonly tokensPerSecond?: number;
155
+ readonly totalChunks: number;
156
+ readonly toolCallCount: number;
157
+ };
158
+
159
+ export type ThreadStep = {
160
+ readonly messageId?: string;
161
+ readonly usage?:
162
+ | {
163
+ readonly inputTokens: number;
164
+ readonly outputTokens: number;
165
+ }
166
+ | undefined;
167
+ };
168
+
169
+ type MessageCommonProps = {
170
+ readonly id: string;
171
+ readonly createdAt: Date;
172
+ };
173
+
174
+ export type ThreadSystemMessage = MessageCommonProps & {
175
+ readonly role: "system";
176
+ readonly content: readonly [TextMessagePart];
177
+ readonly metadata: {
178
+ readonly unstable_state?: undefined;
179
+ readonly unstable_annotations?: undefined;
180
+ readonly unstable_data?: undefined;
181
+ readonly steps?: undefined;
182
+ readonly submittedFeedback?: undefined;
183
+ readonly timing?: undefined;
184
+ readonly custom: Record<string, unknown>;
185
+ };
186
+ };
187
+
188
+ export type ThreadUserMessage = MessageCommonProps & {
189
+ readonly role: "user";
190
+ readonly content: readonly ThreadUserMessagePart[];
191
+ readonly attachments: readonly CompleteAttachment[];
192
+ readonly metadata: {
193
+ readonly unstable_state?: undefined;
194
+ readonly unstable_annotations?: undefined;
195
+ readonly unstable_data?: undefined;
196
+ readonly steps?: undefined;
197
+ readonly submittedFeedback?: undefined;
198
+ readonly timing?: undefined;
199
+ readonly custom: Record<string, unknown>;
200
+ };
201
+ };
202
+
203
+ export type ThreadAssistantMessage = MessageCommonProps & {
204
+ readonly role: "assistant";
205
+ readonly content: readonly ThreadAssistantMessagePart[];
206
+ readonly status: MessageStatus;
207
+ readonly metadata: {
208
+ readonly unstable_state: ReadonlyJSONValue;
209
+ readonly unstable_annotations: readonly ReadonlyJSONValue[];
210
+ readonly unstable_data: readonly ReadonlyJSONValue[];
211
+ readonly steps: readonly ThreadStep[];
212
+ readonly submittedFeedback?: { readonly type: "positive" | "negative" };
213
+ readonly timing?: MessageTiming;
214
+ readonly custom: Record<string, unknown>;
215
+ };
216
+ };
217
+
218
+ type BaseThreadMessage = {
219
+ readonly status?: ThreadAssistantMessage["status"];
220
+ readonly metadata: {
221
+ readonly unstable_state?: ReadonlyJSONValue;
222
+ readonly unstable_annotations?: readonly ReadonlyJSONValue[];
223
+ readonly unstable_data?: readonly ReadonlyJSONValue[];
224
+ readonly steps?: readonly ThreadStep[];
225
+ readonly submittedFeedback?: { readonly type: "positive" | "negative" };
226
+ readonly timing?: MessageTiming;
227
+ readonly custom: Record<string, unknown>;
228
+ };
229
+ readonly attachments?: ThreadUserMessage["attachments"];
230
+ };
231
+
232
+ export type ThreadMessage = BaseThreadMessage &
233
+ (ThreadSystemMessage | ThreadUserMessage | ThreadAssistantMessage);
234
+
235
+ export type MessageRole = ThreadMessage["role"];
236
+
237
+ export type RunConfig = {
238
+ readonly custom?: Record<string, unknown>;
239
+ };
240
+
241
+ export type AppendMessage = Omit<ThreadMessage, "id"> & {
242
+ parentId: string | null;
243
+
244
+ /** The ID of the message that was edited or undefined. */
245
+ sourceId: string | null;
246
+ runConfig: RunConfig | undefined;
247
+ startRun?: boolean | undefined;
248
+ };
@@ -0,0 +1,4 @@
1
+ export type QuoteInfo = {
2
+ readonly text: string;
3
+ readonly messageId: string;
4
+ };
@@ -0,0 +1 @@
1
+ export type Unsubscribe = () => void;
@@ -0,0 +1,36 @@
1
+ import {
2
+ type ModelContextProvider,
3
+ mergeModelContexts,
4
+ } from "../model-context";
5
+
6
+ export class CompositeContextProvider implements ModelContextProvider {
7
+ private _providers = new Set<ModelContextProvider>();
8
+
9
+ getModelContext() {
10
+ return mergeModelContexts(this._providers);
11
+ }
12
+
13
+ registerModelContextProvider(provider: ModelContextProvider) {
14
+ this._providers.add(provider);
15
+ const unsubscribe = provider.subscribe?.(() => {
16
+ this.notifySubscribers();
17
+ });
18
+ this.notifySubscribers();
19
+ return () => {
20
+ this._providers.delete(provider);
21
+ unsubscribe?.();
22
+ this.notifySubscribers();
23
+ };
24
+ }
25
+
26
+ private _subscribers = new Set<() => void>();
27
+
28
+ notifySubscribers() {
29
+ for (const callback of this._subscribers) callback();
30
+ }
31
+
32
+ subscribe(callback: () => void) {
33
+ this._subscribers.add(callback);
34
+ return () => this._subscribers.delete(callback);
35
+ }
36
+ }
@@ -0,0 +1,14 @@
1
+ import { customAlphabet } from "nanoid/non-secure";
2
+
3
+ export const generateId = customAlphabet(
4
+ "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
5
+ 7,
6
+ );
7
+
8
+ const optimisticPrefix = "__optimistic__";
9
+ export const generateOptimisticId = () => `${optimisticPrefix}${generateId()}`;
10
+ export const isOptimisticId = (id: string) => id.startsWith(optimisticPrefix);
11
+
12
+ const errorPrefix = "__error__";
13
+ export const generateErrorMessageId = () => `${errorPrefix}${generateId()}`;
14
+ export const isErrorMessageId = (id: string) => id.startsWith(errorPrefix);
@@ -0,0 +1,14 @@
1
+ // ID generation
2
+ export {
3
+ generateId,
4
+ generateOptimisticId,
5
+ isOptimisticId,
6
+ generateErrorMessageId,
7
+ isErrorMessageId,
8
+ } from "./id";
9
+
10
+ // Message utilities
11
+ export { getThreadMessageText } from "./text";
12
+
13
+ // Composite context provider
14
+ export { CompositeContextProvider } from "./composite-context-provider";
@@ -0,0 +1,11 @@
1
+ import type { AppendMessage, TextMessagePart, ThreadMessage } from "../types";
2
+
3
+ export const getThreadMessageText = (
4
+ message: ThreadMessage | AppendMessage,
5
+ ) => {
6
+ const textParts = message.content.filter(
7
+ (part) => part.type === "text",
8
+ ) as TextMessagePart[];
9
+
10
+ return textParts.map((part) => part.text).join("\n\n");
11
+ };