aboutsummaryrefslogtreecommitdiff
path: root/chat/chat-commands.js
diff options
context:
space:
mode:
Diffstat (limited to 'chat/chat-commands.js')
-rw-r--r--chat/chat-commands.js28
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);