mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-02-28 11:37:39 +00:00
* feat: integrate Gemini AI agent provider - Core Backend: Ported gemini-cli.js and gemini-response-handler.js to establish the CLI bridge. Registered 'gemini' as an active provider within index.js. - Core Frontend: Extended QuickSettingsPanel.jsx, Settings.jsx, and AgentListItem.jsx to render the Gemini provider option, models (gemini-pro, gemini-flash, etc.), and handle OAuth states. - WebSocket Pipeline: Added support for gemini-command executions in backend and payload processing of gemini-response and gemini-error streams in useChatRealtimeHandlers.ts. Resolved JSON double-stringification and sessionId stripping issues in the transmission handler. - Platform Compatibility: Added scripts/fix-node-pty.js postinstall script and modified posix_spawnp calls with sh -c wrapper to prevent ENOEXEC and MacOS permission errors when spawning the gemini headless binary. - UX & Design: Imported official Google Gemini branding via GeminiLogo.jsx and gemini-ai-icon.svg. Updated translations (chat.json) for en, zh-CN, and ko locales. * fix: propagate gemini permission mode from settings to cli - Added Gemini Permissions UI in Settings to toggle Auto Edit and YOLO modes - Synced gemini permission mode to localStorage - Passed permissionMode in useChatComposerState for Gemini commands - Mapped frontend permission modes to --yolo and --approval-mode options in gemini-cli.js * feat(gemini): Refactor Gemini CLI integration to use stream-json - Replaced regex buffering text-system with NDJSON stream parsing - Added fallback for restricted models like gemini-3.1-pro-preview * feat(gemini): Render tool_use and tool_result UI bubbles - Forwarded gemini tool NDJSON objects to the websocket - Added React state handlers in useChatRealtimeHandlers to match Claude's tool UI behavior * feat(gemini): Add native session resumption and UI token tracking - Captured cliSessionId from init events to map ClaudeCodeUI's chat sessionId directly into Gemini's internal session manager. - Updated gemini-cli.js spawn arguments to append the --resume proxy flag instead of naively dumping the accumulated chat history into the command prompt. - Handled result stream objects by proxying total_tokens back into the frontend's claude-status tracker to natively populate the UI label. - Eliminated gemini-3 model proxy filter entirely. * fix(gemini): Fix static 'Claude' name rendering in chat UI header - Added "gemini": "Gemini" translation strings to messageTypes across English, Korean, and Chinese loc dictionaries. - Updated AssistantThinkingIndicator and MessageComponent ternary checks to identify provider === 'gemini' and render the appropriate brand label instead of statically defaulting to Claude. * feat: Add Gemini session persistence API mapping and Sidebar UI * fix(gemini): Watch ~/.gemini/sessions for live UI updates Added the .gemini/sessions directory to PROVIDER_WATCH_PATHS so that Chokidar emits projects_updated websocket events when new Gemini sessions are created or modified, fixing live sidebar updates. * fix(gemini): Fix Gemini authentication status display in Settings UI - Injected 'checkGeminiAuthStatus' into the Settings.jsx React effect hook so that the UI can poll and render the 'geminiAuthStatus' state. - Updated 'checkGeminiCredentials()' inside server/routes/cli-auth.js to read from '~/.gemini/oauth_creds.json' and '~/.gemini/google_accounts.json', resolving the email address correctly. * Use logo-only icon for gemini * feat(gemini): Add Gemini 3 preview models to UI selection list * Fix Gemini CLI session resume bug and PR #422 review nitpicks * Fix Gemini tool calls disappearing from UI after completion * fix(gemini): resolve outstanding PR #422 feedback and stabilize gemini CLI timeouts * fix(gemini): resolve resume flag and shell session initialization issues This commit addresses the remaining PR comments for the Gemini CLI integration: - Moves the `--resume` flag logic outside the prompt command block, ensuring Gemini sessions correctly resume even when a new prompt isn't passed. - Updates `handleShellConnection` to correctly lookup the native `cliSessionId` from the internal `sessionId` when spawning Gemini sessions in a plain shell. - Refactors dynamic import of `sessionManager.js` back to a native static import for code consistency. * chore: fix TypeScript errors and remove gemini CLI dependency * fix: use cross-spawn on Windows to resolve gemini.cmd correctly --------- Co-authored-by: Haileyesus <118998054+blackmammoth@users.noreply.github.com>
121 lines
3.4 KiB
JSON
121 lines
3.4 KiB
JSON
{
|
|
"name": "@siteboon/claude-code-ui",
|
|
"version": "1.20.1",
|
|
"description": "A web-based UI for Claude Code CLI",
|
|
"type": "module",
|
|
"main": "server/index.js",
|
|
"bin": {
|
|
"claude-code-ui": "server/cli.js",
|
|
"cloudcli": "server/cli.js"
|
|
},
|
|
"files": [
|
|
"server/",
|
|
"shared/",
|
|
"dist/",
|
|
"scripts/",
|
|
"README.md"
|
|
],
|
|
"homepage": "https://cloudcli.ai",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "git+https://github.com/siteboon/claudecodeui.git"
|
|
},
|
|
"bugs": {
|
|
"url": "https://github.com/siteboon/claudecodeui/issues"
|
|
},
|
|
"scripts": {
|
|
"dev": "concurrently --kill-others \"npm run server\" \"npm run client\"",
|
|
"server": "node server/index.js",
|
|
"client": "vite --host",
|
|
"build": "vite build",
|
|
"preview": "vite preview",
|
|
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
"start": "npm run build && npm run server",
|
|
"release": "./release.sh",
|
|
"prepublishOnly": "npm run build",
|
|
"postinstall": "node scripts/fix-node-pty.js"
|
|
},
|
|
"keywords": [
|
|
"claude code",
|
|
"ai",
|
|
"anthropic",
|
|
"ui",
|
|
"mobile"
|
|
],
|
|
"author": "CloudCLI UI Contributors",
|
|
"license": "GPL-3.0",
|
|
"dependencies": {
|
|
"@anthropic-ai/claude-agent-sdk": "^0.2.59",
|
|
"@codemirror/lang-css": "^6.3.1",
|
|
"@codemirror/lang-html": "^6.4.9",
|
|
"@codemirror/lang-javascript": "^6.2.4",
|
|
"@codemirror/lang-json": "^6.0.1",
|
|
"@codemirror/lang-markdown": "^6.3.3",
|
|
"@codemirror/lang-python": "^6.2.1",
|
|
"@codemirror/merge": "^6.11.1",
|
|
"@codemirror/theme-one-dark": "^6.1.2",
|
|
"@iarna/toml": "^2.2.5",
|
|
"@octokit/rest": "^22.0.0",
|
|
"@openai/codex-sdk": "^0.101.0",
|
|
"@replit/codemirror-minimap": "^0.5.2",
|
|
"@tailwindcss/typography": "^0.5.16",
|
|
"@uiw/react-codemirror": "^4.23.13",
|
|
"@xterm/addon-clipboard": "^0.1.0",
|
|
"@xterm/addon-fit": "^0.10.0",
|
|
"@xterm/addon-web-links": "^0.11.0",
|
|
"@xterm/addon-webgl": "^0.18.0",
|
|
"@xterm/xterm": "^5.5.0",
|
|
"bcrypt": "^6.0.0",
|
|
"better-sqlite3": "^12.6.2",
|
|
"chokidar": "^4.0.3",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"cors": "^2.8.5",
|
|
"cross-spawn": "^7.0.3",
|
|
"express": "^4.18.2",
|
|
"fuse.js": "^7.0.0",
|
|
"gray-matter": "^4.0.3",
|
|
"i18next": "^25.7.4",
|
|
"i18next-browser-languagedetector": "^8.2.0",
|
|
"jsonwebtoken": "^9.0.2",
|
|
"katex": "^0.16.25",
|
|
"lucide-react": "^0.515.0",
|
|
"mime-types": "^3.0.1",
|
|
"multer": "^2.0.1",
|
|
"node-fetch": "^2.7.0",
|
|
"node-pty": "^1.1.0-beta34",
|
|
"react": "^18.2.0",
|
|
"react-dom": "^18.2.0",
|
|
"react-dropzone": "^14.2.3",
|
|
"react-error-boundary": "^4.1.2",
|
|
"react-i18next": "^16.5.3",
|
|
"react-markdown": "^10.1.0",
|
|
"react-router-dom": "^6.8.1",
|
|
"react-syntax-highlighter": "^15.6.1",
|
|
"rehype-katex": "^7.0.1",
|
|
"rehype-raw": "^7.0.0",
|
|
"remark-gfm": "^4.0.0",
|
|
"remark-math": "^6.0.0",
|
|
"sqlite": "^5.1.1",
|
|
"sqlite3": "^5.1.7",
|
|
"tailwind-merge": "^3.3.1",
|
|
"ws": "^8.14.2"
|
|
},
|
|
"devDependencies": {
|
|
"@release-it/conventional-changelog": "^10.0.5",
|
|
"@types/node": "^22.19.7",
|
|
"@types/react": "^18.2.43",
|
|
"@types/react-dom": "^18.2.17",
|
|
"@vitejs/plugin-react": "^4.6.0",
|
|
"auto-changelog": "^2.5.0",
|
|
"autoprefixer": "^10.4.16",
|
|
"concurrently": "^8.2.2",
|
|
"node-gyp": "^10.0.0",
|
|
"postcss": "^8.4.32",
|
|
"release-it": "^19.0.5",
|
|
"sharp": "^0.34.2",
|
|
"tailwindcss": "^3.4.0",
|
|
"typescript": "^5.9.3",
|
|
"vite": "^7.0.4"
|
|
}
|
|
} |