@assistant-ui/react 0.7.45 → 0.7.47

Sign up to get free protection for your applications and to get access to all the features.
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>;