Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
b1517c8
wip(chat db): get thread from the lsp.
MarcMcIntosh Feb 18, 2025
4ea5f07
wip(chat-db): render threads in history sidebar.
MarcMcIntosh Feb 19, 2025
042a7c7
wip(chatdb): fetch messages for thread.
MarcMcIntosh Feb 19, 2025
6f53c3f
wip(messsage trie): build a trie of mesages.
MarcMcIntosh Feb 20, 2025
dc2c274
refactoring(message trie): yeet code that doesn't make a trie.
MarcMcIntosh Feb 20, 2025
a4d10e2
chore(chat): move cmessages stub to fixtures.
MarcMcIntosh Feb 20, 2025
57761ff
chore(chat): move the nest cmessages stub to fixtures directory.
MarcMcIntosh Feb 20, 2025
066af24
wip(chat tree): render a basic tree what can be navigated through.
MarcMcIntosh Feb 20, 2025
01fcff9
shore(storybook): migrate chat message list to db message list
MarcMcIntosh Feb 24, 2025
b00bd1c
fix(storyboook chat-db): add the index to the messages in the list.
MarcMcIntosh Feb 24, 2025
82012ea
wip(messages): render messages in message node.
MarcMcIntosh Feb 28, 2025
c7a7ded
ui: update message node stories.
MarcMcIntosh Mar 4, 2025
b4dcd36
wip(chat-db): track the end point for the current message tree.
MarcMcIntosh Mar 4, 2025
92992d5
wip(sending messages): start thinking about how to send messages to c…
MarcMcIntosh Mar 6, 2025
b60def5
wip: create thread and subscribe to messages.
MarcMcIntosh Mar 7, 2025
b5533c3
wip(chat db): create thread, subscribe and send messages.
MarcMcIntosh Mar 8, 2025
dc15367
wip(chat-db): render message tree.
MarcMcIntosh Mar 8, 2025
7587c2b
wip(chore-db): branching user messages.
MarcMcIntosh Mar 10, 2025
231ed6d
chore(chat db): add time stamps and sort threads
MarcMcIntosh Mar 11, 2025
6da10f3
chore: chat-db remove hard coded title
MarcMcIntosh Mar 11, 2025
3ed7d1c
refactor( chat user input): remove retry buttons.
MarcMcIntosh Mar 11, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
176 changes: 176 additions & 0 deletions refact-agent/gui/src/__fixtures__/chat.ts

Large diffs are not rendered by default.

227 changes: 227 additions & 0 deletions refact-agent/gui/src/__fixtures__/chat_db_cmessages.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
import { CMessage, CMessageFromChatDB } from "../services/refact/types";
export const CMESSAGES_STUB: CMessage[] = [
{
cmessage_belongs_to_cthread_id: "test13thread1739988322_2",
cmessage_alt: 0,
cmessage_num: 0,
cmessage_prev_alt: -1,
cmessage_usage_model: "",
cmessage_usage_prompt: 0,
cmessage_usage_completion: 0,
cmessage_json: {
role: "system",
content: "You answer only with jokes.",
},
},
{
cmessage_belongs_to_cthread_id: "test13thread1739988322_2",
cmessage_alt: 0,
cmessage_num: 1,
cmessage_prev_alt: 0,
cmessage_usage_model: "",
cmessage_usage_prompt: 0,
cmessage_usage_completion: 0,
cmessage_json: {
role: "user",
content: "Hello mister assistant, I have a question for you",
},
},
{
cmessage_belongs_to_cthread_id: "test13thread1739988322_2",
cmessage_alt: 1,
cmessage_num: 1,
cmessage_prev_alt: 0,
cmessage_usage_model: "",
cmessage_usage_prompt: 0,
cmessage_usage_completion: 0,
cmessage_json: {
role: "user",
content: "Find Frog in this project",
},
},
{
cmessage_belongs_to_cthread_id: "test13thread1739988322_2",
cmessage_alt: 0,
cmessage_num: 2,
cmessage_prev_alt: 0,
cmessage_usage_model: "gpt-4o-mini",
cmessage_usage_prompt: 0,
cmessage_usage_completion: 0,
cmessage_json: {
role: "assistant",
content: "yes?.",
},
},
{
cmessage_belongs_to_cthread_id: "test13thread1739988322_2",
cmessage_alt: 1,
cmessage_num: 2,
cmessage_prev_alt: 1,
cmessage_usage_model: "gpt-4o-mini",
cmessage_usage_prompt: 0,
cmessage_usage_completion: 0,
cmessage_json: {
role: "assistant",
content: "Birds aren't real",
},
},
{
cmessage_belongs_to_cthread_id: "test13thread1739988322_2",
cmessage_alt: 0,
cmessage_num: 3,
cmessage_prev_alt: 0,
cmessage_usage_model: "gpt-4o-mini",
cmessage_usage_prompt: 0,
cmessage_usage_completion: 0,
cmessage_json: {
role: "user",
content: "Find Frog in this project",
},
},
{
cmessage_belongs_to_cthread_id: "test13thread1739988322_2",
cmessage_alt: 0,
cmessage_num: 4,
cmessage_prev_alt: 0,
cmessage_usage_model: "gpt-4o-mini",
cmessage_usage_prompt: 1210,
cmessage_usage_completion: 15,
cmessage_json: {
role: "assistant",
content: "",
tool_calls: [
{
index: 0,
id: "call_8PSEh32Hhivfdxc50XKNwW8y",
function: {
arguments: '{"symbol":"Frog"}',
name: "references",
},
type: "function",
},
],
// usage: {
// prompt_tokens: 1210,
// completion_tokens: 15,
// total_tokens: 1225,
// },
},
},
];

export const CSMESSAGES_NETWORK_STUB: CMessageFromChatDB[] = CMESSAGES_STUB.map(
(cmessage) => {
return {
...cmessage,
cmessage_json: JSON.stringify(cmessage.cmessage_json),
};
},
);

export const CMESSAGES_WITH_NESTED_BRANCHES_STUB: CMessage[] = [
CMESSAGES_STUB[0],
{
cmessage_belongs_to_cthread_id: "test13thread1739988322_2",
cmessage_alt: 0,
cmessage_num: 1,
cmessage_prev_alt: 0,
cmessage_usage_model: "",
cmessage_usage_prompt: 0,
cmessage_usage_completion: 0,
cmessage_json: {
role: "user",
content: "Hello",
},
},
{
cmessage_belongs_to_cthread_id: "test13thread1739988322_2",
cmessage_alt: 0,
cmessage_num: 2,
cmessage_prev_alt: 0,
cmessage_usage_model: "",
cmessage_usage_prompt: 0,
cmessage_usage_completion: 0,
cmessage_json: {
role: "assistant",
content: "Hello.",
},
},
{
cmessage_belongs_to_cthread_id: "test13thread1739988322_2",
cmessage_alt: 0,
cmessage_num: 3,
cmessage_prev_alt: 0,
cmessage_usage_model: "",
cmessage_usage_prompt: 0,
cmessage_usage_completion: 0,
cmessage_json: {
role: "user",
content: "1",
},
},
{
cmessage_belongs_to_cthread_id: "test13thread1739988322_2",
cmessage_alt: 1,
cmessage_num: 3,
cmessage_prev_alt: 0,
cmessage_usage_model: "",
cmessage_usage_prompt: 0,
cmessage_usage_completion: 0,
cmessage_json: {
role: "user",
content: "2",
},
},
{
cmessage_belongs_to_cthread_id: "test13thread1739988322_2",
cmessage_alt: 0,
cmessage_num: 4,
cmessage_prev_alt: 0,
cmessage_usage_model: "",
cmessage_usage_prompt: 0,
cmessage_usage_completion: 0,
cmessage_json: {
role: "assistant",
content: "1",
},
},
{
cmessage_belongs_to_cthread_id: "test13thread1739988322_2",
cmessage_alt: 1,
cmessage_num: 4,
cmessage_prev_alt: 1,
cmessage_usage_model: "",
cmessage_usage_prompt: 0,
cmessage_usage_completion: 0,
cmessage_json: {
role: "assistant",
content: "2",
},
},
{
cmessage_belongs_to_cthread_id: "test13thread1739988322_2",
cmessage_alt: 0,
cmessage_num: 5,
cmessage_prev_alt: 1,
cmessage_usage_model: "",
cmessage_usage_prompt: 0,
cmessage_usage_completion: 0,
cmessage_json: {
role: "user",
content: "4",
},
},
{
cmessage_belongs_to_cthread_id: "test13thread1739988322_2",
cmessage_alt: 0,
cmessage_num: 6,
cmessage_prev_alt: 0,
cmessage_usage_model: "",
cmessage_usage_prompt: 0,
cmessage_usage_completion: 0,
cmessage_json: {
role: "assistant",
content: "🏌️",
},
},
];
1 change: 1 addition & 0 deletions refact-agent/gui/src/__fixtures__/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ export * from "./chat_links_response";
export * from "./chat_config_thread";
export * from "./chat_textdoc";
export * from "./markdown-issue";
export * from "./chat_db_cmessages";
4 changes: 4 additions & 0 deletions refact-agent/gui/src/app/store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ import { knowledgeSlice } from "../features/Knowledge/knowledgeSlice";
import { checkpointsSlice } from "../features/Checkpoints/checkpointsSlice";
import { checkpointsApi } from "../services/refact/checkpoints";
import { patchesAndDiffsTrackerSlice } from "../features/PatchesAndDiffsTracker/patchesAndDiffsTrackerSlice";
import { chatDbThreadsSlice } from "../features/ChatDB/chatDbSlice";
import { chatDbMessageSlice } from "../features/ChatDB/chatDbMessagesSlice";

const tipOfTheDayPersistConfig = {
key: "totd",
Expand Down Expand Up @@ -115,6 +117,8 @@ const rootReducer = combineSlices(
knowledgeSlice,
checkpointsSlice,
patchesAndDiffsTrackerSlice,
chatDbThreadsSlice,
chatDbMessageSlice,
);

const rootPersistConfig = {
Expand Down
52 changes: 31 additions & 21 deletions refact-agent/gui/src/components/Chat/Chat.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React, { useCallback, useEffect, useState } from "react";
import { ChatForm, ChatFormProps } from "../ChatForm";
import { ChatForm } from "../ChatForm";
import { ChatContent } from "../ChatContent";
import { Flex, Button, Text, Card } from "@radix-ui/themes";
import {
Expand All @@ -11,7 +11,7 @@ import {
useCapsForToolUse,
useAgentUsage,
} from "../../hooks";
import { type Config } from "../../features/Config/configSlice";
// import { type Config } from "../../features/Config/configSlice";
import {
enableSend,
selectIsStreaming,
Expand All @@ -29,21 +29,18 @@ import { AgentUsage } from "../../features/AgentUsage";
import { useCheckpoints } from "../../hooks/useCheckpoints";
import { Checkpoints } from "../../features/Checkpoints";
import { SuggestNewChat } from "../ChatForm/SuggestNewChat";
import { useThreadMessageSubmit } from "../../hooks/useThreadMessageSubmit";

export type ChatProps = {
host: Config["host"];
tabbed: Config["tabbed"];
backFromChat: () => void;
style?: React.CSSProperties;
unCalledTools: boolean;
maybeSendToSidebar: ChatFormProps["onClose"];
// host: Config["host"];
// tabbed: Config["tabbed"];
// backFromChat: () => void;
// style?: React.CSSProperties;
// unCalledTools: boolean;
// maybeSendToSidebar: ChatFormProps["onClose"];
};

export const Chat: React.FC<ChatProps> = ({
style,
unCalledTools,
maybeSendToSidebar,
}) => {
export const Chat: React.FC<ChatProps> = () => {
const dispatch = useAppDispatch();

const [isViewingRawJSON, setIsViewingRawJSON] = useState(false);
Expand All @@ -52,12 +49,29 @@ export const Chat: React.FC<ChatProps> = ({
const caps = useGetCapsQuery();

const chatId = useAppSelector(selectChatId);
const { submit, abort, retryFromIndex } = useSendChatRequest();
const {
// submit,
abort,
retryFromIndex,
} = useSendChatRequest();

const chatToolUse = useAppSelector(getSelectedToolUse);

const threadNewChatSuggested = useAppSelector(selectThreadNewChatSuggested);
const messages = useAppSelector(selectMessages);

const { submit } = useThreadMessageSubmit();

// can be a selector
const unCalledTools = React.useMemo(() => {
if (messages.length === 0) return false;
const last = messages[messages.length - 1];
if (last.role !== "assistant") return false;
const maybeTools = last.tool_calls;
if (maybeTools && maybeTools.length > 0) return true;
return false;
}, [messages]);

const capsForToolUse = useCapsForToolUse();
const { disableInput } = useAgentUsage();

Expand All @@ -71,7 +85,7 @@ export const Chat: React.FC<ChatProps> = ({

const handleSummit = useCallback(
(value: string) => {
submit({ question: value });
void submit(value);
if (isViewingRawJSON) {
setIsViewingRawJSON(false);
}
Expand Down Expand Up @@ -103,22 +117,21 @@ export const Chat: React.FC<ChatProps> = ({
return (
<DropzoneProvider asChild>
<Flex
style={style}
direction="column"
flexGrow="1"
width="100%"
overflowY="auto"
justify="between"
px="1"
>
{" "}
{/** change messages? */}
<ChatContent
key={`chat-content-${chatId}`}
onRetry={retryFromIndex}
onStopStreaming={abort}
/>

{shouldCheckpointsPopupBeShown && <Checkpoints />}

<AgentUsage />
<SuggestNewChat
shouldBeVisible={
Expand All @@ -138,14 +151,11 @@ export const Chat: React.FC<ChatProps> = ({
</Card>
</Flex>
)}

<ChatForm
key={chatId} // TODO: think of how can we not trigger re-render on chatId change (checkboxes)
onSubmit={handleSummit}
onClose={maybeSendToSidebar}
unCalledTools={unCalledTools}
/>

<Flex justify="between" pl="1" pr="1" pt="1">
{/* Two flexboxes are left for the future UI element on the right side */}
{messages.length > 0 && (
Expand Down
Loading
Loading