@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.
- package/dist/api/AssistantRuntime.d.ts +1 -0
- package/dist/api/AssistantRuntime.d.ts.map +1 -1
- package/dist/api/AssistantRuntime.js +5 -0
- package/dist/api/AssistantRuntime.js.map +1 -1
- package/dist/api/AssistantRuntime.mjs +5 -0
- package/dist/api/AssistantRuntime.mjs.map +1 -1
- package/dist/api/AttachmentRuntime.d.ts +1 -0
- package/dist/api/AttachmentRuntime.d.ts.map +1 -1
- package/dist/api/AttachmentRuntime.js +5 -0
- package/dist/api/AttachmentRuntime.js.map +1 -1
- package/dist/api/AttachmentRuntime.mjs +5 -0
- package/dist/api/AttachmentRuntime.mjs.map +1 -1
- package/dist/api/ComposerRuntime.d.ts +2 -0
- package/dist/api/ComposerRuntime.d.ts.map +1 -1
- package/dist/api/ComposerRuntime.js +19 -0
- package/dist/api/ComposerRuntime.js.map +1 -1
- package/dist/api/ComposerRuntime.mjs +19 -0
- package/dist/api/ComposerRuntime.mjs.map +1 -1
- package/dist/api/ContentPartRuntime.d.ts +1 -0
- package/dist/api/ContentPartRuntime.d.ts.map +1 -1
- package/dist/api/ContentPartRuntime.js +5 -0
- package/dist/api/ContentPartRuntime.js.map +1 -1
- package/dist/api/ContentPartRuntime.mjs +5 -0
- package/dist/api/ContentPartRuntime.mjs.map +1 -1
- package/dist/api/MessageRuntime.d.ts +1 -0
- package/dist/api/MessageRuntime.d.ts.map +1 -1
- package/dist/api/MessageRuntime.js +13 -0
- package/dist/api/MessageRuntime.js.map +1 -1
- package/dist/api/MessageRuntime.mjs +13 -0
- package/dist/api/MessageRuntime.mjs.map +1 -1
- package/dist/api/ThreadListItemRuntime.d.ts +1 -0
- package/dist/api/ThreadListItemRuntime.d.ts.map +1 -1
- package/dist/api/ThreadListItemRuntime.js +11 -0
- package/dist/api/ThreadListItemRuntime.js.map +1 -1
- package/dist/api/ThreadListItemRuntime.mjs +11 -0
- package/dist/api/ThreadListItemRuntime.mjs.map +1 -1
- package/dist/api/ThreadListRuntime.d.ts +1 -0
- package/dist/api/ThreadListRuntime.d.ts.map +1 -1
- package/dist/api/ThreadListRuntime.js +10 -0
- package/dist/api/ThreadListRuntime.js.map +1 -1
- package/dist/api/ThreadListRuntime.mjs +10 -0
- package/dist/api/ThreadListRuntime.mjs.map +1 -1
- package/dist/api/ThreadRuntime.d.ts +1 -1
- package/dist/api/ThreadRuntime.d.ts.map +1 -1
- package/dist/api/ThreadRuntime.js +14 -3
- package/dist/api/ThreadRuntime.js.map +1 -1
- package/dist/api/ThreadRuntime.mjs +14 -3
- package/dist/api/ThreadRuntime.mjs.map +1 -1
- package/dist/context/providers/AssistantRuntimeProvider.d.ts.map +1 -1
- package/dist/context/providers/AssistantRuntimeProvider.js +5 -14
- package/dist/context/providers/AssistantRuntimeProvider.js.map +1 -1
- package/dist/context/providers/AssistantRuntimeProvider.mjs +5 -14
- package/dist/context/providers/AssistantRuntimeProvider.mjs.map +1 -1
- package/dist/context/providers/AttachmentRuntimeProvider.d.ts.map +1 -1
- package/dist/context/providers/AttachmentRuntimeProvider.js +5 -16
- package/dist/context/providers/AttachmentRuntimeProvider.js.map +1 -1
- package/dist/context/providers/AttachmentRuntimeProvider.mjs +6 -21
- package/dist/context/providers/AttachmentRuntimeProvider.mjs.map +1 -1
- package/dist/context/providers/ContentPartRuntimeProvider.d.ts +0 -1
- package/dist/context/providers/ContentPartRuntimeProvider.d.ts.map +1 -1
- package/dist/context/providers/ContentPartRuntimeProvider.js +5 -15
- package/dist/context/providers/ContentPartRuntimeProvider.js.map +1 -1
- package/dist/context/providers/ContentPartRuntimeProvider.mjs +4 -13
- package/dist/context/providers/ContentPartRuntimeProvider.mjs.map +1 -1
- package/dist/context/providers/MessageRuntimeProvider.d.ts.map +1 -1
- package/dist/context/providers/MessageRuntimeProvider.js +3 -22
- package/dist/context/providers/MessageRuntimeProvider.js.map +1 -1
- package/dist/context/providers/MessageRuntimeProvider.mjs +3 -22
- package/dist/context/providers/MessageRuntimeProvider.mjs.map +1 -1
- package/dist/context/providers/TextContentPartProvider.d.ts.map +1 -1
- package/dist/context/providers/TextContentPartProvider.js +13 -12
- package/dist/context/providers/TextContentPartProvider.js.map +1 -1
- package/dist/context/providers/TextContentPartProvider.mjs +13 -12
- package/dist/context/providers/TextContentPartProvider.mjs.map +1 -1
- package/dist/context/providers/ThreadListItemRuntimeProvider.d.ts +0 -1
- package/dist/context/providers/ThreadListItemRuntimeProvider.d.ts.map +1 -1
- package/dist/context/providers/ThreadListItemRuntimeProvider.js +5 -15
- package/dist/context/providers/ThreadListItemRuntimeProvider.js.map +1 -1
- package/dist/context/providers/ThreadListItemRuntimeProvider.mjs +4 -13
- package/dist/context/providers/ThreadListItemRuntimeProvider.mjs.map +1 -1
- package/dist/context/providers/ThreadRuntimeProvider.d.ts.map +1 -1
- package/dist/context/providers/ThreadRuntimeProvider.js +5 -24
- package/dist/context/providers/ThreadRuntimeProvider.js.map +1 -1
- package/dist/context/providers/ThreadRuntimeProvider.mjs +6 -25
- package/dist/context/providers/ThreadRuntimeProvider.mjs.map +1 -1
- package/dist/context/react/AssistantContext.d.ts +26 -17
- package/dist/context/react/AssistantContext.d.ts.map +1 -1
- package/dist/context/react/AssistantContext.js +3 -4
- package/dist/context/react/AssistantContext.js.map +1 -1
- package/dist/context/react/AssistantContext.mjs +3 -4
- package/dist/context/react/AssistantContext.mjs.map +1 -1
- package/dist/context/react/AttachmentContext.d.ts +558 -30
- package/dist/context/react/AttachmentContext.d.ts.map +1 -1
- package/dist/context/react/AttachmentContext.js +32 -52
- package/dist/context/react/AttachmentContext.js.map +1 -1
- package/dist/context/react/AttachmentContext.mjs +33 -52
- package/dist/context/react/AttachmentContext.mjs.map +1 -1
- package/dist/context/react/ComposerContext.d.ts +28 -19
- package/dist/context/react/ComposerContext.d.ts.map +1 -1
- package/dist/context/react/ComposerContext.js +2 -19
- package/dist/context/react/ComposerContext.js.map +1 -1
- package/dist/context/react/ComposerContext.mjs +4 -20
- package/dist/context/react/ComposerContext.mjs.map +1 -1
- package/dist/context/react/ContentPartContext.d.ts +22 -16
- package/dist/context/react/ContentPartContext.d.ts.map +1 -1
- package/dist/context/react/ContentPartContext.js +2 -7
- package/dist/context/react/ContentPartContext.js.map +1 -1
- package/dist/context/react/ContentPartContext.mjs +2 -6
- package/dist/context/react/ContentPartContext.mjs.map +1 -1
- package/dist/context/react/MessageContext.d.ts +49 -29
- package/dist/context/react/MessageContext.d.ts.map +1 -1
- package/dist/context/react/MessageContext.js +5 -9
- package/dist/context/react/MessageContext.js.map +1 -1
- package/dist/context/react/MessageContext.mjs +5 -8
- package/dist/context/react/MessageContext.mjs.map +1 -1
- package/dist/context/react/ThreadContext.d.ts +44 -24
- package/dist/context/react/ThreadContext.d.ts.map +1 -1
- package/dist/context/react/ThreadContext.js +5 -9
- package/dist/context/react/ThreadContext.js.map +1 -1
- package/dist/context/react/ThreadContext.mjs +5 -8
- package/dist/context/react/ThreadContext.mjs.map +1 -1
- package/dist/context/react/ThreadListItemContext.d.ts +22 -16
- package/dist/context/react/ThreadListItemContext.d.ts.map +1 -1
- package/dist/context/react/ThreadListItemContext.js +3 -6
- package/dist/context/react/ThreadListItemContext.js.map +1 -1
- package/dist/context/react/ThreadListItemContext.mjs +3 -5
- package/dist/context/react/ThreadListItemContext.mjs.map +1 -1
- package/dist/context/react/index.d.ts +1 -0
- package/dist/context/react/index.d.ts.map +1 -1
- package/dist/context/react/index.js +3 -0
- package/dist/context/react/index.js.map +1 -1
- package/dist/context/react/index.mjs +2 -0
- package/dist/context/react/index.mjs.map +1 -1
- package/dist/context/react/utils/createContextHook.d.ts +3 -8
- package/dist/context/react/utils/createContextHook.d.ts.map +1 -1
- package/dist/context/react/utils/createContextHook.js.map +1 -1
- package/dist/context/react/utils/createContextHook.mjs.map +1 -1
- package/dist/context/react/utils/createStateHookForRuntime.d.ts +31 -0
- package/dist/context/react/utils/createStateHookForRuntime.d.ts.map +1 -0
- package/dist/context/react/utils/createStateHookForRuntime.js +47 -0
- package/dist/context/react/utils/createStateHookForRuntime.js.map +1 -0
- package/dist/context/react/utils/createStateHookForRuntime.mjs +24 -0
- package/dist/context/react/utils/createStateHookForRuntime.mjs.map +1 -0
- package/dist/context/react/utils/ensureBinding.d.ts +2 -0
- package/dist/context/react/utils/ensureBinding.d.ts.map +1 -0
- package/dist/context/react/utils/ensureBinding.js +36 -0
- package/dist/context/react/utils/ensureBinding.js.map +1 -0
- package/dist/context/react/utils/ensureBinding.mjs +11 -0
- package/dist/context/react/utils/ensureBinding.mjs.map +1 -0
- package/dist/context/react/utils/useRuntimeState.d.ts +10 -0
- package/dist/context/react/utils/useRuntimeState.d.ts.map +1 -0
- package/dist/context/react/utils/useRuntimeState.js +48 -0
- package/dist/context/react/utils/useRuntimeState.js.map +1 -0
- package/dist/context/react/utils/useRuntimeState.mjs +22 -0
- package/dist/context/react/utils/useRuntimeState.mjs.map +1 -0
- package/dist/runtimes/adapters/attachment/AttachmentAdapter.d.ts +1 -1
- package/dist/runtimes/adapters/attachment/AttachmentAdapter.d.ts.map +1 -1
- package/dist/runtimes/adapters/attachment/AttachmentAdapter.js.map +1 -1
- package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.d.ts +1 -1
- package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.d.ts.map +1 -1
- package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.js +1 -1
- package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.js.map +1 -1
- package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.mjs +1 -1
- package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.mjs.map +1 -1
- package/dist/runtimes/adapters/thread-history/ThreadHistoryAdapter.d.ts.map +1 -1
- package/dist/runtimes/adapters/thread-history/ThreadHistoryAdapter.js.map +1 -1
- package/dist/runtimes/composer/BaseComposerRuntimeCore.d.ts.map +1 -1
- package/dist/runtimes/composer/BaseComposerRuntimeCore.js +22 -2
- package/dist/runtimes/composer/BaseComposerRuntimeCore.js.map +1 -1
- package/dist/runtimes/composer/BaseComposerRuntimeCore.mjs +22 -2
- package/dist/runtimes/composer/BaseComposerRuntimeCore.mjs.map +1 -1
- package/dist/runtimes/local/useLocalRuntime.d.ts.map +1 -1
- package/dist/runtimes/local/useLocalRuntime.js +4 -0
- package/dist/runtimes/local/useLocalRuntime.js.map +1 -1
- package/dist/runtimes/local/useLocalRuntime.mjs +4 -0
- package/dist/runtimes/local/useLocalRuntime.mjs.map +1 -1
- package/dist/ui/thread-config.d.ts +1 -0
- package/dist/ui/thread-config.d.ts.map +1 -1
- package/dist/ui/thread-config.js.map +1 -1
- package/dist/ui/thread-config.mjs.map +1 -1
- package/dist/ui/thread.d.ts +2 -1
- package/dist/ui/thread.d.ts.map +1 -1
- package/dist/ui/thread.js +15 -2
- package/dist/ui/thread.js.map +1 -1
- package/dist/ui/thread.mjs +15 -2
- package/dist/ui/thread.mjs.map +1 -1
- package/package.json +2 -2
- package/src/api/AssistantRuntime.ts +7 -0
- package/src/api/AttachmentRuntime.ts +6 -0
- package/src/api/ComposerRuntime.ts +21 -0
- package/src/api/ContentPartRuntime.ts +6 -0
- package/src/api/MessageRuntime.ts +15 -0
- package/src/api/ThreadListItemRuntime.ts +12 -0
- package/src/api/ThreadListRuntime.ts +11 -0
- package/src/api/ThreadRuntime.ts +15 -4
- package/src/context/providers/AssistantRuntimeProvider.tsx +5 -17
- package/src/context/providers/AttachmentRuntimeProvider.tsx +6 -24
- package/src/context/providers/ContentPartRuntimeProvider.tsx +4 -14
- package/src/context/providers/MessageRuntimeProvider.tsx +5 -31
- package/src/context/providers/TextContentPartProvider.tsx +26 -22
- package/src/context/providers/ThreadListItemRuntimeProvider.tsx +3 -14
- package/src/context/providers/ThreadRuntimeProvider.tsx +7 -33
- package/src/context/react/AssistantContext.ts +7 -7
- package/src/context/react/AttachmentContext.ts +45 -136
- package/src/context/react/ComposerContext.ts +6 -29
- package/src/context/react/ContentPartContext.ts +3 -8
- package/src/context/react/MessageContext.ts +10 -13
- package/src/context/react/ThreadContext.ts +9 -12
- package/src/context/react/ThreadListItemContext.ts +4 -7
- package/src/context/react/index.ts +2 -0
- package/src/context/react/utils/createContextHook.ts +1 -3
- package/src/context/react/utils/createStateHookForRuntime.ts +80 -0
- package/src/context/react/utils/ensureBinding.ts +45 -0
- package/src/context/react/utils/useRuntimeState.ts +43 -0
- package/src/runtimes/adapters/attachment/AttachmentAdapter.ts +3 -1
- package/src/runtimes/adapters/attachment/CompositeAttachmentAdapter.ts +1 -1
- package/src/runtimes/adapters/thread-history/ThreadHistoryAdapter.ts +1 -0
- package/src/runtimes/composer/BaseComposerRuntimeCore.tsx +24 -2
- package/src/runtimes/local/useLocalRuntime.tsx +5 -0
- package/src/ui/thread-config.tsx +1 -0
- package/src/ui/thread.tsx +14 -3
@@ -1,124 +1,24 @@
|
|
1
1
|
"use client";
|
2
2
|
|
3
|
-
import { createContext
|
3
|
+
import { createContext } from "react";
|
4
4
|
import { ReadonlyStore } from "../ReadonlyStore";
|
5
|
-
import {
|
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
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
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 =
|
45
|
+
}): AttachmentRuntime<"thread-composer"> | null {
|
46
|
+
const attachmentRuntime = useAttachmentRuntime(options);
|
147
47
|
if (!attachmentRuntime) return null;
|
148
|
-
|
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 =
|
63
|
+
}): AttachmentRuntime<"edit-composer"> | null {
|
64
|
+
const attachmentRuntime = useAttachmentRuntime(options);
|
161
65
|
if (!attachmentRuntime) return null;
|
162
|
-
|
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 =
|
82
|
+
}): AttachmentRuntime<"message"> | null {
|
83
|
+
const attachmentRuntime = useAttachmentRuntime(options);
|
175
84
|
if (!attachmentRuntime) return null;
|
176
|
-
|
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
|
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
|
188
|
-
|
189
|
-
|
190
|
-
export const
|
191
|
-
|
192
|
-
|
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 {
|
4
|
-
import {
|
5
|
-
import {
|
6
|
-
import {
|
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 {
|
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
|
-
|
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
|
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 {
|
11
|
-
import {
|
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
|
-
|
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
|
42
|
-
|
43
|
-
|
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 {
|
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
|
-
|
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
|
41
|
-
useThreadContext,
|
42
|
-
"useThread",
|
43
|
-
);
|
38
|
+
export const useThread = createStateHookForRuntime(useThreadRuntime);
|
44
39
|
|
45
|
-
|
46
|
-
|
47
|
-
|
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 {
|
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
|
-
|
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
|
39
|
-
|
40
|
-
"useThreadListItem",
|
36
|
+
export const useThreadListItem = createStateHookForRuntime(
|
37
|
+
useThreadListItemRuntime,
|
41
38
|
);
|
@@ -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: {
|
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
|
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>;
|