🐛 Fix: Move voice processing handler to main background.js (service worker was not receiving messages from claude-arabic-voice)
This commit is contained in:
@@ -13,6 +13,13 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|||||||
.catch(err => sendResponse({ success: false, error: err.message }));
|
.catch(err => sendResponse({ success: false, error: err.message }));
|
||||||
return true; // Keep message channel open for async
|
return true; // Keep message channel open for async
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (message.type === 'GEMINI_PROCESS_VOICE') {
|
||||||
|
handleVoiceProcessing(message.payload)
|
||||||
|
.then(result => sendResponse({ success: true, data: result }))
|
||||||
|
.catch(err => sendResponse({ success: false, error: err.message }));
|
||||||
|
return true; // Keep message channel open for async
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// ─── Core API call ───────────────────────────────────────────────────────────
|
// ─── Core API call ───────────────────────────────────────────────────────────
|
||||||
@@ -54,7 +61,7 @@ async function handleGeminiRequest({ apiKey, prompt, tab, action = 'generateText
|
|||||||
|
|
||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
|
|
||||||
if (action === 'generatePdf') {
|
if (action === 'generatePdf') {
|
||||||
if (!data.pdf) throw new Error('Empty PDF response from server.');
|
if (!data.pdf) throw new Error('Empty PDF response from server.');
|
||||||
await incrementUsage();
|
await incrementUsage();
|
||||||
@@ -191,3 +198,77 @@ function storageGet(keys) {
|
|||||||
function storageSet(data) {
|
function storageSet(data) {
|
||||||
return new Promise(resolve => chrome.storage.local.set(data, resolve));
|
return new Promise(resolve => chrome.storage.local.set(data, resolve));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ─── Voice Processing (for Claude Arabic Voice extension) ────────────────────
|
||||||
|
|
||||||
|
async function handleVoiceProcessing({ apiKey, model, text, language }) {
|
||||||
|
if (!apiKey) {
|
||||||
|
throw new Error('Gemini API key is required');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Detect if text is Arabic
|
||||||
|
const isArabic = /[\u0600-\u06FF]/.test(text);
|
||||||
|
const langName = isArabic ? 'Arabic' : 'the detected language';
|
||||||
|
|
||||||
|
const prompt = `You are a text refinement assistant. Your task is to:
|
||||||
|
|
||||||
|
1. Correct any speech recognition errors in the following text
|
||||||
|
2. Fix punctuation, capitalization, and formatting
|
||||||
|
3. Keep the original meaning and content intact
|
||||||
|
4. Do NOT add any new information or commentary
|
||||||
|
5. Return ONLY the corrected text, nothing else
|
||||||
|
|
||||||
|
The text is in ${langName}. Preserve the original language.
|
||||||
|
|
||||||
|
TEXT TO REFINE:
|
||||||
|
${text}
|
||||||
|
|
||||||
|
CORRECTED TEXT:`;
|
||||||
|
|
||||||
|
const response = await fetch('https://cv.intaleqapp.com/cv/server/generate_cv.php', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({
|
||||||
|
action: 'generateText',
|
||||||
|
apiKey: apiKey,
|
||||||
|
prompt: prompt
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
const errText = await response.text().catch(() => '');
|
||||||
|
let errMsg;
|
||||||
|
try {
|
||||||
|
const errData = JSON.parse(errText);
|
||||||
|
errMsg = errData.error?.message || `HTTP ${response.status}`;
|
||||||
|
} catch (e) {
|
||||||
|
errMsg = `HTTP ${response.status}: ${errText.substring(0, 200)}`;
|
||||||
|
}
|
||||||
|
throw new Error(`Gemini API error: ${errMsg}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const responseText = await response.text();
|
||||||
|
let data;
|
||||||
|
try {
|
||||||
|
data = JSON.parse(responseText);
|
||||||
|
} catch (e) {
|
||||||
|
return { text: responseText.trim() };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.candidates && data.candidates[0]) {
|
||||||
|
const resultText = data.candidates[0].content?.parts?.[0]?.text;
|
||||||
|
if (resultText) {
|
||||||
|
return { text: resultText.trim() };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.error) {
|
||||||
|
throw new Error(`Server error: ${data.error}${data.details ? ' - ' + JSON.stringify(data.details) : ''}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
return { text: data.trim() };
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error('Empty response from Gemini API');
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user