diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml
index 9c7b7e6f1..38c272e85 100644
--- a/.github/workflows/sync.yml
+++ b/.github/workflows/sync.yml
@@ -1,5 +1,8 @@
name: Upstream Sync
+permissions:
+ contents: write
+
on:
schedule:
- cron: "0 */6 * * *" # every 6 hours
@@ -12,7 +15,7 @@ jobs:
if: ${{ github.event.repository.fork }}
steps:
- # Step 1: run a standard checkout action, provided by github
+ # Step 1: run a standard checkout action
- name: Checkout target repo
uses: actions/checkout@v3
diff --git a/app/components/chat.tsx b/app/components/chat.tsx
index d7540dea4..2bd80aa8b 100644
--- a/app/components/chat.tsx
+++ b/app/components/chat.tsx
@@ -370,7 +370,8 @@ export function Chat(props: {
chatStore.onUserInput(userInput).then(() => setIsLoading(false));
setUserInput("");
setPromptHints([]);
- inputRef.current?.focus();
+ if (!isMobileScreen()) inputRef.current?.focus();
+ setAutoScroll(true);
};
// stop response
@@ -507,7 +508,10 @@ export function Chat(props: {
bordered
title={Locale.Chat.Actions.Export}
onClick={() => {
- exportMessages(session.messages, session.topic);
+ exportMessages(
+ session.messages.filter((msg) => !msg.isError),
+ session.topic,
+ );
}}
/>
@@ -524,7 +528,11 @@ export function Chat(props: {
className={styles["chat-body"]}
ref={scrollRef}
onScroll={(e) => onChatBodyScroll(e.currentTarget)}
- onTouchStart={() => inputRef.current?.blur()}
+ onWheel={() => setAutoScroll(false)}
+ onTouchStart={() => {
+ inputRef.current?.blur();
+ setAutoScroll(false);
+ }}
>
{messages.map((message, i) => {
const isUser = message.role === "user";
@@ -585,7 +593,6 @@ export function Chat(props: {
if (!isMobileScreen()) return;
setUserInput(message.content);
}}
- onMouseOver={() => inputRef.current?.blur()}
>
@@ -620,9 +627,6 @@ export function Chat(props: {
setAutoScroll(false);
setTimeout(() => setPromptHints([]), 500);
}}
- onMouseOver={() => {
- inputRef.current?.focus();
- }}
autoFocus={!props?.sideBarShowing}
/>
void;
- onError: (error: Error) => void;
+ onError: (error: Error, statusCode?: number) => void;
onController?: (controller: AbortController) => void;
},
) {
@@ -178,11 +178,10 @@ export async function requestChatStream(
finish();
} else if (res.status === 401) {
console.error("Anauthorized");
- responseText = Locale.Error.Unauthorized;
- finish();
+ options?.onError(new Error("Anauthorized"), res.status);
} else {
console.error("Stream Error", res.body);
- options?.onError(new Error("Stream Error"));
+ options?.onError(new Error("Stream Error"), res.status);
}
} catch (err) {
console.error("NetWork Error", err);
diff --git a/app/store/app.ts b/app/store/app.ts
index 29da33792..b943c0d97 100644
--- a/app/store/app.ts
+++ b/app/store/app.ts
@@ -14,6 +14,7 @@ import Locale from "../locales";
export type Message = ChatCompletionResponseMessage & {
date: string;
streaming?: boolean;
+ isError?: boolean;
};
export enum SubmitKey {
@@ -351,9 +352,15 @@ export const useChatStore = create()(
set(() => ({}));
}
},
- onError(error) {
- botMessage.content += "\n\n" + Locale.Store.Error;
+ onError(error, statusCode) {
+ if (statusCode === 401) {
+ botMessage.content = Locale.Error.Unauthorized;
+ } else {
+ botMessage.content += "\n\n" + Locale.Store.Error;
+ }
botMessage.streaming = false;
+ userMessage.isError = true;
+ botMessage.isError = true;
set(() => ({}));
ControllerPool.remove(sessionIndex, messageIndex);
},
@@ -383,7 +390,8 @@ export const useChatStore = create()(
getMessagesWithMemory() {
const session = get().currentSession();
const config = get().config;
- const n = session.messages.length;
+ const messages = session.messages.filter((msg) => !msg.isError);
+ const n = messages.length;
const context = session.context.slice();
@@ -393,7 +401,7 @@ export const useChatStore = create()(
}
const recentMessages = context.concat(
- session.messages.slice(Math.max(0, n - config.historyMessageCount)),
+ messages.slice(Math.max(0, n - config.historyMessageCount)),
);
return recentMessages;