@assistant-ui/react 0.7.45 → 0.7.47

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 (221) hide show
  1. package/dist/api/AssistantRuntime.d.ts +1 -0
  2. package/dist/api/AssistantRuntime.d.ts.map +1 -1
  3. package/dist/api/AssistantRuntime.js +5 -0
  4. package/dist/api/AssistantRuntime.js.map +1 -1
  5. package/dist/api/AssistantRuntime.mjs +5 -0
  6. package/dist/api/AssistantRuntime.mjs.map +1 -1
  7. package/dist/api/AttachmentRuntime.d.ts +1 -0
  8. package/dist/api/AttachmentRuntime.d.ts.map +1 -1
  9. package/dist/api/AttachmentRuntime.js +5 -0
  10. package/dist/api/AttachmentRuntime.js.map +1 -1
  11. package/dist/api/AttachmentRuntime.mjs +5 -0
  12. package/dist/api/AttachmentRuntime.mjs.map +1 -1
  13. package/dist/api/ComposerRuntime.d.ts +2 -0
  14. package/dist/api/ComposerRuntime.d.ts.map +1 -1
  15. package/dist/api/ComposerRuntime.js +19 -0
  16. package/dist/api/ComposerRuntime.js.map +1 -1
  17. package/dist/api/ComposerRuntime.mjs +19 -0
  18. package/dist/api/ComposerRuntime.mjs.map +1 -1
  19. package/dist/api/ContentPartRuntime.d.ts +1 -0
  20. package/dist/api/ContentPartRuntime.d.ts.map +1 -1
  21. package/dist/api/ContentPartRuntime.js +5 -0
  22. package/dist/api/ContentPartRuntime.js.map +1 -1
  23. package/dist/api/ContentPartRuntime.mjs +5 -0
  24. package/dist/api/ContentPartRuntime.mjs.map +1 -1
  25. package/dist/api/MessageRuntime.d.ts +1 -0
  26. package/dist/api/MessageRuntime.d.ts.map +1 -1
  27. package/dist/api/MessageRuntime.js +13 -0
  28. package/dist/api/MessageRuntime.js.map +1 -1
  29. package/dist/api/MessageRuntime.mjs +13 -0
  30. package/dist/api/MessageRuntime.mjs.map +1 -1
  31. package/dist/api/ThreadListItemRuntime.d.ts +1 -0
  32. package/dist/api/ThreadListItemRuntime.d.ts.map +1 -1
  33. package/dist/api/ThreadListItemRuntime.js +11 -0
  34. package/dist/api/ThreadListItemRuntime.js.map +1 -1
  35. package/dist/api/ThreadListItemRuntime.mjs +11 -0
  36. package/dist/api/ThreadListItemRuntime.mjs.map +1 -1
  37. package/dist/api/ThreadListRuntime.d.ts +1 -0
  38. package/dist/api/ThreadListRuntime.d.ts.map +1 -1
  39. package/dist/api/ThreadListRuntime.js +10 -0
  40. package/dist/api/ThreadListRuntime.js.map +1 -1
  41. package/dist/api/ThreadListRuntime.mjs +10 -0
  42. package/dist/api/ThreadListRuntime.mjs.map +1 -1
  43. package/dist/api/ThreadRuntime.d.ts +1 -1
  44. package/dist/api/ThreadRuntime.d.ts.map +1 -1
  45. package/dist/api/ThreadRuntime.js +14 -3
  46. package/dist/api/ThreadRuntime.js.map +1 -1
  47. package/dist/api/ThreadRuntime.mjs +14 -3
  48. package/dist/api/ThreadRuntime.mjs.map +1 -1
  49. package/dist/context/providers/AssistantRuntimeProvider.d.ts.map +1 -1
  50. package/dist/context/providers/AssistantRuntimeProvider.js +5 -14
  51. package/dist/context/providers/AssistantRuntimeProvider.js.map +1 -1
  52. package/dist/context/providers/AssistantRuntimeProvider.mjs +5 -14
  53. package/dist/context/providers/AssistantRuntimeProvider.mjs.map +1 -1
  54. package/dist/context/providers/AttachmentRuntimeProvider.d.ts.map +1 -1
  55. package/dist/context/providers/AttachmentRuntimeProvider.js +5 -16
  56. package/dist/context/providers/AttachmentRuntimeProvider.js.map +1 -1
  57. package/dist/context/providers/AttachmentRuntimeProvider.mjs +6 -21
  58. package/dist/context/providers/AttachmentRuntimeProvider.mjs.map +1 -1
  59. package/dist/context/providers/ContentPartRuntimeProvider.d.ts +0 -1
  60. package/dist/context/providers/ContentPartRuntimeProvider.d.ts.map +1 -1
  61. package/dist/context/providers/ContentPartRuntimeProvider.js +5 -15
  62. package/dist/context/providers/ContentPartRuntimeProvider.js.map +1 -1
  63. package/dist/context/providers/ContentPartRuntimeProvider.mjs +4 -13
  64. package/dist/context/providers/ContentPartRuntimeProvider.mjs.map +1 -1
  65. package/dist/context/providers/MessageRuntimeProvider.d.ts.map +1 -1
  66. package/dist/context/providers/MessageRuntimeProvider.js +3 -22
  67. package/dist/context/providers/MessageRuntimeProvider.js.map +1 -1
  68. package/dist/context/providers/MessageRuntimeProvider.mjs +3 -22
  69. package/dist/context/providers/MessageRuntimeProvider.mjs.map +1 -1
  70. package/dist/context/providers/TextContentPartProvider.d.ts.map +1 -1
  71. package/dist/context/providers/TextContentPartProvider.js +13 -12
  72. package/dist/context/providers/TextContentPartProvider.js.map +1 -1
  73. package/dist/context/providers/TextContentPartProvider.mjs +13 -12
  74. package/dist/context/providers/TextContentPartProvider.mjs.map +1 -1
  75. package/dist/context/providers/ThreadListItemRuntimeProvider.d.ts +0 -1
  76. package/dist/context/providers/ThreadListItemRuntimeProvider.d.ts.map +1 -1
  77. package/dist/context/providers/ThreadListItemRuntimeProvider.js +5 -15
  78. package/dist/context/providers/ThreadListItemRuntimeProvider.js.map +1 -1
  79. package/dist/context/providers/ThreadListItemRuntimeProvider.mjs +4 -13
  80. package/dist/context/providers/ThreadListItemRuntimeProvider.mjs.map +1 -1
  81. package/dist/context/providers/ThreadRuntimeProvider.d.ts.map +1 -1
  82. package/dist/context/providers/ThreadRuntimeProvider.js +5 -24
  83. package/dist/context/providers/ThreadRuntimeProvider.js.map +1 -1
  84. package/dist/context/providers/ThreadRuntimeProvider.mjs +6 -25
  85. package/dist/context/providers/ThreadRuntimeProvider.mjs.map +1 -1
  86. package/dist/context/react/AssistantContext.d.ts +26 -17
  87. package/dist/context/react/AssistantContext.d.ts.map +1 -1
  88. package/dist/context/react/AssistantContext.js +3 -4
  89. package/dist/context/react/AssistantContext.js.map +1 -1
  90. package/dist/context/react/AssistantContext.mjs +3 -4
  91. package/dist/context/react/AssistantContext.mjs.map +1 -1
  92. package/dist/context/react/AttachmentContext.d.ts +558 -30
  93. package/dist/context/react/AttachmentContext.d.ts.map +1 -1
  94. package/dist/context/react/AttachmentContext.js +32 -52
  95. package/dist/context/react/AttachmentContext.js.map +1 -1
  96. package/dist/context/react/AttachmentContext.mjs +33 -52
  97. package/dist/context/react/AttachmentContext.mjs.map +1 -1
  98. package/dist/context/react/ComposerContext.d.ts +28 -19
  99. package/dist/context/react/ComposerContext.d.ts.map +1 -1
  100. package/dist/context/react/ComposerContext.js +2 -19
  101. package/dist/context/react/ComposerContext.js.map +1 -1
  102. package/dist/context/react/ComposerContext.mjs +4 -20
  103. package/dist/context/react/ComposerContext.mjs.map +1 -1
  104. package/dist/context/react/ContentPartContext.d.ts +22 -16
  105. package/dist/context/react/ContentPartContext.d.ts.map +1 -1
  106. package/dist/context/react/ContentPartContext.js +2 -7
  107. package/dist/context/react/ContentPartContext.js.map +1 -1
  108. package/dist/context/react/ContentPartContext.mjs +2 -6
  109. package/dist/context/react/ContentPartContext.mjs.map +1 -1
  110. package/dist/context/react/MessageContext.d.ts +49 -29
  111. package/dist/context/react/MessageContext.d.ts.map +1 -1
  112. package/dist/context/react/MessageContext.js +5 -9
  113. package/dist/context/react/MessageContext.js.map +1 -1
  114. package/dist/context/react/MessageContext.mjs +5 -8
  115. package/dist/context/react/MessageContext.mjs.map +1 -1
  116. package/dist/context/react/ThreadContext.d.ts +44 -24
  117. package/dist/context/react/ThreadContext.d.ts.map +1 -1
  118. package/dist/context/react/ThreadContext.js +5 -9
  119. package/dist/context/react/ThreadContext.js.map +1 -1
  120. package/dist/context/react/ThreadContext.mjs +5 -8
  121. package/dist/context/react/ThreadContext.mjs.map +1 -1
  122. package/dist/context/react/ThreadListItemContext.d.ts +22 -16
  123. package/dist/context/react/ThreadListItemContext.d.ts.map +1 -1
  124. package/dist/context/react/ThreadListItemContext.js +3 -6
  125. package/dist/context/react/ThreadListItemContext.js.map +1 -1
  126. package/dist/context/react/ThreadListItemContext.mjs +3 -5
  127. package/dist/context/react/ThreadListItemContext.mjs.map +1 -1
  128. package/dist/context/react/index.d.ts +1 -0
  129. package/dist/context/react/index.d.ts.map +1 -1
  130. package/dist/context/react/index.js +3 -0
  131. package/dist/context/react/index.js.map +1 -1
  132. package/dist/context/react/index.mjs +2 -0
  133. package/dist/context/react/index.mjs.map +1 -1
  134. package/dist/context/react/utils/createContextHook.d.ts +3 -8
  135. package/dist/context/react/utils/createContextHook.d.ts.map +1 -1
  136. package/dist/context/react/utils/createContextHook.js.map +1 -1
  137. package/dist/context/react/utils/createContextHook.mjs.map +1 -1
  138. package/dist/context/react/utils/createStateHookForRuntime.d.ts +31 -0
  139. package/dist/context/react/utils/createStateHookForRuntime.d.ts.map +1 -0
  140. package/dist/context/react/utils/createStateHookForRuntime.js +47 -0
  141. package/dist/context/react/utils/createStateHookForRuntime.js.map +1 -0
  142. package/dist/context/react/utils/createStateHookForRuntime.mjs +24 -0
  143. package/dist/context/react/utils/createStateHookForRuntime.mjs.map +1 -0
  144. package/dist/context/react/utils/ensureBinding.d.ts +2 -0
  145. package/dist/context/react/utils/ensureBinding.d.ts.map +1 -0
  146. package/dist/context/react/utils/ensureBinding.js +36 -0
  147. package/dist/context/react/utils/ensureBinding.js.map +1 -0
  148. package/dist/context/react/utils/ensureBinding.mjs +11 -0
  149. package/dist/context/react/utils/ensureBinding.mjs.map +1 -0
  150. package/dist/context/react/utils/useRuntimeState.d.ts +10 -0
  151. package/dist/context/react/utils/useRuntimeState.d.ts.map +1 -0
  152. package/dist/context/react/utils/useRuntimeState.js +48 -0
  153. package/dist/context/react/utils/useRuntimeState.js.map +1 -0
  154. package/dist/context/react/utils/useRuntimeState.mjs +22 -0
  155. package/dist/context/react/utils/useRuntimeState.mjs.map +1 -0
  156. package/dist/runtimes/adapters/attachment/AttachmentAdapter.d.ts +1 -1
  157. package/dist/runtimes/adapters/attachment/AttachmentAdapter.d.ts.map +1 -1
  158. package/dist/runtimes/adapters/attachment/AttachmentAdapter.js.map +1 -1
  159. package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.d.ts +1 -1
  160. package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.d.ts.map +1 -1
  161. package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.js +1 -1
  162. package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.js.map +1 -1
  163. package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.mjs +1 -1
  164. package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.mjs.map +1 -1
  165. package/dist/runtimes/adapters/thread-history/ThreadHistoryAdapter.d.ts.map +1 -1
  166. package/dist/runtimes/adapters/thread-history/ThreadHistoryAdapter.js.map +1 -1
  167. package/dist/runtimes/composer/BaseComposerRuntimeCore.d.ts.map +1 -1
  168. package/dist/runtimes/composer/BaseComposerRuntimeCore.js +22 -2
  169. package/dist/runtimes/composer/BaseComposerRuntimeCore.js.map +1 -1
  170. package/dist/runtimes/composer/BaseComposerRuntimeCore.mjs +22 -2
  171. package/dist/runtimes/composer/BaseComposerRuntimeCore.mjs.map +1 -1
  172. package/dist/runtimes/local/useLocalRuntime.d.ts.map +1 -1
  173. package/dist/runtimes/local/useLocalRuntime.js +4 -0
  174. package/dist/runtimes/local/useLocalRuntime.js.map +1 -1
  175. package/dist/runtimes/local/useLocalRuntime.mjs +4 -0
  176. package/dist/runtimes/local/useLocalRuntime.mjs.map +1 -1
  177. package/dist/ui/thread-config.d.ts +1 -0
  178. package/dist/ui/thread-config.d.ts.map +1 -1
  179. package/dist/ui/thread-config.js.map +1 -1
  180. package/dist/ui/thread-config.mjs.map +1 -1
  181. package/dist/ui/thread.d.ts +2 -1
  182. package/dist/ui/thread.d.ts.map +1 -1
  183. package/dist/ui/thread.js +15 -2
  184. package/dist/ui/thread.js.map +1 -1
  185. package/dist/ui/thread.mjs +15 -2
  186. package/dist/ui/thread.mjs.map +1 -1
  187. package/package.json +2 -2
  188. package/src/api/AssistantRuntime.ts +7 -0
  189. package/src/api/AttachmentRuntime.ts +6 -0
  190. package/src/api/ComposerRuntime.ts +21 -0
  191. package/src/api/ContentPartRuntime.ts +6 -0
  192. package/src/api/MessageRuntime.ts +15 -0
  193. package/src/api/ThreadListItemRuntime.ts +12 -0
  194. package/src/api/ThreadListRuntime.ts +11 -0
  195. package/src/api/ThreadRuntime.ts +15 -4
  196. package/src/context/providers/AssistantRuntimeProvider.tsx +5 -17
  197. package/src/context/providers/AttachmentRuntimeProvider.tsx +6 -24
  198. package/src/context/providers/ContentPartRuntimeProvider.tsx +4 -14
  199. package/src/context/providers/MessageRuntimeProvider.tsx +5 -31
  200. package/src/context/providers/TextContentPartProvider.tsx +26 -22
  201. package/src/context/providers/ThreadListItemRuntimeProvider.tsx +3 -14
  202. package/src/context/providers/ThreadRuntimeProvider.tsx +7 -33
  203. package/src/context/react/AssistantContext.ts +7 -7
  204. package/src/context/react/AttachmentContext.ts +45 -136
  205. package/src/context/react/ComposerContext.ts +6 -29
  206. package/src/context/react/ContentPartContext.ts +3 -8
  207. package/src/context/react/MessageContext.ts +10 -13
  208. package/src/context/react/ThreadContext.ts +9 -12
  209. package/src/context/react/ThreadListItemContext.ts +4 -7
  210. package/src/context/react/index.ts +2 -0
  211. package/src/context/react/utils/createContextHook.ts +1 -3
  212. package/src/context/react/utils/createStateHookForRuntime.ts +80 -0
  213. package/src/context/react/utils/ensureBinding.ts +45 -0
  214. package/src/context/react/utils/useRuntimeState.ts +43 -0
  215. package/src/runtimes/adapters/attachment/AttachmentAdapter.ts +3 -1
  216. package/src/runtimes/adapters/attachment/CompositeAttachmentAdapter.ts +1 -1
  217. package/src/runtimes/adapters/thread-history/ThreadHistoryAdapter.ts +1 -0
  218. package/src/runtimes/composer/BaseComposerRuntimeCore.tsx +24 -2
  219. package/src/runtimes/local/useLocalRuntime.tsx +5 -0
  220. package/src/ui/thread-config.tsx +1 -0
  221. package/src/ui/thread.tsx +14 -3
@@ -1,124 +1,24 @@
1
1
  "use client";
2
2
 
3
- import { createContext, useContext } from "react";
3
+ import { createContext } from "react";
4
4
  import { ReadonlyStore } from "../ReadonlyStore";
5
- import { createContextStoreHook } from "./utils/createContextStoreHook";
6
- import {
7
- AttachmentRuntime,
8
- AttachmentState,
9
- } from "../../api/AttachmentRuntime";
5
+ import { AttachmentRuntime } from "../../api/AttachmentRuntime";
10
6
  import { UseBoundStore } from "zustand";
7
+ import { createContextHook } from "./utils/createContextHook";
8
+ import { createStateHookForRuntime } from "./utils/createStateHookForRuntime";
11
9
 
12
10
  export type AttachmentContextValue = {
13
- source: "thread-composer" | "edit-composer" | "message";
14
- useAttachment: UseBoundStore<ReadonlyStore<AttachmentState>>;
15
11
  useAttachmentRuntime: UseBoundStore<ReadonlyStore<AttachmentRuntime>>;
16
12
  };
17
13
 
18
- type ThreadComposerAttachmentContextValue = {
19
- source: "thread-composer";
20
- useAttachment: UseBoundStore<
21
- ReadonlyStore<AttachmentState & { source: "thread-composer" }>
22
- >;
23
- useAttachmentRuntime: UseBoundStore<
24
- ReadonlyStore<AttachmentRuntime & { type: "thread-composer" }>
25
- >;
26
- };
27
- type EditComposerAttachmentContextValue = {
28
- source: "edit-composer";
29
- useAttachment: UseBoundStore<
30
- ReadonlyStore<AttachmentState & { source: "edit-composer" }>
31
- >;
32
- useAttachmentRuntime: UseBoundStore<
33
- ReadonlyStore<AttachmentRuntime & { type: "edit-composer" }>
34
- >;
35
- };
36
-
37
- type MessageAttachmentContextValue = {
38
- source: "message";
39
- useAttachment: UseBoundStore<
40
- ReadonlyStore<AttachmentState & { source: "message" }>
41
- >;
42
- useAttachmentRuntime: UseBoundStore<
43
- ReadonlyStore<AttachmentRuntime & { type: "message" }>
44
- >;
45
- };
46
-
47
14
  export const AttachmentContext = createContext<AttachmentContextValue | null>(
48
15
  null,
49
16
  );
50
17
 
51
- export function useAttachmentContext(options?: {
52
- optional?: false | undefined;
53
- }): AttachmentContextValue;
54
- export function useAttachmentContext(options?: {
55
- optional?: boolean | undefined;
56
- }): AttachmentContextValue | null;
57
- export function useAttachmentContext(options?: {
58
- optional?: boolean | undefined;
59
- }) {
60
- const context = useContext(AttachmentContext);
61
- if (!options?.optional && !context)
62
- throw new Error(
63
- "This component must be used within a ComposerPrimitive.Attachments or MessagePrimitive.Attachments component.",
64
- );
65
-
66
- return context;
67
- }
68
-
69
- function useThreadComposerAttachmentContext(options?: {
70
- optional?: false | undefined;
71
- }): ThreadComposerAttachmentContextValue;
72
- function useThreadComposerAttachmentContext(options?: {
73
- optional?: boolean | undefined;
74
- }): ThreadComposerAttachmentContextValue | null;
75
- function useThreadComposerAttachmentContext(options?: {
76
- optional?: boolean | undefined;
77
- }): ThreadComposerAttachmentContextValue | null {
78
- const context = useAttachmentContext(options);
79
- if (!context) return null;
80
- if (context.source !== "thread-composer")
81
- throw new Error(
82
- "This component must be used within a thread's ComposerPrimitive.Attachments component.",
83
- );
84
- return context as ThreadComposerAttachmentContextValue;
85
- }
86
-
87
- function useEditComposerAttachmentContext(options?: {
88
- optional?: false | undefined;
89
- }): EditComposerAttachmentContextValue;
90
- function useEditComposerAttachmentContext(options?: {
91
- optional?: boolean | undefined;
92
- }): EditComposerAttachmentContextValue | null;
93
- function useEditComposerAttachmentContext(options?: {
94
- optional?: boolean | undefined;
95
- }): EditComposerAttachmentContextValue | null {
96
- const context = useAttachmentContext(options);
97
- if (!context) return null;
98
- if (context.source !== "edit-composer")
99
- throw new Error(
100
- "This component must be used within a messages's ComposerPrimitive.Attachments component.",
101
- );
102
- return context as EditComposerAttachmentContextValue;
103
- }
104
-
105
- function useMessageAttachmentContext(options?: {
106
- optional?: false | undefined;
107
- }): MessageAttachmentContextValue;
108
- function useMessageAttachmentContext(options?: {
109
- optional?: boolean | undefined;
110
- }): MessageAttachmentContextValue | null;
111
- function useMessageAttachmentContext(options?: {
112
- optional?: boolean | undefined;
113
- }): MessageAttachmentContextValue | null {
114
- const context = useAttachmentContext(options);
115
- if (!context) return null;
116
- if (context.source !== "message")
117
- throw new Error(
118
- "This component must be used within a MessagePrimitive.Attachments component.",
119
- );
120
- return context as MessageAttachmentContextValue;
121
- }
18
+ const useAttachmentContext = createContextHook(
19
+ AttachmentContext,
20
+ "a ComposerPrimitive.Attachments or MessagePrimitive.Attachments component",
21
+ );
122
22
 
123
23
  export function useAttachmentRuntime(options?: {
124
24
  optional?: false | undefined;
@@ -136,58 +36,67 @@ export function useAttachmentRuntime(options?: {
136
36
 
137
37
  export function useThreadComposerAttachmentRuntime(options?: {
138
38
  optional?: false | undefined;
139
- }): AttachmentRuntime;
39
+ }): AttachmentRuntime<"thread-composer">;
140
40
  export function useThreadComposerAttachmentRuntime(options?: {
141
41
  optional?: boolean | undefined;
142
- }): AttachmentRuntime | null;
42
+ }): AttachmentRuntime<"thread-composer"> | null;
143
43
  export function useThreadComposerAttachmentRuntime(options?: {
144
44
  optional?: boolean | undefined;
145
- }): AttachmentRuntime | null {
146
- const attachmentRuntime = useThreadComposerAttachmentContext(options);
45
+ }): AttachmentRuntime<"thread-composer"> | null {
46
+ const attachmentRuntime = useAttachmentRuntime(options);
147
47
  if (!attachmentRuntime) return null;
148
- return attachmentRuntime.useAttachmentRuntime();
48
+ if (attachmentRuntime.source !== "thread-composer")
49
+ throw new Error(
50
+ "This component must be used within a thread's ComposerPrimitive.Attachments component.",
51
+ );
52
+ return attachmentRuntime as AttachmentRuntime<"thread-composer">;
149
53
  }
150
54
 
151
55
  export function useEditComposerAttachmentRuntime(options?: {
152
56
  optional?: false | undefined;
153
- }): AttachmentRuntime;
57
+ }): AttachmentRuntime<"edit-composer">;
154
58
  export function useEditComposerAttachmentRuntime(options?: {
155
59
  optional?: boolean | undefined;
156
- }): AttachmentRuntime | null;
60
+ }): AttachmentRuntime<"edit-composer"> | null;
157
61
  export function useEditComposerAttachmentRuntime(options?: {
158
62
  optional?: boolean | undefined;
159
- }): AttachmentRuntime | null {
160
- const attachmentRuntime = useEditComposerAttachmentContext(options);
63
+ }): AttachmentRuntime<"edit-composer"> | null {
64
+ const attachmentRuntime = useAttachmentRuntime(options);
161
65
  if (!attachmentRuntime) return null;
162
- return attachmentRuntime.useAttachmentRuntime();
66
+ if (attachmentRuntime.source !== "edit-composer")
67
+ throw new Error(
68
+ "This component must be used within a message's ComposerPrimitive.Attachments component.",
69
+ );
70
+
71
+ return attachmentRuntime as AttachmentRuntime<"edit-composer">;
163
72
  }
164
73
 
165
74
  export function useMessageAttachmentRuntime(options?: {
166
75
  optional?: false | undefined;
167
- }): AttachmentRuntime;
76
+ }): AttachmentRuntime<"message">;
168
77
  export function useMessageAttachmentRuntime(options?: {
169
78
  optional?: boolean | undefined;
170
- }): AttachmentRuntime | null;
79
+ }): AttachmentRuntime<"message"> | null;
171
80
  export function useMessageAttachmentRuntime(options?: {
172
81
  optional?: boolean | undefined;
173
- }): AttachmentRuntime | null {
174
- const attachmentRuntime = useMessageAttachmentContext(options);
82
+ }): AttachmentRuntime<"message"> | null {
83
+ const attachmentRuntime = useAttachmentRuntime(options);
175
84
  if (!attachmentRuntime) return null;
176
- return attachmentRuntime.useAttachmentRuntime();
85
+ if (attachmentRuntime.source !== "message")
86
+ throw new Error(
87
+ "This component must be used within a MessagePrimitive.Attachments component.",
88
+ );
89
+ return attachmentRuntime as AttachmentRuntime<"message">;
177
90
  }
178
91
 
179
- export const { useAttachment } = createContextStoreHook(
180
- useAttachmentContext,
181
- "useAttachment",
182
- );
183
-
184
- export const { useAttachment: useThreadComposerAttachment } =
185
- createContextStoreHook(useThreadComposerAttachmentContext, "useAttachment");
92
+ export const useAttachment = createStateHookForRuntime(useAttachmentRuntime);
186
93
 
187
- export const { useAttachment: useEditComposerAttachment } =
188
- createContextStoreHook(useEditComposerAttachmentContext, "useAttachment");
189
-
190
- export const { useAttachment: useMessageAttachment } = createContextStoreHook(
191
- useMessageAttachmentContext,
192
- "useAttachment",
94
+ export const useThreadComposerAttachment = createStateHookForRuntime(
95
+ useThreadComposerAttachmentRuntime,
96
+ );
97
+ export const useEditComposerAttachment = createStateHookForRuntime(
98
+ useEditComposerAttachmentRuntime,
99
+ );
100
+ export const useMessageAttachment = createStateHookForRuntime(
101
+ useMessageAttachmentRuntime,
193
102
  );
@@ -1,34 +1,9 @@
1
1
  "use client";
2
2
 
3
- import { useMemo } from "react";
4
- import { useMessageContext, useMessageRuntime } from "./MessageContext";
5
- import { useThreadContext, useThreadRuntime } from "./ThreadContext";
6
- import { ReadonlyStore } from "../ReadonlyStore";
7
- import { createContextStoreHook } from "./utils/createContextStoreHook";
8
- import { ComposerRuntime, ComposerState } from "../../api/ComposerRuntime";
9
- import { UseBoundStore } from "zustand";
10
-
11
- export type ComposerContextValue = {
12
- useComposer: UseBoundStore<ReadonlyStore<ComposerState>>;
13
- type: "edit" | "new";
14
- };
15
-
16
- export const useComposerContext = (): ComposerContextValue => {
17
- const { useComposer: useThreadComposer } = useThreadContext();
18
- const { useEditComposer } = useMessageContext({ optional: true }) ?? {};
19
- return useMemo(
20
- () => ({
21
- useComposer: useEditComposer ?? useThreadComposer,
22
- type: useEditComposer ? ("edit" as const) : ("new" as const),
23
- }),
24
- [useEditComposer, useThreadComposer],
25
- );
26
- };
27
-
28
- export const { useComposer } = createContextStoreHook(
29
- useComposerContext,
30
- "useComposer",
31
- );
3
+ import { useMessageRuntime } from "./MessageContext";
4
+ import { useThreadRuntime } from "./ThreadContext";
5
+ import { ComposerRuntime } from "../../api/ComposerRuntime";
6
+ import { createStateHookForRuntime } from "./utils/createStateHookForRuntime";
32
7
 
33
8
  export function useComposerRuntime(options?: {
34
9
  optional?: false | undefined;
@@ -45,3 +20,5 @@ export function useComposerRuntime(options?: {
45
20
  ? messageRuntime.composer
46
21
  : (threadRuntime?.composer ?? null);
47
22
  }
23
+
24
+ export const useComposer = createStateHookForRuntime(useComposerRuntime);
@@ -2,22 +2,20 @@
2
2
 
3
3
  import { createContext } from "react";
4
4
  import { ReadonlyStore } from "../ReadonlyStore";
5
- import { createContextStoreHook } from "./utils/createContextStoreHook";
6
5
  import { createContextHook } from "./utils/createContextHook";
7
6
  import { UseBoundStore } from "zustand";
8
7
  import { ContentPartRuntime } from "../../api/ContentPartRuntime";
9
- import { ContentPartState } from "../../api/ContentPartRuntime";
8
+ import { createStateHookForRuntime } from "./utils/createStateHookForRuntime";
10
9
 
11
10
  export type ContentPartContextValue = {
12
11
  useContentPartRuntime: UseBoundStore<ReadonlyStore<ContentPartRuntime>>;
13
- useContentPart: UseBoundStore<ReadonlyStore<ContentPartState>>;
14
12
  };
15
13
 
16
14
  export const ContentPartContext = createContext<ContentPartContextValue | null>(
17
15
  null,
18
16
  );
19
17
 
20
- export const useContentPartContext = createContextHook(
18
+ const useContentPartContext = createContextHook(
21
19
  ContentPartContext,
22
20
  "a component passed to <MessagePrimitive.Content components={...}>",
23
21
  );
@@ -36,7 +34,4 @@ export function useContentPartRuntime(options?: {
36
34
  return context.useContentPartRuntime();
37
35
  }
38
36
 
39
- export const { useContentPart } = createContextStoreHook(
40
- useContentPartContext,
41
- "useContentPart",
42
- );
37
+ export const useContentPart = createStateHookForRuntime(useContentPartRuntime);
@@ -7,19 +7,17 @@ import { createContextHook } from "./utils/createContextHook";
7
7
  import { createContextStoreHook } from "./utils/createContextStoreHook";
8
8
  import { UseBoundStore } from "zustand";
9
9
  import { MessageRuntime } from "../../api/MessageRuntime";
10
- import { MessageState } from "../../api/MessageRuntime";
11
- import { EditComposerState } from "../../api/ComposerRuntime";
10
+ import { createStateHookForRuntime } from "./utils/createStateHookForRuntime";
11
+ import { EditComposerRuntime } from "../../api";
12
12
 
13
13
  export type MessageContextValue = {
14
14
  useMessageRuntime: UseBoundStore<ReadonlyStore<MessageRuntime>>;
15
- useMessage: UseBoundStore<ReadonlyStore<MessageState>>;
16
15
  useMessageUtils: UseBoundStore<ReadonlyStore<MessageUtilsState>>;
17
- useEditComposer: UseBoundStore<ReadonlyStore<EditComposerState>>;
18
16
  };
19
17
 
20
18
  export const MessageContext = createContext<MessageContextValue | null>(null);
21
19
 
22
- export const useMessageContext = createContextHook(
20
+ const useMessageContext = createContextHook(
23
21
  MessageContext,
24
22
  "a component passed to <ThreadPrimitive.Messages components={...} />",
25
23
  );
@@ -38,17 +36,16 @@ export function useMessageRuntime(options?: {
38
36
  return context.useMessageRuntime();
39
37
  }
40
38
 
41
- export const { useMessage } = createContextStoreHook(
42
- useMessageContext,
43
- "useMessage",
39
+ export const useMessage = createStateHookForRuntime(useMessageRuntime);
40
+
41
+ const useEditComposerRuntime = (opt: {
42
+ optional: boolean | undefined;
43
+ }): EditComposerRuntime | null => useMessageRuntime(opt)?.composer ?? null;
44
+ export const useEditComposer = createStateHookForRuntime(
45
+ useEditComposerRuntime,
44
46
  );
45
47
 
46
48
  export const { useMessageUtils, useMessageUtilsStore } = createContextStoreHook(
47
49
  useMessageContext,
48
50
  "useMessageUtils",
49
51
  );
50
-
51
- export const { useEditComposer } = createContextStoreHook(
52
- useMessageContext,
53
- "useEditComposer",
54
- );
@@ -7,20 +7,18 @@ import { UseBoundStore } from "zustand";
7
7
  import { createContextHook } from "./utils/createContextHook";
8
8
  import { createContextStoreHook } from "./utils/createContextStoreHook";
9
9
  import { ThreadRuntime } from "../../api/ThreadRuntime";
10
- import { ThreadState } from "../../api/ThreadRuntime";
11
10
  import { ModelConfig } from "../../types";
12
- import { ThreadComposerState } from "../../api/ComposerRuntime";
11
+ import { createStateHookForRuntime } from "./utils/createStateHookForRuntime";
12
+ import { ThreadComposerRuntime } from "../../api";
13
13
 
14
14
  export type ThreadContextValue = {
15
- useThread: UseBoundStore<ReadonlyStore<ThreadState>>;
16
15
  useThreadRuntime: UseBoundStore<ReadonlyStore<ThreadRuntime>>;
17
- useComposer: UseBoundStore<ReadonlyStore<ThreadComposerState>>;
18
16
  useViewport: UseBoundStore<ReadonlyStore<ThreadViewportState>>;
19
17
  };
20
18
 
21
19
  export const ThreadContext = createContext<ThreadContextValue | null>(null);
22
20
 
23
- export const useThreadContext = createContextHook(
21
+ const useThreadContext = createContextHook(
24
22
  ThreadContext,
25
23
  "AssistantRuntimeProvider",
26
24
  );
@@ -37,14 +35,13 @@ export function useThreadRuntime(options?: { optional?: boolean | undefined }) {
37
35
  return context.useThreadRuntime();
38
36
  }
39
37
 
40
- export const { useThread } = createContextStoreHook(
41
- useThreadContext,
42
- "useThread",
43
- );
38
+ export const useThread = createStateHookForRuntime(useThreadRuntime);
44
39
 
45
- export const { useComposer: useThreadComposer } = createContextStoreHook(
46
- useThreadContext,
47
- "useComposer",
40
+ const useThreadComposerRuntime = (opt: {
41
+ optional: boolean | undefined;
42
+ }): ThreadComposerRuntime | null => useThreadRuntime(opt)?.composer ?? null;
43
+ export const useThreadComposer = createStateHookForRuntime(
44
+ useThreadComposerRuntime,
48
45
  );
49
46
 
50
47
  export const {
@@ -2,21 +2,19 @@
2
2
 
3
3
  import { createContext } from "react";
4
4
  import { ReadonlyStore } from "../ReadonlyStore";
5
- import { createContextStoreHook } from "./utils/createContextStoreHook";
6
5
  import { createContextHook } from "./utils/createContextHook";
7
6
  import { UseBoundStore } from "zustand";
8
7
  import { ThreadListItemRuntime } from "../../api/ThreadListItemRuntime";
9
- import { ThreadListItemState } from "../../api/ThreadListItemRuntime";
8
+ import { createStateHookForRuntime } from "./utils/createStateHookForRuntime";
10
9
 
11
10
  export type ThreadListItemContextValue = {
12
11
  useThreadListItemRuntime: UseBoundStore<ReadonlyStore<ThreadListItemRuntime>>;
13
- useThreadListItem: UseBoundStore<ReadonlyStore<ThreadListItemState>>;
14
12
  };
15
13
 
16
14
  export const ThreadListItemContext =
17
15
  createContext<ThreadListItemContextValue | null>(null);
18
16
 
19
- export const useThreadListItemContext = createContextHook(
17
+ const useThreadListItemContext = createContextHook(
20
18
  ThreadListItemContext,
21
19
  "a component passed to <ThreadListPrimitive.Items components={...}>",
22
20
  );
@@ -35,7 +33,6 @@ export function useThreadListItemRuntime(options?: {
35
33
  return context.useThreadListItemRuntime();
36
34
  }
37
35
 
38
- export const { useThreadListItem } = createContextStoreHook(
39
- useThreadListItemContext,
40
- "useThreadListItem",
36
+ export const useThreadListItem = createStateHookForRuntime(
37
+ useThreadListItemRuntime,
41
38
  );
@@ -45,3 +45,5 @@ export {
45
45
  // useThreadComposerAttachment,
46
46
  // useThreadComposerAttachmentRuntime,
47
47
  } from "./AttachmentContext";
48
+
49
+ export { useRuntimeState } from "./utils/useRuntimeState";
@@ -12,11 +12,9 @@ export function createContextHook<T>(
12
12
  context: Context<T | null>,
13
13
  providerName: string,
14
14
  ) {
15
- function useContextHook(options?: { optional?: false | undefined }): T;
16
15
  function useContextHook(options?: {
17
16
  optional?: boolean | undefined;
18
- }): T | null;
19
- function useContextHook(options?: { optional?: boolean | undefined }) {
17
+ }): T | null {
20
18
  const contextValue = useContext(context);
21
19
  if (!options?.optional && !contextValue) {
22
20
  throw new Error(`This component must be used within ${providerName}.`);
@@ -0,0 +1,80 @@
1
+ import {
2
+ SubscribableRuntime,
3
+ useRuntimeStateInternal,
4
+ } from "./useRuntimeState";
5
+
6
+ export function createStateHookForRuntime<TState>(
7
+ useRuntime: (options: {
8
+ optional: boolean | undefined;
9
+ }) => SubscribableRuntime<TState> | null,
10
+ ) {
11
+ // empty
12
+ function useStoreHook(): TState;
13
+
14
+ // selector
15
+ function useStoreHook<TSelected>(
16
+ selector: (state: TState) => TSelected,
17
+ ): TSelected;
18
+
19
+ // selector?
20
+ function useStoreHook<TSelected>(
21
+ selector: ((state: TState) => TSelected) | undefined,
22
+ ): TSelected | TState;
23
+
24
+ // optional=false
25
+ function useStoreHook(options: { optional?: false | undefined }): TState;
26
+
27
+ // optional?
28
+ function useStoreHook(options: {
29
+ optional?: boolean | undefined;
30
+ }): TState | null;
31
+
32
+ // optional=false, selector
33
+ function useStoreHook<TSelected>(options: {
34
+ optional?: false | undefined;
35
+ selector: (state: TState) => TSelected;
36
+ }): TSelected;
37
+
38
+ // optional=false, selector?
39
+ function useStoreHook<TSelected>(options: {
40
+ optional?: false | undefined;
41
+ selector: ((state: TState) => TSelected) | undefined;
42
+ }): TSelected | TState;
43
+
44
+ // optional?, selector
45
+ function useStoreHook<TSelected>(options: {
46
+ optional?: boolean | undefined;
47
+ selector: (state: TState) => TSelected;
48
+ }): TSelected | null;
49
+
50
+ // optional?, selector?
51
+ function useStoreHook<TSelected>(options: {
52
+ optional?: boolean | undefined;
53
+ selector: ((state: TState) => TSelected) | undefined;
54
+ }): TSelected | TState | null;
55
+
56
+ function useStoreHook<TSelected>(
57
+ param?:
58
+ | ((state: TState) => TSelected)
59
+ | {
60
+ optional?: boolean | undefined;
61
+ selector?: ((state: TState) => TSelected) | undefined;
62
+ },
63
+ ): TSelected | TState | null {
64
+ let optional = false;
65
+ let selector: ((state: TState) => TSelected) | undefined;
66
+
67
+ if (typeof param === "function") {
68
+ selector = param;
69
+ } else if (param) {
70
+ optional = !!param.optional;
71
+ selector = param.selector;
72
+ }
73
+
74
+ const store = useRuntime({ optional });
75
+ if (!store) return null;
76
+ return useRuntimeStateInternal(store, selector);
77
+ }
78
+
79
+ return useStoreHook;
80
+ }
@@ -0,0 +1,45 @@
1
+ type Bindable = {
2
+ __internal_bindMethods?: () => void;
3
+ __isBound?: boolean;
4
+ };
5
+ const debugVerifyPrototype = (
6
+ runtime: Record<string, unknown>,
7
+ prototype: any,
8
+ ) => {
9
+ const unboundMethods = Object.getOwnPropertyNames(prototype).filter(
10
+ (methodStr) => {
11
+ const descriptor = Object.getOwnPropertyDescriptor(prototype, methodStr);
12
+ const isMethod = descriptor && typeof descriptor.value === "function";
13
+ if (!isMethod) return false;
14
+
15
+ const methodName = methodStr as keyof typeof runtime | "constructor";
16
+ return (
17
+ isMethod &&
18
+ !methodName.startsWith("_") &&
19
+ methodName !== "constructor" &&
20
+ prototype[methodName] === runtime[methodName]
21
+ );
22
+ },
23
+ );
24
+
25
+ if (unboundMethods.length > 0) {
26
+ throw new Error(
27
+ "The following methods are not bound: " + JSON.stringify(unboundMethods),
28
+ );
29
+ }
30
+
31
+ const prototypePrototype = Object.getPrototypeOf(prototype);
32
+ if (prototypePrototype && prototypePrototype !== Object.prototype) {
33
+ debugVerifyPrototype(runtime, prototypePrototype);
34
+ }
35
+ };
36
+ export const ensureBinding = (r: unknown) => {
37
+ const runtime = r as Bindable;
38
+ if (runtime.__isBound) return;
39
+
40
+ runtime.__internal_bindMethods?.();
41
+ runtime.__isBound = true;
42
+
43
+ // @ts-ignore - strip this out in production build
44
+ DEV: debugVerifyPrototype(runtime, Object.getPrototypeOf(runtime));
45
+ };
@@ -0,0 +1,43 @@
1
+ import { useDebugValue, useSyncExternalStore } from "react";
2
+ import { Unsubscribe } from "../../../types";
3
+ import { ensureBinding } from "./ensureBinding";
4
+
5
+ export type SubscribableRuntime<TState> = {
6
+ getState: () => TState;
7
+ subscribe: (callback: () => void) => Unsubscribe;
8
+ };
9
+
10
+ export function useRuntimeStateInternal<TState, TSelected>(
11
+ runtime: SubscribableRuntime<TState>,
12
+ selector: ((state: TState) => TSelected) | undefined = identity as any,
13
+ ): TSelected | TState {
14
+ const slice = useSyncExternalStore(
15
+ runtime.subscribe,
16
+ () => selector(runtime.getState()),
17
+ () => selector(runtime.getState()),
18
+ );
19
+ useDebugValue(slice);
20
+ return slice;
21
+ }
22
+
23
+ const identity = <T>(arg: T): T => arg;
24
+ export function useRuntimeState<TState>(
25
+ runtime: SubscribableRuntime<TState>,
26
+ ): TState;
27
+ export function useRuntimeState<TState, TSelected>(
28
+ runtime: SubscribableRuntime<TState>,
29
+ selector: (state: TState) => TSelected,
30
+ ): TSelected;
31
+ export function useRuntimeState<TState, TSelected>(
32
+ runtime: SubscribableRuntime<TState>,
33
+ selector: ((state: TState) => TSelected) | undefined,
34
+ ): TSelected | TState;
35
+ export function useRuntimeState<TState, TSelected>(
36
+ runtime: SubscribableRuntime<TState>,
37
+ selector?: ((state: TState) => TSelected) | undefined,
38
+ ): TSelected | TState {
39
+ // ensure that the runtime is bound
40
+ ensureBinding(runtime);
41
+
42
+ return useRuntimeStateInternal(runtime, selector);
43
+ }
@@ -7,7 +7,9 @@ import {
7
7
  export type AttachmentAdapter = {
8
8
  accept: string;
9
9
 
10
- add(state: { file: File }): Promise<PendingAttachment>;
10
+ add(state: {
11
+ file: File;
12
+ }): Promise<PendingAttachment> | AsyncGenerator<PendingAttachment, void>;
11
13
  remove(attachment: Attachment): Promise<void>;
12
14
  send(attachment: PendingAttachment): Promise<CompleteAttachment>;
13
15
  };
@@ -65,7 +65,7 @@ export class CompositeAttachmentAdapter implements AttachmentAdapter {
65
65
  }
66
66
  }
67
67
 
68
- public async add(state: { file: File }) {
68
+ public add(state: { file: File }) {
69
69
  for (const adapter of this._adapters) {
70
70
  if (fileMatchesAccept(state.file, adapter.accept)) {
71
71
  return adapter.add(state);
@@ -3,6 +3,7 @@ import {
3
3
  ExportedMessageRepositoryItem,
4
4
  } from "../../utils/MessageRepository";
5
5
 
6
+ // TODO external store - which version to save? how to restore?
6
7
  export type ThreadHistoryAdapter = {
7
8
  load(): Promise<ExportedMessageRepository>;
8
9
  append(item: ExportedMessageRepositoryItem): Promise<void>;