Fix messageUtil.registerHandler typo and add

reloadMessage handler
This commit is contained in:
smallstone 2023-12-11 16:19:27 +08:00
parent 10d12efe6e
commit d7726df7f8
6 changed files with 209 additions and 40 deletions

View File

@ -35,7 +35,7 @@
- contextDetailResponse // 获取到的文件内容
- loadHistoryMessages // 与 historyMessages 对应
- isDevChatInstalled // 与 isDevChatInstalled 对应
- deletedChatMessage // 与 deleteChatMessage 对应·
- deletedChatMessage // 与 deleteChatMessage 对应
- regContextList // 与 regContextList 对应
- regModelList // 与 regModelList
- receiveMessagePartial // 部分对话
@ -63,3 +63,8 @@
--vscode-input-foreground
--vscode-disabledForeground
--vscode-toolbar-activeBackground
1. 请求 loadHistoryMessages 根据全局 id 返回空/对应的消息
1.1. 参数只有分页
2. 请求 loadConversations,用于切换全局的 id
2.1 loadConversations 的响应里,请求 1

View File

@ -20,7 +20,7 @@ const JStoIdea = {
message: message,
},
};
console.log("ready to call java send message", JSON.stringify(params));
console.log("ready to send message: ", params);
window.JSJavaBridge.callJava(JSON.stringify(params));
},
getModel: () => {
@ -52,7 +52,7 @@ const JStoIdea = {
},
payload: {},
};
console.log("reday to call java command list", JSON.stringify(params));
window.JSJavaBridge.callJava(JSON.stringify(params));
},
insertCode: (code) => {
@ -95,8 +95,9 @@ const JStoIdea = {
window.JSJavaBridge.callJava(JSON.stringify(params));
},
getUserAccessKey: () => {
// 这里需要发送一个请求,获取完整的用户设置
const params = {
action: "getKey/request",
action: "getSetting/request",
metadata: {
callback: "IdeaToJSMessage",
},
@ -114,10 +115,19 @@ const JStoIdea = {
*/
const content = Array.isArray(command.content) ? command.content[0] : "";
switch (content) {
case content.includes("workbench.action.openSettings"):
case "workbench.action.openSettings":
// 打开设置
const params = {
action: "showSettingDialog/request",
metadata: {
callback: "IdeaToJSMessage",
},
payload: {},
};
window.JSJavaBridge.callJava(JSON.stringify(params));
break;
case content.includes("AccessKey.DevChat"):
case "AccessKey.DevChat":
// 设置key
break;
default:
@ -165,14 +175,56 @@ const JStoIdea = {
},
getTopicDetail: (topicHash: string) => {
const params = {
action: "listConversations/request",
action: "loadConversations/request",
metadata: {
callback: "IdeaToJSMessage",
topicHash: topicHash,
},
payload: {},
};
console.log("ready to call java getTopicDetail", params);
window.JSJavaBridge.callJava(JSON.stringify(params));
},
historyMessages: (message) => {
const params = {
action: "loadHistoryMessages/request",
metadata: {
callback: "IdeaToJSMessage",
},
payload: {
pageIndex: message?.page || 0,
},
};
window.JSJavaBridge.callJava(JSON.stringify(params));
},
deleteChatMessage: (message) => {
const params = {
action: "deleteLastConversation/request",
metadata: {
callback: "IdeaToJSMessage",
},
payload: {
promptHash: message?.hash || "",
},
};
window.JSJavaBridge.callJava(JSON.stringify(params));
},
openLink: (message) => {
if (!message?.url) {
return false;
}
const params = {
action: "openLink/request",
metadata: {
callback: "IdeaToJSMessage",
},
payload: {
url: message?.url || "",
},
};
window.JSJavaBridge.callJava(JSON.stringify(params));
},
};
@ -185,8 +237,14 @@ class IdeaBridge {
this.handle = {};
// 注册全局的回调函数用于接收来自IDEA的消息
window.IdeaToJSMessage = (res: any) => {
console.log("IdeaToJSMessage res: ", res);
console.log("IdeaToJSMessage: ", res);
switch (res.action) {
case "deleteLastConversation/response":
this.resviceDeleteMessage(res);
break;
case "loadHistoryMessages/response":
this.resviceHistoryMessages(res);
break;
case "sendMessage/response":
this.resviceMessage(res);
break;
@ -213,7 +271,7 @@ class IdeaBridge {
case "listTopics/response":
this.resviceTopicList(res);
break;
case "listConversations/response":
case "loadConversations/response":
this.resviceTopicDetail(res);
break;
default:
@ -222,19 +280,39 @@ class IdeaBridge {
};
}
resviceTopicDetail(res) {
// 接收到这里需要触发 loadHistoryMessages
const list = res.payload.conversations.map((item) => ({
...item,
response: item.responses.join("\n"),
}));
this.handle.loadHistoryMessages({
entries: list,
resviceDeleteMessage(res) {
const hash = res?.payload?.promptHash || "";
this.handle.deletedChatMessage({
hash,
});
}
resviceHistoryMessages(res) {
const list: any = [];
if (res?.payload?.messages?.length > 0) {
res?.payload?.messages.forEach((item) => {
list.push({
...item,
response: item.responses?.join("\n"),
});
});
}
this.handle.reloadMessage({
entries: list.reverse(),
pageIndex: 0,
});
}
resviceTopicDetail(res) {
// 用于重置后端全局的 topic id
if (res?.payload?.reset) {
// 重置后请求历史消息
JStoIdea.historyMessages({ page: 0 });
}
}
resviceTopicList(res) {
console.log("resviceTopicList res: ", res);
const list = res.payload.topics;
this.handle.listTopics(list);
}
@ -256,6 +334,7 @@ class IdeaBridge {
resviceSettings(res) {
// 用户设置的回调
const setting = res.payload.setting;
// 当前的默认模型
this.handle.getSetting({
value: setting.currentModel,
@ -307,17 +386,21 @@ class IdeaBridge {
}
resviceMessage(response: any) {
console.log(
"response.metadata.isFinalChunk: ",
response.metadata.isFinalChunk
);
// 接受到消息
if (response.metadata.isFinalChunk) {
if (response.metadata?.isFinalChunk) {
// 结束对话
this.handle["receiveMessage"]({
text: response.payload.message || response.metadata.error,
isError: response.metadata.error.length > 0,
hash: response.payload.promptHash || "",
text: response.payload?.message || response.metadata?.error || "",
isError: response.metadata?.error.length > 0,
hash: response.payload?.promptHash || "",
});
} else {
this.handle["receiveMessagePartial"]({
text: response.payload.message,
text: response?.payload?.message || "",
});
}
}
@ -335,13 +418,15 @@ class IdeaBridge {
}
sendMessage(message: any) {
console.log("sendMessage message: ", message);
// 根据 command 分发到不同的方法·
switch (message.command) {
// 发送消息
case "sendMessage":
console.log("message: ", message);
JStoIdea.sendMessage(message.text, message.contextInfo, message.parent);
JStoIdea.sendMessage(
message.text,
message.contextInfo,
message.parent_hash
);
break;
// 重新生成消息,用于发送失败时再次发送
case "regeneration":
@ -384,6 +469,15 @@ class IdeaBridge {
case "getTopicDetail":
JStoIdea.getTopicDetail(message.topicHash);
break;
case "historyMessages":
JStoIdea.historyMessages(message);
break;
case "deleteChatMessage":
JStoIdea.deleteChatMessage(message);
break;
case "openLink":
JStoIdea.openLink(message);
break;
default:
break;
}

View File

@ -42,6 +42,7 @@ export default function WechatTip() {
const [accessKey, setAccessKey] = useState("");
const [env, setEnv] = useState("prod");
const [loading, setLoading] = useState(false);
const platform = process.env.platform;
const getSettings = () => {
messageUtil.sendMessage({
@ -95,6 +96,15 @@ export default function WechatTip() {
);
}, []);
const openLink = (e) => {
e.preventDefault();
e.stopPropagation();
messageUtil.sendMessage({
command: "openLink",
url: envMap[env].link,
});
};
if (balance === null || balance === undefined) {
return null;
}
@ -105,6 +115,11 @@ export default function WechatTip() {
position="left"
width="200"
withArrow={true}
styles={{
arrow: {
borderColor: "var(--vscode-menu-border)",
},
}}
zIndex={999}
>
<HoverCard.Target>
@ -116,16 +131,25 @@ export default function WechatTip() {
</HoverCard.Target>
<HoverCard.Dropdown
sx={{
background: "var(--vscode-dropdown-background)",
borderColor: "var(--vscode-dropdown-border)",
color: "var(--vscode-foreground)",
borderColor: "var(--vscode-menu-border)",
backgroundColor: "var(--vscode-menu-background)",
}}
>
<Group style={{ width: "90%" }}>
<Text size="sm">
Your remaining credit is {formatCurrency(balance, currency)}. Sign
in to <a href={envMap[env].link}>web.devchat.ai </a>to{" "}
{bindWechat ? "purchase more tokens." : "earn additional ¥8"}
in to{" "}
{platform === "idea" ? (
<Text td="underline" c="blue" onClick={(e) => openLink(e)}>
web.devchat.ai{" "}
</Text>
) : (
<a href={envMap[env].link} target="_blank">
web.devchat.ai{" "}
</a>
)}
to {bindWechat ? "purchase more tokens." : "earn additional ¥8"}
</Text>
<LoadingOverlay visible={loading} />
</Group>

View File

@ -6,21 +6,20 @@ import messageUtil from "@/util/MessageUtil";
import dayjs from "dayjs";
export default function Topic({ styleName }) {
const [drawerOpened, { open: openDrawer, close: closeDrawer }] =
useDisclosure(false);
const [topicList, setTopicList] = useState([]);
useEffect(() => {
messageUtil.sendMessage({
command: "listTopics",
});
messageUtil.registerHandler("listTopics", (data) => {
console.log("listTopics data: ", data);
setTopicList(data);
});
}, []);
const [drawerOpened, { open: openDrawer, close: closeDrawer }] =
useDisclosure(false);
const showTopic = (root_prompt: any) => {
console.log("root_prompt: ", root_prompt);
closeDrawer();
messageUtil.sendMessage({
command: "getTopicDetail",
@ -56,12 +55,29 @@ export default function Topic({ styleName }) {
}}
onClick={() => showTopic(item?.root_prompt)}
>
<Flex justify="space-between">
<Text fz="sm" fw={700}>
{item?.root_prompt.request}
<Flex justify="space-between" gap="sm">
<Text
fz="sm"
fw={700}
sx={{
whiteSpace: "nowrap",
overflow: "hidden",
textOverflow: "ellipsis",
flex: 1,
}}
>
{item?.root_prompt.title}
</Text>
<Text fz="sm" c="dimmed">
{dayjs(item?.latest_time * 1000).format("YYYY-MM-DD HH:mm:ss")}
<Text
fz="sm"
c="dimmed"
sx={{
whiteSpace: "nowrap",
overflow: "hidden",
textOverflow: "ellipsis",
}}
>
{dayjs(item?.latest_time * 1000).format("MM-DD HH:mm:ss")}
</Text>
</Flex>

View File

@ -85,6 +85,9 @@ const chatPanel = observer(() => {
getSettings();
getFeatureToggles();
chat.fetchHistoryMessages({ pageIndex: 0 }).then();
messageUtil.registerHandler('reloadMessage',(message:any)=>{
chat.reloadMessage(message);
});
messageUtil.registerHandler(
"receiveMessagePartial",
(message: { text: string }) => {

View File

@ -332,6 +332,33 @@ ${yaml.dump(values)}
self.isTop = false;
self.isBottom = false;
},
reloadMessage:({entries,pageIndex})=>{
if (entries.length > 0) {
self.pageIndex = pageIndex;
const messages = entries
.map((entry, index) => {
const { hash, user, date, request, response, context } = entry;
const chatContexts = context?.map(({ content }) => {
return JSON.parse(content);
});
return [
{ type: 'user', message: request, contexts: chatContexts, date: date, hash: hash },
{ type: 'bot', message: response, date: date, hash: hash },
];
})
.flat();
if (self.pageIndex === 0) {
self.messages = messages;
} else if (self.pageIndex > 0) {
self.messages.concat(...messages);
}
} else {
self.isLastPage = true;
if (self.messages.length === 0) {
helpMessage(true);
}
}
},
fetchHistoryMessages: flow(function* (params: { pageIndex: number }) {
const { pageIndex, entries } = yield fetchHistoryMessages(params);
if (entries.length > 0) {