@assistant-ui/react 0.3.0 → 0.3.1
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.
- package/dist/index.d.mts +24 -4
- package/dist/index.d.ts +24 -4
- package/dist/index.js +39 -23
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +39 -23
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
@@ -82,6 +82,12 @@ type ChatModelAdapter = {
|
|
82
82
|
|
83
83
|
declare abstract class BaseAssistantRuntime<TThreadRuntime extends ReactThreadRuntime> implements AssistantRuntime {
|
84
84
|
private _thread;
|
85
|
+
get capabilities(): Readonly<{
|
86
|
+
edit: boolean;
|
87
|
+
reload: boolean;
|
88
|
+
cancel: boolean;
|
89
|
+
copy: boolean;
|
90
|
+
}>;
|
85
91
|
constructor(_thread: TThreadRuntime);
|
86
92
|
private _unsubscribe;
|
87
93
|
get thread(): TThreadRuntime;
|
@@ -114,7 +120,13 @@ declare class LocalThreadRuntime implements ThreadRuntime {
|
|
114
120
|
adapter: ChatModelAdapter;
|
115
121
|
private _subscriptions;
|
116
122
|
private abortController;
|
117
|
-
private repository;
|
123
|
+
private readonly repository;
|
124
|
+
readonly capabilities: Readonly<{
|
125
|
+
edit: true;
|
126
|
+
reload: true;
|
127
|
+
cancel: true;
|
128
|
+
copy: true;
|
129
|
+
}>;
|
118
130
|
get messages(): ThreadMessage[];
|
119
131
|
get isRunning(): boolean;
|
120
132
|
constructor(_configProviders: Set<ModelConfigProvider>, adapter: ChatModelAdapter);
|
@@ -131,6 +143,12 @@ declare class LocalThreadRuntime implements ThreadRuntime {
|
|
131
143
|
declare const useLocalRuntime: (adapter: ChatModelAdapter) => LocalRuntime;
|
132
144
|
|
133
145
|
type ThreadActionsState = Readonly<{
|
146
|
+
capabilities: Readonly<{
|
147
|
+
edit: boolean;
|
148
|
+
reload: boolean;
|
149
|
+
cancel: boolean;
|
150
|
+
copy: boolean;
|
151
|
+
}>;
|
134
152
|
getBranches: (messageId: string) => readonly string[];
|
135
153
|
switchToBranch: (branchId: string) => void;
|
136
154
|
append: (message: AppendMessage) => void;
|
@@ -202,10 +220,11 @@ type BaseComposerState = Readonly<{
|
|
202
220
|
type ReadonlyStore<T> = UseBoundStore<Omit<StoreApi<T>, "setState" | "destroy">>;
|
203
221
|
|
204
222
|
type EditComposerState = BaseComposerState & Readonly<{
|
223
|
+
canCancel: boolean;
|
205
224
|
isEditing: boolean;
|
206
225
|
edit: () => void;
|
207
226
|
send: () => void;
|
208
|
-
cancel: () =>
|
227
|
+
cancel: () => void;
|
209
228
|
}>;
|
210
229
|
|
211
230
|
type ThreadState = Readonly<{
|
@@ -271,9 +290,10 @@ type ContentPartContextValue = {
|
|
271
290
|
declare const useContentPartContext: () => ContentPartContextValue;
|
272
291
|
|
273
292
|
type ComposerState = BaseComposerState & Readonly<{
|
293
|
+
canCancel: boolean;
|
274
294
|
isEditing: true;
|
275
295
|
send: () => void;
|
276
|
-
cancel: () =>
|
296
|
+
cancel: () => void;
|
277
297
|
focus: () => void;
|
278
298
|
onFocus: (listener: () => void) => Unsubscribe;
|
279
299
|
}>;
|
@@ -605,7 +625,7 @@ type ThreadPrimitiveMessagesProps = {
|
|
605
625
|
AssistantMessage: ComponentType;
|
606
626
|
};
|
607
627
|
};
|
608
|
-
declare const ThreadPrimitiveMessages:
|
628
|
+
declare const ThreadPrimitiveMessages: react.NamedExoticComponent<ThreadPrimitiveMessagesProps>;
|
609
629
|
|
610
630
|
type ThreadPrimitiveScrollToBottomProps = ActionButtonProps<typeof useThreadScrollToBottom>;
|
611
631
|
declare const ThreadPrimitiveScrollToBottom: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & {
|
package/dist/index.d.ts
CHANGED
@@ -82,6 +82,12 @@ type ChatModelAdapter = {
|
|
82
82
|
|
83
83
|
declare abstract class BaseAssistantRuntime<TThreadRuntime extends ReactThreadRuntime> implements AssistantRuntime {
|
84
84
|
private _thread;
|
85
|
+
get capabilities(): Readonly<{
|
86
|
+
edit: boolean;
|
87
|
+
reload: boolean;
|
88
|
+
cancel: boolean;
|
89
|
+
copy: boolean;
|
90
|
+
}>;
|
85
91
|
constructor(_thread: TThreadRuntime);
|
86
92
|
private _unsubscribe;
|
87
93
|
get thread(): TThreadRuntime;
|
@@ -114,7 +120,13 @@ declare class LocalThreadRuntime implements ThreadRuntime {
|
|
114
120
|
adapter: ChatModelAdapter;
|
115
121
|
private _subscriptions;
|
116
122
|
private abortController;
|
117
|
-
private repository;
|
123
|
+
private readonly repository;
|
124
|
+
readonly capabilities: Readonly<{
|
125
|
+
edit: true;
|
126
|
+
reload: true;
|
127
|
+
cancel: true;
|
128
|
+
copy: true;
|
129
|
+
}>;
|
118
130
|
get messages(): ThreadMessage[];
|
119
131
|
get isRunning(): boolean;
|
120
132
|
constructor(_configProviders: Set<ModelConfigProvider>, adapter: ChatModelAdapter);
|
@@ -131,6 +143,12 @@ declare class LocalThreadRuntime implements ThreadRuntime {
|
|
131
143
|
declare const useLocalRuntime: (adapter: ChatModelAdapter) => LocalRuntime;
|
132
144
|
|
133
145
|
type ThreadActionsState = Readonly<{
|
146
|
+
capabilities: Readonly<{
|
147
|
+
edit: boolean;
|
148
|
+
reload: boolean;
|
149
|
+
cancel: boolean;
|
150
|
+
copy: boolean;
|
151
|
+
}>;
|
134
152
|
getBranches: (messageId: string) => readonly string[];
|
135
153
|
switchToBranch: (branchId: string) => void;
|
136
154
|
append: (message: AppendMessage) => void;
|
@@ -202,10 +220,11 @@ type BaseComposerState = Readonly<{
|
|
202
220
|
type ReadonlyStore<T> = UseBoundStore<Omit<StoreApi<T>, "setState" | "destroy">>;
|
203
221
|
|
204
222
|
type EditComposerState = BaseComposerState & Readonly<{
|
223
|
+
canCancel: boolean;
|
205
224
|
isEditing: boolean;
|
206
225
|
edit: () => void;
|
207
226
|
send: () => void;
|
208
|
-
cancel: () =>
|
227
|
+
cancel: () => void;
|
209
228
|
}>;
|
210
229
|
|
211
230
|
type ThreadState = Readonly<{
|
@@ -271,9 +290,10 @@ type ContentPartContextValue = {
|
|
271
290
|
declare const useContentPartContext: () => ContentPartContextValue;
|
272
291
|
|
273
292
|
type ComposerState = BaseComposerState & Readonly<{
|
293
|
+
canCancel: boolean;
|
274
294
|
isEditing: true;
|
275
295
|
send: () => void;
|
276
|
-
cancel: () =>
|
296
|
+
cancel: () => void;
|
277
297
|
focus: () => void;
|
278
298
|
onFocus: (listener: () => void) => Unsubscribe;
|
279
299
|
}>;
|
@@ -605,7 +625,7 @@ type ThreadPrimitiveMessagesProps = {
|
|
605
625
|
AssistantMessage: ComponentType;
|
606
626
|
};
|
607
627
|
};
|
608
|
-
declare const ThreadPrimitiveMessages:
|
628
|
+
declare const ThreadPrimitiveMessages: react.NamedExoticComponent<ThreadPrimitiveMessagesProps>;
|
609
629
|
|
610
630
|
type ThreadPrimitiveScrollToBottomProps = ActionButtonProps<typeof useThreadScrollToBottom>;
|
611
631
|
declare const ThreadPrimitiveScrollToBottom: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & {
|
package/dist/index.js
CHANGED
@@ -210,11 +210,14 @@ var makeBaseComposer = (set) => ({
|
|
210
210
|
});
|
211
211
|
|
212
212
|
// src/context/stores/Composer.ts
|
213
|
-
var makeComposerStore = (
|
213
|
+
var makeComposerStore = (useThreadMessages, useThreadActions) => {
|
214
214
|
const focusListeners = /* @__PURE__ */ new Set();
|
215
215
|
return (0, import_zustand3.create)()((set, get, store) => {
|
216
216
|
return {
|
217
217
|
...makeBaseComposer(set, get, store),
|
218
|
+
get canCancel() {
|
219
|
+
return useThreadActions.getState().capabilities.cancel;
|
220
|
+
},
|
218
221
|
isEditing: true,
|
219
222
|
send: () => {
|
220
223
|
const { setValue, value } = get();
|
@@ -226,10 +229,7 @@ var makeComposerStore = (useThread, useThreadMessages, useThreadActions) => {
|
|
226
229
|
});
|
227
230
|
},
|
228
231
|
cancel: () => {
|
229
|
-
const thread = useThread.getState();
|
230
|
-
if (!thread.isRunning) return false;
|
231
232
|
useThreadActions.getState().cancelRun();
|
232
|
-
return true;
|
233
233
|
},
|
234
234
|
focus: () => {
|
235
235
|
for (const listener of focusListeners) {
|
@@ -279,6 +279,9 @@ var import_zustand6 = require("zustand");
|
|
279
279
|
var makeThreadActionStore = (runtimeRef) => {
|
280
280
|
return (0, import_zustand6.create)(
|
281
281
|
() => Object.freeze({
|
282
|
+
get capabilities() {
|
283
|
+
return runtimeRef.current.capabilities;
|
284
|
+
},
|
282
285
|
getBranches: (messageId) => runtimeRef.current.getBranches(messageId),
|
283
286
|
switchToBranch: (branchId) => runtimeRef.current.switchToBranch(branchId),
|
284
287
|
startRun: (parentId) => runtimeRef.current.startRun(parentId),
|
@@ -310,11 +313,7 @@ var ThreadProvider = ({
|
|
310
313
|
const useThreadMessages = makeThreadMessagesStore(runtimeRef);
|
311
314
|
const useThreadActions = makeThreadActionStore(runtimeRef);
|
312
315
|
const useViewport = makeThreadViewportStore();
|
313
|
-
const useComposer = makeComposerStore(
|
314
|
-
useThread,
|
315
|
-
useThreadMessages,
|
316
|
-
useThreadActions
|
317
|
-
);
|
316
|
+
const useComposer = makeComposerStore(useThreadMessages, useThreadActions);
|
318
317
|
return {
|
319
318
|
useThread,
|
320
319
|
useThreadMessages,
|
@@ -687,7 +686,7 @@ var useBranchPickerPrevious = () => {
|
|
687
686
|
var import_react21 = require("react");
|
688
687
|
var useComposerCancel = () => {
|
689
688
|
const { useComposer } = useComposerContext();
|
690
|
-
const disabled = useComposer((c) => !c.
|
689
|
+
const disabled = useComposer((c) => !c.canCancel);
|
691
690
|
const callback = (0, import_react21.useCallback)(() => {
|
692
691
|
const { cancel } = useComposer.getState();
|
693
692
|
cancel();
|
@@ -819,15 +818,18 @@ var useThreadSuggestion = ({
|
|
819
818
|
autoSend
|
820
819
|
}) => {
|
821
820
|
const { useThread, useComposer } = useThreadContext();
|
821
|
+
const append = useAppendMessage();
|
822
822
|
const disabled = useThread((t) => t.isRunning);
|
823
823
|
const callback = (0, import_react24.useCallback)(() => {
|
824
824
|
const thread = useThread.getState();
|
825
825
|
const composer = useComposer.getState();
|
826
|
-
composer.setValue(prompt);
|
827
826
|
if (autoSend && !thread.isRunning) {
|
828
|
-
|
827
|
+
append(prompt);
|
828
|
+
composer.setValue("");
|
829
|
+
} else {
|
830
|
+
composer.setValue(prompt);
|
829
831
|
}
|
830
|
-
}, [useThread, useComposer,
|
832
|
+
}, [useThread, useComposer, autoSend, append, prompt]);
|
831
833
|
if (disabled) return null;
|
832
834
|
return callback;
|
833
835
|
};
|
@@ -1262,7 +1264,7 @@ var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
1262
1264
|
var defaultComponents = {
|
1263
1265
|
Text: () => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("p", { style: { whiteSpace: "pre-line" }, children: [
|
1264
1266
|
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ContentPartPrimitiveText, {}),
|
1265
|
-
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ContentPartPrimitiveInProgress, { children: " \u25CF" })
|
1267
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ContentPartPrimitiveInProgress, { children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { fontFamily: "revert" }, children: " \u25CF" }) })
|
1266
1268
|
] }),
|
1267
1269
|
Image: () => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ContentPartPrimitiveImage, {}),
|
1268
1270
|
UI: () => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ContentPartPrimitiveDisplay, {}),
|
@@ -1400,7 +1402,8 @@ var ComposerPrimitiveInput = (0, import_react40.forwardRef)(
|
|
1400
1402
|
const ref = (0, import_react_compose_refs2.useComposedRefs)(forwardedRef, textareaRef);
|
1401
1403
|
(0, import_react_use_escape_keydown.useEscapeKeydown)((e) => {
|
1402
1404
|
const composer = useComposer.getState();
|
1403
|
-
if (composer.
|
1405
|
+
if (composer.canCancel) {
|
1406
|
+
composer.cancel();
|
1404
1407
|
e.preventDefault();
|
1405
1408
|
}
|
1406
1409
|
});
|
@@ -1674,20 +1677,19 @@ var makeEditComposerStore = ({
|
|
1674
1677
|
onSend
|
1675
1678
|
}) => (0, import_zustand10.create)()((set, get, store) => ({
|
1676
1679
|
...makeBaseComposer(set, get, store),
|
1680
|
+
canCancel: false,
|
1677
1681
|
isEditing: false,
|
1678
1682
|
edit: () => {
|
1679
1683
|
const value = onEdit();
|
1680
|
-
set({ isEditing: true, value });
|
1684
|
+
set({ isEditing: true, canCancel: true, value });
|
1681
1685
|
},
|
1682
1686
|
send: () => {
|
1683
1687
|
const value = get().value;
|
1684
|
-
set({ isEditing: false });
|
1688
|
+
set({ isEditing: false, canCancel: false });
|
1685
1689
|
onSend(value);
|
1686
1690
|
},
|
1687
1691
|
cancel: () => {
|
1688
|
-
|
1689
|
-
set({ isEditing: false });
|
1690
|
-
return true;
|
1692
|
+
set({ isEditing: false, canCancel: false });
|
1691
1693
|
}
|
1692
1694
|
}));
|
1693
1695
|
|
@@ -1808,9 +1810,9 @@ var ThreadMessageImpl = ({
|
|
1808
1810
|
};
|
1809
1811
|
var ThreadMessage = (0, import_react48.memo)(
|
1810
1812
|
ThreadMessageImpl,
|
1811
|
-
(prev, next) => prev.messageIndex === next.messageIndex && prev.components.UserMessage === next.components.UserMessage && prev.components.EditComposer === next.components.EditComposer && prev.components.AssistantMessage === next.components.AssistantMessage
|
1813
|
+
(prev, next) => prev.messageIndex === next.messageIndex && prev.components.Message === next.components.Message && prev.components.UserMessage === next.components.UserMessage && prev.components.EditComposer === next.components.EditComposer && prev.components.AssistantMessage === next.components.AssistantMessage
|
1812
1814
|
);
|
1813
|
-
var
|
1815
|
+
var ThreadPrimitiveMessagesImpl = ({
|
1814
1816
|
components
|
1815
1817
|
}) => {
|
1816
1818
|
const { useThreadMessages } = useThreadContext();
|
@@ -1828,7 +1830,11 @@ var ThreadPrimitiveMessages = ({
|
|
1828
1830
|
);
|
1829
1831
|
});
|
1830
1832
|
};
|
1831
|
-
|
1833
|
+
ThreadPrimitiveMessagesImpl.displayName = "ThreadPrimitive.Messages";
|
1834
|
+
var ThreadPrimitiveMessages = (0, import_react48.memo)(
|
1835
|
+
ThreadPrimitiveMessagesImpl,
|
1836
|
+
(prev, next) => prev.components?.Message === next.components?.Message && prev.components?.UserMessage === next.components?.UserMessage && prev.components?.EditComposer === next.components?.EditComposer && prev.components?.AssistantMessage === next.components?.AssistantMessage
|
1837
|
+
);
|
1832
1838
|
|
1833
1839
|
// src/primitives/thread/ThreadScrollToBottom.tsx
|
1834
1840
|
var ThreadPrimitiveScrollToBottom = createActionButton(
|
@@ -2012,6 +2018,9 @@ var BaseAssistantRuntime = class {
|
|
2012
2018
|
this._thread = _thread;
|
2013
2019
|
this._unsubscribe = this._thread.subscribe(this.subscriptionHandler);
|
2014
2020
|
}
|
2021
|
+
get capabilities() {
|
2022
|
+
return this._thread.capabilities;
|
2023
|
+
}
|
2015
2024
|
_unsubscribe;
|
2016
2025
|
get thread() {
|
2017
2026
|
return this._thread;
|
@@ -2084,6 +2093,12 @@ var LocalRuntime = class extends BaseAssistantRuntime {
|
|
2084
2093
|
);
|
2085
2094
|
}
|
2086
2095
|
};
|
2096
|
+
var CAPABILITIES = Object.freeze({
|
2097
|
+
edit: true,
|
2098
|
+
reload: true,
|
2099
|
+
cancel: true,
|
2100
|
+
copy: true
|
2101
|
+
});
|
2087
2102
|
var LocalThreadRuntime = class {
|
2088
2103
|
constructor(_configProviders, adapter) {
|
2089
2104
|
this._configProviders = _configProviders;
|
@@ -2092,6 +2107,7 @@ var LocalThreadRuntime = class {
|
|
2092
2107
|
_subscriptions = /* @__PURE__ */ new Set();
|
2093
2108
|
abortController = null;
|
2094
2109
|
repository = new MessageRepository();
|
2110
|
+
capabilities = CAPABILITIES;
|
2095
2111
|
get messages() {
|
2096
2112
|
return this.repository.getMessages();
|
2097
2113
|
}
|