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;