@assistant-ui/core 0.2.18 → 0.2.19

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 (228) hide show
  1. package/dist/index.d.ts +4 -2
  2. package/dist/index.js +3 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/internal.d.ts +2 -1
  5. package/dist/internal.js +2 -1
  6. package/dist/model-context/interactable-composer-metadata.d.ts +105 -0
  7. package/dist/model-context/interactable-composer-metadata.d.ts.map +1 -0
  8. package/dist/model-context/interactable-composer-metadata.js +259 -0
  9. package/dist/model-context/interactable-composer-metadata.js.map +1 -0
  10. package/dist/model-context/registry.d.ts.map +1 -1
  11. package/dist/model-context/registry.js +1 -0
  12. package/dist/model-context/registry.js.map +1 -1
  13. package/dist/model-context/types.d.ts +6 -0
  14. package/dist/model-context/types.d.ts.map +1 -1
  15. package/dist/model-context/types.js +4 -0
  16. package/dist/model-context/types.js.map +1 -1
  17. package/dist/react/AssistantProvider.d.ts +1 -1
  18. package/dist/react/AssistantProvider.js +1 -1
  19. package/dist/react/AssistantRuntimeProvider.d.ts +1 -1
  20. package/dist/react/RuntimeAdapter.js +1 -1
  21. package/dist/react/client/Interactables.d.ts +8 -2
  22. package/dist/react/client/Interactables.d.ts.map +1 -1
  23. package/dist/react/client/Interactables.js +190 -94
  24. package/dist/react/client/Interactables.js.map +1 -1
  25. package/dist/react/client/Tools.js +1 -1
  26. package/dist/react/client/interactable-model-context.d.ts +9 -6
  27. package/dist/react/client/interactable-model-context.d.ts.map +1 -1
  28. package/dist/react/client/interactable-model-context.js +154 -32
  29. package/dist/react/client/interactable-model-context.js.map +1 -1
  30. package/dist/react/index.d.ts +15 -6
  31. package/dist/react/index.js +12 -5
  32. package/dist/react/interactables-legacy/Interactables.d.ts +12 -0
  33. package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -0
  34. package/dist/react/interactables-legacy/Interactables.js +264 -0
  35. package/dist/react/interactables-legacy/Interactables.js.map +1 -0
  36. package/dist/react/interactables-legacy/interactable-model-context.d.ts +12 -0
  37. package/dist/react/interactables-legacy/interactable-model-context.d.ts.map +1 -0
  38. package/dist/react/interactables-legacy/interactable-model-context.js +54 -0
  39. package/dist/react/interactables-legacy/interactable-model-context.js.map +1 -0
  40. package/dist/react/interactables-legacy/scopes.d.ts +58 -0
  41. package/dist/react/interactables-legacy/scopes.d.ts.map +1 -0
  42. package/dist/react/interactables-legacy/scopes.js +0 -0
  43. package/dist/react/interactables-legacy/useAssistantInteractable.d.ts +31 -0
  44. package/dist/react/interactables-legacy/useAssistantInteractable.d.ts.map +1 -0
  45. package/dist/react/{model-context → interactables-legacy}/useAssistantInteractable.js +6 -2
  46. package/dist/react/interactables-legacy/useAssistantInteractable.js.map +1 -0
  47. package/dist/react/interactables-legacy/useInteractableState.d.ts +21 -0
  48. package/dist/react/interactables-legacy/useInteractableState.d.ts.map +1 -0
  49. package/dist/react/interactables-legacy/useInteractableState.js +84 -0
  50. package/dist/react/interactables-legacy/useInteractableState.js.map +1 -0
  51. package/dist/react/model-context/interactableTool.d.ts +53 -0
  52. package/dist/react/model-context/interactableTool.d.ts.map +1 -0
  53. package/dist/react/model-context/interactableTool.js +188 -0
  54. package/dist/react/model-context/interactableTool.js.map +1 -0
  55. package/dist/react/model-context/useAssistantContext.js +1 -1
  56. package/dist/react/model-context/useAssistantDataUI.js +1 -1
  57. package/dist/react/model-context/useAssistantInstructions.js +1 -1
  58. package/dist/react/model-context/useAssistantTool.js +1 -1
  59. package/dist/react/model-context/useAssistantToolUI.js +1 -1
  60. package/dist/react/model-context/useAuiToolOverrides.js +1 -1
  61. package/dist/react/model-context/useInteractable.d.ts +73 -0
  62. package/dist/react/model-context/useInteractable.d.ts.map +1 -0
  63. package/dist/react/model-context/useInteractable.js +100 -0
  64. package/dist/react/model-context/useInteractable.js.map +1 -0
  65. package/dist/react/model-context/useInteractableState.d.ts +8 -5
  66. package/dist/react/model-context/useInteractableState.d.ts.map +1 -1
  67. package/dist/react/model-context/useInteractableState.js +48 -48
  68. package/dist/react/model-context/useInteractableState.js.map +1 -1
  69. package/dist/react/model-context/useInteractableVersions.d.ts +19 -0
  70. package/dist/react/model-context/useInteractableVersions.d.ts.map +1 -0
  71. package/dist/react/model-context/useInteractableVersions.js +51 -0
  72. package/dist/react/model-context/useInteractableVersions.js.map +1 -0
  73. package/dist/react/primitive-hooks/useThreadMessageIds.d.ts +15 -0
  74. package/dist/react/primitive-hooks/useThreadMessageIds.d.ts.map +1 -0
  75. package/dist/react/primitive-hooks/useThreadMessageIds.js +26 -0
  76. package/dist/react/primitive-hooks/useThreadMessageIds.js.map +1 -0
  77. package/dist/react/primitive-hooks/useVoice.js +1 -1
  78. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js +1 -1
  79. package/dist/react/primitives/composer/ComposerAttachments.js +1 -1
  80. package/dist/react/primitives/composer/ComposerQueue.js +1 -1
  81. package/dist/react/primitives/generativeUI/GenerativeUI.js +1 -1
  82. package/dist/react/primitives/message/MessageAttachments.js +1 -1
  83. package/dist/react/primitives/message/MessageGroupedParts.js +1 -1
  84. package/dist/react/primitives/message/MessageParts.js +1 -1
  85. package/dist/react/primitives/message/MessageQuote.js +1 -1
  86. package/dist/react/primitives/part/PartMessages.d.ts +5 -2
  87. package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
  88. package/dist/react/primitives/part/PartMessages.js +8 -8
  89. package/dist/react/primitives/part/PartMessages.js.map +1 -1
  90. package/dist/react/primitives/thread/ThreadMessages.d.ts +31 -1
  91. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  92. package/dist/react/primitives/thread/ThreadMessages.js +64 -2
  93. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  94. package/dist/react/primitives/thread/ThreadSuggestions.js +1 -1
  95. package/dist/react/primitives/threadList/ThreadListItems.js +1 -1
  96. package/dist/react/providers/MessageByIdProvider.d.ts +9 -0
  97. package/dist/react/providers/MessageByIdProvider.d.ts.map +1 -0
  98. package/dist/react/providers/MessageByIdProvider.js +57 -0
  99. package/dist/react/providers/MessageByIdProvider.js.map +1 -0
  100. package/dist/react/providers/ReadonlyThreadProvider.js +1 -1
  101. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +1 -1
  102. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +3 -0
  103. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  104. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +16 -1
  105. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  106. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +1 -1
  107. package/dist/react/runtimes/cloud/auiV0.js +1 -1
  108. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +1 -1
  109. package/dist/react/runtimes/createRuntimeExtras.d.ts +20 -0
  110. package/dist/react/runtimes/createRuntimeExtras.d.ts.map +1 -0
  111. package/dist/react/runtimes/createRuntimeExtras.js +43 -0
  112. package/dist/react/runtimes/createRuntimeExtras.js.map +1 -0
  113. package/dist/react/runtimes/useLocalRuntime.js +1 -1
  114. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
  115. package/dist/react/runtimes/useRemoteThreadListRuntime.js +6 -2
  116. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  117. package/dist/react/runtimes/useStreamingTiming.d.ts +26 -0
  118. package/dist/react/runtimes/useStreamingTiming.d.ts.map +1 -0
  119. package/dist/react/runtimes/useStreamingTiming.js +43 -0
  120. package/dist/react/runtimes/useStreamingTiming.js.map +1 -0
  121. package/dist/react/types/scopes/interactables.d.ts +40 -24
  122. package/dist/react/types/scopes/interactables.d.ts.map +1 -1
  123. package/dist/react/types/store-augmentation.d.ts +3 -1
  124. package/dist/react/types/store-augmentation.d.ts.map +1 -1
  125. package/dist/react/utils/useJSONEqual.d.ts +11 -0
  126. package/dist/react/utils/useJSONEqual.d.ts.map +1 -0
  127. package/dist/react/utils/useJSONEqual.js +30 -0
  128. package/dist/react/utils/useJSONEqual.js.map +1 -0
  129. package/dist/runtime/base/base-composer-runtime-core.d.ts +5 -0
  130. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  131. package/dist/runtime/base/base-composer-runtime-core.js +13 -0
  132. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  133. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts.map +1 -1
  134. package/dist/runtime/base/default-edit-composer-runtime-core.js +6 -1
  135. package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
  136. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  137. package/dist/runtime/base/default-thread-composer-runtime-core.js +4 -1
  138. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  139. package/dist/runtime/utils/message-repository.d.ts +1 -0
  140. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  141. package/dist/runtime/utils/message-repository.js +6 -3
  142. package/dist/runtime/utils/message-repository.js.map +1 -1
  143. package/dist/runtime/utils/streaming-timing.d.ts +59 -0
  144. package/dist/runtime/utils/streaming-timing.d.ts.map +1 -0
  145. package/dist/runtime/utils/streaming-timing.js +76 -0
  146. package/dist/runtime/utils/streaming-timing.js.map +1 -0
  147. package/dist/runtime/utils/thread-message-like.js +2 -1
  148. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  149. package/dist/runtimes/external-store/external-store-adapter.d.ts +26 -1
  150. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  151. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +9 -0
  152. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  153. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +19 -0
  154. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  155. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  156. package/dist/runtimes/local/local-thread-runtime-core.js +1 -1
  157. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  158. package/dist/runtimes/remote-thread-list/types.d.ts +12 -0
  159. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  160. package/dist/store/clients/suggestions.js +1 -1
  161. package/dist/store/clients/thread-message-client.js +1 -1
  162. package/dist/store/runtime-clients/composer-runtime-client.js +1 -1
  163. package/dist/store/runtime-clients/message-runtime-client.js +1 -1
  164. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +1 -1
  165. package/dist/store/runtime-clients/thread-runtime-client.js +1 -1
  166. package/dist/tests/remote-thread-list-test-helpers.d.ts +1 -1
  167. package/dist/tests/remote-thread-list-test-helpers.d.ts.map +1 -1
  168. package/dist/tests/remote-thread-list-test-helpers.js +3 -2
  169. package/dist/tests/remote-thread-list-test-helpers.js.map +1 -1
  170. package/package.json +9 -9
  171. package/src/index.ts +17 -0
  172. package/src/internal.ts +7 -0
  173. package/src/model-context/interactable-composer-metadata.test.ts +550 -0
  174. package/src/model-context/interactable-composer-metadata.ts +395 -0
  175. package/src/model-context/registry.ts +5 -0
  176. package/src/model-context/types.ts +12 -0
  177. package/src/react/client/Interactables.test.ts +358 -0
  178. package/src/react/client/Interactables.ts +339 -86
  179. package/src/react/client/interactable-model-context.test.ts +418 -0
  180. package/src/react/client/interactable-model-context.ts +252 -58
  181. package/src/react/index.ts +72 -3
  182. package/src/react/interactables-legacy/Interactables.ts +332 -0
  183. package/src/react/interactables-legacy/interactable-model-context.test.ts +54 -0
  184. package/src/react/interactables-legacy/interactable-model-context.ts +80 -0
  185. package/src/react/interactables-legacy/scopes.ts +66 -0
  186. package/src/react/{model-context → interactables-legacy}/useAssistantInteractable.ts +10 -1
  187. package/src/react/interactables-legacy/useInteractableState.ts +67 -0
  188. package/src/react/model-context/interactableTool.tsx +175 -0
  189. package/src/react/model-context/useInteractable.ts +233 -0
  190. package/src/react/model-context/useInteractableState.ts +31 -23
  191. package/src/react/model-context/useInteractableVersions.ts +48 -0
  192. package/src/react/primitive-hooks/useThreadMessageIds.ts +27 -0
  193. package/src/react/primitives/part/PartMessages.test.tsx +17 -0
  194. package/src/react/primitives/part/PartMessages.tsx +13 -8
  195. package/src/react/primitives/thread/ThreadMessages.tsx +67 -0
  196. package/src/react/providers/MessageByIdProvider.tsx +23 -0
  197. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +21 -1
  198. package/src/react/runtimes/createRuntimeExtras.test.ts +58 -0
  199. package/src/react/runtimes/createRuntimeExtras.ts +68 -0
  200. package/src/react/runtimes/createRuntimeExtras.use.test.ts +50 -0
  201. package/src/react/runtimes/useRemoteThreadListRuntime.ts +13 -1
  202. package/src/react/runtimes/useStreamingTiming.ts +68 -0
  203. package/src/react/types/scopes/interactables.ts +45 -23
  204. package/src/react/types/store-augmentation.ts +4 -2
  205. package/src/react/utils/useJSONEqual.ts +20 -0
  206. package/src/runtime/base/base-composer-runtime-core.ts +13 -0
  207. package/src/runtime/base/default-edit-composer-runtime-core.ts +18 -1
  208. package/src/runtime/base/default-thread-composer-runtime-core.ts +11 -1
  209. package/src/runtime/utils/message-repository.ts +11 -7
  210. package/src/runtime/utils/streaming-timing.test.ts +301 -0
  211. package/src/runtime/utils/streaming-timing.ts +161 -0
  212. package/src/runtime/utils/thread-message-like.ts +2 -1
  213. package/src/runtimes/external-store/external-store-adapter.ts +28 -0
  214. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +33 -1
  215. package/src/runtimes/local/local-thread-runtime-core.ts +4 -1
  216. package/src/runtimes/remote-thread-list/types.ts +13 -0
  217. package/src/tests/MessageRepository.test.ts +2 -0
  218. package/src/tests/composer-can-send.test.ts +1 -0
  219. package/src/tests/default-edit-composer-runtime-core.test.ts +78 -1
  220. package/src/tests/default-thread-composer-runtime-core.test.ts +82 -0
  221. package/src/tests/external-store-thread-runtime-core.test.ts +337 -0
  222. package/src/tests/groupParts.test.ts +32 -0
  223. package/src/tests/remote-thread-list-reactive-threadId.test.ts +90 -0
  224. package/src/tests/remote-thread-list-test-helpers.ts +2 -1
  225. package/src/tests/thread-message-like.test.ts +50 -0
  226. package/dist/react/model-context/useAssistantInteractable.d.ts +0 -22
  227. package/dist/react/model-context/useAssistantInteractable.d.ts.map +0 -1
  228. package/dist/react/model-context/useAssistantInteractable.js.map +0 -1
@@ -1,80 +1,80 @@
1
+ "use client";
1
2
  import { useAui, useAuiState } from "@assistant-ui/store";
2
3
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
3
4
  //#region src/react/model-context/useInteractableState.ts
4
- /**
5
- * Reads and writes the state of a registered interactable.
6
- *
7
- * Pair with {@link useAssistantInteractable} which handles registration.
8
- */
9
- const useInteractableState = (id, fallback) => {
10
- const $ = c(19);
5
+ const useInteractableState = (id) => {
6
+ const $ = c(17);
11
7
  const aui = useAui();
12
- const state = useAuiState((s) => s.interactables.definitions[id]?.state) ?? fallback;
13
8
  let t0;
14
9
  if ($[0] !== id) {
15
- t0 = (s_0) => s_0.interactables.persistence[id];
10
+ t0 = (s) => s.unstable_interactables.definitions[id]?.state;
16
11
  $[0] = id;
17
12
  $[1] = t0;
18
13
  } else t0 = $[1];
19
- const persistenceStatus = useAuiState(t0);
14
+ const state = useAuiState(t0);
20
15
  let t1;
21
- if ($[2] !== aui || $[3] !== id) {
22
- t1 = (updater) => {
23
- aui.interactables().setState(id, (prev) => {
16
+ if ($[2] !== id) {
17
+ t1 = (s_0) => s_0.unstable_interactables.persistence[id];
18
+ $[2] = id;
19
+ $[3] = t1;
20
+ } else t1 = $[3];
21
+ const persistenceStatus = useAuiState(t1);
22
+ let t2;
23
+ if ($[4] !== aui || $[5] !== id) {
24
+ t2 = (updater) => {
25
+ aui.unstable_interactables().setState(id, (prev) => {
24
26
  if (typeof updater === "function") return updater(prev);
25
27
  return updater;
26
28
  });
27
29
  };
28
- $[2] = aui;
29
- $[3] = id;
30
- $[4] = t1;
31
- } else t1 = $[4];
32
- const setState = t1;
33
- let t2;
34
- if ($[5] !== aui || $[6] !== id) {
35
- t2 = (selected) => {
36
- aui.interactables().setSelected(id, selected);
37
- };
38
- $[5] = aui;
39
- $[6] = id;
40
- $[7] = t2;
41
- } else t2 = $[7];
42
- const setSelected = t2;
30
+ $[4] = aui;
31
+ $[5] = id;
32
+ $[6] = t2;
33
+ } else t2 = $[6];
34
+ const setState = t2;
43
35
  let t3;
44
- if ($[8] !== aui) {
45
- t3 = () => aui.interactables().flush();
46
- $[8] = aui;
47
- $[9] = t3;
48
- } else t3 = $[9];
36
+ if ($[7] !== aui) {
37
+ t3 = () => aui.unstable_interactables().flush();
38
+ $[7] = aui;
39
+ $[8] = t3;
40
+ } else t3 = $[8];
49
41
  const flush = t3;
50
42
  const t4 = persistenceStatus?.isPending ?? false;
51
43
  const t5 = persistenceStatus?.error;
52
44
  let t6;
53
- if ($[10] !== flush || $[11] !== setSelected || $[12] !== setState || $[13] !== t4 || $[14] !== t5) {
45
+ if ($[9] !== flush || $[10] !== setState || $[11] !== t4 || $[12] !== t5) {
54
46
  t6 = {
55
47
  setState,
56
- setSelected,
57
48
  isPending: t4,
58
49
  error: t5,
59
50
  flush
60
51
  };
61
- $[10] = flush;
62
- $[11] = setSelected;
63
- $[12] = setState;
64
- $[13] = t4;
65
- $[14] = t5;
66
- $[15] = t6;
67
- } else t6 = $[15];
52
+ $[9] = flush;
53
+ $[10] = setState;
54
+ $[11] = t4;
55
+ $[12] = t5;
56
+ $[13] = t6;
57
+ } else t6 = $[13];
68
58
  let t7;
69
- if ($[16] !== state || $[17] !== t6) {
59
+ if ($[14] !== state || $[15] !== t6) {
70
60
  t7 = [state, t6];
71
- $[16] = state;
72
- $[17] = t6;
73
- $[18] = t7;
74
- } else t7 = $[18];
61
+ $[14] = state;
62
+ $[15] = t6;
63
+ $[16] = t7;
64
+ } else t7 = $[16];
75
65
  return t7;
76
66
  };
67
+ /**
68
+ * Reads and writes the state of an interactable registered elsewhere, by id.
69
+ *
70
+ * Use this from secondary readers (children, siblings); the owning component
71
+ * registers with `unstable_useInteractable`, which returns state directly. Returns
72
+ * `undefined` until the owning interactable is registered.
73
+ *
74
+ * @deprecated Unstable / Experimental (not actually removed).
75
+ */
76
+ const unstable_useInteractableState = useInteractableState;
77
77
  //#endregion
78
- export { useInteractableState };
78
+ export { unstable_useInteractableState };
79
79
 
80
80
  //# sourceMappingURL=useInteractableState.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useInteractableState.js","names":["useCallback","useAui","useAuiState","StateUpdater","TState","prev","useInteractableState","id","fallback","$","_c","aui","state","s","interactables","definitions","t0","s_0","persistence","persistenceStatus","t1","updater","setState","t2","selected","setSelected","t3","flush","t4","isPending","t5","error","t6","t7"],"sources":["../../../src/react/model-context/useInteractableState.ts"],"sourcesContent":["import { useCallback } from \"react\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\n\ntype StateUpdater<TState> = TState | ((prev: TState) => TState);\n\n/**\n * Reads and writes the state of a registered interactable.\n *\n * Pair with {@link useAssistantInteractable} which handles registration.\n */\nexport const useInteractableState = <TState>(\n id: string,\n fallback: TState,\n): [\n TState,\n {\n setState: (updater: StateUpdater<TState>) => void;\n setSelected: (selected: boolean) => void;\n isPending: boolean;\n error: unknown;\n flush: () => Promise<void>;\n },\n] => {\n const aui = useAui();\n\n const state =\n (useAuiState((s) => s.interactables.definitions[id]?.state) as TState) ??\n (fallback as TState);\n\n const persistenceStatus = useAuiState((s) => s.interactables.persistence[id]);\n\n const setState = useCallback(\n (updater: StateUpdater<TState>) => {\n aui.interactables().setState(id, (prev) => {\n if (typeof updater === \"function\") {\n return (updater as (prev: TState) => TState)(prev as TState);\n }\n return updater;\n });\n },\n [aui, id],\n );\n\n const setSelected = useCallback(\n (selected: boolean) => {\n aui.interactables().setSelected(id, selected);\n },\n [aui, id],\n );\n\n const flush = useCallback(() => aui.interactables().flush(), [aui]);\n\n return [\n state,\n {\n setState,\n setSelected,\n isPending: persistenceStatus?.isPending ?? false,\n error: persistenceStatus?.error,\n flush,\n },\n ];\n};\n"],"mappings":";;;;;;;;AAUA,MAAaM,wBAAuBC,IAAAC,aAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAalC,MAAAC,MAAYV,OAAO;CAEnB,MAAAW,QACGV,aAAYW,MAAOA,EAACC,cAAcC,YAAaR,GAAU,EAAAK,KAAA,KACzDJ;CAAoB,IAAAQ;CAAA,IAAAP,EAAA,OAAAF,IAAA;EAEeS,MAAAC,QAAOJ,IAACC,cAAcI,YAAaX;EAAGE,EAAA,KAAAF;EAAAE,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAA5E,MAAAU,oBAA0BjB,YAAYc,EAAsC;CAAE,IAAAI;CAAA,IAAAX,EAAA,OAAAE,OAAAF,EAAA,OAAAF,IAAA;EAG5Ea,MAAAC,YAAA;GACEV,IAAGG,cAAe,CAAC,CAAAQ,SAAUf,KAAIF,SAAA;IAC/B,IAAI,OAAOgB,YAAY,YAAU,OACvBA,QAAqChB,IAAc;IAC5D,OACMgB;GAAO,CACf;EAAC;EACHZ,EAAA,KAAAE;EAAAF,EAAA,KAAAF;EAAAE,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CARH,MAAAa,WAAiBF;CAUf,IAAAG;CAAA,IAAAd,EAAA,OAAAE,OAAAF,EAAA,OAAAF,IAAA;EAGAgB,MAAAC,aAAA;GACEb,IAAGG,cAAe,CAAC,CAAAW,YAAalB,IAAIiB,QAAQ;EAAC;EAC9Cf,EAAA,KAAAE;EAAAF,EAAA,KAAAF;EAAAE,EAAA,KAAAc;CAAA,OAAAA,KAAAd,EAAA;CAHH,MAAAgB,cAAoBF;CAKlB,IAAAG;CAAA,IAAAjB,EAAA,OAAAE,KAAA;EAEwBe,WAAMf,IAAGG,cAAe,CAAC,CAAAa,MAAO;EAAClB,EAAA,KAAAE;EAAAF,EAAA,KAAAiB;CAAA,OAAAA,KAAAjB,EAAA;CAA3D,MAAAkB,QAAcD;CAOC,MAAAE,KAAAT,mBAAiBU,aAAjB;CACJ,MAAAC,KAAAX,mBAAiBY;CAAO,IAAAC;CAAA,IAAAvB,EAAA,QAAAkB,SAAAlB,EAAA,QAAAgB,eAAAhB,EAAA,QAAAa,YAAAb,EAAA,QAAAmB,MAAAnB,EAAA,QAAAqB,IAAA;EAJjCE,KAAA;GAAAV;GAAAG;GAAAI,WAGaD;GAAqCG,OACzCD;GAAwBH;EAEjC;EAAClB,EAAA,MAAAkB;EAAAlB,EAAA,MAAAgB;EAAAhB,EAAA,MAAAa;EAAAb,EAAA,MAAAmB;EAAAnB,EAAA,MAAAqB;EAAArB,EAAA,MAAAuB;CAAA,OAAAA,KAAAvB,EAAA;CAAA,IAAAwB;CAAA,IAAAxB,EAAA,QAAAG,SAAAH,EAAA,QAAAuB,IAAA;EARIC,KAAA,CACLrB,OACAoB,EAMC;EACFvB,EAAA,MAAAG;EAAAH,EAAA,MAAAuB;EAAAvB,EAAA,MAAAwB;CAAA,OAAAA,KAAAxB,EAAA;CAAA,OATMwB;AASN"}
1
+ {"version":3,"file":"useInteractableState.js","names":["c","_c","useCallback","useAui","useAuiState","StateUpdater","TState","prev","useInteractableState","id","$","aui","t0","s","unstable_interactables","definitions","state","t1","s_0","persistence","persistenceStatus","t2","updater","setState","t3","flush","t4","isPending","t5","error","t6","t7","unstable_useInteractableState","Promise"],"sources":["../../../src/react/model-context/useInteractableState.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\n\ntype StateUpdater<TState> = TState | ((prev: TState) => TState);\n\nconst useInteractableState = <TState>(\n id: string,\n): [\n TState | undefined,\n {\n setState: (updater: StateUpdater<TState>) => void;\n isPending: boolean;\n error: unknown;\n flush: () => Promise<void>;\n },\n] => {\n const aui = useAui();\n\n const state = useAuiState(\n (s) => s.unstable_interactables.definitions[id]?.state,\n ) as TState | undefined;\n\n const persistenceStatus = useAuiState(\n (s) => s.unstable_interactables.persistence[id],\n );\n\n const setState = useCallback(\n (updater: StateUpdater<TState>) => {\n aui.unstable_interactables().setState(id, (prev) => {\n if (typeof updater === \"function\") {\n return (updater as (prev: TState) => TState)(prev as TState);\n }\n return updater;\n });\n },\n [aui, id],\n );\n\n const flush = useCallback(() => aui.unstable_interactables().flush(), [aui]);\n\n return [\n state,\n {\n setState,\n isPending: persistenceStatus?.isPending ?? false,\n error: persistenceStatus?.error,\n flush,\n },\n ];\n};\n\n/**\n * Reads and writes the state of an interactable registered elsewhere, by id.\n *\n * Use this from secondary readers (children, siblings); the owning component\n * registers with `unstable_useInteractable`, which returns state directly. Returns\n * `undefined` until the owning interactable is registered.\n *\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport const unstable_useInteractableState: <TState>(id: string) => [\n TState | undefined,\n {\n setState: (updater: StateUpdater<TState>) => void;\n isPending: boolean;\n error: unknown;\n flush: () => Promise<void>;\n },\n] = useInteractableState;\n"],"mappings":";;;;AAOA,MAAMQ,wBAAuBC,OAAA;CAAA,MAAAC,IAAAT,EAAA,EAAA;CAW3B,MAAAU,MAAYR,OAAO;CAAE,IAAAS;CAAA,IAAAF,EAAA,OAAAD,IAAA;EAGnBG,MAAAC,MAAOA,EAACC,uBAAuBC,YAAaN,GAAU,EAAAO;EAAAN,EAAA,KAAAD;EAAAC,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CADxD,MAAAM,QAAcZ,YACZQ,EACF;CAAwB,IAAAK;CAAA,IAAAP,EAAA,OAAAD,IAAA;EAGtBQ,MAAAC,QAAOL,IAACC,uBAAuBK,YAAaV;EAAGC,EAAA,KAAAD;EAAAC,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CADjD,MAAAU,oBAA0BhB,YACxBa,EACF;CAAE,IAAAI;CAAA,IAAAX,EAAA,OAAAC,OAAAD,EAAA,OAAAD,IAAA;EAGAY,MAAAC,YAAA;GACEX,IAAGG,uBAAwB,CAAC,CAAAS,SAAUd,KAAIF,SAAA;IACxC,IAAI,OAAOe,YAAY,YAAU,OACvBA,QAAqCf,IAAc;IAC5D,OACMe;GAAO,CACf;EAAC;EACHZ,EAAA,KAAAC;EAAAD,EAAA,KAAAD;EAAAC,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CARH,MAAAa,WAAiBF;CAUf,IAAAG;CAAA,IAAAd,EAAA,OAAAC,KAAA;EAEwBa,WAAMb,IAAGG,uBAAwB,CAAC,CAAAW,MAAO;EAACf,EAAA,KAAAC;EAAAD,EAAA,KAAAc;CAAA,OAAAA,KAAAd,EAAA;CAApE,MAAAe,QAAcD;CAMC,MAAAE,KAAAN,mBAAiBO,aAAjB;CACJ,MAAAC,KAAAR,mBAAiBS;CAAO,IAAAC;CAAA,IAAApB,EAAA,OAAAe,SAAAf,EAAA,QAAAa,YAAAb,EAAA,QAAAgB,MAAAhB,EAAA,QAAAkB,IAAA;EAHjCE,KAAA;GAAAP;GAAAI,WAEaD;GAAqCG,OACzCD;GAAwBH;EAEjC;EAACf,EAAA,KAAAe;EAAAf,EAAA,MAAAa;EAAAb,EAAA,MAAAgB;EAAAhB,EAAA,MAAAkB;EAAAlB,EAAA,MAAAoB;CAAA,OAAAA,KAAApB,EAAA;CAAA,IAAAqB;CAAA,IAAArB,EAAA,QAAAM,SAAAN,EAAA,QAAAoB,IAAA;EAPIC,KAAA,CACLf,OACAc,EAKC;EACFpB,EAAA,MAAAM;EAAAN,EAAA,MAAAoB;EAAApB,EAAA,MAAAqB;CAAA,OAAAA,KAAArB,EAAA;CAAA,OARMqB;AAQN;;;;;;;;;;AAYH,MAAaC,gCAQTxB"}
@@ -0,0 +1,19 @@
1
+ import { Unstable_InteractableVersion } from "../../model-context/interactable-composer-metadata.js";
2
+
3
+ //#region src/react/model-context/useInteractableVersions.d.ts
4
+ /**
5
+ * Every version of a tool-created interactable recorded in the current
6
+ * thread, oldest first: the creating tool call, each user edit, and each
7
+ * `update_*` call. Each entry carries the full state as of that version and a
8
+ * `restore()` that sets the live instance back to it — enough for a version
9
+ * picker like an artifact's history dropdown.
10
+ *
11
+ * @deprecated Unstable / Experimental (not actually removed).
12
+ */
13
+ declare const unstable_useInteractableVersions: <TState = unknown>(id: string, name: string) => (Omit<Unstable_InteractableVersion, "state"> & {
14
+ state: TState;
15
+ restore: () => void;
16
+ })[];
17
+ //#endregion
18
+ export { unstable_useInteractableVersions };
19
+ //# sourceMappingURL=useInteractableVersions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInteractableVersions.d.ts","names":[],"sources":["../../../src/react/model-context/useInteractableVersions.ts"],"mappings":";;;;;AAyCA;;;;;;;cAAa,gCAAA,qBACX,EAAA,UACA,IAAA,cACI,IAAA,CAAK,4BAAA;EACT,KAAA,EAAO,MAAA;EACP,OAAA;AAAA"}
@@ -0,0 +1,51 @@
1
+ import { unstable_getInteractableVersions } from "../../model-context/interactable-composer-metadata.js";
2
+ import { unstable_useInteractableState } from "./useInteractableState.js";
3
+ import { useJSONEqual } from "../utils/useJSONEqual.js";
4
+ import { useAuiState } from "@assistant-ui/store";
5
+ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
6
+ //#region src/react/model-context/useInteractableVersions.ts
7
+ const useInteractableVersions = (id, name) => {
8
+ const $ = c(8);
9
+ let t0;
10
+ if ($[0] !== id || $[1] !== name) {
11
+ t0 = (s) => unstable_getInteractableVersions(s.thread.messages, id, name);
12
+ $[0] = id;
13
+ $[1] = name;
14
+ $[2] = t0;
15
+ } else t0 = $[2];
16
+ const versions = useAuiState(useJSONEqual(t0));
17
+ const [, t1] = unstable_useInteractableState(id);
18
+ const { setState } = t1;
19
+ let t2;
20
+ if ($[3] !== setState || $[4] !== versions) {
21
+ let t3;
22
+ if ($[6] !== setState) {
23
+ t3 = (v) => ({
24
+ ...v,
25
+ state: v.state,
26
+ restore: () => setState(v.state)
27
+ });
28
+ $[6] = setState;
29
+ $[7] = t3;
30
+ } else t3 = $[7];
31
+ t2 = versions.map(t3);
32
+ $[3] = setState;
33
+ $[4] = versions;
34
+ $[5] = t2;
35
+ } else t2 = $[5];
36
+ return t2;
37
+ };
38
+ /**
39
+ * Every version of a tool-created interactable recorded in the current
40
+ * thread, oldest first: the creating tool call, each user edit, and each
41
+ * `update_*` call. Each entry carries the full state as of that version and a
42
+ * `restore()` that sets the live instance back to it — enough for a version
43
+ * picker like an artifact's history dropdown.
44
+ *
45
+ * @deprecated Unstable / Experimental (not actually removed).
46
+ */
47
+ const unstable_useInteractableVersions = useInteractableVersions;
48
+ //#endregion
49
+ export { unstable_useInteractableVersions };
50
+
51
+ //# sourceMappingURL=useInteractableVersions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInteractableVersions.js","names":["useMemo","useAuiState","unstable_getInteractableVersions","getInteractableVersions","Unstable_InteractableVersion","unstable_useInteractableState","useInteractableState","useJSONEqual","useInteractableVersions","id","name","$","_c","t0","s","thread","messages","versions","t1","setState","t2","t3","v","state","TState","restore","map","unstable_useInteractableVersions","Omit"],"sources":["../../../src/react/model-context/useInteractableVersions.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useAuiState } from \"@assistant-ui/store\";\nimport {\n unstable_getInteractableVersions as getInteractableVersions,\n type Unstable_InteractableVersion,\n} from \"../../model-context/interactable-composer-metadata\";\nimport { unstable_useInteractableState as useInteractableState } from \"./useInteractableState\";\nimport { useJSONEqual } from \"../utils/useJSONEqual\";\n\nconst useInteractableVersions = <TState = unknown>(\n id: string,\n name: string,\n): (Omit<Unstable_InteractableVersion, \"state\"> & {\n state: TState;\n restore: () => void;\n})[] => {\n const versions = useAuiState(\n useJSONEqual((s) => getInteractableVersions(s.thread.messages, id, name)),\n );\n const [, { setState }] = useInteractableState<TState>(id);\n\n return useMemo(\n () =>\n versions.map((v) => ({\n ...v,\n state: v.state as TState,\n restore: () => setState(v.state as TState),\n })),\n [versions, setState],\n );\n};\n\n/**\n * Every version of a tool-created interactable recorded in the current\n * thread, oldest first: the creating tool call, each user edit, and each\n * `update_*` call. Each entry carries the full state as of that version and a\n * `restore()` that sets the live instance back to it — enough for a version\n * picker like an artifact's history dropdown.\n *\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport const unstable_useInteractableVersions: <TState = unknown>(\n id: string,\n name: string,\n) => (Omit<Unstable_InteractableVersion, \"state\"> & {\n state: TState;\n restore: () => void;\n})[] = useInteractableVersions;\n"],"mappings":";;;;;;AASA,MAAMQ,2BAA0BC,IAAAC,SAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAA,IAAAC;CAAA,IAAAF,EAAA,OAAAF,MAAAE,EAAA,OAAAD,MAAA;EAQfG,MAAAC,MAAOX,iCAAwBW,EAACC,OAAOC,UAAWP,IAAIC,IAAI;EAACC,EAAA,KAAAF;EAAAE,EAAA,KAAAD;EAAAC,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CAD1E,MAAAM,WAAiBhB,YACfM,aAAaM,EAA2D,CAC1E;CACA,MAAA,GAAAK,MAAyBZ,8BAA6BG,EAAE;CAA/C,MAAA,EAAAU,aAAAD;CAAY,IAAAE;CAAA,IAAAT,EAAA,OAAAQ,YAAAR,EAAA,OAAAM,UAAA;EAAA,IAAAI;EAAA,IAAAV,EAAA,OAAAQ,UAAA;GAIJE,MAAAC,OAAQ;IAAA,GAChBA;IAACC,OACGD,EAACC;IAAgBE,eACTN,SAASG,EAACC,KAAgB;GAC3C;GAAEZ,EAAA,KAAAQ;GAAAR,EAAA,KAAAU;EAAA,OAAAA,KAAAV,EAAA;EAJFS,KAAAH,SAAQS,IAAKL,EAIX;EAACV,EAAA,KAAAQ;EAAAR,EAAA,KAAAM;EAAAN,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,OAJHS;AAIG;;;;;;;;;;AAcT,MAAaO,mCAMNnB"}
@@ -0,0 +1,15 @@
1
+ //#region src/react/primitive-hooks/useThreadMessageIds.d.ts
2
+ /**
3
+ * Returns the ids of the messages in the current thread, in order.
4
+ *
5
+ * The returned array keeps a stable identity across content-only updates (e.g.
6
+ * streaming), changing reference only when the id sequence itself changes. Pair
7
+ * with `ThreadPrimitive.Unstable_MessageById` to drive a virtualized or custom
8
+ * message list.
9
+ *
10
+ * @deprecated Unstable / Experimental - may change in any release.
11
+ */
12
+ declare const unstable_useThreadMessageIds: () => readonly string[];
13
+ //#endregion
14
+ export { unstable_useThreadMessageIds };
15
+ //# sourceMappingURL=useThreadMessageIds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useThreadMessageIds.d.ts","names":[],"sources":["../../../src/react/primitive-hooks/useThreadMessageIds.ts"],"mappings":";;AA0BA;;;;AAA+D;;;;;cAAlD,4BAAA"}
@@ -0,0 +1,26 @@
1
+ import { useAuiState } from "@assistant-ui/store";
2
+ import { useRef } from "@assistant-ui/tap/react-shim";
3
+ //#region src/react/primitive-hooks/useThreadMessageIds.ts
4
+ const useThreadMessageIds = () => {
5
+ const messages = useAuiState((s) => s.thread.messages);
6
+ const prevIdsRef = useRef([]);
7
+ const ids = messages.map((m) => m.id);
8
+ const prev = prevIdsRef.current;
9
+ if (prev.length !== ids.length || prev.some((id, i) => id !== ids[i])) prevIdsRef.current = ids;
10
+ return prevIdsRef.current;
11
+ };
12
+ /**
13
+ * Returns the ids of the messages in the current thread, in order.
14
+ *
15
+ * The returned array keeps a stable identity across content-only updates (e.g.
16
+ * streaming), changing reference only when the id sequence itself changes. Pair
17
+ * with `ThreadPrimitive.Unstable_MessageById` to drive a virtualized or custom
18
+ * message list.
19
+ *
20
+ * @deprecated Unstable / Experimental - may change in any release.
21
+ */
22
+ const unstable_useThreadMessageIds = useThreadMessageIds;
23
+ //#endregion
24
+ export { unstable_useThreadMessageIds };
25
+
26
+ //# sourceMappingURL=useThreadMessageIds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useThreadMessageIds.js","names":["useRef","useAuiState","useThreadMessageIds","messages","s","thread","prevIdsRef","ids","map","m","id","prev","current","length","some","i","unstable_useThreadMessageIds"],"sources":["../../../src/react/primitive-hooks/useThreadMessageIds.ts"],"sourcesContent":["import { useRef } from \"react\";\nimport { useAuiState } from \"@assistant-ui/store\";\n\nconst useThreadMessageIds = (): readonly string[] => {\n const messages = useAuiState((s) => s.thread.messages);\n const prevIdsRef = useRef<readonly string[]>([]);\n\n const ids = messages.map((m) => m.id);\n const prev = prevIdsRef.current;\n if (prev.length !== ids.length || prev.some((id, i) => id !== ids[i])) {\n prevIdsRef.current = ids;\n }\n\n return prevIdsRef.current;\n};\n\n/**\n * Returns the ids of the messages in the current thread, in order.\n *\n * The returned array keeps a stable identity across content-only updates (e.g.\n * streaming), changing reference only when the id sequence itself changes. Pair\n * with `ThreadPrimitive.Unstable_MessageById` to drive a virtualized or custom\n * message list.\n *\n * @deprecated Unstable / Experimental - may change in any release.\n */\nexport const unstable_useThreadMessageIds = useThreadMessageIds;\n"],"mappings":";;;AAGA,MAAME,4BAA+C;CACnD,MAAMC,WAAWF,aAAaG,MAAMA,EAAEC,OAAOF,QAAQ;CACrD,MAAMG,aAAaN,OAA0B,CAAA,CAAE;CAE/C,MAAMO,MAAMJ,SAASK,KAAKC,MAAMA,EAAEC,EAAE;CACpC,MAAMC,OAAOL,WAAWM;CACxB,IAAID,KAAKE,WAAWN,IAAIM,UAAUF,KAAKG,MAAMJ,IAAIK,MAAML,OAAOH,IAAIQ,EAAE,GAClET,WAAWM,UAAUL;CAGvB,OAAOD,WAAWM;AACpB;;;;;;;;;;;AAYA,MAAaI,+BAA+Bd"}
@@ -1,5 +1,5 @@
1
- import { useSyncExternalStore } from "@assistant-ui/tap/react-shim";
2
1
  import { useAui, useAuiState } from "@assistant-ui/store";
2
+ import { useSyncExternalStore } from "@assistant-ui/tap/react-shim";
3
3
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
4
4
  //#region src/react/primitive-hooks/useVoice.ts
5
5
  const useVoiceState = () => {
@@ -1,7 +1,7 @@
1
1
  import { ChainOfThoughtPartByIndexProvider } from "../../providers/ChainOfThoughtPartByIndexProvider.js";
2
2
  import { MessagePartComponent } from "../message/MessageParts.js";
3
- import { useMemo } from "@assistant-ui/tap/react-shim";
4
3
  import { RenderChildrenWithAccessor, useAuiState } from "@assistant-ui/store";
4
+ import { useMemo } from "@assistant-ui/tap/react-shim";
5
5
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
6
6
  import { jsx } from "react/jsx-runtime";
7
7
  //#region src/react/primitives/chainOfThought/ChainOfThoughtParts.tsx
@@ -1,6 +1,6 @@
1
1
  import { ComposerAttachmentByIndexProvider } from "../../providers/AttachmentByIndexProvider.js";
2
- import { memo, useMemo } from "@assistant-ui/tap/react-shim";
3
2
  import { RenderChildrenWithAccessor, useAuiState } from "@assistant-ui/store";
3
+ import { memo, useMemo } from "@assistant-ui/tap/react-shim";
4
4
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region src/react/primitives/composer/ComposerAttachments.tsx
@@ -1,6 +1,6 @@
1
1
  import { QueueItemByIndexProvider } from "../../providers/QueueItemByIndexProvider.js";
2
- import { memo, useMemo } from "@assistant-ui/tap/react-shim";
3
2
  import { RenderChildrenWithAccessor, useAuiState } from "@assistant-ui/store";
3
+ import { memo, useMemo } from "@assistant-ui/tap/react-shim";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  //#region src/react/primitives/composer/ComposerQueue.tsx
6
6
  const ComposerPrimitiveQueueInner = ({ children }) => {
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { createElement } from "@assistant-ui/tap/react-shim";
3
2
  import { useAuiState } from "@assistant-ui/store";
3
+ import { createElement } from "@assistant-ui/tap/react-shim";
4
4
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
5
5
  import { Fragment as Fragment$1, jsx } from "react/jsx-runtime";
6
6
  //#region src/react/primitives/generativeUI/GenerativeUI.tsx
@@ -1,6 +1,6 @@
1
1
  import { MessageAttachmentByIndexProvider } from "../../providers/AttachmentByIndexProvider.js";
2
- import { memo, useMemo } from "@assistant-ui/tap/react-shim";
3
2
  import { RenderChildrenWithAccessor, useAuiState } from "@assistant-ui/store";
3
+ import { memo, useMemo } from "@assistant-ui/tap/react-shim";
4
4
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region src/react/primitives/message/MessageAttachments.tsx
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { MessagePartChildren } from "./MessageParts.js";
3
3
  import { GROUPBY_MEMO_KEY, buildGroupTree } from "../../utils/groupParts.js";
4
- import { Fragment, useMemo } from "@assistant-ui/tap/react-shim";
5
4
  import { useAuiState } from "@assistant-ui/store";
5
+ import { Fragment, useMemo } from "@assistant-ui/tap/react-shim";
6
6
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
7
7
  import { useShallow } from "zustand/shallow";
8
8
  //#region src/react/primitives/message/MessageGroupedParts.tsx
@@ -4,8 +4,8 @@ import { TextMessagePartProvider } from "../../providers/TextMessagePartProvider
4
4
  import { ChainOfThoughtByIndicesProvider } from "../../providers/ChainOfThoughtByIndicesProvider.js";
5
5
  import { getMessageQuote } from "../../utils/getMessageQuote.js";
6
6
  import { GenerativeUIRender } from "../generativeUI/GenerativeUI.js";
7
- import { memo } from "@assistant-ui/tap/react-shim";
8
7
  import { RenderChildrenWithAccessor, useAui, useAuiState } from "@assistant-ui/store";
8
+ import { memo } from "@assistant-ui/tap/react-shim";
9
9
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
10
10
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
11
11
  import { useShallow } from "zustand/shallow";
@@ -1,6 +1,6 @@
1
1
  import { getMessageQuote } from "../../utils/getMessageQuote.js";
2
- import { memo } from "@assistant-ui/tap/react-shim";
3
2
  import { useAuiState } from "@assistant-ui/store";
3
+ import { memo } from "@assistant-ui/tap/react-shim";
4
4
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
5
5
  import { Fragment as Fragment$1, jsx } from "react/jsx-runtime";
6
6
  //#region src/react/primitives/message/MessageQuote.tsx
@@ -5,10 +5,13 @@ import { FC, ReactNode } from "react";
5
5
  //#region src/react/primitives/part/PartMessages.d.ts
6
6
  declare namespace PartPrimitiveMessages {
7
7
  type Props = {
8
- components?: ThreadPrimitiveMessages.Props["components"]; /** Render function called for each message. Receives the message. */
9
- children?: (value: {
8
+ components: NonNullable<ThreadPrimitiveMessages.Props["components"]>;
9
+ children?: never;
10
+ } | {
11
+ /** Render function called for each message. Receives the message. */children: (value: {
10
12
  message: ThreadMessage;
11
13
  }) => ReactNode;
14
+ components?: never;
12
15
  };
13
16
  }
14
17
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"PartMessages.d.ts","names":[],"sources":["../../../../src/react/primitives/part/PartMessages.tsx"],"mappings":";;;;;kBASiB,qBAAA;EAAA,KACH,KAAA;IACV,UAAA,GAAa,uBAAA,CAAwB,KAAA,gBAFH;IAIlC,QAAA,IAAY,KAAA;MAAS,OAAA,EAAS,aAAA;IAAA,MAAoB,SAAA;EAAA;AAAA;;;;;;;;;;;;AAAS;AAsC/D;;;;;;;;AAAsE;AAyBtE;;;cAzBa,yBAAA,EAA2B,EAAE,CAAC,qBAAA,CAAsB,KAAA;AAAA,cAyBpD,qBAAA,kBAAqB,oBAAA,CAAA,qBAAA,CAAA,KAAA"}
1
+ {"version":3,"file":"PartMessages.d.ts","names":[],"sources":["../../../../src/react/primitives/part/PartMessages.tsx"],"mappings":";;;;;kBASiB,qBAAA;EAAA,KACH,KAAA;IAEN,UAAA,EAAY,WAAA,CAAY,uBAAA,CAAwB,KAAA;IAChD,QAAA;EAAA;IADwB,qEAKxB,QAAA,GAAW,KAAA;MAAS,OAAA,EAAS,aAAA;IAAA,MAAoB,SAAA;IACjD,UAAA;EAAA;AAAA;;;;;;;;;;;;;AAAU;AAsClB;;;;;;;;AAAsE;AAyBtE;;cAzBa,yBAAA,EAA2B,EAAE,CAAC,qBAAA,CAAsB,KAAA;AAAA,cAyBpD,qBAAA,kBAAqB,oBAAA,CAAA,qBAAA,CAAA,KAAA"}
@@ -1,7 +1,7 @@
1
1
  import { ReadonlyThreadProvider } from "../../providers/ReadonlyThreadProvider.js";
2
2
  import { ThreadPrimitiveMessagesImpl } from "../thread/ThreadMessages.js";
3
- import { memo } from "@assistant-ui/tap/react-shim";
4
3
  import { useAuiState } from "@assistant-ui/store";
4
+ import { memo } from "@assistant-ui/tap/react-shim";
5
5
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
6
6
  import { jsx } from "react/jsx-runtime";
7
7
  //#region src/react/primitives/part/PartMessages.tsx
@@ -37,11 +37,11 @@ const PartPrimitiveMessagesImpl = (t0) => {
37
37
  const { components, children } = t0;
38
38
  const messages = usePartMessages();
39
39
  if (!messages?.length) return null;
40
- if (children) {
40
+ if (components) {
41
41
  let t1;
42
- if ($[0] !== children) {
43
- t1 = /* @__PURE__ */ jsx(ThreadPrimitiveMessagesImpl, { children });
44
- $[0] = children;
42
+ if ($[0] !== components) {
43
+ t1 = /* @__PURE__ */ jsx(ThreadPrimitiveMessagesImpl, { components });
44
+ $[0] = components;
45
45
  $[1] = t1;
46
46
  } else t1 = $[1];
47
47
  let t2;
@@ -57,9 +57,9 @@ const PartPrimitiveMessagesImpl = (t0) => {
57
57
  return t2;
58
58
  }
59
59
  let t1;
60
- if ($[5] !== components) {
61
- t1 = /* @__PURE__ */ jsx(ThreadPrimitiveMessagesImpl, { components });
62
- $[5] = components;
60
+ if ($[5] !== children) {
61
+ t1 = /* @__PURE__ */ jsx(ThreadPrimitiveMessagesImpl, { children });
62
+ $[5] = children;
63
63
  $[6] = t1;
64
64
  } else t1 = $[6];
65
65
  let t2;
@@ -1 +1 @@
1
- {"version":3,"file":"PartMessages.js","names":["FC","ReactNode","memo","useAuiState","ThreadMessage","ReadonlyThreadProvider","ThreadPrimitiveMessages","ThreadPrimitiveMessagesImpl","PartPrimitiveMessages","Props","components","children","value","message","usePartMessages","_temp","PartPrimitiveMessagesImpl","t0","$","_c","messages","length","t1","t2","displayName","s","part","type","undefined"],"sources":["../../../../src/react/primitives/part/PartMessages.tsx"],"sourcesContent":["import { type FC, type ReactNode, memo } from \"react\";\nimport { useAuiState } from \"@assistant-ui/store\";\nimport type { ThreadMessage } from \"../../../types/message\";\nimport { ReadonlyThreadProvider } from \"../../providers/ReadonlyThreadProvider\";\nimport {\n type ThreadPrimitiveMessages,\n ThreadPrimitiveMessagesImpl,\n} from \"../thread/ThreadMessages\";\n\nexport namespace PartPrimitiveMessages {\n export type Props = {\n components?: ThreadPrimitiveMessages.Props[\"components\"];\n /** Render function called for each message. Receives the message. */\n children?: (value: { message: ThreadMessage }) => ReactNode;\n };\n}\n\nconst usePartMessages = (): readonly ThreadMessage[] | undefined => {\n return useAuiState((s) => {\n const part = s.part;\n if (part.type !== \"tool-call\") return undefined;\n return \"messages\" in part\n ? (part.messages as readonly ThreadMessage[] | undefined)\n : undefined;\n });\n};\n\n/**\n * Renders the nested messages of a tool call part (e.g. sub-agent conversation).\n *\n * This primitive reads `messages` from the current tool call part in the PartScope\n * and renders them using a readonly thread context. All existing message and part\n * primitives work inside, and parent tool UI registrations are inherited.\n *\n * @example\n * ```tsx\n * const toolkit = defineToolkit({\n * invoke_sub_agent: {\n * type: \"backend\",\n * render: () => (\n * <PartPrimitive.Messages>\n * {({ message }) => {\n * if (message.role === \"user\") return <MyUserMessage />;\n * return <MyAssistantMessage />;\n * }}\n * </PartPrimitive.Messages>\n * ),\n * },\n * });\n * ```\n */\nexport const PartPrimitiveMessagesImpl: FC<PartPrimitiveMessages.Props> = ({\n components,\n children,\n}) => {\n const messages = usePartMessages();\n\n if (!messages?.length) return null;\n\n if (children) {\n return (\n <ReadonlyThreadProvider messages={messages}>\n <ThreadPrimitiveMessagesImpl>{children}</ThreadPrimitiveMessagesImpl>\n </ReadonlyThreadProvider>\n );\n }\n\n return (\n <ReadonlyThreadProvider messages={messages}>\n <ThreadPrimitiveMessagesImpl components={components!} />\n </ReadonlyThreadProvider>\n );\n};\n\nPartPrimitiveMessagesImpl.displayName = \"PartPrimitive.Messages\";\n\nexport const PartPrimitiveMessages = memo(PartPrimitiveMessagesImpl);\n"],"mappings":";;;;;;;AAiBA,MAAMc,wBAAkB;CAAA,OACfX,YAAYY,KAMlB;AAAC;;;;;;;;;;;;;;;;;;;;;;;;;AA2BJ,MAAaC,6BAA6DC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAT,YAAAC,aAAAM;CAIzE,MAAAG,WAAiBN,gBAAgB;CAEjC,IAAI,CAACM,UAAQC,QAAQ,OAAS;CAE9B,IAAIV,UAAQ;EAAA,IAAAW;EAAA,IAAAJ,EAAA,OAAAP,UAAA;GAGNW,KAAA,oBAAC,6BAAD,EAA8BX,SAAF,CAAA;GAAyCO,EAAA,KAAAP;GAAAO,EAAA,KAAAI;EAAA,OAAAA,KAAAJ,EAAA;EAAA,IAAAK;EAAA,IAAAL,EAAA,OAAAE,YAAAF,EAAA,OAAAI,IAAA;GADvEC,KAAA,oBAAC,wBAAD;IAAkCH;cAChCE;GADqB,CAAA;GAEEJ,EAAA,KAAAE;GAAAF,EAAA,KAAAI;GAAAJ,EAAA,KAAAK;EAAA,OAAAA,KAAAL,EAAA;EAAA,OAFzBK;CAEyB;CAE5B,IAAAD;CAAA,IAAAJ,EAAA,OAAAR,YAAA;EAIGY,KAAA,oBAAC,6BAAD,EAAyCZ,WAAU,CAAA;EAAKQ,EAAA,KAAAR;EAAAQ,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAAA,IAAAK;CAAA,IAAAL,EAAA,OAAAE,YAAAF,EAAA,OAAAI,IAAA;EAD1DC,KAAA,oBAAC,wBAAD;GAAkCH;aAChCE;EADqB,CAAA;EAEEJ,EAAA,KAAAE;EAAAF,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,OAFzBK;AAEyB;AAI7BP,0BAA0BQ,cAAc;AAExC,MAAahB,wBAAwBN,KAAKc,yBAAyB;AA3D3C,SAAAD,MAAAU,GAAA;CAEpB,MAAAC,OAAaD,EAACC;CACd,IAAIA,KAAIC,SAAU,aAAW;CAAmB,OACzC,cAAcD,OAChBA,KAAIN,WADFQ,KAAAA;AAEM"}
1
+ {"version":3,"file":"PartMessages.js","names":["FC","ReactNode","memo","useAuiState","ThreadMessage","ReadonlyThreadProvider","ThreadPrimitiveMessages","ThreadPrimitiveMessagesImpl","PartPrimitiveMessages","Props","components","NonNullable","children","value","message","usePartMessages","_temp","PartPrimitiveMessagesImpl","t0","$","_c","messages","length","t1","t2","displayName","s","part","type","undefined"],"sources":["../../../../src/react/primitives/part/PartMessages.tsx"],"sourcesContent":["import { type FC, type ReactNode, memo } from \"react\";\nimport { useAuiState } from \"@assistant-ui/store\";\nimport type { ThreadMessage } from \"../../../types/message\";\nimport { ReadonlyThreadProvider } from \"../../providers/ReadonlyThreadProvider\";\nimport {\n type ThreadPrimitiveMessages,\n ThreadPrimitiveMessagesImpl,\n} from \"../thread/ThreadMessages\";\n\nexport namespace PartPrimitiveMessages {\n export type Props =\n | {\n components: NonNullable<ThreadPrimitiveMessages.Props[\"components\"]>;\n children?: never;\n }\n | {\n /** Render function called for each message. Receives the message. */\n children: (value: { message: ThreadMessage }) => ReactNode;\n components?: never;\n };\n}\n\nconst usePartMessages = (): readonly ThreadMessage[] | undefined => {\n return useAuiState((s) => {\n const part = s.part;\n if (part.type !== \"tool-call\") return undefined;\n return \"messages\" in part\n ? (part.messages as readonly ThreadMessage[] | undefined)\n : undefined;\n });\n};\n\n/**\n * Renders the nested messages of a tool call part (e.g. sub-agent conversation).\n *\n * This primitive reads `messages` from the current tool call part in the PartScope\n * and renders them using a readonly thread context. All existing message and part\n * primitives work inside, and parent tool UI registrations are inherited.\n *\n * @example\n * ```tsx\n * const toolkit = defineToolkit({\n * invoke_sub_agent: {\n * type: \"backend\",\n * render: () => (\n * <PartPrimitive.Messages>\n * {({ message }) => {\n * if (message.role === \"user\") return <MyUserMessage />;\n * return <MyAssistantMessage />;\n * }}\n * </PartPrimitive.Messages>\n * ),\n * },\n * });\n * ```\n */\nexport const PartPrimitiveMessagesImpl: FC<PartPrimitiveMessages.Props> = ({\n components,\n children,\n}) => {\n const messages = usePartMessages();\n\n if (!messages?.length) return null;\n\n if (components) {\n return (\n <ReadonlyThreadProvider messages={messages}>\n <ThreadPrimitiveMessagesImpl components={components} />\n </ReadonlyThreadProvider>\n );\n }\n\n return (\n <ReadonlyThreadProvider messages={messages}>\n <ThreadPrimitiveMessagesImpl>{children}</ThreadPrimitiveMessagesImpl>\n </ReadonlyThreadProvider>\n );\n};\n\nPartPrimitiveMessagesImpl.displayName = \"PartPrimitive.Messages\";\n\nexport const PartPrimitiveMessages = memo(PartPrimitiveMessagesImpl);\n"],"mappings":";;;;;;;AAsBA,MAAMe,wBAAkB;CAAA,OACfZ,YAAYa,KAMlB;AAAC;;;;;;;;;;;;;;;;;;;;;;;;;AA2BJ,MAAaC,6BAA6DC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAV,YAAAE,aAAAM;CAIzE,MAAAG,WAAiBN,gBAAgB;CAEjC,IAAI,CAACM,UAAQC,QAAQ,OAAS;CAE9B,IAAIZ,YAAU;EAAA,IAAAa;EAAA,IAAAJ,EAAA,OAAAT,YAAA;GAGRa,KAAA,oBAAC,6BAAD,EAAyCb,WAAU,CAAA;GAAIS,EAAA,KAAAT;GAAAS,EAAA,KAAAI;EAAA,OAAAA,KAAAJ,EAAA;EAAA,IAAAK;EAAA,IAAAL,EAAA,OAAAE,YAAAF,EAAA,OAAAI,IAAA;GADzDC,KAAA,oBAAC,wBAAD;IAAkCH;cAChCE;GADqB,CAAA;GAEEJ,EAAA,KAAAE;GAAAF,EAAA,KAAAI;GAAAJ,EAAA,KAAAK;EAAA,OAAAA,KAAAL,EAAA;EAAA,OAFzBK;CAEyB;CAE5B,IAAAD;CAAA,IAAAJ,EAAA,OAAAP,UAAA;EAIGW,KAAA,oBAAC,6BAAD,EAA8BX,SAAF,CAAA;EAAyCO,EAAA,KAAAP;EAAAO,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAAA,IAAAK;CAAA,IAAAL,EAAA,OAAAE,YAAAF,EAAA,OAAAI,IAAA;EADvEC,KAAA,oBAAC,wBAAD;GAAkCH;aAChCE;EADqB,CAAA;EAEEJ,EAAA,KAAAE;EAAAF,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,OAFzBK;AAEyB;AAI7BP,0BAA0BQ,cAAc;AAExC,MAAajB,wBAAwBN,KAAKe,yBAAyB;AA3D3C,SAAAD,MAAAU,GAAA;CAEpB,MAAAC,OAAaD,EAACC;CACd,IAAIA,KAAIC,SAAU,aAAW;CAAmB,OACzC,cAAcD,OAChBA,KAAIN,WADFQ,KAAAA;AAEM"}
@@ -42,6 +42,36 @@ declare namespace ThreadPrimitiveMessageByIndex {
42
42
  * Renders a single message at the specified index in the current thread.
43
43
  */
44
44
  declare const ThreadPrimitiveMessageByIndex: FC<ThreadPrimitiveMessageByIndex.Props>;
45
+ declare namespace ThreadPrimitiveUnstable_MessageById {
46
+ type Props = {
47
+ messageId: string;
48
+ components: MessagesComponentConfig;
49
+ };
50
+ }
51
+ /**
52
+ * Renders the message with the given id in the current thread.
53
+ *
54
+ * Unlike {@link ThreadPrimitiveMessageByIndex}, this keys off the message id,
55
+ * so it stays attached to the same message across reordering and windowing -
56
+ * the shape needed to drive a virtualized or custom message list together with
57
+ * `unstable_useThreadMessageIds`. A missing or removed id renders `null` rather
58
+ * than throwing.
59
+ *
60
+ * @deprecated Unstable / Experimental - may change in any release.
61
+ *
62
+ * @example
63
+ * ```tsx
64
+ * const messageIds = unstable_useThreadMessageIds();
65
+ * return messageIds.map((messageId) => (
66
+ * <ThreadPrimitive.Unstable_MessageById
67
+ * key={messageId}
68
+ * messageId={messageId}
69
+ * components={MESSAGE_COMPONENTS}
70
+ * />
71
+ * ));
72
+ * ```
73
+ */
74
+ declare const ThreadPrimitiveUnstable_MessageById: FC<ThreadPrimitiveUnstable_MessageById.Props>;
45
75
  /**
46
76
  * Renders all messages in the current thread.
47
77
  *
@@ -58,5 +88,5 @@ declare const ThreadPrimitiveMessageByIndex: FC<ThreadPrimitiveMessageByIndex.Pr
58
88
  declare const ThreadPrimitiveMessagesImpl: FC<ThreadPrimitiveMessages.Props>;
59
89
  declare const ThreadPrimitiveMessages: import("react").NamedExoticComponent<ThreadPrimitiveMessages.Props>;
60
90
  //#endregion
61
- export { ThreadPrimitiveMessageByIndex, ThreadPrimitiveMessages, ThreadPrimitiveMessagesImpl };
91
+ export { ThreadPrimitiveMessageByIndex, ThreadPrimitiveMessages, ThreadPrimitiveMessagesImpl, ThreadPrimitiveUnstable_MessageById };
62
92
  //# sourceMappingURL=ThreadMessages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadMessages.d.ts","names":[],"sources":["../../../../src/react/primitives/thread/ThreadMessages.tsx"],"mappings":";;;;KAWK,uBAAA;mDAGC,OAAA,EAAS,aAAA,EAHV;EAKC,YAAA,GAAe,aAAA;EAEf,gBAAA,GAAmB,aAAA,cAFJ;EAIf,qBAAA,GAAwB,aAAA,cAAA;EAExB,kBAAA,GAAqB,aAAA,cAEP;EAAd,WAAA,GAAc,aAAA,cAIE;EAFhB,gBAAA,GAAmB,aAAA,cAQJ;EANf,aAAA,GAAgB,aAAA;AAAA;EAYK,4DARrB,OAAA,GAAU,aAAA,cAYQ;EAVlB,YAAA,GAAe,aAAA,cAYc;EAV7B,gBAAA,GAAmB,aAAA,cAtBnB;EAwBA,qBAAA,GAAwB,aAAA,cAtBxB;EAwBA,kBAAA,GAAqB,aAAA,cAtBrB;EAwBA,WAAA,EAAa,aAAA,EAtBb;EAwBA,gBAAA,EAAkB,aAAA,EAtBlB;EAwBA,aAAA,GAAgB,aAAA;AAAA;AAAA,kBAGL,uBAAA;EAAA,KACH,KAAA;IAxBW,4DA2BjB,UAAA,EAAY,uBAAA;IACZ,QAAA;EAAA;IAtBQ,qEA0BR,QAAA,GAAW,KAAA;MAAS,OAAA,EAAS,YAAA;IAAA,MAAmB,SAAA;IAChD,UAAA;EAAA;AAAA;AAAA,kBAuFS,6BAAA;EAAA,KACH,KAAA;IACV,KAAA;IACA,UAAA,EAAY,uBAAuB;EAAA;AAAA;;;;cAO1B,6BAAA,EAA+B,EAAE,CAAC,6BAAA,CAA8B,KAAA;AA3G7E;;;;;;;;;;;;;AAAA,cAiKa,2BAAA,EAA6B,EAAE,CAAC,uBAAA,CAAwB,KAAA;AAAA,cAkBxD,uBAAA,kBAAuB,oBAAA,CAAA,uBAAA,CAAA,KAAA"}
1
+ {"version":3,"file":"ThreadMessages.d.ts","names":[],"sources":["../../../../src/react/primitives/thread/ThreadMessages.tsx"],"mappings":";;;;KAYK,uBAAA;mDAGC,OAAA,EAAS,aAAA,EAHV;EAKC,YAAA,GAAe,aAAA;EAEf,gBAAA,GAAmB,aAAA,cAFJ;EAIf,qBAAA,GAAwB,aAAA,cAAA;EAExB,kBAAA,GAAqB,aAAA,cAEP;EAAd,WAAA,GAAc,aAAA,cAIE;EAFhB,gBAAA,GAAmB,aAAA,cAQJ;EANf,aAAA,GAAgB,aAAA;AAAA;EAYK,4DARrB,OAAA,GAAU,aAAA,cAYQ;EAVlB,YAAA,GAAe,aAAA,cAYc;EAV7B,gBAAA,GAAmB,aAAA,cAtBnB;EAwBA,qBAAA,GAAwB,aAAA,cAtBxB;EAwBA,kBAAA,GAAqB,aAAA,cAtBrB;EAwBA,WAAA,EAAa,aAAA,EAtBb;EAwBA,gBAAA,EAAkB,aAAA,EAtBlB;EAwBA,aAAA,GAAgB,aAAA;AAAA;AAAA,kBAGL,uBAAA;EAAA,KACH,KAAA;IAxBW,4DA2BjB,UAAA,EAAY,uBAAA;IACZ,QAAA;EAAA;IAtBQ,qEA0BR,QAAA,GAAW,KAAA;MAAS,OAAA,EAAS,YAAA;IAAA,MAAmB,SAAA;IAChD,UAAA;EAAA;AAAA;AAAA,kBAqGS,6BAAA;EAAA,KACH,KAAA;IACV,KAAA;IACA,UAAA,EAAY,uBAAuB;EAAA;AAAA;;;;cAO1B,6BAAA,EAA+B,EAAE,CAAC,6BAAA,CAA8B,KAAA;AAAA,kBAgB5D,mCAAA;EAAA,KACH,KAAA;IACV,SAAA;IACA,UAAA,EAAY,uBAAuB;EAAA;AAAA;;;;;;;;;;;;;;AAlIrB;AAqGlB;;;;;;;;;cAwDa,mCAAA,EAAqC,EAAE,CAAC,mCAAA,CAAoC,KAAA;AA9CzF;;;;;;;;AAAkF;AAgBlF;;;;AAhBA,cA0Ga,2BAAA,EAA6B,EAAE,CAAC,uBAAA,CAAwB,KAAA;AAAA,cAkBxD,uBAAA,kBAAuB,oBAAA,CAAA,uBAAA,CAAA,KAAA"}
@@ -1,6 +1,7 @@
1
1
  import { MessageByIndexProvider } from "../../providers/MessageByIndexProvider.js";
2
- import { memo, useMemo } from "@assistant-ui/tap/react-shim";
2
+ import { MessageByIdProvider } from "../../providers/MessageByIdProvider.js";
3
3
  import { RenderChildrenWithAccessor, useAuiState } from "@assistant-ui/store";
4
+ import { memo, useMemo } from "@assistant-ui/tap/react-shim";
4
5
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
5
6
  import { jsx } from "react/jsx-runtime";
6
7
  //#region src/react/primitives/thread/ThreadMessages.tsx
@@ -8,6 +9,15 @@ const isComponentsSame = (prev, next) => {
8
9
  return prev.Message === next.Message && prev.EditComposer === next.EditComposer && prev.UserEditComposer === next.UserEditComposer && prev.AssistantEditComposer === next.AssistantEditComposer && prev.SystemEditComposer === next.SystemEditComposer && prev.UserMessage === next.UserMessage && prev.AssistantMessage === next.AssistantMessage && prev.SystemMessage === next.SystemMessage;
9
10
  };
10
11
  const DEFAULT_SYSTEM_MESSAGE = () => null;
12
+ const messageIdSetCache = /* @__PURE__ */ new WeakMap();
13
+ const hasMessageId = (messages, messageId) => {
14
+ let ids = messageIdSetCache.get(messages);
15
+ if (!ids) {
16
+ ids = new Set(messages.map((m) => m.id));
17
+ messageIdSetCache.set(messages, ids);
18
+ }
19
+ return ids.has(messageId);
20
+ };
11
21
  const getComponent = (components, role, isEditing) => {
12
22
  switch (role) {
13
23
  case "user": if (isEditing) return components.UserEditComposer ?? components.EditComposer ?? components.UserMessage ?? components.Message;
@@ -66,6 +76,58 @@ const ThreadPrimitiveMessageByIndex = memo((t0) => {
66
76
  return t2;
67
77
  }, (prev, next) => prev.index === next.index && isComponentsSame(prev.components, next.components));
68
78
  ThreadPrimitiveMessageByIndex.displayName = "ThreadPrimitive.MessageByIndex";
79
+ /**
80
+ * Renders the message with the given id in the current thread.
81
+ *
82
+ * Unlike {@link ThreadPrimitiveMessageByIndex}, this keys off the message id,
83
+ * so it stays attached to the same message across reordering and windowing -
84
+ * the shape needed to drive a virtualized or custom message list together with
85
+ * `unstable_useThreadMessageIds`. A missing or removed id renders `null` rather
86
+ * than throwing.
87
+ *
88
+ * @deprecated Unstable / Experimental - may change in any release.
89
+ *
90
+ * @example
91
+ * ```tsx
92
+ * const messageIds = unstable_useThreadMessageIds();
93
+ * return messageIds.map((messageId) => (
94
+ * <ThreadPrimitive.Unstable_MessageById
95
+ * key={messageId}
96
+ * messageId={messageId}
97
+ * components={MESSAGE_COMPONENTS}
98
+ * />
99
+ * ));
100
+ * ```
101
+ */
102
+ const ThreadPrimitiveUnstable_MessageById = memo((t0) => {
103
+ const $ = c(7);
104
+ const { messageId, components } = t0;
105
+ let t1;
106
+ if ($[0] !== messageId) {
107
+ t1 = (s) => hasMessageId(s.thread.messages, messageId);
108
+ $[0] = messageId;
109
+ $[1] = t1;
110
+ } else t1 = $[1];
111
+ if (!useAuiState(t1)) return null;
112
+ let t2;
113
+ if ($[2] !== components) {
114
+ t2 = /* @__PURE__ */ jsx(ThreadMessageComponent, { components });
115
+ $[2] = components;
116
+ $[3] = t2;
117
+ } else t2 = $[3];
118
+ let t3;
119
+ if ($[4] !== messageId || $[5] !== t2) {
120
+ t3 = /* @__PURE__ */ jsx(MessageByIdProvider, {
121
+ id: messageId,
122
+ children: t2
123
+ });
124
+ $[4] = messageId;
125
+ $[5] = t2;
126
+ $[6] = t3;
127
+ } else t3 = $[6];
128
+ return t3;
129
+ }, (prev, next) => prev.messageId === next.messageId && isComponentsSame(prev.components, next.components));
130
+ ThreadPrimitiveUnstable_MessageById.displayName = "ThreadPrimitive.Unstable_MessageById";
69
131
  const ThreadPrimitiveMessagesInner = ({ children }) => {
70
132
  const messagesLength = useAuiState((s) => s.thread.messages.length);
71
133
  return useMemo(() => {
@@ -126,6 +188,6 @@ function _temp2(s_0) {
126
188
  return s_0.message.composer.isEditing;
127
189
  }
128
190
  //#endregion
129
- export { ThreadPrimitiveMessageByIndex, ThreadPrimitiveMessages, ThreadPrimitiveMessagesImpl };
191
+ export { ThreadPrimitiveMessageByIndex, ThreadPrimitiveMessages, ThreadPrimitiveMessagesImpl, ThreadPrimitiveUnstable_MessageById };
130
192
 
131
193
  //# sourceMappingURL=ThreadMessages.js.map