Extension Version History

Changelog

Release notes for the MR Multi Model AI Coder VS Code extension.

v0.8.6

Voice: Text to Speech and Speech to Text
  • NewText to Speech. A play button on every reply reads it aloud in a Deepgram Aura-2 voice (or the free system voice without a Deepgram key); press it again to stop. /autospeak on|off reads each reply aloud with Deepgram's streaming voice as it is being written, paragraph by paragraph, in the chat where you turn it on. Only the model's text is read: tool calls and their results are skipped, and code blocks are summarised. A speaker button in the composer stops the reply being read; sending a message, or MR Multi coder: Stop Reading Aloud, stops it too.
  • NewSpeech to Text. Hold to talk: hold the microphone button and speak — Deepgram Nova-3 transcribes your words into the chat box as you talk; let go to stop. Ctrl+Alt+V (⌘⌥V) starts and stops talking from the keyboard and stops by itself after a pause (Stop after silence in Settings). Hands-free: /hello-coder on turns the microphone green, and everything you say is transcribed by Deepgram into the chat box when you pause; only the parts where someone speaks are sent, silence is not. /hello-coder off turns it off. Spoken text waits in the chat box for you to press Enter; turn on Send when I stop talking to send it automatically. Click the microphone to block or allow it — a blocked microphone records nothing.
  • NewSettings → Speech to Text & Text to Speech holds your Deepgram API key (stored securely, never in settings.json), the voice, the speed and the voice-input options. In web access, each person uses their own Deepgram key and microphone.

v0.8.5

Compact Settings Fields, and Leaner Conversation Summaries
  • FixSettings fields had a tall blank gap between their label and their control when the Settings panel was 768 px wide or narrower. They now stack compactly.
  • ImprovedConversation summaries (compacting a long chat, or switching provider mid-chat) now run as a single lean request: no tools, no MCP servers, no project settings, a short system prompt of their own and no session file on disk. They used to run as a full Claude Code session that also asked the model to title the session — an extra request re-sending the whole transcript. Measured with the real Claude CLI on the same short summary, two requests became one and request size went from 140,747 to 6,794 characters. An empty summary, which triggered a retry, can no longer happen. Your chat sessions are unchanged.

v0.8.4

MCP Chats Run Real Tools, and the PO Is Per Chat
  • FixMCP chat endpoints printed tool calls instead of running them. Asked to "understand this project", an MCP chat replied with text like <tool_call>{"name":"read_file", …}</tool_call> and nothing ran, while Claude and MR Coder were unaffected. The request never told the model it had tools: the MCP provider was the only one that didn't switch them on, so it sent no tool list and the model improvised a text convention instead. Its tool names were the giveaway — read_file and list_directory aren't ours; ours are Read, Write, Edit, Bash, Glob and Grep. MCP chats now get the real tools and work like the other providers. Two related gaps are fixed as well: MCP chats had no context window, so long conversations were never auto-compacted and grew until the endpoint refused them, and a reply cut off at the output limit now continues instead of stopping mid-edit. Tool calls from an MCP chat go through the same approval prompts and permission mode as every other provider.
  • FixThe Product Owner switched itself on in every new chat. Turning it on in one chat could leave it on in every new chat you opened. It is now strictly per chat: a new chat always starts with the PO off, and only enabling it in that chat turns it on. An older version saved the PO toggle to the project's settings, and new chats used that saved value as their starting point; nothing ever cleared it, so a single enable could follow you into every chat afterwards. New chats no longer read that setting, and mrMultiCoder.po.enabled is marked deprecated in VS Code's settings — enable the PO per chat with /po enable or the Agents panel. If a long-running chat had the PO on only because of that old setting, it resumes with the PO off; turn it back on with /po enable.
  • NewClaude Haiku 5.5 replaces Haiku 4.5 on both the Claude provider and MR Coder: a 1M-token context window at $0.10 per million input tokens and $0.50 per million output tokens. Its price is not flat — once a request's prompt passes 100,000 tokens, the whole request costs five times as much, output included. Long prompts are normal in coding work, so cost estimates now apply that step instead of underestimating long requests by up to 5×. Past sessions on Haiku 4.5 keep their original cost in analytics.
  • FixCost estimates for several Claude models were wrong. Opus 4.6 and 4.7 were estimated at three times their real price, and Fable, Opus 5 and 5.5, and Sonnet 5 and 5.5 showed no cost at all. The chat view and analytics each kept their own copy of Claude prices, and the copies had drifted apart — adding Haiku 5.5 updated the price in one and not the other. Both now read a single price list, matching what the router bills.
  • ImprovedThe bundled Claude Code engine is upgraded from 2.1.169 to 2.1.296 (Agent SDK 0.3.169 → 0.3.296). The old engine was too old for newer models: Anthropic rejects Opus 5.5 for anything below Claude Code 2.1.280. It also stamped each request with a value that changed every time, ahead of the prompt, which through a Claude.ai subscription account landed inside the cached part of the prompt — so the cache was written on every turn and never read. The new engine's stamp is identical from turn to turn, so the cached prompt stays stable. The upgrade also ends the other Opus 5.5 failure, "thinking.type.disabled is not supported for this model": Claude Code 2.1.169 sent "thinking disabled" on requests where thinking was off, and Opus 5.5 accepts only adaptive thinking. It was 27 of the 31 failed Opus 5.5 requests on 13 October; 2.1.296 sends adaptive thinking for Opus 5.5 in every case, measured against a local capture server.
  • FixThe extended-thinking budget setting was ignored. With extended thinking on, the extension passed the budget under a field name the SDK doesn't read, so your budget was dropped and the engine used its own default (31,999 tokens). It's now passed correctly: measured against the bundled engine, a budget of 8,000 now goes out as 8,000. Models that only support adaptive thinking (Opus 5.x) are unaffected; the engine converts the setting to adaptive for them.
  • FixEvery turn re-billed the whole system prompt instead of reading it from cache. The extension sent its system prompt as a plain string, but Anthropic's prompt cache is marked with a cache_control breakpoint on a block — a bare string has nowhere to put one, so the prompt was uncacheable by construction and its full token count was charged again on every turn and on every tool iteration within a turn (up to 500 of them). Measured on the gateway, this client's traffic against Claude.ai subscription accounts: 416,724,395 cached input tokens on 30 September, then exactly 0 every day for the nine days following — while clients that send the prompt as a block array were unaffected and stayed above 90% cached throughout. Two Max 20x subscriptions exhausted their weekly limits in roughly two days of ordinary use. The prompt now goes as a single text block carrying one ephemeral breakpoint, so it and the tool definitions ahead of it are read from cache at a tenth of the input price. No change to the prompt's content.
  • ImprovedThe per-turn token and cost counter below the composer input ("↑1 · ↓1 · $0.212") is removed. It was the last place in the composer that reported usage, it duplicated what the Account & Usage panel shows on demand, and it kept a running cost in the corner of your eye on every turn; it had already been hidden at phone width and is now not rendered at any width. Usage has one home: /usage for the figures, and the footer chip for the one number that is actionable mid-conversation — how close the binding window is to its limit.
  • FixRate-limit reset times showed the server's clock rather than yours. A user in India read "Reset: Nov 1, 2026 at 1:00 AM UTC+01:00" — German time, because nothing on the extension's path told the server which timezone they were in (only the website's own chat did) and the host runs in CET. The time was labelled correctly and so was not obviously wrong, which is the worst way for a clock to be wrong. Sessions now send your timezone, its IANA name and your editor's display language, so a reset reads in your zone with the abbreviation you expect: "Reset: 5:30 AM IST — 2h remaining." All three are needed — an offset measures a zone but cannot name one (+02:00 is CEST, SAST or EET depending on the date), and the name alone cannot produce a familiar abbreviation, since Asia/Kolkata renders as "IST" in an Indian locale and "GMT+5:30" in an American one. When nothing is known the server now says UTC instead of presenting its own zone as yours.

v0.8.3

Live Rate-Limit Awareness, and /usage Knows Whose Account It Is
  • NewClaude Fable 5.1 and Claude Sonnet 5.5, on both the Claude provider (your own API key or claude.ai login) and MR Coder. 1M-token context on each.
  • NewA rate-limit chip in the composer footer shows the window closest to its limit — "⚠ 7d 81%" — appearing only at 50% and above, so the footer stays clean in normal use; clicking it opens Account & Usage. A one-time notice in the chat announces a window crossing 75%: "Weekly limit 75% used — resets in 2d 4h." Once per window per reset, and suppressed when the figures came from a /usage you just ran. Colours match across the chip, the panel bars and the notice: plain below 75%, amber 75–89%, red from 90%. The figures ride the turn stream at no extra request cost, and the chip is scoped to the active provider — switching provider clears it rather than showing one account's percentage beside another's model.
  • Improved/usage now reports the provider actually serving the chat. It previously read your MR Coder key whatever provider was active, so a Claude session saw another account's figures — or "No MR Coder API key configured", which is meaningless when you are not using MR Coder. MR Coder shows token windows as before; Claude with a claude.ai login shows your real subscription windows, including the per-model weeklies; Claude with an API key, Bedrock or Vertex says plainly that no plan limit applies, because per-token billing has no window; every other provider says usage reporting is not available for it. The panel names the account above the figures.
  • Improved/usage opens its panel immediately. It used to appear only once the request succeeded — up to 30 seconds of nothing but your own /usage line and a spinner — and on failure it never opened at all. It now opens on the keypress with its own loading state, and failures render inside it instead of as a chat message.
  • ImprovedThe MR Coder model list now matches what the router serves: GPT-6, GPT-6 Sol, GPT-6.1 Sol, GPT-6 Astra, Kimi K3, DeepSeek V4 Pro, Qwen 3.8, Qwen 3.8 Flash, GLM 5.3, GLM 5.3 Flash and Quantum Lite 1. Gemini 3.1 Pro, Gemini 3.6/3.7/3.8 Flash, MiniMax M3, GPT 5.5, GPT 5.6 Sol, GLM 5.2, DeepSeek V4 Flash, Qwen 3.7 Plus and Quantum Flash are removed — a model left in the picker that the router cannot serve fails with "400 Unknown model" on the first turn, so they are gone rather than kept for familiarity. Kimi K3 and GLM 5.3 are both 1M-context.
  • FixThe Claude CLI's session summary no longer appears in the chat. A block of "Total cost: … / Total duration … / Usage by model: …" could show up between messages, reading as something the model had said. It is the CLI's own summary, printed as its subprocess exits, and the crash path was pasting that output verbatim into the transcript. It is now kept in the output channel, where it is useful, and out of the conversation.

v0.8.2

/usage Shows the Limit That Actually Governs You
  • Improved/usage shows three windows instead of six, each labelled with the limit it came from — "Rolling Window · this key" or "Weekly · account". It previously printed a rolling/weekly/monthly set for your account and, whenever per-key caps existed, a second "Key Window / Key Weekly / Key Monthly" set beside it: the same window twice with different numbers, and nothing saying which one applied. The one shown is now the window with less left, which is not always the smaller cap. Both limits are enforced independently on every request, so the one that stops you next is whichever has least headroom. Worked example: a plan capped at 50M per month with 49M already spent by another key leaves 1M, while this key's own 5M cap has 4.5M spare — reporting the key cap would promise nine times the headroom that exists, then surprise you with a 429. The account row is shown instead, at 98%. One scope is picked rather than blended because they measure different things: account usage spans every key on the account, per-key usage is that key alone.
  • Fix/usage reported nothing at all on a plan with no token caps. The entire output was the header and your plan name, while tokens had in fact been spent — every row was dropped because each needed a limit to draw a bar against. Uncapped windows now report "123.5K tokens used · no limit on this plan", with no bar and no remaining figure: it is the percentage that is unavailable without a cap, not the usage.
  • FixA null remaining-token count could have rendered as "null remaining". The server sends null for an unlimited window's remaining tokens, but the extension typed that field as a plain number, so the compiler could not see the case; widening the type surfaced it immediately. The figure now falls back to limit minus used.

v0.8.1

Claude Opus 5.5
  • NewClaude Opus 5.5, on both the Claude provider (your own API key) and MR Coder. 1M-token context, 128K max output, adaptive thinking always on. Anthropic now recommends it as the default for long-running agentic coding, so Opus 5 is relabelled "previous-generation" in the picker to match — it is listed as a legacy model upstream. Nothing is removed: Opus 5 and every earlier model stay selectable. It is also cheaper than the model it supersedes — $4/$20 per million tokens against Opus 5's $5/$25 — and its prompt-cache reads are billed at 5% of the base input price rather than the usual 10%, which matters on long sessions where cache reads dominate.

v0.8.0

Replies Stay With Their Own Question
  • FixA reply could appear underneath your next message. While an agent was working, the previous response sometimes rendered below the message you had just sent, reading as an answer to the new question when it belonged to the old one. Streamed text is coalesced before rendering, and it continues the open reply bubble only while that bubble is the last thing in the transcript. Every update arriving from the extension host drained that buffer first — but sending is handled locally and never passed through that path, so your message was appended with text still buffered. The next drain then found your message at the end, could no longer reach the reply it belonged to, and started a fresh bubble beneath it. Sending now drains first, so buffered text joins the turn that produced it. While the chat panel is visible the buffer clears in about 16 ms, which is why this was rare; the browser stops granting animation frames whenever the panel is not being drawn — you reading a file while an agent works — and that is also exactly when you give up waiting and type again.
  • NewDiagnostics for out-of-order replies. If a reply ever renders against the wrong turn again, the extension records it in the MR Multi coder output channel prefixed [webview]: when the chat panel was hidden and shown, how much text was waiting at each boundary, and whether any of it rendered after a message you sent. The webview's own console needs the Developer Tools window, which nobody hitting this in a normal install has reason to open, so there was previously no way to show what the renderer had done. Sizes and timings only — no message content is logged, so the output is safe to paste into a bug report.
  • ImprovedToken counters are hidden on phones. "↑3 · ↓169 · 12% context" is a diagnostic readout rather than something you act on mid-conversation, and on a phone it shared the toolbar row with the provider and model chips and the send button. It is hidden below 480px and unchanged above it. The same figures remain in the toolbar's tooltip and in the usage views. The draft estimate shown while typing is part of the same readout, so it is hidden there too.
  • ImprovedThe extension identifies itself for usage attribution. Sessions routed through MR Coder now send a header naming this extension, so its usage reports under its own heading instead of being counted as generic external API traffic. A dedicated header rather than a custom User-Agent: the extension drives the Claude Agent SDK, which sets its own UA that is indistinguishable from Claude's own VS Code extension, and overriding it risks changing how the upstream identifies the client. Sent only on MR Coder sessions, never on a direct Anthropic connection.
  • New/init writes destructive-command rules. Generated CODER.md files now tell the agent to delete by explicit name rather than by pattern, and — in container projects — to mark disposable containers with a label and select on that label. Name patterns fail open: an exclusion only excludes what someone remembered to name, so anything nobody thought to exclude is selected by default. Label-based selection fails closed, because a resource is only deletable if it was deliberately marked deletable when it was created.
  • NewPer-machine extra models for MR Coder. mrMultiCoder.mrcoder.extraModels appends entries to the MR Coder model picker on one machine, so an account granted a model that is not in the shipped catalogue can select it without that model appearing for everyone. The catalogue is a static array compiled into the extension, so adding such a model there would show it to every user. The server still authorises every request — adding a model here makes it selectable, not permitted.

v0.7.9

Compaction Stops Summarising Twice, and the PO Stops Asking
  • FixCompaction no longer summarises the same history twice. Two paths could run the rolling summariser for one overflow: the dispatcher's own compaction and the turn's deferred compaction work. The second re-sent history the first had already condensed, which cost a full summariser call and could produce a summary of a summary. The guard that was supposed to prevent this was written but never read, so it worked in one direction only — the proactive summariser skipped while a deferred run was active, but a second deferred compaction started on top of a running one. A forced trim now waits for the summarisation already in flight and then trims without re-summarising, because a context overflow must still end with a smaller context or the retry simply overflows again.
  • ImprovedThe Product Owner decides instead of asking. /po verbs could stop mid-run to ask a clarifying question, which stalls an unattended review — the PO runs on its own initiative after a turn completes, so there is nobody watching to answer. It now commits to the most defensible reading and says which assumption it made, so a review always returns something actionable. Its tool access is unchanged and still read-only: file reads, searches and a strict allow-list of inspection commands, with anything that could modify the workspace refused outright rather than queued for approval.
  • ImprovedDropped the composer's slash button. The / button duplicated a keystroke that already opens the same menu, and occupied space next to Send on narrow layouts. Typing / is unchanged — the command menu is triggered by the character, not the button.

v0.7.7

Talk to the Product Owner, Jira Integration, and Figma Auth Fixed
  • NewTalk to the Product Owner with /po ask <question>. Instead of picking from five fixed report verbs, ask anything — 'is the auth flow safe to ship?' — then follow up with just 'why?' and it resolves the pronoun against what it already told you. /po ask clear starts a fresh thread. Every other /po verb passes an empty history, so each query starts cold; that is right for the review verbs (they exist to re-read current state) but made dialogue impossible. ask carries the last 4 exchanges, and is told to answer at the length the question deserves rather than turning a yes/no into a risk register. The transcript is sent as one context chunk per exchange rather than one combined block: the chunker splits between chunks and never inside one, so a single oversized transcript would return as an uncuttable chunk and the caller would skip chunking entirely. Each stored answer is capped at 1,200 characters with the cut marked, so the model cannot read a partial answer as complete.
  • FixEnabling the Product Owner silently switched auto-commit back on. Turning the PO on re-enabled commits for anyone who had deliberately turned them off, so the setting would not survive a PO toggle — and nothing said so, the commit simply reappeared. The gate read if (!config.poAutoCommit()), but get() returns false both when a setting was never configured and when the user explicitly set it to false; distinguishing the two needs inspect(). Enabling the PO now supplies auto-commit as a default only when you have never expressed a preference, and leaves an explicit choice alone either way. Auto-commit without the PO already worked — /po autocommit on then /po disable gives you commits with no per-turn review query; only the enable side effect was overriding you.
  • FixFigma could not connect at all. The token was sent as X-Figma-Token, which is the header Figma's REST API uses — the MCP endpoint is a different surface and ignores it outright. Probed live: X-Figma-Token returns 401 with a full re-challenge, byte-identical to sending no credentials, while Authorization: Bearer returns 401 without it, meaning the token was actually read. Both setup surfaces now send Authorization: Bearer. The /mcp wizard was worse: it declared no auth header at all, and since the key prompt is gated on that field it never asked for a token and saved Figma with empty headers — while its own description had claimed 'sends as Authorization: Bearer' since the preset was written.
  • FixFigma OAuth authenticated a server that did not exist. The Connect button sent the hardcoded name 'figma' regardless of what you called your server, and was clickable before the server was saved. The SDK resolves a server by the key it loaded from settings.json, so neither case had anything to authenticate. It now sends the real saved name and stays disabled until the server exists. The on-screen instructions said 'click Connect, then click Save' — the exact reverse of the only order that can work — and now say save first, then reopen from Edit existing to authorize. The starter message also promised a browser would open automatically on your next chat message; that never happens in headless SDK mode, where the server just sits in needs-auth. Removed.
  • FixThe Figma starter message asked Claude to paste your file link. That text is inserted into your composer as a draft you send to Claude, so 'Paste a figma.com URL and tell me what to convert' instructed the one party that has no way to obtain the link. If you picked a file in the setup modal, the draft now carries that file's real URL; if you did not, it leaves a placeholder for you to fill in. Previously it did both at once — a placeholder asking you to paste a link, next to the file key you had just selected.
  • Fix"Your Claude session has expired or been revoked" appeared on sessions that were working fine. The extension refreshed the Claude OAuth token itself, and so does the Claude CLI — two refreshers, one credential. Anthropic rotates the refresh token on use, so once the CLI refreshed, our stored copy was dead; the next turn sent the stale token, got invalid_grant, and reported an expired session. Logging in again fixed it only until the next rotation. A second bug made it fire far more often: when the token response carries no expires_in, the staleness guard failed open and a refresh attempt ran on every turn — including for users who had never selected Claude, because the sidebar probes every provider to draw the list. The CLI now owns the token lifecycle; a genuine failure surfaces as a real 401 with evidence rather than a guess.
  • NewJira (Atlassian) MCP preset. Connect your Atlassian site and ask about work directly in the chat: 'list my Jira projects', 'show issues assigned to me', 'epics in PROJ', then 'what's under PROJ-42?' to walk down to its stories and tasks. Epics, stories, tasks and bugs are all Jira work items of differing type, so one connection covers every level. Setup asks for your Atlassian account email and an API token, in both the /mcp wizard and the MCP setup modal. There is deliberately no project picker: unlike Figma and Stitch, Jira exposes no project-scoping header, so scope is chosen per question against your own Jira permissions. You only ever see what your Atlassian account can already see.
  • FixJira offered a "Browse projects" button that could never work. The setup modal shows its project picker for any preset with an auth header — which Jira has — so the preset arrived with a picker on the one server documented as having none. The lookup behind it matches snake_case tool names (list_projects) while Atlassian's is listJiraProjects, that tool needs a cloudId the flow never supplies, and there is no project header to write a picked key into anyway. Presets now declare that they scope per tool call, and the picker is suppressed for them.
  • FixEditing a Jira account email without re-entering the token would have lied about which account was in use. The email is baked into the stored Basic credential, and the credential is only recomposed when a token is entered — so correcting a typo'd email on its own updated the displayed address while the header kept authenticating as the old account, surfacing later as an inexplicable 401. The host now writes the email only when it actually recomposes the credential, and the modal asks for the token whenever the email changes, saying why rather than presenting a Save button that does nothing.
  • FixThe Authorization header no longer assumes Bearer. The save path inferred the auth scheme from the header name, so anything under Authorization got 'Bearer ' prepended — and a Basic credential sent that way is well-formed but 401s on every call, showing an auth failure for a credential that is actually correct. The scheme is now declared by the preset and composed by one shared function that both setup surfaces and the Test connection probe call, so a passing test means a working save.

v0.7.6

Anthropic-Native MCP Chat Endpoints
  • NewConnect an endpoint that speaks the Anthropic /v1/messages format — the Anthropic API directly, a Bedrock/Vertex gateway, LiteLLM in Anthropic mode, or your own proxy — and it now shows up in the provider list as 'Anthropic MCP (<name>)', ready to chat with. Both setup surfaces (/mcp wizard and MCP setup modal) support this. Each asks for the endpoint URL, API key (stored in SecretStorage via x-api-key header), and model id.
  • FixProvider list not updating after MCP save or delete. Adding or removing an MCP chat endpoint required a window reload before the provider chip reflected the change. Both paths now call pushState() immediately.
  • FixAnthropic endpoint 404'd when the base URL ended in /v1. Entering https://gateway.example.com/v1 — the natural thing to type, and exactly what the OpenAI preset asks for — produced .../v1/v1/messages and a 404 on every request. The OpenAI strip/append pair is symmetric so a /v1 base survives; the Anthropic append includes the /v1 segment, so the normaliser now strips a trailing /v1 as well.
  • Fix"Test connection" reported a working chat endpoint as broken. The probe sends MCP JSON-RPC tools/list, which a chat endpoint (/v1/messages, /chat/completions) cannot answer, so it always failed and reported "Server is unreachable" for a correctly configured endpoint. Test is now offered only for MCP tool servers — the button is hidden for chat presets rather than rendering dead.
  • FixAnthropic compact() crash on orphaned tool_result. If compact() fired mid-tool-loop on an Anthropic MCP session, the post-compact history could contain a tool_result following a synthetic assistant message with no tool_use blocks — the Anthropic API rejected this with a 400. The compact path now detects tool_result content and flattens it to plain text.

v0.7.5

OpenAI-Compatible MCP Chat Endpoints, PO Review Model Picker
  • NewConnect an endpoint that speaks the OpenAI /chat/completions format — Ollama, vLLM, LM Studio, LiteLLM, a corporate gateway — and it now shows up beside the built-in providers as 'OpenAI MCP (<name>)', ready to chat with. Setup asks for the model id the endpoint serves; both /mcp and the MCP setup modal support this.
  • NewPick a separate model for PO reviews (MR Coder). A Review model selector now appears in the Agents modal, visible only when MR Coder is the active provider and the PO is enabled.
  • FixThe OpenAI/Anthropic MCP presets never asked for an API key — the prompt was gated on designTool.tokenHeaderName which only exists for design tools. Fixed with an explicit authHeaderName per preset.
  • FixMCP chat endpoints were handed to the Agent SDK as tool servers. The two consumers now partition the list: chat endpoints go to the provider registry, everything else to the tool plumbing.
  • FixA modal-saved endpoint produced a doubled URL path (/v1/chat/completions/chat/completions). The endpoint is now normalised so both setup surfaces land on the same base.
  • FixA deleted MCP server wedged the chat instead of explaining itself. It now posts an error naming the server with a 'Manage MCP Servers' button and ends the turn cleanly.
  • ImprovedMCP is managed by /mcp; the settings panel now points at it instead of duplicating the editor. 'Proxy' renamed to 'Endpoint' in the MCP setup wording.

v0.7.4

The "Response Arrives One Message Late" Family, Closed
  • FixA message sent during turn cleanup aborted a turn that had already finished. Reported on the MR Coder provider as "the background response gets pushed into the webview just after the new message, and the new message is neglected" — both halves, one cause. Generating stays true through the async tail of the stream loop (final events, auto-commit, deferred compaction), but by then the model has already delivered its complete answer. The mid-stream flag is false in that window, so a new message fell through to interrupt-and-continue: abort, tear down, respawn. There was nothing to interrupt. The abort raced the reply still rendering, and the teardown swallowed the new message. A turn-complete flag now distinguishes "the model finished, only local cleanup remains" from "genuinely mid-stream", and a message in the former case starts a clean new turn. MR Coder routes through the same SDK session over a relay, so its cleanup tail is longer and the window wider, which is why it reproduced there first.
  • FixA system notice swallowed the next reply — the real cause of "responses arrive one message late". Notices were appended as assistant messages without the field that marks a bubble closed, and the streaming renderer appends into the last bubble whenever it is assistant-kind and still open. So a notice stayed open and adopted the next turn's streamed text, merging them into one message. The reply was never late: it streamed on time, into the wrong bubble, which reads identically. That is why earlier animation-frame fixes did not close the report — same symptom, different cause. A notice is complete the moment it is posted, so it now marks itself closed and the next reply starts its own message.
  • FixReplies stalled invisibly until you sent another message. Streamed chunks are coalesced through requestAnimationFrame so a burst of tokens causes one render instead of hundreds, but animation frames stop while the panel is not being drawn — a background tab, a hidden sidebar, another window on top — and the buffer then grew with nothing draining it. The only other drain was the flush that runs when a non-chunk message arrives, and your next message is exactly that. An earlier attempt hooked document visibility, which cannot work: a webview is an iframe whose document stays "visible" while its panel is a background tab. A timer is now armed alongside the frame request, so one of the two always drains; whichever fires first cancels the other. Measured across 500 foreground chunks, the fallback fires zero times — frames always win when the panel is visible, so it costs nothing.
  • FixAutoscroll could stick off for the rest of a session. Flushing makes text exist; autoscroll is what makes it visible, and it had the same dependency. The scroll guard that marks "this scroll was ours" was cleared from an animation-frame callback, so with frames paused it latched on and every later scroll was read as programmatic — autoscroll never recomputed. That is why one flush did not reveal everything: the text was rendered but the view never followed it. The settle step now runs from a helper armed on both a frame and a timer.
  • ImprovedThe streaming buffer is now real code under test, not a re-implementation. Earlier tests modelled the pipeline and asserted on the copy, so the model was correct while the shipped code was not — which is how this family of bugs kept passing a green suite. The buffering contract lives in its own module, the tests drive that implementation with injected frame and timer clocks, and a source check asserts the app actually uses it so the two cannot drift apart. Twenty-eight tests cover it, including the end-of-turn tail flush, text interleaved with tool calls, and a 4,000-chunk background reply coalescing into 200 renders with no characters lost. Every fix in this release was mutation-verified: reverted, and the guarding test confirmed to fail.

v0.7.3

Scheduled Messages Made Reliable, PO Coverage Fixes
  • FixOne bad schedule produced an endless stream of "missed message" popups, and an unreadable date became an immortal pending entry that could never be cleared. A message set more than about 25 days out fired within milliseconds instead of on its date, and past dates were accepted and then listed as still upcoming. /schedule list also presented overdue messages as if they were still coming. Each of these is fixed, and the feature now has tests — it had none.
  • FixProduct Owner auto-commit wrote subjects like "update 9 files". The commit message is now drafted from the actual diff, so it describes the change rather than counting files.
  • FixProduct Owner control-coverage reporting was broken in four separate ways: the instruction about hardcoded paths was duplicated in five places and drifted between them, the prompt never actually asked the model for the coverage field it then required, the parser dropped the count of scanned controls, and the scanner assumed this repository's own folder layout so it found nothing in a normal project. A project with no user interface could never reach a passing review at all, because the UX gate had no way to be satisfied.
  • FixProduct Owner active mode left tasks pending forever when a turn was judged on track. "On track" was treated as "nothing to record", so the task list never advanced.

v0.7.2

Context Loss on Refresh and CLI Resume
  • FixA follow-up sent right after a window refresh dropped the question it followed up on. The reload path restored the conversation but the first message after it was composed against an empty history, so a pronoun or "and the other one?" had nothing to resolve against.
  • FixCLI providers never verified the conversation they claimed to resume. A resume id was passed to the CLI and assumed to have worked; when it had not, the model started cold while the interface showed a continuing conversation. The resume is now checked, and a failure is reported instead of silently starting over.
  • FixGemini stored a resume id it never sent back, so every Gemini turn began without history.
  • FixSession writes were discarded in silence when the session detached. A write that landed after the session was swapped out was dropped with no record, so the loss only showed up later as missing history.
  • ImprovedThe reload decision is now a pure function outside the 5,700-line controller, and message durability across a refresh is verified against a real disk rather than a mock — the failure mode being guarded against is precisely one where a mock would have reported success.

v0.7.1

Context Durability: Twelve Ways a Conversation Could Be Lost
  • FixThe model forgot everything after a window refresh — reported from the field. The conversation was on disk and shown in the transcript, but the history sent to the model was empty, so the interface and the model disagreed about what had been said.
  • Fix"New Chat" could eat the last messages of the chat it left, and mid-stream it discarded the rest of the reply. Switching chats mid-reply wrote the answer into the wrong conversation, and closing a tab mid-reply raced its final write against shutdown. Interrupted and crashed turns dropped their partial reply entirely rather than keeping what had arrived.
  • FixA failed disk write discarded the conversation permanently — there was no retry on the paths that matter ("New Chat", session switch), so a single transient failure was unrecoverable.
  • FixThe resume-lost notice appeared while the model still had no history: the warning fired but the recovery behind it did not, so the notice became the only symptom. The SDK conversation lookup was also reading the wrong directory entirely.
  • FixA forced context replay sent 50 messages where 150 fit, needlessly discarding context that the window had room for.
  • ImprovedSource-inspection tests no longer break when a comment is added — they had been anchored to character offsets, so unrelated edits moved the assertion out of range and the guard silently stopped guarding.

v0.7.0

PO Sees Untracked Files, Stop Button Fixed
  • FixThe Product Owner could not see untracked files, so new files were reviewed without variable names and — worse — off-limits files were silently auto-committed. A .env that had never been tracked was invisible to the review that exists to catch exactly that. The blocked-commit notice now names the variables it found in such a file, so you can see what would have been committed.
  • FixMessages were silently dropped after pressing Stop, and the extension could stay stuck "generating" when Stop was pressed during session setup. A full audit of that path found two further stuck-generating routes, all fixed.
  • FixThe Product Owner intermittently showed raw JSON instead of a rendered card.
  • NewAuto-commit can now run independently of the Product Owner, so you can have commits drafted from your diff without a per-turn review query. Its default also changed from on to off: a feature that writes to your repository should be opted into rather than discovered.

v0.6.8

Changelog Integrity, User-Project Verification Chain
  • NewChangelog integrity test guards four release-blocking bugs that hit this session: header deletion, 0.6.5 section deletion, out-of-order timeline, and a release shipped with the header gone. The new test asserts the header and scope rule are present, the version order is newest-first without gaps or duplicates, every release-commit has a matching section, and the package.json version has a corresponding entry. A future repair script or edit that drops a section, reorders headings, or removes the scope rule will fail CI with a specific message naming the missing release.
  • NewUser-project verification chain: the Product Owner now judges a user project's E2E suite, screenshots, and coverage without requiring /init first. The AI Model runs the suite; the PO reads the artefacts. E2E report reader parses Playwright JSON or a flat summary and produces five verdicts — failing-specs, stale, no-report, thin-coverage, and ok. Screenshot report reader walks 8 conventional locations and produces six verdicts — failure-captures (test-failed-*.png on disk is independent evidence regardless of what the textual summary claims), stale, empty-images, thin, none, and ok. Coverage auto-discovery reads jest/nyc/c8/pytest thresholds without inventing a number, and discovered policies run in ratchet mode as advisory so the gate never fails the build on a number the user never agreed to.
  • FixPath-separator leaks in the E2E, screenshot, and coverage readers. All used path.join which yields backslashes on Windows, so the PO prompt quoted paths the AI Model could not use in a shell command. All reported paths are now POSIX-normalised.
  • Fix§11.6 control-coverage interface adds a `total` alias alongside the historical `inventory_total`. The PO prompt reads `total`; the historical name is preserved for backward compatibility. Removes the `covered: 115 / total: undefined` artifact where the gate had silently reported undefined because the field name drifted.

v0.6.7

Coverage Gate on /init, and a Workspace Boundary
  • New/init now writes .mrcoder/po/coverage-policy.json so the coverage gate is enabled immediately. The wizard asks once: Ratchet (default — never drop below today's baseline), Enforce 90% (enterprise bar), Enforce 80%, or Off. A measured baseline is recorded when a coverage summary already exists; otherwise the wizard reports the exact gap (missing provider, missing json-summary reporter) so the coding agent can offer the fix as a reviewable change. The wizard never installs dependencies or rewrites your runner config — both are your build setup.
  • NewCODER.md §1 now pins the absolute workspace root and forbids touching anything outside it. No sibling checkout, no parent directory, no other repo — even when it looks related or would fix the problem faster, because those edits land outside this repo's git history and never appear in review or in git status here. Needing a file outside the root is a reason to stop and ask, not to proceed. Registered as a hard rule so the PO enforces it. Normalised to forward slashes so it reads identically on every platform.
  • FixThe Product Owner now actually reads the new verification fields. The rule-violation scanner, test-quality scanner, and coverage gate were being populated in last-verification.json but absent from the PO prompt, so every finding was a dead fact. The PO prompt now covers testQuality (empty and .only findings treated as blocking), ruleViolations (confirm the cited line before raising; say so when it is a false positive), and coverage (name the worstFiles so the developer gets a work queue, not a number; pct: null is a setup gap, not a quality failure).

v0.6.6

Mid-Session Context Loss, Per-Chat PO, and E2E Authoring Rules
  • FixThe model no longer 'forgets' mid-conversation. Seven distinct history-loss paths were closed — the worst was a 413 / empty-200 overflow that trimmed history with no MEMORY.md record anywhere: the LLM summariser re-sent the same oversized history that just overflowed and failed, then the size-bound override trimmed it anyway. All seven compaction entry points now write a pre-compact structural draft first; trimOldMessages is guarded by a session-identity check so resuming a different chat mid-flight cannot trim the wrong one; and MEMORY.md is now read with truncation that fits the window rather than dropped whole when it doesn't fit.
  • FixThe PO auto-commit no longer stays stuck on secret-blocked. The skip reason now names the matching pattern, line number, and a redacted preview (first 4 + … + last 4) — never the credential itself — and the directive telling the model to remove it, move it to env or context.secrets, and tell you to ROTATE it is now delivered to the AI Model, not just to the webview. It also fires in passive mode — a leaked credential is a defect to fix now, not a proposal to approve.
  • FixThe PO auto-commit no longer creates a remediation deadlock. The secret scanner now scans only added lines (and context lines untouched by this change), so when the model deletes the credential exactly as instructed, the deletion line no longer matches and the next auto-commit succeeds.
  • FixPO auto-commit messages no longer ship as AI narration. The first line of the message must be a real Conventional Commit subject, not 'I'll read the diff…' or similar. A draft that fails the structural check is replaced with the deterministic subject derived from the changed files — terse, but always truthful. Lost in a real cycle: three commits reached develop with truncated mid-sentence subjects.
  • New/init now writes 35 E2E authoring rules into CODER.md, adapted to the project's tool. Covers element discovery, locator priority, per-element assertion floors (buttons, forms, dropdowns, links, menus, filters, search, tables, modals, toasts), spec structure, mandatory negative paths, console/network error assertions, automated accessibility scanning (axe-core), keyboard-only journeys, visual regression, and responsive breakpoints. 10 of 35 are machine-checkable — a regex grep runs in the verification pass and reports file:line + the offending text, so the PO can cite E2E-18 instead of 'the E2E section'.
  • ImprovedDocumentation accuracy pass on the user-facing docs. The first-run walkthrough was listing 'Seven live provider chips' — actual is nine. README counts were 1-2 versions stale: 10→9 providers, Kilo 9→15 models (9 free), OpenRouter free 14→16, HuggingFace 22→20, settings 60+→96, commands 60+→79. The .vsix dropped from 64 files / 3.02 MB to 32 files / 2.84 MB after fixing .vscodeignore: test-results.json, tmpfigma-*, e2e/, scripts/, flake-quarantine.json, kilo.json and *.lnk were all shipping to users.
  • Fix.gitignore was silently untracking real source files. test-* had no leading slash, so it matched at every depth and src/agents/test-evidence.ts and src/__tests__/test-utils/ (among others) would have been absent from a fresh clone. Anchored to /test-*, with the Playwright output and website scratch scripts re-ignored explicitly.

v0.6.5

Product Owner Is Per-Chat, Claude Opus 5, and a Mandatory Review Pass
  • FixThe Product Owner no longer reviews chats you didn't enable it in. Turning the PO on in one chat used to switch it on everywhere, so finishing a turn in any other tab triggered a PO review — an extra model query, and an auto-commit against your working tree that had nothing to do with that chat. Enablement is now per-chat: the PO only wakes for the chat it was enabled in, and the setting sticks to that chat across reloads.
  • FixThe Product Owner no longer gets stuck asking you to write its own requirements file. It could park on "Still waiting on your .mrcoder/po/requirements.md" every turn, forever — and the workaround it suggested didn't help, because only that one exact file counted. The .mrcoder/po/ folder belongs to the PO: it now drafts those documents itself (from your project docs, or from the codebase when there are none), retries on its own if a draft doesn't land, and never asks you to create or edit them. If a baseline looks wrong, you approve or ask for a redraft instead of editing files.
  • NewClaude Opus 5 is available in both the MR Coder router and the Claude provider, with a 1M-token context window.
  • New/init now sets up a mandatory review pass. Every fix and new implementation gets re-checked against the current session's work and earlier sessions' before moving on. The wizard asks how often it should run — after every completed turn (the default), only for fixes and new implementations, or only when you ask — and tells you up front that each review is an extra model pass that uses additional tokens.
  • New/init now writes a set of non-negotiable project rules into CODER.md, and the PO enforces them: never rename existing variables, functions, or exports without approval; give new code meaningful names; write tests that assert real outcomes instead of just a 200 status or "didn't throw"; and store passwords only as salted hashes of at least 32 characters.
  • ImprovedPO reviews now scan for leaked credentials — plaintext passwords or keys in source, config, fixtures, logs, or responses. Anything found is treated as critical, blocks release, and comes with instructions to remove it, move it to your secret store, and rotate it. Reviews also stop counting expectation-free tests as passing coverage.

v0.6.4

Streaming Reply No Longer Waits for Your Next Message
  • FixFixed streaming replies that appeared to arrive "all at once" only after you sent the next message. When VS Code lost focus mid-turn (for example, you switched to your browser while the agent was working), the model's reply could sit un-rendered until your next message forced it out. The webview now flushes the buffered text the moment you return to the window.

v0.6.3

Chat Sessions Moved Out of Your Project Folder
  • ImprovedChat history no longer lives inside your project. Sessions, turn checkpoints, and per-session memory now live in the extension's own system storage, keyed per workspace — so chat JSON never shows up in your repo or gets committed by accident. Each project still sees only its own chats; open a different folder to see its history.
  • FixDeleting a chat now also removes its saved compact-memory file, which used to be left behind on disk forever.
  • ImprovedNo migration needed — existing chats stay where they are and new chats are created in the new location. The "Open Session Storage Folder" command now reveals the per-workspace folder under the extension's system storage.

v0.6.2

Product Owner Goes Project-Agnostic — Stack Detection, Freshness Gate & iFlow Removed
  • NewThe Product Owner (PO) now works on any project, not just this extension's own conventions. It auto-detects your stack — Node/TS, Node/JS, Python, Rust, Go, Java (Maven/Gradle), Ruby, PHP, .NET, or Elixir — and runs the right typecheck / test / lint / format commands. Tools you don't have installed are skipped instead of failing the run. Override anything via `.mrcoder/po/stack-profile.json`.
  • NewPO auto-discovers your spec (SPEC / ARCHITECTURE / DESIGN / RFC / PLAN / FEATURES / README, in priority order) and reads hard rules from any of 8 agent-memory files (CLAUDE.md, CODER.md, AGENTS.md, and more) — no longer hardcoded to this project's own files. Product-IQ criteria are a registry you can override too.
  • NewNew verification freshness gate: a GREEN "it passes" claim is now tied to the exact commit it was verified against, so stale evidence from an earlier commit can't be reused to claim the project still passes. Ships post-commit hook installers for macOS/Linux (bash) and Windows (PowerShell).
  • NewStale proposals and TODO / FIXME markers linked to hard rules are now surfaced to the PO automatically with a default decision, instead of sitting untouched in the backlog for weeks.
  • ImprovedThe code-format check is advisory by default so pre-existing style drift won't block your project; set `PO_REQUIRE_FORMAT_PASS=1` to make it blocking like every other gate.
  • FixSibling-finder precision: refactors that only rename a typed parameter no longer produce hundreds of bogus "this call site may need updating" gaps (111 false positives on a real diff collapsed to 0).
  • BreakingThe iFlow provider has been removed entirely — no sign-in, no settings panel, no re-enable toggle. Re-introducing it would require a new proposal.

v0.6.1

New-Chat & First-Message Fixes, Per-Tab Permission Isolation
  • Fix"New Chat" no longer silently reuses your previous, overflowed session. Once a chat hit "prompt too long," every new chat used to fail the same way until you deleted the `.mrcoder` folder — new chats now truly start fresh, and the old chat stays resumable in the list.
  • FixThe in-app "New Chat" recovery buttons shown on overflow / fatal errors pointed at a command that was never registered and did nothing — they now open a real new session.
  • FixThe first message in a new chat no longer replies with the model's identity ("I am Claude … by Anthropic") instead of doing your task. A stuck turn-stream state was misrouting the first message as a mid-turn interrupt.
  • FixAskUserQuestion in bypass mode no longer triggers that same identity reply — the question is auto-answered and the turn is never torn down and restarted.
  • FixCross-tab permission-mode bleed fixed: setting bypass in one tab used to silently make every open tab auto-approve tools and answer questions. Permission mode is now truly per-tab, and a mode you pick before sending the first message is remembered for that tab.
  • ImprovedIn bypass mode, AskUserQuestion now auto-selects the model's Recommended option (previously always the first option). Every other mode still waits for you — questions remain a safety boundary.

v0.6.0

PO Context Chunker Prevents "Prompt Too Long"
  • NewThe Product Owner's pre-fed context (governing specs + project memory) no longer fails with "pre-fed context exceeds budget." When it would overflow the model's context window, it's automatically split into batches that each fit and stitched back together, so you always get a real PO response. Oversized single chunks are split on `##` headings; only the rare heading-less blob still falls back to a skip notice.

v0.5.9

`/po init` Bootstrap Path & Long-Session Recovery
  • Improved`/po init` now bootstraps from source docs when `.mrcoder/po/` is empty, instead of refusing with "nothing to redraft, run a full /po pass first". It is the user-driven single-shot of the same pipeline Phase 0.5 runs every turn while the baseline is absent.
  • Improved`/po init` and Phase 0.5 now share one code path (`runRequirementsIngestion`). Source discovery, PO query, 5-doc write, Observer review gate, and observer fallback all live in one place — any fix lands in both flows automatically.
  • FixEmpty-baseline workspace no longer needs a full `/po` pass first. The handoff sentinel still blocks (user told the PO to wait); only the empty-`.mrcoder/po/` refusal branch was removed.
  • FixLong sessions stuck on "empty or malformed response (HTTP 200)" now recover. When a large context overflows through the proxy and returns a stalled/empty 200 instead of a clean error, the extension treats it as context overflow on genuinely large sessions and auto-compacts + retries, instead of hitting the same wall on every attempt.

v0.5.8

`/po init` Bootstrap Path — No More "Nothing to Redraft" Refusal
  • Improved`/po init` now bootstraps from source docs when `.mrcoder/po/` is empty, instead of refusing with "nothing to redraft, run a full /po pass first". It is the user-driven single-shot of the same pipeline Phase 0.5 runs every turn while the baseline is absent.
  • Improved`/po init` and Phase 0.5 now share one code path (`runRequirementsIngestion`). Source discovery, PO query, 5-doc write, Observer review gate, and observer fallback all live in one place — any fix lands in both flows automatically.
  • FixEmpty-baseline workspace no longer needs a full `/po` pass first. The handoff sentinel still blocks (user told the PO to wait); only the empty-`.mrcoder/po/` refusal branch was removed.

v0.5.7

MCP OAuth, Model Chip Fix, Web-Access Reset Crash & New `auto` Permission Mode
  • FixAuto-compact settings: four `config.ts` getters had `?? FALLBACK` values that disagreed with the `package.json` manifest defaults. VS Code returns the manifest default when the setting is unset, so the fallbacks were dead code that misstated the real defaults (e.g. `autoCompactThreshold` read `?? 0.85` but the effective default was 0.7). Aligned the code fallbacks to the manifest — no behavior change, the code just stops lying. New `config-default-drift.test.ts` asserts every `?? fallback` equals its manifest default so this can't silently return.
  • FixClaude model chip couldn't switch to Fable 5 (or any model not in a hard-coded list) — the `mrMultiCoder.claude.model` setting carried a stale enum that VS Code rejected, so the selection never persisted. Removed the enum; the chat model chip remains the source of truth for choosing models.
  • FixWeb-access "Reset Password" crash (`(intermediate value).hash is not a function`) — `bcryptjs` was mis-placed in `optionalDependencies`, so any build omitting optional deps shipped without a usable bcryptjs. Moved to `dependencies`. Added `normalizeDynamicImport()` helper to handle ESM/CJS interop where methods live only under `.default`; applied to bcryptjs AND jsonwebtoken (the auth proxy had the identical latent crash in the login/token path).
  • NewFigma MCP OAuth now actually opens the browser — the old "the MCP client opens a browser when you send your first message" claim was false. The modal now shows a real Connect with Figma OAuth button: spin up a 127.0.0.1 loopback HTTP listener → call the SDK's `mcpAuthenticate` → open the user's default browser → wait for Figma's redirect → call `mcpSubmitOAuthCallbackUrl`.
  • NewFigma Personal Access Token as a second auth option — paste in the API Key field, sent as `Authorization: Bearer <PAT>` (verified against Figma's live MCP endpoint that PATs work there; `X-Figma-Token` is ignored).
  • FixRemoved the misleading "MCP client opens a browser on first chat" copy — it implied the SDK would auto-open a browser without user action, which it never did.
  • NewNew optional `runMcpOAuth` surface on `ProviderSession` — a single method for authenticate + callback-submit (deliberately ONE method, not two: the CLI holds the PKCE state between the two calls, so two separate subprocesses would lose the auth state). The Claude session implements it via a typed cast to runtime-only SDK methods; CLI providers leave it undefined. When no chat session is live, the controller spawns a one-shot ephemeral Claude session for the OAuth flow and closes it after.
  • NewNew `auto` permission mode (fifth) — auto-approves tools like `bypassPermissions`, but `AskUserQuestion` still waits for the user. Added to the chip dropdown, the /settings select, the command palette, and the org-policy `VALID_MODES` list. Order: default → plan → acceptEdits → auto → bypassPermissions.
  • Improved`bypassPermissions` is now true full autonomy: ExitPlanMode (plan approval) auto-allowed; AskUserQuestion auto-answered with the recommended option (model's `default` field, falling back to options[0].label, multiSelect respects the default array). No waiting, ever.
  • Improved`auto` keeps both safety waits intact — questions still block for the user in `auto`. AskUserQuestion is a security boundary (delete this file? allow this network?), not a permission shortcut, so the user must stay in the loop unless they explicitly opted into `bypassPermissions`.
  • ImprovedMain-session and PO-observer `onUserDialog` both early-return the auto-answer only when the mode is `bypassPermissions`; new structural tests guard against the dangerous inversion (`=== 'auto'` or `|| 'auto'` re-appearing in the branch).

v0.5.6

Visual MCP Modal — Figma & Stitch to Code, Edit/Delete, Base-URL Auto-complete
  • NewVisual /mcp setup modal — all presets on one grouped screen (Coding / Design / Custom), replacing the old native-dialog sequence and the earlier 3-step wizard
  • NewFigma: connect (PAT or OAuth), browse teams → projects → files in the modal via the Figma REST API, pick a file, and convert it to React + Tailwind — no copy-pasting file keys
  • NewStitch: connect, click Browse projects (calls list_projects over MCP), pick a project, and convert its screens — project_id flows through every tool call
  • NewEdit existing servers — a card grid at the top of the modal loads any saved server into the form; leave the key blank to keep the stored secret and only change the URL or scope
  • NewDelete servers from the modal — a × on each card (with a confirm strip) removes both the settings.json entry and its SecretStorage key
  • NewBase-URL auto-complete — type just the base and the modal appends /v1/messages (Anthropic), /v1/chat/completions (OpenAI), or /mcp (Custom), with a live preview of the full URL
  • NewAuth-header dropdown for Custom Server — x-api-key (raw), Authorization (Bearer), or a custom header you type
  • NewFigma / Stitch scope persisted — the picked file_key / project_id is saved as a public header (x-figma-file-key / x-stitch-project-id) so re-editing a server keeps the scope, and forwarded on Test / Browse calls
  • NewDraft starter message pre-fills the chat input after Save — per-preset copy, with the picked file_key / project_id baked in
  • NewEscape closes the modal (alongside Cancel, ✕, and backdrop-click)
  • NewLocal-only /mcp flow telemetry — step-count events logged to ~/.mr-coder/*.log so users can self-debug (no network calls)
  • FixOpenAI-compatible auth was broken — callMcpTool now sends Authorization: Bearer <key> instead of the raw key, so OpenAI / Ollama / vLLM / LM Studio stop returning 401
  • FixFigma OAuth help link no longer blanks the whole chat panel — the link left its <label>, opens in a new tab, and a React error boundary now wraps the modal
  • FixSave errors are no longer silently dropped — the modal stays open and shows duplicate-name / SecretStorage / disk failures; a double-click can't fire two saves
  • FixTest / picker state no longer leaks across presets — switching presets or going back resets the form so a stale name or 'Connected' banner can't carry over
  • FixHard Rule #4 enforced in the modal save path — refuses to write a real API key to settings.json when SecretStorage is unavailable (never a plain-text fallback)
  • FixURL scheme validated in callMcpTool — http/https only, javascript: and file:// blocked
  • FixScope-symmetric writes for /mcp save — Workspace wins when the config already lives there
  • Fix/mcp and /agent aliases added to the webview autocomplete — host handlers and webview meta no longer drift
  • ImprovedFigma/Stitch MCP URLs verified against official docs — https://mcp.figma.com/mcp and https://stitch.googleapis.com/mcp
  • ImprovedReal icons in the modal — codicon placeholders replaced with inline SVGs (code, design, server, figma, stitch, plug)
  • ImprovedCSS color-mix() in the modal removed — explicit rgba() with fallback hex so older Chromium builds render correctly

v0.5.5

MCP Reliability — Broken Preset Removed, Delete Sticks, AskUserQuestion Fix
  • FixAdding an MCP server no longer breaks the Anthropic key — the built-in MrCoderMcp preset launched a non-existent npm package (npx -y mr-coder-mcp → 404), which crashed the Agent SDK's MCP startup and took down every Claude turn; the preset is removed
  • FixA broken MCP server can no longer take the chat down — if the SDK fails to start with MCP configured, MCP is disabled for the session and the turn recovers on the Anthropic key with a clear, non-fatal notice
  • FixMCP delete now sticks — the mcpServers write is scope-symmetric (writes where the value already lives), so a delete no longer leaves a Global-scoped copy behind
  • FixAskUserQuestion no longer auto-cancels while the card is on screen — the turn stops when the cards are posted (so the CLI park-deadline can't fire) and restarts with the answers via context replay
  • FixAuto-compact 'exceeds 2000 messages' storm fixed on MR Coder / Claude — a size-bound override trims even when the rolling summary is empty, breaking the re-arm loop
  • FixScanner false-positive + real-finding sweep — theme-variable-with-fallback pattern applied to two bare hex literals; the professionalism scanner no longer flags hex inside var(...)
  • ImprovedCorrected the 'Summariser Provider → Auto' description — Auto prefers free providers (Kilo / OpenRouter / Qwen) by largest context window, not 'Claude if a key is set'

v0.5.4

Status Bar Label and Click Behaviour
  • ImprovedThe status bar item reads more usefully and its click does something more useful — it opens the chat picker when several chats are open rather than always reopening one fixed panel.

v0.5.3

Per-Tab Provider, Model and Permission Mode
  • FixThe provider, model and permission-mode chips were shared across every open chat, so changing the model in one tab silently changed it in all of them — and a permission mode set in one tab applied everywhere. Each tab now owns its own chip state, which is what makes it safe to run a bypass mode in one conversation without granting it to the others.
  • ImprovedDiagnostic logging when a question dialog is aborted, so a dialog that disappears without an answer leaves a record of why.

v0.5.2

Status-Bar Chat Picker for Multiple Sessions
  • NewA status-bar picker for moving between open chats, so several conversations can be run side by side without hunting for the right panel.
  • FixA listener leak on extension deactivation: the chat registry kept its listeners after shutdown.
  • ImprovedThe composer chip shows the model's display name rather than its raw identifier, so it reads as "Sonnet 4.6" instead of a versioned slug.

v0.5.1

MCP Removal Cleanup, Compact Safety Net & Question Dialog Fix
  • FixMCP server removal now cleans up both Workspace and Global scopes — a server saved at Global scope no longer survives a remove that only wrote to Workspace, and its stored secrets are scrubbed regardless of scope
  • ImprovedSettings MCP Remove button acts on a single click — dropped the 3-second 'click again to confirm' timer (host-side multi-scope cleanup + secret scrubbing is the safety net)
  • NewPre-compact draft safety net — a cheap, LLM-free structural draft (user goals, files read/modified, top findings, tools used) is saved to MEMORY.md before compact trims history, so context is never lost even if the summariser fails
  • FixQuestion dialog no longer auto-cancels after milliseconds — passes the extension's own abort signal instead of the SDK park-deadline, so cards wait indefinitely for the user
  • FixCompact completion runs its summary work synchronously — persist summary → run summariser → trim, in awaited order, so a trim can't land before the summary hits disk

v0.5.0

Model Picker in the Composer, PO UX Verification Gate
  • NewA model picker in the chat composer, in the style of claude.ai — switch model mid-conversation without opening settings.
  • NewFailover across pool accounts on a 529 overload, so a busy upstream moves to another healthy account instead of surfacing as a failed turn.
  • NewThe Product Owner gained an end-user verification gate: research is blocked until the interface is actually proven to work, backed by a Playwright screenshot harness so the review sees the product as an end user sees it rather than inferring from source. The captured report is written in a form the read-only reviewer can trust, and review scores are held to an anti-rubber-stamp discipline.
  • NewThe Product Owner may run read-only shell commands, gated by a strict allow-list: every segment of a command must match a read-only pattern, and an allow-listed binary invoked with a mutating flag is still refused. Trusting a command by name alone is not enough, because several read-only tools grow teeth via flags.
  • FixLate answers to a question dialog are re-delivered rather than lost, so answering just after the prompt timed out no longer discards the answer.
  • FixThe minimized artifact panel during streaming now behaves like claude.ai's.

v0.4.8

Multi-Message Acceptance, PO Score Discipline & Request-Scoped Logging
  • NewPO live activity feed in the sidebar bubble — real-time phase and step indicator streams while the Product Owner reviews a turn
  • NewPO runs on every provider, not just Claude — Mode 1/2/3 review loop is now provider-agnostic
  • NewPO Mode 3 proposals enriched with impact, priority, recommendation, and backlog status — review cards surface next-best-action context
  • NewPO review cards now include approve / reject / modify actions so end-users can resolve findings inline
  • NewPO review schema adds GREEN status — applied across all modes and surfaced in review output
  • NewPO confidence reasoning (§13) and proposal problem-framing (§11) — review directives are now self-justifying
  • NewAdmin accounts: surface per-account base URL in the accounts table — every pool account's upstream endpoint is now visible at a glance
  • NewPer-account base URL routing — proxy / sandbox / MCP traffic all honour the account's stored base_url, no implicit defaults
  • NewRequest-scoped logging context — every log line carries a requestId / sessionId for end-to-end correlation
  • NewPlan config product fields consolidated and wired into usage aggregation — single source of truth for plan tier → feature mapping
  • ImprovedWebview error boundary now forwards caught errors to the host log instead of swallowing them in console
  • ImprovedPO system prompt is now driven from bundled spec files (no inline duplication of PO rules)
  • ImprovedPO side uses .md text loader added to esbuild — docs are loaded as text and concatenated at build time
  • ImprovedPO gate for GREEN/COMPLETE is now backed by verification evidence (test reports, not assertions)
  • ImprovedEdit/Write tool cards now expand by default to show the diff — no extra click to see what changed
  • FixMulti-message acceptance hardened end-to-end: per-turn AbortSignal scoping, mid-turn injection liveness, dead queryStream handling, abort-listener cleanup — Send works at any time, no queues, no rejection
  • FixStuck-state watchdog added — generating=true can no longer lock the UI when a turn is wedged on a network hang
  • FixPO cold-start prompt rewritten to prevent mid-stream truncation — autonomous loops no longer leave the [PO] note mid-sentence
  • FixPO Mode 3 prompt now produces real research instead of asking the model to reason with no context
  • FixPO GREEN no longer halts the autonomous loop — auto-advances to Phase 13/14
  • FixPO score-discipline gate now enforced on unverified product reviews (no more self-graded GREEN)
  • FixPO end-user UX review gate added before GREEN and Mode 3 research — findings can't ship without user-visible approval
  • FixPO read-only Bash now gated behind a strict allow-list — no more unconstrained shell during review
  • FixPO bash allow-list hardened against flag and path bypasses (--foo=bar /path tricks now rejected)
  • FixPO git allow-list is now arg-aware — push, reset, and other destructive flags are inspected, not just the subcommand
  • FixSECRET_PATTERNS expanded for GitLab tokens, npm tokens, certificates, and Slack webhooks — auto-commit blocks more sensitive data
  • FixAskUserQuestion late-answer flush guarded against unhandled rejection — answers delivered in any state, no lost input
  • FixAskUserQuestion late answers now reach the model in addition to the live answer — both paths are honored
  • FixAskUserQuestion follow-up tracker cleared at fresh-turn boundary — no carryover of stale question state
  • FixAskUserQuestion first-answer-wins guard in markModelQuestionSubResolved — duplicate resolves can't overwrite a real answer
  • FixAskUserQuestion question-controller slot self-deletes + overwrite guard — no zombie slots on resolved questions
  • FixAskUserQuestion batch Cancel button hidden when all sub-questions are already answered
  • FixAskUserQuestion follow-up hint links to previous model question — users always know which Q is pending
  • FixBilling: provider outages and bad API keys surfaced as clean errors on portal-url and cancel paths
  • FixBilling: PaymentHooks outages no longer leave the user staring at a generic 500 — actionable error message
  • FixBilling: change-plan recovery when local sub is desynced from PaymentHooks — change-plan no longer hangs
  • FixEventHooks yearly birthday schedule uses 'y' interval instead of 'd'*365 — leap years no longer shift the trigger
  • FixLogging: unhandledRejection handler now unwraps Error so the stack and cause chain aren't lost
  • FixWebsite: per-account base URL required for MCP accounts — no more implicit fallbacks to claudeopus.pro
  • FixWebsite: sandbox agent loop now routes through per-account base URL — MCP traffic reaches the correct upstream
  • FixWebsite: helpers/auth.ts now uses the admin user — e2e tests run as the admin role consistently
  • FixWebsite: APIError 429 surfaced as a clean account-limit message in the admin UI
  • FixWebsite: e2e tests switched to read credentials from .billing-user.json fixture — no more hardcoded admin user in tests
  • FixWebsite: billing-upgrade test 5 tolerates PaymentHooks 'Continue' button wording drift
  • FixWebsite: admin-accounts-mcp + admin-and-user specs hardened after fixture switch
  • FixUI: per-session chip state set before global config — chip toggles no longer clobber session preferences
  • FixUI: PO notice channel no longer double-labels messages — clean single label per notice
  • FixUI: PO origin preserved on rehydrated messages — provenance survives page reload
  • FixUI: PO activity indicator no longer bumps 'since' on repeated setPhase — timestamp stays accurate
  • FixUI: PO activity indicator dropped in-flight grace signal on chat controller dispose — no leaked timers
  • FixUI: PO activity indicator replaced rAF clear loop with AbortSignal.timeout — event-driven, no setTimeout
  • FixUI: PO review card resolution persisted — action buttons don't reappear on reload
  • NewDocs: §14 runtime gates and §15 document authority added to PO spec — review gates have a written contract
  • NewDocs: PO spec restructured into versioned sections — easier to diff between spec revisions

v0.4.7

Billing Reliability, Edit Tool Diff UX & AskUserQuestion Hardening
  • NewEdit/Write tool cards now expand by default to show the diff — see what changed without an extra click
  • NewEdit/Write diff cards styled with accent colours matching the Claude Code aesthetic
  • NewAskUserQuestion follow-up hint links to the previous model question — users always know what's pending
  • NewAskUserQuestion batch Cancel button hidden when all sub-questions are answered
  • FixBilling: change-plan recovers when local sub is desynced from PaymentHooks — no more silent failures on plan changes
  • FixBilling: provider outages and bad API keys surfaced as clean errors on portal-url and cancel paths
  • FixBilling: PaymentHooks outages no longer leave the user staring at a generic 500 — actionable error message
  • FixAskUserQuestion answers always reach the model in addition to the live answer — no lost input across any path
  • FixAskUserQuestion supports multi-question batch grouping — related questions stay together in the chat
  • FixAskUserQuestion first-answer-wins guard in markModelQuestionSubResolved — duplicate resolves can't overwrite a real answer
  • FixAskUserQuestion follow-up tracker cleared at fresh-turn boundary — no carryover of stale question state
  • FixAskUserQuestion question-controller slot self-deletes + overwrite guard — no zombie slots on resolved questions
  • FixWebview error boundary now forwards caught errors to the host log instead of swallowing them in console
  • FixE2E: settings-upgrade spec + fixture state added so the redirect-to-PaymentHooks flow is covered
  • FixE2E: cancelled-sub state covered in settings-billing spec — both pre- and post-cancel paths verified

v0.4.6

PO Live Activity Feed, Autonomous Loop & Per-Account Base URL
  • NewPO live activity feed in the sidebar bubble during review — real-time phase and step indicator streams while the Product Owner is working
  • NewPO autonomous review loop now continues in active mode — finds, reviews, fixes, re-reviews in one session without user prompts between phases
  • NewPO runs on every provider, not just Claude — Mode 1/2/3 review loop is now provider-agnostic
  • NewPO Mode 3 proposals enriched with impact, priority, and recommendation — review cards surface next-best-action context
  • NewPO proposal problem-framing (§11) and confidence reasoning (§13) — review directives are now self-justifying
  • NewPO backlog status shown in Mode 3 proposal output — agents know what's already in the queue
  • NewAdmin accounts: surface per-account base URL in the accounts table — every pool account's upstream endpoint is now visible at a glance
  • NewPer-account base URL routing — proxy traffic honours the account's stored base_url, no implicit defaults
  • NewWebsite: PO comparison table added to the agents page — users can see how PO differs from the existing agent offerings
  • NewPO review cards now include approve / reject / modify actions so end-users can resolve findings inline
  • NewPO review schema adds GREEN status — applied across all modes and surfaced in review output
  • FixPO cold-start prompt rewritten to prevent mid-stream truncation — autonomous loops no longer leave the [PO] note mid-sentence
  • FixPO Mode 3 prompt now produces real research instead of asking the model to reason with no context
  • FixPO GREEN no longer halts the autonomous loop — auto-advances to Phase 13/14
  • FixPO required recommendation no longer duplicates the Mode 1 review — one finding per slot
  • FixPO directive injection now awaits the full turn before delivery — no premature dispatch
  • FixPO embedded rendered research in Mode 3 approval directive — user sees the actual research, not a placeholder
  • FixPO persisted PO card resolution so action buttons don't reappear on reload
  • FixPO score-discipline gate now enforced on unverified product reviews (no more self-graded GREEN)
  • FixProxy: require explicit base URL for MCP accounts, drop default fallback to api.claudeopus.pro — misconfiguration now surfaces as a clean error
  • FixProxy: sandbox agent loop routes through per-account base URL — MCP traffic reaches the correct upstream
  • FixEventHooks yearly birthday schedule uses 'y' interval instead of 'd'*365 — leap years no longer shift the trigger
  • FixSECRET_PATTERNS expanded for GitLab tokens, npm tokens, certificates, and Slack webhooks — auto-commit blocks more sensitive data

v0.4.5

Product Owner AI Agent, Rolling Summariser Overhaul & OpenAI-Compat Hardening
  • NewProduct Owner AI Agent — a fully autonomous AI product-owner that reviews every developer turn and provides structured feedback with three review modes: Mode 1 (file changes → review + optional auto-commit), Mode 2 (open gaps → next-step directive), Mode 3 (no changes → proactive proposal with user approval)
  • NewPO response cards rendered in the chat with severity-coloured findings, prioritised action items, status indicators, and commit results — persisted in session history and threaded into model context
  • NewPO auto-commit with safety gates — secret detection (10 patterns: API keys, private keys, GitHub/Slack tokens), off-limits path enforcement, and conventional commit classification
  • NewPO slash commands: /po enable · disable · status · mode passive|active · autocommit on|off · analyze · review · suggest · risks · next · memory · help
  • NewPersistent PO hook registration — enabled state, behaviour mode, and auto-commit preference saved to .mrcoder/po-config.json and auto-restored on activation
  • New/agents and /agent slash commands — open an Agents panel overlay in the webview for managing the Product Owner and future agents
  • NewAskUserQuestion now uses the Agent SDK's onUserDialog blocking-dialog callback — the tool call/result contract stays intact and history shows a real tool result, not a synthetic user message
  • NewModel question cards now include an 'Other' free-text option with auto-focus input, so users can provide custom answers when predefined options don't fit
  • ImprovedRolling Summariser: per-provider transcript capping sized to 60% of each provider's context window — prevents sending oversized payloads guaranteed to fail on smaller-context providers
  • ImprovedRolling Summariser: pre-flight context-window check skips providers that can't fit the transcript, and context-length errors immediately break retry loops (no more 4 wasted retries)
  • ImprovedRolling Summariser: largest-window-first provider ordering and fastest-model selection for each provider, reducing cost and latency
  • ImprovedOpenAI-compatible session: 8 hardening fixes — empty SSE block skip, abort error suppression, outer-loop abort check, improved continuation prompt detection, empty assistant message breadcrumb, compact() null-content fallback, unrecoverable tool-call drop, and post-parallel-read abort check
  • ImprovedTool result compaction now uses assertive anti-loop language ('Do NOT re-read this file') to reduce model re-read loops
  • ImprovedRepeat detection tightened from 6→3 rounds (native API) and 3→2 rounds (text-extracted) to catch stuck loops faster
  • ImprovedRequest timeout uses AbortSignal.any() instead of setTimeout + manual AbortController, following project conventions
  • BreakingPlan mode (ExitPlanMode) now always requires explicit approval — the plan preview must be reviewed even under Bypass Permissions
  • FixSession storage now uses atomic tmp+rename writes — a crash mid-write can no longer truncate a session
  • FixAnalytics persistence serialized through the prior write and a no-op flush statement fixed
  • FixUser-store schema migration wrapped in a single SQL transaction for atomicity
  • FixLifecycle hardening — fault-tolerant deactivate(), fully-async flush(), double-flush prevention, and webview timer cleanup on unmount

v0.4.3

Thread-ID Session Stickiness, Account Reliability & Connect Flow Hardening
  • NewThread-ID header injection — extension now sends x-thread-id and anthropic-thread-id on every API request via ANTHROPIC_CUSTOM_HEADERS, ensuring the server binds the same account for the entire chat session
  • FixAll accounts showing same lastUsedAt — moved timestamp/counter updates to AFTER token validation in both the session-reuse and pool-selection paths, so only the account that actually serves gets stamped
  • FixPool iteration falsely incrementing activeSessions on failed accounts — removed the decrement-on-failure path; counters are only touched on success
  • FixrefreshAndRetry could refresh the wrong account — binding lookup now scopes to the exact sessionId (or IS NULL for unbound bindings) instead of picking any active binding for the key
  • FixresolveToAlternateAccount never excluded the rate-limited account — removed dead fetchHealthyAccountsWithExclusion wrapper and passed excludeAccountId directly to fetchHealthyAccounts via SQL filter
  • FixConnect-token consumed before device registration — moved token deletion to after device registration and key provisioning, so a failure mid-flow leaves the token retryable instead of stranding the user
  • FixAuth key with NULL oauthKeyEnc silently returned null — now throws with an actionable error message for ops instead of masking a corrupted row
  • FixDecrypt failure on auth key silently returned null — now throws with a clear message indicating the encryption key may have rotated
  • ImprovedOAuth constants (token URL, beta header, scopes) inlined at the single call site instead of module-level constants — no cross-file sharing needed

v0.4.2

MCP Secret Storage, Edit UI & Device Kind Tracking
  • NewMCP env var secrets stored in VS Code SecretStorage — API keys for MCP servers are no longer in plain text in settings.json
  • NewInline MCP server editing — expand any configured MCP server to edit its env vars with password-masked inputs for secrets and 'Confirm?' two-click removal
  • NewmcpSecretStatus protocol — host tells webview which env keys have stored secrets (boolean only, never the value) so the UI can show masked placeholders
  • FixDevice kind now tracks latest connect flow — re-linking via /connect-mrcoder correctly flips kind to 'mrcoder' and vice versa, with auth key invariant enforced
  • FixDevice registration race condition — bcrypt hash moved before per-user advisory lock transaction to minimize lock hold time
  • FixRedundant idx_devices_user index dropped — idx_devices_user_kind covers (user_id) via leftmost-prefix
  • ImprovedreadSecret callback threaded through SessionCreationOpts so the Claude provider can merge MCP secrets from SecretStorage at session start

v0.4.1

Tunnel API Cleanup & Provider Type Refinements
  • FixRemoved duplicate getDeviceId() accessor from TunnelManager — getDeviceIdentity() already provides the full device descriptor including ID
  • ImprovedenvMeta field added to McpServerConfig for tracking which env keys are secrets vs. plain text
  • ImprovedmcpSecretKey() helper in config.ts for consistent SecretStorage key formatting across settings-panel and provider code

v0.4.0

Message Pagination, Trim Fix, Session Teardown & Race Condition Fixes
  • FixEmpty webview on VS Code reload — visibleStart calculation now returns 0 (messages IS the visible window), olderRemaining persisted in WebviewState so 'Load earlier' count survives restarts
  • FixTrim effect offsetting visibleStart — trim now adjusts visibleStart backward by the excess so the visible window stays anchored to the tail instead of rendering nothing
  • FixSpurious 'Session connection lost' error — dead session teardown now awaits close() before clearing session, preventing a race where rapid follow-up messages hit a closed queue
  • FixStale olderRemainingRef on session mismatch — session mismatch guard now resets olderRemainingRef to 0 before breaking, preventing wrong 'Load earlier' counts
  • ImprovedShared computeRehydratePosition() helper — extracted from two identical rehydrate branches to eliminate duplication and prevent future drift

v0.3.9

MR Coder Provider, ESM Fix, Web Access Persistence & Stability
  • NewMR Coder provider — routes Claude API calls through mr-coder.io with zero-setup auth via the Remote Access connect flow
  • New4 pre-configured models: Opus 4.7, Opus 4.6, Sonnet 4.6, Haiku 4.5 — all with full tool support and agentic workflow
  • NewServer auto-provisions an sk-mr- key on connect; the extension stores it automatically with no manual key entry needed
  • NewManual key entry also supported via the Set MR Coder API Key command
  • FixESM module resolution error for Claude CLI — SDK CLI now copied as .mjs for unconditional ESM parsing regardless of surrounding package.json
  • FixWeb access API keys lost on browser reload — now route through runWithWebUser() → WebSecretStore → SQLite for cross-device persistence
  • FixDead SDK sessions no longer cause infinite 'conversation not found' loop — stale sdkSessionId cleared on session load, triggering fresh context replay
  • FixRolling summariser resilience — failed providers skipped for 10 minutes, maxOutputTokens capped at 4096 to prevent quota exhaustion
  • FixPreflight CLI check now non-blocking — warnings logged but SDK allowed to try its own spawn logic
  • FixAsyncQueue push() returns false instead of throwing when the queue is already closed
  • ImprovedClaude config path moved to ~/.mrcoder/sessions to avoid workspace paths with spaces on Linux

v0.3.8

Role-Adaptive AI Prompt System & Deep Toolchain Detection
  • New4-layer role-adaptive prompt system for OpenAI-compatible providers — identity, expertise, tool rules, and safety guardrails
  • New5 domain-specific quality bars: CODE (Staff Engineer), UI (Senior Design Engineer), ARCHITECTURE (Principal Solutions Architect), LOGIC (Systems Engineer), DOCUMENTS (Design Director)
  • NewDeep toolchain detection — parses package.json + lock files + pyproject.toml to identify framework, test runner, package manager, build tool, ORM, linter, and key npm scripts
  • NewSafety guardrails — models cannot run destructive commands (rm -rf, git reset, DROP TABLE), delete files, or publish without explicit user request
  • ImprovedUI quality standards: 4/8/12/16/24/32/48px spacing grid, WCAG AA contrast, micro-interactions, responsive design, dark mode support
  • ImprovedCode quality standards: edge case handling, SOLID principles, security (input sanitization, parameterized queries), O(n) over O(n²), match project patterns
  • ImprovedDocument quality standards: enterprise-grade typography, #1E3A5F palette, styled tables with alternating rows, gradient headers, status badges
  • ImprovedMinimal prompt (≤7B models) now includes compact quality standards and a concrete workflow example — small models benefit MORE from examples
  • ImprovedMerged redundant PLANNING + THINKING sections into single EXECUTION DISCIPLINE block — saves ~100 tokens, clearer signal
  • ImprovedWorkspace orientation now shows Toolchain line with frameworks (Next.js, Express, etc.), package manager, test runner, and available npm scripts

v0.3.7

MCP Removal Resets the Claude Endpoint
  • FixRemoving or disabling an MCP server left the Claude endpoint and API key pointing at it, so the next chat kept trying to reach a server that was no longer configured and had to be cleaned up by hand. Both are now reset to direct Anthropic automatically, and toggling a server off and on again restores them from its saved configuration.

v0.3.6

Port Conflict Resolution, Input History & Context Efficiency
  • NewWeb Access port conflict resolution — occupied-port scenarios now resolve gracefully with server reuse, readiness probe (30s timeout), process identification, and Force Stop & Retry flow
  • NewKill All Node Processes fallback — when individual PID termination fails (permission issues), a last-resort option kills all standalone node.exe processes without affecting VS Code
  • NewPersistent input history — Up/Down arrow message cycling now survives session rehydration, older-message pagination, and session resets instead of being limited to visible messages
  • NewRolling summariser now preserves tool call details — tool inputs (capped 1.5K), results (capped 2K), and error outputs are included in conversation summaries instead of bare '[Used tool: X]' breadcrumbs
  • FixUp/Down arrow input history limited to ~9 messages in tool-heavy sessions — now uses a dedicated persistent history array independent of the 200-message display pagination
  • FixRolling summary minimum lowered from 4 to 1 — allows per-message summaries for context-heavy workflows
  • ImprovedContext replay limits tightened — max chars 40K to 25K, max messages 30 to 20, per-message cap 3K to 2K for better token efficiency
  • ImprovedWorkspace orientation tree reduced — file cap 200 to 120, line cap 120 to 60 to save context tokens
  • ImprovedTerser context replay framing — shorter preamble/postamble text for context replay and rolling summaries
  • ImprovedRemoved image attachment system prompt block — no longer needed, saves tokens on every turn
  • ImprovedConsecutive duplicate messages are deduplicated in input history — pressing Up won't cycle through repeated sends
  • ImprovedStatus-aware tool rendering in summaries — successful results and error outputs are distinguished with separate labels

v0.3.5

Security Hardening, Service Install & Tool Display Fix
  • SecurityTunnel tokens are no longer exposed in the dashboard UI or API responses — tokens are only used internally and never displayed to users
  • NewCloudflared service install — tunnel setup now uses 'cloudflared service install' (Windows) / 'sudo cloudflared service install' (Linux/Mac) for persistent system-level tunnel management
  • FixAI tool usage display — Edit, Read, Bash, and other tool calls now reliably show in the chat even when tool-result arrives before the webview processes the tool-use event
  • ImprovedTool result events now carry the tool name and input from session storage, preventing unnamed 'tool' entries when events arrive out of order
  • SecurityTunnel creation API no longer returns raw tunnel tokens or connect commands in the response body
  • ImprovedManual connect card on dashboard replaced with service install flow — copy button includes the token securely without displaying it

v0.3.4

Smart /init Wizard, Tunnel Client Installer & Registration Overhaul
  • NewAuto-detection engine — scans package.json, tsconfig, eslintrc, Dockerfile, GitHub Actions, and directory structure to pre-select best-matching defaults for every wizard question
  • NewAI suggestion engine with 3-tier fallback — uses current provider, then KiloCode CLI (random free model), then mr-coder.io backend to pre-fill conventions, architecture, don'ts, glossary, and external services
  • New9 former hardcoded rules converted to user-configurable choice questions: language strictness, icon format, DOM IDs, re-render policy, module separation, async pattern, error logging, E2E testing, and production verification
  • New5 new question categories: testing framework (Vitest/Jest/Mocha/AVA/pytest), E2E tool (Playwright/Cypress/Puppeteer), git workflow (Conventional Commits/free-form), API conventions (REST/GraphQL/tRPC/gRPC), deployment target (Docker/Serverless/PaaS/bare metal)
  • NewKiloCode one-shot helper — spawnOneShotKilo() for fire-and-forget AI requests with random free model selection
  • NewBackend /api/init-suggest endpoint with HMAC signature verification, per-IP rate limiting (3 req/hr), per-install throttling, and timestamp replay protection
  • NewPlan-based subdomain suffix — plans without custom subdomain support automatically get a '-tunnel' suffix (e.g. my-project-tunnel.mr-coder.io), shown as a non-editable badge in the create form
  • NewServer-side subdomain suffix enforcement — API auto-appends '-tunnel' for non-custom plans, preventing client-side bypass
  • NewCloudflared install detection — checks for cloudflared on first tunnel connect with cross-OS install options (winget/brew/apt/direct download)
  • NewOne-click cloudflared install — 'Run' button opens VS Code terminal with the correct install command for your OS and architecture
  • ImprovedWizard now shows 'Scanning your repo...' and 'Fetching AI suggestions...' progress messages before presenting questions
  • ImprovedPre-selected values passed to webview via new preSelected field in WizardQuestionView protocol — UI can show auto-detected choices
  • ImprovedSplit coder-md-init.ts (718 lines) into coder-md-init.ts + coder-md-build.ts to respect 500-line file limit
  • ImprovedGraceful degradation — if all AI tiers fail, wizard proceeds with auto-detected choice pre-selections and empty text fields (same as old behavior)
  • ImprovedCloudflared auto-rediscovery — 'Refresh' button and tunnel operations re-detect cloudflared binary if previously missing
  • FixTunnel creation disabled when cloudflared is not installed — previously showed error only after clicking Create

v0.3.3

Kilo Code Stability, HuggingFace Fix & Chat UX
  • FixKilo Code crash on rapid messages — CLI crash now tears down the session and clears stale session ID so all models recover automatically
  • FixKilo Code race condition — session creation lock prevents concurrent CLI subprocesses from corrupting session state
  • FixCancel/stop button could let old turn's cleanup stomp on new turn state — turnGeneration now bumped on cancel
  • FixHuggingFace 404 errors — endpoint updated from deprecated api-inference.huggingface.co to router.huggingface.co/hf-inference/v1
  • FixChat auto-scroll stuck on first message — programmatic scroll guard prevents DOM changes from disabling auto-scroll
  • FixSent messages invisible when scrolled up — send action now forces auto-scroll to latest message
  • ImprovedMessage loading now paginates — initial load shows 20 most recent messages, older messages load on scroll
  • ImprovedHuggingFace 401/403 error hints updated with current permission name and step-by-step setup instructions

v0.3.2

Remote Tunnelling System & mr-coder.io
  • NewDevice identity system — every VS Code installation gets a unique UUID with device name, OS, and architecture
  • NewAccount linking flow — one-click browser-based flow to link VS Code to a mr-coder.io account with one-time connect tokens (10-min expiry)
  • NewTunnel CRUD — create, list, update auto-expiry, and delete tunnels via the mr-coder.io API
  • Newcloudflared process management — fully detached spawning survives VS Code restarts, PID saved for re-adoption, log file monitoring
  • NewReal-time connection status with push-based reporting to the server via PATCH /api/tunnels/[id]/status
  • NewMulti-tunnel support — multiple tunnels per device at different ports, each with independent cloudflared process
  • NewAuto-expiry for non-primary tunnels (1h, 6h, 12h, 24h, 72h, 168h, or never)
  • NewSubdomain availability checker — validates subdomain + domain combination before creation
  • NewCompact tunnel card layout with lazy-mount collapsible sections and inline error display
  • New14-day free trial system — tunnels created during trial marked isTrial, DNS suspended on expiry, restored on subscription
  • SecurityCRITICAL: PaymentHooks webhook secret had hardcoded fallback — now throws if env var missing
  • SecurityCRITICAL: EventHooks SITE_URL defaulted to localhost — now throws if NEXTAUTH_URL missing
  • SecurityTunnel config silently coerced missing env vars to empty strings — now throws with actionable errors
  • FixExtension tunnel API base URL defaulted to localhost:3000 instead of production URL (mr-coder.io)
  • FixSubdomain uniqueness race condition on concurrent tunnel creation — now catches DB constraint violations
  • FixSubdomain availability check missing domain parameter — both client and server updated
  • ImprovedTunnel status now push-based — extension reports status changes in real-time, no polling needed
  • ImprovedTunnel list persists to globalState and restores on init with background API refresh

v0.3.1

Analytics Security & Performance
  • SecurityUser isolation on drill-down and export — non-admin users locked to their own data regardless of payload
  • FixAnalytics store init race condition — rapid open/close/re-open could spawn duplicate SQLite instances
  • FixDashboard cache thrashing — filter keys included millisecond timestamps, breaking the 5-second cache
  • FixCollector config listener leak — onDidChangeConfiguration subscription never disposed
  • FixNon-atomic database persistence — writes now use tmp + rename for crash safety
  • FixO(n*m) comparison merge in charts replaced with Map for O(1) lookups
  • ImprovedEvent retention/pruning — new retentionDays setting (default 90) prunes old events on store init
  • ImprovedAggregator query memoization — eliminates ~60 redundant SQL queries per dashboard refresh
  • ImprovedCryptographic nonce generation using crypto.randomBytes instead of character-loop PRNG

v0.3.0

--default-folder Crash Fix (Post-Ready)
  • FixAlways-on output buffer for VS Code server process — catches --default-folder crashes that occur after startup probe
  • ImprovedStartup progress forwarding — download/install messages surfaced in VS Code progress notification
  • ImprovedAuto-refresh 502 page with spinner and explanation while server starts (replaces plain-text error)
  • ImprovedStartup timeout raised from 2 to 10 minutes for slow first-time downloads

v0.2.9

Cross-Platform WebSocket IPC Routing
  • FixIPC socket regex now captures both Windows named pipes and Unix domain sockets for WebSocket routing

v0.2.8

WebSocket Fix & HuggingFace Provider
  • FixWebSocket connections now bypass the CLI wrapper and connect directly to VS Code server's named pipe — full interactivity restored
  • NewHuggingFace Inference API provider — 22 curated open-weight models (Qwen, DeepSeek, Llama, Mistral, Phi, Gemma)
  • NewPer-model adaptive config — tool-use nudge level, temperature, max tokens tuned per model family
  • NewRich error hints for HuggingFace: 401 (bad token), 404 (model not found), 429 (rate limit), 503 (cold start)

v0.2.6

Linux & macOS Platform Compatibility
  • FixSpace-safe CLI spawning — shell: false on Unix prevents word-splitting paths with spaces
  • FixmacOS Gatekeeper quarantine detection and removal at probe, spawn, and SDK CLI resolution
  • FixEFTYPE/ENOEXEC error messages corrected for Unix (was showing Windows-only guidance)
  • FixfindRipgrep now checks if bundled binary exists before returning path
  • FixfindCode added Linux well-known paths (/usr/bin/code, /snap/bin/code, etc.)
  • FixkillServerProcess now kills child processes on Unix via pkill -TERM -P
  • FixEnable Web Access toggle was hidden inside collapsed section — now always visible
  • ImprovedServer action buttons show spinner + disabled state while operations are in flight

v0.2.5

ESM Fix, Session Recovery & Web Secret Store
  • FixESM module resolution error on Linux Node v20 — SDK CLI now copied as .mjs for unconditional ESM parsing
  • FixDead SDK sessions no longer cause infinite 'conversation not found' loop — stale sessions cleared automatically
  • FixWeb access API keys lost on browser reload — now route through WebSecretStore → SQLite
  • FixPreflight CLI check now non-blocking — warnings logged but SDK allowed to try its own spawn
  • FixRolling summariser resilience — failed providers skipped for 10 minutes, maxOutputTokens capped at 4096
  • FixAsyncQueue push() returns false instead of throwing when queue is closed

v0.2.4

Sound Profiles, Approval UX & Web Secrets
  • NewThree new keyboard sound profiles — Thock (Topre), Clack (Cherry MX Blue), Creamy (Gateron Oil King)
  • NewPer-user web secret persistence — API keys survive browser reloads with AES-256-GCM encryption at rest
  • NewPreflight CLI check — lightweight shebang-based spawn validates binary before use
  • FixLinux CLI crash — VSIX-extracted claude-cli.js now gets chmod 755 on non-Windows
  • FixClaude config path with spaces — moved to stable ~/.mrcoder/sessions
  • FixStop button stuck after turn completes when panel was hidden during generation
  • FixStale messages on window reload — isGenerating and sessionId now sourced exclusively from host
  • ImprovedApproval button feedback — shows 'Approving...'/'Denying...' state and disables after click

v0.2.3

New Keyboard Sound Profiles
  • NewThock sound profile — deep gasket-mount bottom-out with low-pitched resonant thump (Topre/HHKB style)
  • NewClack sound profile — sharp mechanical strike with click-bar snap and metallic spring ping (Cherry MX Blue style)
  • NewCreamy sound profile — smooth lubed linear with filtered noise slide and warm buttery tail (Gateron Oil King style)

v0.2.2

Keyboard Sounds & Secure Tunnel Support
  • NewKeyboard typing sounds — three synthesized profiles (Classic, Standard, Modern) via Web Audio API
  • NewSecure tunnel support for Web Access — WebSocket URL rewriting and CDN CORS forwarding
  • FixCSP nonce extraction now handles hyphens in nonce values
  • FixX-Frame-Options changed from DENY to SAMEORIGIN for tunnel compatibility
  • FixForwarded headers (X-Forwarded-Host/Proto/For) for proper reverse-gateway compatibility

v0.2.1

Web Extension Fix & Session Performance
  • FixWeb extension blank screen — created WebSoundManager no-op stub for browser environments
  • FixSession list loading slow — added in-memory session index backed by .session-index.json
  • FixWebview ready sent 3 times — now sent exactly once with host-side retry guard
  • FixAtomic session writes — save() now writes to .tmp file and renames
  • ImprovedContext strategy default changed to rolling-summary for better long-conversation retention
  • ImprovedTab-switch blink mitigation with inline background-color on HTML elements

v0.2.0

Web Remote Access (Enterprise)
  • NewMulti-user authenticated remote access to VS Code from any browser via two-port auth gateway architecture
  • NewEmail/password login with bcrypt, JWT session cookies (HttpOnly, SameSite=Strict), and rate limiting
  • NewPer-user project access control — restrict users to specific workspace subfolders
  • NewExtension allowlist for web server — MR Multi coder always included, version comparison for updates
  • NewNew Settings UI section: Web Remote Access with server controls, user management, and extension allowlist
  • ImprovedTab-switch performance — eliminated visible blink/flash, monotonic seq counters, windowed message rendering (200 messages)
  • ImprovedCSS animation guard — rehydrated messages skip entry animation, only new live messages animate

v0.1.9

VS Code Web Extension Support
  • NewRuns in vscode.dev, github.dev, and code-server — browser-compatible entry point alongside desktop bundle
  • New5 API-based providers in web mode: OpenRouter, Ollama, Qwen, Codex, Gemini
  • NewBrowser-safe tool executor — Read, Write, Edit, Glob via vscode.workspace.fs; Grep via pure-JS regex scanner
  • NewOllama text-based tool call extraction — models outputting JSON text now work as real tool calls
  • NewModel-specific prompt suffixes for Ollama — per-family hints for Qwen, thinking models, and small models
  • FixMarkdown rendering corruption — orphaned text fragments no longer appear after list items during streaming
  • ImprovedTighter stall detection for text-extracted rounds (3 consecutive identical rounds)
  • ImprovedGlob/Grep semantic stall detection — corrective message after 3+ calls with same pattern

v0.1.8

Connection Stability & Org Policy
  • FixFalse-positive 'Connection is unstable' warning — SSE parser now distinguishes keepalives from real parse errors
  • NewOrg policy system fully wired — .mrcoder/policy.json enforced at 5 decision points (permissions, tools, cost cap, CLI providers, provider lock)
  • FixScheduled messages now show user's message bubble in chat (was showing 'Thinking...' with no context)
  • ImprovedModel display names show actual model (e.g. 'ChatGPT Default (o4-mini)' instead of '(default)')
  • NewKilo Code: 2 new models — Laguna M.1 (225B MoE) and Laguna XS.2 (33B)

v0.1.7

Qwen 3.6, Ollama Agentic Intelligence & Codex/Gemini CLI
  • NewQwen 3.6 (27B/35B/35B-MoE) and Qwen 3 Coder Next (80B MoE) for Ollama with coding-optimised quantizations
  • NewWorkspace file tree in system prompt — models see project structure upfront, skipping discovery rounds
  • NewModel-size-adaptive prompting — 7B gets compact 5-rule prompt, 14B+ gets full 23-rule prompt
  • New<think> tag filtering — strips reasoning blocks from UI while preserving in history
  • NewEdit mismatch preview — shows closest matching area with 20 lines of context for self-correction
  • NewConfigurable tool-call round limit setting (mrMultiCoder.maxToolRounds)
  • FixCodex/Gemini CLI login now auto-switches auth mode — no more 'API key not set' after successful CLI login
  • FixCross-platform CLI path resolution — augmented PATH with common npm/yarn/Homebrew directories

v0.1.6

Analytics Dashboard Layout
  • ImprovedActivity Heatmap spans full width with flex-based cell sizing
  • ImprovedModel Usage pie chart moved to Productivity section alongside Task Categories
  • ImprovedResponse Time by Provider promoted to full width for better readability
  • ImprovedCost Intelligence cards changed to half-width 2x2 grid layout

v0.1.5

Analytics Dashboard v2 & Haptic Feedback
  • NewProductivity Score — composite 0-100 metric with five weighted components displayed as a colour-coded ring
  • NewPeriod-over-period comparison — every KPI card shows delta indicators vs previous period
  • NewStreak tracking, peak productivity hours, efficiency trends, session quality distribution
  • NewTask category breakdown, cost efficiency metrics, model productivity ranking
  • NewContext compaction tracking — total compactions, sessions with compaction, daily frequency
  • FixMulti-tab audio coordination — only one tab plays progress music at a time with automatic hand-off
  • FixCustom submit sound now routes through host SoundManager (was using built-in synth only)
  • FixLive haptic settings changes — disabling mid-generation stops music instantly
  • Fix5 memory leaks fixed: Composer drag listener, mention debounce timer, MessageActions setTimeout, FileReader callback, auto-scroll rAF

v0.1.3

Dedicated Settings Page & Sound System
  • NewFull settings page in an editor tab — providers, models, agent behavior, context, haptic feedback, MCP servers
  • NewBuilt-in synthesized sound effects for chat events: submit, response-complete, task-complete, question, error
  • NewProgress music — ambient tones or user-supplied audio files while AI generates
  • NewWaiting timer — live elapsed-time indicator during AI generation
  • ImprovedChunk batching via requestAnimationFrame — eliminates forced reflows during fast streaming
  • Improved'Allow for this session' option on tool approval cards
  • ImprovedClaude provider: injection stall timeout, auto-continue on max_tokens (up to 3 times)

v0.1.2

Scheduled Messages
  • New/schedule command — schedule messages for specific times (HH:MM, 'in Xm/Xh', tomorrow, etc.)
  • NewMissed-schedule detection with Send Now / Reschedule / Delete actions on next activation
  • Fix14 robustness fixes: API key memory leak, auth code logging, AsyncQueue OOM, Ollama endpoint semantics, and more

v0.1.0

Claude.ai OAuth Login & OpenRouter Paid Models
  • NewLogin with Claude.ai — browser-based PKCE flow, no redirect URI needed
  • New15 paid models on OpenRouter: Claude Sonnet/Opus 4, GPT-4.1 family, Gemini 2.5, DeepSeek V3/R1, Grok 3
  • Fix6 stability fixes for OpenAI-compat sessions: malformed JSON sanitization, empty tool names, stream error handling, tool result capping

v0.0.9

OpenRouter & Ollama Providers
  • NewOpenRouter provider — 14 free-tier models, sk-or-v1 key slot, /auth/key validation
  • NewOllama (Local) provider — anonymous, default localhost:11434, 10 starter model tags, availability probing
  • NewShared OpenAICompatSession base class — new providers need only a descriptor + config object
  • NewPreflight mismatch detection — catches wrong key/endpoint combos before the HTTP request
  • NewRapid-followup framing mode — multiple messages while generating are framed as 'answer ALL in one reply'
  • FixInterrupt race where superseded turn's finally block stomped on new turn's state
  • FixKilo 'Model not found' — model IDs now passed through verbatim with kilo/ namespace

v0.0.5

Kilo Auth Fix & Edit Diff Preview
  • FixNo more bogus 'Sign In to Kilo Code' prompts — phrase-level regex matching instead of substring search
  • FixKilo edit/write previews now show real diff — camelCase to snake_case field normalization at parser boundary
  • NewPlan-gated model hint — friendly toast when a model requires a paid Kilo plan
  • ImprovedClaude provider: plain FIFO queue (no injection code needed) — SDK handles multiple prompts natively
  • ImprovedCLI providers: interrupt-and-continue with combined context message on follow-up

v0.0.4

CLI Context Management & Rolling Summary
  • Fix@file mentions and file attachments now deliver actual file content to the model (was sending path-only text)
  • FixSend while generating works — Claude: mid-turn injection; CLI: interrupt-and-continue with context
  • FixCLI providers now actually compact at auto-compact threshold (was no-op returning false)
  • FixChat no longer gets stuck requiring VS Code restart — generating flag cleared on all exit paths
  • FixEditor-tab chats survive VS Code restart — WebviewPanelSerializer registered
  • NewRolling-summary context strategy — LLM-backed structured summary every N messages
  • NewTuning settings: summarizeEveryNMessages, keepRawAfterSummary, summariserProvider

v0.0.3

/init Wizard Enhancement
  • Improved/init wizard expanded to 14 steps with styling framework choice and additional notes textarea
  • ImprovedCODER.md now opens with 15 non-negotiable 'Hard rules' baseline covering engineering quality, UI, runtime, and testing
  • ImprovedPer-framework styling guidance auto-generated (Tailwind, CSS Modules, etc.)

v0.0.2

Correctness & UX Polish
  • FixClaude API turns no longer fail with path argument undefined — SDK CLI shipped in dist/ with explicit path
  • FixStop button responds instantly with 5s safety timeout on session.close()
  • FixProvider switch no longer sends old model to new provider
  • New/init wizard — writes CODER.md capturing project conventions, wires into all provider memory files
  • NewInline unified diff in approval cards for Edit/Write/MultiEdit with colour-coded +/- rows
  • NewMarkdown rendering for assistant messages with code blocks, syntax highlighting, and Copy button
  • NewPer-message actions (Copy, Edit & resend, Regenerate), arrow-key history, TodoWrite live checklist
  • NewPaste screenshots in composer, file picker via native OS dialog, clickable attachment chips

v0.0.1

Initial Release
  • NewMulti-provider architecture: Claude (API), Kilo Code (CLI), iFlow (CLI), Qwen (API or CLI)
  • NewSession persistence with resume + SDK session_id passthrough
  • NewCheckpointing before Edit/Write/MultiEdit with Rewind to Checkpoint command
  • NewFine-grained approval flow with VS Code diff preview for edit operations
  • NewPermission modes: default, plan, acceptEdits, bypassPermissions
  • New@-mentions with workspace file picker and @terminal keyword
  • NewSlash commands: /help, /compact, /clear, /new, /fork, /cost
  • NewAuto-compact at configurable context-usage threshold (default 80%)
  • NewProject memory: CLAUDE.md auto-loaded via appendSystemPrompt (prompt-cached)
  • NewMCP server configuration with per-server enable toggle