Skip to content

feat: Add i18n, file manager, MCP controls, display modes, and Docker packaging#76

Closed
LimLLL wants to merge 32 commits intofriuns2:mainfrom
LimLLL:main
Closed

feat: Add i18n, file manager, MCP controls, display modes, and Docker packaging#76
LimLLL wants to merge 32 commits intofriuns2:mainfrom
LimLLL:main

Conversation

@LimLLL
Copy link
Copy Markdown

@LimLLL LimLLL commented Apr 23, 2026

Summary

Adds i18n (English/Chinese), file manager, MCP server controls, conversation display modes, and Docker packaging to the Codex Web UI.

New Features

  • File Manager — Browse, upload, download, create, move, delete files with inline preview (images, PDF, video, audio, markdown, code, Office documents). Extensionless files are auto-detected as text or binary.
  • In-conversation File Preview — Clicking file links in AI responses opens the file preview modal instead of navigating away
  • Language Switching — English/Chinese UI with vue-i18n, auto-detection, and a settings toggle
  • MCP Server Controls — Enable/disable MCP servers from a composer dropdown
  • Conversation Display Modes — Clean mode (final replies only) and Developer mode (shows reasoning, MCP tool calls, and command executions with correct streaming order and status)
  • Config Editor — View and edit config.toml from the web UI

Docker & CI/CD

  • Multi-stage Dockerfile with docker-compose and CODEXUI_PASSWORD env support
  • GitHub Actions workflow for multi-arch GHCR publish
  • Complete .env.example with all configurable environment variables

Bug Fixes

  • Fix IME composition Enter key sending messages during Chinese input
  • Fix dictation auth and transcription error handling
  • Fix dark mode styling across dropdowns, sidebar, and skill picker
  • Fix terminal shell resolution in Docker (configurable via SHELL env var)
  • Fix MCP tool call streaming order and status not updating during AI response

Test Plan

  • Switch language between English and Chinese
  • File manager CRUD and file preview (including extensionless files like .bashrc)
  • Click a file link in an AI response to open preview modal
  • Enable/disable MCP servers from composer dropdown
  • Toggle clean/developer display mode during a streaming conversation
  • Docker build and run with docker-compose up
  • Edit and save config.toml from the settings modal

LimLLL added 30 commits April 22, 2026 15:27
- Register vue-i18n in the app and add locale detection with localStorage persistence
- Create English and Simplified Chinese locale files organized by feature area
- Replace hardcoded UI strings across sidebar, composer, review, skills, and threads
- Add a language selector in settings and localize dynamic labels, tooltips, and statuses
- Add a settings entry and modal to view and edit the Codex config file
- Implement GET and PUT `/codex-api/config-file` routes for loading and saving content
- Support `CODEX_HOME` fallback resolution and create the config directory on write
- Add English and Chinese i18n strings plus dark mode styles for the editor modal
- Add a composer dropdown to list configured MCP servers and show the enabled count
- Read MCP server state from config and update it through batch writes followed by reload
- Handle loading, empty, and toggle-in-progress states with localized messages
- Add dark mode styles and English/Chinese translations for the empty state
- Map known dictation error messages to localized feedback in the composer
- Add English and Chinese translations for missing auth token errors
- Add English and Chinese translations for transcription failure errors
- Implement file management API endpoints for listing, creating, moving, deleting, downloading, and uploading files
- Enforce allowed-root path validation for write operations and handle common file system errors
- Add reusable FileManager and FileManagerPanel components with breadcrumbs, context menu, uploads, and dark mode styles
- Integrate file manager access through a new /files route and a thread composer side panel toggle
- Add English and Chinese locale strings and include Tabler Vue icons for file type and action visuals
- Add inline preview support for images, PDF, video, audio, markdown, code, and text files
- Introduce read, serve, and OfficeCLI-based office preview routes on the server
- Open previews from double-click and the file context menu in FileManager
- Add localized preview strings and modal styling for light and dark themes
- Include markdown-it and highlight.js support for rendered markdown and syntax highlighting
- Create a multi-stage Dockerfile to build and run the app with pnpm
- Install Codex CLI and OfficeCLI in the runtime image for full support
- Add docker-compose configuration and example environment variables
- Add a GitHub Actions workflow to build multi-arch images and push to GHCR
- Compute the full GHCR image name once in the metadata step
- Export the normalized lowercase image as a job output for later jobs
- Replace direct env-based tags and manifest references with the shared output
- Avoid duplicated lowercase conversion logic in manifest creation and inspection
- Add pointer cursors and hover text states for composer and MCP triggers
- Move search dropdown and skill picker styles out of scoped blocks to enable shared dark mode rules
- Expand dark theme coverage for MCP, search dropdown, and skill picker components
- Adjust MCP dropdown menu to use a minimum width for better content fit
- Add interactive cursor styles for sidebar thread rows and thread buttons
- Stop ignoring pnpm-lock.yaml and add it to version control
- Copy the lockfile into the Docker build context before installing deps
- Use pnpm install --frozen-lockfile to ensure deterministic installs
- Copy pnpm-lock.yaml into the runtime image alongside package.json
- Install production dependencies with --frozen-lockfile for reproducible builds
# Conflicts:
#	package.json
#	src/App.vue
#	src/server/codexAppServerBridge.ts
- Add English and Chinese locale strings for terminal and context labels
- Replace hardcoded terminal and context text with i18n translations
- Localize terminal exit status and toggle accessibility labels
- Refine dark-mode terminal toggle styles and slightly reduce icon size
- Add a persisted conversation style setting with clean and developer options
- Show reasoning and MCP tool call messages inline in developer mode
- Hide internal steps in clean mode while keeping final replies prominent
- Normalize reasoning and MCP tool call payloads for thread rendering
- Prevent message sending when Enter is used to confirm IME input such as Chinese pinyin
- Run `pnpm rebuild node-pty` after dependency installation in both stages
- Install `python3`, `make`, and `g++` in the runtime stage for native module builds
- Remove temporary build tools after production install to keep the image lean
- Add node-pty and esbuild to pnpm onlyBuiltDependencies
- Ensure required postinstall build steps run for these packages
- Add common system packages needed for CLI usage and subprocess support
- Configure mise activation in shell startup and expose shims in PATH
- Keep build tools available at runtime for node-pty installation and rebuild
- Add an entrypoint script to initialize mise and npm global binaries before launch
- Update the container entrypoint to run through tini and the new startup script
- Expose `CODEXUI_PASSWORD` in `docker-compose.yaml` for container startup
- Document the environment variable in `.env.example`
- Allow users to set a fixed password instead of generating one on each start
- Read `CODEXUI_PASSWORD` from the environment when no string input is provided
- Use the trimmed environment value before falling back to generated passwords
- Install ripgrep alongside existing build tools in the Dockerfile
- Map DOC and DOCX files to a document icon
- Map XLS, XLSX, and CSV files to a spreadsheet icon
- Map PPT and PPTX files to a presentation icon
- Parse MCP function calls and outputs from session logs and merge them into turns
- Restore reasoning and command durations when rebuilding conversation items
- Preserve existing recovered items while interleaving agent, tool, and file change entries
- Surface duration metadata in normalizers and conversation UI for reasoning and commands
- Strip console.debug in production builds and add Vue env typings for build stability
# Conflicts:
#	src/App.vue
#	src/components/content/ComposerRuntimeDropdown.vue
#	src/components/content/ComposerSearchDropdown.vue
#	src/components/content/ComposerSkillPicker.vue
#	src/components/content/QueuedMessages.vue
#	src/components/content/ReviewPane.vue
#	src/components/content/SkillCard.vue
#	src/components/content/SkillDetailModal.vue
#	src/components/content/SkillsHub.vue
#	src/components/content/ThreadComposer.vue
#	src/components/content/ThreadPendingRequestPanel.vue
#	src/components/content/ThreadTerminalPanel.vue
#	src/components/sidebar/SidebarThreadControls.vue
#	src/components/sidebar/SidebarThreadTree.vue
- Register vitest@4.1.5 as a project dependency
- Update pnpm lock entries for Vitest packages and related test libs
- Include resolved transitive dependencies required by the new test setup
- Replace nested translation keys across UI components with direct English strings
- Simplify the English locale to rely on vue-i18n key fallback behavior
- Expand Chinese translations to map the new English text keys
- Remove useUiLanguage usage in favor of useI18n and silence missing key warnings
- Add live MCP tool call state handling for started, progress, and completed events
- Merge recovered MCP tool call data into existing live items without downgrading richer records
- Anchor live overlays to turn ids and indices so streamed messages stay in the correct turn
- Track live message arrival order and project overlays into the persisted conversation backbone
- Force message reload on turn completion and remove live tool calls once persisted data arrives
- Remove `ripgrep` from the earlier build-stage package list
- Add `ripgrep` to the later image stage so it is available where needed
- Add a sample `SHELL` variable to `.env.example`
- Explain recommended shell paths for Docker containers and macOS
- Preserve existing optional Telegram configuration entries
LimLLL added 2 commits April 23, 2026 16:57
- Intercept clicks on local message file links and launch FilePreviewModal
- Derive file name, path, and extension from browse URLs for preview state
- Treat files without extensions as text previews instead of unsupported files
- Detect binary files on the server and return a user-friendly preview error
- Add a Docker deployment section with startup steps and key environment variables
- Document i18n support, file manager capabilities, and multi-arch Docker images
- Refresh recent product features and fix the "Can’t" wording in troubleshooting
@LimLLL LimLLL closed this Apr 24, 2026
@LimLLL
Copy link
Copy Markdown
Author

LimLLL commented Apr 24, 2026

Since there hasn't been ​much activity on this PR​ and the code has moved ​on, I'll close it for no​w.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant