import { Err, Ok, type Result } from "~~/types/result"; export const useTopic = () => { enum AutoRenameError { AutoRenameDisabled = 0, NoModelSelected, NoModelFound, ModelDisabled, DatabaseOperationFailed, FailedToDecryptProviderApiKey, FailedToGenerate, } const autoRename = async (topicId: string): Promise> => { const { settings } = await useUserSettings(); if (!settings.value.systemAssistants.rename.enabled) { return Err(AutoRenameError.AutoRenameDisabled); } if (!settings.value.systemAssistants.rename.modelId) { return Err(AutoRenameError.NoModelSelected); } const { allModels } = await useModels(); const model = allModels.value.find(model => model.id === settings.value.systemAssistants.rename.modelId); if (!model) { return Err(AutoRenameError.NoModelFound); } if (model.enabled === false || model.provider?.enabled === false) { return Err(AutoRenameError.ModelDisabled) } let providerApiKey: string | undefined = undefined; if (model.provider!.config.apiKey !== undefined) { try { const key = await crypto.subtle.importKey( "jwk", JSON.parse(window.localStorage.getItem("encryptionKey")!), "AES-GCM", false, ["encrypt", "decrypt"] ) providerApiKey = await decrypt( key, base64ToUint8Array(model.provider!.config.apiKey) ); } catch (error) { console.error('Failed to decrypt provider API key:', error); return Err(AutoRenameError.FailedToDecryptProviderApiKey); } } const { agents } = await useAgents(); try { // @ts-ignore - excessive stack depth const res = await $fetch(`/api/topic/${topicId}/auto-rename`, { method: 'POST', body: JSON.stringify({ modelId: model.id, providerApiKey, }), onRequest() { const topics = agents.value.flatMap(agent => agent.topics); const topic = topics.find(topic => topic.id === topicId); if (topic) { agents.value = agents.value.map(agent => { return agent.id === topic.agentId ? { ...agent, topics: agent.topics.map(t => t.id === topic.id ? { ...topic, renaming: true } : t) } : agent; }); } }, onRequestError() { const topics = agents.value.flatMap(agent => agent.topics); const topic = topics.find(topic => topic.id === topicId); if (topic) { agents.value = agents.value.map(agent => { return agent.id === topic.agentId ? { ...agent, topics: agent.topics.map(t => t.id === topic.id ? { ...topic, renaming: false } : t) } : agent; }); } }, }) as { ok: true, renameId: string } | { ok: false, code: string }; if (!res.ok) { console.error('Failed to auto-rename:', res.code); return Err(AutoRenameError.FailedToGenerate); } return Ok(res.renameId); } catch (error) { console.error('Failed to auto-rename:', error); return Err(AutoRenameError.FailedToGenerate); } } return { autoRename }; }