diff --git a/README.md b/README.md index 1285ed5..241cd4b 100644 --- a/README.md +++ b/README.md @@ -145,19 +145,57 @@ OpenQode/ --- -## 🔐 Authentication +## 🔐 AI Models & Authentication -OpenQode uses **Qwen AI** for its language model capabilities. Authentication is handled automatically: +OpenQode supports **multiple AI providers** for maximum flexibility: + +### 🟢 Qwen Cloud (Default - Free) + +Alibaba's powerful AI models with free tier access: 1. **First Launch** - The app will prompt you to authenticate 2. **Browser Login** - A browser window opens for Qwen login 3. **Token Storage** - Credentials are stored locally and encrypted 4. **Auto-Refresh** - Tokens are refreshed automatically +Available Qwen models: `qwen-coder-plus`, `qwen-plus`, `qwen-turbo` + If you need to re-authenticate, use **Option 5** in the launcher menu. --- +### 🔵 Ollama Cloud (Free - 20+ Models) + +Access **state-of-the-art open-weight models** for FREE via Ollama Cloud: + +#### 🎁 Get Your Free API Key: +1. Go to **[ollama.com/settings/keys](https://ollama.com/settings/keys)** +2. Sign in or create a free account +3. Generate an API key +4. Paste it in Goose Ultra's **AI Model Manager** (sidebar → AI Models) + +#### 🚀 Available Free Models: + +| Model | Size | Best For | +|-------|------|----------| +| **GPT-OSS 120B** | 120B | OpenAI's open-weight reasoning model | +| **DeepSeek V3.2** | MoE | Superior reasoning & agent performance | +| **Gemini 3 Pro Preview** | Cloud | Google's SOTA reasoning model | +| **Qwen3 Coder 480B** | 480B | Agentic coding, long context | +| **Devstral 2 123B** | 123B | Multi-file editing, software agents | +| **Kimi K2** | MoE | State-of-the-art coding agent tasks | +| **Qwen3 VL 235B** | 235B | Vision + language understanding | +| **Gemini 3 Flash** | Cloud | Fast, frontier intelligence | +| **Ministral 3** | 3-14B | Edge deployment, fast responses | + +...and many more! Open the **AI Model Manager** in Goose Ultra to see all available models. + +#### 📖 Ollama Cloud Docs: +- API Documentation: [docs.ollama.com/cloud](https://docs.ollama.com/cloud) +- Model Library: [ollama.com/search?c=cloud](https://ollama.com/search?c=cloud) + +--- + ## 🐛 Troubleshooting ### "Node.js not found" diff --git a/bin/goose-ultra-final/electron/main.js b/bin/goose-ultra-final/electron/main.js index 5222ae3..f5d1e44 100644 --- a/bin/goose-ultra-final/electron/main.js +++ b/bin/goose-ultra-final/electron/main.js @@ -1,7 +1,8 @@ import { app, BrowserWindow, ipcMain, shell, protocol, net } from 'electron'; import path from 'path'; import { fileURLToPath } from 'url'; -import { streamChat } from './qwen-api.js'; +import { streamChat as qwenStreamChat } from './qwen-api.js'; +import * as ollamaApi from './ollama-api.js'; import { generateImage, detectImageRequest, cleanupCache } from './image-api.js'; import { fsApi } from './fs-api.js'; import * as viAutomation from './vi-automation.js'; @@ -172,22 +173,53 @@ ipcMain.handle('export-project-zip', async (_, { projectId }) => { }); // Chat Streaming IPC -ipcMain.on('chat-stream-start', (event, { messages, model }) => { +ipcMain.on('chat-stream-start', async (event, { messages, model }) => { const window = BrowserWindow.fromWebContents(event.sender); - streamChat( - messages, - model, - (chunk) => { - if (!window.isDestroyed()) { - // console.log('[Main] Sending chunk size:', chunk.length); // Verbose log - window.webContents.send('chat-chunk', chunk); - } - }, - (fullResponse) => !window.isDestroyed() && window.webContents.send('chat-complete', fullResponse), - (error) => !window.isDestroyed() && window.webContents.send('chat-error', error.message), - (status) => !window.isDestroyed() && window.webContents.send('chat-status', status) - ); + // Choose provider based on model prefix or name + // Default to qwen unless model starts with 'ollama:' or matches known ollama models + const isOllama = model?.startsWith('ollama:') || model === 'gpt-oss:120b'; + const cleanModel = isOllama ? model.replace('ollama:', '') : model; + + const onChunk = (chunk) => { + if (!window.isDestroyed()) window.webContents.send('chat-chunk', chunk); + }; + const onComplete = (full) => { + if (!window.isDestroyed()) window.webContents.send('chat-complete', full); + }; + const onError = (err) => { + if (!window.isDestroyed()) window.webContents.send('chat-error', typeof err === 'string' ? err : err.message); + }; + const onStatus = (status) => { + if (!window.isDestroyed()) window.webContents.send('chat-status', status); + }; + + if (isOllama) { + // Ensure key is loaded + const key = await getSecret('ollama-cloud-key'); + ollamaApi.setApiKey(key); + ollamaApi.streamChat(messages, cleanModel, onChunk, onComplete, onError, onStatus); + } else { + qwenStreamChat(messages, model, onChunk, onComplete, onError, onStatus); + } +}); + +// Ollama Specific Handlers +ipcMain.handle('ollama-get-key-status', async () => { + const key = await getSecret('ollama-cloud-key'); + return { hasKey: !!key }; +}); + +ipcMain.handle('ollama-save-key', async (_, { key }) => { + await saveSecret('ollama-cloud-key', key); + ollamaApi.setApiKey(key); + return true; +}); + +ipcMain.handle('ollama-get-models', async () => { + const key = await getSecret('ollama-cloud-key'); + ollamaApi.setApiKey(key); + return await ollamaApi.listModels(); }); // FS Handlers diff --git a/bin/goose-ultra-final/electron/ollama-api.js b/bin/goose-ultra-final/electron/ollama-api.js new file mode 100644 index 0000000..ba21355 --- /dev/null +++ b/bin/goose-ultra-final/electron/ollama-api.js @@ -0,0 +1,147 @@ +import fs from 'fs'; +import path from 'path'; +import https from 'https'; +import os from 'os'; + +/** + * Ollama Cloud API Bridge for Goose Ultra + * Base URL: https://ollama.com/api + */ + +// We'll manage key storage via main.js using keytar +let cachedApiKey = null; + +export function setApiKey(key) { + cachedApiKey = key; +} + +let activeRequest = null; + +export function abortActiveChat() { + if (activeRequest) { + try { + activeRequest.destroy(); + } catch (e) { } + activeRequest = null; + } +} + +export async function streamChat(messages, model = 'gpt-oss:120b', onChunk, onComplete, onError, onStatus) { + abortActiveChat(); + + if (!cachedApiKey) { + onError(new Error('OLLAMA_CLOUD_KEY_MISSING: Please set your Ollama Cloud API Key in Settings.')); + return; + } + + const log = (msg) => { + if (onStatus) onStatus(`[Ollama] ${msg}`); + }; + + const body = JSON.stringify({ + model, + messages, + stream: true + }); + + const options = { + hostname: 'ollama.com', + port: 443, + path: '/api/chat', + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${cachedApiKey}`, + 'Content-Length': Buffer.byteLength(body) + } + }; + + log(`Connecting to ollama.com as ${model}...`); + + const req = https.request(options, (res) => { + activeRequest = req; + let fullResponse = ''; + + if (res.statusCode !== 200) { + let errBody = ''; + res.on('data', (c) => errBody += c.toString()); + res.on('end', () => { + onError(new Error(`Ollama API Error ${res.statusCode}: ${errBody}`)); + }); + return; + } + + res.setEncoding('utf8'); + let buffer = ''; + + res.on('data', (chunk) => { + buffer += chunk; + const lines = buffer.split('\n'); + buffer = lines.pop(); + + for (const line of lines) { + if (!line.trim()) continue; + try { + const parsed = JSON.parse(line); + const content = parsed.message?.content || ''; + if (content) { + fullResponse += content; + onChunk(content); + } + if (parsed.done) { + // Request is done according to Ollama API + } + } catch (e) { + // Ignore malformed JSON chunks + } + } + }); + + res.on('end', () => { + onComplete(fullResponse); + }); + }); + + req.on('error', (e) => { + onError(e); + }); + + req.setNoDelay(true); + req.write(body); + req.end(); +} + +/** + * Fetch available models from Ollama Cloud + */ +export async function listModels() { + if (!cachedApiKey) return []; + + return new Promise((resolve, reject) => { + const options = { + hostname: 'ollama.com', + port: 443, + path: '/api/tags', + method: 'GET', + headers: { + 'Authorization': `Bearer ${cachedApiKey}` + } + }; + + const req = https.request(options, (res) => { + let body = ''; + res.on('data', (c) => body += c.toString()); + res.on('end', () => { + try { + const data = JSON.parse(body); + resolve(data.models || []); + } catch (e) { + resolve([]); + } + }); + }); + + req.on('error', (e) => resolve([])); + req.end(); + }); +} diff --git a/bin/goose-ultra-final/electron/preload.js b/bin/goose-ultra-final/electron/preload.js index 52a0f9d..494c740 100644 --- a/bin/goose-ultra-final/electron/preload.js +++ b/bin/goose-ultra-final/electron/preload.js @@ -91,5 +91,11 @@ contextBridge.exposeInMainWorld('electron', { // Browser openBrowser: (url) => ipcRenderer.invoke('vi-open-browser', { url }) + }, + // Ollama Cloud + ollama: { + getKeyStatus: () => ipcRenderer.invoke('ollama-get-key-status'), + saveKey: (key) => ipcRenderer.invoke('ollama-save-key', { key }), + getModels: () => ipcRenderer.invoke('ollama-get-models') } }); diff --git a/bin/goose-ultra-final/package-lock.json b/bin/goose-ultra-final/package-lock.json index 7e897f2..2afd140 100644 --- a/bin/goose-ultra-final/package-lock.json +++ b/bin/goose-ultra-final/package-lock.json @@ -1876,16 +1876,6 @@ "xmlbuilder": ">=11.0.1" } }, - "node_modules/@types/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", - "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", - "license": "MIT", - "peer": true, - "dependencies": { - "csstype": "^3.2.2" - } - }, "node_modules/@types/responselike": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", @@ -1896,14 +1886,6 @@ "@types/node": "*" } }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -2140,85 +2122,6 @@ "node": ">= 10.0.0" } }, - "node_modules/archiver": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", - "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.4", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/archiver-utils/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/archiver-utils/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2903,23 +2806,6 @@ "node": ">=0.10.0" } }, - "node_modules/compress-commons": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", - "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3051,35 +2937,6 @@ "buffer": "^5.1.0" } }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", - "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -3095,13 +2952,6 @@ "node": ">= 8" } }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT", - "peer": true - }, "node_modules/date-fns": { "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", @@ -3400,16 +3250,6 @@ "node": ">=8" } }, - "node_modules/dompurify": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz", - "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", - "license": "(MPL-2.0 OR Apache-2.0)", - "peer": true, - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, "node_modules/dotenv": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", @@ -3511,61 +3351,6 @@ "node": ">=14.0.0" } }, - "node_modules/electron-builder-squirrel-windows": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-24.13.3.tgz", - "integrity": "sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "app-builder-lib": "24.13.3", - "archiver": "^5.3.1", - "builder-util": "24.13.1", - "fs-extra": "^10.1.0" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/electron-builder/node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -4924,56 +4709,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/lie": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", @@ -4990,46 +4725,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -5070,19 +4765,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/marked": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", - "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", - "license": "MIT", - "peer": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 18" - } - }, "node_modules/matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -6083,17 +5765,6 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "license": "MIT" }, - "node_modules/monaco-editor": { - "version": "0.55.1", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz", - "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==", - "license": "MIT", - "peer": true, - "dependencies": { - "dompurify": "3.2.7", - "marked": "14.0.0" - } - }, "node_modules/motion-dom": { "version": "12.23.23", "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.23.tgz", @@ -6186,17 +5857,6 @@ "dev": true, "license": "MIT" }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", @@ -6612,17 +6272,6 @@ "node": ">= 6" } }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "minimatch": "^5.1.0" - } - }, "node_modules/remark-gfm": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", @@ -7898,45 +7547,6 @@ "fd-slicer": "~1.1.0" } }, - "node_modules/zip-stream": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", - "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "archiver-utils": "^3.0.4", - "compress-commons": "^4.1.2", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/zip-stream/node_modules/archiver-utils": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", - "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "glob": "^7.2.3", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", diff --git a/bin/goose-ultra-final/src/components/LayoutComponents.tsx b/bin/goose-ultra-final/src/components/LayoutComponents.tsx index 638f8b6..a35171f 100644 --- a/bin/goose-ultra-final/src/components/LayoutComponents.tsx +++ b/bin/goose-ultra-final/src/components/LayoutComponents.tsx @@ -688,6 +688,114 @@ export const Sidebar = () => { {state.executionSettings.localPowerShellEnabled ? 'ON' : 'OFF'} + + {/* AI Models Manager */} +
Select your preferred AI model
+Alibaba's powerful AI models with free tier access
+ +For private models or higher rate limits. Many models work without a key.
+ +No models found matching "{searchQuery}"
+