
* setText command from parent window for llama-vscode now sends the message automatically. * Upgrade packages versions to fix vulnerabilities with "npm audit fix" command. * Fix code formatting. * Add index.html.gz changes. * Revert "Upgrade packages versions to fix vulnerabilities with "npm audit fix" command." This reverts commit 67687b7fda8a293724ba92ea30bb151677406bc8. * easier approach * add setTimeout --------- Co-authored-by: igardev <ivailo.gardev@akros.ch> Co-authored-by: Xuan Son Nguyen <son@huggingface.co>
63 lines
2 KiB
TypeScript
63 lines
2 KiB
TypeScript
import { useEffect, useState } from 'react';
|
|
import { MessageExtraContext } from './types';
|
|
import { ChatTextareaApi } from '../components/useChatTextarea.ts';
|
|
|
|
// Extra context when using llama.cpp WebUI from llama-vscode, inside an iframe
|
|
// Ref: https://github.com/ggml-org/llama.cpp/pull/11940
|
|
|
|
interface SetTextEvData {
|
|
text: string;
|
|
context: string;
|
|
}
|
|
|
|
/**
|
|
* To test it:
|
|
* window.postMessage({ command: 'setText', text: 'Spot the syntax error', context: 'def test()\n return 123' }, '*');
|
|
*/
|
|
|
|
export const useVSCodeContext = (textarea: ChatTextareaApi) => {
|
|
const [extraContext, setExtraContext] = useState<MessageExtraContext | null>(
|
|
null
|
|
);
|
|
|
|
// Accept setText message from a parent window and set inputMsg and extraContext
|
|
useEffect(() => {
|
|
const handleMessage = (event: MessageEvent) => {
|
|
if (event.data?.command === 'setText') {
|
|
const data: SetTextEvData = event.data;
|
|
textarea.setValue(data?.text);
|
|
if (data?.context && data.context.length > 0) {
|
|
setExtraContext({
|
|
type: 'context',
|
|
content: data.context,
|
|
});
|
|
}
|
|
textarea.focus();
|
|
setTimeout(() => {
|
|
textarea.refOnSubmit.current?.();
|
|
}, 10); // wait for setExtraContext to finish
|
|
}
|
|
};
|
|
|
|
window.addEventListener('message', handleMessage);
|
|
return () => window.removeEventListener('message', handleMessage);
|
|
}, [textarea]);
|
|
|
|
// Add a keydown listener that sends the "escapePressed" message to the parent window
|
|
useEffect(() => {
|
|
const handleKeyDown = (event: KeyboardEvent) => {
|
|
if (event.key === 'Escape') {
|
|
window.parent.postMessage({ command: 'escapePressed' }, '*');
|
|
}
|
|
};
|
|
|
|
window.addEventListener('keydown', handleKeyDown);
|
|
return () => window.removeEventListener('keydown', handleKeyDown);
|
|
}, []);
|
|
|
|
return {
|
|
extraContext,
|
|
// call once the user message is sent, to clear the extra context
|
|
clearExtraContext: () => setExtraContext(null),
|
|
};
|
|
};
|