@assistant-ui/core 0.2.11 → 0.2.14

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 (212) hide show
  1. package/dist/adapters/thread-history.d.ts +3 -1
  2. package/dist/adapters/thread-history.d.ts.map +1 -1
  3. package/dist/index.d.ts +2 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/react/AssistantProvider.js +6 -1
  6. package/dist/react/AssistantProvider.js.map +1 -1
  7. package/dist/react/RuntimeAdapter.d.ts +1 -1
  8. package/dist/react/RuntimeAdapter.d.ts.map +1 -1
  9. package/dist/react/RuntimeAdapter.js +16 -6
  10. package/dist/react/RuntimeAdapter.js.map +1 -1
  11. package/dist/react/client/DataRenderers.d.ts +1 -8
  12. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  13. package/dist/react/client/DataRenderers.js +3 -2
  14. package/dist/react/client/DataRenderers.js.map +1 -1
  15. package/dist/react/client/Interactables.d.ts +1 -1
  16. package/dist/react/client/Interactables.d.ts.map +1 -1
  17. package/dist/react/client/Interactables.js +4 -3
  18. package/dist/react/client/Interactables.js.map +1 -1
  19. package/dist/react/client/Tools.d.ts +2 -13
  20. package/dist/react/client/Tools.d.ts.map +1 -1
  21. package/dist/react/client/Tools.js +4 -3
  22. package/dist/react/client/Tools.js.map +1 -1
  23. package/dist/react/primitives/message/MessageGroupedParts.d.ts +3 -2
  24. package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
  25. package/dist/react/primitives/message/MessageGroupedParts.js +4 -4
  26. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  27. package/dist/react/primitives/message/MessageParts.d.ts +28 -1
  28. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  29. package/dist/react/primitives/message/MessageParts.js +43 -9
  30. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  31. package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
  32. package/dist/react/providers/TextMessagePartProvider.js +3 -2
  33. package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
  34. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +2 -0
  35. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  36. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +2 -0
  37. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  38. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +1 -0
  39. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  40. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  41. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +6 -0
  42. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  43. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  44. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +2 -0
  45. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  46. package/dist/react/utils/groupParts.d.ts +13 -1
  47. package/dist/react/utils/groupParts.d.ts.map +1 -1
  48. package/dist/react/utils/groupParts.js +17 -5
  49. package/dist/react/utils/groupParts.js.map +1 -1
  50. package/dist/runtime/api/bindings.d.ts +1 -0
  51. package/dist/runtime/api/bindings.d.ts.map +1 -1
  52. package/dist/runtime/api/message-runtime.d.ts +2 -0
  53. package/dist/runtime/api/message-runtime.d.ts.map +1 -1
  54. package/dist/runtime/api/message-runtime.js +5 -0
  55. package/dist/runtime/api/message-runtime.js.map +1 -1
  56. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  57. package/dist/runtime/api/thread-list-runtime.js +1 -0
  58. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  59. package/dist/runtime/api/thread-runtime.d.ts +3 -0
  60. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  61. package/dist/runtime/api/thread-runtime.js +4 -0
  62. package/dist/runtime/api/thread-runtime.js.map +1 -1
  63. package/dist/runtime/base/base-thread-runtime-core.d.ts +1 -0
  64. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  65. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  66. package/dist/runtime/branch/external-thread-branch-adapter.d.ts +30 -0
  67. package/dist/runtime/branch/external-thread-branch-adapter.d.ts.map +1 -0
  68. package/dist/runtime/branch/external-thread-branch-adapter.js +0 -0
  69. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +1 -0
  70. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  71. package/dist/runtime/interfaces/thread-runtime-core.d.ts +2 -0
  72. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  73. package/dist/runtimes/external-store/external-store-adapter.d.ts +1 -0
  74. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  75. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +1 -0
  76. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  77. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +13 -0
  78. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  79. package/dist/runtimes/local/local-runtime-options.d.ts +1 -1
  80. package/dist/runtimes/local/local-thread-runtime-core.d.ts +8 -1
  81. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  82. package/dist/runtimes/local/local-thread-runtime-core.js +63 -5
  83. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  84. package/dist/runtimes/local/should-continue.js +4 -2
  85. package/dist/runtimes/local/should-continue.js.map +1 -1
  86. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +2 -0
  87. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  88. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +4 -0
  89. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  90. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  91. package/dist/runtimes/remote-thread-list/empty-thread-core.js +4 -0
  92. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  93. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +1 -0
  94. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  95. package/dist/runtimes/remote-thread-list/remote-thread-state.js +1 -0
  96. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  97. package/dist/runtimes/remote-thread-list/types.d.ts +1 -0
  98. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  99. package/dist/store/clients/chain-of-thought-client.d.ts +2 -7
  100. package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
  101. package/dist/store/clients/chain-of-thought-client.js +3 -2
  102. package/dist/store/clients/chain-of-thought-client.js.map +1 -1
  103. package/dist/store/clients/model-context-client.d.ts +1 -1
  104. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  105. package/dist/store/clients/model-context-client.js +3 -2
  106. package/dist/store/clients/model-context-client.js.map +1 -1
  107. package/dist/store/clients/no-op-composer-client.d.ts +2 -4
  108. package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
  109. package/dist/store/clients/no-op-composer-client.js +3 -2
  110. package/dist/store/clients/no-op-composer-client.js.map +1 -1
  111. package/dist/store/clients/runtime-adapter.d.ts +1 -3
  112. package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
  113. package/dist/store/clients/runtime-adapter.js +2 -15
  114. package/dist/store/clients/runtime-adapter.js.map +1 -1
  115. package/dist/store/clients/suggestions.d.ts +1 -4
  116. package/dist/store/clients/suggestions.d.ts.map +1 -1
  117. package/dist/store/clients/suggestions.js +6 -4
  118. package/dist/store/clients/suggestions.js.map +1 -1
  119. package/dist/store/clients/thread-message-client.d.ts +1 -1
  120. package/dist/store/clients/thread-message-client.d.ts.map +1 -1
  121. package/dist/store/clients/thread-message-client.js +14 -10
  122. package/dist/store/clients/thread-message-client.js.map +1 -1
  123. package/dist/store/internal.d.ts +2 -2
  124. package/dist/store/internal.js +2 -2
  125. package/dist/store/runtime-clients/attachment-runtime-client.d.ts +2 -4
  126. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  127. package/dist/store/runtime-clients/attachment-runtime-client.js +3 -2
  128. package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
  129. package/dist/store/runtime-clients/composer-runtime-client.d.ts +2 -10
  130. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  131. package/dist/store/runtime-clients/composer-runtime-client.js +9 -6
  132. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  133. package/dist/store/runtime-clients/message-part-runtime-client.d.ts +2 -4
  134. package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
  135. package/dist/store/runtime-clients/message-part-runtime-client.js +3 -2
  136. package/dist/store/runtime-clients/message-part-runtime-client.js.map +1 -1
  137. package/dist/store/runtime-clients/message-runtime-client.d.ts +2 -7
  138. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  139. package/dist/store/runtime-clients/message-runtime-client.js +10 -6
  140. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  141. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts +2 -4
  142. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  143. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +3 -2
  144. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  145. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts +2 -5
  146. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  147. package/dist/store/runtime-clients/thread-list-runtime-client.js +6 -4
  148. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  149. package/dist/store/runtime-clients/thread-runtime-client.d.ts +2 -4
  150. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  151. package/dist/store/runtime-clients/thread-runtime-client.js +7 -4
  152. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  153. package/dist/store/scopes/message.d.ts +1 -0
  154. package/dist/store/scopes/message.d.ts.map +1 -1
  155. package/dist/store/scopes/thread-list-item.d.ts +1 -0
  156. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  157. package/dist/store/scopes/thread.d.ts +1 -0
  158. package/dist/store/scopes/thread.d.ts.map +1 -1
  159. package/package.json +4 -4
  160. package/src/adapters/thread-history.ts +2 -0
  161. package/src/index.ts +1 -0
  162. package/src/react/AssistantProvider.tsx +3 -1
  163. package/src/react/RuntimeAdapter.ts +25 -8
  164. package/src/react/client/DataRenderers.ts +42 -45
  165. package/src/react/client/Interactables.ts +261 -261
  166. package/src/react/client/Tools.ts +6 -4
  167. package/src/react/primitives/message/MessageGroupedParts.tsx +19 -7
  168. package/src/react/primitives/message/MessageParts.tsx +64 -13
  169. package/src/react/providers/TextMessagePartProvider.tsx +5 -3
  170. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +1 -0
  171. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +11 -0
  172. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +6 -0
  173. package/src/react/utils/groupParts.ts +27 -0
  174. package/src/runtime/api/bindings.ts +1 -0
  175. package/src/runtime/api/message-runtime.ts +7 -0
  176. package/src/runtime/api/thread-list-runtime.ts +1 -0
  177. package/src/runtime/api/thread-runtime.ts +7 -0
  178. package/src/runtime/base/base-thread-runtime-core.ts +1 -0
  179. package/src/runtime/branch/external-thread-branch-adapter.ts +26 -0
  180. package/src/runtime/interfaces/thread-list-runtime-core.ts +1 -0
  181. package/src/runtime/interfaces/thread-runtime-core.ts +2 -0
  182. package/src/runtimes/external-store/external-store-adapter.ts +1 -0
  183. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +24 -0
  184. package/src/runtimes/local/local-runtime-options.ts +1 -1
  185. package/src/runtimes/local/local-thread-runtime-core.test.ts +311 -0
  186. package/src/runtimes/local/local-thread-runtime-core.ts +104 -7
  187. package/src/runtimes/local/should-continue.ts +23 -13
  188. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +5 -0
  189. package/src/runtimes/remote-thread-list/empty-thread-core.ts +5 -0
  190. package/src/runtimes/remote-thread-list/remote-thread-state.ts +2 -0
  191. package/src/runtimes/remote-thread-list/types.ts +1 -0
  192. package/src/store/clients/chain-of-thought-client.ts +5 -3
  193. package/src/store/clients/model-context-client.test.ts +5 -4
  194. package/src/store/clients/model-context-client.ts +21 -21
  195. package/src/store/clients/no-op-composer-client.ts +5 -3
  196. package/src/store/clients/runtime-adapter.ts +0 -24
  197. package/src/store/clients/suggestions.ts +9 -18
  198. package/src/store/clients/thread-message-client.ts +29 -26
  199. package/src/store/internal.ts +1 -4
  200. package/src/store/runtime-clients/attachment-runtime-client.ts +14 -14
  201. package/src/store/runtime-clients/composer-runtime-client.ts +30 -24
  202. package/src/store/runtime-clients/message-part-runtime-client.ts +5 -3
  203. package/src/store/runtime-clients/message-runtime-client.ts +26 -19
  204. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +5 -3
  205. package/src/store/runtime-clients/thread-list-runtime-client.ts +10 -6
  206. package/src/store/runtime-clients/thread-runtime-client.ts +11 -6
  207. package/src/store/scopes/message.ts +1 -0
  208. package/src/store/scopes/thread-list-item.ts +1 -0
  209. package/src/store/scopes/thread.ts +1 -0
  210. package/src/tests/external-store-thread-runtime-core.test.ts +57 -0
  211. package/src/tests/groupMessageParts.test.ts +84 -0
  212. package/src/tests/groupParts.test.ts +55 -0
@@ -3,6 +3,33 @@ import { DataMessagePartComponent, EmptyMessagePartComponent, FileMessagePartCom
3
3
  import { ComponentType, FC, PropsWithChildren, ReactNode } from "react";
4
4
 
5
5
  //#region src/react/primitives/message/MessageParts.d.ts
6
+ type MessagePartRange = {
7
+ type: "single";
8
+ index: number;
9
+ } | {
10
+ type: "toolGroup";
11
+ startIndex: number;
12
+ endIndex: number;
13
+ idKey?: string | undefined;
14
+ } | {
15
+ type: "reasoningGroup";
16
+ startIndex: number;
17
+ endIndex: number;
18
+ idKey?: string | undefined;
19
+ } | {
20
+ type: "chainOfThoughtGroup";
21
+ startIndex: number;
22
+ endIndex: number;
23
+ idKey?: string | undefined;
24
+ };
25
+ /**
26
+ * Groups consecutive tool-call and reasoning message parts into ranges.
27
+ * Always groups tool calls and reasoning parts, even if there's only one.
28
+ * When useChainOfThought is true, groups tool-call and reasoning parts together.
29
+ * `partIds[i]` optionally carries a stable identity for part `i`; group
30
+ * ranges derive an `idKey` from their first part's id (first claim wins).
31
+ */
32
+ declare const groupMessageParts: (messageTypes: readonly string[], useChainOfThought: boolean, partIds?: readonly (string | undefined)[]) => MessagePartRange[];
6
33
  declare namespace MessagePrimitiveParts {
7
34
  type DataConfig = {
8
35
  /** Map data event names to specific components */by_name?: Record<string, DataMessagePartComponent | undefined> | undefined; /** Fallback component for unmatched data events */
@@ -187,5 +214,5 @@ type EnrichedPartState = (Extract<PartState, {
187
214
  */
188
215
  declare const MessagePrimitiveParts: FC<MessagePrimitiveParts.Props>;
189
216
  //#endregion
190
- export { EnrichedPartState, MessagePartComponent, MessagePrimitivePartByIndex, MessagePrimitiveParts, type PartState, defaultComponents };
217
+ export { EnrichedPartState, MessagePartComponent, MessagePrimitivePartByIndex, MessagePrimitiveParts, type PartState, defaultComponents, groupMessageParts };
191
218
  //# sourceMappingURL=MessageParts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageParts.d.ts","names":[],"sources":["../../../../src/react/primitives/message/MessageParts.tsx"],"mappings":";;;;;kBA6JiB,qBAAA;EAAA,KACV,UAAA;IADU,kDAGb,OAAA,GAAU,MAAA,SAAe,wBAAA,2BAHS;IAKlC,QAAA,GAAW,wBAAA;EAAA;EAAA,KAGR,cAAA;IAEK,6CAAR,KAAA,GAAQ,yBAAA,cAIC;IAFT,IAAA,GAAO,wBAAA,cAMA;IAJP,MAAA,GAAS,0BAAA,cAQF;IANP,KAAA,GAAQ,yBAAA,cAoBU;IAlBlB,IAAA,GAAO,wBAAA,cA+BgB;IA7BvB,cAAA,GAAiB,kCAAA,cAgCY;IA9B7B,IAAA,GAAO,UAAA,cAkCqB;IAhC5B,KAAA,GAAQ,yBAAA;IAyCgB;;;;;;;;IAhCxB,YAAA;MA+FsC,uDA5FhC,UAAA,EAAY,6BAAA,EAyGoC;MAvGhD,QAAA,GACI,aAAA;QAAgB,SAAA;QAAmB,KAAA;MAAA;IAAA;EAAA;EAAA,KAM1C,WAAA;IAxCQ,qDA2CP,OAAA,GACI,MAAA,SAAe,4BAAA,2BAvCvB;IA0CI,QAAA,GAAW,aAAA,CAAc,wBAAA;EAAA;IAxCtB,qDA4CH,QAAA,EAAU,aAAA,CAAc,wBAAA;EAAA;EAxC5B;;;;;;EAAA,KAiDG,kBAAA,GAAqB,cAAA;IA3CjB,mEA6CP,SAAA,GAAY,6BAAA,cA3CJ;IA6CR,KAAA,GAAQ,WAAA;IAjCF;;;;;;;;;IA4CN,SAAA,GAAY,aAAA,CACV,iBAAA;MAAoB,UAAA;MAAoB,QAAA;IAAA;IAzBtC;;;;;;;;;IAqCJ,cAAA,GAAiB,uBAAA;IAEjB,cAAA;EAAA;EAdsB;;;;;;;EAAA,KAwBnB,wBAAA,GAA2B,cAAA;IAMd;;;;;IAAhB,cAAA,EAAgB,aAAA;IAEhB,SAAA;IACA,KAAA;IACA,SAAA;IACA,cAAA;EAAA;EAAA,YAGU,KAAA;IAsBc;;;;;;;IAbpB,UAAA,GAAa,kBAAA,GAAqB,wBAAA;IA2D7B;;;;;;;IAnDL,8BAAA;IACA,QAAA;EAAA;IA0D0C,8EAtD1C,QAAA,GAAW,KAAA;MAAS,IAAA,EAAM,iBAAA;IAAA,MAAwB,SAAA;IAClD,UAAA;IACA,8BAAA;EAAA;EAAA;AAAA;;;;;cA4CK,iBAAA;;;;;;;;;KAOe,iBAAA,KAAiB,SAAA;;;KACZ,iBAAA,KAAiB,SAAA;AAAA;AAAA,KAG7C,yBAAA;EACH,UAAA,EAAY,qBAAA,CAAsB,KAAK;AAAA;AAAA,cAG5B,oBAAA,EAAsB,EAAE,CAAC,yBAAA;AAAA,kBAkGrB,2BAAA;EAAA,KACH,KAAA;IACV,KAAA;IACA,UAAA,EAAY,qBAAA,CAAsB,KAAK;EAAA;AAAA;AAH3C;;;AAAA,cAUa,2BAAA,EAA6B,EAAE,CAAC,2BAAA,CAA4B,KAAA;;;;;;AAP9B;AAO3C;;;;;;KA+LY,iBAAA,IACP,OAAA,CAAQ,SAAA;EAAa,IAAA;AAAA;EADd,2EAGG,MAAA,EAAQ,SAAA;EAEjB,SAAA,EAAW,wBAAA,eAJZ;EAMC,MAAA,EAAQ,wBAAA,YAFG;EAIX,iBAAA,EAAmB,wBAAA;AAAA,MAEpB,OAAA,CAAQ,SAAA;EAAa,IAAA;AAAA;EAEK,oFAAhB,cAAA,EAAgB,SAAA;AAAA,KAE3B,OAAA,CAAQ,SAAA;EAAa,IAAA;AAAA;EAAwB,IAAA;AAAA;;;;;;;cAoGpC,qBAAA,EAAuB,EAAE,CAAC,qBAAA,CAAsB,KAAA"}
1
+ {"version":3,"file":"MessageParts.d.ts","names":[],"sources":["../../../../src/react/primitives/message/MessageParts.tsx"],"mappings":"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"}
@@ -42,8 +42,10 @@ const createGroupState = (groupType) => {
42
42
  * Groups consecutive tool-call and reasoning message parts into ranges.
43
43
  * Always groups tool calls and reasoning parts, even if there's only one.
44
44
  * When useChainOfThought is true, groups tool-call and reasoning parts together.
45
+ * `partIds[i]` optionally carries a stable identity for part `i`; group
46
+ * ranges derive an `idKey` from their first part's id (first claim wins).
45
47
  */
46
- const groupMessageParts = (messageTypes, useChainOfThought) => {
48
+ const groupMessageParts = (messageTypes, useChainOfThought, partIds) => {
47
49
  const ranges = [];
48
50
  if (useChainOfThought) {
49
51
  const chainOfThoughtGroup = createGroupState("chainOfThoughtGroup");
@@ -82,14 +84,36 @@ const groupMessageParts = (messageTypes, useChainOfThought) => {
82
84
  toolGroup.finalize(messageTypes.length - 1, ranges);
83
85
  reasoningGroup.finalize(messageTypes.length - 1, ranges);
84
86
  }
87
+ if (partIds) {
88
+ const claimed = /* @__PURE__ */ new Set();
89
+ for (const range of ranges) {
90
+ if (range.type === "single") continue;
91
+ const id = partIds[range.startIndex];
92
+ if (id !== void 0 && !claimed.has(id)) {
93
+ claimed.add(id);
94
+ range.idKey = `id:${id}`;
95
+ }
96
+ }
97
+ }
85
98
  return ranges;
86
99
  };
87
100
  const useMessagePartsGroups = (useChainOfThought) => {
88
101
  const messageTypes = useAuiState(useShallow((s) => s.message.parts.map((c) => c.type)));
102
+ const partIds = useAuiState(useShallow((s) => s.message.parts.map((c) => c.type === "tool-call" ? c.toolCallId : void 0)));
89
103
  return useMemo(() => {
90
- if (messageTypes.length === 0) return [];
91
- return groupMessageParts(messageTypes, useChainOfThought);
92
- }, [messageTypes, useChainOfThought]);
104
+ if (messageTypes.length === 0) return {
105
+ ranges: [],
106
+ partIds
107
+ };
108
+ return {
109
+ ranges: groupMessageParts(messageTypes, useChainOfThought, partIds),
110
+ partIds
111
+ };
112
+ }, [
113
+ messageTypes,
114
+ partIds,
115
+ useChainOfThought
116
+ ]);
93
117
  };
94
118
  const ToolUIDisplay = ({ Fallback, ...props }) => {
95
119
  const Render = useAuiState((s) => s.tools.toolUIs[props.toolName]?.[0]?.render ?? Fallback);
@@ -354,9 +378,18 @@ const MessagePrimitiveParts = ({ components, unstable_showEmptyOnNonTextEnd = tr
354
378
  MessagePrimitiveParts.displayName = "MessagePrimitive.Parts";
355
379
  const MessagePrimitivePartsCompat = ({ components, unstable_showEmptyOnNonTextEnd }) => {
356
380
  const contentLength = useAuiState((s) => s.message.parts.length);
357
- const messageRanges = useMessagePartsGroups(!!components?.ChainOfThought);
381
+ const { ranges: messageRanges, partIds } = useMessagePartsGroups(!!components?.ChainOfThought);
358
382
  const partsElements = useMemo(() => {
359
383
  if (contentLength === 0) return /* @__PURE__ */ jsx(EmptyParts, { components });
384
+ const claimed = /* @__PURE__ */ new Set();
385
+ const toolLeafKey = (partIndex) => {
386
+ const id = partIds[partIndex];
387
+ if (id !== void 0 && !claimed.has(id)) {
388
+ claimed.add(id);
389
+ return `part-id:${id}`;
390
+ }
391
+ return `part-${partIndex}`;
392
+ };
360
393
  return messageRanges.map((range) => {
361
394
  if (range.type === "single") return /* @__PURE__ */ jsx(MessagePrimitivePartByIndex, {
362
395
  index: range.index,
@@ -369,7 +402,7 @@ const MessagePrimitivePartsCompat = ({ components, unstable_showEmptyOnNonTextEn
369
402
  startIndex: range.startIndex,
370
403
  endIndex: range.endIndex,
371
404
  children: /* @__PURE__ */ jsx(ChainOfThoughtComponent, {})
372
- }, `chainOfThought-${range.startIndex}`);
405
+ }, `chainOfThought-${range.idKey ?? range.startIndex}`);
373
406
  } else if (range.type === "toolGroup") return /* @__PURE__ */ jsx(components?.ToolGroup ?? defaultComponents.ToolGroup, {
374
407
  startIndex: range.startIndex,
375
408
  endIndex: range.endIndex,
@@ -378,9 +411,9 @@ const MessagePrimitivePartsCompat = ({ components, unstable_showEmptyOnNonTextEn
378
411
  return /* @__PURE__ */ jsx(MessagePrimitivePartByIndex, {
379
412
  index: partIndex,
380
413
  components
381
- }, `part-${partIndex}`);
414
+ }, toolLeafKey(partIndex));
382
415
  })
383
- }, `tool-${range.startIndex}`);
416
+ }, `tool-${range.idKey ?? range.startIndex}`);
384
417
  else return /* @__PURE__ */ jsx(components?.ReasoningGroup ?? defaultComponents.ReasoningGroup, {
385
418
  startIndex: range.startIndex,
386
419
  endIndex: range.endIndex,
@@ -395,6 +428,7 @@ const MessagePrimitivePartsCompat = ({ components, unstable_showEmptyOnNonTextEn
395
428
  });
396
429
  }, [
397
430
  messageRanges,
431
+ partIds,
398
432
  components,
399
433
  contentLength
400
434
  ]);
@@ -408,6 +442,6 @@ const MessagePrimitivePartsCompat = ({ components, unstable_showEmptyOnNonTextEn
408
442
  ] });
409
443
  };
410
444
  //#endregion
411
- export { MessagePartChildren, MessagePartComponent, MessagePrimitivePartByIndex, MessagePrimitiveParts, defaultComponents };
445
+ export { MessagePartChildren, MessagePartComponent, MessagePrimitivePartByIndex, MessagePrimitiveParts, defaultComponents, groupMessageParts };
412
446
 
413
447
  //# sourceMappingURL=MessageParts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageParts.js","names":[],"sources":["../../../../src/react/primitives/message/MessageParts.tsx"],"sourcesContent":["import {\n type ComponentType,\n type FC,\n type ReactNode,\n memo,\n type PropsWithChildren,\n useMemo,\n} from \"react\";\nimport {\n RenderChildrenWithAccessor,\n useAuiState,\n useAui,\n} from \"@assistant-ui/store\";\nimport type { PartState } from \"../../../store/scopes/part\";\nimport { PartByIndexProvider } from \"../../providers/PartByIndexProvider\";\nimport { TextMessagePartProvider } from \"../../providers/TextMessagePartProvider\";\nimport { ChainOfThoughtByIndicesProvider } from \"../../providers/ChainOfThoughtByIndicesProvider\";\nimport { getMessageQuote } from \"../../utils/getMessageQuote\";\nimport type {\n Unstable_AudioMessagePartComponent,\n DataMessagePartComponent,\n DataMessagePartProps,\n EmptyMessagePartComponent,\n TextMessagePartComponent,\n ImageMessagePartComponent,\n SourceMessagePartComponent,\n ToolCallMessagePartComponent,\n ToolCallMessagePartProps,\n FileMessagePartComponent,\n ReasoningMessagePartComponent,\n ReasoningGroupComponent,\n QuoteMessagePartComponent,\n GenerativeUIComponentRegistry,\n} from \"../../types/MessagePartComponentTypes\";\nimport { GenerativeUIRender } from \"../generativeUI/GenerativeUI\";\nimport {\n isMcpAppUri,\n type MessagePartStatus,\n type GenerativeUIMessagePart,\n} from \"../../../types/message\";\nimport type { DataRenderersState } from \"../../types/scopes/dataRenderers\";\nimport type { ToolsState } from \"../../types/scopes/tools\";\nimport { useShallow } from \"zustand/shallow\";\n\ntype MessagePartRange =\n | { type: \"single\"; index: number }\n | { type: \"toolGroup\"; startIndex: number; endIndex: number }\n | { type: \"reasoningGroup\"; startIndex: number; endIndex: number }\n | { type: \"chainOfThoughtGroup\"; startIndex: number; endIndex: number };\n\n/**\n * Creates a group state manager for a specific part type.\n * Returns functions to start, end, and finalize groups.\n */\nconst createGroupState = <\n T extends \"toolGroup\" | \"reasoningGroup\" | \"chainOfThoughtGroup\",\n>(\n groupType: T,\n) => {\n let start = -1;\n\n return {\n startGroup: (index: number) => {\n if (start === -1) {\n start = index;\n }\n },\n endGroup: (endIndex: number, ranges: MessagePartRange[]) => {\n if (start !== -1) {\n ranges.push({\n type: groupType,\n startIndex: start,\n endIndex,\n } as MessagePartRange);\n start = -1;\n }\n },\n finalize: (endIndex: number, ranges: MessagePartRange[]) => {\n if (start !== -1) {\n ranges.push({\n type: groupType,\n startIndex: start,\n endIndex,\n } as MessagePartRange);\n }\n },\n };\n};\n\n/**\n * Groups consecutive tool-call and reasoning message parts into ranges.\n * Always groups tool calls and reasoning parts, even if there's only one.\n * When useChainOfThought is true, groups tool-call and reasoning parts together.\n */\nconst groupMessageParts = (\n messageTypes: readonly string[],\n useChainOfThought: boolean,\n): MessagePartRange[] => {\n const ranges: MessagePartRange[] = [];\n\n if (useChainOfThought) {\n const chainOfThoughtGroup = createGroupState(\"chainOfThoughtGroup\");\n\n for (let i = 0; i < messageTypes.length; i++) {\n const type = messageTypes[i];\n\n if (type === \"tool-call\" || type === \"reasoning\") {\n chainOfThoughtGroup.startGroup(i);\n } else {\n chainOfThoughtGroup.endGroup(i - 1, ranges);\n ranges.push({ type: \"single\", index: i });\n }\n }\n\n chainOfThoughtGroup.finalize(messageTypes.length - 1, ranges);\n } else {\n const toolGroup = createGroupState(\"toolGroup\");\n const reasoningGroup = createGroupState(\"reasoningGroup\");\n\n for (let i = 0; i < messageTypes.length; i++) {\n const type = messageTypes[i];\n\n if (type === \"tool-call\") {\n reasoningGroup.endGroup(i - 1, ranges);\n toolGroup.startGroup(i);\n } else if (type === \"reasoning\") {\n toolGroup.endGroup(i - 1, ranges);\n reasoningGroup.startGroup(i);\n } else {\n toolGroup.endGroup(i - 1, ranges);\n reasoningGroup.endGroup(i - 1, ranges);\n ranges.push({ type: \"single\", index: i });\n }\n }\n\n toolGroup.finalize(messageTypes.length - 1, ranges);\n reasoningGroup.finalize(messageTypes.length - 1, ranges);\n }\n\n return ranges;\n};\n\nconst useMessagePartsGroups = (\n useChainOfThought: boolean,\n): MessagePartRange[] => {\n const messageTypes = useAuiState(\n useShallow((s) => s.message.parts.map((c: any) => c.type)),\n );\n\n return useMemo(() => {\n if (messageTypes.length === 0) {\n return [];\n }\n return groupMessageParts(messageTypes, useChainOfThought);\n }, [messageTypes, useChainOfThought]);\n};\n\nexport namespace MessagePrimitiveParts {\n type DataConfig = {\n /** Map data event names to specific components */\n by_name?: Record<string, DataMessagePartComponent | undefined> | undefined;\n /** Fallback component for unmatched data events */\n Fallback?: DataMessagePartComponent | undefined;\n };\n\n type BaseComponents = {\n /** Component for rendering empty messages */\n Empty?: EmptyMessagePartComponent | undefined;\n /** Component for rendering text content */\n Text?: TextMessagePartComponent | undefined;\n /** Component for rendering source content */\n Source?: SourceMessagePartComponent | undefined;\n /** Component for rendering image content */\n Image?: ImageMessagePartComponent | undefined;\n /** Component for rendering file content */\n File?: FileMessagePartComponent | undefined;\n /** Component for rendering audio content (experimental) */\n Unstable_Audio?: Unstable_AudioMessagePartComponent | undefined;\n /** Configuration for data part rendering */\n data?: DataConfig | undefined;\n /** Component for rendering a quoted message reference (from metadata, not parts) */\n Quote?: QuoteMessagePartComponent | undefined;\n /**\n * Configuration for generative-ui part rendering.\n *\n * `components` is the consumer-provided allowlist of React components\n * the agent's JSON spec is permitted to render. Any name not present in\n * the registry is rejected with a typed `GenerativeUIRenderError` —\n * this is the security boundary in the same-realm rendering path.\n */\n generativeUI?:\n | {\n /** The component allowlist (the security boundary). */\n components: GenerativeUIComponentRegistry;\n /** Optional fallback for unknown component names. */\n Fallback?:\n | ComponentType<{ component: string; props?: unknown }>\n | undefined;\n }\n | undefined;\n };\n\n type ToolsConfig =\n | {\n /** Map of tool names to their specific components */\n by_name?:\n | Record<string, ToolCallMessagePartComponent | undefined>\n | undefined;\n /** Fallback component for unregistered tools */\n Fallback?: ComponentType<ToolCallMessagePartProps> | undefined;\n }\n | {\n /** Override component that handles all tool calls */\n Override: ComponentType<ToolCallMessagePartProps>;\n };\n\n /**\n * Standard component configuration for rendering reasoning and tool-call parts\n * individually (with optional grouping).\n *\n * Cannot be combined with `ChainOfThought`.\n */\n type StandardComponents = BaseComponents & {\n /** Component for rendering reasoning content (typically hidden) */\n Reasoning?: ReasoningMessagePartComponent | undefined;\n /** Configuration for tool call rendering */\n tools?: ToolsConfig | undefined;\n\n /**\n * Component for rendering grouped consecutive tool calls.\n *\n * @param startIndex - Index of the first tool call in the group\n * @param endIndex - Index of the last tool call in the group\n * @param children - Rendered tool call components to display within the group\n *\n * @deprecated Use `<MessagePrimitive.GroupedParts>` with a custom `groupBy` instead.\n */\n ToolGroup?: ComponentType<\n PropsWithChildren<{ startIndex: number; endIndex: number }>\n >;\n\n /**\n * Component for rendering grouped reasoning parts.\n *\n * @param startIndex - Index of the first reasoning part in the group\n * @param endIndex - Index of the last reasoning part in the group\n * @param children - Rendered reasoning part components\n *\n * @deprecated Use `<MessagePrimitive.GroupedParts>` with a custom `groupBy` instead.\n */\n ReasoningGroup?: ReasoningGroupComponent;\n\n ChainOfThought?: never;\n };\n\n /**\n * Chain of thought component configuration.\n *\n * When `ChainOfThought` is set, it takes control of rendering ALL reasoning and\n * tool-call parts in the message. The `Reasoning`, `tools`, `ReasoningGroup`, and\n * `ToolGroup` components cannot be used alongside it.\n */\n type ChainOfThoughtComponents = BaseComponents & {\n /**\n * @deprecated Use `<MessagePrimitive.GroupedParts>` with a `groupBy`\n * that returns `[\"group-thought\", ...]` for reasoning and tool-call\n * parts. See `@assistant-ui/ui` for a worked example.\n */\n ChainOfThought: ComponentType;\n\n Reasoning?: never;\n tools?: never;\n ToolGroup?: never;\n ReasoningGroup?: never;\n };\n\n export type Props =\n | {\n /**\n * Component configuration for rendering different types of message content.\n *\n * Use either `Reasoning`/`tools`/`ToolGroup`/`ReasoningGroup` for standard rendering,\n * or `ChainOfThought` to group all reasoning and tool-call parts into a single\n * collapsible component. These two modes are mutually exclusive.\n */\n components?: StandardComponents | ChainOfThoughtComponents | undefined;\n /**\n * When enabled, shows the Empty component if the last part in the message\n * is anything other than Text or Reasoning.\n *\n * @experimental This API is experimental and may change in future versions.\n * @default true\n */\n unstable_showEmptyOnNonTextEnd?: boolean | undefined;\n children?: never;\n }\n | {\n /** Render function called for each part. Receives the enriched part state. */\n children: (value: { part: EnrichedPartState }) => ReactNode;\n components?: never;\n unstable_showEmptyOnNonTextEnd?: never;\n };\n}\n\nconst ToolUIDisplay = ({\n Fallback,\n ...props\n}: {\n Fallback: ToolCallMessagePartComponent | undefined;\n} & ToolCallMessagePartProps) => {\n const Render = useAuiState(\n (s) => s.tools.toolUIs[props.toolName]?.[0]?.render ?? Fallback,\n );\n if (!Render) return null;\n return <Render {...props} />;\n};\n\nconst getDataRenderer = (\n dataRenderers: DataRenderersState,\n name: string,\n inlineFallback: DataMessagePartComponent | undefined,\n): DataMessagePartComponent | undefined => {\n const named = dataRenderers.renderers[name]?.[0];\n if (named) return named;\n return dataRenderers.fallbacks[0] ?? inlineFallback;\n};\n\nconst DataUIDisplay = ({\n Fallback,\n ...props\n}: {\n Fallback: DataMessagePartComponent | undefined;\n} & DataMessagePartProps) => {\n const Render = useAuiState((s) =>\n getDataRenderer(s.dataRenderers, props.name, Fallback),\n );\n if (!Render) return null;\n return <Render {...props} />;\n};\n\n/**\n * Platform-agnostic no-op default components.\n * Each platform (web, RN) wraps MessagePrimitiveParts with its own defaults.\n */\nexport const defaultComponents = {\n Text: () => null,\n Reasoning: () => null,\n Source: () => null,\n Image: () => null,\n File: () => null,\n Unstable_Audio: () => null,\n ToolGroup: ({ children }: PropsWithChildren) => children,\n ReasoningGroup: ({ children }: PropsWithChildren) => children,\n} satisfies MessagePrimitiveParts.Props[\"components\"];\n\ntype MessagePartComponentProps = {\n components: MessagePrimitiveParts.Props[\"components\"];\n};\n\nexport const MessagePartComponent: FC<MessagePartComponentProps> = ({\n components: {\n Text = defaultComponents.Text,\n Reasoning = defaultComponents.Reasoning,\n Image = defaultComponents.Image,\n Source = defaultComponents.Source,\n File = defaultComponents.File,\n Unstable_Audio: Audio = defaultComponents.Unstable_Audio,\n tools = {},\n data,\n generativeUI,\n } = {},\n}) => {\n const aui = useAui();\n const part = useAuiState((s) => s.part);\n\n const type = part.type;\n if (type === \"tool-call\") {\n const addResult = aui.part().addToolResult;\n const resume = aui.part().resumeToolCall;\n const respondToApproval = aui.part().respondToToolApproval;\n if (\"Override\" in tools)\n return (\n <tools.Override\n {...part}\n addResult={addResult}\n resume={resume}\n respondToApproval={respondToApproval}\n />\n );\n const Tool = tools.by_name?.[part.toolName] ?? tools.Fallback;\n return (\n <ToolUIDisplay\n {...part}\n Fallback={Tool}\n addResult={addResult}\n resume={resume}\n respondToApproval={respondToApproval}\n />\n );\n }\n\n if (part.status?.type === \"requires-action\")\n throw new Error(\"Encountered unexpected requires-action status\");\n\n switch (type) {\n case \"text\":\n return <Text {...part} />;\n\n case \"reasoning\":\n return <Reasoning {...part} />;\n\n case \"source\":\n return <Source {...part} />;\n\n case \"image\":\n return <Image {...part} />;\n\n case \"file\":\n return <File {...part} />;\n\n case \"audio\":\n return <Audio {...part} />;\n\n case \"data\": {\n const Data = data?.by_name?.[part.name] ?? data?.Fallback;\n return <DataUIDisplay {...part} Fallback={Data} />;\n }\n\n case \"generative-ui\": {\n if (!generativeUI?.components) {\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV !== \"production\"\n ) {\n console.warn(\n \"MessagePrimitive.Parts received a generative-ui part but no \" +\n \"`components.generativeUI.components` allowlist was provided. \" +\n \"Pass an allowlist or render with <MessagePrimitive.GenerativeUI />.\",\n );\n }\n return null;\n }\n return (\n <GenerativeUIRender\n spec={(part as GenerativeUIMessagePart).spec}\n components={generativeUI.components}\n Fallback={generativeUI.Fallback}\n />\n );\n }\n\n default:\n console.warn(`Unknown message part type: ${type}`);\n return null;\n }\n};\n\nexport namespace MessagePrimitivePartByIndex {\n export type Props = {\n index: number;\n components: MessagePrimitiveParts.Props[\"components\"];\n };\n}\n\n/**\n * Renders a single message part at the specified index.\n */\nexport const MessagePrimitivePartByIndex: FC<MessagePrimitivePartByIndex.Props> =\n memo(\n ({ index, components }) => {\n return (\n <PartByIndexProvider index={index}>\n <MessagePartComponent components={components} />\n </PartByIndexProvider>\n );\n },\n (prev, next) =>\n prev.index === next.index &&\n prev.components?.Text === next.components?.Text &&\n prev.components?.Reasoning === next.components?.Reasoning &&\n prev.components?.Source === next.components?.Source &&\n prev.components?.Image === next.components?.Image &&\n prev.components?.File === next.components?.File &&\n prev.components?.Unstable_Audio === next.components?.Unstable_Audio &&\n prev.components?.tools === next.components?.tools &&\n prev.components?.data === next.components?.data &&\n prev.components?.generativeUI === next.components?.generativeUI &&\n prev.components?.ToolGroup === next.components?.ToolGroup &&\n prev.components?.ReasoningGroup === next.components?.ReasoningGroup,\n );\n\nMessagePrimitivePartByIndex.displayName = \"MessagePrimitive.PartByIndex\";\n\nconst EmptyPartFallback: FC<{\n status: MessagePartStatus;\n component: TextMessagePartComponent;\n}> = ({ status, component: Component }) => {\n return (\n <TextMessagePartProvider text=\"\" isRunning={status.type === \"running\"}>\n <Component type=\"text\" text=\"\" status={status} />\n </TextMessagePartProvider>\n );\n};\n\nconst COMPLETE_STATUS: MessagePartStatus = Object.freeze({\n type: \"complete\",\n});\n\nconst RUNNING_STATUS: MessagePartStatus = Object.freeze({\n type: \"running\",\n});\n\nconst EmptyPartsImpl: FC<MessagePartComponentProps> = ({ components }) => {\n const status = useAuiState(\n (s) => (s.message.status ?? COMPLETE_STATUS) as MessagePartStatus,\n );\n\n if (components?.Empty) return <components.Empty status={status} />;\n\n if (status.type !== \"running\") return null;\n\n return (\n <EmptyPartFallback\n status={status}\n component={components?.Text ?? defaultComponents.Text}\n />\n );\n};\n\nconst EmptyParts = memo(\n EmptyPartsImpl,\n (prev, next) =>\n prev.components?.Empty === next.components?.Empty &&\n prev.components?.Text === next.components?.Text,\n);\n\nconst ConditionalEmptyImpl: FC<{\n components: MessagePrimitiveParts.Props[\"components\"];\n enabled: boolean;\n}> = ({ components, enabled }) => {\n const shouldShowEmpty = useAuiState((s) => {\n if (!enabled) return false;\n if (s.message.parts.length === 0) return false;\n\n const lastPart = s.message.parts[s.message.parts.length - 1];\n return lastPart?.type !== \"text\" && lastPart?.type !== \"reasoning\";\n });\n\n if (!shouldShowEmpty) return null;\n return <EmptyParts components={components} />;\n};\n\nconst ConditionalEmpty = memo(\n ConditionalEmptyImpl,\n (prev, next) =>\n prev.enabled === next.enabled &&\n prev.components?.Empty === next.components?.Empty &&\n prev.components?.Text === next.components?.Text,\n);\n\nconst QuoteRendererImpl: FC<{ Quote: QuoteMessagePartComponent }> = ({\n Quote,\n}) => {\n const quoteInfo = useAuiState(getMessageQuote);\n if (!quoteInfo) return null;\n return <Quote text={quoteInfo.text} messageId={quoteInfo.messageId} />;\n};\n\nconst QuoteRenderer = memo(QuoteRendererImpl);\n\nfunction resolveToolRender(\n toolsState: ToolsState,\n part: Extract<PartState, { type: \"tool-call\" }>,\n): ToolCallMessagePartComponent | null {\n const named = toolsState.toolUIs[part.toolName]?.[0]?.render ?? null;\n if (named) return named;\n if (isMcpAppUri(part.mcp?.app?.resourceUri) && toolsState.mcpApp) {\n return toolsState.mcpApp.render;\n }\n return null;\n}\n\n/**\n * Stable propless component that renders the registered tool UI for the\n * current part context. Reads tool registry and part state from context.\n */\nconst RegisteredToolUI: FC = () => {\n const aui = useAui();\n const part = useAuiState((s) => s.part);\n const Render = useAuiState((s) =>\n s.part.type === \"tool-call\" ? resolveToolRender(s.tools, s.part) : null,\n );\n\n if (!Render || part.type !== \"tool-call\") return null;\n\n return (\n <Render\n {...part}\n addResult={aui.part().addToolResult}\n resume={aui.part().resumeToolCall}\n respondToApproval={aui.part().respondToToolApproval}\n />\n );\n};\n\n/**\n * Stable propless component that renders the registered data renderer UI\n * for the current part context.\n */\nconst RegisteredDataRendererUI: FC = () => {\n const part = useAuiState((s) => s.part);\n const Render = useAuiState((s) =>\n s.part.type === \"data\"\n ? (getDataRenderer(s.dataRenderers, s.part.name, undefined) ?? null)\n : null,\n );\n\n if (!Render || part.type !== \"data\") return null;\n\n return <Render {...(part as DataMessagePartProps)} />;\n};\n\n/**\n * Fallback component rendered when the children render function returns null.\n * Renders registered tool/data UIs via context.\n * For all other part types, renders nothing.\n *\n * This allows users to write:\n * {({ part }) => {\n * if (part.type === \"text\") return <MyText />;\n * return null; // tool UIs and data UIs still render via registry\n * }}\n *\n * To explicitly render nothing (suppressing registered UIs), return <></>.\n */\nconst DefaultPartFallback: FC = () => {\n const partType = useAuiState((s) => s.part.type);\n\n if (partType === \"tool-call\") return <RegisteredToolUI />;\n if (partType === \"data\") return <RegisteredDataRendererUI />;\n\n return null;\n};\n\nexport type { PartState };\n\n/**\n * Enriched part state passed to children render functions.\n *\n * For tool-call parts, adds `toolUI`, `addResult`, and `resume`.\n * For data parts, adds `dataRendererUI`.\n *\n * The render function is also invoked once with a synthetic empty text part\n * (`{ type: \"text\", text: \"\", status: { type: \"running\" } }`) when the\n * assistant message has no parts yet but is in the running state, so a\n * loading indicator can render. Differentiate this from a real empty text\n * via `part.status?.type === \"running\" && part.text === \"\"`.\n */\nexport type EnrichedPartState =\n | (Extract<PartState, { type: \"tool-call\" }> & {\n /** The registered tool UI element, or null if none registered. */\n readonly toolUI: ReactNode;\n /** Add a tool result to this tool call. */\n addResult: ToolCallMessagePartProps[\"addResult\"];\n /** Resume a tool call waiting for human input. */\n resume: ToolCallMessagePartProps[\"resume\"];\n /** Respond to a server-side tool approval gate. */\n respondToApproval: ToolCallMessagePartProps[\"respondToApproval\"];\n })\n | (Extract<PartState, { type: \"data\" }> & {\n /** The registered data renderer UI element, or null if none registered. */\n readonly dataRendererUI: ReactNode;\n })\n | Exclude<PartState, { type: \"tool-call\" } | { type: \"data\" }>;\n\nconst EMPTY_RUNNING_TEXT_PART: Extract<EnrichedPartState, { type: \"text\" }> =\n Object.freeze({\n type: \"text\",\n text: \"\",\n status: RUNNING_STATUS,\n });\n\n/**\n * @internal\n * Renders a single part by index, calling `children` with the\n * {@link EnrichedPartState} (tool/data UI enrichments + addResult/resume\n * for tool calls). Shared between `<MessagePrimitive.Parts>` and\n * `<MessagePrimitive.GroupedParts>`. Returns whatever `children`\n * returns — callers decide how to handle a `null` return.\n */\nexport const MessagePartChildren: FC<{\n index: number;\n children: (value: { part: EnrichedPartState }) => ReactNode;\n}> = ({ index, children }) => {\n const aui = useAui();\n // Subscribed (not snapshotted like `tools`) so fallbacks registered\n // after the first render trigger a re-render and `hasUI` re-evaluates.\n const dataRenderers = useAuiState((s) => s.dataRenderers);\n\n return (\n <PartByIndexProvider index={index}>\n <RenderChildrenWithAccessor\n getItemState={(aui) => aui.message().part({ index }).getState()}\n >\n {(getItem) =>\n children({\n get part() {\n const state = getItem();\n if (state.type === \"tool-call\") {\n const toolsState = aui.tools().getState();\n const hasUI = resolveToolRender(toolsState, state) !== null;\n const partMethods = aui.message().part({ index });\n return {\n ...state,\n toolUI: hasUI ? <RegisteredToolUI /> : null,\n addResult: partMethods.addToolResult,\n resume: partMethods.resumeToolCall,\n respondToApproval: partMethods.respondToToolApproval,\n };\n }\n if (state.type === \"data\") {\n const hasUI =\n getDataRenderer(dataRenderers, state.name, undefined) !==\n undefined;\n return {\n ...state,\n dataRendererUI: hasUI ? <RegisteredDataRendererUI /> : null,\n };\n }\n return state;\n },\n })\n }\n </RenderChildrenWithAccessor>\n </PartByIndexProvider>\n );\n};\n\nconst MessagePrimitivePartsInner: FC<{\n children: (value: { part: EnrichedPartState }) => ReactNode;\n}> = ({ children }) => {\n const contentLength = useAuiState((s) => s.message.parts.length);\n const isRunning = useAuiState(\n (s) => (s.message.status?.type ?? \"complete\") === \"running\",\n );\n const isEmptyRunning = contentLength === 0 && isRunning;\n\n if (contentLength === 0) {\n if (!isEmptyRunning) return null;\n return (\n <TextMessagePartProvider text=\"\" isRunning>\n {children({ part: EMPTY_RUNNING_TEXT_PART })}\n </TextMessagePartProvider>\n );\n }\n\n return (\n <>\n {Array.from({ length: contentLength }, (_, index) => (\n <MessagePartChildren key={index} index={index}>\n {(value) => children(value) ?? <DefaultPartFallback />}\n </MessagePartChildren>\n ))}\n </>\n );\n};\n\n/**\n * Renders the parts of a message with support for multiple content types.\n *\n * This is the platform-agnostic base. Each platform wraps this with its own\n * default components (web uses `<p>`, `<span>`; RN would use `<Text>`, etc.).\n */\nexport const MessagePrimitiveParts: FC<MessagePrimitiveParts.Props> = ({\n components,\n unstable_showEmptyOnNonTextEnd = true,\n children,\n}) => {\n if (children) {\n return <MessagePrimitivePartsInner>{children}</MessagePrimitivePartsInner>;\n }\n return (\n <MessagePrimitivePartsCompat\n components={components}\n unstable_showEmptyOnNonTextEnd={unstable_showEmptyOnNonTextEnd}\n />\n );\n};\n\nMessagePrimitiveParts.displayName = \"MessagePrimitive.Parts\";\n\nconst MessagePrimitivePartsCompat: FC<{\n components: MessagePrimitiveParts.Props[\"components\"];\n unstable_showEmptyOnNonTextEnd: boolean;\n}> = ({ components, unstable_showEmptyOnNonTextEnd }) => {\n const contentLength = useAuiState((s) => s.message.parts.length);\n const useChainOfThought = !!components?.ChainOfThought;\n const messageRanges = useMessagePartsGroups(useChainOfThought);\n\n const partsElements = useMemo(() => {\n if (contentLength === 0) {\n return <EmptyParts components={components} />;\n }\n\n return messageRanges.map((range) => {\n if (range.type === \"single\") {\n return (\n <MessagePrimitivePartByIndex\n key={range.index}\n index={range.index}\n components={components}\n />\n );\n } else if (range.type === \"chainOfThoughtGroup\") {\n const ChainOfThoughtComponent = components?.ChainOfThought;\n if (!ChainOfThoughtComponent) return null;\n return (\n <ChainOfThoughtByIndicesProvider\n key={`chainOfThought-${range.startIndex}`}\n startIndex={range.startIndex}\n endIndex={range.endIndex}\n >\n <ChainOfThoughtComponent />\n </ChainOfThoughtByIndicesProvider>\n );\n } else if (range.type === \"toolGroup\") {\n const ToolGroupComponent =\n components?.ToolGroup ?? defaultComponents.ToolGroup;\n return (\n <ToolGroupComponent\n key={`tool-${range.startIndex}`}\n startIndex={range.startIndex}\n endIndex={range.endIndex}\n >\n {Array.from(\n { length: range.endIndex - range.startIndex + 1 },\n (_, i) => {\n const partIndex = range.startIndex + i;\n return (\n <MessagePrimitivePartByIndex\n key={`part-${partIndex}`}\n index={partIndex}\n components={components}\n />\n );\n },\n )}\n </ToolGroupComponent>\n );\n } else {\n // reasoningGroup\n const ReasoningGroupComponent =\n components?.ReasoningGroup ?? defaultComponents.ReasoningGroup;\n return (\n <ReasoningGroupComponent\n key={`reasoning-${range.startIndex}`}\n startIndex={range.startIndex}\n endIndex={range.endIndex}\n >\n {Array.from(\n { length: range.endIndex - range.startIndex + 1 },\n (_, i) => {\n const partIndex = range.startIndex + i;\n return (\n <MessagePrimitivePartByIndex\n key={`part-${partIndex}`}\n index={partIndex}\n components={components}\n />\n );\n },\n )}\n </ReasoningGroupComponent>\n );\n }\n });\n }, [messageRanges, components, contentLength]);\n\n return (\n <>\n {components?.Quote && <QuoteRenderer Quote={components.Quote} />}\n {partsElements}\n <ConditionalEmpty\n components={components}\n enabled={unstable_showEmptyOnNonTextEnd}\n />\n </>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"MessageParts.js","names":[],"sources":["../../../../src/react/primitives/message/MessageParts.tsx"],"sourcesContent":["import {\n type ComponentType,\n type FC,\n type ReactNode,\n memo,\n type PropsWithChildren,\n useMemo,\n} from \"react\";\nimport {\n RenderChildrenWithAccessor,\n useAuiState,\n useAui,\n} from \"@assistant-ui/store\";\nimport type { PartState } from \"../../../store/scopes/part\";\nimport { PartByIndexProvider } from \"../../providers/PartByIndexProvider\";\nimport { TextMessagePartProvider } from \"../../providers/TextMessagePartProvider\";\nimport { ChainOfThoughtByIndicesProvider } from \"../../providers/ChainOfThoughtByIndicesProvider\";\nimport { getMessageQuote } from \"../../utils/getMessageQuote\";\nimport type {\n Unstable_AudioMessagePartComponent,\n DataMessagePartComponent,\n DataMessagePartProps,\n EmptyMessagePartComponent,\n TextMessagePartComponent,\n ImageMessagePartComponent,\n SourceMessagePartComponent,\n ToolCallMessagePartComponent,\n ToolCallMessagePartProps,\n FileMessagePartComponent,\n ReasoningMessagePartComponent,\n ReasoningGroupComponent,\n QuoteMessagePartComponent,\n GenerativeUIComponentRegistry,\n} from \"../../types/MessagePartComponentTypes\";\nimport { GenerativeUIRender } from \"../generativeUI/GenerativeUI\";\nimport {\n isMcpAppUri,\n type MessagePartStatus,\n type GenerativeUIMessagePart,\n} from \"../../../types/message\";\nimport type { DataRenderersState } from \"../../types/scopes/dataRenderers\";\nimport type { ToolsState } from \"../../types/scopes/tools\";\nimport { useShallow } from \"zustand/shallow\";\n\ntype MessagePartRange =\n | { type: \"single\"; index: number }\n | {\n type: \"toolGroup\";\n startIndex: number;\n endIndex: number;\n idKey?: string | undefined;\n }\n | {\n type: \"reasoningGroup\";\n startIndex: number;\n endIndex: number;\n idKey?: string | undefined;\n }\n | {\n type: \"chainOfThoughtGroup\";\n startIndex: number;\n endIndex: number;\n idKey?: string | undefined;\n };\n\n/**\n * Creates a group state manager for a specific part type.\n * Returns functions to start, end, and finalize groups.\n */\nconst createGroupState = <\n T extends \"toolGroup\" | \"reasoningGroup\" | \"chainOfThoughtGroup\",\n>(\n groupType: T,\n) => {\n let start = -1;\n\n return {\n startGroup: (index: number) => {\n if (start === -1) {\n start = index;\n }\n },\n endGroup: (endIndex: number, ranges: MessagePartRange[]) => {\n if (start !== -1) {\n ranges.push({\n type: groupType,\n startIndex: start,\n endIndex,\n } as MessagePartRange);\n start = -1;\n }\n },\n finalize: (endIndex: number, ranges: MessagePartRange[]) => {\n if (start !== -1) {\n ranges.push({\n type: groupType,\n startIndex: start,\n endIndex,\n } as MessagePartRange);\n }\n },\n };\n};\n\n/**\n * Groups consecutive tool-call and reasoning message parts into ranges.\n * Always groups tool calls and reasoning parts, even if there's only one.\n * When useChainOfThought is true, groups tool-call and reasoning parts together.\n * `partIds[i]` optionally carries a stable identity for part `i`; group\n * ranges derive an `idKey` from their first part's id (first claim wins).\n */\nexport const groupMessageParts = (\n messageTypes: readonly string[],\n useChainOfThought: boolean,\n partIds?: readonly (string | undefined)[],\n): MessagePartRange[] => {\n const ranges: MessagePartRange[] = [];\n\n if (useChainOfThought) {\n const chainOfThoughtGroup = createGroupState(\"chainOfThoughtGroup\");\n\n for (let i = 0; i < messageTypes.length; i++) {\n const type = messageTypes[i];\n\n if (type === \"tool-call\" || type === \"reasoning\") {\n chainOfThoughtGroup.startGroup(i);\n } else {\n chainOfThoughtGroup.endGroup(i - 1, ranges);\n ranges.push({ type: \"single\", index: i });\n }\n }\n\n chainOfThoughtGroup.finalize(messageTypes.length - 1, ranges);\n } else {\n const toolGroup = createGroupState(\"toolGroup\");\n const reasoningGroup = createGroupState(\"reasoningGroup\");\n\n for (let i = 0; i < messageTypes.length; i++) {\n const type = messageTypes[i];\n\n if (type === \"tool-call\") {\n reasoningGroup.endGroup(i - 1, ranges);\n toolGroup.startGroup(i);\n } else if (type === \"reasoning\") {\n toolGroup.endGroup(i - 1, ranges);\n reasoningGroup.startGroup(i);\n } else {\n toolGroup.endGroup(i - 1, ranges);\n reasoningGroup.endGroup(i - 1, ranges);\n ranges.push({ type: \"single\", index: i });\n }\n }\n\n toolGroup.finalize(messageTypes.length - 1, ranges);\n reasoningGroup.finalize(messageTypes.length - 1, ranges);\n }\n\n if (partIds) {\n const claimed = new Set<string>();\n for (const range of ranges) {\n if (range.type === \"single\") continue;\n const id = partIds[range.startIndex];\n if (id !== undefined && !claimed.has(id)) {\n claimed.add(id);\n range.idKey = `id:${id}`;\n }\n }\n }\n\n return ranges;\n};\n\nconst useMessagePartsGroups = (\n useChainOfThought: boolean,\n): { ranges: MessagePartRange[]; partIds: (string | undefined)[] } => {\n const messageTypes = useAuiState(\n useShallow((s) => s.message.parts.map((c: any) => c.type)),\n );\n const partIds = useAuiState(\n useShallow((s) =>\n s.message.parts.map((c: any) =>\n c.type === \"tool-call\" ? c.toolCallId : undefined,\n ),\n ),\n );\n\n return useMemo(() => {\n if (messageTypes.length === 0) {\n return { ranges: [], partIds };\n }\n return {\n ranges: groupMessageParts(messageTypes, useChainOfThought, partIds),\n partIds,\n };\n }, [messageTypes, partIds, useChainOfThought]);\n};\n\nexport namespace MessagePrimitiveParts {\n type DataConfig = {\n /** Map data event names to specific components */\n by_name?: Record<string, DataMessagePartComponent | undefined> | undefined;\n /** Fallback component for unmatched data events */\n Fallback?: DataMessagePartComponent | undefined;\n };\n\n type BaseComponents = {\n /** Component for rendering empty messages */\n Empty?: EmptyMessagePartComponent | undefined;\n /** Component for rendering text content */\n Text?: TextMessagePartComponent | undefined;\n /** Component for rendering source content */\n Source?: SourceMessagePartComponent | undefined;\n /** Component for rendering image content */\n Image?: ImageMessagePartComponent | undefined;\n /** Component for rendering file content */\n File?: FileMessagePartComponent | undefined;\n /** Component for rendering audio content (experimental) */\n Unstable_Audio?: Unstable_AudioMessagePartComponent | undefined;\n /** Configuration for data part rendering */\n data?: DataConfig | undefined;\n /** Component for rendering a quoted message reference (from metadata, not parts) */\n Quote?: QuoteMessagePartComponent | undefined;\n /**\n * Configuration for generative-ui part rendering.\n *\n * `components` is the consumer-provided allowlist of React components\n * the agent's JSON spec is permitted to render. Any name not present in\n * the registry is rejected with a typed `GenerativeUIRenderError` —\n * this is the security boundary in the same-realm rendering path.\n */\n generativeUI?:\n | {\n /** The component allowlist (the security boundary). */\n components: GenerativeUIComponentRegistry;\n /** Optional fallback for unknown component names. */\n Fallback?:\n | ComponentType<{ component: string; props?: unknown }>\n | undefined;\n }\n | undefined;\n };\n\n type ToolsConfig =\n | {\n /** Map of tool names to their specific components */\n by_name?:\n | Record<string, ToolCallMessagePartComponent | undefined>\n | undefined;\n /** Fallback component for unregistered tools */\n Fallback?: ComponentType<ToolCallMessagePartProps> | undefined;\n }\n | {\n /** Override component that handles all tool calls */\n Override: ComponentType<ToolCallMessagePartProps>;\n };\n\n /**\n * Standard component configuration for rendering reasoning and tool-call parts\n * individually (with optional grouping).\n *\n * Cannot be combined with `ChainOfThought`.\n */\n type StandardComponents = BaseComponents & {\n /** Component for rendering reasoning content (typically hidden) */\n Reasoning?: ReasoningMessagePartComponent | undefined;\n /** Configuration for tool call rendering */\n tools?: ToolsConfig | undefined;\n\n /**\n * Component for rendering grouped consecutive tool calls.\n *\n * @param startIndex - Index of the first tool call in the group\n * @param endIndex - Index of the last tool call in the group\n * @param children - Rendered tool call components to display within the group\n *\n * @deprecated Use `<MessagePrimitive.GroupedParts>` with a custom `groupBy` instead.\n */\n ToolGroup?: ComponentType<\n PropsWithChildren<{ startIndex: number; endIndex: number }>\n >;\n\n /**\n * Component for rendering grouped reasoning parts.\n *\n * @param startIndex - Index of the first reasoning part in the group\n * @param endIndex - Index of the last reasoning part in the group\n * @param children - Rendered reasoning part components\n *\n * @deprecated Use `<MessagePrimitive.GroupedParts>` with a custom `groupBy` instead.\n */\n ReasoningGroup?: ReasoningGroupComponent;\n\n ChainOfThought?: never;\n };\n\n /**\n * Chain of thought component configuration.\n *\n * When `ChainOfThought` is set, it takes control of rendering ALL reasoning and\n * tool-call parts in the message. The `Reasoning`, `tools`, `ReasoningGroup`, and\n * `ToolGroup` components cannot be used alongside it.\n */\n type ChainOfThoughtComponents = BaseComponents & {\n /**\n * @deprecated Use `<MessagePrimitive.GroupedParts>` with a `groupBy`\n * that returns `[\"group-thought\", ...]` for reasoning and tool-call\n * parts. See `@assistant-ui/ui` for a worked example.\n */\n ChainOfThought: ComponentType;\n\n Reasoning?: never;\n tools?: never;\n ToolGroup?: never;\n ReasoningGroup?: never;\n };\n\n export type Props =\n | {\n /**\n * Component configuration for rendering different types of message content.\n *\n * Use either `Reasoning`/`tools`/`ToolGroup`/`ReasoningGroup` for standard rendering,\n * or `ChainOfThought` to group all reasoning and tool-call parts into a single\n * collapsible component. These two modes are mutually exclusive.\n */\n components?: StandardComponents | ChainOfThoughtComponents | undefined;\n /**\n * When enabled, shows the Empty component if the last part in the message\n * is anything other than Text or Reasoning.\n *\n * @experimental This API is experimental and may change in future versions.\n * @default true\n */\n unstable_showEmptyOnNonTextEnd?: boolean | undefined;\n children?: never;\n }\n | {\n /** Render function called for each part. Receives the enriched part state. */\n children: (value: { part: EnrichedPartState }) => ReactNode;\n components?: never;\n unstable_showEmptyOnNonTextEnd?: never;\n };\n}\n\nconst ToolUIDisplay = ({\n Fallback,\n ...props\n}: {\n Fallback: ToolCallMessagePartComponent | undefined;\n} & ToolCallMessagePartProps) => {\n const Render = useAuiState(\n (s) => s.tools.toolUIs[props.toolName]?.[0]?.render ?? Fallback,\n );\n if (!Render) return null;\n return <Render {...props} />;\n};\n\nconst getDataRenderer = (\n dataRenderers: DataRenderersState,\n name: string,\n inlineFallback: DataMessagePartComponent | undefined,\n): DataMessagePartComponent | undefined => {\n const named = dataRenderers.renderers[name]?.[0];\n if (named) return named;\n return dataRenderers.fallbacks[0] ?? inlineFallback;\n};\n\nconst DataUIDisplay = ({\n Fallback,\n ...props\n}: {\n Fallback: DataMessagePartComponent | undefined;\n} & DataMessagePartProps) => {\n const Render = useAuiState((s) =>\n getDataRenderer(s.dataRenderers, props.name, Fallback),\n );\n if (!Render) return null;\n return <Render {...props} />;\n};\n\n/**\n * Platform-agnostic no-op default components.\n * Each platform (web, RN) wraps MessagePrimitiveParts with its own defaults.\n */\nexport const defaultComponents = {\n Text: () => null,\n Reasoning: () => null,\n Source: () => null,\n Image: () => null,\n File: () => null,\n Unstable_Audio: () => null,\n ToolGroup: ({ children }: PropsWithChildren) => children,\n ReasoningGroup: ({ children }: PropsWithChildren) => children,\n} satisfies MessagePrimitiveParts.Props[\"components\"];\n\ntype MessagePartComponentProps = {\n components: MessagePrimitiveParts.Props[\"components\"];\n};\n\nexport const MessagePartComponent: FC<MessagePartComponentProps> = ({\n components: {\n Text = defaultComponents.Text,\n Reasoning = defaultComponents.Reasoning,\n Image = defaultComponents.Image,\n Source = defaultComponents.Source,\n File = defaultComponents.File,\n Unstable_Audio: Audio = defaultComponents.Unstable_Audio,\n tools = {},\n data,\n generativeUI,\n } = {},\n}) => {\n const aui = useAui();\n const part = useAuiState((s) => s.part);\n\n const type = part.type;\n if (type === \"tool-call\") {\n const addResult = aui.part().addToolResult;\n const resume = aui.part().resumeToolCall;\n const respondToApproval = aui.part().respondToToolApproval;\n if (\"Override\" in tools)\n return (\n <tools.Override\n {...part}\n addResult={addResult}\n resume={resume}\n respondToApproval={respondToApproval}\n />\n );\n const Tool = tools.by_name?.[part.toolName] ?? tools.Fallback;\n return (\n <ToolUIDisplay\n {...part}\n Fallback={Tool}\n addResult={addResult}\n resume={resume}\n respondToApproval={respondToApproval}\n />\n );\n }\n\n if (part.status?.type === \"requires-action\")\n throw new Error(\"Encountered unexpected requires-action status\");\n\n switch (type) {\n case \"text\":\n return <Text {...part} />;\n\n case \"reasoning\":\n return <Reasoning {...part} />;\n\n case \"source\":\n return <Source {...part} />;\n\n case \"image\":\n return <Image {...part} />;\n\n case \"file\":\n return <File {...part} />;\n\n case \"audio\":\n return <Audio {...part} />;\n\n case \"data\": {\n const Data = data?.by_name?.[part.name] ?? data?.Fallback;\n return <DataUIDisplay {...part} Fallback={Data} />;\n }\n\n case \"generative-ui\": {\n if (!generativeUI?.components) {\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV !== \"production\"\n ) {\n console.warn(\n \"MessagePrimitive.Parts received a generative-ui part but no \" +\n \"`components.generativeUI.components` allowlist was provided. \" +\n \"Pass an allowlist or render with <MessagePrimitive.GenerativeUI />.\",\n );\n }\n return null;\n }\n return (\n <GenerativeUIRender\n spec={(part as GenerativeUIMessagePart).spec}\n components={generativeUI.components}\n Fallback={generativeUI.Fallback}\n />\n );\n }\n\n default:\n console.warn(`Unknown message part type: ${type}`);\n return null;\n }\n};\n\nexport namespace MessagePrimitivePartByIndex {\n export type Props = {\n index: number;\n components: MessagePrimitiveParts.Props[\"components\"];\n };\n}\n\n/**\n * Renders a single message part at the specified index.\n */\nexport const MessagePrimitivePartByIndex: FC<MessagePrimitivePartByIndex.Props> =\n memo(\n ({ index, components }) => {\n return (\n <PartByIndexProvider index={index}>\n <MessagePartComponent components={components} />\n </PartByIndexProvider>\n );\n },\n (prev, next) =>\n prev.index === next.index &&\n prev.components?.Text === next.components?.Text &&\n prev.components?.Reasoning === next.components?.Reasoning &&\n prev.components?.Source === next.components?.Source &&\n prev.components?.Image === next.components?.Image &&\n prev.components?.File === next.components?.File &&\n prev.components?.Unstable_Audio === next.components?.Unstable_Audio &&\n prev.components?.tools === next.components?.tools &&\n prev.components?.data === next.components?.data &&\n prev.components?.generativeUI === next.components?.generativeUI &&\n prev.components?.ToolGroup === next.components?.ToolGroup &&\n prev.components?.ReasoningGroup === next.components?.ReasoningGroup,\n );\n\nMessagePrimitivePartByIndex.displayName = \"MessagePrimitive.PartByIndex\";\n\nconst EmptyPartFallback: FC<{\n status: MessagePartStatus;\n component: TextMessagePartComponent;\n}> = ({ status, component: Component }) => {\n return (\n <TextMessagePartProvider text=\"\" isRunning={status.type === \"running\"}>\n <Component type=\"text\" text=\"\" status={status} />\n </TextMessagePartProvider>\n );\n};\n\nconst COMPLETE_STATUS: MessagePartStatus = Object.freeze({\n type: \"complete\",\n});\n\nconst RUNNING_STATUS: MessagePartStatus = Object.freeze({\n type: \"running\",\n});\n\nconst EmptyPartsImpl: FC<MessagePartComponentProps> = ({ components }) => {\n const status = useAuiState(\n (s) => (s.message.status ?? COMPLETE_STATUS) as MessagePartStatus,\n );\n\n if (components?.Empty) return <components.Empty status={status} />;\n\n if (status.type !== \"running\") return null;\n\n return (\n <EmptyPartFallback\n status={status}\n component={components?.Text ?? defaultComponents.Text}\n />\n );\n};\n\nconst EmptyParts = memo(\n EmptyPartsImpl,\n (prev, next) =>\n prev.components?.Empty === next.components?.Empty &&\n prev.components?.Text === next.components?.Text,\n);\n\nconst ConditionalEmptyImpl: FC<{\n components: MessagePrimitiveParts.Props[\"components\"];\n enabled: boolean;\n}> = ({ components, enabled }) => {\n const shouldShowEmpty = useAuiState((s) => {\n if (!enabled) return false;\n if (s.message.parts.length === 0) return false;\n\n const lastPart = s.message.parts[s.message.parts.length - 1];\n return lastPart?.type !== \"text\" && lastPart?.type !== \"reasoning\";\n });\n\n if (!shouldShowEmpty) return null;\n return <EmptyParts components={components} />;\n};\n\nconst ConditionalEmpty = memo(\n ConditionalEmptyImpl,\n (prev, next) =>\n prev.enabled === next.enabled &&\n prev.components?.Empty === next.components?.Empty &&\n prev.components?.Text === next.components?.Text,\n);\n\nconst QuoteRendererImpl: FC<{ Quote: QuoteMessagePartComponent }> = ({\n Quote,\n}) => {\n const quoteInfo = useAuiState(getMessageQuote);\n if (!quoteInfo) return null;\n return <Quote text={quoteInfo.text} messageId={quoteInfo.messageId} />;\n};\n\nconst QuoteRenderer = memo(QuoteRendererImpl);\n\nfunction resolveToolRender(\n toolsState: ToolsState,\n part: Extract<PartState, { type: \"tool-call\" }>,\n): ToolCallMessagePartComponent | null {\n const named = toolsState.toolUIs[part.toolName]?.[0]?.render ?? null;\n if (named) return named;\n if (isMcpAppUri(part.mcp?.app?.resourceUri) && toolsState.mcpApp) {\n return toolsState.mcpApp.render;\n }\n return null;\n}\n\n/**\n * Stable propless component that renders the registered tool UI for the\n * current part context. Reads tool registry and part state from context.\n */\nconst RegisteredToolUI: FC = () => {\n const aui = useAui();\n const part = useAuiState((s) => s.part);\n const Render = useAuiState((s) =>\n s.part.type === \"tool-call\" ? resolveToolRender(s.tools, s.part) : null,\n );\n\n if (!Render || part.type !== \"tool-call\") return null;\n\n return (\n <Render\n {...part}\n addResult={aui.part().addToolResult}\n resume={aui.part().resumeToolCall}\n respondToApproval={aui.part().respondToToolApproval}\n />\n );\n};\n\n/**\n * Stable propless component that renders the registered data renderer UI\n * for the current part context.\n */\nconst RegisteredDataRendererUI: FC = () => {\n const part = useAuiState((s) => s.part);\n const Render = useAuiState((s) =>\n s.part.type === \"data\"\n ? (getDataRenderer(s.dataRenderers, s.part.name, undefined) ?? null)\n : null,\n );\n\n if (!Render || part.type !== \"data\") return null;\n\n return <Render {...(part as DataMessagePartProps)} />;\n};\n\n/**\n * Fallback component rendered when the children render function returns null.\n * Renders registered tool/data UIs via context.\n * For all other part types, renders nothing.\n *\n * This allows users to write:\n * {({ part }) => {\n * if (part.type === \"text\") return <MyText />;\n * return null; // tool UIs and data UIs still render via registry\n * }}\n *\n * To explicitly render nothing (suppressing registered UIs), return <></>.\n */\nconst DefaultPartFallback: FC = () => {\n const partType = useAuiState((s) => s.part.type);\n\n if (partType === \"tool-call\") return <RegisteredToolUI />;\n if (partType === \"data\") return <RegisteredDataRendererUI />;\n\n return null;\n};\n\nexport type { PartState };\n\n/**\n * Enriched part state passed to children render functions.\n *\n * For tool-call parts, adds `toolUI`, `addResult`, and `resume`.\n * For data parts, adds `dataRendererUI`.\n *\n * The render function is also invoked once with a synthetic empty text part\n * (`{ type: \"text\", text: \"\", status: { type: \"running\" } }`) when the\n * assistant message has no parts yet but is in the running state, so a\n * loading indicator can render. Differentiate this from a real empty text\n * via `part.status?.type === \"running\" && part.text === \"\"`.\n */\nexport type EnrichedPartState =\n | (Extract<PartState, { type: \"tool-call\" }> & {\n /** The registered tool UI element, or null if none registered. */\n readonly toolUI: ReactNode;\n /** Add a tool result to this tool call. */\n addResult: ToolCallMessagePartProps[\"addResult\"];\n /** Resume a tool call waiting for human input. */\n resume: ToolCallMessagePartProps[\"resume\"];\n /** Respond to a server-side tool approval gate. */\n respondToApproval: ToolCallMessagePartProps[\"respondToApproval\"];\n })\n | (Extract<PartState, { type: \"data\" }> & {\n /** The registered data renderer UI element, or null if none registered. */\n readonly dataRendererUI: ReactNode;\n })\n | Exclude<PartState, { type: \"tool-call\" } | { type: \"data\" }>;\n\nconst EMPTY_RUNNING_TEXT_PART: Extract<EnrichedPartState, { type: \"text\" }> =\n Object.freeze({\n type: \"text\",\n text: \"\",\n status: RUNNING_STATUS,\n });\n\n/**\n * @internal\n * Renders a single part by index, calling `children` with the\n * {@link EnrichedPartState} (tool/data UI enrichments + addResult/resume\n * for tool calls). Shared between `<MessagePrimitive.Parts>` and\n * `<MessagePrimitive.GroupedParts>`. Returns whatever `children`\n * returns — callers decide how to handle a `null` return.\n */\nexport const MessagePartChildren: FC<{\n index: number;\n children: (value: { part: EnrichedPartState }) => ReactNode;\n}> = ({ index, children }) => {\n const aui = useAui();\n // Subscribed (not snapshotted like `tools`) so fallbacks registered\n // after the first render trigger a re-render and `hasUI` re-evaluates.\n const dataRenderers = useAuiState((s) => s.dataRenderers);\n\n return (\n <PartByIndexProvider index={index}>\n <RenderChildrenWithAccessor\n getItemState={(aui) => aui.message().part({ index }).getState()}\n >\n {(getItem) =>\n children({\n get part() {\n const state = getItem();\n if (state.type === \"tool-call\") {\n const toolsState = aui.tools().getState();\n const hasUI = resolveToolRender(toolsState, state) !== null;\n const partMethods = aui.message().part({ index });\n return {\n ...state,\n toolUI: hasUI ? <RegisteredToolUI /> : null,\n addResult: partMethods.addToolResult,\n resume: partMethods.resumeToolCall,\n respondToApproval: partMethods.respondToToolApproval,\n };\n }\n if (state.type === \"data\") {\n const hasUI =\n getDataRenderer(dataRenderers, state.name, undefined) !==\n undefined;\n return {\n ...state,\n dataRendererUI: hasUI ? <RegisteredDataRendererUI /> : null,\n };\n }\n return state;\n },\n })\n }\n </RenderChildrenWithAccessor>\n </PartByIndexProvider>\n );\n};\n\nconst MessagePrimitivePartsInner: FC<{\n children: (value: { part: EnrichedPartState }) => ReactNode;\n}> = ({ children }) => {\n const contentLength = useAuiState((s) => s.message.parts.length);\n const isRunning = useAuiState(\n (s) => (s.message.status?.type ?? \"complete\") === \"running\",\n );\n const isEmptyRunning = contentLength === 0 && isRunning;\n\n if (contentLength === 0) {\n if (!isEmptyRunning) return null;\n return (\n <TextMessagePartProvider text=\"\" isRunning>\n {children({ part: EMPTY_RUNNING_TEXT_PART })}\n </TextMessagePartProvider>\n );\n }\n\n return (\n <>\n {Array.from({ length: contentLength }, (_, index) => (\n <MessagePartChildren key={index} index={index}>\n {(value) => children(value) ?? <DefaultPartFallback />}\n </MessagePartChildren>\n ))}\n </>\n );\n};\n\n/**\n * Renders the parts of a message with support for multiple content types.\n *\n * This is the platform-agnostic base. Each platform wraps this with its own\n * default components (web uses `<p>`, `<span>`; RN would use `<Text>`, etc.).\n */\nexport const MessagePrimitiveParts: FC<MessagePrimitiveParts.Props> = ({\n components,\n unstable_showEmptyOnNonTextEnd = true,\n children,\n}) => {\n if (children) {\n return <MessagePrimitivePartsInner>{children}</MessagePrimitivePartsInner>;\n }\n return (\n <MessagePrimitivePartsCompat\n components={components}\n unstable_showEmptyOnNonTextEnd={unstable_showEmptyOnNonTextEnd}\n />\n );\n};\n\nMessagePrimitiveParts.displayName = \"MessagePrimitive.Parts\";\n\nconst MessagePrimitivePartsCompat: FC<{\n components: MessagePrimitiveParts.Props[\"components\"];\n unstable_showEmptyOnNonTextEnd: boolean;\n}> = ({ components, unstable_showEmptyOnNonTextEnd }) => {\n const contentLength = useAuiState((s) => s.message.parts.length);\n const useChainOfThought = !!components?.ChainOfThought;\n const { ranges: messageRanges, partIds } =\n useMessagePartsGroups(useChainOfThought);\n\n const partsElements = useMemo(() => {\n if (contentLength === 0) {\n return <EmptyParts components={components} />;\n }\n\n const claimed = new Set<string>();\n const toolLeafKey = (partIndex: number) => {\n const id = partIds[partIndex];\n if (id !== undefined && !claimed.has(id)) {\n claimed.add(id);\n return `part-id:${id}`;\n }\n return `part-${partIndex}`;\n };\n\n return messageRanges.map((range) => {\n if (range.type === \"single\") {\n return (\n <MessagePrimitivePartByIndex\n key={range.index}\n index={range.index}\n components={components}\n />\n );\n } else if (range.type === \"chainOfThoughtGroup\") {\n const ChainOfThoughtComponent = components?.ChainOfThought;\n if (!ChainOfThoughtComponent) return null;\n return (\n <ChainOfThoughtByIndicesProvider\n key={`chainOfThought-${range.idKey ?? range.startIndex}`}\n startIndex={range.startIndex}\n endIndex={range.endIndex}\n >\n <ChainOfThoughtComponent />\n </ChainOfThoughtByIndicesProvider>\n );\n } else if (range.type === \"toolGroup\") {\n const ToolGroupComponent =\n components?.ToolGroup ?? defaultComponents.ToolGroup;\n return (\n <ToolGroupComponent\n key={`tool-${range.idKey ?? range.startIndex}`}\n startIndex={range.startIndex}\n endIndex={range.endIndex}\n >\n {Array.from(\n { length: range.endIndex - range.startIndex + 1 },\n (_, i) => {\n const partIndex = range.startIndex + i;\n return (\n <MessagePrimitivePartByIndex\n key={toolLeafKey(partIndex)}\n index={partIndex}\n components={components}\n />\n );\n },\n )}\n </ToolGroupComponent>\n );\n } else {\n // reasoningGroup\n const ReasoningGroupComponent =\n components?.ReasoningGroup ?? defaultComponents.ReasoningGroup;\n return (\n <ReasoningGroupComponent\n key={`reasoning-${range.startIndex}`}\n startIndex={range.startIndex}\n endIndex={range.endIndex}\n >\n {Array.from(\n { length: range.endIndex - range.startIndex + 1 },\n (_, i) => {\n const partIndex = range.startIndex + i;\n return (\n <MessagePrimitivePartByIndex\n key={`part-${partIndex}`}\n index={partIndex}\n components={components}\n />\n );\n },\n )}\n </ReasoningGroupComponent>\n );\n }\n });\n }, [messageRanges, partIds, components, contentLength]);\n\n return (\n <>\n {components?.Quote && <QuoteRenderer Quote={components.Quote} />}\n {partsElements}\n <ConditionalEmpty\n components={components}\n enabled={unstable_showEmptyOnNonTextEnd}\n />\n </>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TextMessagePartProvider.d.ts","names":[],"sources":["../../../src/react/providers/TextMessagePartProvider.tsx"],"mappings":";;;cAoCa,uBAAA,EAAyB,EAAE,CACtC,iBAAA;EACE,IAAA;EACA,SAAA;AAAA"}
1
+ {"version":3,"file":"TextMessagePartProvider.d.ts","names":[],"sources":["../../../src/react/providers/TextMessagePartProvider.tsx"],"mappings":";;;cAsCa,uBAAA,EAAyB,EAAE,CACtC,iBAAA;EACE,IAAA;EACA,SAAA;AAAA"}
@@ -3,7 +3,7 @@ import { AuiProvider, useAui } from "@assistant-ui/store";
3
3
  import { resource } from "@assistant-ui/tap";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  //#region src/react/providers/TextMessagePartProvider.tsx
6
- const TextMessagePartClient = resource(function TextMessagePartClient({ text, isRunning }) {
6
+ const useTextMessagePartClient = ({ text, isRunning }) => {
7
7
  const state = useMemo(() => ({
8
8
  type: "text",
9
9
  text,
@@ -21,7 +21,8 @@ const TextMessagePartClient = resource(function TextMessagePartClient({ text, is
21
21
  throw new Error("Not supported");
22
22
  }
23
23
  };
24
- });
24
+ };
25
+ const TextMessagePartClient = resource(useTextMessagePartClient);
25
26
  const TextMessagePartProvider = ({ text, isRunning = false, children }) => {
26
27
  return /* @__PURE__ */ jsx(AuiProvider, {
27
28
  value: useAui({ part: TextMessagePartClient({
@@ -1 +1 @@
1
- {"version":3,"file":"TextMessagePartProvider.js","names":[],"sources":["../../../src/react/providers/TextMessagePartProvider.tsx"],"sourcesContent":["import { type FC, type PropsWithChildren, useMemo } from \"react\";\nimport { useAui, AuiProvider, type ClientOutput } from \"@assistant-ui/store\";\nimport type { PartState } from \"../../store/scopes/part\";\n\nimport { resource } from \"@assistant-ui/tap\";\n\nconst TextMessagePartClient = resource(function TextMessagePartClient({\n text,\n isRunning,\n}: {\n text: string;\n isRunning: boolean;\n}): ClientOutput<\"part\"> {\n const state = useMemo<PartState>(\n () => ({\n type: \"text\",\n text,\n status: isRunning ? { type: \"running\" } : { type: \"complete\" },\n }),\n [text, isRunning],\n );\n\n return {\n getState: () => state,\n addToolResult: () => {\n throw new Error(\"Not supported\");\n },\n resumeToolCall: () => {\n throw new Error(\"Not supported\");\n },\n respondToToolApproval: () => {\n throw new Error(\"Not supported\");\n },\n };\n});\n\nexport const TextMessagePartProvider: FC<\n PropsWithChildren<{\n text: string;\n isRunning?: boolean;\n }>\n> = ({ text, isRunning = false, children }) => {\n const aui = useAui({\n part: TextMessagePartClient({ text, isRunning }),\n });\n\n return <AuiProvider value={aui}>{children}</AuiProvider>;\n};\n"],"mappings":";;;;;AAMA,MAAM,wBAAwB,SAAS,SAAS,sBAAsB,EACpE,MACA,aAIuB;CACvB,MAAM,QAAQ,eACL;EACL,MAAM;EACN;EACA,QAAQ,YAAY,EAAE,MAAM,UAAU,IAAI,EAAE,MAAM,WAAW;CAC/D,IACA,CAAC,MAAM,SAAS,CAClB;CAEA,OAAO;EACL,gBAAgB;EAChB,qBAAqB;GACnB,MAAM,IAAI,MAAM,eAAe;EACjC;EACA,sBAAsB;GACpB,MAAM,IAAI,MAAM,eAAe;EACjC;EACA,6BAA6B;GAC3B,MAAM,IAAI,MAAM,eAAe;EACjC;CACF;AACF,CAAC;AAED,MAAa,2BAKR,EAAE,MAAM,YAAY,OAAO,eAAe;CAK7C,OAAO,oBAAC,aAAD;EAAa,OAJR,OAAO,EACjB,MAAM,sBAAsB;GAAE;GAAM;EAAU,CAAC,EACjD,CAE6B;EAAI;CAAsB,CAAA;AACzD"}
1
+ {"version":3,"file":"TextMessagePartProvider.js","names":[],"sources":["../../../src/react/providers/TextMessagePartProvider.tsx"],"sourcesContent":["import { type FC, type PropsWithChildren, useMemo } from \"react\";\nimport { useAui, AuiProvider, type ClientOutput } from \"@assistant-ui/store\";\nimport type { PartState } from \"../../store/scopes/part\";\n\nimport { resource } from \"@assistant-ui/tap\";\n\nconst useTextMessagePartClient = ({\n text,\n isRunning,\n}: {\n text: string;\n isRunning: boolean;\n}): ClientOutput<\"part\"> => {\n const state = useMemo<PartState>(\n () => ({\n type: \"text\",\n text,\n status: isRunning ? { type: \"running\" } : { type: \"complete\" },\n }),\n [text, isRunning],\n );\n\n return {\n getState: () => state,\n addToolResult: () => {\n throw new Error(\"Not supported\");\n },\n resumeToolCall: () => {\n throw new Error(\"Not supported\");\n },\n respondToToolApproval: () => {\n throw new Error(\"Not supported\");\n },\n };\n};\n\nconst TextMessagePartClient = resource(useTextMessagePartClient);\n\nexport const TextMessagePartProvider: FC<\n PropsWithChildren<{\n text: string;\n isRunning?: boolean;\n }>\n> = ({ text, isRunning = false, children }) => {\n const aui = useAui({\n part: TextMessagePartClient({ text, isRunning }),\n });\n\n return <AuiProvider value={aui}>{children}</AuiProvider>;\n};\n"],"mappings":";;;;;AAMA,MAAM,4BAA4B,EAChC,MACA,gBAI0B;CAC1B,MAAM,QAAQ,eACL;EACL,MAAM;EACN;EACA,QAAQ,YAAY,EAAE,MAAM,UAAU,IAAI,EAAE,MAAM,WAAW;CAC/D,IACA,CAAC,MAAM,SAAS,CAClB;CAEA,OAAO;EACL,gBAAgB;EAChB,qBAAqB;GACnB,MAAM,IAAI,MAAM,eAAe;EACjC;EACA,sBAAsB;GACpB,MAAM,IAAI,MAAM,eAAe;EACjC;EACA,6BAA6B;GAC3B,MAAM,IAAI,MAAM,eAAe;EACjC;CACF;AACF;AAEA,MAAM,wBAAwB,SAAS,wBAAwB;AAE/D,MAAa,2BAKR,EAAE,MAAM,YAAY,OAAO,eAAe;CAK7C,OAAO,oBAAC,aAAD;EAAa,OAJR,OAAO,EACjB,MAAM,sBAAsB;GAAE;GAAM;EAAU,CAAC,EACjD,CAE6B;EAAI;CAAsB,CAAA;AACzD"}
@@ -28,6 +28,7 @@ declare class RemoteThreadListHookInstanceManager extends BaseSubscribable {
28
28
  getBranches: (messageId: string) => readonly string[];
29
29
  switchToBranch: (branchId: string) => void;
30
30
  append: (message: AppendMessage) => void;
31
+ deleteMessage: (messageId: string) => void | Promise<void>;
31
32
  startRun: (config: StartRunConfig) => void;
32
33
  resumeRun: (config: ResumeRunConfig) => void;
33
34
  cancelRun: () => void;
@@ -78,6 +79,7 @@ declare class RemoteThreadListHookInstanceManager extends BaseSubscribable {
78
79
  getBranches: (messageId: string) => readonly string[];
79
80
  switchToBranch: (branchId: string) => void;
80
81
  append: (message: AppendMessage) => void;
82
+ deleteMessage: (messageId: string) => void | Promise<void>;
81
83
  startRun: (config: StartRunConfig) => void;
82
84
  resumeRun: (config: ResumeRunConfig) => void;
83
85
  cancelRun: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteThreadListHookInstanceManager.d.ts","names":[],"sources":["../../../src/react/runtimes/RemoteThreadListHookInstanceManager.tsx"],"mappings":";;;;;;;;;;;;;;KAuBK,oBAAA,SAA6B,gBAAgB;AAAA,cAcrC,mCAAA,SAA4C,gBAAA;EAAA,QAC/C,cAAA;EAAA,QAGA,SAAA;EAAA,QACA,0BAAA;EAAA,QACA,MAAA;cAGN,WAAA,EAAa,oBAAA,EACb,MAAA,EAAQ,qBAAA;EAOH,kBAAA,CAAmB,QAAA,WAAgB,OAAA,CAAA,QAAA;;;eAPX,aAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BxB,oBAAA,CAAqB,QAAA,WAAgB,QAAA;;;eAxBF,aAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BnC,iBAAA,CAAkB,QAAA;EAKlB,cAAA,CAAe,cAAA,EAAgB,oBAAA;EAAA,QAS9B,cAAA;EAAA,QAgEA,0BAAA;EAqCD,+BAAA,EAAiC,EAAA;IACtC,QAAA,EAAU,aAAA,CAAc,iBAAA;EAAA;AAAA"}
1
+ {"version":3,"file":"RemoteThreadListHookInstanceManager.d.ts","names":[],"sources":["../../../src/react/runtimes/RemoteThreadListHookInstanceManager.tsx"],"mappings":";;;;;;;;;;;;;;KAuBK,oBAAA,SAA6B,gBAAgB;AAAA,cAcrC,mCAAA,SAA4C,gBAAA;EAAA,QAC/C,cAAA;EAAA,QAGA,SAAA;EAAA,QACA,0BAAA;EAAA,QACA,MAAA;cAGN,WAAA,EAAa,oBAAA,EACb,MAAA,EAAQ,qBAAA;EAOH,kBAAA,CAAmB,QAAA,WAAgB,OAAA,CAAA,QAAA;;;eAPX,aAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BxB,oBAAA,CAAqB,QAAA,WAAgB,QAAA;;;eAxBF,aAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BnC,iBAAA,CAAkB,QAAA;EAKlB,cAAA,CAAe,cAAA,EAAgB,oBAAA;EAAA,QAS9B,cAAA;EAAA,QAgEA,0BAAA;EAqCD,+BAAA,EAAiC,EAAA;IACtC,QAAA,EAAU,aAAA,CAAc,iBAAA;EAAA;AAAA"}
@@ -47,6 +47,7 @@ declare class RemoteThreadListThreadListRuntimeCore extends BaseSubscribable imp
47
47
  getBranches: (messageId: string) => readonly string[];
48
48
  switchToBranch: (branchId: string) => void;
49
49
  append: (message: AppendMessage) => void;
50
+ deleteMessage: (messageId: string) => void | Promise<void>;
50
51
  startRun: (config: StartRunConfig) => void;
51
52
  resumeRun: (config: ResumeRunConfig) => void;
52
53
  cancelRun: () => void;
@@ -97,6 +98,7 @@ declare class RemoteThreadListThreadListRuntimeCore extends BaseSubscribable imp
97
98
  getBranches: (messageId: string) => readonly string[];
98
99
  switchToBranch: (branchId: string) => void;
99
100
  append: (message: AppendMessage) => void;
101
+ deleteMessage: (messageId: string) => void | Promise<void>;
100
102
  startRun: (config: StartRunConfig) => void;
101
103
  resumeRun: (config: ResumeRunConfig) => void;
102
104
  cancelRun: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteThreadListThreadListRuntimeCore.d.ts","names":[],"sources":["../../../src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx"],"mappings":";;;;;;;;;;;;;;;cAwBa,qCAAA,SACH,gBAAA,YACG,qBAAA;EAAA,QAEH,QAAA;EAAA,iBACS,YAAA;EAAA,QAET,mBAAA;EAAA,QACA,gBAAA;EAAA,QACA,eAAA;EAAA,QAEA,aAAA;EAAA,iBACS,MAAA;EAAA,IAWN,WAAA,IAAW,QAAA,CAAA,MAAA,CAtBtB,iBAAA,EAsBsB,gBAAA;EAIf,qBAAA,IAAqB,OAAA;EAsDrB,QAAA,IAAY,OAAA;EAAA,iBAmDF,eAAA;cAGf,OAAA,EAAS,uBAAA,EACT,eAAA,EAAiB,oBAAA;EAAA,QAiBX,oBAAA;EAAA,QACA,WAAA;EAED,qBAAA,CAAsB,OAAA,EAAS,uBAAA;EA0B/B,eAAA;EAUA,MAAA,IAAM,OAAA;EAAA,IAWF,SAAA;EAAA,IAIA,aAAA;EAAA,IAIA,OAAA;EAAA,IAIA,SAAA;EAAA,IAIA,iBAAA;EAAA,IAIA,WAAA;EAAA,IAIA,YAAA;EAIJ,wBAAA,IAAwB,QAAA;;;eAvClB,aAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CN,oBAAA,CAAqB,kBAAA,WAA0B,QAAA;;;eANvB,aAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAexB,WAAA,CAAY,kBAAA,WAA0B,gBAAA;EAIhC,cAAA,CACX,kBAAA,UACA,OAAA;IAAY,SAAA;EAAA,IACX,OAAA;EA6EU,iBAAA,IAAqB,OAAA;EAyC3B,UAAA,GAAoB,QAAA,aAAgB,OAAA,CAzCF,8BAAA;EA8FlC,aAAA,GAAuB,QAAA,aAAgB,OAAA;EAkCvC,MAAA,CAAO,kBAAA,UAA4B,QAAA,WAAmB,OAAA;EA4BtD,YAAA,CACL,kBAAA,UACA,MAAA,EAAQ,MAAA,gCACP,OAAA;EAAA,QAwCW,sBAAA;EASD,OAAA,CAAQ,kBAAA,WAA0B,OAAA;EAmBxC,SAAA,CAAU,kBAAA,WAA6B,OAAA;EAqBjC,MAAA,CAAO,kBAAA,WAA0B,OAAA;EAoBjC,MAAA,CAAO,kBAAA,WAA6B,OAAA;EAAA,QAUzC,WAAA;EAED,0BAAA,EAA4B,EAAA;AAAA"}
1
+ {"version":3,"file":"RemoteThreadListThreadListRuntimeCore.d.ts","names":[],"sources":["../../../src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx"],"mappings":";;;;;;;;;;;;;;;cAwBa,qCAAA,SACH,gBAAA,YACG,qBAAA;EAAA,QAEH,QAAA;EAAA,iBACS,YAAA;EAAA,QAET,mBAAA;EAAA,QACA,gBAAA;EAAA,QACA,eAAA;EAAA,QAEA,aAAA;EAAA,iBACS,MAAA;EAAA,IAWN,WAAA,IAAW,QAAA,CAAA,MAAA,CAtBtB,iBAAA,EAsBsB,gBAAA;EAIf,qBAAA,IAAqB,OAAA;EAsDrB,QAAA,IAAY,OAAA;EAAA,iBAmDF,eAAA;cAGf,OAAA,EAAS,uBAAA,EACT,eAAA,EAAiB,oBAAA;EAAA,QAiBX,oBAAA;EAAA,QACA,WAAA;EAED,qBAAA,CAAsB,OAAA,EAAS,uBAAA;EA0B/B,eAAA;EAUA,MAAA,IAAM,OAAA;EAAA,IAWF,SAAA;EAAA,IAIA,aAAA;EAAA,IAIA,OAAA;EAAA,IAIA,SAAA;EAAA,IAIA,iBAAA;EAAA,IAIA,WAAA;EAAA,IAIA,YAAA;EAIJ,wBAAA,IAAwB,QAAA;;;eAvClB,aAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CN,oBAAA,CAAqB,kBAAA,WAA0B,QAAA;;;eANvB,aAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAexB,WAAA,CAAY,kBAAA,WAA0B,gBAAA;EAIhC,cAAA,CACX,kBAAA,UACA,OAAA;IAAY,SAAA;EAAA,IACX,OAAA;EA8EU,iBAAA,IAAqB,OAAA;EAyC3B,UAAA,GAAoB,QAAA,aAAgB,OAAA,CAzCF,8BAAA;EA8FlC,aAAA,GAAuB,QAAA,aAAgB,OAAA;EAkCvC,MAAA,CAAO,kBAAA,UAA4B,QAAA,WAAmB,OAAA;EA4BtD,YAAA,CACL,kBAAA,UACA,MAAA,EAAQ,MAAA,gCACP,OAAA;EAAA,QAwCW,sBAAA;EASD,OAAA,CAAQ,kBAAA,WAA0B,OAAA;EAmBxC,SAAA,CAAU,kBAAA,WAA6B,OAAA;EAqBjC,MAAA,CAAO,kBAAA,WAA0B,OAAA;EAoBjC,MAAA,CAAO,kBAAA,WAA6B,OAAA;EAAA,QAUzC,WAAA;EAED,0BAAA,EAA4B,EAAA;AAAA"}
@@ -218,6 +218,7 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
218
218
  externalId: remoteMetadata.externalId,
219
219
  status: remoteMetadata.status,
220
220
  title: remoteMetadata.title,
221
+ lastMessageAt: remoteMetadata.lastMessageAt,
221
222
  custom: remoteMetadata.custom
222
223
  }
223
224
  };
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteThreadListThreadListRuntimeCore.js","names":[],"sources":["../../../src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx"],"sourcesContent":["import type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport { generateId } from \"../../utils/id\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport { OptimisticState } from \"../../runtimes/remote-thread-list/optimistic-state\";\nimport { EMPTY_THREAD_CORE } from \"../../runtimes/remote-thread-list/empty-thread-core\";\nimport type {\n RemoteThreadData,\n RemoteThreadState,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport {\n classifyThreads,\n createThreadMappingId,\n getThreadData,\n normalizeCursor,\n updateStatusReducer,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport type { RemoteThreadListOptions } from \"../../runtimes/remote-thread-list/types\";\nimport { RemoteThreadListHookInstanceManager } from \"./RemoteThreadListHookInstanceManager\";\nimport { type FC, Fragment, useEffect, useId } from \"react\";\nimport { create } from \"zustand\";\nimport { AssistantMessageStream } from \"assistant-stream\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport { RuntimeAdapterProvider } from \"./RuntimeAdapterProvider\";\n\nexport class RemoteThreadListThreadListRuntimeCore\n extends BaseSubscribable\n implements ThreadListRuntimeCore\n{\n private _options!: RemoteThreadListOptions;\n private readonly _hookManager: RemoteThreadListHookInstanceManager;\n\n private _loadThreadsPromise: Promise<void> | undefined;\n private _loadMorePromise: Promise<void> | undefined;\n private _loadGeneration = 0;\n\n private _mainThreadId!: string;\n private readonly _state = new OptimisticState<RemoteThreadState>({\n isLoading: true,\n isLoadingMore: false,\n cursor: undefined,\n newThreadId: undefined,\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n public get threadItems() {\n return this._state.value.threadData;\n }\n\n public getLoadThreadsPromise() {\n // TODO this needs to be cached in case this promise is loaded during suspense\n if (!this._loadThreadsPromise) {\n const generation = this._loadGeneration;\n this._loadThreadsPromise = this._state\n .optimisticUpdate({\n execute: () => this._options.adapter.list(),\n loading: (state) => {\n return {\n ...state,\n isLoading: true,\n };\n },\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n const fresh = classifyThreads(l.threads, {\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n return {\n ...state,\n isLoading: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: fresh.threadIds,\n archivedThreadIds: fresh.archivedThreadIds,\n threadIdMap: {\n ...state.threadIdMap,\n ...fresh.threadIdMap,\n },\n threadData: {\n ...state.threadData,\n ...fresh.threadData,\n },\n };\n },\n })\n .catch((error: unknown) => {\n if (generation !== this._loadGeneration) return;\n console.error(\"[assistant-ui] thread list load failed:\", error);\n this._loadThreadsPromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n isLoading: false,\n });\n })\n .then(() => {});\n }\n\n return this._loadThreadsPromise;\n }\n\n public loadMore(): Promise<void> {\n if (this._loadMorePromise) return this._loadMorePromise;\n\n const initialState = this._state.value;\n if (initialState.cursor === undefined || initialState.isLoading) {\n return Promise.resolve();\n }\n\n const generation = this._loadGeneration;\n const adapter = this._options.adapter;\n const cursor = initialState.cursor;\n\n const dedup = this._state\n .optimisticUpdate({\n execute: () => adapter.list({ after: cursor }),\n loading: (state) => ({ ...state, isLoadingMore: true }),\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n if (adapter !== this._options.adapter) return state;\n\n const appended = classifyThreads(l.threads, {\n threadIds: [...state.threadIds],\n archivedThreadIds: [...state.archivedThreadIds],\n threadIdMap: { ...state.threadIdMap },\n threadData: { ...state.threadData },\n });\n\n return {\n ...state,\n isLoadingMore: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: appended.threadIds,\n archivedThreadIds: appended.archivedThreadIds,\n threadIdMap: appended.threadIdMap,\n threadData: appended.threadData,\n };\n },\n })\n .catch((error: unknown) => {\n console.error(\"[assistant-ui] thread list loadMore failed:\", error);\n })\n .then(() => {\n if (this._loadMorePromise === dedup) {\n this._loadMorePromise = undefined;\n }\n });\n\n this._loadMorePromise = dedup;\n return dedup;\n }\n\n private readonly contextProvider: ModelContextProvider;\n\n constructor(\n options: RemoteThreadListOptions,\n contextProvider: ModelContextProvider,\n ) {\n super();\n this.contextProvider = contextProvider;\n\n this._state.subscribe(() => this._notifySubscribers());\n this._hookManager = new RemoteThreadListHookInstanceManager(\n options.runtimeHook,\n this,\n );\n this.useProvider = create(() => ({\n Provider: options.adapter.unstable_Provider ?? Fragment,\n }));\n this.__internal_setOptions(options);\n this.switchToNewThread();\n }\n\n private _initialThreadLoaded = false;\n private useProvider;\n\n public __internal_setOptions(options: RemoteThreadListOptions) {\n if (this._options === options) return;\n\n const adapterChanged =\n this._options !== undefined && this._options.adapter !== options.adapter;\n\n this._options = options;\n\n const Provider = options.adapter.unstable_Provider ?? Fragment;\n if (Provider !== this.useProvider.getState().Provider) {\n this.useProvider.setState({ Provider }, true);\n }\n\n this._hookManager.setRuntimeHook(options.runtimeHook);\n\n if (adapterChanged) {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n }\n }\n\n public __internal_load() {\n this.getLoadThreadsPromise(); // begin loading on initial bind\n const startThreadId =\n this._options.threadId ?? this._options.initialThreadId;\n if (!this._initialThreadLoaded && startThreadId) {\n this._initialThreadLoaded = true;\n this.switchToThread(startThreadId).catch(() => {});\n }\n }\n\n public reload() {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n return this.getLoadThreadsPromise();\n }\n\n public get isLoading() {\n return this._state.value.isLoading;\n }\n\n public get isLoadingMore() {\n return this._state.value.isLoadingMore;\n }\n\n public get hasMore() {\n return this._state.value.cursor !== undefined;\n }\n\n public get threadIds() {\n return this._state.value.threadIds;\n }\n\n public get archivedThreadIds() {\n return this._state.value.archivedThreadIds;\n }\n\n public get newThreadId() {\n return this._state.value.newThreadId;\n }\n\n public get mainThreadId(): string {\n return this._mainThreadId;\n }\n\n public getMainThreadRuntimeCore() {\n const result = this._hookManager.getThreadRuntimeCore(this._mainThreadId);\n if (!result) return EMPTY_THREAD_CORE;\n return result;\n }\n\n public getThreadRuntimeCore(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n\n const result = this._hookManager.getThreadRuntimeCore(data.id);\n if (!result) throw new Error(\"Thread not found\");\n return result;\n }\n\n public getItemById(threadIdOrRemoteId: string) {\n return getThreadData(this._state.value, threadIdOrRemoteId);\n }\n\n public async switchToThread(\n threadIdOrRemoteId: string,\n options?: { unarchive?: boolean },\n ): Promise<void> {\n let data = this.getItemById(threadIdOrRemoteId);\n\n if (!data) {\n const remoteMetadata =\n await this._options.adapter.fetch(threadIdOrRemoteId);\n const state = this._state.value;\n const mappingId = createThreadMappingId(remoteMetadata.remoteId);\n\n const newThreadData = {\n ...state.threadData,\n [mappingId]: {\n id: mappingId,\n initializeTask: Promise.resolve({\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n }),\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n status: remoteMetadata.status,\n title: remoteMetadata.title,\n custom: remoteMetadata.custom,\n } as RemoteThreadData,\n };\n\n const newThreadIdMap = {\n ...state.threadIdMap,\n [remoteMetadata.remoteId]: mappingId,\n };\n\n // Filter both arrays first so a concurrent `list()` can't leave the id\n // duplicated or under the wrong status.\n const threadIdsWithoutRemote = state.threadIds.filter(\n (id) => id !== remoteMetadata.remoteId,\n );\n const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter(\n (id) => id !== remoteMetadata.remoteId,\n );\n\n const newThreadIds =\n remoteMetadata.status === \"regular\"\n ? [...threadIdsWithoutRemote, remoteMetadata.remoteId]\n : threadIdsWithoutRemote;\n const newArchivedThreadIds =\n remoteMetadata.status === \"archived\"\n ? [...archivedThreadIdsWithoutRemote, remoteMetadata.remoteId]\n : archivedThreadIdsWithoutRemote;\n\n this._state.update({\n ...state,\n threadIds: newThreadIds,\n archivedThreadIds: newArchivedThreadIds,\n threadIdMap: newThreadIdMap,\n threadData: newThreadData,\n });\n\n data = this.getItemById(threadIdOrRemoteId);\n }\n\n if (!data) throw new Error(\"Thread not found\");\n if (this._mainThreadId === data.id) return;\n\n const task = this._hookManager.startThreadRuntime(data.id);\n if (this.mainThreadId !== undefined) {\n await task;\n } else {\n task.then(() => this._notifySubscribers());\n }\n\n if (data.status === \"archived\" && options?.unarchive !== false) {\n await this.unarchive(data.id);\n }\n this._mainThreadId = data.id;\n\n this._notifySubscribers();\n }\n\n public async switchToNewThread(): Promise<void> {\n // an initialization transaction is in progress, wait for it to settle\n while (\n this._state.baseValue.newThreadId !== undefined &&\n this._state.value.newThreadId === undefined\n ) {\n await this._state.waitForUpdate();\n }\n\n const state = this._state.value;\n let id: string | undefined = this._state.value.newThreadId;\n if (id === undefined) {\n do {\n id = `__LOCALID_${generateId()}`;\n } while (state.threadIdMap[id]);\n\n const mappingId = createThreadMappingId(id);\n this._state.update({\n ...state,\n newThreadId: id,\n threadIdMap: {\n ...state.threadIdMap,\n [id]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n status: \"new\",\n id,\n remoteId: undefined,\n externalId: undefined,\n title: undefined,\n custom: undefined,\n } satisfies RemoteThreadData,\n },\n });\n }\n\n return this.switchToThread(id);\n }\n\n public initialize = async (threadId: string) => {\n if (this._state.value.newThreadId !== threadId) {\n const data = this.getItemById(threadId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status === \"new\") throw new Error(\"Unexpected new state\");\n return data.initializeTask;\n }\n\n return this._state.optimisticUpdate({\n execute: () => {\n return this._options.adapter.initialize(threadId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, threadId, \"regular\");\n },\n loading: (state, task) => {\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...state.threadData[mappingId],\n initializeTask: task,\n },\n },\n };\n },\n then: (state, { remoteId, externalId }) => {\n const data = getThreadData(state, threadId);\n if (!data) return state;\n\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...data,\n initializeTask: Promise.resolve({ remoteId, externalId }),\n remoteId,\n externalId,\n },\n },\n };\n },\n });\n };\n\n public generateTitle = async (threadId: string) => {\n const data = this.getItemById(threadId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status === \"new\") throw new Error(\"Thread is not yet initialized\");\n\n const { remoteId } = await data.initializeTask;\n\n const runtimeCore = this._hookManager.getThreadRuntimeCore(data.id);\n if (!runtimeCore) return; // thread is no longer running\n\n const messages = runtimeCore.messages;\n const stream = await this._options.adapter.generateTitle(\n remoteId,\n messages,\n );\n const messageStream = AssistantMessageStream.fromAssistantStream(stream);\n for await (const result of messageStream) {\n const newTitle = result.parts.filter((c) => c.type === \"text\")[0]?.text;\n const state = this._state.baseValue;\n const currentData = getThreadData(state, data.id);\n if (!currentData) continue;\n this._state.update({\n ...state,\n threadData: {\n ...state.threadData,\n [currentData.id]: {\n ...currentData,\n title: newTitle,\n },\n },\n });\n }\n };\n\n public rename(threadIdOrRemoteId: string, newTitle: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status === \"new\") throw new Error(\"Thread is not yet initialized\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.rename(remoteId, newTitle);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n title: newTitle,\n },\n },\n };\n },\n });\n }\n\n public updateCustom(\n threadIdOrRemoteId: string,\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status === \"new\") throw new Error(\"Thread is not yet initialized\");\n\n if (!this._options.adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n const adapter = this._options.adapter;\n if (!adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n return adapter.updateCustom(remoteId, custom);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n custom,\n },\n },\n };\n },\n });\n }\n\n private async _ensureThreadIsNotMain(threadId: string) {\n if (threadId === this.newThreadId)\n throw new Error(\"Cannot ensure new thread is not main\");\n\n if (threadId === this._mainThreadId) {\n await this.switchToNewThread();\n }\n }\n\n public async archive(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"regular\")\n throw new Error(\"Thread is not yet initialized or already archived\");\n\n await this._ensureThreadIsNotMain(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.archive(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"archived\");\n },\n });\n }\n\n public unarchive(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"archived\") throw new Error(\"Thread is not archived\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n try {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.unarchive(remoteId);\n } catch (error) {\n await this._ensureThreadIsNotMain(data.id);\n throw error;\n }\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"regular\");\n },\n });\n }\n\n public async delete(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw new Error(\"Thread is not yet initialized\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.delete(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"deleted\");\n },\n });\n }\n\n public async detach(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw new Error(\"Thread is not yet initialized\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n }\n\n private useBoundIds = create<string[]>(() => []);\n\n public __internal_RenderComponent: FC = () => {\n const id = useId();\n useEffect(() => {\n this.useBoundIds.setState((s) => [...s, id], true);\n return () => {\n this.useBoundIds.setState((s) => s.filter((i) => i !== id), true);\n };\n }, [id]);\n\n const boundIds = this.useBoundIds();\n const { Provider } = this.useProvider();\n\n const adapters = {\n modelContext: this.contextProvider,\n };\n\n return (\n (boundIds.length === 0 || boundIds[0] === id) && (\n // only render if the component is the first one mounted\n <RuntimeAdapterProvider adapters={adapters}>\n <this._hookManager.__internal_RenderThreadRuntimes\n provider={Provider}\n />\n </RuntimeAdapterProvider>\n )\n );\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"RemoteThreadListThreadListRuntimeCore.js","names":[],"sources":["../../../src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx"],"sourcesContent":["import type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport { generateId } from \"../../utils/id\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport { OptimisticState } from \"../../runtimes/remote-thread-list/optimistic-state\";\nimport { EMPTY_THREAD_CORE } from \"../../runtimes/remote-thread-list/empty-thread-core\";\nimport type {\n RemoteThreadData,\n RemoteThreadState,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport {\n classifyThreads,\n createThreadMappingId,\n getThreadData,\n normalizeCursor,\n updateStatusReducer,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport type { RemoteThreadListOptions } from \"../../runtimes/remote-thread-list/types\";\nimport { RemoteThreadListHookInstanceManager } from \"./RemoteThreadListHookInstanceManager\";\nimport { type FC, Fragment, useEffect, useId } from \"react\";\nimport { create } from \"zustand\";\nimport { AssistantMessageStream } from \"assistant-stream\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport { RuntimeAdapterProvider } from \"./RuntimeAdapterProvider\";\n\nexport class RemoteThreadListThreadListRuntimeCore\n extends BaseSubscribable\n implements ThreadListRuntimeCore\n{\n private _options!: RemoteThreadListOptions;\n private readonly _hookManager: RemoteThreadListHookInstanceManager;\n\n private _loadThreadsPromise: Promise<void> | undefined;\n private _loadMorePromise: Promise<void> | undefined;\n private _loadGeneration = 0;\n\n private _mainThreadId!: string;\n private readonly _state = new OptimisticState<RemoteThreadState>({\n isLoading: true,\n isLoadingMore: false,\n cursor: undefined,\n newThreadId: undefined,\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n public get threadItems() {\n return this._state.value.threadData;\n }\n\n public getLoadThreadsPromise() {\n // TODO this needs to be cached in case this promise is loaded during suspense\n if (!this._loadThreadsPromise) {\n const generation = this._loadGeneration;\n this._loadThreadsPromise = this._state\n .optimisticUpdate({\n execute: () => this._options.adapter.list(),\n loading: (state) => {\n return {\n ...state,\n isLoading: true,\n };\n },\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n const fresh = classifyThreads(l.threads, {\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n return {\n ...state,\n isLoading: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: fresh.threadIds,\n archivedThreadIds: fresh.archivedThreadIds,\n threadIdMap: {\n ...state.threadIdMap,\n ...fresh.threadIdMap,\n },\n threadData: {\n ...state.threadData,\n ...fresh.threadData,\n },\n };\n },\n })\n .catch((error: unknown) => {\n if (generation !== this._loadGeneration) return;\n console.error(\"[assistant-ui] thread list load failed:\", error);\n this._loadThreadsPromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n isLoading: false,\n });\n })\n .then(() => {});\n }\n\n return this._loadThreadsPromise;\n }\n\n public loadMore(): Promise<void> {\n if (this._loadMorePromise) return this._loadMorePromise;\n\n const initialState = this._state.value;\n if (initialState.cursor === undefined || initialState.isLoading) {\n return Promise.resolve();\n }\n\n const generation = this._loadGeneration;\n const adapter = this._options.adapter;\n const cursor = initialState.cursor;\n\n const dedup = this._state\n .optimisticUpdate({\n execute: () => adapter.list({ after: cursor }),\n loading: (state) => ({ ...state, isLoadingMore: true }),\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n if (adapter !== this._options.adapter) return state;\n\n const appended = classifyThreads(l.threads, {\n threadIds: [...state.threadIds],\n archivedThreadIds: [...state.archivedThreadIds],\n threadIdMap: { ...state.threadIdMap },\n threadData: { ...state.threadData },\n });\n\n return {\n ...state,\n isLoadingMore: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: appended.threadIds,\n archivedThreadIds: appended.archivedThreadIds,\n threadIdMap: appended.threadIdMap,\n threadData: appended.threadData,\n };\n },\n })\n .catch((error: unknown) => {\n console.error(\"[assistant-ui] thread list loadMore failed:\", error);\n })\n .then(() => {\n if (this._loadMorePromise === dedup) {\n this._loadMorePromise = undefined;\n }\n });\n\n this._loadMorePromise = dedup;\n return dedup;\n }\n\n private readonly contextProvider: ModelContextProvider;\n\n constructor(\n options: RemoteThreadListOptions,\n contextProvider: ModelContextProvider,\n ) {\n super();\n this.contextProvider = contextProvider;\n\n this._state.subscribe(() => this._notifySubscribers());\n this._hookManager = new RemoteThreadListHookInstanceManager(\n options.runtimeHook,\n this,\n );\n this.useProvider = create(() => ({\n Provider: options.adapter.unstable_Provider ?? Fragment,\n }));\n this.__internal_setOptions(options);\n this.switchToNewThread();\n }\n\n private _initialThreadLoaded = false;\n private useProvider;\n\n public __internal_setOptions(options: RemoteThreadListOptions) {\n if (this._options === options) return;\n\n const adapterChanged =\n this._options !== undefined && this._options.adapter !== options.adapter;\n\n this._options = options;\n\n const Provider = options.adapter.unstable_Provider ?? Fragment;\n if (Provider !== this.useProvider.getState().Provider) {\n this.useProvider.setState({ Provider }, true);\n }\n\n this._hookManager.setRuntimeHook(options.runtimeHook);\n\n if (adapterChanged) {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n }\n }\n\n public __internal_load() {\n this.getLoadThreadsPromise(); // begin loading on initial bind\n const startThreadId =\n this._options.threadId ?? this._options.initialThreadId;\n if (!this._initialThreadLoaded && startThreadId) {\n this._initialThreadLoaded = true;\n this.switchToThread(startThreadId).catch(() => {});\n }\n }\n\n public reload() {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n return this.getLoadThreadsPromise();\n }\n\n public get isLoading() {\n return this._state.value.isLoading;\n }\n\n public get isLoadingMore() {\n return this._state.value.isLoadingMore;\n }\n\n public get hasMore() {\n return this._state.value.cursor !== undefined;\n }\n\n public get threadIds() {\n return this._state.value.threadIds;\n }\n\n public get archivedThreadIds() {\n return this._state.value.archivedThreadIds;\n }\n\n public get newThreadId() {\n return this._state.value.newThreadId;\n }\n\n public get mainThreadId(): string {\n return this._mainThreadId;\n }\n\n public getMainThreadRuntimeCore() {\n const result = this._hookManager.getThreadRuntimeCore(this._mainThreadId);\n if (!result) return EMPTY_THREAD_CORE;\n return result;\n }\n\n public getThreadRuntimeCore(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n\n const result = this._hookManager.getThreadRuntimeCore(data.id);\n if (!result) throw new Error(\"Thread not found\");\n return result;\n }\n\n public getItemById(threadIdOrRemoteId: string) {\n return getThreadData(this._state.value, threadIdOrRemoteId);\n }\n\n public async switchToThread(\n threadIdOrRemoteId: string,\n options?: { unarchive?: boolean },\n ): Promise<void> {\n let data = this.getItemById(threadIdOrRemoteId);\n\n if (!data) {\n const remoteMetadata =\n await this._options.adapter.fetch(threadIdOrRemoteId);\n const state = this._state.value;\n const mappingId = createThreadMappingId(remoteMetadata.remoteId);\n\n const newThreadData = {\n ...state.threadData,\n [mappingId]: {\n id: mappingId,\n initializeTask: Promise.resolve({\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n }),\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n status: remoteMetadata.status,\n title: remoteMetadata.title,\n lastMessageAt: remoteMetadata.lastMessageAt,\n custom: remoteMetadata.custom,\n } as RemoteThreadData,\n };\n\n const newThreadIdMap = {\n ...state.threadIdMap,\n [remoteMetadata.remoteId]: mappingId,\n };\n\n // Filter both arrays first so a concurrent `list()` can't leave the id\n // duplicated or under the wrong status.\n const threadIdsWithoutRemote = state.threadIds.filter(\n (id) => id !== remoteMetadata.remoteId,\n );\n const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter(\n (id) => id !== remoteMetadata.remoteId,\n );\n\n const newThreadIds =\n remoteMetadata.status === \"regular\"\n ? [...threadIdsWithoutRemote, remoteMetadata.remoteId]\n : threadIdsWithoutRemote;\n const newArchivedThreadIds =\n remoteMetadata.status === \"archived\"\n ? [...archivedThreadIdsWithoutRemote, remoteMetadata.remoteId]\n : archivedThreadIdsWithoutRemote;\n\n this._state.update({\n ...state,\n threadIds: newThreadIds,\n archivedThreadIds: newArchivedThreadIds,\n threadIdMap: newThreadIdMap,\n threadData: newThreadData,\n });\n\n data = this.getItemById(threadIdOrRemoteId);\n }\n\n if (!data) throw new Error(\"Thread not found\");\n if (this._mainThreadId === data.id) return;\n\n const task = this._hookManager.startThreadRuntime(data.id);\n if (this.mainThreadId !== undefined) {\n await task;\n } else {\n task.then(() => this._notifySubscribers());\n }\n\n if (data.status === \"archived\" && options?.unarchive !== false) {\n await this.unarchive(data.id);\n }\n this._mainThreadId = data.id;\n\n this._notifySubscribers();\n }\n\n public async switchToNewThread(): Promise<void> {\n // an initialization transaction is in progress, wait for it to settle\n while (\n this._state.baseValue.newThreadId !== undefined &&\n this._state.value.newThreadId === undefined\n ) {\n await this._state.waitForUpdate();\n }\n\n const state = this._state.value;\n let id: string | undefined = this._state.value.newThreadId;\n if (id === undefined) {\n do {\n id = `__LOCALID_${generateId()}`;\n } while (state.threadIdMap[id]);\n\n const mappingId = createThreadMappingId(id);\n this._state.update({\n ...state,\n newThreadId: id,\n threadIdMap: {\n ...state.threadIdMap,\n [id]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n status: \"new\",\n id,\n remoteId: undefined,\n externalId: undefined,\n title: undefined,\n custom: undefined,\n } satisfies RemoteThreadData,\n },\n });\n }\n\n return this.switchToThread(id);\n }\n\n public initialize = async (threadId: string) => {\n if (this._state.value.newThreadId !== threadId) {\n const data = this.getItemById(threadId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status === \"new\") throw new Error(\"Unexpected new state\");\n return data.initializeTask;\n }\n\n return this._state.optimisticUpdate({\n execute: () => {\n return this._options.adapter.initialize(threadId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, threadId, \"regular\");\n },\n loading: (state, task) => {\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...state.threadData[mappingId],\n initializeTask: task,\n },\n },\n };\n },\n then: (state, { remoteId, externalId }) => {\n const data = getThreadData(state, threadId);\n if (!data) return state;\n\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...data,\n initializeTask: Promise.resolve({ remoteId, externalId }),\n remoteId,\n externalId,\n },\n },\n };\n },\n });\n };\n\n public generateTitle = async (threadId: string) => {\n const data = this.getItemById(threadId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status === \"new\") throw new Error(\"Thread is not yet initialized\");\n\n const { remoteId } = await data.initializeTask;\n\n const runtimeCore = this._hookManager.getThreadRuntimeCore(data.id);\n if (!runtimeCore) return; // thread is no longer running\n\n const messages = runtimeCore.messages;\n const stream = await this._options.adapter.generateTitle(\n remoteId,\n messages,\n );\n const messageStream = AssistantMessageStream.fromAssistantStream(stream);\n for await (const result of messageStream) {\n const newTitle = result.parts.filter((c) => c.type === \"text\")[0]?.text;\n const state = this._state.baseValue;\n const currentData = getThreadData(state, data.id);\n if (!currentData) continue;\n this._state.update({\n ...state,\n threadData: {\n ...state.threadData,\n [currentData.id]: {\n ...currentData,\n title: newTitle,\n },\n },\n });\n }\n };\n\n public rename(threadIdOrRemoteId: string, newTitle: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status === \"new\") throw new Error(\"Thread is not yet initialized\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.rename(remoteId, newTitle);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n title: newTitle,\n },\n },\n };\n },\n });\n }\n\n public updateCustom(\n threadIdOrRemoteId: string,\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status === \"new\") throw new Error(\"Thread is not yet initialized\");\n\n if (!this._options.adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n const adapter = this._options.adapter;\n if (!adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n return adapter.updateCustom(remoteId, custom);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n custom,\n },\n },\n };\n },\n });\n }\n\n private async _ensureThreadIsNotMain(threadId: string) {\n if (threadId === this.newThreadId)\n throw new Error(\"Cannot ensure new thread is not main\");\n\n if (threadId === this._mainThreadId) {\n await this.switchToNewThread();\n }\n }\n\n public async archive(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"regular\")\n throw new Error(\"Thread is not yet initialized or already archived\");\n\n await this._ensureThreadIsNotMain(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.archive(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"archived\");\n },\n });\n }\n\n public unarchive(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"archived\") throw new Error(\"Thread is not archived\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n try {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.unarchive(remoteId);\n } catch (error) {\n await this._ensureThreadIsNotMain(data.id);\n throw error;\n }\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"regular\");\n },\n });\n }\n\n public async delete(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw new Error(\"Thread is not yet initialized\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.delete(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"deleted\");\n },\n });\n }\n\n public async detach(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw new Error(\"Thread is not yet initialized\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n }\n\n private useBoundIds = create<string[]>(() => []);\n\n public __internal_RenderComponent: FC = () => {\n const id = useId();\n useEffect(() => {\n this.useBoundIds.setState((s) => [...s, id], true);\n return () => {\n this.useBoundIds.setState((s) => s.filter((i) => i !== id), true);\n };\n }, [id]);\n\n const boundIds = this.useBoundIds();\n const { Provider } = this.useProvider();\n\n const adapters = {\n modelContext: this.contextProvider,\n };\n\n return (\n (boundIds.length === 0 || boundIds[0] === id) && (\n // only render if the component is the first one mounted\n <RuntimeAdapterProvider adapters={adapters}>\n <this._hookManager.__internal_RenderThreadRuntimes\n provider={Provider}\n />\n </RuntimeAdapterProvider>\n )\n );\n };\n}\n"],"mappings":"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"}