@valtown/codemirror-codeium
Version:
codemirror integration for codeium
64 lines • 2.29 kB
JavaScript
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