diff --git a/.codex b/.codex deleted file mode 100644 index e69de29..0000000 diff --git a/.gitignore b/.gitignore index 212136c..6b52145 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,13 @@ node_modules merge.sh merged_docs.md docs/.vitepress/cache -docs/.vitepress/dist \ No newline at end of file +docs/.vitepress/dist +.qwen +.nimote + +# wrangler files +.wrangler +.dev.vars* +!.dev.vars.example +.env* +!.env.example diff --git a/.nimote/agent_histories/00374c48-9c9d-473a-b745-62ab855618c7/history.json b/.nimote/agent_histories/00374c48-9c9d-473a-b745-62ab855618c7/history.json deleted file mode 100644 index 1349376..0000000 --- a/.nimote/agent_histories/00374c48-9c9d-473a-b745-62ab855618c7/history.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"00374c48-9c9d-473a-b745-62ab855618c7","updated_at":"2026-03-12T03:57:18.323075","messages":[{"role":"user","content":"分析项目","displayContent":"分析项目","attachedFileName":null,"attachedFileLength":null,"attachedWasTruncated":null,"toolUsages":null},{"role":"assistant","content":"⛔ 操作已取消","displayContent":"⛔ 操作已取消","attachedFileName":null,"attachedFileLength":null,"attachedWasTruncated":null,"toolUsages":[{"toolName":"list_files","arguments":{"path":".","_callId":"call_list_files_1773259020880_0"},"result":"Directory listing is not available for remote (SSH) workspaces. Use read_file to work with the currently open file.","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"ls -la","_callId":"call_run_command_1773259021732_1"},"result":"**Command**: `ls -la`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 22128\ndrwx------ 13 elliot elliot 4096 Mar 11 19:44 .\ndrwxr-xr-x 4 root root 4096 Oct 26 09:48 ..\n-rw------- 1 elliot elliot 24566 Mar 11 19:44 .bash_history\n-rw-r--r-- 1 elliot elliot 220 May 13 2025 .bash_logout\n-rw-r--r-- 1 elliot elliot 3523 May 13 2025 .bashrc\ndrwxr-xr-x 4 elliot elliot 4096 Mar 10 23:25 .cache\n-rw-r--r-- 1 elliot elliot 22426346 Dec 19 17:53 ClashX.dmg\ndrwx------ 4 elliot elliot 4096 Mar 10 23:25 .config\ndrwxr-xr-x 5 elliot elliot 4096 Mar 10 02:01 cpp_aux_tutorial\n-rw-r--r-- 1 elliot elliot 12288 Nov 20 08:27 .create.txt.swp\n-rw-r--r-- 1 elliot elliot 57 Mar 9 23:13 .gitconfig\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 infoNotifier.value\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 isLoadingNotifier.value\n-rw------- 1 elliot elliot 20 Mar 10 23:48 .lesshst\ndrwxr-xr-x 27 elliot elliot 4096 Jan 17 08:22 linux_old1\ndrwxr-xr-x 5 elliot elliot 4096 Mar 10 23:24 .local\ndrwxr-xr-x 2 elliot elliot 4096 Mar 9 22:58 mytest\ndrwxr-xr-x 18 elliot elliot 4096 Mar 10 23:45 nextcode\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 nimoteoffical\n-rw------- 1 elliot elliot 0 Sep 14 17:37 .node_repl_history\ndrwxr-xr-x 5 elliot elliot 4096 Mar 11 18:04 .npm\n-rw-r--r-- 1 elliot elliot 807 May 13 2025 .profile\ndrwxr-xr-x 11 elliot elliot 4096 Oct 19 11:48 ruoyi-rust\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 _selected\n-rw-r--r-- 1 elliot elliot 0 Sep 14 09:48 .sudo_as_admin_successful\ndrwxr-xr-x 5 elliot elliot 4096 Mar 11 17:34 testagent\n-rw-r--r-- 1 elliot elliot 1088 Jan 6 07:01 test.py\n-rw-r--r-- 1 elliot elliot 12288 Nov 28 18:36 .test.txt.swi\n-rw-r--r-- 1 elliot elliot 12288 Nov 23 06:00 .test.txt.swj\n-rw-r--r-- 1 elliot elliot 12288 Nov 22 13:05 .test.txt.swk\n-rw-r--r-- 1 elliot elliot 12288 Nov 22 10:15 .test.txt.swl\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:17 .test.txt.swm\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:14 .test.txt.swn\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:14 .test.txt.swo\n-rw-r--r-- 1 elliot elliot 12288 Oct 6 16:45 .test.txt.swp\n-rw------- 1 elliot elliot 11554 Feb 17 04:52 .viminfo\n-rw-r--r-- 1 elliot elliot 165 Sep 14 17:34 .wget-hsts\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 workspace.isRemote\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"ls -la nimoteoffical/","_callId":"call_run_command_1773259022964_2"},"result":"**Command**: `ls -la nimoteoffical/`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 132\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 .\ndrwx------ 13 elliot elliot 4096 Mar 11 19:44 ..\ndrwxr-xr-x 6 elliot elliot 4096 Mar 11 18:34 docs\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:53 features\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 .git\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 17:59 .github\n-rw-r--r-- 1 elliot elliot 79 Mar 11 17:59 .gitignore\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 19:56 .nimote\ndrwxr-xr-x 79 elliot elliot 4096 Mar 11 19:04 node_modules\n-rw-r--r-- 1 elliot elliot 267 Mar 11 17:59 package.json\n-rw-r--r-- 1 elliot elliot 88522 Mar 11 19:04 package-lock.json\n-rw-r--r-- 1 elliot elliot 60 Mar 11 17:59 README.MD\n\n```\n\n","isError":false,"isPending":false},{"toolName":"read_file","arguments":{"_callId":"call_read_file_1773259024109_3"},"result":"❌ No file is currently open in the editor. Please open a file first.","isError":true,"isPending":false},{"toolName":"run_command","arguments":{"command":"cat nimoteoffical/package.json","_callId":"call_run_command_1773259025135_4"},"result":"**Command**: `cat nimoteoffical/package.json`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n{\n \"name\": \"NimoteCode\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"docs:dev\": \"vitepress dev docs\",\n \"docs:build\": \"vitepress build docs\",\n \"docs:preview\": \"vitepress preview docs\"\n },\n \"devDependencies\": {\n \"vitepress\": \"^1.1.0\"\n }\n}\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cat nimoteoffical/README.MD","_callId":"call_run_command_1773259026610_5"},"result":"**Command**: `cat nimoteoffical/README.MD`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n## run\nnpm run preview\nnpm run build\ngit push -f origin main\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"find nimoteoffical -type f -name \"*.md\" | head -20","_callId":"call_run_command_1773259027943_6"},"result":"**Command**: `find nimoteoffical -type f -name \"*.md\" | head -20`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\nnimoteoffical/node_modules/@vue/compiler-dom/README.md\nnimoteoffical/node_modules/@vue/shared/README.md\nnimoteoffical/node_modules/@vue/server-renderer/README.md\nnimoteoffical/node_modules/@vue/reactivity/README.md\nnimoteoffical/node_modules/@vue/devtools-api/README.md\nnimoteoffical/node_modules/@vue/runtime-core/README.md\nnimoteoffical/node_modules/@vue/compiler-core/README.md\nnimoteoffical/node_modules/@vue/compiler-sfc/README.md\nnimoteoffical/node_modules/@vue/devtools-kit/README.md\nnimoteoffical/node_modules/@vue/runtime-dom/README.md\nnimoteoffical/node_modules/@vue/compiler-ssr/README.md\nnimoteoffical/node_modules/@vue/devtools-shared/README.md\nnimoteoffical/node_modules/character-entities-legacy/readme.md\nnimoteoffical/node_modules/rfdc/readme.md\nnimoteoffical/node_modules/regex-utilities/README.md\nnimoteoffical/node_modules/oniguruma-to-es/README.md\nnimoteoffical/node_modules/devlop/readme.md\nnimoteoffical/node_modules/copy-anything/README.md\nnimoteoffical/node_modules/regex/README.md\nnimoteoffical/node_modules/birpc/README.md\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"ls -la nimoteoffical/docs/ && ls -la nimoteoffical/features/","_callId":"call_run_command_1773259029223_7"},"result":"**Command**: `ls -la nimoteoffical/docs/ && ls -la nimoteoffical/features/`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 80\ndrwxr-xr-x 6 elliot elliot 4096 Mar 11 18:34 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:49 docs\n-rw-r--r-- 1 elliot elliot 4462 Mar 11 18:34 docs.md\n-rw-r--r-- 1 elliot elliot 3614 Mar 11 18:35 download.md\n-rw-r--r-- 1 elliot elliot 12318 Mar 11 18:31 features.md\n-rw-r--r-- 1 elliot elliot 1911 Mar 11 18:46 index.md\n-rw-r--r-- 1 elliot elliot 6371 Mar 11 18:34 introduction.md\n-rw-r--r-- 1 elliot elliot 4096 Mar 11 18:03 privacy.md\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 17:59 public\n-rw-r--r-- 1 elliot elliot 3281 Mar 11 18:03 support.md\n-rw-r--r-- 1 elliot elliot 5342 Mar 11 18:03 terms.md\ndrwxr-xr-x 4 elliot elliot 4096 Mar 11 19:05 .vitepress\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 18:36 zh\ntotal 8\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:53 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cat nimoteoffical/docs/index.md","_callId":"call_run_command_1773259030579_8"},"result":"**Command**: `cat nimoteoffical/docs/index.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n---\nlayout: home\ntitle: NimoteCode\ntitleTemplate: false\n\nhero:\n name: NimoteCode\n text: Mobile Remote Development IDE\n tagline: True development experience — anytime, anywhere — right from your phone or tablet.\n actions:\n - theme: brand\n text: Quick Start Guide\n link: /docs/quick-start\n - theme: brand\n text: Download on the App Store\n link: https://apps.apple.com/app/idXXXXXX\n - theme: brand\n text: Download on Google Play\n link: https://play.google.com/store/apps/details?id=com.nimotecode\n - theme: alt\n text: View on GitHub\n link: https://github.com/nimotecode/nimote_issues\n\nfeatures:\n - title: 🔒 Secure SSH Remote Terminal\n details: Establish encrypted SSH connections to your servers with support for multiple independent sessions running in parallel.\n icon: 🔐\n\n - title: ⚡ Flutter + Rust Powered\n details: Delivers a responsive cross-platform interface combined with high-performance native backend capabilities.\n icon: ⚡\n\n - title: 📂 Integrated SFTP File Explorer\n details: Seamlessly browse, upload, download, edit, and manage files on remote servers with full filesystem access.\n icon: 📂\n\n - title: 🎨 Advanced Syntax Highlighting\n details: Powered by Tree-sitter — accurate, fast, and supports dozens of programming languages out of the box.\n icon: 🎨\n\n - title: 🤖 AI Code Intelligence\n details: Integrate your preferred LLM to get context-aware completions, refactoring suggestions, and automated code edits.\n icon: 🤖\n\n - title: 📊 Visual Git Integration\n details: Repository status overview, commit history visualization, diff viewer, and per-file/line change tracking — all built-in.\n icon: 📊\n\n - title: 📱 Adaptive & Modern UI\n details: Fully responsive design for phones and tablets, with light/dark mode and custom theme support.\n icon: 📱\n---\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cat nimoteoffical/docs/features.md","_callId":"call_run_command_1773259032087_9"},"result":"**Command**: `cat nimoteoffical/docs/features.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n# Features\n\nExplore all the powerful features NimoteCode has to offer.\n\n## Core Editor\n\n### Syntax Highlighting\n\nNimoteCode supports syntax highlighting for 50+ programming languages:\n\n| Category | Languages |\n|----------|-----------|\n| **Web** | JavaScript, TypeScript, HTML, CSS, Vue, React |\n| **Backend** | Python, Java, Go, Rust, C/C++, C# |\n| **Mobile** | Swift, Kotlin, Dart, Flutter |\n| **Data** | SQL, JSON, YAML, TOML, XML |\n| **Scripting** | Bash, PowerShell, Python, Ruby |\n| **Config** | Dockerfile, Kubernetes, Nginx, Apache |\n\n### Code Folding\n\nCollapse and expand code blocks for better navigation:\n\n- Functions and methods\n- Classes and structs\n- Conditional blocks\n- Loops\n- Comments\n\n### Editor Features\n\n| Feature | Description |\n|---------|-------------|\n| **Auto-Save** | Changes saved automatically after 5 seconds |\n| **Undo/Redo** | Multiple levels of undo history |\n| **Cut/Copy/Paste** | Full clipboard support |\n| **Select All** | Quick selection of all content |\n| **Cursor Position** | Real-time line and column display |\n| **Context Menu** | Right-click for quick actions |\n| **Keyboard Shortcuts** | Ctrl+C/V/X and more |\n| **Virtual Keyboard** | Mobile-optimized programming keyboard |\n\n### Large File Support\n\n- Handle files up to **100,000 lines**\n- Chunked reading for large files\n- Automatic truncation warning\n- Smooth scrolling performance\n\n### Save States\n\n- **Dirty Flag**: Shows unsaved changes\n- **Saving Indicator**: Shows when saving is in progress\n- **Saved Confirmation**: Visual feedback when save completes\n\n## SSH Remote Development\n\n### Connection Management\n\n| Feature | Details |\n|---------|---------|\n| **Authentication** | Password and SSH key support |\n| **Timeout** | 10-second connection timeout |\n| **Auto-Reconnect** | Up to 2 reconnection attempts |\n| **Status Display** | Real-time connection status |\n\n### Remote File Browser\n\n- **Tree View**: Visual file system navigation\n- **File Icons**: Type-specific icons\n- **Path Navigation**: Auto-expand to current file\n- **Directory Caching**: Performance optimization\n- **Refresh**: Manual directory refresh\n- **Collapse All**: Quick collapse of all folders\n\n### File Operations\n\n| Operation | Description |\n|-----------|-------------|\n| **Create** | New files and folders |\n| **Edit** | Real-time editing with auto-save |\n| **Rename** | Rename files and directories |\n| **Delete** | Remove files and directories (with confirmation) |\n| **Open** | Open files in the editor |\n\n### Remote File Editing\n\n- Real-time editing in the built-in editor\n- Changes automatically saved after 5 seconds\n- Chunked reading for large files\n- Files over 100,000 lines are truncated with warning\n- UTF-8 encoding support\n\n### Multi-Terminal Sessions\n\n- **6 Concurrent Sessions**: Run up to 6 terminals simultaneously\n- **Session Persistence**: Sessions persist when switching panels\n\n[...output truncated: 7123 characters omitted...]","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cat nimoteoffical/docs/introduction.md","_callId":"call_run_command_1773259033710_10"},"result":"**Command**: `cat nimoteoffical/docs/introduction.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n# Introduction\n\nWelcome to NimoteCode, a powerful mobile remote development IDE designed for Android and iOS.\n\n## What is NimoteCode?\n\nNimoteCode is a cross-platform mobile Integrated Development Environment (IDE) that brings the full power of a desktop development environment to your mobile device. Whether you're using a phone or tablet, NimoteCode provides a seamless coding experience.\n\n## Key Features\n\n### 🖥️ Modern Code Editor\n\n- **Syntax Highlighting**: Support for 50+ programming languages\n- **Code Folding**: Collapse and expand functions, classes, and code blocks\n- **Auto-Save**: Changes saved automatically after 5 seconds\n- **Large File Support**: Handle files up to 100,000 lines\n- **Undo/Redo**: Multiple levels of operation history\n- **Virtual Keyboard**: Mobile-optimized programming keyboard\n\n### 🔐 Secure SSH Remote Development\n\n- **SSH Connections**: Password and key-based authentication\n- **SFTP File Manager**: Browse, upload, download, and edit remote files\n- **Multi-Terminal**: Run up to 6 terminal sessions simultaneously\n- **Auto-Reconnect**: Automatic reconnection after disconnect (up to 2 attempts)\n- **Connection Status**: Real-time connection status display\n\n### 🖥️ Terminal Features\n\n- **xterm Compatible**: Full terminal emulator support\n- **ANSI Colors**: Complete color support for commands\n- **Quick Commands**: One-click access to common commands\n- **AI Analysis**: Intelligent terminal output analysis\n- **Full Screen Mode**: Expand terminal to full screen\n\n### 🤖 AI-Powered Assistant\n\n- **Multi-Provider Support**: OpenAI, Ollama, SiliconFlow, Groq\n- **Chat Mode**: Ask questions and get help\n- **Edit Mode**: AI-assisted code modifications\n- **Context Aware**: Automatically includes current file context\n- **Streaming Responses**: Real-time AI response display\n\n### 📦 GitHub Integration\n\n- **Repository Access**: Browse all your repos (public and private)\n- **File Editing**: Edit files directly from your device\n- **Auto-Commit**: Changes are automatically committed\n- **Branch Support**: Work with different branches\n- **OAuth Authentication**: Secure GitHub login\n\n### 🔧 Git Version Control\n\n- **Visual Git**: See your changes at a glance\n- **Commit History**: Browse and compare commits\n- **Diff Viewer**: Visual comparison of changes\n- **Line History**: See who changed what and when\n- **Real-time Status**: Status refreshes every 8 seconds\n\n### 🔍 Powerful Search\n\n- **File Search**: Find files by name\n- **Content Search**: Search within files\n- **Symbol Search**: Jump to functions, classes, variables\n- **Remote Search**: Search on remote servers\n\n### 🎨 Customizable Interface\n\n- **6 Themes**: Dark, Light, Solarized Dark, Solarized Light, Dracula, Monokai\n- **Responsive Layout**: Adapts to phones and tablets\n- **Three-Column Layout**: Efficient workspace organization\n- **Status Bar**: Shows cursor position, encoding, save status\n\n\n[...output truncated: 3422 characters omitted...]","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"ls -la nimoteoffical/docs/.vitepress/","_callId":"call_run_command_1773259035404_11"},"result":"**Command**: `ls -la nimoteoffical/docs/.vitepress/`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 20\ndrwxr-xr-x 4 elliot elliot 4096 Mar 11 19:05 .\ndrwxr-xr-x 6 elliot elliot 4096 Mar 11 18:34 ..\n-rw-r--r-- 1 elliot elliot 3910 Mar 11 18:51 config.ts\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 19:05 dist\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 19:28 theme\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cat nimoteoffical/docs/.vitepress/config.ts","_callId":"call_run_command_1773259037024_12"},"result":"**Command**: `cat nimoteoffical/docs/.vitepress/config.ts`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\nimport { defineConfig } from 'vitepress'\n\nexport default defineConfig({\n title: 'NIMOTECODE',\n description: 'A powerful mobile remote IDE for developers',\n base: '/',\n\n locales: {\n root: {\n label: 'English',\n lang: 'en-US',\n themeConfig: {\n nav: [\n { text: 'Features', link: '/features' },\n { text: 'Support', link: '/support' },\n { text: 'Privacy', link: '/privacy' },\n { text: 'Terms', link: '/terms' }\n ],\n sidebar: {\n '/': [\n {\n text: 'Getting Started',\n items: [\n { text: 'Quick Start', link: '/docs/quick-start' },\n { text: 'Introduction', link: '/introduction' },\n { text: 'Features', link: '/features' },\n { text: 'Download', link: '/download' }\n ]\n },\n {\n text: 'Documentation',\n items: [\n { text: 'SSH Remote Development', link: '/docs/ssh' },\n { text: 'Terminal Usage', link: '/docs/terminal' },\n { text: 'GitHub Integration', link: '/docs/github' },\n { text: 'AI Assistant', link: '/docs/ai' },\n { text: 'Git Version Control', link: '/docs/git' },\n { text: 'Editor Features', link: '/docs/editor' }\n ]\n },\n {\n text: 'Configuration',\n items: [\n { text: 'Configuration Examples', link: '/docs/configuration' }\n ]\n },\n {\n text: 'Help',\n items: [\n { text: 'FAQ', link: '/docs/faq' },\n { text: 'Support', link: '/support' }\n ]\n }\n ]\n }\n }\n },\n\n zh: {\n label: '中文',\n lang: 'zh-CN',\n link: '/zh/', \n themeConfig: {\n nav: [\n { text: '功能', link: '/zh/features' },\n { text: '支持', link: '/zh/support' },\n { text: '隐私政策', link: '/zh/privacy' },\n { text: '服务条款', link: '/zh/terms' }\n ],\n sidebar: {\n '/zh/': [\n {\n text: '开始使用',\n items: [\n { text: '快速入门', link: '/zh/docs/quick-start' },\n { text: '简介', link: '/zh/introduction' },\n { text: '功能特性', link: '/zh/features' },\n { text: '下载安装', link: '/zh/download' }\n ]\n },\n {\n text: '文档指南',\n items: [\n { text: 'SSH 远程开发', link: '/zh/docs/ssh' },\n { text: '终端使用', link: '/zh/docs/terminal' },\n { text: 'GitHub 集成', link: '/zh/docs/github' },\n { text: 'AI 助手', link: '/zh/docs/ai' },\n { text: 'Git 版本控制', link: '/zh/docs/git' },\n\n[...output truncated: 871 characters omitted...]","isError":false,"isPending":false}]},{"role":"assistant","content":"⛔ 操作已取消","displayContent":"⛔ 操作已取消","attachedFileName":null,"attachedFileLength":null,"attachedWasTruncated":null,"toolUsages":[{"toolName":"list_files","arguments":{"path":".","_callId":"call_list_files_1773259020880_0"},"result":"Directory listing is not available for remote (SSH) workspaces. Use read_file to work with the currently open file.","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"ls -la","_callId":"call_run_command_1773259021732_1"},"result":"**Command**: `ls -la`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 22128\ndrwx------ 13 elliot elliot 4096 Mar 11 19:44 .\ndrwxr-xr-x 4 root root 4096 Oct 26 09:48 ..\n-rw------- 1 elliot elliot 24566 Mar 11 19:44 .bash_history\n-rw-r--r-- 1 elliot elliot 220 May 13 2025 .bash_logout\n-rw-r--r-- 1 elliot elliot 3523 May 13 2025 .bashrc\ndrwxr-xr-x 4 elliot elliot 4096 Mar 10 23:25 .cache\n-rw-r--r-- 1 elliot elliot 22426346 Dec 19 17:53 ClashX.dmg\ndrwx------ 4 elliot elliot 4096 Mar 10 23:25 .config\ndrwxr-xr-x 5 elliot elliot 4096 Mar 10 02:01 cpp_aux_tutorial\n-rw-r--r-- 1 elliot elliot 12288 Nov 20 08:27 .create.txt.swp\n-rw-r--r-- 1 elliot elliot 57 Mar 9 23:13 .gitconfig\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 infoNotifier.value\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 isLoadingNotifier.value\n-rw------- 1 elliot elliot 20 Mar 10 23:48 .lesshst\ndrwxr-xr-x 27 elliot elliot 4096 Jan 17 08:22 linux_old1\ndrwxr-xr-x 5 elliot elliot 4096 Mar 10 23:24 .local\ndrwxr-xr-x 2 elliot elliot 4096 Mar 9 22:58 mytest\ndrwxr-xr-x 18 elliot elliot 4096 Mar 10 23:45 nextcode\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 nimoteoffical\n-rw------- 1 elliot elliot 0 Sep 14 17:37 .node_repl_history\ndrwxr-xr-x 5 elliot elliot 4096 Mar 11 18:04 .npm\n-rw-r--r-- 1 elliot elliot 807 May 13 2025 .profile\ndrwxr-xr-x 11 elliot elliot 4096 Oct 19 11:48 ruoyi-rust\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 _selected\n-rw-r--r-- 1 elliot elliot 0 Sep 14 09:48 .sudo_as_admin_successful\ndrwxr-xr-x 5 elliot elliot 4096 Mar 11 17:34 testagent\n-rw-r--r-- 1 elliot elliot 1088 Jan 6 07:01 test.py\n-rw-r--r-- 1 elliot elliot 12288 Nov 28 18:36 .test.txt.swi\n-rw-r--r-- 1 elliot elliot 12288 Nov 23 06:00 .test.txt.swj\n-rw-r--r-- 1 elliot elliot 12288 Nov 22 13:05 .test.txt.swk\n-rw-r--r-- 1 elliot elliot 12288 Nov 22 10:15 .test.txt.swl\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:17 .test.txt.swm\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:14 .test.txt.swn\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:14 .test.txt.swo\n-rw-r--r-- 1 elliot elliot 12288 Oct 6 16:45 .test.txt.swp\n-rw------- 1 elliot elliot 11554 Feb 17 04:52 .viminfo\n-rw-r--r-- 1 elliot elliot 165 Sep 14 17:34 .wget-hsts\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 workspace.isRemote\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"ls -la nimoteoffical/","_callId":"call_run_command_1773259022964_2"},"result":"**Command**: `ls -la nimoteoffical/`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 132\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 .\ndrwx------ 13 elliot elliot 4096 Mar 11 19:44 ..\ndrwxr-xr-x 6 elliot elliot 4096 Mar 11 18:34 docs\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:53 features\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 .git\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 17:59 .github\n-rw-r--r-- 1 elliot elliot 79 Mar 11 17:59 .gitignore\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 19:56 .nimote\ndrwxr-xr-x 79 elliot elliot 4096 Mar 11 19:04 node_modules\n-rw-r--r-- 1 elliot elliot 267 Mar 11 17:59 package.json\n-rw-r--r-- 1 elliot elliot 88522 Mar 11 19:04 package-lock.json\n-rw-r--r-- 1 elliot elliot 60 Mar 11 17:59 README.MD\n\n```\n\n","isError":false,"isPending":false},{"toolName":"read_file","arguments":{"_callId":"call_read_file_1773259024109_3"},"result":"❌ No file is currently open in the editor. Please open a file first.","isError":true,"isPending":false},{"toolName":"run_command","arguments":{"command":"cat nimoteoffical/package.json","_callId":"call_run_command_1773259025135_4"},"result":"**Command**: `cat nimoteoffical/package.json`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n{\n \"name\": \"NimoteCode\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"docs:dev\": \"vitepress dev docs\",\n \"docs:build\": \"vitepress build docs\",\n \"docs:preview\": \"vitepress preview docs\"\n },\n \"devDependencies\": {\n \"vitepress\": \"^1.1.0\"\n }\n}\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cat nimoteoffical/README.MD","_callId":"call_run_command_1773259026610_5"},"result":"**Command**: `cat nimoteoffical/README.MD`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n## run\nnpm run preview\nnpm run build\ngit push -f origin main\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"find nimoteoffical -type f -name \"*.md\" | head -20","_callId":"call_run_command_1773259027943_6"},"result":"**Command**: `find nimoteoffical -type f -name \"*.md\" | head -20`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\nnimoteoffical/node_modules/@vue/compiler-dom/README.md\nnimoteoffical/node_modules/@vue/shared/README.md\nnimoteoffical/node_modules/@vue/server-renderer/README.md\nnimoteoffical/node_modules/@vue/reactivity/README.md\nnimoteoffical/node_modules/@vue/devtools-api/README.md\nnimoteoffical/node_modules/@vue/runtime-core/README.md\nnimoteoffical/node_modules/@vue/compiler-core/README.md\nnimoteoffical/node_modules/@vue/compiler-sfc/README.md\nnimoteoffical/node_modules/@vue/devtools-kit/README.md\nnimoteoffical/node_modules/@vue/runtime-dom/README.md\nnimoteoffical/node_modules/@vue/compiler-ssr/README.md\nnimoteoffical/node_modules/@vue/devtools-shared/README.md\nnimoteoffical/node_modules/character-entities-legacy/readme.md\nnimoteoffical/node_modules/rfdc/readme.md\nnimoteoffical/node_modules/regex-utilities/README.md\nnimoteoffical/node_modules/oniguruma-to-es/README.md\nnimoteoffical/node_modules/devlop/readme.md\nnimoteoffical/node_modules/copy-anything/README.md\nnimoteoffical/node_modules/regex/README.md\nnimoteoffical/node_modules/birpc/README.md\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"ls -la nimoteoffical/docs/ && ls -la nimoteoffical/features/","_callId":"call_run_command_1773259029223_7"},"result":"**Command**: `ls -la nimoteoffical/docs/ && ls -la nimoteoffical/features/`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 80\ndrwxr-xr-x 6 elliot elliot 4096 Mar 11 18:34 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:49 docs\n-rw-r--r-- 1 elliot elliot 4462 Mar 11 18:34 docs.md\n-rw-r--r-- 1 elliot elliot 3614 Mar 11 18:35 download.md\n-rw-r--r-- 1 elliot elliot 12318 Mar 11 18:31 features.md\n-rw-r--r-- 1 elliot elliot 1911 Mar 11 18:46 index.md\n-rw-r--r-- 1 elliot elliot 6371 Mar 11 18:34 introduction.md\n-rw-r--r-- 1 elliot elliot 4096 Mar 11 18:03 privacy.md\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 17:59 public\n-rw-r--r-- 1 elliot elliot 3281 Mar 11 18:03 support.md\n-rw-r--r-- 1 elliot elliot 5342 Mar 11 18:03 terms.md\ndrwxr-xr-x 4 elliot elliot 4096 Mar 11 19:05 .vitepress\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 18:36 zh\ntotal 8\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:53 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cat nimoteoffical/docs/index.md","_callId":"call_run_command_1773259030579_8"},"result":"**Command**: `cat nimoteoffical/docs/index.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n---\nlayout: home\ntitle: NimoteCode\ntitleTemplate: false\n\nhero:\n name: NimoteCode\n text: Mobile Remote Development IDE\n tagline: True development experience — anytime, anywhere — right from your phone or tablet.\n actions:\n - theme: brand\n text: Quick Start Guide\n link: /docs/quick-start\n - theme: brand\n text: Download on the App Store\n link: https://apps.apple.com/app/idXXXXXX\n - theme: brand\n text: Download on Google Play\n link: https://play.google.com/store/apps/details?id=com.nimotecode\n - theme: alt\n text: View on GitHub\n link: https://github.com/nimotecode/nimote_issues\n\nfeatures:\n - title: 🔒 Secure SSH Remote Terminal\n details: Establish encrypted SSH connections to your servers with support for multiple independent sessions running in parallel.\n icon: 🔐\n\n - title: ⚡ Flutter + Rust Powered\n details: Delivers a responsive cross-platform interface combined with high-performance native backend capabilities.\n icon: ⚡\n\n - title: 📂 Integrated SFTP File Explorer\n details: Seamlessly browse, upload, download, edit, and manage files on remote servers with full filesystem access.\n icon: 📂\n\n - title: 🎨 Advanced Syntax Highlighting\n details: Powered by Tree-sitter — accurate, fast, and supports dozens of programming languages out of the box.\n icon: 🎨\n\n - title: 🤖 AI Code Intelligence\n details: Integrate your preferred LLM to get context-aware completions, refactoring suggestions, and automated code edits.\n icon: 🤖\n\n - title: 📊 Visual Git Integration\n details: Repository status overview, commit history visualization, diff viewer, and per-file/line change tracking — all built-in.\n icon: 📊\n\n - title: 📱 Adaptive & Modern UI\n details: Fully responsive design for phones and tablets, with light/dark mode and custom theme support.\n icon: 📱\n---\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cat nimoteoffical/docs/features.md","_callId":"call_run_command_1773259032087_9"},"result":"**Command**: `cat nimoteoffical/docs/features.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n# Features\n\nExplore all the powerful features NimoteCode has to offer.\n\n## Core Editor\n\n### Syntax Highlighting\n\nNimoteCode supports syntax highlighting for 50+ programming languages:\n\n| Category | Languages |\n|----------|-----------|\n| **Web** | JavaScript, TypeScript, HTML, CSS, Vue, React |\n| **Backend** | Python, Java, Go, Rust, C/C++, C# |\n| **Mobile** | Swift, Kotlin, Dart, Flutter |\n| **Data** | SQL, JSON, YAML, TOML, XML |\n| **Scripting** | Bash, PowerShell, Python, Ruby |\n| **Config** | Dockerfile, Kubernetes, Nginx, Apache |\n\n### Code Folding\n\nCollapse and expand code blocks for better navigation:\n\n- Functions and methods\n- Classes and structs\n- Conditional blocks\n- Loops\n- Comments\n\n### Editor Features\n\n| Feature | Description |\n|---------|-------------|\n| **Auto-Save** | Changes saved automatically after 5 seconds |\n| **Undo/Redo** | Multiple levels of undo history |\n| **Cut/Copy/Paste** | Full clipboard support |\n| **Select All** | Quick selection of all content |\n| **Cursor Position** | Real-time line and column display |\n| **Context Menu** | Right-click for quick actions |\n| **Keyboard Shortcuts** | Ctrl+C/V/X and more |\n| **Virtual Keyboard** | Mobile-optimized programming keyboard |\n\n### Large File Support\n\n- Handle files up to **100,000 lines**\n- Chunked reading for large files\n- Automatic truncation warning\n- Smooth scrolling performance\n\n### Save States\n\n- **Dirty Flag**: Shows unsaved changes\n- **Saving Indicator**: Shows when saving is in progress\n- **Saved Confirmation**: Visual feedback when save completes\n\n## SSH Remote Development\n\n### Connection Management\n\n| Feature | Details |\n|---------|---------|\n| **Authentication** | Password and SSH key support |\n| **Timeout** | 10-second connection timeout |\n| **Auto-Reconnect** | Up to 2 reconnection attempts |\n| **Status Display** | Real-time connection status |\n\n### Remote File Browser\n\n- **Tree View**: Visual file system navigation\n- **File Icons**: Type-specific icons\n- **Path Navigation**: Auto-expand to current file\n- **Directory Caching**: Performance optimization\n- **Refresh**: Manual directory refresh\n- **Collapse All**: Quick collapse of all folders\n\n### File Operations\n\n| Operation | Description |\n|-----------|-------------|\n| **Create** | New files and folders |\n| **Edit** | Real-time editing with auto-save |\n| **Rename** | Rename files and directories |\n| **Delete** | Remove files and directories (with confirmation) |\n| **Open** | Open files in the editor |\n\n### Remote File Editing\n\n- Real-time editing in the built-in editor\n- Changes automatically saved after 5 seconds\n- Chunked reading for large files\n- Files over 100,000 lines are truncated with warning\n- UTF-8 encoding support\n\n### Multi-Terminal Sessions\n\n- **6 Concurrent Sessions**: Run up to 6 terminals simultaneously\n- **Session Persistence**: Sessions persist when switching panels\n\n[...output truncated: 7123 characters omitted...]","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cat nimoteoffical/docs/introduction.md","_callId":"call_run_command_1773259033710_10"},"result":"**Command**: `cat nimoteoffical/docs/introduction.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n# Introduction\n\nWelcome to NimoteCode, a powerful mobile remote development IDE designed for Android and iOS.\n\n## What is NimoteCode?\n\nNimoteCode is a cross-platform mobile Integrated Development Environment (IDE) that brings the full power of a desktop development environment to your mobile device. Whether you're using a phone or tablet, NimoteCode provides a seamless coding experience.\n\n## Key Features\n\n### 🖥️ Modern Code Editor\n\n- **Syntax Highlighting**: Support for 50+ programming languages\n- **Code Folding**: Collapse and expand functions, classes, and code blocks\n- **Auto-Save**: Changes saved automatically after 5 seconds\n- **Large File Support**: Handle files up to 100,000 lines\n- **Undo/Redo**: Multiple levels of operation history\n- **Virtual Keyboard**: Mobile-optimized programming keyboard\n\n### 🔐 Secure SSH Remote Development\n\n- **SSH Connections**: Password and key-based authentication\n- **SFTP File Manager**: Browse, upload, download, and edit remote files\n- **Multi-Terminal**: Run up to 6 terminal sessions simultaneously\n- **Auto-Reconnect**: Automatic reconnection after disconnect (up to 2 attempts)\n- **Connection Status**: Real-time connection status display\n\n### 🖥️ Terminal Features\n\n- **xterm Compatible**: Full terminal emulator support\n- **ANSI Colors**: Complete color support for commands\n- **Quick Commands**: One-click access to common commands\n- **AI Analysis**: Intelligent terminal output analysis\n- **Full Screen Mode**: Expand terminal to full screen\n\n### 🤖 AI-Powered Assistant\n\n- **Multi-Provider Support**: OpenAI, Ollama, SiliconFlow, Groq\n- **Chat Mode**: Ask questions and get help\n- **Edit Mode**: AI-assisted code modifications\n- **Context Aware**: Automatically includes current file context\n- **Streaming Responses**: Real-time AI response display\n\n### 📦 GitHub Integration\n\n- **Repository Access**: Browse all your repos (public and private)\n- **File Editing**: Edit files directly from your device\n- **Auto-Commit**: Changes are automatically committed\n- **Branch Support**: Work with different branches\n- **OAuth Authentication**: Secure GitHub login\n\n### 🔧 Git Version Control\n\n- **Visual Git**: See your changes at a glance\n- **Commit History**: Browse and compare commits\n- **Diff Viewer**: Visual comparison of changes\n- **Line History**: See who changed what and when\n- **Real-time Status**: Status refreshes every 8 seconds\n\n### 🔍 Powerful Search\n\n- **File Search**: Find files by name\n- **Content Search**: Search within files\n- **Symbol Search**: Jump to functions, classes, variables\n- **Remote Search**: Search on remote servers\n\n### 🎨 Customizable Interface\n\n- **6 Themes**: Dark, Light, Solarized Dark, Solarized Light, Dracula, Monokai\n- **Responsive Layout**: Adapts to phones and tablets\n- **Three-Column Layout**: Efficient workspace organization\n- **Status Bar**: Shows cursor position, encoding, save status\n\n\n[...output truncated: 3422 characters omitted...]","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"ls -la nimoteoffical/docs/.vitepress/","_callId":"call_run_command_1773259035404_11"},"result":"**Command**: `ls -la nimoteoffical/docs/.vitepress/`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 20\ndrwxr-xr-x 4 elliot elliot 4096 Mar 11 19:05 .\ndrwxr-xr-x 6 elliot elliot 4096 Mar 11 18:34 ..\n-rw-r--r-- 1 elliot elliot 3910 Mar 11 18:51 config.ts\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 19:05 dist\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 19:28 theme\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cat nimoteoffical/docs/.vitepress/config.ts","_callId":"call_run_command_1773259037024_12"},"result":"**Command**: `cat nimoteoffical/docs/.vitepress/config.ts`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\nimport { defineConfig } from 'vitepress'\n\nexport default defineConfig({\n title: 'NIMOTECODE',\n description: 'A powerful mobile remote IDE for developers',\n base: '/',\n\n locales: {\n root: {\n label: 'English',\n lang: 'en-US',\n themeConfig: {\n nav: [\n { text: 'Features', link: '/features' },\n { text: 'Support', link: '/support' },\n { text: 'Privacy', link: '/privacy' },\n { text: 'Terms', link: '/terms' }\n ],\n sidebar: {\n '/': [\n {\n text: 'Getting Started',\n items: [\n { text: 'Quick Start', link: '/docs/quick-start' },\n { text: 'Introduction', link: '/introduction' },\n { text: 'Features', link: '/features' },\n { text: 'Download', link: '/download' }\n ]\n },\n {\n text: 'Documentation',\n items: [\n { text: 'SSH Remote Development', link: '/docs/ssh' },\n { text: 'Terminal Usage', link: '/docs/terminal' },\n { text: 'GitHub Integration', link: '/docs/github' },\n { text: 'AI Assistant', link: '/docs/ai' },\n { text: 'Git Version Control', link: '/docs/git' },\n { text: 'Editor Features', link: '/docs/editor' }\n ]\n },\n {\n text: 'Configuration',\n items: [\n { text: 'Configuration Examples', link: '/docs/configuration' }\n ]\n },\n {\n text: 'Help',\n items: [\n { text: 'FAQ', link: '/docs/faq' },\n { text: 'Support', link: '/support' }\n ]\n }\n ]\n }\n }\n },\n\n zh: {\n label: '中文',\n lang: 'zh-CN',\n link: '/zh/', \n themeConfig: {\n nav: [\n { text: '功能', link: '/zh/features' },\n { text: '支持', link: '/zh/support' },\n { text: '隐私政策', link: '/zh/privacy' },\n { text: '服务条款', link: '/zh/terms' }\n ],\n sidebar: {\n '/zh/': [\n {\n text: '开始使用',\n items: [\n { text: '快速入门', link: '/zh/docs/quick-start' },\n { text: '简介', link: '/zh/introduction' },\n { text: '功能特性', link: '/zh/features' },\n { text: '下载安装', link: '/zh/download' }\n ]\n },\n {\n text: '文档指南',\n items: [\n { text: 'SSH 远程开发', link: '/zh/docs/ssh' },\n { text: '终端使用', link: '/zh/docs/terminal' },\n { text: 'GitHub 集成', link: '/zh/docs/github' },\n { text: 'AI 助手', link: '/zh/docs/ai' },\n { text: 'Git 版本控制', link: '/zh/docs/git' },\n\n[...output truncated: 871 characters omitted...]","isError":false,"isPending":false}]}],"tool_usages":[{"toolName":"list_files","arguments":{"path":".","_callId":"call_list_files_1773259020880_0"},"result":"Directory listing is not available for remote (SSH) workspaces. Use read_file to work with the currently open file.","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"ls -la","_callId":"call_run_command_1773259021732_1"},"result":"**Command**: `ls -la`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 22128\ndrwx------ 13 elliot elliot 4096 Mar 11 19:44 .\ndrwxr-xr-x 4 root root 4096 Oct 26 09:48 ..\n-rw------- 1 elliot elliot 24566 Mar 11 19:44 .bash_history\n-rw-r--r-- 1 elliot elliot 220 May 13 2025 .bash_logout\n-rw-r--r-- 1 elliot elliot 3523 May 13 2025 .bashrc\ndrwxr-xr-x 4 elliot elliot 4096 Mar 10 23:25 .cache\n-rw-r--r-- 1 elliot elliot 22426346 Dec 19 17:53 ClashX.dmg\ndrwx------ 4 elliot elliot 4096 Mar 10 23:25 .config\ndrwxr-xr-x 5 elliot elliot 4096 Mar 10 02:01 cpp_aux_tutorial\n-rw-r--r-- 1 elliot elliot 12288 Nov 20 08:27 .create.txt.swp\n-rw-r--r-- 1 elliot elliot 57 Mar 9 23:13 .gitconfig\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 infoNotifier.value\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 isLoadingNotifier.value\n-rw------- 1 elliot elliot 20 Mar 10 23:48 .lesshst\ndrwxr-xr-x 27 elliot elliot 4096 Jan 17 08:22 linux_old1\ndrwxr-xr-x 5 elliot elliot 4096 Mar 10 23:24 .local\ndrwxr-xr-x 2 elliot elliot 4096 Mar 9 22:58 mytest\ndrwxr-xr-x 18 elliot elliot 4096 Mar 10 23:45 nextcode\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 nimoteoffical\n-rw------- 1 elliot elliot 0 Sep 14 17:37 .node_repl_history\ndrwxr-xr-x 5 elliot elliot 4096 Mar 11 18:04 .npm\n-rw-r--r-- 1 elliot elliot 807 May 13 2025 .profile\ndrwxr-xr-x 11 elliot elliot 4096 Oct 19 11:48 ruoyi-rust\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 _selected\n-rw-r--r-- 1 elliot elliot 0 Sep 14 09:48 .sudo_as_admin_successful\ndrwxr-xr-x 5 elliot elliot 4096 Mar 11 17:34 testagent\n-rw-r--r-- 1 elliot elliot 1088 Jan 6 07:01 test.py\n-rw-r--r-- 1 elliot elliot 12288 Nov 28 18:36 .test.txt.swi\n-rw-r--r-- 1 elliot elliot 12288 Nov 23 06:00 .test.txt.swj\n-rw-r--r-- 1 elliot elliot 12288 Nov 22 13:05 .test.txt.swk\n-rw-r--r-- 1 elliot elliot 12288 Nov 22 10:15 .test.txt.swl\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:17 .test.txt.swm\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:14 .test.txt.swn\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:14 .test.txt.swo\n-rw-r--r-- 1 elliot elliot 12288 Oct 6 16:45 .test.txt.swp\n-rw------- 1 elliot elliot 11554 Feb 17 04:52 .viminfo\n-rw-r--r-- 1 elliot elliot 165 Sep 14 17:34 .wget-hsts\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 workspace.isRemote\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"ls -la nimoteoffical/","_callId":"call_run_command_1773259022964_2"},"result":"**Command**: `ls -la nimoteoffical/`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 132\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 .\ndrwx------ 13 elliot elliot 4096 Mar 11 19:44 ..\ndrwxr-xr-x 6 elliot elliot 4096 Mar 11 18:34 docs\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:53 features\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 .git\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 17:59 .github\n-rw-r--r-- 1 elliot elliot 79 Mar 11 17:59 .gitignore\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 19:56 .nimote\ndrwxr-xr-x 79 elliot elliot 4096 Mar 11 19:04 node_modules\n-rw-r--r-- 1 elliot elliot 267 Mar 11 17:59 package.json\n-rw-r--r-- 1 elliot elliot 88522 Mar 11 19:04 package-lock.json\n-rw-r--r-- 1 elliot elliot 60 Mar 11 17:59 README.MD\n\n```\n\n","isError":false,"isPending":false},{"toolName":"read_file","arguments":{"_callId":"call_read_file_1773259024109_3"},"result":"❌ No file is currently open in the editor. Please open a file first.","isError":true,"isPending":false},{"toolName":"run_command","arguments":{"command":"cat nimoteoffical/package.json","_callId":"call_run_command_1773259025135_4"},"result":"**Command**: `cat nimoteoffical/package.json`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n{\n \"name\": \"NimoteCode\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"docs:dev\": \"vitepress dev docs\",\n \"docs:build\": \"vitepress build docs\",\n \"docs:preview\": \"vitepress preview docs\"\n },\n \"devDependencies\": {\n \"vitepress\": \"^1.1.0\"\n }\n}\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cat nimoteoffical/README.MD","_callId":"call_run_command_1773259026610_5"},"result":"**Command**: `cat nimoteoffical/README.MD`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n## run\nnpm run preview\nnpm run build\ngit push -f origin main\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"find nimoteoffical -type f -name \"*.md\" | head -20","_callId":"call_run_command_1773259027943_6"},"result":"**Command**: `find nimoteoffical -type f -name \"*.md\" | head -20`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\nnimoteoffical/node_modules/@vue/compiler-dom/README.md\nnimoteoffical/node_modules/@vue/shared/README.md\nnimoteoffical/node_modules/@vue/server-renderer/README.md\nnimoteoffical/node_modules/@vue/reactivity/README.md\nnimoteoffical/node_modules/@vue/devtools-api/README.md\nnimoteoffical/node_modules/@vue/runtime-core/README.md\nnimoteoffical/node_modules/@vue/compiler-core/README.md\nnimoteoffical/node_modules/@vue/compiler-sfc/README.md\nnimoteoffical/node_modules/@vue/devtools-kit/README.md\nnimoteoffical/node_modules/@vue/runtime-dom/README.md\nnimoteoffical/node_modules/@vue/compiler-ssr/README.md\nnimoteoffical/node_modules/@vue/devtools-shared/README.md\nnimoteoffical/node_modules/character-entities-legacy/readme.md\nnimoteoffical/node_modules/rfdc/readme.md\nnimoteoffical/node_modules/regex-utilities/README.md\nnimoteoffical/node_modules/oniguruma-to-es/README.md\nnimoteoffical/node_modules/devlop/readme.md\nnimoteoffical/node_modules/copy-anything/README.md\nnimoteoffical/node_modules/regex/README.md\nnimoteoffical/node_modules/birpc/README.md\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"ls -la nimoteoffical/docs/ && ls -la nimoteoffical/features/","_callId":"call_run_command_1773259029223_7"},"result":"**Command**: `ls -la nimoteoffical/docs/ && ls -la nimoteoffical/features/`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 80\ndrwxr-xr-x 6 elliot elliot 4096 Mar 11 18:34 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:49 docs\n-rw-r--r-- 1 elliot elliot 4462 Mar 11 18:34 docs.md\n-rw-r--r-- 1 elliot elliot 3614 Mar 11 18:35 download.md\n-rw-r--r-- 1 elliot elliot 12318 Mar 11 18:31 features.md\n-rw-r--r-- 1 elliot elliot 1911 Mar 11 18:46 index.md\n-rw-r--r-- 1 elliot elliot 6371 Mar 11 18:34 introduction.md\n-rw-r--r-- 1 elliot elliot 4096 Mar 11 18:03 privacy.md\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 17:59 public\n-rw-r--r-- 1 elliot elliot 3281 Mar 11 18:03 support.md\n-rw-r--r-- 1 elliot elliot 5342 Mar 11 18:03 terms.md\ndrwxr-xr-x 4 elliot elliot 4096 Mar 11 19:05 .vitepress\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 18:36 zh\ntotal 8\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:53 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cat nimoteoffical/docs/index.md","_callId":"call_run_command_1773259030579_8"},"result":"**Command**: `cat nimoteoffical/docs/index.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n---\nlayout: home\ntitle: NimoteCode\ntitleTemplate: false\n\nhero:\n name: NimoteCode\n text: Mobile Remote Development IDE\n tagline: True development experience — anytime, anywhere — right from your phone or tablet.\n actions:\n - theme: brand\n text: Quick Start Guide\n link: /docs/quick-start\n - theme: brand\n text: Download on the App Store\n link: https://apps.apple.com/app/idXXXXXX\n - theme: brand\n text: Download on Google Play\n link: https://play.google.com/store/apps/details?id=com.nimotecode\n - theme: alt\n text: View on GitHub\n link: https://github.com/nimotecode/nimote_issues\n\nfeatures:\n - title: 🔒 Secure SSH Remote Terminal\n details: Establish encrypted SSH connections to your servers with support for multiple independent sessions running in parallel.\n icon: 🔐\n\n - title: ⚡ Flutter + Rust Powered\n details: Delivers a responsive cross-platform interface combined with high-performance native backend capabilities.\n icon: ⚡\n\n - title: 📂 Integrated SFTP File Explorer\n details: Seamlessly browse, upload, download, edit, and manage files on remote servers with full filesystem access.\n icon: 📂\n\n - title: 🎨 Advanced Syntax Highlighting\n details: Powered by Tree-sitter — accurate, fast, and supports dozens of programming languages out of the box.\n icon: 🎨\n\n - title: 🤖 AI Code Intelligence\n details: Integrate your preferred LLM to get context-aware completions, refactoring suggestions, and automated code edits.\n icon: 🤖\n\n - title: 📊 Visual Git Integration\n details: Repository status overview, commit history visualization, diff viewer, and per-file/line change tracking — all built-in.\n icon: 📊\n\n - title: 📱 Adaptive & Modern UI\n details: Fully responsive design for phones and tablets, with light/dark mode and custom theme support.\n icon: 📱\n---\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cat nimoteoffical/docs/features.md","_callId":"call_run_command_1773259032087_9"},"result":"**Command**: `cat nimoteoffical/docs/features.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n# Features\n\nExplore all the powerful features NimoteCode has to offer.\n\n## Core Editor\n\n### Syntax Highlighting\n\nNimoteCode supports syntax highlighting for 50+ programming languages:\n\n| Category | Languages |\n|----------|-----------|\n| **Web** | JavaScript, TypeScript, HTML, CSS, Vue, React |\n| **Backend** | Python, Java, Go, Rust, C/C++, C# |\n| **Mobile** | Swift, Kotlin, Dart, Flutter |\n| **Data** | SQL, JSON, YAML, TOML, XML |\n| **Scripting** | Bash, PowerShell, Python, Ruby |\n| **Config** | Dockerfile, Kubernetes, Nginx, Apache |\n\n### Code Folding\n\nCollapse and expand code blocks for better navigation:\n\n- Functions and methods\n- Classes and structs\n- Conditional blocks\n- Loops\n- Comments\n\n### Editor Features\n\n| Feature | Description |\n|---------|-------------|\n| **Auto-Save** | Changes saved automatically after 5 seconds |\n| **Undo/Redo** | Multiple levels of undo history |\n| **Cut/Copy/Paste** | Full clipboard support |\n| **Select All** | Quick selection of all content |\n| **Cursor Position** | Real-time line and column display |\n| **Context Menu** | Right-click for quick actions |\n| **Keyboard Shortcuts** | Ctrl+C/V/X and more |\n| **Virtual Keyboard** | Mobile-optimized programming keyboard |\n\n### Large File Support\n\n- Handle files up to **100,000 lines**\n- Chunked reading for large files\n- Automatic truncation warning\n- Smooth scrolling performance\n\n### Save States\n\n- **Dirty Flag**: Shows unsaved changes\n- **Saving Indicator**: Shows when saving is in progress\n- **Saved Confirmation**: Visual feedback when save completes\n\n## SSH Remote Development\n\n### Connection Management\n\n| Feature | Details |\n|---------|---------|\n| **Authentication** | Password and SSH key support |\n| **Timeout** | 10-second connection timeout |\n| **Auto-Reconnect** | Up to 2 reconnection attempts |\n| **Status Display** | Real-time connection status |\n\n### Remote File Browser\n\n- **Tree View**: Visual file system navigation\n- **File Icons**: Type-specific icons\n- **Path Navigation**: Auto-expand to current file\n- **Directory Caching**: Performance optimization\n- **Refresh**: Manual directory refresh\n- **Collapse All**: Quick collapse of all folders\n\n### File Operations\n\n| Operation | Description |\n|-----------|-------------|\n| **Create** | New files and folders |\n| **Edit** | Real-time editing with auto-save |\n| **Rename** | Rename files and directories |\n| **Delete** | Remove files and directories (with confirmation) |\n| **Open** | Open files in the editor |\n\n### Remote File Editing\n\n- Real-time editing in the built-in editor\n- Changes automatically saved after 5 seconds\n- Chunked reading for large files\n- Files over 100,000 lines are truncated with warning\n- UTF-8 encoding support\n\n### Multi-Terminal Sessions\n\n- **6 Concurrent Sessions**: Run up to 6 terminals simultaneously\n- **Session Persistence**: Sessions persist when switching panels\n\n[...output truncated: 7123 characters omitted...]","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cat nimoteoffical/docs/introduction.md","_callId":"call_run_command_1773259033710_10"},"result":"**Command**: `cat nimoteoffical/docs/introduction.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n# Introduction\n\nWelcome to NimoteCode, a powerful mobile remote development IDE designed for Android and iOS.\n\n## What is NimoteCode?\n\nNimoteCode is a cross-platform mobile Integrated Development Environment (IDE) that brings the full power of a desktop development environment to your mobile device. Whether you're using a phone or tablet, NimoteCode provides a seamless coding experience.\n\n## Key Features\n\n### 🖥️ Modern Code Editor\n\n- **Syntax Highlighting**: Support for 50+ programming languages\n- **Code Folding**: Collapse and expand functions, classes, and code blocks\n- **Auto-Save**: Changes saved automatically after 5 seconds\n- **Large File Support**: Handle files up to 100,000 lines\n- **Undo/Redo**: Multiple levels of operation history\n- **Virtual Keyboard**: Mobile-optimized programming keyboard\n\n### 🔐 Secure SSH Remote Development\n\n- **SSH Connections**: Password and key-based authentication\n- **SFTP File Manager**: Browse, upload, download, and edit remote files\n- **Multi-Terminal**: Run up to 6 terminal sessions simultaneously\n- **Auto-Reconnect**: Automatic reconnection after disconnect (up to 2 attempts)\n- **Connection Status**: Real-time connection status display\n\n### 🖥️ Terminal Features\n\n- **xterm Compatible**: Full terminal emulator support\n- **ANSI Colors**: Complete color support for commands\n- **Quick Commands**: One-click access to common commands\n- **AI Analysis**: Intelligent terminal output analysis\n- **Full Screen Mode**: Expand terminal to full screen\n\n### 🤖 AI-Powered Assistant\n\n- **Multi-Provider Support**: OpenAI, Ollama, SiliconFlow, Groq\n- **Chat Mode**: Ask questions and get help\n- **Edit Mode**: AI-assisted code modifications\n- **Context Aware**: Automatically includes current file context\n- **Streaming Responses**: Real-time AI response display\n\n### 📦 GitHub Integration\n\n- **Repository Access**: Browse all your repos (public and private)\n- **File Editing**: Edit files directly from your device\n- **Auto-Commit**: Changes are automatically committed\n- **Branch Support**: Work with different branches\n- **OAuth Authentication**: Secure GitHub login\n\n### 🔧 Git Version Control\n\n- **Visual Git**: See your changes at a glance\n- **Commit History**: Browse and compare commits\n- **Diff Viewer**: Visual comparison of changes\n- **Line History**: See who changed what and when\n- **Real-time Status**: Status refreshes every 8 seconds\n\n### 🔍 Powerful Search\n\n- **File Search**: Find files by name\n- **Content Search**: Search within files\n- **Symbol Search**: Jump to functions, classes, variables\n- **Remote Search**: Search on remote servers\n\n### 🎨 Customizable Interface\n\n- **6 Themes**: Dark, Light, Solarized Dark, Solarized Light, Dracula, Monokai\n- **Responsive Layout**: Adapts to phones and tablets\n- **Three-Column Layout**: Efficient workspace organization\n- **Status Bar**: Shows cursor position, encoding, save status\n\n\n[...output truncated: 3422 characters omitted...]","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"ls -la nimoteoffical/docs/.vitepress/","_callId":"call_run_command_1773259035404_11"},"result":"**Command**: `ls -la nimoteoffical/docs/.vitepress/`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 20\ndrwxr-xr-x 4 elliot elliot 4096 Mar 11 19:05 .\ndrwxr-xr-x 6 elliot elliot 4096 Mar 11 18:34 ..\n-rw-r--r-- 1 elliot elliot 3910 Mar 11 18:51 config.ts\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 19:05 dist\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 19:28 theme\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cat nimoteoffical/docs/.vitepress/config.ts","_callId":"call_run_command_1773259037024_12"},"result":"**Command**: `cat nimoteoffical/docs/.vitepress/config.ts`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\nimport { defineConfig } from 'vitepress'\n\nexport default defineConfig({\n title: 'NIMOTECODE',\n description: 'A powerful mobile remote IDE for developers',\n base: '/',\n\n locales: {\n root: {\n label: 'English',\n lang: 'en-US',\n themeConfig: {\n nav: [\n { text: 'Features', link: '/features' },\n { text: 'Support', link: '/support' },\n { text: 'Privacy', link: '/privacy' },\n { text: 'Terms', link: '/terms' }\n ],\n sidebar: {\n '/': [\n {\n text: 'Getting Started',\n items: [\n { text: 'Quick Start', link: '/docs/quick-start' },\n { text: 'Introduction', link: '/introduction' },\n { text: 'Features', link: '/features' },\n { text: 'Download', link: '/download' }\n ]\n },\n {\n text: 'Documentation',\n items: [\n { text: 'SSH Remote Development', link: '/docs/ssh' },\n { text: 'Terminal Usage', link: '/docs/terminal' },\n { text: 'GitHub Integration', link: '/docs/github' },\n { text: 'AI Assistant', link: '/docs/ai' },\n { text: 'Git Version Control', link: '/docs/git' },\n { text: 'Editor Features', link: '/docs/editor' }\n ]\n },\n {\n text: 'Configuration',\n items: [\n { text: 'Configuration Examples', link: '/docs/configuration' }\n ]\n },\n {\n text: 'Help',\n items: [\n { text: 'FAQ', link: '/docs/faq' },\n { text: 'Support', link: '/support' }\n ]\n }\n ]\n }\n }\n },\n\n zh: {\n label: '中文',\n lang: 'zh-CN',\n link: '/zh/', \n themeConfig: {\n nav: [\n { text: '功能', link: '/zh/features' },\n { text: '支持', link: '/zh/support' },\n { text: '隐私政策', link: '/zh/privacy' },\n { text: '服务条款', link: '/zh/terms' }\n ],\n sidebar: {\n '/zh/': [\n {\n text: '开始使用',\n items: [\n { text: '快速入门', link: '/zh/docs/quick-start' },\n { text: '简介', link: '/zh/introduction' },\n { text: '功能特性', link: '/zh/features' },\n { text: '下载安装', link: '/zh/download' }\n ]\n },\n {\n text: '文档指南',\n items: [\n { text: 'SSH 远程开发', link: '/zh/docs/ssh' },\n { text: '终端使用', link: '/zh/docs/terminal' },\n { text: 'GitHub 集成', link: '/zh/docs/github' },\n { text: 'AI 助手', link: '/zh/docs/ai' },\n { text: 'Git 版本控制', link: '/zh/docs/git' },\n\n[...output truncated: 871 characters omitted...]","isError":false,"isPending":false}]} \ No newline at end of file diff --git a/.nimote/agent_histories/f221a60c-3ee5-4f9c-9360-ae878901b496/history.json b/.nimote/agent_histories/f221a60c-3ee5-4f9c-9360-ae878901b496/history.json deleted file mode 100644 index d8c1b0c..0000000 --- a/.nimote/agent_histories/f221a60c-3ee5-4f9c-9360-ae878901b496/history.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"f221a60c-3ee5-4f9c-9360-ae878901b496","updated_at":"2026-03-12T04:27:43.327427","messages":[{"role":"user","content":"分析当前项目","displayContent":"分析当前项目","attachedFileName":null,"attachedFileLength":null,"attachedWasTruncated":null,"toolUsages":null},{"role":"assistant","content":"⛔ 操作已取消","displayContent":"⛔ 操作已取消","attachedFileName":null,"attachedFileLength":null,"attachedWasTruncated":null,"toolUsages":[{"toolName":"list_files","arguments":{"path":".","_callId":"call_list_files_1773260848293_0"},"result":"Directory listing is not available for remote (SSH) workspaces. Use read_file to work with the currently open file.","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"ls -la","_callId":"call_run_command_1773260849209_1"},"result":"**Command**: `ls -la`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 22132\ndrwx------ 13 elliot elliot 4096 Mar 11 20:03 .\ndrwxr-xr-x 4 root root 4096 Oct 26 09:48 ..\n-rw------- 1 elliot elliot 24648 Mar 11 20:03 .bash_history\n-rw-r--r-- 1 elliot elliot 220 May 13 2025 .bash_logout\n-rw-r--r-- 1 elliot elliot 3523 May 13 2025 .bashrc\ndrwxr-xr-x 4 elliot elliot 4096 Mar 10 23:25 .cache\n-rw-r--r-- 1 elliot elliot 22426346 Dec 19 17:53 ClashX.dmg\ndrwx------ 4 elliot elliot 4096 Mar 10 23:25 .config\ndrwxr-xr-x 5 elliot elliot 4096 Mar 10 02:01 cpp_aux_tutorial\n-rw-r--r-- 1 elliot elliot 12288 Nov 20 08:27 .create.txt.swp\n-rw-r--r-- 1 elliot elliot 57 Mar 9 23:13 .gitconfig\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 infoNotifier.value\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 isLoadingNotifier.value\n-rw------- 1 elliot elliot 20 Mar 10 23:48 .lesshst\ndrwxr-xr-x 27 elliot elliot 4096 Jan 17 08:22 linux_old1\ndrwxr-xr-x 5 elliot elliot 4096 Mar 10 23:24 .local\ndrwxr-xr-x 2 elliot elliot 4096 Mar 9 22:58 mytest\ndrwxr-xr-x 18 elliot elliot 4096 Mar 10 23:45 nextcode\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 nimoteoffical\n-rw------- 1 elliot elliot 0 Sep 14 17:37 .node_repl_history\ndrwxr-xr-x 5 elliot elliot 4096 Mar 11 18:04 .npm\n-rw-r--r-- 1 elliot elliot 807 May 13 2025 .profile\ndrwxr-xr-x 11 elliot elliot 4096 Oct 19 11:48 ruoyi-rust\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 _selected\n-rw-r--r-- 1 elliot elliot 0 Sep 14 09:48 .sudo_as_admin_successful\ndrwxr-xr-x 5 elliot elliot 4096 Mar 11 17:34 testagent\n-rw-r--r-- 1 elliot elliot 1088 Jan 6 07:01 test.py\n-rw-r--r-- 1 elliot elliot 12288 Nov 28 18:36 .test.txt.swi\n-rw-r--r-- 1 elliot elliot 12288 Nov 23 06:00 .test.txt.swj\n-rw-r--r-- 1 elliot elliot 12288 Nov 22 13:05 .test.txt.swk\n-rw-r--r-- 1 elliot elliot 12288 Nov 22 10:15 .test.txt.swl\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:17 .test.txt.swm\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:14 .test.txt.swn\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:14 .test.txt.swo\n-rw-r--r-- 1 elliot elliot 12288 Oct 6 16:45 .test.txt.swp\n-rw------- 1 elliot elliot 11554 Feb 17 04:52 .viminfo\n-rw-r--r-- 1 elliot elliot 165 Sep 14 17:34 .wget-hsts\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 workspace.isRemote\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && ls -la","_callId":"call_run_command_1773260850713_2"},"result":"**Command**: `cd /home/elliot/nimoteoffical && ls -la`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 132\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 .\ndrwx------ 13 elliot elliot 4096 Mar 11 20:03 ..\ndrwxr-xr-x 6 elliot elliot 4096 Mar 11 18:34 docs\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:53 features\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 20:27 .git\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 17:59 .github\n-rw-r--r-- 1 elliot elliot 79 Mar 11 17:59 .gitignore\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 19:56 .nimote\ndrwxr-xr-x 79 elliot elliot 4096 Mar 11 19:04 node_modules\n-rw-r--r-- 1 elliot elliot 267 Mar 11 17:59 package.json\n-rw-r--r-- 1 elliot elliot 88522 Mar 11 19:04 package-lock.json\n-rw-r--r-- 1 elliot elliot 60 Mar 11 17:59 README.MD\n\n```\n\n","isError":false,"isPending":false},{"toolName":"read_file","arguments":{"_callId":"call_read_file_1773260852094_3"},"result":"❌ No file is currently open in the editor. Please open a file first.","isError":true,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && find . -type f -name \"*.json\" -o -name \"*.md\" -o -name \"*.ts\" -o -name \"*.js\" | head -30","_callId":"call_run_command_1773260853316_4"},"result":"**Command**: `cd /home/elliot/nimoteoffical && find . -type f -name \"*.json\" -o -name \"*.md\" -o -name \"*.ts\" -o -name \"*.js\" | head -30`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n./package.json\n./node_modules/@vue/compiler-dom/index.js\n./node_modules/@vue/compiler-dom/package.json\n./node_modules/@vue/compiler-dom/README.md\n./node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.prod.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-browser.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.d.ts\n./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-browser.prod.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.global.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.global.prod.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js\n./node_modules/@vue/shared/index.js\n./node_modules/@vue/shared/package.json\n./node_modules/@vue/shared/README.md\n./node_modules/@vue/shared/dist/shared.cjs.prod.js\n./node_modules/@vue/shared/dist/shared.cjs.js\n./node_modules/@vue/shared/dist/shared.esm-bundler.js\n./node_modules/@vue/shared/dist/shared.d.ts\n./node_modules/@vue/server-renderer/index.js\n./node_modules/@vue/server-renderer/package.json\n./node_modules/@vue/server-renderer/README.md\n./node_modules/@vue/server-renderer/dist/server-renderer.cjs.js\n./node_modules/@vue/server-renderer/dist/server-renderer.d.ts\n./node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.js\n./node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.prod.js\n./node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js\n./node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js\n./node_modules/@vue/reactivity/index.js\n./node_modules/@vue/reactivity/package.json\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat package.json","_callId":"call_run_command_1773260854556_5"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat package.json`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n{\n \"name\": \"NimoteCode\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"docs:dev\": \"vitepress dev docs\",\n \"docs:build\": \"vitepress build docs\",\n \"docs:preview\": \"vitepress preview docs\"\n },\n \"devDependencies\": {\n \"vitepress\": \"^1.1.0\"\n }\n}\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat README.MD","_callId":"call_run_command_1773260855971_6"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat README.MD`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n## run\nnpm run preview\nnpm run build\ngit push -f origin main\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && ls -la docs/ && ls -la features/ && ls -la .nimote/","_callId":"call_run_command_1773260857323_7"},"result":"**Command**: `cd /home/elliot/nimoteoffical && ls -la docs/ && ls -la features/ && ls -la .nimote/`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 80\ndrwxr-xr-x 6 elliot elliot 4096 Mar 11 18:34 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:49 docs\n-rw-r--r-- 1 elliot elliot 4462 Mar 11 18:34 docs.md\n-rw-r--r-- 1 elliot elliot 3614 Mar 11 18:35 download.md\n-rw-r--r-- 1 elliot elliot 12318 Mar 11 18:31 features.md\n-rw-r--r-- 1 elliot elliot 1911 Mar 11 18:46 index.md\n-rw-r--r-- 1 elliot elliot 6371 Mar 11 18:34 introduction.md\n-rw-r--r-- 1 elliot elliot 4096 Mar 11 18:03 privacy.md\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 17:59 public\n-rw-r--r-- 1 elliot elliot 3281 Mar 11 18:03 support.md\n-rw-r--r-- 1 elliot elliot 5342 Mar 11 18:03 terms.md\ndrwxr-xr-x 4 elliot elliot 4096 Mar 11 19:05 .vitepress\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 18:36 zh\ntotal 8\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:53 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\ntotal 16\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 19:56 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\ndrwxr-xr-x 4 elliot elliot 4096 Mar 11 20:27 agent_histories\n-rw-r--r-- 1 elliot elliot 453 Mar 11 20:27 index.json\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat docs/features.md","_callId":"call_run_command_1773260858639_8"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat docs/features.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n# Features\n\nExplore all the powerful features NimoteCode has to offer.\n\n## Core Editor\n\n### Syntax Highlighting\n\nNimoteCode supports syntax highlighting for 50+ programming languages:\n\n| Category | Languages |\n|----------|-----------|\n| **Web** | JavaScript, TypeScript, HTML, CSS, Vue, React |\n| **Backend** | Python, Java, Go, Rust, C/C++, C# |\n| **Mobile** | Swift, Kotlin, Dart, Flutter |\n| **Data** | SQL, JSON, YAML, TOML, XML |\n| **Scripting** | Bash, PowerShell, Python, Ruby |\n| **Config** | Dockerfile, Kubernetes, Nginx, Apache |\n\n### Code Folding\n\nCollapse and expand code blocks for better navigation:\n\n- Functions and methods\n- Classes and structs\n- Conditional blocks\n- Loops\n- Comments\n\n### Editor Features\n\n| Feature | Description |\n|---------|-------------|\n| **Auto-Save** | Changes saved automatically after 5 seconds |\n| **Undo/Redo** | Multiple levels of undo history |\n| **Cut/Copy/Paste** | Full clipboard support |\n| **Select All** | Quick selection of all content |\n| **Cursor Position** | Real-time line and column display |\n| **Context Menu** | Right-click for quick actions |\n| **Keyboard Shortcuts** | Ctrl+C/V/X and more |\n| **Virtual Keyboard** | Mobile-optimized programming keyboard |\n\n### Large File Support\n\n- Handle files up to **100,000 lines**\n- Chunked reading for large files\n- Automatic truncation warning\n- Smooth scrolling performance\n\n### Save States\n\n- **Dirty Flag**: Shows unsaved changes\n- **Saving Indicator**: Shows when saving is in progress\n- **Saved Confirmation**: Visual feedback when save completes\n\n## SSH Remote Development\n\n### Connection Management\n\n| Feature | Details |\n|---------|---------|\n| **Authentication** | Password and SSH key support |\n| **Timeout** | 10-second connection timeout |\n| **Auto-Reconnect** | Up to 2 reconnection attempts |\n| **Status Display** | Real-time connection status |\n\n### Remote File Browser\n\n- **Tree View**: Visual file system navigation\n- **File Icons**: Type-specific icons\n- **Path Navigation**: Auto-expand to current file\n- **Directory Caching**: Performance optimization\n- **Refresh**: Manual directory refresh\n- **Collapse All**: Quick collapse of all folders\n\n### File Operations\n\n| Operation | Description |\n|-----------|-------------|\n| **Create** | New files and folders |\n| **Edit** | Real-time editing with auto-save |\n| **Rename** | Rename files and directories |\n| **Delete** | Remove files and directories (with confirmation) |\n| **Open** | Open files in the editor |\n\n### Remote File Editing\n\n- Real-time editing in the built-in editor\n- Changes automatically saved after 5 seconds\n- Chunked reading for large files\n- Files over 100,000 lines are truncated with warning\n- UTF-8 encoding support\n\n### Multi-Terminal Sessions\n\n- **6 Concurrent Sessions**: Run up to 6 terminals simultaneously\n- **Session Persistence**: Sessions persist when switching panels\n\n[...output truncated: 7142 characters omitted...]","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat docs/index.md","_callId":"call_run_command_1773260860268_9"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat docs/index.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n---\nlayout: home\ntitle: NimoteCode\ntitleTemplate: false\n\nhero:\n name: NimoteCode\n text: Mobile Remote Development IDE\n tagline: True development experience — anytime, anywhere — right from your phone or tablet.\n actions:\n - theme: brand\n text: Quick Start Guide\n link: /docs/quick-start\n - theme: brand\n text: Download on the App Store\n link: https://apps.apple.com/app/idXXXXXX\n - theme: brand\n text: Download on Google Play\n link: https://play.google.com/store/apps/details?id=com.nimotecode\n - theme: alt\n text: View on GitHub\n link: https://github.com/nimotecode/nimote_issues\n\nfeatures:\n - title: 🔒 Secure SSH Remote Terminal\n details: Establish encrypted SSH connections to your servers with support for multiple independent sessions running in parallel.\n icon: 🔐\n\n - title: ⚡ Flutter + Rust Powered\n details: Delivers a responsive cross-platform interface combined with high-performance native backend capabilities.\n icon: ⚡\n\n - title: 📂 Integrated SFTP File Explorer\n details: Seamlessly browse, upload, download, edit, and manage files on remote servers with full filesystem access.\n icon: 📂\n\n - title: 🎨 Advanced Syntax Highlighting\n details: Powered by Tree-sitter — accurate, fast, and supports dozens of programming languages out of the box.\n icon: 🎨\n\n - title: 🤖 AI Code Intelligence\n details: Integrate your preferred LLM to get context-aware completions, refactoring suggestions, and automated code edits.\n icon: 🤖\n\n - title: 📊 Visual Git Integration\n details: Repository status overview, commit history visualization, diff viewer, and per-file/line change tracking — all built-in.\n icon: 📊\n\n - title: 📱 Adaptive & Modern UI\n details: Fully responsive design for phones and tablets, with light/dark mode and custom theme support.\n icon: 📱\n---\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat docs/introduction.md","_callId":"call_run_command_1773260862105_10"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat docs/introduction.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n# Introduction\n\nWelcome to NimoteCode, a powerful mobile remote development IDE designed for Android and iOS.\n\n## What is NimoteCode?\n\nNimoteCode is a cross-platform mobile Integrated Development Environment (IDE) that brings the full power of a desktop development environment to your mobile device. Whether you're using a phone or tablet, NimoteCode provides a seamless coding experience.\n\n## Key Features\n\n### 🖥️ Modern Code Editor\n\n- **Syntax Highlighting**: Support for 50+ programming languages\n- **Code Folding**: Collapse and expand functions, classes, and code blocks\n- **Auto-Save**: Changes saved automatically after 5 seconds\n- **Large File Support**: Handle files up to 100,000 lines\n- **Undo/Redo**: Multiple levels of operation history\n- **Virtual Keyboard**: Mobile-optimized programming keyboard\n\n### 🔐 Secure SSH Remote Development\n\n- **SSH Connections**: Password and key-based authentication\n- **SFTP File Manager**: Browse, upload, download, and edit remote files\n- **Multi-Terminal**: Run up to 6 terminal sessions simultaneously\n- **Auto-Reconnect**: Automatic reconnection after disconnect (up to 2 attempts)\n- **Connection Status**: Real-time connection status display\n\n### 🖥️ Terminal Features\n\n- **xterm Compatible**: Full terminal emulator support\n- **ANSI Colors**: Complete color support for commands\n- **Quick Commands**: One-click access to common commands\n- **AI Analysis**: Intelligent terminal output analysis\n- **Full Screen Mode**: Expand terminal to full screen\n\n### 🤖 AI-Powered Assistant\n\n- **Multi-Provider Support**: OpenAI, Ollama, SiliconFlow, Groq\n- **Chat Mode**: Ask questions and get help\n- **Edit Mode**: AI-assisted code modifications\n- **Context Aware**: Automatically includes current file context\n- **Streaming Responses**: Real-time AI response display\n\n### 📦 GitHub Integration\n\n- **Repository Access**: Browse all your repos (public and private)\n- **File Editing**: Edit files directly from your device\n- **Auto-Commit**: Changes are automatically committed\n- **Branch Support**: Work with different branches\n- **OAuth Authentication**: Secure GitHub login\n\n### 🔧 Git Version Control\n\n- **Visual Git**: See your changes at a glance\n- **Commit History**: Browse and compare commits\n- **Diff Viewer**: Visual comparison of changes\n- **Line History**: See who changed what and when\n- **Real-time Status**: Status refreshes every 8 seconds\n\n### 🔍 Powerful Search\n\n- **File Search**: Find files by name\n- **Content Search**: Search within files\n- **Symbol Search**: Jump to functions, classes, variables\n- **Remote Search**: Search on remote servers\n\n### 🎨 Customizable Interface\n\n- **6 Themes**: Dark, Light, Solarized Dark, Solarized Light, Dracula, Monokai\n- **Responsive Layout**: Adapts to phones and tablets\n- **Three-Column Layout**: Efficient workspace organization\n\n[...output truncated: 3441 characters omitted...]","isError":false,"isPending":false}]},{"role":"assistant","content":"⛔ 操作已取消","displayContent":"⛔ 操作已取消","attachedFileName":null,"attachedFileLength":null,"attachedWasTruncated":null,"toolUsages":[{"toolName":"list_files","arguments":{"path":".","_callId":"call_list_files_1773260848293_0"},"result":"Directory listing is not available for remote (SSH) workspaces. Use read_file to work with the currently open file.","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"ls -la","_callId":"call_run_command_1773260849209_1"},"result":"**Command**: `ls -la`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 22132\ndrwx------ 13 elliot elliot 4096 Mar 11 20:03 .\ndrwxr-xr-x 4 root root 4096 Oct 26 09:48 ..\n-rw------- 1 elliot elliot 24648 Mar 11 20:03 .bash_history\n-rw-r--r-- 1 elliot elliot 220 May 13 2025 .bash_logout\n-rw-r--r-- 1 elliot elliot 3523 May 13 2025 .bashrc\ndrwxr-xr-x 4 elliot elliot 4096 Mar 10 23:25 .cache\n-rw-r--r-- 1 elliot elliot 22426346 Dec 19 17:53 ClashX.dmg\ndrwx------ 4 elliot elliot 4096 Mar 10 23:25 .config\ndrwxr-xr-x 5 elliot elliot 4096 Mar 10 02:01 cpp_aux_tutorial\n-rw-r--r-- 1 elliot elliot 12288 Nov 20 08:27 .create.txt.swp\n-rw-r--r-- 1 elliot elliot 57 Mar 9 23:13 .gitconfig\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 infoNotifier.value\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 isLoadingNotifier.value\n-rw------- 1 elliot elliot 20 Mar 10 23:48 .lesshst\ndrwxr-xr-x 27 elliot elliot 4096 Jan 17 08:22 linux_old1\ndrwxr-xr-x 5 elliot elliot 4096 Mar 10 23:24 .local\ndrwxr-xr-x 2 elliot elliot 4096 Mar 9 22:58 mytest\ndrwxr-xr-x 18 elliot elliot 4096 Mar 10 23:45 nextcode\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 nimoteoffical\n-rw------- 1 elliot elliot 0 Sep 14 17:37 .node_repl_history\ndrwxr-xr-x 5 elliot elliot 4096 Mar 11 18:04 .npm\n-rw-r--r-- 1 elliot elliot 807 May 13 2025 .profile\ndrwxr-xr-x 11 elliot elliot 4096 Oct 19 11:48 ruoyi-rust\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 _selected\n-rw-r--r-- 1 elliot elliot 0 Sep 14 09:48 .sudo_as_admin_successful\ndrwxr-xr-x 5 elliot elliot 4096 Mar 11 17:34 testagent\n-rw-r--r-- 1 elliot elliot 1088 Jan 6 07:01 test.py\n-rw-r--r-- 1 elliot elliot 12288 Nov 28 18:36 .test.txt.swi\n-rw-r--r-- 1 elliot elliot 12288 Nov 23 06:00 .test.txt.swj\n-rw-r--r-- 1 elliot elliot 12288 Nov 22 13:05 .test.txt.swk\n-rw-r--r-- 1 elliot elliot 12288 Nov 22 10:15 .test.txt.swl\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:17 .test.txt.swm\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:14 .test.txt.swn\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:14 .test.txt.swo\n-rw-r--r-- 1 elliot elliot 12288 Oct 6 16:45 .test.txt.swp\n-rw------- 1 elliot elliot 11554 Feb 17 04:52 .viminfo\n-rw-r--r-- 1 elliot elliot 165 Sep 14 17:34 .wget-hsts\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 workspace.isRemote\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && ls -la","_callId":"call_run_command_1773260850713_2"},"result":"**Command**: `cd /home/elliot/nimoteoffical && ls -la`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 132\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 .\ndrwx------ 13 elliot elliot 4096 Mar 11 20:03 ..\ndrwxr-xr-x 6 elliot elliot 4096 Mar 11 18:34 docs\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:53 features\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 20:27 .git\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 17:59 .github\n-rw-r--r-- 1 elliot elliot 79 Mar 11 17:59 .gitignore\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 19:56 .nimote\ndrwxr-xr-x 79 elliot elliot 4096 Mar 11 19:04 node_modules\n-rw-r--r-- 1 elliot elliot 267 Mar 11 17:59 package.json\n-rw-r--r-- 1 elliot elliot 88522 Mar 11 19:04 package-lock.json\n-rw-r--r-- 1 elliot elliot 60 Mar 11 17:59 README.MD\n\n```\n\n","isError":false,"isPending":false},{"toolName":"read_file","arguments":{"_callId":"call_read_file_1773260852094_3"},"result":"❌ No file is currently open in the editor. Please open a file first.","isError":true,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && find . -type f -name \"*.json\" -o -name \"*.md\" -o -name \"*.ts\" -o -name \"*.js\" | head -30","_callId":"call_run_command_1773260853316_4"},"result":"**Command**: `cd /home/elliot/nimoteoffical && find . -type f -name \"*.json\" -o -name \"*.md\" -o -name \"*.ts\" -o -name \"*.js\" | head -30`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n./package.json\n./node_modules/@vue/compiler-dom/index.js\n./node_modules/@vue/compiler-dom/package.json\n./node_modules/@vue/compiler-dom/README.md\n./node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.prod.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-browser.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.d.ts\n./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-browser.prod.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.global.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.global.prod.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js\n./node_modules/@vue/shared/index.js\n./node_modules/@vue/shared/package.json\n./node_modules/@vue/shared/README.md\n./node_modules/@vue/shared/dist/shared.cjs.prod.js\n./node_modules/@vue/shared/dist/shared.cjs.js\n./node_modules/@vue/shared/dist/shared.esm-bundler.js\n./node_modules/@vue/shared/dist/shared.d.ts\n./node_modules/@vue/server-renderer/index.js\n./node_modules/@vue/server-renderer/package.json\n./node_modules/@vue/server-renderer/README.md\n./node_modules/@vue/server-renderer/dist/server-renderer.cjs.js\n./node_modules/@vue/server-renderer/dist/server-renderer.d.ts\n./node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.js\n./node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.prod.js\n./node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js\n./node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js\n./node_modules/@vue/reactivity/index.js\n./node_modules/@vue/reactivity/package.json\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat package.json","_callId":"call_run_command_1773260854556_5"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat package.json`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n{\n \"name\": \"NimoteCode\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"docs:dev\": \"vitepress dev docs\",\n \"docs:build\": \"vitepress build docs\",\n \"docs:preview\": \"vitepress preview docs\"\n },\n \"devDependencies\": {\n \"vitepress\": \"^1.1.0\"\n }\n}\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat README.MD","_callId":"call_run_command_1773260855971_6"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat README.MD`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n## run\nnpm run preview\nnpm run build\ngit push -f origin main\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && ls -la docs/ && ls -la features/ && ls -la .nimote/","_callId":"call_run_command_1773260857323_7"},"result":"**Command**: `cd /home/elliot/nimoteoffical && ls -la docs/ && ls -la features/ && ls -la .nimote/`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 80\ndrwxr-xr-x 6 elliot elliot 4096 Mar 11 18:34 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:49 docs\n-rw-r--r-- 1 elliot elliot 4462 Mar 11 18:34 docs.md\n-rw-r--r-- 1 elliot elliot 3614 Mar 11 18:35 download.md\n-rw-r--r-- 1 elliot elliot 12318 Mar 11 18:31 features.md\n-rw-r--r-- 1 elliot elliot 1911 Mar 11 18:46 index.md\n-rw-r--r-- 1 elliot elliot 6371 Mar 11 18:34 introduction.md\n-rw-r--r-- 1 elliot elliot 4096 Mar 11 18:03 privacy.md\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 17:59 public\n-rw-r--r-- 1 elliot elliot 3281 Mar 11 18:03 support.md\n-rw-r--r-- 1 elliot elliot 5342 Mar 11 18:03 terms.md\ndrwxr-xr-x 4 elliot elliot 4096 Mar 11 19:05 .vitepress\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 18:36 zh\ntotal 8\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:53 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\ntotal 16\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 19:56 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\ndrwxr-xr-x 4 elliot elliot 4096 Mar 11 20:27 agent_histories\n-rw-r--r-- 1 elliot elliot 453 Mar 11 20:27 index.json\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat docs/features.md","_callId":"call_run_command_1773260858639_8"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat docs/features.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n# Features\n\nExplore all the powerful features NimoteCode has to offer.\n\n## Core Editor\n\n### Syntax Highlighting\n\nNimoteCode supports syntax highlighting for 50+ programming languages:\n\n| Category | Languages |\n|----------|-----------|\n| **Web** | JavaScript, TypeScript, HTML, CSS, Vue, React |\n| **Backend** | Python, Java, Go, Rust, C/C++, C# |\n| **Mobile** | Swift, Kotlin, Dart, Flutter |\n| **Data** | SQL, JSON, YAML, TOML, XML |\n| **Scripting** | Bash, PowerShell, Python, Ruby |\n| **Config** | Dockerfile, Kubernetes, Nginx, Apache |\n\n### Code Folding\n\nCollapse and expand code blocks for better navigation:\n\n- Functions and methods\n- Classes and structs\n- Conditional blocks\n- Loops\n- Comments\n\n### Editor Features\n\n| Feature | Description |\n|---------|-------------|\n| **Auto-Save** | Changes saved automatically after 5 seconds |\n| **Undo/Redo** | Multiple levels of undo history |\n| **Cut/Copy/Paste** | Full clipboard support |\n| **Select All** | Quick selection of all content |\n| **Cursor Position** | Real-time line and column display |\n| **Context Menu** | Right-click for quick actions |\n| **Keyboard Shortcuts** | Ctrl+C/V/X and more |\n| **Virtual Keyboard** | Mobile-optimized programming keyboard |\n\n### Large File Support\n\n- Handle files up to **100,000 lines**\n- Chunked reading for large files\n- Automatic truncation warning\n- Smooth scrolling performance\n\n### Save States\n\n- **Dirty Flag**: Shows unsaved changes\n- **Saving Indicator**: Shows when saving is in progress\n- **Saved Confirmation**: Visual feedback when save completes\n\n## SSH Remote Development\n\n### Connection Management\n\n| Feature | Details |\n|---------|---------|\n| **Authentication** | Password and SSH key support |\n| **Timeout** | 10-second connection timeout |\n| **Auto-Reconnect** | Up to 2 reconnection attempts |\n| **Status Display** | Real-time connection status |\n\n### Remote File Browser\n\n- **Tree View**: Visual file system navigation\n- **File Icons**: Type-specific icons\n- **Path Navigation**: Auto-expand to current file\n- **Directory Caching**: Performance optimization\n- **Refresh**: Manual directory refresh\n- **Collapse All**: Quick collapse of all folders\n\n### File Operations\n\n| Operation | Description |\n|-----------|-------------|\n| **Create** | New files and folders |\n| **Edit** | Real-time editing with auto-save |\n| **Rename** | Rename files and directories |\n| **Delete** | Remove files and directories (with confirmation) |\n| **Open** | Open files in the editor |\n\n### Remote File Editing\n\n- Real-time editing in the built-in editor\n- Changes automatically saved after 5 seconds\n- Chunked reading for large files\n- Files over 100,000 lines are truncated with warning\n- UTF-8 encoding support\n\n### Multi-Terminal Sessions\n\n- **6 Concurrent Sessions**: Run up to 6 terminals simultaneously\n- **Session Persistence**: Sessions persist when switching panels\n\n[...output truncated: 7142 characters omitted...]","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat docs/index.md","_callId":"call_run_command_1773260860268_9"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat docs/index.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n---\nlayout: home\ntitle: NimoteCode\ntitleTemplate: false\n\nhero:\n name: NimoteCode\n text: Mobile Remote Development IDE\n tagline: True development experience — anytime, anywhere — right from your phone or tablet.\n actions:\n - theme: brand\n text: Quick Start Guide\n link: /docs/quick-start\n - theme: brand\n text: Download on the App Store\n link: https://apps.apple.com/app/idXXXXXX\n - theme: brand\n text: Download on Google Play\n link: https://play.google.com/store/apps/details?id=com.nimotecode\n - theme: alt\n text: View on GitHub\n link: https://github.com/nimotecode/nimote_issues\n\nfeatures:\n - title: 🔒 Secure SSH Remote Terminal\n details: Establish encrypted SSH connections to your servers with support for multiple independent sessions running in parallel.\n icon: 🔐\n\n - title: ⚡ Flutter + Rust Powered\n details: Delivers a responsive cross-platform interface combined with high-performance native backend capabilities.\n icon: ⚡\n\n - title: 📂 Integrated SFTP File Explorer\n details: Seamlessly browse, upload, download, edit, and manage files on remote servers with full filesystem access.\n icon: 📂\n\n - title: 🎨 Advanced Syntax Highlighting\n details: Powered by Tree-sitter — accurate, fast, and supports dozens of programming languages out of the box.\n icon: 🎨\n\n - title: 🤖 AI Code Intelligence\n details: Integrate your preferred LLM to get context-aware completions, refactoring suggestions, and automated code edits.\n icon: 🤖\n\n - title: 📊 Visual Git Integration\n details: Repository status overview, commit history visualization, diff viewer, and per-file/line change tracking — all built-in.\n icon: 📊\n\n - title: 📱 Adaptive & Modern UI\n details: Fully responsive design for phones and tablets, with light/dark mode and custom theme support.\n icon: 📱\n---\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat docs/introduction.md","_callId":"call_run_command_1773260862105_10"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat docs/introduction.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n# Introduction\n\nWelcome to NimoteCode, a powerful mobile remote development IDE designed for Android and iOS.\n\n## What is NimoteCode?\n\nNimoteCode is a cross-platform mobile Integrated Development Environment (IDE) that brings the full power of a desktop development environment to your mobile device. Whether you're using a phone or tablet, NimoteCode provides a seamless coding experience.\n\n## Key Features\n\n### 🖥️ Modern Code Editor\n\n- **Syntax Highlighting**: Support for 50+ programming languages\n- **Code Folding**: Collapse and expand functions, classes, and code blocks\n- **Auto-Save**: Changes saved automatically after 5 seconds\n- **Large File Support**: Handle files up to 100,000 lines\n- **Undo/Redo**: Multiple levels of operation history\n- **Virtual Keyboard**: Mobile-optimized programming keyboard\n\n### 🔐 Secure SSH Remote Development\n\n- **SSH Connections**: Password and key-based authentication\n- **SFTP File Manager**: Browse, upload, download, and edit remote files\n- **Multi-Terminal**: Run up to 6 terminal sessions simultaneously\n- **Auto-Reconnect**: Automatic reconnection after disconnect (up to 2 attempts)\n- **Connection Status**: Real-time connection status display\n\n### 🖥️ Terminal Features\n\n- **xterm Compatible**: Full terminal emulator support\n- **ANSI Colors**: Complete color support for commands\n- **Quick Commands**: One-click access to common commands\n- **AI Analysis**: Intelligent terminal output analysis\n- **Full Screen Mode**: Expand terminal to full screen\n\n### 🤖 AI-Powered Assistant\n\n- **Multi-Provider Support**: OpenAI, Ollama, SiliconFlow, Groq\n- **Chat Mode**: Ask questions and get help\n- **Edit Mode**: AI-assisted code modifications\n- **Context Aware**: Automatically includes current file context\n- **Streaming Responses**: Real-time AI response display\n\n### 📦 GitHub Integration\n\n- **Repository Access**: Browse all your repos (public and private)\n- **File Editing**: Edit files directly from your device\n- **Auto-Commit**: Changes are automatically committed\n- **Branch Support**: Work with different branches\n- **OAuth Authentication**: Secure GitHub login\n\n### 🔧 Git Version Control\n\n- **Visual Git**: See your changes at a glance\n- **Commit History**: Browse and compare commits\n- **Diff Viewer**: Visual comparison of changes\n- **Line History**: See who changed what and when\n- **Real-time Status**: Status refreshes every 8 seconds\n\n### 🔍 Powerful Search\n\n- **File Search**: Find files by name\n- **Content Search**: Search within files\n- **Symbol Search**: Jump to functions, classes, variables\n- **Remote Search**: Search on remote servers\n\n### 🎨 Customizable Interface\n\n- **6 Themes**: Dark, Light, Solarized Dark, Solarized Light, Dracula, Monokai\n- **Responsive Layout**: Adapts to phones and tablets\n- **Three-Column Layout**: Efficient workspace organization\n\n[...output truncated: 3441 characters omitted...]","isError":false,"isPending":false}]}],"tool_usages":[{"toolName":"list_files","arguments":{"path":".","_callId":"call_list_files_1773260848293_0"},"result":"Directory listing is not available for remote (SSH) workspaces. Use read_file to work with the currently open file.","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"ls -la","_callId":"call_run_command_1773260849209_1"},"result":"**Command**: `ls -la`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 22132\ndrwx------ 13 elliot elliot 4096 Mar 11 20:03 .\ndrwxr-xr-x 4 root root 4096 Oct 26 09:48 ..\n-rw------- 1 elliot elliot 24648 Mar 11 20:03 .bash_history\n-rw-r--r-- 1 elliot elliot 220 May 13 2025 .bash_logout\n-rw-r--r-- 1 elliot elliot 3523 May 13 2025 .bashrc\ndrwxr-xr-x 4 elliot elliot 4096 Mar 10 23:25 .cache\n-rw-r--r-- 1 elliot elliot 22426346 Dec 19 17:53 ClashX.dmg\ndrwx------ 4 elliot elliot 4096 Mar 10 23:25 .config\ndrwxr-xr-x 5 elliot elliot 4096 Mar 10 02:01 cpp_aux_tutorial\n-rw-r--r-- 1 elliot elliot 12288 Nov 20 08:27 .create.txt.swp\n-rw-r--r-- 1 elliot elliot 57 Mar 9 23:13 .gitconfig\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 infoNotifier.value\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 isLoadingNotifier.value\n-rw------- 1 elliot elliot 20 Mar 10 23:48 .lesshst\ndrwxr-xr-x 27 elliot elliot 4096 Jan 17 08:22 linux_old1\ndrwxr-xr-x 5 elliot elliot 4096 Mar 10 23:24 .local\ndrwxr-xr-x 2 elliot elliot 4096 Mar 9 22:58 mytest\ndrwxr-xr-x 18 elliot elliot 4096 Mar 10 23:45 nextcode\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 nimoteoffical\n-rw------- 1 elliot elliot 0 Sep 14 17:37 .node_repl_history\ndrwxr-xr-x 5 elliot elliot 4096 Mar 11 18:04 .npm\n-rw-r--r-- 1 elliot elliot 807 May 13 2025 .profile\ndrwxr-xr-x 11 elliot elliot 4096 Oct 19 11:48 ruoyi-rust\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 _selected\n-rw-r--r-- 1 elliot elliot 0 Sep 14 09:48 .sudo_as_admin_successful\ndrwxr-xr-x 5 elliot elliot 4096 Mar 11 17:34 testagent\n-rw-r--r-- 1 elliot elliot 1088 Jan 6 07:01 test.py\n-rw-r--r-- 1 elliot elliot 12288 Nov 28 18:36 .test.txt.swi\n-rw-r--r-- 1 elliot elliot 12288 Nov 23 06:00 .test.txt.swj\n-rw-r--r-- 1 elliot elliot 12288 Nov 22 13:05 .test.txt.swk\n-rw-r--r-- 1 elliot elliot 12288 Nov 22 10:15 .test.txt.swl\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:17 .test.txt.swm\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:14 .test.txt.swn\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:14 .test.txt.swo\n-rw-r--r-- 1 elliot elliot 12288 Oct 6 16:45 .test.txt.swp\n-rw------- 1 elliot elliot 11554 Feb 17 04:52 .viminfo\n-rw-r--r-- 1 elliot elliot 165 Sep 14 17:34 .wget-hsts\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 workspace.isRemote\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && ls -la","_callId":"call_run_command_1773260850713_2"},"result":"**Command**: `cd /home/elliot/nimoteoffical && ls -la`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 132\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 .\ndrwx------ 13 elliot elliot 4096 Mar 11 20:03 ..\ndrwxr-xr-x 6 elliot elliot 4096 Mar 11 18:34 docs\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:53 features\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 20:27 .git\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 17:59 .github\n-rw-r--r-- 1 elliot elliot 79 Mar 11 17:59 .gitignore\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 19:56 .nimote\ndrwxr-xr-x 79 elliot elliot 4096 Mar 11 19:04 node_modules\n-rw-r--r-- 1 elliot elliot 267 Mar 11 17:59 package.json\n-rw-r--r-- 1 elliot elliot 88522 Mar 11 19:04 package-lock.json\n-rw-r--r-- 1 elliot elliot 60 Mar 11 17:59 README.MD\n\n```\n\n","isError":false,"isPending":false},{"toolName":"read_file","arguments":{"_callId":"call_read_file_1773260852094_3"},"result":"❌ No file is currently open in the editor. Please open a file first.","isError":true,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && find . -type f -name \"*.json\" -o -name \"*.md\" -o -name \"*.ts\" -o -name \"*.js\" | head -30","_callId":"call_run_command_1773260853316_4"},"result":"**Command**: `cd /home/elliot/nimoteoffical && find . -type f -name \"*.json\" -o -name \"*.md\" -o -name \"*.ts\" -o -name \"*.js\" | head -30`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n./package.json\n./node_modules/@vue/compiler-dom/index.js\n./node_modules/@vue/compiler-dom/package.json\n./node_modules/@vue/compiler-dom/README.md\n./node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.prod.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-browser.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.d.ts\n./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-browser.prod.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.global.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.global.prod.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js\n./node_modules/@vue/shared/index.js\n./node_modules/@vue/shared/package.json\n./node_modules/@vue/shared/README.md\n./node_modules/@vue/shared/dist/shared.cjs.prod.js\n./node_modules/@vue/shared/dist/shared.cjs.js\n./node_modules/@vue/shared/dist/shared.esm-bundler.js\n./node_modules/@vue/shared/dist/shared.d.ts\n./node_modules/@vue/server-renderer/index.js\n./node_modules/@vue/server-renderer/package.json\n./node_modules/@vue/server-renderer/README.md\n./node_modules/@vue/server-renderer/dist/server-renderer.cjs.js\n./node_modules/@vue/server-renderer/dist/server-renderer.d.ts\n./node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.js\n./node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.prod.js\n./node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js\n./node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js\n./node_modules/@vue/reactivity/index.js\n./node_modules/@vue/reactivity/package.json\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat package.json","_callId":"call_run_command_1773260854556_5"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat package.json`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n{\n \"name\": \"NimoteCode\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"docs:dev\": \"vitepress dev docs\",\n \"docs:build\": \"vitepress build docs\",\n \"docs:preview\": \"vitepress preview docs\"\n },\n \"devDependencies\": {\n \"vitepress\": \"^1.1.0\"\n }\n}\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat README.MD","_callId":"call_run_command_1773260855971_6"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat README.MD`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n## run\nnpm run preview\nnpm run build\ngit push -f origin main\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && ls -la docs/ && ls -la features/ && ls -la .nimote/","_callId":"call_run_command_1773260857323_7"},"result":"**Command**: `cd /home/elliot/nimoteoffical && ls -la docs/ && ls -la features/ && ls -la .nimote/`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 80\ndrwxr-xr-x 6 elliot elliot 4096 Mar 11 18:34 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:49 docs\n-rw-r--r-- 1 elliot elliot 4462 Mar 11 18:34 docs.md\n-rw-r--r-- 1 elliot elliot 3614 Mar 11 18:35 download.md\n-rw-r--r-- 1 elliot elliot 12318 Mar 11 18:31 features.md\n-rw-r--r-- 1 elliot elliot 1911 Mar 11 18:46 index.md\n-rw-r--r-- 1 elliot elliot 6371 Mar 11 18:34 introduction.md\n-rw-r--r-- 1 elliot elliot 4096 Mar 11 18:03 privacy.md\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 17:59 public\n-rw-r--r-- 1 elliot elliot 3281 Mar 11 18:03 support.md\n-rw-r--r-- 1 elliot elliot 5342 Mar 11 18:03 terms.md\ndrwxr-xr-x 4 elliot elliot 4096 Mar 11 19:05 .vitepress\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 18:36 zh\ntotal 8\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:53 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\ntotal 16\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 19:56 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\ndrwxr-xr-x 4 elliot elliot 4096 Mar 11 20:27 agent_histories\n-rw-r--r-- 1 elliot elliot 453 Mar 11 20:27 index.json\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat docs/features.md","_callId":"call_run_command_1773260858639_8"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat docs/features.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n# Features\n\nExplore all the powerful features NimoteCode has to offer.\n\n## Core Editor\n\n### Syntax Highlighting\n\nNimoteCode supports syntax highlighting for 50+ programming languages:\n\n| Category | Languages |\n|----------|-----------|\n| **Web** | JavaScript, TypeScript, HTML, CSS, Vue, React |\n| **Backend** | Python, Java, Go, Rust, C/C++, C# |\n| **Mobile** | Swift, Kotlin, Dart, Flutter |\n| **Data** | SQL, JSON, YAML, TOML, XML |\n| **Scripting** | Bash, PowerShell, Python, Ruby |\n| **Config** | Dockerfile, Kubernetes, Nginx, Apache |\n\n### Code Folding\n\nCollapse and expand code blocks for better navigation:\n\n- Functions and methods\n- Classes and structs\n- Conditional blocks\n- Loops\n- Comments\n\n### Editor Features\n\n| Feature | Description |\n|---------|-------------|\n| **Auto-Save** | Changes saved automatically after 5 seconds |\n| **Undo/Redo** | Multiple levels of undo history |\n| **Cut/Copy/Paste** | Full clipboard support |\n| **Select All** | Quick selection of all content |\n| **Cursor Position** | Real-time line and column display |\n| **Context Menu** | Right-click for quick actions |\n| **Keyboard Shortcuts** | Ctrl+C/V/X and more |\n| **Virtual Keyboard** | Mobile-optimized programming keyboard |\n\n### Large File Support\n\n- Handle files up to **100,000 lines**\n- Chunked reading for large files\n- Automatic truncation warning\n- Smooth scrolling performance\n\n### Save States\n\n- **Dirty Flag**: Shows unsaved changes\n- **Saving Indicator**: Shows when saving is in progress\n- **Saved Confirmation**: Visual feedback when save completes\n\n## SSH Remote Development\n\n### Connection Management\n\n| Feature | Details |\n|---------|---------|\n| **Authentication** | Password and SSH key support |\n| **Timeout** | 10-second connection timeout |\n| **Auto-Reconnect** | Up to 2 reconnection attempts |\n| **Status Display** | Real-time connection status |\n\n### Remote File Browser\n\n- **Tree View**: Visual file system navigation\n- **File Icons**: Type-specific icons\n- **Path Navigation**: Auto-expand to current file\n- **Directory Caching**: Performance optimization\n- **Refresh**: Manual directory refresh\n- **Collapse All**: Quick collapse of all folders\n\n### File Operations\n\n| Operation | Description |\n|-----------|-------------|\n| **Create** | New files and folders |\n| **Edit** | Real-time editing with auto-save |\n| **Rename** | Rename files and directories |\n| **Delete** | Remove files and directories (with confirmation) |\n| **Open** | Open files in the editor |\n\n### Remote File Editing\n\n- Real-time editing in the built-in editor\n- Changes automatically saved after 5 seconds\n- Chunked reading for large files\n- Files over 100,000 lines are truncated with warning\n- UTF-8 encoding support\n\n### Multi-Terminal Sessions\n\n- **6 Concurrent Sessions**: Run up to 6 terminals simultaneously\n- **Session Persistence**: Sessions persist when switching panels\n\n[...output truncated: 7142 characters omitted...]","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat docs/index.md","_callId":"call_run_command_1773260860268_9"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat docs/index.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n---\nlayout: home\ntitle: NimoteCode\ntitleTemplate: false\n\nhero:\n name: NimoteCode\n text: Mobile Remote Development IDE\n tagline: True development experience — anytime, anywhere — right from your phone or tablet.\n actions:\n - theme: brand\n text: Quick Start Guide\n link: /docs/quick-start\n - theme: brand\n text: Download on the App Store\n link: https://apps.apple.com/app/idXXXXXX\n - theme: brand\n text: Download on Google Play\n link: https://play.google.com/store/apps/details?id=com.nimotecode\n - theme: alt\n text: View on GitHub\n link: https://github.com/nimotecode/nimote_issues\n\nfeatures:\n - title: 🔒 Secure SSH Remote Terminal\n details: Establish encrypted SSH connections to your servers with support for multiple independent sessions running in parallel.\n icon: 🔐\n\n - title: ⚡ Flutter + Rust Powered\n details: Delivers a responsive cross-platform interface combined with high-performance native backend capabilities.\n icon: ⚡\n\n - title: 📂 Integrated SFTP File Explorer\n details: Seamlessly browse, upload, download, edit, and manage files on remote servers with full filesystem access.\n icon: 📂\n\n - title: 🎨 Advanced Syntax Highlighting\n details: Powered by Tree-sitter — accurate, fast, and supports dozens of programming languages out of the box.\n icon: 🎨\n\n - title: 🤖 AI Code Intelligence\n details: Integrate your preferred LLM to get context-aware completions, refactoring suggestions, and automated code edits.\n icon: 🤖\n\n - title: 📊 Visual Git Integration\n details: Repository status overview, commit history visualization, diff viewer, and per-file/line change tracking — all built-in.\n icon: 📊\n\n - title: 📱 Adaptive & Modern UI\n details: Fully responsive design for phones and tablets, with light/dark mode and custom theme support.\n icon: 📱\n---\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat docs/introduction.md","_callId":"call_run_command_1773260862105_10"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat docs/introduction.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n# Introduction\n\nWelcome to NimoteCode, a powerful mobile remote development IDE designed for Android and iOS.\n\n## What is NimoteCode?\n\nNimoteCode is a cross-platform mobile Integrated Development Environment (IDE) that brings the full power of a desktop development environment to your mobile device. Whether you're using a phone or tablet, NimoteCode provides a seamless coding experience.\n\n## Key Features\n\n### 🖥️ Modern Code Editor\n\n- **Syntax Highlighting**: Support for 50+ programming languages\n- **Code Folding**: Collapse and expand functions, classes, and code blocks\n- **Auto-Save**: Changes saved automatically after 5 seconds\n- **Large File Support**: Handle files up to 100,000 lines\n- **Undo/Redo**: Multiple levels of operation history\n- **Virtual Keyboard**: Mobile-optimized programming keyboard\n\n### 🔐 Secure SSH Remote Development\n\n- **SSH Connections**: Password and key-based authentication\n- **SFTP File Manager**: Browse, upload, download, and edit remote files\n- **Multi-Terminal**: Run up to 6 terminal sessions simultaneously\n- **Auto-Reconnect**: Automatic reconnection after disconnect (up to 2 attempts)\n- **Connection Status**: Real-time connection status display\n\n### 🖥️ Terminal Features\n\n- **xterm Compatible**: Full terminal emulator support\n- **ANSI Colors**: Complete color support for commands\n- **Quick Commands**: One-click access to common commands\n- **AI Analysis**: Intelligent terminal output analysis\n- **Full Screen Mode**: Expand terminal to full screen\n\n### 🤖 AI-Powered Assistant\n\n- **Multi-Provider Support**: OpenAI, Ollama, SiliconFlow, Groq\n- **Chat Mode**: Ask questions and get help\n- **Edit Mode**: AI-assisted code modifications\n- **Context Aware**: Automatically includes current file context\n- **Streaming Responses**: Real-time AI response display\n\n### 📦 GitHub Integration\n\n- **Repository Access**: Browse all your repos (public and private)\n- **File Editing**: Edit files directly from your device\n- **Auto-Commit**: Changes are automatically committed\n- **Branch Support**: Work with different branches\n- **OAuth Authentication**: Secure GitHub login\n\n### 🔧 Git Version Control\n\n- **Visual Git**: See your changes at a glance\n- **Commit History**: Browse and compare commits\n- **Diff Viewer**: Visual comparison of changes\n- **Line History**: See who changed what and when\n- **Real-time Status**: Status refreshes every 8 seconds\n\n### 🔍 Powerful Search\n\n- **File Search**: Find files by name\n- **Content Search**: Search within files\n- **Symbol Search**: Jump to functions, classes, variables\n- **Remote Search**: Search on remote servers\n\n### 🎨 Customizable Interface\n\n- **6 Themes**: Dark, Light, Solarized Dark, Solarized Light, Dracula, Monokai\n- **Responsive Layout**: Adapts to phones and tablets\n- **Three-Column Layout**: Efficient workspace organization\n\n[...output truncated: 3441 characters omitted...]","isError":false,"isPending":false}]} \ No newline at end of file diff --git a/.nimote/chat_histories/default_chat_session/history.json b/.nimote/chat_histories/default_chat_session/history.json deleted file mode 100644 index 601f4e0..0000000 --- a/.nimote/chat_histories/default_chat_session/history.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"default_chat_session","title":"Chat Session","description":"Chat history","created_at":"2026-03-12T04:27:43.652915","updated_at":"2026-03-12T04:27:43.653168","messages":[{"role":"user","content":"分析当前项目","displayContent":"分析当前项目","attachedFileName":null,"attachedFileLength":null,"attachedWasTruncated":null,"toolUsages":null},{"role":"assistant","content":"⛔ 操作已取消","displayContent":"⛔ 操作已取消","attachedFileName":null,"attachedFileLength":null,"attachedWasTruncated":null,"toolUsages":[{"toolName":"list_files","arguments":{"path":".","_callId":"call_list_files_1773260848293_0"},"result":"Directory listing is not available for remote (SSH) workspaces. Use read_file to work with the currently open file.","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"ls -la","_callId":"call_run_command_1773260849209_1"},"result":"**Command**: `ls -la`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 22132\ndrwx------ 13 elliot elliot 4096 Mar 11 20:03 .\ndrwxr-xr-x 4 root root 4096 Oct 26 09:48 ..\n-rw------- 1 elliot elliot 24648 Mar 11 20:03 .bash_history\n-rw-r--r-- 1 elliot elliot 220 May 13 2025 .bash_logout\n-rw-r--r-- 1 elliot elliot 3523 May 13 2025 .bashrc\ndrwxr-xr-x 4 elliot elliot 4096 Mar 10 23:25 .cache\n-rw-r--r-- 1 elliot elliot 22426346 Dec 19 17:53 ClashX.dmg\ndrwx------ 4 elliot elliot 4096 Mar 10 23:25 .config\ndrwxr-xr-x 5 elliot elliot 4096 Mar 10 02:01 cpp_aux_tutorial\n-rw-r--r-- 1 elliot elliot 12288 Nov 20 08:27 .create.txt.swp\n-rw-r--r-- 1 elliot elliot 57 Mar 9 23:13 .gitconfig\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 infoNotifier.value\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 isLoadingNotifier.value\n-rw------- 1 elliot elliot 20 Mar 10 23:48 .lesshst\ndrwxr-xr-x 27 elliot elliot 4096 Jan 17 08:22 linux_old1\ndrwxr-xr-x 5 elliot elliot 4096 Mar 10 23:24 .local\ndrwxr-xr-x 2 elliot elliot 4096 Mar 9 22:58 mytest\ndrwxr-xr-x 18 elliot elliot 4096 Mar 10 23:45 nextcode\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 nimoteoffical\n-rw------- 1 elliot elliot 0 Sep 14 17:37 .node_repl_history\ndrwxr-xr-x 5 elliot elliot 4096 Mar 11 18:04 .npm\n-rw-r--r-- 1 elliot elliot 807 May 13 2025 .profile\ndrwxr-xr-x 11 elliot elliot 4096 Oct 19 11:48 ruoyi-rust\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 _selected\n-rw-r--r-- 1 elliot elliot 0 Sep 14 09:48 .sudo_as_admin_successful\ndrwxr-xr-x 5 elliot elliot 4096 Mar 11 17:34 testagent\n-rw-r--r-- 1 elliot elliot 1088 Jan 6 07:01 test.py\n-rw-r--r-- 1 elliot elliot 12288 Nov 28 18:36 .test.txt.swi\n-rw-r--r-- 1 elliot elliot 12288 Nov 23 06:00 .test.txt.swj\n-rw-r--r-- 1 elliot elliot 12288 Nov 22 13:05 .test.txt.swk\n-rw-r--r-- 1 elliot elliot 12288 Nov 22 10:15 .test.txt.swl\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:17 .test.txt.swm\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:14 .test.txt.swn\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:14 .test.txt.swo\n-rw-r--r-- 1 elliot elliot 12288 Oct 6 16:45 .test.txt.swp\n-rw------- 1 elliot elliot 11554 Feb 17 04:52 .viminfo\n-rw-r--r-- 1 elliot elliot 165 Sep 14 17:34 .wget-hsts\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 workspace.isRemote\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && ls -la","_callId":"call_run_command_1773260850713_2"},"result":"**Command**: `cd /home/elliot/nimoteoffical && ls -la`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 132\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 .\ndrwx------ 13 elliot elliot 4096 Mar 11 20:03 ..\ndrwxr-xr-x 6 elliot elliot 4096 Mar 11 18:34 docs\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:53 features\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 20:27 .git\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 17:59 .github\n-rw-r--r-- 1 elliot elliot 79 Mar 11 17:59 .gitignore\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 19:56 .nimote\ndrwxr-xr-x 79 elliot elliot 4096 Mar 11 19:04 node_modules\n-rw-r--r-- 1 elliot elliot 267 Mar 11 17:59 package.json\n-rw-r--r-- 1 elliot elliot 88522 Mar 11 19:04 package-lock.json\n-rw-r--r-- 1 elliot elliot 60 Mar 11 17:59 README.MD\n\n```\n\n","isError":false,"isPending":false},{"toolName":"read_file","arguments":{"_callId":"call_read_file_1773260852094_3"},"result":"❌ No file is currently open in the editor. Please open a file first.","isError":true,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && find . -type f -name \"*.json\" -o -name \"*.md\" -o -name \"*.ts\" -o -name \"*.js\" | head -30","_callId":"call_run_command_1773260853316_4"},"result":"**Command**: `cd /home/elliot/nimoteoffical && find . -type f -name \"*.json\" -o -name \"*.md\" -o -name \"*.ts\" -o -name \"*.js\" | head -30`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n./package.json\n./node_modules/@vue/compiler-dom/index.js\n./node_modules/@vue/compiler-dom/package.json\n./node_modules/@vue/compiler-dom/README.md\n./node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.prod.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-browser.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.d.ts\n./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-browser.prod.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.global.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.global.prod.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js\n./node_modules/@vue/shared/index.js\n./node_modules/@vue/shared/package.json\n./node_modules/@vue/shared/README.md\n./node_modules/@vue/shared/dist/shared.cjs.prod.js\n./node_modules/@vue/shared/dist/shared.cjs.js\n./node_modules/@vue/shared/dist/shared.esm-bundler.js\n./node_modules/@vue/shared/dist/shared.d.ts\n./node_modules/@vue/server-renderer/index.js\n./node_modules/@vue/server-renderer/package.json\n./node_modules/@vue/server-renderer/README.md\n./node_modules/@vue/server-renderer/dist/server-renderer.cjs.js\n./node_modules/@vue/server-renderer/dist/server-renderer.d.ts\n./node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.js\n./node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.prod.js\n./node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js\n./node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js\n./node_modules/@vue/reactivity/index.js\n./node_modules/@vue/reactivity/package.json\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat package.json","_callId":"call_run_command_1773260854556_5"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat package.json`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n{\n \"name\": \"NimoteCode\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"docs:dev\": \"vitepress dev docs\",\n \"docs:build\": \"vitepress build docs\",\n \"docs:preview\": \"vitepress preview docs\"\n },\n \"devDependencies\": {\n \"vitepress\": \"^1.1.0\"\n }\n}\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat README.MD","_callId":"call_run_command_1773260855971_6"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat README.MD`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n## run\nnpm run preview\nnpm run build\ngit push -f origin main\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && ls -la docs/ && ls -la features/ && ls -la .nimote/","_callId":"call_run_command_1773260857323_7"},"result":"**Command**: `cd /home/elliot/nimoteoffical && ls -la docs/ && ls -la features/ && ls -la .nimote/`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 80\ndrwxr-xr-x 6 elliot elliot 4096 Mar 11 18:34 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:49 docs\n-rw-r--r-- 1 elliot elliot 4462 Mar 11 18:34 docs.md\n-rw-r--r-- 1 elliot elliot 3614 Mar 11 18:35 download.md\n-rw-r--r-- 1 elliot elliot 12318 Mar 11 18:31 features.md\n-rw-r--r-- 1 elliot elliot 1911 Mar 11 18:46 index.md\n-rw-r--r-- 1 elliot elliot 6371 Mar 11 18:34 introduction.md\n-rw-r--r-- 1 elliot elliot 4096 Mar 11 18:03 privacy.md\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 17:59 public\n-rw-r--r-- 1 elliot elliot 3281 Mar 11 18:03 support.md\n-rw-r--r-- 1 elliot elliot 5342 Mar 11 18:03 terms.md\ndrwxr-xr-x 4 elliot elliot 4096 Mar 11 19:05 .vitepress\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 18:36 zh\ntotal 8\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:53 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\ntotal 16\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 19:56 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\ndrwxr-xr-x 4 elliot elliot 4096 Mar 11 20:27 agent_histories\n-rw-r--r-- 1 elliot elliot 453 Mar 11 20:27 index.json\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat docs/features.md","_callId":"call_run_command_1773260858639_8"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat docs/features.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n# Features\n\nExplore all the powerful features NimoteCode has to offer.\n\n## Core Editor\n\n### Syntax Highlighting\n\nNimoteCode supports syntax highlighting for 50+ programming languages:\n\n| Category | Languages |\n|----------|-----------|\n| **Web** | JavaScript, TypeScript, HTML, CSS, Vue, React |\n| **Backend** | Python, Java, Go, Rust, C/C++, C# |\n| **Mobile** | Swift, Kotlin, Dart, Flutter |\n| **Data** | SQL, JSON, YAML, TOML, XML |\n| **Scripting** | Bash, PowerShell, Python, Ruby |\n| **Config** | Dockerfile, Kubernetes, Nginx, Apache |\n\n### Code Folding\n\nCollapse and expand code blocks for better navigation:\n\n- Functions and methods\n- Classes and structs\n- Conditional blocks\n- Loops\n- Comments\n\n### Editor Features\n\n| Feature | Description |\n|---------|-------------|\n| **Auto-Save** | Changes saved automatically after 5 seconds |\n| **Undo/Redo** | Multiple levels of undo history |\n| **Cut/Copy/Paste** | Full clipboard support |\n| **Select All** | Quick selection of all content |\n| **Cursor Position** | Real-time line and column display |\n| **Context Menu** | Right-click for quick actions |\n| **Keyboard Shortcuts** | Ctrl+C/V/X and more |\n| **Virtual Keyboard** | Mobile-optimized programming keyboard |\n\n### Large File Support\n\n- Handle files up to **100,000 lines**\n- Chunked reading for large files\n- Automatic truncation warning\n- Smooth scrolling performance\n\n### Save States\n\n- **Dirty Flag**: Shows unsaved changes\n- **Saving Indicator**: Shows when saving is in progress\n- **Saved Confirmation**: Visual feedback when save completes\n\n## SSH Remote Development\n\n### Connection Management\n\n| Feature | Details |\n|---------|---------|\n| **Authentication** | Password and SSH key support |\n| **Timeout** | 10-second connection timeout |\n| **Auto-Reconnect** | Up to 2 reconnection attempts |\n| **Status Display** | Real-time connection status |\n\n### Remote File Browser\n\n- **Tree View**: Visual file system navigation\n- **File Icons**: Type-specific icons\n- **Path Navigation**: Auto-expand to current file\n- **Directory Caching**: Performance optimization\n- **Refresh**: Manual directory refresh\n- **Collapse All**: Quick collapse of all folders\n\n### File Operations\n\n| Operation | Description |\n|-----------|-------------|\n| **Create** | New files and folders |\n| **Edit** | Real-time editing with auto-save |\n| **Rename** | Rename files and directories |\n| **Delete** | Remove files and directories (with confirmation) |\n| **Open** | Open files in the editor |\n\n### Remote File Editing\n\n- Real-time editing in the built-in editor\n- Changes automatically saved after 5 seconds\n- Chunked reading for large files\n- Files over 100,000 lines are truncated with warning\n- UTF-8 encoding support\n\n### Multi-Terminal Sessions\n\n- **6 Concurrent Sessions**: Run up to 6 terminals simultaneously\n- **Session Persistence**: Sessions persist when switching panels\n\n[...output truncated: 7142 characters omitted...]","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat docs/index.md","_callId":"call_run_command_1773260860268_9"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat docs/index.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n---\nlayout: home\ntitle: NimoteCode\ntitleTemplate: false\n\nhero:\n name: NimoteCode\n text: Mobile Remote Development IDE\n tagline: True development experience — anytime, anywhere — right from your phone or tablet.\n actions:\n - theme: brand\n text: Quick Start Guide\n link: /docs/quick-start\n - theme: brand\n text: Download on the App Store\n link: https://apps.apple.com/app/idXXXXXX\n - theme: brand\n text: Download on Google Play\n link: https://play.google.com/store/apps/details?id=com.nimotecode\n - theme: alt\n text: View on GitHub\n link: https://github.com/nimotecode/nimote_issues\n\nfeatures:\n - title: 🔒 Secure SSH Remote Terminal\n details: Establish encrypted SSH connections to your servers with support for multiple independent sessions running in parallel.\n icon: 🔐\n\n - title: ⚡ Flutter + Rust Powered\n details: Delivers a responsive cross-platform interface combined with high-performance native backend capabilities.\n icon: ⚡\n\n - title: 📂 Integrated SFTP File Explorer\n details: Seamlessly browse, upload, download, edit, and manage files on remote servers with full filesystem access.\n icon: 📂\n\n - title: 🎨 Advanced Syntax Highlighting\n details: Powered by Tree-sitter — accurate, fast, and supports dozens of programming languages out of the box.\n icon: 🎨\n\n - title: 🤖 AI Code Intelligence\n details: Integrate your preferred LLM to get context-aware completions, refactoring suggestions, and automated code edits.\n icon: 🤖\n\n - title: 📊 Visual Git Integration\n details: Repository status overview, commit history visualization, diff viewer, and per-file/line change tracking — all built-in.\n icon: 📊\n\n - title: 📱 Adaptive & Modern UI\n details: Fully responsive design for phones and tablets, with light/dark mode and custom theme support.\n icon: 📱\n---\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat docs/introduction.md","_callId":"call_run_command_1773260862105_10"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat docs/introduction.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n# Introduction\n\nWelcome to NimoteCode, a powerful mobile remote development IDE designed for Android and iOS.\n\n## What is NimoteCode?\n\nNimoteCode is a cross-platform mobile Integrated Development Environment (IDE) that brings the full power of a desktop development environment to your mobile device. Whether you're using a phone or tablet, NimoteCode provides a seamless coding experience.\n\n## Key Features\n\n### 🖥️ Modern Code Editor\n\n- **Syntax Highlighting**: Support for 50+ programming languages\n- **Code Folding**: Collapse and expand functions, classes, and code blocks\n- **Auto-Save**: Changes saved automatically after 5 seconds\n- **Large File Support**: Handle files up to 100,000 lines\n- **Undo/Redo**: Multiple levels of operation history\n- **Virtual Keyboard**: Mobile-optimized programming keyboard\n\n### 🔐 Secure SSH Remote Development\n\n- **SSH Connections**: Password and key-based authentication\n- **SFTP File Manager**: Browse, upload, download, and edit remote files\n- **Multi-Terminal**: Run up to 6 terminal sessions simultaneously\n- **Auto-Reconnect**: Automatic reconnection after disconnect (up to 2 attempts)\n- **Connection Status**: Real-time connection status display\n\n### 🖥️ Terminal Features\n\n- **xterm Compatible**: Full terminal emulator support\n- **ANSI Colors**: Complete color support for commands\n- **Quick Commands**: One-click access to common commands\n- **AI Analysis**: Intelligent terminal output analysis\n- **Full Screen Mode**: Expand terminal to full screen\n\n### 🤖 AI-Powered Assistant\n\n- **Multi-Provider Support**: OpenAI, Ollama, SiliconFlow, Groq\n- **Chat Mode**: Ask questions and get help\n- **Edit Mode**: AI-assisted code modifications\n- **Context Aware**: Automatically includes current file context\n- **Streaming Responses**: Real-time AI response display\n\n### 📦 GitHub Integration\n\n- **Repository Access**: Browse all your repos (public and private)\n- **File Editing**: Edit files directly from your device\n- **Auto-Commit**: Changes are automatically committed\n- **Branch Support**: Work with different branches\n- **OAuth Authentication**: Secure GitHub login\n\n### 🔧 Git Version Control\n\n- **Visual Git**: See your changes at a glance\n- **Commit History**: Browse and compare commits\n- **Diff Viewer**: Visual comparison of changes\n- **Line History**: See who changed what and when\n- **Real-time Status**: Status refreshes every 8 seconds\n\n### 🔍 Powerful Search\n\n- **File Search**: Find files by name\n- **Content Search**: Search within files\n- **Symbol Search**: Jump to functions, classes, variables\n- **Remote Search**: Search on remote servers\n\n### 🎨 Customizable Interface\n\n- **6 Themes**: Dark, Light, Solarized Dark, Solarized Light, Dracula, Monokai\n- **Responsive Layout**: Adapts to phones and tablets\n- **Three-Column Layout**: Efficient workspace organization\n\n[...output truncated: 3441 characters omitted...]","isError":false,"isPending":false}]},{"role":"assistant","content":"⛔ 操作已取消","displayContent":"⛔ 操作已取消","attachedFileName":null,"attachedFileLength":null,"attachedWasTruncated":null,"toolUsages":[{"toolName":"list_files","arguments":{"path":".","_callId":"call_list_files_1773260848293_0"},"result":"Directory listing is not available for remote (SSH) workspaces. Use read_file to work with the currently open file.","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"ls -la","_callId":"call_run_command_1773260849209_1"},"result":"**Command**: `ls -la`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 22132\ndrwx------ 13 elliot elliot 4096 Mar 11 20:03 .\ndrwxr-xr-x 4 root root 4096 Oct 26 09:48 ..\n-rw------- 1 elliot elliot 24648 Mar 11 20:03 .bash_history\n-rw-r--r-- 1 elliot elliot 220 May 13 2025 .bash_logout\n-rw-r--r-- 1 elliot elliot 3523 May 13 2025 .bashrc\ndrwxr-xr-x 4 elliot elliot 4096 Mar 10 23:25 .cache\n-rw-r--r-- 1 elliot elliot 22426346 Dec 19 17:53 ClashX.dmg\ndrwx------ 4 elliot elliot 4096 Mar 10 23:25 .config\ndrwxr-xr-x 5 elliot elliot 4096 Mar 10 02:01 cpp_aux_tutorial\n-rw-r--r-- 1 elliot elliot 12288 Nov 20 08:27 .create.txt.swp\n-rw-r--r-- 1 elliot elliot 57 Mar 9 23:13 .gitconfig\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 infoNotifier.value\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 isLoadingNotifier.value\n-rw------- 1 elliot elliot 20 Mar 10 23:48 .lesshst\ndrwxr-xr-x 27 elliot elliot 4096 Jan 17 08:22 linux_old1\ndrwxr-xr-x 5 elliot elliot 4096 Mar 10 23:24 .local\ndrwxr-xr-x 2 elliot elliot 4096 Mar 9 22:58 mytest\ndrwxr-xr-x 18 elliot elliot 4096 Mar 10 23:45 nextcode\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 nimoteoffical\n-rw------- 1 elliot elliot 0 Sep 14 17:37 .node_repl_history\ndrwxr-xr-x 5 elliot elliot 4096 Mar 11 18:04 .npm\n-rw-r--r-- 1 elliot elliot 807 May 13 2025 .profile\ndrwxr-xr-x 11 elliot elliot 4096 Oct 19 11:48 ruoyi-rust\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 _selected\n-rw-r--r-- 1 elliot elliot 0 Sep 14 09:48 .sudo_as_admin_successful\ndrwxr-xr-x 5 elliot elliot 4096 Mar 11 17:34 testagent\n-rw-r--r-- 1 elliot elliot 1088 Jan 6 07:01 test.py\n-rw-r--r-- 1 elliot elliot 12288 Nov 28 18:36 .test.txt.swi\n-rw-r--r-- 1 elliot elliot 12288 Nov 23 06:00 .test.txt.swj\n-rw-r--r-- 1 elliot elliot 12288 Nov 22 13:05 .test.txt.swk\n-rw-r--r-- 1 elliot elliot 12288 Nov 22 10:15 .test.txt.swl\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:17 .test.txt.swm\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:14 .test.txt.swn\n-rw-r--r-- 1 elliot elliot 12288 Oct 30 03:14 .test.txt.swo\n-rw-r--r-- 1 elliot elliot 12288 Oct 6 16:45 .test.txt.swp\n-rw------- 1 elliot elliot 11554 Feb 17 04:52 .viminfo\n-rw-r--r-- 1 elliot elliot 165 Sep 14 17:34 .wget-hsts\n-rw-r--r-- 1 elliot elliot 0 Feb 15 06:10 workspace.isRemote\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && ls -la","_callId":"call_run_command_1773260850713_2"},"result":"**Command**: `cd /home/elliot/nimoteoffical && ls -la`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 132\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 .\ndrwx------ 13 elliot elliot 4096 Mar 11 20:03 ..\ndrwxr-xr-x 6 elliot elliot 4096 Mar 11 18:34 docs\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:53 features\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 20:27 .git\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 17:59 .github\n-rw-r--r-- 1 elliot elliot 79 Mar 11 17:59 .gitignore\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 19:56 .nimote\ndrwxr-xr-x 79 elliot elliot 4096 Mar 11 19:04 node_modules\n-rw-r--r-- 1 elliot elliot 267 Mar 11 17:59 package.json\n-rw-r--r-- 1 elliot elliot 88522 Mar 11 19:04 package-lock.json\n-rw-r--r-- 1 elliot elliot 60 Mar 11 17:59 README.MD\n\n```\n\n","isError":false,"isPending":false},{"toolName":"read_file","arguments":{"_callId":"call_read_file_1773260852094_3"},"result":"❌ No file is currently open in the editor. Please open a file first.","isError":true,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && find . -type f -name \"*.json\" -o -name \"*.md\" -o -name \"*.ts\" -o -name \"*.js\" | head -30","_callId":"call_run_command_1773260853316_4"},"result":"**Command**: `cd /home/elliot/nimoteoffical && find . -type f -name \"*.json\" -o -name \"*.md\" -o -name \"*.ts\" -o -name \"*.js\" | head -30`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n./package.json\n./node_modules/@vue/compiler-dom/index.js\n./node_modules/@vue/compiler-dom/package.json\n./node_modules/@vue/compiler-dom/README.md\n./node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.prod.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-browser.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.d.ts\n./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-browser.prod.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.global.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.global.prod.js\n./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js\n./node_modules/@vue/shared/index.js\n./node_modules/@vue/shared/package.json\n./node_modules/@vue/shared/README.md\n./node_modules/@vue/shared/dist/shared.cjs.prod.js\n./node_modules/@vue/shared/dist/shared.cjs.js\n./node_modules/@vue/shared/dist/shared.esm-bundler.js\n./node_modules/@vue/shared/dist/shared.d.ts\n./node_modules/@vue/server-renderer/index.js\n./node_modules/@vue/server-renderer/package.json\n./node_modules/@vue/server-renderer/README.md\n./node_modules/@vue/server-renderer/dist/server-renderer.cjs.js\n./node_modules/@vue/server-renderer/dist/server-renderer.d.ts\n./node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.js\n./node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.prod.js\n./node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js\n./node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js\n./node_modules/@vue/reactivity/index.js\n./node_modules/@vue/reactivity/package.json\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat package.json","_callId":"call_run_command_1773260854556_5"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat package.json`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n{\n \"name\": \"NimoteCode\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"docs:dev\": \"vitepress dev docs\",\n \"docs:build\": \"vitepress build docs\",\n \"docs:preview\": \"vitepress preview docs\"\n },\n \"devDependencies\": {\n \"vitepress\": \"^1.1.0\"\n }\n}\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat README.MD","_callId":"call_run_command_1773260855971_6"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat README.MD`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n## run\nnpm run preview\nnpm run build\ngit push -f origin main\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && ls -la docs/ && ls -la features/ && ls -la .nimote/","_callId":"call_run_command_1773260857323_7"},"result":"**Command**: `cd /home/elliot/nimoteoffical && ls -la docs/ && ls -la features/ && ls -la .nimote/`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\ntotal 80\ndrwxr-xr-x 6 elliot elliot 4096 Mar 11 18:34 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:49 docs\n-rw-r--r-- 1 elliot elliot 4462 Mar 11 18:34 docs.md\n-rw-r--r-- 1 elliot elliot 3614 Mar 11 18:35 download.md\n-rw-r--r-- 1 elliot elliot 12318 Mar 11 18:31 features.md\n-rw-r--r-- 1 elliot elliot 1911 Mar 11 18:46 index.md\n-rw-r--r-- 1 elliot elliot 6371 Mar 11 18:34 introduction.md\n-rw-r--r-- 1 elliot elliot 4096 Mar 11 18:03 privacy.md\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 17:59 public\n-rw-r--r-- 1 elliot elliot 3281 Mar 11 18:03 support.md\n-rw-r--r-- 1 elliot elliot 5342 Mar 11 18:03 terms.md\ndrwxr-xr-x 4 elliot elliot 4096 Mar 11 19:05 .vitepress\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 18:36 zh\ntotal 8\ndrwxr-xr-x 2 elliot elliot 4096 Mar 11 18:53 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\ntotal 16\ndrwxr-xr-x 3 elliot elliot 4096 Mar 11 19:56 .\ndrwxr-xr-x 8 elliot elliot 4096 Mar 11 19:56 ..\ndrwxr-xr-x 4 elliot elliot 4096 Mar 11 20:27 agent_histories\n-rw-r--r-- 1 elliot elliot 453 Mar 11 20:27 index.json\n\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat docs/features.md","_callId":"call_run_command_1773260858639_8"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat docs/features.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n# Features\n\nExplore all the powerful features NimoteCode has to offer.\n\n## Core Editor\n\n### Syntax Highlighting\n\nNimoteCode supports syntax highlighting for 50+ programming languages:\n\n| Category | Languages |\n|----------|-----------|\n| **Web** | JavaScript, TypeScript, HTML, CSS, Vue, React |\n| **Backend** | Python, Java, Go, Rust, C/C++, C# |\n| **Mobile** | Swift, Kotlin, Dart, Flutter |\n| **Data** | SQL, JSON, YAML, TOML, XML |\n| **Scripting** | Bash, PowerShell, Python, Ruby |\n| **Config** | Dockerfile, Kubernetes, Nginx, Apache |\n\n### Code Folding\n\nCollapse and expand code blocks for better navigation:\n\n- Functions and methods\n- Classes and structs\n- Conditional blocks\n- Loops\n- Comments\n\n### Editor Features\n\n| Feature | Description |\n|---------|-------------|\n| **Auto-Save** | Changes saved automatically after 5 seconds |\n| **Undo/Redo** | Multiple levels of undo history |\n| **Cut/Copy/Paste** | Full clipboard support |\n| **Select All** | Quick selection of all content |\n| **Cursor Position** | Real-time line and column display |\n| **Context Menu** | Right-click for quick actions |\n| **Keyboard Shortcuts** | Ctrl+C/V/X and more |\n| **Virtual Keyboard** | Mobile-optimized programming keyboard |\n\n### Large File Support\n\n- Handle files up to **100,000 lines**\n- Chunked reading for large files\n- Automatic truncation warning\n- Smooth scrolling performance\n\n### Save States\n\n- **Dirty Flag**: Shows unsaved changes\n- **Saving Indicator**: Shows when saving is in progress\n- **Saved Confirmation**: Visual feedback when save completes\n\n## SSH Remote Development\n\n### Connection Management\n\n| Feature | Details |\n|---------|---------|\n| **Authentication** | Password and SSH key support |\n| **Timeout** | 10-second connection timeout |\n| **Auto-Reconnect** | Up to 2 reconnection attempts |\n| **Status Display** | Real-time connection status |\n\n### Remote File Browser\n\n- **Tree View**: Visual file system navigation\n- **File Icons**: Type-specific icons\n- **Path Navigation**: Auto-expand to current file\n- **Directory Caching**: Performance optimization\n- **Refresh**: Manual directory refresh\n- **Collapse All**: Quick collapse of all folders\n\n### File Operations\n\n| Operation | Description |\n|-----------|-------------|\n| **Create** | New files and folders |\n| **Edit** | Real-time editing with auto-save |\n| **Rename** | Rename files and directories |\n| **Delete** | Remove files and directories (with confirmation) |\n| **Open** | Open files in the editor |\n\n### Remote File Editing\n\n- Real-time editing in the built-in editor\n- Changes automatically saved after 5 seconds\n- Chunked reading for large files\n- Files over 100,000 lines are truncated with warning\n- UTF-8 encoding support\n\n### Multi-Terminal Sessions\n\n- **6 Concurrent Sessions**: Run up to 6 terminals simultaneously\n- **Session Persistence**: Sessions persist when switching panels\n\n[...output truncated: 7142 characters omitted...]","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat docs/index.md","_callId":"call_run_command_1773260860268_9"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat docs/index.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n---\nlayout: home\ntitle: NimoteCode\ntitleTemplate: false\n\nhero:\n name: NimoteCode\n text: Mobile Remote Development IDE\n tagline: True development experience — anytime, anywhere — right from your phone or tablet.\n actions:\n - theme: brand\n text: Quick Start Guide\n link: /docs/quick-start\n - theme: brand\n text: Download on the App Store\n link: https://apps.apple.com/app/idXXXXXX\n - theme: brand\n text: Download on Google Play\n link: https://play.google.com/store/apps/details?id=com.nimotecode\n - theme: alt\n text: View on GitHub\n link: https://github.com/nimotecode/nimote_issues\n\nfeatures:\n - title: 🔒 Secure SSH Remote Terminal\n details: Establish encrypted SSH connections to your servers with support for multiple independent sessions running in parallel.\n icon: 🔐\n\n - title: ⚡ Flutter + Rust Powered\n details: Delivers a responsive cross-platform interface combined with high-performance native backend capabilities.\n icon: ⚡\n\n - title: 📂 Integrated SFTP File Explorer\n details: Seamlessly browse, upload, download, edit, and manage files on remote servers with full filesystem access.\n icon: 📂\n\n - title: 🎨 Advanced Syntax Highlighting\n details: Powered by Tree-sitter — accurate, fast, and supports dozens of programming languages out of the box.\n icon: 🎨\n\n - title: 🤖 AI Code Intelligence\n details: Integrate your preferred LLM to get context-aware completions, refactoring suggestions, and automated code edits.\n icon: 🤖\n\n - title: 📊 Visual Git Integration\n details: Repository status overview, commit history visualization, diff viewer, and per-file/line change tracking — all built-in.\n icon: 📊\n\n - title: 📱 Adaptive & Modern UI\n details: Fully responsive design for phones and tablets, with light/dark mode and custom theme support.\n icon: 📱\n---\n```\n\n","isError":false,"isPending":false},{"toolName":"run_command","arguments":{"command":"cd /home/elliot/nimoteoffical && cat docs/introduction.md","_callId":"call_run_command_1773260862105_10"},"result":"**Command**: `cd /home/elliot/nimoteoffical && cat docs/introduction.md`\n\n**Exit Code**: `0` ✅\n\n**Output**:\n```\n# Introduction\n\nWelcome to NimoteCode, a powerful mobile remote development IDE designed for Android and iOS.\n\n## What is NimoteCode?\n\nNimoteCode is a cross-platform mobile Integrated Development Environment (IDE) that brings the full power of a desktop development environment to your mobile device. Whether you're using a phone or tablet, NimoteCode provides a seamless coding experience.\n\n## Key Features\n\n### 🖥️ Modern Code Editor\n\n- **Syntax Highlighting**: Support for 50+ programming languages\n- **Code Folding**: Collapse and expand functions, classes, and code blocks\n- **Auto-Save**: Changes saved automatically after 5 seconds\n- **Large File Support**: Handle files up to 100,000 lines\n- **Undo/Redo**: Multiple levels of operation history\n- **Virtual Keyboard**: Mobile-optimized programming keyboard\n\n### 🔐 Secure SSH Remote Development\n\n- **SSH Connections**: Password and key-based authentication\n- **SFTP File Manager**: Browse, upload, download, and edit remote files\n- **Multi-Terminal**: Run up to 6 terminal sessions simultaneously\n- **Auto-Reconnect**: Automatic reconnection after disconnect (up to 2 attempts)\n- **Connection Status**: Real-time connection status display\n\n### 🖥️ Terminal Features\n\n- **xterm Compatible**: Full terminal emulator support\n- **ANSI Colors**: Complete color support for commands\n- **Quick Commands**: One-click access to common commands\n- **AI Analysis**: Intelligent terminal output analysis\n- **Full Screen Mode**: Expand terminal to full screen\n\n### 🤖 AI-Powered Assistant\n\n- **Multi-Provider Support**: OpenAI, Ollama, SiliconFlow, Groq\n- **Chat Mode**: Ask questions and get help\n- **Edit Mode**: AI-assisted code modifications\n- **Context Aware**: Automatically includes current file context\n- **Streaming Responses**: Real-time AI response display\n\n### 📦 GitHub Integration\n\n- **Repository Access**: Browse all your repos (public and private)\n- **File Editing**: Edit files directly from your device\n- **Auto-Commit**: Changes are automatically committed\n- **Branch Support**: Work with different branches\n- **OAuth Authentication**: Secure GitHub login\n\n### 🔧 Git Version Control\n\n- **Visual Git**: See your changes at a glance\n- **Commit History**: Browse and compare commits\n- **Diff Viewer**: Visual comparison of changes\n- **Line History**: See who changed what and when\n- **Real-time Status**: Status refreshes every 8 seconds\n\n### 🔍 Powerful Search\n\n- **File Search**: Find files by name\n- **Content Search**: Search within files\n- **Symbol Search**: Jump to functions, classes, variables\n- **Remote Search**: Search on remote servers\n\n### 🎨 Customizable Interface\n\n- **6 Themes**: Dark, Light, Solarized Dark, Solarized Light, Dracula, Monokai\n- **Responsive Layout**: Adapts to phones and tablets\n- **Three-Column Layout**: Efficient workspace organization\n\n[...output truncated: 3441 characters omitted...]","isError":false,"isPending":false}]}]} \ No newline at end of file diff --git a/.nimote/index.json b/.nimote/index.json deleted file mode 100644 index 01238b5..0000000 --- a/.nimote/index.json +++ /dev/null @@ -1 +0,0 @@ -{"histories":[{"id":"00374c48-9c9d-473a-b745-62ab855618c7","title":"Agent Session 2026-03-12 03:56:59.055681","description":"","created_at":"2026-03-12T03:56:59.312337","updated_at":"2026-03-12T03:56:59.312391"},{"id":"f221a60c-3ee5-4f9c-9360-ae878901b496","title":"Agent Session 2026-03-12 04:27:26.585483","description":"","created_at":"2026-03-12T04:27:26.910483","updated_at":"2026-03-12T04:27:26.910540"}],"created_at":"2026-03-12T03:56:58.999262"} \ No newline at end of file diff --git a/.qwen/settings.json b/.qwen/settings.json deleted file mode 100644 index 30e4bad..0000000 --- a/.qwen/settings.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(mkdir *)", - "Read(//home2/nimotecode/lib/**)", - "Bash(npm run *)", - "Bash(python3 *)", - "Bash(cp *)" - ] - }, - "$version": 3 -} \ No newline at end of file diff --git a/.qwen/settings.json.orig b/.qwen/settings.json.orig deleted file mode 100644 index 9a9e4cc..0000000 --- a/.qwen/settings.json.orig +++ /dev/null @@ -1,7 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(mkdir *)" - ] - } -} \ No newline at end of file diff --git a/README.MD b/README.MD index 1dda24f..01f72f0 100644 --- a/README.MD +++ b/README.MD @@ -1,28 +1,132 @@ + -# NimoteCode +

+ +

-Mobile-first IDE for local and SSH workspaces. +

+Build, SSH, Terminal, Git and AI — all from your phone & tablet. +

-- Official web: https://nimotecode.com -- Issues: https://github.com/nimotecode/nimote_issues +

+ +

+ +

+ + + + + + + + + + + +

+ +

+ +

## Overview +> 📢 **NimoteCode is now available on Google Play!** +> 🍏 The iOS version is currently under App Store review and will be released soon. +[![Google Play](https://img.shields.io/badge/Google_Play-Available-success?logo=googleplay&logoColor=white)](https://play.google.com/store/apps/details?id=com.nimote.nimotecode) +![App Store](https://img.shields.io/badge/App_Store-Coming_Soon-blue?logo=apple) + +**NimoteCode** is a mobile-first IDE designed for developers who want a real development environment on phones and tablets. + +Instead of being a lightweight code viewer, NimoteCode focuses on complete development workflows: + +- 📱 Local development +- 🌐 SSH remote workspaces +- ⚡ Terminal access +- 🌿 Git workflow +- 🤖 AI-assisted coding +- 📂 Project management +- 📳 sync code between local and ssh remote env +- 🔍 Syntax highlighting & code intelligence + +Built with **Flutter + Rust** for performance and cross-platform consistency. + +NimoteCode turns your phone or tablet into a practical coding workspace. Connect to local or SSH workspaces, edit files, run commands, review Git changes, use AI assistance, debug issues, and ship fixes without reaching for a laptop. + +Everything is designed around real mobile development workflows: focused panels, persistent terminal sessions, SSH reconnection, AI-assisted automation, and iPad-friendly workspace layouts. + +## Preview + +### Screeshots +

+ NimoteCode file explorer on phone + NimoteCode file explorer on phone + NimoteCode file explorer on phone +

+ +### DEMO Video +

+ + Watch NimoteCode demo + +

+ +Youtube: https://www.youtube.com/watch?v=cTpxPqJwo_s + +## Features + +| Feature | Description | +| --- | --- | +| **SSH Workspace** | Connect to real servers with heartbeat monitoring, auto-reconnection, and remote file access. | +| **Terminal** | Run persistent terminal sessions, search output, and execute frequent commands faster. | +| **Editor** | Edit code with syntax highlighting, outline navigation, find/replace, and symbol search. | +| **Git Source Control** | Review diffs, stage changes, commit, branch, stash, sync, and use Git AI. | +| **AI Chat & Agent** | Explain code, refactor files, automate tasks, and keep workspace-aware memory. | +| **LSP & Debug** | Use diagnostics, code actions, breakpoints, call stack, variables, and watches. | +| **Tasks & Timeline** | Run repeatable tasks, trace events, and analyze issues with AI-assisted root-cause workflows. | +| **Sync / Cache** | Sync local and remote files with safer path handling and operation history. | + +## High-Value Scenarios + +| Scenario | Workflow | +| --- | --- | +| **Remote hotfix** | Connect over SSH, edit files, run terminal commands, review changes, and commit the fix. | +| **On-call triage** | Inspect logs, check diagnostics, trace timeline events, and identify likely root causes faster. | +| **AI-assisted coding** | Ask questions, explain unfamiliar code, generate changes, and automate repetitive steps. | +| **Server maintenance** | Manage SSH profiles, run saved commands, update configs, and keep terminal sessions persistent. | +| **iPad development** | Use a larger workspace for Git, terminal, editor, and debugging workflows on the go. | + +## Free And Pro + +Start free with the essentials for mobile development. Upgrade to Pro when you need deeper Git, debugging, language tooling, and sync workflows. + +| Capability | Free | Pro | +| --- | :---: | :---: | +| SSH workspace and auto-reconnection | Yes | Yes | +| Editor, terminal, search, and tasks | Yes | Yes | +| AI Chat and Timeline analysis | Yes | Yes | +| Git Source Control and Git AI | | Yes | +| LSP diagnostics and code actions | | Yes | +| Full debugger | | Yes | +| Multi-terminal support | | Yes | +| Local / remote sync | | Yes | -NimoteCode is built with Flutter + Rust and focuses on practical development workflows on phones and tablets. +## Availability -Core capabilities: +| Platform | Status | +| --- | --- | +| **iOS** | ![App Store](https://img.shields.io/badge/App_Store-Coming_Soon-blue?logo=apple) | +| **Android** | [![Google Play](https://img.shields.io/badge/Google_Play-Available-success?logo=googleplay&logoColor=white)](https://play.google.com/store/apps/details?id=com.nimote.nimotecode) | -- Local Explorer and Remote Explorer (SSH) -- Code editor with syntax highlighting, outline, find/replace, symbol search -- Multi-terminal tabs with quick commands and terminal output search -- Source Control panel (status, stage/unstage, diff, commit, stash, branches) -- AI Chat + AI Agent (tool-based execution with auto/confirm modes) -- Task system (create, organize, run tasks in terminal) -- Timeline panel (event list, trace view, causal analysis flow) -- Sync / Cache panel for workspace sync workflows +## Links +- Website: https://nimotecode.com +- Download: https://nimotecode.com/download +- Documentation: https://nimotecode.com/docs/quick-start +- X: https://x.com/nimotecode +- Issues: https://github.com/nimotecode/nimote_issues/issues +- Email: nimotecode@gmail.com -## Support +## Keywords -- Email: aoun.ma@foxmail.com -- GitHub Issues: https://github.com/nimotecode/nimote_issues/issues +mobile IDE, SSH client, remote development, code editor, iOS app, Android app, Flutter app, Rust backend, developer tools diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 5e14179..c5bf2d1 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -1,60 +1,398 @@ -import { defineConfig } from 'vitepress' +import { defineConfig, type HeadConfig, type TransformContext } from 'vitepress' +import { ViteImageOptimizer } from 'vite-plugin-image-optimizer' + +const siteUrl = 'https://nimotecode.com' +const socialImage = `${siteUrl}/app_icon.png` +const localeConfig = { + root: { lang: 'en-US', path: '' }, + zh: { lang: 'zh-CN', path: '/zh' }, + ja: { lang: 'ja-JP', path: '/ja' }, + ko: { lang: 'ko-KR', path: '/ko' }, + ru: { lang: 'ru-RU', path: '/ru' }, + es: { lang: 'es-ES', path: '/es' } +} as const + +function normalizePath(path: string): string { + if (!path || path === 'index.md' || path === '/index.md') return '/' + let normalized = path + .replace(/\\/g, '/') + .replace(/(^|\/)index\.md$/, '$1') + .replace(/\.md$/, '') + if (!normalized.startsWith('/')) normalized = `/${normalized}` + normalized = normalized.replace(/\/+/g, '/') + return normalized === '' ? '/' : normalized +} + +function canonicalUrl(path: string): string { + const normalized = normalizePath(path) + return normalized === '/' ? siteUrl : `${siteUrl}${normalized}` +} + +function asContent(value: unknown, fallback: string): string { + if (typeof value === 'string' && value.trim()) return value + return fallback +} + +function pageDescription(context: TransformContext, title: string): string { + const explicit = asContent(context.pageData.frontmatter.description, '') + if (explicit) return explicit + + const normalizedTitle = title.trim() + if (!normalizedTitle || normalizedTitle === 'NimoteCode') { + return asContent(context.siteConfig.site.description, 'NimoteCode mobile developer workspace.') + } + + return `${normalizedTitle} page on NimoteCode, the mobile-first developer workspace for SSH, terminal, Git, AI, debugging, tasks, timeline, and sync/cache workflows.` +} + +function stripLocalePrefix(path: string): string { + return path.replace(/^\/(zh|ja|ko|ru|es)(?=\/|$)/, '') || '/' +} + +function titleCase(value: string): string { + return value + .split('-') + .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) + .join(' ') +} + +function languageForPath(path: string): string { + const localeKey = pageLocaleKey(path) + if (localeKey === 'zh') return 'zh-CN' + if (localeKey === 'ja') return 'ja-JP' + if (localeKey === 'ko') return 'ko-KR' + if (localeKey === 'ru') return 'ru-RU' + if (localeKey === 'es') return 'es-ES' + return 'en-US' +} + +function localeAlternates(path: string): HeadConfig[] { + const normalized = normalizePath(path) + const suffix = normalized === '/' ? '' : normalized + const stripped = suffix.replace(/^\/(zh|ja|ko|ru|es)(\/|$)/, '/') + const entries = Object.values(localeConfig).map((locale) => { + const localePath = `${locale.path}${stripped}` || '/' + const href = localePath === '/' ? siteUrl : `${siteUrl}${localePath}` + return ['link', { rel: 'alternate', hreflang: locale.lang, href }] as HeadConfig + }) + entries.push(['link', { rel: 'alternate', hreflang: 'x-default', href: siteUrl }]) + return entries +} + +function pageSchemas(context: TransformContext): object[] { + const url = canonicalUrl(context.pageData.relativePath) + const title = asContent(context.pageData.frontmatter.title, asContent(context.pageData.title, 'NimoteCode')) + const description = pageDescription(context, title) + const inLanguage = languageForPath(context.pageData.relativePath) + + const schemas: object[] = [ + { + '@context': 'https://schema.org', + '@type': 'Organization', + name: 'NimoteCode', + url: siteUrl, + logo: socialImage, + sameAs: [ + 'https://github.com/nimotecode', + 'https://x.com/nimotecode' + ] + }, + { + '@context': 'https://schema.org', + '@type': 'WebSite', + name: 'NimoteCode', + url: siteUrl, + description: 'NimoteCode is a mobile-first IDE and developer workspace for SSH, terminal, Git, AI, debugging, and daily software delivery from iPhone, iPad, Android phones, and tablets.', + inLanguage: 'en-US' + }, + { + '@context': 'https://schema.org', + '@type': 'WebPage', + name: title, + description, + url, + inLanguage + }, + { + '@context': 'https://schema.org', + '@type': 'SoftwareApplication', + name: 'NimoteCode', + applicationCategory: 'DeveloperApplication', + operatingSystem: 'iOS, iPadOS, Android', + url: siteUrl, + image: socialImage, + description: 'Mobile IDE and developer workspace with code editor, SSH terminal, Git, AI coding assistant, LSP, debugger, tasks, timeline diagnostics, and sync/cache workflows.', + offers: { + '@type': 'Offer', + price: '0', + priceCurrency: 'USD', + availability: 'https://schema.org/InStock', + category: 'Freemium' + } + } + ] + + if (normalizePath(context.pageData.relativePath) !== '/') { + schemas.push({ + '@context': 'https://schema.org', + '@type': 'TechArticle', + headline: title, + description, + url, + author: { + '@type': 'Organization', + name: 'NimoteCode' + }, + publisher: { + '@type': 'Organization', + name: 'NimoteCode', + logo: { + '@type': 'ImageObject', + url: socialImage + } + } + }) + } + + const breadcrumb = breadcrumbSchema(context) + if (breadcrumb) { + schemas.push(breadcrumb) + } + + const faq = faqSchema(context) + if (faq) { + schemas.push(faq) + } + + return schemas +} + +function breadcrumbSchema(context: TransformContext): object | null { + const normalized = normalizePath(context.pageData.relativePath) + const localePrefix = normalized.match(/^\/(zh|ja|ko|ru|es)(?=\/|$)/)?.[0] ?? '' + const stripped = stripLocalePrefix(normalized) + if (stripped === '/') return null + + const segments = stripped.split('/').filter(Boolean) + if (segments.length === 0) return null + + const items = [ + { + '@type': 'ListItem', + position: 1, + name: 'Home', + item: localePrefix ? `${siteUrl}${localePrefix}` : siteUrl + } + ] + + let currentUrl = localePrefix ? `${siteUrl}${localePrefix}` : siteUrl + segments.forEach((segment, index) => { + currentUrl = `${currentUrl}/${segment}` + const isLast = index === segments.length - 1 + const label = isLast ? asContent(context.pageData.title, titleCase(segment)) : titleCase(segment) + + items.push({ + '@type': 'ListItem', + position: index + 2, + name: label, + item: currentUrl + }) + }) + + return { + '@context': 'https://schema.org', + '@type': 'BreadcrumbList', + itemListElement: items + } +} + +function faqSchema(context: TransformContext): object | null { + const normalized = normalizePath(context.pageData.relativePath) + const faqEntries: Record> = { + '/docs/faq': [ + { + question: 'Is NimoteCode only for remote development?', + answer: 'No. You can work in Local Explorer mode or Remote Explorer (SSH) mode.' + }, + { + question: 'Which AI providers are supported?', + answer: 'Built-in templates include OpenAI, Anthropic, Gemini, Grok, DeepSeek, Zhipu, Moonshot, Ollama, and custom OpenAI-compatible endpoints.' + }, + { + question: 'What can I do in Source Control?', + answer: 'You can stage, unstage, discard, commit, push, pull, fetch, manage branches and stashes, view history, and use Git AI analysis tools.' + }, + { + question: 'Can I run project tasks?', + answer: 'Yes. Use the Tasks panel to create and run tasks, then inspect output in terminal.' + }, + { + question: 'What is Timeline used for?', + answer: 'Timeline helps you inspect events and traces, including causal analysis flow for troubleshooting.' + }, + { + question: 'Why is a feature locked?', + answer: 'Some capabilities are Pro-gated. Subscription status is verified by the app premium access flow.' + } + ], + '/zh/docs/faq': [ + { + question: 'NimoteCode 只能远程开发吗?', + answer: '不是。支持 Local Explorer(本地)与 Remote Explorer(SSH)两种模式。' + }, + { + question: '支持哪些 AI 提供商?', + answer: '内置模板包括 OpenAI、Anthropic、Gemini、Grok、DeepSeek、Zhipu、Moonshot、Ollama 以及自定义 OpenAI 兼容端点。' + }, + { + question: 'Source Control 能做什么?', + answer: '支持暂存、取消暂存、丢弃、提交、推拉取、分支与 stash 管理、历史与 Git AI 分析。' + }, + { + question: '可以运行项目任务吗?', + answer: '可以。使用 Tasks 面板创建并运行任务,输出可在终端查看。' + }, + { + question: 'Timeline 有什么用?', + answer: '用于查看事件与 Trace,帮助定位问题与复盘执行链路。' + }, + { + question: '为什么有些功能不可用?', + answer: '部分能力受 Pro 门控,需通过订阅状态校验。' + } + ] + } + + const entries = faqEntries[normalized] + if (!entries) return null + + return { + '@context': 'https://schema.org', + '@type': 'FAQPage', + mainEntity: entries.map((entry) => ({ + '@type': 'Question', + name: entry.question, + acceptedAnswer: { + '@type': 'Answer', + text: entry.answer + } + })) + } +} + +// Load the primary UI font asynchronously so it never blocks first paint. +// The fallback stack in tokens.css renders immediately, and the web font +// swaps in once the stylesheet finishes loading. +const FONT_LATIN = 'https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@500;600;700;800&family=JetBrains+Mono:wght@500;600&display=swap' +const FONT_ZH = 'https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@500;600;700;800&display=swap' +const FONT_JA = 'https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@500;600;700;800&display=swap' +const FONT_KO = 'https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@500;600;700;800&display=swap' +const FONT_RU = 'https://fonts.googleapis.com/css2?family=Inter:wght@500;600;700;800&display=swap' +const FONT_ES = 'https://fonts.googleapis.com/css2?family=Inter:wght@500;600;700;800&display=swap' + +function fontByLocale(lang: string): string { + if (lang.startsWith('zh')) return FONT_ZH + if (lang.startsWith('ja')) return FONT_JA + if (lang.startsWith('ko')) return FONT_KO + if (lang.startsWith('ru')) return FONT_RU + if (lang.startsWith('es')) return FONT_ES + return FONT_LATIN +} + +function fontLinks(path: string): HeadConfig[] { + const normalized = normalizePath(path) + const stripped = suffixToLocaleKey(normalized) + const lang = + stripped === 'zh' ? 'zh-CN' : + stripped === 'ja' ? 'ja-JP' : + stripped === 'ko' ? 'ko-KR' : + stripped === 'ru' ? 'ru-RU' : + stripped === 'es' ? 'es-ES' : 'en-US' + const href = fontByLocale(lang) + return [ + ['link', { rel: 'preconnect', href: 'https://fonts.googleapis.com' }], + ['link', { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin: '' }], + // Async pattern: stylesheet is print-only until the browser swaps it to all. + // This keeps the font off the critical render path. + ['link', { rel: 'preload', as: 'style', href }], + ['link', { rel: 'stylesheet', href, media: 'print', onload: "this.media='all'" }], + // noscript fallback so the font still works without JS. + ['noscript', {}, ``] + ] +} + +function suffixToLocaleKey(normalized: string): string { + const m = normalized.match(/^\/(zh|ja|ko|ru|es)(?:\/|$)/) + return m ? m[1] : '' +} + +function pageLocaleKey(path: string): string { + const normalized = normalizePath(path) + return suffixToLocaleKey(normalized) +} export default defineConfig({ - title: 'NimoteCode', - description: 'Mobile-first IDE for real delivery - SSH workspace, terminal, Source Control, LSP/Debug, AI Agent, and Timeline diagnostics.', + description: 'NimoteCode is a mobile-first IDE and developer workspace with SSH terminal, code editor, Git, AI agent, LSP, debugger, tasks, timeline diagnostics, and sync/cache.', base: '/', lang: 'en-US', + cleanUrls: true, + sitemap: { + hostname: siteUrl + }, + transformHead(context) { + const url = canonicalUrl(context.pageData.relativePath) + const title = asContent(context.pageData.frontmatter.title, asContent(context.pageData.title, 'NimoteCode')) + const description = pageDescription(context, title) + const image = asContent(context.pageData.frontmatter.image, socialImage) + + return [ + ['link', { rel: 'canonical', href: url }], + ...fontLinks(context.pageData.relativePath), + ['meta', { property: 'og:site_name', content: 'NimoteCode' }], + ['meta', { property: 'og:title', content: title }], + ['meta', { property: 'og:description', content: description }], + ['meta', { property: 'og:url', content: url }], + ['meta', { property: 'og:image', content: image }], + ['meta', { name: 'twitter:title', content: title }], + ['meta', { name: 'twitter:description', content: description }], + ['meta', { name: 'twitter:image', content: image }], + ['meta', { name: 'robots', content: 'index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' }], + ['meta', { name: 'author', content: 'NimoteCode' }], + ['meta', { name: 'apple-mobile-web-app-title', content: 'NimoteCode' }], + ['script', { type: 'application/ld+json' }, JSON.stringify(pageSchemas(context))], + ...localeAlternates(context.pageData.relativePath) + ] + }, head: [ ['link', { rel: 'icon', href: '/favicon.ico' }], + ['link', { rel: 'manifest', href: '/site.webmanifest' }], ['meta', { name: 'viewport', content: 'width=device-width, initial-scale=1.0' }], + ['meta', { name: 'theme-color', content: '#4f46e5' }], + ['meta', { name: 'generator', content: 'VitePress' }], ['meta', { property: 'og:type', content: 'website' }], - ['meta', { property: 'og:title', content: 'NimoteCode - Ship Production Fixes from Your Phone' }], - ['meta', { property: 'og:description', content: 'Mobile-first IDE for real delivery - SSH workspace, terminal, Source Control, LSP/Debug, AI Agent, and Timeline diagnostics.' }], - ['meta', { property: 'og:url', content: 'https://nimotecode.com' }], ['meta', { name: 'twitter:card', content: 'summary_large_image' }], - ['meta', { name: 'twitter:title', content: 'NimoteCode - Ship Production Fixes from Your Phone' }], - ['meta', { name: 'twitter:description', content: 'Mobile-first IDE for real delivery' }], - ['link', { rel: 'preconnect', href: 'https://fonts.googleapis.com' }], - ['link', { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin: '' }], - ['link', { - rel: 'stylesheet', - href: 'https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=Space+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&family=Noto+Sans+SC:wght@400;500;600;700&display=swap' - }] + ['meta', { name: 'format-detection', content: 'telephone=no' }], ], - // Theme configuration themeConfig: { siteTitle: 'NimoteCode', logo: { - light: '/logo-light.png', - dark: '/logo-dark.png' + light: '/app_icon.png', + dark: '/app_icon.png' }, - - // Social links socialLinks: [ { icon: 'github', link: 'https://github.com/nimotecode' }, - { icon: 'twitter', link: 'https://twitter.com/nimotecode' }, + { icon: 'twitter', link: 'https://x.com/nimotecode' }, { icon: 'discord', link: 'https://discord.gg/nimotecode' } ], - - // Footer configuration footer: { message: 'Built for developers on the move. Released under the MIT License.', copyright: 'Copyright © 2024 NimoteCode. All rights reserved.' }, - - // Edit link configuration editLink: { pattern: 'https://github.com/nimotecode/nimote_issues/edit/main/docs/:path', text: 'Edit this page on GitHub' - }, - - // Carbon ads (optional) - // carbonAds: { - // code: 'your-carbon-code', - // placement: 'your-carbon-placement' - // } + } }, locales: { @@ -64,50 +402,72 @@ export default defineConfig({ themeConfig: { nav: [ { text: 'Features', link: '/features' }, - { text: 'Documentation', link: '/docs/quick-start' }, + { text: 'Use Cases', link: '/use-cases/' }, + { text: 'Docs', link: '/docs/quick-start' }, { text: 'Support', link: '/support' }, - { text: 'Account Deletion', link: '/account-delete' }, + { text: 'Account Delete', link: '/account-delete' }, { text: 'Privacy', link: '/privacy' }, { text: 'Terms', link: '/terms' } ], sidebar: { '/': [ { - text: 'Getting Started', + text: 'Start', items: [ { text: 'Quick Start', link: '/docs/quick-start' }, { text: 'Introduction', link: '/introduction' }, { text: 'Features', link: '/features' }, + { text: 'Use Cases', link: '/use-cases/' }, + { text: 'Pro', link: '/pro' }, { text: 'Download', link: '/download' } ] }, { - text: 'Documentation', + text: 'Use Cases', + items: [ + { text: 'Overview', link: '/use-cases/' }, + { text: 'Remote Hotfix', link: '/use-cases/remote-hotfix' }, + { text: 'On-call Diagnostics', link: '/use-cases/on-call-diagnostics' }, + { text: 'AI Agent Workflows', link: '/use-cases/ai-agent' } + ] + }, + { + text: 'Daily Workflow', + items: [ + { text: 'SSH Workspace', link: '/docs/ssh' }, + { text: 'Editor', link: '/docs/editor' }, + { text: 'Terminal', link: '/docs/terminal' }, + { text: 'Search', link: '/docs/search' }, + { text: 'Source Control', link: '/docs/source-control' }, + { text: 'Tasks', link: '/docs/tasks' } + ] + }, + { + text: 'AI and Diagnostics', items: [ - { text: 'SSH Remote Development', link: '/docs/ssh' }, - { text: 'Terminal Usage', link: '/docs/terminal' }, - { text: 'Source Control Workflow', link: '/docs/source-control' }, { text: 'AI Assistant', link: '/docs/ai' }, - { text: 'LSP Panel', link: '/docs/lsp' }, - { text: 'Debug Panel', link: '/docs/debug' }, - { text: 'Tasks Panel', link: '/docs/tasks' }, - { text: 'Timeline Panel', link: '/docs/timeline' }, - { text: 'Sync / Cache Panel', link: '/docs/sync-cache' }, - { text: 'Settings', link: '/docs/settings' }, - { text: 'Configuration', link: '/docs/configuration' } + { text: 'LSP', link: '/docs/lsp' }, + { text: 'Debug', link: '/docs/debug' }, + { text: 'Timeline', link: '/docs/timeline' }, + { text: 'Sync / Cache', link: '/docs/sync-cache' } ] }, { - text: 'Help', + text: 'Reference', items: [ + { text: 'Account and Subscription', link: '/docs/account-subscription' }, + { text: 'Security and Safety', link: '/docs/security' }, + { text: 'Settings', link: '/docs/settings' }, + { text: 'Configuration', link: '/docs/configuration' }, { text: 'FAQ', link: '/docs/faq' }, - { text: 'Support', link: '/support' } + { text: 'Support', link: '/support' }, + { text: 'Privacy', link: '/privacy' }, + { text: 'Terms', link: '/terms' }, + { text: 'Account Deletion', link: '/account-delete' } ] } ] }, - - // Search configuration search: { provider: 'local' } @@ -121,6 +481,7 @@ export default defineConfig({ themeConfig: { nav: [ { text: '功能', link: '/zh/features' }, + { text: '场景', link: '/zh/use-cases/' }, { text: '文档', link: '/zh/docs/quick-start' }, { text: '支持', link: '/zh/support' }, { text: '账号删除', link: '/zh/account-delete' }, @@ -135,35 +496,53 @@ export default defineConfig({ { text: '快速入门', link: '/zh/docs/quick-start' }, { text: '简介', link: '/zh/introduction' }, { text: '功能特性', link: '/zh/features' }, + { text: '使用场景', link: '/zh/use-cases/' }, { text: '下载', link: '/zh/download' } ] }, { - text: '文档', + text: '场景', + items: [ + { text: '总览', link: '/zh/use-cases/' }, + { text: '远程热修', link: '/zh/use-cases/remote-hotfix' }, + { text: '值班诊断', link: '/zh/use-cases/on-call-diagnostics' }, + { text: 'AI Agent 工作流', link: '/zh/use-cases/ai-agent' } + ] + }, + { + text: '日常开发', items: [ { text: 'SSH 远程开发', link: '/zh/docs/ssh' }, + { text: '编辑器', link: '/zh/docs/editor' }, { text: '终端使用', link: '/zh/docs/terminal' }, { text: 'Source Control 工作流', link: '/zh/docs/source-control' }, + { text: 'Tasks 面板', link: '/zh/docs/tasks' } + ] + }, + { + text: 'AI 与诊断', + items: [ { text: 'AI 助手', link: '/zh/docs/ai' }, { text: 'LSP 面板', link: '/zh/docs/lsp' }, { text: '调试面板', link: '/zh/docs/debug' }, - { text: 'Tasks 面板', link: '/zh/docs/tasks' }, { text: 'Timeline 面板', link: '/zh/docs/timeline' }, - { text: 'Sync / Cache 面板', link: '/zh/docs/sync-cache' }, - { text: '设置', link: '/zh/docs/settings' }, - { text: '配置', link: '/zh/docs/configuration' } + { text: 'Sync / Cache 面板', link: '/zh/docs/sync-cache' } ] }, { - text: '帮助', + text: '参考', items: [ + { text: '设置', link: '/zh/docs/settings' }, + { text: '配置', link: '/zh/docs/configuration' }, { text: '常见问题', link: '/zh/docs/faq' }, - { text: '支持', link: '/zh/support' } + { text: '支持', link: '/zh/support' }, + { text: '隐私政策', link: '/zh/privacy' }, + { text: '服务条款', link: '/zh/terms' }, + { text: '账号删除', link: '/zh/account-delete' } ] } ] }, - search: { provider: 'local' } @@ -177,6 +556,7 @@ export default defineConfig({ themeConfig: { nav: [ { text: '機能', link: '/ja/features' }, + { text: 'ユースケース', link: '/ja/use-cases/' }, { text: 'ドキュメント', link: '/ja/docs/quick-start' }, { text: 'サポート', link: '/ja/support' }, { text: 'アカウント削除', link: '/ja/account-delete' }, @@ -195,31 +575,38 @@ export default defineConfig({ ] }, { - text: 'ドキュメント', + text: '日常のワークフロー', items: [ { text: 'SSHリモート開発', link: '/ja/docs/ssh' }, { text: 'ターミナル使用', link: '/ja/docs/terminal' }, { text: 'Source Controlワークフロー', link: '/ja/docs/source-control' }, + { text: 'Tasksパネル', link: '/ja/docs/tasks' } + ] + }, + { + text: 'AIと診断', + items: [ { text: 'AIアシスタント', link: '/ja/docs/ai' }, { text: 'LSPパネル', link: '/ja/docs/lsp' }, { text: 'デバッグパネル', link: '/ja/docs/debug' }, - { text: 'Tasksパネル', link: '/ja/docs/tasks' }, { text: 'Timelineパネル', link: '/ja/docs/timeline' }, - { text: 'Sync / Cacheパネル', link: '/ja/docs/sync-cache' }, - { text: '設定', link: '/ja/docs/settings' }, - { text: '構成', link: '/ja/docs/configuration' } + { text: 'Sync / Cacheパネル', link: '/ja/docs/sync-cache' } ] }, { - text: 'ヘルプ', + text: 'リファレンス', items: [ + { text: '設定', link: '/ja/docs/settings' }, + { text: '構成', link: '/ja/docs/configuration' }, { text: 'FAQ', link: '/ja/docs/faq' }, - { text: 'サポート', link: '/ja/support' } + { text: 'サポート', link: '/ja/support' }, + { text: 'プライバシー', link: '/ja/privacy' }, + { text: '利用規約', link: '/ja/terms' }, + { text: 'アカウント削除', link: '/ja/account-delete' } ] } ] }, - search: { provider: 'local' } @@ -233,10 +620,11 @@ export default defineConfig({ themeConfig: { nav: [ { text: '기능', link: '/ko/features' }, + { text: '사용 사례', link: '/ko/use-cases/' }, { text: '문서', link: '/ko/docs/quick-start' }, { text: '지원', link: '/ko/support' }, { text: '계정 삭제', link: '/ko/account-delete' }, - { text: '개인정보', link: '/ko/privacy' }, + { text: '개인정보 처리방침', link: '/ko/privacy' }, { text: '이용 약관', link: '/ko/terms' } ], sidebar: { @@ -251,31 +639,38 @@ export default defineConfig({ ] }, { - text: '문서', + text: '일상 워크플로우', items: [ { text: 'SSH 원격 개발', link: '/ko/docs/ssh' }, { text: '터미널 사용', link: '/ko/docs/terminal' }, { text: 'Source Control 워크플로우', link: '/ko/docs/source-control' }, + { text: 'Tasks 패널', link: '/ko/docs/tasks' } + ] + }, + { + text: 'AI 및 진단', + items: [ { text: 'AI 어시스턴트', link: '/ko/docs/ai' }, { text: 'LSP 패널', link: '/ko/docs/lsp' }, { text: '디버그 패널', link: '/ko/docs/debug' }, - { text: 'Tasks 패널', link: '/ko/docs/tasks' }, { text: 'Timeline 패널', link: '/ko/docs/timeline' }, - { text: 'Sync / Cache 패널', link: '/ko/docs/sync-cache' }, - { text: '설정', link: '/ko/docs/settings' }, - { text: '구성', link: '/ko/docs/configuration' } + { text: 'Sync / Cache 패널', link: '/ko/docs/sync-cache' } ] }, { - text: '도움말', + text: '참조', items: [ + { text: '설정', link: '/ko/docs/settings' }, + { text: '구성', link: '/ko/docs/configuration' }, { text: 'FAQ', link: '/ko/docs/faq' }, - { text: '지원', link: '/ko/support' } + { text: '지원', link: '/ko/support' }, + { text: '개인정보 처리방침', link: '/ko/privacy' }, + { text: '이용 약관', link: '/ko/terms' }, + { text: '계정 삭제', link: '/ko/account-delete' } ] } ] }, - search: { provider: 'local' } @@ -289,6 +684,7 @@ export default defineConfig({ themeConfig: { nav: [ { text: 'Функции', link: '/ru/features' }, + { text: 'Сценарии', link: '/ru/use-cases/' }, { text: 'Документация', link: '/ru/docs/quick-start' }, { text: 'Поддержка', link: '/ru/support' }, { text: 'Удаление аккаунта', link: '/ru/account-delete' }, @@ -307,31 +703,38 @@ export default defineConfig({ ] }, { - text: 'Документация', + text: 'Повседневная работа', items: [ { text: 'SSH-разработка', link: '/ru/docs/ssh' }, { text: 'Использование терминала', link: '/ru/docs/terminal' }, { text: 'Source Control', link: '/ru/docs/source-control' }, + { text: 'Tasks', link: '/ru/docs/tasks' } + ] + }, + { + text: 'ИИ и диагностика', + items: [ { text: 'AI-ассистент', link: '/ru/docs/ai' }, { text: 'Панель LSP', link: '/ru/docs/lsp' }, { text: 'Панель Debug', link: '/ru/docs/debug' }, - { text: 'Панель Tasks', link: '/ru/docs/tasks' }, { text: 'Панель Timeline', link: '/ru/docs/timeline' }, - { text: 'Sync / Cache', link: '/ru/docs/sync-cache' }, - { text: 'Настройки', link: '/ru/docs/settings' }, - { text: 'Конфигурация', link: '/ru/docs/configuration' } + { text: 'Sync / Cache', link: '/ru/docs/sync-cache' } ] }, { - text: 'Помощь', + text: 'Справка', items: [ + { text: 'Настройки', link: '/ru/docs/settings' }, + { text: 'Конфигурация', link: '/ru/docs/configuration' }, { text: 'FAQ', link: '/ru/docs/faq' }, - { text: 'Поддержка', link: '/ru/support' } + { text: 'Поддержка', link: '/ru/support' }, + { text: 'Конфиденциальность', link: '/ru/privacy' }, + { text: 'Условия', link: '/ru/terms' }, + { text: 'Удаление аккаунта', link: '/ru/account-delete' } ] } ] }, - search: { provider: 'local' } @@ -345,6 +748,7 @@ export default defineConfig({ themeConfig: { nav: [ { text: 'Funciones', link: '/es/features' }, + { text: 'Casos de uso', link: '/es/use-cases/' }, { text: 'Documentación', link: '/es/docs/quick-start' }, { text: 'Soporte', link: '/es/support' }, { text: 'Eliminar cuenta', link: '/es/account-delete' }, @@ -363,42 +767,75 @@ export default defineConfig({ ] }, { - text: 'Documentación', + text: 'Flujo diario', items: [ { text: 'Desarrollo SSH', link: '/es/docs/ssh' }, { text: 'Uso del terminal', link: '/es/docs/terminal' }, { text: 'Source Control', link: '/es/docs/source-control' }, + { text: 'Tasks', link: '/es/docs/tasks' } + ] + }, + { + text: 'IA y diagnóstico', + items: [ { text: 'Asistente AI', link: '/es/docs/ai' }, { text: 'Panel LSP', link: '/es/docs/lsp' }, { text: 'Panel Debug', link: '/es/docs/debug' }, - { text: 'Panel Tasks', link: '/es/docs/tasks' }, { text: 'Panel Timeline', link: '/es/docs/timeline' }, - { text: 'Sync / Cache', link: '/es/docs/sync-cache' }, - { text: 'Configuración', link: '/es/docs/settings' }, - { text: 'Configuración', link: '/es/docs/configuration' } + { text: 'Sync / Cache', link: '/es/docs/sync-cache' } ] }, { - text: 'Ayuda', + text: 'Referencia', items: [ + { text: 'Ajustes', link: '/es/docs/settings' }, + { text: 'Configuración', link: '/es/docs/configuration' }, { text: 'FAQ', link: '/es/docs/faq' }, - { text: 'Soporte', link: '/es/support' } + { text: 'Soporte', link: '/es/support' }, + { text: 'Privacidad', link: '/es/privacy' }, + { text: 'Términos', link: '/es/terms' }, + { text: 'Eliminar cuenta', link: '/es/account-delete' } ] } ] }, - search: { provider: 'local' } } } }, - - // Build configuration - build: { - outDir: './dist', - assetsDir: './assets', - emptyOutDir: true + + outDir: './.vitepress/dist', + assetsDir: './assets', + + vite: { + plugins: [ + ViteImageOptimizer({ + test: /\.(jpe?g|png|gif|webp|avif)$/i, + exclude: [ + 'app_icon.png', + 'favicon.ico' + ], + includePublic: true, + cache: true, + cacheLocation: 'node_modules/.vite-image-optimizer', + logStats: true, + ansiColors: true, + svg: { + multipass: true + }, + png: { + quality: 80, + compressionLevel: 9 + }, + jpeg: { + quality: 80 + }, + webp: { + quality: 80 + } + }) + ] } }) diff --git a/docs/.vitepress/env.d.ts b/docs/.vitepress/env.d.ts new file mode 100644 index 0000000..991e773 --- /dev/null +++ b/docs/.vitepress/env.d.ts @@ -0,0 +1,9 @@ +/// +/// + +declare module '*.vue' { + import type { DefineComponent } from 'vue' + + const component: DefineComponent, Record, unknown> + export default component +} diff --git a/docs/.vitepress/theme/Layout.vue b/docs/.vitepress/theme/Layout.vue index 897e6b8..4d84e20 100644 --- a/docs/.vitepress/theme/Layout.vue +++ b/docs/.vitepress/theme/Layout.vue @@ -1,8 +1,10 @@ diff --git a/docs/.vitepress/theme/NimoteTheme.vue b/docs/.vitepress/theme/NimoteTheme.vue deleted file mode 100644 index e0084dd..0000000 --- a/docs/.vitepress/theme/NimoteTheme.vue +++ /dev/null @@ -1,55 +0,0 @@ - - - - - diff --git a/docs/.vitepress/theme/components/PricingFeatureSystem.vue b/docs/.vitepress/theme/components/PricingFeatureSystem.vue new file mode 100644 index 0000000..ad7b4bd --- /dev/null +++ b/docs/.vitepress/theme/components/PricingFeatureSystem.vue @@ -0,0 +1,74 @@ + + + diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index ab89894..f83c05e 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -1,730 +1,14 @@ -/* NimoteCode VitePress Theme - Refined Dual Theme */ - -:root { - --vp-font-family-base: -apple-system, BlinkMacSystemFont, "SF Pro Display", "SF Pro Text", "Inter", "Roboto", "Helvetica Neue", Arial, sans-serif; - --vp-font-family-mono: "SF Mono", "JetBrains Mono", "Fira Code", "Roboto Mono", monospace; - - /* Brand Colors */ - --vp-c-brand-1: #2563eb; - --vp-c-brand-2: #0ea5e9; - --vp-c-brand-soft: rgba(37, 99, 235, 0.14); - - /* Color System - Light Mode */ - --nimote-accent: #2563eb; - --nimote-accent-rgb: 37, 99, 235; - --nimote-accent-light: #38bdf8; - --nimote-accent-dark: #1d4ed8; - --nimote-gold: #fbbf24; - --nimote-gold-rgb: 251, 191, 36; - - /* Light Theme Colors */ - --nimote-bg: #ffffff; - --nimote-bg-rgb: 255, 255, 255; - --nimote-bg-elevated: #f8fafc; - --nimote-bg-subtle: #f1f5f9; - --nimote-card: #ffffff; - --nimote-card-hover: #f8fafc; - - /* Text Colors - Light */ - --nimote-text-primary: #1e293b; - --nimote-text-secondary: #64748b; - --nimote-text-muted: #94a3b8; - - /* Borders & Separators - Light */ - --nimote-border: rgba(15, 23, 42, 0.08); - --nimote-border-strong: rgba(15, 23, 42, 0.12); - --nimote-border-accent: rgba(99, 102, 241, 0.25); - - /* Shadows - Light */ - --nimote-shadow-sm: 0 1px 2px rgba(15, 23, 42, 0.05); - --nimote-shadow-md: 0 4px 12px rgba(15, 23, 42, 0.08); - --nimote-shadow-lg: 0 8px 32px rgba(15, 23, 42, 0.12); - --nimote-shadow-xl: 0 16px 64px rgba(15, 23, 42, 0.15); - --nimote-shadow-brand: 0 8px 32px rgba(99, 102, 241, 0.25); - --nimote-shadow-gold: 0 8px 32px rgba(251, 191, 36, 0.15); - - /* Gradients - Light */ - --nimote-gradient: linear-gradient(135deg, #2563eb 0%, #0ea5e9 55%, #22d3ee 100%); - --nimote-gradient-subtle: linear-gradient(135deg, rgba(37, 99, 235, 0.1) 0%, rgba(14, 165, 233, 0.06) 55%, rgba(34, 211, 238, 0.04) 100%); - --nimote-gradient-gold: linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%); - --nimote-gradient-bg: radial-gradient(ellipse 80% 50% at 50% -20%, rgba(37, 99, 235, 0.1) 0%, transparent 70%); - - /* Status Colors */ - --nimote-success: #10b981; - --nimote-warning: #f59e0b; - --nimote-error: #ef4444; -} - -/* Dark Mode */ -.dark { - /* Dark Theme Colors */ - --nimote-bg: #050505; - --nimote-bg-rgb: 5, 5, 5; - --nimote-bg-elevated: #0a0a0a; - --nimote-bg-subtle: #111111; - --nimote-card: #141414; - --nimote-card-hover: #181818; - - /* Text Colors - Dark */ - --nimote-text-primary: #fafafa; - --nimote-text-secondary: #a1a1aa; - --nimote-text-muted: #52525b; - - /* Borders & Separators - Dark */ - --nimote-border: rgba(255, 255, 255, 0.08); - --nimote-border-strong: rgba(255, 255, 255, 0.12); - --nimote-border-accent: rgba(99, 102, 241, 0.25); - - /* Shadows - Dark */ - --nimote-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.5); - --nimote-shadow-md: 0 4px 16px rgba(0, 0, 0, 0.6); - --nimote-shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.7); - --nimote-shadow-xl: 0 16px 64px rgba(0, 0, 0, 0.8); - --nimote-shadow-brand: 0 8px 32px rgba(99, 102, 241, 0.3); - --nimote-shadow-gold: 0 8px 32px rgba(251, 191, 36, 0.15); - - /* Gradients - Dark */ - --nimote-gradient: linear-gradient(135deg, #60a5fa 0%, #38bdf8 55%, #67e8f9 100%); - --nimote-gradient-subtle: linear-gradient(135deg, rgba(96, 165, 250, 0.12) 0%, rgba(56, 189, 248, 0.08) 55%, rgba(103, 232, 249, 0.05) 100%); - --nimote-gradient-bg: radial-gradient(ellipse 80% 50% at 50% -20%, rgba(96, 165, 250, 0.12) 0%, transparent 70%); -} - -/* Global Reset & Base Styles */ -* { - box-sizing: border-box; -} - -html { - scroll-behavior: smooth; - scroll-padding-top: 80px; -} - -html, -body, -#app, -.Layout { - background: var(--nimote-bg); - color: var(--nimote-text-primary); - min-height: 100vh; -} - -body { - background-image: var(--nimote-gradient-bg); - background-repeat: no-repeat; - background-attachment: fixed; -} - -/* Navigation Bar */ -.VPNav, -.VPNavBar, -.VPNavBar.has-sidebar { - background: rgba(var(--nimote-bg-rgb), 0.78) !important; - backdrop-filter: saturate(170%) blur(20px); - -webkit-backdrop-filter: saturate(170%) blur(20px); - border-bottom: 1px solid var(--nimote-border); - transition: all 0.3s ease; -} - -.VPNav.scrolled { - box-shadow: var(--nimote-shadow-md); - background: rgba(var(--nimote-bg-rgb), 0.92) !important; -} - -.VPNavBar .container, -.VPNavBar .content, -.VPNavBar .content-body, -.VPNavBar .divider, -.VPNavBar .curtain { - background: transparent !important; -} - -.VPNavBar .content-body { - border-bottom: none; -} - -.VPNavBar .title, -.VPNavBarTitle .title { - font-weight: 600; - letter-spacing: -0.015em; - font-size: 1.02rem; - color: var(--nimote-text-primary); -} - -/* Sidebar */ -.VPSidebar { - background: color-mix(in srgb, var(--nimote-bg-elevated) 86%, transparent); - backdrop-filter: blur(8px); - border-right: 1px solid var(--nimote-border); -} - -.VPSidebarGroup .title { - font-size: 0.68rem; - font-weight: 600; - letter-spacing: 0.1em; - text-transform: uppercase; - color: var(--nimote-text-muted); - margin-bottom: 0.5rem; -} - -.VPSidebarItem .item .link, -.VPSidebarItem .item .text { - color: var(--nimote-text-secondary); - font-weight: 500; - transition: all 0.15s ease; - border-radius: 6px; - font-size: 0.9rem; -} - -.VPSidebarItem .item .link:hover, -.VPSidebarItem .item .link:hover .text { - color: var(--nimote-text-primary); - background: var(--nimote-bg-subtle); -} - -.VPSidebarItem.is-active > .item > .link { - background: var(--nimote-bg-subtle); -} - -.VPSidebarItem.is-active > .item > .link > .text { - color: var(--nimote-accent); - font-weight: 600; -} - -/* Local Navigation */ -.VPLocalNav { - background: var(--nimote-bg-elevated); - border-bottom: 1px solid var(--nimote-border); -} - -.VPDocAsideOutline { - border-left: 1px solid var(--nimote-border); -} - -.VPDocAside .outline-link { - color: var(--nimote-text-secondary); - font-weight: 500; - transition: all 0.15s ease; - padding: 0.35rem 0.7rem; - border-radius: 6px; - font-size: 0.88rem; -} - -.VPDocAside .outline-link:hover { - color: var(--nimote-text-primary); - background: var(--nimote-bg-subtle); -} - -.VPDocAside .outline-link.active { - color: var(--nimote-accent); - font-weight: 600; - background: var(--nimote-bg-subtle); -} - -/* Document Content */ -.vp-doc { - max-width: 740px; -} - -.vp-doc h1 { - letter-spacing: -0.04em; - margin-bottom: 1rem; - font-weight: 700; - font-size: 2.25rem; - color: var(--nimote-text-primary); -} - -.vp-doc h2 { - margin-top: 2.5rem; - padding-bottom: 0.6rem; - border-bottom: 1px solid var(--nimote-border); - font-weight: 600; - letter-spacing: -0.03em; - font-size: 1.4rem; - color: var(--nimote-text-primary); -} - -.vp-doc h3 { - margin-top: 1.5rem; - color: var(--nimote-text-primary); - font-weight: 600; - letter-spacing: -0.02em; - font-size: 1.15rem; -} - -.vp-doc h4 { - margin-top: 1rem; - font-weight: 600; - font-size: 1rem; - color: var(--nimote-text-primary); -} - -.vp-doc p, -.vp-doc li { - line-height: 1.65; - color: var(--nimote-text-secondary); -} - -.vp-doc p { - margin-bottom: 0.9rem; - font-size: 0.98rem; -} - -.vp-doc a { - color: var(--nimote-accent); - text-decoration: none; - font-weight: 500; - transition: all 0.15s ease; -} - -.vp-doc a:hover { - text-decoration: underline; - text-underline-offset: 3px; - color: var(--nimote-accent-dark); -} - -.dark .vp-doc a:hover { - color: var(--nimote-accent-light); -} - -.vp-doc code { - font-size: 0.86em; - border: 1px solid var(--nimote-border); - background: var(--nimote-bg-subtle); - border-radius: 4px; - padding: 0.12em 0.4em; - font-weight: 500; - color: var(--nimote-text-primary); - font-family: var(--vp-font-family-mono); -} - -.vp-doc pre { - border-radius: 8px; - border: 1px solid var(--nimote-border); - box-shadow: var(--nimote-shadow-sm); - margin: 1.25rem 0; -} - -.vp-doc pre code { - border: none; - background: transparent; - padding: 0; - font-size: 0.88em; -} - -.vp-doc table { - border-radius: 8px; - overflow: hidden; - border: 1px solid var(--nimote-border); - box-shadow: var(--nimote-shadow-sm); - margin: 1.25rem 0; -} - -.vp-doc th { - background: var(--nimote-bg-subtle); - color: var(--nimote-text-primary); - font-weight: 600; - padding: 0.8rem 1rem; - text-transform: none; - font-size: 0.88rem; - letter-spacing: 0; - border-bottom: 1px solid var(--nimote-border); -} - -.vp-doc td { - padding: 0.75rem 1rem; - border-bottom: 1px solid var(--nimote-border); - color: var(--nimote-text-secondary); - font-size: 0.95rem; -} - -.vp-doc tr:nth-child(even) { - background: transparent; -} - -.vp-doc tr:hover { - background: var(--nimote-bg-subtle); -} - -.vp-doc blockquote { - border-left: 3px solid var(--nimote-accent); - background: var(--nimote-bg-subtle); - border-radius: 0 6px 6px 0; - padding: 0.9rem 1.1rem; - margin: 1rem 0; -} - -.vp-doc blockquote > p { - margin: 0; -} - -.vp-doc ul, -.vp-doc ol { - padding-left: 1.25rem; - margin: 0.75rem 0; -} - -.vp-doc li { - margin: 0.3rem 0; - font-size: 0.98rem; -} - -/* Footer */ -.VPFooter { - border-top: 1px solid var(--nimote-border); - padding: 2rem 0; - margin-top: 3rem; -} - -.VPFooter .message, -.VPFooter .copyright { - color: var(--nimote-text-muted); - font-size: 0.875rem; -} - -/* Animations */ -@keyframes fade-up { - from { - opacity: 0; - transform: translateY(12px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.VPHero, -.vp-doc { - animation: fade-up 0.5s ease-out both; -} - -.VPHero { - animation-delay: 0.1s; -} - -/* Reduced Motion */ -@media (prefers-reduced-motion: reduce) { - *, - *::before, - *::after { - animation: none !important; - transition: none !important; - scroll-behavior: auto !important; - } -} - -/* Selection */ -::selection { - background: rgba(99, 102, 241, 0.2); - color: var(--nimote-text-primary); -} - -.dark ::selection { - background: rgba(129, 140, 248, 0.3); -} - -/* Scrollbar */ -::-webkit-scrollbar { - width: 10px; - height: 10px; -} - -::-webkit-scrollbar-track { - background: transparent; -} - -::-webkit-scrollbar-thumb { - background: rgba(99, 102, 241, 0.2); - border-radius: 5px; -} - -.dark ::-webkit-scrollbar-thumb { - background: rgba(129, 140, 248, 0.25); -} - -::-webkit-scrollbar-thumb:hover { - background: rgba(99, 102, 241, 0.35); -} - -.dark ::-webkit-scrollbar-thumb:hover { - background: rgba(129, 140, 248, 0.4); -} - -/* Home Page - Premium */ -.home-page-section { - padding: 4.5rem 1.5rem; - max-width: 1100px; - margin: 0 auto; - position: relative; -} - -.home-page-section.dense { - padding: 3.5rem 1.5rem; -} - -.home-page-section.alt { - background: var(--nimote-bg-subtle); - border-top: 1px solid var(--nimote-border); - border-bottom: 1px solid var(--nimote-border); -} - -.home-page-logo-title { - display: inline-flex; - align-items: center; - gap: 1rem; - margin-bottom: 1.5rem; -} - -.home-page-logo { - width: 56px; - height: 56px; - border-radius: 14px; - box-shadow: var(--nimote-shadow-brand); -} - -.home-page-brand { - font-size: 1.15rem; - font-weight: 600; - letter-spacing: -0.02em; - color: var(--nimote-text-primary); -} - -.home-page-title { - font-size: 3rem; - font-weight: 700; - letter-spacing: -0.05em; - line-height: 1.05; - margin: 0 0 1rem; - background: linear-gradient(135deg, var(--nimote-text-primary) 0%, var(--nimote-text-secondary) 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - -.home-page-subtitle { - font-size: 1.15rem; - color: var(--nimote-text-secondary); - line-height: 1.6; - margin: 0 0 2.25rem; - max-width: 580px; -} - -.home-page-grid { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 1rem; - margin-top: 2rem; -} - -.home-page-card { - background: var(--nimote-card); - border: 1px solid var(--nimote-border); - border-radius: 10px; - padding: 1.35rem; - transition: all 0.2s ease; - position: relative; - overflow: hidden; -} - -.home-page-card::before { - content: ''; - position: absolute; - inset: 0; - background: var(--nimote-gradient-subtle); - opacity: 0; - transition: opacity 0.2s ease; -} - -.home-page-card:hover { - border-color: var(--nimote-border-accent); - background: var(--nimote-card-hover); - transform: translateY(-2px); - box-shadow: var(--nimote-shadow-lg); -} - -.home-page-card:hover::before { - opacity: 1; -} - -.home-page-card > * { - position: relative; - z-index: 1; -} - -.home-page-card-title { - font-size: 1rem; - font-weight: 600; - margin: 0 0 0.4rem; - color: var(--nimote-text-primary); - display: flex; - align-items: center; - gap: 0.5rem; -} - -.home-page-card-icon { - font-size: 1.1rem; -} - -.home-page-card-desc { - font-size: 0.9rem; - color: var(--nimote-text-secondary); - line-height: 1.55; - margin: 0; -} - -.home-page-badge { - font-size: 0.65rem; - font-weight: 700; - background: var(--nimote-gradient); - color: white; - padding: 0.15rem 0.5rem; - border-radius: 5px; - text-transform: uppercase; - letter-spacing: 0.06em; - box-shadow: var(--nimote-shadow-sm); -} - -.home-page-table { - width: 100%; - border-collapse: collapse; - margin-top: 1.75rem; - background: var(--nimote-card); - border: 1px solid var(--nimote-border); - border-radius: 10px; - overflow: hidden; - box-shadow: var(--nimote-shadow-sm); -} - -.home-page-table th, -.home-page-table td { - padding: 0.85rem 1rem; - text-align: left; - border-bottom: 1px solid var(--nimote-border); -} - -.home-page-table th { - background: var(--nimote-bg-subtle); - font-weight: 600; - font-size: 0.8rem; - color: var(--nimote-text-muted); - text-transform: uppercase; - letter-spacing: 0.08em; -} - -.home-page-table td:first-child { - font-weight: 500; - color: var(--nimote-text-primary); -} - -.home-page-table td { - color: var(--nimote-text-secondary); - font-size: 0.95rem; -} - -.home-page-table tr:last-child td { - border-bottom: none; -} - -.home-page-check { - color: var(--nimote-success); - font-weight: 700; - font-size: 1.2rem; -} - -.home-page-cross { - color: var(--nimote-text-muted); - font-weight: 700; - font-size: 1.2rem; -} - -.home-page-cta { - text-align: center; - padding: 3.5rem 2rem; - margin-top: 2rem; - background: var(--nimote-gradient-subtle); - border: 1px solid var(--nimote-border-accent); - border-radius: 14px; - box-shadow: var(--nimote-shadow-lg); -} - -.home-page-cta-title { - font-size: 1.6rem; - font-weight: 700; - letter-spacing: -0.03em; - margin: 0 0 0.6rem; - color: var(--nimote-text-primary); -} - -.home-page-cta-text { - font-size: 1.02rem; - color: var(--nimote-text-secondary); - margin: 0 0 1.75rem; -} - -.home-page-actions { - display: flex; - gap: 0.85rem; - justify-content: center; - flex-wrap: wrap; -} - -.home-page-btn { - display: inline-flex; - align-items: center; - gap: 0.5rem; - padding: 0.75rem 1.4rem; - border-radius: 10px; - font-weight: 600; - font-size: 0.98rem; - text-decoration: none; - transition: all 0.2s ease; - letter-spacing: -0.01em; -} - -.home-page-btn.primary { - background: var(--nimote-gradient); - color: white; - box-shadow: var(--nimote-shadow-brand); -} - -.home-page-btn.primary:hover { - transform: translateY(-2px); - box-shadow: 0 12px 40px rgba(99, 102, 241, 0.4); -} - -.home-page-btn.secondary { - background: var(--nimote-card); - color: var(--nimote-text-primary); - border: 1px solid var(--nimote-border-strong); -} - -.home-page-btn.secondary:hover { - background: var(--nimote-card-hover); - border-color: var(--nimote-border-accent); - transform: translateY(-1px); -} - -@media (max-width: 1024px) { - .home-page-grid { - grid-template-columns: repeat(2, 1fr); - } -} - -@media (max-width: 768px) { - .home-page-section { - padding: 3.5rem 1rem; - } - .home-page-title { - font-size: 2.25rem; - } - .home-page-grid { - grid-template-columns: 1fr; - } - .home-page-table { - font-size: 0.88rem; - } - .home-page-table th, - .home-page-table td { - padding: 0.65rem 0.75rem; - } -} +/* ========================================================================== + NimoteCode VitePress Theme — Entry + Modules are split by concern and loaded in cascade order. + Add new sections to /styles and append the @import here. + ========================================================================== */ + +@import "./styles/tokens.css"; +@import "./styles/base.css"; +@import "./styles/animations.css"; +@import "./styles/nav.css"; +@import "./styles/doc.css"; +@import "./styles/footer.css"; +@import "./styles/home.css"; +@import "./styles/responsive.css"; diff --git a/docs/.vitepress/theme/i18n/pricing-features.json b/docs/.vitepress/theme/i18n/pricing-features.json new file mode 100644 index 0000000..30ea794 --- /dev/null +++ b/docs/.vitepress/theme/i18n/pricing-features.json @@ -0,0 +1,542 @@ +{ + "en": { + "features": { + "eyebrow": "Mobile development system", + "title": "Free gives you the foundation. Pro unlocks the full mobile IDE.", + "summary": "NimoteCode keeps the free plan useful for real development, then makes the Pro upgrade obvious by grouping the advanced systems independent developers need most.", + "groups": [ + { + "name": "Foundation", + "badge": "Free", + "items": [ + "Local and SSH workspaces", + "File editing and project management", + "Terminal access", + "AI Chat support", + "Bring your own AI providers: OpenAI, Claude, Gemini", + "Limited AI Agent usage", + "Limited remote code search", + "Basic task execution", + "Development timeline viewer" + ] + }, + { + "name": "AI", + "badge": "Pro", + "items": [ + "Unlimited AI Agent executions", + "Multi-step autonomous tasks", + "AI Timeline root cause analysis", + "AI fix suggestions" + ] + }, + { + "name": "Git", + "badge": "Pro", + "items": [ + "Full Git workflow: commit, push, branch, stash, diff", + "AI Git assistant", + "Safer review before shipping" + ] + }, + { + "name": "Terminal", + "badge": "Pro", + "items": [ + "Multiple concurrent sessions", + "Parallel execution for logs, servers, tests, and deployments", + "Keep long-running work separated" + ] + }, + { + "name": "Code Intelligence", + "badge": "Pro", + "items": [ + "LSP diagnostics", + "Code actions", + "Navigation and refactoring" + ] + }, + { + "name": "Debug", + "badge": "Pro", + "items": [ + "Breakpoints", + "Call stack", + "Variables and watch expressions" + ] + }, + { + "name": "Tasks", + "badge": "Pro", + "items": [ + "Sequential and parallel execution", + "Workflow automation", + "Advanced task runs" + ] + }, + { + "name": "Sync", + "badge": "Pro", + "items": [ + "Secure workspace sync", + "Local and remote caching system", + "Safer mobile continuity" + ] + } + ] + }, + "pricing": { + "eyebrow": "Pricing", + "title": "Choose the level of mobile development power you need.", + "summary": "Start free. Upgrade when mobile work needs automation, Git write access, multiple terminals, LSP, debugging, and sync.", + "trustLine": "Cancel anytime. No ads. No hidden fees.", + "plans": [ + { + "name": "Free", + "price": "$0", + "period": "forever", + "summary": "Full mobile development foundation for local and SSH projects.", + "cta": "Start free", + "link": "/download", + "features": [ + "Local + SSH workspaces", + "File editing and project management", + "Terminal access", + "AI Chat with BYO providers", + "Limited AI Agent usage", + "Limited remote code search", + "Basic tasks and timeline viewer" + ] + }, + { + "name": "Pro", + "badge": "Best Value", + "price": "$3.99", + "period": "per month", + "yearlyPrice": "$39.99", + "yearlyPeriod": "per year", + "summary": "Unlock the complete mobile IDE system for serious delivery.", + "cta": "Upgrade to Pro", + "link": "/pro", + "highlight": true, + "features": [ + "Unlimited AI Agent executions", + "Full Git workflow and AI Git assistant", + "Multiple concurrent terminal sessions", + "LSP diagnostics, navigation, and refactoring", + "Debugger with breakpoints, stack, variables, and watches", + "AI Timeline root cause analysis and fix suggestions", + "Advanced task automation", + "Secure Sync & Cache" + ] + } + ] + } + }, + "zh": { + "features": { + "eyebrow": "移动开发系统", + "title": "免费版提供完整基础,Pro 解锁完整移动 IDE。", + "summary": "NimoteCode 让免费版真正可用于开发,并通过结构化能力分组,让独立开发者一眼看清 Pro 的升级价值。", + "groups": [ + { + "name": "基础能力", + "badge": "免费", + "items": [ + "本地与 SSH 工作区", + "文件编辑和项目管理", + "终端访问", + "AI Chat 支持", + "自带 AI 提供商:OpenAI、Claude、Gemini", + "有限 AI Agent 使用量", + "有限远程代码搜索", + "基础任务执行", + "开发 Timeline 查看器" + ] + }, + { + "name": "AI", + "badge": "Pro", + "items": [ + "无限 AI Agent 执行", + "多步骤自主任务", + "AI Timeline 根因分析", + "AI 修复建议" + ] + }, + { + "name": "Git", + "badge": "Pro", + "items": [ + "完整 Git 工作流:commit、push、branch、stash、diff", + "AI Git 助手", + "发布前更安全的审查" + ] + }, + { + "name": "终端", + "badge": "Pro", + "items": [ + "多个并发终端会话", + "日志、服务、测试和部署的并行执行", + "长时间运行任务互不干扰" + ] + }, + { + "name": "代码智能", + "badge": "Pro", + "items": [ + "LSP 诊断", + "代码操作", + "导航和重构" + ] + }, + { + "name": "调试", + "badge": "Pro", + "items": [ + "断点", + "调用栈", + "变量和 Watch 表达式" + ] + }, + { + "name": "任务", + "badge": "Pro", + "items": [ + "顺序和并行执行", + "工作流自动化", + "高级任务运行" + ] + }, + { + "name": "同步", + "badge": "Pro", + "items": [ + "安全工作区同步", + "本地和远程缓存系统", + "更可靠的移动端连续工作" + ] + } + ] + }, + "pricing": { + "eyebrow": "价格", + "title": "选择你需要的移动开发能力等级。", + "summary": "免费开始。当移动端工作需要自动化、Git 写入、多终端、LSP、调试和同步时再升级。", + "trustLine": "可随时取消。无广告。无隐藏费用。", + "plans": [ + { + "name": "免费版", + "price": "$0", + "period": "永久", + "summary": "面向本地和 SSH 项目的完整移动开发基础。", + "cta": "免费开始", + "link": "/zh/download", + "features": [ + "本地 + SSH 工作区", + "文件编辑和项目管理", + "终端访问", + "AI Chat 与自带提供商", + "有限 AI Agent 使用量", + "有限远程代码搜索", + "基础任务和 Timeline 查看器" + ] + }, + { + "name": "Pro", + "badge": "最佳价值", + "price": "$3.99", + "period": "每月", + "yearlyPrice": "$39.99", + "yearlyPeriod": "每年", + "summary": "解锁用于严肃交付的完整移动 IDE 系统。", + "cta": "升级到 Pro", + "link": "/pro", + "highlight": true, + "features": [ + "无限 AI Agent 执行", + "完整 Git 工作流和 AI Git 助手", + "多个并发终端会话", + "LSP 诊断、导航和重构", + "带断点、调用栈、变量和 Watch 的调试器", + "AI Timeline 根因分析和修复建议", + "高级任务自动化", + "安全 Sync & Cache" + ] + } + ] + } + }, + "ja": { + "features": { + "eyebrow": "モバイル開発システム", + "title": "無料版で基礎を提供し、Pro で完全なモバイル IDE を解放します。", + "summary": "NimoteCode は無料版でも実開発に使える状態を保ちつつ、独立開発者が必要とする高度なシステムを分かりやすく Pro にまとめます。", + "groups": [ + { + "name": "基礎", + "badge": "無料", + "items": [ + "ローカルと SSH ワークスペース", + "ファイル編集とプロジェクト管理", + "ターミナルアクセス", + "AI Chat サポート", + "持ち込み AI プロバイダ:OpenAI、Claude、Gemini", + "制限付き AI Agent 利用", + "制限付きリモートコード検索", + "基本タスク実行", + "開発 Timeline ビューア" + ] + }, + { + "name": "AI", + "badge": "Pro", + "items": [ + "AI Agent の無制限実行", + "複数ステップの自律タスク", + "AI Timeline による根本原因分析", + "AI 修正提案" + ] + }, + { + "name": "Git", + "badge": "Pro", + "items": [ + "完全な Git ワークフロー:commit、push、branch、stash、diff", + "AI Git アシスタント", + "配信前の安全なレビュー" + ] + }, + { + "name": "ターミナル", + "badge": "Pro", + "items": [ + "複数の同時セッション", + "ログ、サーバー、テスト、デプロイの並列実行", + "長時間処理を分離して管理" + ] + }, + { + "name": "コード知能", + "badge": "Pro", + "items": [ + "LSP 診断", + "コードアクション", + "ナビゲーションとリファクタリング" + ] + }, + { + "name": "デバッグ", + "badge": "Pro", + "items": [ + "ブレークポイント", + "コールスタック", + "変数と Watch 式" + ] + }, + { + "name": "タスク", + "badge": "Pro", + "items": [ + "順次実行と並列実行", + "ワークフロー自動化", + "高度なタスク実行" + ] + }, + { + "name": "同期", + "badge": "Pro", + "items": [ + "安全なワークスペース同期", + "ローカル / リモートキャッシュシステム", + "モバイル作業の継続性を向上" + ] + } + ] + }, + "pricing": { + "eyebrow": "料金", + "title": "必要なモバイル開発パワーを選択。", + "summary": "無料で始められます。自動化、Git 書き込み、複数ターミナル、LSP、デバッグ、同期が必要になったらアップグレードできます。", + "trustLine": "いつでも解約可能。広告なし。隠れた料金なし。", + "plans": [ + { + "name": "無料", + "price": "$0", + "period": "ずっと", + "summary": "ローカルと SSH プロジェクト向けの完全なモバイル開発基礎。", + "cta": "無料で開始", + "link": "/ja/download", + "features": [ + "ローカル + SSH ワークスペース", + "ファイル編集とプロジェクト管理", + "ターミナルアクセス", + "AI Chat と持ち込みプロバイダ", + "制限付き AI Agent 利用", + "制限付きリモートコード検索", + "基本タスクと Timeline ビューア" + ] + }, + { + "name": "Pro", + "badge": "最もお得", + "price": "$3.99", + "period": "月額", + "yearlyPrice": "$39.99", + "yearlyPeriod": "年額", + "summary": "本格的な配信のための完全なモバイル IDE システムを解放。", + "cta": "Pro にアップグレード", + "link": "/pro", + "highlight": true, + "features": [ + "AI Agent の無制限実行", + "完全な Git ワークフローと AI Git アシスタント", + "複数の同時ターミナルセッション", + "LSP 診断、ナビゲーション、リファクタリング", + "ブレークポイント、スタック、変数、Watch 付きデバッガ", + "AI Timeline の根本原因分析と修正提案", + "高度なタスク自動化", + "安全な Sync & Cache" + ] + } + ] + } + }, + "ko": { + "features": { + "eyebrow": "모바일 개발 시스템", + "title": "무료는 기반을 제공하고, Pro는 완전한 모바일 IDE를 엽니다.", + "summary": "NimoteCode는 무료 플랜도 실제 개발에 쓸 수 있게 유지하면서, 독립 개발자에게 필요한 고급 시스템을 Pro에 명확히 묶어 제공합니다.", + "groups": [ + { + "name": "기반", + "badge": "무료", + "items": [ + "로컬 및 SSH 워크스페이스", + "파일 편집과 프로젝트 관리", + "터미널 접근", + "AI Chat 지원", + "직접 연결하는 AI 제공자: OpenAI, Claude, Gemini", + "제한된 AI Agent 사용", + "제한된 원격 코드 검색", + "기본 작업 실행", + "개발 Timeline 뷰어" + ] + }, + { + "name": "AI", + "badge": "Pro", + "items": [ + "AI Agent 무제한 실행", + "다단계 자율 작업", + "AI Timeline 근본 원인 분석", + "AI 수정 제안" + ] + }, + { + "name": "Git", + "badge": "Pro", + "items": [ + "전체 Git 워크플로: commit, push, branch, stash, diff", + "AI Git 어시스턴트", + "배포 전 더 안전한 리뷰" + ] + }, + { + "name": "터미널", + "badge": "Pro", + "items": [ + "여러 동시 세션", + "로그, 서버, 테스트, 배포의 병렬 실행", + "장시간 실행 작업 분리" + ] + }, + { + "name": "코드 인텔리전스", + "badge": "Pro", + "items": [ + "LSP 진단", + "코드 액션", + "탐색과 리팩터링" + ] + }, + { + "name": "디버그", + "badge": "Pro", + "items": [ + "중단점", + "호출 스택", + "변수와 Watch 표현식" + ] + }, + { + "name": "작업", + "badge": "Pro", + "items": [ + "순차 및 병렬 실행", + "워크플로 자동화", + "고급 작업 실행" + ] + }, + { + "name": "동기화", + "badge": "Pro", + "items": [ + "안전한 워크스페이스 동기화", + "로컬 및 원격 캐싱 시스템", + "더 안정적인 모바일 연속성" + ] + } + ] + }, + "pricing": { + "eyebrow": "가격", + "title": "필요한 모바일 개발 능력 수준을 선택하세요.", + "summary": "무료로 시작하세요. 자동화, Git 쓰기, 여러 터미널, LSP, 디버깅, 동기화가 필요해지면 업그레이드하면 됩니다.", + "trustLine": "언제든 취소 가능. 광고 없음. 숨은 비용 없음.", + "plans": [ + { + "name": "무료", + "price": "$0", + "period": "계속 무료", + "summary": "로컬 및 SSH 프로젝트를 위한 완전한 모바일 개발 기반.", + "cta": "무료로 시작", + "link": "/ko/download", + "features": [ + "로컬 + SSH 워크스페이스", + "파일 편집과 프로젝트 관리", + "터미널 접근", + "AI Chat과 직접 연결 제공자", + "제한된 AI Agent 사용", + "제한된 원격 코드 검색", + "기본 작업과 Timeline 뷰어" + ] + }, + { + "name": "Pro", + "badge": "최고 가치", + "price": "$3.99", + "period": "월", + "yearlyPrice": "$39.99", + "yearlyPeriod": "년", + "summary": "진지한 배포를 위한 완전한 모바일 IDE 시스템을 엽니다.", + "cta": "Pro로 업그레이드", + "link": "/pro", + "highlight": true, + "features": [ + "AI Agent 무제한 실행", + "전체 Git 워크플로와 AI Git 어시스턴트", + "여러 동시 터미널 세션", + "LSP 진단, 탐색, 리팩터링", + "중단점, 스택, 변수, Watch가 있는 디버거", + "AI Timeline 근본 원인 분석과 수정 제안", + "고급 작업 자동화", + "안전한 Sync & Cache" + ] + } + ] + } + } +} diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index c41a381..6f99c8b 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -1,16 +1,22 @@ +/// + import DefaultTheme from 'vitepress/theme' +import Layout from './Layout.vue' import { type Theme } from 'vitepress' import './custom.css' +// @ts-ignore - The package does not ship TypeScript types. +import googleAnalytics from 'vitepress-plugin-google-analytics' -// Extend the default VitePress theme const theme: Theme = { extends: DefaultTheme, - - enhanceApp({ app, router, siteData }) { - // You can register global components here - // Example: app.component('MyComponent', MyComponent) - - // Add custom Vue plugins or other enhancements + Layout, + + enhanceApp() { + if (import.meta.env.PROD) { + googleAnalytics({ + id: 'G-JML9VGDMXJ' + }) + } } } diff --git a/docs/.vitepress/theme/styles/animations.css b/docs/.vitepress/theme/styles/animations.css new file mode 100644 index 0000000..f72321b --- /dev/null +++ b/docs/.vitepress/theme/styles/animations.css @@ -0,0 +1,66 @@ +/* ========================================================================== + Animations + - Keyframes (fade-up, fade-in, pulse-glow, hero-zoom) + - Initial entrance animations on .VPHero / .vp-doc + - prefers-reduced-motion override + ========================================================================== */ + +@keyframes nimote-fade-up { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes nimote-fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes nimote-pulse-glow { + 0%, 100% { + box-shadow: 0 0 0 0 rgba(var(--nimote-accent-rgb), 0.35); + } + 50% { + box-shadow: 0 0 0 12px rgba(var(--nimote-accent-rgb), 0); + } +} + +.VPHero, +.vp-doc { + animation: nimote-fade-up 0.7s var(--nimote-ease-out) both; +} +.VPHero { + animation-delay: 0.1s; +} + +.VPHome .vp-doc { + animation: none; +} + +/* Reduced motion */ +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.001ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.001ms !important; + scroll-behavior: auto !important; + } +} + +@media (hover: none) and (pointer: coarse) { + .VPHero, + .vp-doc { + animation: none; + } +} diff --git a/docs/.vitepress/theme/styles/base.css b/docs/.vitepress/theme/styles/base.css new file mode 100644 index 0000000..a9679b1 --- /dev/null +++ b/docs/.vitepress/theme/styles/base.css @@ -0,0 +1,105 @@ +/* ========================================================================== + Base & Reset + - Box-sizing, html/body defaults + - Media, links, form elements + - Selection, scrollbar, focus visibility + ========================================================================== */ + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; + scroll-padding-top: calc(var(--nimote-nav-height) + 16px); + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: transparent; + overflow-x: clip; +} + +html, +body, +#app, +.Layout { + background: var(--nimote-bg); + color: var(--nimote-text-primary); + min-height: 100vh; +} + +body { + font-family: var(--vp-font-family-base); + font-feature-settings: "cv01" on, "ss03" on; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + background-image: var(--nimote-gradient-bg); + background-repeat: no-repeat; + background-attachment: fixed; + background-size: 100% 100vh; + transition: background-color 0.18s var(--nimote-ease), color 0.18s var(--nimote-ease); +} + +@media (hover: none) and (pointer: coarse) { + html { + scroll-behavior: auto; + } + + body { + background-attachment: scroll; + } +} + +img, +video, +svg { + max-width: 100%; + height: auto; + display: block; +} + +a { + -webkit-tap-highlight-color: transparent; +} + +button, +input, +select, +textarea { + font: inherit; + color: inherit; +} + +::selection { + background: rgba(var(--nimote-accent-rgb), 0.18); + color: var(--nimote-text-primary); +} +.dark ::selection { + background: rgba(var(--nimote-accent-rgb), 0.35); +} + +/* Scrollbar */ +::-webkit-scrollbar { + width: 10px; + height: 10px; +} +::-webkit-scrollbar-track { + background: transparent; +} +::-webkit-scrollbar-thumb { + background: rgba(var(--nimote-accent-rgb), 0.18); + border-radius: var(--nimote-radius-pill); + border: 2px solid transparent; + background-clip: content-box; +} +::-webkit-scrollbar-thumb:hover { + background: rgba(var(--nimote-accent-rgb), 0.32); + background-clip: content-box; +} + +/* Focus visibility */ +:focus-visible { + outline: 2px solid var(--nimote-accent); + outline-offset: 2px; + border-radius: 4px; +} diff --git a/docs/.vitepress/theme/styles/doc.css b/docs/.vitepress/theme/styles/doc.css new file mode 100644 index 0000000..0541a14 --- /dev/null +++ b/docs/.vitepress/theme/styles/doc.css @@ -0,0 +1,242 @@ +/* ========================================================================== + Document Content (.vp-doc) + - Headings, paragraphs, links + - Inline & block code + - Tables, blockquotes, lists + - Custom blocks (tip / warning / danger / info) + - HR, images + ========================================================================== */ + +.vp-doc { + max-width: 760px; + padding: 8px 0 80px; + font-size: var(--nimote-fs-md); +} + +.vp-doc h1 { + font-size: var(--nimote-fs-4xl); + font-weight: 590; + letter-spacing: -0.03em; + line-height: 1.1; + margin: 8px 0 18px; + color: var(--nimote-text-primary); + text-wrap: balance; +} + +.vp-doc h1 + p { + font-size: 1.08rem; + color: var(--nimote-text-secondary); + line-height: 1.7; + margin-bottom: 32px; +} + +.vp-doc h2 { + margin-top: 56px; + margin-bottom: 16px; + padding-bottom: 12px; + border-bottom: 1px solid var(--nimote-border); + font-weight: 510; + font-size: var(--nimote-fs-2xl); + letter-spacing: -0.02em; + line-height: 1.25; + color: var(--nimote-text-primary); + scroll-margin-top: calc(var(--nimote-nav-height) + 24px); +} + +.vp-doc h3 { + margin-top: 36px; + margin-bottom: 10px; + font-weight: 510; + font-size: var(--nimote-fs-xl); + letter-spacing: -0.015em; + color: var(--nimote-text-primary); + scroll-margin-top: calc(var(--nimote-nav-height) + 24px); +} + +.vp-doc h4 { + margin-top: 24px; + margin-bottom: 8px; + font-weight: 600; + font-size: 1.05rem; + color: var(--nimote-text-primary); + scroll-margin-top: calc(var(--nimote-nav-height) + 24px); +} + +.vp-doc h5, +.vp-doc h6 { + margin-top: 18px; + font-weight: 600; + color: var(--nimote-text-primary); +} + +.vp-doc p, +.vp-doc li { + line-height: 1.75; + color: var(--nimote-text-secondary); + font-size: var(--nimote-fs-md); +} + +.vp-doc p { + margin: 0 0 16px; +} + +.vp-doc strong { + color: var(--nimote-text-primary); + font-weight: 600; +} + +.vp-doc a { + color: var(--nimote-accent); + text-decoration: none; + font-weight: 510; + border-bottom: 1px solid transparent; + transition: color 0.18s var(--nimote-ease), border-color 0.18s var(--nimote-ease); +} +.vp-doc a:hover { + color: var(--nimote-accent-dark); + border-bottom-color: currentColor; + text-underline-offset: 3px; +} +.dark .vp-doc a:hover { + color: var(--nimote-accent-light); +} + +.vp-doc code { + font-size: 0.86em; + border: 1px solid var(--nimote-border); + background: var(--nimote-bg-subtle); + border-radius: 8px; + padding: 0.15em 0.5em; + font-weight: 500; + color: var(--nimote-text-primary); + font-family: var(--vp-font-family-mono); + transition: border-color 0.2s var(--nimote-ease); +} +.vp-doc a code { + color: inherit; +} + +.vp-doc pre { + border-radius: var(--nimote-radius-md); + border: 1px solid var(--nimote-border); + box-shadow: var(--nimote-shadow-xs); + margin: 20px 0; + padding: 18px 20px; + background: var(--nimote-bg-subtle); + overflow-x: auto; +} +.dark .vp-doc pre { + background: var(--nimote-bg-subtle); +} +.vp-doc pre code { + border: none; + background: transparent; + padding: 0; + font-size: 0.86em; + line-height: 1.65; +} + +.vp-doc table { + border-radius: var(--nimote-radius-md); + overflow: hidden; + border: 1px solid var(--nimote-border); + box-shadow: var(--nimote-shadow-sm); + margin: 20px 0; + width: 100%; + border-collapse: separate; + border-spacing: 0; + display: block; + overflow-x: auto; +} +.vp-doc th { + background: var(--nimote-bg-subtle); + color: var(--nimote-text-primary); + font-weight: 600; + padding: 12px 16px; + text-align: left; + font-size: 0.86rem; + letter-spacing: 0; + border-bottom: 1px solid var(--nimote-border); + white-space: nowrap; +} +.vp-doc td { + padding: 12px 16px; + border-bottom: 1px solid var(--nimote-border); + color: var(--nimote-text-secondary); + font-size: 0.92rem; + vertical-align: top; +} +.vp-doc tr:last-child td { + border-bottom: none; +} +.vp-doc tr:hover td { + background: rgba(var(--nimote-bg-rgb), 0.18); +} + +.vp-doc blockquote { + border-left: 3px solid var(--nimote-accent); + background: var(--nimote-bg-subtle); + border-radius: 0 var(--nimote-radius-md) var(--nimote-radius-md) 0; + padding: 14px 18px; + margin: 20px 0; + color: var(--nimote-text-secondary); +} +.vp-doc blockquote > p { + margin: 0; +} + +.vp-doc ul, +.vp-doc ol { + padding-left: 1.4rem; + margin: 12px 0 16px; +} +.vp-doc li { + margin: 6px 0; +} +.vp-doc li::marker { + color: var(--nimote-accent); +} + +/* Custom containers (tip/warning/danger) */ +.vp-doc .custom-block { + border-radius: var(--nimote-radius-md); + border: 1px solid var(--nimote-border); + padding: 14px 18px; + margin: 20px 0; + background: var(--nimote-bg-subtle); +} +.vp-doc .custom-block-title { + font-weight: 600; + font-size: 0.92rem; + margin-bottom: 8px; + color: var(--nimote-text-primary); +} +.vp-doc .custom-block.tip { + border-color: rgba(16, 185, 129, 0.3); + background: rgba(16, 185, 129, 0.06); +} +.vp-doc .custom-block.warning { + border-color: rgba(245, 158, 11, 0.35); + background: rgba(245, 158, 11, 0.06); +} +.vp-doc .custom-block.danger { + border-color: rgba(239, 68, 68, 0.35); + background: rgba(239, 68, 68, 0.06); +} +.vp-doc .custom-block.info { + border-color: var(--nimote-border-accent); + background: var(--nimote-gradient-soft); +} + +.vp-doc hr { + border: none; + border-top: 1px solid var(--nimote-border); + margin: 40px 0; +} + +.vp-doc img { + border-radius: var(--nimote-radius-md); + border: 1px solid var(--nimote-border); + margin: 20px auto; + box-shadow: var(--nimote-shadow-sm); +} diff --git a/docs/.vitepress/theme/styles/footer.css b/docs/.vitepress/theme/styles/footer.css new file mode 100644 index 0000000..06e17ca --- /dev/null +++ b/docs/.vitepress/theme/styles/footer.css @@ -0,0 +1,23 @@ +/* ========================================================================== + Footer (.VPFooter) + ========================================================================== */ + +.VPFooter { + border-top: 1px solid var(--nimote-border); + padding: 36px 0; + margin-top: 80px; + background: var(--nimote-bg-elevated); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.02); +} + +.VPFooter .message, +.VPFooter .copyright { + color: var(--nimote-text-muted); + font-size: 0.86rem; + line-height: 1.6; +} + +.VPFooter .message { + font-weight: 500; + color: var(--nimote-text-secondary); +} diff --git a/docs/.vitepress/theme/styles/home.css b/docs/.vitepress/theme/styles/home.css new file mode 100644 index 0000000..60bede7 --- /dev/null +++ b/docs/.vitepress/theme/styles/home.css @@ -0,0 +1,749 @@ +/* ========================================================================== + Home Page + - Hero (premium framed banner with scrim & grid overlay) + - Hero content (badge, logo lockup, title, subtitle, actions) + - Signal / feature / link cards + - Section headings, scenario grid + - Positioning block, video shell, CTA + - Light-mode overrides for home page + ========================================================================== */ + +.VPHome .VPHero.VPHomeHero { + display: none; +} + +.VPHome .vp-doc.container { + padding-top: 0; +} + +.home-page-hero, +.home-page-section { + max-width: var(--nimote-container); + margin: 0 auto; + padding-left: clamp(16px, 2.4vw, 24px); + padding-right: clamp(16px, 2.4vw, 24px); + position: relative; +} + +/* Hero — premium framed background with bottom feature rail. */ +.home-page-hero { + position: relative; + width: 100vw; + max-width: none; + margin-left: calc(50% - 50vw); + margin-right: calc(50% - 50vw); + margin-top: 0; + padding: 0 0 28px; + isolation: isolate; + overflow: hidden; + background-color: var(--nimote-bg); + border-top: 1px solid var(--nimote-border); + border-bottom: 1px solid var(--nimote-border); + box-shadow: + inset 0 1px 0 var(--nimote-inset-highlight), + inset 0 -1px 0 rgba(0, 0, 0, 0.02), + var(--nimote-shadow-md); + min-height: clamp(520px, 56vw, 820px); + overflow-anchor: none; +} + +.dark .home-page-hero { + border-top-color: rgba(255, 255, 255, 0.05); + border-bottom-color: rgba(255, 255, 255, 0.08); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.05), + inset 0 -1px 0 rgba(255, 255, 255, 0.03), + 0 32px 84px rgba(0, 0, 0, 0.26); +} + +.home-page-hero::before { + content: ""; + position: absolute; + inset: 0; + z-index: 1; + pointer-events: none; + background-image: url("/screenshots/homepage_bk.jpg"); + background-position: right center; + background-size: cover; + background-repeat: no-repeat; + transform: none; + filter: var(--nimote-hero-image-filter); + will-change: opacity; +} + +.home-page-hero::after { + content: ""; + position: absolute; + inset: 0; + z-index: 2; + pointer-events: none; + background: var(--nimote-hero-overlay); + will-change: opacity; +} + +.home-page-hero-shell { + position: relative; + z-index: 3; + max-width: var(--nimote-container); + margin: 0 auto; + padding: 56px 28px 120px; + display: grid; + grid-template-columns: minmax(0, 1fr); + gap: 28px; + align-items: end; + min-height: inherit; +} + +/* Hero text — white-on-image overrides */ +.home-page-hero .home-page-brand, +.home-page-hero .home-page-title { + color: #ffffff; +} + +.home-page-hero .home-page-subtitle { + color: rgba(255, 255, 255, 0.88); +} + +.home-page-hero .home-page-title :is(em, i) { + background: var(--nimote-gradient-vivid); + -webkit-background-clip: text; + background-clip: text; + color: transparent; +} + +.home-page-hero-copy { + position: relative; + z-index: 1; + display: flex; + flex-direction: column; + align-items: flex-start; + text-align: left; + max-width: 540px; + padding: 12px 0 0; +} + +/* Eyebrows / labels */ +.home-page-badge, +.home-page-eyebrow, +.home-page-feature-label { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 6px; + width: fit-content; + border-radius: var(--nimote-radius-pill); + border: 1px solid var(--nimote-border); + background: rgba(255, 255, 255, 0.04); + color: var(--nimote-text-muted); + font-size: 0.72rem; + font-weight: 510; + letter-spacing: 0.14em; + text-transform: uppercase; + padding: 8px 14px; +} + +.home-page-badge { + margin: 0 0 18px; +} + +.home-page-logo-lockup { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 16px; + margin-bottom: 28px; + padding: 0; +} + +.home-page-logo { + width: 60px; + height: 60px; + border-radius: 20px; + flex-shrink: 0; + box-shadow: var(--nimote-panel-shadow); + transition: transform 0.4s var(--nimote-ease); +} +.home-page-logo-lockup:hover .home-page-logo { + transform: rotate(-8deg) scale(1.05); +} + +.home-page-brand { + position: relative; + top: -1px; + font-size: clamp(1.2rem, 1vw + 0.7rem, 1.5rem); + font-weight: 590; + letter-spacing: -0.025em; + color: var(--nimote-text-primary); +} + +.home-page-title { + margin: 0; + font-size: var(--nimote-fs-5xl); + line-height: 1.05; + letter-spacing: -0.04em; + font-weight: 590; + color: var(--nimote-text-primary); + text-wrap: balance; + overflow-wrap: anywhere; + text-shadow: var(--nimote-shadow-md); +} + +.home-page-title :is(em, i) { + font-style: normal; + background: var(--nimote-gradient-vivid); + -webkit-background-clip: text; + background-clip: text; + color: transparent; +} + +.home-page-subtitle { + max-width: 520px; + margin: 24px 0 0; + color: var(--nimote-text-secondary); + font-size: 1.05rem; + line-height: 1.8; + text-wrap: balance; + text-shadow: 0 6px 18px rgba(0, 0, 0, 0.28); +} + +.home-page-actions { + display: flex; + gap: 12px; + justify-content: flex-start; + flex-wrap: wrap; + margin-top: 32px; +} + +.home-page-video-shell::before, +.home-page-feature-card::before, +.home-page-cta::after { + content: ""; + position: absolute; + inset: 1px; + border-radius: inherit; + pointer-events: none; + background: + linear-gradient(135deg, rgba(255, 255, 255, 0.14), transparent 26%, transparent 72%, rgba(255, 255, 255, 0.04)), + radial-gradient(circle at top left, rgba(255, 255, 255, 0.06), transparent 34%); + opacity: 0.8; +} + +.home-page-actions-hero { + max-width: 540px; + gap: 14px; +} + +.home-page-btn.tertiary { + background: + linear-gradient(180deg, rgba(255, 255, 255, 0.07), rgba(255, 255, 255, 0.025)), + rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.86); + border-color: rgba(255, 255, 255, 0.12); + box-shadow: + inset 0 1px 0 var(--nimote-inset-highlight), + var(--nimote-panel-shadow); + cursor: default; +} + +.home-page-store-showcase { + position: absolute; + left: 50%; + bottom: 48px; + z-index: 3; + display: flex; + align-items: flex-end; + justify-content: center; + gap: 18px; + transform: translateX(-50%); + opacity: 0.94; + pointer-events: none; +} + +.home-page-store-showcase-badge { + display: block; + width: auto; + height: 42px; + object-fit: contain; + object-position: center; + filter: drop-shadow(var(--nimote-shadow-md)); +} + +.home-page-store-showcase-badge-apple { + opacity: 0.9; +} + +.home-page-scroll-hint { + display: inline-flex; + align-items: center; + gap: 10px; + position: absolute; + left: 50%; + bottom: 10px; + z-index: 4; + transform: translateX(-50%); + color: rgba(255, 255, 255, 0.76); + text-decoration: none; + font-size: 0.84rem; + letter-spacing: 0.06em; + text-transform: uppercase; + white-space: nowrap; +} + +.home-page-scroll-hint::before { + content: ""; + width: 20px; + height: 32px; + border-radius: 999px; + border: 1px solid rgba(255, 255, 255, 0.28); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.12); +} + +.home-page-scroll-hint::after { + content: ""; + width: 8px; + height: 8px; + border-right: 1.5px solid currentColor; + border-bottom: 1.5px solid currentColor; + transform: rotate(45deg) translateY(-1px); + animation: nimote-scroll-nudge 1.8s ease-in-out infinite; +} + +.home-page-scroll-hint:hover { + color: #ffffff; +} + +@keyframes nimote-scroll-nudge { + 0%, + 100% { + transform: rotate(45deg) translateY(-1px); + opacity: 0.66; + } + 50% { + transform: rotate(45deg) translateY(3px); + opacity: 1; + } +} + +.home-page-feature-card { + border-radius: var(--nimote-radius-md); + border: 1px solid var(--nimote-border); + padding: 24px; + background: var(--nimote-card); + box-shadow: + inset 0 1px 0 var(--nimote-inset-highlight), + var(--nimote-panel-shadow); + transition: transform 0.22s var(--nimote-ease), border-color 0.18s var(--nimote-ease), box-shadow 0.18s var(--nimote-ease); + position: relative; + overflow: hidden; +} +.home-page-feature-card:hover { + transform: translateY(-4px); + border-color: var(--nimote-border-accent); + box-shadow: var(--nimote-panel-shadow-hover); +} + +.home-page-feature-card .home-page-feature-label { + margin-bottom: 18px; + padding: 6px 12px; + font-size: 0.66rem; +} + +.home-page-feature-card h3 { + margin: 0; + color: var(--nimote-text-primary); + letter-spacing: -0.01em; + font-size: 1.08rem; + font-weight: 510; + line-height: 1.4; +} + +.home-page-feature-card p { + margin: 14px 0 0; + color: var(--nimote-text-secondary); + font-size: 0.94rem; + line-height: 1.7; +} + +/* Buttons */ +.home-page-btn { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 48px; + padding: 0.85rem 1.5rem; + border-radius: var(--nimote-radius-sm); + border: 1px solid transparent; + font-weight: 510; + font-size: 0.95rem; + letter-spacing: -0.01em; + text-decoration: none; + cursor: pointer; + transition: transform 0.2s var(--nimote-ease), box-shadow 0.2s var(--nimote-ease), + border-color 0.2s var(--nimote-ease), background-color 0.2s var(--nimote-ease); + white-space: nowrap; + -webkit-tap-highlight-color: transparent; +} + +.home-page-btn.primary { + background: var(--nimote-accent); + color: var(--nimote-text-inverse); + box-shadow: var(--nimote-panel-shadow); +} +.home-page-btn.primary:hover { + transform: translateY(-2px); + box-shadow: var(--nimote-panel-shadow-hover); +} +.home-page-btn.primary:active { + transform: translateY(0); +} + +.home-page-btn.secondary { + background: + linear-gradient(180deg, rgba(255, 255, 255, 0.07), rgba(255, 255, 255, 0.025)), + var(--nimote-card); + color: var(--nimote-text-secondary); + border-color: var(--nimote-border); + box-shadow: + inset 0 1px 0 var(--nimote-inset-highlight), + var(--nimote-panel-shadow); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); +} +.home-page-btn.secondary:hover { + transform: translateY(-2px); + border-color: rgba(255, 255, 255, 0.4); + background: rgba(255, 255, 255, 0.18); +} + +.home-page-btn:focus-visible, +.home-page-feature-card h3 a:focus-visible, +.home-page-video-link:focus-visible, +.home-page-scroll-hint:focus-visible { + outline: 2px solid var(--nimote-accent-2); + outline-offset: 3px; +} + +/* Sections */ +.home-page-section { + padding-top: 96px; + padding-bottom: 96px; + content-visibility: auto; + contain-intrinsic-size: 1px 900px; +} +.home-page-section-head { + max-width: 760px; +} +.home-page-section-head-centered { + margin: 0 auto; + text-align: center; +} + +.home-page-section-title { + margin: 0; + color: var(--nimote-text-primary); + font-size: var(--nimote-fs-3xl); + font-weight: 590; + letter-spacing: -0.03em; + line-height: 1.1; + text-wrap: balance; + overflow-wrap: anywhere; +} + +.home-page-section-copy { + max-width: 680px; + margin: 18px auto 0; + color: var(--nimote-text-secondary); + line-height: 1.8; + font-size: 1rem; + text-wrap: balance; +} + +/* Feature grid */ +.home-page-feature-grid { + display: grid; + gap: 18px; + margin-top: 40px; +} + +.home-page-feature-grid-priority { + grid-template-columns: minmax(0, 1.2fr) repeat(3, minmax(0, 1fr)); +} + +.home-page-feature-card-ai { + position: relative; + overflow: hidden; + border-color: rgba(var(--nimote-accent-rgb), 0.18); + background: + radial-gradient(circle at top left, rgba(var(--nimote-accent-rgb), 0.08), transparent 44%), + var(--nimote-card); + box-shadow: + inset 0 1px 0 var(--nimote-inset-highlight), + var(--nimote-panel-shadow); +} + +.home-page-feature-card-ai::after { + content: ""; + position: absolute; + inset: auto -20% -35% auto; + width: 200px; + height: 200px; + background: radial-gradient(circle, rgba(var(--nimote-accent-rgb), 0.1), transparent 64%); + pointer-events: none; +} + +.home-page-feature-card h3 a { + color: inherit; + text-decoration: none; + background-image: linear-gradient(currentColor, currentColor); + background-size: 0 1px; + background-position: 0 100%; + background-repeat: no-repeat; + transition: background-size 0.3s var(--nimote-ease); + padding-bottom: 2px; +} +.home-page-feature-card h3 a:hover { + background-size: 100% 1px; + color: var(--nimote-accent-light); +} + +/* Video */ +.home-page-video { + width: 100%; + margin-top: 48px; +} + +.home-page-video-link { + display: block; + color: inherit; + text-decoration: none; +} + +.home-page-video-shell { + position: relative; + width: 100%; + max-width: 1040px; + margin: 0 auto; + border-radius: 32px; + overflow: hidden; + border: 0; + background: var(--nimote-video-shell-bg); + box-shadow: + var(--nimote-shadow-lg); + transition: transform 0.25s var(--nimote-ease), box-shadow 0.25s var(--nimote-ease); +} +.home-page-video-shell:hover { + transform: translateY(-2px); + box-shadow: var(--nimote-shadow-xl); +} + +.home-page-video-poster { + display: block; + width: 100%; + height: auto; + aspect-ratio: 16 / 9; + object-fit: cover; +} + +.home-page-video-overlay { + position: absolute; + inset: auto 0 0; + padding: 24px 28px 28px; + display: grid; + gap: 8px; + background: var(--nimote-video-overlay); +} + +.home-page-video-play { + color: #ffffff; + font-size: 1.08rem; + font-weight: 510; + letter-spacing: -0.01em; +} + +.home-page-video-meta { + color: rgba(226, 232, 240, 0.9); + font-size: 0.92rem; + line-height: 1.5; +} + +/* Positioning block */ +.home-page-positioning { + display: grid; + gap: 6px; + justify-items: center; + text-align: center; +} + +.home-page-positioning p { + margin: 0; + color: var(--nimote-text-primary); + font-size: clamp(2.1rem, 1.5rem + 2.4vw, 3.6rem); + line-height: 1.04; + letter-spacing: -0.045em; + font-weight: 590; + text-wrap: balance; +} + +.home-page-positioning p:last-child { + background: var(--nimote-gradient-vivid); + -webkit-background-clip: text; + background-clip: text; + color: transparent; +} + +/* CTA */ +.home-page-cta { + text-align: center; + padding: 64px 32px; + border-radius: 40px; + border: 1px solid var(--nimote-border); + background: + radial-gradient(circle at top, rgba(var(--nimote-accent-rgb), 0.08), transparent 46%), + radial-gradient(circle at bottom right, rgba(var(--nimote-accent-2-rgb), 0.08), transparent 46%), + var(--nimote-card); + box-shadow: + inset 0 1px 0 var(--nimote-inset-highlight), + var(--nimote-panel-shadow); + position: relative; + overflow: hidden; +} + +.home-page-cta::before { + content: ""; + position: absolute; + inset: 0; + background-image: + linear-gradient(rgba(255, 255, 255, 0.018) 1px, transparent 1px), + linear-gradient(90deg, rgba(255, 255, 255, 0.018) 1px, transparent 1px); + background-size: 40px 40px; + mask-image: radial-gradient(ellipse 50% 60% at 50% 0%, #000 20%, transparent 80%); + -webkit-mask-image: radial-gradient(ellipse 50% 60% at 50% 0%, #000 20%, transparent 80%); + pointer-events: none; +} + +.home-page-cta-title { + position: relative; + margin: 0; + font-size: var(--nimote-fs-3xl); + line-height: 1.1; + letter-spacing: -0.03em; + font-weight: 590; + color: var(--nimote-text-primary); + overflow-wrap: anywhere; + text-wrap: balance; +} + +.home-page-cta-text { + position: relative; + margin: 18px auto 0; + max-width: 600px; + line-height: 1.8; + color: var(--nimote-text-secondary); + font-size: 1rem; +} + +/* Light-mode overrides for home page (cleaner cards, less dark) */ +/* Light-mode hero override: keep dark badge style on the image background */ +html:not(.dark) .home-page-hero .home-page-badge, +html:not(.dark) .home-page-hero .home-page-eyebrow, +html:not(.dark) .home-page-badge, +html:not(.dark) .home-page-eyebrow, +html:not(.dark) .home-page-feature-label { + border-color: var(--nimote-border); + background: rgba(255, 255, 255, 0.64); + color: var(--nimote-text-secondary); +} + +html:not(.dark) .home-page-hero::after { + background: var(--nimote-hero-overlay); +} + +html:not(.dark) .home-page-feature-card, +html:not(.dark) .home-page-cta { + background: var(--nimote-card); + box-shadow: + inset 0 1px 0 var(--nimote-inset-highlight), + var(--nimote-panel-shadow); +} +html:not(.dark) .home-page-feature-card:hover, +html:not(.dark) .home-page-cta:hover { + box-shadow: var(--nimote-panel-shadow-hover); +} + +html:not(.dark) .home-page-feature-card-ai { + border-color: var(--nimote-border-accent); + background: + radial-gradient(circle at top left, rgba(var(--nimote-accent-rgb), 0.08), transparent 44%), + var(--nimote-card); + box-shadow: + inset 0 1px 0 var(--nimote-inset-highlight), + var(--nimote-panel-shadow); +} +html:not(.dark) .home-page-feature-card-ai::after { + background: radial-gradient(circle, rgba(var(--nimote-accent-rgb), 0.08), transparent 64%); +} + +@media (prefers-reduced-motion: reduce) { + .home-page-logo, + .home-page-scroll-hint::after, + .home-page-btn, + .home-page-feature-card, + .home-page-video-shell { + animation: none !important; + transition: none !important; + } +} + +html:not(.dark) .home-page-positioning p:last-child { + background: var(--nimote-gradient-vivid); + -webkit-background-clip: text; + background-clip: text; + color: transparent; +} + +html:not(.dark) .home-page-video-shell { + background: var(--nimote-video-shell-bg); + box-shadow: var(--nimote-shadow-lg); +} + +html:not(.dark) .home-page-hero .home-page-brand, +html:not(.dark) .home-page-hero .home-page-title { + color: var(--nimote-text-primary); +} + +html:not(.dark) .home-page-hero .home-page-subtitle { + color: var(--nimote-text-secondary); +} + +html:not(.dark) .home-page-cta .home-page-btn.secondary { + color: var(--nimote-text-secondary); + background: + linear-gradient(180deg, rgba(255, 255, 255, 0.48), rgba(255, 255, 255, 0.16)), + var(--nimote-card); + border-color: var(--nimote-border); + box-shadow: + inset 0 1px 0 var(--nimote-inset-highlight), + var(--nimote-panel-shadow); +} + +html:not(.dark) .home-page-cta .home-page-btn.secondary:hover { + border-color: var(--nimote-border-accent); + background: var(--nimote-card-hover); +} + +html:not(.dark) .home-page-btn.tertiary { + background: + linear-gradient(180deg, rgba(255, 255, 255, 0.48), rgba(255, 255, 255, 0.16)), + var(--nimote-card); + color: var(--nimote-text-secondary); + border-color: var(--nimote-border); + box-shadow: var(--nimote-panel-shadow); +} + +/* Scenarios grid */ +.home-page-scenario-grid { + display: grid; + gap: 20px; + margin-top: 48px; + grid-template-columns: repeat(4, minmax(0, 1fr)); +} diff --git a/docs/.vitepress/theme/styles/nav.css b/docs/.vitepress/theme/styles/nav.css new file mode 100644 index 0000000..b1b4221 --- /dev/null +++ b/docs/.vitepress/theme/styles/nav.css @@ -0,0 +1,242 @@ +/* ========================================================================== + Navigation + - Top bar (.VPNav / .VPNavBar) + - Logo & brand title + - Menu links & social links + - Search button + - Sidebar (.VPSidebar) + - Local nav + doc outline + ========================================================================== */ + +/* Top bar — dense instrument-panel chrome */ +.VPNav, +.VPNavBar, +.VPNavBar.has-sidebar { + position: relative; + z-index: calc(var(--vp-z-index-layout-top) + 20); + background: var(--nimote-nav-bg) !important; + backdrop-filter: saturate(140%) blur(18px); + -webkit-backdrop-filter: saturate(140%) blur(18px); + border-bottom: 1px solid var(--nimote-border); + box-shadow: var(--nimote-panel-shadow); + transition: background-color 0.18s var(--nimote-ease), border-color 0.18s var(--nimote-ease); +} + +.VPNav.scrolled { + box-shadow: var(--nimote-shadow-sm); + background: var(--nimote-nav-bg-scrolled) !important; +} + +.VPNavBar .container, +.VPNavBar .content, +.VPNavBar .content-body, +.VPNavBar .divider, +.VPNavBar .curtain { + position: relative; + z-index: 1; + background: transparent !important; +} + +.VPNavBar .content-body { + border-bottom: none; + min-height: var(--nimote-nav-height); +} + +.VPNavBar .title, +.VPNavBarTitle .title { + font-weight: 700; + font-size: 1.02rem; + letter-spacing: -0.01em; + color: var(--nimote-text-primary); +} + +.VPNavBarTitle { + gap: 10px; +} + +.VPNavBarTitle .logo { + width: 30px; + height: 30px; + border-radius: 8px; + box-shadow: var(--nimote-panel-shadow); + transition: transform 0.3s var(--nimote-ease); +} +.VPNavBarTitle:hover .logo { + transform: rotate(-6deg) scale(1.04); +} + +.VPNavBarTitle .title { + display: inline-flex; + align-items: center; + min-height: 30px; +} + +/* Nav links */ +.VPNavBarMenuLink, +.VPNavBarMenuGroup .button { + font-weight: 500; + font-size: 0.92rem; + color: var(--nimote-text-secondary); + padding: 8px 12px; + border-radius: var(--nimote-radius-sm); + transition: color 0.2s var(--nimote-ease), background-color 0.2s var(--nimote-ease); +} +.VPNavBarMenuLink:hover, +.VPNavBarMenuGroup .button:hover { + color: var(--nimote-text-primary); + background: rgba(var(--nimote-bg-rgb), 0.42); +} +.VPNavBarMenuLink.active { + color: var(--nimote-accent); + font-weight: 510; +} + +.VPNavBarMenuLink:focus-visible, +.VPNavBarMenuGroup .button:focus-visible, +.VPNavBarSearch .DocSearch-Button:focus-visible, +.VPNavBarSocialLinks .VPSocialLink:focus-visible, +.VPSidebarItem .item .link:focus-visible, +.VPDocAside .outline-link:focus-visible { + outline: 2px solid var(--nimote-accent-2); + outline-offset: 2px; +} + +/* Search */ +.VPNavBarSearch { + border-radius: var(--nimote-radius-md); + position: relative; + z-index: 2; +} +.VPNavBarSearch .DocSearch-Button { + background: var(--nimote-input-bg); + border: 1px solid transparent; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2); + border-radius: var(--nimote-radius-md); + height: 38px; + padding: 0 12px; + font-size: 0.86rem; + color: var(--nimote-text-muted); + transition: all 0.2s var(--nimote-ease); +} +.VPNavBarSearch .DocSearch-Button:hover { + border-color: var(--nimote-border-accent); + background: var(--nimote-bg-elevated); +} + +/* Social links */ +.VPNavBarSocialLinks .VPSocialLink { + border-radius: var(--nimote-radius-sm); + transition: transform 0.2s var(--nimote-ease), background-color 0.2s var(--nimote-ease); +} +.VPNavBarSocialLinks .VPSocialLink:hover { + background: rgba(var(--nimote-bg-rgb), 0.34); + transform: translateY(-1px); +} + +/* Sidebar */ +.VPSidebar { + background: var(--nimote-bg-elevated); + border-right: 1px solid var(--nimote-border); + box-shadow: inset -1px 0 0 var(--nimote-inset-highlight); + padding-top: 8px; +} + +.VPSidebarGroup { + padding: 0 12px 12px; +} + +.VPSidebarGroup .title { + font-size: 0.7rem; + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; + color: var(--nimote-text-muted); + margin: 16px 12px 8px; + padding: 0; +} + +.VPSidebarItem { + position: relative; +} + +.VPSidebarItem .item .link, +.VPSidebarItem .item .text { + color: var(--nimote-text-secondary); + font-weight: 500; + font-size: 0.92rem; + border-radius: var(--nimote-radius-sm); + padding: 8px 12px; + margin: 1px 0; + line-height: 1.4; + transition: color 0.18s var(--nimote-ease), background-color 0.18s var(--nimote-ease); +} + +.VPSidebarItem .item .link:hover, +.VPSidebarItem .item .link:hover .text { + color: var(--nimote-text-primary); + background: rgba(var(--nimote-bg-rgb), 0.34); +} + +.VPSidebarItem.is-active > .item > .link { + background: linear-gradient(90deg, rgba(var(--nimote-accent-rgb), 0.11), transparent); + position: relative; +} +.VPSidebarItem.is-active > .item > .link::before { + content: ""; + position: absolute; + left: 0; + top: 8px; + bottom: 8px; + width: 3px; + border-radius: 0 3px 3px 0; + background: var(--nimote-accent); +} +.VPSidebarItem.is-active > .item > .link > .text { + color: var(--nimote-accent); + font-weight: 600; +} + +/* Local nav (in-page outline on top) */ +.VPLocalNav { + background: rgba(var(--nimote-bg-rgb), 0.8); + backdrop-filter: saturate(160%) blur(18px); + -webkit-backdrop-filter: saturate(160%) blur(18px); + border-bottom: 1px solid var(--nimote-border); +} + +.VPDocAsideOutline { + border-left: 1px solid var(--nimote-border); + padding-left: 4px; +} + +.VPDocAside .outline-link { + color: var(--nimote-text-secondary); + font-weight: 500; + font-size: 0.86rem; + padding: 6px 12px; + border-radius: var(--nimote-radius-sm); + transition: color 0.18s var(--nimote-ease), background-color 0.18s var(--nimote-ease); + line-height: 1.45; + border-left: 2px solid transparent; + margin-left: -2px; +} +.VPDocAside .outline-link:hover { + color: var(--nimote-text-primary); + background: rgba(var(--nimote-bg-rgb), 0.3); +} +.VPDocAside .outline-link.active { + color: var(--nimote-accent); + font-weight: 600; + background: rgba(var(--nimote-bg-rgb), 0.3); + border-left-color: var(--nimote-accent); +} + +.VPNavBarHamburger, +.VPNavBarTranslations, +.VPNavBarAppearance, +.VPNavBarExtra, +.VPNavBarSocialLinks { + position: relative; + z-index: 2; + pointer-events: auto; +} diff --git a/docs/.vitepress/theme/styles/pricing.css b/docs/.vitepress/theme/styles/pricing.css new file mode 100644 index 0000000..e41f9d2 --- /dev/null +++ b/docs/.vitepress/theme/styles/pricing.css @@ -0,0 +1,240 @@ +/* ========================================================================== + Pricing Feature System + - Feature grid (.pf-feature-grid / .pf-feature-card) + - Pricing plan grid (.pf-pricing-grid / .pf-plan-card) + - Plan header, price, features list + - Light-mode overrides + ========================================================================== */ + +.pricing-feature-system { + width: 100%; +} + +.pf-feature-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 1.5rem; + margin-top: 3rem; +} + +.pf-feature-card { + border: 1px solid var(--nimote-border); + border-radius: var(--nimote-radius-md); + padding: 1.8rem; + background: var(--nimote-card); + box-shadow: + inset 0 1px 0 var(--nimote-inset-highlight), + var(--nimote-panel-shadow); + transition: transform 0.3s var(--nimote-ease), border-color 0.3s var(--nimote-ease), box-shadow 0.3s var(--nimote-ease); +} +.pf-feature-card:hover { + transform: translateY(-3px); + border-color: var(--nimote-border-accent); +} + +.pf-card-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + margin-bottom: 1.1rem; +} + +.pf-card-head h3 { + margin: 0; + font-size: 1.05rem; + font-weight: 510; + color: var(--nimote-text-primary); + letter-spacing: -0.01em; +} + +.pf-card-head span { + padding: 0.35rem 0.75rem; + border-radius: var(--nimote-radius-pill); + border: 1px solid var(--nimote-border); + font-size: 0.72rem; + font-weight: 600; + color: var(--nimote-text-secondary); + background: var(--nimote-bg-subtle); +} + +.pf-feature-card ul { + margin: 0; + padding-left: 0; + list-style: none; +} + +.pf-feature-card li { + margin: 0.55rem 0; + font-size: 0.92rem; + line-height: 1.6; + color: var(--nimote-text-secondary); + padding-left: 18px; + position: relative; +} +.pf-feature-card li::before { + content: "✓"; + position: absolute; + left: 0; + top: 0; + color: var(--nimote-accent); + font-size: 0.8rem; + font-weight: 510; +} + +.pf-pricing-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1.8rem; + margin-top: 3.2rem; +} + +.pf-plan-card { + border: 1px solid var(--nimote-border); + border-radius: var(--nimote-radius-md); + padding: 2.4rem; + background: var(--nimote-card); + box-shadow: + inset 0 1px 0 var(--nimote-inset-highlight), + var(--nimote-panel-shadow); + transition: transform 0.3s var(--nimote-ease), border-color 0.3s var(--nimote-ease), + box-shadow 0.3s var(--nimote-ease); + position: relative; +} + +.pf-plan-card.is-featured { + border-color: var(--nimote-border-accent); + box-shadow: var(--nimote-shadow-brand); + background: + radial-gradient(circle at top right, rgba(var(--nimote-accent-rgb), 0.08), transparent 48%), + var(--nimote-card); +} + +.pf-plan-card:hover { + transform: translateY(-4px); + border-color: var(--nimote-border-accent); + box-shadow: var(--nimote-shadow-lg); +} + +.pf-plan-topline { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + margin-bottom: 1.2rem; +} + +.pf-plan-topline h3 { + margin: 0; + font-size: 1.25rem; + font-weight: 510; + color: var(--nimote-text-primary); + letter-spacing: -0.015em; +} + +.pf-plan-topline span { + padding: 0.35rem 0.85rem; + border-radius: var(--nimote-radius-pill); + background: var(--nimote-accent); + color: var(--nimote-text-inverse); + font-size: 0.72rem; + font-weight: 510; + letter-spacing: 0.04em; +} + +.pf-price-row { + display: flex; + align-items: baseline; + gap: 0.4rem; + margin-bottom: 0.4rem; +} +.pf-price-row strong { + font-size: 2.6rem; + font-weight: 590; + letter-spacing: -0.03em; + color: var(--nimote-text-primary); + line-height: 1; +} +.pf-price-row span { + font-size: 0.96rem; + color: var(--nimote-text-secondary); +} + +.pf-yearly-row { + display: flex; + align-items: baseline; + gap: 0.4rem; + margin-bottom: 1rem; +} +.pf-yearly-row strong { + font-size: 1.05rem; + font-weight: 600; + color: var(--nimote-text-primary); +} +.pf-yearly-row span { + font-size: 0.9rem; + color: var(--nimote-text-muted); +} + +.pf-plan-summary { + margin: 0 0 1.5rem; + font-size: 0.98rem; + line-height: 1.6; + color: var(--nimote-text-secondary); +} + +.pf-plan-features { + margin: 1.8rem 0 0; + padding-left: 0; + list-style: none; +} + +.pf-plan-features li { + margin: 0.65rem 0; + font-size: 0.94rem; + line-height: 1.55; + color: var(--nimote-text-secondary); + display: flex; + align-items: flex-start; + gap: 0.6rem; + padding-left: 0; +} +.pf-plan-features li::before { + content: ""; + width: 6px; + height: 6px; + border-radius: 50%; + background: var(--nimote-accent); + margin-top: 0.5rem; + flex-shrink: 0; +} + +.pf-trust-line { + text-align: center; + margin: 2rem 0 0; + color: var(--nimote-text-muted); + font-size: 0.86rem; + line-height: 1.6; +} + +/* Light-mode pricing */ +html:not(.dark) .pf-feature-card, +html:not(.dark) .pf-plan-card { + border-color: var(--nimote-border); + background: var(--nimote-card); + box-shadow: + inset 0 1px 0 var(--nimote-inset-highlight), + var(--nimote-panel-shadow); +} +html:not(.dark) .pf-plan-card.is-featured { + border-color: var(--nimote-border-accent); + background: + radial-gradient(circle at top right, rgba(var(--nimote-accent-rgb), 0.08), transparent 48%), + var(--nimote-card); + box-shadow: var(--nimote-shadow-brand); +} +html:not(.dark) .pf-card-head span { + background: var(--nimote-bg-subtle); + border-color: var(--nimote-border); + color: var(--nimote-text-secondary); +} diff --git a/docs/.vitepress/theme/styles/responsive.css b/docs/.vitepress/theme/styles/responsive.css new file mode 100644 index 0000000..cf8ba2e --- /dev/null +++ b/docs/.vitepress/theme/styles/responsive.css @@ -0,0 +1,361 @@ +/* ========================================================================== + Responsive + - Tablet (≤1280px, ≤1024px) + - Mobile (≤768px, ≤560px, ≤420px) — primary focus + - iOS safe-area insets + - Touch device optimizations + Loaded last so it can override component rules above. + ========================================================================== */ + +@media (max-width: 1024px) { + /* Hero — collapse to single column, image goes on top */ + .home-page-hero { + padding: 0 0 24px; + min-height: 0; + } + .home-page-hero::before { + background-position: 72% center; + } + .home-page-hero-shell { + grid-template-columns: minmax(0, 1fr); + gap: 24px; + padding: 44px 20px 26px; + } + .home-page-hero-copy { + text-align: center; + align-items: center; + max-width: 100%; + margin: 0 auto; + } + .home-page-subtitle { + margin-left: auto; + margin-right: auto; + } + .home-page-actions { + justify-content: center; + } + .home-page-hero-stack { + justify-self: stretch; + width: 100%; + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + .pf-feature-grid, + .home-page-scenario-grid, + .home-page-feature-grid-priority { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .pf-pricing-grid { + grid-template-columns: minmax(0, 1fr); + max-width: 560px; + margin-left: auto; + margin-right: auto; + } +} + +@media (max-width: 768px) { + :root { + --nimote-nav-height: 56px; + } + + .VPNav, + .VPNavBar { + z-index: calc(var(--vp-z-index-layout-top) + 20); + } + .VPNavBarHamburger { + min-width: 52px; + min-height: 52px; + touch-action: manipulation; + } + + .home-page-hero { + padding: 0 0 18px; + min-height: clamp(560px, 100svh - var(--nimote-nav-height), 760px); + } + .home-page-hero::before { + background-image: url("/screenshots/homepage_bk_mobile.jpg"); + background-position: center top; + filter: saturate(1.02) contrast(0.98) brightness(0.78); + } + .home-page-hero::after { + background: + linear-gradient(180deg, rgba(2, 6, 23, 0.32) 0%, rgba(2, 6, 23, 0.18) 18%, rgba(2, 6, 23, 0.58) 52%, rgba(2, 6, 23, 0.9) 100%), + linear-gradient(90deg, rgba(2, 6, 23, 0.3) 0%, rgba(2, 6, 23, 0.08) 28%, rgba(2, 6, 23, 0.08) 72%, rgba(2, 6, 23, 0.34) 100%); + } + .home-page-hero-shell { + padding: 26px 16px 132px; + gap: 16px; + align-content: end; + } + .home-page-hero-stack { + grid-template-columns: minmax(0, 1fr); + gap: 10px; + margin-top: 2px; + } + .home-page-badge { + margin-bottom: 14px; + padding: 7px 12px; + font-size: 0.66rem; + letter-spacing: 0.12em; + } + .home-page-logo-lockup { + gap: 12px; + margin-bottom: 18px; + } + .home-page-logo { + width: 48px; + height: 48px; + border-radius: 16px; + } + .home-page-brand { + font-size: 1.08rem; + } + + .home-page-title { + max-width: 11ch; + font-size: clamp(2rem, 8.6vw, 2.9rem); + line-height: 1.02; + letter-spacing: -0.05em; + } + + .home-page-subtitle, + .home-page-section-copy, + .home-page-cta-text { + font-size: 0.98rem; + } + .home-page-subtitle { + max-width: 31rem; + margin-top: 18px; + line-height: 1.65; + } + + .home-page-section { + padding-left: 18px; + padding-right: 18px; + padding-top: 64px; + padding-bottom: 64px; + } + .home-page-section.dense { + padding-top: 48px; + padding-bottom: 48px; + } + .home-page-video-section { + padding-top: 56px; + padding-bottom: 56px; + } + + .home-page-section-title { + font-size: clamp(1.6rem, 6vw, 2rem); + } + .home-page-section-head-centered { + margin-bottom: 32px; + } + + .home-page-actions { + flex-direction: column; + align-items: stretch; + width: 100%; + max-width: 320px; + gap: 10px; + margin-left: auto; + margin-right: auto; + } + .home-page-actions .home-page-btn { + width: 100%; + } + .home-page-actions-hero { + margin-top: 28px; + } + .home-page-store-showcase { + bottom: 46px; + gap: 14px; + } + .home-page-store-showcase-badge { + height: 36px; + } + .home-page-scroll-hint { + bottom: 10px; + font-size: 0.76rem; + letter-spacing: 0.05em; + } + + .home-page-feature-grid, + .home-page-scenario-grid, + .pf-feature-grid, + .pf-pricing-grid { + grid-template-columns: minmax(0, 1fr); + gap: 14px; + } + + .home-page-feature-card { + padding: 22px; + } + + .home-page-video { + margin-top: 28px; + } + .home-page-video-shell { + border-radius: 22px; + box-shadow: 0 18px 44px rgba(0, 0, 0, 0.22); + } + + .home-page-cta { + padding: 48px 24px; + border-radius: 28px; + } + .home-page-cta-title { + font-size: clamp(1.6rem, 6vw, 2rem); + } + + .home-page-positioning p { + font-size: clamp(1.85rem, 8vw, 2.4rem); + } + + .home-page-feature-card-ai::after { + inset: auto -10% -20% auto; + width: 160px; + height: 160px; + } + + /* Sidebar becomes drawer */ + .VPSidebar { + background: var(--nimote-bg-elevated); + } + + /* Doc layout */ + .vp-doc { + padding: 8px 0 64px; + font-size: 0.95rem; + } + .vp-doc h1 { + font-size: clamp(1.85rem, 7vw, 2.4rem); + } + .vp-doc h2 { + margin-top: 40px; + font-size: 1.4rem; + } + .vp-doc h3 { + font-size: 1.15rem; + } + .vp-doc pre { + padding: 14px 16px; + border-radius: var(--nimote-radius-md); + } + .vp-doc table { + font-size: 0.86rem; + } + .vp-doc blockquote { + padding: 12px 14px; + } + + .pf-plan-card { + padding: 1.8rem; + } + .pf-price-row strong { + font-size: 2.2rem; + } +} + +@media (max-width: 560px) { + .home-page-hero { + padding: 0 0 18px; + } + .home-page-hero::before { + background-position: center top; + } + .home-page-hero-shell { + padding: 24px 16px 124px; + gap: 14px; + } + .home-page-title { + max-width: 10ch; + font-size: clamp(1.9rem, 9vw, 2.45rem); + } + .home-page-subtitle { + font-size: 0.93rem; + } + .home-page-actions { + max-width: 100%; + } + .home-page-store-showcase { + bottom: 42px; + gap: 10px; + } + .home-page-store-showcase-badge { + height: 32px; + } + .home-page-scroll-hint { + bottom: 8px; + } + .home-page-section { + padding-top: 56px; + padding-bottom: 56px; + } + .home-page-btn { + min-height: 46px; + font-size: 0.92rem; + padding: 0.78rem 1.2rem; + } +} + +@media (max-width: 420px) { + .home-page-hero-shell { + padding: 22px 12px 116px; + gap: 16px; + } + .home-page-title { + font-size: 1.78rem; + } + .home-page-subtitle { + font-size: 0.9rem; + } + .home-page-store-showcase { + bottom: 38px; + gap: 8px; + } + .home-page-store-showcase-badge { + height: 28px; + } + .home-page-scroll-hint { + bottom: 4px; + font-size: 0.72rem; + } + .home-page-section-title { + font-size: 1.55rem; + } + .home-page-cta { + padding: 40px 18px; + } + .vp-doc h1 { + font-size: 1.7rem; + } +} + +/* iOS safe area — only apply to in-page sections, hero is full-bleed */ +@supports (padding: env(safe-area-inset-left)) { + .VPNavBar .container, + .home-page-section, + .VPFooter .container { + padding-left: max(14px, env(safe-area-inset-left)); + padding-right: max(14px, env(safe-area-inset-right)); + } + .home-page-hero-shell { + padding-left: max(14px, env(safe-area-inset-left)); + padding-right: max(14px, env(safe-area-inset-right)); + } +} + +/* Touch device optimizations */ +@media (hover: none) and (pointer: coarse) { + .home-page-btn, + .VPSidebarItem .item .link, + .vp-doc a { + -webkit-tap-highlight-color: rgba(var(--nimote-accent-rgb), 0.12); + } + .home-page-feature-card, + .home-page-video-shell { + transition: none; + } + .home-page-feature-card:active { + transform: scale(0.99); + } +} diff --git a/docs/.vitepress/theme/styles/tokens.css b/docs/.vitepress/theme/styles/tokens.css new file mode 100644 index 0000000..9460984 --- /dev/null +++ b/docs/.vitepress/theme/styles/tokens.css @@ -0,0 +1,196 @@ +/* ========================================================================== + Design Tokens + - CSS custom properties (Linear-inspired, light / dark) + - All other modules read from these variables + ========================================================================== */ + +:root { + /* Typography */ + --vp-font-family-base: "Inter Variable", "Inter", "Noto Sans SC", "Noto Sans JP", "Noto Sans KR", + -apple-system, BlinkMacSystemFont, "SF Pro Display", "SF Pro Text", "Segoe UI", + "Helvetica Neue", Arial, sans-serif; + --vp-font-family-mono: "Berkeley Mono", "JetBrains Mono", "SF Mono", "Fira Code", "Roboto Mono", ui-monospace, monospace; + + /* VitePress brand hooks */ + --vp-c-brand-1: #d946ef; + --vp-c-brand-2: #c026d3; + --vp-c-brand-3: #f0abfc; + --vp-c-brand-soft: rgba(217, 70, 239, 0.12); + + /* Fluid type scale */ + --nimote-fs-xs: 0.72rem; + --nimote-fs-sm: 0.82rem; + --nimote-fs-md: 0.92rem; + --nimote-fs-lg: 1rem; + --nimote-fs-xl: 1.18rem; + --nimote-fs-2xl: clamp(1.45rem, 1.2rem + 0.8vw, 1.75rem); + --nimote-fs-3xl: clamp(1.85rem, 1.35rem + 1.5vw, 2.6rem); + --nimote-fs-4xl: clamp(2.2rem, 1.5rem + 2.4vw, 3.4rem); + --nimote-fs-5xl: clamp(2.8rem, 1.7rem + 4vw, 4.5rem); + + /* Spacing scale (4px base) */ + --nimote-space-1: 4px; + --nimote-space-2: 8px; + --nimote-space-3: 12px; + --nimote-space-4: 16px; + --nimote-space-5: 20px; + --nimote-space-6: 24px; + --nimote-space-8: 32px; + --nimote-space-10: 40px; + --nimote-space-12: 48px; + --nimote-space-16: 64px; + --nimote-space-20: 80px; + + /* Radii */ + --nimote-radius-sm: 6px; + --nimote-radius-md: 12px; + --nimote-radius-lg: 14px; + --nimote-radius-xl: 16px; + --nimote-radius-2xl: 20px; + --nimote-radius-pill: 9999px; + + /* Accent */ + --nimote-accent: #d946ef; + --nimote-accent-rgb: 217, 70, 239; + --nimote-accent-light: #f0abfc; + --nimote-accent-dark: #a21caf; + --nimote-accent-2: #5e6ad2; + --nimote-accent-2-rgb: 94, 106, 210; + --nimote-accent-3: #27a644; + --nimote-accent-3-rgb: 39, 166, 68; + --nimote-gold: #d946ef; + --nimote-gold-rgb: 217, 70, 239; + + /* Surfaces — Light */ + --nimote-bg: #f7f8f8; + --nimote-bg-rgb: 247, 248, 248; + --nimote-bg-elevated: #ffffff; + --nimote-bg-subtle: #f0f1f2; + --nimote-bg-muted: #e4e7eb; + --nimote-card: #ffffff; + --nimote-card-hover: #f7f8f8; + --nimote-nav-bg: rgba(255, 255, 255, 0.9); + --nimote-nav-bg-scrolled: rgba(255, 255, 255, 0.97); + --nimote-input-bg: #f0f1f2; + + /* Text — Light */ + --nimote-text-primary: #08090a; + --nimote-text-secondary: #62666d; + --nimote-text-muted: #8a8f98; + --nimote-text-inverse: #ffffff; + + /* Borders — Light */ + --nimote-border: rgba(35, 37, 42, 0.12); + --nimote-border-strong: rgba(35, 37, 42, 0.18); + --nimote-border-accent: rgba(217, 70, 239, 0.32); + + /* Shadows — Light */ + --nimote-shadow-xs: 0 1px 2px rgba(8, 9, 10, 0.04); + --nimote-shadow-sm: 0 2px 4px rgba(8, 9, 10, 0.08); + --nimote-shadow-md: 0 12px 28px rgba(8, 9, 10, 0.08); + --nimote-shadow-lg: 0 18px 48px rgba(8, 9, 10, 0.12); + --nimote-shadow-xl: 0 32px 84px rgba(8, 9, 10, 0.16); + --nimote-shadow-brand: 0 18px 48px rgba(217, 70, 239, 0.18); + --nimote-shadow-gold: 0 18px 48px rgba(217, 70, 239, 0.14); + + /* Gradients — Light */ + --nimote-gradient: linear-gradient(180deg, #f0abfc 0%, #d946ef 100%); + --nimote-gradient-soft: linear-gradient(135deg, rgba(217, 70, 239, 0.1), rgba(94, 106, 210, 0.08)); + --nimote-gradient-vivid: linear-gradient(135deg, #e879f9 0%, #d946ef 48%, #5e6ad2 100%); + --nimote-gradient-gold: linear-gradient(180deg, #f0abfc 0%, #d946ef 100%); + --nimote-gradient-bg: + radial-gradient(ellipse 70% 46% at 50% -12%, rgba(217, 70, 239, 0.14) 0%, transparent 72%), + radial-gradient(ellipse 54% 36% at 80% 8%, rgba(94, 106, 210, 0.1) 0%, transparent 70%); + + /* Mode-specific visual helpers */ + --nimote-inset-highlight: rgba(255, 255, 255, 0.8); + --nimote-panel-shadow: 0 2px 4px rgba(8, 9, 10, 0.08); + --nimote-panel-shadow-hover: 0 12px 28px rgba(8, 9, 10, 0.12); + --nimote-hero-image-filter: saturate(0.92) contrast(1.02) brightness(0.92); + --nimote-hero-overlay: + linear-gradient(90deg, rgba(247, 248, 248, 0.94) 0%, rgba(247, 248, 248, 0.78) 34%, rgba(247, 248, 248, 0.42) 58%, rgba(247, 248, 248, 0.16) 100%), + linear-gradient(180deg, rgba(255, 255, 255, 0.06) 0%, rgba(247, 248, 248, 0.1) 34%, rgba(247, 248, 248, 0.42) 100%), + radial-gradient(circle at 16% 18%, rgba(217, 70, 239, 0.12), transparent 28%), + radial-gradient(circle at 82% 14%, rgba(94, 106, 210, 0.12), transparent 24%); + --nimote-video-shell-bg: linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(240, 241, 242, 0.96)), var(--nimote-bg-elevated); + --nimote-video-overlay: linear-gradient(180deg, rgba(8, 9, 10, 0), rgba(8, 9, 10, 0.74)); + --nimote-grid-line: rgba(8, 9, 10, 0.04); + + /* Motion */ + --nimote-ease: cubic-bezier(0.22, 1, 0.36, 1); + --nimote-ease-out: cubic-bezier(0.16, 1, 0.3, 1); + --nimote-transition: 0.25s var(--nimote-ease); + + /* Layout */ + --nimote-container: 1248px; + --nimote-nav-height: 64px; + + color-scheme: light; +} + +.dark { + --vp-c-brand-1: #d946ef; + --vp-c-brand-2: #c026d3; + --vp-c-brand-3: #f0abfc; + --vp-c-brand-soft: rgba(217, 70, 239, 0.14); + + --nimote-accent: #d946ef; + --nimote-accent-rgb: 217, 70, 239; + --nimote-accent-light: #f0abfc; + --nimote-accent-dark: #a21caf; + --nimote-accent-2: #5e6ad2; + --nimote-accent-2-rgb: 94, 106, 210; + --nimote-gold: #d946ef; + --nimote-gold-rgb: 217, 70, 239; + + --nimote-bg: #08090a; + --nimote-bg-rgb: 8, 9, 10; + --nimote-bg-elevated: #0f1011; + --nimote-bg-subtle: #161718; + --nimote-bg-muted: #23252a; + --nimote-card: #0f1011; + --nimote-card-hover: #161718; + --nimote-nav-bg: rgba(15, 16, 17, 0.94); + --nimote-nav-bg-scrolled: rgba(15, 16, 17, 0.98); + --nimote-input-bg: #383b3f; + + --nimote-text-primary: #f7f8f8; + --nimote-text-secondary: #d0d6e0; + --nimote-text-muted: #8a8f98; + --nimote-text-inverse: #08090a; + + --nimote-border: #23252a; + --nimote-border-strong: #33363d; + --nimote-border-accent: rgba(217, 70, 239, 0.38); + + --nimote-shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.45); + --nimote-shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.4); + --nimote-shadow-md: 0 12px 28px rgba(0, 0, 0, 0.42); + --nimote-shadow-lg: 0 18px 48px rgba(0, 0, 0, 0.5); + --nimote-shadow-xl: 0 32px 84px rgba(0, 0, 0, 0.62); + --nimote-shadow-brand: 0 18px 48px rgba(217, 70, 239, 0.22); + --nimote-shadow-gold: 0 18px 48px rgba(217, 70, 239, 0.16); + + --nimote-gradient: linear-gradient(180deg, #f0abfc 0%, #d946ef 100%); + --nimote-gradient-soft: linear-gradient(135deg, rgba(217, 70, 239, 0.1), rgba(94, 106, 210, 0.06)); + --nimote-gradient-vivid: linear-gradient(135deg, #e879f9 0%, #d946ef 48%, #5e6ad2 100%); + --nimote-gradient-gold: linear-gradient(180deg, #f0abfc 0%, #d946ef 100%); + --nimote-gradient-bg: + radial-gradient(ellipse 70% 46% at 50% -12%, rgba(217, 70, 239, 0.18) 0%, transparent 72%), + radial-gradient(ellipse 54% 36% at 80% 8%, rgba(94, 106, 210, 0.08) 0%, transparent 70%); + + --nimote-inset-highlight: rgba(255, 255, 255, 0.035); + --nimote-panel-shadow: 0 2px 4px rgba(0, 0, 0, 0.4); + --nimote-panel-shadow-hover: 0 8px 18px rgba(0, 0, 0, 0.48); + --nimote-hero-image-filter: saturate(0.72) contrast(1.08) brightness(0.56); + --nimote-hero-overlay: + linear-gradient(90deg, rgba(8, 9, 10, 0.94) 0%, rgba(8, 9, 10, 0.76) 34%, rgba(8, 9, 10, 0.44) 58%, rgba(8, 9, 10, 0.18) 100%), + linear-gradient(180deg, rgba(255, 255, 255, 0.025) 0%, rgba(15, 16, 17, 0.1) 34%, rgba(8, 9, 10, 0.46) 100%), + radial-gradient(circle at 16% 18%, rgba(217, 70, 239, 0.12), transparent 28%), + radial-gradient(circle at 82% 14%, rgba(94, 106, 210, 0.1), transparent 24%); + --nimote-video-shell-bg: linear-gradient(180deg, rgba(15, 16, 17, 0.94), rgba(8, 9, 10, 0.98)), var(--nimote-bg); + --nimote-video-overlay: linear-gradient(180deg, rgba(8, 9, 10, 0), rgba(8, 9, 10, 0.84)); + --nimote-grid-line: rgba(255, 255, 255, 0.018); + + color-scheme: dark; +} diff --git a/docs/account-delete.md b/docs/account-delete.md index d39f1fd..dbf5e18 100644 --- a/docs/account-delete.md +++ b/docs/account-delete.md @@ -1,5 +1,6 @@ --- title: Account Deletion | NimoteCode +description: Learn how to delete your NimoteCode account and associated cloud data from the app or by requesting support. --- # Account Deletion @@ -22,7 +23,7 @@ After confirmation, your NimoteCode account and associated cloud user record are If you cannot sign in to the app, send a deletion request through one of these channels: -- Email: aoun.ma@foxmail.com +- Email: nimotecode@gmail.com - GitHub Issues: https://github.com/nimotecode/nimote_issues/issues Include: @@ -40,4 +41,3 @@ Local workspace files, remote server files, and data stored on your own infrastr ## Processing Time We process verified deletion requests as soon as reasonably possible, subject to legal, security, anti-fraud, and dispute-handling obligations. - diff --git a/docs/docs.md b/docs/docs.md index 16762ee..873caa1 100644 --- a/docs/docs.md +++ b/docs/docs.md @@ -1,10 +1,13 @@ --- -title: Documentation | NimoteCode +title: Documentation Hub | NimoteCode +description: Explore NimoteCode documentation for mobile IDE workflows, including SSH development, terminal usage, Git, AI assistant, LSP, debugging, tasks, timeline, and sync/cache. --- -# Documentation +# NimoteCode Documentation Hub -Welcome to the NimoteCode documentation hub. Everything you need to get started and master mobile development. +Welcome to the NimoteCode documentation hub. Everything you need to get started and master mobile development with a real mobile IDE. + +NimoteCode documentation is organized around practical developer workflows: mobile SSH access, code editing, terminal execution, Git review, AI coding assistance, debugging, and repeatable task automation from iPhone, iPad, and Android devices. ## Getting Started @@ -75,6 +78,20 @@ Master each aspect of NimoteCode with these comprehensive guides. | **[Settings](/docs/settings)** | Personalize your development experience | Theme, language, keyboard, editor preferences | | **[Configuration](/docs/configuration)** | Recommended setups for optimal workflow | AI config, SSH config, task templates | +## Use Cases That Map Search Intent + +These pages describe the concrete scenarios people often search for before they know the product name NimoteCode. + +| Search Intent | Best Entry Page | Why It Matters | +|---------------|-----------------|----------------| +| Mobile SSH IDE | **[SSH Workspace](/docs/ssh)** | Shows how NimoteCode connects to and operates on remote projects | +| Code editor on phone | **[Editor](/docs/editor)** | Explains file editing, tabs, navigation, and mobile editing ergonomics | +| Terminal on iPhone or Android | **[Terminal](/docs/terminal)** | Covers command execution, output search, and persistent sessions | +| Git workflow from mobile | **[Source Control](/docs/source-control)** | Details diffs, commits, branches, and Git AI workflows | +| AI coding assistant with workspace context | **[AI Assistant](/docs/ai)** | Explains Chat, Agent, provider setup, and controlled execution | +| Remote hotfix workflow | **[Remote Hotfix](/use-cases/remote-hotfix)** | Demonstrates end-to-end patching from a mobile device | +| On-call debugging from phone | **[On-call Diagnostics](/use-cases/on-call-diagnostics)** | Maps diagnostics, timeline, and debug flows to incident response | + ## Help & Reference Find answers to common questions and get support. diff --git a/docs/docs/account-subscription.md b/docs/docs/account-subscription.md new file mode 100644 index 0000000..287613b --- /dev/null +++ b/docs/docs/account-subscription.md @@ -0,0 +1,46 @@ +--- +title: Account and Subscription +description: Understand NimoteCode sign-in, Pro verification, restore purchases, trials, and gated feature access. +--- + +# Account and Subscription + +NimoteCode uses account state and subscription verification to unlock Pro workflows. + +## Why sign in + +Sign-in is used to: + +- Verify Pro access. +- Associate subscription state with your account. +- Track metered AI Agent usage. +- Restore purchases when supported by your platform store. + +## Pro verification + +The app checks premium access through server-side verification and subscription state. If a recent verification is available, short offline grace behavior can prevent immediate interruption during temporary network issues. + +## Restore purchases + +If you previously purchased Pro on a supported platform, use restore purchase from the app settings/account area. + +## Gated capabilities + +Pro gates are applied at action time. Depending on current configuration and subscription state, the app can gate: + +- Unlimited AI Agent runs. +- Git write operations. +- Multi-terminal actions. +- Remote search beyond free usage. +- LSP diagnostics and code actions. +- Debugger access. +- Timeline AI analysis and fix suggestions. +- Advanced task execution. +- Sync/cache workflows. + +## Related pages + +- [Pro](/pro) +- [AI Assistant](/docs/ai) +- [Source Control](/docs/source-control) +- [Sync / Cache](/docs/sync-cache) diff --git a/docs/docs/ai.md b/docs/docs/ai.md index 930fc85..ab0a65f 100644 --- a/docs/docs/ai.md +++ b/docs/docs/ai.md @@ -1,56 +1,45 @@ +--- +title: AI Assistant +description: Use NimoteCode AI Chat and AI Agent with provider configuration, file context, metered free agent runs, and Pro unlimited usage. +--- + # AI Assistant -NimoteCode includes two AI experiences: AI Chat for direct help and AI Agent for multi-step execution. +NimoteCode includes two AI experiences: AI Chat for direct help and AI Agent for controlled multi-step execution. ## AI Chat -Use AI Chat when you want fast answers during coding: +Use AI Chat when you want fast help while coding: -- Explain unfamiliar code -- Analyze terminal errors -- Propose refactor plans -- Generate safer next steps before commit +- Explain unfamiliar code. +- Analyze terminal errors. +- Plan refactors or fixes. +- Review a change before committing. +- Work with current-file context. ## AI Agent -Use AI Agent when work requires multiple actions and checks: - -- Step-by-step execution flow -- Progress visibility and run status -- Risk prompts before sensitive actions -- Auto mode or confirm mode based on your control preference - -## Provider Flexibility +Use AI Agent when work requires multiple actions: -NimoteCode supports multiple provider templates: +- Inspect files. +- Plan implementation steps. +- Apply changes. +- Run commands or checks. +- Summarize results. -- OpenAI -- Anthropic -- Gemini -- Grok -- DeepSeek -- Zhipu -- Moonshot -- Ollama -- Custom OpenAI-compatible endpoints +Free users have metered AI Agent usage. Pro unlocks unlimited Agent runs. -## What You Can Configure +## Provider flexibility -- Model identity and endpoint -- Sampling behavior and output size -- Streaming response mode -- System prompt and context size -- File-context usage for codebase-aware responses +NimoteCode can be configured with provider profiles and model settings. Use the configuration panel to manage endpoint, model, API credentials, output behavior, streaming, and context options. -## Best-Practice Setup +## Safety expectations -1. Keep one primary cloud model and one backup model. -2. Use lower creativity for deterministic coding tasks. -3. Keep file context on for project-level analysis. -4. Review AI output before running in production. +AI Agent workflows can use tools, so review commands and file changes before applying them to sensitive systems. The app includes validation and locking layers, but user review is still important for production work. -## Related Pages +## Related pages +- [AI Agent Workflows](/use-cases/ai-agent) - [Configuration](/docs/configuration) -- [Source Control](/docs/source-control) -- [Timeline](/docs/timeline) +- [Security and Safety](/docs/security) +- [Pro](/pro) diff --git a/docs/docs/editor.md b/docs/docs/editor.md new file mode 100644 index 0000000..a978f3e --- /dev/null +++ b/docs/docs/editor.md @@ -0,0 +1,39 @@ +--- +title: Editor +description: Use NimoteCode's mobile code editor with tabs, cursor tracking, clipboard operations, undo/redo, outline access, and terminal/AI panels. +--- + +# Editor + +The editor is the center of a NimoteCode workspace. It works with files opened from local projects or SSH remote workspaces. + +## Core editor workflow + +1. Open a workspace from Local Explorer or Remote Explorer. +2. Select a file from the explorer or search results. +3. Edit content in the tabbed editor. +4. Save the file. +5. Use terminal, Git, AI, LSP, or debug panels for the next step. + +## Capabilities + +- Multiple open editor tabs. +- Cursor line and column tracking. +- Copy, cut, paste, select all, undo, and redo. +- Current-file context for AI Chat. +- Outline panel for code structure navigation when symbol data is available. +- Mobile programming keyboard controls. +- Docked editor panels for AI, outline, and terminal workflows. + +## Practical tips + +- Keep the active file open before asking AI questions so the assistant can use file context. +- Use Search to jump into remote files by matching content. +- Use Source Control after saving to review changes before committing. + +## Related pages + +- [Quick Start](/docs/quick-start) +- [SSH Workspace](/docs/ssh) +- [Search](/docs/search) +- [AI Assistant](/docs/ai) diff --git a/docs/docs/faq.md b/docs/docs/faq.md index cc9017c..cd13b5f 100644 --- a/docs/docs/faq.md +++ b/docs/docs/faq.md @@ -1,4 +1,9 @@ -# FAQ +--- +title: FAQ | NimoteCode +description: Find answers to common NimoteCode questions about remote development, AI providers, Source Control, Tasks, Timeline, and Pro access. +--- + +# NimoteCode FAQ ## Is NimoteCode only for remote development? diff --git a/docs/docs/quick-start.md b/docs/docs/quick-start.md index ae36507..4a99316 100644 --- a/docs/docs/quick-start.md +++ b/docs/docs/quick-start.md @@ -1,84 +1,62 @@ -# Quick Start (3 Minutes) +--- +title: Quick Start +description: Open a NimoteCode workspace, edit a file, run a command, and choose your next workflow in a few minutes. +--- -This guide is optimized for first success in one session. +# Quick Start -## Goal +This guide gets you to first success: open a workspace, edit a file, run a command, and choose the next workflow. -In 3 minutes, you will: - -1. Open a workspace -2. Run a real command -3. Edit one file -4. Use one high-value panel (Source Control / AI / Debug) - -## Step 1: Open Workspace (30s) +## 1. Open a workspace Choose one mode: -- Local Explorer: open local project directory -- Remote Explorer: connect via SSH - -If using remote mode: - -1. Create SSH profile (`host`, `port`, `username`) -2. Select auth method (password or private key) -3. Connect and confirm workspace root path - -## Step 2: Run Command in Terminal (30s) - -1. Open terminal panel -2. Run a verification command (for example `pwd`, `ls`, or your build/test command) -3. If output is long, use terminal search - -## Step 3: Edit and Save (45s) - -1. Open a source file from explorer -2. Edit one line -3. Save file -4. Use symbol navigation or in-file find/replace if needed - -## Step 4: Choose One Outcome Path (75s) +- **Local Explorer**: open a local project directory. +- **Remote Explorer**: connect to a project over SSH. -### Path A: Commit Changes +For SSH: -Open Source Control and: +1. Enter host, port, and username. +2. Choose password, private-key file, or pasted private-key authentication. +3. Connect. +4. Confirm the workspace root path. +5. Save the profile if you want quick reconnection later. -- inspect modified files -- stage changes -- commit (and push if configured) +## 2. Open and edit a file -Reference: [/docs/source-control](/docs/source-control) +1. Select a file from the explorer or search results. +2. Edit the file in the tabbed editor. +3. Save the file. +4. Use outline, AI, or terminal panels when helpful. -### Path B: Ask AI to Accelerate +## 3. Run a command -Open AI panel and: +1. Open the terminal. +2. Run a simple verification command such as `pwd`, `ls`, or your project’s test command. +3. Search terminal output if the result is long. -- choose provider config -- ask for explanation/refactor/fix suggestions -- optionally run AI Agent for workflow automation +## 4. Choose your next path -Reference: [/docs/ai](/docs/ai) +### Commit changes (Pro) -### Path C: Diagnose Faster (Pro) +Use Source Control to review diffs, stage changes, commit, and sync with remote branches. -Open LSP/Debug and: +### Ask AI -- check diagnostics -- apply code actions -- start debug session and inspect variables/watch +Use AI Chat for explanations and planning. Use AI Agent for multi-step work. Agent usage is metered on Free and unlimited on Pro. -References: [/docs/lsp](/docs/lsp), [/docs/debug](/docs/debug) +### Diagnose a problem (Pro for advanced tools) -## High-Value Scenarios +Use LSP diagnostics, code actions, Debug, and Timeline AI when a problem requires deeper investigation. -1. Remote hotfix on production-like server: `/docs/ssh` + `/docs/terminal` + `/docs/source-control` -2. Fast bug triage: `/docs/lsp` + `/docs/debug` + `/docs/timeline` -3. Repetitive task automation: `/docs/tasks` + `/docs/ai` -4. Stable daily setup: `/docs/settings` + `/docs/configuration` +### Automate repeated commands -## Next Best Step +Use Tasks for repeated terminal-backed workflows. Advanced filtered and parallel task runs are Pro capabilities. -After first run, configure these immediately: +## Next pages -- AI provider profile: [/docs/configuration](/docs/configuration) -- Editor and keyboard preferences: [/docs/settings](/docs/settings) +- [SSH Workspace](/docs/ssh) +- [Editor](/docs/editor) +- [Terminal](/docs/terminal) +- [AI Assistant](/docs/ai) +- [Pro](/pro) diff --git a/docs/docs/search.md b/docs/docs/search.md new file mode 100644 index 0000000..9a2d1a6 --- /dev/null +++ b/docs/docs/search.md @@ -0,0 +1,35 @@ +--- +title: Search +description: Search remote workspace file contents in NimoteCode with keyword, case-sensitive, and regex options. +--- + +# Search + +Search helps you locate content in a remote workspace and open matching files directly in the editor. + +## What search supports + +- Remote workspace content search. +- Debounced keyword input. +- Case-sensitive matching. +- Regex matching. +- Opening a result at the matching line. + +## Free and Pro behavior + +Remote search has metered free usage. Pro unlocks unrestricted remote content search. + +## Typical workflow + +1. Connect to an SSH workspace. +2. Open Search. +3. Enter a keyword or regex. +4. Toggle case sensitivity or regex if needed. +5. Open a matching file result. +6. Continue in editor, AI, Source Control, or terminal. + +## Related pages + +- [SSH Workspace](/docs/ssh) +- [Editor](/docs/editor) +- [Pro](/pro) diff --git a/docs/docs/security.md b/docs/docs/security.md new file mode 100644 index 0000000..3985615 --- /dev/null +++ b/docs/docs/security.md @@ -0,0 +1,40 @@ +--- +title: Security and Safety +description: How NimoteCode handles SSH credentials, AI provider keys, Pro verification, and controlled agent workflows. +--- + +# Security and Safety + +NimoteCode handles sensitive workflows: SSH access, AI provider keys, terminal commands, file writes, Git operations, and subscription verification. + +## Credentials + +- SSH passwords can be remembered through secure credential storage when the user chooses to save them. +- AI provider credentials are stored through secure app storage. +- Subscription verification uses account state and server-side checks. + +## AI Agent control + +AI Agent workflows include safety-oriented design: + +- Tool execution is separated from chat responses. +- File and command tools use validation layers. +- Write locks and concurrent lock managers reduce conflicting operations. +- Sensitive actions can require confirmation depending on runtime safety settings. +- App review safety settings can restrict background or automatic execution. + +## Remote workspaces + +When using SSH: + +- Confirm host, path, and authentication method carefully. +- Prefer least-privilege server accounts. +- Review generated commands before running them on production systems. +- Use Source Control review before committing or pushing changes. + +## Related pages + +- [SSH Workspace](/docs/ssh) +- [AI Assistant](/docs/ai) +- [Source Control](/docs/source-control) +- [Account and Subscription](/docs/account-subscription) diff --git a/docs/docs/source-control.md b/docs/docs/source-control.md index faa3824..022cfcc 100644 --- a/docs/docs/source-control.md +++ b/docs/docs/source-control.md @@ -1,38 +1,45 @@ -# Source Control +--- +title: Source Control +description: Use NimoteCode Pro Source Control for Git diffs, commits, branches, stash workflows, push/pull/fetch, and Git AI assistance. +--- -Source Control brings full Git workflows into NimoteCode so you can review, commit, and sync changes from mobile. +# Source Control -## What You Can Do +Source Control brings Git review and write workflows into NimoteCode so you can inspect, commit, and sync changes from mobile. -- Review staged, unstaged, and conflicted files -- Stage or discard changes in batch or per file -- Commit and sync with pull/push/fetch -- Manage branches and stash workflows -- Inspect commit/file/line history and diffs +Source Control write workflows are Pro capabilities. -## Git AI Assistance +## What you can do -Built-in AI can help you: +- Review staged, unstaged, and conflicted files. +- Inspect file diffs and commit history. +- Stage selected changes. +- Commit changes. +- Pull, push, and fetch. +- Create and switch branches. +- Merge and rebase. +- Use stash workflows. -- Generate commit messages -- Explain changed files -- Highlight potential change risks +## Git AI assistance -## Typical Commit Flow +Git AI can help with: -1. Review file diffs. -2. Stage selected changes. -3. Generate or write commit message. -4. Commit and sync. -5. Validate on target branch. +- Commit message generation. +- Change explanation. +- Risk-oriented review prompts. -## Why Teams Use It +## Typical commit flow -- Faster code delivery while mobile -- Lower friction for emergency fixes -- Better change quality with AI-assisted review +1. Save your edited files. +2. Open Source Control. +3. Review diffs. +4. Stage selected changes. +5. Write or generate a commit message. +6. Commit. +7. Pull/push/fetch as appropriate for your repository. -## Related Pages +## Related pages +- [Remote Hotfix](/use-cases/remote-hotfix) - [AI Assistant](/docs/ai) -- [Timeline Panel](/docs/timeline) +- [Pro](/pro) diff --git a/docs/docs/terminal.md b/docs/docs/terminal.md index 3f789cb..9ec14e5 100644 --- a/docs/docs/terminal.md +++ b/docs/docs/terminal.md @@ -1,31 +1,36 @@ +--- +title: Terminal +description: Run commands in NimoteCode terminal sessions, search output, use quick commands, and unlock multi-terminal workflows with Pro. +--- + # Terminal Terminal is the command center for build, test, deploy, and incident operations in NimoteCode. -## Core Capabilities +## Core capabilities -- Multi-tab terminal sessions -- Real-time command output -- Output search for fast log targeting -- Quick command shortcuts for repeated actions -- Send key terminal output to AI for analysis -- Rename and organize tabs for long workflows +- Run commands inside the active workspace. +- Stream command output in real time. +- Search terminal output. +- Use quick/custom command shortcuts. +- Send relevant output to AI for analysis. +- Recover terminal sessions when SSH connectivity is restored. -## Typical Command Journey +## Multi-terminal workflows -1. Open terminal in current workspace. -2. Run build/test/deploy commands. -3. Search output for errors and warnings. -4. Escalate complex logs to AI or Timeline. +Pro unlocks advanced multi-terminal actions for parallel workflows such as logs, tests, servers, and deployment commands. -## Why It Matters +## Typical command journey -- Faster command-to-result loop on mobile -- Better visibility when handling incidents remotely -- Stronger continuity with editor, source control, and AI panels +1. Open terminal in the current workspace. +2. Run a verification command. +3. Search output for errors or warnings. +4. Escalate complex output to AI or Timeline. +5. Keep parallel terminal contexts with Pro when needed. -## Related Pages +## Related pages - [SSH Workspace](/docs/ssh) - [AI Assistant](/docs/ai) -- [Timeline Panel](/docs/timeline) +- [Timeline](/docs/timeline) +- [Pro](/pro) diff --git a/docs/download.md b/docs/download.md index b84d2d5..b9ed88f 100644 --- a/docs/download.md +++ b/docs/download.md @@ -1,125 +1,50 @@ --- title: Download | NimoteCode +description: Download NimoteCode and start with a mobile SSH workspace, code editor, terminal, AI Chat, and Pro upgrade paths. --- -# Download +# Download NimoteCode -Get NimoteCode and start shipping production fixes from your phone today. +Download NimoteCode to open a local or SSH workspace, edit files, run commands, and use AI assistance from a mobile device. -## Platform Availability +## Store links -
- - - - -
- -## App Store Links +Use the links below when the store listing is available in your region. If a listing is not available yet, check back from this page or contact support. ### iOS App Store - - - - -
-
Download on the
-
App Store
-
-
+Open App Store listing ### Google Play - - - - -
-
Get it on
-
Google Play
-
-
- -## System Requirements - -### iOS Requirements - -| Requirement | Specification | -|-------------|---------------| -| **Minimum OS** | iOS 15.0 or later | -| **Devices** | iPhone, iPad, iPod Touch | -| **Architecture** | arm64 | -| **Space Required** | ~150 MB | - -### Android Requirements - -| Requirement | Specification | -|-------------|---------------| -| **Minimum OS** | Android 8.0 (API 26) or later | -| **Devices** | Android phones and tablets | -| **Architecture** | arm64-v8a, armeabi-v7a | -| **Space Required** | ~180 MB | - -## What's Included - -When you download NimoteCode, you get: - -
- - - - - - -
- -## Installation Notes - -### For iOS Users: - -1. Tap the App Store link above or search for "NimoteCode" in the App Store -2. Tap "Get" or the cloud icon to download -3. Open NimoteCode and follow the onboarding guide -4. For existing users can restore purchases from Settings if needed - -### For Android Users: - -1. Tap the Google Play link above or search for "NimoteCode" in Google Play -2. Tap "Install" to download -3. Open NimoteCode and complete the setup wizard -4. Sign in or create an account to access all features - -## Region Availability - -NimoteCode is available in most regions worldwide. If you don't see it in your local store, please check back later as we continue to expand availability. - -## Need Help? - -If you encounter any issues during installation: - -- Check the [Quick Start Guide](/docs/quick-start) for setup help -- Visit [Support](/support) for troubleshooting -- Contact us at aoun.ma@foxmail.com for assistance - ---- - -Ready to start shipping from your phone? [Download Now](#app-store-links) and join thousands of developers already using NimoteCode! +Open Google Play listing + +## What to do after install + +1. Open NimoteCode. +2. Choose Local Explorer or Remote Explorer. +3. For SSH, enter host, port, username, authentication method, and workspace root path. +4. Open a file and make a small edit. +5. Run a verification command in terminal. +6. Configure AI provider settings if you want AI Chat or Agent workflows. + +## Included capabilities + +| Capability | Availability | +|------------|--------------| +| Local and SSH workspaces | Free | +| Editor and baseline terminal | Free | +| AI Chat | Free | +| AI Agent | Metered free; unlimited Pro | +| Remote content search | Metered free; unlimited Pro | +| Git write workflows and Git AI | Pro | +| LSP and Debug | Pro | +| Sync / Cache | Pro | +| Timeline AI and advanced task execution | Pro | + +## Need help? + +- Start with [Quick Start](/docs/quick-start). +- Learn SSH setup in [SSH Workspace](/docs/ssh). +- Compare paid capabilities in [Pro](/pro). +- Contact support from [Support](/support). diff --git a/docs/es/download.md b/docs/es/download.md index 042fb0d..f4d21f6 100644 --- a/docs/es/download.md +++ b/docs/es/download.md @@ -8,11 +8,11 @@ NimoteCode está disponible para iOS y Android. ## App Store -[![Descargar en la App Store](https://developer.apple.com/assets/elements/badges/download-on-the-app-store.svg)](https://apps.apple.com/app/nimotecode) +Descargar en la App Store ## Google Play -[![Obtener en Google Play](https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png)](https://play.google.com/store/apps/details?id=com.nimotecode) +Obtener en Google Play ## Requisitos del sistema diff --git a/docs/es/index.md b/docs/es/index.md index 34fbf73..81ef46a 100644 --- a/docs/es/index.md +++ b/docs/es/index.md @@ -1,54 +1,148 @@ --- layout: home -title: NimoteCode - Envía correcciones a producción desde tu teléfono +title: NimoteCode - IDE móvil para iPhone y Android titleTemplate: false +description: NimoteCode es un espacio de desarrollo móvil con editor de código, terminal SSH, Git, asistente de IA y sincronización de espacios de trabajo. hero: - name: NimoteCode - text: "Envía correcciones a producción desde tu teléfono" - tagline: "IDE móvil primero para entrega real: espacio de trabajo SSH con reconexión automática, persistencia de terminal, Source Control con Git AI, LSP/Debug, AI Agent con sistema de memoria y diagnóstico Timeline con seguimiento causal." - actions: - - theme: brand - text: Inicio rápido en 3 minutos - link: /es/docs/quick-start - - theme: alt - text: Mapa de funciones - link: /es/features - - theme: alt - text: Documentación completa - link: /es/docs - -features: - - title: Incorporación en 3 minutos - details: "Desde el primer lanzamiento hasta tu primer commit en minutos, con un flujo de trabajo guiado local o SSH." - - - title: Entrega SSH real con reconexión automática - details: "Conéctate a servidores reales, edita código remoto, ejecuta comandos de terminal con monitoreo de heartbeat y reconexión automática si se pierde la conexión." - - - title: Persistencia de sesiones de terminal - details: "Sesiones de terminal con múltiples pestañas con restauración automática después de la reconexión: nunca pierdas tu contexto en caso de fallos de red." + name: "" + text: "" + tagline: "" + actions: [] +--- - - title: Source Control + Git AI - details: "Revisa diferencias, prepara commits limpios, sincroniza ramas y usa Git AI para mejorar la calidad de los mensajes y reducir riesgos." +
+
+
+

Para iPhone y Android

+
+ + NimoteCode +
+

No es un editor de código.
Es un espacio real de desarrollo.

+

Une flujos SSH, edición de código real, revisión Git y ayuda de IA en una sola IDE mobile-first.

+
+ Google Play + App Store pronto + Inicio rápido +
+
+ + Ver demo +
+
- - title: LSP + Debug (Pro) - details: "Detecta problemas temprano con diagnósticos y acciones de código, luego depura con puntos de interrupción, variables, observación y controles de ejecución." +
+
+

Demo del producto

+

Mira un flujo real de hotfix en móvil.

+

Acceso SSH, edición, terminal, revisión Git y ayuda de IA en un solo workspace continuo.

+
+ +
- - title: AI Chat + AI Agent con sistema de memoria - details: "Usa tu proveedor de IA preferido para análisis de código, correcciones guiadas y automatización de múltiples pasos directamente dentro del espacio de trabajo con soporte para memoria a corto/long plazo y compresión inteligente." +
+
+

Flujo central

+

Diseñado para trabajo real de producción desde móvil.

+

El flujo principal se mantiene claro: conectar, inspeccionar, editar, verificar y entregar.

+
- - title: Análisis de causa raíz Timeline con seguimiento causal - details: "Convierte eventos en trazas prácticas con filtros de gravedad/origen, cadenas de eventos causales, análisis de causa raíz impulsado por IA y sugerencias de corrección." +
+
+

AI Assistant

+

Avanza cambios con IA y contexto completo del workspace.

+

Explica código, investiga problemas y recorre correcciones de varios pasos sin salir de la app.

+
+
+

Terminal

+

Trabaja en entornos reales

+

Haz SSH a servidores y máquinas de desarrollo para ejecutar los comandos que importan.

+
+
+

Git

+

Revisa y confirma con claridad

+

Mantén diffs, staging y control de versiones junto al código que estás tocando.

+
+
+

Workspace Sync

+

Retoma el trabajo al instante

+

Conserva estado del proyecto y contexto entre distintos momentos móviles.

+
+
+
- - title: Diseñado para sesiones móviles prolongadas - details: "Ajusta finamente el idioma, tema, tipografía del editor y comportamiento del teclado para una codificación cómoda y de alta concentración." +
+
+

No es un editor de código.

+

Es un espacio real de desarrollo.

+
+
- - title: Sync / Cache (Pro) - details: "Mueve contenido de proyecto entre espacios de trabajo locales y remotos con control de dirección, seguridad de rutas objetivo e historial de operaciones." +
+
+

Casos de uso

+

Creado para flujos urgentes y prácticos.

+

El valor se entiende de inmediato cuando necesitas actuar, no solo mirar código.

+
- - title: Panel de Tasks - details: "Ejecuta tareas remotas agrupadas con seguimiento de estado para estandarizar operaciones repetitivas del equipo." +
+ + + + +
+
- - title: Empieza por el resultado - details: "Comienza con tu objetivo: conectar un servidor, corregir un error más rápido, automatizar trabajo repetitivo o enviar un hotfix móvil." ---- +
+
+

Empezar

+

Lleva un workspace real de desarrollo a todas partes.

+

Pensado para developers y ops engineers que necesitan inspeccionar, corregir y entregar desde móvil.

+ +
+
diff --git a/docs/es/terms.md b/docs/es/terms.md index a9f3058..cb0dd5e 100644 --- a/docs/es/terms.md +++ b/docs/es/terms.md @@ -4,39 +4,116 @@ title: Términos de servicio | NimoteCode # Términos de servicio -Última actualización: 2024 +**Fecha de entrada en vigor:** 16 de abril de 2026 -## Términos del acuerdo +Estos Términos de Servicio (“Términos”) regulan el uso de NimoteCode (“Aplicación”, “nosotros”). -Al descargar o usar NimoteCode, aceptas estos términos de servicio. +Al instalar o utilizar NimoteCode, usted acepta estos Términos y los términos de plataformas de terceros: -## Cuenta +- Términos de Apple Media Services y EULA estándar de Apple + https://www.apple.com/legal/internet-services/itunes/dev/stdeula/ -- Eres responsable de mantener la confidencialidad de la información de tu cuenta -- Eres responsable de todas las actividades que ocurran bajo tu cuenta -- Nos reservamos el derecho de terminar cualquier cuenta en cualquier momento +- Términos de Google Play + https://play.google.com/about/play-terms/ -## Suscripción +Si no está de acuerdo con estos Términos, no utilice la Aplicación. -- Las funciones Pro requieren una suscripción -- Los precios se indican en el plan de suscripción -- La suscripción se renueva automáticamente a menos que se cancele antes del final del período actual +--- + +## 1. Descripción del servicio + +NimoteCode es un entorno de desarrollo integrado (IDE) móvil que proporciona flujos de trabajo de desarrollo SSH remoto y local, edición de código, acceso a terminal, herramientas Git, funciones de IA, automatización de tareas y depuración. + +## 2. Elegibilidad + +Debe tener al menos 13 años (o la edad mínima legal en su jurisdicción) para usar esta Aplicación. + +Usted es responsable de la seguridad de su cuenta, dispositivo y credenciales, así como de todas las acciones realizadas bajo su cuenta. + +## 3. Suscripciones, facturación y renovación + +Algunas funciones requieren suscripción de pago (por ejemplo, NimoteCode Pro). + +- Todos los pagos son procesados por Apple App Store o Google Play. +- La suscripción se renueva automáticamente si no se cancela al menos 24 horas antes del final del período actual. +- Se cobrará dentro de las 24 horas previas a la renovación al precio vigente. +- Puede gestionar o cancelar suscripciones en Apple ID o Google Play. +- Los reembolsos se gestionan según las políticas de Apple o Google. +- Las compras pueden restaurarse mediante “Restaurar compras”. +- Los precios pueden variar según la región. + +## 4. Sistemas remotos y responsabilidad del usuario + +Usted es responsable de: + +- Servidores remotos y conexiones SSH +- Comandos ejecutados a través de la aplicación +- Seguridad de credenciales y claves + +No almacenamos credenciales SSH en nuestros servidores. + +## 5. Funciones de IA (modelo BYO Key) + +La aplicación puede usar servicios de IA de terceros. + +- Debe proporcionar su propia clave API +- No proporcionamos modelos de IA ni servicios de inferencia +- Todos los costos son responsabilidad del usuario +- Las respuestas de IA pueden contener errores + +## 6. Uso aceptable + +Usted acepta no: + +- Acceder sin autorización a sistemas +- Usar la aplicación de forma ilegal o abusiva +- Realizar ingeniería inversa o interferir con el sistema +- Abusar de APIs o recursos + +## 7. Servicios de terceros + +La aplicación puede integrarse con Git, SSH y proveedores de IA. + +No somos responsables de estos servicios. + +## 8. Privacidad + +https://nimotecode.com/privacy + +## 9. Suspensión y terminación + +Podemos suspender el acceso por: + +- Seguridad +- Cumplimiento legal +- Prevención de abuso +- Estabilidad del sistema + +## 10. Exención de garantías + +La aplicación se proporciona “tal cual”. + +No garantizamos funcionamiento continuo o libre de errores. + +## 11. Limitación de responsabilidad + +No somos responsables de daños indirectos. + +Incluye pérdida de datos o fallos del sistema. -## Conductas prohibidas +## 12. Control de exportaciones -Aceptas no hacer lo siguiente: -- Usar el servicio para fines ilegales o no autorizados -- Interferir o violar la seguridad del servicio -- Intentar realizar ingeniería inversa o extraer el código fuente +Debe cumplir con las leyes de exportación aplicables. -## Renuncia de garantías +## 13. Ley aplicable -El servicio se proporciona «tal cual». No hacemos ninguna garantía sobre la idoneidad para un propósito particular. +Se rige por las leyes de la República Popular China. -## Limitación de responsabilidad +## 14. Cambios en los términos -En ningún caso seremos responsables de daños indirectos, incidentales, especiales, punitivos o consecuentes. +Podemos actualizar estos Términos. El uso continuado implica aceptación. -## Cambios +## 15. Contacto -Nos reservamos el derecho de cambiar estos términos en cualquier momento. Al continuar usando el servicio después de los cambios, aceptas los nuevos términos. +Email: nimotecode@gmail.com +GitHub: https://github.com/nimotecode/nimote_issues/issues \ No newline at end of file diff --git a/docs/features.md b/docs/features.md index 14ad8b6..ee41d80 100644 --- a/docs/features.md +++ b/docs/features.md @@ -1,260 +1,89 @@ --- title: Features | NimoteCode +description: Capability map for NimoteCode's SSH workspace, editor, terminal, Git, AI, LSP, debugger, tasks, timeline, search, and sync/cache workflows. --- -# Features +# NimoteCode Features -
-

NimoteCode Capability Map

-

Mobile Delivery Stack for Real Engineering Work

-

From SSH access to final commit, NimoteCode keeps coding, diagnosis, automation, and release workflows connected in one focused mobile interface.

-
+NimoteCode combines the tools needed to work on real projects from mobile devices: workspace access, editing, terminal execution, Git, AI, diagnostics, automation, and sync/cache. -## Overview +## Capability map -| Category | Capabilities | Availability | -|----------|-------------|-------------| -| **Workspace & File Management** | Local & SSH workspaces, file explorer, SSH profiles, auto-reconnection | Free | -| **Terminal** | Multi-tab, persistence, search, output parsing | Free | -| **Source Control** | Git workflow, diffs, commits, branches, stash, Git AI | Pro | -| **LSP & Debug** | Diagnostics, code actions, breakpoints, call stack, variables | Pro | -| **AI & Automation** | AI Chat, AI Agent, memory system, provider templates | Free | -| **Tasks & Timeline** | Task runner, timeline tracing, causal analysis, AI diagnostics | Free | -| **Sync / Cache** | Local↔Remote sync, path safety, operation history | Pro | -| **Settings & Account** | Theme, language, keyboard, authentication, subscriptions | Free | +| Domain | Capabilities | Availability | +|--------|--------------|--------------| +| Workspace | Local explorer, SSH remote explorer, saved SSH profiles, password/key authentication | Free | +| Editor | Multi-tab editing, clipboard, undo/redo, cursor tracking, outline and dock panels | Free | +| Terminal | Baseline terminal sessions, output search, command workflows | Free | +| Multi-terminal | Parallel terminal tabs and advanced terminal organization | Pro | +| Search | Remote content search with case-sensitive and regex options | Metered free; unlimited Pro | +| AI Chat | Provider configuration, current-file context, coding questions | Free | +| AI Agent | Multi-step automation with tool execution and safety layers | Metered free; unlimited Pro | +| Source Control | Diff review, Git write workflows, branches, stash, history, Git AI | Pro | +| LSP | Diagnostics, code actions, install/verification workflow | Pro | +| Debug | Breakpoints, call stack, variables, watch, output, expression evaluation | Pro | +| Tasks | Task creation and terminal-backed task execution | Free core; advanced batch/parallel Pro | +| Timeline | Trace viewing and event context | Free core; AI analysis Pro | +| Sync / Cache | Local project sync and remote project cache flows | Pro | +| Account | Sign-in, subscription verification, restore purchase flow | Free | ---- - -## Workspace & Connectivity - -### Core Workspace Features +## Workspace and connectivity -| Feature | Description | Technical Details | Availability | -|---------|-------------|-------------------|-------------| -| **Dual Workspace Modes** | Support for both local filesystem and remote SSH workspaces | Local: device storage access; SSH: secure remote connection | Free | -| **SSH Connection Profiles** | Save and manage multiple server configurations | Persistent storage via Hive, automatic last workspace restoration | Free | -| **Heartbeat Monitoring** | Continuous connection health checking | 30-second keepalive intervals, background/foreground awareness | Free | -| **Auto-Reconnection** | Automatic recovery from network failures | Stateful reconnection with terminal session restoration | Free | -| **App Lifecycle Awareness** | Smart connection management based on app state | Pauses monitoring in background, verifies on resume | Free | +NimoteCode starts with a workspace. You can open a local project or connect to a remote SSH project. SSH profiles support host, port, username, workspace root path, password authentication, key-file authentication, pasted-key authentication, and optional remembered credentials. -### File Operations +Use this when you need to inspect and change a real project without setting up a full remote desktop environment. -| Feature | Description | Technical Details | Availability | -|---------|-------------|-------------------|-------------| -| **File Explorer** | Tree-based navigation with editor integration | Local & remote (SFTP) filesystem providers | Free | -| **File Operations** | Create, move, rename, delete files and directories | Atomic operations with error handling | Free | -| **Editor Integration** | Seamless navigation between explorer and editor | File path tracking, quick open, recent files | Free | +## Editor ---- - -## Terminal & Command Execution +The editor supports tabbed file editing, cursor tracking, copy/cut/paste, undo/redo, current-file state, file caching, outline access, AI panel integration, terminal panel integration, and mobile programming keyboard controls. -### Terminal Capabilities +## Terminal -| Feature | Description | Technical Details | Availability | -|---------|-------------|-------------------|-------------| -| **Multi-Tab Terminal** | Concurrent terminal sessions | Independent channel management, session switching | Free | -| **Terminal Persistence** | Session restoration after reconnection | Working directory preservation, shell state restoration | Free | -| **Real-time Output** | Live streaming of command output | Pseudo-terminal emulation, ANSI color support | Free | -| **Output Search** | Fast search through terminal history | Keyword matching, incremental search | Free | -| **Terminal Output Parsing** | Automatic extraction of errors and warnings | Rust-based parser, error/warning detection, exit code analysis | Free | - ---- +The terminal is designed for command execution inside the active workspace. It supports command output, search, reconnection-aware session management, quick/custom commands, and advanced multi-terminal workflows with Pro. ## Source Control (Pro) -### Git Workflow - -| Feature | Description | Technical Details | Availability | -|---------|-------------|-------------------|-------------| -| **Change Management** | Staged/unstaged/conflicted changes view | File-level granularity, diff preview per file | Pro | -| **Commit & Sync** | Complete Git operations in-app | Commit, pull, push, fetch, rebase support | Pro | -| **Branch Management** | Branch creation, switching, deletion | Local and remote branch listing, checkout | Pro | -| **Stash Operations** | Stash and apply changes | Stash list, apply, drop, pop operations | Pro | -| **History & Diff** | Commit history and file diffs | Line-level diff display, blame annotation | Pro | - -### Git AI Integration - -| Feature | Description | Technical Details | Availability | -|---------|-------------|-------------------|-------------| -| **AI Commit Messages** | Generate high-quality commit messages | Diff analysis, semantic understanding, multiple suggestions | Pro | -| **Change Explanation** | AI-powered explanation of modifications | Context-aware analysis, impact assessment | Pro | -| **Risk Detection** | Identify potentially problematic changes | Pattern recognition, anti-pattern detection | Pro | - ---- - -## LSP & Debug (Pro) - -### Language Server Protocol - -| Feature | Description | Technical Details | Availability | -|---------|-------------|-------------------|-------------| -| **Diagnostics Panel** | Real-time error and warning display | Severity filtering (Error/Warning/Info/Hint), file grouping | Pro | -| **Code Actions** | Quick fixes and refactor suggestions | LSP codeAction provider, one-click application | Pro | -| **LSP Install Wizard** | Guided language server setup | Auto-detection, installation, verification flow | Pro | -| **Go to Definition** | Symbol navigation | LSP definition provider, peek support | Pro | -| **Reference Finding** | Find all references to a symbol | LSP references provider, usage listing | Pro | - -### Debugger - -| Feature | Description | Technical Details | Availability | -|---------|-------------|-------------------|-------------| -| **Runtime Controls** | Pause, continue, step operations | Step over, step into, step out, restart | Pro | -| **Breakpoints** | Line breakpoints with conditions | Breakpoint management, hit counting, conditional breakpoints | Pro | -| **Call Stack** | Stack trace navigation | Frame switching, async stack traces | Pro | -| **Variables Panel** | Inspect and modify variables | Scope grouping, value editing, watch expressions | Pro | -| **Watch Expressions** | Custom expression evaluation | Real-time updates, formatted output | Pro | -| **Debug Console** | REPL and expression evaluation | Command execution, output display | Pro | - ---- - -## AI & Automation - -### AI Chat & Agent - -| Feature | Description | Technical Details | Availability | -|---------|-------------|-------------------|-------------| -| **Dual AI Modes** | Chat for Q&A, Agent for automation | Intent-based routing, task complexity assessment | Free | -| **Provider Templates** | Pre-configured AI providers | OpenAI, Anthropic, custom OpenAI-compatible endpoints | Free | -| **Secure Credential Storage** | Safe API key management | Encrypted storage, keychain integration | Free | -| **Advanced Model Config** | Fine-grained model parameters | Temperature, max tokens, top-p, streaming options | Free | +Source Control brings Git workflows into the same app: -### Memory System +- Review staged, unstaged, and conflicted files. +- Inspect diffs and history. +- Commit changes. +- Pull, push, fetch, merge, and rebase. +- Manage branches and stash workflows. +- Use Git AI for commit and change-review assistance. -| Feature | Description | Technical Details | Availability | -|---------|-------------|-------------------|-------------| -| **Short-Term Memory** | Current session context | Message queue, max 100 messages, metadata tracking | Free | -| **Long-Term Memory** | Persistent knowledge storage | Memory item indexing, tag-based organization, max 1000 items | Free | -| **Smart Compression** | Multiple compression strategies | Summarize, sliding window, importance-based, hybrid modes | Free | -| **Token Budget Management** | Context window optimization | Token counting, budget allocation, auto-compression triggers | Free | -| **Similarity Retrieval** | Relevant memory search | Keyword matching, tag filtering, importance scoring | Free | +## AI Chat and Agent -### Agent Execution System +AI Chat is for direct coding help, explanations, and planning. AI Agent is for multi-step workflows that can involve tool execution. Free usage is metered for agent runs; Pro unlocks unlimited agent usage. -| Feature | Description | Technical Details | Availability | -|---------|-------------|-------------------|-------------| -| **Tool Registry** | Built-in and user-defined tools | File operations, terminal commands, Git operations, custom tools | Free | -| **Secure Tool Execution** | Validation and safety checks | Path validation, command whitelisting, concurrent locking | Free | -| **Error Handling** | Robust error recovery | Retry policies, fallback mechanisms, self-correction | Free | -| **Observability** | Execution tracing and logging | Step-by-step visibility, performance metrics, audit trail | Free | -| **Reflection Engine** | Self-assessment and improvement | Outcome evaluation, strategy adaptation, learning from mistakes | Free | +AI provider configuration is flexible, including custom compatible endpoints where configured in the app. -### Project Indexing +## LSP and Debug (Pro) -| Feature | Description | Technical Details | Availability | -|---------|-------------|-------------------|-------------| -| **Workspace Understanding** | Project structure analysis | File type detection, dependency graph, build system identification | Free | -| **User Tools** | Custom workflow automation | Tool templates, parameter configuration, reuse across sessions | Free | -| **Chat History** | Persistent conversation storage | Workspace-scoped history, searchable archives | Free | +LSP adds diagnostics and code actions for supported language-server setups. Debug adds DAP-style runtime tools such as breakpoints, variables, watch expressions, call stack, output, and expression evaluation. ---- - -## Tasks & Timeline - -### Tasks Panel +These are Pro workflows because they turn the mobile workspace into a deeper diagnostic environment. -| Feature | Description | Technical Details | Availability | -|---------|-------------|-------------------|-------------| -| **Task Grouping** | Organized task collections | Folder-based organization, drag & drop reordering | Free | -| **Remote Execution** | Run commands on SSH servers | Working directory selection, environment variables | Free | -| **State Tracking** | Real-time task status | Pending/Running/Success/Failed states, progress indication | Free | -| **Output Capture** | Command output streaming | Live updates, log retention, error highlighting | Free | +## Search -### Timeline Panel +Remote content search supports keyword search, case sensitivity, regex, and opening results in the editor. Free usage is metered; Pro unlocks unrestricted remote search. -| Feature | Description | Technical Details | Availability | -|---------|-------------|-------------------|-------------| -| **Event Ingestion** | Comprehensive event capture | Debug, LSP, terminal, Git, AI, user edit events | Free | -| **Trace Building** | Causal event chaining | Event correlation, timeline construction, session scoping | Free | -| **Filtering** | Source and severity filters | Multi-select filtering, search, temporal ranges | Free | -| **Trace Persistence** | Automatic saving to .nimote | JSON storage, auto-save interval, max 50 traces | Free | -| **Export Capabilities** | Trace sharing and handoffs | JSON export, summary generation, incident reporting | Free | +## Tasks -### Timeline AI +Tasks let you define repeated workspace commands and execute them through terminal-backed flows. Advanced filtered and parallel task execution is Pro-gated. -| Feature | Description | Technical Details | Availability | -|---------|-------------|-------------------|-------------| -| **Root Cause Analysis** | AI-powered problem diagnosis | Pattern recognition, causal inference, error correlation | Free | -| **Fix Suggestions** | Actionable recommendations | Context-aware suggestions, code snippets, step-by-step guidance | Free | -| **Auto-Analysis** | Triggered on errors | Debounced analysis, background processing, status notifications | Free | +## Timeline ---- +Timeline captures and displays development context. Timeline AI actions can run root-cause analysis and fix suggestions for traces when Pro access is available. ## Sync / Cache (Pro) -| Feature | Description | Technical Details | Availability | -|---------|-------------|-------------------|-------------| -| **Bidirectional Sync** | Local ↔ Remote transfer | Direction selection, file comparison, conflict detection | Pro | -| **Path Safety** | Target path constraints | Whitelist validation, parent directory checks, dry-run preview | Pro | -| **Operation History** | Sync activity log | Timestamped records, status tracking, retry capability | Pro | -| **Selective Sync** | File and folder selection | Include/exclude patterns, size filters, modification time | Pro | - ---- - -## Settings & Account - -### Application Settings - -| Feature | Description | Technical Details | Availability | -|---------|-------------|-------------------|-------------| -| **Theme System** | Light/Dark/System themes | Material Design 3, dynamic color, OLED optimization | Free | -| **Multi-Language** | 6+ language support | English, 中文, 日本語, 한국어, Русский, Español | Free | -| **Editor Typography** | Font and spacing controls | Font family, size, line height, word wrap | Free | -| **Keyboard Behavior** | Input method optimization | Soft keyboard tuning, hardware keyboard support, key mapping | Free | - -### Account & Subscription - -| Feature | Description | Technical Details | Availability | -|---------|-------------|-------------------|-------------| -| **Authentication** | Multiple sign-in methods | Email/password, Google Sign-In, Apple Sign-In | Free | -| **Anonymous Upgrade** | Guest to account conversion | Data migration, seamless transition | Free | -| **Entitlement Check** | Pro status verification | Subscription validation, trial tracking, grace period | Free | -| **Purchase Restore** | Subscription recovery | App Store/Google Play integration, receipt validation | Free | - ---- - -## Pro Gating & Limitations - -### Current Pro-Locked Features - -| Panel | Status | Notes | -|-------|--------|-------| -| `sourceControl` | 🔒 Pro | Git workflow, diffs, commits, Git AI | -| `lsp` | 🔒 Pro | Diagnostics, code actions, language servers | -| `debug` | 🔒 Pro | Breakpoints, call stack, variables, watch | -| `syncCache` | 🔒 Pro | Local↔Remote sync, transfer operations | - -### Mode Restrictions - -| Feature | Local Mode | SSH Mode | -|---------|-----------|----------| -| File Explorer | ✅ | ✅ | -| Terminal | ✅ | ✅ | -| Source Control | ✅ (Pro) | ✅ (Pro) | -| LSP | ✅ (Pro) | ✅ (Pro) | -| Debug | ❌ | ✅ (Pro) | -| Tasks | ❌ | ✅ | -| Timeline | ✅ | ✅ | -| AI Chat/Agent | ✅ | ✅ | -| Sync/Cache | ✅ (Pro) | ✅ (Pro) | - -### Data Persistence - -| Data Type | Location | Scope | -|-----------|----------|-------| -| Workspace Metadata | `.nimote/index.json` | Per workspace | -| Chat Histories | `.nimote/chat_histories/` | Per workspace | -| Agent Histories | `.nimote/agent_histories/` | Per workspace | -| Timeline Traces | `.nimote/timeline/` | Per workspace | -| SSH Profiles | App Storage | Global | -| AI Config | Secure Storage | Global | - ---- +Sync/cache workflows help move project content between local and remote contexts with workspace-root path checks and operation history. -## Explore More +## Explore next -- [Quick Start Guide](/docs/quick-start) -- [SSH Workspace Setup](/docs/ssh) -- [Source Control Workflow](/docs/source-control) +- [Quick Start](/docs/quick-start) +- [Pro](/pro) +- [SSH Workspace](/docs/ssh) - [AI Assistant](/docs/ai) -- [Timeline Panel](/docs/timeline) +- [Source Control](/docs/source-control) +- [Security and Safety](/docs/security) diff --git a/docs/index.md b/docs/index.md index ce22888..c331962 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,7 +1,8 @@ --- layout: home -title: NimoteCode - Code anywhere. Ship everywhere. +title: NimoteCode - Mobile IDE for iPhone and Android titleTemplate: false +description: NimoteCode is a mobile-first developer workspace with code editing, SSH terminal, Git, AI assistant, and workspace sync. hero: name: "" @@ -10,245 +11,138 @@ hero: actions: [] --- +
+
+
+

For iPhone and Android

+
+ + NimoteCode +
+

Not a code editor.
A real development workspace.

+

Run SSH workflows, edit production code, review Git, and work with AI in one mobile-first IDE.

+
+ Get on Google Play + App Store Soon + View Quick Start +
+
+ + Scroll to Demo +
+
+ +
+
+

Product Demo

+

See a real mobile hotfix workflow.

+

SSH access, code edits, terminal execution, Git review, and AI help in one continuous workspace.

+
+ +
+
-
- - NimoteCode +
+

Core Workflow

+

Built for real production work from mobile.

+

The core workflow stays tight: connect, inspect, edit, verify, and ship.

-

Code anywhere.
Ship everywhere.

-

The professional mobile IDE. Full SSH, Git, AI, and Debug—optimized for iPhone, iPad, and Android.

-
- Download - Documentation + +
+
+

AI Assistant

+

Reason through changes with full workspace context.

+

Ask questions, trace issues, and move through multi-step fixes without leaving the app.

+
+
+

Terminal

+

Work in live environments

+

SSH into servers and dev machines, then run the commands that matter.

+
+
+

Git

+

Review and commit cleanly

+

Keep diffs, staging, and version control next to the code you are changing.

+
+
+

Workspace Sync

+

Pick up where you left off

+

Keep project state and working context moving across mobile moments.

+
-
-

Features

-

Everything you need to ship from your phone.

-
-
-
- 🖥️ - SSH Workspace -
-

Connect to real servers with auto-reconnection and heartbeat monitoring.

-
-
-
- 💻 - Terminal -
-

Single tab terminal with session persistence.

-
-
-
- 🔀 - Git Source Control - Pro -
-

Full Git workflow with diffs, commits, branches, and Git AI.

-
-
-
- 🔧 - LSP & Debug - Pro -
-

Professional diagnostics, code actions, breakpoints, call stack, and variables.

-
-
-
- 💬 - AI Chat -
-

Conversational AI assistance for code help and suggestions.

-
-
-
- 🤖 - AI Agent - Pro -
-

Autonomous AI agent with memory system for automated tasks.

-
-
-
- 📊 - Timeline -
-

Causal tracing and AI root-cause analysis for diagnostics.

-
-
-
- 🔄 - Sync / Cache - Pro -
-

Bidirectional sync between local and remote with path safety.

-
-
-
- - Tasks Panel -
-

Run grouped remote tasks with state tracking and output capture.

-
-
-
- 📑 - Multi-Terminal - Pro -
-

Multiple terminal tabs for parallel workflows.

-
-
-
- 🔍 - Global File Search -
-

Quickly search and locate files in your remote workspace.

-
-
-
- 📝 - File Content Search -
-

Search for keywords within file contents.

-
-
-
- 📁 - Git File & Line History - Pro -
-

View complete commit history for files and individual lines.

-
-
-
- 📋 - Code Outline View -
-

Quickly navigate and move through code structure.

-
-
-
- 📱 - iPad Optimized -
-

Multi-window support, trackpad, and desktop-class experience.

-
+
+
+

Not a code editor.

+

A real development workspace.

-
-

Pricing

-

Start free, upgrade when you need more power.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FeatureFreePro
SSH Workspace & Auto-Reconnection
Terminal Session Persistence
AI Chat
Timeline & AI Root-Cause Analysis
Tasks Panel & Remote Execution
iPad Optimization
Global File Search
File Content Search
Code Outline View
Git Source Control (Full Workflow & Diffs)
Git AI (Commit Messages, Risk Detection)
Git File & Line History
Multi-Terminal Support
LSP Diagnostics & Code Actions
Full Debugger (Breakpoints, Variables)
AI Agent (Autonomous Mode)
Sync / Cache (Local ↔ Remote)
+
+
+

Use Cases

+

Made for urgent, practical workflows.

+

The product makes immediate sense when you need to act, not just browse.

+
+ +
+ + + + +
-

Ready to code anywhere?

-

Download NimoteCode today and experience professional development on your iPhone, iPad, and Android.

+

Get Started

+

Carry a real development workspace everywhere.

+

Built for developers and ops engineers who need to inspect, fix, and ship from mobile.

diff --git a/docs/introduction.md b/docs/introduction.md index cbd0a81..e30c0ed 100644 --- a/docs/introduction.md +++ b/docs/introduction.md @@ -1,37 +1,49 @@ --- title: Introduction | NimoteCode +description: Learn how NimoteCode combines SSH, terminal, Git, AI, LSP, debugging, tasks, and timeline workflows into a mobile-first IDE. --- -# Introduction +# NimoteCode Introduction -NimoteCode is a mobile-first IDE that lets you develop, debug, and ship from your phone or tablet. +**AI-Powered Mobile SSH IDE for Real Development Workflows** + +NimoteCode is a mobile SSH IDE for developers and ops engineers. It lets you do real development, debugging, and delivery work from your phone or tablet. + +It is not an editor. It is a complete **remote development + AI-driven engineering workspace**. ## Why Teams Choose NimoteCode -- One workspace for coding, terminal, source control, AI, and troubleshooting -- Built for real SSH server workflows with auto-reconnection and terminal persistence -- Fast issue triage with LSP diagnostics, debug tools, and AI-powered timeline analysis with causal tracing -- Productive on mobile with keyboard preferences, editor typography, and focused panels +- One workspace that combines **Code Editor / Terminal / Git / AI / Debug** +- Built for real **SSH remote development workflows** in production environments +- Deeply integrated **LSP, Debug, Tasks, and Timeline** tools for faster issue resolution +- Built for mobile productivity with multi-panel workflows, keyboard handling, and tablet-friendly layouts + +## AI-Driven Development Experience + +- AI Code Explain: understand complex code quickly +- AI Refactor: improve and restructure code automatically +- AI Fix (LSP): use diagnostics to repair issues +- AI Terminal: understand and generate shell commands +- AI Timeline Analysis: trace code changes and problem origins +- AI Agent: execute multi-file development and ops tasks ## What You Can Do -- Connect local or remote workspaces and edit project files instantly with heartbeat monitoring -- Run build/test/deploy commands in multi-tab terminal sessions with full persistence across reconnections -- Commit, sync, branch, stash, diff, and review changes in Source Control with Git AI assistance -- Use AI Chat and AI Agent with memory system (short/long-term memory, intelligent compression) to explain, refactor, and automate repetitive tasks -- Diagnose problems with LSP, Debug, Tasks, and Timeline panels with causal tracing and AI-powered root-cause analysis -- Sync project content between local and remote workspaces (Pro) -- Standardize recurring operations with Tasks panel +- SSH into remote servers or local workspaces and develop directly +- Run build / test / deploy commands in multi-tab terminal sessions +- Use Git for commits, branching, code review, and sync +- Handle daily development and emergency hotfixes from mobile +- Automate repetitive engineering and troubleshooting tasks with AI -## Built for Real Delivery +## Built for Real Production Scenarios -NimoteCode is designed for practical delivery scenarios: +NimoteCode is designed for real engineering environments, not learning or toy workflows: -1. Remote hotfix while away from laptop with stable SSH connections -2. On-call incident triage with logs + timeline traces and causal analysis -3. Daily commit workflow with in-app source control and Git AI -4. AI-assisted coding and repetitive workflow automation with memory persistence -5. Multi-terminal sessions that survive network interruptions +- Emergency hotfixes for live incidents +- Fast on-call troubleshooting +- Remote development and code submission from mobile +- Automation and script execution for operations +- Debugging distributed systems and production issues ## Explore Next diff --git a/docs/ja/download.md b/docs/ja/download.md index 21cd8da..a4a8b43 100644 --- a/docs/ja/download.md +++ b/docs/ja/download.md @@ -8,11 +8,11 @@ NimoteCodeはiOSとAndroidで利用可能です。 ## App Store -[![Download on the App Store](https://developer.apple.com/assets/elements/badges/download-on-the-app-store.svg)](https://apps.apple.com/app/nimotecode) +Download on the App Store ## Google Play -[![Get it on Google Play](https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png)](https://play.google.com/store/apps/details?id=com.nimotecode) +Get it on Google Play ## システム要件 diff --git a/docs/ja/index.md b/docs/ja/index.md index a075575..95488a4 100644 --- a/docs/ja/index.md +++ b/docs/ja/index.md @@ -1,54 +1,148 @@ --- layout: home -title: NimoteCode - 携帯電話から本番修正をリリース +title: NimoteCode - iPhone と Android のモバイル IDE titleTemplate: false +description: NimoteCode はコード編集、SSH 端末、Git、AI コーディング支援、ワークスペース同期を備えたモバイル開発環境です。 hero: - name: NimoteCode - text: "携帯電話から本番修正をリリース" - tagline: "真のデリバリーのためのモバイルファーストIDE:自動再接続付きSSHワークスペース、ターミナル永続化、Source ControlとGit AI、LSP/Debug、メモリシステム付きAI Agent、因果トレース付きTimeline診断。" - actions: - - theme: brand - text: 3分クイックスタート - link: /ja/docs/quick-start - - theme: alt - text: 機能マップ - link: /ja/features - - theme: alt - text: フルドキュメント - link: /ja/docs - -features: - - title: 3分でオンボーディング - details: "初回起動から最初のコミットまで数分で完了。ガイド付きのローカルまたはSSHワークフロー。" - - - title: 自動再接続付きリアルSSHデリバリー - details: "実際のサーバーに接続し、リモートコードを編集し、ターミナルコマンドを実行。ハートビート監視とネットワーク切断時の自動再接続機能付き。" - - - title: ターミナルセッション永続化 - details: "マルチタブターミナルセッション、再接続後に自動復元 - ネットワーク障害時にコンテキストを失いません。" + name: "" + text: "" + tagline: "" + actions: [] +--- - - title: Source Control + Git AI - details: "差分をレビューし、クリーンなコミットをステージングし、ブランチを同期し、Git AIを使用してメッセージ品質を向上させリスクを軽減。" +
+
+
+

iPhone と Android に対応

+
+ + NimoteCode +
+

ただのコードエディタではない。
本物の開発ワークスペースです。

+

SSH ワークフロー、実コード編集、Git レビュー、AI 支援をひとつのモバイル優先 IDE に統合します。

+
+ Google Play + App Store 近日公開 + クイックスタート +
+
+ + デモを見る +
+
- - title: LSP + Debug(Pro) - details: "診断とコードアクションで早期に問題を発見し、ブレークポイント、変数、ウォッチ、ランタイムコントロールでデバッグ。" +
+
+

製品デモ

+

実際のモバイル hotfix フローを見る。

+

SSH 接続、コード修正、端末実行、Git レビュー、AI 支援までをひとつのワークスペースで進められます。

+
+ +
- - title: メモリシステム付きAIチャット + AIエージェント - details: "好みのAIプロバイダーを使用して、コード分析、ガイド付き修正、ワークスペース内で直接のマルチステップ自動化。短期/長期メモリとインテリジェント圧縮に対応。" +
+
+

コアワークフロー

+

本番対応の仕事をモバイルから進めるための設計。

+

接続、確認、修正、検証、出荷までを無駄なくつなぎます。

+
- - title: 因果トレース付きTimeline根本原因分析 - details: "イベントを実用可能なトレースに変換。重大度/ソースフィルター、因果イベントチェーン、AI駆動の根本原因分析、提案される修正。" +
+
+

AI Assistant

+

ワークスペース文脈を保ったまま AI と変更を進める。

+

コード説明、原因調査、複数ステップの修正をアプリ内で完結できます。

+
+
+

Terminal

+

実環境で作業する

+

サーバーや開発マシンに SSH 接続し、必要なコマンドをその場で実行します。

+
+
+

Git

+

差分確認からコミットまで明快

+

diff、staging、バージョン管理をコードの近くで処理できます。

+
+
+

Workspace Sync

+

途中の作業を持ち運ぶ

+

プロジェクト状態と作業文脈をモバイルの流れに合わせて維持します。

+
+
+
- - title: 長時間のモバイルセッション向けに設計 - details: "言語、テーマ、エディターの文字組版、キーボード動作を微調整して、快適で高集中力のコーディングを実現。" +
+
+

ただのコードエディタではない。

+

本物の開発ワークスペースです。

+
+
- - title: Sync / Cache(Pro) - details: "方向制御、ターゲットパスの安全性、操作履歴を備えたローカルとリモートワークスペース間のプロジェクトコンテンツの移動。" +
+
+

ユースケース

+

緊急性が高く、実務に近いフローのために作られています。

+

ただ見るためではなく、すぐ動く必要がある場面で価値が伝わります。

+
- - title: Tasksパネル - details: "状態追跡付きでグループ化されたリモートタスクを実行し、チームの反復操作を標準化。" +
+ + + + +
+
- - title: 成果から始める - details: "目標からスタート:サーバーに接続、バグをより速く修正、繰り返しの作業を自動化、またはモバイルホットフィックスをリリース。" ---- +
+
+

はじめる

+

本物の開発ワークスペースを持ち歩く。

+

開発者や運用担当が、モバイルから確認、修正、出荷まで進めるための設計です。

+ +
+
diff --git a/docs/ja/terms.md b/docs/ja/terms.md index 4e6e898..7f5d0bf 100644 --- a/docs/ja/terms.md +++ b/docs/ja/terms.md @@ -4,39 +4,118 @@ title: 利用規約 | NimoteCode # 利用規約 -最終更新日: 2024年 +**有効日:** 2026年4月16日 -## 契約条件 +本利用規約(以下「本規約」)は、NimoteCode(以下「アプリケーション」、「当社」、「当方」)の利用およびアクセスに適用されます。 -NimoteCodeをダウンロードまたは使用することにより、お客様はこれらの利用規約に同意したものとみなされます。 +NimoteCodeをインストールまたは使用することにより、あなたは本規約および以下の第三者プラットフォーム規約に同意したものとみなされます: -## アカウント +- Apple Media Services利用規約およびApple標準EULA + https://www.apple.com/legal/internet-services/itunes/dev/stdeula/ -- アカウント情報の機密性を維持する責任があります -- アカウントの下で発生するすべての活動に責任があります -- 当社は、いつでもアカウントを終了する権利を留保します +- Google Play利用規約 + https://play.google.com/about/play-terms/ -## サブスクリプション +本規約に同意しない場合は、本アプリケーションを使用しないでください。 -- Pro機能にはサブスクリプションが必要です -- 料金は、サブスクリプションプランに記載されています -- 現在の期間の終了前にキャンセルしない限り、自動的に更新されます +--- + +## 1. サービス概要 + +NimoteCodeはモバイル統合開発環境(IDE)であり、ローカルおよびリモートSSH開発ワークフロー、コード編集、ターミナルアクセス、Gitツール、AI支援機能、タスク自動化、デバッグ機能を提供します。 + +## 2. 利用資格 + +本アプリケーションを使用するには、13歳以上(または居住国の法定最低年齢以上)である必要があります。 + +あなたは、アカウント、デバイス、認証情報の安全性およびアカウント下で行われるすべての行為について責任を負います。 + +## 3. サブスクリプション、課金および更新 + +一部の機能には有料サブスクリプション(例:NimoteCode Pro)が必要です。 + +- すべての支払いはApple App StoreまたはGoogle Playによって処理されます。 +- サブスクリプションは、現在の課金期間終了の24時間前までにキャンセルされない限り自動更新されます。 +- 更新時の24時間以内に、当時の料金で課金されます。 +- サブスクリプションの管理またはキャンセルはApple IDまたはGoogle Play設定で行えます。 +- 返金はAppleまたはGoogleのポリシーに従って処理されます。 +- 「購入を復元」機能で購入内容を復元できます。 +- 価格は地域により異なる場合があります。 + +## 4. リモートシステムとユーザー責任 + +以下については、すべてユーザーの責任となります: + +- リモートサーバーおよびSSH接続 +- アプリケーションを通じて実行されるコマンド +- 認証情報や秘密鍵の管理 + +当社はSSH認証情報をサーバーに保存しません。 + +## 5. AI機能(BYOキー方式) + +NimoteCodeはサードパーティAIプロバイダーを利用する機能を提供する場合があります。 + +- APIキーはユーザー自身が提供する必要があります(BYOキー方式) +- 当社はAIモデル、推論サービス、または利用クレジットを提供しません +- すべてのAPI利用料金はユーザーの負担となります +- AI出力は誤りを含む可能性があり、本番環境の唯一の情報源として使用してはいけません + +## 6. 禁止事項 + +以下の行為は禁止されています: + +- 無許可でのシステムアクセス +- 違法、有害、または不正な利用 +- アプリケーションのリバースエンジニアリングや妨害 +- システムリソースやAPIの不正利用 + +## 7. 第三者サービス + +本アプリはGitプロバイダ、SSHサーバー、AIプロバイダーなどの第三者サービスと連携する場合があります。 + +これらの第三者サービスの可用性、品質、内容について当社は責任を負いません。 + +## 8. プライバシー + +NimoteCodeの利用には以下のプライバシーポリシーが適用されます: + +https://nimotecode.com/privacy + +## 9. 利用停止および終了 + +当社は以下の目的でアプリの利用を停止または終了する場合があります: + +- セキュリティ保護 +- 法的遵守 +- 不正利用防止 +- システム安定性維持 + +## 10. 保証の否認 + +本アプリは「現状有姿」および「提供可能な範囲」で提供されます。 + +中断のない動作、エラーの不存在、完全なデータ正確性は保証されません。 + +## 11. 責任制限 + +適用法が許す最大限の範囲で、当社は間接的、偶発的、または結果的損害について責任を負いません。 + +これにはデータ損失、システム損害、サービス中断が含まれます。 -## 禁止行為 +## 12. 輸出規制 -お客様は、以下を行わないことに同意します: -- サービスを不正または違法な目的で使用する -- サービスのセキュリティを妨害または侵害する -- リバースエンジニアリングまたはソースコードの抽出を試みる +ユーザーは適用されるすべての輸出管理法および規制を遵守することに同意します。 -##免責事項 +## 13. 準拠法 -サービスは「現状有姿」で提供されます。当社は、特定の目的への適合性についていかなる保証も行いません。 +本規約は中華人民共和国の法律に準拠し、抵触法の原則は適用されません。 -## 責任制限 +## 14. 規約の変更 -いかなる場合も、当社は間接的、偶発的、特別、結果的、または懲罰的損害賠償について責任を負いません。 +当社は本規約を随時更新する場合があります。アプリの継続利用は変更後の規約への同意とみなされます。 -## 変更 +## 15. お問い合わせ -当社は、いつでもこれらの規約を変更する権利を留保します。変更後もサービスを使用し続けることにより、お客様は新しい規約に同意したものとみなされます。 +Email: nimotecode@gmail.com +GitHub: https://github.com/nimotecode/nimote_issues/issues \ No newline at end of file diff --git a/docs/ko/download.md b/docs/ko/download.md index 7016200..7b63600 100644 --- a/docs/ko/download.md +++ b/docs/ko/download.md @@ -8,11 +8,11 @@ NimoteCode는 iOS와 Android에서 사용 가능합니다. ## App Store -[![App Store에서 다운로드](https://developer.apple.com/assets/elements/badges/download-on-the-app-store.svg)](https://apps.apple.com/app/nimotecode) +App Store에서 다운로드 ## Google Play -[![Google Play에서 다운로드](https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png)](https://play.google.com/store/apps/details?id=com.nimotecode) +Google Play에서 다운로드 ## 시스템 요구 사항 diff --git a/docs/ko/index.md b/docs/ko/index.md index bb437ea..585b613 100644 --- a/docs/ko/index.md +++ b/docs/ko/index.md @@ -1,54 +1,148 @@ --- layout: home -title: NimoteCode - 휴대폰에서 프로덕션 수정 배포 +title: NimoteCode - iPhone과 Android를 위한 모바일 IDE titleTemplate: false +description: NimoteCode는 코드 편집기, SSH 터미널, Git, AI 코딩 도우미, 워크스페이스 동기화를 갖춘 모바일 개발 환경입니다. hero: - name: NimoteCode - text: "휴대폰에서 프로덕션 수정 배포" - tagline: "실제 배포를 위한 모바일 우선 IDE: 자동 재연결이 가능한 SSH 워크스페이스, 터미널 영구화, Source Control과 Git AI, LSP/Debug, 메모리 시스템이 있는 AI Agent, 인과 추적이 있는 Timeline 진단." - actions: - - theme: brand - text: 3분 퀵 스타트 - link: /ko/docs/quick-start - - theme: alt - text: 기능 맵 - link: /ko/features - - theme: alt - text: 전체 문서 - link: /ko/docs - -features: - - title: 3분 온보딩 - details: "최초 실행에서 첫 번째 커밋까지 몇 분 만에 완료. 가이드가 포함된 로컬 또는 SSH 워크플로우." - - - title: 자동 재연결이 있는 실제 SSH 배포 - details: "실제 서버에 연결하고, 원격 코드를 편집하고, 터미널 명령을 실행합니다. 하트비트 모니터링과 네트워크 끊김 시 자동 재연결 기능이 있습니다." - - - title: 터미널 세션 영구화 - details: "멀티탭 터미널 세션, 재연결 후 자동 복원 - 네트워크 장애 시 컨텍스트를 잃지 않습니다." + name: "" + text: "" + tagline: "" + actions: [] +--- - - title: Source Control + Git AI - details: "차이점을 검토하고, 깔끔한 커밋을 스테이징하고, 브랜치를 동기화하고, Git AI를 사용하여 메시지 품질을 향상시키고 위험을 줄입니다." +
+
+
+

iPhone 및 Android 지원

+
+ + NimoteCode +
+

단순한 코드 편집기가 아닙니다.
실제 개발 워크스페이스입니다.

+

SSH 워크플로, 실코드 편집, Git 검토, AI 보조를 하나의 모바일 우선 IDE로 묶었습니다.

+
+ Google Play + App Store 출시 예정 + 빠른 시작 +
+
+ + 데모 보기 +
+
- - title: LSP + Debug(Pro) - details: "진단 및 코드 작업으로 문제를 조기에 발견하고, 중단점, 변수, 감시, 런타임 제어로 디버그합니다." +
+
+

제품 데모

+

실제 모바일 핫픽스 흐름을 확인하세요.

+

SSH 접속, 코드 수정, 터미널 실행, Git 리뷰, AI 지원이 하나의 워크스페이스로 이어집니다.

+
+ +
- - title: 메모리 시스템이 있는 AI 채팅 + AI 에이전트 - details: "선호하는 AI 공급자를 사용하여 코드 분석, 가이드 수정, 워크스페이스에서 직접 다단계 자동화를 수행합니다. 단기/장기 메모리와 지능형 압축을 지원합니다." +
+
+

핵심 워크플로

+

모바일에서 실제 운영 작업을 처리하도록 설계했습니다.

+

핵심 흐름은 단순합니다. 연결하고, 확인하고, 수정하고, 검증하고, 배포합니다.

+
- - title: 인과 추적이 있는 Timeline 근본 원인 분석 - details: "이벤트를 실행 가능한 추적으로 변환합니다. 심각도/소스 필터, 인과 이벤트 체인, AI 기반 근본 원인 분석, 제안된 수정 사항." +
+
+

AI Assistant

+

전체 워크스페이스 문맥 안에서 AI와 함께 변경합니다.

+

코드 설명, 문제 추적, 다단계 수정까지 앱을 벗어나지 않고 진행할 수 있습니다.

+
+
+

Terminal

+

실환경에서 작업

+

서버와 개발 머신에 SSH 접속해 필요한 명령을 바로 실행합니다.

+
+
+

Git

+

명확하게 검토하고 커밋

+

diff, staging, 버전 관리를 수정 중인 코드 옆에서 처리합니다.

+
+
+

Workspace Sync

+

작업을 이어서 시작

+

프로젝트 상태와 현재 문맥을 모바일 상황 전환 속에서도 유지합니다.

+
+
+
- - title: 긴 모바일 세션을 위해 설계 - details: "언어, 테마, 편집기 조판, 키보드 동작을 미세 조정하여 편안하고 집중력 높은 코딩을 실현합니다." +
+
+

단순한 코드 편집기가 아닙니다.

+

실제 개발 워크스페이스입니다.

+
+
- - title: Sync / Cache(Pro) - details: "방향 제어, 대상 경로 안전성, 작업 기록을 갖춘 로컬과 원격 워크스페이스 간의 프로젝트 콘텐츠 이동." +
+
+

사용 사례

+

긴급하고 실무적인 흐름을 위해 만들어졌습니다.

+

코드를 보기만 하는 것이 아니라 바로 행동해야 할 때 제품 가치가 분명해집니다.

+
- - title: Tasks 패널 - details: "상태 추적이 있는 그룹화된 원격 작업을 실행하여 팀의 반복 작업을 표준화합니다." +
+ + + + +
+
- - title: 결과로 시작 - details: "목표부터 시작: 서버에 연결, 버그를 더 빨리 수정, 반복 작업 자동화, 또는 모바일 핫픽스 배포." ---- +
+
+

시작하기

+

실제 개발 워크스페이스를 어디서나 들고 다니세요.

+

모바일에서 확인, 수정, 배포까지 처리해야 하는 개발자와 운영 엔지니어를 위한 제품입니다.

+ +
+
diff --git a/docs/ko/terms.md b/docs/ko/terms.md index d4f29b0..195cb06 100644 --- a/docs/ko/terms.md +++ b/docs/ko/terms.md @@ -2,41 +2,118 @@ title: 서비스 약관 | NimoteCode --- -# 이용 약관 +# 서비스 약관 -최종 업데이트: 2024년 +**시행일:** 2026년 4월 16일 -## 계약 조건 +본 이용약관(이하 “약관”)은 NimoteCode(이하 “애플리케이션”, “당사”)의 이용에 적용됩니다. -NimoteCode를 다운로드하거나 사용함으로써, 귀하는 이 이용 약관에 동의한 것으로 간주됩니다. +NimoteCode를 설치하거나 사용하는 경우, 본 약관 및 다음 제3자 플랫폼 약관에 동의하는 것으로 간주됩니다: -## 계정 +- Apple Media Services 약관 및 Apple 표준 EULA + https://www.apple.com/legal/internet-services/itunes/dev/stdeula/ -- 계정 정보의 기밀성을 유지할 책임이 있습니다 -- 계정 하에서 발생하는 모든 활동에 책임이 있습니다 -- 당사는 언제든지 계정을 종료할 권리를 보유합니다 +- Google Play 이용약관 + https://play.google.com/about/play-terms/ -## 구독 +본 약관에 동의하지 않는 경우 애플리케이션을 사용하지 마십시오. -- Pro 기능에는 구독이 필요합니다 -- 요금은 구독 플랜에 기재되어 있습니다 -- 현재 기간 종료 전에 취소하지 않는 한 자동으로 갱신됩니다 +--- + +## 1. 서비스 설명 + +NimoteCode는 모바일 통합 개발 환경(IDE)으로, 로컬 및 원격 SSH 개발 워크플로우, 코드 편집, 터미널 접근, Git 도구, AI 보조 기능, 작업 자동화 및 디버깅 기능을 제공합니다. + +## 2. 이용 자격 + +본 애플리케이션을 사용하려면 만 13세 이상(또는 해당 국가의 법적 최소 연령 이상)이어야 합니다. + +사용자는 계정, 기기 및 인증 정보의 보안을 유지할 책임이 있으며, 계정에서 발생하는 모든 활동에 대해 책임을 집니다. + +## 3. 구독, 결제 및 갱신 + +일부 기능은 유료 구독(NimoteCode Pro 등)이 필요합니다. + +- 모든 결제는 Apple App Store 또는 Google Play를 통해 처리됩니다. +- 현재 결제 기간 종료 24시간 전까지 취소하지 않으면 자동으로 갱신됩니다. +- 갱신 시점 24시간 이내에 현재 가격으로 청구됩니다. +- 구독은 Apple ID 또는 Google Play 설정에서 관리 및 취소할 수 있습니다. +- 환불은 각 플랫폼 정책에 따릅니다. +- “구매 복원” 기능을 통해 복원이 가능합니다. +- 가격은 지역에 따라 다를 수 있습니다. + +## 4. 원격 시스템 및 사용자 책임 + +사용자는 다음에 대한 전적인 책임을 집니다: + +- SSH 및 원격 서버 연결 +- 애플리케이션을 통해 실행되는 명령 +- 인증 정보 및 키 관리 + +당사는 SSH 자격 증명을 서버에 저장하지 않습니다. + +## 5. AI 기능 (BYO Key 방식) + +NimoteCode는 외부 AI 제공업체를 사용할 수 있습니다. + +- 사용자는 API 키를 직접 제공해야 합니다 (BYO Key) +- 당사는 AI 모델이나 추론 서비스를 제공하지 않습니다 +- 모든 API 비용은 사용자 부담입니다 +- AI 결과는 오류를 포함할 수 있으며, 생산 환경의 단독 근거로 사용해서는 안 됩니다 + +## 6. 금지 행위 + +다음 행위는 금지됩니다: + +- 무단 시스템 접근 +- 불법 또는 악의적 사용 +- 리버스 엔지니어링 및 서비스 방해 +- API 및 시스템 자원 남용 + +## 7. 제3자 서비스 + +Git, SSH, AI 제공업체 등 제3자 서비스와 연동될 수 있습니다. + +당사는 제3자 서비스의 품질, 가용성 및 콘텐츠에 대해 책임지지 않습니다. + +## 8. 개인정보 + +https://nimotecode.com/privacy + +## 9. 서비스 중단 및 종료 + +다음 사유로 서비스 접근을 제한할 수 있습니다: + +- 보안 문제 +- 법적 요구사항 +- 악용 방지 +- 시스템 안정성 + +## 10. 보증 부인 + +본 서비스는 “있는 그대로(AS IS)” 제공됩니다. + +무중단 운영, 오류 없음, 데이터 정확성을 보장하지 않습니다. + +## 11. 책임 제한 + +법이 허용하는 최대 범위 내에서 간접적 손해에 대해 책임을 지지 않습니다. + +데이터 손실, 시스템 장애 등이 포함됩니다. -## 금지 행위 +## 12. 수출 규제 -귀하는 다음을 하지 않을 것에 동의합니다: -- 서비스를 불법 또는 부정한 목적으로 사용 -- 서비스의 보안을 방해하거나 침해 -- 리버스 엔지니어링 또는 소스 코드 추출 시도 +관련 수출 통제 법규를 준수해야 합니다. -## 면책 조항 +## 13. 준거법 -서비스는 "있는 그대로" 제공됩니다. 당사는 특정 목적에 대한 적합성에 대해 어떠한 보증도 하지 않습니다. +중화인민공화국 법률을 따릅니다. -## 책임 제한 +## 14. 약관 변경 -어떠한 경우에도 당사는 간접적, 부수적, 특별, 결과적, 또는 징벌적 손해에 대해 책임을 지지 않습니다. +약관은 변경될 수 있으며, 계속 사용 시 변경 사항에 동의한 것으로 간주됩니다. -## 변경 +## 15. 문의 -당사는 언제든지 이 약관을 변경할 권리를 보유합니다. 변경 후에도 서비스 사용을 계속함으로써, 귀하는 새로운 약관에 동의한 것으로 간주됩니다. +Email: nimotecode@gmail.com +GitHub: https://github.com/nimotecode/nimote_issues/issues \ No newline at end of file diff --git a/docs/privacy.md b/docs/privacy.md index 3044a53..e4af834 100644 --- a/docs/privacy.md +++ b/docs/privacy.md @@ -1,5 +1,6 @@ --- title: Privacy Policy | NimoteCode +description: Read how NimoteCode handles account data, subscriptions, workspace settings, AI configuration, diagnostics, and third-party integrations. --- # Privacy Policy @@ -137,5 +138,5 @@ We may update this policy. The latest published version and effective date on th ## 12. Contact -- Email: aoun.ma@foxmail.com +- Email: nimotecode@gmail.com - GitHub Issues: https://github.com/nimotecode/nimote_issues/issues diff --git a/docs/pro.md b/docs/pro.md new file mode 100644 index 0000000..85ffc9b --- /dev/null +++ b/docs/pro.md @@ -0,0 +1,51 @@ +--- +title: NimoteCode Pro +description: Compare NimoteCode Free and Pro capabilities, including Git write workflows, LSP, debugger, sync/cache, multi-terminal, Timeline AI, and unlimited AI Agent usage. +--- + +# NimoteCode Pro + +NimoteCode can be used as a core mobile workspace for local and SSH projects. Pro unlocks the higher-leverage workflows that turn that workspace into a complete mobile delivery environment. + +## What Pro unlocks + +| Area | Pro capability | Why it matters | +|------|----------------|----------------| +| AI Agent | Unlimited agent runs | Move beyond metered free automation for multi-step coding tasks. | +| Git | Write workflows and Git AI | Commit, push, branch, stash, review diffs, and use AI assistance from mobile. | +| Terminal | Multi-terminal workflows | Keep parallel shells for tests, logs, servers, and deployments. | +| Search | Unlimited remote content search | Search remote project files without the free usage meter. | +| LSP | Diagnostics and code actions | Navigate and fix code using language-server feedback. | +| Debug | Breakpoints, call stack, variables, watch | Investigate runtime problems from the app. | +| Timeline | AI root-cause and fix suggestions | Turn captured development events into diagnosis help. | +| Tasks | Advanced task execution | Run filtered task groups sequentially or in parallel. | +| Sync / Cache | Local/remote sync and cache flows | Move project content between local and remote workspaces with path checks. | + +## Free capabilities + +Free users can still start real work: + +- Open local and SSH workspaces. +- Edit project files. +- Run baseline terminal sessions. +- Configure AI providers and use AI Chat. +- Use metered AI Agent runs. +- Use metered remote search. +- Create and run basic task workflows. +- View timeline information. + +## Account and verification + +Pro access is tied to account and subscription verification. The app supports restore-purchase flows and short offline grace behavior so temporary network issues do not immediately interrupt recently verified access. + +See also: [Account and subscription](/docs/account-subscription). + +## Best fit + +Pro is best for developers who need to complete an entire mobile workflow, not just inspect code: + +- Remote hotfixes that require Git writes. +- On-call debugging with LSP, debugger, and Timeline AI. +- Multi-terminal server workflows. +- Repeated AI Agent automation. +- Syncing or caching project files between local and remote environments. diff --git a/docs/product_introduction_english.md b/docs/product_introduction_english.md index 78b671b..d520ae6 100644 --- a/docs/product_introduction_english.md +++ b/docs/product_introduction_english.md @@ -1,3 +1,8 @@ +--- +title: NimoteCode Product Introduction +description: Discover NimoteCode as a mobile AI coding workspace for SSH development, terminal workflows, Git review, debugging, and delivery on phones and tablets. +--- + # NimoteCode Product Introduction 【One-sentence Positioning】 diff --git a/docs/public/llms-full.txt b/docs/public/llms-full.txt new file mode 100644 index 0000000..3e463cc --- /dev/null +++ b/docs/public/llms-full.txt @@ -0,0 +1,54 @@ +# NimoteCode Full Context + +> NimoteCode is a mobile-first IDE and developer workspace for iPhone, iPad, and Android. It is built for real development work on mobile: SSH access, code editing, terminal sessions, Git review and write workflows, AI assistance, debugging, task execution, timeline diagnostics, and sync/cache movement between environments. + +NimoteCode is not a code viewer or note-taking app. It is designed for practical workflows such as remote hotfixes, on-call diagnostics, AI-assisted coding, and mobile-first project inspection and delivery. + +## Primary Pages +- [Home](https://nimotecode.com/): Product overview and demo-led landing page. +- [Features](https://nimotecode.com/features): Core feature summary. +- [Pro](https://nimotecode.com/pro): Free and Pro comparison. +- [Download](https://nimotecode.com/download): Install steps and store links. +- [Use Cases](https://nimotecode.com/use-cases/): Scenario hub for mobile development work. + +## Documentation +- [Quick Start](https://nimotecode.com/docs/quick-start): First-run setup and workspace basics. +- [SSH Workspace](https://nimotecode.com/docs/ssh): Remote connection setup and workspace behavior. +- [Editor](https://nimotecode.com/docs/editor): Editing gestures, navigation, and workflows. +- [Terminal](https://nimotecode.com/docs/terminal): Terminal sessions and command execution. +- [Search](https://nimotecode.com/docs/search): File and output search guidance. +- [Source Control](https://nimotecode.com/docs/source-control): Git status, diff, staging, commit, push, pull, branches, and stashes. +- [AI Assistant](https://nimotecode.com/docs/ai): AI Chat and AI Agent usage. +- [LSP](https://nimotecode.com/docs/lsp): Language server diagnostics and code actions. +- [Debug](https://nimotecode.com/docs/debug): Breakpoints, stack inspection, variables, and watch views. +- [Tasks](https://nimotecode.com/docs/tasks): Task creation and execution. +- [Timeline](https://nimotecode.com/docs/timeline): Event inspection and causal troubleshooting. +- [Sync / Cache](https://nimotecode.com/docs/sync-cache): Workspace movement and cache flows. +- [Account and Subscription](https://nimotecode.com/docs/account-subscription): Account and premium verification behavior. +- [Security](https://nimotecode.com/docs/security): Safety and review-related settings. +- [Settings](https://nimotecode.com/docs/settings): App configuration and preferences. +- [Configuration](https://nimotecode.com/docs/configuration): Advanced setup and environment configuration. +- [FAQ](https://nimotecode.com/docs/faq): Common questions and answers. + +## Use Cases +- [Remote Hotfix](https://nimotecode.com/use-cases/remote-hotfix): Patch production from a phone. +- [On-call Diagnostics](https://nimotecode.com/use-cases/on-call-diagnostics): Investigate incidents while away from a desk. +- [AI Agent Workflows](https://nimotecode.com/use-cases/ai-agent): Use AI inside a real development workflow. + +## Support And Policy +- [Support](https://nimotecode.com/support): Help and contact information. +- [Privacy](https://nimotecode.com/privacy): Privacy policy. +- [Terms](https://nimotecode.com/terms): Terms of service. +- [Account Deletion](https://nimotecode.com/account-delete): Account deletion instructions. + +## Locales +- [English](https://nimotecode.com/): Default locale. +- [Chinese](https://nimotecode.com/zh/): Simplified Chinese locale. +- [Japanese](https://nimotecode.com/ja/): Japanese locale. +- [Korean](https://nimotecode.com/ko/): Korean locale. +- [Russian](https://nimotecode.com/ru/): Russian locale. +- [Spanish](https://nimotecode.com/es/): Spanish locale. + +## Notes +- The site is VitePress-generated and primarily serves markdown documentation, product pages, and policy pages. +- The public documentation is intentionally concise so LLMs can use the linked pages as focused context rather than scraping the entire site. diff --git a/docs/public/llms.txt b/docs/public/llms.txt new file mode 100644 index 0000000..8202ecc --- /dev/null +++ b/docs/public/llms.txt @@ -0,0 +1,45 @@ +# NimoteCode + +> NimoteCode is a mobile-first IDE and developer workspace for iPhone, iPad, and Android. It combines SSH workspaces, code editing, terminals, Git workflows, AI assistance, debugging, tasks, timeline diagnostics, sync/cache, and product support in one app. + +NimoteCode is organized around a few primary journeys: learn the product, compare Free and Pro, install the app, and move into the documentation for day-to-day workflows. + +## Product +- [Home](https://nimotecode.com/): Main product overview and demo-led landing page. +- [Features](https://nimotecode.com/features): Core capabilities and workflow summary. +- [Pro](https://nimotecode.com/pro): Free vs Pro comparison and upgrade value. +- [Download](https://nimotecode.com/download): Store links and installation steps. +- [Use Cases](https://nimotecode.com/use-cases/): Scenario overview for urgent mobile development work. + +## Documentation +- [Quick Start](https://nimotecode.com/docs/quick-start): First-run setup and workspace basics. +- [SSH Workspace](https://nimotecode.com/docs/ssh): Remote connections and workspace setup. +- [Editor](https://nimotecode.com/docs/editor): Editing workflow and navigation. +- [Terminal](https://nimotecode.com/docs/terminal): Terminal sessions and command execution. +- [Search](https://nimotecode.com/docs/search): Project and output search guidance. +- [Source Control](https://nimotecode.com/docs/source-control): Git review and write workflows. +- [AI Assistant](https://nimotecode.com/docs/ai): AI chat and agent usage. +- [LSP](https://nimotecode.com/docs/lsp): Language server diagnostics and code actions. +- [Debug](https://nimotecode.com/docs/debug): Breakpoints, call stacks, variables, and watch views. +- [Tasks](https://nimotecode.com/docs/tasks): Task creation and execution. +- [Timeline](https://nimotecode.com/docs/timeline): Event inspection and root-cause workflows. +- [Sync / Cache](https://nimotecode.com/docs/sync-cache): Workspace movement and cache flows. + +## Use Cases +- [Remote Hotfix](https://nimotecode.com/use-cases/remote-hotfix): Patch production from a phone. +- [On-call Diagnostics](https://nimotecode.com/use-cases/on-call-diagnostics): Investigate incidents while away from a desk. +- [AI Agent Workflows](https://nimotecode.com/use-cases/ai-agent): Use AI inside a real development workflow. + +## Support and Policy +- [Support](https://nimotecode.com/support): Help and contact information. +- [Privacy](https://nimotecode.com/privacy): Privacy policy. +- [Terms](https://nimotecode.com/terms): Terms of service. +- [Account Deletion](https://nimotecode.com/account-delete): Account deletion instructions. + +## Locales +- [English](https://nimotecode.com/): Default site locale. +- [Chinese](https://nimotecode.com/zh/): Simplified Chinese locale. +- [Japanese](https://nimotecode.com/ja/): Japanese locale. +- [Korean](https://nimotecode.com/ko/): Korean locale. +- [Russian](https://nimotecode.com/ru/): Russian locale. +- [Spanish](https://nimotecode.com/es/): Spanish locale. diff --git a/docs/public/robots.txt b/docs/public/robots.txt new file mode 100644 index 0000000..5bdc138 --- /dev/null +++ b/docs/public/robots.txt @@ -0,0 +1,12 @@ +User-agent: * +Allow: / + +User-agent: Googlebot +Allow: / + +User-agent: Googlebot-Image +Allow: / + +Host: nimotecode.com + +Sitemap: https://nimotecode.com/sitemap.xml diff --git a/docs/public/screenshots/NimoteCode_Promotion.jpg b/docs/public/screenshots/NimoteCode_Promotion.jpg new file mode 100644 index 0000000..e5b5cd4 Binary files /dev/null and b/docs/public/screenshots/NimoteCode_Promotion.jpg differ diff --git a/docs/public/screenshots/homepage_bk.jpg b/docs/public/screenshots/homepage_bk.jpg new file mode 100644 index 0000000..8c9144d Binary files /dev/null and b/docs/public/screenshots/homepage_bk.jpg differ diff --git a/docs/public/screenshots/homepage_bk_mobile.jpg b/docs/public/screenshots/homepage_bk_mobile.jpg new file mode 100644 index 0000000..551174c Binary files /dev/null and b/docs/public/screenshots/homepage_bk_mobile.jpg differ diff --git a/docs/public/screenshots/p1.png b/docs/public/screenshots/p1.png new file mode 100644 index 0000000..d7cc5d0 Binary files /dev/null and b/docs/public/screenshots/p1.png differ diff --git a/docs/public/screenshots/p2.png b/docs/public/screenshots/p2.png new file mode 100644 index 0000000..fb57066 Binary files /dev/null and b/docs/public/screenshots/p2.png differ diff --git a/docs/public/screenshots/p3.png b/docs/public/screenshots/p3.png new file mode 100644 index 0000000..879bad9 Binary files /dev/null and b/docs/public/screenshots/p3.png differ diff --git a/docs/public/site.webmanifest b/docs/public/site.webmanifest new file mode 100644 index 0000000..9874857 --- /dev/null +++ b/docs/public/site.webmanifest @@ -0,0 +1,16 @@ +{ + "name": "NimoteCode", + "short_name": "NimoteCode", + "description": "Mobile IDE and developer workspace with SSH, terminal, Git, AI, and debugging workflows.", + "start_url": "/", + "display": "standalone", + "background_color": "#ffffff", + "theme_color": "#4f46e5", + "icons": [ + { + "src": "/app_icon.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} diff --git a/docs/public/sitemap.xml b/docs/public/sitemap.xml new file mode 100644 index 0000000..6cb1916 --- /dev/null +++ b/docs/public/sitemap.xml @@ -0,0 +1,28 @@ + + + https://nimotecode.com/ + https://nimotecode.com/features + https://nimotecode.com/pro + https://nimotecode.com/download + https://nimotecode.com/docs/quick-start + https://nimotecode.com/docs/ssh + https://nimotecode.com/docs/editor + https://nimotecode.com/docs/terminal + https://nimotecode.com/docs/search + https://nimotecode.com/docs/source-control + https://nimotecode.com/docs/ai + https://nimotecode.com/docs/lsp + https://nimotecode.com/docs/debug + https://nimotecode.com/docs/tasks + https://nimotecode.com/docs/timeline + https://nimotecode.com/docs/sync-cache + https://nimotecode.com/docs/account-subscription + https://nimotecode.com/docs/security + https://nimotecode.com/use-cases/remote-hotfix + https://nimotecode.com/use-cases/on-call-diagnostics + https://nimotecode.com/use-cases/ai-agent + https://nimotecode.com/support + https://nimotecode.com/privacy + https://nimotecode.com/terms + https://nimotecode.com/account-delete + diff --git a/docs/ru/download.md b/docs/ru/download.md index d0ca717..b4a60ed 100644 --- a/docs/ru/download.md +++ b/docs/ru/download.md @@ -8,11 +8,11 @@ NimoteCode доступен для iOS и Android. ## App Store -[![Скачать в App Store](https://developer.apple.com/assets/elements/badges/download-on-the-app-store.svg)](https://apps.apple.com/app/nimotecode) +Скачать в App Store ## Google Play -[![Получить в Google Play](https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png)](https://play.google.com/store/apps/details?id=com.nimotecode) +Получить в Google Play ## Системные требования diff --git a/docs/ru/index.md b/docs/ru/index.md index aab92d1..1cdb1e1 100644 --- a/docs/ru/index.md +++ b/docs/ru/index.md @@ -1,54 +1,148 @@ --- layout: home -title: NimoteCode - Отправляйте исправления в производство с вашего телефона +title: NimoteCode - мобильная IDE для iPhone и Android titleTemplate: false +description: NimoteCode - мобильное рабочее пространство разработчика с редактором кода, SSH-терминалом, Git, AI-помощником и синхронизацией. hero: - name: NimoteCode - text: "Отправляйте исправления в производство с вашего телефона" - tagline: "Мобильное IDE для реальной доставки: SSH-рабочая область с автоматическим переподключением, постоянство терминалов, Source Control с Git AI, LSP/Debug, AI Agent с системой памяти и диагностика Timeline с причинно-следственным отслеживанием." - actions: - - theme: brand - text: Быстрый старт за 3 минуты - link: /ru/docs/quick-start - - theme: alt - text: Карта функций - link: /ru/features - - theme: alt - text: Полная документация - link: /ru/docs - -features: - - title: Онбординг за 3 минуты - details: "От первого запуска до первого коммита за считанные минуты с помощьюguided local или SSH-рабочего процесса." - - - title: Реальная доставка по SSH с автоматическим переподключением - details: "Подключайтесь к реальным серверам, редактируйте удаленный код, запускайте команды терминала с мониторингом heartbeat и автоматическим переподключением при потере сети." - - - title: Постоянство сеансов терминала - details: "Многооконные сеансы терминала с автоматическим восстановлением после переподключения - никогда не теряйте контекст при сбоях сети." + name: "" + text: "" + tagline: "" + actions: [] +--- - - title: Source Control + Git AI - details: "Просматривайте различия, создавайте чистые коммиты, синхронизируйте ветки и используйте Git AI для улучшения качества сообщений и снижения рисков." +
+
+
+

Для iPhone и Android

+
+ + NimoteCode +
+

Это не просто редактор кода.
Это реальное dev-workspace.

+

SSH-потоки, работа с production-кодом, Git-ревью и AI-помощь собраны в одной mobile-first IDE.

+
+ Google Play + App Store скоро + Быстрый старт +
+
+ + Смотреть демо +
+
- - title: LSP + Debug (Pro) - details: "Раннее выявление проблем с помощью диагностики и действий с кодом, затем отладка с точками останова, переменными, наблюдением и управлением временем выполнения." +
+
+

Демо продукта

+

Посмотрите реальный mobile hotfix workflow.

+

SSH-доступ, правка кода, terminal, Git-ревью и AI-помощь в одном непрерывном workspace.

+
+ +
- - title: AI Чат + AI Агент с системой памяти - details: "Используйте предпочитаемого поставщика AI для анализа кода, рекомендуемых исправлений и многошаговой автоматизации прямо в рабочей области с поддержкой краткосрочной/долгосрочной памяти и интеллектуального сжатия." +
+
+

Основной workflow

+

Сделано для реальной production-работы с мобильного.

+

Главный цикл остается плотным: подключиться, проверить, изменить, верифицировать, отправить.

+
- - title: Анализ корневых причин Timeline с причинно-следственным отслеживанием - details: "Преобразуйте события в практические трассировки с фильтрами по серьезности/источнику, цепочками причинно-следственных событий, анализом корневых причин на базе AI и предлагаемыми исправлениями." +
+
+

AI Assistant

+

Продвигайте изменения вместе с AI и полным контекстом workspace.

+

Объясняйте код, ищите причины и проходите многошаговые исправления, не выходя из приложения.

+
+
+

Terminal

+

Работайте в реальных окружениях

+

Подключайтесь по SSH к серверам и dev-машинам и выполняйте нужные команды сразу.

+
+
+

Git

+

Проверяйте и коммитьте без шума

+

Держите diff, staging и version control рядом с кодом, который меняете.

+
+
+

Workspace Sync

+

Продолжайте с того же места

+

Сохраняйте состояние проекта и рабочий контекст между мобильными сессиями.

+
+
+
- - title: Создано для долгих мобильных сессий - details: "Точно настройте язык, тему, типографику редактора и поведение клавиатуры для комфортного кодирования с высокой концентрацией." +
+
+

Это не просто редактор кода.

+

Это реальное dev-workspace.

+
+
- - title: Sync / Cache (Pro) - details: "Перемещение содержимого проекта между локальными и удаленными рабочими областями с контролем направления, безопасностью целевых путей и историей операций." +
+
+

Сценарии

+

Сделано для срочных и практических workflow.

+

Ценность понятна сразу, когда нужно не смотреть код, а действовать.

+
- - title: Панель Tasks - details: "Выполнение групповых удаленных задач с отслеживанием состояния для стандартизации повторяющихся команд команды." +
+ + + + +
+
- - title: Начните с результата - details: "Начните с вашей цели: подключите сервер, исправьте ошибку быстрее, автоматизируйте повторяющуюся работу или отправьте мобильный хотфикс." ---- +
+
+

Начать

+

Носите реальное dev-workspace с собой.

+

Для разработчиков и ops-инженеров, которым нужно проверять, исправлять и доставлять изменения с мобильного.

+ +
+
diff --git a/docs/ru/terms.md b/docs/ru/terms.md index 85a6fb2..617844e 100644 --- a/docs/ru/terms.md +++ b/docs/ru/terms.md @@ -4,39 +4,116 @@ title: Условия использования | NimoteCode # Условия использования -Последнее обновление: 2024 год +**Дата вступления в силу:** 16 апреля 2026 г. -## Условия соглашения +Настоящие условия использования (далее — «Условия») регулируют использование NimoteCode (далее — «Приложение», «мы»). -Загружая или используя NimoteCode, вы соглашаетесь с этими условиями использования. +Устанавливая или используя NimoteCode, вы соглашаетесь с настоящими Условиями и условиями сторонних платформ: -## Аккаунт +- Условия Apple Media Services и стандартное EULA Apple + https://www.apple.com/legal/internet-services/itunes/dev/stdeula/ -- Вы несете ответственность за сохранение конфиденциальности информации вашего аккаунта -- Вы несете ответственность за все действия, происходящие под вашим аккаунтом -- Мы оставляем за собой право завершить любой аккаунт в любое время +- Условия Google Play + https://play.google.com/about/play-terms/ -## Подписка +Если вы не согласны с настоящими Условиями, не используйте Приложение. -- Для функций Pro требуется подписка -- Цены указаны в плане подписки -- Подписка автоматически продлевается, если не отменить до конца текущего периода +--- + +## 1. Описание сервиса + +NimoteCode — это мобильная интегрированная среда разработки (IDE), предоставляющая локальные и удалённые SSH рабочие процессы, редактирование кода, доступ к терминалу, Git-инструменты, AI-функции, автоматизацию задач и отладку. + +## 2. Право использования + +Вы должны быть не младше 13 лет (или минимального возраста в вашей юрисдикции). + +Вы несёте ответственность за безопасность своей учётной записи, устройства и действий, выполненных через неё. + +## 3. Подписки, оплата и продление + +Некоторые функции требуют платной подписки (например, NimoteCode Pro). + +- Все платежи обрабатываются Apple App Store или Google Play. +- Подписка автоматически продлевается, если не отменена за 24 часа до окончания текущего периода. +- Списание происходит в течение 24 часов до продления по текущей цене. +- Управление подписками осуществляется через Apple ID или Google Play. +- Возврат средств осуществляется согласно политике платформ. +- Покупки можно восстановить через функцию “Restore Purchases”. +- Цена может различаться по регионам. + +## 4. Удалённые системы и ответственность пользователя + +Вы несёте полную ответственность за: + +- SSH-соединения и удалённые серверы +- Команды, выполняемые через приложение +- Безопасность ключей и учетных данных + +Мы не храним SSH-данные на наших серверах. + +## 5. AI-функции (модель BYO Key) + +Приложение может использовать сторонние AI-сервисы. + +- Вы должны предоставить собственный API-ключ +- Мы не предоставляем модели ИИ или вычислительные сервисы +- Все расходы оплачиваются пользователем +- Результаты ИИ могут быть неточными + +## 6. Запрещённое использование + +Запрещается: + +- Несанкционированный доступ к системам +- Незаконное использование +- Реверс-инжиниринг или вмешательство в работу приложения +- Злоупотребление API и ресурсами + +## 7. Сторонние сервисы + +Приложение может использовать Git, SSH и AI сторонние сервисы. + +Мы не несем ответственности за их работу. + +## 8. Конфиденциальность + +https://nimotecode.com/privacy + +## 9. Приостановка и прекращение + +Мы можем ограничить доступ по причинам: + +- Безопасность +- Законодательные требования +- Предотвращение злоупотреблений +- Стабильность системы + +## 10. Отказ от гарантий + +Приложение предоставляется «как есть». + +Мы не гарантируем отсутствие ошибок и бесперебойную работу. + +## 11. Ограничение ответственности + +Мы не несем ответственности за косвенные убытки. + +Включая потерю данных и сбои системы. -## Запрещенные действия +## 12. Экспортный контроль -Вы соглашаетесь не делать следующее: -- Использовать сервис для незаконных или несанкционированных целей -- Вмешиваться или нарушать безопасность сервиса -- Пытаться провести обратную разработку или извлечь исходный код +Вы обязаны соблюдать экспортное законодательство. -## Отказ от гарантий +## 13. Применимое право -Сервис предоставляется «как есть». Мы не даем никаких гарантий относительно пригодности для конкретной цели. +Применяется законодательство Китайской Народной Республики. -## Ограничение ответственности +## 14. Изменения условий -Ни при каких обстоятельствах мы не несем ответственности за косвенные, случайные, специальные, штрафные или последующие убытки. +Условия могут изменяться. Продолжение использования означает согласие. -## Изменения +## 15. Контакты -Мы оставляем за собой право изменять эти условия в любое время. Продолжая использовать сервис после изменений, вы соглашаетесь с новыми условиями. +Email: nimotecode@gmail.com +GitHub: https://github.com/nimotecode/nimote_issues/issues \ No newline at end of file diff --git a/docs/support.md b/docs/support.md index deb72e6..d7d45d2 100644 --- a/docs/support.md +++ b/docs/support.md @@ -1,8 +1,9 @@ --- title: Support | NimoteCode +description: Get support for NimoteCode through email, GitHub issues, documentation, and troubleshooting guides. --- -# Support +# NimoteCode Support Center Need help with NimoteCode? We're here to assist you. @@ -14,7 +15,7 @@ Get in touch with our team for support, feedback, or questions. +
+
+

支持 iPhone 和 Android

+
+ + NimoteCode +
+

不是代码编辑器。
而是真实开发工作区。

+

把 SSH 工作流、生产代码编辑、Git 审查和 AI 协作放进同一个移动优先 IDE。

+
+ Google Play 下载 + App Store 即将上线 + 查看快速入门 +
+
+ + 下滑查看演示 +
+
+ +
+
+

产品演示

+

看一遍真实的移动热修流程。

+

SSH 接入、代码修改、终端验证、Git 审查和 AI 辅助,全部收敛在同一个工作区里。

+
+ +
+
-
- - NimoteCode +
+

核心工作流

+

为真实生产工作而设计的移动开发环境。

+

核心闭环保持简洁:连接、检查、修改、验证、交付。

-

随时随地编码。
处处交付成果。

-

专业的移动端 IDE。完整的 SSH、Git、AI 和调试功能——专为 iPhone、iPad 和 Android 优化。

-
- 下载 - 文档 + +
+
+

AI Assistant

+

让 AI 在完整工作区上下文里参与改动。

+

解释代码、排查问题、推进多步骤修复,全程不离开应用。

+
+
+

Terminal

+

直接工作在真实环境

+

SSH 连接服务器或开发机,运行真正有价值的命令。

+
+
+

Git

+

清晰审查并提交变更

+

把 diff、暂存和版本控制放在代码旁边完成。

+
+
+

Workspace Sync

+

随时接续上一次工作

+

让项目状态和当前上下文跟着你的移动场景一起走。

+
-
-

功能

-

从手机交付所需的一切。

-
-
-
- 🖥️ - SSH 工作区 -
-

连接真实服务器,支持自动重连和心跳检测。

-
-
-
- 💻 - 终端 -
-

单标签终端,支持会话持久化。

-
-
-
- 🔀 - Git 源码控制 - Pro -
-

完整的 Git 工作流,包含差异查看、提交、分支和 Git AI。

-
-
-
- 🔧 - LSP & 调试 - Pro -
-

专业诊断、代码动作、断点、调用堆栈和变量监控。

-
-
-
- 💬 - AI 聊天 -
-

对话式 AI 帮助,用于代码帮助和建议。

-
-
-
- 🤖 - AI Agent - Pro -
-

自主 AI Agent,带记忆系统用于自动化任务。

-
-
-
- 📊 - Timeline -
-

因果追踪和 AI 根因分析,用于诊断。

-
-
-
- 🔄 - Sync / Cache - Pro -
-

本地与远程间的双向同步,带路径安全检查。

-
-
-
- - Tasks 面板 -
-

运行分组的远程任务,带状态跟踪和输出捕获。

-
-
-
- 📑 - 多终端 - Pro -
-

多终端标签页,用于并行工作流。

-
-
-
- 🔍 - 全局文件搜索 -
-

在远程工作区中快速搜索和定位文件。

-
-
-
- 📝 - 文件内容搜索 -
-

在文件内容中搜索关键词。

-
-
-
- 📁 - Git 文件与行历史 - Pro -
-

查看文件和代码行的完整提交历史。

-
-
-
- 📋 - 代码大纲视图 -
-

快速浏览和导航代码结构。

-
-
-
- 📱 - iPad 优化 -
-

多窗口支持、触控板和桌面级体验。

-
+
+
+

不是代码编辑器。

+

而是真实开发工作区。

-
-

定价

-

免费开始,需要更多功能时再升级。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
功能免费版专业版
SSH 工作区 & 自动重连
终端会话持久化
AI 聊天
Timeline & AI 根因分析
Tasks 面板 & 远程执行
iPad 优化
全局文件搜索
文件内容搜索
代码大纲视图
Git 源码控制(完整工作流 & 差异)
Git AI(提交信息、风险检测)
Git 文件与行历史
多终端支持
LSP 诊断 & 代码动作
完整调试器(断点、变量)
AI Agent(自主模式)
Sync / Cache(本地 ↔ 远程)
+
+
+

使用场景

+

围绕高频、紧急、实战型工作流构建。

+

当你需要立刻动手,而不是只看一眼代码时,这个产品会非常直观。

+
+ +
+ + + + +
-

准备好随时随地编码了吗?

-

立即下载 NimoteCode,在你的 iPhone、iPad 和 Android 上体验专业开发。

+

开始使用

+

把真实开发工作区随身带走。

+

面向开发者和运维工程师,帮助你在移动端完成检查、修复和交付。

diff --git a/docs/zh/introduction.md b/docs/zh/introduction.md index 4e77bd1..7d68b21 100644 --- a/docs/zh/introduction.md +++ b/docs/zh/introduction.md @@ -2,33 +2,58 @@ title: 简介 | NimoteCode --- -# 简介 +# NimoteCode -NimoteCode 是一款移动优先 IDE,让你在手机或平板上完成开发、调试与交付。 +**AI-Powered Mobile SSH IDE for Real Development Workflows** -## 为什么选择 NimoteCode +NimoteCode 是一款面向开发者与运维工程师的 **移动端 SSH IDE**,让你在手机或平板上也能完成接近桌面级的开发、调试与交付。 -- 一个工作区打通编码、终端、Source Control、AI 与排障 -- 面向真实 SSH 服务器工作流,而非轻量玩具编辑 -- 借助 LSP、Debug、Timeline 快速定位并修复问题 -- 针对移动端长时间开发优化了键盘、排版与面板协同 +它不是编辑器,而是一个完整的 **远程开发 + AI 驱动工程工作台**。 -## 你可以完成什么 +--- + +## ⚡ 为什么选择 NimoteCode + +- 一个统一工作区,集成 **Code Editor / Terminal / Git / AI / Debug** +- 原生支持真实 **SSH 远程开发工作流(生产级环境)** +- 深度集成 **LSP、Debug、Tasks、Timeline**,快速定位复杂问题 +- 内置 AI Copilot + Agent:解释代码、重构系统、执行任务、自动修复 +- 为移动端重构开发体验:多面板协同、键盘优化、平板分屏支持 + +--- + +## 🧠 AI 驱动开发体验 + +- AI Code Explain:快速理解复杂代码逻辑 +- AI Refactor:自动优化与重构代码结构 +- AI Fix (LSP):基于诊断信息自动修复问题 +- AI Terminal:理解并生成 Shell 命令 +- AI Timeline Analysis:分析代码变更与问题来源 +- AI Agent:跨文件执行开发与运维任务 -- 连接本地或远程工作区并立即编辑项目文件 -- 在多标签终端执行构建、测试、部署命令 -- 在 Source Control 中完成提交、同步、分支与差异审查 -- 使用 AI Chat 与 AI Agent 做解释、重构与自动化执行 -- 通过 LSP、Debug、Tasks、Timeline 建立完整诊断闭环 +--- + +## 🛠 你可以用 NimoteCode 做什么 -## 面向真实交付场景 +- SSH 连接远程服务器 / 本地工作区并直接开发 +- 在多标签 Terminal 中执行 build / test / deploy +- 使用 Git 完成提交、分支管理、代码审查与同步 +- 在移动端完成日常开发与紧急修复(Hotfix) +- 通过 AI 自动化重复工程操作与排障流程 + +--- -NimoteCode 重点支持以下高价值场景: +## 🌍 面向真实生产场景 -1. 离开电脑时进行远程热修复 -2. 值班期间快速定位线上问题 -3. 在移动端完成日常提交与代码同步 -4. 用 AI 自动化重复工程操作 +NimoteCode 专为真实工程环境设计,而不是学习或玩具工具: + +- 🔥 线上故障紧急修复(Incident / Hotfix) +- 📡 On-call 值班快速排障 +- 📱 移动端远程开发与代码提交 +- ⚙️ 自动化运维与脚本执行 +- 🧩 分布式系统问题定位与调试 + +--- ## 下一步阅读 @@ -36,4 +61,4 @@ NimoteCode 重点支持以下高价值场景: - [快速开始](/zh/docs/quick-start) - [SSH 工作区](/zh/docs/ssh) - [Source Control](/zh/docs/source-control) -- [AI 助手](/zh/docs/ai) +- [AI 助手](/zh/docs/ai) \ No newline at end of file diff --git a/docs/zh/privacy.md b/docs/zh/privacy.md index 634729f..37ae8d6 100644 --- a/docs/zh/privacy.md +++ b/docs/zh/privacy.md @@ -137,5 +137,5 @@ NimoteCode 并非面向 13 岁以下儿童(或您所在地区规定的最低 ## 12. 联系方式 -- 邮箱:aoun.ma@foxmail.com +- 邮箱:nimotecode@gmail.com - GitHub Issues:https://github.com/nimotecode/nimote_issues/issues diff --git a/docs/zh/support.md b/docs/zh/support.md index 16c9ab6..e395477 100644 --- a/docs/zh/support.md +++ b/docs/zh/support.md @@ -6,7 +6,7 @@ title: 支持 | NimoteCode ## 联系方式 -- 邮箱:aoun.ma@foxmail.com +- 邮箱:nimotecode@gmail.com - GitHub Issues:https://github.com/nimotecode/nimote_issues/issues ## 隐私 / 账户请求 diff --git a/docs/zh/terms.md b/docs/zh/terms.md index 3d5a5cf..a3ee230 100644 --- a/docs/zh/terms.md +++ b/docs/zh/terms.md @@ -4,80 +4,119 @@ title: 服务条款 | NimoteCode # 服务条款 -**生效日期:** 2026-04-16 +**生效日期:** 2026年4月16日 -本服务条款适用于您对 NimoteCode 的使用。 +本服务条款(以下简称“条款”)适用于您对 NimoteCode(以下简称“本应用”)的使用。 -## 1. 服务概述 +当您安装或使用本应用时,即表示您同意本条款及适用的第三方平台条款,包括: -NimoteCode 是移动端 IDE 产品,提供本地/远程工作区流程、编辑器与终端工具、Source Control、AI 集成、任务执行与 Timeline 诊断能力。 +- Apple 媒体服务条款及 Apple 标准用户协议(EULA) + https://www.apple.com/legal/internet-services/itunes/dev/stdeula/ -## 2. 资格与账户责任 +- Google Play 服务条款 + https://play.google.com/about/play-terms/ -您需要对以下事项负责: +如果您不同意本条款,请勿使用本应用。 -- 账户与设备安全 -- 账户下发生的操作行为 -- 使用连接服务时对适用法律及第三方条款的遵守 +## 1. 服务说明 -若您使用第三方登录服务,还应遵守对应平台条款。 +NimoteCode 是一款移动端集成开发环境(IDE),提供本地与 SSH 远程开发、代码编辑、终端工具、Git 管理、AI 辅助功能、任务自动化与调试工具。 -## 3. 订阅、试用与计费 +## 2. 使用资格 -- 部分能力为 Pro 功能门控。 -- 订阅计费、续费、取消、退款由 App Store / Google Play 按其政策处理。 -- 权益状态可能通过 RevenueCat 与相关后端校验同步。 -- 试用资格和防滥用控制可能基于设备/账户状态。 +您需年满 13 岁(或您所在地区法律规定的最低年龄)方可使用本应用。 -## 4. 远程访问与凭据 +您需对账户安全、设备安全、凭证信息以及所有账户操作行为负责。 -您需自行负责: +## 3. 订阅、计费与续费 -- 远程服务器、SSH 凭据和访问权限 -- 在自有基础设施上执行的操作结果 -- 密钥、密码和敏感信息的安全管理 +部分功能需要付费订阅(例如 NimoteCode Pro)。 -## 5. AI 功能与外部端点 +- 所有支付由 Apple App Store 或 Google Play 处理 +- 订阅将在未取消的情况下自动续费 +- 系统将在续费前 24 小时内扣费 +- 可通过 Apple ID 或 Google Play 管理或取消订阅 +- 退款由 Apple 或 Google 按其政策处理 +- 可通过“恢复购买”功能恢复权益 +- 不同地区的订阅价格可能不同 -NimoteCode 可将内容发送到您自行配置的 AI 提供商。 +## 4. 远程系统与用户责任 -您需自行负责: +您需自行承担以下责任: -- 选择合适的 AI 提供商端点 -- 保管 API 凭据 -- 在生产使用前验证 AI 输出 +- 远程服务器、SSH 连接及相关基础设施 +- 通过本应用执行的所有命令 +- 凭证、密钥及敏感信息的安全管理 -AI 输出可能不准确、不完整,或不适用于生产环境。 +本应用不会存储您的 SSH 凭证。 -## 6. 合规使用 -您同意不会使用 NimoteCode: +## 5. AI 功能(自带 API Key) -- 未授权访问系统或数据 -- 传播恶意程序或实施违法行为 -- 滥用、干扰或尝试未授权利用相关服务 +本应用可能接入第三方 AI 服务: + +- 用户需自行提供 API Key(BYO 模式) +- 本应用不提供 AI 模型或调用额度 +- 第三方 API 费用由用户自行承担 +- AI 输出可能存在错误,需用户自行判断与验证 + +## 6. 使用规范 + +用户不得: + +- 未经授权访问系统或服务器 +- 从事非法、恶意或破坏性行为 +- 反向工程、破解或干扰本应用 +- 滥用接口或系统资源 ## 7. 第三方服务 -NimoteCode 依赖第三方服务及您自行选择的端点。其可用性、行为与条款不受 NimoteCode 直接控制。 +本应用可能集成 Git、SSH、AI 等第三方服务。 + +我们不对第三方服务的可用性、稳定性或内容负责。 + +## 8. 隐私政策 + +您的使用同时受隐私政策约束: + +https://nimotecode.com/privacy + + +## 9. 服务暂停与终止 + +在以下情况下,我们可能暂停或终止服务: + +- 安全原因 +- 法律合规要求 +- 防止滥用行为 +- 系统稳定性需求 + +## 10. 免责声明 + +本应用按“现状”和“可用性”提供。 + +我们不保证服务持续可用、无错误或数据完全准确。 + +## 11. 责任限制 + +在法律允许范围内,我们不对任何间接、附带或后果性损失承担责任。 -## 8. 隐私 +包括数据丢失、系统损坏或服务中断。 -您对 NimoteCode 的使用同时受《隐私政策》约束。 -## 9. 暂停或终止 +## 12. 出口合规 -在滥用、安全、合规或运营完整性需要时,我们可暂停或限制访问。 +用户需遵守所有适用的出口管制法律法规。 -## 10. 免责声明与责任限制 +## 13. 适用法律 -在法律允许的最大范围内,NimoteCode 按“现状”和“可用”提供,不保证服务不中断,也不保证特定适用性。 +本条款适用中华人民共和国法律,不考虑冲突法规则。 -## 11. 条款更新 +## 14. 条款更新 -我们可能更新本条款。更新后继续使用即表示您接受修订后的条款。 +我们可能不时更新本条款。继续使用即表示您同意更新后的条款。 -## 12. 联系方式 +## 15. 联系方式 -- 邮箱:aoun.ma@foxmail.com -- GitHub Issues:https://github.com/nimotecode/nimote_issues/issues +邮箱:nimotecode@gmail.com +GitHub:https://github.com/nimotecode/nimote_issues/issues \ No newline at end of file diff --git a/docs/zh/use-cases/ai-agent.md b/docs/zh/use-cases/ai-agent.md new file mode 100644 index 0000000..b217c98 --- /dev/null +++ b/docs/zh/use-cases/ai-agent.md @@ -0,0 +1,41 @@ +--- +title: AI Agent 工作流 | NimoteCode +description: 了解 NimoteCode 如何通过 AI Chat 与 AI Agent 在移动端提供代码辅助、变更规划与受控多步骤自动化。 +--- + +# AI Agent 工作流 + +NimoteCode 同时提供 AI Chat 和 AI Agent。前者用于直接协助,后者用于需要多步骤推进的任务,并可在安全控制下调用工具。 + +## 什么时候用 AI Chat + +当你需要以下能力时,优先使用 AI Chat: + +- 解释代码。 +- 理解报错。 +- 规划重构。 +- 在提交前做审查建议。 +- 理解当前激活文件。 + +## 什么时候用 AI Agent + +当一项工作需要多个步骤时,更适合使用 AI Agent: + +- 检查项目文件。 +- 规划修改方案。 +- 执行编辑。 +- 运行检查。 +- 汇总结果。 + +免费用户可在额度内使用 Agent,Pro 可解锁无限次 Agent 执行。 + +## 安全模型 + +Agent 工作流围绕受控工具执行、校验层、写入限制和敏感操作处理来设计。面对生产系统时,仍然建议在应用变更前审查命令和修改内容。 + +## 相关文档 + +- [AI 助手](/zh/docs/ai) +- [安全与防护](/docs/security) +- [配置指南](/zh/docs/configuration) +- [NimoteCode Pro](/pro) diff --git a/docs/zh/use-cases/index.md b/docs/zh/use-cases/index.md new file mode 100644 index 0000000..a88db68 --- /dev/null +++ b/docs/zh/use-cases/index.md @@ -0,0 +1,49 @@ +--- +title: 移动开发使用场景 | NimoteCode +description: 了解 NimoteCode 在远程热修、值班诊断、AI Agent 工作流、移动 SSH 开发与手机编码场景中的实际价值。 +--- + +# 移动开发使用场景 + +NimoteCode 是面向真实开发任务的移动 IDE 和开发工作区,不只是功能清单。这个页面把产品能力和用户真实会搜索的问题连接起来,帮助中文用户、搜索引擎和大模型更快理解它适合解决什么问题。 + +## 为什么要看场景 + +很多开发者不会先搜产品名,而是先搜问题: + +- 移动 SSH IDE +- 手机上的代码编辑器 +- 手机终端和 Git +- 远程热修工作流 +- 值班排障 +- 带终端能力的 AI 编程助手 + +NimoteCode 把这些场景放进同一个产品里,通过 SSH 工作区、代码编辑、终端执行、Git 审查、AI 辅助、调试和任务流把完整开发闭环串起来。 + +## 核心场景 + +### [手机远程热修](/zh/use-cases/remote-hotfix) + +通过 SSH 打开远程工作区,修改文件、运行验证命令、检查 Git diff,并在手机或平板上完成一次真实补丁流程。 + +### [移动值班诊断](/zh/use-cases/on-call-diagnostics) + +离开电脑时,仍然可以使用终端、输出搜索、Timeline 诊断、LSP 上下文和调试工具完成问题调查。 + +### [AI Agent 工作流](/zh/use-cases/ai-agent) + +结合 NimoteCode AI Chat 与 AI Agent,在真实工作区上下文中完成代码理解、变更规划和受控多步骤执行。 + +## 相关产品页面 + +- [功能特性](/zh/features) +- [文档总览](/zh/docs) +- [SSH 工作区](/zh/docs/ssh) +- [终端](/zh/docs/terminal) +- [Source Control](/zh/docs/source-control) +- [AI 助手](/zh/docs/ai) +- [调试面板](/zh/docs/debug) + +## 下一步 + +如果你希望最快理解 NimoteCode,先阅读 [快速入门](/zh/docs/quick-start),再进入最符合你工作方式的场景页。 diff --git a/docs/zh/use-cases/on-call-diagnostics.md b/docs/zh/use-cases/on-call-diagnostics.md new file mode 100644 index 0000000..82a3202 --- /dev/null +++ b/docs/zh/use-cases/on-call-diagnostics.md @@ -0,0 +1,34 @@ +--- +title: 移动值班诊断 | NimoteCode +description: 使用 NimoteCode 的终端、搜索、LSP、调试、Timeline 与 AI 能力,在手机或平板上完成值班排障和问题诊断。 +--- + +# 移动值班诊断 + +NimoteCode 适合移动端排障闭环:连接、检查、运行命令、搜索输出,再逐步升级到结构化诊断。 + +## 典型流程 + +1. 通过 SSH 连接目标工作区。 +2. 打开终端,运行健康检查、日志、构建或测试命令。 +3. 搜索终端输出或远程文件内容中的错误特征。 +4. 在编辑器中打开受影响文件。 +5. 如果具备 Pro 权限,使用 LSP 诊断与代码动作继续定位问题。 +6. 在已配置场景下,通过 Debug 查看断点、调用栈、变量和观察表达式。 +7. 使用 Timeline 回看上下文;如具备 Pro,可进一步运行 Timeline AI 做根因分析或修复建议。 + +## 适合使用的能力 + +- 支持断线恢复的终端会话。 +- 支持远程内容搜索,免费额度内可用,Pro 可无限使用。 +- Pro 的 LSP 诊断与 Debug。 +- Timeline 上下文与 Pro 的 Timeline AI。 +- AI Chat 用于解释报错和规划下一步。 + +## 相关文档 + +- [终端](/zh/docs/terminal) +- [搜索](/docs/search) +- [LSP](/zh/docs/lsp) +- [调试面板](/zh/docs/debug) +- [Timeline](/zh/docs/timeline) diff --git a/docs/zh/use-cases/remote-hotfix.md b/docs/zh/use-cases/remote-hotfix.md new file mode 100644 index 0000000..e93b530 --- /dev/null +++ b/docs/zh/use-cases/remote-hotfix.md @@ -0,0 +1,35 @@ +--- +title: 手机远程热修 | NimoteCode +description: 使用 NimoteCode 通过 SSH 连接远程项目,在手机上编辑代码、运行验证命令并完成 Git 审查与提交。 +--- + +# 手机远程热修 + +当生产相关问题不能等你回到电脑前,NimoteCode 可以把核心修复流程收敛到同一个移动工作区里。 + +## 典型流程 + +1. 使用 Remote Explorer 连接服务器或开发主机。 +2. 确认项目根路径正确。 +3. 在编辑器中打开受影响文件。 +4. 用终端检查状态、运行测试或复现问题。 +5. 如有需要,先让 AI Chat 帮你解释问题或规划补丁。 +6. 保存修改。 +7. 如果具备 Pro 权限,使用 Source Control 审查 diff 并提交。 +8. 在合适场景下继续通过同一套 Git 工作流推送或同步。 + +## 适合使用的能力 + +- SSH 配置档案与密钥/密码认证。 +- 标签式编辑器。 +- 终端输出搜索。 +- 远程内容搜索。 +- Pro 的 Source Control 与 Git AI。 +- 如项目需要本地/远程内容移动,可使用 Pro 的 Sync / Cache。 + +## 相关文档 + +- [SSH 工作区](/zh/docs/ssh) +- [编辑器](/zh/docs/editor) +- [终端](/zh/docs/terminal) +- [Source Control](/zh/docs/source-control) diff --git "a/docs/\344\272\247\345\223\201\344\273\213\347\273\215_\344\270\255\346\226\207.md" "b/docs/\344\272\247\345\223\201\344\273\213\347\273\215_\344\270\255\346\226\207.md" deleted file mode 100644 index a35d1a6..0000000 --- "a/docs/\344\272\247\345\223\201\344\273\213\347\273\215_\344\270\255\346\226\207.md" +++ /dev/null @@ -1,78 +0,0 @@ -# NimoteCode 产品介绍 - -【一句话产品定位】 -随身携带的 AI 编程工作台,让你在手机上就能完成从编码到部署的完整开发工作 - -【解决什么问题】 -- 想改代码但电脑不在身边 -- 远程服务器维护还要到处找工具 -- 遇到问题半天查不出原因 -- 复杂操作记不住命令 -- 开发过程零散,出问题难追溯 -- 多工具切换太麻烦,效率低 -- 想利用碎片时间学习但环境受限 - -【典型使用场景】 -1. **通勤路上的紧急修复** - 地铁上收到告警,掏出手机连接服务器,几分钟就定位并修复了问题 - -2. **咖啡店里的快速原型** - 灵感来了,用 AI 助手直接生成代码框架,边写边在终端里运行验证 - -3. **沙发上的服务器维护** - 躺在家里就能查看日志、更新配置、部署代码,不用开电脑 - -4. **团队协作的及时响应** - 同事提交了代码,随时查看差异、合并分支,不耽误项目进度 - -5. **问题复盘与持续学习** - 通过时间线回看整个开发过程,AI 帮你分析哪里出了问题,下次怎么避免 - -【你可以做什么】 -- 随时随地写代码,支持多种编程语言高亮 -- 同时打开多个文件,在它们之间轻松切换 -- 一键连接远程服务器,直接编辑文件、运行命令 -- 同时打开多个终端会话,并行处理多个任务 -- 保存常用命令,一键快速执行 -- 在终端输出中快速搜索查找内容 -- 可视化管理代码版本,查看修改、提交代码 -- 查看文件和代码行的修改历史,了解谁在什么时候改了什么 -- 多人协作时帮助解决代码冲突 -- 让 AI 帮你写代码、解释代码、甚至自动修改文件 -- 在代码中搜索特定文本内容,快速定位 -- 按文件名快速查找文件 -- 搜索函数、变量、类等代码符号 -- 查看代码结构,快速导航到函数或类 -- 管理开发任务,记录完成状态 -- 记录整个开发过程,通过时间线回看 -- AI 帮你分析开发过程中的问题 -- 调试代码,设置断点查看变量 -- 同步本地和远程的项目文件 -- 管理多个 SSH 连接,安全保存登录信息 -- 切换不同的界面主题,选择自己喜欢的风格 -- 配置键盘相关的偏好选项 -- 选择不同的 AI 模型,定制 AI 体验 -- 保存和使用代码片段,快速插入常用代码 -- 快速登录账号,支持多种登录方式 -- 接收应用通知,及时了解重要信息 - -【为什么选择我们】 -- **真·移动端优先**:专为手机和平板设计,操作流畅不将就 -- **AI 不只是聊天**:能真正帮你执行操作,从「问答」到「做事」 -- **远程开发零门槛**:SSH、终端、Git 一体化,一个应用全搞定 -- **过程可追溯**:时间线记录开发全程,问题定位快人一步 -- **功能超全面**:从代码编辑、调试、版本控制到任务管理,应有尽有 -- **多终端并行**:同时运行多个终端,效率翻倍 -- **智能搜索**:文件、内容、符号都能搜,快速找到想要的 -- **历史可追踪**:文件、代码行的修改历史一目了然 -- **个性化定制**:主题、键盘、AI 模型都能按自己喜好设置 -- **跨设备无缝**:手机、平板都能用,场景切换不中断 - -【适合谁使用】 -- 需要随时处理线上问题的后端工程师 -- 喜欢在移动中构思和验证想法的全栈开发者 -- 经常需要维护远程服务器的运维人员 -- 希望利用碎片时间学习编程的学生 -- 追求高效开发体验的技术极客 -- 需要随时随地响应团队协作的开发人员 -- 想要完整记录和复盘开发过程的学习者 diff --git a/package-lock.json b/package-lock.json index cd973f1..49fc0ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,11 @@ "name": "NimoteCode", "version": "1.0.0", "devDependencies": { - "vitepress": "^1.1.0" + "sharp": "^0.35.2", + "vite-plugin-image-optimizer": "^2.0.3", + "vitepress": "^1.6.4", + "vitepress-plugin-google-analytics": "^1.0.2", + "wrangler": "^4.106.0" } }, "node_modules/@algolia/abtesting": { @@ -172,7 +176,6 @@ "integrity": "sha512-b5hlU69CuhnS2Rqgsz7uSW0t4VqrLMLTPbUpEl0QVz56rsSwr1Sugyogrjb493sWDA+XU1FU5m9eB8uH7MoI0g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.47.0", "@algolia/requester-browser-xhr": "5.47.0", @@ -320,6 +323,130 @@ "node": ">=6.9.0" } }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.5.0.tgz", + "integrity": "sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==", + "dev": true, + "license": "MIT OR Apache-2.0", + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@cloudflare/unenv-preset": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.16.1.tgz", + "integrity": "sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==", + "dev": true, + "license": "MIT OR Apache-2.0", + "peerDependencies": { + "unenv": "2.0.0-rc.24", + "workerd": ">1.20260305.0 <2.0.0-0" + }, + "peerDependenciesMeta": { + "workerd": { + "optional": true + } + } + }, + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20260630.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260630.1.tgz", + "integrity": "sha512-oEVsD2NZtPAMaEvFeH2Y6N63yiFuOnPDKeAM+l8AkRbLAbFk462uWOq6/ZLn8ouY4P4coMkgsOPqcT1mkuzvzg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20260630.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260630.1.tgz", + "integrity": "sha512-tar1vcQSzM+27Agrlv28BhtN1tIFKw2YHrzldEMyQJOJB/885TU8Z3oO1c/a9YOmsKABhD6I4dGFhsmXyrbK1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20260630.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260630.1.tgz", + "integrity": "sha512-mhjIg91+ikWw5v9tY4BYO7N9vLOZBhn7EnVFvxCdxcpuUUFBKATxUYHUy1kkgYxnmiI6s93PRNbzBz1NpYQ3IQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20260630.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260630.1.tgz", + "integrity": "sha512-7g0iGvMCwGct+vE3FOKXtFWMAIGHzK2Ei9oALp44gXuL4lBcs3PPJISeTp5itquW2JwS1fw4Hnq7zrT7N/dgPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20260630.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260630.1.tgz", + "integrity": "sha512-J5KF9VF8yRpRBib/cPSuEp6iR9q3/cKgeDVhg1ZtuwpkzwnmCb+rxMF5WFLxAN8bI2x2FMG1v6o4vVFOGZ0fOQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@docsearch/css": { "version": "3.8.2", "resolved": "https://registry.npmmirror.com/@docsearch/css/-/css-3.8.2.tgz", @@ -371,6 +498,17 @@ } } }, + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -660,6 +798,23 @@ "node": ">=12" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { "version": "0.21.5", "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", @@ -677,6 +832,23 @@ "node": ">=12" } }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/openbsd-x64": { "version": "0.21.5", "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", @@ -694,6 +866,23 @@ "node": ">=12" } }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/sunos-x64": { "version": "0.21.5", "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", @@ -779,1108 +968,1764 @@ "dev": true, "license": "MIT" }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.56.0.tgz", - "integrity": "sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw==", - "cpu": [ - "arm" - ], + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.56.0.tgz", - "integrity": "sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q==", + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.35.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.2.tgz", + "integrity": "sha512-eEieHsMksAW4IiO5NzauESRl2D2qz3J/kwUxUrSfV06A93eEaRfMpHXyUb1mAqrR7i8U9A0GRqE9pjn6u1Jjpg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "android" - ] + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.3.1" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.56.0.tgz", - "integrity": "sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w==", + "node_modules/@img/sharp-darwin-x64": { + "version": "0.35.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.2.tgz", + "integrity": "sha512-BaktuGPCeHJMARpodR8jK4uKiZrPAy9WrfQW0sdI37clracq8Bp01AYS3SZgi5FS/y5twa9t4+LIuuxQjqRrWw==", "cpu": [ - "arm64" + "x64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.56.0.tgz", - "integrity": "sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g==", - "cpu": [ - "x64" ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.3.1" + } + }, + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.2.tgz", + "integrity": "sha512-YoAxdnd8hPUkvLHd3bWY+YA8nw3xM/RyRopYucNsWHVSan8NLVM3X2volsfoRDcXdUJPg6tXahSd7HXPK7lRnw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "darwin" - ] + "freebsd" + ], + "dependencies": { + "@img/sharp-wasm32": "0.35.2" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.56.0.tgz", - "integrity": "sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ==", + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.1.tgz", + "integrity": "sha512-4V/M3roRMTYjiwZY9IOVQOE8OyeCxFAkYmyZDrZl51uOKjibm3oeEJ4WAmLxutAfzFbC9jqUiPs2gbnGflH+7g==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "freebsd" - ] + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.56.0.tgz", - "integrity": "sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg==", + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.1.tgz", + "integrity": "sha512-c0/DxItpJv2+dGhgycJBBgotdqruGYDvA79drdh0MD1dFpy7JzJ/PlXwi1H4rFf0eTy8tgbI91aHDnZIceY3jQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "freebsd" - ] + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.56.0.tgz", - "integrity": "sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A==", + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.1.tgz", + "integrity": "sha512-aGGy9aWzXgHBG7HNyQPWorZthlp7+x6fDRoPAQbGO3ThcttuTyKIx3NuSHb6zb4gBNq6/yNn9f1cy9nFKS/Vmg==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" - ] + ], + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.56.0.tgz", - "integrity": "sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw==", + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.1.tgz", + "integrity": "sha512-JznefmcK9j1JKPz8AkQDh89kjojubyfOasWBPKfzMIhPwsgDy9evpE/naJTXXXmghS1iFwR8u/kTwh/I2/+GCw==", "cpu": [ - "arm" + "arm64" ], "dev": true, - "license": "MIT", + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" - ] + ], + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.56.0.tgz", - "integrity": "sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ==", + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.1.tgz", + "integrity": "sha512-1EkwGNCZk6iWNCMWqrvdJ+r1j0PT1zIz60CNPhYnJlK/zyeWqlsPZIe+ocBVqPF8k/Ssee/NCk+tE9Ryrko6ng==", "cpu": [ - "arm64" + "ppc64" ], "dev": true, - "license": "MIT", + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" - ] + ], + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.56.0.tgz", - "integrity": "sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA==", + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.1.tgz", + "integrity": "sha512-Ilays+w2bXdnxzxtQdmXR62u8o8GYa3eL4+Gr+1KiE4xperMZUslRaVPJwwPkzlHEjGfXAfRVAa/7CYCtSqsBw==", "cpu": [ - "arm64" + "riscv64" ], "dev": true, - "license": "MIT", + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" - ] + ], + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.56.0.tgz", - "integrity": "sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg==", + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.1.tgz", + "integrity": "sha512-VfBwVHQTbRoj4XlpA/KLZ7ltgMpz+4WSejFzQ+GnoImjo1PtEJ59QB2qR1xQEeRPYIkNrPIm2L4cICMvz4C2ew==", "cpu": [ - "loong64" + "s390x" ], "dev": true, - "license": "MIT", + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" - ] + ], + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.56.0.tgz", - "integrity": "sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA==", + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.1.tgz", + "integrity": "sha512-+c8ukgwU62DS54nCAjw7keOfHUkmr0B5QHEdcOqRnodF/MNXJbVI8Eopoj4B/0H8Asr65I+A4Amrn7a85/md6A==", "cpu": [ - "loong64" + "x64" ], "dev": true, - "license": "MIT", + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" - ] + ], + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.56.0.tgz", - "integrity": "sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw==", + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.1.tgz", + "integrity": "sha512-qlKb/pwbkAi1WMsJrYHk7CuDrd12s27U2QnRhFYUoJNrRCmkosMTttuRFat/DDB3IlDm5qE1TJgZ4JDnHX8Ldw==", "cpu": [ - "ppc64" + "arm64" ], "dev": true, - "license": "MIT", + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" - ] + ], + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.56.0.tgz", - "integrity": "sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg==", + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.1.tgz", + "integrity": "sha512-yO21HwoUVLN8Qa+/SBjQLMYwBWAVJjeGPNe+hc0OUeMeifEtJqu5a1c4HayE1nNpDih9y3/KkoltfkDodmKAlg==", "cpu": [ - "ppc64" + "x64" ], "dev": true, - "license": "MIT", + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" - ] + ], + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.56.0.tgz", - "integrity": "sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew==", + "node_modules/@img/sharp-linux-arm": { + "version": "0.35.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.2.tgz", + "integrity": "sha512-SE4kzF2mepn6z+6E7L6lsV8FzuLL6IPQdyX8ZiwROAG/G8td+hP/m7FsFPwidtrF19gvajuC9l6TxAVcsA4S7A==", "cpu": [ - "riscv64" + "arm" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.3.1" + } }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.56.0.tgz", - "integrity": "sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ==", + "node_modules/@img/sharp-linux-arm64": { + "version": "0.35.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.2.tgz", + "integrity": "sha512-af12Pnd0ZGu2HfP8NayB0kk6eC/lrfbQE6HlR4jD+34wdJ1Vw9TF6TMn6ZvffT+WgqVsl0hRbmNvz2u/23VmwA==", "cpu": [ - "riscv64" + "arm64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.3.1" + } }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.56.0.tgz", - "integrity": "sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ==", + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.35.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.2.tgz", + "integrity": "sha512-hYSBm7zcNtDCozCxQHYZJiu63b/bXsgRZuOxCIBZsStMM9Vap47iFHdbX4kCvQsblPB/k+clhELpdQJHQLSHvg==", "cpu": [ - "s390x" + "ppc64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.3.1" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.56.0.tgz", - "integrity": "sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw==", + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.35.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.2.tgz", + "integrity": "sha512-qQt0Kc13+Hoan/Awq/qMSQw3L+RI1NCRPgD5cUJ/1WSSmIoysLOc72jlRM3E0OHN9Yr313jgeQ2T+zW+F03QFA==", "cpu": [ - "x64" + "riscv64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.3.1" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.56.0.tgz", - "integrity": "sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA==", + "node_modules/@img/sharp-linux-s390x": { + "version": "0.35.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.2.tgz", + "integrity": "sha512-E4fLLfRPzDLlEeDaTzI98OFLcv++WL5ChLLMwPoVd0CIoZQqupBSNbOisPL5am9XsbQ9T84+iiMpUvbFtkunbA==", "cpu": [ - "x64" + "s390x" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.3.1" + } }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.56.0.tgz", - "integrity": "sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==", + "node_modules/@img/sharp-linux-x64": { + "version": "0.35.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.2.tgz", + "integrity": "sha512-gi0zFJJRLswfCZmHtJdikXPOc5u7qamSOS3NHedLqLd4W8Q0NqjdBr6TTRIgsfFjqfTsHFgdfvJ9LwqSgcHiAA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "openbsd" - ] + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.3.1" + } }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.56.0.tgz", - "integrity": "sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ==", + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.35.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.2.tgz", + "integrity": "sha512-siWbOW1u6HFnFLrp0waKyW7VEf7jYvcDWdrXEFa8AkdAQgEvuu5Fz8/Y70w9EeqAdwDtfU012BhEHHaDqvQNzg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "openharmony" - ] + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.3.1" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.56.0.tgz", - "integrity": "sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing==", + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.35.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.2.tgz", + "integrity": "sha512-YBqMMcjDi4QGYiSn4vNOYBhmlC4z5AXqkOUUqI2e0AFA4urNv4ESgOgwNl3K+4etQhha0twXlzeF20bbULm9Yg==", "cpu": [ - "arm64" + "x64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "win32" - ] + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.3.1" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.56.0.tgz", - "integrity": "sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg==", + "node_modules/@img/sharp-wasm32": { + "version": "0.35.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-wasm32/-/sharp-wasm32-0.35.2.tgz", + "integrity": "sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw==", + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.11.1" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.2.tgz", + "integrity": "sha512-QNV27pxs9wpApEiCfvHM1RDoP1w1+2KrUWWDPEhEwg+latvOrfuhWrHWZKwdSFwU6jh3myjw/yOCRsUIuOft3g==", "cpu": [ - "ia32" + "wasm32" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/sharp-wasm32": "0.35.2" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.35.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.2.tgz", + "integrity": "sha512-BiVRYc/t6/Vl3e1hBx0hugG4oN9Pydf4fgMSpxTQJmwGUg/YoXTWHiFeRymHfCZzifxu4F4rpk/I67D0LQ20wQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.56.0.tgz", - "integrity": "sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ==", + "node_modules/@img/sharp-win32-ia32": { + "version": "0.35.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.2.tgz", + "integrity": "sha512-YYEhx9PImCC7T0tI8JDMi4DB9LwLCXCU5OWNYEXAxh5Q1ShKkyC6byxzoBJ3gEFDnH2lQckWuDe70G7mB2XJog==", "cpu": [ - "x64" + "ia32" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": "^20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.56.0.tgz", - "integrity": "sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==", + "node_modules/@img/sharp-win32-x64": { + "version": "0.35.2", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.2.tgz", + "integrity": "sha512-imoOyBcoM/iiUr4J6VPpCNjPnjvP/Gks95898yB8YqoGGYmHYbOyCuNv9FMhFgtaiHFGbHW8bxKqRV6VjtXThQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/@shikijs/core": { - "version": "2.5.0", - "resolved": "https://registry.npmmirror.com/@shikijs/core/-/core-2.5.0.tgz", - "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/engine-javascript": "2.5.0", - "@shikijs/engine-oniguruma": "2.5.0", - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.4" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@shikijs/engine-javascript": { - "version": "2.5.0", - "resolved": "https://registry.npmmirror.com/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", - "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", + "node_modules/@poppinss/colors": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", + "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^3.1.0" + "kleur": "^4.1.5" } }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "2.5.0", - "resolved": "https://registry.npmmirror.com/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", - "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", + "node_modules/@poppinss/dumper": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz", + "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2" + "@poppinss/colors": "^4.1.5", + "@sindresorhus/is": "^7.0.2", + "supports-color": "^10.0.0" } }, - "node_modules/@shikijs/langs": { - "version": "2.5.0", - "resolved": "https://registry.npmmirror.com/@shikijs/langs/-/langs-2.5.0.tgz", - "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", + "node_modules/@poppinss/exception": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", + "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "2.5.0" - } + "license": "MIT" }, - "node_modules/@shikijs/themes": { - "version": "2.5.0", - "resolved": "https://registry.npmmirror.com/@shikijs/themes/-/themes-2.5.0.tgz", - "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.56.0.tgz", + "integrity": "sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "@shikijs/types": "2.5.0" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@shikijs/transformers": { - "version": "2.5.0", - "resolved": "https://registry.npmmirror.com/@shikijs/transformers/-/transformers-2.5.0.tgz", - "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.56.0.tgz", + "integrity": "sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@shikijs/core": "2.5.0", - "@shikijs/types": "2.5.0" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@shikijs/types": { - "version": "2.5.0", - "resolved": "https://registry.npmmirror.com/@shikijs/types/-/types-2.5.0.tgz", - "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.56.0.tgz", + "integrity": "sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmmirror.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.56.0.tgz", + "integrity": "sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.56.0.tgz", + "integrity": "sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.56.0.tgz", + "integrity": "sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "*" - } + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.56.0.tgz", + "integrity": "sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/markdown-it": { - "version": "14.1.2", - "resolved": "https://registry.npmmirror.com/@types/markdown-it/-/markdown-it-14.1.2.tgz", - "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.56.0.tgz", + "integrity": "sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmmirror.com/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.56.0.tgz", + "integrity": "sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "*" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.56.0.tgz", + "integrity": "sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.56.0.tgz", + "integrity": "sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg==", + "cpu": [ + "loong64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.21", - "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", - "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.56.0.tgz", + "integrity": "sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA==", + "cpu": [ + "loong64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.56.0.tgz", + "integrity": "sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "ISC" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.2.4", - "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", - "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.56.0.tgz", + "integrity": "sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vue": "^3.2.25" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@vue/compiler-core": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.27.tgz", - "integrity": "sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.56.0.tgz", + "integrity": "sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@vue/shared": "3.5.27", - "entities": "^7.0.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.27.tgz", - "integrity": "sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==", + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.56.0.tgz", + "integrity": "sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.27", - "@vue/shared": "3.5.27" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.27.tgz", - "integrity": "sha512-sHZu9QyDPeDmN/MRoshhggVOWE5WlGFStKFwu8G52swATgSny27hJRWteKDSUUzUH+wp+bmeNbhJnEAel/auUQ==", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.56.0.tgz", + "integrity": "sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@vue/compiler-core": "3.5.27", - "@vue/compiler-dom": "3.5.27", - "@vue/compiler-ssr": "3.5.27", - "@vue/shared": "3.5.27", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.21", - "postcss": "^8.5.6", - "source-map-js": "^1.2.1" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.27.tgz", - "integrity": "sha512-Sj7h+JHt512fV1cTxKlYhg7qxBvack+BGncSpH+8vnN+KN95iPIcqB5rsbblX40XorP+ilO7VIKlkuu3Xq2vjw==", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.56.0.tgz", + "integrity": "sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.27", - "@vue/shared": "3.5.27" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@vue/devtools-api": { - "version": "7.7.9", - "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.9.tgz", - "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.56.0.tgz", + "integrity": "sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@vue/devtools-kit": "^7.7.9" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@vue/devtools-kit": { - "version": "7.7.9", - "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", - "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.56.0.tgz", + "integrity": "sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@vue/devtools-shared": "^7.7.9", - "birpc": "^2.3.0", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^1.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.2" - } + "optional": true, + "os": [ + "openbsd" + ] }, - "node_modules/@vue/devtools-shared": { - "version": "7.7.9", - "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", - "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.56.0.tgz", + "integrity": "sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "rfdc": "^1.4.1" - } + "optional": true, + "os": [ + "openharmony" + ] }, - "node_modules/@vue/reactivity": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.27.tgz", - "integrity": "sha512-vvorxn2KXfJ0nBEnj4GYshSgsyMNFnIQah/wczXlsNXt+ijhugmW+PpJ2cNPe4V6jpnBcs0MhCODKllWG+nvoQ==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.56.0.tgz", + "integrity": "sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@vue/shared": "3.5.27" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@vue/runtime-core": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.27.tgz", - "integrity": "sha512-fxVuX/fzgzeMPn/CLQecWeDIFNt3gQVhxM0rW02Tvp/YmZfXQgcTXlakq7IMutuZ/+Ogbn+K0oct9J3JZfyk3A==", + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.56.0.tgz", + "integrity": "sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.27", - "@vue/shared": "3.5.27" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.27.tgz", - "integrity": "sha512-/QnLslQgYqSJ5aUmb5F0z0caZPGHRB8LEAQ1s81vHFM5CBfnun63rxhvE/scVb/j3TbBuoZwkJyiLCkBluMpeg==", + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.56.0.tgz", + "integrity": "sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.56.0.tgz", + "integrity": "sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@shikijs/core/-/core-2.5.0.tgz", + "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.27", - "@vue/runtime-core": "3.5.27", - "@vue/shared": "3.5.27", - "csstype": "^3.2.3" + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" } }, - "node_modules/@vue/server-renderer": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.27.tgz", - "integrity": "sha512-qOz/5thjeP1vAFc4+BY3Nr6wxyLhpeQgAE/8dDtKo6a6xdk+L4W46HDZgNmLOBUDEkFXV3G7pRiUqxjX0/2zWA==", + "node_modules/@shikijs/engine-javascript": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", + "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.27", - "@vue/shared": "3.5.27" - }, - "peerDependencies": { - "vue": "3.5.27" + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^3.1.0" } }, - "node_modules/@vue/shared": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.27.tgz", - "integrity": "sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vueuse/core": { - "version": "12.8.2", - "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-12.8.2.tgz", - "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", + "node_modules/@shikijs/engine-oniguruma": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", + "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", "dev": true, "license": "MIT", "dependencies": { - "@types/web-bluetooth": "^0.0.21", - "@vueuse/metadata": "12.8.2", - "@vueuse/shared": "12.8.2", - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2" } }, - "node_modules/@vueuse/integrations": { - "version": "12.8.2", - "resolved": "https://registry.npmmirror.com/@vueuse/integrations/-/integrations-12.8.2.tgz", - "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", + "node_modules/@shikijs/langs": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@shikijs/langs/-/langs-2.5.0.tgz", + "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", "dev": true, "license": "MIT", "dependencies": { - "@vueuse/core": "12.8.2", - "@vueuse/shared": "12.8.2", - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "async-validator": "^4", - "axios": "^1", - "change-case": "^5", - "drauu": "^0.4", - "focus-trap": "^7", - "fuse.js": "^7", - "idb-keyval": "^6", - "jwt-decode": "^4", - "nprogress": "^0.2", - "qrcode": "^1.5", - "sortablejs": "^1", - "universal-cookie": "^7" - }, - "peerDependenciesMeta": { - "async-validator": { - "optional": true - }, - "axios": { - "optional": true - }, - "change-case": { - "optional": true - }, - "drauu": { - "optional": true - }, - "focus-trap": { - "optional": true - }, - "fuse.js": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "jwt-decode": { - "optional": true - }, - "nprogress": { - "optional": true - }, - "qrcode": { - "optional": true - }, - "sortablejs": { - "optional": true - }, - "universal-cookie": { - "optional": true - } - } - }, - "node_modules/@vueuse/metadata": { - "version": "12.8.2", - "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-12.8.2.tgz", - "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" + "@shikijs/types": "2.5.0" } }, - "node_modules/@vueuse/shared": { - "version": "12.8.2", - "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-12.8.2.tgz", - "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", + "node_modules/@shikijs/themes": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@shikijs/themes/-/themes-2.5.0.tgz", + "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", "dev": true, "license": "MIT", "dependencies": { - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "@shikijs/types": "2.5.0" } }, - "node_modules/algoliasearch": { - "version": "5.47.0", - "resolved": "https://registry.npmmirror.com/algoliasearch/-/algoliasearch-5.47.0.tgz", - "integrity": "sha512-AGtz2U7zOV4DlsuYV84tLp2tBbA7RPtLA44jbVH4TTpDcc1dIWmULjHSsunlhscbzDydnjuFlNhflR3nV4VJaQ==", + "node_modules/@shikijs/transformers": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@shikijs/transformers/-/transformers-2.5.0.tgz", + "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@algolia/abtesting": "1.13.0", - "@algolia/client-abtesting": "5.47.0", - "@algolia/client-analytics": "5.47.0", - "@algolia/client-common": "5.47.0", - "@algolia/client-insights": "5.47.0", - "@algolia/client-personalization": "5.47.0", - "@algolia/client-query-suggestions": "5.47.0", - "@algolia/client-search": "5.47.0", - "@algolia/ingestion": "1.47.0", - "@algolia/monitoring": "1.47.0", - "@algolia/recommend": "5.47.0", - "@algolia/requester-browser-xhr": "5.47.0", - "@algolia/requester-fetch": "5.47.0", - "@algolia/requester-node-http": "5.47.0" - }, - "engines": { - "node": ">= 14.0.0" + "@shikijs/core": "2.5.0", + "@shikijs/types": "2.5.0" } }, - "node_modules/birpc": { - "version": "2.9.0", - "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.9.0.tgz", - "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "node_modules/@shikijs/types": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@shikijs/types/-/types-2.5.0.tgz", + "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" } }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmmirror.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "license": "MIT" }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "node_modules/@sindresorhus/is": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", "dev": true, "license": "MIT", + "engines": { + "node": ">=18" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "node_modules/@speed-highlight/core": { + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.17.tgz", + "integrity": "sha512-Z92FwKpCtfaW1V0jTU/fh3QzYEZN8wDwrzRIBoADCJfn4mJCNcJN/XegifX7BDrQ8/h9Xh/JnbyMchL0FqXrkg==", "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "license": "CC0-1.0" }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "license": "MIT" }, - "node_modules/copy-anything": { - "version": "4.0.5", - "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-4.0.5.tgz", - "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, "license": "MIT", "dependencies": { - "is-what": "^5.2.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" + "@types/unist": "*" } }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", "dev": true, "license": "MIT" }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmmirror.com/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" } }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dev": true, "license": "MIT", "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "@types/unist": "*" } }, - "node_modules/emoji-regex-xs": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", - "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", "dev": true, "license": "MIT" }, - "node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } + "license": "MIT" }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, "engines": { - "node": ">=12" + "node": "^18.0.0 || >=20.0.0" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "node_modules/@vue/compiler-core": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.27.tgz", + "integrity": "sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/shared": "3.5.27", + "entities": "^7.0.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } }, - "node_modules/focus-trap": { - "version": "7.8.0", - "resolved": "https://registry.npmmirror.com/focus-trap/-/focus-trap-7.8.0.tgz", - "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", + "node_modules/@vue/compiler-dom": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.27.tgz", + "integrity": "sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "tabbable": "^6.4.0" + "@vue/compiler-core": "3.5.27", + "@vue/shared": "3.5.27" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/@vue/compiler-sfc": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.27.tgz", + "integrity": "sha512-sHZu9QyDPeDmN/MRoshhggVOWE5WlGFStKFwu8G52swATgSny27hJRWteKDSUUzUH+wp+bmeNbhJnEAel/auUQ==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/compiler-core": "3.5.27", + "@vue/compiler-dom": "3.5.27", + "@vue/compiler-ssr": "3.5.27", + "@vue/shared": "3.5.27", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" } }, - "node_modules/hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmmirror.com/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "node_modules/@vue/compiler-ssr": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.27.tgz", + "integrity": "sha512-Sj7h+JHt512fV1cTxKlYhg7qxBvack+BGncSpH+8vnN+KN95iPIcqB5rsbblX40XorP+ilO7VIKlkuu3Xq2vjw==", "dev": true, "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "@vue/compiler-dom": "3.5.27", + "@vue/shared": "3.5.27" } }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "node_modules/@vue/devtools-api": { + "version": "7.7.9", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", "dev": true, "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "@vue/devtools-kit": "^7.7.9" } }, - "node_modules/hookable": { - "version": "5.5.3", - "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz", - "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "rfdc": "^1.4.1" } }, - "node_modules/is-what": { - "version": "5.5.0", - "resolved": "https://registry.npmmirror.com/is-what/-/is-what-5.5.0.tgz", - "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "node_modules/@vue/reactivity": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.27.tgz", + "integrity": "sha512-vvorxn2KXfJ0nBEnj4GYshSgsyMNFnIQah/wczXlsNXt+ijhugmW+PpJ2cNPe4V6jpnBcs0MhCODKllWG+nvoQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" + "dependencies": { + "@vue/shared": "3.5.27" } }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "node_modules/@vue/runtime-core": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.27.tgz", + "integrity": "sha512-fxVuX/fzgzeMPn/CLQecWeDIFNt3gQVhxM0rW02Tvp/YmZfXQgcTXlakq7IMutuZ/+Ogbn+K0oct9J3JZfyk3A==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" + "@vue/reactivity": "3.5.27", + "@vue/shared": "3.5.27" } }, - "node_modules/mark.js": { - "version": "8.11.1", - "resolved": "https://registry.npmmirror.com/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "node_modules/@vue/runtime-dom": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.27.tgz", + "integrity": "sha512-/QnLslQgYqSJ5aUmb5F0z0caZPGHRB8LEAQ1s81vHFM5CBfnun63rxhvE/scVb/j3TbBuoZwkJyiLCkBluMpeg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.27", + "@vue/runtime-core": "3.5.27", + "@vue/shared": "3.5.27", + "csstype": "^3.2.3" + } }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmmirror.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "node_modules/@vue/server-renderer": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.27.tgz", + "integrity": "sha512-qOz/5thjeP1vAFc4+BY3Nr6wxyLhpeQgAE/8dDtKo6a6xdk+L4W46HDZgNmLOBUDEkFXV3G7pRiUqxjX0/2zWA==", "dev": true, "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", + "@vue/compiler-ssr": "3.5.27", + "@vue/shared": "3.5.27" + }, + "peerDependencies": { + "vue": "3.5.27" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.27.tgz", + "integrity": "sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "12.8.2", + "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-12.8.2.tgz", + "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/integrations": { + "version": "12.8.2", + "resolved": "https://registry.npmmirror.com/@vueuse/integrations/-/integrations-12.8.2.tgz", + "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vueuse/core": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.8.2", + "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-12.8.2.tgz", + "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.8.2", + "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-12.8.2.tgz", + "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/algoliasearch": { + "version": "5.47.0", + "resolved": "https://registry.npmmirror.com/algoliasearch/-/algoliasearch-5.47.0.tgz", + "integrity": "sha512-AGtz2U7zOV4DlsuYV84tLp2tBbA7RPtLA44jbVH4TTpDcc1dIWmULjHSsunlhscbzDydnjuFlNhflR3nV4VJaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.13.0", + "@algolia/client-abtesting": "5.47.0", + "@algolia/client-analytics": "5.47.0", + "@algolia/client-common": "5.47.0", + "@algolia/client-insights": "5.47.0", + "@algolia/client-personalization": "5.47.0", + "@algolia/client-query-suggestions": "5.47.0", + "@algolia/client-search": "5.47.0", + "@algolia/ingestion": "1.47.0", + "@algolia/monitoring": "1.47.0", + "@algolia/recommend": "5.47.0", + "@algolia/requester-browser-xhr": "5.47.0", + "@algolia/requester-fetch": "5.47.0", + "@algolia/requester-node-http": "5.47.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "dev": true, + "license": "MIT" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/focus-trap": { + "version": "7.8.0", + "resolved": "https://registry.npmmirror.com/focus-trap/-/focus-trap-7.8.0.tgz", + "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tabbable": "^6.4.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmmirror.com/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmmirror.com/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmmirror.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" }, @@ -1889,618 +2734,1846 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/miniflare": { + "version": "4.20260630.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260630.0.tgz", + "integrity": "sha512-lyRplDrSJJWVpzSSQPBSQtNmUuxScCZyOOkXFs37uSbdTfWRDDmw6DyFKVS2s1eYtA/i4u2xR/0FyPIsTl/HJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "sharp": "0.34.5", + "undici": "7.28.0", + "workerd": "1.20260630.1", + "ws": "8.21.0", + "youch": "4.1.0-beta.10" + }, + "bin": { + "miniflare": "bootstrap.js" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/miniflare/node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/minisearch": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", + "dev": true, + "license": "MIT" + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/oniguruma-to-es": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", + "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.28.2", + "resolved": "https://registry.npmmirror.com/preact/-/preact-10.28.2.tgz", + "integrity": "sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true, + "license": "MIT" + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.56.0", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.56.0.tgz", + "integrity": "sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.56.0", + "@rollup/rollup-android-arm64": "4.56.0", + "@rollup/rollup-darwin-arm64": "4.56.0", + "@rollup/rollup-darwin-x64": "4.56.0", + "@rollup/rollup-freebsd-arm64": "4.56.0", + "@rollup/rollup-freebsd-x64": "4.56.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.56.0", + "@rollup/rollup-linux-arm-musleabihf": "4.56.0", + "@rollup/rollup-linux-arm64-gnu": "4.56.0", + "@rollup/rollup-linux-arm64-musl": "4.56.0", + "@rollup/rollup-linux-loong64-gnu": "4.56.0", + "@rollup/rollup-linux-loong64-musl": "4.56.0", + "@rollup/rollup-linux-ppc64-gnu": "4.56.0", + "@rollup/rollup-linux-ppc64-musl": "4.56.0", + "@rollup/rollup-linux-riscv64-gnu": "4.56.0", + "@rollup/rollup-linux-riscv64-musl": "4.56.0", + "@rollup/rollup-linux-s390x-gnu": "4.56.0", + "@rollup/rollup-linux-x64-gnu": "4.56.0", + "@rollup/rollup-linux-x64-musl": "4.56.0", + "@rollup/rollup-openbsd-x64": "4.56.0", + "@rollup/rollup-openharmony-arm64": "4.56.0", + "@rollup/rollup-win32-arm64-msvc": "4.56.0", + "@rollup/rollup-win32-ia32-msvc": "4.56.0", + "@rollup/rollup-win32-x64-gnu": "4.56.0", + "@rollup/rollup-win32-x64-msvc": "4.56.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmmirror.com/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.35.2", + "resolved": "https://registry.npmmirror.com/sharp/-/sharp-0.35.2.tgz", + "integrity": "sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.1.0", + "detect-libc": "^2.1.2", + "semver": "^7.8.4" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.35.2", + "@img/sharp-darwin-x64": "0.35.2", + "@img/sharp-freebsd-wasm32": "0.35.2", + "@img/sharp-libvips-darwin-arm64": "1.3.1", + "@img/sharp-libvips-darwin-x64": "1.3.1", + "@img/sharp-libvips-linux-arm": "1.3.1", + "@img/sharp-libvips-linux-arm64": "1.3.1", + "@img/sharp-libvips-linux-ppc64": "1.3.1", + "@img/sharp-libvips-linux-riscv64": "1.3.1", + "@img/sharp-libvips-linux-s390x": "1.3.1", + "@img/sharp-libvips-linux-x64": "1.3.1", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.1", + "@img/sharp-libvips-linuxmusl-x64": "1.3.1", + "@img/sharp-linux-arm": "0.35.2", + "@img/sharp-linux-arm64": "0.35.2", + "@img/sharp-linux-ppc64": "0.35.2", + "@img/sharp-linux-riscv64": "0.35.2", + "@img/sharp-linux-s390x": "0.35.2", + "@img/sharp-linux-x64": "0.35.2", + "@img/sharp-linuxmusl-arm64": "0.35.2", + "@img/sharp-linuxmusl-x64": "0.35.2", + "@img/sharp-webcontainers-wasm32": "0.35.2", + "@img/sharp-win32-arm64": "0.35.2", + "@img/sharp-win32-ia32": "0.35.2", + "@img/sharp-win32-x64": "0.35.2" + } + }, + "node_modules/shiki": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/shiki/-/shiki-2.5.0.tgz", + "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/langs": "2.5.0", + "@shikijs/themes": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tabbable": { + "version": "6.4.0", + "resolved": "https://registry.npmmirror.com/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", + "dev": true, + "license": "MIT" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/undici": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", + "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/unenv": { + "version": "2.0.0-rc.24", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", + "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmmirror.com/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "stylus": { + "optional": true }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "sugarss": { + "optional": true }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "terser": { + "optional": true } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" } }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "node_modules/vite-plugin-image-optimizer": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/vite-plugin-image-optimizer/-/vite-plugin-image-optimizer-2.0.3.tgz", + "integrity": "sha512-1vrFOTcpSvv6DCY7h8UXab4wqMAjTJB/ndOzG/Kmj1oDOuPF6mbjkNQoGzzCEYeWGe7qU93jc8oQqvoJ57al3A==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "pathe": "^2.0.3" + }, + "engines": { + "node": ">=18.17.0" + }, + "peerDependencies": { + "sharp": ">=0.34.0", + "svgo": ">=4", + "vite": ">=5" + }, + "peerDependenciesMeta": { + "sharp": { + "optional": true }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "svgo": { + "optional": true } - ], - "license": "MIT" + } }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "node_modules/vitepress": { + "version": "1.6.4", + "resolved": "https://registry.npmmirror.com/vitepress/-/vitepress-1.6.4.tgz", + "integrity": "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "license": "MIT", + "dependencies": { + "@docsearch/css": "3.8.2", + "@docsearch/js": "3.8.2", + "@iconify-json/simple-icons": "^1.2.21", + "@shikijs/core": "^2.1.0", + "@shikijs/transformers": "^2.1.0", + "@shikijs/types": "^2.1.0", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^5.2.1", + "@vue/devtools-api": "^7.7.0", + "@vue/shared": "^3.5.13", + "@vueuse/core": "^12.4.0", + "@vueuse/integrations": "^12.4.0", + "focus-trap": "^7.6.4", + "mark.js": "8.11.1", + "minisearch": "^7.1.1", + "shiki": "^2.1.0", + "vite": "^5.4.14", + "vue": "^3.5.13" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "postcss": { + "optional": true } - ], - "license": "MIT" + } }, - "node_modules/minisearch": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/minisearch/-/minisearch-7.2.0.tgz", - "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", + "node_modules/vitepress-plugin-google-analytics": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/vitepress-plugin-google-analytics/-/vitepress-plugin-google-analytics-1.0.2.tgz", + "integrity": "sha512-ri8bFUAmt3c/DtPrALauGBIUr2gIJ11c1qNRhwd3/+aiuYZBfQpOosSxcO1AswgwRxP9FwBS6Z7jgdDVyXb2hA==", "dev": true, "license": "MIT" }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "node_modules/vue": { + "version": "3.5.27", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.27.tgz", + "integrity": "sha512-aJ/UtoEyFySPBGarREmN4z6qNKpbEguYHMmXSiOGk69czc+zhs0NF6tEFrY8TZKAl8N/LYAkd4JHVd5E/AsSmw==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.27", + "@vue/compiler-sfc": "3.5.27", + "@vue/runtime-dom": "3.5.27", + "@vue/server-renderer": "3.5.27", + "@vue/shared": "3.5.27" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "node_modules/workerd": { + "version": "1.20260630.1", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260630.1.tgz", + "integrity": "sha512-7M0AA4l14hmPGtzQ5YPHyXosIKI/uz3TdcPHeiFDbgb7/0c8ECVMzIaodSV5bZIVhDHL0OlzqITAdPiwAr+dTg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", + "hasInstallScript": true, + "license": "Apache-2.0", "bin": { - "nanoid": "bin/nanoid.cjs" + "workerd": "bin/workerd" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20260630.1", + "@cloudflare/workerd-darwin-arm64": "1.20260630.1", + "@cloudflare/workerd-linux-64": "1.20260630.1", + "@cloudflare/workerd-linux-arm64": "1.20260630.1", + "@cloudflare/workerd-windows-64": "1.20260630.1" } }, - "node_modules/oniguruma-to-es": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", - "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", + "node_modules/wrangler": { + "version": "4.106.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.106.0.tgz", + "integrity": "sha512-b6EVbsvbmAUY4bUQXT3+f8oFP8x+J5rEa5z3Akeh+6vyKiN4x8+PyZ53DPpnqdxhIihhq/a00Yq5chGJ19QXBQ==", "dev": true, - "license": "MIT", + "license": "MIT OR Apache-2.0", "dependencies": { - "emoji-regex-xs": "^1.0.0", - "regex": "^6.0.1", - "regex-recursion": "^6.0.2" + "@cloudflare/kv-asset-handler": "0.5.0", + "@cloudflare/unenv-preset": "2.16.1", + "blake3-wasm": "2.1.5", + "esbuild": "0.28.1", + "miniflare": "4.20260630.0", + "path-to-regexp": "6.3.0", + "unenv": "2.0.0-rc.24", + "workerd": "1.20260630.1" + }, + "bin": { + "cf-wrangler": "bin/cf-wrangler.js", + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" + }, + "engines": { + "node": ">=22.0.0" + }, + "optionalDependencies": { + "fsevents": "2.3.3" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.20260630.1" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + } } }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "node_modules/wrangler/node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "node_modules/wrangler/node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], "dev": true, - "license": "ISC" + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "node_modules/wrangler/node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" ], + "dev": true, "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=18" } }, - "node_modules/preact": { - "version": "10.28.2", - "resolved": "https://registry.npmmirror.com/preact/-/preact-10.28.2.tgz", - "integrity": "sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==", + "node_modules/wrangler/node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmmirror.com/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "node_modules/wrangler/node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/regex": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/regex/-/regex-6.1.0.tgz", - "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "node_modules/wrangler/node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/regex-recursion": { - "version": "6.0.2", - "resolved": "https://registry.npmmirror.com/regex-recursion/-/regex-recursion-6.0.2.tgz", - "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "node_modules/wrangler/node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/regex-utilities": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", - "dev": true, - "license": "MIT" - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/rollup": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.56.0.tgz", - "integrity": "sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==", + "node_modules/wrangler/node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.56.0", - "@rollup/rollup-android-arm64": "4.56.0", - "@rollup/rollup-darwin-arm64": "4.56.0", - "@rollup/rollup-darwin-x64": "4.56.0", - "@rollup/rollup-freebsd-arm64": "4.56.0", - "@rollup/rollup-freebsd-x64": "4.56.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.56.0", - "@rollup/rollup-linux-arm-musleabihf": "4.56.0", - "@rollup/rollup-linux-arm64-gnu": "4.56.0", - "@rollup/rollup-linux-arm64-musl": "4.56.0", - "@rollup/rollup-linux-loong64-gnu": "4.56.0", - "@rollup/rollup-linux-loong64-musl": "4.56.0", - "@rollup/rollup-linux-ppc64-gnu": "4.56.0", - "@rollup/rollup-linux-ppc64-musl": "4.56.0", - "@rollup/rollup-linux-riscv64-gnu": "4.56.0", - "@rollup/rollup-linux-riscv64-musl": "4.56.0", - "@rollup/rollup-linux-s390x-gnu": "4.56.0", - "@rollup/rollup-linux-x64-gnu": "4.56.0", - "@rollup/rollup-linux-x64-musl": "4.56.0", - "@rollup/rollup-openbsd-x64": "4.56.0", - "@rollup/rollup-openharmony-arm64": "4.56.0", - "@rollup/rollup-win32-arm64-msvc": "4.56.0", - "@rollup/rollup-win32-ia32-msvc": "4.56.0", - "@rollup/rollup-win32-x64-gnu": "4.56.0", - "@rollup/rollup-win32-x64-msvc": "4.56.0", - "fsevents": "~2.3.2" + "node": ">=18" } }, - "node_modules/search-insights": { - "version": "2.17.3", - "resolved": "https://registry.npmmirror.com/search-insights/-/search-insights-2.17.3.tgz", - "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "node_modules/wrangler/node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "peer": true + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/shiki": { - "version": "2.5.0", - "resolved": "https://registry.npmmirror.com/shiki/-/shiki-2.5.0.tgz", - "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", + "node_modules/wrangler/node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@shikijs/core": "2.5.0", - "@shikijs/engine-javascript": "2.5.0", - "@shikijs/engine-oniguruma": "2.5.0", - "@shikijs/langs": "2.5.0", - "@shikijs/themes": "2.5.0", - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "node_modules/wrangler/node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "node_modules/wrangler/node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "node_modules/wrangler/node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmmirror.com/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "node_modules/wrangler/node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/superjson": { - "version": "2.2.6", - "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.6.tgz", - "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "node_modules/wrangler/node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", - "dependencies": { - "copy-anything": "^4" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16" + "node": ">=18" } - }, - "node_modules/tabbable": { - "version": "6.4.0", - "resolved": "https://registry.npmmirror.com/tabbable/-/tabbable-6.4.0.tgz", - "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", - "dev": true, - "license": "MIT" - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + }, + "node_modules/wrangler/node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "node_modules/wrangler/node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "node_modules/wrangler/node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "node_modules/wrangler/node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "node_modules/wrangler/node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" } }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmmirror.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "node_modules/wrangler/node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmmirror.com/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "node_modules/wrangler/node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "node_modules/wrangler/node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmmirror.com/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "node_modules/wrangler/node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "peer": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, "bin": { - "vite": "bin/vite.js" + "esbuild": "bin/esbuild" }, "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" + "node": ">=18" }, "optionalDependencies": { - "fsevents": "~2.3.3" + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { + "bufferutil": { "optional": true }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { + "utf-8-validate": { "optional": true } } }, - "node_modules/vitepress": { - "version": "1.6.4", - "resolved": "https://registry.npmmirror.com/vitepress/-/vitepress-1.6.4.tgz", - "integrity": "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==", + "node_modules/youch": { + "version": "4.1.0-beta.10", + "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz", + "integrity": "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==", "dev": true, "license": "MIT", "dependencies": { - "@docsearch/css": "3.8.2", - "@docsearch/js": "3.8.2", - "@iconify-json/simple-icons": "^1.2.21", - "@shikijs/core": "^2.1.0", - "@shikijs/transformers": "^2.1.0", - "@shikijs/types": "^2.1.0", - "@types/markdown-it": "^14.1.2", - "@vitejs/plugin-vue": "^5.2.1", - "@vue/devtools-api": "^7.7.0", - "@vue/shared": "^3.5.13", - "@vueuse/core": "^12.4.0", - "@vueuse/integrations": "^12.4.0", - "focus-trap": "^7.6.4", - "mark.js": "8.11.1", - "minisearch": "^7.1.1", - "shiki": "^2.1.0", - "vite": "^5.4.14", - "vue": "^3.5.13" - }, - "bin": { - "vitepress": "bin/vitepress.js" - }, - "peerDependencies": { - "markdown-it-mathjax3": "^4", - "postcss": "^8" - }, - "peerDependenciesMeta": { - "markdown-it-mathjax3": { - "optional": true - }, - "postcss": { - "optional": true - } + "@poppinss/colors": "^4.1.5", + "@poppinss/dumper": "^0.6.4", + "@speed-highlight/core": "^1.2.7", + "cookie": "^1.0.2", + "youch-core": "^0.3.3" } }, - "node_modules/vue": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.27.tgz", - "integrity": "sha512-aJ/UtoEyFySPBGarREmN4z6qNKpbEguYHMmXSiOGk69czc+zhs0NF6tEFrY8TZKAl8N/LYAkd4JHVd5E/AsSmw==", + "node_modules/youch-core": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz", + "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@vue/compiler-dom": "3.5.27", - "@vue/compiler-sfc": "3.5.27", - "@vue/runtime-dom": "3.5.27", - "@vue/server-renderer": "3.5.27", - "@vue/shared": "3.5.27" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@poppinss/exception": "^1.2.2", + "error-stack-parser-es": "^1.0.5" } }, "node_modules/zwitch": { diff --git a/package.json b/package.json index 3263fbf..57f6670 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,15 @@ "scripts": { "docs:dev": "vitepress dev docs", "docs:build": "vitepress build docs", - "docs:preview": "vitepress preview docs" + "docs:preview": "vitepress preview docs", + "deploy": "npm run docs:build && wrangler deploy", + "preview": "npm run docs:build && wrangler dev" }, "devDependencies": { - "vitepress": "^1.1.0" + "sharp": "^0.35.2", + "vite-plugin-image-optimizer": "^2.0.3", + "vitepress": "^1.6.4", + "vitepress-plugin-google-analytics": "^1.0.2", + "wrangler": "^4.106.0" } -} \ No newline at end of file +} diff --git a/wrangler.jsonc b/wrangler.jsonc new file mode 100644 index 0000000..b50f7e8 --- /dev/null +++ b/wrangler.jsonc @@ -0,0 +1,14 @@ +{ + "$schema": "node_modules/wrangler/config-schema.json", + "name": "nimotecode-officalwebsite", + "compatibility_date": "2026-07-02", + "observability": { + "enabled": true + }, + "assets": { + "directory": "docs/.vitepress/dist" + }, + "compatibility_flags": [ + "nodejs_compat" + ] +}