From 9a8d5ca0385bc4f38d6c4346ea7ad6e27c11e2aa Mon Sep 17 00:00:00 2001
From: smallstone <>
Date: Wed, 27 Dec 2023 16:35:38 +0800
Subject: [PATCH] Remove unused files and code
---
babel.config.js | 3 -
gui | 2 +-
package.json | 24 -
src/index.html | 21 -
src/index.tsx | 45 --
src/main.html | 19 -
src/util/MessageUtil.ts | 77 ---
src/util/bridge.md | 70 ---
src/util/ideaBridge.ts | 487 ----------------
src/views/App.css | 12 -
src/views/App.tsx | 26 -
src/views/components/BalanceTip/index.tsx | 159 ------
src/views/components/ChatIcons/index.tsx | 69 ---
src/views/components/ChatMark/index.tsx | 286 ----------
src/views/components/CurrentMessage/index.tsx | 95 ----
src/views/components/Header/index.tsx | 56 --
.../components/InputMessage/InputContexts.tsx | 101 ----
src/views/components/InputMessage/Topic.tsx | 111 ----
src/views/components/InputMessage/index.tsx | 522 ------------------
.../MessageAvatar/avatar_devchat.svg | 14 -
.../MessageAvatar/avatar_spaceman.png | Bin 107798 -> 0 bytes
.../components/MessageAvatar/avatar_user.svg | 9 -
src/views/components/MessageAvatar/index.tsx | 111 ----
src/views/components/MessageBody/index.tsx | 48 --
src/views/components/MessageContext/index.tsx | 91 ---
src/views/components/MessageList/index.tsx | 157 ------
.../MessageMarkdown/CodeButtons.tsx | 109 ----
.../MessageMarkdown/LanguageCorner.tsx | 24 -
src/views/components/MessageMarkdown/Step.tsx | 106 ----
.../components/MessageMarkdown/index.tsx | 299 ----------
.../components/RegenerationButton/index.tsx | 43 --
src/views/components/StopButton/index.tsx | 49 --
src/views/pages/ChatPanel.tsx | 240 --------
src/views/stores/ChatStore.ts | 401 --------------
src/views/stores/InputStore.ts | 133 -----
src/views/stores/RootStore.ts | 27 -
src/welcome.html | 21 -
webpack.config.js | 113 ----
webpack.idea.config.js | 105 ----
39 files changed, 1 insertion(+), 4284 deletions(-)
delete mode 100644 babel.config.js
delete mode 100644 src/index.html
delete mode 100644 src/index.tsx
delete mode 100644 src/main.html
delete mode 100644 src/util/MessageUtil.ts
delete mode 100644 src/util/bridge.md
delete mode 100644 src/util/ideaBridge.ts
delete mode 100644 src/views/App.css
delete mode 100644 src/views/App.tsx
delete mode 100644 src/views/components/BalanceTip/index.tsx
delete mode 100644 src/views/components/ChatIcons/index.tsx
delete mode 100644 src/views/components/ChatMark/index.tsx
delete mode 100644 src/views/components/CurrentMessage/index.tsx
delete mode 100644 src/views/components/Header/index.tsx
delete mode 100644 src/views/components/InputMessage/InputContexts.tsx
delete mode 100644 src/views/components/InputMessage/Topic.tsx
delete mode 100644 src/views/components/InputMessage/index.tsx
delete mode 100644 src/views/components/MessageAvatar/avatar_devchat.svg
delete mode 100644 src/views/components/MessageAvatar/avatar_spaceman.png
delete mode 100644 src/views/components/MessageAvatar/avatar_user.svg
delete mode 100644 src/views/components/MessageAvatar/index.tsx
delete mode 100644 src/views/components/MessageBody/index.tsx
delete mode 100644 src/views/components/MessageContext/index.tsx
delete mode 100644 src/views/components/MessageList/index.tsx
delete mode 100644 src/views/components/MessageMarkdown/CodeButtons.tsx
delete mode 100644 src/views/components/MessageMarkdown/LanguageCorner.tsx
delete mode 100644 src/views/components/MessageMarkdown/Step.tsx
delete mode 100644 src/views/components/MessageMarkdown/index.tsx
delete mode 100644 src/views/components/RegenerationButton/index.tsx
delete mode 100644 src/views/components/StopButton/index.tsx
delete mode 100644 src/views/pages/ChatPanel.tsx
delete mode 100644 src/views/stores/ChatStore.ts
delete mode 100644 src/views/stores/InputStore.ts
delete mode 100644 src/views/stores/RootStore.ts
delete mode 100644 src/welcome.html
delete mode 100644 webpack.idea.config.js
diff --git a/babel.config.js b/babel.config.js
deleted file mode 100644
index 557f8d2..0000000
--- a/babel.config.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
- presets: ['@babel/preset-env', '@babel/preset-react'],
-};
diff --git a/gui b/gui
index 46aca68..a660eee 160000
--- a/gui
+++ b/gui
@@ -1 +1 @@
-Subproject commit 46aca6809f49bf51f92ab4fcf27f614e5edc8207
+Subproject commit a660eee25f73c81d0f9353462655853cbf5abc3a
diff --git a/package.json b/package.json
index 5b2d228..fb993bc 100644
--- a/package.json
+++ b/package.json
@@ -825,8 +825,6 @@
},
"devDependencies": {
"@babel/core": "^7.21.8",
- "@babel/preset-env": "^7.21.5",
- "@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.5",
"@types/chai": "^4.3.5",
"@types/glob": "^8.1.0",
@@ -835,8 +833,6 @@
"@types/ncp": "^2.0.5",
"@types/node": "16.x",
"@types/proxyquire": "^1.3.28",
- "@types/react-dom": "^18.2.3",
- "@types/react-syntax-highlighter": "^15.5.6",
"@types/shell-escape": "^0.2.1",
"@types/sinon": "^10.0.15",
"@types/uuid": "^9.0.1",
@@ -847,7 +843,6 @@
"babel-loader": "^9.1.2",
"chai": "^4.3.7",
"copy-webpack-plugin": "^11.0.0",
- "css-loader": "^6.7.3",
"dotenv": "^16.0.3",
"eslint": "^8.36.0",
"file-loader": "^6.2.0",
@@ -858,31 +853,19 @@
"mocha": "^10.2.0",
"mock-fs": "^5.2.0",
"proxyquire": "^2.1.3",
- "react": "^18.2.0",
- "react-dom": "^18.2.0",
"sinon": "^15.1.0",
- "style-loader": "^3.3.2",
"ts-jest": "^29.1.0",
"ts-loader": "^9.4.2",
"ts-node": "^10.9.1",
"typescript": "^4.9.5",
- "url-loader": "^4.1.1",
"vscode-test": "^1.6.1",
"webpack": "^5.76.3",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.13.3"
},
"dependencies": {
- "@emotion/react": "^11.10.8",
- "@mantine/core": "^6.0.10",
- "@mantine/dropzone": "^6.0.10",
- "@mantine/hooks": "^6.0.10",
- "@mantine/prism": "^6.0.10",
- "@mantine/tiptap": "^6.0.10",
- "@tabler/icons-react": "^2.17.0",
"@tiptap/extension-link": "^2.0.3",
"@tiptap/pm": "^2.0.0",
- "@tiptap/react": "^2.0.3",
"@tiptap/starter-kit": "^2.0.3",
"axios": "^1.3.6",
"clean-webpack-plugin": "^4.0.0",
@@ -890,17 +873,10 @@
"dotenv": "^16.0.3",
"js-yaml": "^4.1.0",
"mdast": "^3.0.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.1.0",
- "mobx": "^6.10.0",
- "mobx-react": "^9.0.0",
- "mobx-state-tree": "^5.1.8",
"ncp": "^2.0.0",
"node-fetch": "^3.3.1",
"nonce": "^1.0.4",
"quote": "^0.4.0",
- "react-markdown": "^8.0.7",
- "react-syntax-highlighter": "^15.5.0",
"rehype-raw": "^6.1.1",
"shell-escape": "^0.2.0",
"string-argv": "^0.3.2",
diff --git a/src/index.html b/src/index.html
deleted file mode 100644
index 923b3cb..0000000
--- a/src/index.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
- DevChat
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/index.tsx b/src/index.tsx
deleted file mode 100644
index 1065339..0000000
--- a/src/index.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import * as React from 'react';
-import { createRoot } from 'react-dom/client';
-import { MantineProvider, MantineThemeOverride } from '@mantine/core';
-import { Provider, rootStore } from '@/views/stores/RootStore';
-import App from '@/views/App';
-
-const container = document.getElementById('app')!;
-const root = createRoot(container); // createRoot(container!) if you use TypeScript
-const myTheme: MantineThemeOverride = {
- fontFamily: 'var(--vscode-editor-font-family)',
- colors: {
- "merico":[
- "#F9F5F4",
- "#EADAD6",
- "#E1C0B6",
- "#DEA594",
- "#E1886F",
- "#ED6A45",
- "#D75E3C",
- "#BD573B",
- "#9F5541",
- "#865143",
- ],
- },
- primaryColor: 'merico',
- components: {
- Text: {
- styles: {
- root:{
- fontSize: 'var(--vscode-editor-font-size)',
- }
- }
- },
- },
-};
-
-
-root.render(
-
-
-
-
-
-);
diff --git a/src/main.html b/src/main.html
deleted file mode 100644
index c8c08f5..0000000
--- a/src/main.html
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
- DevChat
-
-
-
-
-
-
-
-
-
diff --git a/src/util/MessageUtil.ts b/src/util/MessageUtil.ts
deleted file mode 100644
index df83656..0000000
--- a/src/util/MessageUtil.ts
+++ /dev/null
@@ -1,77 +0,0 @@
-import IdeaBridge from "./ideaBridge";
-
-class MessageUtil {
- private static instance: MessageUtil;
-
- handlers: { [x: string]: any };
- vscodeApi: any;
- messageListener: any;
-
- constructor() {
- this.handlers = {};
- this.messageListener = null;
- if (process.env.platform === "vscode") {
- this.vscodeApi = window.acquireVsCodeApi();
- }
-
- if (!this.messageListener) {
- this.messageListener = (event: { data: any }) => {
- const message = event.data;
- this.handleMessage(message);
- };
- window.addEventListener("message", this.messageListener);
- } else {
- console.log("Message listener has already been bound.");
- }
- }
-
- public static getInstance(): MessageUtil {
- if (!MessageUtil.instance) {
- MessageUtil.instance = new MessageUtil();
- }
- return MessageUtil.instance;
- }
-
- // Register a message handler for a specific message type
- registerHandler(messageType: string, handler: any) {
- if (process.env.platform === "idea") {
- IdeaBridge.registerHandler(messageType, handler);
- } else {
- if (!this.handlers[messageType]) {
- this.handlers[messageType] = [];
- }
- this.handlers[messageType].push(handler);
- }
- }
-
- // Unregister a message handler for a specific message type
- unregisterHandler(messageType: string | number, handler: any) {
- if (this.handlers[messageType]) {
- this.handlers[messageType] = this.handlers[messageType].filter(
- (h: any) => h !== handler
- );
- }
- }
-
- // Handle a received message
- handleMessage(message: { command: string | number }) {
- const handlers = this.handlers[message.command];
- if (handlers) {
- handlers.forEach((handler: (arg0: { command: string | number }) => any) =>
- handler(message)
- );
- }
- }
-
- // Send a message to the VSCode API
- sendMessage(message: any) {
- if (process.env.platform === "idea") {
- IdeaBridge.sendMessage(message);
- } else {
- this.vscodeApi.postMessage(message);
- }
- }
-}
-
-// Export the MessageUtil class as a module
-export default MessageUtil.getInstance();
diff --git a/src/util/bridge.md b/src/util/bridge.md
deleted file mode 100644
index 78a9240..0000000
--- a/src/util/bridge.md
+++ /dev/null
@@ -1,70 +0,0 @@
-## sendMessage
-
-- getUserAccessKey // 获取 access key
-- doCommit // 提交代码
-- updateSetting // 更新设置(目前只有更换模型)
-- getSetting // 获取默认模型
-- deleteChatMessage // 删除最近一条消息
-- show_diff // 调用 editor 代码对比
- -- later --
-- stopDevChat // 停止生成
-- doCommand //
- -- content
- // 1. 打开设置
- // 2. 启动 ask code 安装
- // 3. 设置 access key
-- featureToggles ??
-- isDevChatInstalled // 判断 ask code 是否安装
-
-- historyMessages // 页面的历史消息
-- contextDetail // 获取 appendContext 响应之后,发送次请求获取文件的内容
-- addContext // 点击 context 菜单(比如 git diff)之后发送到消息
-- code_file_apply // 代码应用到 editor,替换 current file
-- code_apply // 代码应用到 editor 光标位置
-- sendMessage // 发送消息
-- regeneration // 错误时重新生成
-- regContextList // git diff 之类的列表
-- regModelList // model 列表
-- regCommandList // 输入 / 之后出现的列表
-
-## registerHandler
-
-- getUserAccessKey // 获取 access key
-- regCommandList // 获取 / 之后出现的列表
-- appendContext // 右键添加到 context 或者 context 菜单点击的响应
-- contextDetailResponse // 获取到的文件内容
-- loadHistoryMessages // 与 historyMessages 对应
-- isDevChatInstalled // 与 isDevChatInstalled 对应
-- deletedChatMessage // 与 deleteChatMessage 对应
-- regContextList // 与 regContextList 对应
-- regModelList // 与 regModelList
-- receiveMessagePartial // 部分对话
-- receiveMessage // 对话
-- systemMessage // 没用了
-
-# css
-
---vscode-editor-font-familyy
---vscode-editor-font-size
---vscode-dropdown-background
---vscode-dropdown-border
---vscode-foreground
---vscode-sideBar-background
---vscode-dropdown-foreground
---vscode-menu-foreground
---vscode-commandCenter-activeForeground
---vscode-commandCenter-activeBackground
---vscode-menu-border
---vscode-menu-background
---vscode-commandCenter-border
---vscode-editor-foreground
---vscode-input-background
---vscode-input-border
---vscode-input-foreground
---vscode-disabledForeground
---vscode-toolbar-activeBackground
-
-1. 请求 loadHistoryMessages 根据全局 id 返回空/对应的消息
- 1.1. 参数只有分页
-2. 请求 loadConversations,用于切换全局的 id
- 2.1 loadConversations 的响应里,请求 1
diff --git a/src/util/ideaBridge.ts b/src/util/ideaBridge.ts
deleted file mode 100644
index b8c0fb7..0000000
--- a/src/util/ideaBridge.ts
+++ /dev/null
@@ -1,487 +0,0 @@
-const JStoIdea = {
- sendMessage: (message: string, context: any = [], parent: string = "") => {
- const paramsContext: any = [];
- if (Array.isArray(context) && context.length > 0) {
- context.forEach((item) => {
- paramsContext.push({
- type: "code",
- ...item.context,
- });
- });
- }
- const params = {
- action: "sendMessage/request",
- metadata: {
- callback: "IdeaToJSMessage",
- parent: parent,
- },
- payload: {
- contexts: paramsContext,
- message: message,
- },
- };
- console.log("ready to send message: ", params);
- window.JSJavaBridge.callJava(JSON.stringify(params));
- },
- getModel: () => {
- const params = {
- action: "listModels/request",
- metadata: {
- callback: "IdeaToJSMessage",
- },
- payload: {},
- };
- window.JSJavaBridge.callJava(JSON.stringify(params));
- },
- getContextList: () => {
- const params = {
- action: "listContexts/request",
- metadata: {
- callback: "IdeaToJSMessage",
- },
- payload: {},
- };
-
- window.JSJavaBridge.callJava(JSON.stringify(params));
- },
- getCommandList: () => {
- const params = {
- action: "listCommands/request",
- metadata: {
- callback: "IdeaToJSMessage",
- },
- payload: {},
- };
-
- window.JSJavaBridge.callJava(JSON.stringify(params));
- },
- insertCode: (code) => {
- const params = {
- action: "insertCode/request",
- metadata: {
- callback: "IdeaToJSMessage",
- },
- payload: {
- content: code,
- },
- };
-
- window.JSJavaBridge.callJava(JSON.stringify(params));
- },
- replaceFileContent: (code) => {
- const params = {
- action: "replaceFileContent/request",
- metadata: {
- callback: "IdeaToJSMessage",
- },
- payload: {
- content: code,
- },
- };
-
- window.JSJavaBridge.callJava(JSON.stringify(params));
- },
- viewDiff: (code) => {
- const params = {
- action: "viewDiff/request",
- metadata: {
- callback: "IdeaToJSMessage",
- },
- payload: {
- content: code,
- },
- };
-
- window.JSJavaBridge.callJava(JSON.stringify(params));
- },
- getUserAccessKey: () => {
- // 这里需要发送一个请求,获取完整的用户设置
- const params = {
- action: "getSetting/request",
- metadata: {
- callback: "IdeaToJSMessage",
- },
- payload: {},
- };
- window.JSJavaBridge.callJava(JSON.stringify(params));
- },
- etcCommand: (command: any) => {
- /**
- * 有四种命令
- * 1. workbench.action.openSettings
- * 2. AskCodeIndexStart
- * 3. AccessKey.OpenAI
- * 4. AccessKey.DevChat
- */
- const content = Array.isArray(command.content) ? command.content[0] : "";
- switch (content) {
- case "workbench.action.openSettings":
- // 打开设置
- const params = {
- action: "showSettingDialog/request",
- metadata: {
- callback: "IdeaToJSMessage",
- },
- payload: {},
- };
-
- window.JSJavaBridge.callJava(JSON.stringify(params));
- break;
- case "AccessKey.DevChat":
- // 设置key
- break;
- default:
- break;
- }
- },
- getTopicList: () => {
- // 获取 topic 列表
- const params = {
- action: "listTopics/request",
- metadata: {
- callback: "IdeaToJSMessage",
- },
- payload: {},
- };
-
- window.JSJavaBridge.callJava(JSON.stringify(params));
- },
- updateSetting: (value: string) => {
- // 因为现在只有更换模型,所以直接取 value
- const params = {
- action: "updateSetting/request",
- metadata: {
- callback: "IdeaToJSMessage",
- },
- payload: {
- setting: {
- currentModel: value,
- },
- },
- };
- window.JSJavaBridge.callJava(JSON.stringify(params));
- },
- commit: (code: string) => {
- const params = {
- action: "commitCode/request",
- metadata: {
- callback: "IdeaToJSMessage",
- },
- payload: {
- message: code,
- },
- };
- window.JSJavaBridge.callJava(JSON.stringify(params));
- },
- getTopicDetail: (topicHash: string) => {
- const params = {
- action: "loadConversations/request",
- metadata: {
- callback: "IdeaToJSMessage",
- topicHash: topicHash,
- },
- payload: {},
- };
-
- 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));
- },
-};
-
-class IdeaBridge {
- private static instance: IdeaBridge;
- handle: any = {};
-
- constructor() {
- this.handle = {};
- // 注册全局的回调函数,用于接收来自IDEA的消息
- window.IdeaToJSMessage = (res: any) => {
- 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;
- case "listModels/response":
- this.resviceModelList(res);
- break;
- case "listContexts/response":
- this.resviceContextList(res);
- break;
- 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;
- case "getSetting/response":
- this.resviceSettings(res);
- break;
- case "listTopics/response":
- this.resviceTopicList(res);
- break;
- case "loadConversations/response":
- this.resviceTopicDetail(res);
- break;
- default:
- break;
- }
- };
- }
-
- 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) {
- const list = res.payload.topics;
- this.handle.listTopics(list);
- }
-
- resviesContext(res) {
- const params = {
- file: res.payload.path,
- result: "",
- };
- const contextObj = {
- path: res.payload.path,
- content: res.payload.content,
- command: "",
- };
- params.result = JSON.stringify(contextObj);
- this.handle.contextDetailResponse(params);
- }
-
- resviceSettings(res) {
- // 用户设置的回调
- const setting = res.payload.setting;
-
- // 当前的默认模型
- this.handle.getSetting({
- value: setting.currentModel,
- });
- this.handle.getUserAccessKey({
- endPoint: setting.apiBase,
- accessKey: setting.apiKey,
- keyType: setting.apiKey.startsWith("DC") ? "DevChat" : "OpenAi",
- });
- }
-
- 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({
- result,
- });
- }
-
- resviceContextList(res) {
- // 接受到的上下文列表
-
- const result = res.payload.contexts.map((item) => ({
- name: item.command,
- pattern: item.command,
- description: item.description,
- }));
-
- this.handle.regContextList({ result });
- }
-
- resviceModelList(response: any) {
- // 接受到模型列表
- this.handle["regModelList"]({
- result: response.payload.models,
- });
- }
-
- resviceMessage(response: any) {
- console.log(
- "response.metadata.isFinalChunk: ",
- 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 || "",
- });
- } else {
- this.handle["receiveMessagePartial"]({
- text: response?.payload?.message || "",
- });
- }
- }
-
- public static getInstance(): IdeaBridge {
- if (!IdeaBridge.instance) {
- IdeaBridge.instance = new IdeaBridge();
- }
- return IdeaBridge.instance;
- }
-
- registerHandler(messageType: string, handler: any) {
- // 注册回调函数
- this.handle[messageType] = handler;
- }
-
- sendMessage(message: any) {
- // 根据 command 分发到不同的方法·
- switch (message.command) {
- // 发送消息
- case "sendMessage":
- JStoIdea.sendMessage(
- message.text,
- message.contextInfo,
- message.parent_hash
- );
- break;
- // 重新生成消息,用于发送失败时再次发送
- case "regeneration":
- JStoIdea.sendMessage(message.text, message.context, message.parent);
- break;
- // 请求 model 列表
- case "regModelList":
- JStoIdea.getModel();
- break;
- case "regContextList":
- JStoIdea.getContextList();
- break;
- case "regCommandList":
- JStoIdea.getCommandList();
- break;
- case "code_apply":
- JStoIdea.insertCode(message.content);
- break;
- case "code_file_apply":
- JStoIdea.replaceFileContent(message.content);
- break;
- case "getUserAccessKey":
- JStoIdea.getUserAccessKey();
- break;
- case "doCommand":
- JStoIdea.etcCommand(message);
- break;
- case "show_diff":
- JStoIdea.viewDiff(message.content);
- break;
- case "updateSetting":
- JStoIdea.updateSetting(message.value);
- break;
- case "doCommit":
- JStoIdea.commit(message.content);
- break;
- case "listTopics":
- JStoIdea.getTopicList();
- break;
- 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;
- }
- }
-}
-
-export default IdeaBridge.getInstance();
diff --git a/src/views/App.css b/src/views/App.css
deleted file mode 100644
index cd76a5f..0000000
--- a/src/views/App.css
+++ /dev/null
@@ -1,12 +0,0 @@
-::-webkit-scrollbar {
- background-color: transparent;
- width: 6px;
- height: 6px;
-}
-::-webkit-scrollbar-track {
- background-color: transparent;
-}
-::-webkit-scrollbar-thumb {
- background-color: grey;
- border-radius: 6px;
-}
diff --git a/src/views/App.tsx b/src/views/App.tsx
deleted file mode 100644
index 4b4ab1b..0000000
--- a/src/views/App.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import * as React from 'react';
-import {
- AppShell,
- useMantineTheme,
-} from '@mantine/core';
-import ChatPanel from '@/views/pages/ChatPanel';
-import Head from '@/views/components/Header';
-import './App.css';
-
-export default function App() {
- const theme = useMantineTheme();
- return (
- }
- styles={{
- main: {
- padding:'40px 0 0 0',
- fontFamily: 'var(--vscode-editor-font-family)',
- fontSize: 'var(--vscode-editor-font-size)',
- },
- }}
- >
-
-
- );
-}
\ No newline at end of file
diff --git a/src/views/components/BalanceTip/index.tsx b/src/views/components/BalanceTip/index.tsx
deleted file mode 100644
index 32ff195..0000000
--- a/src/views/components/BalanceTip/index.tsx
+++ /dev/null
@@ -1,159 +0,0 @@
-import React, { useEffect, useState } from "react";
-import axios from "axios";
-import messageUtil from "@/util/MessageUtil";
-import { IconWallet } from "@tabler/icons-react";
-import {
- HoverCard,
- Text,
- ActionIcon,
- Group,
- LoadingOverlay,
-} from "@mantine/core";
-
-const currencyMap = {
- USD: "$",
- RMB: "¥",
-};
-
-function formatBalance(balance: number) {
- return Math.round(balance * 1000) / 1000;
-}
-
-function formatCurrency(balance: number, currency: string) {
- return `${currencyMap[currency] || currency}${balance}`;
-}
-
-const envMap = {
- dev: {
- requestUrl: "https://apptest.devchat.ai",
- link: "https://webtest.devchat.ai",
- },
- prod: {
- requestUrl: "https://app.devchat.ai",
- link: "https://web.devchat.ai",
- },
-};
-
-// eslint-disable-next-line @typescript-eslint/naming-convention
-export default function WechatTip() {
- const [bindWechat, setBindWechat] = useState(false);
- const [balance, setBalance] = useState(null);
- const [currency, setCurrency] = useState("USD");
- const [accessKey, setAccessKey] = useState("");
- const [env, setEnv] = useState("prod");
- const [loading, setLoading] = useState(false);
- const platform = process.env.platform;
-
- const getSettings = () => {
- messageUtil.sendMessage({
- command: "getUserAccessKey",
- });
- };
-
- const getBalance = () => {
- if (!envMap[env].requestUrl || !accessKey) {
- return;
- }
- setLoading(true);
- axios
- .get(`${envMap[env].requestUrl}/api/v1/users/profile`, {
- headers: { Authorization: `Bearer ${accessKey}` },
- })
- .then((res) => {
- if (res?.data?.user?.wechat_nickname) {
- setBindWechat(true);
- }
- if (res?.data?.organization?.balance) {
- setBalance(formatBalance(res?.data?.organization?.balance));
- setCurrency(res?.data?.organization?.currency);
- }
- })
- .finally(() => {
- setLoading(false);
- });
- };
-
- useEffect(() => {
- if (env && accessKey) {
- getBalance();
- }
- }, [env, accessKey]);
-
- useEffect(() => {
- getSettings();
- messageUtil.registerHandler(
- "getUserAccessKey",
- (message: { endPoint: string; accessKey: string; keyType: string }) => {
- if (message.keyType === "DevChat" && message.accessKey) {
- if (message.endPoint.includes("api-test.devchat.ai")) {
- setEnv("dev");
- } else {
- setEnv("prod");
- }
- setAccessKey(message.accessKey);
- }
- }
- );
- }, []);
-
- const openLink = (e) => {
- e.preventDefault();
- e.stopPropagation();
- messageUtil.sendMessage({
- command: "openLink",
- url: envMap[env].link,
- });
- };
-
- if (balance === null || balance === undefined) {
- return null;
- }
-
- return (
-
-
-
-
-
-
-
- Your remaining credit is {formatCurrency(balance, currency)}. Sign
- in to{" "}
- {platform === "idea" ? (
- openLink(e)}>
- web.devchat.ai{" "}
-
- ) : (
-
- web.devchat.ai{" "}
-
- )}
- to {bindWechat ? "purchase more tokens." : "earn additional ¥8"}
-
-
-
-
-
- );
-}
diff --git a/src/views/components/ChatIcons/index.tsx b/src/views/components/ChatIcons/index.tsx
deleted file mode 100644
index c617963..0000000
--- a/src/views/components/ChatIcons/index.tsx
+++ /dev/null
@@ -1,69 +0,0 @@
-import * as React from 'react';
-
-// Create interface extending SVGProps
-export interface TablerIconsProps extends Partial, 'stroke'>> {
- size?: number,
- stroke?: number
-}
-
-export const IconMouseRightClick = (props: TablerIconsProps) => {
- const { color, size, style } = props;
- return ();
-};
-
-
-export const IconGitBranchChecked = (props: TablerIconsProps) => {
- const { color, size, style } = props;
- return ();
-};
-
-
-export const IconGitBranch = (props: TablerIconsProps) => {
- const { color, size, style } = props;
- return ();
-};
-
-export const IconShellCommand = (props: TablerIconsProps) => {
- const { color, size, style } = props;
- return ();
-};
-
-
-export const IconBook = (props: TablerIconsProps) => {
- const { color, size, style } = props;
- return ();
-};
\ No newline at end of file
diff --git a/src/views/components/ChatMark/index.tsx b/src/views/components/ChatMark/index.tsx
deleted file mode 100644
index 5e5ce42..0000000
--- a/src/views/components/ChatMark/index.tsx
+++ /dev/null
@@ -1,286 +0,0 @@
-import React, { useEffect, useState } from 'react';
-import { Box, Button, Checkbox, Text, Radio, Textarea, createStyles } from '@mantine/core';
-import { useListState, useSetState } from '@mantine/hooks';
-import { useMst } from '@/views/stores/RootStore';
-import yaml from 'js-yaml';
-
-const useStyles = createStyles((theme) => ({
- container:{
- padding:0,
- margin:0,
- },
- submit:{
- marginTop:theme.spacing.xs,
- marginRight:theme.spacing.xs,
- marginBottom:theme.spacing.xs,
- },
- cancel:{
- },
- button:{
- marginTop:theme.spacing.xs,
- marginRight:theme.spacing.xs,
- marginBottom:theme.spacing.xs,
- },
- checkbox:{
- marginTop:theme.spacing.xs,
- marginBottom:theme.spacing.xs,
- },
- label:{
- color:'var(--vscode-editor-foreground)',
- },
- radio:{
- marginTop:theme.spacing.xs,
- marginBottom:theme.spacing.xs,
- },
- editor:{
- backgroundColor: 'var(--vscode-input-background)',
- borderColor: 'var(--vscode-input-border)',
- color: 'var(--vscode-input-foreground)',
- },
- editorWrapper:{
- marginTop:theme.spacing.xs,
- marginBottom:theme.spacing.xs,
- }
- }));
-
-interface Wdiget{
- id:string,
- value:string,
- title?:string,
- type:'editor'|'checkbox'|'radio'|'button'|'text'
-}
-
-const ChatMark = ({ children,value,messageDone }) => {
- const {classes} = useStyles();
- const [widgets,widgetsHandlers] = useListState();
- const {chat} = useMst();
- const [autoForm,setAutoForm] = useState(false); // if any widget is checkbox,radio or editor wdiget, the form is auto around them
- const values = value?yaml.load(value):{};
- const [disabled,setDisabled] = useState(messageDone||!!value);
-
- const handleSubmit = () => {
- let formData = {};
- widgets.forEach((widget)=>{
- if(widget.type === 'text'
- || widget.type === 'button'
- || (widget.type === 'radio' && widget.value === 'unchecked')
- || (widget.type === 'checkbox' && widget.value === 'unchecked')){
- // ignore
- return;
- }
- formData[widget.id] = widget.value;
- });
- chat.userInput(formData);
- };
-
- const handleCancel = () => {
- chat.userInput({
- 'form':'canceled'
- });
- };
-
- const handleButtonClick = ({event,index}) => {
- const widget = widgets[index];
- widget['value'] = event.currentTarget.value;;
- widgetsHandlers.setItem(index,widget);
- chat.userInput({
- [widget['id']]:'clicked'
- });
- };
-
- const handleCheckboxChange = ({event,index})=>{
- const widget = widgets[index];
- widget['value'] = event.currentTarget.checked?'checked':'unchecked';
- widgetsHandlers.setItem(index,widget);
- };
- const handleRadioChange = ({event,allValues})=>{
- widgetsHandlers.apply((item, index) => {
- if(allValues.includes(item.id)){
- if(item.id === event){
- item.value = 'checked';
- }else{
- item.value = 'unchecked';
- }
- }
- return item;
- });
- };
- const handleEditorChange = ({event,index})=>{
- const widget = widgets[index];
- widget['value'] = event.currentTarget.value;
- widgetsHandlers.setItem(index,widget);
- };
-
- useEffect(()=>{
-
- const lines = children.split('\n');
- let detectEditorId = '';
- let editorContentRecorder = '';
-
- const textRegex = /^([^>].*)/; // Text widget
- const buttonRegex = /^>\s*\((.*?)\)\s*(.*)/; // Button widget
- const checkboxRegex = /^>\s*\[([x ]*)\]\((.*?)\)\s*(.*)/; // Checkbox widget
- const radioRegex = /^>\s*-\s*\((.*?)\)\s*(.*)/; // Radio button widget
- const editorRegex = /^>\s*\|\s*\((.*?)\)/; // Editor widget
- const editorContentRegex = /^>\s*(.*)/; // Editor widget
-
- lines.forEach((line, index) => {
-
- let match;
-
- if (match = line.match(textRegex)) {
- widgetsHandlers.append({
- id:`text${index}`,
- type:'text',
- value:line,
- });
- } else if (match = line.match(buttonRegex)) {
- const [id, title] = match.slice(1);
- widgetsHandlers.append({
- id,
- title,
- type:'button',
- value:title,
- });
- } else if (match = line.match(checkboxRegex)) {
- const [status, id, title] = match.slice(1);
- widgetsHandlers.append({
- id,
- title,
- type:'checkbox',
- value: status === 'x'?'checked':'unchecked',
- });
- setAutoForm(true);
- } else if (match = line.match(radioRegex)) {
- const [id, title] = match.slice(1);
- widgetsHandlers.append({
- id,
- title,
- type:'radio',
- value:'unchecked',
- });
- setAutoForm(true);
- } else if (match = line.match(editorRegex)) {
- const [id] = match.slice(1);
- detectEditorId = id;
- widgetsHandlers.append({
- id,
- type:'editor',
- value: '',
- });
- setAutoForm(true);
- } else if(match = line.match(editorContentRegex)){
- const [content] = match.slice(1);
- editorContentRecorder += content + '\n';
- }
- // if next line is not editor, then end current editor
- const nextLine = index + 1 < lines.length? lines[index + 1]:null;
- if (detectEditorId && (!nextLine || !nextLine.startsWith('>'))) {
- // remove last \n
- editorContentRecorder = editorContentRecorder.substring(0, editorContentRecorder.length - 1);
- // apply editor content to widget
- ((editorId,editorContent) => widgetsHandlers.apply((item)=>{
- if(item.id === editorId){
- item.value = editorContent;
- }
- return item;
- }))(detectEditorId,editorContentRecorder);
- // reset editor
- detectEditorId = '';
- editorContentRecorder = '';
- }
- });
- for (const key in values) {
- widgetsHandlers.apply((item)=>{
- if(item.id === key){
- item.value = values[key];
- }
- return item;
- });
- }
- },[]);
-
- // Render markdown widgets
- const renderWidgets = (widgets) => {
- let radioGroupTemp:any = [];
- let radioValuesTemp:any = [];
- let wdigetsTemp:any = [];
- widgets.map((widget, index) => {
- if (widget.type === 'text') {
- wdigetsTemp.push({widget.value});
- } else if (widget.type === 'button') {
- wdigetsTemp.push();
- } else if (widget.type === 'checkbox') {
- wdigetsTemp.push( handleCheckboxChange({event,index})}/>);
- } else if (widget.type === 'radio') {
- radioValuesTemp.push(widget.id);
- radioGroupTemp.push();
- // if next widget is not radio, then end current group
- const nextWidget = index + 1 < widgets.length? widgets[index + 1]:null;
- if (!nextWidget || nextWidget.type !== 'radio') {
- const radioGroup = ((radios,allValues)=> handleRadioChange({
- event,
- allValues
- })
- }>
- {radios}
- )(radioGroupTemp,radioValuesTemp);
- radioGroupTemp = [];
- radioValuesTemp = [];
- wdigetsTemp.push(radioGroup);
- }
- } else if (widget.type === 'editor') {
- wdigetsTemp.push(