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 { patchTopicLocally, refresh } = 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() { patchTopicLocally(topicId, { renaming: true }); }, }); if (!res.ok) { patchTopicLocally(topicId, { renaming: false }); await refresh(); console.error('Failed to auto-rename:', res.code); return Err(AutoRenameError.FailedToGenerate); } return Ok(undefined); } catch (error) { patchTopicLocally(topicId, { renaming: false }); await refresh(); console.error('Failed to auto-rename:', error); return Err(AutoRenameError.FailedToGenerate); } } return { autoRename }; }