Skip to content

Commit 9ee4451

Browse files
committed
wip(messsage trie): build a trie of mesages.
1 parent 45b14b1 commit 9ee4451

File tree

9 files changed

+1291
-13
lines changed

9 files changed

+1291
-13
lines changed

refact-agent/gui/src/app/store.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ import { knowledgeSlice } from "../features/Knowledge/knowledgeSlice";
5252
import { checkpointsSlice } from "../features/Checkpoints/checkpointsSlice";
5353
import { checkpointsApi } from "../services/refact/checkpoints";
5454
import { patchesAndDiffsTrackerSlice } from "../features/PatchesAndDiffsTracker/patchesAndDiffsTrackerSlice";
55-
import { chatDbSlice } from "../features/ChatDB/chatDbSlice";
55+
import { chatDbThreadsSlice } from "../features/ChatDB/chatDbSlice";
56+
import { chatDbMessageSlice } from "../features/ChatDB/chatDbMessagesSlice";
5657

5758
const tipOfTheDayPersistConfig = {
5859
key: "totd",
@@ -116,7 +117,8 @@ const rootReducer = combineSlices(
116117
knowledgeSlice,
117118
checkpointsSlice,
118119
patchesAndDiffsTrackerSlice,
119-
chatDbSlice,
120+
chatDbThreadsSlice,
121+
chatDbMessageSlice,
120122
);
121123

122124
const rootPersistConfig = {

refact-agent/gui/src/components/ChatHistory/ChatHistory.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
import { subscribeToThreadsThunk } from "../../services/refact/chatdb";
1616
import { push } from "../../features/Pages/pagesSlice";
1717
import { CThread } from "../../services/refact/types";
18+
import { chatDbMessageSliceActions } from "../../features/ChatDB/chatDbMessagesSlice";
1819

1920
// export type ChatHistoryProps = {
2021
// history: HistoryState;
@@ -48,6 +49,7 @@ function useGetHistory() {
4849

4950
const onHistoryItemClick = useCallback(
5051
(thread: CThread) => {
52+
dispatch(chatDbMessageSliceActions.setThread(thread));
5153
dispatch(push({ name: "chat", threadId: thread.cthread_id }));
5254
},
5355
[dispatch],
Lines changed: 133 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,152 @@
11
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
2-
import { CMessage } from "../../services/refact";
2+
import {
3+
CMessageFromChatDB,
4+
CThread,
5+
CThreadDefault,
6+
CMessage,
7+
ChatMessage,
8+
} from "../../services/refact";
9+
import { v4 as uuid } from "uuid";
10+
import { parseOrElse } from "../../utils";
11+
12+
export type CMessageNode = {
13+
message: CMessage;
14+
children: CMessageNode[];
15+
};
16+
17+
export type CMessageRoot = CMessageNode[];
318

419
type InitialState = {
5-
threadId: string;
6-
messages: CMessage[];
20+
thread: CThread | CThreadDefault;
21+
messageTree: CMessageRoot;
22+
messageList: CMessage[];
723
loading: boolean;
824
error: null | string;
925
};
1026

27+
const createChatThread = (): CThreadDefault => {
28+
const thread: CThreadDefault = {
29+
cthread_id: uuid(),
30+
cthread_title: "",
31+
cthread_toolset: "",
32+
cthread_model: "",
33+
};
34+
35+
return thread;
36+
};
37+
1138
const initialState: InitialState = {
12-
threadId: "",
13-
messages: [],
39+
thread: createChatThread(),
40+
messageTree: [[]],
41+
messageList: [],
1442
loading: false,
1543
error: null,
1644
};
1745

46+
const findNodeByAltAndNum = (
47+
nodes: CMessageNode[],
48+
alt: number,
49+
num: number,
50+
): CMessageNode | null => {
51+
for (const node of nodes) {
52+
if (
53+
node.message.cmessage_alt === alt &&
54+
node.message.cmessage_num === num
55+
) {
56+
return node;
57+
}
58+
const found = findNodeByAltAndNum(node.children, alt, num);
59+
if (found) return found;
60+
}
61+
return null;
62+
};
63+
64+
function parseCMessageFromChatDBToCMessage(
65+
message: CMessageFromChatDB,
66+
): CMessage | null {
67+
// TODO: add a type guard to parseOrElse
68+
const json = parseOrElse<ChatMessage | null>(message.cmessage_json, null);
69+
if (json === null) return null;
70+
return {
71+
...message,
72+
cmessage_json: json,
73+
};
74+
}
75+
1876
export const chatDbMessageSlice = createSlice({
1977
name: "chatDbMessages",
2078
initialState,
2179
reducers: {
22-
setThreadId: (state, action: PayloadAction<string>) => {
23-
state.threadId = action.payload;
80+
setThread: (state, action: PayloadAction<CThread>) => {
81+
state.thread = action.payload;
82+
state.messageTree = [];
83+
},
84+
updateMessage: (
85+
state,
86+
action: PayloadAction<{ threadId: string; message: CMessageFromChatDB }>,
87+
) => {
88+
if (action.payload.threadId !== state.thread.cthread_id) return state;
89+
const message = parseCMessageFromChatDBToCMessage(action.payload.message);
90+
if (!message) return;
91+
92+
// Update message list
93+
state.messageList[message.cmessage_num] = message;
94+
95+
if (message.cmessage_num === 0) {
96+
state.messageTree[message.cmessage_num] = {
97+
message,
98+
children: state.messageTree[message.cmessage_num]?.children ?? [],
99+
};
100+
return;
101+
}
102+
103+
// find it's place
104+
// function traverse(node: CMessageNode) {}
105+
// updateMessage: (
106+
// state,
107+
// action: PayloadAction<{ threadId: string; message: CMessageFromChatDB }>,
108+
// ) => {
109+
// if (action.payload.threadId !== state.thread.cthread_id) return state;
110+
// const message = parseCMessageFromChatDBToCMessage(action.payload.message);
111+
// if (!message) return;
112+
113+
// state.messageList[message.cmessage_num] = message;
114+
// if (message.cmessage_num === 0) {
115+
// state.messageTree[message.cmessage_num] = {
116+
// message,
117+
// children: state.messageTree[message.cmessage_num]?.children ?? [],
118+
// };
119+
120+
// return;
121+
// }
122+
123+
// // find the parent node,
124+
// const parentMessage = state.messageList.find(
125+
// (m) =>
126+
// m.cmessage_num === message.cmessage_num - 1 &&
127+
// m.cmessage_alt === message.cmessage_prev_alt,
128+
// );
129+
// console.log("parentMessage", JSON.stringify(parentMessage)
130+
131+
// // const parentNode = findNodeByAltAndNum(
132+
// // state.messageTree.flat(),
133+
// // prevAlt,
134+
// // prevNum
135+
// // );
136+
137+
// // state.messageTree[message.cmessage_num] =
138+
// // state.messageTree[message.cmessage_num] ?? [];
139+
// // state.messageTree[message.cmessage_num][message.cmessage_alt] = {
140+
// // children:
141+
// // state.messageTree[message.cmessage_num][message.cmessage_alt]
142+
// // ?.children ?? [],
143+
// // message,
144+
// // };
145+
// // const node = row[message.cmessage_alt] ?? { message, children: [] };
146+
// },
24147
},
25148
},
26149
});
150+
151+
export const chatDbMessageSliceActions = chatDbMessageSlice.actions;
152+
export const chatDbMessagesSliceSelectors = chatDbMessageSlice.selectors;

0 commit comments

Comments
 (0)