# Changelog VRCloud IDE ships as a single, continuously updated release. The repository keeps one commit on `main`; every update replaces it and bumps the version below. Installed servers pick up new versions with `vrcloud update` or the **Update** button in the menubar. ## 4.0.6 ### Fixed - **The agent now actually uses the project's skills on Anthropic and Grok.** Only the Cursor SDK reads `.cursor/`; the other providers need the skills index and rules injected into the prompt. When a `.cursor` link existed, that injection was skipped for everyone, so an Anthropic/Grok agent never saw the available skills. The index (and rules) are now always included for non-Cursor providers, with an instruction to read the matching `SKILL.md` and follow it before improvising; Cursor still defers to its SDK when `.cursor` is present. - **Remote desktop error `CopyFromScreen ... "The handle is invalid"` on Windows.** The screen capture reused one graphics context across frames, so once the desktop handle went stale (lock/unlock, resolution change, RDP reconnect, secure/UAC desktop) every capture failed for good. It now recreates the context and retries, recovering on its own; if the session truly has no desktop, the message explains it and points at console auto-logon instead of the cryptic handle error. ## 4.0.5 ### Added - **Remote desktop without an RDP login (Windows Server).** The session VRCloud runs in becomes *disconnected* when you close RDP (and there is none before the first login), so the desktop stops rendering and remote desktop / computer use go black. The Remote Desktop panel and `desktop_setup` now detect a disconnected session and say exactly what is wrong. A new helper, `scripts\windows-headless-desktop.ps1`, sets up console auto-logon so a chosen account is signed into the physical console at boot, keeps it awake and unlocked, and redirects RDP back to the console on disconnect — so the desktop keeps rendering with no RDP session open (`-Remove` undoes it). The Windows installer offers this step (it already runs elevated), `scripts\vrcloud.ps1 headless` enables it any time (self-elevates via UAC), and both offer a reboot at the end. ## 4.0.4 ### Fixed - **Empty reply with no response after changing the API key.** When the Anthropic model returned an empty turn (no text, no tool call, a normal stop), the turn was recorded internally but nothing was ever streamed to the chat, leaving a blank "VRCloud AI" bubble with no error. This happened most often on the first message after switching the API key, since that request runs on a freshly rebuilt history and a transient empty completion was not handled. An empty turn is now retried once; if it is still empty, a visible note is shown instead of silence. Normal and tool-using turns are unchanged. ## 4.0.3 ### Added - **Web search for every provider.** A `web_search` tool is available to Cursor, Anthropic and Grok in all modes. It picks a backend from the configured key: Tavily (`tvly-…`), Brave Search, or DuckDuckGo with no key at all. Results carry title, URL, snippet and date; a `recency` filter and a `site:` restriction narrow them, and `fetch_top` reads the full text of the top pages so answers rest on sources rather than the model's memory. Identical queries are cached for ten minutes. The key lives in the AI settings ("Pencarian web") or in `SEARCH_API_KEY`. - **Research discipline.** A `[Research]` guide is sent for tasks, conversation and Ask: for anything factual that can change (versions, docs, errors, prices, news, people, products) the assistant searches first, reads one to three sources, prefers primary ones, cross-checks important claims, notes dates, separates sources from interpretation, and ends with the URLs it actually used. It does not search for things it knows for certain or for the user's own code. - **Tool activity shown the way Claude shows it.** Consecutive tool steps are grouped into one collapsible block. While working it shows a shimmering label with the current action ("Menelusuri web…", "Mengedit…"); when the reply starts it folds into a one-line summary ("Menelusuri web · membaca 2 halaman", "Mengedit 1 file · 2 perintah") with an icon and the favicons of the sites used. Inside, steps are flat rows; search steps list their sources as favicon · title · domain, and page fetches show favicon + domain + path. Thinking that happens between tools lives in the same block; plans, change reviews and approvals stay outside. ### Fixed - **TLS certificate could not be regenerated on Windows.** When the machine's IP set changed and `openssl` was not on PATH, the PowerShell fallback could hang and the server refused to start. The certificate helper now also uses the `openssl` bundled with Git for Windows (and Homebrew on macOS), which takes about a second. ## 4.0.2 ### Added - **Conversation, not just tasks.** The assistant is now a thinking partner as well as an engineer. Messages that are talk rather than work (questions, opinions, brainstorming, learning, a chat about the day) are detected and answered as conversation: with a point of view and reasons, disagreement when warranted, a clear line between what it knows and what it guesses, in the user's language and register, at most one clarifying question, and web research when facts could be stale. Such messages skip the task machinery (todos, step verification, project snapshot, orchestration), so they are faster and cheaper. Work requests (verbs, file paths, code vocabulary, attached skills) still get the full playbook. If a conversation turns into something it could do in the workspace, it offers in one sentence rather than editing files on its own. - **It remembers you.** Durable facts about the user (name, role, preferences, how they like answers, what they are working on) are stored as `user` memories and shown to the assistant in every mode, so Agent, Plan, Ask and Chat all know who they are talking to. - **Chat mode** in the Mode menu: talk and discuss freely, with web research, memory and image generation available, and no edits, shell, AST or desktop control. On the Cursor provider it blocks the mutating built-in tools without the strict Ask allowlist, so custom tools such as the browser remain available. ## 4.0.1 ### Fixed - **Anthropic: "messages: text content blocks must be non-empty".** An empty model reply was stored as an empty text block, after which every later message in that chat failed with HTTP 400. Empty replies are no longer stored that way, saved histories are repaired before each request (existing broken chats work again), and if the API still rejects a request for this reason the history is repaired and the request is retried automatically, so the run continues. - **Restore to before this message could delete the whole chat.** Consecutive messages share a checkpoint when no file changed between them, and the restore looked the message up by checkpoint and took the first match, so restoring the second message removed the first one and everything after it. The button now identifies the exact message it belongs to; without that information it picks the latest match, never an earlier one. ## 4.0.0 ### Added - **Image generation** when the task needs it and the model supports it. Cursor uses its native `generateImage` tool; Grok uses Grok Imagine (`generate_image`, generate or edit up to 5 workspace images) with the signed-in session. Claude cannot generate images, so the tool is not offered unless `XAI_API_KEY` is set. Results are saved in the workspace, shown as a gallery in the chat, and tracked by checkpoints. New **Image** chip (Auto / Off) in the composer. - **Context bar** above the composer showing how much of the model's context window the last request used, with warning colours at 65 / 85 / 95%. For Anthropic it is measured exactly with `count_tokens` once the estimate passes 60%. - **Active-file pill** next to the context bar: shows which editor file (and how many open tabs) the agent receives as context; click to send the next message without them. While the agent works, the same spot shows live progress (step x/y, elapsed time, or waiting for command approval). - **Context handoff**: at 80% of the window the agent writes a structured handoff (goal, done + how it was verified, in progress, findings, remaining) and a fresh agent continues from it instead of restarting the task. Continuation prompts always carry a task-state digest rebuilt from todos, changed files and the last verification. - **Overflow guard** (Anthropic): when the prompt would not fit, older tool output is compacted harder and the oldest tool rounds are dropped without breaking tool pairs. - **`diagnostics(path)` tool** for every provider: language-server errors and warnings for a file in under a second, honest about servers that are not installed. - **`desktop_find` and `desktop_click({ name })`**: find and click controls by name through the OS accessibility tree (Windows UI Automation, Linux AT-SPI, macOS System Events) instead of estimating coordinates from a screenshot. - Desktop tool results now report the exact pointer position in pixels and fractions. - Smart Agent shows **why** each message took the direct or orchestrated path; medium- length change requests are classified by the model instead of by character count. - Hermetic tests for prompt invariants, safety guards and image generation (`npm run test:prompts`); live eval fixtures for the browser and computer use, which are reported as skipped on servers without a browser or desktop. ### Changed - **Command approval is on by default and enforced for every provider.** Commands that match the safety patterns wait for approval in the AI panel; a timeout or a run with no one to ask means **deny**. The Cursor shell-guard hook is installed (HTTPS-aware) instead of removed at boot; Anthropic and Grok check in the `shell` tool itself. - **Todos need evidence**: a step marked completed without a check run since it started (shell, diagnostics, browser, desktop, generated image) is put back to in progress and the agent is told why. One check cannot complete two steps. - One-step-at-a-time verification guidance for all providers, and rewritten browser and computer-use playbooks (structure/refs first, stale refs after navigation, click by name). - Read-only tool rounds (read, grep, glob, ls, ast_search, ...) run in parallel for Anthropic and Grok. - Structured memory is the single source of truth; `.vrcloud-agent/memory.md` contains a generated block from it, and free-form notes outside the block are preserved. - The workspace writer lock is global: a direct agent run in one chat no longer edits files at the same time as an orchestrated implementer in another. - **Restore to before this message** now rewinds the conversation too: that message and every message below it are deleted for all browsers, the agent's memory of them is discarded (Anthropic/Grok history, the stored Cursor agent), and the message text is put back in the input box to edit or resend. It refuses while the agent is running and checks before restoring any file, so files and chat never get out of step. - Remote Desktop pointer input is coalesced on the client and server, so the cursor no longer lags seconds behind; agent desktop actions wait less between steps and Linux drags use a single `xdotool` call. ### Fixed - **Touch devices**: controls that only appeared on hover are now always visible on phones and tablets (restore-to-message, copy reply, rename/export chat); tap targets in the AI panel are 34–40px instead of 18–28px; inputs use 16px text so iOS Safari no longer zooms the page when you tap them; the send/microphone group stays right-aligned when the composer wraps; the model name is no longer clipped on narrow screens. - **Menus could not be used on phones.** Chip menus (Agent, Browser, Computer) and the model popover's Effort / Context / Model submenus opened *behind* the full-screen mobile panel, closed themselves about a second after a tap (hover-leave auto-close fired when the finger lifted), and the Effort / Context / Model submenus were positioned off-screen. They now open on top, stay open until you tap outside, and are kept inside the screen. Touch is detected from the actual pointer type, not only from media queries some phones misreport. - The mobile composer uses two fixed rows: option chips on top; plus, model, microphone and send below. - Toasts appear at the top in mobile mode instead of covering the composer. - The updater no longer offers an "update" when the local install is a newer, unpushed release than GitHub — that update would have reset it to the older version. - `noNativeTask` is enforced: no fallback of the Cursor tool list can re-enable nested subagents inside the orchestrated implementer. - Task-state and evidence checks recognise Cursor's `inProgress` todo status. ## 3.0.19 ### Added - **Smart Agent orchestration** for substantive Agent-mode work: one planner, bounded parallel read-only explorers, a single workspace writer, deterministic verification, bounded repair attempts, and read-only finalization. Worker/todo/verification/result events persist in order; stopping a run cancels workers and verification. - **Ranked project context** backed by a persistent workspace index, canonical change events, active/open/explicit-file priority, symbol/import/test hints, strict context budgets, and cache invalidation after editor, disk, shell or agent changes. - **Optional language-server context** for JavaScript/TypeScript, Python, Go and Rust (`typescript-language-server`, `pyright-langserver`, `gopls`, `rust-analyzer`) with diagnostics, symbol/definition/reference caches, restart backoff and lexical fallback. - **Tree-sitter structural tools** for JavaScript/JSX, TypeScript/TSX, Python, Go and Rust. `ast_search` returns stable match IDs, byte ranges and source hashes; `ast_edit` rejects stale, ambiguous, non-unique and syntax-regressing changes while preserving UTF-8, BOMs and line endings. - **Evidence-backed structured memory** with scope, provenance, confidence, TTL and source hashes. Changed evidence becomes stale until revalidated; Ask mode can search but cannot mutate memory. - **Verification engine** that reconciles actual workspace changes, selects relevant project checks, bounds output and execution time, supports cancellation, and feeds failures into the repair loop and final review metadata. - **Hermetic Smart Agent acceptance suite** with cross-provider doubles, orchestration, context ranking, LSP, memory invalidation, structural edit, verification/repair, cancellation, checkpoint/review and event compatibility coverage. `npm test` no longer reads `.env`, starts a server or uses the network; realtime coverage moved to `npm run test:smoke`. - **Opt-in live agent evaluator** (`npm run eval:agent`) with JavaScript, TypeScript, TSX, Python, Go and Rust fixtures plus stale/ambiguous/syntax rejection and protected diff-scope cases. It runs only with explicit enablement and records JSON success, provider/model, tool-call, text-edit fallback, token, duration, changed-file and syntax-regression metrics. ### Changed - Multi-agent runs now activate for Indonesian coding requests, stream localized worker lifecycle/activity/tool-count/timing cards in real time, retain compact progress in history, and preserve substantive implementation details plus authoritative changed-file and verification evidence in the final response. - Linux installers now detect `apt`, `dnf`, or `yum`. CentOS Stream 9+ and AlmaLinux 8+ are supported, including native build dependencies, optional Chromium runtime libraries, EPEL/CRB-backed virtual desktop packages, and `firewalld` setup guidance. Bootstrap-installed Node.js remains discoverable when RHEL's `sudo` secure path omits `/usr/local/bin`. - Reverted the mobile-responsive shell and follow-up phone UX (PRs #4, #6, #7, #8, #9). The desktop IDE is back to the pre-mobile layout: menubar, activity bar, sidebar, Ace editor, terminal, and the original composer. No bottom nav, no file drawer, no hidden editor on narrow viewports, and no phone-only composer tap-target CSS. - **Grok account login is kept** (PR #5 / 3.0.14): Settings → Grok → Sign in with Grok still runs xAI device-code OAuth at `auth.x.ai`. Session tokens stay encrypted in `data/grok-session.json`. ## 3.0.18 ### Changed - On phones and narrow browsers (≤768px) the Ace text editor / workarea pane is gone. The bottom bar is Files / Terminal / Agent; Agent (or the file drawer) fills the space the editor used to occupy. Opening a file no longer switches to the editor — it stays on the current mobile pane. Desktop (≥1024px) file open and the editor are unchanged. ## 3.0.17 ### Fixed - Opening a file on a phone no longer paints a white Ace sheet that looks like the server crashed. Ambiance is loaded with the page (not a later dynamic fetch), TextMate’s default `#fff` background is overridden to the dark editor colors, and adding a tab no longer tears down `#workarea` (which blanked Ace on iOS). Workers are disabled before the first session. A process-level log line is written if Node would otherwise die silently. Desktop file open is unchanged. ## 3.0.16 ### Fixed - Composer toolbar on phones is compact again (one row: +, model pill, tool icons, mic, send) instead of the oversized two-row 44px chrome. Invisible hit padding keeps taps reliable without enlarging the glyphs. The model (`auto`) chip is clickable again — menus are pinned above the chip so they are not clipped by the agent overlay. - Opening a file on a phone no longer blanks or freezes the IDE. Ace no longer auto-focuses (which scrolled its hidden textarea off-screen and zoomed the page), workers / live autocomplete / minimap are skipped on narrow viewports, and the viewport is pinned so the workarea stays usable. Desktop file open is unchanged. ## 3.0.15 ### Fixed - On phones and narrow browsers (≤768px), every control on the AI composer toolbar is a ~44×44 tap target. The model, Mode/Browser/Computer/Review/Skills, mic, and send buttons no longer share one cramped row: tool icons wrap onto a second row (and can scroll sideways if needed) so adjacent icons are not mis-tapped. Chip menus now open above the agent overlay instead of behind it. Desktop (≥1024px) chrome is unchanged. ## 3.0.14 ### Added - **Grok** as an AI provider via the operator's own Grok / xAI account. Sign in from the AI settings panel (official device-code OAuth at `auth.x.ai` — the same flow as `grok login --device-auth`). Session tokens stay on the server in `data/grok-session.json` (encrypted, mode 0600) and can be signed out. No `GROK_API_KEY` / `XAI_API_KEY` is required. The agent uses the same workspace tools as Anthropic (files, shell, search, browser, computer use). Needs SuperGrok or X Premium+; xAI may rate-limit or expire the session (re-login from settings). ## 3.0.13 ### Changed - Phones and narrow browsers (≤768px, with a tighter 480px pass) get a usable IDE: viewport and safe-area handling, a file drawer, a Menu overflow, touch-sized chrome, and a bottom bar for Files / Editor / Terminal / Agent. The previous mobile mode that hid the IDE and left only the AI chat is gone. Desktop (≥1024px) layout is unchanged. ## 3.0.12 ### Changed - The agent instructions now follow the same working habits used by other coding agents: search only until the cause is clear, batch independent lookups, keep edits small and exact, verify with the narrowest check, and stay read-only in Ask mode. The text is VRCloud's own; other products' system prompts are not copied in. - Windows update works on a ZIP download that has no `.git`. `vrcloud.ps1 update` and the Update button turn the folder into a Git checkout, then fetch `main`. `.env` and `data/` stay in place. ## 3.0.11 ### Added - Windows `scripts\vrcloud.ps1 update` fetches the latest release and restarts the Scheduled Task when it is running, matching `vrcloud update` on Linux. The Update button in the IDE already did this on Windows. ## 3.0.10 ### Changed - Windows installs now open the IDE the same way Linux does: inbound TCP on the server port is allowed, and the installer plus `vrcloud.ps1 start` / `status` print `https://IP:port` for the public address, LAN address, and localhost. ## 3.0.9 ### Fixed - Browser steps in the chat card often had no screenshot. A failed attempt to shrink a large capture discarded the image, and text steps such as extract never captured one. Captures are kept, extract and error pages are screenshotted, and the card shows the latest image when the selected step has none. ## 3.0.8 ### Fixed - Computer-use screenshots in the chat were broken when the agent used the Cursor API. That provider puts raw JPEG bytes in the tool result, and embedding those bytes made the card show a broken image. Each capture is now saved as a file and the card loads it by URL. ## 3.0.7 ### Fixed - Computer-use screenshots were missing in the chat when the agent used the Cursor API. That provider returns images as `{ image: { data } }` and often omits the bytes from the tool event, so the "Controlling the computer" card said the step had no screenshot. Both result shapes are read now, and the capture is kept on the server per tool call so the card can still show it. ## 3.0.6 ### Changed - An invalid or rejected API key now shows the provider's own error (HTTP status and message) in the chat and in the agent settings, instead of a generic failure. - Changing the API key or the provider keeps the open chat. The new agent re-reads that conversation and continues the same task. ## 3.0.5 ### Changed - Computer-use screenshots and the remote-desktop stream draw the mouse pointer (a white arrow). Its tip is the click point, so the agent can see when a click missed. macOS already captured the system cursor; Windows and Linux now draw one because their capture APIs omit it. - Computer-use instructions now walk the agent through a tighter loop: look, act once, check where the cursor tip landed, wait instead of repeating a missed click, switch to the keyboard after two misses, and only report success when the result is visible. ## 3.0.4 ### Fixed - The "N terminal agent" bar above the composer counted finished background shell cards, so it stayed visible after the processes had already exited. It now lists only processes that are still alive. - Each listed process, and the bar itself, has a Stop button that ends that process (and its children). ## 3.0.3 ### Changed - Computer use no longer stops at login, sign-up, CAPTCHA, checkout, or payment. When those steps are part of the task, the agent fills and submits them (using details the user gave, that are on screen, or that are saved in the browser) and gets past dialogs that block the outcome instead of handing the work back. ## 3.0.2 ### Changed - **All agent instructions in one file.** System prompt, per-message guidance, Ask mode, browser and computer-use playbooks, memory rules, context labels, the continue prompt and every tool description (workspace, `desktop_*`, `browser_*`) now live in `lib/agent-instructions.js`; `ai-chat.js`, `anthropic-agent.js`, `desktop-remote.js` and `browser-automation.js` import from it. Browser tool and parameter descriptions are now English like everything else the agent reads. - The Anthropic provider no longer receives the static "how to work" block twice (system prompt and per message), saving tokens on every turn. ## 3.0.1 ### Fixed - **Black Remote Desktop on Linux.** The virtual display could be alive while no desktop session was drawing on it (Xvfb survives a server restart, or XFCE failed to start under systemd without `HOME` / `XDG_RUNTIME_DIR` / a D-Bus session), so every frame was black. The server now checks for a running window manager on the virtual display and (re)starts the session when it is missing, gives the session a proper environment, disables the xfwm4 compositor (which blanks `import` captures on Xvfb), captures with `-screen`, sets a non-black root background while the session loads, logs session output to `data/desktop-session.log`, falls back to openbox / fluxbox / icewm / twm when XFCE is not installed, and shows "Starting desktop session..." in the panel. `desktop-setup.sh` now installs `xprop` and `xsetroot` on every supported distro. ## 3.0.0 The "computer use" release. ### New - **Computer use for the AI agent.** The agent can now see and operate the server's real desktop: `desktop_screenshot`, `desktop_click`, `desktop_drag`, `desktop_move`, `desktop_type`, `desktop_key`, `desktop_scroll`, `desktop_wait` and `desktop_setup`. Coordinates are resolution-independent fractions of the screen; every action returns a fresh screenshot. - **"Controlling the computer" card** in the chat: consecutive desktop steps fold into one card with a large live screen frame and numbered steps with thumbnails, the same way browser sessions do. - **Computer use toggle** in the composer (Auto / On / Off), next to Browser tools. Off removes the desktop tools entirely; On tells the agent to prefer the desktop GUI for application and window tasks. - **Remote Desktop** (VNC-like) from the OS badge in the menubar: JPEG screen streaming over WebSocket with mouse and keyboard control on Windows, Linux and macOS, plus one-click virtual desktop (Xvfb + XFCE) setup on headless Linux servers. - **Realtime UI mirroring** across browsers: open tabs, active tab, split layout, editor content and cursors, terminal output, sidebar view, AI panel state and the Remote Desktop panel are all kept in sync between sessions. - **Notification center**: bell icon with unread badge, history dropdown, in-app toasts and optional browser notifications when the agent finishes. - **Smarter agent prompts** with a live project snapshot (stack, git state, file tree, recent changes), editor context, repeated-failure detection and history compaction. All agent instructions and tool descriptions are in English. - **Project memory** (`.vrcloud-agent/memory.md`) can be switched on and off from the agent settings. - **HTTPS by default** with an automatically generated self-signed certificate that covers local and public IPs (`https://IP:PORT`), or your own PEM files. ### Improved - Realtime editor sync: 40 ms keystroke debounce, server-side conflict resolution that retries local edits, and disk changes by the agent or by scripts are reflected in open tabs immediately. - The **Run** button detects the interpreter or compiler for the active file's extension on the server and runs the file in its own folder, in a floating terminal that can be docked as a tab. - VS Code-style file and folder icons, inline rename and file creation in the tree (F2 / Delete), clearer line numbers, collapsible Open Files list. - Redesigned login and loading screens; the login page follows the IDE language setting. - Chat rendering closer to Claude and ChatGPT: streamed thinking blocks, GFM tables, nested and task lists, copy buttons, accept/reject review card that jumps to the first changed line. - The OS badge shows a monitor icon with the OS logo on screen and opens Remote Desktop on click. - Tool cards, browser and desktop steps, option chips and the Remote Desktop panel are fully translated in English mode. ### Fixed - Commands sent to a terminal from the chat (the run-in-terminal button) now send a real Enter (CR), which PowerShell/ConPTY expects; previously they showed a `>>` continuation prompt on Windows. - Transient screen-capture errors no longer flash an error in the Remote Desktop panel; the stream retries silently and only reports persistent failures. - The Windows capture and input helpers are split so antivirus (AMSI) no longer blocks streaming and control. ## 2.0.0 Realtime collaboration, AI agent with checkpoints and review mode, headless browser automation, source control panel, command palette, project memory, self-update. ## 1.0.0 Initial release: Ace editor, tmux-backed terminals, file manager, login, systemd and Windows installers.