Merge pull request #256 from devchat-ai/94-add-help-command
94 add help command
This commit is contained in:
commit
d493540e8b
@ -83,7 +83,13 @@ const InputMessage = observer((props: any) => {
|
||||
}
|
||||
if ((event.key === 'Enter' || event.key === 'Tab') && !event.shiftKey) {
|
||||
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();
|
||||
event.preventDefault();
|
||||
}
|
||||
|
@ -75,169 +75,185 @@ export const ChatStore = types.model('Chat', {
|
||||
isTop: false,
|
||||
scrollBottom: 0
|
||||
})
|
||||
.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;
|
||||
.actions(self => {
|
||||
|
||||
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) {
|
||||
self.messages.push(
|
||||
Message.create({
|
||||
type: 'user',
|
||||
message: "How do I use DevChat?"
|
||||
}));
|
||||
self.messages.push(
|
||||
Message.create({
|
||||
type: 'bot',
|
||||
message: `
|
||||
const helpMessage = (originalMessage = false) => {
|
||||
self.messages.push(
|
||||
Message.create({
|
||||
type: 'user',
|
||||
message: originalMessage ? "How do I use DevChat?" : '/help'
|
||||
}));
|
||||
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.
|
||||
|
||||
|
||||
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:
|
||||
|
||||
[/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)
|
||||
|
||||
[/extension: create extensions for DevChat](#extension)
|
||||
|
||||
<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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}),
|
||||
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);
|
||||
}
|
||||
})
|
||||
}));
|
||||
// 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) {
|
||||
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>;
|
@ -101,6 +101,7 @@ export const InputStore = types
|
||||
try {
|
||||
const items = yield regCommandMenus();
|
||||
self.commandMenus.push(...items);
|
||||
self.commandMenus.push({ name: 'help', description: 'View the DevChat documentation.', pattern: 'help' });
|
||||
} catch (error) {
|
||||
console.error("Failed to fetch command menus", error);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user