// Name: Svara på e‑post via Custom GPT // Description: Genererar ett e‑postsvar med hjälp av dina Custom GPT‑instruktioner och klistrar in svaret. // Author: Eddenator // GitHub: Eddenator import '@johnlindquist/kit' const CUSTOM_GPT_PROMPT = await env('CUSTOM_GPT_PROMPT', { placeholder: 'Klistra in instruktionerna/systemprompten från din Custom GPT (detta används som systemkontekst).', }) let emailText = (await getSelectedText())?.trim() if (!emailText) { emailText = (await editor({ value: '', placeholder: 'Klistra in det inkommande mejlet som ska besvaras', footer: 'Klistra in mejlet och tryck cmd+s för att fortsätta', }))?.trim() } if (!emailText) exit() const tone = await arg('Välj ton i svaret', ['Formell', 'Vänlig', 'Neutral', 'Kortfattad']) const language = await arg('Välj språk för svaret', ['Svenska', 'Engelska']) const replySchema = z.object({ subject: z.string().optional().describe('En kort ämnesrad för svaret, om relevant'), body: z .string() .describe( 'Själva svaret i e-postform. Inkludera hälsning, eventuella punktlistor/åtgärder, och avslutning.' ), }) const prompt = ` Du agerar som ett specialiserat "Custom GPT" för att besvara e-post. Systeminstruktioner (från användarens Custom GPT): """ ${CUSTOM_GPT_PROMPT} """ Uppgift: - Skriv ett komplett svar på språket: ${language}. - Ton: ${tone}. - Håll dig till fakta i originalmejlet och var tydlig och hjälpsam. - Om lämpligt, föreslå en kort ämnesrad. - Följ exakt utdataformatet i schemat (subject, body) utan extra text. Originalmejl: --- ${emailText} --- `.trim() const result = await generate(prompt, replySchema) let replyText = '' if (result.subject && result.subject.trim()) { replyText += `Ämne: ${result.subject.trim()}\n\n` } replyText += result.body.trim() const finalReply = await editor({ value: replyText, language: 'md', footer: 'cmd+s: Klistra in • cmd+c: Kopiera • esc: Avbryt', shortcuts: [ { name: 'Klistra in i aktiv app', key: `${cmd}+s`, bar: 'right', onPress: input => submit(input), visible: true, }, { name: 'Kopiera till urklipp', key: `${cmd}+c`, bar: 'right', onPress: async input => { await copy(input) submit(input) }, visible: true, }, ], }) if (finalReply?.trim()) { await setSelectedText(finalReply.trim()) }