Merge pull request #256 from devchat-ai/94-add-help-command

94 add help command
This commit is contained in:
Rankin Zheng 2023-08-23 19:58:44 +08:00 committed by GitHub
commit d493540e8b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 177 additions and 154 deletions

View File

@ -83,7 +83,13 @@ const InputMessage = observer((props: any) => {
} }
if ((event.key === 'Enter' || event.key === 'Tab') && !event.shiftKey) { if ((event.key === 'Enter' || event.key === 'Tab') && !event.shiftKey) {
const commandNode = commandMenusNode[currentMenuIndex]; const commandNode = commandMenusNode[currentMenuIndex];
input.setValue(`/${commandNode.props['data-pattern']} `); const commandPattern = commandNode.props['data-pattern'];
if (commandPattern === 'help') {
chat.helpMessage();
input.setValue('');
} else {
input.setValue(`/${commandPattern} `);
}
input.closeMenu(); input.closeMenu();
event.preventDefault(); event.preventDefault();
} }

View File

@ -75,169 +75,185 @@ export const ChatStore = types.model('Chat', {
isTop: false, isTop: false,
scrollBottom: 0 scrollBottom: 0
}) })
.actions(self => ({ .actions(self => {
startGenerating: (text: string, chatContexts) => {
self.generating = true;
self.responsed = false;
self.hasDone = false;
self.errorMessage = '';
self.currentMessage = '';
let lastNonEmptyHash;
for (let i = self.messages.length - 1; i >= 0; i--) {
if (self.messages[i].hash) {
lastNonEmptyHash = self.messages[i].hash;
break;
}
}
// Process and send the message to the extension
const contextInfo = chatContexts.map((item, index: number) => {
const { file, path, content, command } = item;
return {
file,
context: {
path: path,
command: command,
content: content,
}
};
});
messageUtil.sendMessage({
command: 'sendMessage',
text: text,
contextInfo: contextInfo,
parent_hash: lastNonEmptyHash === 'message' ? null : lastNonEmptyHash
});
},
startSystemMessage: () => {
self.generating = true;
self.responsed = false;
self.hasDone = false;
self.errorMessage = '';
self.currentMessage = '';
},
reGenerating: () => {
self.generating = true;
self.responsed = false;
self.hasDone = false;
self.errorMessage = '';
self.currentMessage = '';
self.messages.pop();
messageUtil.sendMessage({
command: 'regeneration'
});
},
stopGenerating: (hasDone: boolean, message: Instance<typeof Message> | Instance<typeof types.null>) => {
self.generating = false;
self.responsed = false;
self.hasDone = hasDone;
if (hasDone) {
const { hash } = message ? message : { hash: '' };
const messagesLength = self.messages.length;
if (messagesLength > 1) { const helpMessage = (originalMessage = false) => {
self.messages[messagesLength - 2].hash = hash; self.messages.push(
self.messages[messagesLength - 1].hash = hash; Message.create({
} else if (messagesLength > 0) { type: 'user',
self.messages[messagesLength - 1].hash = hash; message: originalMessage ? "How do I use DevChat?" : '/help'
} }));
} self.messages.push(
}, Message.create({
startResponsing: (message: string) => { type: 'bot',
self.responsed = true; message: `
self.currentMessage = message;
},
newMessage: (message: IMessage) => {
self.messages.push(message);
},
addMessages: (messages: IMessage[]) => {
self.messages.push(...messages);
},
updateLastMessage: (message: string) => {
if (self.messages.length > 0) {
self.messages[self.messages.length - 1].message = message;
}
},
shiftMessage: () => {
self.messages.splice(0, 1);
},
popMessage: () => {
self.messages.pop();
},
clearMessages: () => {
self.messages.length = 0;
},
happendError: (errorMessage: string) => {
self.errorMessage = errorMessage;
},
onMessagesTop: () => {
self.isTop = true;
self.isBottom = false;
},
onMessagesBottom: () => {
self.isTop = false;
self.isBottom = true;
},
onMessagesMiddle: () => {
self.isTop = false;
self.isBottom = false;
},
goScrollBottom: () => {
self.scrollBottom++;
},
fetchHistoryMessages: flow(function* (params: { pageIndex: number }) {
const { pageIndex, entries } = yield fetchHistoryMessages(params);
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.push(...messages);
} else if (self.pageIndex > 0) {
self.messages.concat(...messages);
}
} else {
self.isLastPage = true;
if (self.messages.length === 0) {
self.messages.push(
Message.create({
type: 'user',
message: "How do I use DevChat?"
}));
self.messages.push(
Message.create({
type: 'bot',
message: `
Do you want to write some code or have a question about the project? Simply right-click on your chosen files or code snippets and add them to DevChat. Feel free to ask me anything or let me help you with coding. Do you want to write some code or have a question about the project? Simply right-click on your chosen files or code snippets and add them to DevChat. Feel free to ask me anything or let me help you with coding.
Don't forget to check out the "+" button on the left of the input to add more context. To see a list of workflows you can run in the context, just type "/". Happy prompting! Don't forget to check out the "+" button on the left of the input to add more context. To see a list of workflows you can run in the context, just type "/". Happy prompting!
To get started, here are the things that DevChat can do: To get started, here are the things that DevChat can do:
[/code: write code based on your prompt](#code)
[/commit_message: write a commit message based on your code](#commit_message)
[/release_note: write the release code based on your code](#release_note)
[/ask_code: ask questions about your own codebase](#ask_code) [/ask_code: ask questions about your own codebase](#ask_code)
[/extension: create extensions for DevChat](#extension)
<button value="settings">Settings</button> <button value="settings">Settings</button>
`})); `}));
};
return {
helpMessage,
startGenerating: (text: string, chatContexts) => {
self.generating = true;
self.responsed = false;
self.hasDone = false;
self.errorMessage = '';
self.currentMessage = '';
let lastNonEmptyHash;
for (let i = self.messages.length - 1; i >= 0; i--) {
if (self.messages[i].hash) {
lastNonEmptyHash = self.messages[i].hash;
break;
}
} }
} // Process and send the message to the extension
}), const contextInfo = chatContexts.map((item, index: number) => {
deleteMessage: flow(function* (messageHash: string) { const { file, path, content, command } = item;
const { hash } = yield deleteMessage(messageHash); return {
const index = self.messages.findIndex((item: any) => item.hash === hash); file,
if (index > -1) { context: {
self.messages.splice(index); path: path,
} command: command,
}) content: content,
})); }
};
});
messageUtil.sendMessage({
command: 'sendMessage',
text: text,
contextInfo: contextInfo,
parent_hash: lastNonEmptyHash === 'message' ? null : lastNonEmptyHash
});
},
startSystemMessage: () => {
self.generating = true;
self.responsed = false;
self.hasDone = false;
self.errorMessage = '';
self.currentMessage = '';
},
reGenerating: () => {
self.generating = true;
self.responsed = false;
self.hasDone = false;
self.errorMessage = '';
self.currentMessage = '';
self.messages.pop();
messageUtil.sendMessage({
command: 'regeneration'
});
},
stopGenerating: (hasDone: boolean, message: Instance<typeof Message> | Instance<typeof types.null>) => {
self.generating = false;
self.responsed = false;
self.hasDone = hasDone;
if (hasDone) {
const { hash } = message ? message : { hash: '' };
const messagesLength = self.messages.length;
if (messagesLength > 1) {
self.messages[messagesLength - 2].hash = hash;
self.messages[messagesLength - 1].hash = hash;
} else if (messagesLength > 0) {
self.messages[messagesLength - 1].hash = hash;
}
}
},
startResponsing: (message: string) => {
self.responsed = true;
self.currentMessage = message;
},
newMessage: (message: IMessage) => {
self.messages.push(message);
},
addMessages: (messages: IMessage[]) => {
self.messages.push(...messages);
},
updateLastMessage: (message: string) => {
if (self.messages.length > 0) {
self.messages[self.messages.length - 1].message = message;
}
},
shiftMessage: () => {
self.messages.splice(0, 1);
},
popMessage: () => {
self.messages.pop();
},
clearMessages: () => {
self.messages.length = 0;
},
happendError: (errorMessage: string) => {
self.errorMessage = errorMessage;
},
onMessagesTop: () => {
self.isTop = true;
self.isBottom = false;
},
onMessagesBottom: () => {
self.isTop = false;
self.isBottom = true;
},
onMessagesMiddle: () => {
self.isTop = false;
self.isBottom = false;
},
goScrollBottom: () => {
self.scrollBottom++;
},
fetchHistoryMessages: flow(function* (params: { pageIndex: number }) {
const { pageIndex, entries } = yield fetchHistoryMessages(params);
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.push(...messages);
} else if (self.pageIndex > 0) {
self.messages.concat(...messages);
}
} else {
self.isLastPage = true;
if (self.messages.length === 0) {
helpMessage(true);
}
}
}),
deleteMessage: flow(function* (messageHash: string) {
const { hash } = yield deleteMessage(messageHash);
const index = self.messages.findIndex((item: any) => item.hash === hash);
if (index > -1) {
self.messages.splice(index);
}
})
};
});
export type IMessage = Instance<typeof Message>; export type IMessage = Instance<typeof Message>;

View File

@ -101,6 +101,7 @@ export const InputStore = types
try { try {
const items = yield regCommandMenus(); const items = yield regCommandMenus();
self.commandMenus.push(...items); self.commandMenus.push(...items);
self.commandMenus.push({ name: 'help', description: 'View the DevChat documentation.', pattern: 'help' });
} catch (error) { } catch (error) {
console.error("Failed to fetch command menus", error); console.error("Failed to fetch command menus", error);
} }