diff options
Diffstat (limited to 'chat/chat-commands.js')
| -rw-r--r-- | chat/chat-commands.js | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/chat/chat-commands.js b/chat/chat-commands.js index d5cfdd9..c0c77ee 100644 --- a/chat/chat-commands.js +++ b/chat/chat-commands.js @@ -4,6 +4,16 @@ * Handles /search, /fetch, /explain, /help, /status, /clear, /modules, etc. */ +// Fetch with timeout — AbortController-based, 30s default +function _csFetch(url, opts, timeout) { + timeout = timeout || 30000; + opts = opts || {}; + var ctrl = new AbortController(); + opts.signal = ctrl.signal; + var timer = setTimeout(function() { ctrl.abort(); }, timeout); + return fetch(url, opts).finally(function() { clearTimeout(timer); }); +} + async function handleCommand(cmd) { var parts = cmd.split(' '); var command = parts[0].toLowerCase(); @@ -67,7 +77,7 @@ async function handleCommand(cmd) { if (typeof OLLAMA_API_KEY !== 'undefined' && OLLAMA_API_KEY) { headers['Authorization'] = 'Bearer ' + OLLAMA_API_KEY; } - var response = await fetch((typeof OLLAMA_URL !== 'undefined' ? OLLAMA_URL : '/ollama') + '/api/generate', { + var response = await _csFetch((typeof OLLAMA_URL !== 'undefined' ? OLLAMA_URL : '/ollama') + '/api/generate', { method: 'POST', headers: headers, body: JSON.stringify({ @@ -95,7 +105,7 @@ async function handleCommand(cmd) { } showTyping(); try { - var response = await fetch('/api/search?q=' + encodeURIComponent(query) + '&summarize=true'); + var response = await _csFetch('/api/search?q=' + encodeURIComponent(query) + '&summarize=true'); var data = await response.json(); hideTyping(); if (data.error) { @@ -140,11 +150,11 @@ async function handleCommand(cmd) { } showTyping(); try { - var extractResp = await fetch('/api/extract?url=' + encodeURIComponent(url)); + var extractResp = await _csFetch('/api/extract?url=' + encodeURIComponent(url)); var extractOk = extractResp.ok; var extractData = extractOk ? await extractResp.json() : null; - var htmlResp = await fetch('/api/fetch?url=' + encodeURIComponent(url)); + var htmlResp = await _csFetch('/api/fetch?url=' + encodeURIComponent(url)); if (!htmlResp.ok) throw new Error('HTTP ' + htmlResp.status); var html = await htmlResp.text(); var htmlPreview = html.substring(0, 262144) + (html.length > 262144 ? '\n\n... (truncated)' : ''); @@ -178,7 +188,7 @@ async function handleCommand(cmd) { } showTyping(); try { - var response = await fetch('/api/summarize?url=' + encodeURIComponent(url)); + var response = await _csFetch('/api/summarize?url=' + encodeURIComponent(url)); if (!response.ok) throw new Error('HTTP ' + response.status); var data = await response.json(); hideTyping(); @@ -204,7 +214,7 @@ async function handleCommand(cmd) { } showTyping(); try { - var response = await fetch('/api/extract?url=' + encodeURIComponent(url)); + var response = await _csFetch('/api/extract?url=' + encodeURIComponent(url)); if (!response.ok) throw new Error('HTTP ' + response.status); var data = await response.json(); hideTyping(); @@ -225,7 +235,7 @@ async function handleCommand(cmd) { // === /status === if (command === '/status') { try { - var response = await fetch((typeof OLLAMA_URL !== 'undefined' ? OLLAMA_URL : '/ollama') + '/api/tags'); + var response = await _csFetch((typeof OLLAMA_URL !== 'undefined' ? OLLAMA_URL : '/ollama') + '/api/tags'); var data = await response.json(); var modelCount = data.models ? data.models.length : 0; var current = document.getElementById('modelSelect').value; @@ -241,7 +251,7 @@ async function handleCommand(cmd) { showTyping(); try { var start = Date.now(); - var response = await fetch((typeof OLLAMA_URL !== 'undefined' ? OLLAMA_URL : '/ollama') + '/api/tags'); + var response = await _csFetch((typeof OLLAMA_URL !== 'undefined' ? OLLAMA_URL : '/ollama') + '/api/tags'); var ms = Date.now() - start; hideTyping(); addMessage('ai', '**Connection Test**\n\n- Response time: ' + ms + 'ms\n- Status: OK'); @@ -255,7 +265,7 @@ async function handleCommand(cmd) { // === /models or /list models === if (command === '/models') { try { - var response = await fetch((typeof OLLAMA_URL !== 'undefined' ? OLLAMA_URL : '/ollama') + '/api/tags'); + var response = await _csFetch((typeof OLLAMA_URL !== 'undefined' ? OLLAMA_URL : '/ollama') + '/api/tags'); var data = await response.json(); var list = data.models ? data.models.map(function (m) { return '- ' + m.name; }).join('\n') : 'No models'; addMessage('ai', '**Available Models:**\n\n' + list); |