Keep ai model saved when app closes.
This commit is contained in:
@@ -320,6 +320,11 @@ function showSettingsDialog({
|
|||||||
const ollamaModel = makeInput(settings.ai?.ollama?.model || 'llama3.2:1b');
|
const ollamaModel = makeInput(settings.ai?.ollama?.model || 'llama3.2:1b');
|
||||||
const aiStatus = el('div', { className: 'muted ai-status' }, 'AI stays local through Ollama. Vision-capable models can also inspect the screenshot attached to each step.');
|
const aiStatus = el('div', { className: 'muted ai-status' }, 'AI stays local through Ollama. Vision-capable models can also inspect the screenshot attached to each step.');
|
||||||
const testAiBtn = el('button', { type: 'button' }, 'Test connection');
|
const testAiBtn = el('button', { type: 'button' }, 'Test connection');
|
||||||
|
const persistOllamaModel = debounce(() => {
|
||||||
|
const model = ollamaModel.value.trim();
|
||||||
|
// Keep the last model choice even if the dialog is dismissed without a full save.
|
||||||
|
void api.settings.set({ keyPath: 'ai.ollama.model', value: model }).catch(() => {});
|
||||||
|
}, 250);
|
||||||
|
|
||||||
const updateAiStatus = (message, { error = false } = {}) => {
|
const updateAiStatus = (message, { error = false } = {}) => {
|
||||||
aiStatus.textContent = message;
|
aiStatus.textContent = message;
|
||||||
@@ -353,6 +358,8 @@ function showSettingsDialog({
|
|||||||
setButtonLoading(testAiBtn, false);
|
setButtonLoading(testAiBtn, false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
ollamaModel.addEventListener('input', () => persistOllamaModel());
|
||||||
|
ollamaModel.addEventListener('blur', () => persistOllamaModel.flush());
|
||||||
|
|
||||||
const placeholderRows = el('div', { className: 'placeholder-rows' });
|
const placeholderRows = el('div', { className: 'placeholder-rows' });
|
||||||
const rows = [];
|
const rows = [];
|
||||||
|
|||||||
@@ -56,12 +56,14 @@ test('settings persist, deep-merge with defaults, and store global placeholders'
|
|||||||
assert.equal(s1.get('appearance'), DEFAULT_SETTINGS.appearance);
|
assert.equal(s1.get('appearance'), DEFAULT_SETTINGS.appearance);
|
||||||
s1.set('appearance', 'dark');
|
s1.set('appearance', 'dark');
|
||||||
s1.set('capture.delayMs', 1500);
|
s1.set('capture.delayMs', 1500);
|
||||||
|
s1.set('ai.ollama.model', 'qwen3:0.6b');
|
||||||
s1.setGlobalPlaceholders({ Company: 'Acme', Author: 'Tyler' });
|
s1.setGlobalPlaceholders({ Company: 'Acme', Author: 'Tyler' });
|
||||||
|
|
||||||
// A fresh instance reads back the changed values merged over defaults.
|
// A fresh instance reads back the changed values merged over defaults.
|
||||||
const s2 = new Settings(dir);
|
const s2 = new Settings(dir);
|
||||||
assert.equal(s2.get('appearance'), 'dark');
|
assert.equal(s2.get('appearance'), 'dark');
|
||||||
assert.equal(s2.get('capture.delayMs'), 1500);
|
assert.equal(s2.get('capture.delayMs'), 1500);
|
||||||
|
assert.equal(s2.get('ai.ollama.model'), 'qwen3:0.6b');
|
||||||
assert.equal(s2.get('capture.clickMarker'), DEFAULT_SETTINGS.capture.clickMarker);
|
assert.equal(s2.get('capture.clickMarker'), DEFAULT_SETTINGS.capture.clickMarker);
|
||||||
assert.deepEqual(s2.getGlobalPlaceholders(), { Company: 'Acme', Author: 'Tyler' });
|
assert.deepEqual(s2.getGlobalPlaceholders(), { Company: 'Acme', Author: 'Tyler' });
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user