UNPKG

@valtown/codemirror-codeium

Version:

codemirror integration for codeium

64 lines 2.29 kB
import { createPromiseClient } from "@connectrpc/connect"; import { LanguageServerService } from "./api/proto/exa/language_server_pb/language_server_connect.js"; import { createConnectTransport } from "@connectrpc/connect-web"; // This is the same as the monaco editor example const transport = createConnectTransport({ baseUrl: "https://web-backend.codeium.com", useBinaryFormat: true, }); const client = createPromiseClient(LanguageServerService, transport); const sessionId = crypto.randomUUID(); export async function getCodeiumCompletions({ text, cursorOffset, config, }) { return (await client.getCompletions({ metadata: { ideName: "web", ideVersion: "unknown", extensionName: "@valtown/codemirror-codeium", extensionVersion: "unknown", apiKey: config.apiKey, sessionId: sessionId, }, document: { text: text, cursorOffset: BigInt(cursorOffset), language: config.language, // TODO: not sure why we have both language and // editorlanguage // The types don't like this here, but it works. editorLanguage: "typescript", lineEnding: "\n", }, editorOptions: { tabSize: 2n, insertSpaces: true, }, otherDocuments: [], multilineConfig: undefined, }, { // signal, headers: { Authorization: `Basic ${config.apiKey}-${sessionId}`, }, })); } export function simplifyCompletions(completions) { return completions.completionItems[0].completionParts.filter((part) => { // Type 3 overwrites existing text. Maybe we need this eventually, // but not right now and it usually is duplicative. return part.type !== 3; }).map((part) => { return { ...part, offset: Number(part.offset), text: part.type === 2 ? `\n${part.text}` : part.text, }; }); } export function completionsToChangeSpec(completions) { return simplifyCompletions(completions).map((part) => ({ from: Number(part.offset), to: Number(part.offset), insert: part.text, })); } //# sourceMappingURL=codeium.js.map