Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
102 changes: 67 additions & 35 deletions src/util/ideaBridge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -303,11 +303,6 @@ class IdeaBridge {
case "listCommands/response":
this.resviceCommandList(res);
break;
// 这里暂时不用,因为获取到的只有 key,信息不全
// 所以用 resviceSettings 来获取
// case "getKey/response":
// this.resviceAccessKey(res.payload.key);
// break;
case "addContext/notify":
this.resviesContext(res);
break;
Expand All @@ -331,15 +326,18 @@ class IdeaBridge {
}

resviceSendUserMessage(res) {
this.handle.chatWithDevChat({
this.executeHandlers("chatWithDevChat", {
command: "chatWithDevChat",
message: res.payload.message || "",
});
}

resviceDeleteMessage(res) {
const hash = res?.payload?.promptHash || "";
this.handle.deletedChatMessage({
// this.handle.deletedChatMessage({
// hash,
// });
this.executeHandlers("deletedChatMessage", {
hash,
});
}
Expand All @@ -354,8 +352,11 @@ class IdeaBridge {
});
});
}

this.handle.reloadMessage({
// this.handle.reloadMessage({
// entries: list.reverse(),
// pageIndex: 0,
// });
this.executeHandlers("reloadMessage", {
entries: list.reverse(),
pageIndex: 0,
});
Expand All @@ -371,7 +372,10 @@ class IdeaBridge {

resviceTopicList(res) {
const list = res.payload.topics;
this.handle.listTopics(list);
// this.handle.listTopics(list);
this.executeHandlers("listTopics", {
list,
});
}

resviesContext(res) {
Expand All @@ -385,7 +389,8 @@ class IdeaBridge {
command: "",
};
params.result = JSON.stringify(contextObj);
this.handle.contextDetailResponse(params);
// this.handle.contextDetailResponse(params);
this.executeHandlers("contextDetailResponse", params);
}

resviceSettings(res) {
Expand All @@ -399,76 +404,93 @@ class IdeaBridge {
}

// 当前的默认模型
this.handle.getSetting({
// this.handle.getSetting({});

this.executeHandlers("getSetting", {
value: setting.currentModel,
key2: "defaultModel",
});

this.handle.getUserAccessKey({
// this.handle.getUserAccessKey({
// endPoint: setting.apiBase,
// accessKey: key,
// keyType: key.startsWith("DC") ? "DevChat" : "OpenAi",
// });

this.executeHandlers("getUserAccessKey", {
endPoint: setting.apiBase,
accessKey: key,
keyType: key.startsWith("DC") ? "DevChat" : "OpenAi",
});
this.handle.getSetting({

// this.handle.getSetting({
// value: setting.language,
// key2: "Language",
// });

this.executeHandlers("getSetting", {
value: setting.language,
key2: "Language",
});
}

resviceAccessKey(res: string = "") {
const params = {
endPoint: "",
accessKey: res,
keyType: res.startsWith("DC") ? "DevChat" : "OpenAi",
};
this.handle.getUserAccessKey(params);
}

resviceCommandList(res) {
const result = res.payload.commands.map((item) => ({
name: item.name,
pattern: item.name,
description: item.description,
}));
this.handle.regCommandList({
// this.handle.regCommandList({
// result,
// });
this.executeHandlers("regCommandList", {
result,
});
}

resviceContextList(res) {
// 接受到的上下文列表

const result = res.payload.contexts.map((item) => ({
name: item.command,
pattern: item.command,
description: item.description,
}));

this.handle.regContextList({ result });
// this.handle.regContextList({ result });
this.executeHandlers("regContextList", {
result,
});
}

resviceModelList(response: any) {
// 接受到模型列表
this.handle["regModelList"]({
// this.handle["regModelList"]({
// result: response.payload.models,
// });
this.executeHandlers("regModelList", {
result: response.payload.models,
});
}

resviceMessage(response: any) {
console.log(
"response.metadata.isFinalChunk: ",
response.metadata.isFinalChunk
);
// 接受到消息
if (response.metadata?.isFinalChunk) {
// 结束对话
this.handle["receiveMessage"]({
// this.handle["receiveMessage"]({
// text: response.payload?.message || response.metadata?.error || "",
// isError: response.metadata?.error.length > 0,
// hash: response.payload?.promptHash || "",
// });
this.executeHandlers("receiveMessage", {
text: response.payload?.message || response.metadata?.error || "",
isError: response.metadata?.error.length > 0,
hash: response.payload?.promptHash || "",
});
} else {
this.handle["receiveMessagePartial"]({
// this.handle["receiveMessagePartial"]({
// text: response?.payload?.message || "",
// });
this.executeHandlers("receiveMessagePartial", {
text: response?.payload?.message || "",
});
}
Expand All @@ -482,8 +504,18 @@ class IdeaBridge {
}

registerHandler(messageType: string, handler: any) {
// 注册回调函数
this.handle[messageType] = handler;
if (!this.handle[messageType]) {
this.handle[messageType] = [];
}
this.handle[messageType].push(handler);
}

executeHandlers(messageType: string, data: any) {
if (this.handle[messageType]) {
this.handle[messageType].forEach((handler) => {
handler(data);
});
}
}

sendMessage(message: any) {
Expand Down
24 changes: 21 additions & 3 deletions src/views/App.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,32 @@
import * as React from "react";
import { AppShell } from "@mantine/core";
import { AppShell, LoadingOverlay } from "@mantine/core";
import ChatPanel from "@/views/pages/ChatPanel";
import Head from "@/views/components/Header";
import "./App.css";
import "./i18n";

export default function App() {
const [ready, setReady] = React.useState(false);

React.useEffect(() => {
if (process.env.platform === "vscode") {
setReady(true);
return;
}
const checkReady = () => {
console.log("window.JSJavaBridge: ", window.JSJavaBridge);
if (window.JSJavaBridge) {
setReady(true);
} else {
setTimeout(checkReady, 200);
}
};
checkReady();
}, []);

return (
<AppShell
header={<Head />}
header={ready ? <Head /> : <div></div>}
styles={{
main: {
padding: "40px 0 0 0",
Expand All @@ -17,7 +35,7 @@ export default function App() {
},
}}
>
<ChatPanel />
{ready ? <ChatPanel /> : <LoadingOverlay visible />}
</AppShell>
);
}
3 changes: 1 addition & 2 deletions src/views/components/BalanceTip/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,7 @@ export default function WechatTip() {
messageUtil.registerHandler(
"getUserAccessKey",
(message: { endPoint: string; accessKey: string; keyType: string }) => {
console.log("message: ", message);
if (message.keyType === "DevChat" && message.accessKey) {
if (message.accessKey) {
if (message.endPoint.includes("api-test.devchat.ai")) {
setEnv("dev");
} else {
Expand Down
1 change: 1 addition & 0 deletions src/views/components/Header/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ export default function Head() {
messageUtil.registerHandler(
"getSetting",
(data: { key2: string; value: string }) => {
console.log("data: ", data);
if (data.key2 === "Language") {
if (data.value && data.value.toLocaleLowerCase() === "en") {
i18n.changeLanguage("en");
Expand Down
4 changes: 2 additions & 2 deletions src/views/components/InputMessage/Topic.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ export default function Topic({ styleName }) {
messageUtil.sendMessage({
command: "listTopics",
});
messageUtil.registerHandler("listTopics", (data) => {
setTopicList(data);
messageUtil.registerHandler("listTopics", ({ list }: { list: any }) => {
setTopicList(list);
});
}, []);

Expand Down
47 changes: 20 additions & 27 deletions src/views/components/MessageMarkdown/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ const MessageMarkdown = observer((props: MessageMarkdownProps) => {
const platform = process.env.platform;

const handleExplain = (value: string | undefined) => {
console.log(value);
switch (value) {
case "#ask_code":
chat.addMessages([
Expand Down Expand Up @@ -114,21 +113,6 @@ Use this DevChat workflow to request code writing. Please input your specific re
}),
]);
break;
case "#commit_message":
chat.addMessages([
Message.create({
type: "user",
message: "Explain /commit_message",
}),
Message.create({
type: "bot",
message: `***/commit_message***

Use this DevChat workflow to request a commit message. Generally, you don't need to type anything else, but please give me the output of \`git diff\`. Of course, you don't need to manually execute the command and copy & paste its output. Simply click the "+" button and select \`git diff —cached\` to include only the staged changes, or \`git diff HEAD\` to include all changes.
`,
}),
]);
break;
case "#release_note":
chat.addMessages([
Message.create({
Expand Down Expand Up @@ -239,24 +223,33 @@ Generate a professionally written and formatted release note in markdown with th
if (children.includes("You can configure DevChat from")) {
return t("devchat.help");
}
// DevChat key is missing from your environment or settings
if (
children.includes("DevChat key is missing from your environment ")
children.includes(
"Devchat key is missing from your environment or settings"
)
) {
return t("devchat.setkey");
}
if (
children.includes(
"OPENAI_API_KEY is missing from your environment or settings"
"DevChat intelligently navigates your codebase using GPT-4."
)
) {
// vscode 用
if (children.includes("Set OpenAI key")) {
return t("devchat.setOpenAIkey");
} else {
// idea 用
return t("devchat.setkey");
}
return t("ask-code-explain");
}
if (
children.includes(
"Use this DevChat workflow to request code writing. Please input your specific requirement"
)
) {
return t("code-explain");
}
if (
children.includes(
"Generate a professionally written and formatted release note in markdown with this workflow. I just need some basic information"
)
) {
return t("note-explain");
}
}
}
Expand Down Expand Up @@ -323,7 +316,7 @@ Generate a professionally written and formatted release note in markdown with th
if (lanugage === "step" || lanugage === "Step") {
const status =
activeStep &&
Number(index) === codes.length - 1 &&
Number(index) === codes.length &&
lastNode.type === "code"
? "running"
: "done";
Expand Down
13 changes: 9 additions & 4 deletions src/views/i18n/zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,19 @@
"Ask DevChat a question or type ‘/’ for workflow": "向 DevChat 直接提问或输入 '/' 以查看可用的工作流",
"How do I use DevChat?": "如何使用 DevChat?",
"balance": "你的账户余额为 {{formatedCurrency}},登录 <4>web.devchat.ai</4> 获得更多 tokens",
"devchat.help": "你想生成一些代码还是对这个项目有疑问?请首先右键单击相关的文件或代码片段,将它们添加到 DevChat 中作为上下文,然后在输入框中写下你的请求或问题,我将基于添加的上下文生成代码或回答你的问题。<br> <br> 你还可以点击输入框左侧的“+”按钮,查看更多添加上下文的快捷方法。此外,在输入框中键入“/”,DevChat 会列出可供使用的各类工作流,按 Tab 键或输入完整命令触发你需要的工作流。聊天愉快! <br> <br>下面是一些工作流的示例:<br> <br> [/code: 基于你的提示词和上下文生成代码](#code) <br> <br> [/commit_message: 根据加入上下文中的代码变更生成提交消息](#commit_message) <br> <br> [/release_note: 根据加入上下文中的提交历史生成提交说明](#release_note) <br> <br> [/ask-code: 询问任何关于当前代码库的信息,并从这位人工智能代理那里获得答案](#ask_code) <br> <br>你可以点击[设置](#settings)来配置 DevChat",
"devchat.setkey": "你的环境或设置中缺少 DevChat 访问密钥。请输入你的 DevChat 访问密钥,这样我就可以开始正常工作了。<br> <br> <button value=\"get_devchat_key\" href=\"https://web.devchat.ai\" component=\"a\">注册获取 DevChat 访问密钥</button> <button value=\"setting_devchat_key\">设置 DevChat 访问密钥</button>",
"devchat.setOpenAIkey": "你的环境或设置中缺少 OpenAI 访问密钥。请输入你的 OpenAI 或者 DevChat 访问密钥,这样我就可以开始正常工作了。<br> <br> <button value=\"get_devchat_key\" href=\"https://web.devchat.ai\" component=\"a\">注册获取 DevChat 密钥</button> <button value=\"setting_devchat_key\">设置 DevChat 密钥</button> <button value=\"setting_devchat_key\">设置 OpenAI 密钥</button>",
"devchat.help": "你想生成一些代码还是对这个项目有疑问?请首先右键单击相关的文件或代码片段,将它们添加到 DevChat 中作为上下文,然后在输入框中写下你的请求或问题,我将基于添加的上下文生成代码或回答你的问题。<br> <br> 你还可以点击输入框左侧的“+”按钮,查看更多添加上下文的快捷方法。此外,在输入框中键入“/”,DevChat 会列出可供使用的各类工作流,按 Tab 键或输入完整命令触发你需要的工作流。聊天愉快! <br> <br>下面是一些工作流的示例:<br> <br> [/code: 基于你的提示词和上下文生成代码](#code) <br> <br> [/release_note: 根据加入上下文中的提交历史生成提交说明](#release_note) <br> <br> [/ask-code: 询问任何关于当前代码库的信息,并从这位人工智能代理那里获得答案](#ask_code) <br> <br>你可以点击[设置](#settings)来配置 DevChat",
"devchat.setkey": "你的环境或设置中缺少 DevChat 访问密钥。请输入你的 DevChat 访问密钥,这样我就可以开始正常工作了。<br> <br> <button value=\"get_devchat_key\">注册获取 DevChat 访问密钥</button> <button value=\"setting_devchat_key\">设置 DevChat 访问密钥</button>",
"Is DevChat Access Key ready?": "DevChat 访问密钥是否已经设置好?",
"Ask questions about the current project's codebase, which requires proactive acquisition of additional context information to answer.": "询问关于当前项目代码库的问题,我将主动获取相关的上下文信息来回答。",
"Generate code with a general template embedded into the prompt.": "使用隐式嵌入到提示词中的通用模板生成代码。",
"Generate code with a Python-specific template embedded into the prompt.": "使用隐式嵌入到提示词中的 Python 特定模板生成代码。",
"commit changes with commit message in english.": "选择要提交的代码变更,总结英文提交消息,并提交到代码库。",
"Generate a commit message for the given git diff.": "为给定的 git diff 生成提交消息。",
"Generate a release note for the given commit log.": "为给定的提交日志生成发布说明。"
"Generate a release note for the given commit log.": "为给定的提交日志生成发布说明。",
"Explain /ask-code": "解释 /ask-code",
"ask-code-explain": "向我们的 AI 代理提出有关您代码库的任何问题,并获得答案。<br> <br>DevChat 利用 GPT-4 智能地导航您的代码库。它会自动选择和分析最多十个与您的问题最相关的源文件来提供答案。敬请期待 — 我们即将整合更高效的 LLama 2 - 70B 模型。<br> <br> 示例问题:<br> -为什么更改的引导时间有时会显示为 null?<br> -store.findAllAccounts 是如何实现的?<br> -当前的递归检索器会丢弃所有 TextNodes,只查询 IndexNodes。这是一个 bug。我们该如何修复它?",
"Explain /release_note": "解释 /release_note",
"note-explain": "使用这个工作流程,您可以生成专业的、格式化的发布说明(markdown格式)。我只需要关于本次发布的提交的一些基本信息。通过点击“+”按钮并选择 git_log_releasenote 将这些信息添加到上下文中。如果提交的范围与默认命令不同,您还可以选择 <custom command> 并输入如 git log 579398b^..HEAD --pretty=format:\"%h - %B\" 的命令行来包含从提交 579398b(包括此提交)到最新提交的所有变更。",
"Explain /code": "解释 /code",
"code-explain": "使用 DevChat 工作流程来请求编写代码。请输入您的具体需求,并提供适当的实施上下文。您可以选择相关的代码或文件,然后右键点击“添加到 DevChat”。如果您发现上下文仍然不足以解释清楚,您可以通过提供所选代码的类/函数定义来增强我对您代码的理解。要做到这一点,请点击所选代码旁边的“+”按钮,然后选择“符号定义”。请注意,这些信息显示在 DevChat 中可能需要几秒钟时间。"
}
1 change: 1 addition & 0 deletions src/views/pages/ChatPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ const chatPanel = observer(() => {
messageUtil.registerHandler(
"getSetting",
(message: { value: string; key2: string }) => {
console.log("message: ", message);
if (message.key2 === "defaultModel") {
chat.changeChatModel(message.value);
}
Expand Down
Loading